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:
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
+ \\
+ );
+}