@@ -865,10 +865,6 @@ impl DiagCtxt {
865865 /// directly).
866866 #[ track_caller]
867867 pub fn delayed_bug ( & self , msg : impl Into < DiagnosticMessage > ) -> ErrorGuaranteed {
868- let treat_next_err_as_bug = self . inner . borrow ( ) . treat_next_err_as_bug ( ) ;
869- if treat_next_err_as_bug {
870- self . bug ( msg) ;
871- }
872868 DiagnosticBuilder :: < ErrorGuaranteed > :: new ( self , DelayedBug ( DelayedBugKind :: Normal ) , msg)
873869 . emit ( )
874870 }
@@ -883,10 +879,6 @@ impl DiagCtxt {
883879 sp : impl Into < MultiSpan > ,
884880 msg : impl Into < DiagnosticMessage > ,
885881 ) -> ErrorGuaranteed {
886- let treat_next_err_as_bug = self . inner . borrow ( ) . treat_next_err_as_bug ( ) ;
887- if treat_next_err_as_bug {
888- self . span_bug ( sp, msg) ;
889- }
890882 DiagnosticBuilder :: < ErrorGuaranteed > :: new ( self , DelayedBug ( DelayedBugKind :: Normal ) , msg)
891883 . with_span ( sp)
892884 . emit ( )
@@ -1259,10 +1251,6 @@ impl DiagCtxtInner {
12591251 }
12601252
12611253 fn emit_diagnostic ( & mut self , mut diagnostic : Diagnostic ) -> Option < ErrorGuaranteed > {
1262- if matches ! ( diagnostic. level, Error | Fatal ) && self . treat_next_err_as_bug ( ) {
1263- diagnostic. level = Bug ;
1264- }
1265-
12661254 // The `LintExpectationId` can be stable or unstable depending on when it was created.
12671255 // Diagnostics created before the definition of `HirId`s are unstable and can not yet
12681256 // be stored. Instead, they are buffered until the `LintExpectationId` is replaced by
@@ -1298,6 +1286,12 @@ impl DiagCtxtInner {
12981286 _ => { }
12991287 }
13001288
1289+ // This must come after the possible promotion of `DelayedBug` to
1290+ // `Error` above.
1291+ if matches ! ( diagnostic. level, Error | Fatal ) && self . treat_next_err_as_bug ( ) {
1292+ diagnostic. level = Bug ;
1293+ }
1294+
13011295 if diagnostic. has_future_breakage ( ) {
13021296 // Future breakages aren't emitted if they're Level::Allow,
13031297 // but they still need to be constructed and stashed below,
@@ -1387,20 +1381,14 @@ impl DiagCtxtInner {
13871381 }
13881382
13891383 fn treat_err_as_bug ( & self ) -> bool {
1390- self . flags . treat_err_as_bug . is_some_and ( |c| {
1391- self . err_count + self . lint_err_count + self . delayed_bug_count ( ) >= c. get ( )
1392- } )
1384+ self . flags . treat_err_as_bug . is_some_and ( |c| self . err_count + self . lint_err_count >= c. get ( ) )
13931385 }
13941386
13951387 // Use this one before incrementing `err_count`.
13961388 fn treat_next_err_as_bug ( & self ) -> bool {
1397- self . flags . treat_err_as_bug . is_some_and ( |c| {
1398- self . err_count + self . lint_err_count + self . delayed_bug_count ( ) + 1 >= c. get ( )
1399- } )
1400- }
1401-
1402- fn delayed_bug_count ( & self ) -> usize {
1403- self . span_delayed_bugs . len ( ) + self . good_path_delayed_bugs . len ( )
1389+ self . flags
1390+ . treat_err_as_bug
1391+ . is_some_and ( |c| self . err_count + self . lint_err_count + 1 >= c. get ( ) )
14041392 }
14051393
14061394 fn has_errors ( & self ) -> bool {
@@ -1412,7 +1400,7 @@ impl DiagCtxtInner {
14121400 }
14131401
14141402 fn flush_delayed ( & mut self , kind : DelayedBugKind ) {
1415- let ( bugs, explanation ) = match kind {
1403+ let ( bugs, note1 ) = match kind {
14161404 DelayedBugKind :: Normal => (
14171405 std:: mem:: take ( & mut self . span_delayed_bugs ) ,
14181406 "no errors encountered even though `span_delayed_bug` issued" ,
@@ -1422,6 +1410,7 @@ impl DiagCtxtInner {
14221410 "no warnings or errors encountered even though `good_path_delayed_bugs` issued" ,
14231411 ) ,
14241412 } ;
1413+ let note2 = "those delayed bugs will now be shown as internal compiler errors" ;
14251414
14261415 if bugs. is_empty ( ) {
14271416 return ;
@@ -1447,8 +1436,11 @@ impl DiagCtxtInner {
14471436
14481437 if i == 0 {
14491438 // Put the overall explanation before the `DelayedBug`s, to
1450- // frame them better (e.g. separate warnings from them).
1451- self . emit_diagnostic ( Diagnostic :: new ( Bug , explanation) ) ;
1439+ // frame them better (e.g. separate warnings from them). Also,
1440+ // make it a note so it doesn't count as an error, because that
1441+ // could trigger `-Ztreat-err-as-bug`, which we don't want.
1442+ self . emit_diagnostic ( Diagnostic :: new ( Note , note1) ) ;
1443+ self . emit_diagnostic ( Diagnostic :: new ( Note , note2) ) ;
14521444 }
14531445
14541446 let mut bug =
@@ -1474,22 +1466,12 @@ impl DiagCtxtInner {
14741466
14751467 fn panic_if_treat_err_as_bug ( & self ) {
14761468 if self . treat_err_as_bug ( ) {
1477- match (
1478- self . err_count + self . lint_err_count ,
1479- self . delayed_bug_count ( ) ,
1480- self . flags . treat_err_as_bug . map ( |c| c. get ( ) ) . unwrap ( ) ,
1481- ) {
1482- ( 1 , 0 , 1 ) => panic ! ( "aborting due to `-Z treat-err-as-bug=1`" ) ,
1483- ( 0 , 1 , 1 ) => panic ! ( "aborting due delayed bug with `-Z treat-err-as-bug=1`" ) ,
1484- ( count, delayed_count, val) => {
1485- if delayed_count > 0 {
1486- panic ! (
1487- "aborting after {count} errors and {delayed_count} delayed bugs due to `-Z treat-err-as-bug={val}`" ,
1488- )
1489- } else {
1490- panic ! ( "aborting after {count} errors due to `-Z treat-err-as-bug={val}`" )
1491- }
1492- }
1469+ let n = self . flags . treat_err_as_bug . map ( |c| c. get ( ) ) . unwrap ( ) ;
1470+ assert_eq ! ( n, self . err_count + self . lint_err_count) ;
1471+ if n == 1 {
1472+ panic ! ( "aborting due to `-Z treat-err-as-bug=1`" ) ;
1473+ } else {
1474+ panic ! ( "aborting after {n} errors due to `-Z treat-err-as-bug={n}`" ) ;
14931475 }
14941476 }
14951477 }
0 commit comments