Open
Description
In rust-lang/rust-analyzer#9990 we've found this failing test:
test!(
program {
#[upstream] #[non_enumerable] #[lang(sized)]
trait Sized {}
#[non_enumerable] #[object_safe]
trait Database {}
#[non_enumerable]
trait QueryGroup
where
Self: Sized,
{
type DynDb: Database + HasQueryGroup<Self>;
}
#[non_enumerable] #[object_safe]
trait HasQueryGroup<G>
where
Self: Database,
G: QueryGroup,
G: Sized,
{ }
#[non_enumerable] #[object_safe]
trait HelloWorld
where
Self: HasQueryGroup<HelloWorldStorage>,
{ }
struct HelloWorldStorage {}
impl QueryGroup for HelloWorldStorage {
type DynDb = dyn HelloWorld + 'static;
}
impl<DB> HelloWorld for DB
where
DB: Database,
DB: HasQueryGroup<HelloWorldStorage>,
DB: Sized,
{ }
}
goal {
forall<T> {
if (FromEnv(T: Database); FromEnv(T: HasQueryGroup<HelloWorldStorage>); FromEnv(T: Sized)) {
T: HelloWorld
}
}
} yields[SolverChoice::slg_default()] { // ok
"Unique"
} yields[SolverChoice::recursive_default()] { // fails: "Ambiguous; no inference guidance"
"Unique"
}
);
Removing DB: Database
bound and FromEnv(T: Database)
makes the test pass.