2021-04-01 15:32:25 -05:00
|
|
|
// run-rustfix
|
|
|
|
|
2021-06-29 08:35:15 -05:00
|
|
|
#![deny(rust_2021_incompatible_closure_captures)]
|
2021-04-01 15:32:25 -05:00
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
struct Foo(i32);
|
|
|
|
impl Drop for Foo {
|
|
|
|
fn drop(&mut self) {
|
|
|
|
println!("{:?} dropped", self.0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct ConstainsDropField(Foo, Foo);
|
|
|
|
|
|
|
|
// Test that lint is triggered if a path that implements Drop is not captured by move
|
|
|
|
fn test_precise_analysis_drop_paths_not_captured_by_move() {
|
|
|
|
let t = ConstainsDropField(Foo(10), Foo(20));
|
|
|
|
|
2021-04-01 20:08:04 -05:00
|
|
|
let c = || { let _ = &t;
|
2021-06-29 08:35:15 -05:00
|
|
|
//~^ ERROR: drop order
|
|
|
|
//~| HELP: add a dummy let to cause `t` to be fully captured
|
2021-04-01 15:32:25 -05:00
|
|
|
let _t = t.0;
|
|
|
|
let _t = &t.1;
|
2021-04-01 20:08:04 -05:00
|
|
|
};
|
2021-04-01 15:32:25 -05:00
|
|
|
|
|
|
|
c();
|
|
|
|
}
|
|
|
|
|
|
|
|
struct S;
|
|
|
|
impl Drop for S {
|
2021-06-29 08:35:15 -05:00
|
|
|
fn drop(&mut self) {}
|
2021-04-01 15:32:25 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
struct T(S, S);
|
|
|
|
struct U(T, T);
|
|
|
|
|
|
|
|
// Test precise analysis for the lint works with paths longer than one.
|
|
|
|
fn test_precise_analysis_long_path_missing() {
|
|
|
|
let u = U(T(S, S), T(S, S));
|
|
|
|
|
2021-04-01 20:08:04 -05:00
|
|
|
let c = || { let _ = &u;
|
2021-06-29 08:35:15 -05:00
|
|
|
//~^ ERROR: drop order
|
|
|
|
//~| HELP: add a dummy let to cause `u` to be fully captured
|
2021-04-01 15:32:25 -05:00
|
|
|
let _x = u.0.0;
|
|
|
|
let _x = u.0.1;
|
|
|
|
let _x = u.1.0;
|
2021-04-01 20:08:04 -05:00
|
|
|
};
|
2021-04-01 15:32:25 -05:00
|
|
|
|
|
|
|
c();
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
test_precise_analysis_drop_paths_not_captured_by_move();
|
|
|
|
test_precise_analysis_long_path_missing();
|
|
|
|
}
|