diff options
| author | Bogdan Romanyuk <65823030+wrongnull@users.noreply.github.com> | 2023-11-25 17:05:51 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-25 14:05:51 +0000 |
| commit | bece97ef248ad36d31a48fb761b4a41324c9c5d5 (patch) | |
| tree | 14a254df83aa69e8296270e13df68753fca57c02 /src/Sema.zig | |
| parent | 2fefc0b5c7618012916e75e3058b381cf48f0ebb (diff) | |
| download | zig-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.zig | 35 |
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, }; |
