authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-08-30 00:06:14-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-08-30 00:06:14-04:00
logb35dad88b474bf346131696f5cb0e01a5b1c45c1
tree5c233088134826fd9dc9c266b91abb8e0b7b7498
parent2d5762235529c6023aa61edac95f123576579a52

add tests for function alignment handling

See #37

2 files changed, 43 insertions(+), 0 deletions(-)

test/cases/align.zig+31
......@@ -9,9 +9,15 @@ test "global variable alignment" {
99}
1010
1111fn derp() align (@sizeOf(usize) * 2) -> i32 { 1234 }
12fn noop1() align 1 {}
13fn noop4() align 4 {}
1214
1315test "function alignment" {
1416 assert(derp() == 1234);
17 assert(@typeOf(noop1) == fn() align 1);
18 assert(@typeOf(noop4) == fn() align 4);
19 noop1();
20 noop4();
1521}
1622
1723
......@@ -96,3 +102,28 @@ fn sliceExpectsOnly1(slice: []align 1 u32) {
96102fn sliceExpects4(slice: []align 4 u32) {
97103 slice[0] += 1;
98104}
105
106
107test "implicitly decreasing fn alignment" {
108 testImplicitlyDecreaseFnAlign(alignedSmall, 1234);
109 testImplicitlyDecreaseFnAlign(alignedBig, 5678);
110}
111
112fn testImplicitlyDecreaseFnAlign(ptr: fn () align 1 -> i32, answer: i32) {
113 assert(ptr() == answer);
114}
115
116fn alignedSmall() align 8 -> i32 { 1234 }
117fn alignedBig() align 16 -> i32 { 5678 }
118
119
120test "@alignCast functions" {
121 assert(fnExpectsOnly1(simple4) == 0x19);
122}
123fn fnExpectsOnly1(ptr: fn()align 1 -> i32) -> i32 {
124 fnExpects4(@alignCast(4, ptr))
125}
126fn fnExpects4(ptr: fn()align 4 -> i32) -> i32 {
127 ptr()
128}
129fn simple4() align 4 -> i32 { 0x19 }
test/compile_errors.zig+12
......@@ -2039,4 +2039,16 @@ pub fn addCases(cases: &tests.CompileErrorContext) {
20392039 \\}
20402040 ,
20412041 ".tmp_source.zig:2:22: error: expected pointer or slice, found 'u32'");
2042
2043 cases.add("passing an under-aligned function pointer",
2044 \\export fn entry() {
2045 \\ testImplicitlyDecreaseFnAlign(alignedSmall, 1234);
2046 \\}
2047 \\fn testImplicitlyDecreaseFnAlign(ptr: fn () align 8 -> i32, answer: i32) {
2048 \\ if (ptr() != answer) unreachable;
2049 \\}
2050 \\fn alignedSmall() align 4 -> i32 { 1234 }
2051 ,
2052 ".tmp_source.zig:2:35: error: expected type 'fn() align 8 -> i32', found 'fn() align 4 -> i32'");
2053
20422054}