Skip to content

Commit

Permalink
Fix ICE with buffered lint referring to AST node deleted by everybody…
Browse files Browse the repository at this point in the history
…_loops
  • Loading branch information
FabianWolff committed Oct 3, 2021
1 parent edebf77 commit a28a78f
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 6 deletions.
18 changes: 12 additions & 6 deletions compiler/rustc_interface/src/passes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -437,12 +437,18 @@ pub fn configure_and_expand(
});

// Add all buffered lints from the `ParseSess` to the `Session`.
sess.parse_sess.buffered_lints.with_lock(|buffered_lints| {
info!("{} parse sess buffered_lints", buffered_lints.len());
for early_lint in buffered_lints.drain(..) {
resolver.lint_buffer().add_early_lint(early_lint);
}
});
// The ReplaceBodyWithLoop pass may have deleted some AST nodes, potentially
// causing a delay_span_bug later if a buffered lint refers to such a deleted
// AST node (issue #87308). Since everybody_loops is for pretty-printing only,
// anyway, we simply skip all buffered lints here.
if !matches!(sess.opts.pretty, Some(PpMode::Source(PpSourceMode::EveryBodyLoops))) {
sess.parse_sess.buffered_lints.with_lock(|buffered_lints| {
info!("{} parse sess buffered_lints", buffered_lints.len());
for early_lint in buffered_lints.drain(..) {
resolver.lint_buffer().add_early_lint(early_lint);
}
});
}

Ok(krate)
}
Expand Down
12 changes: 12 additions & 0 deletions src/test/ui/lint/issue-87308.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Regression test for issue #87308.

// compile-flags: -Zunpretty=everybody_loops
// check-pass

macro_rules! foo {
() => { break 'x; }
}

pub fn main() {
'x: loop { foo!() }
}
14 changes: 14 additions & 0 deletions src/test/ui/lint/issue-87308.stdout
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#![feature(prelude_import)]
#![no_std]
#[prelude_import]
use ::std::prelude::rust_2015::*;
#[macro_use]
extern crate std;
// Regression test for issue #87308.

// compile-flags: -Zunpretty=everybody_loops
// check-pass

macro_rules! foo { () => { break 'x ; } }

pub fn main() { loop { } }

0 comments on commit a28a78f

Please sign in to comment.