mesa: glsl: limit function matching through casting
authorBrian Paul <brian.paul@tungstengraphics.com>
Tue, 19 Aug 2008 17:23:25 +0000 (11:23 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Tue, 19 Aug 2008 17:23:25 +0000 (11:23 -0600)
src/mesa/shader/slang/slang_codegen.c

index f96c655759602ba99000b1e7cce1116a0bfa1c90..e5a2c61d4f308be38f21f3c1650f3d68082de259 100644 (file)
@@ -1980,6 +1980,12 @@ _slang_gen_function_call_name(slang_assemble_ctx *A, const char *name,
       fun = _slang_locate_struct_constructor(A, name);
    }
 
+   /*
+    * At this point, some heuristics are used to try to find a function
+    * that matches the calling signature by means of casting or "unrolling"
+    * of constructors.
+    */
+
    if (!fun && _slang_is_vec_mat_type(name)) {
       /* Next, if this call looks like a vec() or mat() constructor call,
        * try "unwinding" the args to satisfy a constructor.
@@ -1995,7 +2001,7 @@ _slang_gen_function_call_name(slang_assemble_ctx *A, const char *name,
       }
    }
 
-   if (!fun) {
+   if (!fun && _slang_is_vec_mat_type(name)) {
       /* Next, try casting args to the types of the formal parameters */
       int numArgs = oper->num_children;
       fun = _slang_find_function_by_argc(A->space.funcs, name, numArgs);
@@ -2008,6 +2014,13 @@ _slang_gen_function_call_name(slang_assemble_ctx *A, const char *name,
       assert(fun);
    }
 
+   if (!fun) {
+      slang_info_log_error(A->log,
+                           "Function '%s' not found (check argument types)",
+                           name);
+      return NULL;
+   }
+
    n = _slang_gen_function_call(A, fun, oper, dest);
 
    if (n && !n->Store && !dest