b3a47d9b6b
This commit desugars the drop and replace deriving from an assignment at MIR build, avoiding the construction of the DropAndReplace terminator (which will be removed in a followign PR) In order to retain the same error messages for replaces a new DesugaringKind::Replace variant is introduced.
97 lines
2.7 KiB
Rust
97 lines
2.7 KiB
Rust
#![feature(box_patterns)]
|
|
|
|
|
|
fn a() {
|
|
let mut vec = [Box::new(1), Box::new(2), Box::new(3)];
|
|
match vec {
|
|
[box ref _a, _, _] => {
|
|
//~^ NOTE `vec[_]` is borrowed here
|
|
vec[0] = Box::new(4); //~ ERROR cannot assign
|
|
//~^ NOTE `vec[_]` is assigned to here
|
|
//~| NOTE in this expansion of desugaring of drop and replace
|
|
_a.use_ref();
|
|
//~^ NOTE borrow later used here
|
|
}
|
|
}
|
|
}
|
|
|
|
fn b() {
|
|
let mut vec = vec![Box::new(1), Box::new(2), Box::new(3)];
|
|
let vec: &mut [Box<isize>] = &mut vec;
|
|
match vec {
|
|
&mut [ref _b @ ..] => {
|
|
//~^ `vec[_]` is borrowed here
|
|
vec[0] = Box::new(4); //~ ERROR cannot assign
|
|
//~^ NOTE `vec[_]` is assigned to here
|
|
//~| NOTE in this expansion of desugaring of drop and replace
|
|
_b.use_ref();
|
|
//~^ NOTE borrow later used here
|
|
}
|
|
}
|
|
}
|
|
|
|
fn c() {
|
|
let mut vec = vec![Box::new(1), Box::new(2), Box::new(3)];
|
|
let vec: &mut [Box<isize>] = &mut vec;
|
|
match vec {
|
|
//~^ ERROR cannot move out
|
|
//~| NOTE cannot move out
|
|
&mut [_a,
|
|
//~^ NOTE data moved here
|
|
//~| NOTE move occurs because `_a` has type
|
|
//~| HELP consider removing the mutable borrow
|
|
..
|
|
] => {
|
|
}
|
|
_ => {}
|
|
}
|
|
let a = vec[0]; //~ ERROR cannot move out
|
|
//~| NOTE cannot move out of here
|
|
//~| NOTE move occurs because
|
|
//~| HELP consider borrowing here
|
|
}
|
|
|
|
fn d() {
|
|
let mut vec = vec![Box::new(1), Box::new(2), Box::new(3)];
|
|
let vec: &mut [Box<isize>] = &mut vec;
|
|
match vec {
|
|
//~^ ERROR cannot move out
|
|
//~| NOTE cannot move out
|
|
&mut [
|
|
//~^ HELP consider removing the mutable borrow
|
|
_b] => {}
|
|
//~^ NOTE data moved here
|
|
//~| NOTE move occurs because `_b` has type
|
|
_ => {}
|
|
}
|
|
let a = vec[0]; //~ ERROR cannot move out
|
|
//~| NOTE cannot move out of here
|
|
//~| NOTE move occurs because
|
|
//~| HELP consider borrowing here
|
|
}
|
|
|
|
fn e() {
|
|
let mut vec = vec![Box::new(1), Box::new(2), Box::new(3)];
|
|
let vec: &mut [Box<isize>] = &mut vec;
|
|
match vec {
|
|
//~^ ERROR cannot move out
|
|
//~| NOTE cannot move out
|
|
//~| NOTE move occurs because these variables have types
|
|
&mut [_a, _b, _c] => {}
|
|
//~^ NOTE data moved here
|
|
//~| NOTE and here
|
|
//~| NOTE and here
|
|
//~| HELP consider removing the mutable borrow
|
|
_ => {}
|
|
}
|
|
let a = vec[0]; //~ ERROR cannot move out
|
|
//~| NOTE cannot move out of here
|
|
//~| NOTE move occurs because
|
|
//~| HELP consider borrowing here
|
|
}
|
|
|
|
fn main() {}
|
|
|
|
trait Fake { fn use_mut(&mut self) { } fn use_ref(&self) { } }
|
|
impl<T> Fake for T { }
|