authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-10-10 08:28:33+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-10-10 09:09:47+02:00
logd1b5fac7f916745d90f0ec1718b347a36e45862a
tree4d72db00793c04d91833f07ce022c7ff6eef1718
parent29ec780712f120294477441e53251e796a63ae70
signature Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

Merge pull request 'AstGen: increment baseline when inside backing tag' (#37074) from sinon/zig:astgen-offset-fix into master

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/37074 Reviewed-by: Andrew Kelley <andrew@ziglang.org>

3 files changed, 59 insertions(+), 12 deletions(-)

lib/std/zig/AstGen.zig+6
...@@ -4929,6 +4929,8 @@ fn structDeclInner(...@@ -4929,6 +4929,8 @@ fn structDeclInner(
49294929
4930 // Before any field bodies comes the backing int type, if specified.4930 // Before any field bodies comes the backing int type, if specified.
4931 const backing_int_type_body_len: ?u32 = if (maybe_backing_int_node.unwrap()) |backing_int_node| len: {4931 const backing_int_type_body_len: ?u32 = if (maybe_backing_int_node.unwrap()) |backing_int_node| len: {
4932 block_scope.src_baseline = backing_int_node;
4933 defer block_scope.src_baseline = node;
4932 if (layout != .@"packed") return astgen.failNode(4934 if (layout != .@"packed") return astgen.failNode(
4933 backing_int_node,4935 backing_int_node,
4934 "non-packed struct does not support backing integer type",4936 "non-packed struct does not support backing integer type",
...@@ -5224,6 +5226,8 @@ fn unionDeclInner(...@@ -5224,6 +5226,8 @@ fn unionDeclInner(
52245226
5225 // Before any field bodies comes the tag/backing type, if specified.5227 // Before any field bodies comes the tag/backing type, if specified.
5226 const arg_type_body_len: ?u32 = if (opt_arg_node.unwrap()) |arg_node| len: {5228 const arg_type_body_len: ?u32 = if (opt_arg_node.unwrap()) |arg_node| len: {
5229 block_scope.src_baseline = arg_node;
5230 defer block_scope.src_baseline = node;
5227 astgen.src_hasher.update(astgen.tree.getNodeSource(arg_node));5231 astgen.src_hasher.update(astgen.tree.getNodeSource(arg_node));
5228 const type_ref = try typeExpr(&block_scope, &namespace.base, arg_node);5232 const type_ref = try typeExpr(&block_scope, &namespace.base, arg_node);
5229 if (!block_scope.endsWithNoReturn()) {5233 if (!block_scope.endsWithNoReturn()) {
...@@ -5444,6 +5448,8 @@ fn containerDecl(...@@ -5444,6 +5448,8 @@ fn containerDecl(
54445448
5445 // Before any field bodies comes the tag type, if specified.5449 // Before any field bodies comes the tag type, if specified.
5446 const tag_type_body_len: ?u32 = if (container_decl.ast.arg.unwrap()) |tag_type_node| len: {5450 const tag_type_body_len: ?u32 = if (container_decl.ast.arg.unwrap()) |tag_type_node| len: {
5451 block_scope.src_baseline = tag_type_node;
5452 defer block_scope.src_baseline = node;
5447 astgen.src_hasher.update(astgen.tree.getNodeSource(tag_type_node));5453 astgen.src_hasher.update(astgen.tree.getNodeSource(tag_type_node));
5448 const type_ref = try typeExpr(&block_scope, &namespace.base, tag_type_node);5454 const type_ref = try typeExpr(&block_scope, &namespace.base, tag_type_node);
5449 if (!block_scope.endsWithNoReturn()) {5455 if (!block_scope.endsWithNoReturn()) {
src/print_zir.zig+24-12
...@@ -1462,7 +1462,7 @@ const Writer = struct {...@@ -1462,7 +1462,7 @@ const Writer = struct {
1462 if (struct_decl.backing_int_type_body) |backing_int_type_body| {1462 if (struct_decl.backing_int_type_body) |backing_int_type_body| {
1463 assert(struct_decl.layout == .@"packed");1463 assert(struct_decl.layout == .@"packed");
1464 try stream.writeAll("packed(");1464 try stream.writeAll("packed(");
1465 try self.writeBracedDecl(stream, backing_int_type_body);1465 try self.writeBracedDeclWithBaseline(stream, backing_int_type_body, struct_decl.arg_baseline_src_node);
1466 try stream.writeAll("), ");1466 try stream.writeAll("), ");
1467 } else {1467 } else {
1468 try stream.print("{s}, ", .{@tagName(struct_decl.layout)});1468 try stream.print("{s}, ", .{@tagName(struct_decl.layout)});
...@@ -1487,15 +1487,15 @@ const Writer = struct {...@@ -1487,15 +1487,15 @@ const Writer = struct {
1487 try stream.print("{f}: ", .{std.zig.fmtIdP(field_name)});1487 try stream.print("{f}: ", .{std.zig.fmtIdP(field_name)});
14881488
1489 self.indent += 2;1489 self.indent += 2;
1490 try self.writeBracedDecl(stream, field.type_body);1490 try self.writeBracedDeclWithBaseline(stream, field.type_body, struct_decl.fields_baseline_src_node);
1491 if (field.align_body) |body| {1491 if (field.align_body) |body| {
1492 try stream.writeAll(" align(");1492 try stream.writeAll(" align(");
1493 try self.writeBracedDecl(stream, body);1493 try self.writeBracedDeclWithBaseline(stream, body, struct_decl.fields_baseline_src_node);
1494 try stream.writeByte(')');1494 try stream.writeByte(')');
1495 }1495 }
1496 if (field.default_body) |body| {1496 if (field.default_body) |body| {
1497 try stream.writeAll(" = ");1497 try stream.writeAll(" = ");
1498 try self.writeBracedDecl(stream, body);1498 try self.writeBracedDeclWithBaseline(stream, body, struct_decl.fields_baseline_src_node);
1499 }1499 }
1500 self.indent -= 2;1500 self.indent -= 2;
15011501
...@@ -1529,18 +1529,18 @@ const Writer = struct {...@@ -1529,18 +1529,18 @@ const Writer = struct {
1529 .@"packed" => try stream.writeAll("packed, "),1529 .@"packed" => try stream.writeAll("packed, "),
1530 .packed_explicit => {1530 .packed_explicit => {
1531 try stream.writeAll("packed(");1531 try stream.writeAll("packed(");
1532 try self.writeBracedDecl(stream, union_decl.arg_type_body.?);1532 try self.writeBracedDeclWithBaseline(stream, union_decl.arg_type_body.?, union_decl.arg_baseline_src_node);
1533 try stream.writeAll("), ");1533 try stream.writeAll("), ");
1534 },1534 },
1535 .tagged_explicit => {1535 .tagged_explicit => {
1536 try stream.writeAll("tagged(");1536 try stream.writeAll("tagged(");
1537 try self.writeBracedDecl(stream, union_decl.arg_type_body.?);1537 try self.writeBracedDeclWithBaseline(stream, union_decl.arg_type_body.?, union_decl.arg_baseline_src_node);
1538 try stream.writeAll("), ");1538 try stream.writeAll("), ");
1539 },1539 },
1540 .tagged_enum => try stream.writeAll("tagged(enum), "),1540 .tagged_enum => try stream.writeAll("tagged(enum), "),
1541 .tagged_enum_explicit => {1541 .tagged_enum_explicit => {
1542 try stream.writeAll("tagged(enum(");1542 try stream.writeAll("tagged(enum(");
1543 try self.writeBracedDecl(stream, union_decl.arg_type_body.?);1543 try self.writeBracedDeclWithBaseline(stream, union_decl.arg_type_body.?, union_decl.arg_baseline_src_node);
1544 try stream.writeAll(")), ");1544 try stream.writeAll(")), ");
1545 },1545 },
1546 }1546 }
...@@ -1565,16 +1565,16 @@ const Writer = struct {...@@ -1565,16 +1565,16 @@ const Writer = struct {
1565 self.indent += 2;1565 self.indent += 2;
1566 if (field.type_body) |body| {1566 if (field.type_body) |body| {
1567 try stream.writeAll(": ");1567 try stream.writeAll(": ");
1568 try self.writeBracedDecl(stream, body);1568 try self.writeBracedDeclWithBaseline(stream, body, union_decl.fields_baseline_src_node);
1569 }1569 }
1570 if (field.align_body) |body| {1570 if (field.align_body) |body| {
1571 try stream.writeAll(" align(");1571 try stream.writeAll(" align(");
1572 try self.writeBracedDecl(stream, body);1572 try self.writeBracedDeclWithBaseline(stream, body, union_decl.fields_baseline_src_node);
1573 try stream.writeByte(')');1573 try stream.writeByte(')');
1574 }1574 }
1575 if (field.value_body) |body| {1575 if (field.value_body) |body| {
1576 try stream.writeAll(" = ");1576 try stream.writeAll(" = ");
1577 try self.writeBracedDecl(stream, body);1577 try self.writeBracedDeclWithBaseline(stream, body, union_decl.fields_baseline_src_node);
1578 }1578 }
1579 self.indent -= 2;1579 self.indent -= 2;
15801580
...@@ -1603,7 +1603,7 @@ const Writer = struct {...@@ -1603,7 +1603,7 @@ const Writer = struct {
1603 try self.writeFlag(stream, "nonexhaustive, ", enum_decl.nonexhaustive);1603 try self.writeFlag(stream, "nonexhaustive, ", enum_decl.nonexhaustive);
1604 if (enum_decl.tag_type_body) |tag_type_body| {1604 if (enum_decl.tag_type_body) |tag_type_body| {
1605 try stream.writeAll("tag(");1605 try stream.writeAll("tag(");
1606 try self.writeBracedDecl(stream, tag_type_body);1606 try self.writeBracedDeclWithBaseline(stream, tag_type_body, enum_decl.arg_baseline_src_node);
1607 try stream.writeAll("), ");1607 try stream.writeAll("), ");
1608 }1608 }
16091609
...@@ -1625,7 +1625,7 @@ const Writer = struct {...@@ -1625,7 +1625,7 @@ const Writer = struct {
1625 try stream.print("{f}", .{std.zig.fmtIdP(field_name)});1625 try stream.print("{f}", .{std.zig.fmtIdP(field_name)});
1626 if (field.value_body) |body| {1626 if (field.value_body) |body| {
1627 try stream.writeAll(" = ");1627 try stream.writeAll(" = ");
1628 try self.writeBracedDecl(stream, body);1628 try self.writeBracedDeclWithBaseline(stream, body, enum_decl.fields_baseline_src_node);
1629 }1629 }
1630 try stream.writeAll(",\n");1630 try stream.writeAll(",\n");
1631 }1631 }
...@@ -2409,6 +2409,18 @@ const Writer = struct {...@@ -2409,6 +2409,18 @@ const Writer = struct {
2409 try self.writeBracedBodyConditional(stream, body, self.recurse_decls);2409 try self.writeBracedBodyConditional(stream, body, self.recurse_decls);
2410 }2410 }
24112411
2412 fn writeBracedDeclWithBaseline(
2413 self: *Writer,
2414 stream: *std.Io.Writer,
2415 body: []const Zir.Inst.Index,
2416 src_baseline: Ast.Node.Index,
2417 ) !void {
2418 const prev_parent_decl_node = self.parent_decl_node;
2419 self.parent_decl_node = src_baseline;
2420 defer self.parent_decl_node = prev_parent_decl_node;
2421 try self.writeBracedDecl(stream, body);
2422 }
2423
2412 fn writeBracedBody(self: *Writer, stream: *std.Io.Writer, body: []const Zir.Inst.Index) !void {2424 fn writeBracedBody(self: *Writer, stream: *std.Io.Writer, body: []const Zir.Inst.Index) !void {
2413 try self.writeBracedBodyConditional(stream, body, self.recurse_blocks);2425 try self.writeBracedBodyConditional(stream, body, self.recurse_blocks);
2414 }2426 }
test/cases/compile_errors/compile_error_in_backing_tag.zig created+29
...@@ -0,0 +1,29 @@
1const E = enum(@compileError("enum")) {
2 x = 0,
3};
4
5const U = union(enum(@compileError("union"))) {
6 x = 0,
7};
8
9const S = packed struct(@compileError("struct")) {
10 x: u8 = 0,
11};
12
13comptime {
14 _ = &E.x;
15}
16
17comptime {
18 _ = &U.x;
19}
20
21comptime {
22 _ = &S{};
23}
24
25// error
26//
27// :1:16: error: enum
28// :5:22: error: union
29// :9:25: error: struct