#[rustc_transparent_macro]
-> #[rustc_macro_transparency = ...]
This commit is contained in:
parent
15042a3c1c
commit
22d6d8ac76
9 changed files with 83 additions and 25 deletions
|
@ -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| {
|
||||
|
|
|
@ -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))),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#![feature(decl_macro, rustc_attrs)]
|
||||
|
||||
#[rustc_transparent_macro]
|
||||
#[rustc_macro_transparency = "transparent"]
|
||||
pub macro dollar_crate() {
|
||||
let s = $crate::S;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
31
src/test/ui/hygiene/rustc-macro-transparency.rs
Normal file
31
src/test/ui/hygiene/rustc-macro-transparency.rs
Normal 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
|
||||
}
|
21
src/test/ui/hygiene/rustc-macro-transparency.stderr
Normal file
21
src/test/ui/hygiene/rustc-macro-transparency.stderr
Normal 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`.
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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!();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue