commit c475f1fcd547a93d9e75770900b2fa0c45b43de3 (tree)
parent 8b71ec6db700dc7af22ce0729991bce846ae6d76
Author: pentuppup <pentuppup@noreply.codeberg.org>
Date: Wed, 31 Dec 2025 12:34:24 -0500
Ast: disallow bit alignment on many-item and C pointers
Diffstat:
3 files changed, 38 insertions(+), 42 deletions(-)
diff --git a/lib/std/zig/Ast.zig b/lib/std/zig/Ast.zig
@@ -476,7 +476,7 @@ pub fn renderError(tree: Ast, parse_error: Error, w: *Writer) Writer.Error!void
});
},
.invalid_bit_range => {
- return w.writeAll("bit range not allowed on slices and arrays");
+ return w.writeAll("bit range only allowed on single item pointers");
},
.same_line_doc_comment => {
return w.writeAll("same line documentation comment");
diff --git a/lib/std/zig/Parse.zig b/lib/std/zig/Parse.zig
@@ -1820,50 +1820,39 @@ fn parseTypeExpr(p: *Parse) Error!?Node.Index {
_ = try p.expectToken(.r_bracket);
const mods = try p.parsePtrModifiers();
const elem_type = try p.expectTypeExpr();
- if (mods.bit_range_start == .none) {
- if (sentinel == null and mods.addrspace_node == .none) {
- return try p.addNode(.{
- .tag = .ptr_type_aligned,
- .main_token = l_bracket,
- .data = .{ .opt_node_and_node = .{
- mods.align_node,
- elem_type,
- } },
- });
- } else if (mods.align_node == .none and mods.addrspace_node == .none) {
- return try p.addNode(.{
- .tag = .ptr_type_sentinel,
- .main_token = l_bracket,
- .data = .{ .opt_node_and_node = .{
- .fromOptional(sentinel),
- elem_type,
- } },
- });
- } else {
- return try p.addNode(.{
- .tag = .ptr_type,
- .main_token = l_bracket,
- .data = .{ .extra_and_node = .{
- try p.addExtra(Node.PtrType{
- .sentinel = .fromOptional(sentinel),
- .align_node = mods.align_node,
- .addrspace_node = mods.addrspace_node,
- }),
- elem_type,
- } },
- });
- }
+ if (mods.bit_range_start.unwrap()) |bit_range_start| {
+ try p.warnMsg(.{
+ .tag = .invalid_bit_range,
+ .token = p.nodeMainToken(bit_range_start),
+ });
+ }
+ if (sentinel == null and mods.addrspace_node == .none) {
+ return try p.addNode(.{
+ .tag = .ptr_type_aligned,
+ .main_token = l_bracket,
+ .data = .{ .opt_node_and_node = .{
+ mods.align_node,
+ elem_type,
+ } },
+ });
+ } else if (mods.align_node == .none and mods.addrspace_node == .none) {
+ return try p.addNode(.{
+ .tag = .ptr_type_sentinel,
+ .main_token = l_bracket,
+ .data = .{ .opt_node_and_node = .{
+ .fromOptional(sentinel),
+ elem_type,
+ } },
+ });
} else {
return try p.addNode(.{
- .tag = .ptr_type_bit_range,
+ .tag = .ptr_type,
.main_token = l_bracket,
.data = .{ .extra_and_node = .{
- try p.addExtra(Node.PtrTypeBitRange{
+ try p.addExtra(Node.PtrType{
.sentinel = .fromOptional(sentinel),
- .align_node = mods.align_node.unwrap().?,
+ .align_node = mods.align_node,
.addrspace_node = mods.addrspace_node,
- .bit_range_start = mods.bit_range_start.unwrap().?,
- .bit_range_end = mods.bit_range_end.unwrap().?,
}),
elem_type,
} },
diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig
@@ -668,7 +668,6 @@ test "zig fmt: pointer-to-many with modifiers" {
try testCanonical(
\\const x: [*]u32 = undefined;
\\const y: [*]allowzero align(8) addrspace(.generic) const volatile u32 = undefined;
- \\const z: [*]allowzero align(8:4:2) addrspace(.generic) const volatile u32 = undefined;
\\
);
}
@@ -677,7 +676,6 @@ test "zig fmt: sentinel pointer with modifiers" {
try testCanonical(
\\const x: [*:42]u32 = undefined;
\\const y: [*:42]allowzero align(8) addrspace(.generic) const volatile u32 = undefined;
- \\const y: [*:42]allowzero align(8:4:2) addrspace(.generic) const volatile u32 = undefined;
\\
);
}
@@ -686,7 +684,6 @@ test "zig fmt: c pointer with modifiers" {
try testCanonical(
\\const x: [*c]u32 = undefined;
\\const y: [*c]allowzero align(8) addrspace(.generic) const volatile u32 = undefined;
- \\const z: [*c]allowzero align(8:4:2) addrspace(.generic) const volatile u32 = undefined;
\\
);
}
@@ -5818,6 +5815,16 @@ test "zig fmt: error for missing sentinel value in sentinel slice" {
test "zig fmt: error for invalid bit range" {
try testError(
+ \\var x: [*]align(0:0:0)u8 = bar;
+ , &[_]Error{
+ .invalid_bit_range,
+ });
+ try testError(
+ \\var x: [*c]align(0:0:0)u8 = bar;
+ , &[_]Error{
+ .invalid_bit_range,
+ });
+ try testError(
\\var x: []align(0:0:0)u8 = bar;
, &[_]Error{
.invalid_bit_range,