Skip to content

Compiler panic: incorrect alignment #15150

@IntegratedQuantum

Description

@IntegratedQuantum

Zig Version

0.11.0-dev.2358+43a6384e9

Steps to Reproduce and Observed Behavior

Here is the reduced program:

const std = @import("std");

pub const Protocols: struct {
	list: *const fn(*Connection) void = undefined,
	handShake: type = struct {
		const stepStart: u8 = 0;
	},
} = .{};


pub const Connection = struct {
	streamBuffer: [0]u8 = undefined,
	__lastReceivedPackets: [0]u8 = undefined,

	handShakeState: u8 = Protocols.handShake.stepStart,
};

pub fn main() !void {
	var conn: Connection = undefined;
	_ = conn;
}

Here is the output I get when building it with a debug compiler:

$ ~/zig/stage3/bin/zig run test.zig
thread 36086 panic: incorrect alignment
Analyzing test.zig: test.zig:main
      %39 = dbg_block_begin()
      %40 = dbg_stmt(2, 2)
      %41 = decl_val("Connection") token_offset:19:12 to :19:22
    > %42 = alloc_mut(%41) node_offset:19:2 to :19:34
      %43 = store_node(%42, @Zir.Inst.Ref.undef) node_offset:19:25 to :19:34
      %44 = dbg_var_ptr(%42, "conn")
      %45 = dbg_stmt(3, 2)
      %46 = load(%42) node_offset:20:6 to :20:10
      %47 = ensure_result_non_error(%46) node_offset:20:6 to :20:10
      %48 = dbg_block_end()
      %49 = restore_err_ret_index(%38, @Zir.Inst.Ref.none)
      %50 = break(%38, @Zir.Inst.Ref.void_value)
    For full context, use the command
      zig ast-check -t test.zig

  in test.zig: test.zig:main
    > %38 = block({%39..%50}) node_offset:18:21 to :18:22
  in /home/mint/zig/stage3/lib/zig/std/start.zig: start.zig:callMain
    > %3090 = is_non_err(%3089) 
  in /home/mint/zig/stage3/lib/zig/std/start.zig: start.zig:callMain
    > %3092 = block({%3085..%3091}) 
  in /home/mint/zig/stage3/lib/zig/std/start.zig: start.zig:callMain
    > %3082 = block({%3083..%3229}) 
  in /home/mint/zig/stage3/lib/zig/std/start.zig: start.zig:callMain
    > %2986 = switch_block(%2983,
        else => {%3232..%3236},
        %2988 => {%2989..%3002},
        %3004 => {%3005..%3024},
        %3027 => {%3025..%3078},
        %3080 => {%3081..%3231}) 
  in /home/mint/zig/stage3/lib/zig/std/start.zig: start.zig:callMain
    > %2970 = block({%2971..%3240}) 
  in /home/mint/zig/stage3/lib/zig/std/start.zig: start.zig:initEventLoopAndCallMain
    > %2686 = builtin_call(%2684, %2685, @Zir.Inst.Ref.empty_struct) 
  in /home/mint/zig/stage3/lib/zig/std/start.zig: start.zig:initEventLoopAndCallMain
    > %2530 = block({%2531..%2694}) 
  in /home/mint/zig/stage3/lib/zig/std/start.zig: start.zig:callMainWithArgs
    > %2319 = call(.auto, %2317, []) 
  in /home/mint/zig/stage3/lib/zig/std/start.zig: start.zig:callMainWithArgs
    > %2280 = block({%2281..%2327}) 
  in /home/mint/zig/stage3/lib/zig/std/start.zig: start.zig:posixCallMainAndExit
    > %2145 = builtin_call(%2142, %2143, %2144) 
  in /home/mint/zig/stage3/lib/zig/std/start.zig: start.zig:posixCallMainAndExit
    > %2141 = call(nodiscard .auto, %2139, [
        {%2142..%2146},
      ]) 
  in /home/mint/zig/stage3/lib/zig/std/start.zig: start.zig:posixCallMainAndExit
    > %1756 = block({%1757..%2149}) 

