diff --git a/src/Sema.zig b/src/Sema.zig index c0b6f3678a..c6648b3d90 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; @@ -27059,6 +27061,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()); } @@ -27078,10 +27082,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); @@ -27506,6 +27506,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(), @@ -27556,6 +27558,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 039a96d29f..303f3b2df5 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; +}