@@ -2706,15 +2706,16 @@ fn (g &Gen) is_c_type_name(name string) bool {
27062706fn (mut g Gen) record_generic_struct_bindings (struct_base_name string , struct_c_name string , concrete_params []ast.Expr) {
27072707 // Find the struct decl to get generic param names.
27082708 env_struct := g.lookup_struct_type (struct_base_name)
2709- generic_param_names := env_struct.generic_params
2710- if generic_param_names.len == 0 || generic_param_names.len != concrete_params.len {
2709+ generic_param_names := runtime_generic_param_names (env_struct.generic_params)
2710+ concrete_runtime_params := runtime_generic_args (concrete_params)
2711+ if generic_param_names.len == 0 || generic_param_names.len != concrete_runtime_params.len {
27112712 return
27122713 }
27132714 // Check that all concrete params are non-placeholder types.
27142715 mut bindings := map [string ]types.Type{}
2715- mut param_c_names := []string {cap: concrete_params .len}
2716+ mut param_c_names := []string {cap: concrete_runtime_params .len}
27162717 for i, param_name in generic_param_names {
2717- concrete_expr := concrete_params [i]
2718+ concrete_expr := concrete_runtime_params [i]
27182719 if is_generic_placeholder_type_name (concrete_expr.name ()) {
27192720 return
27202721 }
@@ -2762,14 +2763,15 @@ fn (mut g Gen) record_generic_struct_bindings(struct_base_name string, struct_c_
27622763// by resolving placeholder params through the parent struct's known bindings.
27632764fn (mut g Gen) record_generic_struct_bindings_with_parent (struct_base_name string , struct_c_name string , concrete_params []ast.Expr, parent_bindings map [string ]types.Type) {
27642765 env_struct := g.lookup_struct_type (struct_base_name)
2765- generic_param_names := env_struct.generic_params
2766- if generic_param_names.len == 0 || generic_param_names.len != concrete_params.len {
2766+ generic_param_names := runtime_generic_param_names (env_struct.generic_params)
2767+ concrete_runtime_params := runtime_generic_args (concrete_params)
2768+ if generic_param_names.len == 0 || generic_param_names.len != concrete_runtime_params.len {
27672769 return
27682770 }
27692771 mut bindings := map [string ]types.Type{}
2770- mut param_c_names := []string {cap: concrete_params .len}
2772+ mut param_c_names := []string {cap: concrete_runtime_params .len}
27712773 for i, param_name in generic_param_names {
2772- concrete_expr := concrete_params [i]
2774+ concrete_expr := concrete_runtime_params [i]
27732775 expr_name := concrete_expr.name ()
27742776 if is_generic_placeholder_type_name (expr_name) {
27752777 if parent_type := parent_bindings[expr_name] {
@@ -2825,8 +2827,9 @@ fn (mut g Gen) resolve_generic_struct_c_name(base_name string, concrete_params [
28252827 if instances.len < = 1 {
28262828 return base_name
28272829 }
2828- mut param_c_names := []string {cap: concrete_params.len}
2829- for p in concrete_params {
2830+ concrete_runtime_params := runtime_generic_args (concrete_params)
2831+ mut param_c_names := []string {cap: concrete_runtime_params.len}
2832+ for p in concrete_runtime_params {
28302833 param_c_names << g.expr_type_to_c (p)
28312834 }
28322835 params_key := param_c_names.join ('_' )
@@ -3928,9 +3931,10 @@ fn (mut g Gen) resolve_generic_struct_field_name(expr ast.Expr) string {
39283931 // Build the params_key from active_generic_types
39293932 // Find the struct's generic params to know the order
39303933 env_struct := g.lookup_struct_type (c_name.all_after_last ('__' ))
3931- if env_struct.generic_params.len > 0 {
3932- mut param_c_names := []string {cap: env_struct.generic_params.len}
3933- for param_name in env_struct.generic_params {
3934+ generic_param_names := runtime_generic_param_names (env_struct.generic_params)
3935+ if generic_param_names.len > 0 {
3936+ mut param_c_names := []string {cap: generic_param_names.len}
3937+ for param_name in generic_param_names {
39343938 if concrete := g.active_generic_types[param_name] {
39353939 param_c_names << g.types_type_to_c (concrete)
39363940 } else {
0 commit comments