53 lines
1.3 KiB
Rust
53 lines
1.3 KiB
Rust
// 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);
|
|
}
|
|
}
|