Skip to content

Commit 72acea0

Browse files
committed
Add missing struct field index adjustments.
Some accesses in OperandPairs were missing. Fixes #41479.
1 parent 0777c75 commit 72acea0

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

src/librustc_trans/mir/operand.rs

+18-3
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,15 @@ impl<'a, 'tcx> OperandRef<'tcx> {
8585
assert!(common::type_is_zero_size(ccx, ty));
8686
let llty = type_of::type_of(ccx, ty);
8787
let val = if common::type_is_imm_pair(ccx, ty) {
88+
let layout = ccx.layout_of(ty);
89+
let (ix0, ix1) = if let Layout::Univariant { ref variant, .. } = *layout {
90+
(adt::struct_llfields_index(variant, 0),
91+
adt::struct_llfields_index(variant, 1))
92+
} else {
93+
(0, 1)
94+
};
8895
let fields = llty.field_types();
89-
OperandValue::Pair(C_null(fields[0]), C_null(fields[1]))
96+
OperandValue::Pair(C_null(fields[ix0]), C_null(fields[ix1]))
9097
} else {
9198
OperandValue::Immediate(C_null(llty))
9299
};
@@ -156,8 +163,16 @@ impl<'a, 'tcx> OperandRef<'tcx> {
156163
if common::type_is_imm_pair(bcx.ccx, self.ty) {
157164
debug!("Operand::unpack_if_pair: unpacking {:?}", self);
158165

159-
let mut a = bcx.extract_value(llval, 0);
160-
let mut b = bcx.extract_value(llval, 1);
166+
let layout = bcx.ccx.layout_of(self.ty);
167+
let (ix0, ix1) = if let Layout::Univariant { ref variant, .. } = *layout {
168+
(adt::struct_llfields_index(variant, 0),
169+
adt::struct_llfields_index(variant, 1))
170+
} else {
171+
(0, 1)
172+
};
173+
174+
let mut a = bcx.extract_value(llval, ix0);
175+
let mut b = bcx.extract_value(llval, ix1);
161176

162177
let pair_fields = common::type_pair_fields(bcx.ccx, self.ty);
163178
if let Some([a_ty, b_ty]) = pair_fields {

0 commit comments

Comments
 (0)