From a4b7ed7a42c716ab9f05e351f003d589124fd55d Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 14:18:58 +0200 Subject: Adding upstream version 1.68.2+dfsg1. Signed-off-by: Daniel Baumann --- tests/ui/suggestions/dont-suggest-ref/simple.rs | 336 ++++++++++++++++++++++++ 1 file changed, 336 insertions(+) create mode 100644 tests/ui/suggestions/dont-suggest-ref/simple.rs (limited to 'tests/ui/suggestions/dont-suggest-ref/simple.rs') diff --git a/tests/ui/suggestions/dont-suggest-ref/simple.rs b/tests/ui/suggestions/dont-suggest-ref/simple.rs new file mode 100644 index 000000000..1e40e60a1 --- /dev/null +++ b/tests/ui/suggestions/dont-suggest-ref/simple.rs @@ -0,0 +1,336 @@ +#[derive(Clone)] +enum Either { + One(X), + Two(X), +} + +#[derive(Clone)] +struct X(Y); + +#[derive(Clone)] +struct Y; + +pub fn main() { + let e = Either::One(X(Y)); + let mut em = Either::One(X(Y)); + + let r = &e; + let rm = &mut Either::One(X(Y)); + + let x = X(Y); + let mut xm = X(Y); + + let s = &x; + let sm = &mut X(Y); + + let ve = vec![Either::One(X(Y))]; + + let vr = &ve; + let vrm = &mut vec![Either::One(X(Y))]; + + let vx = vec![X(Y)]; + + let vs = &vx; + let vsm = &mut vec![X(Y)]; + + // move from Either/X place + + let X(_t) = *s; + //~^ ERROR cannot move + //~| HELP consider removing the dereference here + if let Either::One(_t) = *r { } + //~^ ERROR cannot move + //~| HELP consider removing the dereference here + while let Either::One(_t) = *r { } + //~^ ERROR cannot move + //~| HELP consider removing the dereference here + match *r { + //~^ ERROR cannot move + //~| HELP consider removing the dereference here + Either::One(_t) + | Either::Two(_t) => (), + } + match *r { + //~^ ERROR cannot move + //~| HELP consider removing the dereference here + Either::One(_t) => (), + Either::Two(ref _t) => (), + // FIXME: should suggest removing `ref` too + } + + let X(_t) = *sm; + //~^ ERROR cannot move + //~| HELP consider removing the dereference here + if let Either::One(_t) = *rm { } + //~^ ERROR cannot move + //~| HELP consider removing the dereference here + while let Either::One(_t) = *rm { } + //~^ ERROR cannot move + //~| HELP consider removing the dereference here + match *rm { + //~^ ERROR cannot move + //~| HELP consider removing the dereference here + Either::One(_t) + | Either::Two(_t) => (), + } + match *rm { + //~^ ERROR cannot move + //~| HELP consider removing the dereference here + Either::One(_t) => (), + Either::Two(ref _t) => (), + // FIXME: should suggest removing `ref` too + } + match *rm { + //~^ ERROR cannot move + //~| HELP consider removing the dereference here + Either::One(_t) => (), + Either::Two(ref mut _t) => (), + // FIXME: should suggest removing `ref` too + } + + let X(_t) = vs[0]; + //~^ ERROR cannot move + //~| HELP consider borrowing here + if let Either::One(_t) = vr[0] { } + //~^ ERROR cannot move + //~| HELP consider borrowing here + while let Either::One(_t) = vr[0] { } + //~^ ERROR cannot move + //~| HELP consider borrowing here + match vr[0] { + //~^ ERROR cannot move + //~| HELP consider borrowing here + Either::One(_t) + | Either::Two(_t) => (), + } + match vr[0] { + //~^ ERROR cannot move + //~| HELP consider borrowing here + Either::One(_t) => (), + Either::Two(ref _t) => (), + // FIXME: should suggest removing `ref` too + } + + let X(_t) = vsm[0]; + //~^ ERROR cannot move + //~| HELP consider borrowing here + if let Either::One(_t) = vrm[0] { } + //~^ ERROR cannot move + //~| HELP consider borrowing here + while let Either::One(_t) = vrm[0] { } + //~^ ERROR cannot move + //~| HELP consider borrowing here + match vrm[0] { + //~^ ERROR cannot move + //~| HELP consider borrowing here + Either::One(_t) + | Either::Two(_t) => (), + } + match vrm[0] { + //~^ ERROR cannot move + //~| HELP consider borrowing here + Either::One(_t) => (), + Either::Two(ref _t) => (), + // FIXME: should suggest removing `ref` too + } + match vrm[0] { + //~^ ERROR cannot move + //~| HELP consider borrowing here + Either::One(_t) => (), + Either::Two(ref mut _t) => (), + // FIXME: should suggest removing `ref` too + } + + // move from &Either/&X place + + let &X(_t) = s; + //~^ ERROR cannot move + //~| HELP consider removing + if let &Either::One(_t) = r { } + //~^ ERROR cannot move + //~| HELP consider removing + while let &Either::One(_t) = r { } + //~^ ERROR cannot move + //~| HELP consider removing + match r { + //~^ ERROR cannot move + &Either::One(_t) + //~^ HELP consider removing + | &Either::Two(_t) => (), + // FIXME: would really like a suggestion here too + } + match r { + //~^ ERROR cannot move + &Either::One(_t) => (), + //~^ HELP consider removing + &Either::Two(ref _t) => (), + } + match r { + //~^ ERROR cannot move + &Either::One(_t) => (), + //~^ HELP consider removing + Either::Two(_t) => (), + } + fn f1(&X(_t): &X) { } + //~^ ERROR cannot move + //~| HELP consider removing + + let &mut X(_t) = sm; + //~^ ERROR cannot move + //~| HELP consider removing + if let &mut Either::One(_t) = rm { } + //~^ ERROR cannot move + //~| HELP consider removing + while let &mut Either::One(_t) = rm { } + //~^ ERROR cannot move + //~| HELP consider removing + match rm { + //~^ ERROR cannot move + &mut Either::One(_t) => (), + //~^ HELP consider removing + &mut Either::Two(_t) => (), + //~^ HELP consider removing + } + match rm { + //~^ ERROR cannot move + &mut Either::One(_t) => (), + //~^ HELP consider removing + &mut Either::Two(ref _t) => (), + } + match rm { + //~^ ERROR cannot move + &mut Either::One(_t) => (), + //~^ HELP consider removing + &mut Either::Two(ref mut _t) => (), + } + match rm { + //~^ ERROR cannot move + &mut Either::One(_t) => (), + //~^ HELP consider removing + Either::Two(_t) => (), + } + fn f2(&mut X(_t): &mut X) { } + //~^ ERROR cannot move + //~| HELP consider removing + + // move from tuple of &Either/&X + + // FIXME: These should have suggestions. + + let (&X(_t),) = (&x.clone(),); + //~^ ERROR cannot move + //~| HELP consider borrowing the pattern binding + if let (&Either::One(_t),) = (&e.clone(),) { } + //~^ ERROR cannot move + //~| HELP consider borrowing the pattern binding + while let (&Either::One(_t),) = (&e.clone(),) { } + //~^ ERROR cannot move + //~| HELP consider borrowing the pattern binding + match (&e.clone(),) { + //~^ ERROR cannot move + (&Either::One(_t),) + //~^ HELP consider borrowing the pattern binding + | (&Either::Two(_t),) => (), + } + fn f3((&X(_t),): (&X,)) { } + //~^ ERROR cannot move + //~| HELP consider borrowing the pattern binding + + let (&mut X(_t),) = (&mut xm.clone(),); + //~^ ERROR cannot move + //~| HELP consider borrowing the pattern binding + if let (&mut Either::One(_t),) = (&mut em.clone(),) { } + //~^ ERROR cannot move + //~| HELP consider borrowing the pattern binding + while let (&mut Either::One(_t),) = (&mut em.clone(),) { } + //~^ ERROR cannot move + //~| HELP consider borrowing the pattern binding + match (&mut em.clone(),) { + //~^ ERROR cannot move + (&mut Either::One(_t),) => (), + //~^ HELP consider borrowing the pattern binding + (&mut Either::Two(_t),) => (), + //~^ HELP consider borrowing the pattern binding + } + fn f4((&mut X(_t),): (&mut X,)) { } + //~^ ERROR cannot move + //~| HELP consider borrowing the pattern binding + + // move from &Either/&X value + + let &X(_t) = &x; + //~^ ERROR cannot move + //~| HELP consider removing + if let &Either::One(_t) = &e { } + //~^ ERROR cannot move + //~| HELP consider removing + while let &Either::One(_t) = &e { } + //~^ ERROR cannot move + //~| HELP consider removing + match &e { + //~^ ERROR cannot move + &Either::One(_t) + //~^ HELP consider removing + | &Either::Two(_t) => (), + // FIXME: would really like a suggestion here too + } + match &e { + //~^ ERROR cannot move + &Either::One(_t) => (), + //~^ HELP consider removing + &Either::Two(ref _t) => (), + } + match &e { + //~^ ERROR cannot move + &Either::One(_t) => (), + //~^ HELP consider removing + Either::Two(_t) => (), + } + + let &mut X(_t) = &mut xm; + //~^ ERROR cannot move + //~| HELP consider removing + if let &mut Either::One(_t) = &mut em { } + //~^ ERROR cannot move + //~| HELP consider removing + while let &mut Either::One(_t) = &mut em { } + //~^ ERROR cannot move + //~| HELP consider removing + match &mut em { + //~^ ERROR cannot move + &mut Either::One(_t) + //~^ HELP consider removing + | &mut Either::Two(_t) => (), + // FIXME: would really like a suggestion here too + } + match &mut em { + //~^ ERROR cannot move + &mut Either::One(_t) => (), + //~^ HELP consider removing + &mut Either::Two(ref _t) => (), + } + match &mut em { + //~^ ERROR cannot move + &mut Either::One(_t) => (), + //~^ HELP consider removing + &mut Either::Two(ref mut _t) => (), + } + match &mut em { + //~^ ERROR cannot move + &mut Either::One(_t) => (), + //~^ HELP consider removing + Either::Two(_t) => (), + } +} + +struct Testing { + a: Option +} + +fn testing(a: &Testing) { + let Some(_s) = a.a else { + //~^ ERROR cannot move + //~| HELP consider borrowing the pattern binding + return; + }; +} -- cgit v1.2.3