Auto merge of #80563 - petrochenkov:expattronmac, r=Aaron1011
resolve/expand: Improve attribute expansion on macro definitions and calls - Do not forget to visit attributes on macro definitions and calls in couple of places. - Remove some weird special treatment of macro definition items, which is probably left from old times when macro definitions were treated more like macro calls. Fixes https://github.com/rust-lang/rust/issues/80540
This commit is contained in:
commit
d0beb70a65
@ -1543,13 +1543,8 @@ fn flat_map_foreign_item(
|
||||
}
|
||||
|
||||
fn visit_item_kind(&mut self, item: &mut ast::ItemKind) {
|
||||
match item {
|
||||
ast::ItemKind::MacroDef(..) => {}
|
||||
_ => {
|
||||
self.cfg.configure_item_kind(item);
|
||||
noop_visit_item_kind(item, self);
|
||||
}
|
||||
}
|
||||
self.cfg.configure_item_kind(item);
|
||||
noop_visit_item_kind(item, self);
|
||||
}
|
||||
|
||||
fn flat_map_generic_param(
|
||||
|
@ -258,12 +258,9 @@ fn flat_map_generic_param(
|
||||
|
||||
fn flat_map_item(&mut self, item: P<ast::Item>) -> SmallVec<[P<ast::Item>; 1]> {
|
||||
match item.kind {
|
||||
ast::ItemKind::MacCall(_) => return self.remove(item.id).make_items(),
|
||||
ast::ItemKind::MacroDef(_) => return smallvec![item],
|
||||
_ => {}
|
||||
ast::ItemKind::MacCall(_) => self.remove(item.id).make_items(),
|
||||
_ => noop_flat_map_item(item, self),
|
||||
}
|
||||
|
||||
noop_flat_map_item(item, self)
|
||||
}
|
||||
|
||||
fn flat_map_trait_item(&mut self, item: P<ast::AssocItem>) -> SmallVec<[P<ast::AssocItem>; 1]> {
|
||||
|
@ -1298,26 +1298,31 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> {
|
||||
method!(visit_ty: ast::Ty, ast::TyKind::MacCall, walk_ty);
|
||||
|
||||
fn visit_item(&mut self, item: &'b Item) {
|
||||
let macro_use = match item.kind {
|
||||
let orig_module_scope = self.parent_scope.module;
|
||||
self.parent_scope.macro_rules = match item.kind {
|
||||
ItemKind::MacroDef(..) => {
|
||||
self.parent_scope.macro_rules = self.define_macro(item);
|
||||
return;
|
||||
let macro_rules_scope = self.define_macro(item);
|
||||
visit::walk_item(self, item);
|
||||
macro_rules_scope
|
||||
}
|
||||
ItemKind::MacCall(..) => {
|
||||
self.parent_scope.macro_rules = self.visit_invoc_in_module(item.id);
|
||||
return;
|
||||
let macro_rules_scope = self.visit_invoc_in_module(item.id);
|
||||
visit::walk_item(self, item);
|
||||
macro_rules_scope
|
||||
}
|
||||
_ => {
|
||||
let orig_macro_rules_scope = self.parent_scope.macro_rules;
|
||||
self.build_reduced_graph_for_item(item);
|
||||
visit::walk_item(self, item);
|
||||
match item.kind {
|
||||
ItemKind::Mod(..) if self.contains_macro_use(&item.attrs) => {
|
||||
self.parent_scope.macro_rules
|
||||
}
|
||||
_ => orig_macro_rules_scope,
|
||||
}
|
||||
}
|
||||
ItemKind::Mod(..) => self.contains_macro_use(&item.attrs),
|
||||
_ => false,
|
||||
};
|
||||
let orig_current_module = self.parent_scope.module;
|
||||
let orig_current_macro_rules_scope = self.parent_scope.macro_rules;
|
||||
self.build_reduced_graph_for_item(item);
|
||||
visit::walk_item(self, item);
|
||||
self.parent_scope.module = orig_current_module;
|
||||
if !macro_use {
|
||||
self.parent_scope.macro_rules = orig_current_macro_rules_scope;
|
||||
}
|
||||
self.parent_scope.module = orig_module_scope;
|
||||
}
|
||||
|
||||
fn visit_stmt(&mut self, stmt: &'b ast::Stmt) {
|
||||
|
@ -91,7 +91,10 @@ fn visit_item(&mut self, i: &'a Item) {
|
||||
DefPathData::ValueNs(i.ident.name)
|
||||
}
|
||||
ItemKind::MacroDef(..) => DefPathData::MacroNs(i.ident.name),
|
||||
ItemKind::MacCall(..) => return self.visit_macro_invoc(i.id),
|
||||
ItemKind::MacCall(..) => {
|
||||
visit::walk_item(self, i);
|
||||
return self.visit_macro_invoc(i.id);
|
||||
}
|
||||
ItemKind::GlobalAsm(..) => DefPathData::Misc,
|
||||
ItemKind::Use(..) => {
|
||||
return visit::walk_item(self, i);
|
||||
|
15
src/test/ui/attributes/key-value-expansion-on-mac.rs
Normal file
15
src/test/ui/attributes/key-value-expansion-on-mac.rs
Normal file
@ -0,0 +1,15 @@
|
||||
#![feature(extended_key_value_attributes)]
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
#[rustc_dummy = stringify!(a)] // OK
|
||||
macro_rules! bar {
|
||||
() => {};
|
||||
}
|
||||
|
||||
// FIXME?: `bar` here expands before `stringify` has a chance to expand.
|
||||
// `#[rustc_dummy = ...]` is validated and dropped during expansion of `bar`,
|
||||
// the "unexpected token" errors comes from the validation.
|
||||
#[rustc_dummy = stringify!(b)] //~ ERROR unexpected token: `stringify!(b)`
|
||||
bar!();
|
||||
|
||||
fn main() {}
|
8
src/test/ui/attributes/key-value-expansion-on-mac.stderr
Normal file
8
src/test/ui/attributes/key-value-expansion-on-mac.stderr
Normal file
@ -0,0 +1,8 @@
|
||||
error: unexpected token: `stringify!(b)`
|
||||
--> $DIR/key-value-expansion-on-mac.rs:12:17
|
||||
|
|
||||
LL | #[rustc_dummy = stringify!(b)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -172,12 +172,6 @@ warning: unknown lint: `x5100`
|
||||
LL | #[deny(x5100)] impl S { }
|
||||
| ^^^^^
|
||||
|
||||
warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]`
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:438:1
|
||||
|
|
||||
LL | #[macro_escape]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]`
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:441:17
|
||||
|
|
||||
@ -186,6 +180,12 @@ LL | mod inner { #![macro_escape] }
|
||||
|
|
||||
= help: try an outer attribute: `#[macro_use]`
|
||||
|
||||
warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]`
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:438:1
|
||||
|
|
||||
LL | #[macro_escape]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
warning: use of deprecated attribute `plugin_registrar`: compiler plugins are deprecated. See https://github.com/rust-lang/rust/pull/64675
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:228:17
|
||||
|
|
||||
|
@ -1,8 +1,8 @@
|
||||
error: arguments to `macro_use` are not allowed here
|
||||
--> $DIR/issue-43106-gating-of-macro_use.rs:6:1
|
||||
--> $DIR/issue-43106-gating-of-macro_use.rs:12:17
|
||||
|
|
||||
LL | #![macro_use(my_macro)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
LL | mod inner { #![macro_use(my_macro)] }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arguments to `macro_use` are not allowed here
|
||||
--> $DIR/issue-43106-gating-of-macro_use.rs:9:1
|
||||
@ -11,10 +11,10 @@ LL | #[macro_use(my_macro)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: arguments to `macro_use` are not allowed here
|
||||
--> $DIR/issue-43106-gating-of-macro_use.rs:12:17
|
||||
--> $DIR/issue-43106-gating-of-macro_use.rs:6:1
|
||||
|
|
||||
LL | mod inner { #![macro_use(my_macro)] }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
LL | #![macro_use(my_macro)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: malformed `macro_use` attribute input
|
||||
--> $DIR/issue-43106-gating-of-macro_use.rs:15:5
|
||||
|
Loading…
Reference in New Issue
Block a user