zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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:
Mstage0/sema.c | 37+++++++++++++++++++++++++++----------
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 ---