@@ -1498,14 +1498,26 @@ impl DiagCtxtInner {
1498
1498
let bugs: Vec < _ > =
1499
1499
std:: mem:: take ( & mut self . delayed_bugs ) . into_iter ( ) . map ( |( b, _) | b) . collect ( ) ;
1500
1500
1501
- // If backtraces are enabled, also print the query stack
1502
1501
let backtrace = std:: env:: var_os ( "RUST_BACKTRACE" ) . map_or ( true , |x| & x != "0" ) ;
1503
- for ( i, bug) in bugs. into_iter ( ) . enumerate ( ) {
1504
- if let Some ( file) = self . ice_file . as_ref ( )
1505
- && let Ok ( mut out) = std:: fs:: File :: options ( ) . create ( true ) . append ( true ) . open ( file)
1506
- {
1507
- let _ = write ! (
1508
- & mut out,
1502
+ let decorate = backtrace || self . ice_file . is_none ( ) ;
1503
+ let mut out = self
1504
+ . ice_file
1505
+ . as_ref ( )
1506
+ . and_then ( |file| std:: fs:: File :: options ( ) . create ( true ) . append ( true ) . open ( file) . ok ( ) ) ;
1507
+
1508
+ // Put the overall explanation before the `DelayedBug`s, to frame them
1509
+ // better (e.g. separate warnings from them). Also, use notes, which
1510
+ // don't count as errors, to avoid possibly triggering
1511
+ // `-Ztreat-err-as-bug`, which we don't want.
1512
+ let note1 = "no errors encountered even though delayed bugs were created" ;
1513
+ let note2 = "those delayed bugs will now be shown as internal compiler errors" ;
1514
+ self . emit_diagnostic ( DiagInner :: new ( Note , note1) ) ;
1515
+ self . emit_diagnostic ( DiagInner :: new ( Note , note2) ) ;
1516
+
1517
+ for bug in bugs {
1518
+ if let Some ( out) = & mut out {
1519
+ _ = write ! (
1520
+ out,
1509
1521
"delayed bug: {}\n {}\n " ,
1510
1522
bug. inner
1511
1523
. messages
@@ -1516,21 +1528,9 @@ impl DiagCtxtInner {
1516
1528
) ;
1517
1529
}
1518
1530
1519
- if i == 0 {
1520
- // Put the overall explanation before the `DelayedBug`s, to
1521
- // frame them better (e.g. separate warnings from them). Also,
1522
- // make it a note so it doesn't count as an error, because that
1523
- // could trigger `-Ztreat-err-as-bug`, which we don't want.
1524
- let note1 = "no errors encountered even though delayed bugs were created" ;
1525
- let note2 = "those delayed bugs will now be shown as internal compiler errors" ;
1526
- self . emit_diagnostic ( DiagInner :: new ( Note , note1) ) ;
1527
- self . emit_diagnostic ( DiagInner :: new ( Note , note2) ) ;
1528
- }
1529
-
1530
- let mut bug =
1531
- if backtrace || self . ice_file . is_none ( ) { bug. decorate ( self ) } else { bug. inner } ;
1531
+ let mut bug = if decorate { bug. decorate ( self ) } else { bug. inner } ;
1532
1532
1533
- // "Undelay" the delayed bugs ( into plain `Bug`s) .
1533
+ // "Undelay" the delayed bugs into plain bugs .
1534
1534
if bug. level != DelayedBug {
1535
1535
// NOTE(eddyb) not panicking here because we're already producing
1536
1536
// an ICE, and the more information the merrier.
0 commit comments