glsl: Handle array declarations in function parameters.
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 21 Aug 2010 22:30:34 +0000 (15:30 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Sat, 21 Aug 2010 22:42:27 +0000 (15:42 -0700)
The 'vec4[12] foo' style already worked, but the 'vec4 foo[12]' style
did not.  Also, 'vec4[] foo' was wrongly accepted.

Fixes piglit test cases array-19.vert and array-21.vert.

May fix fd.o bug #29684 (or at least part of it).

src/glsl/ast_to_hir.cpp

index 4188348626c247c151049caa96176d43d1828740..397c84e3438a583e7b13bbc9ba4e6b4e9ced2b41 100644 (file)
@@ -2040,13 +2040,22 @@ ast_parameter_declarator::hir(exec_list *instructions,
       return NULL;
    }
 
+   /* This only handles "vec4 foo[..]".  The earlier specifier->glsl_type(...)
+    * call already handled the "vec4[..] foo" case.
+    */
+   if (this->is_array) {
+      type = process_array_type(type, this->array_size, state);
+   }
+
+   if (type->array_size() == 0) {
+      _mesa_glsl_error(&loc, state, "arrays passed as parameters must have "
+                      "a declared size.");
+      type = glsl_type::error_type;
+   }
+
    is_void = false;
    ir_variable *var = new(ctx) ir_variable(type, this->identifier, ir_var_in);
 
-   /* FINISHME: Handle array declarations.  Note that this requires
-    * FINISHME: complete handling of constant expressions.
-    */
-
    /* Apply any specified qualifiers to the parameter declaration.  Note that
     * for function parameters the default mode is 'in'.
     */