glsl: empty declarations should be valid
authorChia-I Wu <olv@lunarg.com>
Wed, 3 Aug 2011 15:39:07 +0000 (00:39 +0900)
committerChia-I Wu <olv@lunarg.com>
Fri, 5 Aug 2011 03:14:24 +0000 (12:14 +0900)
Unlike C++, empty declarations such as

  float;

should be valid.  The spec is not explicit about this actually.

Some apps that generate their shader sources may rely on this.  This was
noted when porting one of them to Linux from Windows.

Reviewed-by: Chad Versace <chad@chad-versace.us>
Note: this is a candidate for the 7.11 branch.

src/glsl/ast_to_hir.cpp
src/glsl/glsl_parser.yy

index c0524bf0bccda826ea1620abf437ef552927d356..7da1461195075577eace561f85c34d0292711c0b 100644 (file)
@@ -2399,12 +2399,12 @@ ast_declarator_list::hir(exec_list *instructions,
 
    decl_type = this->type->specifier->glsl_type(& type_name, state);
    if (this->declarations.is_empty()) {
-      /* The only valid case where the declaration list can be empty is when
-       * the declaration is setting the default precision of a built-in type
-       * (e.g., 'precision highp vec4;').
-       */
-
       if (decl_type != NULL) {
+        /* Warn if this empty declaration is not for declaring a structure.
+         */
+        if (this->type->specifier->structure == NULL) {
+           _mesa_glsl_warning(&loc, state, "empty declaration");
+        }
       } else {
            _mesa_glsl_error(& loc, state, "incomplete declaration");
       }
index 2c0498ece7a946a357ffc01d6e40a3b90d2a3faf..1851f1e202e298ad1bf7a4a8e0d1a7d7d28a28b8 100644 (file)
@@ -971,13 +971,9 @@ single_declaration:
        fully_specified_type
        {
           void *ctx = state;
-          if ($1->specifier->type_specifier != ast_struct) {
-             _mesa_glsl_error(& @1, state, "empty declaration list\n");
-             YYERROR;
-          } else {
-             $$ = new(ctx) ast_declarator_list($1);
-             $$->set_location(yylloc);
-          }
+          /* Empty declaration list is valid. */
+          $$ = new(ctx) ast_declarator_list($1);
+          $$->set_location(yylloc);
        }
        | fully_specified_type any_identifier
        {