diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-23 17:29:30 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-23 17:29:30 +0000 |
| commit | d7b24c552305f1bd8c49e253d14dcf4b1581df2c (patch) | |
| tree | 1f5ae2aa05af21120525b180d07b2657078678da /src/parser/parser_struct.c | |
| parent | c735d4b45f2db336e2aff8d94da7a08bb1fad68f (diff) | |
Fix for #94
Diffstat (limited to 'src/parser/parser_struct.c')
| -rw-r--r-- | src/parser/parser_struct.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/parser/parser_struct.c b/src/parser/parser_struct.c index 600d60d..01d1156 100644 --- a/src/parser/parser_struct.c +++ b/src/parser/parser_struct.c @@ -166,6 +166,11 @@ ASTNode *parse_impl(ParserContext *ctx, Lexer *l) } } + if (gen_param) + { + register_generic(ctx, gen_param); + } + // Check for "for" (Trait impl) Token pk = lexer_peek(l); if (pk.type == TOK_FOR || @@ -324,6 +329,10 @@ ASTNode *parse_impl(ParserContext *ctx, Lexer *l) register_impl_template(ctx, name2, gp, n); } + if (gen_param) + { + ctx->known_generics_count--; + } return n; } else @@ -463,6 +472,10 @@ ASTNode *parse_impl(ParserContext *ctx, Lexer *l) n->impl.methods = h; register_impl_template(ctx, name1, gen_param, n); ctx->current_impl_struct = NULL; + if (gen_param) + { + ctx->known_generics_count--; + } return NULL; // Do not emit generic template } else @@ -549,6 +562,11 @@ ASTNode *parse_impl(ParserContext *ctx, Lexer *l) n->impl.struct_name = name1; n->impl.methods = h; add_to_impl_list(ctx, n); + + if (gen_param) + { + ctx->known_generics_count--; + } return n; } } @@ -588,7 +606,11 @@ ASTNode *parse_struct(ParserContext *ctx, Lexer *l, int is_union) zpanic_at(next, "Expected ',' or '>' in generic parameter list"); } } - register_generic(ctx, name); + + for (int i = 0; i < gp_count; i++) + { + register_generic(ctx, gps[i]); + } } // Check for prototype (forward declaration) @@ -798,6 +820,7 @@ ASTNode *parse_struct(ParserContext *ctx, Lexer *l, int is_union) if (gp_count > 0) { node->strct.is_template = 1; + ctx->known_generics_count -= gp_count; register_template(ctx, name, node); } @@ -841,7 +864,7 @@ ASTNode *parse_enum(ParserContext *ctx, Lexer *l) Token g = lexer_next(l); gp = token_strdup(g); lexer_next(l); // eat > - register_generic(ctx, n.start ? token_strdup(n) : "anon"); + register_generic(ctx, gp); } lexer_next(l); // eat { @@ -934,6 +957,7 @@ ASTNode *parse_enum(ParserContext *ctx, Lexer *l) if (gp) { node->enm.is_template = 1; + ctx->known_generics_count--; register_template(ctx, node->enm.name, node); } |
