@@ -11,6 +11,7 @@ use rustc_ast::attr;
11
11
use rustc_ast:: ptr:: P as AstP ;
12
12
use rustc_ast:: * ;
13
13
use rustc_data_structures:: stack:: ensure_sufficient_stack;
14
+ use rustc_data_structures:: thin_slice:: ThinSlice ;
14
15
use rustc_hir as hir;
15
16
use rustc_hir:: def:: Res ;
16
17
use rustc_hir:: definitions:: DefPathData ;
@@ -25,6 +26,10 @@ impl<'hir> LoweringContext<'_, 'hir> {
25
26
self . arena . alloc_from_iter ( exprs. iter ( ) . map ( |x| self . lower_expr_mut ( x) ) )
26
27
}
27
28
29
+ fn lower_exprs_thin ( & mut self , exprs : & [ AstP < Expr > ] ) -> & ' hir ThinSlice < hir:: Expr < ' hir > > {
30
+ self . arena . allocate_thin_from_iter ( exprs. iter ( ) . map ( |x| self . lower_expr_mut ( x) ) )
31
+ }
32
+
28
33
pub ( super ) fn lower_expr ( & mut self , e : & Expr ) -> & ' hir hir:: Expr < ' hir > {
29
34
self . arena . alloc ( self . lower_expr_mut ( e) )
30
35
}
@@ -100,7 +105,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
100
105
self . lower_legacy_const_generics ( ( * * f) . clone ( ) , args. clone ( ) , & legacy_args)
101
106
} else {
102
107
let f = self . lower_expr ( f) ;
103
- hir:: ExprKind :: Call ( f, self . lower_exprs ( args) )
108
+ hir:: ExprKind :: Call ( f, self . lower_exprs_thin ( args) )
104
109
}
105
110
}
106
111
ExprKind :: MethodCall ( box MethodCall { seg, receiver, args, span } ) => {
@@ -112,8 +117,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
112
117
& ImplTraitContext :: Disallowed ( ImplTraitPosition :: Path ) ,
113
118
) ) ;
114
119
let receiver = self . lower_expr ( receiver) ;
115
- let args =
116
- self . arena . alloc_from_iter ( args. iter ( ) . map ( |x| self . lower_expr_mut ( x) ) ) ;
120
+ let args = self
121
+ . arena
122
+ . allocate_thin_from_iter ( args. iter ( ) . map ( |x| self . lower_expr_mut ( x) ) ) ;
117
123
hir:: ExprKind :: MethodCall ( hir_seg, receiver, args, self . lower_span ( * span) )
118
124
}
119
125
ExprKind :: Binary ( binop, lhs, rhs) => {
@@ -407,7 +413,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
407
413
408
414
// Now lower everything as normal.
409
415
let f = self . lower_expr ( & f) ;
410
- hir:: ExprKind :: Call ( f, self . lower_exprs ( & real_args) )
416
+ hir:: ExprKind :: Call ( f, self . lower_exprs_thin ( & real_args) )
411
417
}
412
418
413
419
fn lower_expr_if (
@@ -494,7 +500,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
494
500
let then = self . lower_block_expr ( body) ;
495
501
let expr_break = self . expr_break ( span) ;
496
502
let stmt_break = self . stmt_expr ( span, expr_break) ;
497
- let else_blk = self . block_all ( span, arena_vec ! [ self ; stmt_break] , None ) ;
503
+ let else_blk = self . block_all ( span, arena_thin_vec ! [ self ; stmt_break] , None ) ;
498
504
let else_expr = self . arena . alloc ( self . expr_block ( else_blk) ) ;
499
505
let if_kind = hir:: ExprKind :: If ( lowered_cond, self . arena . alloc ( then) , Some ( else_expr) ) ;
500
506
let if_expr = self . expr ( span, if_kind) ;
@@ -554,7 +560,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
554
560
overall_span : Span ,
555
561
) -> & ' hir hir:: Expr < ' hir > {
556
562
let constructor = self . arena . alloc ( self . expr_lang_item_path ( method_span, lang_item, None ) ) ;
557
- self . expr_call ( overall_span, constructor, std :: slice :: from_ref ( expr) )
563
+ self . expr_call ( overall_span, constructor, arena_thin_vec ! [ self ; * expr] )
558
564
}
559
565
560
566
fn lower_arm ( & mut self , arm : & Arm ) -> hir:: Arm < ' hir > {
@@ -653,7 +659,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
653
659
def_id : self . local_def_id ( closure_node_id) ,
654
660
binder : hir:: ClosureBinder :: Default ,
655
661
capture_clause,
656
- bound_generic_params : & [ ] ,
662
+ bound_generic_params : ThinSlice :: empty ( ) ,
657
663
fn_decl,
658
664
body,
659
665
fn_decl_span : self . lower_span ( span) ,
@@ -755,19 +761,19 @@ impl<'hir> LoweringContext<'_, 'hir> {
755
761
let new_unchecked = self . expr_call_lang_item_fn_mut (
756
762
span,
757
763
hir:: LangItem :: PinNewUnchecked ,
758
- arena_vec ! [ self ; ref_mut_awaitee] ,
764
+ arena_thin_vec ! [ self ; ref_mut_awaitee] ,
759
765
Some ( expr_hir_id) ,
760
766
) ;
761
767
let get_context = self . expr_call_lang_item_fn_mut (
762
768
gen_future_span,
763
769
hir:: LangItem :: GetContext ,
764
- arena_vec ! [ self ; task_context] ,
770
+ arena_thin_vec ! [ self ; task_context] ,
765
771
Some ( expr_hir_id) ,
766
772
) ;
767
773
let call = self . expr_call_lang_item_fn (
768
774
span,
769
775
hir:: LangItem :: FuturePoll ,
770
- arena_vec ! [ self ; new_unchecked, get_context] ,
776
+ arena_thin_vec ! [ self ; new_unchecked, get_context] ,
771
777
Some ( expr_hir_id) ,
772
778
) ;
773
779
self . arena . alloc ( self . expr_unsafe ( call) )
@@ -800,7 +806,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
800
806
let pending_pat = self . pat_lang_item_variant (
801
807
span,
802
808
hir:: LangItem :: PollPending ,
803
- & [ ] ,
809
+ ThinSlice :: empty ( ) ,
804
810
Some ( expr_hir_id) ,
805
811
) ;
806
812
let empty_block = self . expr_block_empty ( span) ;
@@ -838,7 +844,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
838
844
}
839
845
} ;
840
846
841
- let loop_block = self . block_all ( span, arena_vec ! [ self ; inner_match_stmt, yield_stmt] , None ) ;
847
+ let loop_block =
848
+ self . block_all ( span, arena_thin_vec ! [ self ; inner_match_stmt, yield_stmt] , None ) ;
842
849
843
850
// loop { .. }
844
851
let loop_expr = self . arena . alloc ( hir:: Expr {
@@ -864,7 +871,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
864
871
let into_future_expr = self . expr_call_lang_item_fn (
865
872
into_future_span,
866
873
hir:: LangItem :: IntoFutureIntoFuture ,
867
- arena_vec ! [ self ; expr] ,
874
+ arena_thin_vec ! [ self ; expr] ,
868
875
Some ( expr_hir_id) ,
869
876
) ;
870
877
@@ -1092,9 +1099,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
1092
1099
) ;
1093
1100
1094
1101
// `a = lhs1; b = lhs2;`.
1095
- let stmts = self
1096
- . arena
1097
- . alloc_from_iter ( std :: iter :: once ( destructure_let ) . chain ( assignments . into_iter ( ) ) ) ;
1102
+ let stmts = self . arena . allocate_thin_from_iter (
1103
+ std :: iter :: once ( destructure_let ) . chain ( assignments . into_iter ( ) ) ,
1104
+ ) ;
1098
1105
1099
1106
// Wrap everything in a block.
1100
1107
hir:: ExprKind :: Block ( & self . block_all ( whole_span, stmts, None ) , None )
@@ -1167,7 +1174,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1167
1174
let ( pats, rest) =
1168
1175
self . destructure_sequence ( elements, "slice" , eq_sign_span, assignments) ;
1169
1176
let slice_pat = if let Some ( ( i, span) ) = rest {
1170
- let ( before, after) = pats. split_at ( i) ;
1177
+ let ( before, after) : ( & [ hir :: Pat < ' _ > ] , & [ hir :: Pat < ' _ > ] ) = pats. split_at ( i) ;
1171
1178
hir:: PatKind :: Slice (
1172
1179
before,
1173
1180
Some ( self . arena . alloc ( self . pat_without_dbm ( span, hir:: PatKind :: Wild ) ) ) ,
@@ -1220,7 +1227,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1220
1227
}
1221
1228
// Structs.
1222
1229
ExprKind :: Struct ( se) => {
1223
- let field_pats = self . arena . alloc_from_iter ( se. fields . iter ( ) . map ( |f| {
1230
+ let field_pats = self . arena . allocate_thin_from_iter ( se. fields . iter ( ) . map ( |f| {
1224
1231
let pat = self . destructure_assign ( & f. expr , eq_sign_span, assignments) ;
1225
1232
hir:: PatField {
1226
1233
hir_id : self . next_id ( ) ,
@@ -1260,7 +1267,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
1260
1267
ExprKind :: Paren ( e) => {
1261
1268
// We special-case `(..)` for consistency with patterns.
1262
1269
if let ExprKind :: Range ( None , None , RangeLimits :: HalfOpen ) = e. kind {
1263
- let tuple_pat = hir:: PatKind :: Tuple ( & [ ] , hir:: DotDotPos :: new ( Some ( 0 ) ) ) ;
1270
+ let tuple_pat =
1271
+ hir:: PatKind :: Tuple ( ThinSlice :: empty ( ) , hir:: DotDotPos :: new ( Some ( 0 ) ) ) ;
1264
1272
return self . pat_without_dbm ( lhs. span , tuple_pat) ;
1265
1273
} else {
1266
1274
return self . destructure_assign_mut ( e, eq_sign_span, assignments) ;
@@ -1290,10 +1298,10 @@ impl<'hir> LoweringContext<'_, 'hir> {
1290
1298
ctx : & str ,
1291
1299
eq_sign_span : Span ,
1292
1300
assignments : & mut Vec < hir:: Stmt < ' hir > > ,
1293
- ) -> ( & ' hir [ hir:: Pat < ' hir > ] , Option < ( usize , Span ) > ) {
1301
+ ) -> ( & ' hir ThinSlice < hir:: Pat < ' hir > > , Option < ( usize , Span ) > ) {
1294
1302
let mut rest = None ;
1295
1303
let elements =
1296
- self . arena . alloc_from_iter ( elements. iter ( ) . enumerate ( ) . filter_map ( |( i, e) | {
1304
+ self . arena . allocate_thin_from_iter ( elements. iter ( ) . enumerate ( ) . filter_map ( |( i, e) | {
1297
1305
// Check for `..` pattern.
1298
1306
if let ExprKind :: Range ( None , None , RangeLimits :: HalfOpen ) = e. kind {
1299
1307
if let Some ( ( _, prev_span) ) = rest {
@@ -1316,7 +1324,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1316
1324
let fn_path =
1317
1325
hir:: QPath :: LangItem ( hir:: LangItem :: RangeInclusiveNew , self . lower_span ( span) , None ) ;
1318
1326
let fn_expr = self . arena . alloc ( self . expr ( span, hir:: ExprKind :: Path ( fn_path) ) ) ;
1319
- hir:: ExprKind :: Call ( fn_expr, arena_vec ! [ self ; e1, e2] )
1327
+ hir:: ExprKind :: Call ( fn_expr, arena_thin_vec ! [ self ; e1, e2] )
1320
1328
}
1321
1329
1322
1330
fn lower_expr_range (
@@ -1512,7 +1520,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1512
1520
let next_expr = self . expr_call_lang_item_fn (
1513
1521
head_span,
1514
1522
hir:: LangItem :: IteratorNext ,
1515
- arena_vec ! [ self ; ref_mut_iter] ,
1523
+ arena_thin_vec ! [ self ; ref_mut_iter] ,
1516
1524
None ,
1517
1525
) ;
1518
1526
let arms = arena_vec ! [ self ; none_arm, some_arm] ;
@@ -1521,7 +1529,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1521
1529
} ;
1522
1530
let match_stmt = self . stmt_expr ( for_span, match_expr) ;
1523
1531
1524
- let loop_block = self . block_all ( for_span, arena_vec ! [ self ; match_stmt] , None ) ;
1532
+ let loop_block = self . block_all ( for_span, arena_thin_vec ! [ self ; match_stmt] , None ) ;
1525
1533
1526
1534
// `[opt_ident]: loop { ... }`
1527
1535
let kind = hir:: ExprKind :: Loop (
@@ -1541,7 +1549,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1541
1549
self . expr_call_lang_item_fn (
1542
1550
head_span,
1543
1551
hir:: LangItem :: IntoIterIntoIter ,
1544
- arena_vec ! [ self ; head] ,
1552
+ arena_thin_vec ! [ self ; head] ,
1545
1553
None ,
1546
1554
)
1547
1555
} ;
@@ -1597,7 +1605,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1597
1605
self . expr_call_lang_item_fn (
1598
1606
unstable_span,
1599
1607
hir:: LangItem :: TryTraitBranch ,
1600
- arena_vec ! [ self ; sub_expr] ,
1608
+ arena_thin_vec ! [ self ; sub_expr] ,
1601
1609
None ,
1602
1610
)
1603
1611
} ;
@@ -1784,7 +1792,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1784
1792
& mut self ,
1785
1793
span : Span ,
1786
1794
e : & ' hir hir:: Expr < ' hir > ,
1787
- args : & ' hir [ hir:: Expr < ' hir > ] ,
1795
+ args : & ' hir ThinSlice < hir:: Expr < ' hir > > ,
1788
1796
) -> hir:: Expr < ' hir > {
1789
1797
self . expr ( span, hir:: ExprKind :: Call ( e, args) )
1790
1798
}
@@ -1793,7 +1801,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1793
1801
& mut self ,
1794
1802
span : Span ,
1795
1803
e : & ' hir hir:: Expr < ' hir > ,
1796
- args : & ' hir [ hir:: Expr < ' hir > ] ,
1804
+ args : & ' hir ThinSlice < hir:: Expr < ' hir > > ,
1797
1805
) -> & ' hir hir:: Expr < ' hir > {
1798
1806
self . arena . alloc ( self . expr_call_mut ( span, e, args) )
1799
1807
}
@@ -1802,7 +1810,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1802
1810
& mut self ,
1803
1811
span : Span ,
1804
1812
lang_item : hir:: LangItem ,
1805
- args : & ' hir [ hir:: Expr < ' hir > ] ,
1813
+ args : & ' hir ThinSlice < hir:: Expr < ' hir > > ,
1806
1814
hir_id : Option < hir:: HirId > ,
1807
1815
) -> hir:: Expr < ' hir > {
1808
1816
let path = self . arena . alloc ( self . expr_lang_item_path ( span, lang_item, hir_id) ) ;
@@ -1813,7 +1821,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1813
1821
& mut self ,
1814
1822
span : Span ,
1815
1823
lang_item : hir:: LangItem ,
1816
- args : & ' hir [ hir:: Expr < ' hir > ] ,
1824
+ args : & ' hir ThinSlice < hir:: Expr < ' hir > > ,
1817
1825
hir_id : Option < hir:: HirId > ,
1818
1826
) -> & ' hir hir:: Expr < ' hir > {
1819
1827
self . arena . alloc ( self . expr_call_lang_item_fn_mut ( span, lang_item, args, hir_id) )
@@ -1874,7 +1882,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1874
1882
self . arena . alloc ( hir:: Path {
1875
1883
span : self . lower_span ( span) ,
1876
1884
res,
1877
- segments : arena_vec ! [ self ; hir:: PathSegment :: new( ident, hir_id, res) ] ,
1885
+ segments : arena_thin_vec ! [ self ; hir:: PathSegment :: new( ident, hir_id, res) ] ,
1878
1886
} ) ,
1879
1887
) ) ;
1880
1888
@@ -1888,7 +1896,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1888
1896
span,
1889
1897
hir:: ExprKind :: Block (
1890
1898
self . arena . alloc ( hir:: Block {
1891
- stmts : & [ ] ,
1899
+ stmts : ThinSlice :: empty ( ) ,
1892
1900
expr : Some ( expr) ,
1893
1901
hir_id,
1894
1902
rules : hir:: BlockCheckMode :: UnsafeBlock ( hir:: UnsafeSource :: CompilerGenerated ) ,
@@ -1901,7 +1909,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1901
1909
}
1902
1910
1903
1911
fn expr_block_empty ( & mut self , span : Span ) -> & ' hir hir:: Expr < ' hir > {
1904
- let blk = self . block_all ( span, & [ ] , None ) ;
1912
+ let blk = self . block_all ( span, ThinSlice :: empty ( ) , None ) ;
1905
1913
let expr = self . expr_block ( blk) ;
1906
1914
self . arena . alloc ( expr)
1907
1915
}
0 commit comments