c9c80d2c5f
The only non-obvious changes: - `building/storage_live_dead_in_statics.rs` has a `#[rustfmt::skip]` attribute to avoid reformating a table of data. - Two `.mir` files have slight changes involving line numbers. - In `unusual_item_types.rs` an `EMIT_MIR` annotation is moved to outside a function, which is the usual spot, because `tidy` complains if such a comment is indented. The commit also tweaks the comments in `rustfmt.toml`.
39 lines
803 B
Rust
39 lines
803 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::<()>()
|
|
}
|