@@ -52,7 +52,7 @@ use std::iter;
52
52
use syntax:: ast:: * ;
53
53
use syntax:: errors;
54
54
use syntax:: ptr:: P ;
55
- use syntax:: codemap:: { respan, Spanned } ;
55
+ use syntax:: codemap:: { self , respan, Spanned } ;
56
56
use syntax:: std_inject;
57
57
use syntax:: symbol:: { Symbol , keywords} ;
58
58
use syntax:: util:: small_vector:: SmallVector ;
@@ -171,6 +171,18 @@ impl<'a> LoweringContext<'a> {
171
171
Symbol :: gensym ( s)
172
172
}
173
173
174
+ fn allow_internal_unstable ( & self , reason : & ' static str , mut span : Span ) -> Span {
175
+ span. expn_id = self . sess . codemap ( ) . record_expansion ( codemap:: ExpnInfo {
176
+ call_site : span,
177
+ callee : codemap:: NameAndSpan {
178
+ format : codemap:: CompilerDesugaring ( Symbol :: intern ( reason) ) ,
179
+ span : Some ( span) ,
180
+ allow_internal_unstable : true ,
181
+ } ,
182
+ } ) ;
183
+ span
184
+ }
185
+
174
186
fn with_parent_def < T , F > ( & mut self , parent_id : NodeId , f : F ) -> T
175
187
where F : FnOnce ( & mut LoweringContext ) -> T
176
188
{
@@ -1156,8 +1168,9 @@ impl<'a> LoweringContext<'a> {
1156
1168
let move_val_init = [ "intrinsics" , "move_val_init" ] ;
1157
1169
let inplace_finalize = [ "ops" , "InPlace" , "finalize" ] ;
1158
1170
1171
+ let unstable_span = self . allow_internal_unstable ( "<-" , e. span ) ;
1159
1172
let make_call = |this : & mut LoweringContext , p, args| {
1160
- let path = this. expr_std_path ( e . span , p, ThinVec :: new ( ) ) ;
1173
+ let path = P ( this. expr_std_path ( unstable_span , p, ThinVec :: new ( ) ) ) ;
1161
1174
P ( this. expr_call ( e. span , path, args) )
1162
1175
} ;
1163
1176
@@ -1171,11 +1184,6 @@ impl<'a> LoweringContext<'a> {
1171
1184
1172
1185
// let placer = <placer_expr> ;
1173
1186
let ( s1, placer_binding) = {
1174
- let placer_expr = P ( self . signal_block_expr ( hir_vec ! [ ] ,
1175
- placer_expr,
1176
- e. span ,
1177
- hir:: PopUnstableBlock ,
1178
- ThinVec :: new ( ) ) ) ;
1179
1187
mk_stmt_let ( self , placer_ident, placer_expr)
1180
1188
} ;
1181
1189
@@ -1196,11 +1204,6 @@ impl<'a> LoweringContext<'a> {
1196
1204
1197
1205
// pop_unsafe!(EXPR));
1198
1206
let pop_unsafe_expr = {
1199
- let value_expr = P ( self . signal_block_expr ( hir_vec ! [ ] ,
1200
- value_expr,
1201
- e. span ,
1202
- hir:: PopUnstableBlock ,
1203
- ThinVec :: new ( ) ) ) ;
1204
1207
self . signal_block_expr ( hir_vec ! [ ] ,
1205
1208
value_expr,
1206
1209
e. span ,
@@ -1229,11 +1232,9 @@ impl<'a> LoweringContext<'a> {
1229
1232
ThinVec :: new ( ) ) )
1230
1233
} ;
1231
1234
1232
- return self . signal_block_expr ( hir_vec ! [ s1, s2, s3] ,
1233
- expr,
1234
- e. span ,
1235
- hir:: PushUnstableBlock ,
1236
- e. attrs . clone ( ) ) ;
1235
+ let block = self . block_all ( e. span , hir_vec ! [ s1, s2, s3] , Some ( expr) ) ;
1236
+ // add the attributes to the outer returned expr node
1237
+ return self . expr_block ( P ( block) , e. attrs . clone ( ) ) ;
1237
1238
}
1238
1239
1239
1240
ExprKind :: Vec ( ref exprs) => {
@@ -1353,30 +1354,20 @@ impl<'a> LoweringContext<'a> {
1353
1354
fields : & [ ( & str , & P < Expr > ) ] ) -> hir:: Expr {
1354
1355
let struct_path = & iter:: once ( & "ops" ) . chain ( path) . map ( |s| * s)
1355
1356
. collect :: < Vec < _ > > ( ) ;
1357
+ let unstable_span = this. allow_internal_unstable ( "..." , ast_expr. span ) ;
1356
1358
1357
- let hir_expr = if fields. len ( ) == 0 {
1358
- this. expr_std_path ( ast_expr . span , struct_path,
1359
+ if fields. len ( ) == 0 {
1360
+ this. expr_std_path ( unstable_span , struct_path,
1359
1361
ast_expr. attrs . clone ( ) )
1360
1362
} else {
1361
1363
let fields = fields. into_iter ( ) . map ( |& ( s, e) | {
1362
1364
let expr = P ( this. lower_expr ( & e) ) ;
1363
- let signal_block = P ( this. signal_block_expr ( hir_vec ! [ ] ,
1364
- expr,
1365
- e. span ,
1366
- hir:: PopUnstableBlock ,
1367
- ThinVec :: new ( ) ) ) ;
1368
- this. field ( Symbol :: intern ( s) , signal_block, ast_expr. span )
1365
+ this. field ( Symbol :: intern ( s) , expr, e. span )
1369
1366
} ) . collect ( ) ;
1370
1367
let attrs = ast_expr. attrs . clone ( ) ;
1371
1368
1372
- this. expr_std_struct ( ast_expr. span , struct_path, fields, None , attrs)
1373
- } ;
1374
-
1375
- this. signal_block_expr ( hir_vec ! [ ] ,
1376
- hir_expr,
1377
- ast_expr. span ,
1378
- hir:: PushUnstableBlock ,
1379
- ThinVec :: new ( ) )
1369
+ this. expr_std_struct ( unstable_span, struct_path, fields, None , attrs)
1370
+ }
1380
1371
}
1381
1372
1382
1373
use syntax:: ast:: RangeLimits :: * ;
@@ -1646,7 +1637,7 @@ impl<'a> LoweringContext<'a> {
1646
1637
let iter = P ( self . expr_ident ( e. span , iter, iter_pat. id ) ) ;
1647
1638
let ref_mut_iter = self . expr_mut_addr_of ( e. span , iter) ;
1648
1639
let next_path = & [ "iter" , "Iterator" , "next" ] ;
1649
- let next_path = self . expr_std_path ( e. span , next_path, ThinVec :: new ( ) ) ;
1640
+ let next_path = P ( self . expr_std_path ( e. span , next_path, ThinVec :: new ( ) ) ) ;
1650
1641
let next_expr = P ( self . expr_call ( e. span , next_path,
1651
1642
hir_vec ! [ ref_mut_iter] ) ) ;
1652
1643
let arms = hir_vec ! [ pat_arm, break_arm] ;
@@ -1674,7 +1665,8 @@ impl<'a> LoweringContext<'a> {
1674
1665
// `match ::std::iter::IntoIterator::into_iter(<head>) { ... }`
1675
1666
let into_iter_expr = {
1676
1667
let into_iter_path = & [ "iter" , "IntoIterator" , "into_iter" ] ;
1677
- let into_iter = self . expr_std_path ( e. span , into_iter_path, ThinVec :: new ( ) ) ;
1668
+ let into_iter = P ( self . expr_std_path ( e. span , into_iter_path,
1669
+ ThinVec :: new ( ) ) ) ;
1678
1670
P ( self . expr_call ( e. span , into_iter, hir_vec ! [ head] ) )
1679
1671
} ;
1680
1672
@@ -1700,32 +1692,20 @@ impl<'a> LoweringContext<'a> {
1700
1692
ExprKind :: Try ( ref sub_expr) => {
1701
1693
// to:
1702
1694
//
1703
- // {
1704
- // match { Carrier::translate( { <expr> } ) } {
1705
- // Ok(val) => val,
1706
- // Err(err) => { return Carrier::from_error(From::from(err)); }
1707
- // }
1695
+ // match Carrier::translate(<expr>) {
1696
+ // Ok(val) => val,
1697
+ // Err(err) => return Carrier::from_error(From::from(err))
1708
1698
// }
1699
+ let unstable_span = self . allow_internal_unstable ( "?" , e. span ) ;
1709
1700
1710
- // { Carrier::translate( { <expr> } ) }
1701
+ // Carrier::translate(<expr>)
1711
1702
let discr = {
1712
1703
// expand <expr>
1713
- let sub_expr = P ( self . lower_expr ( sub_expr) ) ;
1714
- let sub_expr = self . signal_block_expr ( hir_vec ! [ ] ,
1715
- sub_expr,
1716
- e. span ,
1717
- hir:: PopUnstableBlock ,
1718
- ThinVec :: new ( ) ) ;
1704
+ let sub_expr = self . lower_expr ( sub_expr) ;
1719
1705
1720
1706
let path = & [ "ops" , "Carrier" , "translate" ] ;
1721
- let path = self . expr_std_path ( e. span , path, ThinVec :: new ( ) ) ;
1722
- let call = P ( self . expr_call ( e. span , path, hir_vec ! [ sub_expr] ) ) ;
1723
-
1724
- P ( self . signal_block_expr ( hir_vec ! [ ] ,
1725
- call,
1726
- e. span ,
1727
- hir:: PushUnstableBlock ,
1728
- ThinVec :: new ( ) ) )
1707
+ let path = P ( self . expr_std_path ( unstable_span, path, ThinVec :: new ( ) ) ) ;
1708
+ P ( self . expr_call ( e. span , path, hir_vec ! [ sub_expr] ) )
1729
1709
} ;
1730
1710
1731
1711
// Ok(val) => val
@@ -1738,33 +1718,30 @@ impl<'a> LoweringContext<'a> {
1738
1718
self . arm ( hir_vec ! [ ok_pat] , val_expr)
1739
1719
} ;
1740
1720
1741
- // Err(err) => { return Carrier::from_error(From::from(err)); }
1721
+ // Err(err) => return Carrier::from_error(From::from(err))
1742
1722
let err_arm = {
1743
1723
let err_ident = self . str_to_ident ( "err" ) ;
1744
1724
let err_local = self . pat_ident ( e. span , err_ident) ;
1745
1725
let from_expr = {
1746
1726
let path = & [ "convert" , "From" , "from" ] ;
1747
- let from = self . expr_std_path ( e. span , path, ThinVec :: new ( ) ) ;
1727
+ let from = P ( self . expr_std_path ( e. span , path, ThinVec :: new ( ) ) ) ;
1748
1728
let err_expr = self . expr_ident ( e. span , err_ident, err_local. id ) ;
1749
1729
1750
1730
self . expr_call ( e. span , from, hir_vec ! [ err_expr] )
1751
1731
} ;
1752
1732
let from_err_expr = {
1753
1733
let path = & [ "ops" , "Carrier" , "from_error" ] ;
1754
- let from_err = self . expr_std_path ( e. span , path, ThinVec :: new ( ) ) ;
1734
+ let from_err = P ( self . expr_std_path ( unstable_span, path,
1735
+ ThinVec :: new ( ) ) ) ;
1755
1736
P ( self . expr_call ( e. span , from_err, hir_vec ! [ from_expr] ) )
1756
1737
} ;
1757
1738
1758
1739
let ret_expr = P ( self . expr ( e. span ,
1759
1740
hir:: Expr_ :: ExprRet ( Some ( from_err_expr) ) ,
1760
1741
ThinVec :: new ( ) ) ) ;
1761
- let ret_stmt = self . stmt_expr ( ret_expr) ;
1762
- let block = P ( self . signal_block_stmt ( ret_stmt, e. span ,
1763
- hir:: PushUnstableBlock ,
1764
- ThinVec :: new ( ) ) ) ;
1765
1742
1766
1743
let err_pat = self . pat_err ( e. span , err_local) ;
1767
- self . arm ( hir_vec ! [ err_pat] , block )
1744
+ self . arm ( hir_vec ! [ err_pat] , ret_expr )
1768
1745
} ;
1769
1746
1770
1747
return self . expr_match ( e. span , discr, hir_vec ! [ err_arm, ok_arm] ,
@@ -1938,12 +1915,12 @@ impl<'a> LoweringContext<'a> {
1938
1915
span : Span ,
1939
1916
components : & [ & str ] ,
1940
1917
attrs : ThinVec < Attribute > )
1941
- -> P < hir:: Expr > {
1918
+ -> hir:: Expr {
1942
1919
let path = self . std_path ( span, components, true ) ;
1943
1920
let def = path. def ;
1944
1921
let expr = self . expr ( span, hir:: ExprPath ( hir:: QPath :: Resolved ( None , P ( path) ) ) , attrs) ;
1945
1922
self . resolver . record_resolution ( expr. id , def) ;
1946
- P ( expr)
1923
+ expr
1947
1924
}
1948
1925
1949
1926
fn expr_match ( & mut self ,
@@ -1968,13 +1945,13 @@ impl<'a> LoweringContext<'a> {
1968
1945
components : & [ & str ] ,
1969
1946
fields : hir:: HirVec < hir:: Field > ,
1970
1947
e : Option < P < hir:: Expr > > ,
1971
- attrs : ThinVec < Attribute > ) -> P < hir:: Expr > {
1948
+ attrs : ThinVec < Attribute > ) -> hir:: Expr {
1972
1949
let path = self . std_path ( span, components, false ) ;
1973
1950
let def = path. def ;
1974
1951
let qpath = hir:: QPath :: Resolved ( None , P ( path) ) ;
1975
1952
let expr = self . expr ( span, hir:: ExprStruct ( qpath, fields, e) , attrs) ;
1976
1953
self . resolver . record_resolution ( expr. id , def) ;
1977
- P ( expr)
1954
+ expr
1978
1955
}
1979
1956
1980
1957
fn expr ( & mut self , span : Span , node : hir:: Expr_ , attrs : ThinVec < Attribute > ) -> hir:: Expr {
@@ -2006,15 +1983,6 @@ impl<'a> LoweringContext<'a> {
2006
1983
( respan ( sp, hir:: StmtDecl ( P ( decl) , self . next_id ( ) ) ) , pat_id)
2007
1984
}
2008
1985
2009
- // Turns `<expr>` into `<expr>;`, note that this produces a StmtSemi, not a
2010
- // StmtExpr.
2011
- fn stmt_expr ( & self , expr : P < hir:: Expr > ) -> hir:: Stmt {
2012
- hir:: Stmt {
2013
- span : expr. span ,
2014
- node : hir:: StmtSemi ( expr, self . next_id ( ) ) ,
2015
- }
2016
- }
2017
-
2018
1986
fn block_expr ( & mut self , expr : P < hir:: Expr > ) -> hir:: Block {
2019
1987
self . block_all ( expr. span , hir:: HirVec :: new ( ) , Some ( expr) )
2020
1988
}
@@ -2144,23 +2112,6 @@ impl<'a> LoweringContext<'a> {
2144
2112
self . expr_block ( block, attrs)
2145
2113
}
2146
2114
2147
- fn signal_block_stmt ( & mut self ,
2148
- stmt : hir:: Stmt ,
2149
- span : Span ,
2150
- rule : hir:: BlockCheckMode ,
2151
- attrs : ThinVec < Attribute > )
2152
- -> hir:: Expr {
2153
- let id = self . next_id ( ) ;
2154
- let block = P ( hir:: Block {
2155
- rules : rule,
2156
- span : span,
2157
- id : id,
2158
- stmts : hir_vec ! [ stmt] ,
2159
- expr : None ,
2160
- } ) ;
2161
- self . expr_block ( block, attrs)
2162
- }
2163
-
2164
2115
fn ty ( & mut self , span : Span , node : hir:: Ty_ ) -> P < hir:: Ty > {
2165
2116
P ( hir:: Ty {
2166
2117
id : self . next_id ( ) ,
0 commit comments