42 lines
824 B
Rust
42 lines
824 B
Rust
//@ test-mir-pass: 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>() {
|
|
// CHECK-LABEL: fn foo(
|
|
|
|
// CHECK-NOT: [foo:_.*]: Foo
|
|
// CHECK-NOT: Box<dyn std::fmt::Display + 'static>
|
|
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::<()>()
|
|
}
|