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(...@@ -5041,6 +5041,8 @@ fn zirValidatePtrArrayInit(
5041 // Determine whether the value stored to this pointer is comptime-known.5041 // Determine whether the value stored to this pointer is comptime-known.
50425042
5043 if (array_ty.isTuple(mod)) {5043 if (array_ty.isTuple(mod)) {
5044 if (array_ty.structFieldIsComptime(i, mod))
5045 try sema.resolveStructFieldInits(array_ty);
5044 if (try array_ty.structFieldValueComptime(mod, i)) |opv| {5046 if (try array_ty.structFieldValueComptime(mod, i)) |opv| {
5045 element_vals[i] = opv.toIntern();5047 element_vals[i] = opv.toIntern();
5046 continue;5048 continue;
...@@ -27059,6 +27061,8 @@ fn tupleFieldValByIndex(...@@ -27059,6 +27061,8 @@ fn tupleFieldValByIndex(
27059 const mod = sema.mod;27061 const mod = sema.mod;
27060 const field_ty = tuple_ty.structFieldType(field_index, mod);27062 const field_ty = tuple_ty.structFieldType(field_index, mod);
2706127063
27064 if (tuple_ty.structFieldIsComptime(field_index, mod))
27065 try sema.resolveStructFieldInits(tuple_ty);
27062 if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_value| {27066 if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_value| {
27063 return Air.internedToRef(default_value.toIntern());27067 return Air.internedToRef(default_value.toIntern());
27064 }27068 }
...@@ -27078,10 +27082,6 @@ fn tupleFieldValByIndex(...@@ -27078,10 +27082,6 @@ fn tupleFieldValByIndex(
27078 };27082 };
27079 }27083 }
2708027084
27081 if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_val| {
27082 return Air.internedToRef(default_val.toIntern());
27083 }
27084
27085 try sema.requireRuntimeBlock(block, src, null);27085 try sema.requireRuntimeBlock(block, src, null);
27086 try sema.resolveTypeLayout(field_ty);27086 try sema.resolveTypeLayout(field_ty);
27087 return block.addStructFieldVal(tuple_byval, field_index, field_ty);27087 return block.addStructFieldVal(tuple_byval, field_index, field_ty);
...@@ -27506,6 +27506,8 @@ fn tupleFieldPtr(...@@ -27506,6 +27506,8 @@ fn tupleFieldPtr(
27506 },27506 },
27507 });27507 });
2750827508
27509 if (tuple_ty.structFieldIsComptime(field_index, mod))
27510 try sema.resolveStructFieldInits(tuple_ty);
27509 if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_val| {27511 if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_val| {
27510 return Air.internedToRef((try mod.intern(.{ .ptr = .{27512 return Air.internedToRef((try mod.intern(.{ .ptr = .{
27511 .ty = ptr_field_ty.toIntern(),27513 .ty = ptr_field_ty.toIntern(),
...@@ -27556,6 +27558,8 @@ fn tupleField(...@@ -27556,6 +27558,8 @@ fn tupleField(
2755627558
27557 const field_ty = tuple_ty.structFieldType(field_index, mod);27559 const field_ty = tuple_ty.structFieldType(field_index, mod);
2755827560
27561 if (tuple_ty.structFieldIsComptime(field_index, mod))
27562 try sema.resolveStructFieldInits(tuple_ty);
27559 if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_value| {27563 if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_value| {
27560 return Air.internedToRef(default_value.toIntern()); // comptime field27564 return Air.internedToRef(default_value.toIntern()); // comptime field
27561 }27565 }
test/behavior/tuple.zig+8
...@@ -480,3 +480,11 @@ test "empty tuple type" {...@@ -480,3 +480,11 @@ test "empty tuple type" {
480 const s: S = .{};480 const s: S = .{};
481 try expect(s.len == 0);481 try expect(s.len == 0);
482}482}
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}