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

Crash during CBE codegen of inline else prong switching on union #16186

Closed
kcbanner opened this issue Jun 24, 2023 · 2 comments · Fixed by #16188
Closed

Crash during CBE codegen of inline else prong switching on union #16186

kcbanner opened this issue Jun 24, 2023 · 2 comments · Fixed by #16188
Labels
backend-c The C backend (CBE) outputs C source code. bug Observed behavior contradicts documented or intended behavior
Milestone

Comments

@kcbanner
Copy link
Contributor

kcbanner commented Jun 24, 2023

Zig Version

0.11.0-dev.3790+95a94ac23

Steps to Reproduce and Observed Behavior

Found this via the CI on #15823 (somehow this branch keeps crashing the compiler :D)

Reduction:

fn InstructionType() type {
    const InstructionOperands = @Type(.{
        .Struct = .{
            .layout = .Auto,
            .fields = &.{},
            .decls = &.{},
            .is_tuple = false,
        },
    });

    return struct {
        const Self = @This();
        operands: InstructionOperands,

        pub fn read() !Self {
            var operands: InstructionOperands = undefined;
            return .{ .operands = operands };
        }
    };
}

pub const Instruction = union(enum) {
    nop: InstructionType(),

    fn readOperands(self: *Instruction) !void {
        switch (self.*) {
            inline else => |*inst| inst.* = try @TypeOf(inst.*).read(),
        }
    }
};

pub fn main() !void {
    var inst = Instruction{ .nop = undefined };
    try inst.readOperands();
}
c:\cygwin64\home\kcbanner\temp>zig-debug build-exe inline_else_crash.zig -fno-LLVM -fno-LLD -ofmt=c -lc -target x86_64-linux -mcpu x86_64 --zig-lib-dir c:\cygwin64\home\kcbanner\kit\zig\lib
thread 39780 panic: reached unreachable code
Analyzing inline_else_crash.zig: inline_else_crash.zig:Instruction.readOperands
      %87 = dbg_block_begin()
      %88 = dbg_var_val(%86, "inst")
      %89 = dbg_stmt(3, 36)
      %90 = validate_deref(%86) node_offset:27:36 to :27:42
      %91 = dbg_stmt(3, 45)
      %92 = typeof_builtin({
        %93 = validate_deref(%86) node_offset:27:57 to :27:63
        %94 = load(%86) node_offset:27:57 to :27:63
        %95 = break_inline(%92, %94)
      }) node_offset:27:49 to :27:64
      %96 = ref(%92) token_offset:27:49 to :27:56
      %97 = dbg_stmt(3, 64)
      %98 = dbg_stmt(3, 69)
      %99 = field_call(.auto, %96, "read", []) node_offset:27:49 to :27:71
    > %100 = try(%99, {
        %101 = err_union_code(%99) node_offset:27:45 to :27:71
        %102 = dbg_stmt(3, 45)
        %103 = ret_node(%101) node_offset:27:45 to :27:71
      }) node_offset:27:45 to :27:71
      %104 = store_node(%86, %100) node_offset:27:36 to :27:71
      %105 = dbg_block_end()
      %106 = break(%86, @InternPool.Index.void_value)
    For full context, use the command
      zig ast-check -t inline_else_crash.zig

  in inline_else_crash.zig: inline_else_crash.zig:Instruction.readOperands
    > %86 = switch_block_ref(%80,
        by_ref inline else => {%87..%106}) node_offset:26:9 to :26:15
  in inline_else_crash.zig: inline_else_crash.zig:Instruction.readOperands
    > %81 = block({%82..%110}) node_offset:25:47 to :25:48
  in inline_else_crash.zig: inline_else_crash.zig:main
    > %136 = try(%135, {%137..%139}) node_offset:34:5 to :34:28
  in inline_else_crash.zig: inline_else_crash.zig:main
    > %118 = block({%119..%143}) node_offset:32:21 to :32:22
  in c:\cygwin64\home\kcbanner\kit\zig\lib\std\start.zig: start.zig:callMain
    > %2958 = is_non_err(%2957)
  in c:\cygwin64\home\kcbanner\kit\zig\lib\std\start.zig: start.zig:callMain
    > %2960 = block({%2954..%2959})
  in c:\cygwin64\home\kcbanner\kit\zig\lib\std\start.zig: start.zig:callMain
    > %2951 = block({%2952..%3096})
  in c:\cygwin64\home\kcbanner\kit\zig\lib\std\start.zig: start.zig:callMain
    > %2861 = switch_block(%2859,
        else => {%3099..%3105},
        %2862 => {%2863..%2875},
        %2876 => {%2877..%2895},
        by_val %2896 => {%2897..%2948},
        %2949 => {%2950..%3098})
  in c:\cygwin64\home\kcbanner\kit\zig\lib\std\start.zig: start.zig:callMain
    > %2845 = block({%2846..%3109})
  in c:\cygwin64\home\kcbanner\kit\zig\lib\std\start.zig: start.zig:initEventLoopAndCallMain
    > %2566 = builtin_call(%2564, %2565, @InternPool.Index.empty_struct)
  in c:\cygwin64\home\kcbanner\kit\zig\lib\std\start.zig: start.zig:initEventLoopAndCallMain
    > %2413 = block({%2414..%2574})
  in c:\cygwin64\home\kcbanner\kit\zig\lib\std\start.zig: start.zig:callMainWithArgs
    > %2189 = call(.auto, %2187, [])
  in c:\cygwin64\home\kcbanner\kit\zig\lib\std\start.zig: start.zig:callMainWithArgs
    > %2152 = block({%2153..%2197})
  in c:\cygwin64\home\kcbanner\kit\zig\lib\std\start.zig: start.zig:main
    > %2348 = builtin_call(%2336, %2337, %2347)
  in c:\cygwin64\home\kcbanner\kit\zig\lib\std\start.zig: start.zig:main
    > %2219 = block({%2220..%2356})

