authorgravatar for jacoblevgw@gmail.comJacob G-W <jacoblevgw@gmail.com> 2021-07-05 20:17:51-04:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-07-06 07:51:30+03:00
log6c11e9bb0798f47e8945182e668854e8b225a788
tree6c266b0e32c091311f1698a43a5788332dc5ad83
parentd089b3df7a3bfe3a6f4c160c27daf77dcdf57dae

stage2: add error note for comparing booleans with '||'


2 files changed, 22 insertions(+), 2 deletions(-)

src/Sema.zig+13-2
...@@ -2566,8 +2566,19 @@ fn zirMergeErrorSets(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Inn...@@ -2566,8 +2566,19 @@ fn zirMergeErrorSets(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Inn
2566 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };2566 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
2567 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };2567 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
2568 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };2568 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
2569 const lhs_ty = try sema.resolveType(block, lhs_src, extra.lhs);2569 const lhs = try sema.resolveInst(extra.lhs);
2570 const rhs_ty = try sema.resolveType(block, rhs_src, extra.rhs);2570 const rhs = try sema.resolveInst(extra.rhs);
2571 if (rhs.ty.zigTypeTag() == .Bool and lhs.ty.zigTypeTag() == .Bool) {
2572 const msg = msg: {
2573 const msg = try sema.mod.errMsg(&block.base, lhs_src, "expected error set type, found 'bool'", .{});
2574 errdefer msg.destroy(sema.gpa);
2575 try sema.mod.errNote(&block.base, src, msg, "'||' merges error sets; 'or' performs boolean OR", .{});
2576 break :msg msg;
2577 };
2578 return sema.mod.failWithOwnedErrorMsg(&block.base, msg);
2579 }
2580 const rhs_ty = try sema.resolveAirAsType(block, rhs_src, rhs);
2581 const lhs_ty = try sema.resolveAirAsType(block, lhs_src, lhs);
2571 if (rhs_ty.zigTypeTag() != .ErrorSet)2582 if (rhs_ty.zigTypeTag() != .ErrorSet)
2572 return sema.mod.fail(&block.base, rhs_src, "expected error set type, found {}", .{rhs_ty});2583 return sema.mod.fail(&block.base, rhs_src, "expected error set type, found {}", .{rhs_ty});
2573 if (lhs_ty.zigTypeTag() != .ErrorSet)2584 if (lhs_ty.zigTypeTag() != .ErrorSet)
test/cases.zig+9
...@@ -1481,6 +1481,15 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -1481,6 +1481,15 @@ pub fn addCases(ctx: *TestContext) !void {
1481 ,1481 ,
1482 "",1482 "",
1483 );1483 );
1484 case.addError(
1485 \\pub fn main() void {
1486 \\ const z = true || false;
1487 \\ _ = z;
1488 \\}
1489 , &.{
1490 ":2:15: error: expected error set type, found 'bool'",
1491 ":2:20: note: '||' merges error sets; 'or' performs boolean OR",
1492 });
1484 }1493 }
1485 {1494 {
1486 var case = ctx.exe("inline assembly", linux_x64);1495 var case = ctx.exe("inline assembly", linux_x64);