authorgravatar for igor.anic@gmail.comIgor Anić <igor.anic@gmail.com> 2022-09-26 16:43:45+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-09-29 14:45:08+03:00
log9f6f4601247769a0190938a209e300cd33cd9a3d
tree95edaf7cc57cf89275c44d402ccdb4a13c1274e4
parent317cb629fb919938569b9ef8a782e1f9619d6244

Sema: improve source location in errors

resolves #12793

2 files changed, 98 insertions(+), 3 deletions(-)

src/Sema.zig+10
......@@ -10729,6 +10729,7 @@ fn zirShl(
1072910729
1073010730 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
1073110731 const src = inst_data.src();
10732 sema.src = src;
1073210733 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
1073310734 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
1073410735 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
......@@ -10902,6 +10903,7 @@ fn zirShr(
1090210903
1090310904 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
1090410905 const src = inst_data.src();
10906 sema.src = src;
1090510907 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
1090610908 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
1090710909 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
......@@ -11024,6 +11026,7 @@ fn zirBitwise(
1102411026
1102511027 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
1102611028 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
11029 sema.src = src;
1102711030 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
1102811031 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
1102911032 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
......@@ -11657,6 +11660,7 @@ fn zirArithmetic(
1165711660fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
1165811661 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
1165911662 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
11663 sema.src = src;
1166011664 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
1166111665 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
1166211666 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
......@@ -11810,6 +11814,7 @@ fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
1181011814fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
1181111815 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
1181211816 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
11817 sema.src = src;
1181311818 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
1181411819 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
1181511820 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
......@@ -11966,6 +11971,7 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1196611971fn zirDivFloor(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
1196711972 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
1196811973 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
11974 sema.src = src;
1196911975 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
1197011976 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
1197111977 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
......@@ -12077,6 +12083,7 @@ fn zirDivFloor(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1207712083fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
1207812084 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
1207912085 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
12086 sema.src = src;
1208012087 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
1208112088 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
1208212089 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
......@@ -12313,6 +12320,7 @@ fn airTag(block: *Block, is_int: bool, normal: Air.Inst.Tag, optimized: Air.Inst
1231312320fn zirModRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
1231412321 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
1231512322 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
12323 sema.src = src;
1231612324 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
1231712325 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
1231812326 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
......@@ -12498,6 +12506,7 @@ fn intRemScalar(
1249812506fn zirMod(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
1249912507 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
1250012508 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
12509 sema.src = src;
1250112510 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
1250212511 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
1250312512 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
......@@ -12600,6 +12609,7 @@ fn zirMod(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
1260012609fn zirRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
1260112610 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
1260212611 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
12612 sema.src = src;
1260312613 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
1260412614 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
1260512615 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
test/cases/compile_errors/assign_to_constant_variable.zig+88-3
......@@ -1,6 +1,74 @@
1export fn f() void {
2 const a = 3;
3 a = 4;
1export fn entry1() void {
2 const a = 1;
3 a = 1;
4}
5export fn entry2() void {
6 const a = 1;
7 a |= 1;
8}
9export fn entry3() void {
10 const a = 1;
11 a %= 1;
12}
13export fn entry4() void {
14 const a = 1;
15 a ^= 1;
16}
17export fn entry5() void {
18 const a = 1;
19 a += 1;
20}
21export fn entry6() void {
22 const a = 1;
23 a +%= 1;
24}
25export fn entry7() void {
26 const a = 1;
27 a +|= 1;
28}
29export fn entry8() void {
30 const a = 1;
31 a -= 1;
32}
33export fn entry9() void {
34 const a = 1;
35 a -%= 1;
36}
37export fn entry10() void {
38 const a = 1;
39 a -|= 1;
40}
41export fn entry11() void {
42 const a = 1;
43 a *= 1;
44}
45export fn entry12() void {
46 const a = 1;
47 a *%= 1;
48}
49export fn entry13() void {
50 const a = 1;
51 a *|= 1;
52}
53export fn entry14() void {
54 const a = 1;
55 a /= 1;
56}
57export fn entry15() void {
58 const a = 1;
59 a &= 1;
60}
61export fn entry16() void {
62 const a = 1;
63 a <<= 1;
64}
65export fn entry17() void {
66 const a = 1;
67 a <<|= 1;
68}
69export fn entry18() void {
70 const a = 1;
71 a >>= 1;
472}
573
674// error
......@@ -8,3 +76,20 @@ export fn f() void {
876// target=native
977//
1078// :3:9: error: cannot assign to constant
79// :7:7: error: cannot assign to constant
80// :11:7: error: cannot assign to constant
81// :15:7: error: cannot assign to constant
82// :19:7: error: cannot assign to constant
83// :23:7: error: cannot assign to constant
84// :27:7: error: cannot assign to constant
85// :31:7: error: cannot assign to constant
86// :35:7: error: cannot assign to constant
87// :39:7: error: cannot assign to constant
88// :43:7: error: cannot assign to constant
89// :47:7: error: cannot assign to constant
90// :51:7: error: cannot assign to constant
91// :55:7: error: cannot assign to constant
92// :59:7: error: cannot assign to constant
93// :63:7: error: cannot assign to constant
94// :67:7: error: cannot assign to constant
95// :71:7: error: cannot assign to constant