Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

@errorCast(...) with inferred error set hits assertion during semantic analysis #22986

Open
tauoverpi opened this issue Feb 23, 2025 · 0 comments
Labels
bug Observed behavior contradicts documented or intended behavior

Comments

@tauoverpi
Copy link
Contributor

tauoverpi commented Feb 23, 2025

Zig Version

0.14.0-dev.2643+fb43e91b2

Steps to Reproduce and Observed Behavior

found by Narctis on matrix, the following:

pub fn main() !void {
    return @errorCast(error.Foo);
}

results in tripping an assertion:

$ zig build-exe -fno-emit-bin bar.zig
thread 30939 panic: reached unreachable code
Analyzing bar.zig
      %2 = ret_type() 
      %3 = dbg_stmt(2, 12)
      %4 = error_value("Foo") 
    > %5 = extended(error_cast(%2, %4)) 
      %6 = dbg_stmt(2, 5)
      %7 = restore_err_ret_index_fn_entry(%5) 
      %8 = ret_node(%5) 
    For full context, use the command
      zig ast-check -t bar.zig

  in /home/tau/tmp/zig/zig-out/lib/zig/std/start.zig
    > %2052 = is_non_err(%2051) 
  in /home/tau/tmp/zig/zig-out/lib/zig/std/start.zig
    > %2054 = block({%2049..%2053}) 
  in /home/tau/tmp/zig/zig-out/lib/zig/std/start.zig
    > %2016 = switch_block(%2011,
        else => {%2034..%2138},
        @void_type => {%2017..%2025},
        @noreturn_type, @u8_type => {%2026..%2033}) 
  in /home/tau/tmp/zig/zig-out/lib/zig/std/start.zig
    > %1812 = call(.auto, %1810, []) 
  in /home/tau/tmp/zig/zig-out/lib/zig/std/start.zig
    > %1633 = call(.auto, %1631, [
        {%1634},
        {%1635},
        {%1636},
      ]) 
  in /home/tau/tmp/zig/zig-out/lib/zig/std/start.zig
    > %1630 = field_call(nodiscard .auto, %1628, "exit", [
        {%1631..%1637},
      ]) 

/home/tau/tmp/zig/src/Type.zig:3122:22: 0x2d01de5 in errorSetNames (zig)
            .signed => try pt.intValue(dest_ty, 0),
                     ^
/home/tau/tmp/zig/src/Sema.zig:23186:53: 0x2a00654 in zirErrorCast (zig)
            .val = if (addr == 0) .none else (try pt.ptrIntValue(ptr_ty.childType(zcu), addr)).toIntern(),
                                                    ^
/home/tau/tmp/zig/src/Sema.zig:1367:65: 0x25c7d4e in analyzeBodyInner (zig)
                    .shl_with_overflow  => try sema.zirOverflowArithmetic(block, extended, extended.opcode),
                                                                ^
/home/tau/tmp/zig/src/Sema.zig:998:26: 0x291cc14 in analyzeFnBody (zig)

                         ^
/home/tau/tmp/zig/src/Zcu/PerThread.zig:2704:23: 0x256a704 in analyzeFnBodyInner (zig)
        else => |e| return e,
                      ^
/home/tau/tmp/zig/src/Zcu/PerThread.zig:1643:40: 0x21f0142 in analyzeFuncBody (zig)

                                       ^
/home/tau/tmp/zig/src/Zcu/PerThread.zig:1563:66: 0x1eb5615 in ensureFuncBodyUpToDate (zig)
    };
                                                                 ^
/home/tau/tmp/zig/src/Sema.zig:35793:38: 0x25dac60 in resolveInferredErrorSet (zig)
            "struct '{}' depends on itself",
                                     ^
/home/tau/tmp/zig/src/Sema.zig:32546:69: 0x2a26c1f in analyzeIsNonErrComptimeOnly (zig)
    const child_ty = ptr_ty.childType(zcu);
                                                                    ^
