mirror of
https://github.com/ziglang/zig.git
synced 2026-02-14 21:38:33 +00:00
stage2: comptime @bitCast packed struct bug fix
This commit is contained in:
parent
d506275a06
commit
69e2cac0d3
@ -1283,11 +1283,11 @@ pub const Value = extern union {
|
||||
const field_val = field_vals[i];
|
||||
const field_bigint_const = switch (field.ty.zigTypeTag()) {
|
||||
.Float => switch (field.ty.floatBits(target)) {
|
||||
16 => bitcastFloatToBigInt(f16, val.toFloat(f16), &field_buf),
|
||||
32 => bitcastFloatToBigInt(f32, val.toFloat(f32), &field_buf),
|
||||
64 => bitcastFloatToBigInt(f64, val.toFloat(f64), &field_buf),
|
||||
80 => bitcastFloatToBigInt(f80, val.toFloat(f80), &field_buf),
|
||||
128 => bitcastFloatToBigInt(f128, val.toFloat(f128), &field_buf),
|
||||
16 => bitcastFloatToBigInt(f16, field_val.toFloat(f16), &field_buf),
|
||||
32 => bitcastFloatToBigInt(f32, field_val.toFloat(f32), &field_buf),
|
||||
64 => bitcastFloatToBigInt(f64, field_val.toFloat(f64), &field_buf),
|
||||
80 => bitcastFloatToBigInt(f80, field_val.toFloat(f80), &field_buf),
|
||||
128 => bitcastFloatToBigInt(f128, field_val.toFloat(f128), &field_buf),
|
||||
else => unreachable,
|
||||
},
|
||||
.Int, .Bool => field_val.toBigInt(&field_space, target),
|
||||
|
||||
@ -264,3 +264,38 @@ test "triple level result location with bitcast sandwich passed as tuple element
|
||||
};
|
||||
try S.foo(.{@as(f64, @bitCast(f32, @as(u32, 0x414570A4)))});
|
||||
}
|
||||
|
||||
test "@bitCast packed struct of floats" {
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
|
||||
const Foo = packed struct {
|
||||
a: f16 = 0,
|
||||
b: f32 = 1,
|
||||
c: f64 = 2,
|
||||
d: f128 = 3,
|
||||
};
|
||||
|
||||
const Foo2 = packed struct {
|
||||
a: f16 = 0,
|
||||
b: f32 = 1,
|
||||
c: f64 = 2,
|
||||
d: f128 = 3,
|
||||
};
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
var foo = Foo{};
|
||||
var v = @bitCast(Foo2, foo);
|
||||
try expect(v.a == foo.a);
|
||||
try expect(v.b == foo.b);
|
||||
try expect(v.c == foo.c);
|
||||
try expect(v.d == foo.d);
|
||||
}
|
||||
};
|
||||
try S.doTheTest();
|
||||
comptime try S.doTheTest();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user