Ensure that both parameter lists are the same length in function overloading.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 21 Apr 2010 18:52:05 +0000 (11:52 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 21 Apr 2010 22:36:36 +0000 (15:36 -0700)
Fixes new test function-05.glsl, where the second function has matching
parameter types, but less of them.

ast_to_hir.cpp
tests/function-05.glsl [new file with mode: 0644]

index 316bcf7d71c884f9afe6ddbf5e42e66b9526b262..addbeefc4be6e90fce2b01dbb84af34673a52606 100644 (file)
@@ -1889,17 +1889,10 @@ parameter_lists_match(exec_list *list_a, exec_list *list_b)
    exec_list_iterator iter_a = list_a->iterator();
    exec_list_iterator iter_b = list_b->iterator();
 
-   while (iter_a.has_next()) {
+   while (iter_a.has_next() && iter_b.has_next()) {
       ir_variable *a = (ir_variable *)iter_a.get();
       ir_variable *b = (ir_variable *)iter_b.get();
 
-      /* If all of the parameters from the other parameter list have been
-       * exhausted, the lists have different length and, by definition,
-       * do not match.
-       */
-      if (!iter_b.has_next())
-        return false;
-
       /* If the types of the parameters do not match, the parameters lists
        * are different.
        */
@@ -1910,6 +1903,12 @@ parameter_lists_match(exec_list *list_a, exec_list *list_b)
       iter_b.next();
    }
 
+   /* Unless both lists are exhausted, they differ in length and, by
+    * definition, do not match.
+    */
+   if (iter_a.has_next() != iter_b.has_next())
+      return false;
+
    return true;
 }
 
diff --git a/tests/function-05.glsl b/tests/function-05.glsl
new file mode 100644 (file)
index 0000000..43365bf
--- /dev/null
@@ -0,0 +1,26 @@
+/* PASS */
+
+vec4 foo(in float x, in float y, float z, float w)
+{
+  vec4 v;
+  v.x = x;
+  v.y = y;
+  v.z = z;
+  v.w = w;
+  return v;
+}
+
+vec4 foo(in float x)
+{
+   vec4 v;
+   v.x = x;
+   v.y = x;
+   v.z = x;
+   v.w = x;
+}
+
+void main()
+{
+  gl_Position = foo(1.0, 1.0, 1.0, 0.0);
+  gl_Position = foo(2.0);
+}