From de255a9163963e62a06c981b71041f071058ec5b Mon Sep 17 00:00:00 2001 From: Alex Aktsipetrov Date: Fri, 6 Dec 2019 12:48:53 +0300 Subject: [PATCH] Make try_mark_previous_green aware of cycles. --- src/librustc/dep_graph/graph.rs | 21 ++++++++++++++++----- src/test/incremental/issue-61323.rs | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 src/test/incremental/issue-61323.rs diff --git a/src/librustc/dep_graph/graph.rs b/src/librustc/dep_graph/graph.rs index 0104507f7020f..d952bf7ab9e25 100644 --- a/src/librustc/dep_graph/graph.rs +++ b/src/librustc/dep_graph/graph.rs @@ -710,14 +710,25 @@ impl DepGraph { return None } None => { - if !tcx.sess.has_errors() { + if !tcx.sess.has_errors_or_delayed_span_bugs() { bug!("try_mark_previous_green() - Forcing the DepNode \ should have set its color") } else { - // If the query we just forced has resulted - // in some kind of compilation error, we - // don't expect that the corresponding - // dep-node color has been updated. + // If the query we just forced has resulted in + // some kind of compilation error, we cannot rely on + // the dep-node color having been properly updated. + // This means that the query system has reached an + // invalid state. We let the compiler continue (by + // returning `None`) so it can emit error messages + // and wind down, but rely on the fact that this + // invalid state will not be persisted to the + // incremental compilation cache because of + // compilation errors being present. + debug!("try_mark_previous_green({:?}) - END - \ + dependency {:?} resulted in compilation error", + dep_node, + dep_dep_node); + return None } } } diff --git a/src/test/incremental/issue-61323.rs b/src/test/incremental/issue-61323.rs new file mode 100644 index 0000000000000..448ce367b8c6b --- /dev/null +++ b/src/test/incremental/issue-61323.rs @@ -0,0 +1,15 @@ +// revisions: rpass cfail + +enum A { + //[cfail]~^ ERROR 3:1: 3:7: recursive type `A` has infinite size [E0072] + B(C), +} + +#[cfg(rpass)] +struct C(Box); + +#[cfg(cfail)] +struct C(A); +//[cfail]~^ ERROR 12:1: 12:13: recursive type `C` has infinite size [E0072] + +fn main() {}