| ... | ... | @@ -14209,9 +14209,46 @@ fn zirErrSetCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstDat |
| 14209 | 14209 | try sema.checkErrorSetType(block, dest_ty_src, dest_ty); |
| 14210 | 14210 | try sema.checkErrorSetType(block, operand_src, operand_ty); |
| 14211 | 14211 | |
| 14212 | | if (try sema.resolveDefinedValue(block, operand_src, operand)) |val| { |
| 14213 | | try sema.resolveInferredErrorSetTy(block, src, dest_ty); |
| 14212 | // operand must be defined since it can be an invalid error value |
| 14213 | const maybe_operand_val = try sema.resolveDefinedValue(block, operand_src, operand); |
| 14214 | |
| 14215 | if (disjoint: { |
| 14216 | // Try avoiding resolving inferred error sets if we can |
| 14217 | if (!dest_ty.isAnyError() and dest_ty.errorSetNames().len == 0) break :disjoint true; |
| 14218 | if (!operand_ty.isAnyError() and operand_ty.errorSetNames().len == 0) break :disjoint true; |
| 14219 | if (dest_ty.isAnyError()) break :disjoint false; |
| 14220 | if (operand_ty.isAnyError()) break :disjoint false; |
| 14221 | for (dest_ty.errorSetNames()) |dest_err_name| |
| 14222 | if (operand_ty.errorSetHasField(dest_err_name)) |
| 14223 | break :disjoint false; |
| 14224 | |
| 14225 | if (dest_ty.tag() != .error_set_inferred and operand_ty.tag() != .error_set_inferred) |
| 14226 | break :disjoint true; |
| 14227 | |
| 14228 | try sema.resolveInferredErrorSetTy(block, dest_ty_src, dest_ty); |
| 14229 | try sema.resolveInferredErrorSetTy(block, operand_src, operand_ty); |
| 14230 | for (dest_ty.errorSetNames()) |dest_err_name| |
| 14231 | if (operand_ty.errorSetHasField(dest_err_name)) |
| 14232 | break :disjoint false; |
| 14233 | |
| 14234 | break :disjoint true; |
| 14235 | }) { |
| 14236 | const msg = msg: { |
| 14237 | const msg = try sema.errMsg( |
| 14238 | block, |
| 14239 | src, |
| 14240 | "error sets '{}' and '{}' have no common errors", |
| 14241 | .{ operand_ty.fmt(sema.mod), dest_ty.fmt(sema.mod) }, |
| 14242 | ); |
| 14243 | errdefer msg.destroy(sema.gpa); |
| 14244 | try sema.addDeclaredHereNote(msg, operand_ty); |
| 14245 | try sema.addDeclaredHereNote(msg, dest_ty); |
| 14246 | break :msg msg; |
| 14247 | }; |
| 14248 | return sema.failWithOwnedErrorMsg(block, msg); |
| 14249 | } |
| 14214 | 14250 | |
| 14251 | if (maybe_operand_val) |val| { |
| 14215 | 14252 | if (!dest_ty.isAnyError()) { |
| 14216 | 14253 | const error_name = val.castTag(.@"error").?.data.name; |
| 14217 | 14254 | if (!dest_ty.errorSetHasField(error_name)) { |