summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChia-I Wu <olv@lunarg.com>2011-08-04 00:39:07 +0900
committerMarek Olšák <maraeo@gmail.com>2011-10-02 17:59:26 +0200
commit2cadae90c0bc90d69c5af9466c2e611b304f828f (patch)
tree76b106931af005ab95f5e426c549cca1bfd891a3
parentffb0f94136b9c8042e462f1a5fa358de41fc907b (diff)
glsl: empty declarations should be valid
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. (cherry picked from commit 547212d963c70161915c46d64e8020617199fb8d)
-rw-r--r--src/glsl/ast_to_hir.cpp10
-rw-r--r--src/glsl/glsl_parser.yy10
2 files changed, 8 insertions, 12 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 620286aae66..6158d776d69 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -2391,12 +2391,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");
}
diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
index 2c0498ece7a..1851f1e202e 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -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
{