/home/mint/zig/lib/std/hash_map.zig:945:100: 0x83933e2 in header (zig)
            return @ptrCast(*Header, @ptrCast([*]Header, @alignCast(@alignOf(Header), self.metadata.?)) - 1);
                                                                                                   ^
/home/mint/zig/lib/std/hash_map.zig:959:31: 0x8393010 in capacity (zig)
            return self.header().capacity;
                              ^
/home/mint/zig/lib/std/hash_map.zig:1579:38: 0x7fb2e0d in deallocate (zig)
            const cap = self.capacity();
                                     ^
/home/mint/zig/lib/std/hash_map.zig:897:28: 0x7d67589 in deinit (zig)
            self.deallocate(allocator);
                           ^
/home/mint/zig/src/Module.zig:393:40: 0x7d6745b in finalize (zig)
        self.scope.captures.deinit(self.gpa);
                                       ^
/home/mint/zig/src/Sema.zig:31383:30: 0x88a856b in semaStructFields (zig)
    try wip_captures.finalize();
                             ^
/home/mint/zig/src/Sema.zig:30949:30: 0x83a1db4 in resolveTypeFieldsStruct (zig)
    try semaStructFields(sema.mod, struct_obj);
                             ^
/home/mint/zig/src/Sema.zig:30887:45: 0x7fc2644 in resolveTypeFields (zig)
            try sema.resolveTypeFieldsStruct(ty, struct_obj);
                                            ^
/home/mint/zig/src/Sema.zig:22572:59: 0x8896716 in validateRunTimeType (zig)
            const resolved_ty = try sema.resolveTypeFields(ty);
                                                          ^
/home/mint/zig/src/Sema.zig:22505:37: 0x87e1cde in validateVarType (zig)
    if (try sema.validateRunTimeType(var_ty, is_extern)) return;
                                    ^
/home/mint/zig/src/Sema.zig:3646:29: 0x82b461c in zirAllocMut (zig)
    try sema.validateVarType(block, ty_src, var_ty, false);
                            ^
/home/mint/zig/src/Sema.zig:903:66: 0x7f99c21 in analyzeBodyInner (zig)
            .alloc_mut                    => try sema.zirAllocMut(block, inst),
                                                                 ^
/home/mint/zig/src/Sema.zig:5487:34: 0x883c6c9 in resolveBlockBody (zig)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
/home/mint/zig/src/Sema.zig:5470:85: 0x838adcd in zirBlock (zig)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                                                                    ^
/home/mint/zig/src/Sema.zig:1468:69: 0x7fac691 in analyzeBodyInner (zig)
                if (!block.is_comptime) break :blk try sema.zirBlock(block, inst);
                                                                    ^
/home/mint/zig/src/Sema.zig:805:30: 0x8270658 in analyzeBody (zig)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
/home/mint/zig/src/Module.zig:5546:43: 0x7f80acc in analyzeFnBody (zig)
    sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                                          ^
