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...@@ -12800,7 +12800,7 @@ fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
12800 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();12800 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
12801 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();12801 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
12802 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);12802 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
12805 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };12805 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
12806 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{12806 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...@@ -12960,7 +12960,7 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
12960 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();12960 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
12961 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();12961 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
12962 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);12962 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
12965 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };12965 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
12966 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{12966 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...@@ -13123,7 +13123,7 @@ fn zirDivFloor(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
13123 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();13123 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
13124 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();13124 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
13125 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);13125 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
13128 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };13128 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
13129 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{13129 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...@@ -13239,7 +13239,7 @@ fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
13239 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();13239 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
13240 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();13240 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
13241 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);13241 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
13244 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };13244 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
13245 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{13245 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....@@ -13482,7 +13482,7 @@ fn zirModRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.
13482 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();13482 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
13483 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();13483 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
13484 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);13484 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
13487 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };13487 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
13488 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{13488 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...@@ -13665,7 +13665,7 @@ fn zirMod(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
13665 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();13665 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
13666 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();13666 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
13667 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);13667 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
13670 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };13670 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
13671 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{13671 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...@@ -13767,7 +13767,7 @@ fn zirRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
13767 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();13767 const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison();
13768 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();13768 const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison();
13769 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);13769 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
13772 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };13772 const instructions = &[_]Air.Inst.Ref{ lhs, rhs };
13773 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{13773 const resolved_type = try sema.resolvePeerTypes(block, src, instructions, .{
...@@ -14107,12 +14107,7 @@ fn analyzeArithmetic(...@@ -14107,12 +14107,7 @@ fn analyzeArithmetic(
14107 const air_tag: Air.Inst.Tag = switch (zir_tag) {14107 const air_tag: Air.Inst.Tag = switch (zir_tag) {
14108 .add => .ptr_add,14108 .add => .ptr_add,
14109 .sub => .ptr_sub,14109 .sub => .ptr_sub,
14110 else => return sema.fail(14110 else => return sema.fail(block, src, "invalid pointer arithmetic operator", .{}),
14111 block,
14112 src,
14113 "invalid pointer arithmetic operand: '{s}''",
14114 .{@tagName(zir_tag)},
14115 ),
14116 };14111 };
14117 return sema.analyzePtrArithmetic(block, src, lhs, rhs, air_tag, lhs_src, rhs_src);14112 return sema.analyzePtrArithmetic(block, src, lhs, rhs, air_tag, lhs_src, rhs_src);
14118 },14113 },
...@@ -20029,7 +20024,6 @@ fn checkInvalidPtrArithmetic(...@@ -20029,7 +20024,6 @@ fn checkInvalidPtrArithmetic(
20029 block: *Block,20024 block: *Block,
20030 src: LazySrcLoc,20025 src: LazySrcLoc,
20031 ty: Type,20026 ty: Type,
20032 zir_tag: Zir.Inst.Tag,
20033) CompileError!void {20027) CompileError!void {
20034 switch (try ty.zigTypeTagOrPoison()) {20028 switch (try ty.zigTypeTagOrPoison()) {
20035 .Pointer => switch (ty.ptrSize()) {20029 .Pointer => switch (ty.ptrSize()) {
...@@ -20037,8 +20031,8 @@ fn checkInvalidPtrArithmetic(...@@ -20037,8 +20031,8 @@ fn checkInvalidPtrArithmetic(
20037 .Many, .C => return sema.fail(20031 .Many, .C => return sema.fail(
20038 block,20032 block,
20039 src,20033 src,
20040 "invalid pointer arithmetic operand: '{s}''",20034 "invalid pointer arithmetic operator",
20041 .{@tagName(zir_tag)},20035 .{},
20042 ),20036 ),
20043 },20037 },
20044 else => return,20038 else => return,