@@ -17,7 +17,7 @@ use macros::{InvocationData, LegacyScope};
1717use resolve_imports:: ImportDirective ;
1818use resolve_imports:: ImportDirectiveSubclass :: { self , GlobImport , SingleImport } ;
1919use { Module , ModuleData , ModuleKind , NameBinding , NameBindingKind , ToNameBinding } ;
20- use { PerNS , Resolver , ResolverArenas } ;
20+ use { ModuleOrUniformRoot , PerNS , Resolver , ResolverArenas } ;
2121use Namespace :: { self , TypeNS , ValueNS , MacroNS } ;
2222use { resolve_error, resolve_struct_error, ResolutionError } ;
2323
@@ -175,7 +175,12 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
175175 ModuleKind :: Def ( _, name) => name,
176176 ModuleKind :: Block ( ..) => unreachable ! ( ) ,
177177 } ;
178- source. name = crate_name;
178+ // HACK(eddyb) unclear how good this is, but keeping `$crate`
179+ // in `source` breaks `src/test/compile-fail/import-crate-var.rs`,
180+ // while the current crate doesn't have a valid `crate_name`.
181+ if crate_name != keywords:: Invalid . name ( ) {
182+ source. name = crate_name;
183+ }
179184 if rename. is_none ( ) {
180185 ident. name = crate_name;
181186 }
@@ -187,6 +192,12 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
187192 }
188193 }
189194
195+ if ident. name == keywords:: Crate . name ( ) {
196+ self . session . span_err ( ident. span ,
197+ "crate root imports need to be explicitly named: \
198+ `use crate as name;`") ;
199+ }
200+
190201 let subclass = SingleImport {
191202 target : ident,
192203 source,
@@ -299,7 +310,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
299310 root_id : item. id ,
300311 id : item. id ,
301312 parent,
302- imported_module : Cell :: new ( Some ( module) ) ,
313+ imported_module : Cell :: new ( Some ( ModuleOrUniformRoot :: Module ( module) ) ) ,
303314 subclass : ImportDirectiveSubclass :: ExternCrate ( orig_name) ,
304315 root_span : item. span ,
305316 span : item. span ,
@@ -701,7 +712,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
701712 root_id : item. id ,
702713 id : item. id ,
703714 parent : graph_root,
704- imported_module : Cell :: new ( Some ( module) ) ,
715+ imported_module : Cell :: new ( Some ( ModuleOrUniformRoot :: Module ( module) ) ) ,
705716 subclass : ImportDirectiveSubclass :: MacroUse ,
706717 root_span : span,
707718 span,
@@ -721,7 +732,13 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
721732 } else {
722733 for ( name, span) in legacy_imports. imports {
723734 let ident = Ident :: with_empty_ctxt ( name) ;
724- let result = self . resolve_ident_in_module ( module, ident, MacroNS , false , span) ;
735+ let result = self . resolve_ident_in_module (
736+ ModuleOrUniformRoot :: Module ( module) ,
737+ ident,
738+ MacroNS ,
739+ false ,
740+ span,
741+ ) ;
725742 if let Ok ( binding) = result {
726743 let directive = macro_use_directive ( span) ;
727744 self . potentially_unused_imports . push ( directive) ;
0 commit comments