/home/tau/tmp/zig/src/Sema.zig:32575:56: 0x2db6db6 in analyzeIsNonErr (zig)
    if (payload_ty.zigTypeTag(zcu) == .noreturn) {
                                                       ^
/home/tau/tmp/zig/src/Sema.zig:19342:32: 0x2994fce in zirIsNonErr (zig)
fn zirIsNonNullPtr(
                               ^
/home/tau/tmp/zig/src/Sema.zig:1180:66: 0x25c147c in analyzeBodyInner (zig)
            .func_fancy                   => try sema.zirFuncFancy(block, inst),
                                                                 ^
/home/tau/tmp/zig/src/Sema.zig:6238:34: 0x2dd70c5 in resolveBlockBody (zig)
) CompileError!Air.Inst.Ref {
                                 ^
/home/tau/tmp/zig/src/Sema.zig:6215:33: 0x2a217ac in zirBlock (zig)
        .src_base_inst = parent_block.src_base_inst,
                                ^
/home/tau/tmp/zig/src/Sema.zig:1670:37: 0x25cac25 in analyzeBodyInner (zig)

                                    ^
/home/tau/tmp/zig/src/Sema.zig:6238:34: 0x2dd70c5 in resolveBlockBody (zig)
) CompileError!Air.Inst.Ref {
                                 ^
/home/tau/tmp/zig/src/Sema.zig:10906:45: 0x2dcee65 in resolveProngComptime (zig)
                );
                                            ^
/home/tau/tmp/zig/src/Sema.zig:13396:36: 0x2dd91f4 in resolveSwitchComptime (zig)
        special.has_tag_capture,
                                   ^
/home/tau/tmp/zig/src/Sema.zig:13224:34: 0x2dce496 in resolveSwitchComptimeLoop (zig)
            multi_cases_len,
                                 ^
/home/tau/tmp/zig/src/Sema.zig:12431:49: 0x29a4d8e in zirSwitchBlock (zig)
                    special,
                                                ^
/home/tau/tmp/zig/src/Sema.zig:1203:69: 0x25c19da in analyzeBodyInner (zig)
            .ret_err_value_code           => try sema.zirRetErrValueCode(inst),
                                                                    ^
/home/tau/tmp/zig/src/Sema.zig:998:26: 0x291cc14 in analyzeFnBody (zig)

                         ^
/home/tau/tmp/zig/src/Sema.zig:8211:27: 0x2a3de6b in analyzeCall (zig)
                const param_name = zir_datas[@intFromEnum(inst)].str_tok.get(sema.code);
                          ^
/home/tau/tmp/zig/src/Sema.zig:7207:43: 0x29883f9 in zirCall__anon_451992 (zig)
        .num_args = args_len,
                                          ^
/home/tau/tmp/zig/src/Sema.zig:1136:62: 0x25c09d1 in analyzeBodyInner (zig)
            .bit_not                      => try sema.zirBitNot(block, inst),
                                                             ^
/home/tau/tmp/zig/src/Sema.zig:998:26: 0x291cc14 in analyzeFnBody (zig)

                         ^
/home/tau/tmp/zig/src/Sema.zig:8211:27: 0x2a3de6b in analyzeCall (zig)
                const param_name = zir_datas[@intFromEnum(inst)].str_tok.get(sema.code);
                          ^
/home/tau/tmp/zig/src/Sema.zig:7207:43: 0x29883f9 in zirCall__anon_451992 (zig)
        .num_args = args_len,
                                          ^
/home/tau/tmp/zig/src/Sema.zig:1136:62: 0x25c09d1 in analyzeBodyInner (zig)
            .bit_not                      => try sema.zirBitNot(block, inst),
                                                             ^
/home/tau/tmp/zig/src/Sema.zig:1016:30: 0x221e74e in analyzeInlineBody (zig)
/// return `error.ComptimeBreak`. If `block.isComptime()`, this function will never return `null`.
                             ^
/home/tau/tmp/zig/src/Sema.zig:1049:39: 0x1ec6001 in resolveInlineBody (zig)
/// body at comptime to a single result value.
                                      ^
/home/tau/tmp/zig/src/Sema.zig:7514:65: 0x2e4f596 in analyzeArg (zig)

                                                                ^
/home/tau/tmp/zig/src/Sema.zig:7750:41: 0x2a36b24 in analyzeCall (zig)
            break :ty param_ty;
                                        ^
/home/tau/tmp/zig/src/Sema.zig:7207:43: 0x29894d8 in zirCall__anon_451994 (zig)
        .num_args = args_len,
                                          ^
/home/tau/tmp/zig/src/Sema.zig:1137:62: 0x25c0a0c in analyzeBodyInner (zig)
            .bit_or                       => try sema.zirBitwise(block, inst, .bit_or),
                                                             ^
/home/tau/tmp/zig/src/Sema.zig:998:26: 0x291cc14 in analyzeFnBody (zig)

                         ^
/home/tau/tmp/zig/src/Zcu/PerThread.zig:2704:23: 0x256a704 in analyzeFnBodyInner (zig)
        else => |e| return e,
                      ^
/home/tau/tmp/zig/src/Zcu/PerThread.zig:1643:40: 0x21f0142 in analyzeFuncBody (zig)

                                       ^
/home/tau/tmp/zig/src/Zcu/PerThread.zig:1563:66: 0x1eb5615 in ensureFuncBodyUpToDate (zig)
    };
                                                                 ^
/home/tau/tmp/zig/src/Compilation.zig:3737:38: 0x1c97861 in processOneJob (zig)

                                     ^
/home/tau/tmp/zig/src/Compilation.zig:3674:30: 0x1b2ad5d in performAllTheWorkInner (zig)
        // https://github.com/llvm/llvm-project/issues/43698#issuecomment-2542660611
                             ^
/home/tau/tmp/zig/src/Compilation.zig:3533:36: 0x1a08def in performAllTheWork (zig)
            referenced_by = ref.referencer;
                                   ^
/home/tau/tmp/zig/src/Compilation.zig:2261:31: 0x1a01cc8 in update (zig)
                comp.root_name,
                              ^
/home/tau/tmp/zig/src/main.zig:4474:20: 0x1a3931d in updateModule (zig)
            // ASLR is probably a good default for better debugging experience/programming
                   ^
/home/tau/tmp/zig/src/main.zig:3664:21: 0x1a6f7f5 in buildOutputType (zig)
            var server = try addr.listen(.{
                    ^
/home/tau/tmp/zig/src/main.zig:264:31: 0x19407a6 in mainArgs (zig)
        }
                              ^
/home/tau/tmp/zig/src/main.zig:205:20: 0x193d86a in main (zig)
        return mainArgs(gpa_tracy.allocator(), arena, args);
                   ^
/home/tau/tmp/zig/lib/std/start.zig:656:37: 0x193d0f2 in posixCallMainAndExit (zig)
            const result = root.main() catch |err| {
                                    ^
/home/tau/tmp/zig/lib/std/start.zig:271:5: 0x193ccdd in _start (zig)
    asm volatile (switch (native_arch) {
    ^

Expected Behavior

Likely compile error as there's no known error set.

@tauoverpi tauoverpi added the bug Observed behavior contradicts documented or intended behavior label Feb 23, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Observed behavior contradicts documented or intended behavior
Projects
None yet
Development

No branches or pull requests

1 participant