Skip to content

Commit

Permalink
resolve/expand: Improve attribute expansion on macro definitions and …
Browse files Browse the repository at this point in the history
…calls
  • Loading branch information
petrochenkov committed Jan 9, 2021
1 parent 46c35c7 commit d81c194
Show file tree
Hide file tree
Showing 8 changed files with 63 additions and 40 deletions.
9 changes: 2 additions & 7 deletions compiler/rustc_expand/src/expand.rs
Expand Up @@ -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(
Expand Down
7 changes: 2 additions & 5 deletions compiler/rustc_expand/src/placeholders.rs
Expand Up @@ -258,12 +258,9 @@ impl<'a, 'b> MutVisitor for PlaceholderExpander<'a, 'b> {

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]> {
Expand Down
35 changes: 20 additions & 15 deletions compiler/rustc_resolve/src/build_reduced_graph.rs
Expand Up @@ -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) {
Expand Down
5 changes: 4 additions & 1 deletion compiler/rustc_resolve/src/def_collector.rs
Expand Up @@ -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);
Expand Down
15 changes: 15 additions & 0 deletions 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() {}
8 changes: 8 additions & 0 deletions 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

Expand Up @@ -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
|
Expand All @@ -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
|
Expand Down
12 changes: 6 additions & 6 deletions 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
Expand All @@ -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
Expand Down

0 comments on commit d81c194

Please sign in to comment.