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:
Andrew Kelley 2022-04-28 20:39:33 -07:00
parent d8e99164d3
commit a242906696

View File

@ -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" {