Make try_mark_previous_green aware of cycles.
This commit is contained in:
parent
e87a205c2e
commit
de255a9163
|
@ -710,14 +710,25 @@ impl DepGraph {
|
||||||
return None
|
return None
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
if !tcx.sess.has_errors() {
|
if !tcx.sess.has_errors_or_delayed_span_bugs() {
|
||||||
bug!("try_mark_previous_green() - Forcing the DepNode \
|
bug!("try_mark_previous_green() - Forcing the DepNode \
|
||||||
should have set its color")
|
should have set its color")
|
||||||
} else {
|
} else {
|
||||||
// If the query we just forced has resulted
|
// If the query we just forced has resulted in
|
||||||
// in some kind of compilation error, we
|
// some kind of compilation error, we cannot rely on
|
||||||
// don't expect that the corresponding
|
// the dep-node color having been properly updated.
|
||||||
// dep-node color has been 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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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<A>);
|
||||||
|
|
||||||
|
#[cfg(cfail)]
|
||||||
|
struct C(A);
|
||||||
|
//[cfail]~^ ERROR 12:1: 12:13: recursive type `C` has infinite size [E0072]
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Reference in New Issue