1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
//@ check-pass
// Test `@` patterns combined with `box` patterns.
#![allow(dropping_references)]
#![allow(dropping_copy_types)]
#![feature(box_patterns)]
#[derive(Copy, Clone)]
struct C;
fn c() -> C { C }
struct NC;
fn nc() -> NC { NC }
fn main() {
let ref a @ box b = Box::new(C); // OK; the type is `Copy`.
drop(b);
drop(b);
drop(a);
let ref a @ box b = Box::new(c()); // OK; the type is `Copy`.
drop(b);
drop(b);
drop(a);
fn f3(ref a @ box b: Box<C>) { // OK; the type is `Copy`.
drop(b);
drop(b);
drop(a);
}
match Box::new(c()) {
ref a @ box b => { // OK; the type is `Copy`.
drop(b);
drop(b);
drop(a);
}
}
let ref a @ box ref b = Box::new(NC); // OK.
drop(a);
drop(b);
fn f4(ref a @ box ref b: Box<NC>) { // OK.
drop(a);
drop(b)
}
match Box::new(nc()) {
ref a @ box ref b => { // OK.
drop(a);
drop(b);
}
}
match Box::new([Ok(c()), Err(nc()), Ok(c())]) {
box [Ok(a), ref xs @ .., Err(ref b)] => {
let _: C = a;
let _: &[Result<C, NC>; 1] = xs;
let _: &NC = b;
}
_ => {}
}
match [Ok(Box::new(c())), Err(Box::new(nc())), Ok(Box::new(c())), Ok(Box::new(c()))] {
[Ok(box a), ref xs @ .., Err(box ref b), Err(box ref c)] => {
let _: C = a;
let _: &[Result<Box<C>, Box<NC>>; 1] = xs;
let _: &NC = b;
let _: &NC = c;
}
_ => {}
}
match Box::new([Ok(c()), Err(nc()), Ok(c())]) {
box [Ok(a), ref xs @ .., Err(b)] => {}
_ => {}
}
match [Ok(Box::new(c())), Err(Box::new(nc())), Ok(Box::new(c())), Ok(Box::new(c()))] {
[Ok(box ref a), ref xs @ .., Err(box b), Err(box ref mut c)] => {}
_ => {}
}
}
|