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 {...@@ -275,8 +275,10 @@ pub const Tree = struct {
275 .extra_volatile_qualifier => {275 .extra_volatile_qualifier => {
276 return stream.writeAll("extra volatile qualifier");276 return stream.writeAll("extra volatile qualifier");
277 },277 },
278 .invalid_align => {278 .ptr_mod_on_array_child_type => {
279 return stream.writeAll("alignment not allowed on arrays");279 return stream.print("pointer modifier '{s}' not allowed on array child type", .{
280 token_tags[parse_error.token].symbol(),
281 });
280 },282 },
281 .invalid_and => {283 .invalid_and => {
282 return stream.writeAll("`&&` is invalid; note that `and` is boolean AND");284 return stream.writeAll("`&&` is invalid; note that `and` is boolean AND");
...@@ -2388,7 +2390,7 @@ pub const Error = struct {...@@ -2388,7 +2390,7 @@ pub const Error = struct {
2388 extra_allowzero_qualifier,2390 extra_allowzero_qualifier,
2389 extra_const_qualifier,2391 extra_const_qualifier,
2390 extra_volatile_qualifier,2392 extra_volatile_qualifier,
2391 invalid_align,2393 ptr_mod_on_array_child_type,
2392 invalid_and,2394 invalid_and,
2393 invalid_bit_range,2395 invalid_bit_range,
2394 invalid_token,2396 invalid_token,
lib/std/zig/parse.zig+20-15
...@@ -1612,13 +1612,15 @@ const Parser = struct {...@@ -1612,13 +1612,15 @@ const Parser = struct {
1612 /// PrefixTypeOp1612 /// PrefixTypeOp
1613 /// <- QUESTIONMARK1613 /// <- QUESTIONMARK
1614 /// / KEYWORD_anyframe MINUSRARROW1614 /// / KEYWORD_anyframe MINUSRARROW
1615 /// / ArrayTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*1615 /// / SliceTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
1616 /// / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*1616 /// / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
1617 /// / ArrayTypeStart
1618 /// SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET
1617 /// PtrTypeStart1619 /// PtrTypeStart
1618 /// <- ASTERISK1620 /// <- ASTERISK
1619 /// / ASTERISK21621 /// / ASTERISK2
1620 /// / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET1622 /// / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET
1621 /// ArrayTypeStart <- LBRACKET Expr? (COLON Expr)? RBRACKET1623 /// ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET
1622 fn parseTypeExpr(p: *Parser) Error!Node.Index {1624 fn parseTypeExpr(p: *Parser) Error!Node.Index {
1623 switch (p.token_tags[p.tok_i]) {1625 switch (p.token_tags[p.tok_i]) {
1624 .question_mark => return p.addNode(.{1626 .question_mark => return p.addNode(.{
...@@ -1785,15 +1787,15 @@ const Parser = struct {...@@ -1785,15 +1787,15 @@ const Parser = struct {
1785 else1787 else
1786 0;1788 0;
1787 _ = try p.expectToken(.r_bracket);1789 _ = 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 }
1796 if (len_expr == 0) {1790 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 }
1797 if (sentinel == 0) {1799 if (sentinel == 0) {
1798 return p.addNode(.{1800 return p.addNode(.{
1799 .tag = .ptr_type_aligned,1801 .tag = .ptr_type_aligned,
...@@ -1826,12 +1828,15 @@ const Parser = struct {...@@ -1826,12 +1828,15 @@ const Parser = struct {
1826 });1828 });
1827 }1829 }
1828 } else {1830 } else {
1829 if (mods.align_node != 0) {1831 switch (p.token_tags[p.tok_i]) {
1830 try p.warnMsg(.{1832 .keyword_align,
1831 .tag = .invalid_align,1833 .keyword_const,
1832 .token = p.nodes.items(.main_token)[mods.align_node],1834 .keyword_volatile,
1833 });1835 .keyword_allowzero,
1836 => return p.fail(.ptr_mod_on_array_child_type),
1837 else => {},
1834 }1838 }
1839 const elem_type = try p.expectTypeExpr();
1835 if (sentinel == 0) {1840 if (sentinel == 0) {
1836 return p.addNode(.{1841 return p.addNode(.{
1837 .tag = .array_type,1842 .tag = .array_type,
lib/std/zig/parser_test.zig+9-3
...@@ -4350,11 +4350,17 @@ test "zig fmt: error for invalid bit range" {...@@ -4350,11 +4350,17 @@ test "zig fmt: error for invalid bit range" {
4350 });4350 });
4351}4351}
43524352
4353test "zig fmt: error for invalid align" {4353test "zig fmt: error for ptr mod on array child type" {
4354 try testError(4354 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;
4356 , &[_]Error{4359 , &[_]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,
4358 });4364 });
4359}4365}
43604366