Fix ICE with buffered lint referring to AST node deleted by everybody_loops
This commit is contained in:
parent
edebf77e00
commit
a28a78f247
3 changed files with 38 additions and 6 deletions
|
@ -437,12 +437,18 @@ pub fn configure_and_expand(
|
||||||
});
|
});
|
||||||
|
|
||||||
// Add all buffered lints from the `ParseSess` to the `Session`.
|
// Add all buffered lints from the `ParseSess` to the `Session`.
|
||||||
sess.parse_sess.buffered_lints.with_lock(|buffered_lints| {
|
// The ReplaceBodyWithLoop pass may have deleted some AST nodes, potentially
|
||||||
info!("{} parse sess buffered_lints", buffered_lints.len());
|
// causing a delay_span_bug later if a buffered lint refers to such a deleted
|
||||||
for early_lint in buffered_lints.drain(..) {
|
// AST node (issue #87308). Since everybody_loops is for pretty-printing only,
|
||||||
resolver.lint_buffer().add_early_lint(early_lint);
|
// 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)
|
Ok(krate)
|
||||||
}
|
}
|
||||||
|
|
12
src/test/ui/lint/issue-87308.rs
Normal file
12
src/test/ui/lint/issue-87308.rs
Normal file
|
@ -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
src/test/ui/lint/issue-87308.stdout
Normal file
14
src/test/ui/lint/issue-87308.stdout
Normal file
|
@ -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 { } }
|
Loading…
Add table
Add a link
Reference in a new issue