Skip to content

Commit ceb5de3

Browse files
committed
Stop SRoA'ing DynMetadata in MIR
1 parent 213ad10 commit ceb5de3

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

compiler/rustc_mir_transform/src/sroa.rs

+5
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ fn escaping_locals<'tcx>(
7070
// Exclude #[repr(simd)] types so that they are not de-optimized into an array
7171
return true;
7272
}
73+
if Some(def.did()) == tcx.lang_items().dyn_metadata() {
74+
// codegen wants to see the `DynMetadata<T>`,
75+
// not the inner reference-to-opaque-type.
76+
return true;
77+
}
7378
// We already excluded unions and enums, so this ADT must have one variant
7479
let variant = def.variant(FIRST_VARIANT);
7580
if variant.fields.len() > 1 {

tests/mir-opt/dyn_metadata_sroa.rs

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//@ compile-flags: -Zmir-opt-level=5 -Zvalidate-mir
2+
3+
#![feature(ptr_metadata)]
4+
5+
// Regression for <https://github.com/rust-lang/rust/issues/125506>,
6+
// which failed because of SRoA would project into `DynMetadata`.
7+
8+
trait Foo {}
9+
10+
struct Bar;
11+
12+
impl Foo for Bar {}
13+
14+
fn main() {
15+
let a: *mut dyn Foo = &mut Bar;
16+
17+
let d = a.to_raw_parts().0 as usize;
18+
}

0 commit comments

Comments
 (0)