struct A(String); struct C(D); fn suggest_remove_deref() { let a = &A("".to_string()); let b = *a; //~^ ERROR } fn suggest_borrow() { let a = [A("".to_string())]; let b = a[0]; //~^ ERROR } fn suggest_borrow2() { let mut a = A("".to_string()); let r = &&mut a; let s = **r; //~^ ERROR } fn suggest_borrow3() { use std::rc::Rc; let mut a = A("".to_string()); let r = Rc::new(a); let s = *r; //~^ ERROR } fn suggest_borrow4() { let a = [A("".to_string())][0]; //~^ ERROR } fn suggest_borrow5() { let a = &A("".to_string()); let A(s) = *a; //~^ ERROR } fn suggest_ref() { let c = C(D(String::new())); let C(D(s)) = c; //~^ ERROR } fn suggest_nothing() { let a = &A("".to_string()); let b; b = *a; //~^ ERROR } enum B { V(String), U(D), } struct D(String); impl Drop for D { fn drop(&mut self) {} } struct F(String, String); impl Drop for F { fn drop(&mut self) {} } fn probably_suggest_borrow() { let x = [B::V(String::new())]; match x[0] { //~^ ERROR B::U(d) => (), B::V(s) => (), } } fn have_to_suggest_ref() { let x = B::V(String::new()); match x { //~^ ERROR B::V(s) => drop(s), B::U(D(s)) => (), }; } fn two_separate_errors() { let x = (D(String::new()), &String::new()); match x { //~^ ERROR //~^^ ERROR (D(s), &t) => (), _ => (), } } fn have_to_suggest_double_ref() { let x = F(String::new(), String::new()); match x { //~^ ERROR F(s, mut t) => (), _ => (), } } fn double_binding(x: &Result) { match *x { //~^ ERROR Ok(s) | Err(s) => (), } } fn main() { }