zig/test/cases/align.zig
2017-08-29 15:19:15 -04:00

56 lines
1.2 KiB
Zig

const assert = @import("std").debug.assert;
var foo: u8 align 4 = 100;
test "global variable alignment" {
assert(@typeOf(&foo) == &align 4 u8);
const slice = (&foo)[0..1];
assert(@typeOf(slice) == []align 4 u8);
}
fn derp() align (@sizeOf(usize) * 2) -> i32 { 1234 }
test "function alignment" {
assert(derp() == 1234);
}
var baz: packed struct {
a: u32,
b: u32,
} = undefined;
test "packed struct alignment" {
assert(@typeOf(&baz.b) == &align 1 u32);
}
const blah: packed struct {
a: u3,
b: u3,
c: u2,
} = undefined;
test "bit field alignment" {
assert(@typeOf(&blah.b) == &align 1:3:6 const u3);
}
test "default alignment allows unspecified in type syntax" {
assert(&u32 == &align @alignOf(u32) u32);
}
test "implicitly decreasing pointer alignment" {
const a: u32 align 4 = 3;
const b: u32 align 8 = 4;
assert(addUnaligned(&a, &b) == 7);
}
fn addUnaligned(a: &align 1 const u32, b: &align 1 const u32) -> u32 { *a + *b }
test "implicitly decreasing slice alignment" {
const a: u32 align 4 = 3;
const b: u32 align 8 = 4;
assert(addUnalignedSlice((&a)[0..1], (&b)[0..1]) == 7);
}
fn addUnalignedSlice(a: []align 1 const u32, b: []align 1 const u32) -> u32 { a[0] + b[0] }