glsl: Drop crazy looping from no_matching_function_error().

Since the built-in functions rewrite, num_builtins_to_link is always either
0 or 1, so we don't need tho crazy loop starting at -1 with a special
case.

All we need to do is print the prototypes from the current shader, and
the single built-in function shader (if present).

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Kenneth Graunke 2013-11-23 12:06:24 -08:00
parent e04a97ff23
commit 5af97b43c9
1 changed files with 23 additions and 16 deletions

View File

@ -421,6 +421,25 @@ done:
return sig;
}
static void
print_function_prototypes(_mesa_glsl_parse_state *state, YYLTYPE *loc,
ir_function *f)
{
if (f == NULL)
return;
foreach_list (node, &f->signatures) {
ir_function_signature *sig = (ir_function_signature *) node;
if (sig->is_builtin() && !sig->is_builtin_available(state))
continue;
char *str = prototype_string(sig->return_type, f->name, &sig->parameters);
_mesa_glsl_error(loc, state, " %s", str);
ralloc_free(str);
}
}
/**
* Raise a "no matching function" error, listing all possible overloads the
* compiler considered so developers can figure out what went wrong.
@ -437,23 +456,11 @@ no_matching_function_error(const char *name,
str);
ralloc_free(str);
for (int i = -1; i < (int) state->num_builtins_to_link; i++) {
glsl_symbol_table *syms = i >= 0 ? state->builtins_to_link[i]->symbols
: state->symbols;
ir_function *f = syms->get_function(name);
if (f == NULL)
continue;
print_function_prototypes(state, loc, state->symbols->get_function(name));
foreach_list (node, &f->signatures) {
ir_function_signature *sig = (ir_function_signature *) node;
if (sig->is_builtin() && !sig->is_builtin_available(state))
continue;
str = prototype_string(sig->return_type, f->name, &sig->parameters);
_mesa_glsl_error(loc, state, " %s", str);
ralloc_free(str);
}
if (state->num_builtins_to_link) {
gl_shader *sh = state->builtins_to_link[0];
print_function_prototypes(state, loc, sh->symbols->get_function(name));
}
}