| author | |
| committer | |
| log | 69e2cac0d349cc32d4ead73541e18d1f72aac729 |
| tree | e08b30f281d484820df914b11d99d276ab98d80e |
| parent | d506275a06dd5e9ad8be63f9e44abb7d8bea88b3 |
| signature |
2 files changed, 40 insertions(+), 5 deletions(-)
src/value.zig+5-5| ... | ... | @@ -1283,11 +1283,11 @@ pub const Value = extern union { |
| 1283 | 1283 | const field_val = field_vals[i]; |
| 1284 | 1284 | const field_bigint_const = switch (field.ty.zigTypeTag()) { |
| 1285 | 1285 | .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), | |
| 1291 | 1291 | else => unreachable, |
| 1292 | 1292 | }, |
| 1293 | 1293 | .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 |
| 264 | 264 | }; |
| 265 | 265 | try S.foo(.{@as(f64, @bitCast(f32, @as(u32, 0x414570A4)))}); |
| 266 | 266 | } |
| 267 | ||
| 268 | test "@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 | } |