summaryrefslogtreecommitdiffstats
path: root/src/test/ui/traits/trait-upcasting/type-checking-test-4.rs
blob: 70ccc87fc3e145596593e34055adaad5f5395252 (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
41
42
43
44
45
46
47
48
49
#![feature(trait_upcasting)]
#![allow(incomplete_features)]

trait Foo<'a>: Bar<'a, 'a> {}
trait Bar<'a, 'b> {
    fn get_b(&self) -> Option<&'a u32> {
        None
    }
}

fn test_correct(x: &dyn Foo<'static>) {
    let _ = x as &dyn Bar<'static, 'static>;
}

fn test_wrong1<'a>(x: &dyn Foo<'static>, y: &'a u32) {
    let _ = x as &dyn Bar<'static, 'a>; // Error
    //~^ ERROR lifetime may not live long enough
}

fn test_wrong2<'a>(x: &dyn Foo<'static>, y: &'a u32) {
    let _ = x as &dyn Bar<'a, 'static>; // Error
    //~^ ERROR lifetime may not live long enough
}

fn test_wrong3<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
    let y = x as &dyn Bar<'_, '_>;
    y.get_b() // ERROR
    //~^ ERROR lifetime may not live long enough
}

fn test_wrong4<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
    <_ as Bar>::get_b(x) // ERROR
    //~^ ERROR lifetime may not live long enough
}

fn test_wrong5<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
    <_ as Bar<'_, '_>>::get_b(x) // ERROR
    //~^ ERROR lifetime may not live long enough
}

fn test_wrong6<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
    let y = x as &dyn Bar<'_, '_>;
    y.get_b(); // ERROR
    let z = y;
    z.get_b() // ERROR
    //~^ ERROR lifetime may not live long enough
}

fn main() {}