@@ -10,7 +10,11 @@ use rustc_span::symbol::Ident;
1010use rustc_span:: { source_map:: Spanned , Span } ;
1111
1212impl < ' 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 > {
1418 ensure_sufficient_stack ( || {
1519 // loop here to avoid recursion
1620 let node = loop {
@@ -34,7 +38,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
3438 }
3539 PatKind :: Or ( ref pats) => {
3640 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) ) ) ,
3842 ) ;
3943 }
4044 PatKind :: Path ( ref qself, ref path) => {
@@ -101,7 +105,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
101105 & mut self ,
102106 pats : & [ P < Pat > ] ,
103107 ctx : & str ,
104- ) -> ( & ' hir [ & ' hir hir:: Pat < ' hir > ] , Option < usize > ) {
108+ ) -> ( & ' hir [ hir:: Pat < ' hir > ] , Option < usize > ) {
105109 let mut elems = Vec :: with_capacity ( pats. len ( ) ) ;
106110 let mut rest = None ;
107111
@@ -140,7 +144,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
140144 }
141145
142146 // 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) ) ;
144148 }
145149
146150 for ( _, pat) in iter {
@@ -149,7 +153,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
149153 // ...but there was one again, so error.
150154 self . ban_extra_rest_pat ( pat. span , rest. unwrap ( ) . 1 , ctx) ;
151155 } else {
152- elems. push ( self . lower_pat ( pat) ) ;
156+ elems. push ( self . lower_pat_mut ( pat) ) ;
153157 }
154158 }
155159
@@ -189,11 +193,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
189193 // Record, lower it to `$binding_mode $ident @ _`, and stop here.
190194 PatKind :: Ident ( ref bm, ident, Some ( ref sub) ) if sub. is_rest ( ) => {
191195 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) ) ) ;
193197 break ;
194198 }
195199 // 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) ) ,
197201 }
198202 }
199203
@@ -214,7 +218,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
214218 self . ban_extra_rest_pat ( rest_span, prev_rest_span. unwrap ( ) , "slice" ) ;
215219 } else {
216220 // Lower the pattern normally.
217- after. push ( self . lower_pat ( pat) ) ;
221+ after. push ( self . lower_pat_mut ( pat) ) ;
218222 }
219223 }
220224
@@ -268,17 +272,17 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
268272 }
269273
270274 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 ) )
272276 }
273277
274278 /// 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 {
277281 hir_id : self . lower_node_id ( p. id ) ,
278282 kind,
279283 span : p. span ,
280284 default_binding_modes : true ,
281- } )
285+ }
282286 }
283287
284288 /// Emit a friendly error for extra `..` patterns in a tuple/tuple struct/slice pattern.
0 commit comments