about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-11-01 12:10:46 -0700
committerBrian Anderson <banderson@mozilla.com>2011-11-01 12:13:00 -0700
commit61b604580b407c429e8bdb34c95377b0cb171d45 (patch)
tree24344d46fe9f023b87248251baa95be17796a839 /src/test
parent11999351e0f59d0dcf2ed3b2cf661dcc2e4f0edd (diff)
downloadrust-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.rs37
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