about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2018-01-25 12:48:46 -0600
committerGitHub <noreply@github.com>2018-01-25 12:48:46 -0600
commit6eb14305473e4afa393ea49ee49d7a70853eaf37 (patch)
tree0978b59ffb918e04793c27cfd79a0c23015f3eb8
parentfe2fb24228dfdebf9626ceb8422d6c21c4e354cd (diff)
parent9b95e914a1f6537563b885c2ffbdb069e64cc14c (diff)
downloadrust-6eb14305473e4afa393ea49ee49d7a70853eaf37.tar.gz
rust-6eb14305473e4afa393ea49ee49d7a70853eaf37.zip
Rollup merge of #47439 - eddyb:issue-45662, r=nagisa
rustc_trans: ignore trailing padding larger than 8 bytes.

Fixes #45662 by ignoring a missing second register component, as it could be entirely padding.
-rw-r--r--src/librustc_trans/cabi_x86_64.rs12
-rw-r--r--src/test/run-pass/align-with-extern-c-fn.rs8
2 files changed, 10 insertions, 10 deletions
diff --git a/src/librustc_trans/cabi_x86_64.rs b/src/librustc_trans/cabi_x86_64.rs
index 630762602d0..0dc72541b42 100644
--- a/src/librustc_trans/cabi_x86_64.rs
+++ b/src/librustc_trans/cabi_x86_64.rs
@@ -167,12 +167,12 @@ fn cast_target(cls: &[Option<Class>], size: Size) -> CastTarget {
     let mut i = 0;
     let lo = reg_component(cls, &mut i, size).unwrap();
     let offset = Size::from_bytes(8) * (i as u64);
-    let target = if size <= offset {
-        CastTarget::from(lo)
-    } else {
-        let hi = reg_component(cls, &mut i, size - offset).unwrap();
-        CastTarget::Pair(lo, hi)
-    };
+    let mut target = CastTarget::from(lo);
+    if size > offset {
+        if let Some(hi) = reg_component(cls, &mut i, size - offset) {
+            target = CastTarget::Pair(lo, hi);
+        }
+    }
     assert_eq!(reg_component(cls, &mut i, Size::from_bytes(0)), None);
     target
 }
diff --git a/src/test/run-pass/align-with-extern-c-fn.rs b/src/test/run-pass/align-with-extern-c-fn.rs
index db25960df4c..15e3b4b03eb 100644
--- a/src/test/run-pass/align-with-extern-c-fn.rs
+++ b/src/test/run-pass/align-with-extern-c-fn.rs
@@ -14,10 +14,10 @@
 #![feature(attr_literals)]
 
 #[repr(align(16))]
-pub struct A {
-    y: i64,
-}
+pub struct A(i64);
 
 pub extern "C" fn foo(x: A) {}
 
-fn main() {}
+fn main() {
+    foo(A(0));
+}