C:\cygwin64\home\kcbanner\kit\zig\lib\std\debug.zig:272:14: 0x7ff6e7216317 in assert (zig.exe.obj)
    comptime format: []const u8,
             ^
C:\cygwin64\home\kcbanner\kit\zig\src\InternPool.zig:3581:19: 0x7ff6e72cff35 in get (zig.exe.obj)
            assert(ip.isIntegerType(int.ty));
                  ^
C:\cygwin64\home\kcbanner\kit\zig\src\Module.zig:6673:31: 0x7ff6e736bdfd in intern (zig.exe.obj)
    return mod.intern_pool.get(mod.gpa, key);
                              ^
C:\cygwin64\home\kcbanner\kit\zig\src\Module.zig:6867:25: 0x7ff6e75cf1f2 in intValue_u64 (zig.exe.obj)
    const i = try intern(mod, .{ .int = .{
                        ^
C:\cygwin64\home\kcbanner\kit\zig\src\Module.zig:6851:60: 0x7ff6e77a19bb in intValue__anon_119455 (zig.exe.obj)
    if (std.math.cast(u64, x)) |casted| return intValue_u64(mod, ty, casted);
                                                           ^
C:\cygwin64\home\kcbanner\kit\zig\src\codegen\c.zig:5664:71: 0x7ff6e842b506 in airErrUnionPayloadPtrSet (zig.exe.obj)
        try f.object.dg.renderValue(writer, error_ty, try mod.intValue(error_ty, 0), .Other);
                                                                      ^
C:\cygwin64\home\kcbanner\kit\zig\src\codegen\c.zig:3042:73: 0x7ff6e7fb560b in genBodyInner (zig.exe.obj)
            .errunion_payload_ptr_set    => try airErrUnionPayloadPtrSet(f, inst),
                                                                        ^
C:\cygwin64\home\kcbanner\kit\zig\src\codegen\c.zig:2754:25: 0x7ff6e7fb6935 in genBody (zig.exe.obj)
        try genBodyInner(f, body);
                        ^
C:\cygwin64\home\kcbanner\kit\zig\src\codegen\c.zig:2795:20: 0x7ff6e79c15ce in genBodyResolveState (zig.exe.obj)
        try genBody(f, body);
                   ^
C:\cygwin64\home\kcbanner\kit\zig\src\codegen\c.zig:2616:28: 0x7ff6e79c06ff in genFunc (zig.exe.obj)
    try genBodyResolveState(f, undefined, &.{}, main_body, false);
                           ^
C:\cygwin64\home\kcbanner\kit\zig\src\link\C.zig:136:20: 0x7ff6e79c23bb in updateFunc (zig.exe.obj)
    codegen.genFunc(&function) catch |err| switch (err) {
                   ^
C:\cygwin64\home\kcbanner\kit\zig\src\link.zig:574:77: 0x7ff6e771e7d4 in updateFunc (zig.exe.obj)
            .c     => return @fieldParentPtr(C,     "base", base).updateFunc(module, func_index, air, liveness),
                                                                            ^
C:\cygwin64\home\kcbanner\kit\zig\src\Module.zig:4215:37: 0x7ff6e7539dab in ensureFuncBodyAnalyzed (zig.exe.obj)
            comp.bin_file.updateFunc(mod, func_index, air, liveness) catch |err| switch (err) {
                                    ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:30201:36: 0x7ff6e80c3019 in ensureFuncBodyAnalyzed (zig.exe.obj)
    sema.mod.ensureFuncBodyAnalyzed(func) catch |err| {
                                   ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:33965:40: 0x7ff6e7b051d9 in resolveInferredErrorSet (zig.exe.obj)
        try sema.ensureFuncBodyAnalyzed(ies.func);
                                       ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:30529:53: 0x7ff6e7ad2209 in analyzeIsNonErrComptimeOnly (zig.exe.obj)
                    try sema.resolveInferredErrorSet(block, src, ies_index);
                                                    ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:17979:60: 0x7ff6e7ad1064 in zirTry (zig.exe.obj)
    const is_non_err = try sema.analyzeIsNonErrComptimeOnly(parent_block, operand_src, err_union);
                                                           ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1641:67: 0x7ff6e774b156 in analyzeBodyInner (zig.exe.obj)
                if (!block.is_comptime) break :blk try sema.zirTry(block, inst);
                                                                  ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5629:34: 0x7ff6e809f884 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:10150:45: 0x7ff6e8036926 in resolveProngComptime (zig.exe.obj)
                return sema.resolveBlockBody(spa.parent_block, src, child_block, prong_body, spa.switch_block_inst, merges);
                                            ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:11439:40: 0x7ff6e7a1ce70 in zirSwitchBlock (zig.exe.obj)
        return spa.resolveProngComptime(
                                       ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1011:69: 0x7ff6e773d860 in analyzeBodyInner (zig.exe.obj)
            .switch_block_ref             => try sema.zirSwitchBlock(block, inst, true),
                                                                    ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5629:34: 0x7ff6e809f884 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5612:33: 0x7ff6e7ad5ab9 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1486:49: 0x7ff6e774d0cf in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:823:30: 0x7ff6e7997a4e in analyzeBody (zig.exe.obj)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
C:\cygwin64\home\kcbanner\kit\zig\src\Module.zig:5551:21: 0x7ff6e771caad in analyzeFnBody (zig.exe.obj)
    sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                    ^
C:\cygwin64\home\kcbanner\kit\zig\src\Module.zig:4149:40: 0x7ff6e7539425 in ensureFuncBodyAnalyzed (zig.exe.obj)
            var air = mod.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) {
                                       ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:30201:36: 0x7ff6e80c3019 in ensureFuncBodyAnalyzed (zig.exe.obj)
    sema.mod.ensureFuncBodyAnalyzed(func) catch |err| {
                                   ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:33965:40: 0x7ff6e7b051d9 in resolveInferredErrorSet (zig.exe.obj)
        try sema.ensureFuncBodyAnalyzed(ies.func);
                                       ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:30529:53: 0x7ff6e7ad2209 in analyzeIsNonErrComptimeOnly (zig.exe.obj)
                    try sema.resolveInferredErrorSet(block, src, ies_index);
                                                    ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:17979:60: 0x7ff6e7ad1064 in zirTry (zig.exe.obj)
    const is_non_err = try sema.analyzeIsNonErrComptimeOnly(parent_block, operand_src, err_union);
                                                           ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1641:67: 0x7ff6e774b156 in analyzeBodyInner (zig.exe.obj)
                if (!block.is_comptime) break :blk try sema.zirTry(block, inst);
                                                                  ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5629:34: 0x7ff6e809f884 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5612:33: 0x7ff6e7ad5ab9 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1486:49: 0x7ff6e774d0cf in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:823:30: 0x7ff6e7997a4e in analyzeBody (zig.exe.obj)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
C:\cygwin64\home\kcbanner\kit\zig\src\Module.zig:5551:21: 0x7ff6e771caad in analyzeFnBody (zig.exe.obj)
    sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                    ^
C:\cygwin64\home\kcbanner\kit\zig\src\Module.zig:4149:40: 0x7ff6e7539425 in ensureFuncBodyAnalyzed (zig.exe.obj)
            var air = mod.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) {
                                       ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:30201:36: 0x7ff6e80c3019 in ensureFuncBodyAnalyzed (zig.exe.obj)
    sema.mod.ensureFuncBodyAnalyzed(func) catch |err| {
                                   ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:33965:40: 0x7ff6e7b051d9 in resolveInferredErrorSet (zig.exe.obj)
        try sema.ensureFuncBodyAnalyzed(ies.func);
                                       ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:30529:53: 0x7ff6e7ad2209 in analyzeIsNonErrComptimeOnly (zig.exe.obj)
                    try sema.resolveInferredErrorSet(block, src, ies_index);
                                                    ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:30557:56: 0x7ff6e80149ca in analyzeIsNonErr (zig.exe.obj)
    const result = try sema.analyzeIsNonErrComptimeOnly(block, src, operand);
                                                       ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:17863:32: 0x7ff6e7a0952b in zirIsNonErr (zig.exe.obj)
    return sema.analyzeIsNonErr(block, src, operand);
                               ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:987:66: 0x7ff6e773c3b1 in analyzeBodyInner (zig.exe.obj)
            .is_non_err                   => try sema.zirIsNonErr(block, inst),
                                                                 ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5629:34: 0x7ff6e809f884 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5612:33: 0x7ff6e7ad5ab9 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1486:49: 0x7ff6e774d0cf in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5629:34: 0x7ff6e809f884 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5612:33: 0x7ff6e7ad5ab9 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1486:49: 0x7ff6e774d0cf in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5629:34: 0x7ff6e809f884 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:10129:45: 0x7ff6e8036642 in resolveProngComptime (zig.exe.obj)
                return sema.resolveBlockBody(spa.parent_block, src, child_block, prong_body, spa.switch_block_inst, merges);
                                            ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:11356:52: 0x7ff6e7a1b610 in zirSwitchBlock (zig.exe.obj)
                    return spa.resolveProngComptime(
                                                   ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1010:69: 0x7ff6e773d77e in analyzeBodyInner (zig.exe.obj)
            .switch_block                 => try sema.zirSwitchBlock(block, inst, false),
                                                                    ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5629:34: 0x7ff6e809f884 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5612:33: 0x7ff6e7ad5ab9 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1486:49: 0x7ff6e774d0cf in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:823:30: 0x7ff6e7997a4e in analyzeBody (zig.exe.obj)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:7013:33: 0x7ff6e7ffc218 in analyzeCall (zig.exe.obj)
                sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {
                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:22760:28: 0x7ff6e7a5dc29 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:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1060:69: 0x7ff6e774026e in analyzeBodyInner (zig.exe.obj)
            .builtin_call                 => try sema.zirBuiltinCall(block, inst),
                                                                    ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5629:34: 0x7ff6e809f884 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5612:33: 0x7ff6e7ad5ab9 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1486:49: 0x7ff6e774d0cf in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:823:30: 0x7ff6e7997a4e in analyzeBody (zig.exe.obj)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:7013:33: 0x7ff6e7ffc218 in analyzeCall (zig.exe.obj)
                sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {
                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:6533:32: 0x7ff6e79f7f43 in zirCall__anon_134522 (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:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:944:62: 0x7ff6e7739e74 in analyzeBodyInner (zig.exe.obj)
            .call                         => try sema.zirCall(block, inst, .direct),
                                                             ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5629:34: 0x7ff6e809f884 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5612:33: 0x7ff6e7ad5ab9 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1486:49: 0x7ff6e774d0cf in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:823:30: 0x7ff6e7997a4e in analyzeBody (zig.exe.obj)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:7013:33: 0x7ff6e7ffc218 in analyzeCall (zig.exe.obj)
                sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {
                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:22760:28: 0x7ff6e7a5dc29 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:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1060:69: 0x7ff6e774026e in analyzeBodyInner (zig.exe.obj)
            .builtin_call                 => try sema.zirBuiltinCall(block, inst),
                                                                    ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5629:34: 0x7ff6e809f884 in resolveBlockBody (zig.exe.obj)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:5612:33: 0x7ff6e7ad5ab9 in zirBlock (zig.exe.obj)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:1486:49: 0x7ff6e774d0cf in analyzeBodyInner (zig.exe.obj)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
C:\cygwin64\home\kcbanner\kit\zig\src\Sema.zig:823:30: 0x7ff6e7997a4e in analyzeBody (zig.exe.obj)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
C:\cygwin64\home\kcbanner\kit\zig\src\Module.zig:5551:21: 0x7ff6e771caad in analyzeFnBody (zig.exe.obj)
    sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                    ^
C:\cygwin64\home\kcbanner\kit\zig\src\Module.zig:4149:40: 0x7ff6e7539425 in ensureFuncBodyAnalyzed (zig.exe.obj)
            var air = mod.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) {
                                       ^
C:\cygwin64\home\kcbanner\kit\zig\src\Compilation.zig:3143:42: 0x7ff6e75372a4 in processOneJob (zig.exe.obj)
            module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
                                         ^
C:\cygwin64\home\kcbanner\kit\zig\src\Compilation.zig:3080:30: 0x7ff6e73c1f34 in performAllTheWork (zig.exe.obj)
            try processOneJob(comp, work_item, main_progress_node);
                             ^
C:\cygwin64\home\kcbanner\kit\zig\src\Compilation.zig:2029:31: 0x7ff6e73be2df in update (zig.exe.obj)
    try comp.performAllTheWork(main_progress_node);
                              ^
C:\cygwin64\home\kcbanner\kit\zig\src\main.zig:3839:24: 0x7ff6e73ec451 in updateModule (zig.exe.obj)
        try comp.update(main_progress_node);
                       ^
C:\cygwin64\home\kcbanner\kit\zig\src\main.zig:3274:17: 0x7ff6e72675d2 in buildOutputType (zig.exe.obj)
    updateModule(comp) catch |err| switch (err) {
                ^
C:\cygwin64\home\kcbanner\kit\zig\src\main.zig:269:31: 0x7ff6e71fcd41 in mainArgs (zig.exe.obj)
        return buildOutputType(gpa, arena, args, .{ .build = .Exe });
                              ^
C:\cygwin64\home\kcbanner\kit\zig\src\main.zig:213:20: 0x7ff6e71fa93e in main (zig.exe.obj)
    return mainArgs(gpa, arena, args);
                   ^
C:\cygwin64\home\kcbanner\kit\zig\lib\std\start.zig:507:80: 0x7ff6e71fa601 in main (zig.exe.obj)
    return @call(.always_inline, callMainWithArgs, .{ @intCast(usize, c_argc), @ptrCast([*][*:0]u8, c_argv), envp });
                                                                               ^
???:?:?: 0x7ff6e913afb5 in ??? (zig.exe)
???:?:?: 0x7ff6e913b01b in ??? (zig.exe)
???:?:?: 0x7ffe5cb37613 in ??? (KERNEL32.DLL)
???:?:?: 0x7ffe5e7426f0 in ??? (ntdll.dll)

Expected Behavior

No crash.

@kcbanner kcbanner added the bug Observed behavior contradicts documented or intended behavior label Jun 24, 2023
@kcbanner
Copy link
Contributor Author

kcbanner commented Jun 24, 2023

Oops, that isn't actually the reduction - my stdlib is causing the crash. Fixed reduction.

@kcbanner
Copy link
Contributor Author

kcbanner commented Jun 24, 2023

Further reduced to this:

const InstructionType = struct {
    operands: void,

    pub fn read() !InstructionType {
        return .{ .operands = {} };
    }
};

pub fn main() !void {
    var inst: InstructionType = undefined;
    (&inst).* = try InstructionType.read();
}

It wasn't anything to do with inline else, but a bug with airErrUnionPayloadPtrSet.

@andrewrk andrewrk added the backend-c The C backend (CBE) outputs C source code. label Jun 24, 2023
@andrewrk andrewrk added this to the 0.11.0 milestone Jun 24, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend-c The C backend (CBE) outputs C source code. bug Observed behavior contradicts documented or intended behavior
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants