zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit f7822029100de9f91c9a7758ffb32d95f7768f70 (tree)
parent abb8e7478d365088301a9390c12f86b2ad381ce9
Author: Veikka Tuominen <git@vexu.eu>
Date:   Mon, 29 Jan 2024 11:57:29 +0200

Sema: do not emit `@errorCast` safety check when dest is adhoc inferred error set

Closes #17354

Diffstat:
Msrc/Sema.zig | 5++++-
Mtest/behavior/error.zig | 12++++++++++++
2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -22368,7 +22368,10 @@ fn zirErrorCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData try sema.requireRuntimeBlock(block, src, operand_src); const err_int_ty = try mod.errorIntType(); - if (block.wantSafety() and !dest_ty.isAnyError(mod) and sema.mod.backendSupportsFeature(.error_set_has_value)) { + if (block.wantSafety() and !dest_ty.isAnyError(mod) and + dest_ty.toIntern() != .adhoc_inferred_error_set_type and + sema.mod.backendSupportsFeature(.error_set_has_value)) + { if (dest_tag == .ErrorUnion) { const err_code = try sema.analyzeErrUnionCode(block, operand_src, operand); const err_int = try block.addBitCast(err_int_ty, err_code); diff --git a/test/behavior/error.zig b/test/behavior/error.zig @@ -1027,3 +1027,15 @@ test "generic type constructed from inferred error set of unresolved function" { }; _ = std.io.multiWriter(.{S.writer()}); } + +test "errorCast to adhoc inferred error set" { + const S = struct { + inline fn baz() !i32 { + return @errorCast(err()); + } + fn err() anyerror!i32 { + return 1234; + } + }; + try std.testing.expect((try S.baz()) == 1234); +}