authorgravatar for pentuppup@noreply.codeberg.orgpentuppup <pentuppup@noreply.codeberg.org> 2025-12-31 12:34:24-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-01-06 23:40:01+01:00
logc475f1fcd547a93d9e75770900b2fa0c45b43de3
treee131c5cc0a06dd35e7dda10500e629acec81f701
parent8b71ec6db700dc7af22ce0729991bce846ae6d76

Ast: disallow bit alignment on many-item and C pointers


3 files changed, 38 insertions(+), 42 deletions(-)

lib/std/zig/Ast.zig+1-1
......@@ -476,7 +476,7 @@ pub fn renderError(tree: Ast, parse_error: Error, w: *Writer) Writer.Error!void
476476 });
477477 },
478478 .invalid_bit_range => {
479 return w.writeAll("bit range not allowed on slices and arrays");
479 return w.writeAll("bit range only allowed on single item pointers");
480480 },
481481 .same_line_doc_comment => {
482482 return w.writeAll("same line documentation comment");
lib/std/zig/Parse.zig+27-38
......@@ -1820,50 +1820,39 @@ fn parseTypeExpr(p: *Parse) Error!?Node.Index {
18201820 _ = try p.expectToken(.r_bracket);
18211821 const mods = try p.parsePtrModifiers();
18221822 const elem_type = try p.expectTypeExpr();
1823 if (mods.bit_range_start == .none) {
1824 if (sentinel == null and mods.addrspace_node == .none) {
1825 return try p.addNode(.{
1826 .tag = .ptr_type_aligned,
1827 .main_token = l_bracket,
1828 .data = .{ .opt_node_and_node = .{
1829 mods.align_node,
1830 elem_type,
1831 } },
1832 });
1833 } else if (mods.align_node == .none and mods.addrspace_node == .none) {
1834 return try p.addNode(.{
1835 .tag = .ptr_type_sentinel,
1836 .main_token = l_bracket,
1837 .data = .{ .opt_node_and_node = .{
1838 .fromOptional(sentinel),
1839 elem_type,
1840 } },
1841 });
1842 } else {
1843 return try p.addNode(.{
1844 .tag = .ptr_type,
1845 .main_token = l_bracket,
1846 .data = .{ .extra_and_node = .{
1847 try p.addExtra(Node.PtrType{
1848 .sentinel = .fromOptional(sentinel),
1849 .align_node = mods.align_node,
1850 .addrspace_node = mods.addrspace_node,
1851 }),
1852 elem_type,
1853 } },
1854 });
1855 }
1823 if (mods.bit_range_start.unwrap()) |bit_range_start| {
1824 try p.warnMsg(.{
1825 .tag = .invalid_bit_range,
1826 .token = p.nodeMainToken(bit_range_start),
1827 });
1828 }
1829 if (sentinel == null and mods.addrspace_node == .none) {
1830 return try p.addNode(.{
1831 .tag = .ptr_type_aligned,
1832 .main_token = l_bracket,
1833 .data = .{ .opt_node_and_node = .{
1834 mods.align_node,
1835 elem_type,
1836 } },
1837 });
1838 } else if (mods.align_node == .none and mods.addrspace_node == .none) {
1839 return try p.addNode(.{
1840 .tag = .ptr_type_sentinel,
1841 .main_token = l_bracket,
1842 .data = .{ .opt_node_and_node = .{
1843 .fromOptional(sentinel),
1844 elem_type,
1845 } },
1846 });
18561847 } else {
18571848 return try p.addNode(.{
1858 .tag = .ptr_type_bit_range,
1849 .tag = .ptr_type,
18591850 .main_token = l_bracket,
18601851 .data = .{ .extra_and_node = .{
1861 try p.addExtra(Node.PtrTypeBitRange{
1852 try p.addExtra(Node.PtrType{
18621853 .sentinel = .fromOptional(sentinel),
1863 .align_node = mods.align_node.unwrap().?,
1854 .align_node = mods.align_node,
18641855 .addrspace_node = mods.addrspace_node,
1865 .bit_range_start = mods.bit_range_start.unwrap().?,
1866 .bit_range_end = mods.bit_range_end.unwrap().?,
18671856 }),
18681857 elem_type,
18691858 } },
lib/std/zig/parser_test.zig+10-3
......@@ -668,7 +668,6 @@ test "zig fmt: pointer-to-many with modifiers" {
668668 try testCanonical(
669669 \\const x: [*]u32 = undefined;
670670 \\const y: [*]allowzero align(8) addrspace(.generic) const volatile u32 = undefined;
671 \\const z: [*]allowzero align(8:4:2) addrspace(.generic) const volatile u32 = undefined;
672671 \\
673672 );
674673}
......@@ -677,7 +676,6 @@ test "zig fmt: sentinel pointer with modifiers" {
677676 try testCanonical(
678677 \\const x: [*:42]u32 = undefined;
679678 \\const y: [*:42]allowzero align(8) addrspace(.generic) const volatile u32 = undefined;
680 \\const y: [*:42]allowzero align(8:4:2) addrspace(.generic) const volatile u32 = undefined;
681679 \\
682680 );
683681}
......@@ -686,7 +684,6 @@ test "zig fmt: c pointer with modifiers" {
686684 try testCanonical(
687685 \\const x: [*c]u32 = undefined;
688686 \\const y: [*c]allowzero align(8) addrspace(.generic) const volatile u32 = undefined;
689 \\const z: [*c]allowzero align(8:4:2) addrspace(.generic) const volatile u32 = undefined;
690687 \\
691688 );
692689}
......@@ -5817,6 +5814,16 @@ test "zig fmt: error for missing sentinel value in sentinel slice" {
58175814}
58185815
58195816test "zig fmt: error for invalid bit range" {
5817 try testError(
5818 \\var x: [*]align(0:0:0)u8 = bar;
5819 , &[_]Error{
5820 .invalid_bit_range,
5821 });
5822 try testError(
5823 \\var x: [*c]align(0:0:0)u8 = bar;
5824 , &[_]Error{
5825 .invalid_bit_range,
5826 });
58205827 try testError(
58215828 \\var x: []align(0:0:0)u8 = bar;
58225829 , &[_]Error{