authorgravatar for Sequenceko@gmail.comOmar Alhammadi <Sequenceko@gmail.com> 2022-06-17 20:04:51+04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-06-17 19:04:51+03:00
log69e2cac0d349cc32d4ead73541e18d1f72aac729
treee08b30f281d484820df914b11d99d276ab98d80e
parentd506275a06dd5e9ad8be63f9e44abb7d8bea88b3
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

stage2: comptime @bitCast packed struct bug fix


2 files changed, 40 insertions(+), 5 deletions(-)

src/value.zig+5-5
......@@ -1283,11 +1283,11 @@ pub const Value = extern union {
12831283 const field_val = field_vals[i];
12841284 const field_bigint_const = switch (field.ty.zigTypeTag()) {
12851285 .Float => switch (field.ty.floatBits(target)) {
1286 16 => bitcastFloatToBigInt(f16, val.toFloat(f16), &field_buf),
1287 32 => bitcastFloatToBigInt(f32, val.toFloat(f32), &field_buf),
1288 64 => bitcastFloatToBigInt(f64, val.toFloat(f64), &field_buf),
1289 80 => bitcastFloatToBigInt(f80, val.toFloat(f80), &field_buf),
1290 128 => bitcastFloatToBigInt(f128, val.toFloat(f128), &field_buf),
1286 16 => bitcastFloatToBigInt(f16, field_val.toFloat(f16), &field_buf),
1287 32 => bitcastFloatToBigInt(f32, field_val.toFloat(f32), &field_buf),
1288 64 => bitcastFloatToBigInt(f64, field_val.toFloat(f64), &field_buf),
1289 80 => bitcastFloatToBigInt(f80, field_val.toFloat(f80), &field_buf),
1290 128 => bitcastFloatToBigInt(f128, field_val.toFloat(f128), &field_buf),
12911291 else => unreachable,
12921292 },
12931293 .Int, .Bool => field_val.toBigInt(&field_space, target),
test/behavior/bitcast.zig+35
......@@ -264,3 +264,38 @@ test "triple level result location with bitcast sandwich passed as tuple element
264264 };
265265 try S.foo(.{@as(f64, @bitCast(f32, @as(u32, 0x414570A4)))});
266266}
267
268test "@bitCast packed struct of floats" {
269 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
270 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
271 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
272 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
273 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
274
275 const Foo = packed struct {
276 a: f16 = 0,
277 b: f32 = 1,
278 c: f64 = 2,
279 d: f128 = 3,
280 };
281
282 const Foo2 = packed struct {
283 a: f16 = 0,
284 b: f32 = 1,
285 c: f64 = 2,
286 d: f128 = 3,
287 };
288
289 const S = struct {
290 fn doTheTest() !void {
291 var foo = Foo{};
292 var v = @bitCast(Foo2, foo);
293 try expect(v.a == foo.a);
294 try expect(v.b == foo.b);
295 try expect(v.c == foo.c);
296 try expect(v.d == foo.d);
297 }
298 };
299 try S.doTheTest();
300 comptime try S.doTheTest();
301}