unify size_of, align_of into one call (metrics)

create some new (xfail'd) tests looking at tag variant alignment
This commit is contained in:
Niko Matsakis 2012-01-19 10:37:40 -08:00
parent cd1056df78
commit 85a3298229
6 changed files with 475 additions and 105 deletions

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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))";
}

View file

@ -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);
}