mirror of https://github.com/rust-lang/rust
31 lines
772 B
Rust
31 lines
772 B
Rust
//@ compile-flags: -Znext-solver
|
|
//@ check-pass
|
|
|
|
// Normalizing `<T as Trait>::TraitAssoc` in the elaborated environment
|
|
// `[T: Trait, T: Super, <T as Super>::SuperAssoc = <T as Trait>::TraitAssoc]`
|
|
// has a single impl candidate, which uses the environment to
|
|
// normalize `<T as Trait>::TraitAssoc` to itself. We avoid this overflow
|
|
// by discarding impl candidates the trait bound is proven by a where-clause.
|
|
|
|
// https://github.com/rust-lang/trait-system-refactor-initiative/issues/76
|
|
trait Super {
|
|
type SuperAssoc;
|
|
}
|
|
|
|
trait Trait: Super<SuperAssoc = Self::TraitAssoc> {
|
|
type TraitAssoc;
|
|
}
|
|
|
|
impl<T, U> Trait for T
|
|
where
|
|
T: Super<SuperAssoc = U>,
|
|
{
|
|
type TraitAssoc = U;
|
|
}
|
|
|
|
fn overflow<T: Trait>() {
|
|
let x: <T as Trait>::TraitAssoc;
|
|
}
|
|
|
|
fn main() {}
|