46 lines
1.0 KiB
Rust
46 lines
1.0 KiB
Rust
#![feature(rustc_attrs)]
|
|
|
|
// Test for a particular corner case where the evaluation
|
|
// cache can get out of date. The problem here is that
|
|
// when we cache C, we have observed that it reaches
|
|
// to depth 2 (the node for B), but we later realize
|
|
// that B itself depends on A (reached depth 0). We
|
|
// failed to update the depth for C transitively, which
|
|
// resulted in an assertion failure when it was referenced
|
|
// from D.
|
|
//
|
|
// A (reached depth 0)
|
|
// E
|
|
// B // depth 2 -- reached depth = 0
|
|
// C // depth 3 -- reached depth = 2 (should be 0)
|
|
// B
|
|
// A // depth 0
|
|
// D (depth 1)
|
|
// C (cache -- reached depth = 2)
|
|
|
|
struct A {
|
|
e: E,
|
|
d: C,
|
|
}
|
|
|
|
struct E {
|
|
b: B,
|
|
}
|
|
|
|
struct B {
|
|
a: Option<Box<A>>,
|
|
c: C,
|
|
}
|
|
|
|
struct C {
|
|
b: Option<Box<B>>,
|
|
}
|
|
|
|
#[rustc_evaluate_where_clauses]
|
|
fn test<X: ?Sized + Send>() {}
|
|
|
|
fn main() {
|
|
test::<A>();
|
|
//~^ ERROR evaluate(Binder { value: TraitPredicate(<A as std::marker::Send>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
|
}
|