From 22d6d8ac76d5b86601d09917b83789cf88ea043a Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Sun, 23 Jun 2019 16:37:28 +0300 Subject: [PATCH] `#[rustc_transparent_macro]` -> `#[rustc_macro_transparency = ...]` --- src/libsyntax/ext/tt/macro_rules.rs | 18 ++++++----- src/libsyntax/feature_gate.rs | 4 ++- src/libsyntax_pos/symbol.rs | 2 +- .../ui/hygiene/auxiliary/transparent-basic.rs | 2 +- src/test/ui/hygiene/generate-mod.rs | 2 +- .../ui/hygiene/rustc-macro-transparency.rs | 31 +++++++++++++++++++ .../hygiene/rustc-macro-transparency.stderr | 21 +++++++++++++ src/test/ui/hygiene/transparent-basic.rs | 4 +-- .../ui/macros/restricted-shadowing-modern.rs | 24 +++++++------- 9 files changed, 83 insertions(+), 25 deletions(-) create mode 100644 src/test/ui/hygiene/rustc-macro-transparency.rs create mode 100644 src/test/ui/hygiene/rustc-macro-transparency.stderr diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index 1a448cb2a43..cec59b8a40e 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -380,13 +380,17 @@ pub fn compile( let expander: Box<_> = Box::new(MacroRulesMacroExpander { name: def.ident, lhses, rhses, valid }); - let default_transparency = if attr::contains_name(&def.attrs, sym::rustc_transparent_macro) { - Transparency::Transparent - } else if body.legacy { - Transparency::SemiTransparent - } else { - Transparency::Opaque - }; + let value_str = attr::first_attr_value_str_by_name(&def.attrs, sym::rustc_macro_transparency); + let default_transparency = value_str.and_then(|s| Some(match &*s.as_str() { + "transparent" => Transparency::Transparent, + "semitransparent" => Transparency::SemiTransparent, + "opaque" => Transparency::Opaque, + _ => { + let msg = format!("unknown macro transparency: `{}`", s); + sess.span_diagnostic.span_err(def.span, &msg); + return None; + } + })).unwrap_or(if body.legacy { Transparency::SemiTransparent } else { Transparency::Opaque }); let allow_internal_unstable = attr::find_by_name(&def.attrs, sym::allow_internal_unstable).map(|attr| { diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 6dc46ba2c7e..1329e6f7fce 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -1313,7 +1313,9 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ "the `#[rustc_test_marker]` attribute \ is used internally to track tests", cfg_fn!(rustc_attrs))), - (sym::rustc_transparent_macro, Whitelisted, template!(Word), Gated(Stability::Unstable, + (sym::rustc_macro_transparency, Whitelisted, template!(NameValueStr: + "transparent|semitransparent|opaque"), + Gated(Stability::Unstable, sym::rustc_attrs, "used internally for testing macro hygiene", cfg_fn!(rustc_attrs))), diff --git a/src/libsyntax_pos/symbol.rs b/src/libsyntax_pos/symbol.rs index 60622740b74..410f4b36b67 100644 --- a/src/libsyntax_pos/symbol.rs +++ b/src/libsyntax_pos/symbol.rs @@ -557,6 +557,7 @@ symbols! { rustc_layout, rustc_layout_scalar_valid_range_end, rustc_layout_scalar_valid_range_start, + rustc_macro_transparency, rustc_mir, rustc_nonnull_optimization_guaranteed, rustc_object_lifetime_default, @@ -579,7 +580,6 @@ symbols! { rustc_synthetic, rustc_test_marker, rustc_then_this_would_need, - rustc_transparent_macro, rustc_variance, rustdoc, rust_eh_personality, diff --git a/src/test/ui/hygiene/auxiliary/transparent-basic.rs b/src/test/ui/hygiene/auxiliary/transparent-basic.rs index 0d045d09d2c..37de27ee800 100644 --- a/src/test/ui/hygiene/auxiliary/transparent-basic.rs +++ b/src/test/ui/hygiene/auxiliary/transparent-basic.rs @@ -1,6 +1,6 @@ #![feature(decl_macro, rustc_attrs)] -#[rustc_transparent_macro] +#[rustc_macro_transparency = "transparent"] pub macro dollar_crate() { let s = $crate::S; } diff --git a/src/test/ui/hygiene/generate-mod.rs b/src/test/ui/hygiene/generate-mod.rs index 089d74f123e..8826293542c 100644 --- a/src/test/ui/hygiene/generate-mod.rs +++ b/src/test/ui/hygiene/generate-mod.rs @@ -11,7 +11,7 @@ macro genmod($FromOutside: ident, $Outer: ident) { } } -#[rustc_transparent_macro] +#[rustc_macro_transparency = "transparent"] macro genmod_transparent() { type A = FromOutside; struct Outer; diff --git a/src/test/ui/hygiene/rustc-macro-transparency.rs b/src/test/ui/hygiene/rustc-macro-transparency.rs new file mode 100644 index 00000000000..a0a3d411d28 --- /dev/null +++ b/src/test/ui/hygiene/rustc-macro-transparency.rs @@ -0,0 +1,31 @@ +#![feature(decl_macro, rustc_attrs)] + +#[rustc_macro_transparency = "transparent"] +macro transparent() { + struct Transparent; + let transparent = 0; +} +#[rustc_macro_transparency = "semitransparent"] +macro semitransparent() { + struct SemiTransparent; + let semitransparent = 0; +} +#[rustc_macro_transparency = "opaque"] +macro opaque() { + struct Opaque; + let opaque = 0; +} + +fn main() { + transparent!(); + semitransparent!(); + opaque!(); + + Transparent; // OK + SemiTransparent; // OK + Opaque; //~ ERROR cannot find value `Opaque` in this scope + + transparent; // OK + semitransparent; //~ ERROR cannot find value `semitransparent` in this scope + opaque; //~ ERROR cannot find value `opaque` in this scope +} diff --git a/src/test/ui/hygiene/rustc-macro-transparency.stderr b/src/test/ui/hygiene/rustc-macro-transparency.stderr new file mode 100644 index 00000000000..2a9df221e2c --- /dev/null +++ b/src/test/ui/hygiene/rustc-macro-transparency.stderr @@ -0,0 +1,21 @@ +error[E0425]: cannot find value `Opaque` in this scope + --> $DIR/rustc-macro-transparency.rs:26:5 + | +LL | Opaque; + | ^^^^^^ help: a local variable with a similar name exists: `opaque` + +error[E0425]: cannot find value `semitransparent` in this scope + --> $DIR/rustc-macro-transparency.rs:29:5 + | +LL | semitransparent; + | ^^^^^^^^^^^^^^^ not found in this scope + +error[E0425]: cannot find value `opaque` in this scope + --> $DIR/rustc-macro-transparency.rs:30:5 + | +LL | opaque; + | ^^^^^^ not found in this scope + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0425`. diff --git a/src/test/ui/hygiene/transparent-basic.rs b/src/test/ui/hygiene/transparent-basic.rs index 23ee558cc17..69dfc524989 100644 --- a/src/test/ui/hygiene/transparent-basic.rs +++ b/src/test/ui/hygiene/transparent-basic.rs @@ -5,12 +5,12 @@ extern crate transparent_basic; -#[rustc_transparent_macro] +#[rustc_macro_transparency = "transparent"] macro binding() { let x = 10; } -#[rustc_transparent_macro] +#[rustc_macro_transparency = "transparent"] macro label() { break 'label } diff --git a/src/test/ui/macros/restricted-shadowing-modern.rs b/src/test/ui/macros/restricted-shadowing-modern.rs index 448f623c220..a8818507d75 100644 --- a/src/test/ui/macros/restricted-shadowing-modern.rs +++ b/src/test/ui/macros/restricted-shadowing-modern.rs @@ -80,17 +80,17 @@ struct Right; // struct Wrong; // not defined -#[rustc_transparent_macro] +#[rustc_macro_transparency = "transparent"] macro include() { - #[rustc_transparent_macro] + #[rustc_macro_transparency = "transparent"] macro gen_outer() { macro m() { Wrong } } - #[rustc_transparent_macro] + #[rustc_macro_transparency = "transparent"] macro gen_inner() { macro m() { Right } } - #[rustc_transparent_macro] + #[rustc_macro_transparency = "transparent"] macro gen_invoc() { m!() } @@ -100,7 +100,7 @@ macro include() { fn check1() { macro m() {} { - #[rustc_transparent_macro] + #[rustc_macro_transparency = "transparent"] macro gen_gen_inner_invoc() { gen_inner!(); m!(); //~ ERROR `m` is ambiguous @@ -112,7 +112,7 @@ macro include() { fn check5() { macro m() { Wrong } { - #[rustc_transparent_macro] + #[rustc_macro_transparency = "transparent"] macro gen_inner_invoc() { macro m() { Right } m!(); // OK @@ -124,7 +124,7 @@ macro include() { fn check9() { macro m() { Wrong } { - #[rustc_transparent_macro] + #[rustc_macro_transparency = "transparent"] macro gen_inner_gen_invoc() { macro m() { Right } gen_invoc!(); // OK @@ -145,7 +145,7 @@ macro include() { macro m() {} { gen_inner!(); - #[rustc_transparent_macro] + #[rustc_macro_transparency = "transparent"] macro gen_invoc() { m!() } //~ ERROR `m` is ambiguous gen_invoc!(); } @@ -186,7 +186,7 @@ macro include() { fn check52() { gen_outer!(); { - #[rustc_transparent_macro] + #[rustc_macro_transparency = "transparent"] macro gen_gen_inner_invoc() { gen_inner!(); m!(); //~ ERROR `m` is ambiguous @@ -198,7 +198,7 @@ macro include() { fn check56() { gen_outer!(); { - #[rustc_transparent_macro] + #[rustc_macro_transparency = "transparent"] macro gen_inner_invoc() { macro m() { Right } m!(); // OK @@ -218,7 +218,7 @@ macro include() { fn check60() { gen_outer!(); { - #[rustc_transparent_macro] + #[rustc_macro_transparency = "transparent"] macro gen_inner_gen_invoc() { macro m() { Right } gen_invoc!(); // OK @@ -231,7 +231,7 @@ macro include() { gen_outer!(); { gen_inner!(); - #[rustc_transparent_macro] + #[rustc_macro_transparency = "transparent"] macro gen_invoc() { m!() } //~ ERROR `m` is ambiguous gen_invoc!(); }