/home/mint/zig/src/Module.zig:4244:40: 0x7d644e1 in ensureFuncBodyAnalyzed (zig)
            var air = mod.analyzeFnBody(func, sema_arena) catch |err| switch (err) {
                                       ^
/home/mint/zig/src/Sema.zig:28387:36: 0x88c90b7 in ensureFuncBodyAnalyzed (zig)
    sema.mod.ensureFuncBodyAnalyzed(func) catch |err| {
                                   ^
/home/mint/zig/src/Sema.zig:31019:44: 0x83cf2d8 in resolveInferredErrorSet (zig)
        try sema.ensureFuncBodyAnalyzed(ies.func);
                                           ^
/home/mint/zig/src/Sema.zig:28679:49: 0x838f53e in analyzeIsNonErrComptimeOnly (zig)
                try sema.resolveInferredErrorSet(block, src, ies);
                                                ^
/home/mint/zig/src/Sema.zig:28706:56: 0x88193ac in analyzeIsNonErr (zig)
    const result = try sema.analyzeIsNonErrComptimeOnly(block, src, operand);
                                                       ^
/home/mint/zig/src/Sema.zig:16827:32: 0x82d6897 in zirIsNonErr (zig)
    return sema.analyzeIsNonErr(block, src, operand);
                               ^
/home/mint/zig/src/Sema.zig:967:66: 0x7f9d9cb in analyzeBodyInner (zig)
            .is_non_err                   => try sema.zirIsNonErr(block, inst),
                                                                 ^
/home/mint/zig/src/Sema.zig:5487:34: 0x883c6c9 in resolveBlockBody (zig)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
/home/mint/zig/src/Sema.zig:5470:85: 0x838adcd in zirBlock (zig)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                                                                    ^
/home/mint/zig/src/Sema.zig:1468:69: 0x7fac691 in analyzeBodyInner (zig)
                if (!block.is_comptime) break :blk try sema.zirBlock(block, inst);
                                                                    ^
/home/mint/zig/src/Sema.zig:5487:34: 0x883c6c9 in resolveBlockBody (zig)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
/home/mint/zig/src/Sema.zig:5470:85: 0x838adcd in zirBlock (zig)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                                                                    ^
/home/mint/zig/src/Sema.zig:1468:69: 0x7fac691 in analyzeBodyInner (zig)
                if (!block.is_comptime) break :blk try sema.zirBlock(block, inst);
                                                                    ^
/home/mint/zig/src/Sema.zig:5487:34: 0x883c6c9 in resolveBlockBody (zig)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
/home/mint/zig/src/Sema.zig:10854:49: 0x82e7129 in zirSwitchBlock (zig)
                    return sema.resolveBlockBody(block, src, &child_block, body, inst, merges);
                                                ^
/home/mint/zig/src/Sema.zig:989:69: 0x7f9eed8 in analyzeBodyInner (zig)
            .switch_block                 => try sema.zirSwitchBlock(block, inst),
                                                                    ^
/home/mint/zig/src/Sema.zig:5487:34: 0x883c6c9 in resolveBlockBody (zig)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
/home/mint/zig/src/Sema.zig:5470:85: 0x838adcd in zirBlock (zig)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                                                                    ^
/home/mint/zig/src/Sema.zig:1468:69: 0x7fac691 in analyzeBodyInner (zig)
                if (!block.is_comptime) break :blk try sema.zirBlock(block, inst);
                                                                    ^
/home/mint/zig/src/Sema.zig:805:30: 0x8270658 in analyzeBody (zig)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
/home/mint/zig/src/Sema.zig:6886:55: 0x8800cd6 in analyzeCall (zig)
                sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {
                                                      ^
/home/mint/zig/src/Sema.zig:21576:28: 0x83279ea in zirBuiltinCall (zig)
    return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);
                           ^
/home/mint/zig/src/Sema.zig:1045:69: 0x7fa249b in analyzeBodyInner (zig)
            .builtin_call                 => try sema.zirBuiltinCall(block, inst),
                                                                    ^
/home/mint/zig/src/Sema.zig:5487:34: 0x883c6c9 in resolveBlockBody (zig)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
/home/mint/zig/src/Sema.zig:5470:85: 0x838adcd in zirBlock (zig)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                                                                    ^
/home/mint/zig/src/Sema.zig:1468:69: 0x7fac691 in analyzeBodyInner (zig)
                if (!block.is_comptime) break :blk try sema.zirBlock(block, inst);
                                                                    ^
/home/mint/zig/src/Sema.zig:805:30: 0x8270658 in analyzeBody (zig)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
/home/mint/zig/src/Sema.zig:6886:55: 0x8800cd6 in analyzeCall (zig)
                sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {
                                                      ^
/home/mint/zig/src/Sema.zig:6403:32: 0x82c5fb8 in zirCall (zig)
        return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);
                               ^
/home/mint/zig/src/Sema.zig:924:62: 0x7f9b03a in analyzeBodyInner (zig)
            .call                         => try sema.zirCall(block, inst),
                                                             ^
/home/mint/zig/src/Sema.zig:5487:34: 0x883c6c9 in resolveBlockBody (zig)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
/home/mint/zig/src/Sema.zig:5470:85: 0x838adcd in zirBlock (zig)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                                                                    ^
/home/mint/zig/src/Sema.zig:1468:69: 0x7fac691 in analyzeBodyInner (zig)
                if (!block.is_comptime) break :blk try sema.zirBlock(block, inst);
                                                                    ^
/home/mint/zig/src/Sema.zig:805:30: 0x8270658 in analyzeBody (zig)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
/home/mint/zig/src/Sema.zig:6886:55: 0x8800cd6 in analyzeCall (zig)
                sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {
                                                      ^
/home/mint/zig/src/Sema.zig:21576:28: 0x83279ea in zirBuiltinCall (zig)
    return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);
                           ^
/home/mint/zig/src/Sema.zig:1045:69: 0x7fa249b in analyzeBodyInner (zig)
            .builtin_call                 => try sema.zirBuiltinCall(block, inst),
                                                                    ^
/home/mint/zig/src/Sema.zig:822:45: 0x7d84221 in analyzeBodyBreak (zig)
    const break_inst = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                                            ^
/home/mint/zig/src/Sema.zig:771:50: 0x87f5ac3 in resolveBody (zig)
    const break_data = (try sema.analyzeBodyBreak(block, body)) orelse
                                                 ^
/home/mint/zig/src/Sema.zig:6353:63: 0x82c5ad4 in zirCall (zig)
        const resolved = try sema.resolveBody(block, args_body[arg_start..arg_end], inst);
                                                              ^
/home/mint/zig/src/Sema.zig:924:62: 0x7f9b03a in analyzeBodyInner (zig)
            .call                         => try sema.zirCall(block, inst),
                                                             ^
/home/mint/zig/src/Sema.zig:5487:34: 0x883c6c9 in resolveBlockBody (zig)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
/home/mint/zig/src/Sema.zig:5470:85: 0x838adcd in zirBlock (zig)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                                                                    ^
/home/mint/zig/src/Sema.zig:1468:69: 0x7fac691 in analyzeBodyInner (zig)
                if (!block.is_comptime) break :blk try sema.zirBlock(block, inst);
                                                                    ^
/home/mint/zig/src/Sema.zig:805:30: 0x8270658 in analyzeBody (zig)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
/home/mint/zig/src/Module.zig:5546:43: 0x7f80acc in analyzeFnBody (zig)
    sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                                          ^
/home/mint/zig/src/Module.zig:4244:40: 0x7d644e1 in ensureFuncBodyAnalyzed (zig)
            var air = mod.analyzeFnBody(func, sema_arena) catch |err| switch (err) {
                                       ^
/home/mint/zig/src/Compilation.zig:3117:42: 0x7d62553 in processOneJob (zig)
            module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
                                         ^
/home/mint/zig/src/Compilation.zig:3055:30: 0x7c1ed9e in performAllTheWork (zig)
            try processOneJob(comp, work_item, main_progress_node);
                             ^
/home/mint/zig/src/Compilation.zig:2012:31: 0x7c1b2c5 in update (zig)
    try comp.performAllTheWork(main_progress_node);
                              ^
/home/mint/zig/src/main.zig:3820:24: 0x7c4ab6e in updateModule (zig)
        try comp.update(main_progress_node);
                       ^
/home/mint/zig/src/main.zig:3249:17: 0x7ae8094 in buildOutputType (zig)
    updateModule(gpa, comp, hook) catch |err| switch (err) {
                ^
/home/mint/zig/src/main.zig:275:31: 0x7abb9d5 in mainArgs (zig)
        return buildOutputType(gpa, arena, args, .run);
                              ^
/home/mint/zig/src/main.zig:211:20: 0x7abad95 in main (zig)
    return mainArgs(gpa, arena, args);
                   ^
/home/mint/zig/lib/std/start.zig:617:37: 0x7abd47c in main (zig)
            const result = root.main() catch |err| {
                                    ^
???:?:?: 0x7f31f9689082 in ??? (???)
Aborted (core dumped)

Expected Behavior

It should compile and run fine.
The correct behavior can be observed when for example removing any field from the Connection struct.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugObserved behavior contradicts documented or intended behaviorfrontendTokenization, parsing, AstGen, Sema, and Liveness.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions