diff --git a/src/AstGen.zig b/src/AstGen.zig index 000151a2cc31c9269403bc619487a1c24810aa99..749e3d28c461bddcf69e91ce08ebae6c14d6441b 100644 --- a/src/AstGen.zig +++ b/src/AstGen.zig @@ -2906,9 +2906,14 @@ fn deferStmt( try gz.addDbgBlockBegin(); const ident_name = try gz.astgen.identAsString(payload_token); remapped_err_code = @intCast(Zir.Inst.Index, gz.astgen.instructions.len); - // Use a placeholder tag of .as to allow querying things that depend on the tag, - // but undefined data to prevent querying of data.bin. - try gz.astgen.instructions.append(gz.astgen.gpa, .{ .tag = .as, .data = undefined }); + try gz.astgen.instructions.append(gz.astgen.gpa, .{ + .tag = .extended, + .data = .{ .extended = .{ + .opcode = .errdefer_err_code, + .small = undefined, + .operand = undefined, + } }, + }); const remapped_err_code_ref = Zir.indexToRef(remapped_err_code); local_val_scope = .{ .parent = &defer_gen.base, diff --git a/src/Sema.zig b/src/Sema.zig index 13f4d684a151cb46c1f89f7d0a76b41f9a873e45..b2387dfe12ba1b375838ab6bf0a04fb479e80776 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -1198,6 +1198,7 @@ fn analyzeBodyInner( i += 1; continue; }, + .errdefer_err_code => unreachable, // never appears in a body }; }, diff --git a/src/Zir.zig b/src/Zir.zig index 51c90c61cbc68a2438aae40df8b44649660ae78a..7f9681e5333684c99553c2886cf3372d0b99141f 100644 --- a/src/Zir.zig +++ b/src/Zir.zig @@ -1979,7 +1979,7 @@ pub const Inst = struct { /// `operand` is `src_node: i32`. breakpoint, /// Implements the `@select` builtin. - /// operand` is payload index to `Select`. + /// `operand` is payload index to `Select`. select, /// Implement builtin `@errToInt`. /// `operand` is payload index to `UnNode`. @@ -1999,7 +1999,7 @@ pub const Inst = struct { /// `operand` is payload index to `Cmpxchg`. cmpxchg, /// Implement the builtin `@addrSpaceCast` - /// `Operand` is payload index to `BinNode`. `lhs` is dest type, `rhs` is operand. + /// `operand` is payload index to `BinNode`. `lhs` is dest type, `rhs` is operand. addrspace_cast, /// Implement builtin `@cVaArg`. /// `operand` is payload index to `BinNode`. @@ -2031,6 +2031,9 @@ pub const Inst = struct { /// Implements the `@inComptime` builtin. /// `operand` is `src_node: i32`. in_comptime, + /// Used as a placeholder for the capture of an `errdefer`. + /// This is replaced by Sema with the captured value. + errdefer_err_code, pub const InstData = struct { opcode: Extended, diff --git a/src/print_zir.zig b/src/print_zir.zig index 4e4f13641c3351f368e0b9ff52dd0be8b00d7c66..f228adc7ea7fc086dd3119473254e273a05545b8 100644 --- a/src/print_zir.zig +++ b/src/print_zir.zig @@ -467,6 +467,7 @@ const Writer = struct { .breakpoint, .c_va_start, .in_comptime, + .errdefer_err_code, => try self.writeExtNode(stream, extended), .builtin_src => {