@@ -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