diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-11-01 12:10:46 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-11-01 12:13:00 -0700 |
| commit | 61b604580b407c429e8bdb34c95377b0cb171d45 (patch) | |
| tree | 24344d46fe9f023b87248251baa95be17796a839 /src/test | |
| parent | 11999351e0f59d0dcf2ed3b2cf661dcc2e4f0edd (diff) | |
| download | rust-61b604580b407c429e8bdb34c95377b0cb171d45.tar.gz rust-61b604580b407c429e8bdb34c95377b0cb171d45.zip | |
Fix alignment of interior pointers of dynamic-size types. Closes #1112
GEP_tup_like finds interior pointers by creating a tuple of all the types preceding the element it wants a pointer to, then asks for the size of that tuple. This results in incorrect pointers when the alignment of that tuple is not the alignment of the interior type you're getting a pointer to.
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/run-pass/issue-1112.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/test/run-pass/issue-1112.rs b/src/test/run-pass/issue-1112.rs new file mode 100644 index 00000000000..35d21e40be2 --- /dev/null +++ b/src/test/run-pass/issue-1112.rs @@ -0,0 +1,37 @@ +// Issue #1112 +// Alignment of interior pointers to dynamic-size types + +use std; +import std::ptr::addr_of; + +type x<T> = { + a: T, + b: u8, + c: bool, + d: u8, + e: u16, + f: u8, + g: u8 +}; + +fn main() { + let x: x<int> = { + a: 12345678, + b: 9u8, + c: true, + d: 10u8, + e: 11u16, + f: 12u8, + g: 13u8 + }; + bar(x); +} + +fn bar<T>(x: x<T>) { + assert x.b == 9u8; + assert x.c == true; + assert x.d == 10u8; + assert x.e == 11u16; + assert x.f == 12u8; + assert x.g == 13u8; +} \ No newline at end of file |
