authorgravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2021-03-07 19:20:41+01:00
committergravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2021-03-12 00:18:30+01:00
loga5cb4ab95e80c4f75356b80251c3628811956b19
tree692586119ee6fbca48d6c2c28e75d8369aceb9ed
parent482424e2b12cfcfe71280c826a2d31cb5df13a1a

parser: disallow ptr modifiers on array types


3 files changed, 34 insertions(+), 21 deletions(-)

lib/std/zig/ast.zig+5-3
......@@ -275,8 +275,10 @@ pub const Tree = struct {
275275 .extra_volatile_qualifier => {
276276 return stream.writeAll("extra volatile qualifier");
277277 },
278 .invalid_align => {
279 return stream.writeAll("alignment not allowed on arrays");
278 .ptr_mod_on_array_child_type => {
279 return stream.print("pointer modifier '{s}' not allowed on array child type", .{
280 token_tags[parse_error.token].symbol(),
281 });
280282 },
281283 .invalid_and => {
282284 return stream.writeAll("`&&` is invalid; note that `and` is boolean AND");
......@@ -2388,7 +2390,7 @@ pub const Error = struct {
23882390 extra_allowzero_qualifier,
23892391 extra_const_qualifier,
23902392 extra_volatile_qualifier,
2391 invalid_align,
2393 ptr_mod_on_array_child_type,
23922394 invalid_and,
23932395 invalid_bit_range,
23942396 invalid_token,
lib/std/zig/parse.zig+20-15
......@@ -1612,13 +1612,15 @@ const Parser = struct {
16121612 /// PrefixTypeOp
16131613 /// <- QUESTIONMARK
16141614 /// / KEYWORD_anyframe MINUSRARROW
1615 /// / ArrayTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
1615 /// / SliceTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
16161616 /// / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
1617 /// / ArrayTypeStart
1618 /// SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET
16171619 /// PtrTypeStart
16181620 /// <- ASTERISK
16191621 /// / ASTERISK2
16201622 /// / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET
1621 /// ArrayTypeStart <- LBRACKET Expr? (COLON Expr)? RBRACKET
1623 /// ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET
16221624 fn parseTypeExpr(p: *Parser) Error!Node.Index {
16231625 switch (p.token_tags[p.tok_i]) {
16241626 .question_mark => return p.addNode(.{
......@@ -1785,15 +1787,15 @@ const Parser = struct {
17851787 else
17861788 0;
17871789 _ = try p.expectToken(.r_bracket);
1788 const mods = try p.parsePtrModifiers();
1789 const elem_type = try p.expectTypeExpr();
1790 if (mods.bit_range_start != 0) {
1791 try p.warnMsg(.{
1792 .tag = .invalid_bit_range,
1793 .token = p.nodes.items(.main_token)[mods.bit_range_start],
1794 });
1795 }
17961790 if (len_expr == 0) {
1791 const mods = try p.parsePtrModifiers();
1792 const elem_type = try p.expectTypeExpr();
1793 if (mods.bit_range_start != 0) {
1794 try p.warnMsg(.{
1795 .tag = .invalid_bit_range,
1796 .token = p.nodes.items(.main_token)[mods.bit_range_start],
1797 });
1798 }
17971799 if (sentinel == 0) {
17981800 return p.addNode(.{
17991801 .tag = .ptr_type_aligned,
......@@ -1826,12 +1828,15 @@ const Parser = struct {
18261828 });
18271829 }
18281830 } else {
1829 if (mods.align_node != 0) {
1830 try p.warnMsg(.{
1831 .tag = .invalid_align,
1832 .token = p.nodes.items(.main_token)[mods.align_node],
1833 });
1831 switch (p.token_tags[p.tok_i]) {
1832 .keyword_align,
1833 .keyword_const,
1834 .keyword_volatile,
1835 .keyword_allowzero,
1836 => return p.fail(.ptr_mod_on_array_child_type),
1837 else => {},
18341838 }
1839 const elem_type = try p.expectTypeExpr();
18351840 if (sentinel == 0) {
18361841 return p.addNode(.{
18371842 .tag = .array_type,
lib/std/zig/parser_test.zig+9-3
......@@ -4350,11 +4350,17 @@ test "zig fmt: error for invalid bit range" {
43504350 });
43514351}
43524352
4353test "zig fmt: error for invalid align" {
4353test "zig fmt: error for ptr mod on array child type" {
43544354 try testError(
4355 \\var x: [10]align(10)u8 = bar;
4355 \\var a: [10]align(10) u8 = e;
4356 \\var b: [10]const u8 = f;
4357 \\var c: [10]volatile u8 = g;
4358 \\var d: [10]allowzero u8 = h;
43564359 , &[_]Error{
4357 .invalid_align,
4360 .ptr_mod_on_array_child_type,
4361 .ptr_mod_on_array_child_type,
4362 .ptr_mod_on_array_child_type,
4363 .ptr_mod_on_array_child_type,
43584364 });
43594365}
43604366