mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 14:25:16 +00:00
compiler-rt: restore stage1 workaround
18d6523888ef08bc66eb808075d13c5e00b8fcf4 regressed compiler-rt tests for stage1 because it removed a workaround. I updated the comment to better explain what exactly the workaround is so that it won't happen again.
This commit is contained in:
parent
d8e99164d3
commit
a242906696
@ -3,20 +3,24 @@ const clz = @import("count0bits.zig");
|
||||
const testing = @import("std").testing;
|
||||
|
||||
fn test__clzsi2(a: u32, expected: i32) !void {
|
||||
const nakedClzsi2 = clz.__clzsi2;
|
||||
const fnProto = fn (a: i32) callconv(.C) i32;
|
||||
const fnProtoPtr = switch (builtin.zig_backend) {
|
||||
.stage1 => fnProto,
|
||||
else => *const fnProto,
|
||||
};
|
||||
const fn_ptr = switch (builtin.zig_backend) {
|
||||
.stage1 => nakedClzsi2,
|
||||
else => &nakedClzsi2,
|
||||
};
|
||||
const actualClzsi2 = @ptrCast(fnProtoPtr, fn_ptr);
|
||||
const x = @bitCast(i32, a);
|
||||
const result = actualClzsi2(x);
|
||||
try testing.expectEqual(expected, result);
|
||||
// stage1 and stage2 diverge on function pointer semantics
|
||||
switch (builtin.zig_backend) {
|
||||
.stage1 => {
|
||||
// Use of `var` here is working around a stage1 bug.
|
||||
var nakedClzsi2 = clz.__clzsi2;
|
||||
var actualClzsi2 = @ptrCast(fn (a: i32) callconv(.C) i32, nakedClzsi2);
|
||||
var x = @bitCast(i32, a);
|
||||
var result = actualClzsi2(x);
|
||||
try testing.expectEqual(expected, result);
|
||||
},
|
||||
else => {
|
||||
const nakedClzsi2 = clz.__clzsi2;
|
||||
const actualClzsi2 = @ptrCast(*const fn (a: i32) callconv(.C) i32, &nakedClzsi2);
|
||||
const x = @bitCast(i32, a);
|
||||
const result = actualClzsi2(x);
|
||||
try testing.expectEqual(expected, result);
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
test "clzsi2" {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user