1
1
//! A bunch of methods and structures more or less related to resolving macros and
2
2
//! interface provided by `Resolver` to macro expander.
3
3
4
- use crate :: errors:: {
5
- self , AddAsNonDerive , CannotDetermineMacroResolution , CannotFindIdentInThisScope ,
6
- MacroExpectedFound , RemoveSurroundingDerive ,
7
- } ;
4
+ use crate :: errors:: CannotDetermineMacroResolution ;
5
+ use crate :: errors:: { self , AddAsNonDerive , CannotFindIdentInThisScope } ;
6
+ use crate :: errors:: { MacroExpectedFound , RemoveSurroundingDerive } ;
8
7
use crate :: Namespace :: * ;
9
8
use crate :: { BuiltinMacroState , Determinacy , MacroData } ;
10
9
use crate :: { DeriveData , Finalize , ParentScope , ResolutionError , Resolver , ScopeSet } ;
@@ -15,6 +14,7 @@ use rustc_ast_pretty::pprust;
15
14
use rustc_attr:: StabilityLevel ;
16
15
use rustc_data_structures:: intern:: Interned ;
17
16
use rustc_data_structures:: sync:: Lrc ;
17
+ use rustc_errors:: StashKey ;
18
18
use rustc_errors:: { struct_span_code_err, Applicability } ;
19
19
use rustc_expand:: base:: { Annotatable , DeriveResolutions , Indeterminate , ResolverExpand } ;
20
20
use rustc_expand:: base:: { SyntaxExtension , SyntaxExtensionKind } ;
@@ -25,9 +25,8 @@ use rustc_hir::def_id::{CrateNum, DefId, LocalDefId};
25
25
use rustc_middle:: middle:: stability;
26
26
use rustc_middle:: ty:: RegisteredTools ;
27
27
use rustc_middle:: ty:: { TyCtxt , Visibility } ;
28
- use rustc_session:: lint:: builtin:: {
29
- LEGACY_DERIVE_HELPERS , SOFT_UNSTABLE , UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES ,
30
- } ;
28
+ use rustc_session:: lint:: builtin:: UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES ;
29
+ use rustc_session:: lint:: builtin:: { LEGACY_DERIVE_HELPERS , SOFT_UNSTABLE } ;
31
30
use rustc_session:: lint:: builtin:: { UNUSED_MACROS , UNUSED_MACRO_RULES } ;
32
31
use rustc_session:: lint:: BuiltinLintDiagnostics ;
33
32
use rustc_session:: parse:: feature_err;
@@ -703,21 +702,21 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
703
702
// situations should be reported as errors, so this is a bug.
704
703
this. dcx ( ) . span_delayed_bug ( span, "inconsistent resolution for a macro" ) ;
705
704
}
706
- } else {
705
+ } else if this . tcx . dcx ( ) . has_errors ( ) . is_none ( ) && this . privacy_errors . is_empty ( ) {
707
706
// It's possible that the macro was unresolved (indeterminate) and silently
708
707
// expanded into a dummy fragment for recovery during expansion.
709
708
// Now, post-expansion, the resolution may succeed, but we can't change the
710
709
// past and need to report an error.
711
710
// However, non-speculative `resolve_path` can successfully return private items
712
711
// even if speculative `resolve_path` returned nothing previously, so we skip this
713
- // less informative error if the privacy error is reported elsewhere.
714
- if this . privacy_errors . is_empty ( ) {
715
- this. dcx ( ) . emit_err ( CannotDetermineMacroResolution {
716
- span,
717
- kind : kind. descr ( ) ,
718
- path : Segment :: names_to_string ( path) ,
719
- } ) ;
720
- }
712
+ // less informative error if no other error is reported elsewhere.
713
+
714
+ let err = this. dcx ( ) . create_err ( CannotDetermineMacroResolution {
715
+ span,
716
+ kind : kind. descr ( ) ,
717
+ path : Segment :: names_to_string ( path) ,
718
+ } ) ;
719
+ err . stash ( span , StashKey :: UndeterminedMacroResolution ) ;
721
720
}
722
721
} ;
723
722
0 commit comments