authorgravatar for 51252236+xdBronch@users.noreply.github.comxdBronch <51252236+xdBronch@users.noreply.github.com> 2024-01-02 20:20:34-05:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2024-01-03 11:05:25+02:00
logd03649ec2f42c6b967f7113e78aa137de5384c1a
treec2fca76f7f642b942f4076faf1ba64ccb3fb50b3
parentca4ee9ae73559062da24937ef4a7376d9d27bbeb

add missing resolveStructFieldInits


2 files changed, 16 insertions(+), 4 deletions(-)

src/Sema.zig+8-4
......@@ -5041,6 +5041,8 @@ fn zirValidatePtrArrayInit(
50415041 // Determine whether the value stored to this pointer is comptime-known.
50425042
50435043 if (array_ty.isTuple(mod)) {
5044 if (array_ty.structFieldIsComptime(i, mod))
5045 try sema.resolveStructFieldInits(array_ty);
50445046 if (try array_ty.structFieldValueComptime(mod, i)) |opv| {
50455047 element_vals[i] = opv.toIntern();
50465048 continue;
......@@ -27059,6 +27061,8 @@ fn tupleFieldValByIndex(
2705927061 const mod = sema.mod;
2706027062 const field_ty = tuple_ty.structFieldType(field_index, mod);
2706127063
27064 if (tuple_ty.structFieldIsComptime(field_index, mod))
27065 try sema.resolveStructFieldInits(tuple_ty);
2706227066 if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_value| {
2706327067 return Air.internedToRef(default_value.toIntern());
2706427068 }
......@@ -27078,10 +27082,6 @@ fn tupleFieldValByIndex(
2707827082 };
2707927083 }
2708027084
27081 if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_val| {
27082 return Air.internedToRef(default_val.toIntern());
27083 }
27084
2708527085 try sema.requireRuntimeBlock(block, src, null);
2708627086 try sema.resolveTypeLayout(field_ty);
2708727087 return block.addStructFieldVal(tuple_byval, field_index, field_ty);
......@@ -27506,6 +27506,8 @@ fn tupleFieldPtr(
2750627506 },
2750727507 });
2750827508
27509 if (tuple_ty.structFieldIsComptime(field_index, mod))
27510 try sema.resolveStructFieldInits(tuple_ty);
2750927511 if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_val| {
2751027512 return Air.internedToRef((try mod.intern(.{ .ptr = .{
2751127513 .ty = ptr_field_ty.toIntern(),
......@@ -27556,6 +27558,8 @@ fn tupleField(
2755627558
2755727559 const field_ty = tuple_ty.structFieldType(field_index, mod);
2755827560
27561 if (tuple_ty.structFieldIsComptime(field_index, mod))
27562 try sema.resolveStructFieldInits(tuple_ty);
2755927563 if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_value| {
2756027564 return Air.internedToRef(default_value.toIntern()); // comptime field
2756127565 }
test/behavior/tuple.zig+8
......@@ -480,3 +480,11 @@ test "empty tuple type" {
480480 const s: S = .{};
481481 try expect(s.len == 0);
482482}
483
484test "tuple with comptime fields with non empty initializer" {
485 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
486 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
487
488 const a: struct { comptime comptime_int = 0 } = .{0};
489 _ = a;
490}