// Test `@` patterns combined with `box` patterns. #![feature(bindings_after_at)] #![feature(move_ref_pattern)] #![feature(box_patterns)] #[derive(Copy, Clone)] struct C; fn c() -> C { C } struct NC; fn nc() -> NC { NC } fn main() { let a @ box &b = Box::new(&C); //~^ ERROR use of moved value let a @ box b = Box::new(C); //~^ ERROR use of moved value fn f1(a @ box &b: Box<&C>) {} //~^ ERROR use of moved value fn f2(a @ box b: Box) {} //~^ ERROR use of moved value match Box::new(C) { a @ box b => {} //~ ERROR use of moved value } let ref a @ box b = Box::new(NC); //~ ERROR cannot move out of value because it is borrowed let ref a @ box ref mut b = Box::new(nc()); //~^ ERROR cannot borrow value as mutable because it is also borrowed as immutable let ref a @ box ref mut b = Box::new(NC); //~^ ERROR cannot borrow value as mutable because it is also borrowed as immutable let ref a @ box ref mut b = Box::new(NC); //~^ ERROR cannot borrow value as mutable because it is also borrowed as immutable *b = NC; let ref a @ box ref mut b = Box::new(NC); //~^ ERROR cannot borrow value as mutable because it is also borrowed as immutable //~| ERROR cannot borrow value as mutable because it is also borrowed as immutable *b = NC; drop(a); let ref mut a @ box ref b = Box::new(NC); //~^ ERROR cannot borrow value as immutable because it is also borrowed as mutable //~| ERROR cannot borrow value as immutable because it is also borrowed as mutable *a = Box::new(NC); drop(b); fn f5(ref mut a @ box ref b: Box) { //~^ ERROR cannot borrow value as immutable because it is also borrowed as mutable //~| ERROR cannot borrow value as immutable because it is also borrowed as mutable *a = Box::new(NC); drop(b); } match Box::new(nc()) { ref mut a @ box ref b => { //~^ ERROR cannot borrow value as immutable because it is also borrowed as mutable //~| ERROR cannot borrow value as immutable because it is also borrowed as mutable *a = Box::new(NC); drop(b); } } }