@@ -85,8 +85,15 @@ impl<'a, 'tcx> OperandRef<'tcx> {
85
85
assert ! ( common:: type_is_zero_size( ccx, ty) ) ;
86
86
let llty = type_of:: type_of ( ccx, ty) ;
87
87
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
+ } ;
88
95
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 ] ) )
90
97
} else {
91
98
OperandValue :: Immediate ( C_null ( llty) )
92
99
} ;
@@ -156,8 +163,16 @@ impl<'a, 'tcx> OperandRef<'tcx> {
156
163
if common:: type_is_imm_pair ( bcx. ccx , self . ty ) {
157
164
debug ! ( "Operand::unpack_if_pair: unpacking {:?}" , self ) ;
158
165
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) ;
161
176
162
177
let pair_fields = common:: type_pair_fields ( bcx. ccx , self . ty ) ;
163
178
if let Some ( [ a_ty, b_ty] ) = pair_fields {
0 commit comments