diff --git a/src/Sema.zig b/src/Sema.zig index 655fc4bd06..134e569948 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -1983,9 +1983,23 @@ fn zirIntToEnum(sema: *Sema, block: *Scope.Block, inst: zir.Inst.Index) InnerErr if (try sema.resolveDefinedValue(block, operand_src, operand)) |int_val| { if (!dest_ty.enumHasInt(int_val, target)) { - return mod.fail(&block.base, src, "enum '{}' has no tag with value {}", .{ - dest_ty, int_val, - }); + const msg = msg: { + const msg = try mod.errMsg( + &block.base, + src, + "enum '{}' has no tag with value {}", + .{ dest_ty, int_val }, + ); + errdefer msg.destroy(sema.gpa); + try mod.errNoteNonLazy( + dest_ty.declSrcLoc(), + msg, + "enum declared here", + .{}, + ); + break :msg msg; + }; + return mod.failWithOwnedErrorMsg(&block.base, msg); } return mod.constInst(arena, src, .{ .ty = dest_ty, diff --git a/test/stage2/cbe.zig b/test/stage2/cbe.zig index 49a0ca686b..b0386f6246 100644 --- a/test/stage2/cbe.zig +++ b/test/stage2/cbe.zig @@ -674,6 +674,34 @@ pub fn addCases(ctx: *TestContext) !void { ":1:28: error: duplicate enum tag", ":1:22: note: other tag here", }); + + case.addError( + \\export fn foo() void { + \\ const a = true; + \\ const b = @enumToInt(a); + \\} + , &.{ + ":3:26: error: expected enum or tagged union, found bool", + }); + + case.addError( + \\export fn foo() void { + \\ const a = 1; + \\ const b = @intToEnum(bool, a); + \\} + , &.{ + ":3:26: error: expected enum, found bool", + }); + + case.addError( + \\const E = enum { a, b, c }; + \\export fn foo() void { + \\ const b = @intToEnum(E, 3); + \\} + , &.{ + ":3:15: error: enum 'E' has no tag with value 3", + ":1:11: note: enum declared here", + }); } ctx.c("empty start function", linux_x64,