about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTim Chevalier <catamorphism@gmail.com>2012-10-17 11:00:36 -0700
committerTim Chevalier <catamorphism@gmail.com>2012-10-17 11:00:36 -0700
commit7f12cc4e63657155f54fd734c791f66f5f6d9e20 (patch)
treeefe3db84cd3d06df79d052d315949b638932d1fa
parent47c83f1844d033a2ee12aa05eed30112804f4585 (diff)
parent25096a212a9ccaa0d181630af5971532c3472182 (diff)
downloadrust-7f12cc4e63657155f54fd734c791f66f5f6d9e20.tar.gz
rust-7f12cc4e63657155f54fd734c791f66f5f6d9e20.zip
Merge pull request #3716 from Blei/fix-3656
rustc: fix size computation of structs for the FFI
-rw-r--r--src/rustc/middle/trans/foreign.rs7
-rw-r--r--src/test/run-pass/issue-3656.rs20
2 files changed, 24 insertions, 3 deletions
diff --git a/src/rustc/middle/trans/foreign.rs b/src/rustc/middle/trans/foreign.rs
index 8a03884f415..d307fcb5dca 100644
--- a/src/rustc/middle/trans/foreign.rs
+++ b/src/rustc/middle/trans/foreign.rs
@@ -112,9 +112,10 @@ fn classify_ty(ty: TypeRef) -> ~[x86_64_reg_class] {
             Float => 4,
             Double => 8,
             Struct => {
-              do vec::foldl(0, struct_tys(ty)) |s, t| {
-                    s + ty_size(*t)
-                }
+              let size = do vec::foldl(0, struct_tys(ty)) |s, t| {
+                  align(s, *t) + ty_size(*t)
+              };
+              align(size, ty)
             }
             Array => {
               let len = llvm::LLVMGetArrayLength(ty) as uint;
diff --git a/src/test/run-pass/issue-3656.rs b/src/test/run-pass/issue-3656.rs
new file mode 100644
index 00000000000..feb7ad1db7a
--- /dev/null
+++ b/src/test/run-pass/issue-3656.rs
@@ -0,0 +1,20 @@
+// Issue #3656
+// Incorrect struct size computation in the FFI, because of not taking
+// the alignment of elements into account.
+
+use libc::*;
+
+struct KEYGEN {
+    hash_algorithm: [c_uint]/2,
+    count: uint32_t,
+    salt: *c_void,
+    salt_size: uint32_t,
+}
+
+extern {
+    // Bogus signature, just need to test if it compiles.
+    pub fn malloc(++data: KEYGEN);
+}
+
+fn main() {
+}