From 255586d6598c0033b50cb0165bf11e10ef125878 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Thu, 29 Aug 2024 18:52:44 +0000 Subject: [PATCH 1/3] test: cross-edition metavar fragment specifiers There's a subtle interaction between macros with metavar expressions and the edition-dependent fragment matching behavior. This test illustrates the current behavior when using macro-generating-macros across crate boundaries with different editions. Co-Authored-By: Vincenzo Palazzo Co-Authored-By: Eric Holk --- tests/ui/macros/auxiliary/metavar_2021.rs | 12 ++++++++ .../ui/macros/expr_2021_with_metavar_expr.rs | 28 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 tests/ui/macros/auxiliary/metavar_2021.rs create mode 100644 tests/ui/macros/expr_2021_with_metavar_expr.rs diff --git a/tests/ui/macros/auxiliary/metavar_2021.rs b/tests/ui/macros/auxiliary/metavar_2021.rs new file mode 100644 index 0000000000000..de5350c616413 --- /dev/null +++ b/tests/ui/macros/auxiliary/metavar_2021.rs @@ -0,0 +1,12 @@ +//@ edition: 2021 +#[macro_export] +macro_rules! make_matcher { + ($name:ident, $fragment_type:ident, $d:tt) => { + #[macro_export] + macro_rules! $name { + ($d _:$fragment_type) => { true }; + (const { 0 }) => { false }; + } + }; +} +make_matcher!(is_expr_from_2021, expr, $); diff --git a/tests/ui/macros/expr_2021_with_metavar_expr.rs b/tests/ui/macros/expr_2021_with_metavar_expr.rs new file mode 100644 index 0000000000000..a3da68cc8dbd7 --- /dev/null +++ b/tests/ui/macros/expr_2021_with_metavar_expr.rs @@ -0,0 +1,28 @@ +//@ compile-flags: --edition=2024 -Z unstable-options +//@ aux-build: metavar_2021.rs +//@ run-pass + +// This test captures the behavior of macro-generating-macros with fragment +// specifiers across edition boundaries. + +#![feature(expr_fragment_specifier_2024)] +#![feature(macro_metavar_expr)] +#![allow(incomplete_features)] + +extern crate metavar_2021; + +use metavar_2021::{is_expr_from_2021, make_matcher}; + +make_matcher!(is_expr_from_2024, expr, $); + +fn main() { + let from_2021 = is_expr_from_2021!(const { 0 }); + dbg!(from_2021); + let from_2024 = is_expr_from_2024!(const { 0 }); + dbg!(from_2024); + + // These capture the current, empirically determined behavior. + // It's not clear whether this is the desired behavior. + assert!(!from_2021); + assert!(!from_2024); +} From 7653811ac502094e6f50589bf0b7b9f80d465de7 Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Tue, 17 Sep 2024 10:49:31 -0700 Subject: [PATCH 2/3] Add coverage for pat too In 2021 pat was changed to recognize `|` at the top level, with pat_param added to retain the old behavior. This means pat is subject to the same cross-edition behavior as expr will be in 2024. Co-authored-by: Vincenzo Palazzo --- .../{metavar_2021.rs => metavar_2018.rs} | 6 ++- .../ui/macros/expr_2021_with_metavar_expr.rs | 28 ------------- .../metavar_cross_edition_recursive_macros.rs | 41 +++++++++++++++++++ 3 files changed, 45 insertions(+), 30 deletions(-) rename tests/ui/macros/auxiliary/{metavar_2021.rs => metavar_2018.rs} (65%) delete mode 100644 tests/ui/macros/expr_2021_with_metavar_expr.rs create mode 100644 tests/ui/macros/metavar_cross_edition_recursive_macros.rs diff --git a/tests/ui/macros/auxiliary/metavar_2021.rs b/tests/ui/macros/auxiliary/metavar_2018.rs similarity index 65% rename from tests/ui/macros/auxiliary/metavar_2021.rs rename to tests/ui/macros/auxiliary/metavar_2018.rs index de5350c616413..7e8523a9edf1b 100644 --- a/tests/ui/macros/auxiliary/metavar_2021.rs +++ b/tests/ui/macros/auxiliary/metavar_2018.rs @@ -1,4 +1,4 @@ -//@ edition: 2021 +//@ edition: 2018 #[macro_export] macro_rules! make_matcher { ($name:ident, $fragment_type:ident, $d:tt) => { @@ -6,7 +6,9 @@ macro_rules! make_matcher { macro_rules! $name { ($d _:$fragment_type) => { true }; (const { 0 }) => { false }; + (A | B) => { false }; } }; } -make_matcher!(is_expr_from_2021, expr, $); +make_matcher!(is_expr_from_2018, expr, $); +make_matcher!(is_pat_from_2018, pat, $); diff --git a/tests/ui/macros/expr_2021_with_metavar_expr.rs b/tests/ui/macros/expr_2021_with_metavar_expr.rs deleted file mode 100644 index a3da68cc8dbd7..0000000000000 --- a/tests/ui/macros/expr_2021_with_metavar_expr.rs +++ /dev/null @@ -1,28 +0,0 @@ -//@ compile-flags: --edition=2024 -Z unstable-options -//@ aux-build: metavar_2021.rs -//@ run-pass - -// This test captures the behavior of macro-generating-macros with fragment -// specifiers across edition boundaries. - -#![feature(expr_fragment_specifier_2024)] -#![feature(macro_metavar_expr)] -#![allow(incomplete_features)] - -extern crate metavar_2021; - -use metavar_2021::{is_expr_from_2021, make_matcher}; - -make_matcher!(is_expr_from_2024, expr, $); - -fn main() { - let from_2021 = is_expr_from_2021!(const { 0 }); - dbg!(from_2021); - let from_2024 = is_expr_from_2024!(const { 0 }); - dbg!(from_2024); - - // These capture the current, empirically determined behavior. - // It's not clear whether this is the desired behavior. - assert!(!from_2021); - assert!(!from_2024); -} diff --git a/tests/ui/macros/metavar_cross_edition_recursive_macros.rs b/tests/ui/macros/metavar_cross_edition_recursive_macros.rs new file mode 100644 index 0000000000000..4c4d3cda45e0a --- /dev/null +++ b/tests/ui/macros/metavar_cross_edition_recursive_macros.rs @@ -0,0 +1,41 @@ +//@ compile-flags: --edition=2024 -Z unstable-options +//@ aux-build: metavar_2018.rs +//@ run-pass + +// This test captures the behavior of macro-generating-macros with fragment +// specifiers across edition boundaries. + +#![feature(expr_fragment_specifier_2024)] +#![feature(macro_metavar_expr)] +#![allow(incomplete_features)] + +extern crate metavar_2018; + +use metavar_2018::{is_expr_from_2018, is_pat_from_2018, make_matcher}; + +make_matcher!(is_expr_from_2024, expr, $); +make_matcher!(is_pat_from_2024, pat, $); + +fn main() { + // Check expr + let from_2018 = is_expr_from_2018!(const { 0 }); + dbg!(from_2018); + let from_2024 = is_expr_from_2024!(const { 0 }); + dbg!(from_2024); + + // These capture the current, empirically determined behavior. + // It's not clear whether this is the desired behavior. + assert!(!from_2018); + assert!(!from_2024); + + // Check pat + let from_2018 = is_pat_from_2018!(A | B); + dbg!(from_2018); + let from_2024 = is_pat_from_2024!(A | B); + dbg!(from_2024); + + // These capture the current, empirically determined behavior. + // It's not clear whether this is the desired behavior. + assert!(!from_2018); + assert!(!from_2024); +} From dd6460ba9f6c325211c6b2d819fe0653dc94a1ba Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Wed, 18 Sep 2024 15:13:07 -0700 Subject: [PATCH 3/3] Add known-bug and update comments to describe correct behavior in light of bug --- .../ui/macros/metavar_cross_edition_recursive_macros.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tests/ui/macros/metavar_cross_edition_recursive_macros.rs b/tests/ui/macros/metavar_cross_edition_recursive_macros.rs index 4c4d3cda45e0a..3eec1208b89ae 100644 --- a/tests/ui/macros/metavar_cross_edition_recursive_macros.rs +++ b/tests/ui/macros/metavar_cross_edition_recursive_macros.rs @@ -1,5 +1,6 @@ //@ compile-flags: --edition=2024 -Z unstable-options //@ aux-build: metavar_2018.rs +//@ known-bug: #130484 //@ run-pass // This test captures the behavior of macro-generating-macros with fragment @@ -23,10 +24,8 @@ fn main() { let from_2024 = is_expr_from_2024!(const { 0 }); dbg!(from_2024); - // These capture the current, empirically determined behavior. - // It's not clear whether this is the desired behavior. assert!(!from_2018); - assert!(!from_2024); + assert!(!from_2024); // from_2024 will be true once #130484 is fixed // Check pat let from_2018 = is_pat_from_2018!(A | B); @@ -34,8 +33,6 @@ fn main() { let from_2024 = is_pat_from_2024!(A | B); dbg!(from_2024); - // These capture the current, empirically determined behavior. - // It's not clear whether this is the desired behavior. assert!(!from_2018); - assert!(!from_2024); + assert!(!from_2024); // from_2024 will be true once #130484 is fixed }