@@ -128,6 +128,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
128
128
let mut slice = None ;
129
129
let mut prev_rest_span = None ;
130
130
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
+
131
138
let mut iter = pats. iter ( ) ;
132
139
// Lower all the patterns until the first occurrence of a sub-slice pattern.
133
140
for pat in iter. by_ref ( ) {
@@ -142,9 +149,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
142
149
// Record, lower it to `$binding_mode $ident @ _`, and stop here.
143
150
PatKind :: Ident ( ref bm, ident, Some ( ref sub) ) if sub. is_rest ( ) => {
144
151
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) ) ;
148
153
break ;
149
154
}
150
155
// It was not a subslice pattern so lower it normally.
@@ -157,9 +162,9 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
157
162
// There was a previous subslice pattern; make sure we don't allow more.
158
163
let rest_span = match pat. kind {
159
164
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 ) ) ;
163
168
Some ( sub. span )
164
169
}
165
170
_ => None ,
0 commit comments