diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2023-10-03 11:20:08 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-03 11:20:08 -0700 |
| commit | 87d09edf2d328b21e02abb233899ebaa257a5204 (patch) | |
| tree | c43c0688ff29c2f488d78dc39cf304d2c2c50a2e /src/TypedValue.zig | |
| parent | c933a7c58c6685f65da26e7c4cc826a32c3d1e43 (diff) | |
| parent | 1b8a50ea5e9a179bf85486230d6b058d1379a4aa (diff) | |
| download | zig-87d09edf2d328b21e02abb233899ebaa257a5204.tar.gz zig-87d09edf2d328b21e02abb233899ebaa257a5204.zip | |
Merge pull request #17352 from kcbanner/extern_union_comptime_memory
sema: Support reinterpreting extern/packed unions at comptime via field access
Diffstat (limited to 'src/TypedValue.zig')
| -rw-r--r-- | src/TypedValue.zig | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/TypedValue.zig b/src/TypedValue.zig index cf705cdf89..cef22543a3 100644 --- a/src/TypedValue.zig +++ b/src/TypedValue.zig @@ -84,22 +84,27 @@ pub fn print( if (level == 0) { return writer.writeAll(".{ ... }"); } - const union_val = val.castTag(.@"union").?.data; + const payload = val.castTag(.@"union").?.data; try writer.writeAll(".{ "); - if (union_val.tag.toIntern() != .none) { + if (payload.tag) |tag| { try print(.{ .ty = ip.indexToKey(ty.toIntern()).union_type.enum_tag_ty.toType(), - .val = union_val.tag, + .val = tag, }, writer, level - 1, mod); try writer.writeAll(" = "); - const field_ty = ty.unionFieldType(union_val.tag, mod).?; + const field_ty = ty.unionFieldType(tag, mod).?; try print(.{ .ty = field_ty, - .val = union_val.val, + .val = payload.val, }, writer, level - 1, mod); } else { - return writer.writeAll("(unknown tag)"); + try writer.writeAll("(unknown tag) = "); + const backing_ty = try ty.unionBackingType(mod); + try print(.{ + .ty = backing_ty, + .val = payload.val, + }, writer, level - 1, mod); } return writer.writeAll(" }"); @@ -421,7 +426,12 @@ pub fn print( .val = un.val.toValue(), }, writer, level - 1, mod); } else { - try writer.writeAll("(unknown tag)"); + try writer.writeAll("(unknown tag) = "); + const backing_ty = try ty.unionBackingType(mod); + try print(.{ + .ty = backing_ty, + .val = un.val.toValue(), + }, writer, level - 1, mod); } } else try writer.writeAll("..."); return writer.writeAll(" }"); |
