summaryrefslogtreecommitdiff
path: root/src/parser/parser_struct.c
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-23 17:29:30 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-23 17:29:30 +0000
commitd7b24c552305f1bd8c49e253d14dcf4b1581df2c (patch)
tree1f5ae2aa05af21120525b180d07b2657078678da /src/parser/parser_struct.c
parentc735d4b45f2db336e2aff8d94da7a08bb1fad68f (diff)
Fix for #94
Diffstat (limited to 'src/parser/parser_struct.c')
-rw-r--r--src/parser/parser_struct.c28
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);
}