mirror of https://github.com/rust-lang/rust
43 lines
1.2 KiB
Rust
43 lines
1.2 KiB
Rust
//@ revisions: old next
|
|
//@[next] compile-flags: -Znext-solver=coherence
|
|
//@ check-pass
|
|
|
|
// Regression test for issue #90662
|
|
// Tests that projection caching does not cause a spurious error.
|
|
// Coherence relies on the following overflowing goal to still constrain
|
|
// `?0` to `dyn Service`.
|
|
//
|
|
// Projection(<ServiceImpl as Provider<TestModule>>::Interface. ?0)
|
|
//
|
|
// cc https://github.com/rust-lang/trait-system-refactor-initiative/issues/70.
|
|
|
|
trait HasProvider<T: ?Sized> {}
|
|
trait Provider<M> {
|
|
type Interface: ?Sized;
|
|
}
|
|
|
|
trait Repository {}
|
|
trait Service {}
|
|
|
|
struct DbConnection;
|
|
impl<M> Provider<M> for DbConnection {
|
|
type Interface = DbConnection;
|
|
}
|
|
|
|
struct RepositoryImpl;
|
|
impl<M: HasProvider<DbConnection>> Provider<M> for RepositoryImpl {
|
|
type Interface = dyn Repository;
|
|
}
|
|
|
|
struct ServiceImpl;
|
|
impl<M: HasProvider<dyn Repository>> Provider<M> for ServiceImpl {
|
|
type Interface = dyn Service;
|
|
}
|
|
|
|
struct TestModule;
|
|
impl HasProvider<<DbConnection as Provider<Self>>::Interface> for TestModule {}
|
|
impl HasProvider<<RepositoryImpl as Provider<Self>>::Interface> for TestModule {}
|
|
impl HasProvider<<ServiceImpl as Provider<Self>>::Interface> for TestModule {}
|
|
|
|
fn main() {}
|