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

debug printing ZIR of this zig code crashes stage2 #8825

Closed
andrewrk opened this issue May 18, 2021 · 1 comment
Closed

debug printing ZIR of this zig code crashes stage2 #8825

andrewrk opened this issue May 18, 2021 · 1 comment
Labels
bug Observed behavior contradicts documented or intended behavior frontend Tokenization, parsing, AstGen, Sema, and Liveness.
Milestone

Comments

@andrewrk
Copy link
Member

fn ArrayList(comptime T: type) type {
    return struct {
        x: T,

        fn foo(self: @This()) void {
            const a = self;
            const b = T;
        }
    };
}
[nix-shell:~/dev/zig/build-release]$ ./zig-out/bin/zig astgen test.zig
# Source bytes:       182B
# Tokens:             43 (239B)
# AST Nodes:          19 (367B)
# Total ZIR bytes:    571B
# Instructions:       22 (198B)
# String Table Bytes: 29B
# Extra Data Items:   70 (280B)
%21 = extended(struct_decl(parent, Auto, {
  [63] ArrayList line(0) hash(4d7f75c961c3193e0dc2fa1aafb225e1): %0 = block_inline({
    %19 = func([@Ref.type_type], @Ref.type_type, {
      %1 = arg("T") token_offset:1:23
      %2 = dbg_stmt(1, 4)
      %3 = extended(ret_type()) node_offset:2:5
      %15 = extended(struct_decl(anon, Auto, {
        [31] foo line(4) hash(3c92c018eb12595917908fd6fd000f2b): %5 = block_inline({
          %6 = extended(this()) node_offset:5:22
          %7 = as_node(@Ref.type_type, %6) node_offset:5:22
          %13 = func([%7], @Ref.void_type, {
            %8 = arg("self") token_offset:5:16
            %9 = dbg_stmt(1, 12)
            %10 = dbg_stmt(2, 12)
            %11 = decl_val("T") token_offset:7:23
            %12 = ret_coerce(@Ref.void_value) token_offset:8:9
          }) (lbrace=0:27,rbrace=3:8) node_offset:5:9
          %14 = break_inline(%5, %13)
        }) node_offset:5:9
      }, {
        %4 = as_node(@Ref.type_type, %1) thread 2088 panic: index out of bounds
/home/andy/dev/zig/src/Module.zig:1500:46: 0x489598 in Module.SrcLoc.byteOffset (zig)
                const tok_index = main_tokens[node];
                                             ^
/home/andy/dev/zig/src/Zir.zig:4448:48: 0x581d8a in Zir.Writer.writeSrc (zig)
        const abs_byte_off = src_loc.byteOffset(self.gpa) catch unreachable;
                                               ^
/home/andy/dev/zig/src/Zir.zig:4176:26: 0x4ba727 in Zir.Writer.writeAs (zig)
        try self.writeSrc(stream, inst_data.src());
                         ^
/home/andy/dev/zig/src/Zir.zig:3039:41: 0x4b1ea2 in Zir.Writer.writeInstToStream (zig)
            .as_node => try self.writeAs(stream, inst),
                                        ^
/home/andy/dev/zig/src/Zir.zig:4466:39: 0x581ffd in Zir.Writer.writeBody (zig)
            try self.writeInstToStream(stream, inst);
                                      ^
/home/andy/dev/zig/src/Zir.zig:3549:35: 0x58e105 in Zir.Writer.writeStructDecl (zig)
                try self.writeBody(stream, body);
                                  ^
/home/andy/dev/zig/src/Zir.zig:3105:53: 0x4bb691 in Zir.Writer.writeExtended (zig)
            .struct_decl => try self.writeStructDecl(stream, extended),
                                                    ^
/home/andy/dev/zig/src/Zir.zig:3073:48: 0x4b2213 in Zir.Writer.writeInstToStream (zig)
            .extended => try self.writeExtended(stream, inst),
                                               ^
/home/andy/dev/zig/src/Zir.zig:4466:39: 0x581ffd in Zir.Writer.writeBody (zig)
            try self.writeInstToStream(stream, inst);
                                      ^
/home/andy/dev/zig/src/Zir.zig:4379:31: 0x58adc2 in Zir.Writer.writeFuncCommon (zig)
            try self.writeBody(stream, body);
                              ^
/home/andy/dev/zig/src/Zir.zig:4217:36: 0x4bac5e in Zir.Writer.writeFunc (zig)
        return self.writeFuncCommon(
                                   ^
/home/andy/dev/zig/src/Zir.zig:3058:40: 0x4b1fec in Zir.Writer.writeInstToStream (zig)
            .func => try self.writeFunc(stream, inst, false),
                                       ^
/home/andy/dev/zig/src/Zir.zig:4466:39: 0x581ffd in Zir.Writer.writeBody (zig)
            try self.writeInstToStream(stream, inst);
                                      ^
/home/andy/dev/zig/src/Zir.zig:3467:27: 0x5869c5 in Zir.Writer.writePlNodeBlockWithoutSrc (zig)
        try self.writeBody(stream, body);
                          ^
/home/andy/dev/zig/src/Zir.zig:3826:48: 0x5880c8 in Zir.Writer.writeDecls (zig)
            try self.writePlNodeBlockWithoutSrc(stream, decl_index);
                                               ^
/home/andy/dev/zig/src/Zir.zig:3531:46: 0x58eaac in Zir.Writer.writeStructDecl (zig)
            extra_index = try self.writeDecls(stream, decls_len, extra_index);
                                             ^
/home/andy/dev/zig/src/Zir.zig:3105:53: 0x4bb691 in Zir.Writer.writeExtended (zig)
            .struct_decl => try self.writeStructDecl(stream, extended),
                                                    ^
/home/andy/dev/zig/src/Zir.zig:3073:48: 0x4b2213 in Zir.Writer.writeInstToStream (zig)
            .extended => try self.writeExtended(stream, inst),
                                               ^
/home/andy/dev/zig/src/Zir.zig:136:33: 0x3bf8ba in Zir.renderAsTextToFile (zig)
    try writer.writeInstToStream(fs_file.writer(), main_struct_inst);
                                ^
/home/andy/dev/zig/src/main.zig:3662:34: 0x39b269 in cmdAstgen (zig)
    return Zir.renderAsTextToFile(gpa, &file, io.getStdOut());
                                 ^
/home/andy/dev/zig/src/main.zig:234:25: 0x33e266 in mainArgs (zig)
        return cmdAstgen(gpa, arena, cmd_args);
                        ^
/home/andy/dev/zig/src/main.zig:141:20: 0x335860 in main (zig)
    return mainArgs(gpa, arena, args);
                   ^
/home/andy/dev/zig/lib/std/start.zig:458:37: 0x32e0fa in std.start.callMain (zig)
            const result = root.main() catch |err| {
                                    ^
/home/andy/dev/zig/lib/std/start.zig:400:12: 0x31225e in std.start.callMainWithArgs (zig)
    return @call(.{ .modifier = .always_inline }, callMain, .{});
           ^
/home/andy/dev/zig/lib/std/start.zig:318:17: 0x311245 in std.start.posixCallMainAndExit (zig)
    std.os.exit(@call(.{ .modifier = .always_inline }, callMainWithArgs, .{ argc, argv, envp }));
                ^
/home/andy/dev/zig/lib/std/start.zig:244:5: 0x310fa2 in std.start._start (zig)
    @call(.{ .modifier = .never_inline }, posixCallMainAndExit, .{});
    ^
Aborted (core dumped)
@andrewrk andrewrk added bug Observed behavior contradicts documented or intended behavior frontend Tokenization, parsing, AstGen, Sema, and Liveness. labels May 18, 2021
@andrewrk andrewrk added this to the 0.8.0 milestone May 18, 2021
@andrewrk andrewrk modified the milestones: 0.8.0, 0.8.1 Jun 4, 2021
@andrewrk
Copy link
Member Author

Reduced test case:

fn a() type {
    return struct { b: *i32 };
}

andrewrk added a commit to g-w1/zig that referenced this issue Jun 21, 2021
The printing code did not properly set the parent Decl node field, so
the source location calculations were wrong.

closes ziglang#8825
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

No branches or pull requests

1 participant