about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorkhyperia <github@khyperia.com>2020-08-30 13:38:47 +0200
committerkhyperia <github@khyperia.com>2020-08-30 13:38:47 +0200
commit1663bfba02b7c1545a3c241b6b08cc9d9b97c475 (patch)
tree2dfb8838de848b80f5c0a4b81e59a8bc93006388 /src
parent81650f485c8cafbb6f06d43e90236f34c53175cf (diff)
downloadrust-1663bfba02b7c1545a3c241b6b08cc9d9b97c475.tar.gz
rust-1663bfba02b7c1545a3c241b6b08cc9d9b97c475.zip
Fix matching on field.abi instead of self.layout.abi
Diffstat (limited to 'src')
-rw-r--r--src/librustc_codegen_ssa/mir/operand.rs6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/librustc_codegen_ssa/mir/operand.rs b/src/librustc_codegen_ssa/mir/operand.rs
index fb84e914661..bbd004be875 100644
--- a/src/librustc_codegen_ssa/mir/operand.rs
+++ b/src/librustc_codegen_ssa/mir/operand.rs
@@ -220,7 +220,7 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
             _ => bug!("OperandRef::extract_field({:?}): not applicable", self),
         };
 
-        match (&mut val, &self.layout.abi) {
+        match (&mut val, &field.abi) {
             (OperandValue::Immediate(llval), _) => {
                 // Bools in union fields needs to be truncated.
                 *llval = bx.to_immediate(*llval, field);
@@ -228,9 +228,11 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
                 *llval = bx.bitcast(*llval, bx.cx().immediate_backend_type(field));
             }
             (OperandValue::Pair(a, b), Abi::ScalarPair(a_abi, b_abi)) => {
+                // Bools in union fields needs to be truncated.
                 *a = bx.to_immediate_scalar(*a, a_abi);
-                *a = bx.bitcast(*a, bx.cx().scalar_pair_element_backend_type(field, 0, true));
                 *b = bx.to_immediate_scalar(*b, b_abi);
+                // HACK(eddyb) have to bitcast pointers until LLVM removes pointee types.
+                *a = bx.bitcast(*a, bx.cx().scalar_pair_element_backend_type(field, 0, true));
                 *b = bx.bitcast(*b, bx.cx().scalar_pair_element_backend_type(field, 1, true));
             }
             (OperandValue::Pair(..), _) => bug!(),