@@ -10,7 +10,11 @@ use rustc_span::symbol::Ident;
10
10
use rustc_span:: { source_map:: Spanned , Span } ;
11
11
12
12
impl < ' a , ' hir > LoweringContext < ' a , ' hir > {
13
- crate fn lower_pat ( & mut self , mut pattern : & Pat ) -> & ' hir hir:: Pat < ' hir > {
13
+ crate fn lower_pat ( & mut self , pattern : & Pat ) -> & ' hir hir:: Pat < ' hir > {
14
+ self . arena . alloc ( self . lower_pat_mut ( pattern) )
15
+ }
16
+
17
+ crate fn lower_pat_mut ( & mut self , mut pattern : & Pat ) -> hir:: Pat < ' hir > {
14
18
ensure_sufficient_stack ( || {
15
19
// loop here to avoid recursion
16
20
let node = loop {
@@ -34,7 +38,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
34
38
}
35
39
PatKind :: Or ( ref pats) => {
36
40
break hir:: PatKind :: Or (
37
- self . arena . alloc_from_iter ( pats. iter ( ) . map ( |x| self . lower_pat ( x) ) ) ,
41
+ self . arena . alloc_from_iter ( pats. iter ( ) . map ( |x| self . lower_pat_mut ( x) ) ) ,
38
42
) ;
39
43
}
40
44
PatKind :: Path ( ref qself, ref path) => {
@@ -101,7 +105,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
101
105
& mut self ,
102
106
pats : & [ P < Pat > ] ,
103
107
ctx : & str ,
104
- ) -> ( & ' hir [ & ' hir hir:: Pat < ' hir > ] , Option < usize > ) {
108
+ ) -> ( & ' hir [ hir:: Pat < ' hir > ] , Option < usize > ) {
105
109
let mut elems = Vec :: with_capacity ( pats. len ( ) ) ;
106
110
let mut rest = None ;
107
111
@@ -140,7 +144,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
140
144
}
141
145
142
146
// It was not a sub-tuple pattern so lower it normally.
143
- elems. push ( self . lower_pat ( pat) ) ;
147
+ elems. push ( self . lower_pat_mut ( pat) ) ;
144
148
}
145
149
146
150
for ( _, pat) in iter {
@@ -149,7 +153,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
149
153
// ...but there was one again, so error.
150
154
self . ban_extra_rest_pat ( pat. span , rest. unwrap ( ) . 1 , ctx) ;
151
155
} else {
152
- elems. push ( self . lower_pat ( pat) ) ;
156
+ elems. push ( self . lower_pat_mut ( pat) ) ;
153
157
}
154
158
}
155
159
@@ -189,11 +193,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
189
193
// Record, lower it to `$binding_mode $ident @ _`, and stop here.
190
194
PatKind :: Ident ( ref bm, ident, Some ( ref sub) ) if sub. is_rest ( ) => {
191
195
prev_rest_span = Some ( sub. span ) ;
192
- slice = Some ( lower_rest_sub ( self , pat, bm, ident, sub) ) ;
196
+ slice = Some ( self . arena . alloc ( lower_rest_sub ( self , pat, bm, ident, sub) ) ) ;
193
197
break ;
194
198
}
195
199
// It was not a subslice pattern so lower it normally.
196
- _ => before. push ( self . lower_pat ( pat) ) ,
200
+ _ => before. push ( self . lower_pat_mut ( pat) ) ,
197
201
}
198
202
}
199
203
@@ -214,7 +218,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
214
218
self . ban_extra_rest_pat ( rest_span, prev_rest_span. unwrap ( ) , "slice" ) ;
215
219
} else {
216
220
// Lower the pattern normally.
217
- after. push ( self . lower_pat ( pat) ) ;
221
+ after. push ( self . lower_pat_mut ( pat) ) ;
218
222
}
219
223
}
220
224
@@ -268,17 +272,17 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
268
272
}
269
273
270
274
fn pat_wild_with_node_id_of ( & mut self , p : & Pat ) -> & ' hir hir:: Pat < ' hir > {
271
- self . pat_with_node_id_of ( p, hir:: PatKind :: Wild )
275
+ self . arena . alloc ( self . pat_with_node_id_of ( p, hir:: PatKind :: Wild ) )
272
276
}
273
277
274
278
/// Construct a `Pat` with the `HirId` of `p.id` lowered.
275
- fn pat_with_node_id_of ( & mut self , p : & Pat , kind : hir:: PatKind < ' hir > ) -> & ' hir hir:: Pat < ' hir > {
276
- self . arena . alloc ( hir:: Pat {
279
+ fn pat_with_node_id_of ( & mut self , p : & Pat , kind : hir:: PatKind < ' hir > ) -> hir:: Pat < ' hir > {
280
+ hir:: Pat {
277
281
hir_id : self . lower_node_id ( p. id ) ,
278
282
kind,
279
283
span : p. span ,
280
284
default_binding_modes : true ,
281
- } )
285
+ }
282
286
}
283
287
284
288
/// Emit a friendly error for extra `..` patterns in a tuple/tuple struct/slice pattern.
0 commit comments