@@ -128,6 +128,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
128128 let mut slice = None ;
129129 let mut prev_rest_span = None ;
130130
131+ // Lowers `$bm $ident @ ..` to `$bm $ident @ _`.
132+ let lower_rest_sub = |this : & mut Self , pat, bm, ident, sub| {
133+ let lower_sub = |this : & mut Self | Some ( this. pat_wild_with_node_id_of ( sub) ) ;
134+ let node = this. lower_pat_ident ( pat, bm, ident, lower_sub) ;
135+ this. pat_with_node_id_of ( pat, node)
136+ } ;
137+
131138 let mut iter = pats. iter ( ) ;
132139 // Lower all the patterns until the first occurrence of a sub-slice pattern.
133140 for pat in iter. by_ref ( ) {
@@ -142,9 +149,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
142149 // Record, lower it to `$binding_mode $ident @ _`, and stop here.
143150 PatKind :: Ident ( ref bm, ident, Some ( ref sub) ) if sub. is_rest ( ) => {
144151 prev_rest_span = Some ( sub. span ) ;
145- let lower_sub = |this : & mut Self | Some ( this. pat_wild_with_node_id_of ( sub) ) ;
146- let node = self . lower_pat_ident ( pat, bm, ident, lower_sub) ;
147- slice = Some ( self . pat_with_node_id_of ( pat, node) ) ;
152+ slice = Some ( lower_rest_sub ( self , pat, bm, ident, sub) ) ;
148153 break ;
149154 }
150155 // It was not a subslice pattern so lower it normally.
@@ -157,9 +162,9 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
157162 // There was a previous subslice pattern; make sure we don't allow more.
158163 let rest_span = match pat. kind {
159164 PatKind :: Rest => Some ( pat. span ) ,
160- PatKind :: Ident ( .. , Some ( ref sub) ) if sub. is_rest ( ) => {
161- // The `HirValidator` is merciless; add a ` _` pattern to avoid ICEs.
162- after. push ( self . pat_wild_with_node_id_of ( pat) ) ;
165+ PatKind :: Ident ( ref bm , ident , Some ( ref sub) ) if sub. is_rest ( ) => {
166+ // #69103: Lower into `binding @ _` as above to avoid ICEs.
167+ after. push ( lower_rest_sub ( self , pat, bm , ident , sub ) ) ;
163168 Some ( sub. span )
164169 }
165170 _ => None ,
0 commit comments