| ... | @@ -1612,13 +1612,15 @@ const Parser = struct { | ... | @@ -1612,13 +1612,15 @@ const Parser = struct { |
| 1612 | /// PrefixTypeOp | 1612 | /// PrefixTypeOp |
| 1613 | /// <- QUESTIONMARK | 1613 | /// <- QUESTIONMARK |
| 1614 | /// / KEYWORD_anyframe MINUSRARROW | 1614 | /// / 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 | /// PtrTypeStart | 1619 | /// PtrTypeStart |
| 1618 | /// <- ASTERISK | 1620 | /// <- ASTERISK |
| 1619 | /// / ASTERISK2 | 1621 | /// / ASTERISK2 |
| 1620 | /// / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET | 1622 | /// / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET |
| 1621 | /// ArrayTypeStart <- LBRACKET Expr? (COLON Expr)? RBRACKET | 1623 | /// 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 | else | 1787 | 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, |