| ... | ... | @@ -1612,13 +1612,15 @@ const Parser = struct { |
| 1612 | 1612 | /// PrefixTypeOp |
| 1613 | 1613 | /// <- QUESTIONMARK |
| 1614 | 1614 | /// / KEYWORD_anyframe MINUSRARROW |
| 1615 | | /// / ArrayTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)* |
| 1615 | /// / SliceTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)* |
| 1616 | 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 | 1619 | /// PtrTypeStart |
| 1618 | 1620 | /// <- ASTERISK |
| 1619 | 1621 | /// / ASTERISK2 |
| 1620 | 1622 | /// / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET |
| 1621 | | /// ArrayTypeStart <- LBRACKET Expr? (COLON Expr)? RBRACKET |
| 1623 | /// ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET |
| 1622 | 1624 | fn parseTypeExpr(p: *Parser) Error!Node.Index { |
| 1623 | 1625 | switch (p.token_tags[p.tok_i]) { |
| 1624 | 1626 | .question_mark => return p.addNode(.{ |
| ... | ... | @@ -1785,15 +1787,15 @@ const Parser = struct { |
| 1785 | 1787 | else |
| 1786 | 1788 | 0; |
| 1787 | 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 | 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 | 1799 | if (sentinel == 0) { |
| 1798 | 1800 | return p.addNode(.{ |
| 1799 | 1801 | .tag = .ptr_type_aligned, |
| ... | ... | @@ -1826,12 +1828,15 @@ const Parser = struct { |
| 1826 | 1828 | }); |
| 1827 | 1829 | } |
| 1828 | 1830 | } 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 => {}, |
| 1834 | 1838 | } |
| 1839 | const elem_type = try p.expectTypeExpr(); |
| 1835 | 1840 | if (sentinel == 0) { |
| 1836 | 1841 | return p.addNode(.{ |
| 1837 | 1842 | .tag = .array_type, |