Fix tag align tests for 32bit linux (fixes #7340)

This commit is contained in:
Manish Goregaokar 2015-03-05 17:09:12 +05:30
parent 455aa62e4d
commit 340d1cc7d7
3 changed files with 27 additions and 33 deletions

View File

@ -8,9 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// ignore-linux #7340 fails on 32-bit Linux
// ignore-macos #7340 fails on 32-bit macos
use std::mem;
enum Tag<A> {
@ -26,12 +23,13 @@ fn mk_rec() -> Rec {
return Rec { c8:0, t:Tag::Tag2(0) };
}
fn is_8_byte_aligned(u: &Tag<u64>) -> bool {
fn is_u64_aligned(u: &Tag<u64>) -> bool {
let p: uint = unsafe { mem::transmute(u) };
return (p & 7) == 0;
let u64_align = std::mem::min_align_of::<u64>();
return (p & (u64_align - 1)) == 0;
}
pub fn main() {
let x = mk_rec();
assert!(is_8_byte_aligned(&x.t));
assert!(is_u64_aligned(&x.t));
}

View File

@ -8,9 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// ignore-linux #7340 fails on 32-bit Linux
// ignore-macos #7340 fails on 32-bit macos
use std::mem;
enum Tag<A,B> {
@ -42,33 +39,34 @@ fn variant_data_is_aligned<A,B>(amnt: uint, u: &Tag<A,B>) -> bool {
}
pub fn main() {
let x = mk_rec(22, 23);
assert!(is_aligned(8, &x.tA));
assert!(variant_data_is_aligned(8, &x.tA));
assert!(is_aligned(8, &x.tB));
assert!(variant_data_is_aligned(8, &x.tB));
let u64_align = std::mem::min_align_of::<u64>();
let x = mk_rec(22u64, 23u64);
assert!(is_aligned(u64_align, &x.tA));
assert!(variant_data_is_aligned(u64_align, &x.tA));
assert!(is_aligned(u64_align, &x.tB));
assert!(variant_data_is_aligned(u64_align, &x.tB));
let x = mk_rec(22, 23);
assert!(is_aligned(8, &x.tA));
assert!(variant_data_is_aligned(8, &x.tA));
assert!(is_aligned(8, &x.tB));
let x = mk_rec(22u64, 23u32);
assert!(is_aligned(u64_align, &x.tA));
assert!(variant_data_is_aligned(u64_align, &x.tA));
assert!(is_aligned(u64_align, &x.tB));
assert!(variant_data_is_aligned(4, &x.tB));
let x = mk_rec(22, 23);
assert!(is_aligned(8, &x.tA));
let x = mk_rec(22u32, 23u64);
assert!(is_aligned(u64_align, &x.tA));
assert!(variant_data_is_aligned(4, &x.tA));
assert!(is_aligned(8, &x.tB));
assert!(variant_data_is_aligned(8, &x.tB));
assert!(is_aligned(u64_align, &x.tB));
assert!(variant_data_is_aligned(u64_align, &x.tB));
let x = mk_rec(22, 23);
let x = mk_rec(22u32, 23u32);
assert!(is_aligned(4, &x.tA));
assert!(variant_data_is_aligned(4, &x.tA));
assert!(is_aligned(4, &x.tB));
assert!(variant_data_is_aligned(4, &x.tB));
let x = mk_rec(22f64, 23f64);
assert!(is_aligned(8, &x.tA));
assert!(variant_data_is_aligned(8, &x.tA));
assert!(is_aligned(8, &x.tB));
assert!(variant_data_is_aligned(8, &x.tB));
assert!(is_aligned(u64_align, &x.tA));
assert!(variant_data_is_aligned(u64_align, &x.tA));
assert!(is_aligned(u64_align, &x.tB));
assert!(variant_data_is_aligned(u64_align, &x.tB));
}

View File

@ -8,9 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// ignore-linux #7340 fails on 32-bit Linux
// ignore-macos #7340 fails on 32-bit macos
use std::mem;
enum Tag {
@ -26,12 +23,13 @@ fn mk_rec() -> Rec {
return Rec { c8:0, t:Tag::TagInner(0) };
}
fn is_8_byte_aligned(u: &Tag) -> bool {
fn is_u64_aligned(u: &Tag) -> bool {
let p: uint = unsafe { mem::transmute(u) };
return (p & 7) == 0;
let u64_align = std::mem::min_align_of::<u64>();
return (p & (u64_align - 1)) == 0;
}
pub fn main() {
let x = mk_rec();
assert!(is_8_byte_aligned(&x.t));
assert!(is_u64_aligned(&x.t));
}