zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 61ba225709b88579984a1a679021d121d1aada64 (tree)
parent bea958df4d0c5fc38633f09b6490c16e24a03155
Author: Krzysztof Wolicki <der.teufel.mail@gmail.com>
Date:   Fri, 26 Jan 2024 14:22:15 +0100

Sema: tuples have no names to be used for reporting errors in finishStructInit


Diffstat:
Msrc/Sema.zig | 21+++++++++++++++------
Mtest/cases/compile_errors/missing_field_in_struct_value_expression.zig | 14++++++++++++++
2 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -19963,13 +19963,22 @@ fn finishStructInit( const field_init = struct_type.fieldInit(ip, i); if (field_init == .none) { - const field_name = struct_type.field_names.get(ip)[i]; - const template = "missing struct field: {}"; - const args = .{field_name.fmt(ip)}; - if (root_msg) |msg| { - try sema.errNote(block, init_src, msg, template, args); + if (!struct_type.isTuple(ip)) { + const field_name = struct_type.field_names.get(ip)[i]; + const template = "missing struct field: {}"; + const args = .{field_name.fmt(ip)}; + if (root_msg) |msg| { + try sema.errNote(block, init_src, msg, template, args); + } else { + root_msg = try sema.errMsg(block, init_src, template, args); + } } else { - root_msg = try sema.errMsg(block, init_src, template, args); + const template = "missing tuple field with index {d}"; + if (root_msg) |msg| { + try sema.errNote(block, init_src, msg, template, .{i}); + } else { + root_msg = try sema.errMsg(block, init_src, template, .{i}); + } } } else { field_inits[i] = Air.internedToRef(field_init); diff --git a/test/cases/compile_errors/missing_field_in_struct_value_expression.zig b/test/cases/compile_errors/missing_field_in_struct_value_expression.zig @@ -13,9 +13,23 @@ export fn f() void { _ = a; } +const B = struct { u32, u32 }; +export fn g() void { + const b = B{0}; + _ = b; +} +export fn h() void { + const c = B{}; + _ = c; +} // error // backend=stage2 // target=native // // :9:16: error: missing struct field: x // :1:11: note: struct 'tmp.A' declared here +// :18:16: error: missing tuple field with index 1 +// :16:11: note: struct declared here +// :22:16: error: missing tuple field with index 0 +// :22:16: note: missing tuple field with index 1 +// :16:11: note: struct 'tmp.B' declared here