rust/tests/ui/traits/next-solver/generalize/instantiate-canonical-occurs-check-failure.rs
2024-02-26 10:57:46 +01:00

30 lines
1018 B
Rust

//@ compile-flags: -Znext-solver
//@ check-pass
// With #119106 generalization now results in `AliasRelate` if the generalized
// alias contains an inference variable which is not nameable.
//
// We previously proved alias-relate after canonicalization, which does not keep track
// of universe indices, so all inference vars were nameable inside of `AliasRelate`.
//
// If we now have a rigid projection containing an unnameable inference variable,
// we should emit an alias-relate obligation, which constrains the type of `x` to
// an alias. This caused us to emit yet another equivalent alias-relate obligation
// when trying to instantiate the query result, resulting in overflow.
trait Trait<'a> {
type Assoc: Default;
}
fn takes_alias<'a, T: Trait<'a>>(_: <T as Trait<'a>>::Assoc) {}
fn foo<T: for<'a> Trait<'a>>() {
let x = Default::default();
let _incr_universe: for<'a, 'b> fn(&'a (), &'b ()) =
(|&(), &()| ()) as for<'a> fn(&'a (), &'a ());
takes_alias::<T>(x);
}
fn main() {}