aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorBogdan Romanyuk <65823030+wrongnull@users.noreply.github.com>2023-11-25 17:05:51 +0300
committerGitHub <noreply@github.com>2023-11-25 14:05:51 +0000
commitbece97ef248ad36d31a48fb761b4a41324c9c5d5 (patch)
tree14a254df83aa69e8296270e13df68753fca57c02 /src/Sema.zig
parent2fefc0b5c7618012916e75e3058b381cf48f0ebb (diff)
downloadzig-bece97ef248ad36d31a48fb761b4a41324c9c5d5.tar.gz
zig-bece97ef248ad36d31a48fb761b4a41324c9c5d5.zip
Sema: ensure tuple fields is resolved and fix internal out-of-bounds access
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig35
1 files changed, 21 insertions, 14 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index d3b80adf41..87790dbdb1 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -19705,20 +19705,24 @@ fn zirArrayInit(
},
else => return err,
};
- if (is_tuple) if (try array_ty.structFieldValueComptime(mod, i)) |field_val| {
- const init_val = try sema.resolveValue(dest.*) orelse {
- const decl = mod.declPtr(block.src_decl);
- const elem_src = mod.initSrc(src.node_offset.x, decl, i);
- return sema.failWithNeededComptime(block, elem_src, .{
- .needed_comptime_reason = "value stored in comptime field must be comptime-known",
- });
- };
- if (!field_val.eql(init_val, elem_ty, mod)) {
- const decl = mod.declPtr(block.src_decl);
- const elem_src = mod.initSrc(src.node_offset.x, decl, i);
- return sema.failWithInvalidComptimeFieldStore(block, elem_src, array_ty, i);
+ if (is_tuple) {
+ if (array_ty.structFieldIsComptime(i, mod))
+ try sema.resolveStructFieldInits(array_ty);
+ if (try array_ty.structFieldValueComptime(mod, i)) |field_val| {
+ const init_val = try sema.resolveValue(dest.*) orelse {
+ const decl = mod.declPtr(block.src_decl);
+ const elem_src = mod.initSrc(src.node_offset.x, decl, i);
+ return sema.failWithNeededComptime(block, elem_src, .{
+ .needed_comptime_reason = "value stored in comptime field must be comptime-known",
+ });
+ };
+ if (!field_val.eql(init_val, elem_ty, mod)) {
+ const decl = mod.declPtr(block.src_decl);
+ const elem_src = mod.initSrc(src.node_offset.x, decl, i);
+ return sema.failWithInvalidComptimeFieldStore(block, elem_src, array_ty, i);
+ }
}
- };
+ }
}
if (root_msg) |msg| {
@@ -31481,7 +31485,10 @@ fn coerceTupleToTuple(
anon_struct_type.names.get(ip)[field_i]
else
try ip.getOrPutStringFmt(sema.gpa, "{d}", .{field_i}),
- .struct_type => |struct_type| struct_type.field_names.get(ip)[field_i],
+ .struct_type => |struct_type| if (struct_type.field_names.len > 0)
+ struct_type.field_names.get(ip)[field_i]
+ else
+ try ip.getOrPutStringFmt(sema.gpa, "{d}", .{field_i}),
else => unreachable,
};