@@ -30,7 +30,10 @@ use rustc_span::{BytePos, Span, SyntaxContext};
30
30
use thin_vec:: { thin_vec, ThinVec } ;
31
31
32
32
use crate :: errors:: { AddedMacroUse , ChangeImportBinding , ChangeImportBindingSuggestion } ;
33
- use crate :: errors:: { ConsiderAddingADerive , ExplicitUnsafeTraits , MaybeMissingMacroRulesName } ;
33
+ use crate :: errors:: {
34
+ ConsiderAddingADerive , ExplicitUnsafeTraits , MacroDefinedLater , MacroSuggMovePosition ,
35
+ MaybeMissingMacroRulesName ,
36
+ } ;
34
37
use crate :: imports:: { Import , ImportKind } ;
35
38
use crate :: late:: { PatternSource , Rib } ;
36
39
use crate :: path_names_to_string;
@@ -1439,6 +1442,24 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
1439
1442
return ;
1440
1443
}
1441
1444
1445
+ let unused_macro = self . unused_macros . iter ( ) . find_map ( |( def_id, ( _, unused_ident) ) | {
1446
+ if unused_ident. name == ident. name {
1447
+ Some ( ( def_id. clone ( ) , unused_ident. clone ( ) ) )
1448
+ } else {
1449
+ None
1450
+ }
1451
+ } ) ;
1452
+
1453
+ if let Some ( ( def_id, unused_ident) ) = unused_macro {
1454
+ let scope = self . local_macro_def_scopes [ & def_id] ;
1455
+ let parent_nearest = parent_scope. module . nearest_parent_mod ( ) ;
1456
+ if Some ( parent_nearest) == scope. opt_def_id ( ) {
1457
+ err. subdiagnostic ( MacroDefinedLater { span : unused_ident. span } ) ;
1458
+ err. subdiagnostic ( MacroSuggMovePosition { span : ident. span , ident } ) ;
1459
+ return ;
1460
+ }
1461
+ }
1462
+
1442
1463
if self . macro_names . contains ( & ident. normalize_to_macros_2_0 ( ) ) {
1443
1464
err. subdiagnostic ( AddedMacroUse ) ;
1444
1465
return ;
0 commit comments