Skip to content

Commit 6d573e9

Browse files
committed
Ensure nested allocations in statics do not get deduplicated
1 parent 8fdfbf5 commit 6d573e9

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

src/mono_item.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#[cfg(feature = "master")]
22
use gccjit::{FnAttribute, VarAttribute};
33
use rustc_codegen_ssa::traits::PreDefineMethods;
4+
use rustc_hir::def::DefKind;
45
use rustc_hir::def_id::{DefId, LOCAL_CRATE};
6+
use rustc_middle::bug;
57
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
68
use rustc_middle::mir::mono::{Linkage, Visibility};
79
use rustc_middle::ty::layout::{FnAbiOf, LayoutOf};
@@ -23,7 +25,14 @@ impl<'gcc, 'tcx> PreDefineMethods<'tcx> for CodegenCx<'gcc, 'tcx> {
2325
) {
2426
let attrs = self.tcx.codegen_fn_attrs(def_id);
2527
let instance = Instance::mono(self.tcx, def_id);
26-
let ty = instance.ty(self.tcx, ty::ParamEnv::reveal_all());
28+
let DefKind::Static { nested, .. } = self.tcx.def_kind(def_id) else { bug!() };
29+
// Nested statics do not have a type, so pick a random type and let `define_static` figure out
30+
// the gcc type from the actual evaluated initializer.
31+
let ty = if nested {
32+
self.tcx.types.unit
33+
} else {
34+
instance.ty(self.tcx, ty::ParamEnv::reveal_all())
35+
};
2736
let gcc_type = self.layout_of(ty).gcc_type(self);
2837

2938
let is_tls = attrs.flags.contains(CodegenFnAttrFlags::THREAD_LOCAL);

0 commit comments

Comments
 (0)