Skip to content

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

@tauoverpi

Description

@tauoverpi

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugObserved behavior contradicts documented or intended behavior

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions