| ... | ... | @@ -10042,7 +10042,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 10042 | 10042 | defer gpa.free(prev_then_body); |
| 10043 | 10043 | |
| 10044 | 10044 | var cases_len = scalar_cases_len; |
| 10045 | | var multi_i: usize = 0; |
| 10045 | var multi_i: u32 = 0; |
| 10046 | 10046 | while (multi_i < multi_cases_len) : (multi_i += 1) { |
| 10047 | 10047 | const items_len = sema.code.extra[extra_index]; |
| 10048 | 10048 | extra_index += 1; |
| ... | ... | @@ -10062,10 +10062,9 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 10062 | 10062 | if (is_inline) { |
| 10063 | 10063 | const body_start = extra_index + 2 * ranges_len; |
| 10064 | 10064 | const body = sema.code.extra[body_start..][0..body_len]; |
| 10065 | | const case_src = src; // TODO better source location |
| 10066 | 10065 | var emit_bb = false; |
| 10067 | 10066 | |
| 10068 | | var range_i: usize = 0; |
| 10067 | var range_i: u32 = 0; |
| 10069 | 10068 | while (range_i < ranges_len) : (range_i += 1) { |
| 10070 | 10069 | const first_ref = @intToEnum(Zir.Inst.Ref, sema.code.extra[extra_index]); |
| 10071 | 10070 | extra_index += 1; |
| ... | ... | @@ -10078,7 +10077,8 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 10078 | 10077 | const item_last = sema.resolveConstValue(block, .unneeded, item_last_ref, undefined) catch unreachable; |
| 10079 | 10078 | |
| 10080 | 10079 | while (item.compare(.lte, item_last, operand_ty, sema.mod)) : ({ |
| 10081 | | item = try sema.intAddScalar(block, case_src, item, Value.one); |
| 10080 | // Previous validation has resolved any possible lazy values. |
| 10081 | item = try sema.intAddScalar(block, .unneeded, item, Value.one); |
| 10082 | 10082 | }) { |
| 10083 | 10083 | cases_len += 1; |
| 10084 | 10084 | |
| ... | ... | @@ -10088,7 +10088,15 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 10088 | 10088 | case_block.instructions.shrinkRetainingCapacity(0); |
| 10089 | 10089 | case_block.wip_capture_scope = child_block.wip_capture_scope; |
| 10090 | 10090 | |
| 10091 | | if (emit_bb) try sema.emitBackwardBranch(block, case_src); |
| 10091 | if (emit_bb) sema.emitBackwardBranch(block, .unneeded) catch |err| switch (err) { |
| 10092 | error.NeededSourceLocation => { |
| 10093 | const case_src = Module.SwitchProngSrc{ .range = .{ .prong = multi_i, .item = range_i } }; |
| 10094 | const decl = sema.mod.declPtr(case_block.src_decl); |
| 10095 | try sema.emitBackwardBranch(block, case_src.resolve(sema.gpa, decl, src_node_offset, .none)); |
| 10096 | return error.AnalysisFail; |
| 10097 | }, |
| 10098 | else => return err, |
| 10099 | }; |
| 10092 | 10100 | emit_bb = true; |
| 10093 | 10101 | |
| 10094 | 10102 | try sema.analyzeBodyRuntimeBreak(&case_block, body); |
| ... | ... | @@ -10101,7 +10109,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 10101 | 10109 | } |
| 10102 | 10110 | } |
| 10103 | 10111 | |
| 10104 | | for (items) |item_ref| { |
| 10112 | for (items) |item_ref, item_i| { |
| 10105 | 10113 | cases_len += 1; |
| 10106 | 10114 | |
| 10107 | 10115 | const item = try sema.resolveInst(item_ref); |
| ... | ... | @@ -10116,7 +10124,15 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 10116 | 10124 | break :blk field_ty.zigTypeTag() != .NoReturn; |
| 10117 | 10125 | } else true; |
| 10118 | 10126 | |
| 10119 | | if (emit_bb) try sema.emitBackwardBranch(block, case_src); |
| 10127 | if (emit_bb) sema.emitBackwardBranch(block, .unneeded) catch |err| switch (err) { |
| 10128 | error.NeededSourceLocation => { |
| 10129 | const case_src = Module.SwitchProngSrc{ .multi = .{ .prong = multi_i, .item = @intCast(u32, item_i) } }; |
| 10130 | const decl = sema.mod.declPtr(case_block.src_decl); |
| 10131 | try sema.emitBackwardBranch(block, case_src.resolve(sema.gpa, decl, src_node_offset, .none)); |
| 10132 | return error.AnalysisFail; |
| 10133 | }, |
| 10134 | else => return err, |
| 10135 | }; |
| 10120 | 10136 | emit_bb = true; |
| 10121 | 10137 | |
| 10122 | 10138 | if (analyze_body) { |