glsl: Drop crazy looping from no_matching_function_error().
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 23 Nov 2013 20:06:24 +0000 (12:06 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Sun, 1 Dec 2013 23:33:00 +0000 (15:33 -0800)
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>
src/glsl/ast_function.cpp

index 6def25a7d2e4f033a9e3d4516a20dd58e39d4978..36bb26086fd823ae15ebef7c38591105e4e83fdc 100644 (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));
    }
 }