Skip to content

Commit 62c7d78

Browse files
committed
resolve: Remove unshadowable_attrs
1 parent a25c841 commit 62c7d78

File tree

7 files changed

+34
-47
lines changed

7 files changed

+34
-47
lines changed

src/librustc_resolve/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1449,7 +1449,6 @@ pub struct Resolver<'a, 'b: 'a> {
14491449
macro_names: FxHashSet<Ident>,
14501450
builtin_macros: FxHashMap<Name, &'a NameBinding<'a>>,
14511451
macro_use_prelude: FxHashMap<Name, &'a NameBinding<'a>>,
1452-
unshadowable_attrs: FxHashMap<Name, &'a NameBinding<'a>>,
14531452
pub all_macros: FxHashMap<Name, Def>,
14541453
macro_map: FxHashMap<DefId, Lrc<SyntaxExtension>>,
14551454
macro_defs: FxHashMap<Mark, DefId>,
@@ -1767,7 +1766,6 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
17671766
macro_names: FxHashSet(),
17681767
builtin_macros: FxHashMap(),
17691768
macro_use_prelude: FxHashMap(),
1770-
unshadowable_attrs: FxHashMap(),
17711769
all_macros: FxHashMap(),
17721770
macro_map: FxHashMap(),
17731771
invocations,

src/librustc_resolve/macros.rs

+24-27
Original file line numberDiff line numberDiff line change
@@ -220,23 +220,6 @@ impl<'a, 'crateloader: 'a> base::Resolver for Resolver<'a, 'crateloader> {
220220
}
221221
}
222222

223-
fn add_unshadowable_attr(&mut self, ident: ast::Ident, ext: Lrc<SyntaxExtension>) {
224-
let def_id = DefId {
225-
krate: BUILTIN_MACROS_CRATE,
226-
index: DefIndex::from_array_index(self.macro_map.len(),
227-
DefIndexAddressSpace::Low),
228-
};
229-
let kind = ext.kind();
230-
self.macro_map.insert(def_id, ext);
231-
let binding = self.arenas.alloc_name_binding(NameBinding {
232-
kind: NameBindingKind::Def(Def::Macro(def_id, kind), false),
233-
span: DUMMY_SP,
234-
vis: ty::Visibility::Invisible,
235-
expansion: Mark::root(),
236-
});
237-
self.unshadowable_attrs.insert(ident.name, binding);
238-
}
239-
240223
fn resolve_imports(&mut self) {
241224
ImportResolver { resolver: self }.resolve_imports()
242225
}
@@ -493,14 +476,8 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
493476
return def;
494477
}
495478

