Add test for closure migration where body is a block fragment.
This commit is contained in:
parent
7189c85413
commit
7d18052b1b
3 changed files with 86 additions and 0 deletions
|
@ -0,0 +1,25 @@
|
||||||
|
// run-rustfix
|
||||||
|
// edition:2018
|
||||||
|
// check-pass
|
||||||
|
#![warn(rust_2021_compatibility)]
|
||||||
|
|
||||||
|
macro_rules! m {
|
||||||
|
(@ $body:expr) => {{
|
||||||
|
let f = || $body;
|
||||||
|
//~^ WARNING: drop order
|
||||||
|
f();
|
||||||
|
}};
|
||||||
|
($body:block) => {{
|
||||||
|
m!(@ $body);
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let a = (1.to_string(), 2.to_string());
|
||||||
|
m!({
|
||||||
|
let _ = &a;
|
||||||
|
//~^ HELP: add a dummy
|
||||||
|
let x = a.0;
|
||||||
|
println!("{}", x);
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
// run-rustfix
|
||||||
|
// edition:2018
|
||||||
|
// check-pass
|
||||||
|
#![warn(rust_2021_compatibility)]
|
||||||
|
|
||||||
|
macro_rules! m {
|
||||||
|
(@ $body:expr) => {{
|
||||||
|
let f = || $body;
|
||||||
|
//~^ WARNING: drop order
|
||||||
|
f();
|
||||||
|
}};
|
||||||
|
($body:block) => {{
|
||||||
|
m!(@ $body);
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let a = (1.to_string(), 2.to_string());
|
||||||
|
m!({
|
||||||
|
//~^ HELP: add a dummy
|
||||||
|
let x = a.0;
|
||||||
|
println!("{}", x);
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
warning: changes to closure capture in Rust 2021 will affect drop order
|
||||||
|
--> $DIR/closure-body-macro-fragment.rs:8:17
|
||||||
|
|
|
||||||
|
LL | let f = || $body;
|
||||||
|
| _________________^
|
||||||
|
LL | |
|
||||||
|
LL | | f();
|
||||||
|
LL | | }};
|
||||||
|
| | - in Rust 2018, `a` is dropped here, but in Rust 2021, only `a.0` will be dropped here as part of the closure
|
||||||
|
LL | | ($body:block) => {{
|
||||||
|
LL | | m!(@ $body);
|
||||||
|
| |__________________^
|
||||||
|
...
|
||||||
|
LL | / m!({
|
||||||
|
LL | |
|
||||||
|
LL | | let x = a.0;
|
||||||
|
| | --- in Rust 2018, this closure captures all of `a`, but in Rust 2021, it will only capture `a.0`
|
||||||
|
LL | | println!("{}", x);
|
||||||
|
LL | | });
|
||||||
|
| |_______- in this macro invocation
|
||||||
|
|
|
||||||
|
note: the lint level is defined here
|
||||||
|
--> $DIR/closure-body-macro-fragment.rs:4:9
|
||||||
|
|
|
||||||
|
LL | #![warn(rust_2021_compatibility)]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
= note: `#[warn(rust_2021_incompatible_closure_captures)]` implied by `#[warn(rust_2021_compatibility)]`
|
||||||
|
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/disjoint-capture-in-closures.html>
|
||||||
|
= note: this warning originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
help: add a dummy let to cause `a` to be fully captured
|
||||||
|
|
|
||||||
|
LL ~ m!({
|
||||||
|
LL + let _ = &a;
|
||||||
|
|
|
||||||
|
|
||||||
|
warning: 1 warning emitted
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue