mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-03 02:40:40 +00:00

These tests just need blessing, they don't have any interesting behaviour changes. Some of these tests have new errors because `LegacyReceiver` cannot be proven to be implemented now that it is also testing for `MetaSized` - but this is just a consequence of the other errors in the test.
47 lines
1.1 KiB
Rust
47 lines
1.1 KiB
Rust
#![feature(rustc_attrs, sized_hierarchy)]
|
|
use std::marker::PointeeSized;
|
|
|
|
// 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: PointeeSized + Send>() {}
|
|
|
|
fn main() {
|
|
test::<A>();
|
|
//~^ ERROR evaluate(Binder { value: TraitPredicate(<A as std::marker::Send>, polarity:Positive), bound_vars: [] }) = Ok(EvaluatedToOk)
|
|
}
|