commit f3c1c0e00ceeb524ca96a653b02b4e9189f1faee (tree)
parent ec13f0409ec8845227c357e1d459e2cc5bfd5b46
Author: Motiejus <motiejus@jakstys.lt>
Date: Mon, 9 Mar 2026 05:04:42 +0000
sema: replace zirStructInitEmptyResult HACK with proper implementation
Port zirStructInitEmptyResult from Sema.zig: resolve the type operand,
handle untyped empty init (return empty_tuple), and for struct types
create an empty aggregate value via ipForceIntern. This replaces the
VOID_VALUE hack that was masking the missing implementation.
No test count change (num_passing=105) — the proper implementation
produces the same results for the callconv(.c) void payload struct.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat:
1 file changed, 27 insertions(+), 10 deletions(-)
diff --git a/stage0/sema.c b/stage0/sema.c
@@ -11609,19 +11609,36 @@ static void zirValidatePtrStructInit(Sema* sema, uint32_t inst) {
}
// --- zirStructInitEmptyResult ---
-// Ported from Sema.zig zirStructInitEmptyResult.
-// For comptime union field init, this initializes the struct field with
-// defaults. Currently a no-op since the actual values are created by
-// validatePtrStructInit.
+// Ported from Sema.zig zirStructInitEmptyResult (non-byref case).
+// Creates an empty struct/array instance with default field values.
static AirInstRef zirStructInitEmptyResult(
Sema* sema, SemaBlock* block, uint32_t inst) {
- (void)sema;
(void)block;
- (void)inst;
- // HACK: return VOID_VALUE in comptime context to allow body
- // evaluation to continue. Proper implementation needs default
- // field value resolution from struct ZIR.
- return AIR_REF_FROM_IP(IP_INDEX_VOID_VALUE);
+ ZirInstRef operand = sema->code.inst_datas[inst].un_node.operand;
+ AirInstRef resolved = resolveInst(sema, operand);
+
+ // Untyped empty init: return empty_tuple.
+ // Ported from Sema.zig: generic poison → .empty_tuple.
+ if (!AIR_REF_IS_IP(resolved))
+ return AIR_REF_FROM_IP(IP_INDEX_EMPTY_TUPLE);
+
+ InternPoolIndex ty_ip = AIR_REF_TO_IP(resolved);
+ if (ty_ip >= sema->ip->items_len)
+ return AIR_REF_FROM_IP(IP_INDEX_EMPTY_TUPLE);
+
+ // For struct types: create an empty aggregate (all default values).
+ // Ported from Sema.zig structInitEmpty → finishStructInit.
+ if (sema->ip->items[ty_ip].tag == IP_KEY_STRUCT_TYPE) {
+ InternPoolKey key;
+ memset(&key, 0, sizeof(key));
+ key.tag = IP_KEY_AGGREGATE;
+ key.data.aggregate = ty_ip;
+ InternPoolIndex agg = ipForceIntern(sema->ip, key);
+ return AIR_REF_FROM_IP(agg);
+ }
+
+ SEMA_FAIL("zirStructInitEmptyResult: unsupported type");
+ return AIR_REF_FROM_IP(IP_INDEX_VOID_VALUE); // unreachable
}
// --- zirRetPtr ---