496-
if kind == MacroKind::Attr {
497-
if let Some(ext) = self.unshadowable_attrs.get(&path[0].name) {
498-
return Ok(ext.def());
499-
}
500-
}
501-
502479
let legacy_resolution = self.resolve_legacy_scope(
503-
path[0], invoc_id, invocation.parent_legacy_scope.get(), false
480+
path[0], invoc_id, invocation.parent_legacy_scope.get(), false, kind == MacroKind::Attr
504481
);
505482
let result = if let Some(legacy_binding) = legacy_resolution {
506483
Ok(legacy_binding.def())
@@ -643,7 +620,19 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
643620
}
644621
WhereToResolve::MacroUsePrelude => {
645622
match self.macro_use_prelude.get(&ident.name).cloned() {
646-
Some(binding) => Ok((binding, FromPrelude(true))),
623+
Some(binding) => {
624+
let mut result = Ok((binding, FromPrelude(true)));
625+
// FIXME: Keep some built-in macros working even if they are
626+
// shadowed by non-attribute macros imported with `macro_use`.
627+
// We need to come up with some more principled approach instead.
628+
if is_attr && (ident.name == "test" || ident.name == "bench") {
629+
if let Def::Macro(_, MacroKind::Bang) =
630+
binding.def_ignoring_ambiguity() {
631+
result = Err(Determinacy::Determined);
632+
}
633+
}
634+
result
635+
}
647636
None => Err(Determinacy::Determined),
648637
}
649638
}
@@ -811,8 +800,16 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
811800
ident: Ident,
812801
invoc_id: Mark,
813802
invoc_parent_legacy_scope: LegacyScope<'a>,
814-
record_used: bool)
803+
record_used: bool,
804+
is_attr: bool)
815805
-> Option<&'a NameBinding<'a>> {
806+
if is_attr && (ident.name == "test" || ident.name == "bench") {
807+
// FIXME: Keep some built-in macros working even if they are
808+
// shadowed by user-defined `macro_rules`.
809+
// We need to come up with some more principled approach instead.
810+
return None;
811+
}
812+
816813
let ident = ident.modern();
817814

818815
// This is *the* result, resolution from the scope closest to the resolved identifier.
@@ -898,7 +895,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
898895
let span = ident.span;
899896
let invocation = self.invocations[&invoc_id];
900897
let legacy_resolution = self.resolve_legacy_scope(
901-
ident, invoc_id, invocation.parent_legacy_scope.get(), true
898+
ident, invoc_id, invocation.parent_legacy_scope.get(), true, kind == MacroKind::Attr
902899
);
903900
let resolution = self.resolve_lexical_macro_path_segment(
904901
ident, MacroNS, invoc_id, true, true, kind == MacroKind::Attr, span

src/libsyntax/ext/base.rs

-2
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,6 @@ pub trait Resolver {
721721
fn visit_ast_fragment_with_placeholders(&mut self, mark: Mark, fragment: &AstFragment,
722722
derives: &[Mark]);
723723
fn add_builtin(&mut self, ident: ast::Ident, ext: Lrc<SyntaxExtension>);
724-
fn add_unshadowable_attr(&mut self, ident: ast::Ident, ext: Lrc<SyntaxExtension>);
725724

726725
fn resolve_imports(&mut self);
727726
// Resolves attribute and derive legacy macros from `#![plugin(..)]`.
@@ -761,7 +760,6 @@ impl Resolver for DummyResolver {
761760
fn visit_ast_fragment_with_placeholders(&mut self, _invoc: Mark, _fragment: &AstFragment,
762761
_derives: &[Mark]) {}
763762
fn add_builtin(&mut self, _ident: ast::Ident, _ext: Lrc<SyntaxExtension>) {}
764-
fn add_unshadowable_attr(&mut self, _ident: ast::Ident, _ext: Lrc<SyntaxExtension>) {}
765763

766764
fn resolve_imports(&mut self) {}
767765
fn find_legacy_attr_invoc(&mut self, _attrs: &mut Vec<Attribute>, _allow_derive: bool)

src/libsyntax_ext/lib.rs

+2-12
Original file line numberDiff line numberDiff line change
@@ -72,18 +72,6 @@ pub fn register_builtins(resolver: &mut dyn syntax::ext::base::Resolver,
7272
enable_quotes: bool) {
7373
deriving::register_builtin_derives(resolver);
7474

75-
{
76-
let mut register_unshadowable = |name, ext| {
77-
resolver.add_unshadowable_attr(ast::Ident::with_empty_ctxt(name), Lrc::new(ext));
78-
};
79-
80-
register_unshadowable(Symbol::intern("test"),
81-
MultiModifier(Box::new(test::expand_test)));
82-
83-
register_unshadowable(Symbol::intern("bench"),
84-
MultiModifier(Box::new(test::expand_bench)));
85-
}
86-
8775
let mut register = |name, ext| {
8876
resolver.add_builtin(ast::Ident::with_empty_ctxt(name), Lrc::new(ext));
8977
};
@@ -147,6 +135,8 @@ pub fn register_builtins(resolver: &mut dyn syntax::ext::base::Resolver,
147135
}
148136

149137
register(Symbol::intern("test_case"), MultiModifier(Box::new(test_case::expand)));
138+
register(Symbol::intern("test"), MultiModifier(Box::new(test::expand_test)));
139+
register(Symbol::intern("bench"), MultiModifier(Box::new(test::expand_bench)));
150140

151141
// format_args uses `unstable` things internally.
152142
register(Symbol::intern("format_args"),

src/test/ui/issues/issue-11692-2.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,5 @@
99
// except according to those terms.
1010

1111
fn main() {
12-
concat!(test!());
13-
//~^ error: cannot find macro `test!` in this scope
12+
concat!(test!()); //~ ERROR `test` can only be used in attributes
1413
}

src/test/ui/issues/issue-11692-2.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
error: cannot find macro `test!` in this scope
1+
error: `test` can only be used in attributes
22
--> $DIR/issue-11692-2.rs:12:13
33
|
4-
LL | concat!(test!());
4+
LL | concat!(test!()); //~ ERROR `test` can only be used in attributes
55
| ^^^^
66

77
error: aborting due to previous error

src/test/ui/test-shadowing/test-cant-be-shadowed.rs

+5
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,8 @@
1616

1717
#[test]
1818
fn foo(){}
19+
20+
macro_rules! test { () => () }
21+
22+
#[test]
23+
fn bar() {}

0 commit comments

Comments
 (0)