aboutsummaryrefslogtreecommitdiff
path: root/src/TypedValue.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-10-03 11:20:08 -0700
committerGitHub <noreply@github.com>2023-10-03 11:20:08 -0700
commit87d09edf2d328b21e02abb233899ebaa257a5204 (patch)
treec43c0688ff29c2f488d78dc39cf304d2c2c50a2e /src/TypedValue.zig
parentc933a7c58c6685f65da26e7c4cc826a32c3d1e43 (diff)
parent1b8a50ea5e9a179bf85486230d6b058d1379a4aa (diff)
downloadzig-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.zig24
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(" }");