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