aboutsummaryrefslogtreecommitdiff
path: root/src/value.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-07-14 16:48:44 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-07-14 16:48:44 -0700
commit667ad9250f7250670778beedcebc45f5c0284446 (patch)
tree76ac3d73766d13be52afa570111e4071d8d19cf9 /src/value.zig
parent1653a9b2597c66cbcc88ea75d8a4b88c163584a5 (diff)
downloadzig-667ad9250f7250670778beedcebc45f5c0284446.tar.gz
zig-667ad9250f7250670778beedcebc45f5c0284446.zip
Sema: fix coerce_result_ptr in case of inferred result type
Previously, the logic for analyzing coerce_result_ptr would generate invalid bitcast instructions which did not include coercion logic, such as optional wrapping, resulting in miscompilations. Now, the logic of resolve_inferred_alloc goes back over all the placeholders inserted by coerce_result_ptr, and replaces them with logic doing the proper coercions. Closes #12045
Diffstat (limited to 'src/value.zig')
-rw-r--r--src/value.zig11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/value.zig b/src/value.zig
index b52e67e31c..46624a822d 100644
--- a/src/value.zig
+++ b/src/value.zig
@@ -4935,7 +4935,16 @@ pub const Value = extern union {
/// peer type resolution. This is stored in a separate list so that
/// the items are contiguous in memory and thus can be passed to
/// `Module.resolvePeerTypes`.
- stored_inst_list: std.ArrayListUnmanaged(Air.Inst.Ref) = .{},
+ prongs: std.MultiArrayList(struct {
+ /// The dummy instruction used as a peer to resolve the type.
+ /// Although this has a redundant type with placeholder, this is
+ /// needed in addition because it may be a constant value, which
+ /// affects peer type resolution.
+ stored_inst: Air.Inst.Ref,
+ /// The bitcast instruction used as a placeholder when the
+ /// new result pointer type is not yet known.
+ placeholder: Air.Inst.Index,
+ }) = .{},
/// 0 means ABI-aligned.
alignment: u32,
},