Skip to content

Commit 8ee0fcb

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. (cherry picked from commit f1e4d94)
1 parent c8e8068 commit 8ee0fcb

File tree

3 files changed

+400
-1
lines changed

3 files changed

+400
-1
lines changed

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

+89
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
}

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

+89
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)