@@ -150,4 +150,93 @@ fn main() {
150
150
let & [ & ( _) ] = & [ & 0 ] ;
151
151
//~^ ERROR: reference patterns may only be written when the default binding mode is `move` in Rust 2024
152
152
//~| WARN: this changes meaning in Rust 2024
153
+
154
+ // NB: Most of the following tests are for possible future improvements to migration suggestions
155
+
156
+ // Test removing multiple binding modifiers.
157
+ let Struct { a, b, c } = & Struct { a : 0 , b : 0 , c : 0 } ;
158
+ //~^ ERROR: binding modifiers may only be written when the default binding mode is `move` in Rust 2024
159
+ //~| WARN: this changes meaning in Rust 2024
160
+ assert_type_eq ( a, & 0u32 ) ;
161
+ assert_type_eq ( c, & 0u32 ) ;
162
+
163
+ // Test that we don't change bindings' modes when removing binding modifiers.
164
+ let & mut Struct { ref a, ref mut b, ref mut c } = & mut Struct { a : 0 , b : 0 , c : 0 } ;
165
+ //~^ ERROR: binding modifiers may only be written when the default binding mode is `move` in Rust 2024
166
+ //~| WARN: this changes meaning in Rust 2024
167
+ assert_type_eq ( a, & 0u32 ) ;
168
+ assert_type_eq ( b, & mut 0u32 ) ;
169
+ assert_type_eq ( c, & mut 0u32 ) ;
170
+
171
+ // Test removing multiple reference patterns of various mutabilities, plus a binding modifier.
172
+ let & mut & Struct { a : & [ ref a] , b : & mut [ & [ ref b] ] , ref c } = & mut & Struct { a : & [ 0 ] , b : & mut [ & [ 0 ] ] , c : 0 } ;
173
+ //~^ ERROR: reference patterns may only be written when the default binding mode is `move` in Rust 2024
174
+ //~| WARN: this changes meaning in Rust 2024
175
+ assert_type_eq ( a, & 0u32 ) ;
176
+ assert_type_eq ( b, & 0u32 ) ;
177
+ assert_type_eq ( c, & 0u32 ) ;
178
+
179
+ // Test that we don't change bindings' types when removing reference patterns.
180
+ let & Foo ( & ref a) = & Foo ( & 0 ) ;
181
+ //~^ ERROR: reference patterns may only be written when the default binding mode is `move` in Rust 2024
182
+ //~| WARN: this changes meaning in Rust 2024
183
+ assert_type_eq ( a, & 0u32 ) ;
184
+
185
+ // Test that we don't change bindings' modes when adding reference paterns (caught early).
186
+ let & ( & a, ref b, & [ ref c] , & mut [ & mut ( ref d, & [ ref e] ) ] ) = & ( & 0 , 0 , & [ 0 ] , & mut [ & mut ( 0 , & [ 0 ] ) ] ) ;
187
+ //~^ ERROR: reference patterns may only be written when the default binding mode is `move` in Rust 2024
188
+ //~| WARN: this changes meaning in Rust 2024
189
+ assert_type_eq ( a, 0u32 ) ;
190
+ assert_type_eq ( b, & 0u32 ) ;
191
+ assert_type_eq ( c, & 0u32 ) ;
192
+ assert_type_eq ( d, & 0u32 ) ;
193
+ assert_type_eq ( e, & 0u32 ) ;
194
+
195
+ // Test that we don't change bindings' modes when adding reference patterns (caught late).
196
+ let & ( ref a, & mut [ ref b] , & [ mut c] ) = & ( 0 , & mut [ 0 ] , & [ 0 ] ) ;
197
+ //~^ ERROR: binding modifiers may only be written when the default binding mode is `move` in Rust 2024
198
+ //~| WARN: this changes meaning in Rust 2024
199
+ assert_type_eq ( a, & 0u32 ) ;
200
+ assert_type_eq ( b, & 0u32 ) ;
201
+ assert_type_eq ( c, 0u32 ) ;
202
+
203
+ // Test featuring both additions and removals.
204
+ let & ( & a, & mut ( ref b, & [ ref c] ) ) = & ( & 0 , & mut ( 0 , & [ 0 ] ) ) ;
205
+ //~^ ERROR: reference patterns may only be written when the default binding mode is `move` in Rust 2024
206
+ //~| WARN: this changes meaning in Rust 2024
207
+ assert_type_eq ( a, 0u32 ) ;
208
+ assert_type_eq ( b, & 0u32 ) ;
209
+ assert_type_eq ( c, & 0u32 ) ;
210
+
211
+ // Test that bindings' subpatterns' modes are updated properly.
212
+ let & [ mut a @ ref b] = & [ 0 ] ;
213
+ //~^ ERROR: binding modifiers may only be written when the default binding mode is `move` in Rust 2024
214
+ //~| WARN: this changes meaning in Rust 2024
215
+ assert_type_eq ( a, 0u32 ) ;
216
+ assert_type_eq ( b, & 0u32 ) ;
217
+
218
+ // Test that bindings' subpatterns' modes are checked properly.
219
+ let & [ ref a @ mut b] = & [ 0 ] ;
220
+ //~^ ERROR: binding modifiers may only be written when the default binding mode is `move` in Rust 2024
221
+ //~| WARN: this changes meaning in Rust 2024
222
+ assert_type_eq ( a, & 0u32 ) ;
223
+ assert_type_eq ( b, 0u32 ) ;
224
+
225
+ // Test that we respect bindings' subpatterns' types when rewriting `&ref x` to `x`.
226
+ let [ & Foo ( & ref a @ ref b) , & Foo ( & ref c @ d) ] = [ & Foo ( & 0 ) ; 2 ] ;
227
+ //~^ ERROR: reference patterns may only be written when the default binding mode is `move` in Rust 2024
228
+ //~| WARN: this changes meaning in Rust 2024
229
+ assert_type_eq ( a, & 0u32 ) ;
230
+ assert_type_eq ( b, & 0u32 ) ;
231
+ assert_type_eq ( c, & 0u32 ) ;
232
+ assert_type_eq ( d, 0u32 ) ;
233
+
234
+ // Test that we respect bindings' subpatterns' modes when rewriting `&ref x` to `x`.
235
+ let [ & Foo ( & ref a @ [ ref b] ) , & Foo ( & ref c @ [ d] ) ] = [ & Foo ( & [ 0 ] ) ; 2 ] ;
236
+ //~^ ERROR: reference patterns may only be written when the default binding mode is `move` in Rust 2024
237
+ //~| WARN: this changes meaning in Rust 2024
238
+ assert_type_eq ( a, & [ 0u32 ] ) ;
239
+ assert_type_eq ( b, & 0u32 ) ;
240
+ assert_type_eq ( c, & [ 0u32 ] ) ;
241
+ assert_type_eq ( d, 0u32 ) ;
153
242
}
0 commit comments