cgen: fix generic name handling for struct generic (fix #24530) (#24565)

This commit is contained in:
Felipe Pena 2025-05-29 04:51:17 -03:00 committed by GitHub
parent 7568526b14
commit c91cb87671
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 1 deletions

View File

@ -561,6 +561,7 @@ fn (mut g Gen) c_fn_name(node &ast.FnDecl) string {
if node.generic_names.len > 0 {
name = g.generic_fn_name(g.cur_concrete_types, name)
name = name.replace_each(c_fn_name_escape_seq)
}
if g.pref.translated || g.file.is_translated || node.is_file_translated {
@ -753,7 +754,10 @@ fn (mut g Gen) fn_decl_params(params []ast.Param, scope &ast.Scope, is_variadic
typ = g.table.sym(typ).array_info().elem_type.set_flag(.variadic)
}
param_type_sym := g.table.sym(typ)
mut param_type_name := g.styp(typ).replace_each(c_fn_name_escape_seq)
mut param_type_name := g.styp(typ)
if param.typ.has_flag(.generic) {
param_type_name = param_type_name.replace_each(c_fn_name_escape_seq)
}
if param_type_sym.kind == .function && !typ.has_flag(.option) {
info := param_type_sym.info as ast.FnType
func := info.func
@ -2012,6 +2016,7 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {
}
}
name = g.generic_fn_name(concrete_types, name)
name = name.replace_each(c_fn_name_escape_seq)
}
}
}

View File

@ -0,0 +1,23 @@
module main
struct People[T] {
raw T
}
struct Man {
name string
}
fn test_main() {
m1 := Man{
name: 'Tom'
}
gen1(m1)
}
fn gen1[T](m T) {
gen2[People[T]]()
}
fn gen2[T]() {
}