@@ -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 ;
@@ -1814,7 +1815,8 @@ impl<'a> LoweringContext<'a> {
1814
1815
let match_expr = P ( self . expr_match ( e. span ,
1815
1816
into_iter_expr,
1816
1817
hir_vec ! [ iter_arm] ,
1817
- hir:: MatchSource :: ForLoopDesugar ) ) ;
1818
+ hir:: MatchSource :: ForLoopDesugar ,
1819
+ ThinVec :: new ( ) ) ) ;
1818
1820
1819
1821
// `{ let _result = ...; _result }`
1820
1822
// underscore prevents an unused_variables lint if the head diverges
@@ -1833,8 +1835,12 @@ impl<'a> LoweringContext<'a> {
1833
1835
ExprKind :: Try ( ref sub_expr) => {
1834
1836
// to:
1835
1837
//
1838
+ // #[allow(unreachable_patterns)]
1836
1839
// match Carrier::translate(<expr>) {
1837
- // Ok(val) => val,
1840
+ // Ok(val) => {
1841
+ // #[allow(unreachable_code)]
1842
+ // val
1843
+ // }
1838
1844
// Err(err) => return Carrier::from_error(From::from(err))
1839
1845
// }
1840
1846
let unstable_span = self . allow_internal_unstable ( "?" , e. span ) ;
@@ -1849,14 +1855,31 @@ impl<'a> LoweringContext<'a> {
1849
1855
P ( self . expr_call ( e. span , path, hir_vec ! [ sub_expr] ) )
1850
1856
} ;
1851
1857
1852
- // Ok(val) => val
1858
+ // Ok(val) => { #[allow(unreachable_code)] val }
1853
1859
let ok_arm = {
1854
1860
let val_ident = self . str_to_ident ( "val" ) ;
1855
1861
let val_pat = self . pat_ident ( e. span , val_ident) ;
1856
- let val_expr = P ( self . expr_ident ( e. span , val_ident, val_pat. id ) ) ;
1862
+ // #[allow(unreachable_code)]
1863
+ let val_attr = {
1864
+ // allow(unreachable_code)
1865
+ let allow = {
1866
+ let allow_ident = self . str_to_ident ( "allow" ) ;
1867
+ let uc_ident = self . str_to_ident ( "unreachable_code" ) ;
1868
+ let uc_meta_item = attr:: mk_spanned_word_item ( e. span , uc_ident) ;
1869
+ let uc_nested_meta_item = NestedMetaItemKind :: MetaItem ( uc_meta_item) ;
1870
+ let uc_spanned = respan ( e. span , uc_nested_meta_item) ;
1871
+ attr:: mk_spanned_list_item ( e. span , allow_ident, vec ! [ uc_spanned] )
1872
+ } ;
1873
+ attr:: mk_spanned_attr_outer ( e. span , attr:: mk_attr_id ( ) , allow)
1874
+ } ;
1875
+ let attrs = From :: from ( vec ! [ val_attr] ) ;
1876
+ let val_expr = P ( self . expr_ident_with_attrs ( e. span , val_ident, val_pat. id , attrs) ) ;
1877
+ let val_block = P ( self . block_expr ( val_expr) ) ;
1878
+ let ok_expr = P ( self . expr_block ( val_block, ThinVec :: new ( ) ) ) ;
1879
+
1857
1880
let ok_pat = self . pat_ok ( e. span , val_pat) ;
1858
1881
1859
- self . arm ( hir_vec ! [ ok_pat] , val_expr )
1882
+ self . arm ( hir_vec ! [ ok_pat] , ok_expr )
1860
1883
} ;
1861
1884
1862
1885
// Err(err) => return Carrier::from_error(From::from(err))
@@ -1885,8 +1908,23 @@ impl<'a> LoweringContext<'a> {
1885
1908
self . arm ( hir_vec ! [ err_pat] , ret_expr)
1886
1909
} ;
1887
1910
1911
+ // #[allow(unreachable_patterns)]
1912
+ let match_attr = {
1913
+ // allow(unreachable_patterns)
1914
+ let allow = {
1915
+ let allow_ident = self . str_to_ident ( "allow" ) ;
1916
+ let up_ident = self . str_to_ident ( "unreachable_patterns" ) ;
1917
+ let up_meta_item = attr:: mk_spanned_word_item ( e. span , up_ident) ;
1918
+ let up_nested_meta_item = NestedMetaItemKind :: MetaItem ( up_meta_item) ;
1919
+ let up_spanned = respan ( e. span , up_nested_meta_item) ;
1920
+ attr:: mk_spanned_list_item ( e. span , allow_ident, vec ! [ up_spanned] )
1921
+ } ;
1922
+ attr:: mk_spanned_attr_outer ( e. span , attr:: mk_attr_id ( ) , allow)
1923
+ } ;
1924
+
1925
+ let attrs = From :: from ( vec ! [ match_attr] ) ;
1888
1926
return self . expr_match ( e. span , discr, hir_vec ! [ err_arm, ok_arm] ,
1889
- hir:: MatchSource :: TryDesugar ) ;
1927
+ hir:: MatchSource :: TryDesugar , attrs ) ;
1890
1928
}
1891
1929
1892
1930
ExprKind :: Mac ( _) => panic ! ( "Shouldn't exist here" ) ,
@@ -2031,6 +2069,13 @@ impl<'a> LoweringContext<'a> {
2031
2069
}
2032
2070
2033
2071
fn expr_ident ( & mut self , span : Span , id : Name , binding : NodeId ) -> hir:: Expr {
2072
+ self . expr_ident_with_attrs ( span, id, binding, ThinVec :: new ( ) )
2073
+ }
2074
+
2075
+ fn expr_ident_with_attrs ( & mut self , span : Span ,
2076
+ id : Name ,
2077
+ binding : NodeId ,
2078
+ attrs : ThinVec < Attribute > ) -> hir:: Expr {
2034
2079
let def = {
2035
2080
let defs = self . resolver . definitions ( ) ;
2036
2081
Def :: Local ( defs. local_def_id ( binding) )
@@ -2042,7 +2087,7 @@ impl<'a> LoweringContext<'a> {
2042
2087
segments : hir_vec ! [ hir:: PathSegment :: from_name( id) ] ,
2043
2088
} ) ) ) ;
2044
2089
2045
- self . expr ( span, expr_path, ThinVec :: new ( ) )
2090
+ self . expr ( span, expr_path, attrs )
2046
2091
}
2047
2092
2048
2093
fn expr_mut_addr_of ( & mut self , span : Span , e : P < hir:: Expr > ) -> hir:: Expr {
@@ -2062,9 +2107,10 @@ impl<'a> LoweringContext<'a> {
2062
2107
span : Span ,
2063
2108
arg : P < hir:: Expr > ,
2064
2109
arms : hir:: HirVec < hir:: Arm > ,
2065
- source : hir:: MatchSource )
2110
+ source : hir:: MatchSource ,
2111
+ attrs : ThinVec < Attribute > )
2066
2112
-> hir:: Expr {
2067
- self . expr ( span, hir:: ExprMatch ( arg, arms, source) , ThinVec :: new ( ) )
2113
+ self . expr ( span, hir:: ExprMatch ( arg, arms, source) , attrs )
2068
2114
}
2069
2115
2070
2116
fn expr_block ( & mut self , b : P < hir:: Block > , attrs : ThinVec < Attribute > ) -> hir:: Expr {
0 commit comments