]>
Commit | Line | Data |
---|---|---|
cdc7bbd5 XL |
1 | // run-rustfix |
2 | ||
136023e0 XL |
3 | #![deny(rust_2021_incompatible_closure_captures)] |
4 | //~^ NOTE: the lint level is defined here | |
6a06907d XL |
5 | |
6 | #[derive(Debug)] | |
7 | struct Foo(i32); | |
8 | impl Drop for Foo { | |
9 | fn drop(&mut self) { | |
10 | println!("{:?} dropped", self.0); | |
11 | } | |
12 | } | |
13 | ||
14 | struct ConstainsDropField(Foo, Foo); | |
15 | ||
6a06907d XL |
16 | // Test that lint is triggered if a path that implements Drop is not captured by move |
17 | fn test_precise_analysis_drop_paths_not_captured_by_move() { | |
18 | let t = ConstainsDropField(Foo(10), Foo(20)); | |
19 | ||
20 | let c = || { | |
136023e0 XL |
21 | //~^ ERROR: drop order |
22 | //~| NOTE: for more information, see | |
23 | //~| HELP: add a dummy let to cause `t` to be fully captured | |
6a06907d | 24 | let _t = t.0; |
94222f64 | 25 | //~^ NOTE: in Rust 2018, this closure captures all of `t`, but in Rust 2021, it will only capture `t.0` |
6a06907d XL |
26 | let _t = &t.1; |
27 | }; | |
28 | ||
29 | c(); | |
30 | } | |
94222f64 | 31 | //~^ NOTE: in Rust 2018, `t` is dropped here, but in Rust 2021, only `t.0` will be dropped here as part of the closure |
6a06907d XL |
32 | |
33 | struct S; | |
34 | impl Drop for S { | |
136023e0 | 35 | fn drop(&mut self) {} |
6a06907d XL |
36 | } |
37 | ||
38 | struct T(S, S); | |
39 | struct U(T, T); | |
40 | ||
41 | // Test precise analysis for the lint works with paths longer than one. | |
42 | fn test_precise_analysis_long_path_missing() { | |
43 | let u = U(T(S, S), T(S, S)); | |
44 | ||
45 | let c = || { | |
136023e0 XL |
46 | //~^ ERROR: drop order |
47 | //~| NOTE: for more information, see | |
48 | //~| HELP: add a dummy let to cause `u` to be fully captured | |
6a06907d | 49 | let _x = u.0.0; |
94222f64 | 50 | //~^ NOTE: in Rust 2018, this closure captures all of `u`, but in Rust 2021, it will only capture `u.0.0` |
6a06907d | 51 | let _x = u.0.1; |
94222f64 | 52 | //~^ NOTE: in Rust 2018, this closure captures all of `u`, but in Rust 2021, it will only capture `u.0.1` |
6a06907d | 53 | let _x = u.1.0; |
94222f64 | 54 | //~^ NOTE: in Rust 2018, this closure captures all of `u`, but in Rust 2021, it will only capture `u.1.0` |
6a06907d XL |
55 | }; |
56 | ||
57 | c(); | |
58 | } | |
94222f64 XL |
59 | //~^ NOTE: in Rust 2018, `u` is dropped here, but in Rust 2021, only `u.0.0` will be dropped here as part of the closure |
60 | //~| NOTE: in Rust 2018, `u` is dropped here, but in Rust 2021, only `u.0.1` will be dropped here as part of the closure | |
61 | //~| NOTE: in Rust 2018, `u` is dropped here, but in Rust 2021, only `u.1.0` will be dropped here as part of the closure | |
136023e0 | 62 | |
6a06907d XL |
63 | |
64 | fn main() { | |
6a06907d XL |
65 | test_precise_analysis_drop_paths_not_captured_by_move(); |
66 | test_precise_analysis_long_path_missing(); | |
67 | } |