rust/tests/ui/suggestions/dont-suggest-ref/simple.rs
2023-01-11 09:32:08 +00:00

337 lines
9.2 KiB
Rust

#[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<String>
}
fn testing(a: &Testing) {
let Some(_s) = a.a else {
//~^ ERROR cannot move
//~| HELP consider borrowing the pattern binding
return;
};
}