@@ -1106,6 +1106,19 @@ impl<'a> Resolver<'a> {
1106
1106
} ) ;
1107
1107
}
1108
1108
1109
+ crate fn check_reserved_macro_name ( & mut self , ident : Ident , res : Res ) {
1110
+ // Reserve some names that are not quite covered by the general check
1111
+ // performed on `Resolver::builtin_attrs`.
1112
+ if ident. name == sym:: cfg || ident. name == sym:: cfg_attr || ident. name == sym:: derive {
1113
+ let macro_kind = self . opt_get_macro ( res) . map ( |ext| ext. macro_kind ( ) ) ;
1114
+ if macro_kind. is_some ( ) && sub_namespace_match ( macro_kind, Some ( MacroKind :: Attr ) ) {
1115
+ self . session . span_err (
1116
+ ident. span , & format ! ( "name `{}` is reserved in attribute namespace" , ident)
1117
+ ) ;
1118
+ }
1119
+ }
1120
+ }
1121
+
1109
1122
pub fn define_macro ( & mut self ,
1110
1123
item : & ast:: Item ,
1111
1124
expansion : Mark ,
@@ -1117,13 +1130,14 @@ impl<'a> Resolver<'a> {
1117
1130
let ext = Lrc :: new ( macro_rules:: compile ( & self . session . parse_sess ,
1118
1131
& self . session . features_untracked ( ) ,
1119
1132
item, self . session . edition ( ) ) ) ;
1133
+ let macro_kind = ext. macro_kind ( ) ;
1134
+ let res = Res :: Def ( DefKind :: Macro ( macro_kind) , def_id) ;
1120
1135
self . macro_map . insert ( def_id, ext) ;
1121
1136
1122
1137
let def = match item. node { ast:: ItemKind :: MacroDef ( ref def) => def, _ => unreachable ! ( ) } ;
1123
1138
if def. legacy {
1124
1139
let ident = ident. modern ( ) ;
1125
1140
self . macro_names . insert ( ident) ;
1126
- let res = Res :: Def ( DefKind :: Macro ( MacroKind :: Bang ) , def_id) ;
1127
1141
let is_macro_export = attr:: contains_name ( & item. attrs , sym:: macro_export) ;
1128
1142
let vis = if is_macro_export {
1129
1143
ty:: Visibility :: Public
@@ -1142,14 +1156,11 @@ impl<'a> Resolver<'a> {
1142
1156
self . define ( module, ident, MacroNS ,
1143
1157
( res, vis, item. span , expansion, IsMacroExport ) ) ;
1144
1158
} else {
1145
- if !attr:: contains_name ( & item. attrs , sym:: rustc_builtin_macro) {
1146
- self . check_reserved_macro_name ( ident, MacroNS ) ;
1147
- }
1159
+ self . check_reserved_macro_name ( ident, res) ;
1148
1160
self . unused_macros . insert ( def_id) ;
1149
1161
}
1150
1162
} else {
1151
1163
let module = self . current_module ;
1152
- let res = Res :: Def ( DefKind :: Macro ( MacroKind :: Bang ) , def_id) ;
1153
1164
let vis = self . resolve_visibility ( & item. vis ) ;
1154
1165
if vis != ty:: Visibility :: Public {
1155
1166
self . unused_macros . insert ( def_id) ;
0 commit comments