struct NotClone; fn main() { clone_thing(&NotClone); } fn clone_thing(nc: &NotClone) -> NotClone { //~^ NOTE expected `NotClone` because of return type nc.clone() //~^ ERROR mismatched type //~| NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead //~| NOTE expected `NotClone`, found `&NotClone` } fn clone_thing2(nc: &NotClone) -> NotClone { let nc: NotClone = nc.clone(); //~^ ERROR mismatched type //~| NOTE expected due to this //~| NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead //~| NOTE expected `NotClone`, found `&NotClone` nc } fn clone_thing3(nc: &NotClone) -> NotClone { //~^ NOTE expected `NotClone` because of return type let nc = nc.clone(); //~^ NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead nc //~^ ERROR mismatched type //~| NOTE expected `NotClone`, found `&NotClone` } fn clone_thing4(nc: &NotClone) -> NotClone { //~^ NOTE expected `NotClone` because of return type let nc = nc.clone(); //~^ NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead let nc2 = nc; nc2 //~^ ERROR mismatched type //~| NOTE expected `NotClone`, found `&NotClone` } impl NotClone { fn other_fn(&self) {} fn get_ref_notclone(&self) -> &Self { self } } fn clone_thing5(nc: &NotClone) -> NotClone { //~^ NOTE expected `NotClone` because of return type let nc = nc.clone(); //~^ NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead let nc2 = nc; nc2.other_fn(); let nc3 = nc2; nc3 //~^ ERROR mismatched type //~| NOTE expected `NotClone`, found `&NotClone` } fn clone_thing6(nc: &NotClone) -> NotClone { //~^ NOTE expected `NotClone` because of return type let (ret, _) = (nc.clone(), 1); //~^ NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead let _ = nc.clone(); ret //~^ ERROR mismatched type //~| NOTE expected `NotClone`, found `&NotClone` } fn clone_thing7(nc: Vec<&NotClone>) -> NotClone { //~^ NOTE expected `NotClone` because of return type let ret = nc[0].clone(); //~^ NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead ret //~^ ERROR mismatched type //~| NOTE expected `NotClone`, found `&NotClone` } fn clone_thing8(nc: &NotClone) -> NotClone { //~^ NOTE expected `NotClone` because of return type let ret = { let a = nc.clone(); //~^ NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead a }; ret //~^ ERROR mismatched type //~| NOTE expected `NotClone`, found `&NotClone` } fn clone_thing9(nc: &NotClone) -> NotClone { //~^ NOTE expected `NotClone` because of return type let cl = || nc.clone(); //~^ NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead let ret = cl(); ret //~^ ERROR mismatched type //~| NOTE expected `NotClone`, found `&NotClone` } fn clone_thing10(nc: &NotClone) -> (NotClone, NotClone) { let (a, b) = { let a = nc.clone(); //~^ NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead (a, nc.clone()) //~^ NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead }; (a, b) //~^ ERROR mismatched type //~| ERROR mismatched type //~| NOTE expected `NotClone`, found `&NotClone` //~| NOTE expected `NotClone`, found `&NotClone` } fn clone_thing11(nc: &NotClone) -> NotClone { //~^ NOTE expected `NotClone` because of return type let a = { let nothing = nc.clone(); let a = nc.clone(); //~^ NOTE `NotClone` does not implement `Clone`, so `&NotClone` was cloned instead let nothing = nc.clone(); a }; a //~^ ERROR mismatched type //~| NOTE expected `NotClone`, found `&NotClone` }