blob: 0ae0ed3d87fc5e17c1046c620714e87b2cfac128 [file] [log] [blame]
// 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);
}
}