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
|
// Regression test for #16223: without NLL the `if let` construct together with
// the nested box-structure of `Root` causes an unwanted collateral move.
// The exact error prevented here is:
//
// error[E0382]: use of collaterally moved value: `(root.boxed.rhs as SomeVariant::B).0`
// --> src/main.rs:55:29
// |
// 56 | lhs: SomeVariant::A(a),
// | - value moved here
// 57 | rhs: SomeVariant::B(b),
// | ^ value used here after move
// |
// = note: move occurs because the value has type `A`, which does not implement the `Copy` trait
// check-pass
#![feature(box_patterns)]
struct Root {
boxed: Box<SetOfVariants>,
}
struct SetOfVariants {
lhs: SomeVariant,
rhs: SomeVariant,
}
enum SomeVariant {
A(A),
B(B),
}
struct A(String);
struct B(String);
fn main() {
let root = Root {
boxed: Box::new(SetOfVariants {
lhs: SomeVariant::A(A(String::from("This is A"))),
rhs: SomeVariant::B(B(String::from("This is B"))),
}),
};
if let box SetOfVariants {
lhs: SomeVariant::A(a),
rhs: SomeVariant::B(b),
} = root.boxed
{
println!("a = {}", a.0);
println!("b = {}", b.0);
}
}
|