#[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; }; }