-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Open
Labels
bugObserved behavior contradicts documented or intended behaviorObserved behavior contradicts documented or intended behaviorfrontendTokenization, parsing, AstGen, Sema, and Liveness.Tokenization, parsing, AstGen, Sema, and Liveness.
Milestone
Description
Zig Version
0.12.0-dev.1390+94cee4fb2
Steps to Reproduce and Observed Behavior
pub const ChunkMesh = extern struct {
position: packed struct(u32) {
vals: u42, // Wrong number of bits
},
blockAndModel: u32,
};
fn getBlockFromRenderThread() u32 {
var mesh: *ChunkMesh = undefined;
return mesh.chunk.getBlock();
}
pub fn updateAndGetRenderChunks() []*ChunkMesh {
return undefined;
}
pub fn main() !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
Labels
bugObserved behavior contradicts documented or intended behaviorObserved behavior contradicts documented or intended behaviorfrontendTokenization, parsing, AstGen, Sema, and Liveness.Tokenization, parsing, AstGen, Sema, and Liveness.