Skip to content

Crash in InternPool when faulty packed struct is inside an extern struct #17859

Description

@IntegratedQuantum

Zig Version

0.12.0-dev.1390+94cee4fb2

Steps to Reproduce and Observed Behavior

pubconstChunkMesh=externstruct {
position: packedstruct(u32) {
vals: u42, // Wrong number of bits
},
blockAndModel: u32,
};
fngetBlockFromRenderThread() u32 {
varmesh: *ChunkMesh=undefined;
returnmesh.chunk.getBlock();
}
pubfnupdateAndGetRenderChunks() []*ChunkMesh {
returnundefined;
}
pubfnmain() !void {
_=getBlockFromRenderThread();
_=updateAndGetRenderChunks();
}
$ zig build-exe test.zig
Segmentation fault (core dumped)
Trace of a debug build of the compiler
$ zig-debug build-exe test.zig
thread 9369 panic: reached unreachable code
Analyzing test.zig: test.zig:getBlockFromRenderThread
%10 = dbg_block_begin()
%11 = dbg_stmt(2, 2)
%12 = block_comptime({
%13 = decl_val("ChunkMesh") token_offset:9:13 to :9:22
%14 = ptr_type(%13, One) node_offset:9:12 to :9:22
%15 = break(%12, %14)
}) node_offset:9:12 to :9:22
> %16 = alloc_mut(%12) node_offset:9:2 to :9:34
%17 = store_node(%16, @undef) node_offset:9:25 to :9:34
%18 = dbg_var_ptr(%16, "mesh")
%19 = dbg_stmt(3, 2)
%20 = ret_type() node_offset:10:2 to :10:30
%21 = dbg_stmt(3, 13)
%22 = field_ptr(%16, "chunk") node_offset:10:9 to :10:19
%23 = dbg_stmt(3, 19)
%24 = dbg_stmt(3, 28)
%25 = field_call(.auto, %22, "getBlock", []) node_offset:10:9 to :10:30
%26 = as_node(%20, %25) node_offset:10:9 to :10:30
%27 = dbg_stmt(3, 2)
%28 = restore_err_ret_index(%26)
%29 = ret_node(%26) node_offset:10:2 to :10:30
%30 = dbg_block_end()
%31 = restore_err_ret_index(%9)
%32 = break(%9, @void_value)
For full context, use the command
zig ast-check -t test.zig
in test.zig: test.zig:getBlockFromRenderThread
> %9 = block({%10..%32}) node_offset:8:35 to :8:35
/home/mint/zig/lib/std/debug.zig:342:14: 0x8cf8a5c in assert (zig)
if (!ok) unreachable; // assertion failure
^
/home/mint/zig/src/InternPool.zig:2053:15: 0x8e69743 in toType (zig)
assert(i != .none);
^
/home/mint/zig/src/type.zig:2646:56: 0x937dc96 in comptimeOnlyAdvanced (zig)
if (try field_ty.toType().comptimeOnlyAdvanced(mod, opt_sema)) {
^
/home/mint/zig/src/type.zig:2555:69: 0x937d1da in comptimeOnlyAdvanced (zig)
else => return child_ty.comptimeOnlyAdvanced(mod, opt_sema),
^
/home/mint/zig/src/Sema.zig:37067:35: 0x90cefd0 in typeRequiresComptime (zig)
return ty.comptimeOnlyAdvanced(sema.mod, sema);
^
/home/mint/zig/src/Sema.zig:25316:39: 0x9c2ab9a in validateVarType (zig)
if (!try sema.typeRequiresComptime(var_ty)) return;
^
/home/mint/zig/src/Sema.zig:3943:29: 0x96ae31a in zirAllocMut (zig)
try sema.validateVarType(block, ty_src, var_ty, false);
^
/home/mint/zig/src/Sema.zig:1007:66: 0x9365b35 in analyzeBodyInner (zig)
.alloc_mut => try sema.zirAllocMut(block, inst),
^
/home/mint/zig/src/Sema.zig:5853:34: 0x9d0d29b in resolveBlockBody (zig)
if (sema.analyzeBodyInner(child_block, body)) |_| {
^
/home/mint/zig/src/Sema.zig:5836:33: 0x9784fd8 in zirBlock (zig)
return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
^
/home/mint/zig/src/Sema.zig:1577:49: 0x937734a in analyzeBodyInner (zig)
break :blk try sema.zirBlock(block, inst, tags[@intFromEnum(inst)] == .block_comptime);
^
/home/mint/zig/src/Sema.zig:916:30: 0x9652178 in analyzeBody (zig)
_ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
^
/home/mint/zig/src/Module.zig:4707:21: 0x9344d86 in analyzeFnBody (zig)
sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
^
/home/mint/zig/src/Module.zig:3357:40: 0x90c856d in ensureFuncBodyAnalyzed (zig)
var air = mod.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) {
^
/home/mint/zig/src/Compilation.zig:3519:42: 0x90c675d in processOneJob (zig)
module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
^
/home/mint/zig/src/Compilation.zig:3456:30: 0x8e9a84e in performAllTheWork (zig)
try processOneJob(comp, work_item, main_progress_node);
^
/home/mint/zig/src/Compilation.zig:2237:31: 0x8e95ecc in update (zig)
try comp.performAllTheWork(main_progress_node);
^
/home/mint/zig/src/main.zig:4236:24: 0x8ec5452 in updateModule (zig)
try comp.update(main_progress_node);
^
/home/mint/zig/src/main.zig:3637:17: 0x8ee78f2 in buildOutputType (zig)
updateModule(comp) catch |err| switch (err) {
^
/home/mint/zig/src/main.zig:279:31: 0x8cfabff in mainArgs (zig)
return buildOutputType(gpa, arena, args, .{ .build = .Exe });
^
/home/mint/zig/src/main.zig:223:20: 0x8cf7ee5 in main (zig)
return mainArgs(gpa, arena, args);
^
/home/mint/zig/lib/std/start.zig:581:37: 0x8cf78fe in main (zig)
const result = root.main() catch |err| {
^
../sysdeps/nptl/libc_start_call_main.h:58:16: 0x7f3e34b22d8f in __libc_start_call_main (../sysdeps/x86/libc-start.c)
../csu/libc-start.c:392:3: 0x7f3e34b22e3f in __libc_start_main_impl (../sysdeps/x86/libc-start.c)
???:?:?: 0x40d2824 in ??? (???)
???:?:?: 0x0 in ??? (???)
Aborted (core dumped)

Expected Behavior

The compiler should correctly report the error:

test.zig:2:26: error: backing integer type 'u32' has bit size 32 but the struct fields have a total bit size of 42
position: packed struct(u32) {
^~~

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

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
       blocks
      (function() {
      function addCopyButtons() {
      document.querySelectorAll('pre code').forEach(function(codeBlock) {
      if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
      codeBlock.parentElement.setAttribute('data-copy-added', 'true');
      var btn = document.createElement('button');
      btn.textContent = 'Copy';
      btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
      btn.onmouseover = function() { this.style.opacity = '1'; };
      btn.onmouseout = function() { this.style.opacity = '0.7'; };
      btn.onclick = function() {
      navigator.clipboard.writeText(codeBlock.textContent).then(function() {
      btn.textContent = 'Copied!';
      setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
      });
      };
      codeBlock.parentElement.style.position = 'relative';
      codeBlock.parentElement.appendChild(btn);
      });
      }
      addCopyButtons();
      // Re-run on dynamic content
      var observer = new MutationObserver(addCopyButtons);
      observer.observe(document.body, { childList: true, subtree: true });
      })();
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      Crash in InternPool when faulty `packed struct` is inside an `extern struct` · Issue #17859 · ziglang/zig · GitHub
      Skip to content

      Crash in InternPool when faulty packed struct is inside an extern struct #17859

      Description

      @IntegratedQuantum

      Zig Version

      0.12.0-dev.1390+94cee4fb2

      Steps to Reproduce and Observed Behavior

      pubconstChunkMesh=externstruct {
      position: packedstruct(u32) {
      vals: u42, // Wrong number of bits
      },
      blockAndModel: u32,
      };
      fngetBlockFromRenderThread() u32 {
      varmesh: *ChunkMesh=undefined;
      returnmesh.chunk.getBlock();
      }
      pubfnupdateAndGetRenderChunks() []*ChunkMesh {
      returnundefined;
      }
      pubfnmain() !void {
      _=getBlockFromRenderThread();
      _=updateAndGetRenderChunks();
      }
      $ zig build-exe test.zig
      Segmentation fault (core dumped)
      
      Trace of a debug build of the compiler
      $ zig-debug build-exe test.zig
      thread 9369 panic: reached unreachable code
      Analyzing test.zig: test.zig:getBlockFromRenderThread
      %10 = dbg_block_begin()
      %11 = dbg_stmt(2, 2)
      %12 = block_comptime({
      %13 = decl_val("ChunkMesh") token_offset:9:13 to :9:22
      %14 = ptr_type(%13, One) node_offset:9:12 to :9:22
      %15 = break(%12, %14)
      }) node_offset:9:12 to :9:22
      > %16 = alloc_mut(%12) node_offset:9:2 to :9:34
      %17 = store_node(%16, @undef) node_offset:9:25 to :9:34
      %18 = dbg_var_ptr(%16, "mesh")
      %19 = dbg_stmt(3, 2)
      %20 = ret_type() node_offset:10:2 to :10:30
      %21 = dbg_stmt(3, 13)
      %22 = field_ptr(%16, "chunk") node_offset:10:9 to :10:19
      %23 = dbg_stmt(3, 19)
      %24 = dbg_stmt(3, 28)
      %25 = field_call(.auto, %22, "getBlock", []) node_offset:10:9 to :10:30
      %26 = as_node(%20, %25) node_offset:10:9 to :10:30
      %27 = dbg_stmt(3, 2)
      %28 = restore_err_ret_index(%26)
      %29 = ret_node(%26) node_offset:10:2 to :10:30
      %30 = dbg_block_end()
      %31 = restore_err_ret_index(%9)
      %32 = break(%9, @void_value)
      For full context, use the command
      zig ast-check -t test.zig
      in test.zig: test.zig:getBlockFromRenderThread
      > %9 = block({%10..%32}) node_offset:8:35 to :8:35
      /home/mint/zig/lib/std/debug.zig:342:14: 0x8cf8a5c in assert (zig)
      if (!ok) unreachable; // assertion failure
      ^
      /home/mint/zig/src/InternPool.zig:2053:15: 0x8e69743 in toType (zig)
      assert(i != .none);
      ^
      /home/mint/zig/src/type.zig:2646:56: 0x937dc96 in comptimeOnlyAdvanced (zig)
      if (try field_ty.toType().comptimeOnlyAdvanced(mod, opt_sema)) {
      ^
      /home/mint/zig/src/type.zig:2555:69: 0x937d1da in comptimeOnlyAdvanced (zig)
      else => return child_ty.comptimeOnlyAdvanced(mod, opt_sema),
      ^
      /home/mint/zig/src/Sema.zig:37067:35: 0x90cefd0 in typeRequiresComptime (zig)
      return ty.comptimeOnlyAdvanced(sema.mod, sema);
      ^
      /home/mint/zig/src/Sema.zig:25316:39: 0x9c2ab9a in validateVarType (zig)
      if (!try sema.typeRequiresComptime(var_ty)) return;
      ^
      /home/mint/zig/src/Sema.zig:3943:29: 0x96ae31a in zirAllocMut (zig)
      try sema.validateVarType(block, ty_src, var_ty, false);
      ^
      /home/mint/zig/src/Sema.zig:1007:66: 0x9365b35 in analyzeBodyInner (zig)
      .alloc_mut => try sema.zirAllocMut(block, inst),
      ^
      /home/mint/zig/src/Sema.zig:5853:34: 0x9d0d29b in resolveBlockBody (zig)
      if (sema.analyzeBodyInner(child_block, body)) |_| {
      ^
      /home/mint/zig/src/Sema.zig:5836:33: 0x9784fd8 in zirBlock (zig)
      return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
      ^
      /home/mint/zig/src/Sema.zig:1577:49: 0x937734a in analyzeBodyInner (zig)
      break :blk try sema.zirBlock(block, inst, tags[@intFromEnum(inst)] == .block_comptime);
      ^
      /home/mint/zig/src/Sema.zig:916:30: 0x9652178 in analyzeBody (zig)
      _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
      ^
      /home/mint/zig/src/Module.zig:4707:21: 0x9344d86 in analyzeFnBody (zig)
      sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
      ^
      /home/mint/zig/src/Module.zig:3357:40: 0x90c856d in ensureFuncBodyAnalyzed (zig)
      var air = mod.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) {
      ^
      /home/mint/zig/src/Compilation.zig:3519:42: 0x90c675d in processOneJob (zig)
      module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
      ^
      /home/mint/zig/src/Compilation.zig:3456:30: 0x8e9a84e in performAllTheWork (zig)
      try processOneJob(comp, work_item, main_progress_node);
      ^
      /home/mint/zig/src/Compilation.zig:2237:31: 0x8e95ecc in update (zig)
      try comp.performAllTheWork(main_progress_node);
      ^
      /home/mint/zig/src/main.zig:4236:24: 0x8ec5452 in updateModule (zig)
      try comp.update(main_progress_node);
      ^
      /home/mint/zig/src/main.zig:3637:17: 0x8ee78f2 in buildOutputType (zig)
      updateModule(comp) catch |err| switch (err) {
      ^
      /home/mint/zig/src/main.zig:279:31: 0x8cfabff in mainArgs (zig)
      return buildOutputType(gpa, arena, args, .{ .build = .Exe });
      ^
      /home/mint/zig/src/main.zig:223:20: 0x8cf7ee5 in main (zig)
      return mainArgs(gpa, arena, args);
      ^
      /home/mint/zig/lib/std/start.zig:581:37: 0x8cf78fe in main (zig)
      const result = root.main() catch |err| {
      ^
      ../sysdeps/nptl/libc_start_call_main.h:58:16: 0x7f3e34b22d8f in __libc_start_call_main (../sysdeps/x86/libc-start.c)
      ../csu/libc-start.c:392:3: 0x7f3e34b22e3f in __libc_start_main_impl (../sysdeps/x86/libc-start.c)
      ???:?:?: 0x40d2824 in ??? (???)
      ???:?:?: 0x0 in ??? (???)
      Aborted (core dumped)
      

      Expected Behavior

      The compiler should correctly report the error:

      test.zig:2:26: error: backing integer type 'u32' has bit size 32 but the struct fields have a total bit size of 42
      position: packed struct(u32) {
      ^~~
      

      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

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Crash in InternPool when faulty `packed struct` is inside an `extern struct` · Issue #17859 · ziglang/zig · GitHub
          Skip to content

          Crash in InternPool when faulty packed struct is inside an extern struct #17859

          Description

          @IntegratedQuantum

          Zig Version

          0.12.0-dev.1390+94cee4fb2

          Steps to Reproduce and Observed Behavior

          pubconstChunkMesh=externstruct {
          position: packedstruct(u32) {
          vals: u42, // Wrong number of bits
          },
          blockAndModel: u32,
          };
          fngetBlockFromRenderThread() u32 {
          varmesh: *ChunkMesh=undefined;
          returnmesh.chunk.getBlock();
          }
          pubfnupdateAndGetRenderChunks() []*ChunkMesh {
          returnundefined;
          }
          pubfnmain() !void {
          _=getBlockFromRenderThread();
          _=updateAndGetRenderChunks();
          }
          $ zig build-exe test.zig
          Segmentation fault (core dumped)
          
          Trace of a debug build of the compiler
          $ zig-debug build-exe test.zig
          thread 9369 panic: reached unreachable code
          Analyzing test.zig: test.zig:getBlockFromRenderThread
          %10 = dbg_block_begin()
          %11 = dbg_stmt(2, 2)
          %12 = block_comptime({
          %13 = decl_val("ChunkMesh") token_offset:9:13 to :9:22
          %14 = ptr_type(%13, One) node_offset:9:12 to :9:22
          %15 = break(%12, %14)
          }) node_offset:9:12 to :9:22
          > %16 = alloc_mut(%12) node_offset:9:2 to :9:34
          %17 = store_node(%16, @undef) node_offset:9:25 to :9:34
          %18 = dbg_var_ptr(%16, "mesh")
          %19 = dbg_stmt(3, 2)
          %20 = ret_type() node_offset:10:2 to :10:30
          %21 = dbg_stmt(3, 13)
          %22 = field_ptr(%16, "chunk") node_offset:10:9 to :10:19
          %23 = dbg_stmt(3, 19)
          %24 = dbg_stmt(3, 28)
          %25 = field_call(.auto, %22, "getBlock", []) node_offset:10:9 to :10:30
          %26 = as_node(%20, %25) node_offset:10:9 to :10:30
          %27 = dbg_stmt(3, 2)
          %28 = restore_err_ret_index(%26)
          %29 = ret_node(%26) node_offset:10:2 to :10:30
          %30 = dbg_block_end()
          %31 = restore_err_ret_index(%9)
          %32 = break(%9, @void_value)
          For full context, use the command
          zig ast-check -t test.zig
          in test.zig: test.zig:getBlockFromRenderThread
          > %9 = block({%10..%32}) node_offset:8:35 to :8:35
          /home/mint/zig/lib/std/debug.zig:342:14: 0x8cf8a5c in assert (zig)
          if (!ok) unreachable; // assertion failure
          ^
          /home/mint/zig/src/InternPool.zig:2053:15: 0x8e69743 in toType (zig)
          assert(i != .none);
          ^
          /home/mint/zig/src/type.zig:2646:56: 0x937dc96 in comptimeOnlyAdvanced (zig)
          if (try field_ty.toType().comptimeOnlyAdvanced(mod, opt_sema)) {
          ^
          /home/mint/zig/src/type.zig:2555:69: 0x937d1da in comptimeOnlyAdvanced (zig)
          else => return child_ty.comptimeOnlyAdvanced(mod, opt_sema),
          ^
          /home/mint/zig/src/Sema.zig:37067:35: 0x90cefd0 in typeRequiresComptime (zig)
          return ty.comptimeOnlyAdvanced(sema.mod, sema);
          ^
          /home/mint/zig/src/Sema.zig:25316:39: 0x9c2ab9a in validateVarType (zig)
          if (!try sema.typeRequiresComptime(var_ty)) return;
          ^
          /home/mint/zig/src/Sema.zig:3943:29: 0x96ae31a in zirAllocMut (zig)
          try sema.validateVarType(block, ty_src, var_ty, false);
          ^
          /home/mint/zig/src/Sema.zig:1007:66: 0x9365b35 in analyzeBodyInner (zig)
          .alloc_mut => try sema.zirAllocMut(block, inst),
          ^
          /home/mint/zig/src/Sema.zig:5853:34: 0x9d0d29b in resolveBlockBody (zig)
          if (sema.analyzeBodyInner(child_block, body)) |_| {
          ^
          /home/mint/zig/src/Sema.zig:5836:33: 0x9784fd8 in zirBlock (zig)
          return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
          ^
          /home/mint/zig/src/Sema.zig:1577:49: 0x937734a in analyzeBodyInner (zig)
          break :blk try sema.zirBlock(block, inst, tags[@intFromEnum(inst)] == .block_comptime);
          ^
          /home/mint/zig/src/Sema.zig:916:30: 0x9652178 in analyzeBody (zig)
          _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
          ^
          /home/mint/zig/src/Module.zig:4707:21: 0x9344d86 in analyzeFnBody (zig)
          sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
          ^
          /home/mint/zig/src/Module.zig:3357:40: 0x90c856d in ensureFuncBodyAnalyzed (zig)
          var air = mod.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) {
          ^
          /home/mint/zig/src/Compilation.zig:3519:42: 0x90c675d in processOneJob (zig)
          module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
          ^
          /home/mint/zig/src/Compilation.zig:3456:30: 0x8e9a84e in performAllTheWork (zig)
          try processOneJob(comp, work_item, main_progress_node);
          ^
          /home/mint/zig/src/Compilation.zig:2237:31: 0x8e95ecc in update (zig)
          try comp.performAllTheWork(main_progress_node);
          ^
          /home/mint/zig/src/main.zig:4236:24: 0x8ec5452 in updateModule (zig)
          try comp.update(main_progress_node);
          ^
          /home/mint/zig/src/main.zig:3637:17: 0x8ee78f2 in buildOutputType (zig)
          updateModule(comp) catch |err| switch (err) {
          ^
          /home/mint/zig/src/main.zig:279:31: 0x8cfabff in mainArgs (zig)
          return buildOutputType(gpa, arena, args, .{ .build = .Exe });
          ^
          /home/mint/zig/src/main.zig:223:20: 0x8cf7ee5 in main (zig)
          return mainArgs(gpa, arena, args);
          ^
          /home/mint/zig/lib/std/start.zig:581:37: 0x8cf78fe in main (zig)
          const result = root.main() catch |err| {
          ^
          ../sysdeps/nptl/libc_start_call_main.h:58:16: 0x7f3e34b22d8f in __libc_start_call_main (../sysdeps/x86/libc-start.c)
          ../csu/libc-start.c:392:3: 0x7f3e34b22e3f in __libc_start_main_impl (../sysdeps/x86/libc-start.c)
          ???:?:?: 0x40d2824 in ??? (???)
          ???:?:?: 0x0 in ??? (???)
          Aborted (core dumped)
          

          Expected Behavior

          The compiler should correctly report the error:

          test.zig:2:26: error: backing integer type 'u32' has bit size 32 but the struct fields have a total bit size of 42
          position: packed struct(u32) {
          ^~~
          

          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

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Crash in InternPool when faulty `packed struct` is inside an `extern struct` · Issue #17859 · ziglang/zig · GitHub
              Skip to content

              Crash in InternPool when faulty packed struct is inside an extern struct #17859

              Description

              @IntegratedQuantum

              Zig Version

              0.12.0-dev.1390+94cee4fb2

              Steps to Reproduce and Observed Behavior

              pubconstChunkMesh=externstruct {
              position: packedstruct(u32) {
              vals: u42, // Wrong number of bits
              },
              blockAndModel: u32,
              };
              fngetBlockFromRenderThread() u32 {
              varmesh: *ChunkMesh=undefined;
              returnmesh.chunk.getBlock();
              }
              pubfnupdateAndGetRenderChunks() []*ChunkMesh {
              returnundefined;
              }
              pubfnmain() !void {
              _=getBlockFromRenderThread();
              _=updateAndGetRenderChunks();
              }
              $ zig build-exe test.zig
              Segmentation fault (core dumped)
              
              Trace of a debug build of the compiler
              $ zig-debug build-exe test.zig
              thread 9369 panic: reached unreachable code
              Analyzing test.zig: test.zig:getBlockFromRenderThread
              %10 = dbg_block_begin()
              %11 = dbg_stmt(2, 2)
              %12 = block_comptime({
              %13 = decl_val("ChunkMesh") token_offset:9:13 to :9:22
              %14 = ptr_type(%13, One) node_offset:9:12 to :9:22
              %15 = break(%12, %14)
              }) node_offset:9:12 to :9:22
              > %16 = alloc_mut(%12) node_offset:9:2 to :9:34
              %17 = store_node(%16, @undef) node_offset:9:25 to :9:34
              %18 = dbg_var_ptr(%16, "mesh")
              %19 = dbg_stmt(3, 2)
              %20 = ret_type() node_offset:10:2 to :10:30
              %21 = dbg_stmt(3, 13)
              %22 = field_ptr(%16, "chunk") node_offset:10:9 to :10:19
              %23 = dbg_stmt(3, 19)
              %24 = dbg_stmt(3, 28)
              %25 = field_call(.auto, %22, "getBlock", []) node_offset:10:9 to :10:30
              %26 = as_node(%20, %25) node_offset:10:9 to :10:30
              %27 = dbg_stmt(3, 2)
              %28 = restore_err_ret_index(%26)
              %29 = ret_node(%26) node_offset:10:2 to :10:30
              %30 = dbg_block_end()
              %31 = restore_err_ret_index(%9)
              %32 = break(%9, @void_value)
              For full context, use the command
              zig ast-check -t test.zig
              in test.zig: test.zig:getBlockFromRenderThread
              > %9 = block({%10..%32}) node_offset:8:35 to :8:35
              /home/mint/zig/lib/std/debug.zig:342:14: 0x8cf8a5c in assert (zig)
              if (!ok) unreachable; // assertion failure
              ^
              /home/mint/zig/src/InternPool.zig:2053:15: 0x8e69743 in toType (zig)
              assert(i != .none);
              ^
              /home/mint/zig/src/type.zig:2646:56: 0x937dc96 in comptimeOnlyAdvanced (zig)
              if (try field_ty.toType().comptimeOnlyAdvanced(mod, opt_sema)) {
              ^
              /home/mint/zig/src/type.zig:2555:69: 0x937d1da in comptimeOnlyAdvanced (zig)
              else => return child_ty.comptimeOnlyAdvanced(mod, opt_sema),
              ^
              /home/mint/zig/src/Sema.zig:37067:35: 0x90cefd0 in typeRequiresComptime (zig)
              return ty.comptimeOnlyAdvanced(sema.mod, sema);
              ^
              /home/mint/zig/src/Sema.zig:25316:39: 0x9c2ab9a in validateVarType (zig)
              if (!try sema.typeRequiresComptime(var_ty)) return;
              ^
              /home/mint/zig/src/Sema.zig:3943:29: 0x96ae31a in zirAllocMut (zig)
              try sema.validateVarType(block, ty_src, var_ty, false);
              ^
              /home/mint/zig/src/Sema.zig:1007:66: 0x9365b35 in analyzeBodyInner (zig)
              .alloc_mut => try sema.zirAllocMut(block, inst),
              ^
              /home/mint/zig/src/Sema.zig:5853:34: 0x9d0d29b in resolveBlockBody (zig)
              if (sema.analyzeBodyInner(child_block, body)) |_| {
              ^
              /home/mint/zig/src/Sema.zig:5836:33: 0x9784fd8 in zirBlock (zig)
              return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
              ^
              /home/mint/zig/src/Sema.zig:1577:49: 0x937734a in analyzeBodyInner (zig)
              break :blk try sema.zirBlock(block, inst, tags[@intFromEnum(inst)] == .block_comptime);
              ^
              /home/mint/zig/src/Sema.zig:916:30: 0x9652178 in analyzeBody (zig)
              _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
              ^
              /home/mint/zig/src/Module.zig:4707:21: 0x9344d86 in analyzeFnBody (zig)
              sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
              ^
              /home/mint/zig/src/Module.zig:3357:40: 0x90c856d in ensureFuncBodyAnalyzed (zig)
              var air = mod.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) {
              ^
              /home/mint/zig/src/Compilation.zig:3519:42: 0x90c675d in processOneJob (zig)
              module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
              ^
              /home/mint/zig/src/Compilation.zig:3456:30: 0x8e9a84e in performAllTheWork (zig)
              try processOneJob(comp, work_item, main_progress_node);
              ^
              /home/mint/zig/src/Compilation.zig:2237:31: 0x8e95ecc in update (zig)
              try comp.performAllTheWork(main_progress_node);
              ^
              /home/mint/zig/src/main.zig:4236:24: 0x8ec5452 in updateModule (zig)
              try comp.update(main_progress_node);
              ^
              /home/mint/zig/src/main.zig:3637:17: 0x8ee78f2 in buildOutputType (zig)
              updateModule(comp) catch |err| switch (err) {
              ^
              /home/mint/zig/src/main.zig:279:31: 0x8cfabff in mainArgs (zig)
              return buildOutputType(gpa, arena, args, .{ .build = .Exe });
              ^
              /home/mint/zig/src/main.zig:223:20: 0x8cf7ee5 in main (zig)
              return mainArgs(gpa, arena, args);
              ^
              /home/mint/zig/lib/std/start.zig:581:37: 0x8cf78fe in main (zig)
              const result = root.main() catch |err| {
              ^
              ../sysdeps/nptl/libc_start_call_main.h:58:16: 0x7f3e34b22d8f in __libc_start_call_main (../sysdeps/x86/libc-start.c)
              ../csu/libc-start.c:392:3: 0x7f3e34b22e3f in __libc_start_main_impl (../sysdeps/x86/libc-start.c)
              ???:?:?: 0x40d2824 in ??? (???)
              ???:?:?: 0x0 in ??? (???)
              Aborted (core dumped)
              

              Expected Behavior

              The compiler should correctly report the error:

              test.zig:2:26: error: backing integer type 'u32' has bit size 32 but the struct fields have a total bit size of 42
              position: packed struct(u32) {
              ^~~
              

              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

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Crash in InternPool when faulty `packed struct` is inside an `extern struct` · Issue #17859 · ziglang/zig · GitHub
                  Skip to content

                  Crash in InternPool when faulty packed struct is inside an extern struct #17859

                  Description

                  @IntegratedQuantum

                  Zig Version

                  0.12.0-dev.1390+94cee4fb2

                  Steps to Reproduce and Observed Behavior

                  pubconstChunkMesh=externstruct {
                  position: packedstruct(u32) {
                  vals: u42, // Wrong number of bits
                  },
                  blockAndModel: u32,
                  };
                  fngetBlockFromRenderThread() u32 {
                  varmesh: *ChunkMesh=undefined;
                  returnmesh.chunk.getBlock();
                  }
                  pubfnupdateAndGetRenderChunks() []*ChunkMesh {
                  returnundefined;
                  }
                  pubfnmain() !void {
                  _=getBlockFromRenderThread();
                  _=updateAndGetRenderChunks();
                  }
                  $ zig build-exe test.zig
                  Segmentation fault (core dumped)
                  
                  Trace of a debug build of the compiler
                  $ zig-debug build-exe test.zig
                  thread 9369 panic: reached unreachable code
                  Analyzing test.zig: test.zig:getBlockFromRenderThread
                  %10 = dbg_block_begin()
                  %11 = dbg_stmt(2, 2)
                  %12 = block_comptime({
                  %13 = decl_val("ChunkMesh") token_offset:9:13 to :9:22
                  %14 = ptr_type(%13, One) node_offset:9:12 to :9:22
                  %15 = break(%12, %14)
                  }) node_offset:9:12 to :9:22
                  > %16 = alloc_mut(%12) node_offset:9:2 to :9:34
                  %17 = store_node(%16, @undef) node_offset:9:25 to :9:34
                  %18 = dbg_var_ptr(%16, "mesh")
                  %19 = dbg_stmt(3, 2)
                  %20 = ret_type() node_offset:10:2 to :10:30
                  %21 = dbg_stmt(3, 13)
                  %22 = field_ptr(%16, "chunk") node_offset:10:9 to :10:19
                  %23 = dbg_stmt(3, 19)
                  %24 = dbg_stmt(3, 28)
                  %25 = field_call(.auto, %22, "getBlock", []) node_offset:10:9 to :10:30
                  %26 = as_node(%20, %25) node_offset:10:9 to :10:30
                  %27 = dbg_stmt(3, 2)
                  %28 = restore_err_ret_index(%26)
                  %29 = ret_node(%26) node_offset:10:2 to :10:30
                  %30 = dbg_block_end()
                  %31 = restore_err_ret_index(%9)
                  %32 = break(%9, @void_value)
                  For full context, use the command
                  zig ast-check -t test.zig
                  in test.zig: test.zig:getBlockFromRenderThread
                  > %9 = block({%10..%32}) node_offset:8:35 to :8:35
                  /home/mint/zig/lib/std/debug.zig:342:14: 0x8cf8a5c in assert (zig)
                  if (!ok) unreachable; // assertion failure
                  ^
                  /home/mint/zig/src/InternPool.zig:2053:15: 0x8e69743 in toType (zig)
                  assert(i != .none);
                  ^
                  /home/mint/zig/src/type.zig:2646:56: 0x937dc96 in comptimeOnlyAdvanced (zig)
                  if (try field_ty.toType().comptimeOnlyAdvanced(mod, opt_sema)) {
                  ^
                  /home/mint/zig/src/type.zig:2555:69: 0x937d1da in comptimeOnlyAdvanced (zig)
                  else => return child_ty.comptimeOnlyAdvanced(mod, opt_sema),
                  ^
                  /home/mint/zig/src/Sema.zig:37067:35: 0x90cefd0 in typeRequiresComptime (zig)
                  return ty.comptimeOnlyAdvanced(sema.mod, sema);
                  ^
                  /home/mint/zig/src/Sema.zig:25316:39: 0x9c2ab9a in validateVarType (zig)
                  if (!try sema.typeRequiresComptime(var_ty)) return;
                  ^
                  /home/mint/zig/src/Sema.zig:3943:29: 0x96ae31a in zirAllocMut (zig)
                  try sema.validateVarType(block, ty_src, var_ty, false);
                  ^
                  /home/mint/zig/src/Sema.zig:1007:66: 0x9365b35 in analyzeBodyInner (zig)
                  .alloc_mut => try sema.zirAllocMut(block, inst),
                  ^
                  /home/mint/zig/src/Sema.zig:5853:34: 0x9d0d29b in resolveBlockBody (zig)
                  if (sema.analyzeBodyInner(child_block, body)) |_| {
                  ^
                  /home/mint/zig/src/Sema.zig:5836:33: 0x9784fd8 in zirBlock (zig)
                  return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                  ^
                  /home/mint/zig/src/Sema.zig:1577:49: 0x937734a in analyzeBodyInner (zig)
                  break :blk try sema.zirBlock(block, inst, tags[@intFromEnum(inst)] == .block_comptime);
                  ^
                  /home/mint/zig/src/Sema.zig:916:30: 0x9652178 in analyzeBody (zig)
                  _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                  ^
                  /home/mint/zig/src/Module.zig:4707:21: 0x9344d86 in analyzeFnBody (zig)
                  sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                  ^
                  /home/mint/zig/src/Module.zig:3357:40: 0x90c856d in ensureFuncBodyAnalyzed (zig)
                  var air = mod.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) {
                  ^
                  /home/mint/zig/src/Compilation.zig:3519:42: 0x90c675d in processOneJob (zig)
                  module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
                  ^
                  /home/mint/zig/src/Compilation.zig:3456:30: 0x8e9a84e in performAllTheWork (zig)
                  try processOneJob(comp, work_item, main_progress_node);
                  ^
                  /home/mint/zig/src/Compilation.zig:2237:31: 0x8e95ecc in update (zig)
                  try comp.performAllTheWork(main_progress_node);
                  ^
                  /home/mint/zig/src/main.zig:4236:24: 0x8ec5452 in updateModule (zig)
                  try comp.update(main_progress_node);
                  ^
                  /home/mint/zig/src/main.zig:3637:17: 0x8ee78f2 in buildOutputType (zig)
                  updateModule(comp) catch |err| switch (err) {
                  ^
                  /home/mint/zig/src/main.zig:279:31: 0x8cfabff in mainArgs (zig)
                  return buildOutputType(gpa, arena, args, .{ .build = .Exe });
                  ^
                  /home/mint/zig/src/main.zig:223:20: 0x8cf7ee5 in main (zig)
                  return mainArgs(gpa, arena, args);
                  ^
                  /home/mint/zig/lib/std/start.zig:581:37: 0x8cf78fe in main (zig)
                  const result = root.main() catch |err| {
                  ^
                  ../sysdeps/nptl/libc_start_call_main.h:58:16: 0x7f3e34b22d8f in __libc_start_call_main (../sysdeps/x86/libc-start.c)
                  ../csu/libc-start.c:392:3: 0x7f3e34b22e3f in __libc_start_main_impl (../sysdeps/x86/libc-start.c)
                  ???:?:?: 0x40d2824 in ??? (???)
                  ???:?:?: 0x0 in ??? (???)
                  Aborted (core dumped)
                  

                  Expected Behavior

                  The compiler should correctly report the error:

                  test.zig:2:26: error: backing integer type 'u32' has bit size 32 but the struct fields have a total bit size of 42
                  position: packed struct(u32) {
                  ^~~
                  

                  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

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Crash in InternPool when faulty `packed struct` is inside an `extern struct` · Issue #17859 · ziglang/zig · GitHub
                      Skip to content

                      Crash in InternPool when faulty packed struct is inside an extern struct #17859

                      Description

                      @IntegratedQuantum

                      Zig Version

                      0.12.0-dev.1390+94cee4fb2

                      Steps to Reproduce and Observed Behavior

                      pubconstChunkMesh=externstruct {
                      position: packedstruct(u32) {
                      vals: u42, // Wrong number of bits
                      },
                      blockAndModel: u32,
                      };
                      fngetBlockFromRenderThread() u32 {
                      varmesh: *ChunkMesh=undefined;
                      returnmesh.chunk.getBlock();
                      }
                      pubfnupdateAndGetRenderChunks() []*ChunkMesh {
                      returnundefined;
                      }
                      pubfnmain() !void {
                      _=getBlockFromRenderThread();
                      _=updateAndGetRenderChunks();
                      }
                      $ zig build-exe test.zig
                      Segmentation fault (core dumped)
                      
                      Trace of a debug build of the compiler
                      $ zig-debug build-exe test.zig
                      thread 9369 panic: reached unreachable code
                      Analyzing test.zig: test.zig:getBlockFromRenderThread
                      %10 = dbg_block_begin()
                      %11 = dbg_stmt(2, 2)
                      %12 = block_comptime({
                      %13 = decl_val("ChunkMesh") token_offset:9:13 to :9:22
                      %14 = ptr_type(%13, One) node_offset:9:12 to :9:22
                      %15 = break(%12, %14)
                      }) node_offset:9:12 to :9:22
                      > %16 = alloc_mut(%12) node_offset:9:2 to :9:34
                      %17 = store_node(%16, @undef) node_offset:9:25 to :9:34
                      %18 = dbg_var_ptr(%16, "mesh")
                      %19 = dbg_stmt(3, 2)
                      %20 = ret_type() node_offset:10:2 to :10:30
                      %21 = dbg_stmt(3, 13)
                      %22 = field_ptr(%16, "chunk") node_offset:10:9 to :10:19
                      %23 = dbg_stmt(3, 19)
                      %24 = dbg_stmt(3, 28)
                      %25 = field_call(.auto, %22, "getBlock", []) node_offset:10:9 to :10:30
                      %26 = as_node(%20, %25) node_offset:10:9 to :10:30
                      %27 = dbg_stmt(3, 2)
                      %28 = restore_err_ret_index(%26)
                      %29 = ret_node(%26) node_offset:10:2 to :10:30
                      %30 = dbg_block_end()
                      %31 = restore_err_ret_index(%9)
                      %32 = break(%9, @void_value)
                      For full context, use the command
                      zig ast-check -t test.zig
                      in test.zig: test.zig:getBlockFromRenderThread
                      > %9 = block({%10..%32}) node_offset:8:35 to :8:35
                      /home/mint/zig/lib/std/debug.zig:342:14: 0x8cf8a5c in assert (zig)
                      if (!ok) unreachable; // assertion failure
                      ^
                      /home/mint/zig/src/InternPool.zig:2053:15: 0x8e69743 in toType (zig)
                      assert(i != .none);
                      ^
                      /home/mint/zig/src/type.zig:2646:56: 0x937dc96 in comptimeOnlyAdvanced (zig)
                      if (try field_ty.toType().comptimeOnlyAdvanced(mod, opt_sema)) {
                      ^
                      /home/mint/zig/src/type.zig:2555:69: 0x937d1da in comptimeOnlyAdvanced (zig)
                      else => return child_ty.comptimeOnlyAdvanced(mod, opt_sema),
                      ^
                      /home/mint/zig/src/Sema.zig:37067:35: 0x90cefd0 in typeRequiresComptime (zig)
                      return ty.comptimeOnlyAdvanced(sema.mod, sema);
                      ^
                      /home/mint/zig/src/Sema.zig:25316:39: 0x9c2ab9a in validateVarType (zig)
                      if (!try sema.typeRequiresComptime(var_ty)) return;
                      ^
                      /home/mint/zig/src/Sema.zig:3943:29: 0x96ae31a in zirAllocMut (zig)
                      try sema.validateVarType(block, ty_src, var_ty, false);
                      ^
                      /home/mint/zig/src/Sema.zig:1007:66: 0x9365b35 in analyzeBodyInner (zig)
                      .alloc_mut => try sema.zirAllocMut(block, inst),
                      ^
                      /home/mint/zig/src/Sema.zig:5853:34: 0x9d0d29b in resolveBlockBody (zig)
                      if (sema.analyzeBodyInner(child_block, body)) |_| {
                      ^
                      /home/mint/zig/src/Sema.zig:5836:33: 0x9784fd8 in zirBlock (zig)
                      return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                      ^
                      /home/mint/zig/src/Sema.zig:1577:49: 0x937734a in analyzeBodyInner (zig)
                      break :blk try sema.zirBlock(block, inst, tags[@intFromEnum(inst)] == .block_comptime);
                      ^
                      /home/mint/zig/src/Sema.zig:916:30: 0x9652178 in analyzeBody (zig)
                      _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                      ^
                      /home/mint/zig/src/Module.zig:4707:21: 0x9344d86 in analyzeFnBody (zig)
                      sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                      ^
                      /home/mint/zig/src/Module.zig:3357:40: 0x90c856d in ensureFuncBodyAnalyzed (zig)
                      var air = mod.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) {
                      ^
                      /home/mint/zig/src/Compilation.zig:3519:42: 0x90c675d in processOneJob (zig)
                      module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
                      ^
                      /home/mint/zig/src/Compilation.zig:3456:30: 0x8e9a84e in performAllTheWork (zig)
                      try processOneJob(comp, work_item, main_progress_node);
                      ^
                      /home/mint/zig/src/Compilation.zig:2237:31: 0x8e95ecc in update (zig)
                      try comp.performAllTheWork(main_progress_node);
                      ^
                      /home/mint/zig/src/main.zig:4236:24: 0x8ec5452 in updateModule (zig)
                      try comp.update(main_progress_node);
                      ^
                      /home/mint/zig/src/main.zig:3637:17: 0x8ee78f2 in buildOutputType (zig)
                      updateModule(comp) catch |err| switch (err) {
                      ^
                      /home/mint/zig/src/main.zig:279:31: 0x8cfabff in mainArgs (zig)
                      return buildOutputType(gpa, arena, args, .{ .build = .Exe });
                      ^
                      /home/mint/zig/src/main.zig:223:20: 0x8cf7ee5 in main (zig)
                      return mainArgs(gpa, arena, args);
                      ^
                      /home/mint/zig/lib/std/start.zig:581:37: 0x8cf78fe in main (zig)
                      const result = root.main() catch |err| {
                      ^
                      ../sysdeps/nptl/libc_start_call_main.h:58:16: 0x7f3e34b22d8f in __libc_start_call_main (../sysdeps/x86/libc-start.c)
                      ../csu/libc-start.c:392:3: 0x7f3e34b22e3f in __libc_start_main_impl (../sysdeps/x86/libc-start.c)
                      ???:?:?: 0x40d2824 in ??? (???)
                      ???:?:?: 0x0 in ??? (???)
                      Aborted (core dumped)
                      

                      Expected Behavior

                      The compiler should correctly report the error:

                      test.zig:2:26: error: backing integer type 'u32' has bit size 32 but the struct fields have a total bit size of 42
                      position: packed struct(u32) {
                      ^~~
                      

                      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

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Crash in InternPool when faulty `packed struct` is inside an `extern struct` · Issue #17859 · ziglang/zig · GitHub
                          Skip to content

                          Crash in InternPool when faulty packed struct is inside an extern struct #17859

                          Description

                          @IntegratedQuantum

                          Zig Version

                          0.12.0-dev.1390+94cee4fb2

                          Steps to Reproduce and Observed Behavior

                          pubconstChunkMesh=externstruct {
                          position: packedstruct(u32) {
                          vals: u42, // Wrong number of bits
                          },
                          blockAndModel: u32,
                          };
                          fngetBlockFromRenderThread() u32 {
                          varmesh: *ChunkMesh=undefined;
                          returnmesh.chunk.getBlock();
                          }
                          pubfnupdateAndGetRenderChunks() []*ChunkMesh {
                          returnundefined;
                          }
                          pubfnmain() !void {
                          _=getBlockFromRenderThread();
                          _=updateAndGetRenderChunks();
                          }
                          $ zig build-exe test.zig
                          Segmentation fault (core dumped)
                          
                          Trace of a debug build of the compiler
                          $ zig-debug build-exe test.zig
                          thread 9369 panic: reached unreachable code
                          Analyzing test.zig: test.zig:getBlockFromRenderThread
                          %10 = dbg_block_begin()
                          %11 = dbg_stmt(2, 2)
                          %12 = block_comptime({
                          %13 = decl_val("ChunkMesh") token_offset:9:13 to :9:22
                          %14 = ptr_type(%13, One) node_offset:9:12 to :9:22
                          %15 = break(%12, %14)
                          }) node_offset:9:12 to :9:22
                          > %16 = alloc_mut(%12) node_offset:9:2 to :9:34
                          %17 = store_node(%16, @undef) node_offset:9:25 to :9:34
                          %18 = dbg_var_ptr(%16, "mesh")
                          %19 = dbg_stmt(3, 2)
                          %20 = ret_type() node_offset:10:2 to :10:30
                          %21 = dbg_stmt(3, 13)
                          %22 = field_ptr(%16, "chunk") node_offset:10:9 to :10:19
                          %23 = dbg_stmt(3, 19)
                          %24 = dbg_stmt(3, 28)
                          %25 = field_call(.auto, %22, "getBlock", []) node_offset:10:9 to :10:30
                          %26 = as_node(%20, %25) node_offset:10:9 to :10:30
                          %27 = dbg_stmt(3, 2)
                          %28 = restore_err_ret_index(%26)
                          %29 = ret_node(%26) node_offset:10:2 to :10:30
                          %30 = dbg_block_end()
                          %31 = restore_err_ret_index(%9)
                          %32 = break(%9, @void_value)
                          For full context, use the command
                          zig ast-check -t test.zig
                          in test.zig: test.zig:getBlockFromRenderThread
                          > %9 = block({%10..%32}) node_offset:8:35 to :8:35
                          /home/mint/zig/lib/std/debug.zig:342:14: 0x8cf8a5c in assert (zig)
                          if (!ok) unreachable; // assertion failure
                          ^
                          /home/mint/zig/src/InternPool.zig:2053:15: 0x8e69743 in toType (zig)
                          assert(i != .none);
                          ^
                          /home/mint/zig/src/type.zig:2646:56: 0x937dc96 in comptimeOnlyAdvanced (zig)
                          if (try field_ty.toType().comptimeOnlyAdvanced(mod, opt_sema)) {
                          ^
                          /home/mint/zig/src/type.zig:2555:69: 0x937d1da in comptimeOnlyAdvanced (zig)
                          else => return child_ty.comptimeOnlyAdvanced(mod, opt_sema),
                          ^
                          /home/mint/zig/src/Sema.zig:37067:35: 0x90cefd0 in typeRequiresComptime (zig)
                          return ty.comptimeOnlyAdvanced(sema.mod, sema);
                          ^
                          /home/mint/zig/src/Sema.zig:25316:39: 0x9c2ab9a in validateVarType (zig)
                          if (!try sema.typeRequiresComptime(var_ty)) return;
                          ^
                          /home/mint/zig/src/Sema.zig:3943:29: 0x96ae31a in zirAllocMut (zig)
                          try sema.validateVarType(block, ty_src, var_ty, false);
                          ^
                          /home/mint/zig/src/Sema.zig:1007:66: 0x9365b35 in analyzeBodyInner (zig)
                          .alloc_mut => try sema.zirAllocMut(block, inst),
                          ^
                          /home/mint/zig/src/Sema.zig:5853:34: 0x9d0d29b in resolveBlockBody (zig)
                          if (sema.analyzeBodyInner(child_block, body)) |_| {
                          ^
                          /home/mint/zig/src/Sema.zig:5836:33: 0x9784fd8 in zirBlock (zig)
                          return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                          ^
                          /home/mint/zig/src/Sema.zig:1577:49: 0x937734a in analyzeBodyInner (zig)
                          break :blk try sema.zirBlock(block, inst, tags[@intFromEnum(inst)] == .block_comptime);
                          ^
                          /home/mint/zig/src/Sema.zig:916:30: 0x9652178 in analyzeBody (zig)
                          _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                          ^
                          /home/mint/zig/src/Module.zig:4707:21: 0x9344d86 in analyzeFnBody (zig)
                          sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                          ^
                          /home/mint/zig/src/Module.zig:3357:40: 0x90c856d in ensureFuncBodyAnalyzed (zig)
                          var air = mod.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) {
                          ^
                          /home/mint/zig/src/Compilation.zig:3519:42: 0x90c675d in processOneJob (zig)
                          module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
                          ^
                          /home/mint/zig/src/Compilation.zig:3456:30: 0x8e9a84e in performAllTheWork (zig)
                          try processOneJob(comp, work_item, main_progress_node);
                          ^
                          /home/mint/zig/src/Compilation.zig:2237:31: 0x8e95ecc in update (zig)
                          try comp.performAllTheWork(main_progress_node);
                          ^
                          /home/mint/zig/src/main.zig:4236:24: 0x8ec5452 in updateModule (zig)
                          try comp.update(main_progress_node);
                          ^
                          /home/mint/zig/src/main.zig:3637:17: 0x8ee78f2 in buildOutputType (zig)
                          updateModule(comp) catch |err| switch (err) {
                          ^
                          /home/mint/zig/src/main.zig:279:31: 0x8cfabff in mainArgs (zig)
                          return buildOutputType(gpa, arena, args, .{ .build = .Exe });
                          ^
                          /home/mint/zig/src/main.zig:223:20: 0x8cf7ee5 in main (zig)
                          return mainArgs(gpa, arena, args);
                          ^
                          /home/mint/zig/lib/std/start.zig:581:37: 0x8cf78fe in main (zig)
                          const result = root.main() catch |err| {
                          ^
                          ../sysdeps/nptl/libc_start_call_main.h:58:16: 0x7f3e34b22d8f in __libc_start_call_main (../sysdeps/x86/libc-start.c)
                          ../csu/libc-start.c:392:3: 0x7f3e34b22e3f in __libc_start_main_impl (../sysdeps/x86/libc-start.c)
                          ???:?:?: 0x40d2824 in ??? (???)
                          ???:?:?: 0x0 in ??? (???)
                          Aborted (core dumped)
                          

                          Expected Behavior

                          The compiler should correctly report the error:

                          test.zig:2:26: error: backing integer type 'u32' has bit size 32 but the struct fields have a total bit size of 42
                          position: packed struct(u32) {
                          ^~~
                          

                          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

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Crash in InternPool when faulty `packed struct` is inside an `extern struct` · Issue #17859 · ziglang/zig · GitHub
                              Skip to content

                              Crash in InternPool when faulty packed struct is inside an extern struct #17859

                              Description

                              @IntegratedQuantum

                              Zig Version

                              0.12.0-dev.1390+94cee4fb2

                              Steps to Reproduce and Observed Behavior

                              pubconstChunkMesh=externstruct {
                              position: packedstruct(u32) {
                              vals: u42, // Wrong number of bits
                              },
                              blockAndModel: u32,
                              };
                              fngetBlockFromRenderThread() u32 {
                              varmesh: *ChunkMesh=undefined;
                              returnmesh.chunk.getBlock();
                              }
                              pubfnupdateAndGetRenderChunks() []*ChunkMesh {
                              returnundefined;
                              }
                              pubfnmain() !void {
                              _=getBlockFromRenderThread();
                              _=updateAndGetRenderChunks();
                              }
                              $ zig build-exe test.zig
                              Segmentation fault (core dumped)
                              
                              Trace of a debug build of the compiler
                              $ zig-debug build-exe test.zig
                              thread 9369 panic: reached unreachable code
                              Analyzing test.zig: test.zig:getBlockFromRenderThread
                              %10 = dbg_block_begin()
                              %11 = dbg_stmt(2, 2)
                              %12 = block_comptime({
                              %13 = decl_val("ChunkMesh") token_offset:9:13 to :9:22
                              %14 = ptr_type(%13, One) node_offset:9:12 to :9:22
                              %15 = break(%12, %14)
                              }) node_offset:9:12 to :9:22
                              > %16 = alloc_mut(%12) node_offset:9:2 to :9:34
                              %17 = store_node(%16, @undef) node_offset:9:25 to :9:34
                              %18 = dbg_var_ptr(%16, "mesh")
                              %19 = dbg_stmt(3, 2)
                              %20 = ret_type() node_offset:10:2 to :10:30
                              %21 = dbg_stmt(3, 13)
                              %22 = field_ptr(%16, "chunk") node_offset:10:9 to :10:19
                              %23 = dbg_stmt(3, 19)
                              %24 = dbg_stmt(3, 28)
                              %25 = field_call(.auto, %22, "getBlock", []) node_offset:10:9 to :10:30
                              %26 = as_node(%20, %25) node_offset:10:9 to :10:30
                              %27 = dbg_stmt(3, 2)
                              %28 = restore_err_ret_index(%26)
                              %29 = ret_node(%26) node_offset:10:2 to :10:30
                              %30 = dbg_block_end()
                              %31 = restore_err_ret_index(%9)
                              %32 = break(%9, @void_value)
                              For full context, use the command
                              zig ast-check -t test.zig
                              in test.zig: test.zig:getBlockFromRenderThread
                              > %9 = block({%10..%32}) node_offset:8:35 to :8:35
                              /home/mint/zig/lib/std/debug.zig:342:14: 0x8cf8a5c in assert (zig)
                              if (!ok) unreachable; // assertion failure
                              ^
                              /home/mint/zig/src/InternPool.zig:2053:15: 0x8e69743 in toType (zig)
                              assert(i != .none);
                              ^
                              /home/mint/zig/src/type.zig:2646:56: 0x937dc96 in comptimeOnlyAdvanced (zig)
                              if (try field_ty.toType().comptimeOnlyAdvanced(mod, opt_sema)) {
                              ^
                              /home/mint/zig/src/type.zig:2555:69: 0x937d1da in comptimeOnlyAdvanced (zig)
                              else => return child_ty.comptimeOnlyAdvanced(mod, opt_sema),
                              ^
                              /home/mint/zig/src/Sema.zig:37067:35: 0x90cefd0 in typeRequiresComptime (zig)
                              return ty.comptimeOnlyAdvanced(sema.mod, sema);
                              ^
                              /home/mint/zig/src/Sema.zig:25316:39: 0x9c2ab9a in validateVarType (zig)
                              if (!try sema.typeRequiresComptime(var_ty)) return;
                              ^
                              /home/mint/zig/src/Sema.zig:3943:29: 0x96ae31a in zirAllocMut (zig)
                              try sema.validateVarType(block, ty_src, var_ty, false);
                              ^
                              /home/mint/zig/src/Sema.zig:1007:66: 0x9365b35 in analyzeBodyInner (zig)
                              .alloc_mut => try sema.zirAllocMut(block, inst),
                              ^
                              /home/mint/zig/src/Sema.zig:5853:34: 0x9d0d29b in resolveBlockBody (zig)
                              if (sema.analyzeBodyInner(child_block, body)) |_| {
                              ^
                              /home/mint/zig/src/Sema.zig:5836:33: 0x9784fd8 in zirBlock (zig)
                              return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                              ^
                              /home/mint/zig/src/Sema.zig:1577:49: 0x937734a in analyzeBodyInner (zig)
                              break :blk try sema.zirBlock(block, inst, tags[@intFromEnum(inst)] == .block_comptime);
                              ^
                              /home/mint/zig/src/Sema.zig:916:30: 0x9652178 in analyzeBody (zig)
                              _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                              ^
                              /home/mint/zig/src/Module.zig:4707:21: 0x9344d86 in analyzeFnBody (zig)
                              sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                              ^
                              /home/mint/zig/src/Module.zig:3357:40: 0x90c856d in ensureFuncBodyAnalyzed (zig)
                              var air = mod.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) {
                              ^
                              /home/mint/zig/src/Compilation.zig:3519:42: 0x90c675d in processOneJob (zig)
                              module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
                              ^
                              /home/mint/zig/src/Compilation.zig:3456:30: 0x8e9a84e in performAllTheWork (zig)
                              try processOneJob(comp, work_item, main_progress_node);
                              ^
                              /home/mint/zig/src/Compilation.zig:2237:31: 0x8e95ecc in update (zig)
                              try comp.performAllTheWork(main_progress_node);
                              ^
                              /home/mint/zig/src/main.zig:4236:24: 0x8ec5452 in updateModule (zig)
                              try comp.update(main_progress_node);
                              ^
                              /home/mint/zig/src/main.zig:3637:17: 0x8ee78f2 in buildOutputType (zig)
                              updateModule(comp) catch |err| switch (err) {
                              ^
                              /home/mint/zig/src/main.zig:279:31: 0x8cfabff in mainArgs (zig)
                              return buildOutputType(gpa, arena, args, .{ .build = .Exe });
                              ^
                              /home/mint/zig/src/main.zig:223:20: 0x8cf7ee5 in main (zig)
                              return mainArgs(gpa, arena, args);
                              ^
                              /home/mint/zig/lib/std/start.zig:581:37: 0x8cf78fe in main (zig)
                              const result = root.main() catch |err| {
                              ^
                              ../sysdeps/nptl/libc_start_call_main.h:58:16: 0x7f3e34b22d8f in __libc_start_call_main (../sysdeps/x86/libc-start.c)
                              ../csu/libc-start.c:392:3: 0x7f3e34b22e3f in __libc_start_main_impl (../sysdeps/x86/libc-start.c)
                              ???:?:?: 0x40d2824 in ??? (???)
                              ???:?:?: 0x0 in ??? (???)
                              Aborted (core dumped)
                              

                              Expected Behavior

                              The compiler should correctly report the error:

                              test.zig:2:26: error: backing integer type 'u32' has bit size 32 but the struct fields have a total bit size of 42
                              position: packed struct(u32) {
                              ^~~
                              

                              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

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions