trait Foo {
type T<'a>: Sized where Self: 'a;
}
impl Foo for &() {
type T<'a> = ();
}
This fails in the old solver, passes in the new solver. This fails in the old solver because in check_type_bounds we normalize the item bound like <&() as Foo>::T<'a>: Sized into (): Sized, but when normalizing we also require proving the GAT where clauses hold.
In the new solver we simply structurally replace instances of GATs with their definition type using the ReplaceTy folder, which is a kind of "normalization" but which doesn't require that the GAT where clauses hold.
For now, we could just register the GAT bounds in check_type_bounds to paper over this problem, though I think we could think harder about how and where GAT where clauses are required to hold in normalization...
This fails in the old solver, passes in the new solver. This fails in the old solver because in
check_type_boundswe normalize the item bound like<&() as Foo>::T<'a>: Sizedinto(): Sized, but when normalizing we also require proving the GAT where clauses hold.In the new solver we simply structurally replace instances of GATs with their definition type using the
ReplaceTyfolder, which is a kind of "normalization" but which doesn't require that the GAT where clauses hold.For now, we could just register the GAT bounds in
check_type_boundsto paper over this problem, though I think we could think harder about how and where GAT where clauses are required to hold in normalization...