diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-06-29 14:26:23 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-29 14:26:23 -0400 |
| commit | 98681b2da070755c29065d21d2ffb17be37d9619 (patch) | |
| tree | cf9592ac47d5fd6d10557be65fb9d38c624728ee /src/TypedValue.zig | |
| parent | 7cc417644862a9b9523545f4455da7722afc8209 (diff) | |
| parent | c3ae909e935f1548408f2e400464370ee02b7e82 (diff) | |
| download | zig-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.zig | 62 |
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 |
