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:: CannotDetermineMacroResolution ;
4
5
use crate :: errors:: {
5
- self , AddAsNonDerive , CannotDetermineMacroResolution , CannotFindIdentInThisScope ,
6
- MacroExpectedFound , RemoveSurroundingDerive ,
6
+ self , AddAsNonDerive , CannotFindIdentInThisScope , MacroExpectedFound , RemoveSurroundingDerive ,
7
7
} ;
8
8
use crate :: Namespace :: * ;
9
9
use crate :: { BuiltinMacroState , Determinacy , MacroData } ;
@@ -15,6 +15,7 @@ use rustc_ast_pretty::pprust;
15
15
use rustc_attr:: StabilityLevel ;
16
16
use rustc_data_structures:: intern:: Interned ;
17
17
use rustc_data_structures:: sync:: Lrc ;
18
+ use rustc_errors:: StashKey :: MacroResolutionError ;
18
19
use rustc_errors:: { struct_span_code_err, Applicability } ;
19
20
use rustc_expand:: base:: { Annotatable , DeriveResolutions , Indeterminate , ResolverExpand } ;
20
21
use rustc_expand:: base:: { SyntaxExtension , SyntaxExtensionKind } ;
@@ -703,21 +704,21 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
703
704
// situations should be reported as errors, so this is a bug.
704
705
this. dcx ( ) . span_delayed_bug ( span, "inconsistent resolution for a macro" ) ;
705
706
}
706
- } else {
707
+ } else if this . tcx . dcx ( ) . has_errors ( ) . is_none ( ) && this . privacy_errors . is_empty ( ) {
707
708
// It's possible that the macro was unresolved (indeterminate) and silently
708
709
// expanded into a dummy fragment for recovery during expansion.
709
710
// Now, post-expansion, the resolution may succeed, but we can't change the
710
711
// past and need to report an error.
711
712
// However, non-speculative `resolve_path` can successfully return private items
712
713
// 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
- }
714
+ // less informative error if no other error is reported elsewhere.
715
+
716
+ let err = this. dcx ( ) . create_err ( CannotDetermineMacroResolution {
717
+ span,
718
+ kind : kind. descr ( ) ,
719
+ path : Segment :: names_to_string ( path) ,
720
+ } ) ;
721
+ err . stash ( span , MacroResolutionError ) ;
721
722
}
722
723
} ;
723
724
0 commit comments