2021-04-01 20:08:04 -05:00
|
|
|
// run-rustfix
|
2021-06-29 08:35:15 -05:00
|
|
|
#![deny(rust_2021_incompatible_closure_captures)]
|
2021-04-01 20:08:04 -05:00
|
|
|
//~^ NOTE: the lint level is defined here
|
|
|
|
|
|
|
|
// Test the two possible cases for automated migartion using rustfix
|
|
|
|
// - Closure contains a block i.e. `|| { .. };`
|
|
|
|
// - Closure contains just an expr `|| ..;`
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
struct Foo(i32);
|
|
|
|
impl Drop for Foo {
|
|
|
|
fn drop(&mut self) {
|
|
|
|
println!("{:?} dropped", self.0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn closure_contains_block() {
|
|
|
|
let t = (Foo(0), Foo(0));
|
|
|
|
let c = || {
|
2021-06-27 11:54:48 -05:00
|
|
|
//~^ ERROR: drop order
|
|
|
|
//~| NOTE: for more information, see
|
2021-04-01 20:33:11 -05:00
|
|
|
//~| HELP: add a dummy let to cause `t` to be fully captured
|
2021-04-01 20:08:04 -05:00
|
|
|
let _t = t.0;
|
2021-08-12 14:13:00 -05:00
|
|
|
//~^ NOTE: in Rust 2018, this closure captures all of `t`, but in Rust 2021, it will only capture `t.0`
|
2021-04-01 20:08:04 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
c();
|
|
|
|
}
|
2021-08-12 14:13:00 -05:00
|
|
|
//~^ NOTE: in Rust 2018, `t` is dropped here, but in Rust 2021, only `t.0` will be dropped here as part of the closure
|
2021-04-01 20:08:04 -05:00
|
|
|
|
|
|
|
fn closure_doesnt_contain_block() {
|
|
|
|
let t = (Foo(0), Foo(0));
|
|
|
|
let c = || t.0;
|
2021-06-27 11:54:48 -05:00
|
|
|
//~^ ERROR: drop order
|
2021-08-12 14:13:00 -05:00
|
|
|
//~| NOTE: in Rust 2018, this closure captures all of `t`, but in Rust 2021, it will only capture `t.0`
|
2021-06-27 11:54:48 -05:00
|
|
|
//~| NOTE: for more information, see
|
2021-04-01 20:33:11 -05:00
|
|
|
//~| HELP: add a dummy let to cause `t` to be fully captured
|
2021-04-01 20:08:04 -05:00
|
|
|
|
|
|
|
c();
|
|
|
|
}
|
2021-08-12 14:13:00 -05:00
|
|
|
//~^ NOTE: in Rust 2018, `t` is dropped here, but in Rust 2021, only `t.0` will be dropped here as part of the closure
|
2021-04-01 20:08:04 -05:00
|
|
|
|
|
|
|
fn main() {
|
|
|
|
closure_contains_block();
|
|
|
|
closure_doesnt_contain_block();
|
|
|
|
}
|