summaryrefslogtreecommitdiffstats
path: root/tests/ui/nll/user-annotations/normalization-infer.rs
blob: 8bfc272d4ba095660caa925a52bd15c1862bc2b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 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() {}