summaryrefslogtreecommitdiffstats
path: root/tests/mir-opt/sroa/lifetimes.rs
blob: 2356d212f3fb4135abb8cd100676e82b22790d48 (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
// unit-test: ScalarReplacementOfAggregates
// compile-flags: -Cpanic=abort
// no-prefer-dynamic

trait Err {
    type Err;
}

struct Foo<T: Err> {
    // Check that the `'static` lifetime is erased when creating the local for `x`,
    // even if we fail to normalize the type.
    x: Result<Box<dyn std::fmt::Display + 'static>, <T as Err>::Err>,
    y: u32,
}

// EMIT_MIR lifetimes.foo.ScalarReplacementOfAggregates.diff
fn foo<T: Err>() {
    let foo: Foo<T> = Foo {
        x: Ok(Box::new(5_u32)),
        y: 7_u32,
    };

    let x = foo.x;
    let y = foo.y;

    if let Ok(x) = x {
        eprintln!("{x} {y}");
    }
}

impl Err for () {
    type Err = ();
}

fn main() {
    foo::<()>()
}