Skip to content

ChildProcess: Basic Block in function 'std.child_process.ChildProcess.spawnPosix' does not have terminator! #11985

@catdevnull

Description

@catdevnull

Zig Version

0.10.0-dev.2836+2360f8c49

Steps to Reproduce

pub const io_mode = .evented;
const std = @import("std");

pub fn fetch_item(allocator: std.mem.Allocator, cmd: []const u8, item: []const u8) void {
    const result = std.ChildProcess.exec(.{
        .allocator = allocator,
        .argv = &.{ cmd, item },
    }) catch |err| {
        std.log.err("Error: {any}", .{err});
        return;
    };
    std.log.debug("stdout: {s}", .{result.stdout});
}

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    const allocator = gpa.allocator();
    defer _ = gpa.deinit();

    const args = try std.process.argsAlloc(allocator);
    defer std.process.argsFree(allocator, args);
    if (args.len <= 1) {
        return error.MissingCommand;
    }
    const cmd = args[1];
    std.log.debug("Running command `{s}`", .{cmd});

    var batch = std.event.Batch(void, 2, .auto_async).init();

    var item_list = std.ArrayList([]const u8).init(allocator);
    defer item_list.deinit();
    defer for (item_list.items) |item| allocator.free(item);

    const reader = std.io.getStdIn().reader();
    while (reader.readUntilDelimiterAlloc(allocator, '\n', 9999999) catch |err| switch (err) {
        error.EndOfStream => null,
        else => return err,
    }) |result| {
        try item_list.append(result);
    }

    const Context = struct { frame: @Frame(fetch_item) };

    var context_list = std.ArrayList(*Context).init(allocator);
    defer context_list.deinit();
    defer for (context_list.items) |ctx| allocator.destroy(ctx);

    for (item_list.items) |item| {
        var ctx = try allocator.create(Context);
        errdefer allocator.destroy(ctx);
        try context_list.append(ctx);
        ctx.frame = async fetch_item(allocator, cmd, item);
        batch.add(&ctx.frame);
    }

    batch.wait();
}

Expected Behavior

The compiler builds the file.

Actual Behavior

Code Generation [970/1010] std.mem.Allocator.allocAdvancedWithRetAddr... broken LLVM module found: Basic Block in function 'std.child_process.ChildProcess.spawnPosix' does not have terminator!
label %OkResume
Instruction does not dominate all uses!
  %28 = load { %std.child_process.ChildProcess.Term, i16 }*, { %std.child_process.ChildProcess.Term, i16 }** %6, align 8, !dbg !30794
  %41 = bitcast { %std.child_process.ChildProcess.Term, i16 }* %28 to i8*, !dbg !30794

This is a bug in the Zig compiler.thread 25498 panic: 
Unable to dump stack trace: debug info stripped

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