221 lines
4.4 KiB
Rust
221 lines
4.4 KiB
Rust
|
// Tests using a combination of pattern features has the expected borrow checking behavior
|
||
|
#![feature(box_patterns)]
|
||
|
|
||
|
enum Test {
|
||
|
Foo,
|
||
|
Bar,
|
||
|
_Baz,
|
||
|
}
|
||
|
|
||
|
// bindings_after_at + slice_patterns
|
||
|
|
||
|
fn bindings_after_at_slice_patterns_move_binding(x: [String; 4]) {
|
||
|
match x {
|
||
|
a @ [.., _] => (),
|
||
|
_ => (),
|
||
|
};
|
||
|
|
||
|
&x;
|
||
|
//~^ ERROR borrow of moved value
|
||
|
}
|
||
|
|
||
|
fn bindings_after_at_slice_patterns_borrows_binding_mut(mut x: [String; 4]) {
|
||
|
let r = match x {
|
||
|
ref mut foo @ [.., _] => Some(foo),
|
||
|
_ => None,
|
||
|
};
|
||
|
|
||
|
&x;
|
||
|
//~^ ERROR cannot borrow
|
||
|
|
||
|
drop(r);
|
||
|
}
|
||
|
|
||
|
fn bindings_after_at_slice_patterns_borrows_slice_mut1(mut x: [String; 4]) {
|
||
|
let r = match x {
|
||
|
ref foo @ [.., ref mut bar] => (),
|
||
|
//~^ ERROR cannot borrow
|
||
|
_ => (),
|
||
|
};
|
||
|
|
||
|
drop(r);
|
||
|
}
|
||
|
|
||
|
fn bindings_after_at_slice_patterns_borrows_slice_mut2(mut x: [String; 4]) {
|
||
|
let r = match x {
|
||
|
[ref foo @ .., ref bar] => Some(foo),
|
||
|
_ => None,
|
||
|
};
|
||
|
|
||
|
&mut x;
|
||
|
//~^ ERROR cannot borrow
|
||
|
|
||
|
drop(r);
|
||
|
}
|
||
|
|
||
|
fn bindings_after_at_slice_patterns_borrows_both(mut x: [String; 4]) {
|
||
|
let r = match x {
|
||
|
ref foo @ [.., ref bar] => Some(foo),
|
||
|
_ => None,
|
||
|
};
|
||
|
|
||
|
&mut x;
|
||
|
//~^ ERROR cannot borrow
|
||
|
|
||
|
drop(r);
|
||
|
}
|
||
|
|
||
|
// bindings_after_at + or_patterns
|
||
|
|
||
|
fn bindings_after_at_or_patterns_move(x: Option<Test>) {
|
||
|
match x {
|
||
|
foo @ Some(Test::Foo | Test::Bar) => (),
|
||
|
_ => (),
|
||
|
}
|
||
|
|
||
|
&x;
|
||
|
//~^ ERROR borrow of moved value
|
||
|
}
|
||
|
|
||
|
fn bindings_after_at_or_patterns_borrows(mut x: Option<Test>) {
|
||
|
let r = match x {
|
||
|
ref foo @ Some(Test::Foo | Test::Bar) => Some(foo),
|
||
|
_ => None,
|
||
|
};
|
||
|
|
||
|
&mut x;
|
||
|
//~^ ERROR cannot borrow
|
||
|
|
||
|
drop(r);
|
||
|
}
|
||
|
|
||
|
fn bindings_after_at_or_patterns_borrows_mut(mut x: Option<Test>) {
|
||
|
let r = match x {
|
||
|
ref mut foo @ Some(Test::Foo | Test::Bar) => Some(foo),
|
||
|
_ => None,
|
||
|
};
|
||
|
|
||
|
&x;
|
||
|
//~^ ERROR cannot borrow
|
||
|
|
||
|
drop(r);
|
||
|
}
|
||
|
|
||
|
// bindings_after_at + box_patterns
|
||
|
|
||
|
fn bindings_after_at_box_patterns_borrows_both(mut x: Option<Box<String>>) {
|
||
|
let r = match x {
|
||
|
ref foo @ Some(box ref s) => Some(foo),
|
||
|
_ => None,
|
||
|
};
|
||
|
|
||
|
&mut x;
|
||
|
//~^ ERROR cannot borrow
|
||
|
|
||
|
drop(r);
|
||
|
}
|
||
|
|
||
|
fn bindings_after_at_box_patterns_borrows_mut(mut x: Option<Box<String>>) {
|
||
|
match x {
|
||
|
ref foo @ Some(box ref mut s) => (),
|
||
|
//~^ ERROR cannot borrow
|
||
|
_ => (),
|
||
|
};
|
||
|
}
|
||
|
|
||
|
// bindings_after_at + slice_patterns + or_patterns
|
||
|
|
||
|
fn bindings_after_at_slice_patterns_or_patterns_moves(x: [Option<Test>; 4]) {
|
||
|
match x {
|
||
|
a @ [.., Some(Test::Foo | Test::Bar)] => (),
|
||
|
_ => (),
|
||
|
};
|
||
|
|
||
|
&x;
|
||
|
//~^ ERROR borrow of moved value
|
||
|
}
|
||
|
|
||
|
fn bindings_after_at_slice_patterns_or_patterns_borrows_binding(mut x: [Option<Test>; 4]) {
|
||
|
let r = match x {
|
||
|
ref a @ [ref b @ .., Some(Test::Foo | Test::Bar)] => Some(a),
|
||
|
_ => None,
|
||
|
};
|
||
|
|
||
|
&mut x;
|
||
|
//~^ ERROR cannot borrow
|
||
|
|
||
|
drop(r);
|
||
|
}
|
||
|
|
||
|
fn bindings_after_at_slice_patterns_or_patterns_borrows_slice(mut x: [Option<Test>; 4]) {
|
||
|
let r = match x {
|
||
|
ref a @ [ref b @ .., Some(Test::Foo | Test::Bar)] => Some(b),
|
||
|
_ => None,
|
||
|
};
|
||
|
|
||
|
&mut x;
|
||
|
//~^ ERROR cannot borrow
|
||
|
|
||
|
drop(r);
|
||
|
}
|
||
|
|
||
|
// bindings_after_at + slice_patterns + box_patterns
|
||
|
|
||
|
fn bindings_after_at_slice_patterns_box_patterns_borrows(mut x: [Option<Box<String>>; 4]) {
|
||
|
let r = match x {
|
||
|
[_, ref a @ Some(box ref b), ..] => Some(a),
|
||
|
_ => None,
|
||
|
};
|
||
|
|
||
|
&mut x;
|
||
|
//~^ ERROR cannot borrow
|
||
|
|
||
|
drop(r);
|
||
|
}
|
||
|
|
||
|
// bindings_after_at + slice_patterns + or_patterns + box_patterns
|
||
|
|
||
|
fn bindings_after_at_slice_patterns_or_patterns_box_patterns_borrows(
|
||
|
mut x: [Option<Box<Test>>; 4]
|
||
|
) {
|
||
|
let r = match x {
|
||
|
[_, ref a @ Some(box Test::Foo | box Test::Bar), ..] => Some(a),
|
||
|
_ => None,
|
||
|
};
|
||
|
|
||
|
&mut x;
|
||
|
//~^ ERROR cannot borrow
|
||
|
|
||
|
drop(r);
|
||
|
}
|
||
|
|
||
|
fn bindings_after_at_slice_patterns_or_patterns_box_patterns_borrows_mut(
|
||
|
mut x: [Option<Box<Test>>; 4]
|
||
|
) {
|
||
|
let r = match x {
|
||
|
[_, ref mut a @ Some(box Test::Foo | box Test::Bar), ..] => Some(a),
|
||
|
_ => None,
|
||
|
};
|
||
|
|
||
|
&x;
|
||
|
//~^ ERROR cannot borrow
|
||
|
|
||
|
drop(r);
|
||
|
}
|
||
|
|
||
|
fn bindings_after_at_slice_patterns_or_patterns_box_patterns_borrows_binding(
|
||
|
mut x: [Option<Box<Test>>; 4]
|
||
|
) {
|
||
|
let r = match x {
|
||
|
ref a @ [_, ref b @ Some(box Test::Foo | box Test::Bar), ..] => Some(a),
|
||
|
_ => None,
|
||
|
};
|
||
|
|
||
|
&mut x;
|
||
|
//~^ ERROR cannot borrow
|
||
|
|
||
|
drop(r);
|
||
|
}
|
||
|
|
||
|
fn main() {}
|