Additional void parameter checks
authorIan Romanick <ian.d.romanick@intel.com>
Fri, 2 Apr 2010 22:30:45 +0000 (15:30 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 2 Apr 2010 22:30:45 +0000 (15:30 -0700)
If there is a void parameter it must not have a name, and it must be
the only parameter.

ast.h
ast_to_hir.cpp

diff --git a/ast.h b/ast.h
index 37df4a0e0865e43819e6f8f8ad09bfdd22f9b708..f73e74906f0d749f7e94268cca96b66fcbcddb3b 100644 (file)
--- a/ast.h
+++ b/ast.h
@@ -440,6 +440,13 @@ public:
 private:
    /** Is this parameter declaration part of a formal parameter list? */
    bool formal_parameter;
+
+   /**
+    * Is this parameter 'void' type?
+    *
+    * This field is set by \c ::hir.
+    */
+   bool is_void;
 };
 
 
index 3fddd5f19619dcbf623f33145ca9307a204c534b..cc985814db62769397e8e182077c75dff3b3e71d 100644 (file)
@@ -1625,14 +1625,21 @@ ast_parameter_declarator::hir(exec_list *instructions,
     * for a function, which avoids tripping up checks for main taking
     * parameters and lookups of an unnamed symbol.
     */
-   if (type->is_void() && (this->identifier == NULL))
+   if (type->is_void()) {
+      if (this->identifier != NULL)
+        _mesa_glsl_error(& loc, state,
+                         "named parameter cannot have type `void'");
+
+      is_void = true;
       return NULL;
+   }
 
    if (formal_parameter && (this->identifier == NULL)) {
       _mesa_glsl_error(& loc, state, "formal parameter lacks a name");
       return NULL;
    }
 
+   is_void = false;
    ir_variable *var = new ir_variable(type, this->identifier);
 
    /* FINISHME: Handle array declarations.  Note that this requires
@@ -1661,11 +1668,25 @@ ast_parameter_declarator::parameters_to_hir(struct simple_node *ast_parameters,
                                            _mesa_glsl_parse_state *state)
 {
    struct simple_node *ptr;
+   ast_parameter_declarator *void_param = NULL;
+   unsigned count = 0;
 
    foreach (ptr, ast_parameters) {
       ast_parameter_declarator *param = (ast_parameter_declarator *)ptr;
       param->formal_parameter = formal;
       param->hir(ir_parameters, state);
+
+      if (param->is_void)
+        void_param = param;
+
+      count++;
+   }
+
+   if ((void_param != NULL) && (count > 1)) {
+      YYLTYPE loc = void_param->get_location();
+
+      _mesa_glsl_error(& loc, state,
+                      "`void' parameter must be only parameter");
    }
 }