Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit f1e4d94

Browse files
committed
add more pattern migration tests
Most of these are meant to test possible future improvements, but since they cover cases the existing test suite didn't, I figure including them now may be helpful.
1 parent 8dcdb3e commit f1e4d94

File tree

3 files changed

+400
-1
lines changed

3 files changed

+400
-1
lines changed

tests/ui/pattern/rfc-3627-match-ergonomics-2024/migration_lint.fixed

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,4 +150,93 @@ fn main() {
150150
let &[&(_)] = &[&0];
151151
//~^ ERROR: reference patterns may only be written when the default binding mode is `move` in Rust 2024
152152
//~| 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);
153242
}

tests/ui/pattern/rfc-3627-match-ergonomics-2024/migration_lint.rs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,4 +150,93 @@ fn main() {
150150
let [&(_)] = &[&0];
151151
//~^ ERROR: reference patterns may only be written when the default binding mode is `move` in Rust 2024
152152
//~| 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 { ref a, ref 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 Struct { ref a, ref mut b, 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 Struct { a: &[ref a], b: &mut [[b]], 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, b, [c], [(d, [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 (a, [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, (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 @ 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 [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);
153242
}

0 commit comments

Comments
 (0)