Skip to content

Commit 2f7a2fa

Browse files
committed
resolve: Do not add erroneous names to extern prelude
1 parent cde0374 commit 2f7a2fa

File tree

1 file changed

+13
-8
lines changed
  • compiler/rustc_resolve/src

1 file changed

+13
-8
lines changed

compiler/rustc_resolve/src/lib.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1487,13 +1487,23 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14871487
let mut invocation_parents = FxHashMap::default();
14881488
invocation_parents.insert(LocalExpnId::ROOT, InvocationParent::ROOT);
14891489

1490-
let mut extern_prelude: FxIndexMap<Ident, ExternPreludeEntry<'_>> = tcx
1490+
let mut extern_prelude: FxIndexMap<_, _> = tcx
14911491
.sess
14921492
.opts
14931493
.externs
14941494
.iter()
1495-
.filter(|(_, entry)| entry.add_prelude)
1496-
.map(|(name, _)| (Ident::from_str(name), Default::default()))
1495+
.filter_map(|(name, entry)| {
1496+
// Make sure `self`, `super`, `_` etc do not get into extern prelude.
1497+
// FIXME: reject `--extern self` and similar in option parsing instead.
1498+
if entry.add_prelude
1499+
&& let name = Symbol::intern(name)
1500+
&& name.can_be_raw()
1501+
{
1502+
Some((Ident::with_dummy_span(name), Default::default()))
1503+
} else {
1504+
None
1505+
}
1506+
})
14971507
.collect();
14981508

14991509
if !attr::contains_name(attrs, sym::no_core) {
@@ -2168,11 +2178,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
21682178
}
21692179

21702180
fn extern_prelude_get(&mut self, ident: Ident, finalize: bool) -> Option<NameBinding<'ra>> {
2171-
if ident.is_path_segment_keyword() {
2172-
// Make sure `self`, `super` etc produce an error when passed to here.
2173-
return None;
2174-
}
2175-
21762181
let norm_ident = ident.normalize_to_macros_2_0();
21772182
let binding = self.extern_prelude.get(&norm_ident).cloned().and_then(|entry| {
21782183
Some(if let Some(binding) = entry.binding.get() {

0 commit comments

Comments
 (0)