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:
parent
cd1056df78
commit
85a3298229
6 changed files with 475 additions and 105 deletions
24
src/test/run-pass/tag-align-dyn-u64.rs
Normal file
24
src/test/run-pass/tag-align-dyn-u64.rs
Normal 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);
|
||||
}
|
||||
61
src/test/run-pass/tag-align-dyn-variants.rs
Normal file
61
src/test/run-pass/tag-align-dyn-variants.rs
Normal 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);
|
||||
}
|
||||
19
src/test/run-pass/tag-align-shape.rs
Normal file
19
src/test/run-pass/tag-align-shape.rs
Normal 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))";
|
||||
}
|
||||
24
src/test/run-pass/tag-align-u64.rs
Normal file
24
src/test/run-pass/tag-align-u64.rs
Normal 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);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue