| ... | ... | @@ -7774,7 +7774,12 @@ fn zirSwitchCapture( |
| 7774 | 7774 | } |
| 7775 | 7775 | |
| 7776 | 7776 | switch (operand_ty.zigTypeTag()) { |
| 7777 | | .ErrorSet => return sema.bitCast(block, block.switch_else_err_ty.?, operand, operand_src), |
| 7777 | .ErrorSet => if (block.switch_else_err_ty) |some| { |
| 7778 | return sema.bitCast(block, some, operand, operand_src); |
| 7779 | } else { |
| 7780 | try block.addUnreachable(operand_src, false); |
| 7781 | return Air.Inst.Ref.unreachable_value; |
| 7782 | }, |
| 7778 | 7783 | else => return operand, |
| 7779 | 7784 | } |
| 7780 | 7785 | } |
| ... | ... | @@ -8194,7 +8199,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 8194 | 8199 | ); |
| 8195 | 8200 | } |
| 8196 | 8201 | else_error_ty = Type.@"anyerror"; |
| 8197 | | } else { |
| 8202 | } else else_validation: { |
| 8198 | 8203 | var maybe_msg: ?*Module.ErrorMsg = null; |
| 8199 | 8204 | errdefer if (maybe_msg) |msg| msg.destroy(sema.gpa); |
| 8200 | 8205 | |
| ... | ... | @@ -8231,6 +8236,27 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 8231 | 8236 | } |
| 8232 | 8237 | |
| 8233 | 8238 | if (special_prong == .@"else" and seen_errors.count() == operand_ty.errorSetNames().len) { |
| 8239 | |
| 8240 | // In order to enable common patterns for generic code allow simple else bodies |
| 8241 | // else => unreachable, |
| 8242 | // else => return, |
| 8243 | // else => |e| return e, |
| 8244 | // even if all the possible errors were already handled. |
| 8245 | const tags = sema.code.instructions.items(.tag); |
| 8246 | for (special.body) |else_inst| switch (tags[else_inst]) { |
| 8247 | .dbg_block_begin, |
| 8248 | .dbg_block_end, |
| 8249 | .dbg_stmt, |
| 8250 | .dbg_var_val, |
| 8251 | .switch_capture, |
| 8252 | .ret_type, |
| 8253 | .as_node, |
| 8254 | .ret_node, |
| 8255 | .@"unreachable", |
| 8256 | => {}, |
| 8257 | else => break, |
| 8258 | } else break :else_validation; |
| 8259 | |
| 8234 | 8260 | return sema.fail( |
| 8235 | 8261 | block, |
| 8236 | 8262 | special_prong_src, |