about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-01-19 10:37:40 -0800
committerNiko Matsakis <niko@alum.mit.edu>2012-01-21 19:31:52 -0800
commit85a3298229e1e9617ff45ab786cf485dcd510ece (patch)
tree55674e83512f1673bcf2c774e11ff54703ca4f3b /src/test
parentcd1056df78d8936cfa732556bfaab8caf6d80c1c (diff)
unify size_of, align_of into one call (metrics)
create some new (xfail'd) tests looking at tag variant alignment
Diffstat (limited to 'src/test')
-rw-r--r--src/test/run-pass/tag-align-dyn-u64.rs24
-rw-r--r--src/test/run-pass/tag-align-dyn-variants.rs61
-rw-r--r--src/test/run-pass/tag-align-shape.rs19
-rw-r--r--src/test/run-pass/tag-align-u64.rs24
4 files changed, 128 insertions, 0 deletions
diff --git a/src/test/run-pass/tag-align-dyn-u64.rs b/src/test/run-pass/tag-align-dyn-u64.rs
new file mode 100644
index 00000000000..18f612b19ad
--- /dev/null
+++ b/src/test/run-pass/tag-align-dyn-u64.rs
@@ -0,0 +1,24 @@
+// xfail-test
+
+tag a_tag<A> {
+    a_tag(A);
+}
+
+type t_rec = {
+    c8: u8,
+    t: a_tag<u64>
+};
+
+fn mk_rec() -> t_rec {
+    ret { c8:0u8, t:a_tag(0u64) };
+}
+
+fn is_8_byte_aligned(&&u: a_tag<u64>) -> bool {
+    let p = ptr::addr_of(u) as uint;
+    ret (p & 7u) == 0u;
+}
+
+fn main() {
+    let x = mk_rec();
+    assert is_8_byte_aligned(x.t);
+}
diff --git a/src/test/run-pass/tag-align-dyn-variants.rs b/src/test/run-pass/tag-align-dyn-variants.rs
new file mode 100644
index 00000000000..10ea8f80b65
--- /dev/null
+++ b/src/test/run-pass/tag-align-dyn-variants.rs
@@ -0,0 +1,61 @@
+// xfail-test
+
+tag a_tag<A,B> {
+    varA(A);
+    varB(B);
+}
+
+type t_rec<A,B> = {
+    chA: u8,
+    tA: a_tag<A,B>,
+    chB: u8,
+    tB: a_tag<A,B>
+};
+
+fn mk_rec<A:copy,B:copy>(a: A, b: B) -> t_rec<A,B> {
+    ret { chA:0u8, tA:varA(a), chB:1u8, tB:varB(b) };
+}
+
+fn is_aligned<A>(amnt: uint, &&u: A) -> bool {
+    let p = ptr::addr_of(u) as uint;
+    ret (p & (amnt-1u)) == 0u;
+}
+
+fn variant_data_is_aligned<A,B>(amnt: uint, &&u: a_tag<A,B>) -> bool {
+    alt u {
+      varA(a) { is_aligned(amnt, a) }
+      varB(b) { is_aligned(amnt, b) }
+    }
+}
+
+fn main() {
+    let x = mk_rec(22u64, 23u64);
+    assert is_aligned(8u, x.tA);
+    assert variant_data_is_aligned(8u, x.tA);
+    assert is_aligned(8u, x.tB);
+    assert variant_data_is_aligned(8u, x.tB);
+
+    let x = mk_rec(22u64, 23u32);
+    assert is_aligned(8u, x.tA);
+    assert variant_data_is_aligned(8u, x.tA);
+    assert is_aligned(8u, x.tB);
+    assert variant_data_is_aligned(4u, x.tB);
+
+    let x = mk_rec(22u32, 23u64);
+    assert is_aligned(8u, x.tA);
+    assert variant_data_is_aligned(4u, x.tA);
+    assert is_aligned(8u, x.tB);
+    assert variant_data_is_aligned(8u, x.tB);
+
+    let x = mk_rec(22u32, 23u32);
+    assert is_aligned(4u, x.tA);
+    assert variant_data_is_aligned(4u, x.tA);
+    assert is_aligned(4u, x.tB);
+    assert variant_data_is_aligned(4u, x.tB);
+
+    let x = mk_rec(22f64, 23f64);
+    assert is_aligned(8u, x.tA);
+    assert variant_data_is_aligned(8u, x.tA);
+    assert is_aligned(8u, x.tB);
+    assert variant_data_is_aligned(8u, x.tB);
+}
diff --git a/src/test/run-pass/tag-align-shape.rs b/src/test/run-pass/tag-align-shape.rs
new file mode 100644
index 00000000000..18084aecab2
--- /dev/null
+++ b/src/test/run-pass/tag-align-shape.rs
@@ -0,0 +1,19 @@
+// xfail-test
+//
+// See issue #1535
+
+tag a_tag {
+    a_tag(u64);
+}
+
+type t_rec = {
+    c8: u8,
+    t: a_tag
+};
+
+fn main() {
+    let x = {c8: 22u8, t: a_tag(44u64)};
+    let y = #fmt["%?", x];
+    #debug["y = %s", y];
+    assert y == "(22, a_tag(44))";
+}
diff --git a/src/test/run-pass/tag-align-u64.rs b/src/test/run-pass/tag-align-u64.rs
new file mode 100644
index 00000000000..f0df400cf19
--- /dev/null
+++ b/src/test/run-pass/tag-align-u64.rs
@@ -0,0 +1,24 @@
+// xfail-test
+
+tag a_tag {
+    a_tag(u64);
+}
+
+type t_rec = {
+    c8: u8,
+    t: a_tag
+};
+
+fn mk_rec() -> t_rec {
+    ret { c8:0u8, t:a_tag(0u64) };
+}
+
+fn is_8_byte_aligned(&&u: a_tag) -> bool {
+    let p = ptr::addr_of(u) as u64;
+    ret (p & 7u64) == 0u64;
+}
+
+fn main() {
+    let x = mk_rec();
+    assert is_8_byte_aligned(x.t);
+}