#[rustc_transparent_macro] -> #[rustc_macro_transparency = ...]

This commit is contained in:
Vadim Petrochenkov 2019-06-23 16:37:28 +03:00
parent 15042a3c1c
commit 22d6d8ac76
9 changed files with 83 additions and 25 deletions

View file

@ -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| {

View file

@ -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))),

View file

@ -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,

View file

@ -1,6 +1,6 @@
#![feature(decl_macro, rustc_attrs)]
#[rustc_transparent_macro]
#[rustc_macro_transparency = "transparent"]
pub macro dollar_crate() {
let s = $crate::S;
}

View file

@ -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;

View file

@ -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
}

View file

@ -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`.

View file

@ -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
}

View file

@ -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!();
}