Skip to content

x86_64 backend: @intCast in airBitCast failing on !PathSpace return type #15904

Closed
@squeek502

Description

@squeek502

Zig Version

0.11.0-dev.3324+706bdf651

Steps to Reproduce and Observed Behavior

This is a minimal reproduction of the crashes caused by #15768 (see #15768 (comment))

// test.zig
const std = @import("std");
const PathSpace = std.os.windows.PathSpace;

fn foo() !PathSpace {
    return bar();
}

fn bar() !PathSpace {
    var path_space: PathSpace = undefined;
    return path_space;
}

pub fn main() !void {
    _ = try foo();
}
zig build-exe test.zig -fno-LLVM

Output (with a debug print to print the failing abiSize and bitSize):

> zig build-exe empty.zig -fno-LLVM
abiSize: 0x10010 bitSize: 0x80080
thread 8140 panic: integer cast truncated bits
Analyzing empty.zig: empty.zig:main
      %60 = dbg_block_begin()
      %61 = dbg_stmt(2, 9)
      %62 = decl_val("foo") token_offset:14:13 to :14:16
      %63 = dbg_stmt(2, 16)
      %64 = call(.auto, %62, []) node_offset:14:13 to :14:18
    > %65 = try(%64, {
        %66 = err_union_code(%64) node_offset:14:9 to :14:18
        %67 = dbg_stmt(2, 9)
        %68 = ret_node(%66) node_offset:14:9 to :14:18
      }) node_offset:14:9 to :14:18
      %69 = ensure_result_non_error(%65) node_offset:14:9 to :14:18
      %70 = dbg_block_end()
      %71 = restore_err_ret_index(%59, @Zir.Inst.Ref.none)
      %72 = break(%59, @Zir.Inst.Ref.void_value)
    For full context, use the command
      zig ast-check -t empty.zig

  in empty.zig: empty.zig:main
    > %59 = block({%60..%72}) node_offset:13:21 to :13:22
  in C:\Users\Ryan\Programming\Zig\zig\lib\std\start.zig: start.zig:callMain
    > %3049 = is_non_err(%3048)
  in C:\Users\Ryan\Programming\Zig\zig\lib\std\start.zig: start.zig:callMain
    > %3051 = block({%3045..%3050})
  in C:\Users\Ryan\Programming\Zig\zig\lib\std\start.zig: start.zig:callMain
    > %3042 = block({%3043..%3192})
  in C:\Users\Ryan\Programming\Zig\zig\lib\std\start.zig: start.zig:callMain
    > %2947 = switch_block(%2944,
        else => {%3195..%3201},
        %2949 => {%2950..%2962},
        %2964 => {%2965..%2983},
        %2986 => {%2984..%3038},
        %3040 => {%3041..%3194})
  in C:\Users\Ryan\Programming\Zig\zig\lib\std\start.zig: start.zig:callMain
    > %2929 = block({%2930..%3205})
  in C:\Users\Ryan\Programming\Zig\zig\lib\std\start.zig: start.zig:initEventLoopAndCallMain
    > %2650 = builtin_call(%2648, %2649, @Zir.Inst.Ref.empty_struct)
  in C:\Users\Ryan\Programming\Zig\zig\lib\std\start.zig: start.zig:initEventLoopAndCallMain
    > %2497 = block({%2498..%2658})
  in C:\Users\Ryan\Programming\Zig\zig\lib\std\start.zig: start.zig:WinStartup
    > %1586 = call(.auto, %1584, [])
  in C:\Users\Ryan\Programming\Zig\zig\lib\std\start.zig: start.zig:WinStartup
    > %1583 = field_call(nodiscard .auto, %1580, ExitProcess, [
        {%1584..%1587},
      ])
  in C:\Users\Ryan\Programming\Zig\zig\lib\std\start.zig: start.zig:WinStartup
    > %1529 = block({%1530..%1590})

C:\Users\Ryan\Programming\Zig\zig\src\arch\x86_64\CodeGen.zig:10179:26: 0x7ff64d46bd1a in airBitCast (zig.exe.obj)
        const abi_size = @intCast(u16, dst_ty.abiSize(self.target.*));
                         ^
C:\Users\Ryan\Programming\Zig\zig\src\arch\x86_64\CodeGen.zig:1813:52: 0x7ff64d108304 in genBody (zig.exe.obj)
            .bitcast         => try self.airBitCast(inst),
                                                   ^
C:\Users\Ryan\Programming\Zig\zig\src\arch\x86_64\CodeGen.zig:1600:25: 0x7ff64cd83b3c in gen (zig.exe.obj)
        try self.genBody(self.air.getMainBody());
                        ^
