authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-19 22:24:29-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-06-10 20:47:53-07:00
logf8b6eb63d53bba303a200a5c2493c5d5bddd1f66
tree1ffdd032e4b7ddaa16aca6a96292abe946cdfbb2
parentd28fc5bacb2b27ba3f2a5ed17475b9b790be3ed5

Sema: add coerceTupleToStruct result to the InternPool


1 files changed, 13 insertions(+), 7 deletions(-)

src/Sema.zig+13-7
...@@ -28986,7 +28986,7 @@ fn coerceTupleToStruct(...@@ -28986,7 +28986,7 @@ fn coerceTupleToStruct(
28986 }28986 }
2898728987
28988 const fields = struct_ty.structFields(mod);28988 const fields = struct_ty.structFields(mod);
28989 const field_vals = try sema.arena.alloc(Value, fields.count());28989 const field_vals = try sema.arena.alloc(InternPool.Index, fields.count());
28990 const field_refs = try sema.arena.alloc(Air.Inst.Ref, field_vals.len);28990 const field_refs = try sema.arena.alloc(Air.Inst.Ref, field_vals.len);
28991 @memset(field_refs, .none);28991 @memset(field_refs, .none);
2899228992
...@@ -29017,7 +29017,8 @@ fn coerceTupleToStruct(...@@ -29017,7 +29017,8 @@ fn coerceTupleToStruct(
29017 }29017 }
29018 if (runtime_src == null) {29018 if (runtime_src == null) {
29019 if (try sema.resolveMaybeUndefVal(coerced)) |field_val| {29019 if (try sema.resolveMaybeUndefVal(coerced)) |field_val| {
29020 field_vals[field_index] = field_val;29020 assert(field_val.ip_index != .none);
29021 field_vals[field_index] = field_val.ip_index;
29021 } else {29022 } else {
29022 runtime_src = field_src;29023 runtime_src = field_src;
29023 }29024 }
...@@ -29045,7 +29046,8 @@ fn coerceTupleToStruct(...@@ -29045,7 +29046,8 @@ fn coerceTupleToStruct(
29045 continue;29046 continue;
29046 }29047 }
29047 if (runtime_src == null) {29048 if (runtime_src == null) {
29048 field_vals[i] = field.default_val;29049 assert(field.default_val.ip_index != .none);
29050 field_vals[i] = field.default_val.ip_index;
29049 } else {29051 } else {
29050 field_ref.* = try sema.addConstant(field.ty, field.default_val);29052 field_ref.* = try sema.addConstant(field.ty, field.default_val);
29051 }29053 }
...@@ -29062,10 +29064,14 @@ fn coerceTupleToStruct(...@@ -29062,10 +29064,14 @@ fn coerceTupleToStruct(
29062 return block.addAggregateInit(struct_ty, field_refs);29064 return block.addAggregateInit(struct_ty, field_refs);
29063 }29065 }
2906429066
29065 return sema.addConstant(29067 assert(struct_ty.ip_index != .none);
29066 struct_ty,29068 const struct_val = try mod.intern(.{ .aggregate = .{
29067 try Value.Tag.aggregate.create(sema.arena, field_vals),29069 .ty = struct_ty.ip_index,
29068 );29070 .storage = .{ .elems = field_vals },
29071 } });
29072 errdefer mod.intern_pool.remove(struct_val);
29073
29074 return sema.addConstant(struct_ty, struct_val.toValue());
29069}29075}
2907029076
29071fn coerceTupleToTuple(29077fn coerceTupleToTuple(