diff --git a/src/Sema.zig b/src/Sema.zig index ea6f4898c5..0d3f7eaf83 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -2566,8 +2566,19 @@ fn zirMergeErrorSets(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Inn const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node }; const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node }; const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node }; - const lhs_ty = try sema.resolveType(block, lhs_src, extra.lhs); - const rhs_ty = try sema.resolveType(block, rhs_src, extra.rhs); + const lhs = try sema.resolveInst(extra.lhs); + const rhs = try sema.resolveInst(extra.rhs); + if (rhs.ty.zigTypeTag() == .Bool and lhs.ty.zigTypeTag() == .Bool) { + const msg = msg: { + const msg = try sema.mod.errMsg(&block.base, lhs_src, "expected error set type, found 'bool'", .{}); + errdefer msg.destroy(sema.gpa); + try sema.mod.errNote(&block.base, src, msg, "'||' merges error sets; 'or' performs boolean OR", .{}); + break :msg msg; + }; + return sema.mod.failWithOwnedErrorMsg(&block.base, msg); + } + const rhs_ty = try sema.resolveAirAsType(block, rhs_src, rhs); + const lhs_ty = try sema.resolveAirAsType(block, lhs_src, lhs); if (rhs_ty.zigTypeTag() != .ErrorSet) return sema.mod.fail(&block.base, rhs_src, "expected error set type, found {}", .{rhs_ty}); if (lhs_ty.zigTypeTag() != .ErrorSet) diff --git a/test/cases.zig b/test/cases.zig index fa66db8e34..cc0b924bb3 100644 --- a/test/cases.zig +++ b/test/cases.zig @@ -1481,6 +1481,15 @@ pub fn addCases(ctx: *TestContext) !void { , "", ); + case.addError( + \\pub fn main() void { + \\ const z = true || false; + \\ _ = z; + \\} + , &.{ + ":2:15: error: expected error set type, found 'bool'", + ":2:20: note: '||' merges error sets; 'or' performs boolean OR", + }); } { var case = ctx.exe("inline assembly", linux_x64);