mirror of https://github.com/rust-lang/rust
32 lines
816 B
Rust
32 lines
816 B
Rust
//@ compile-flags: -Znext-solver
|
|
|
|
trait Foo {
|
|
type Assoc;
|
|
}
|
|
|
|
trait Bar {}
|
|
|
|
impl<T> Foo for T {
|
|
type Assoc = i32;
|
|
}
|
|
|
|
impl<T> Bar for T where T: Foo<Assoc = i32> {}
|
|
|
|
fn require_bar<T: Bar>() {}
|
|
|
|
fn foo<T: Foo>() {
|
|
// Unlike the classic solver, the new solver previously projected
|
|
// `<T as Foo>::Assoc = _` down to `i32` even though there's a param-env
|
|
// candidate here, since we don't assemble any param-env projection
|
|
// candidates for `T: Foo` alone.
|
|
//
|
|
// However, allowing impl candidates shadowed by env candidates results
|
|
// in multiple issues, so we explicitly hide them, e.g.
|
|
//
|
|
// https://github.com/rust-lang/trait-system-refactor-initiative/issues/76
|
|
require_bar::<T>();
|
|
//~^ ERROR type mismatch resolving `<T as Foo>::Assoc == i32`
|
|
}
|
|
|
|
fn main() {}
|