Skip to content

Commit 4a6eea9

Browse files
committed
cgen: generic struct init fix
1 parent f2b15d0 commit 4a6eea9

1 file changed

Lines changed: 28 additions & 0 deletions

File tree

vlib/v/gen/c/fn.v

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3314,6 +3314,18 @@ fn (mut g Gen) unwrap_receiver_type(node ast.CallExpr) (ast.Type, &ast.TypeSymbo
33143314
if resolved_left_type != 0 {
33153315
left_type = resolved_left_type
33163316
}
3317+
} else if node.left is ast.StructInit {
3318+
if g.cur_fn != unsafe { nil } && g.cur_concrete_types.len > 0 {
3319+
si_typ := if node.left.generic_typ != 0 {
3320+
node.left.generic_typ
3321+
} else {
3322+
node.left.typ
3323+
}
3324+
resolved := g.unwrap_generic(si_typ)
3325+
if resolved != 0 && !resolved.has_flag(.generic) {
3326+
left_type = resolved
3327+
}
3328+
}
33173329
}
33183330
if left_type == g.unwrap_generic(node.left_type) {
33193331
resolved_left_type := g.type_resolver.get_type_or_default(node.left, node.left_type)
@@ -3462,6 +3474,22 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
34623474
}
34633475
}
34643476
}
3477+
ast.StructInit {
3478+
// In generic contexts, node.left_type may be stale from a previous
3479+
// checker instantiation (the checker overwrites AST types on each pass).
3480+
// Use the struct init's own .typ which preserves the generic flag.
3481+
if g.cur_fn != unsafe { nil } && g.cur_concrete_types.len > 0 {
3482+
si_typ := if node.left.generic_typ != 0 {
3483+
node.left.generic_typ
3484+
} else {
3485+
node.left.typ
3486+
}
3487+
resolved := g.unwrap_generic(si_typ)
3488+
if resolved != 0 && !resolved.has_flag(.generic) {
3489+
left_type = resolved
3490+
}
3491+
}
3492+
}
34653493
else {}
34663494
}
34673495
if left_type == g.unwrap_generic(node.left_type) {

0 commit comments

Comments
 (0)