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);
}
}
|