about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEduard-Mihai Burtescu <edy.burt@gmail.com>2018-01-15 01:48:19 +0200
committerEduard-Mihai Burtescu <edy.burt@gmail.com>2018-01-16 18:04:24 +0200
commit9b95e914a1f6537563b885c2ffbdb069e64cc14c (patch)
tree312d9f63db80c40d5140c000d3c19e91f8e8baca /src
parentda569fa9ddf8369a9809184d43c600dc06bd4b4d (diff)
rustc_trans: ignore trailing padding larger than 8 bytes.
Diffstat (limited to 'src')
-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 6db18bfecf2..681b7f55273 100644
--- a/src/librustc_trans/cabi_x86_64.rs
+++ b/src/librustc_trans/cabi_x86_64.rs
@@ -179,12 +179,12 @@ fn cast_target(cls: &[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));
+}