2023-10-16 12:36:39 -05:00
|
|
|
// skip-filecheck
|
2023-03-05 12:13:43 -06:00
|
|
|
// unit-test: ScalarReplacementOfAggregates
|
2023-03-05 13:18:58 -06:00
|
|
|
// compile-flags: -Cpanic=abort
|
2023-03-05 12:13:43 -06:00
|
|
|
// 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::<()>()
|
|
|
|
}
|