@@ -246,6 +246,8 @@ impl<'a> Resolver<'a> {
246246 // n.b. we don't need to look at the path option here, because cstore already did
247247 let crate_id = self . session . cstore . extern_mod_stmt_cnum ( item. id ) . unwrap ( ) ;
248248 let module = self . get_extern_crate_root ( crate_id) ;
249+ self . populate_module_if_necessary ( module) ;
250+ let used = self . process_legacy_macro_imports ( item, module, expansion) ;
249251 let binding =
250252 ( module, ty:: Visibility :: Public , sp, expansion) . to_name_binding ( self . arenas ) ;
251253 let directive = self . arenas . alloc_import_directive ( ImportDirective {
@@ -257,11 +259,11 @@ impl<'a> Resolver<'a> {
257259 module_path : Vec :: new ( ) ,
258260 vis : Cell :: new ( vis) ,
259261 expansion : expansion,
262+ used : Cell :: new ( used) ,
260263 } ) ;
264+ self . potentially_unused_imports . push ( directive) ;
261265 let imported_binding = self . import ( binding, directive) ;
262266 self . define ( parent, ident, TypeNS , imported_binding) ;
263- self . populate_module_if_necessary ( module) ;
264- self . process_legacy_macro_imports ( item, module, expansion) ;
265267 }
266268
267269 ItemKind :: Mod ( ..) if item. ident == keywords:: Invalid . ident ( ) => { } // Crate root
@@ -519,7 +521,6 @@ impl<'a> Resolver<'a> {
519521 binding : & ' a NameBinding < ' a > ,
520522 span : Span ,
521523 allow_shadowing : bool ) {
522- self . used_crates . insert ( binding. def ( ) . def_id ( ) . krate ) ;
523524 self . macro_names . insert ( name) ;
524525 if self . builtin_macros . insert ( name, binding) . is_some ( ) && !allow_shadowing {
525526 let msg = format ! ( "`{}` is already in scope" , name) ;
@@ -529,22 +530,23 @@ impl<'a> Resolver<'a> {
529530 }
530531 }
531532
532- fn process_legacy_macro_imports ( & mut self , item : & Item , module : Module < ' a > , expansion : Mark ) {
533+ // This returns true if we should consider the underlying `extern crate` to be used.
534+ fn process_legacy_macro_imports ( & mut self , item : & Item , module : Module < ' a > , expansion : Mark )
535+ -> bool {
533536 let allow_shadowing = expansion == Mark :: root ( ) ;
534537 let legacy_imports = self . legacy_macro_imports ( & item. attrs ) ;
535- let cnum = module . def_id ( ) . unwrap ( ) . krate ;
538+ let mut used = legacy_imports != LegacyMacroImports :: default ( ) ;
536539
537540 // `#[macro_use]` and `#[macro_reexport]` are only allowed at the crate root.
538- if self . current_module . parent . is_some ( ) && legacy_imports != LegacyMacroImports :: default ( ) {
541+ if self . current_module . parent . is_some ( ) && used {
539542 span_err ! ( self . session, item. span, E0468 ,
540543 "an `extern crate` loading macros must be at the crate root" ) ;
541- } else if !self . use_extern_macros &&
542- self . session . cstore . dep_kind ( cnum) . macros_only ( ) &&
543- legacy_imports == LegacyMacroImports :: default ( ) {
544+ } else if !self . use_extern_macros && !used &&
545+ self . session . cstore . dep_kind ( module. def_id ( ) . unwrap ( ) . krate ) . macros_only ( ) {
544546 let msg = "custom derive crates and `#[no_link]` crates have no effect without \
545547 `#[macro_use]`";
546548 self . session . span_warn ( item. span , msg) ;
547- self . used_crates . insert ( cnum ) ; // Avoid the normal unused extern crate warning
549+ used = true ; // Avoid the normal unused extern crate warning
548550 }
549551
550552 if let Some ( span) = legacy_imports. import_all {
@@ -563,9 +565,7 @@ impl<'a> Resolver<'a> {
563565 }
564566 }
565567 for ( name, span) in legacy_imports. reexports {
566- let krate = module. def_id ( ) . unwrap ( ) . krate ;
567- self . used_crates . insert ( krate) ;
568- self . session . cstore . export_macros ( krate) ;
568+ self . session . cstore . export_macros ( module. def_id ( ) . unwrap ( ) . krate ) ;
569569 let ident = Ident :: with_empty_ctxt ( name) ;
570570 let result = self . resolve_ident_in_module ( module, ident, MacroNS , false , None ) ;
571571 if let Ok ( binding) = result {
@@ -574,6 +574,7 @@ impl<'a> Resolver<'a> {
574574 span_err ! ( self . session, span, E0470 , "reexported macro not found" ) ;
575575 }
576576 }
577+ used
577578 }
578579
579580 // does this attribute list contain "macro_use"?
0 commit comments