diff --git a/lib/std/zig/Ast.zig b/lib/std/zig/Ast.zig index b2eb2230bbf65a98977f9ca1da4e70c11e839e6a..7331f6188e925224c36fd9718f482eb64377f5c0 100644 --- 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 index 7fe55d8426a33685fa7268b8f094686f57f292ed..c8ad4c5fdaad3e684068480d8b5dd49f5802307d 100644 --- 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 index 7feca08e87704975485d42931b31e78ad1dd9041..1f1195633006e461cb352b161f0dcebf12f700ad 100644 --- 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; \\ ); } @@ -5817,6 +5814,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{