aboutsummaryrefslogtreecommitdiff
path: root/src/TypedValue.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-06-29 14:26:23 -0400
committerGitHub <noreply@github.com>2022-06-29 14:26:23 -0400
commit98681b2da070755c29065d21d2ffb17be37d9619 (patch)
treecf9592ac47d5fd6d10557be65fb9d38c624728ee /src/TypedValue.zig
parent7cc417644862a9b9523545f4455da7722afc8209 (diff)
parentc3ae909e935f1548408f2e400464370ee02b7e82 (diff)
downloadzig-98681b2da070755c29065d21d2ffb17be37d9619.tar.gz
zig-98681b2da070755c29065d21d2ffb17be37d9619.zip
Merge pull request #11958 from ziglang/store-to-inferred-ptr
stage2: fix miscompilations for peer expressions any time they needed coercions to runtime types
Diffstat (limited to 'src/TypedValue.zig')
-rw-r--r--src/TypedValue.zig62
1 files changed, 55 insertions, 7 deletions
diff --git a/src/TypedValue.zig b/src/TypedValue.zig
index 3c1b28e544..b00600d37a 100644
--- a/src/TypedValue.zig
+++ b/src/TypedValue.zig
@@ -427,15 +427,63 @@ pub fn print(
},
.eu_payload_ptr => {
try writer.writeAll("&");
- val = val.castTag(.eu_payload_ptr).?.data.container_ptr;
- ty = ty.elemType2().errorUnionPayload();
+
+ const data = val.castTag(.eu_payload_ptr).?.data;
+
+ var ty_val: Value.Payload.Ty = .{
+ .base = .{ .tag = .ty },
+ .data = ty,
+ };
+
+ try writer.writeAll("@as(");
+ try print(.{
+ .ty = Type.type,
+ .val = Value.initPayload(&ty_val.base),
+ }, writer, level - 1, mod);
+
+ try writer.writeAll(", &(payload of ");
+
+ var ptr_ty: Type.Payload.ElemType = .{
+ .base = .{ .tag = .single_mut_pointer },
+ .data = data.container_ty,
+ };
+
+ try print(.{
+ .ty = Type.initPayload(&ptr_ty.base),
+ .val = data.container_ptr,
+ }, writer, level - 1, mod);
+
+ try writer.writeAll("))");
+ return;
},
.opt_payload_ptr => {
- try writer.writeAll("&");
- val = val.castTag(.opt_payload).?.data;
- var buf: Type.Payload.ElemType = undefined;
- ty = ty.elemType2().optionalChild(&buf);
- return print(.{ .ty = ty, .val = val }, writer, level, mod);
+ const data = val.castTag(.opt_payload_ptr).?.data;
+
+ var ty_val: Value.Payload.Ty = .{
+ .base = .{ .tag = .ty },
+ .data = ty,
+ };
+
+ try writer.writeAll("@as(");
+ try print(.{
+ .ty = Type.type,
+ .val = Value.initPayload(&ty_val.base),
+ }, writer, level - 1, mod);
+
+ try writer.writeAll(", &(payload of ");
+
+ var ptr_ty: Type.Payload.ElemType = .{
+ .base = .{ .tag = .single_mut_pointer },
+ .data = data.container_ty,
+ };
+
+ try print(.{
+ .ty = Type.initPayload(&ptr_ty.base),
+ .val = data.container_ptr,
+ }, writer, level - 1, mod);
+
+ try writer.writeAll("))");
+ return;
},
// TODO these should not appear in this function