Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

compiler crash in beginComptimePtrLoad, wrong assumption for opt_payload_ptr value #12192

Closed
andrewrk opened this issue Jul 22, 2022 · 1 comment · Fixed by #12198
Closed
Labels
bug Observed behavior contradicts documented or intended behavior frontend Tokenization, parsing, AstGen, Sema, and Liveness.
Milestone

Comments

@andrewrk
Copy link
Member

zig version: 0.10.0-dev.3053+050d516da

Repro:

pub const io_mode = .evented;
pub fn main() void {}

#6025 is not implemented yet but the compiler still should not crash:

[nix-shell:~/Downloads/zig/build-release]$ stage2/bin/zig build-exe test.zig 
thread 244850 panic: attempt to use null value
Analyzing /home/andy/Downloads/zig/lib/std/fs/file.zig: fs/file.zig:File.write
      %4702 = dbg_block_begin())
      %4703 = dbg_block_begin())
      %4704 = dbg_stmt(9, 13)
      %4705 = ret_ptr() 
      %4706 = decl_ref("std") 
      %4707 = field_ptr(%4706, "event") 
      %4708 = field_ptr(%4707, "Loop") 
      %4709 = field_ptr(%4708, "instance") 
      %4710 = optional_payload_safe_ptr(%4709) 
    > %4711 = field_call_bind(%4710, "write") 
      %4712 = dbg_stmt(9, 51)
      %4713 = param_type(%4711, 0)
      %4714 = field_val(%4645, "handle") 
      %4715 = param_type(%4711, 1)
      %4716 = param_type(%4711, 2)
      %4717 = field_val(%4645, "capable_io_mode") 
      %4718 = field_val(%4645, "intended_io_mode") 
      %4719 = cmp_neq(%4717, %4718) 
      %4720 = call(.auto, %4711, [%4714, %4648, %4719]) 
      %4721 = store_node(%4705, %4720) 
      %4723 = dbg_block_end())
      %4724 = dbg_block_end())
      %4722 = ret_load(%4705) 
    For full context, use the command
      zig ast-check -t /home/andy/Downloads/zig/lib/std/fs/file.zig

  in /home/andy/Downloads/zig/lib/std/fs/file.zig: fs/file.zig:File.write
    > %4685 = condbr(%4684, {%4687..%4699}, {%4702..%4722}) 
  in /home/andy/Downloads/zig/lib/std/fs/file.zig: fs/file.zig:File.write
    > %4686 = block({%4680..%4685}) 

/home/andy/Downloads/zig/src/Sema.zig:22584:73: 0x39a2ca4 in Sema.beginComptimePtrLoad (zig)
                        .opt_payload_ptr => tv.val.castTag(.opt_payload).?.data,
                                                                        ^
