zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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:
Mlib/std/zig/Ast.zig | 2+-
Mlib/std/zig/Parse.zig | 65+++++++++++++++++++++++++++--------------------------------------
Mlib/std/zig/parser_test.zig | 13++++++++++---
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,