zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit cd5ebdb904919c313916b3f0b4ec5acff02f465e (tree)
parent fcfa3f3b4a1ef964173670b29741ffd36f52bd98
Author: Motiejus Jakštys <motiejus@jakstys.lt>
Date:   Tue, 10 Feb 2026 14:37:40 +0000

parser: port test "top-level bare asterisk+asterisk+identifier"

Implement ** (double pointer) type parsing in parseTypeExpr.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Diffstat:
Mparser.c | 23+++++++++++++++++++----
Mparser_test.zig | 7+++++++
2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/parser.c b/parser.c @@ -839,10 +839,25 @@ static AstNodeIndex parseTypeExpr(Parser* p) { .data = { .lhs = 0, .rhs = child_type }, }); } - case TOKEN_ASTERISK_ASTERISK: - fprintf(stderr, "parseTypeExpr not supported for %s\n", - tokenizerGetTagString(tok)); - exit(1); + case TOKEN_ASTERISK_ASTERISK: { + // ** is two nested pointer types sharing the same token + const AstTokenIndex asterisk = nextToken(p); + // Inner pointer: parse modifiers and child type + const AstNodeIndex inner_child = parseTypeExpr(p); + const AstNodeIndex inner = addNode(&p->nodes, + (AstNodeItem) { + .tag = AST_NODE_PTR_TYPE_ALIGNED, + .main_token = asterisk, + .data = { .lhs = 0, .rhs = inner_child }, + }); + // Outer pointer wraps the inner + return addNode(&p->nodes, + (AstNodeItem) { + .tag = AST_NODE_PTR_TYPE_ALIGNED, + .main_token = asterisk, + .data = { .lhs = 0, .rhs = inner }, + }); + } case TOKEN_L_BRACKET: { const AstTokenIndex lbracket = nextToken(p); if (p->token_tags[p->tok_i] == TOKEN_ASTERISK) { diff --git a/parser_test.zig b/parser_test.zig @@ -1812,3 +1812,10 @@ test "zig fmt: top-level bare asterisk+identifier" { \\ ); } + +test "zig fmt: top-level bare asterisk+asterisk+identifier" { + try testCanonical( + \\**x + \\ + ); +}