| ... | ... | @@ -1589,6 +1589,21 @@ fn errNote( |
| 1589 | 1589 | return sema.mod.errNoteNonLazy(src.toSrcLoc(block.src_decl), parent, format, args); |
| 1590 | 1590 | } |
| 1591 | 1591 | |
| 1592 | fn addFieldErrNote( |
| 1593 | sema: *Sema, |
| 1594 | block: *Block, |
| 1595 | container_ty: Type, |
| 1596 | field_index: usize, |
| 1597 | parent: *Module.ErrorMsg, |
| 1598 | comptime format: []const u8, |
| 1599 | args: anytype, |
| 1600 | ) !void { |
| 1601 | const decl = container_ty.getOwnerDecl(); |
| 1602 | const tree = try sema.getAstTree(block); |
| 1603 | const field_src = enumFieldSrcLoc(decl, tree.*, container_ty.getNodeOffset(), field_index); |
| 1604 | try sema.mod.errNoteNonLazy(field_src.toSrcLoc(decl), parent, format, args); |
| 1605 | } |
| 1606 | |
| 1592 | 1607 | fn errMsg( |
| 1593 | 1608 | sema: *Sema, |
| 1594 | 1609 | block: *Block, |
| ... | ... | @@ -19603,10 +19618,7 @@ fn coerceEnumToUnion( |
| 19603 | 19618 | }); |
| 19604 | 19619 | errdefer msg.destroy(sema.gpa); |
| 19605 | 19620 | |
| 19606 | | const tree = try sema.getAstTree(block); |
| 19607 | | const union_decl = union_obj.owner_decl; |
| 19608 | | const field_src = enumFieldSrcLoc(union_decl, tree.*, union_obj.node_offset, field_index); |
| 19609 | | try sema.mod.errNoteNonLazy(field_src.toSrcLoc(union_decl), msg, "field '{s}' declared here", .{field_name}); |
| 19621 | try sema.addFieldErrNote(block, union_ty, field_index, msg, "field '{s}' declared here", .{field_name}); |
| 19610 | 19622 | try sema.addDeclaredHereNote(msg, union_ty); |
| 19611 | 19623 | break :msg msg; |
| 19612 | 19624 | }; |
| ... | ... | @@ -19648,15 +19660,12 @@ fn coerceEnumToUnion( |
| 19648 | 19660 | ); |
| 19649 | 19661 | errdefer msg.destroy(sema.gpa); |
| 19650 | 19662 | |
| 19651 | | const tree = try sema.getAstTree(block); |
| 19652 | | const union_decl = union_obj.owner_decl; |
| 19653 | 19663 | var it = union_obj.fields.iterator(); |
| 19654 | 19664 | var field_index: usize = 0; |
| 19655 | 19665 | while (it.next()) |field| { |
| 19656 | 19666 | const field_name = field.key_ptr.*; |
| 19657 | 19667 | const field_ty = field.value_ptr.ty; |
| 19658 | | const field_src = enumFieldSrcLoc(union_decl, tree.*, union_obj.node_offset, field_index); |
| 19659 | | try sema.mod.errNoteNonLazy(field_src.toSrcLoc(union_decl), msg, "field '{s}' has type '{}'", .{ field_name, field_ty.fmt(target) }); |
| 19668 | try sema.addFieldErrNote(block, union_ty, field_index, msg, "field '{s}' has type '{}'", .{ field_name, field_ty.fmt(target) }); |
| 19660 | 19669 | field_index += 1; |
| 19661 | 19670 | } |
| 19662 | 19671 | try sema.addDeclaredHereNote(msg, union_ty); |
| ... | ... | @@ -22229,12 +22238,9 @@ fn semaUnionFields(block: *Block, mod: *Module, union_obj: *Module.Union) Compil |
| 22229 | 22238 | errdefer msg.destroy(sema.gpa); |
| 22230 | 22239 | |
| 22231 | 22240 | const enum_ty = union_obj.tag_ty; |
| 22232 | | const tree = try sema.getAstTree(block); |
| 22233 | | const enum_decl = enum_ty.getOwnerDecl(); |
| 22234 | 22241 | for (names.keys()) |field_name| { |
| 22235 | 22242 | const field_index = enum_ty.enumFieldIndex(field_name).?; |
| 22236 | | const field_src = enumFieldSrcLoc(enum_decl, tree.*, enum_ty.getNodeOffset(), field_index); |
| 22237 | | try sema.mod.errNoteNonLazy(field_src.toSrcLoc(enum_decl), msg, "field '{s}' missing, declared here", .{field_name}); |
| 22243 | try sema.addFieldErrNote(block, enum_ty, field_index, msg, "field '{s}' missing, declared here", .{field_name}); |
| 22238 | 22244 | } |
| 22239 | 22245 | try sema.addDeclaredHereNote(msg, union_obj.tag_ty); |
| 22240 | 22246 | break :msg msg; |