Reject main() declarations with a non-void return value.
authorEric Anholt <eric@anholt.net>
Sun, 28 Mar 2010 08:24:55 +0000 (01:24 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 29 Mar 2010 19:48:45 +0000 (12:48 -0700)
Fixes main3.vert.

ast_to_hir.cpp
glsl_types.cpp

index 277e67ba389a23ee247473d3823fba0a1a93ebee..e16f79f6f21f93d031da43f8f8b7ed1ceb722f53 100644 (file)
@@ -1146,7 +1146,6 @@ ast_function_definition::hir(exec_list *instructions,
 
    assert(return_type != NULL);
 
-
    /* Verify that this function's signature either doesn't match a previously
     * seen signature for a function with the same name, or, if a match is found,
     * that the previously seen signature does not have an associated definition.
@@ -1190,6 +1189,14 @@ ast_function_definition::hir(exec_list *instructions,
       state->symbols->add_function(f->name, f);
    }
 
+   /* Verify the return type of main() */
+   if (strcmp(name, "main") == 0) {
+      if (return_type != glsl_type::get_instance(GLSL_TYPE_VOID, 0, 0)) {
+        YYLTYPE loc = this->get_location();
+
+        _mesa_glsl_error(& loc, state, "main() must return void");
+      }
+   }
 
    /* Finish storing the information about this new function in its signature.
     */
index 55d960320dbef238f47a731ca492e255dee18a5e..df9667f8dce1187ba88d9100ce305b61eca947a7 100644 (file)
@@ -489,10 +489,12 @@ _mesa_glsl_initialize_constructors(exec_list *instructions,
 const glsl_type *
 glsl_type::get_instance(unsigned base_type, unsigned rows, unsigned columns)
 {
+   if (base_type == GLSL_TYPE_VOID)
+      return &void_type;
+
    if ((rows < 1) || (rows > 4) || (columns < 1) || (columns > 4))
       return error_type;
 
-
    /* Treat GLSL vectors as Nx1 matrices.
     */
    if (columns == 1) {