authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-01-21 23:28:18+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-01-22 01:04:20+02:00
loga28fbf3132b0b12841ecd70518804123149f3ac0
treeed19ef9100cb3123542a102a0782a2d885589ade
parent1f475de852daddbf88e8165cdaef492e616ce3fe

Sema: fix error message for bad pointer arithmetic

Closes #14388

1 files changed, 10 insertions(+), 16 deletions(-)

src/Sema.zig+10-16
......@@ -12800,7 +12800,7 @@ fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
1280012800 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
1280112801 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
1280212802 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);
12803 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty, .div);
12803 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty);
1280412804
1280512805 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
1280612806 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{
......@@ -12960,7 +12960,7 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1296012960 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
1296112961 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
1296212962 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);
12963 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty, .div_exact);
12963 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty);
1296412964
1296512965 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
1296612966 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{
......@@ -13123,7 +13123,7 @@ fn zirDivFloor(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1312313123 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
1312413124 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
1312513125 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);
13126 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty, .div_floor);
13126 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty);
1312713127
1312813128 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
1312913129 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{
......@@ -13239,7 +13239,7 @@ fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1323913239 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
1324013240 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
1324113241 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);
13242 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty, .div_trunc);
13242 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty);
1324313243
1324413244 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
1324513245 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{
......@@ -13482,7 +13482,7 @@ fn zirModRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.
1348213482 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
1348313483 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
1348413484 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);
13485 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty, .mod_rem);
13485 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty);
1348613486
1348713487 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
1348813488 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{
......@@ -13665,7 +13665,7 @@ fn zirMod(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
1366513665 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
1366613666 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
1366713667 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);
13668 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty, .mod);
13668 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty);
1366913669
1367013670 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
1367113671 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{
......@@ -13767,7 +13767,7 @@ fn zirRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
1376713767 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
1376813768 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
1376913769 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);
13770 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty, .rem);
13770 try sema.checkInvalidPtrArithmetic(block, src, lhs_ty);
1377113771
1377213772 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
1377313773 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{
......@@ -14107,12 +14107,7 @@ fn analyzeArithmetic(
1410714107 const air_tag: Air.Inst.Tag = switch (zir_tag) {
1410814108 .add => .ptr_add,
1410914109 .sub => .ptr_sub,
14110 else => return sema.fail(
14111 block,
14112 src,
14113 "invalid pointer arithmetic operand: '{s}''",
14114 .{@tagName(zir_tag)},
14115 ),
14110 else => return sema.fail(block, src, "invalid pointer arithmetic operator", .{}),
1411614111 };
1411714112 return sema.analyzePtrArithmetic(block, src, lhs, rhs, air_tag, lhs_src, rhs_src);
1411814113 },
......@@ -20029,7 +20024,6 @@ fn checkInvalidPtrArithmetic(
2002920024 block: *Block,
2003020025 src: LazySrcLoc,
2003120026 ty: Type,
20032 zir_tag: Zir.Inst.Tag,
2003320027) CompileError!void {
2003420028 switch (try ty.zigTypeTagOrPoison()) {
2003520029 .Pointer => switch (ty.ptrSize()) {
......@@ -20037,8 +20031,8 @@ fn checkInvalidPtrArithmetic(
2003720031 .Many, .C => return sema.fail(
2003820032 block,
2003920033 src,
20040 "invalid pointer arithmetic operand: '{s}''",
20041 .{@tagName(zir_tag)},
20034 "invalid pointer arithmetic operator",
20035 .{},
2004220036 ),
2004320037 },
2004420038 else => return,