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(...@@ -10729,6 +10729,7 @@ fn zirShl(
1072910729
10730 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;10730 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
10731 const src = inst_data.src();10731 const src = inst_data.src();
10732 sema.src = src;
10732 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };10733 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
10733 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };10734 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
10734 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;10735 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
...@@ -10902,6 +10903,7 @@ fn zirShr(...@@ -10902,6 +10903,7 @@ fn zirShr(
1090210903
10903 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;10904 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
10904 const src = inst_data.src();10905 const src = inst_data.src();
10906 sema.src = src;
10905 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };10907 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
10906 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };10908 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
10907 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;10909 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
...@@ -11024,6 +11026,7 @@ fn zirBitwise(...@@ -11024,6 +11026,7 @@ fn zirBitwise(
1102411026
11025 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;11027 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
11026 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };11028 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
11029 sema.src = src;
11027 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };11030 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
11028 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };11031 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
11029 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;11032 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
...@@ -11657,6 +11660,7 @@ fn zirArithmetic(...@@ -11657,6 +11660,7 @@ fn zirArithmetic(
11657fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {11660fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
11658 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;11661 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
11659 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };11662 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
11663 sema.src = src;
11660 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };11664 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
11661 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };11665 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
11662 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;11666 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...@@ -11810,6 +11814,7 @@ fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
11810fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {11814fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
11811 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;11815 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
11812 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };11816 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
11817 sema.src = src;
11813 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };11818 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
11814 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };11819 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
11815 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;11820 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...@@ -11966,6 +11971,7 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
11966fn zirDivFloor(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {11971fn zirDivFloor(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
11967 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;11972 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
11968 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };11973 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
11974 sema.src = src;
11969 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };11975 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
11970 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };11976 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
11971 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;11977 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...@@ -12077,6 +12083,7 @@ fn zirDivFloor(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
12077fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {12083fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
12078 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;12084 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
12079 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };12085 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
12086 sema.src = src;
12080 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };12087 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
12081 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };12088 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
12082 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;12089 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...@@ -12313,6 +12320,7 @@ fn airTag(block: *Block, is_int: bool, normal: Air.Inst.Tag, optimized: Air.Inst
12313fn zirModRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {12320fn zirModRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
12314 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;12321 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
12315 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };12322 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
12323 sema.src = src;
12316 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };12324 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
12317 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };12325 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
12318 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;12326 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
...@@ -12498,6 +12506,7 @@ fn intRemScalar(...@@ -12498,6 +12506,7 @@ fn intRemScalar(
12498fn zirMod(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {12506fn zirMod(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
12499 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;12507 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
12500 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };12508 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
12509 sema.src = src;
12501 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };12510 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
12502 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };12511 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
12503 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;12512 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...@@ -12600,6 +12609,7 @@ fn zirMod(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
12600fn zirRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {12609fn zirRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
12601 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;12610 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
12602 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };12611 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
12612 sema.src = src;
12603 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };12613 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
12604 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };12614 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
12605 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;12615 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 @@...@@ -1,6 +1,74 @@
1export fn f() void {1export fn entry1() void {
2 const a = 3;2 const a = 1;
3 a = 4;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;
4}72}
573
6// error74// error
...@@ -8,3 +76,20 @@ export fn f() void {...@@ -8,3 +76,20 @@ export fn f() void {
8// target=native76// target=native
9//77//
10// :3:9: error: cannot assign to constant78// :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