diff --git a/compiler/rustc_expand/src/expand.rs b/compiler/rustc_expand/src/expand.rs index fa80a20dc8bb7..16913dbb1abf8 100644 --- a/compiler/rustc_expand/src/expand.rs +++ b/compiler/rustc_expand/src/expand.rs @@ -1543,13 +1543,8 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { } 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( diff --git a/compiler/rustc_expand/src/placeholders.rs b/compiler/rustc_expand/src/placeholders.rs index ce19e813bb3a6..d040539cd7ea1 100644 --- a/compiler/rustc_expand/src/placeholders.rs +++ b/compiler/rustc_expand/src/placeholders.rs @@ -258,12 +258,9 @@ impl<'a, 'b> MutVisitor for PlaceholderExpander<'a, 'b> { fn flat_map_item(&mut self, item: P) -> SmallVec<[P; 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) -> SmallVec<[P; 1]> { diff --git a/compiler/rustc_resolve/src/build_reduced_graph.rs b/compiler/rustc_resolve/src/build_reduced_graph.rs index de3430d1cd758..e96fc185b7e03 100644 --- a/compiler/rustc_resolve/src/build_reduced_graph.rs +++ b/compiler/rustc_resolve/src/build_reduced_graph.rs @@ -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) { diff --git a/compiler/rustc_resolve/src/def_collector.rs b/compiler/rustc_resolve/src/def_collector.rs index 48bce88439424..727d6ab53d869 100644 --- a/compiler/rustc_resolve/src/def_collector.rs +++ b/compiler/rustc_resolve/src/def_collector.rs @@ -91,7 +91,10 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> { 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); diff --git a/src/test/ui/attributes/key-value-expansion-on-mac.rs b/src/test/ui/attributes/key-value-expansion-on-mac.rs new file mode 100644 index 0000000000000..1247ff2b23075 --- /dev/null +++ b/src/test/ui/attributes/key-value-expansion-on-mac.rs @@ -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() {} diff --git a/src/test/ui/attributes/key-value-expansion-on-mac.stderr b/src/test/ui/attributes/key-value-expansion-on-mac.stderr new file mode 100644 index 0000000000000..b74f3518a7e97 --- /dev/null +++ b/src/test/ui/attributes/key-value-expansion-on-mac.stderr @@ -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 + diff --git a/src/test/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr b/src/test/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr index ef9c9ef48a809..128795f50f965 100644 --- a/src/test/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr +++ b/src/test/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr @@ -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 | diff --git a/src/test/ui/feature-gates/issue-43106-gating-of-macro_use.stderr b/src/test/ui/feature-gates/issue-43106-gating-of-macro_use.stderr index 52a682e4bfa87..7f6d608038f91 100644 --- a/src/test/ui/feature-gates/issue-43106-gating-of-macro_use.stderr +++ b/src/test/ui/feature-gates/issue-43106-gating-of-macro_use.stderr @@ -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