C:\Users\Ryan\Programming\Zig\zig\src\arch\x86_64\CodeGen.zig:729:17: 0x7ff64c9802a7 in generate (zig.exe.obj)
    function.gen() catch |err| switch (err) {
                ^
C:\Users\Ryan\Programming\Zig\zig\src\codegen.zig:85:70: 0x7ff64c48cc3d in generateFunction (zig.exe.obj)
        .x86_64 => return @import("arch/x86_64/CodeGen.zig").generate(bin_file, src_loc, func, air, liveness, code, debug_output),
                                                                     ^
C:\Users\Ryan\Programming\Zig\zig\src\link\Coff.zig:1057:45: 0x7ff64c4890a6 in updateFunc (zig.exe.obj)
    const res = try codegen.generateFunction(
                                            ^
C:\Users\Ryan\Programming\Zig\zig\src\link.zig:578:77: 0x7ff64c1d82e3 in updateFunc (zig.exe.obj)
            .coff  => return @fieldParentPtr(Coff,  "base", base).updateFunc(module, func, air, liveness),
                                                                            ^
C:\Users\Ryan\Programming\Zig\zig\src\Module.zig:4406:37: 0x7ff64bfc96e2 in ensureFuncBodyAnalyzed (zig.exe.obj)
            comp.bin_file.updateFunc(mod, func, air, liveness) catch |err| switch (err) {
                                    ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:28955:36: 0x7ff64caf0c69 in ensureFuncBodyAnalyzed (zig.exe.obj)
    sema.mod.ensureFuncBodyAnalyzed(func) catch |err| {
                                   ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:31650:40: 0x7ff64c5cb5bf in resolveInferredErrorSet (zig.exe.obj)
        try sema.ensureFuncBodyAnalyzed(ies.func);
                                       ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:29247:49: 0x7ff64c599131 in analyzeIsNonErrComptimeOnly (zig.exe.obj)
                try sema.resolveInferredErrorSet(block, src, ies);
                                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:17083:60: 0x7ff64c598117 in zirTry (zig.exe.obj)
    const is_non_err = try sema.analyzeIsNonErrComptimeOnly(parent_block, operand_src, err_union);
                                                           ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:1616:67: 0x7ff64c2019b2 in analyzeBodyInner (zig.exe.obj)
                if (!block.is_comptime) break :blk try sema.zirTry(block, inst);
                                                                  ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:5500:34: 0x7ff64ca58b74 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:5483:33: 0x7ff64c59c536 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:1461:49: 0x7ff64c203aed in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:804:30: 0x7ff64c47517e in analyzeBody (zig.exe.obj)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
C:\Users\Ryan\Programming\Zig\zig\src\Module.zig:5709:21: 0x7ff64c1d5ed4 in analyzeFnBody (zig.exe.obj)
    sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                    ^
C:\Users\Ryan\Programming\Zig\zig\src\Module.zig:4338:40: 0x7ff64bfc8db5 in ensureFuncBodyAnalyzed (zig.exe.obj)
            var air = mod.analyzeFnBody(func, sema_arena) catch |err| switch (err) {
                                       ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:28955:36: 0x7ff64caf0c69 in ensureFuncBodyAnalyzed (zig.exe.obj)
    sema.mod.ensureFuncBodyAnalyzed(func) catch |err| {
                                   ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:31650:40: 0x7ff64c5cb5bf in resolveInferredErrorSet (zig.exe.obj)
        try sema.ensureFuncBodyAnalyzed(ies.func);
                                       ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:29247:49: 0x7ff64c599131 in analyzeIsNonErrComptimeOnly (zig.exe.obj)
                try sema.resolveInferredErrorSet(block, src, ies);
                                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:29274:56: 0x7ff64ca3c8ea in analyzeIsNonErr (zig.exe.obj)
    const result = try sema.analyzeIsNonErrComptimeOnly(block, src, operand);
                                                       ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:16970:32: 0x7ff64c4e066d in zirIsNonErr (zig.exe.obj)
    return sema.analyzeIsNonErr(block, src, operand);
                               ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:966:66: 0x7ff64c1f1491 in analyzeBodyInner (zig.exe.obj)
            .is_non_err                   => try sema.zirIsNonErr(block, inst),
                                                                 ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:5500:34: 0x7ff64ca58b74 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:5483:33: 0x7ff64c59c536 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:1461:49: 0x7ff64c203aed in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:5500:34: 0x7ff64ca58b74 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:5483:33: 0x7ff64c59c536 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:1461:49: 0x7ff64c203aed in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:5500:34: 0x7ff64ca58b74 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:11001:49: 0x7ff64c4f1054 in zirSwitchBlock (zig.exe.obj)
                    return sema.resolveBlockBody(block, src, &child_block, body, inst, merges);
                                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:989:69: 0x7ff64c1f29f1 in analyzeBodyInner (zig.exe.obj)
            .switch_block                 => try sema.zirSwitchBlock(block, inst),
                                                                    ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:5500:34: 0x7ff64ca58b74 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:5483:33: 0x7ff64c59c536 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:1461:49: 0x7ff64c203aed in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:804:30: 0x7ff64c47517e in analyzeBody (zig.exe.obj)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:6963:33: 0x7ff64ca23512 in analyzeCall (zig.exe.obj)
                sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {
                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:21716:28: 0x7ff64c5310cd in zirBuiltinCall (zig.exe.obj)
    return sema.analyzeCall(block, func, func_ty, func_src, call_src, modifier, ensure_result_used, resolved_args, null, null);
                           ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:1045:69: 0x7ff64c1f5e41 in analyzeBodyInner (zig.exe.obj)
            .builtin_call                 => try sema.zirBuiltinCall(block, inst),
                                                                    ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:5500:34: 0x7ff64ca58b74 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:5483:33: 0x7ff64c59c536 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:1461:49: 0x7ff64c203aed in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:804:30: 0x7ff64c47517e in analyzeBody (zig.exe.obj)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:6963:33: 0x7ff64ca23512 in analyzeCall (zig.exe.obj)
                sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {
                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:6403:32: 0x7ff64c4cf641 in zirCall__anon_132153 (zig.exe.obj)
        return sema.analyzeCall(block, func, func_ty, callee_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, call_dbg_node);
                               ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:923:62: 0x7ff64c1eec44 in analyzeBodyInner (zig.exe.obj)
            .call                         => try sema.zirCall(block, inst, .direct),
                                                             ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:821:45: 0x7ff64bfea330 in analyzeBodyBreak (zig.exe.obj)
    const break_inst = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                                            ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:770:50: 0x7ff64ca17c3c in resolveBody (zig.exe.obj)
    const break_data = (try sema.analyzeBodyBreak(block, body)) orelse
                                                 ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:6349:46: 0x7ff64c4d0ff6 in zirCall__anon_132155 (zig.exe.obj)
        const resolved = try sema.resolveBody(block, args_body[arg_start..arg_end], inst);
                                             ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:924:62: 0x7ff64c1eed30 in analyzeBodyInner (zig.exe.obj)
            .field_call                   => try sema.zirCall(block, inst, .field),
                                                             ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:5500:34: 0x7ff64ca58b74 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:5483:33: 0x7ff64c59c536 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:1461:49: 0x7ff64c203aed in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\Users\Ryan\Programming\Zig\zig\src\Sema.zig:804:30: 0x7ff64c47517e in analyzeBody (zig.exe.obj)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
C:\Users\Ryan\Programming\Zig\zig\src\Module.zig:5709:21: 0x7ff64c1d5ed4 in analyzeFnBody (zig.exe.obj)
    sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                    ^
C:\Users\Ryan\Programming\Zig\zig\src\Module.zig:4338:40: 0x7ff64bfc8db5 in ensureFuncBodyAnalyzed (zig.exe.obj)
            var air = mod.analyzeFnBody(func, sema_arena) catch |err| switch (err) {
                                       ^
C:\Users\Ryan\Programming\Zig\zig\src\Compilation.zig:3128:42: 0x7ff64bfc6d4d in processOneJob (zig.exe.obj)
            module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
                                         ^
C:\Users\Ryan\Programming\Zig\zig\src\Compilation.zig:3065:30: 0x7ff64be93175 in performAllTheWork (zig.exe.obj)
            try processOneJob(comp, work_item, main_progress_node);
                             ^
C:\Users\Ryan\Programming\Zig\zig\src\Compilation.zig:2021:31: 0x7ff64be8f5da in update (zig.exe.obj)
    try comp.performAllTheWork(main_progress_node);
                              ^
C:\Users\Ryan\Programming\Zig\zig\src\main.zig:3866:24: 0x7ff64bebd344 in updateModule (zig.exe.obj)
        try comp.update(main_progress_node);
                       ^
C:\Users\Ryan\Programming\Zig\zig\src\main.zig:3301:17: 0x7ff64bd304b4 in buildOutputType (zig.exe.obj)
    updateModule(comp) catch |err| switch (err) {
                ^
C:\Users\Ryan\Programming\Zig\zig\src\main.zig:269:31: 0x7ff64bd02e71 in mainArgs (zig.exe.obj)
        return buildOutputType(gpa, arena, args, .{ .build = .Exe });
                              ^
C:\Users\Ryan\Programming\Zig\zig\src\main.zig:213:20: 0x7ff64bd02a1e in main (zig.exe.obj)
    return mainArgs(gpa, arena, args);
                   ^
C:\Users\Ryan\Programming\Zig\zig\lib\std\start.zig:508:80: 0x7ff64bd04951 in main (zig.exe.obj)
    return @call(.always_inline, callMainWithArgs, .{ @intCast(usize, c_argc), @ptrCast([*][*:0]u8, c_argv), envp });
                                                                               ^
???:?:?: 0x7ff64dae4034 in ??? (zig.exe)
???:?:?: 0x7ff64dae408b in ??? (zig.exe)
???:?:?: 0x7fff3d197613 in ??? (KERNEL32.DLL)
???:?:?: 0x7fff3d9e26a0 in ??? (ntdll.dll)

Notes:

  • Does not reproduce if foo returns a PathSpace directly (i.e. it needs the call to bar to reproduce the problem)
  • Does not reproduce if foo does not return an error union
  • The airBitCast function is seemingly not called at all for the !PathSpace return type in instances where the problem does not reproduce, but I could totally be wrong about that

Expected Behavior

No compiler crash

Metadata

Metadata

Assignees

No one assigned

    Labels

    arch-x86_6464-bit x86backend-self-hostedbugObserved behavior contradicts documented or intended behavior

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions