rust/tests/ui/traits/next-solver/alias-relate/tait-eq-proj.rs

36 lines
1.0 KiB
Rust

//@ compile-flags: -Znext-solver
//@ check-pass
#![feature(type_alias_impl_trait)]
type Tait = impl Iterator<Item = impl Sized>;
/*
Consider the goal - AliasRelate(Tait, <[i32; 32] as IntoIterator>::IntoIter)
which is registered on the line above.
A. SubstRelate - fails (of course).
B. NormalizesToRhs - Tait normalizes-to <[i32; 32] as IntoIterator>::IntoIter
* infer definition - Tait := <[i32; 32] as IntoIterator>::IntoIter
C. NormalizesToLhs - <[i32; 32] as IntoIterator>::IntoIter normalizes-to Tait
* Find impl candidate, after substitute - std::array::IntoIter<i32, 32>
* Equate std::array::IntoIter<i32, 32> and Tait
* infer definition - Tait := std::array::IntoIter<i32, 32>
B and C are not equal, but they are equivalent modulo normalization.
We get around this by evaluating both the NormalizesToRhs and NormalizesToLhs
goals together. Essentially:
A alias-relate B if A normalizes-to B and B normalizes-to A.
*/
fn a(_: Tait) {
let _: Tait = IntoIterator::into_iter([0i32; 32]);
}
fn main() {}