2024-04-20 06:19:34 -05:00
|
|
|
//@ test-mir-pass: ScalarReplacementOfAggregates
|
2024-02-22 06:10:29 -06:00
|
|
|
//@ compile-flags: -Cpanic=abort
|
|
|
|
//@ no-prefer-dynamic
|
2023-03-05 12:13:43 -06:00
|
|
|
|
|
|
|
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>() {
|
2024-01-28 16:04:07 -06:00
|
|
|
// CHECK-LABEL: fn foo(
|
|
|
|
|
|
|
|
// CHECK-NOT: [foo:_.*]: Foo
|
|
|
|
// CHECK-NOT: Box<dyn std::fmt::Display + 'static>
|
2024-06-02 19:18:33 -05:00
|
|
|
let foo: Foo<T> = Foo { x: Ok(Box::new(5_u32)), y: 7_u32 };
|
2023-03-05 12:13:43 -06:00
|
|
|
|
|
|
|
let x = foo.x;
|
|
|
|
let y = foo.y;
|
|
|
|
|
|
|
|
if let Ok(x) = x {
|
|
|
|
eprintln!("{x} {y}");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Err for () {
|
|
|
|
type Err = ();
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
foo::<()>()
|
|
|
|
}
|