@@ -248,11 +248,6 @@ impl<'a, 'crateloader: 'a> base::Resolver for Resolver<'a, 'crateloader> {
248248 for i in 0 ..attrs. len ( ) {
249249 let name = attrs[ i] . name ( ) ;
250250
251- if self . session . plugin_attributes . borrow ( ) . iter ( )
252- . any ( |& ( ref attr_nm, _) | name == & * * attr_nm) {
253- attr:: mark_known ( & attrs[ i] ) ;
254- }
255-
256251 match self . builtin_macros . get ( & name) . cloned ( ) {
257252 Some ( binding) => match * binding. get_macro ( self ) {
258253 MultiModifier ( ..) | MultiDecorator ( ..) | SyntaxExtension :: AttrProcMacro ( ..) => {
@@ -591,6 +586,15 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
591586 // 2b. Standard library prelude is currently implemented as `macro-use` (closed, controlled)
592587 // 3. Language prelude: builtin macros (closed, controlled, except for legacy plugins).
593588 // 4. Language prelude: builtin attributes (closed, controlled).
589+ // N (unordered). Derive helpers (open, not controlled). All ambiguities with other names
590+ // are currently reported as errors. They should be higher in priority than preludes
591+ // and maybe even names in modules according to the "general principles" above. They
592+ // also should be subject to restricted shadowing because are effectively produced by
593+ // derives (you need to resolve the derive first to add helpers into scope), but they
594+ // should be available before the derive is expanded for compatibility.
595+ // It's mess in general, so we are being conservative for now.
596+ // N (unordered). Legacy plugin helpers (open, not controlled). Similar to derive helpers,
597+ // but introduced by legacy plugins using `register_attribute`.
594598
595599 assert ! ( ns == TypeNS || ns == MacroNS ) ;
596600 assert ! ( force || !record_used) ; // `record_used` implies `force`
@@ -615,6 +619,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
615619 BuiltinMacros ,
616620 BuiltinAttrs ,
617621 DeriveHelpers ,
622+ LegacyPluginHelpers ,
618623 ExternPrelude ,
619624 ToolPrelude ,
620625 StdLibPrelude ,
@@ -681,6 +686,17 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
681686 }
682687 result
683688 }
689+ WhereToResolve :: LegacyPluginHelpers => {
690+ if self . session . plugin_attributes . borrow ( ) . iter ( )
691+ . any ( |( name, _) | ident. name == & * * name) {
692+ let binding = ( Def :: NonMacroAttr ( NonMacroAttrKind :: LegacyPluginHelper ) ,
693+ ty:: Visibility :: Public , ident. span , Mark :: root ( ) )
694+ . to_name_binding ( self . arenas ) ;
695+ Ok ( ( binding, FromPrelude ( false ) ) )
696+ } else {
697+ Err ( Determinacy :: Determined )
698+ }
699+ }
684700 WhereToResolve :: ExternPrelude => {
685701 if use_prelude && self . session . extern_prelude . contains ( & ident. name ) {
686702 let crate_id =
@@ -752,8 +768,9 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
752768 }
753769 WhereToResolve :: MacroUsePrelude => WhereToResolve :: BuiltinMacros ,
754770 WhereToResolve :: BuiltinMacros => WhereToResolve :: BuiltinAttrs ,
755- WhereToResolve :: BuiltinAttrs => break , // nowhere else to search
756- WhereToResolve :: DeriveHelpers => WhereToResolve :: Module ( parent_scope. module) ,
771+ WhereToResolve :: BuiltinAttrs => WhereToResolve :: DeriveHelpers ,
772+ WhereToResolve :: DeriveHelpers => WhereToResolve :: LegacyPluginHelpers ,
773+ WhereToResolve :: LegacyPluginHelpers => break , // nowhere else to search
757774 WhereToResolve :: ExternPrelude => WhereToResolve :: ToolPrelude ,
758775 WhereToResolve :: ToolPrelude => WhereToResolve :: StdLibPrelude ,
759776 WhereToResolve :: StdLibPrelude => WhereToResolve :: BuiltinTypes ,
@@ -775,12 +792,15 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
775792
776793 if let Some ( innermost_result) = innermost_result {
777794 // Found another solution, if the first one was "weak", report an error.
778- let ( def, innermost_def) = ( result. 0 . def ( ) , innermost_result. 0 . def ( ) ) ;
779- if def != innermost_def &&
795+ let prohibit_ambiguities = |def| {
796+ def == Def :: NonMacroAttr ( NonMacroAttrKind :: DeriveHelper ) ||
797+ def == Def :: NonMacroAttr ( NonMacroAttrKind :: LegacyPluginHelper )
798+ } ;
799+ if result. 0 . def ( ) != innermost_result. 0 . def ( ) &&
780800 ( innermost_result. 0 . is_glob_import ( ) ||
781801 innermost_result. 0 . may_appear_after ( parent_scope. expansion , result. 0 ) ||
782- innermost_def == Def :: NonMacroAttr ( NonMacroAttrKind :: DeriveHelper ) ||
783- def == Def :: NonMacroAttr ( NonMacroAttrKind :: DeriveHelper ) ) {
802+ prohibit_ambiguities ( innermost_result . 0 . def ( ) ) ||
803+ prohibit_ambiguities ( result . 0 . def ( ) ) ) {
784804 self . ambiguity_errors . push ( AmbiguityError {
785805 ident,
786806 b1 : innermost_result. 0 ,
0 commit comments