@@ -51,6 +51,7 @@ use util::nodemap::{NodeMap, FxHashMap};
51
51
use std:: collections:: BTreeMap ;
52
52
use std:: iter;
53
53
54
+ use syntax:: attr;
54
55
use syntax:: ast:: * ;
55
56
use syntax:: errors;
56
57
use syntax:: ptr:: P ;
@@ -1831,8 +1832,9 @@ impl<'a> LoweringContext<'a> {
1831
1832
// to:
1832
1833
//
1833
1834
// match Carrier::translate(<expr>) {
1834
- // Ok(val) => val,
1835
- // Err(err) => return Carrier::from_error(From::from(err))
1835
+ // Ok(val) => #[allow(unreachable_code)] val,
1836
+ // Err(err) => #[allow(unreachable_code)]
1837
+ // return Carrier::from_error(From::from(err)),
1836
1838
// }
1837
1839
let unstable_span = self . allow_internal_unstable ( "?" , e. span ) ;
1838
1840
@@ -1846,17 +1848,36 @@ impl<'a> LoweringContext<'a> {
1846
1848
P ( self . expr_call ( e. span , path, hir_vec ! [ sub_expr] ) )
1847
1849
} ;
1848
1850
1849
- // Ok(val) => val
1851
+ // #[allow(unreachable_code)]
1852
+ let attr = {
1853
+ // allow(unreachable_code)
1854
+ let allow = {
1855
+ let allow_ident = self . str_to_ident ( "allow" ) ;
1856
+ let uc_ident = self . str_to_ident ( "unreachable_code" ) ;
1857
+ let uc_meta_item = attr:: mk_spanned_word_item ( e. span , uc_ident) ;
1858
+ let uc_nested = NestedMetaItemKind :: MetaItem ( uc_meta_item) ;
1859
+ let uc_spanned = respan ( e. span , uc_nested) ;
1860
+ attr:: mk_spanned_list_item ( e. span , allow_ident, vec ! [ uc_spanned] )
1861
+ } ;
1862
+ attr:: mk_spanned_attr_outer ( e. span , attr:: mk_attr_id ( ) , allow)
1863
+ } ;
1864
+ let attrs = vec ! [ attr] ;
1865
+
1866
+ // Ok(val) => #[allow(unreachable_code)] val,
1850
1867
let ok_arm = {
1851
1868
let val_ident = self . str_to_ident ( "val" ) ;
1852
1869
let val_pat = self . pat_ident ( e. span , val_ident) ;
1853
- let val_expr = P ( self . expr_ident ( e. span , val_ident, val_pat. id ) ) ;
1870
+ let val_expr = P ( self . expr_ident_with_attrs ( e. span ,
1871
+ val_ident,
1872
+ val_pat. id ,
1873
+ ThinVec :: from ( attrs. clone ( ) ) ) ) ;
1854
1874
let ok_pat = self . pat_ok ( e. span , val_pat) ;
1855
1875
1856
1876
self . arm ( hir_vec ! [ ok_pat] , val_expr)
1857
1877
} ;
1858
1878
1859
- // Err(err) => return Carrier::from_error(From::from(err))
1879
+ // Err(err) => #[allow(unreachable_code)]
1880
+ // return Carrier::from_error(From::from(err)),
1860
1881
let err_arm = {
1861
1882
let err_ident = self . str_to_ident ( "err" ) ;
1862
1883
let err_local = self . pat_ident ( e. span , err_ident) ;
@@ -1876,7 +1897,7 @@ impl<'a> LoweringContext<'a> {
1876
1897
1877
1898
let ret_expr = P ( self . expr ( e. span ,
1878
1899
hir:: Expr_ :: ExprRet ( Some ( from_err_expr) ) ,
1879
- ThinVec :: new ( ) ) ) ;
1900
+ ThinVec :: from ( attrs ) ) ) ;
1880
1901
1881
1902
let err_pat = self . pat_err ( e. span , err_local) ;
1882
1903
self . arm ( hir_vec ! [ err_pat] , ret_expr)
@@ -2028,6 +2049,13 @@ impl<'a> LoweringContext<'a> {
2028
2049
}
2029
2050
2030
2051
fn expr_ident ( & mut self , span : Span , id : Name , binding : NodeId ) -> hir:: Expr {
2052
+ self . expr_ident_with_attrs ( span, id, binding, ThinVec :: new ( ) )
2053
+ }
2054
+
2055
+ fn expr_ident_with_attrs ( & mut self , span : Span ,
2056
+ id : Name ,
2057
+ binding : NodeId ,
2058
+ attrs : ThinVec < Attribute > ) -> hir:: Expr {
2031
2059
let def = {
2032
2060
let defs = self . resolver . definitions ( ) ;
2033
2061
Def :: Local ( defs. local_def_id ( binding) )
@@ -2039,7 +2067,7 @@ impl<'a> LoweringContext<'a> {
2039
2067
segments : hir_vec ! [ hir:: PathSegment :: from_name( id) ] ,
2040
2068
} ) ) ) ;
2041
2069
2042
- self . expr ( span, expr_path, ThinVec :: new ( ) )
2070
+ self . expr ( span, expr_path, attrs )
2043
2071
}
2044
2072
2045
2073
fn expr_mut_addr_of ( & mut self , span : Span , e : P < hir:: Expr > ) -> hir:: Expr {
0 commit comments