/home/andy/Downloads/zig/src/Sema.zig:26288:44: 0x37eb346 in Sema.pointerDeref (zig)
    const deref = sema.beginComptimePtrLoad(block, src, ptr_val, load_ty) catch |err| switch (err) {
                                           ^
/home/andy/Downloads/zig/src/Sema.zig:23321:34: 0x3648f2b in Sema.analyzeLoad (zig)
        if (try sema.pointerDeref(block, src, ptr_val, ptr_ty)) |elem_val| {
                                 ^
/home/andy/Downloads/zig/src/Sema.zig:19130:29: 0x38007fc in Sema.fieldCallBind (zig)
        try sema.analyzeLoad(block, src, raw_ptr, src)
                            ^
/home/andy/Downloads/zig/src/Sema.zig:7672:30: 0x35d1e1f in Sema.zirFieldCallBind (zig)
    return sema.fieldCallBind(block, src, object_ptr, field_name, field_name_src);
                             ^
/home/andy/Downloads/zig/src/Sema.zig:746:71: 0x344d3d4 in Sema.analyzeBodyInner (zig)
            .field_call_bind              => try sema.zirFieldCallBind(block, inst),
                                                                      ^
/home/andy/Downloads/zig/src/Sema.zig:13499:30: 0x364bdc6 in Sema.zirCondbr (zig)
    _ = sema.analyzeBodyInner(&sub_block, else_body) catch |err| switch (err) {
                             ^
/home/andy/Downloads/zig/src/Sema.zig:1299:61: 0x345acde in Sema.analyzeBodyInner (zig)
                if (!block.is_comptime) break sema.zirCondbr(block, inst);
                                                            ^
/home/andy/Downloads/zig/src/Sema.zig:4686:34: 0x381a1ea in Sema.resolveBlockBody (zig)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
/home/andy/Downloads/zig/src/Sema.zig:4669:33: 0x3644617 in Sema.zirBlock (zig)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
/home/andy/Downloads/zig/src/Sema.zig:1207:69: 0x3458946 in Sema.analyzeBodyInner (zig)
                if (!block.is_comptime) break :blk try sema.zirBlock(block, inst);
                                                                    ^
/home/andy/Downloads/zig/src/Sema.zig:598:30: 0x343f69a in Sema.analyzeBody (zig)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
/home/andy/Downloads/zig/src/Module.zig:5072:21: 0x3275016 in Module.analyzeFnBody (zig)
    sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                    ^
/home/andy/Downloads/zig/src/Module.zig:3800:40: 0x3257b10 in Module.ensureFuncBodyAnalyzed (zig)
            var air = mod.analyzeFnBody(func, sema_arena) catch |err| switch (err) {
                                       ^
/home/andy/Downloads/zig/src/Compilation.zig:2970:42: 0x2fcfeea in Compilation.processOneJob (zig)
            module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
                                         ^
/home/andy/Downloads/zig/src/Compilation.zig:2902:30: 0x2fbbc6d in Compilation.performAllTheWork (zig)
            try processOneJob(comp, work_item);
                             ^
/home/andy/Downloads/zig/src/Compilation.zig:2250:31: 0x2fb42c2 in Compilation.update (zig)
    try comp.performAllTheWork(main_progress_node);
                              ^
/home/andy/Downloads/zig/src/main.zig:3294:20: 0x2f1f30f in updateModule (zig)
    try comp.update();
                   ^
/home/andy/Downloads/zig/src/main.zig:2983:17: 0x2ee70d5 in buildOutputType (zig)
    updateModule(gpa, comp, hook) catch |err| switch (err) {
                ^
/home/andy/Downloads/zig/src/main.zig:219:31: 0x2ecaed7 in mainArgs (zig)
        return buildOutputType(gpa, arena, args, .{ .build = .Exe });
                              ^
/home/andy/Downloads/zig/src/main.zig:174:20: 0x2eca1a4 in main (zig)
    return mainArgs(gpa, arena, args);
                   ^
/home/andy/Downloads/zig/lib/std/start.zig:580:37: 0x2ecca6f in std.start.main (zig)
            const result = root.main() catch |err| {
                                    ^
Aborted (core dumped)
@andrewrk andrewrk added bug Observed behavior contradicts documented or intended behavior frontend Tokenization, parsing, AstGen, Sema, and Liveness. labels Jul 22, 2022
@andrewrk andrewrk added this to the 0.10.0 milestone Jul 22, 2022
@topolarity
Copy link
Contributor

topolarity commented Jul 22, 2022

Smaller repro (or at least, more direct)

test {
    comptime {
        var val: u8 = 15;
        const opt_ptr: ?*u8 = &val;

        const payload_ptr = &opt_ptr.?;
        _ = payload_ptr.*;
    }
}

topolarity added a commit to topolarity/zig that referenced this issue Jul 22, 2022
Comptime pointer-like optionals can have a "flattened" representation,
just like runtime pointer-like optionals, where there is no separate
`.opt_payload` which acts as the non-null bit.

This change fixes `pointerDeref` and its mutable counterpart to account
for this.

Resolves ziglang#12192.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Observed behavior contradicts documented or intended behavior frontend Tokenization, parsing, AstGen, Sema, and Liveness.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants