authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-10-04 14:16:33-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2021-10-04 14:16:33-04:00
log2454459ef5435081abe82724e873a74bd33a79af
tree2b0784f261889bb5791be2b63e39ae233ca23e74
parentc41b989ab8c553bdba8e1aab606edbe27d730a3a
parentbb3ef76434bf365ca6beb6a0709bcde251b0f771
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #9882 from mattbork/astgen-cursor

astgen.zig: keep source cursor increasing monotonically as much as possible

2 files changed, 140 insertions(+), 136 deletions(-)

src/AstGen.zig+137-133
......@@ -1683,7 +1683,7 @@ fn breakExpr(parent_gz: *GenZir, parent_scope: *Scope, node: Ast.Node.Index) Inn
16831683 const defer_scope = scope.cast(Scope.Defer).?;
16841684 scope = defer_scope.parent;
16851685 const expr_node = node_datas[defer_scope.defer_node].rhs;
1686 _ = try unusedResultExpr(parent_gz, defer_scope.parent, expr_node);
1686 try unusedResultDeferExpr(parent_gz, defer_scope, defer_scope.parent, expr_node);
16871687 },
16881688 .defer_error => scope = scope.cast(Scope.Defer).?.parent,
16891689 .top => unreachable,
......@@ -1736,7 +1736,7 @@ fn continueExpr(parent_gz: *GenZir, parent_scope: *Scope, node: Ast.Node.Index)
17361736 const defer_scope = scope.cast(Scope.Defer).?;
17371737 scope = defer_scope.parent;
17381738 const expr_node = node_datas[defer_scope.defer_node].rhs;
1739 _ = try unusedResultExpr(parent_gz, defer_scope.parent, expr_node);
1739 try unusedResultDeferExpr(parent_gz, defer_scope, defer_scope.parent, expr_node);
17401740 },
17411741 .defer_error => scope = scope.cast(Scope.Defer).?.parent,
17421742 .namespace => break,
......@@ -1922,8 +1922,8 @@ fn blockExprStmts(gz: *GenZir, parent_scope: *Scope, statements: []const Ast.Nod
19221922 .simple_var_decl => scope = try varDecl(gz, scope, statement, &block_arena.allocator, tree.simpleVarDecl(statement)),
19231923 .aligned_var_decl => scope = try varDecl(gz, scope, statement, &block_arena.allocator, tree.alignedVarDecl(statement)),
19241924
1925 .@"defer" => scope = try makeDeferScope(scope, statement, &block_arena.allocator, .defer_normal),
1926 .@"errdefer" => scope = try makeDeferScope(scope, statement, &block_arena.allocator, .defer_error),
1925 .@"defer" => scope = try makeDeferScope(gz.astgen, scope, statement, &block_arena.allocator, .defer_normal),
1926 .@"errdefer" => scope = try makeDeferScope(gz.astgen, scope, statement, &block_arena.allocator, .defer_error),
19271927
19281928 .assign => try assign(gz, scope, statement),
19291929
......@@ -1951,6 +1951,22 @@ fn blockExprStmts(gz: *GenZir, parent_scope: *Scope, statements: []const Ast.Nod
19511951 try checkUsed(gz, parent_scope, scope);
19521952}
19531953
1954fn unusedResultDeferExpr(gz: *GenZir, defer_scope: *Scope.Defer, expr_scope: *Scope, expr_node: Ast.Node.Index) InnerError!void {
1955 const astgen = gz.astgen;
1956 const prev_offset = astgen.source_offset;
1957 const prev_line = astgen.source_line;
1958 const prev_column = astgen.source_column;
1959 defer {
1960 astgen.source_offset = prev_offset;
1961 astgen.source_line = prev_line;
1962 astgen.source_column = prev_column;
1963 }
1964 astgen.source_offset = defer_scope.source_offset;
1965 astgen.source_line = defer_scope.source_line;
1966 astgen.source_column = defer_scope.source_column;
1967 _ = try unusedResultExpr(gz, expr_scope, expr_node);
1968}
1969
19541970/// Returns AST source node of the thing that is noreturn if the statement is definitely `noreturn`.
19551971/// Otherwise returns 0.
19561972fn unusedResultExpr(gz: *GenZir, scope: *Scope, statement: Ast.Node.Index) InnerError!Ast.Node.Index {
......@@ -2333,7 +2349,7 @@ fn genDefers(
23332349 const prev_in_defer = gz.in_defer;
23342350 gz.in_defer = true;
23352351 defer gz.in_defer = prev_in_defer;
2336 _ = try unusedResultExpr(gz, defer_scope.parent, expr_node);
2352 try unusedResultDeferExpr(gz, defer_scope, defer_scope.parent, expr_node);
23372353 },
23382354 .defer_error => {
23392355 const defer_scope = scope.cast(Scope.Defer).?;
......@@ -2344,7 +2360,7 @@ fn genDefers(
23442360 const prev_in_defer = gz.in_defer;
23452361 gz.in_defer = true;
23462362 defer gz.in_defer = prev_in_defer;
2347 _ = try unusedResultExpr(gz, defer_scope.parent, expr_node);
2363 try unusedResultDeferExpr(gz, defer_scope, defer_scope.parent, expr_node);
23482364 },
23492365 .both => |err_code| {
23502366 const expr_node = node_datas[defer_scope.defer_node].rhs;
......@@ -2365,7 +2381,7 @@ fn genDefers(
23652381 };
23662382 break :blk &local_val_scope.base;
23672383 };
2368 _ = try unusedResultExpr(gz, sub_scope, expr_node);
2384 try unusedResultDeferExpr(gz, defer_scope, sub_scope, expr_node);
23692385 },
23702386 .normal_only => continue,
23712387 }
......@@ -2409,16 +2425,27 @@ fn checkUsed(
24092425}
24102426
24112427fn makeDeferScope(
2428 astgen: *AstGen,
24122429 scope: *Scope,
24132430 node: Ast.Node.Index,
24142431 block_arena: *Allocator,
24152432 scope_tag: Scope.Tag,
24162433) InnerError!*Scope {
2434 const tree = astgen.tree;
2435 const node_datas = tree.nodes.items(.data);
2436 const expr_node = node_datas[node].rhs;
2437 const token_starts = tree.tokens.items(.start);
2438 const node_start = token_starts[tree.firstToken(expr_node)];
24172439 const defer_scope = try block_arena.create(Scope.Defer);
2440 astgen.advanceSourceCursor(tree.source, node_start);
2441
24182442 defer_scope.* = .{
24192443 .base = .{ .tag = scope_tag },
24202444 .parent = scope,
24212445 .defer_node = node,
2446 .source_offset = astgen.source_offset,
2447 .source_line = astgen.source_line,
2448 .source_column = astgen.source_column,
24222449 };
24232450 return &defer_scope.base;
24242451}
......@@ -3184,6 +3211,12 @@ fn fnDecl(
31843211 astgen.fn_block = &fn_gz;
31853212 defer astgen.fn_block = prev_fn_block;
31863213
3214 const token_starts = tree.tokens.items(.start);
3215 const lbrace_start = token_starts[tree.firstToken(body_node)];
3216 astgen.advanceSourceCursor(tree.source, lbrace_start);
3217 const lbrace_line = @intCast(u32, astgen.source_line);
3218 const lbrace_column = @intCast(u32, astgen.source_column);
3219
31873220 _ = try expr(&fn_gz, params_scope, .none, body_node);
31883221 try checkUsed(gz, &fn_gz.base, params_scope);
31893222
......@@ -3202,6 +3235,8 @@ fn fnDecl(
32023235
32033236 break :func try decl_gz.addFunc(.{
32043237 .src_node = decl_node,
3238 .lbrace_line = lbrace_line,
3239 .lbrace_column = lbrace_column,
32053240 .param_block = block_inst,
32063241 .ret_ty = ret_gz.instructions.items,
32073242 .ret_br = ret_br,
......@@ -3544,6 +3579,12 @@ fn testDecl(
35443579 astgen.fn_block = &fn_block;
35453580 defer astgen.fn_block = prev_fn_block;
35463581
3582 const token_starts = tree.tokens.items(.start);
3583 const lbrace_start = token_starts[tree.firstToken(body_node)];
3584 astgen.advanceSourceCursor(tree.source, lbrace_start);
3585 const lbrace_line = @intCast(u32, astgen.source_line);
3586 const lbrace_column = @intCast(u32, astgen.source_column);
3587
35473588 const block_result = try expr(&fn_block, &fn_block.base, .none, body_node);
35483589 if (fn_block.instructions.items.len == 0 or !fn_block.refIsNoReturn(block_result)) {
35493590 // Since we are adding the return instruction here, we must handle the coercion.
......@@ -3553,6 +3594,8 @@ fn testDecl(
35533594
35543595 const func_inst = try decl_block.addFunc(.{
35553596 .src_node = node,
3597 .lbrace_line = lbrace_line,
3598 .lbrace_column = lbrace_column,
35563599 .param_block = block_inst,
35573600 .ret_ty = &.{},
35583601 .ret_br = 0,
......@@ -5935,10 +5978,11 @@ fn switchExpr(
59355978 const operand_ty_inst = try parent_gz.addUnNode(typeof_tag, operand, operand_node);
59365979 const item_rl: ResultLoc = .{ .ty = operand_ty_inst };
59375980
5938 // Contains the data that goes into the `extra` array for the SwitchBlock/SwitchBlockMulti.
5939 // This is the header as well as the optional else prong body, as well as all the
5940 // scalar cases.
5941 // At the end we will memcpy this into place.
5981 // These contain the data that goes into the `extra` array for the SwitchBlock/SwitchBlockMulti.
5982 // This is the optional else prong body.
5983 var special_case_payload = ArrayListUnmanaged(u32){};
5984 defer special_case_payload.deinit(gpa);
5985 // This is all the scalar cases.
59425986 var scalar_cases_payload = ArrayListUnmanaged(u32){};
59435987 defer scalar_cases_payload.deinit(gpa);
59445988 // Same deal, but this is only the `extra` data for the multi cases.
......@@ -5956,86 +6000,10 @@ fn switchExpr(
59566000 var case_scope = parent_gz.makeSubBlock(&block_scope.base);
59576001 defer case_scope.instructions.deinit(gpa);
59586002
5959 // Do the else/`_` first because it goes first in the payload.
5960 var capture_val_scope: Scope.LocalVal = undefined;
5961 if (special_node != 0) {
5962 const case = switch (node_tags[special_node]) {
5963 .switch_case_one => tree.switchCaseOne(special_node),
5964 .switch_case => tree.switchCase(special_node),
5965 else => unreachable,
5966 };
5967 const sub_scope = blk: {
5968 const payload_token = case.payload_token orelse break :blk &case_scope.base;
5969 const ident = if (token_tags[payload_token] == .asterisk)
5970 payload_token + 1
5971 else
5972 payload_token;
5973 const is_ptr = ident != payload_token;
5974 if (mem.eql(u8, tree.tokenSlice(ident), "_")) {
5975 if (is_ptr) {
5976 return astgen.failTok(payload_token, "pointer modifier invalid on discard", .{});
5977 }
5978 break :blk &case_scope.base;
5979 }
5980 const capture_tag: Zir.Inst.Tag = if (is_ptr)
5981 .switch_capture_else_ref
5982 else
5983 .switch_capture_else;
5984 const capture = try case_scope.add(.{
5985 .tag = capture_tag,
5986 .data = .{ .switch_capture = .{
5987 .switch_inst = switch_block,
5988 .prong_index = undefined,
5989 } },
5990 });
5991 const capture_name = try astgen.identAsString(payload_token);
5992 capture_val_scope = .{
5993 .parent = &case_scope.base,
5994 .gen_zir = &case_scope,
5995 .name = capture_name,
5996 .inst = capture,
5997 .token_src = payload_token,
5998 .id_cat = .@"capture",
5999 };
6000 break :blk &capture_val_scope.base;
6001 };
6002 const case_result = try expr(&case_scope, sub_scope, block_scope.break_result_loc, case.ast.target_expr);
6003 try checkUsed(parent_gz, &case_scope.base, sub_scope);
6004 if (!parent_gz.refIsNoReturn(case_result)) {
6005 block_scope.break_count += 1;
6006 _ = try case_scope.addBreak(.@"break", switch_block, case_result);
6007 }
6008 // Documentation for this: `Zir.Inst.SwitchBlock` and `Zir.Inst.SwitchBlockMulti`.
6009 try scalar_cases_payload.ensureUnusedCapacity(gpa, case_scope.instructions.items.len +
6010 3 + // operand, scalar_cases_len, else body len
6011 @boolToInt(multi_cases_len != 0));
6012 scalar_cases_payload.appendAssumeCapacity(@enumToInt(operand));
6013 scalar_cases_payload.appendAssumeCapacity(scalar_cases_len);
6014 if (multi_cases_len != 0) {
6015 scalar_cases_payload.appendAssumeCapacity(multi_cases_len);
6016 }
6017 scalar_cases_payload.appendAssumeCapacity(@intCast(u32, case_scope.instructions.items.len));
6018 scalar_cases_payload.appendSliceAssumeCapacity(case_scope.instructions.items);
6019 } else {
6020 // Documentation for this: `Zir.Inst.SwitchBlock` and `Zir.Inst.SwitchBlockMulti`.
6021 try scalar_cases_payload.ensureUnusedCapacity(
6022 gpa,
6023 @as(usize, 2) + // operand, scalar_cases_len
6024 @boolToInt(multi_cases_len != 0),
6025 );
6026 scalar_cases_payload.appendAssumeCapacity(@enumToInt(operand));
6027 scalar_cases_payload.appendAssumeCapacity(scalar_cases_len);
6028 if (multi_cases_len != 0) {
6029 scalar_cases_payload.appendAssumeCapacity(multi_cases_len);
6030 }
6031 }
6032
6033 // In this pass we generate all the item and prong expressions except the special case.
6003 // In this pass we generate all the item and prong expressions.
60346004 var multi_case_index: u32 = 0;
60356005 var scalar_case_index: u32 = 0;
60366006 for (case_nodes) |case_node| {
6037 if (case_node == special_node)
6038 continue;
60396007 const case = switch (node_tags[case_node]) {
60406008 .switch_case_one => tree.switchCaseOne(case_node),
60416009 .switch_case => tree.switchCase(case_node),
......@@ -6045,9 +6013,10 @@ fn switchExpr(
60456013 // Reset the scope.
60466014 case_scope.instructions.shrinkRetainingCapacity(0);
60476015
6048 const is_multi_case = case.ast.values.len != 1 or
6049 node_tags[case.ast.values[0]] == .switch_range;
6016 const is_multi_case = case.ast.values.len > 1 or
6017 (case.ast.values.len == 1 and node_tags[case.ast.values[0]] == .switch_range);
60506018
6019 var capture_val_scope: Scope.LocalVal = undefined;
60516020 const sub_scope = blk: {
60526021 const payload_token = case.payload_token orelse break :blk &case_scope.base;
60536022 const ident = if (token_tags[payload_token] == .asterisk)
......@@ -6061,28 +6030,42 @@ fn switchExpr(
60616030 }
60626031 break :blk &case_scope.base;
60636032 }
6064 const is_multi_case_bits: u2 = @boolToInt(is_multi_case);
6065 const is_ptr_bits: u2 = @boolToInt(is_ptr);
6066 const capture_tag: Zir.Inst.Tag = switch ((is_multi_case_bits << 1) | is_ptr_bits) {
6067 0b00 => .switch_capture,
6068 0b01 => .switch_capture_ref,
6069 0b10 => .switch_capture_multi,
6070 0b11 => .switch_capture_multi_ref,
6071 };
6072 const capture_index = if (is_multi_case) ci: {
6073 multi_case_index += 1;
6074 break :ci multi_case_index - 1;
6075 } else ci: {
6076 scalar_case_index += 1;
6077 break :ci scalar_case_index - 1;
6033 const capture = if (case_node == special_node) capture: {
6034 const capture_tag: Zir.Inst.Tag = if (is_ptr)
6035 .switch_capture_else_ref
6036 else
6037 .switch_capture_else;
6038 break :capture try case_scope.add(.{
6039 .tag = capture_tag,
6040 .data = .{ .switch_capture = .{
6041 .switch_inst = switch_block,
6042 .prong_index = undefined,
6043 } },
6044 });
6045 } else capture: {
6046 const is_multi_case_bits: u2 = @boolToInt(is_multi_case);
6047 const is_ptr_bits: u2 = @boolToInt(is_ptr);
6048 const capture_tag: Zir.Inst.Tag = switch ((is_multi_case_bits << 1) | is_ptr_bits) {
6049 0b00 => .switch_capture,
6050 0b01 => .switch_capture_ref,
6051 0b10 => .switch_capture_multi,
6052 0b11 => .switch_capture_multi_ref,
6053 };
6054 const capture_index = if (is_multi_case) ci: {
6055 multi_case_index += 1;
6056 break :ci multi_case_index - 1;
6057 } else ci: {
6058 scalar_case_index += 1;
6059 break :ci scalar_case_index - 1;
6060 };
6061 break :capture try case_scope.add(.{
6062 .tag = capture_tag,
6063 .data = .{ .switch_capture = .{
6064 .switch_inst = switch_block,
6065 .prong_index = capture_index,
6066 } },
6067 });
60786068 };
6079 const capture = try case_scope.add(.{
6080 .tag = capture_tag,
6081 .data = .{ .switch_capture = .{
6082 .switch_inst = switch_block,
6083 .prong_index = capture_index,
6084 } },
6085 });
60866069 const capture_name = try astgen.identAsString(ident);
60876070 capture_val_scope = .{
60886071 .parent = &case_scope.base,
......@@ -6134,6 +6117,17 @@ fn switchExpr(
61346117 multi_cases_payload.items[header_index + 1] = ranges_len;
61356118 multi_cases_payload.items[header_index + 2] = @intCast(u32, case_scope.instructions.items.len);
61366119 try multi_cases_payload.appendSlice(gpa, case_scope.instructions.items);
6120 } else if (case_node == special_node) {
6121 const case_result = try expr(&case_scope, sub_scope, block_scope.break_result_loc, case.ast.target_expr);
6122 try checkUsed(parent_gz, &case_scope.base, sub_scope);
6123 if (!parent_gz.refIsNoReturn(case_result)) {
6124 block_scope.break_count += 1;
6125 _ = try case_scope.addBreak(.@"break", switch_block, case_result);
6126 }
6127 try special_case_payload.ensureUnusedCapacity(gpa, 1 + // body_len
6128 case_scope.instructions.items.len);
6129 special_case_payload.appendAssumeCapacity(@intCast(u32, case_scope.instructions.items.len));
6130 special_case_payload.appendSliceAssumeCapacity(case_scope.instructions.items);
61376131 } else {
61386132 const item_node = case.ast.values[0];
61396133 const item_inst = try comptimeExpr(parent_gz, scope, item_rl, item_node);
......@@ -6143,7 +6137,7 @@ fn switchExpr(
61436137 block_scope.break_count += 1;
61446138 _ = try case_scope.addBreak(.@"break", switch_block, case_result);
61456139 }
6146 try scalar_cases_payload.ensureUnusedCapacity(gpa, 2 +
6140 try scalar_cases_payload.ensureUnusedCapacity(gpa, 2 + // item + body_len
61476141 case_scope.instructions.items.len);
61486142 scalar_cases_payload.appendAssumeCapacity(@enumToInt(item_inst));
61496143 scalar_cases_payload.appendAssumeCapacity(@intCast(u32, case_scope.instructions.items.len));
......@@ -6180,8 +6174,17 @@ fn switchExpr(
61806174 const payload_index = astgen.extra.items.len;
61816175 const zir_datas = astgen.instructions.items(.data);
61826176 zir_datas[switch_block].pl_node.payload_index = @intCast(u32, payload_index);
6183 try astgen.extra.ensureUnusedCapacity(gpa, scalar_cases_payload.items.len +
6177 // Documentation for this: `Zir.Inst.SwitchBlock` and `Zir.Inst.SwitchBlockMulti`.
6178 try astgen.extra.ensureUnusedCapacity(gpa, @as(usize, 2) + // operand, scalar_cases_len
6179 @boolToInt(multi_cases_len != 0) +
6180 special_case_payload.items.len +
6181 scalar_cases_payload.items.len +
61846182 multi_cases_payload.items.len);
6183 astgen.extra.appendAssumeCapacity(@enumToInt(operand));
6184 astgen.extra.appendAssumeCapacity(scalar_cases_len);
6185 if (multi_cases_len != 0) {
6186 astgen.extra.appendAssumeCapacity(multi_cases_len);
6187 }
61856188 const strat = rl.strategy(&block_scope);
61866189 switch (strat.tag) {
61876190 .break_operand => {
......@@ -6189,6 +6192,7 @@ fn switchExpr(
61896192 // `elide_store_to_block_ptr_instructions` will either be true,
61906193 // or all prongs are noreturn.
61916194 if (!strat.elide_store_to_block_ptr_instructions) {
6195 astgen.extra.appendSliceAssumeCapacity(special_case_payload.items);
61926196 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items);
61936197 astgen.extra.appendSliceAssumeCapacity(multi_cases_payload.items);
61946198 return indexToRef(switch_block);
......@@ -6204,32 +6208,30 @@ fn switchExpr(
62046208 // it as the break operand.
62056209
62066210 var extra_index: usize = 0;
6207 extra_index += 2;
6208 extra_index += @boolToInt(multi_cases_len != 0);
62096211 if (special_prong != .none) special_prong: {
62106212 const body_len_index = extra_index;
6211 const body_len = scalar_cases_payload.items[extra_index];
6213 const body_len = special_case_payload.items[extra_index];
62126214 extra_index += 1;
62136215 if (body_len < 2) {
62146216 extra_index += body_len;
6215 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[0..extra_index]);
6217 astgen.extra.appendSliceAssumeCapacity(special_case_payload.items[0..extra_index]);
62166218 break :special_prong;
62176219 }
62186220 extra_index += body_len - 2;
6219 const store_inst = scalar_cases_payload.items[extra_index];
6221 const store_inst = special_case_payload.items[extra_index];
62206222 if (zir_tags[store_inst] != .store_to_block_ptr or
62216223 zir_datas[store_inst].bin.lhs != block_scope.rl_ptr)
62226224 {
62236225 extra_index += 2;
6224 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[0..extra_index]);
6226 astgen.extra.appendSliceAssumeCapacity(special_case_payload.items[0..extra_index]);
62256227 break :special_prong;
62266228 }
62276229 assert(zir_datas[store_inst].bin.lhs == block_scope.rl_ptr);
62286230 if (block_scope.rl_ty_inst != .none) {
62296231 extra_index += 1;
6230 const break_inst = scalar_cases_payload.items[extra_index];
6232 const break_inst = special_case_payload.items[extra_index];
62316233 extra_index += 1;
6232 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[0..extra_index]);
6234 astgen.extra.appendSliceAssumeCapacity(special_case_payload.items[0..extra_index]);
62336235 zir_tags[store_inst] = .as;
62346236 zir_datas[store_inst].bin = .{
62356237 .lhs = block_scope.rl_ty_inst,
......@@ -6237,15 +6239,16 @@ fn switchExpr(
62376239 };
62386240 zir_datas[break_inst].@"break".operand = indexToRef(store_inst);
62396241 } else {
6240 scalar_cases_payload.items[body_len_index] -= 1;
6241 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[0..extra_index]);
6242 special_case_payload.items[body_len_index] -= 1;
6243 astgen.extra.appendSliceAssumeCapacity(special_case_payload.items[0..extra_index]);
62426244 extra_index += 1;
6243 astgen.extra.appendAssumeCapacity(scalar_cases_payload.items[extra_index]);
6245 astgen.extra.appendAssumeCapacity(special_case_payload.items[extra_index]);
62446246 extra_index += 1;
62456247 }
62466248 } else {
6247 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[0..extra_index]);
6249 astgen.extra.appendSliceAssumeCapacity(special_case_payload.items[0..extra_index]);
62486250 }
6251 extra_index = 0;
62496252 var scalar_i: u32 = 0;
62506253 while (scalar_i < scalar_cases_len) : (scalar_i += 1) {
62516254 const start_index = extra_index;
......@@ -6342,6 +6345,7 @@ fn switchExpr(
63426345 },
63436346 .break_void => {
63446347 assert(!strat.elide_store_to_block_ptr_instructions);
6348 astgen.extra.appendSliceAssumeCapacity(special_case_payload.items);
63456349 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items);
63466350 astgen.extra.appendSliceAssumeCapacity(multi_cases_payload.items);
63476351 // Modify all the terminating instruction tags to become `break` variants.
......@@ -9282,6 +9286,9 @@ const Scope = struct {
92829286 /// Parents can be: `LocalVal`, `LocalPtr`, `GenZir`, `Defer`, `Namespace`.
92839287 parent: *Scope,
92849288 defer_node: Ast.Node.Index,
9289 source_offset: u32,
9290 source_line: u32,
9291 source_column: u32,
92859292 };
92869293
92879294 /// Represents a global scope that has any number of declarations in it.
......@@ -9563,6 +9570,8 @@ const GenZir = struct {
95639570
95649571 fn addFunc(gz: *GenZir, args: struct {
95659572 src_node: Ast.Node.Index,
9573 lbrace_line: u32 = 0,
9574 lbrace_column: u32 = 0,
95669575 body: []const Zir.Inst.Index,
95679576 param_block: Zir.Inst.Index,
95689577 ret_ty: []const Zir.Inst.Index,
......@@ -9592,19 +9601,13 @@ const GenZir = struct {
95929601 const fn_decl = args.src_node;
95939602 assert(node_tags[fn_decl] == .fn_decl or node_tags[fn_decl] == .test_decl);
95949603 const block = node_datas[fn_decl].rhs;
9595 const lbrace_start = token_starts[tree.firstToken(block)];
95969604 const rbrace_start = token_starts[tree.lastToken(block)];
9597
9598 astgen.advanceSourceCursor(tree.source, lbrace_start);
9599 const lbrace_line = @intCast(u32, astgen.source_line);
9600 const lbrace_column = @intCast(u32, astgen.source_column);
9601
96029605 astgen.advanceSourceCursor(tree.source, rbrace_start);
96039606 const rbrace_line = @intCast(u32, astgen.source_line);
96049607 const rbrace_column = @intCast(u32, astgen.source_column);
96059608
9606 const columns = lbrace_column | (rbrace_column << 16);
9607 src_locs_buffer[0] = lbrace_line;
9609 const columns = args.lbrace_column | (rbrace_column << 16);
9610 src_locs_buffer[0] = args.lbrace_line;
96089611 src_locs_buffer[1] = rbrace_line;
96099612 src_locs_buffer[2] = columns;
96109613 src_locs = &src_locs_buffer;
......@@ -10577,6 +10580,7 @@ fn advanceSourceCursor(astgen: *AstGen, source: []const u8, end: usize) void {
1057710580 var i = astgen.source_offset;
1057810581 var line = astgen.source_line;
1057910582 var column = astgen.source_column;
10583 assert(i <= end);
1058010584 while (i < end) : (i += 1) {
1058110585 if (source[i] == '\n') {
1058210586 line += 1;
src/print_zir.zig+3-3
......@@ -1913,8 +1913,8 @@ const Writer = struct {
19131913 try stream.writeAll(") ");
19141914 if (body.len != 0) {
19151915 try stream.print("(lbrace={d}:{d},rbrace={d}:{d}) ", .{
1916 src_locs.lbrace_line, @truncate(u16, src_locs.columns),
1917 src_locs.rbrace_line, @truncate(u16, src_locs.columns >> 16),
1916 src_locs.lbrace_line + 1, @truncate(u16, src_locs.columns) + 1,
1917 src_locs.rbrace_line + 1, @truncate(u16, src_locs.columns >> 16) + 1,
19181918 });
19191919 }
19201920 try self.writeSrc(stream, src);
......@@ -1928,7 +1928,7 @@ const Writer = struct {
19281928
19291929 fn writeDbgStmt(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
19301930 const inst_data = self.code.instructions.items(.data)[inst].dbg_stmt;
1931 try stream.print("{d}, {d})", .{ inst_data.line, inst_data.column });
1931 try stream.print("{d}, {d})", .{ inst_data.line + 1, inst_data.column + 1 });
19321932 }
19331933
19341934 fn writeInstRef(self: *Writer, stream: anytype, ref: Zir.Inst.Ref) !void {