Commit d03649ec2f
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
}
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;
+}