add missing resolveStructFieldInits

This commit is contained in:
xdBronch 2024-01-02 20:20:34 -05:00 committed by Veikka Tuominen
parent ca4ee9ae73
commit d03649ec2f
2 changed files with 16 additions and 4 deletions

View File

@ -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
}

View File

@ -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;
}