[qfcc] Clone metafunc for generated generic symbols

Simply referencing the original metafunc resulted in only the first
variant getting a def. Now my little test generates defs for all called
variants of a generic function.

However, I'm still not sure this is quite the direction I want to go
with making calls to generic functions, but I still need to figure out
defining them. I think making progress with the glsl front-end will
help.
This commit is contained in:
Bill Currie 2024-08-28 09:00:58 +09:00
parent 4f5fcbd819
commit bbb90ce27a

View file

@ -515,6 +515,14 @@ check_params (param_t *params)
return params; return params;
} }
static metafunc_t *
new_metafunc (void)
{
metafunc_t *metafunc;
ALLOC (1024, metafunc_t, metafuncs, metafunc);
return metafunc;
}
static metafunc_t * static metafunc_t *
get_function (const char *name, const type_t *type, specifier_t spec) get_function (const char *name, const type_t *type, specifier_t spec)
{ {
@ -551,7 +559,7 @@ get_function (const char *name, const type_t *type, specifier_t spec)
overload = true; overload = true;
} }
ALLOC (1024, metafunc_t, metafuncs, func); func = new_metafunc ();
*func = (metafunc_t) { *func = (metafunc_t) {
.name = save_string (name), .name = save_string (name),
.full_name = full_name, .full_name = full_name,
@ -785,7 +793,8 @@ find_generic_function (const expr_t *fexpr, genfunc_t **genfuncs,
sym->sy_type = sy_func; sym->sy_type = sy_func;
sym->type = type; sym->type = type;
sym->params = params; sym->params = params;
sym->metafunc = fsym->metafunc; sym->metafunc = new_metafunc ();
*sym->metafunc = *fsym->metafunc;
symtab_addsymbol (fsym->table, sym); symtab_addsymbol (fsym->table, sym);
} }
return new_symbol_expr (sym); return new_symbol_expr (sym);