diff options
| author | Tim Chevalier <catamorphism@gmail.com> | 2012-10-17 11:00:36 -0700 |
|---|---|---|
| committer | Tim Chevalier <catamorphism@gmail.com> | 2012-10-17 11:00:36 -0700 |
| commit | 7f12cc4e63657155f54fd734c791f66f5f6d9e20 (patch) | |
| tree | efe3db84cd3d06df79d052d315949b638932d1fa | |
| parent | 47c83f1844d033a2ee12aa05eed30112804f4585 (diff) | |
| parent | 25096a212a9ccaa0d181630af5971532c3472182 (diff) | |
| download | rust-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.rs | 7 | ||||
| -rw-r--r-- | src/test/run-pass/issue-3656.rs | 20 |
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() { +} |
