From db9ac87b35fe15b803c87d708700215317b0590a Mon Sep 17 00:00:00 2001 From: xdBronch <51252236+xdBronch@users.noreply.github.com> Date: Tue, 2 Jan 2024 20:20:34 -0500 Subject: [PATCH] add missing resolveStructFieldInits --- src/Sema.zig | 12 ++++++++---- test/behavior/tuple.zig | 8 ++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index 0c464a0bc105..939b74bf7544 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -5041,6 +5041,8 @@ fn zirValidatePtrArrayInit( // Determine whether the value stored to this pointer is comptime-known. if (array_ty.isTuple(mod)) { + if (array_ty.structFieldIsComptime(i, mod)) + try sema.resolveStructFieldInits(array_ty); if (try array_ty.structFieldValueComptime(mod, i)) |opv| { element_vals[i] = opv.toIntern(); continue; @@ -27056,6 +27058,8 @@ fn tupleFieldValByIndex( const mod = sema.mod; const field_ty = tuple_ty.structFieldType(field_index, mod); + if (tuple_ty.structFieldIsComptime(field_index, mod)) + try sema.resolveStructFieldInits(tuple_ty); if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_value| { return Air.internedToRef(default_value.toIntern()); } @@ -27075,10 +27079,6 @@ fn tupleFieldValByIndex( }; } - if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_val| { - return Air.internedToRef(default_val.toIntern()); - } - try sema.requireRuntimeBlock(block, src, null); try sema.resolveTypeLayout(field_ty); return block.addStructFieldVal(tuple_byval, field_index, field_ty); @@ -27503,6 +27503,8 @@ fn tupleFieldPtr( }, }); + if (tuple_ty.structFieldIsComptime(field_index, mod)) + try sema.resolveStructFieldInits(tuple_ty); if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_val| { return Air.internedToRef((try mod.intern(.{ .ptr = .{ .ty = ptr_field_ty.toIntern(), @@ -27553,6 +27555,8 @@ fn tupleField( const field_ty = tuple_ty.structFieldType(field_index, mod); + if (tuple_ty.structFieldIsComptime(field_index, mod)) + try sema.resolveStructFieldInits(tuple_ty); if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_value| { return Air.internedToRef(default_value.toIntern()); // comptime field } diff --git a/test/behavior/tuple.zig b/test/behavior/tuple.zig index 039a96d29fe5..303f3b2df5cd 100644 --- a/test/behavior/tuple.zig +++ b/test/behavior/tuple.zig @@ -480,3 +480,11 @@ test "empty tuple type" { const s: S = .{}; try expect(s.len == 0); } + +test "tuple with comptime fields with non empty initializer" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const a: struct { comptime comptime_int = 0 } = .{0}; + _ = a; +}