rust/tests/ui/nll/user-annotations/normalization-infer.rs
2023-01-11 09:32:08 +00:00

41 lines
1.3 KiB
Rust

// Annnotations may contain projection types with inference variables as input.
// Make sure we don't get ambiguities when normalizing them.
// check-fail
// Single impl.
fn test1<A, B, C, D>(a: A, b: B, c: C) {
trait Tr { type Ty; }
impl<T: 'static> Tr for (T,) { type Ty = T; }
let _: <(_,) as Tr>::Ty = a; //~ ERROR type `A`
Some::<<(_,) as Tr>::Ty>(b); //~ ERROR type `B`
|| -> <(_,) as Tr>::Ty { c }; //~ ERROR type `C`
|d: <(_,) as Tr>::Ty| -> D { d }; //~ ERROR type `D`
}
// Two impls. The selected impl depends on the actual type.
fn test2<A, B, C>(a: A, b: B, c: C) {
trait Tr { type Ty; }
impl<T: 'static> Tr for (u8, T) { type Ty = T; }
impl<T> Tr for (i8, T) { type Ty = T; }
type Alias<X, Y> = (<(X, Y) as Tr>::Ty, X);
fn temp() -> String { todo!() }
// `u8` impl, requires static.
let _: Alias<_, _> = (a, 0u8); //~ ERROR type `A`
Some::<Alias<_, _>>((b, 0u8)); //~ ERROR type `B`
|| -> Alias<_, _> { (c, 0u8) }; //~ ERROR type `C`
let _: Alias<_, _> = (&temp(), 0u8); //~ ERROR temporary value
Some::<Alias<_, _>>((&temp(), 0u8)); //~ ERROR temporary value
// `i8` impl, no region constraints.
let _: Alias<_, _> = (&temp(), 0i8);
Some::<Alias<_, _>>((&temp(), 0i8));
}
fn main() {}