@@ -27,10 +27,8 @@ use rustc_span::symbol::{kw, sym, Ident, Symbol};
27
27
use rustc_span:: { BytePos , Span , SyntaxContext } ;
28
28
use thin_vec:: { thin_vec, ThinVec } ;
29
29
30
- use crate :: errors:: {
31
- AddedMacroUse , ChangeImportBinding , ChangeImportBindingSuggestion , ConsiderAddingADerive ,
32
- ExplicitUnsafeTraits ,
33
- } ;
30
+ use crate :: errors:: { AddedMacroUse , ChangeImportBinding , ChangeImportBindingSuggestion } ;
31
+ use crate :: errors:: { ConsiderAddingADerive , ExplicitUnsafeTraits , MaybeMissingMacroRulesName } ;
34
32
use crate :: imports:: { Import , ImportKind } ;
35
33
use crate :: late:: { PatternSource , Rib } ;
36
34
use crate :: path_names_to_string;
@@ -1421,14 +1419,29 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
1421
1419
"" ,
1422
1420
) ;
1423
1421
1422
+ if macro_kind == MacroKind :: Bang
1423
+ && ident. name == sym:: macro_rules
1424
+ && let source_map = self . tcx . sess . source_map ( )
1425
+ && let Ok ( next_source) = source_map. span_to_next_source ( ident. span )
1426
+ && next_source. starts_with ( "!" )
1427
+ && let next = ident. span . with_hi ( ident. span . hi ( ) + BytePos ( 1 ) )
1428
+ && let Ok ( span) = source_map. span_extend_while ( next, |c| c. is_whitespace ( ) || c == '{' )
1429
+ && next != span
1430
+ {
1431
+ err. subdiagnostic ( MaybeMissingMacroRulesName { span : next } ) ;
1432
+ return ;
1433
+ }
1434
+
1424
1435
if macro_kind == MacroKind :: Derive && ( ident. name == sym:: Send || ident. name == sym:: Sync ) {
1425
1436
err. subdiagnostic ( ExplicitUnsafeTraits { span : ident. span , ident } ) ;
1426
1437
return ;
1427
1438
}
1439
+
1428
1440
if self . macro_names . contains ( & ident. normalize_to_macros_2_0 ( ) ) {
1429
1441
err. subdiagnostic ( AddedMacroUse ) ;
1430
1442
return ;
1431
1443
}
1444
+
1432
1445
if ident. name == kw:: Default
1433
1446
&& let ModuleKind :: Def ( DefKind :: Enum , def_id, _) = parent_scope. module . kind
1434
1447
{
0 commit comments