@@ -712,33 +712,47 @@ impl DiagCtxt {
712
712
/// Stashes a diagnostic for possible later improvement in a different,
713
713
/// later stage of the compiler. Possible actions depend on the diagnostic
714
714
/// level:
715
+ /// - Level::Bug, Level:Fatal: not allowed, will trigger a panic.
715
716
/// - Level::Error: immediately counted as an error that has occurred, because it
716
717
/// is guaranteed to be emitted eventually. Can be later accessed with the
717
718
/// provided `span` and `key` through
718
719
/// [`DiagCtxt::try_steal_modify_and_emit_err`] or
719
720
/// [`DiagCtxt::try_steal_replace_and_emit_err`]. These do not allow
720
721
/// cancellation or downgrading of the error. Returns
721
722
/// `Some(ErrorGuaranteed)`.
723
+ /// - Level::DelayedBug: this does happen occasionally with errors that are
724
+ /// downgraded to delayed bugs. It is not stashed, but immediately
725
+ /// emitted as a delayed bug. This is because stashing it would cause it
726
+ /// to be counted by `err_count` which we don't want. It doesn't matter
727
+ /// that we cannot steal and improve it later, because it's not a
728
+ /// user-facing error. Returns `Some(ErrorGuaranteed)` as is normal for
729
+ /// delayed bugs.
722
730
/// - Level::Warning and lower (i.e. !is_error()): can be accessed with the
723
731
/// provided `span` and `key` through [`DiagCtxt::steal_non_err()`]. This
724
732
/// allows cancelling and downgrading of the diagnostic. Returns `None`.
725
- /// - Others: not allowed, will trigger a panic.
726
733
pub fn stash_diagnostic (
727
734
& self ,
728
735
span : Span ,
729
736
key : StashKey ,
730
737
diag : DiagInner ,
731
738
) -> Option < ErrorGuaranteed > {
732
- let guar = if diag. level ( ) == Level :: Error {
733
- // This `unchecked_error_guaranteed` is valid. It is where the
734
- // `ErrorGuaranteed` for stashed errors originates. See
735
- // `DiagCtxtInner::drop`.
736
- #[ allow( deprecated) ]
737
- Some ( ErrorGuaranteed :: unchecked_error_guaranteed ( ) )
738
- } else if !diag. is_error ( ) {
739
- None
740
- } else {
741
- self . span_bug ( span, format ! ( "invalid level in `stash_diagnostic`: {}" , diag. level) ) ;
739
+ let guar = match diag. level {
740
+ Bug | Fatal => {
741
+ self . span_bug (
742
+ span,
743
+ format ! ( "invalid level in `stash_diagnostic`: {:?}" , diag. level) ,
744
+ ) ;
745
+ }
746
+ Error => {
747
+ // This `unchecked_error_guaranteed` is valid. It is where the
748
+ // `ErrorGuaranteed` for stashed errors originates. See
749
+ // `DiagCtxtInner::drop`.
750
+ #[ allow( deprecated) ]
751
+ Some ( ErrorGuaranteed :: unchecked_error_guaranteed ( ) )
752
+ }
753
+ DelayedBug => return self . inner . borrow_mut ( ) . emit_diagnostic ( diag) ,
754
+ ForceWarning ( _) | Warning | Note | OnceNote | Help | OnceHelp | FailureNote | Allow
755
+ | Expect ( _) => None ,
742
756
} ;
743
757
744
758
// FIXME(Centril, #69537): Consider reintroducing panic on overwriting a stashed diagnostic
0 commit comments