glsl: Handle "const" as a parameter qualifier.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 15 Jul 2013 22:06:31 +0000 (15:06 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 18 Jul 2013 23:57:22 +0000 (16:57 -0700)
This will make it easy to support both "const in" and "in const", as
required by GLSL 4.20/ARB_shading_language_420pack.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/glsl/glsl_parser.yy

index 0c5defb47a79852e1f8d4aa9ca93af33a68cd07c..1ce28e2e1219a18b07fbd9b92a0f203531f69e15 100644 (file)
@@ -181,7 +181,6 @@ static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state *st, const char *msg)
 %type <parameter_declarator> parameter_declaration
 %type <type_qualifier> parameter_qualifier
 %type <type_qualifier> parameter_direction_qualifier
-%type <type_qualifier> parameter_type_qualifier
 %type <type_specifier> parameter_type_specifier
 %type <function_definition> function_definition
 %type <compound_statement> compound_statement_no_new_scope
@@ -865,29 +864,11 @@ parameter_declarator:
    ;
 
 parameter_declaration:
-   parameter_type_qualifier parameter_qualifier parameter_declarator
-   {
-      $1.flags.i |= $2.flags.i;
-
-      $$ = $3;
-      $$->type->qualifier = $1;
-   }
-   | parameter_qualifier parameter_declarator
+   parameter_qualifier parameter_declarator
    {
       $$ = $2;
       $$->type->qualifier = $1;
    }
-   | parameter_type_qualifier parameter_qualifier parameter_type_specifier
-   {
-      void *ctx = state;
-      $1.flags.i |= $2.flags.i;
-
-      $$ = new(ctx) ast_parameter_declarator();
-      $$->set_location(yylloc);
-      $$->type = new(ctx) ast_fully_specified_type();
-      $$->type->qualifier = $1;
-      $$->type->specifier = $3;
-   }
    | parameter_qualifier parameter_type_specifier
    {
       void *ctx = state;
@@ -904,10 +885,22 @@ parameter_qualifier:
    {
       memset(& $$, 0, sizeof($$));
    }
+   | CONST_TOK parameter_qualifier
+   {
+      if ($2.flags.q.constant)
+         _mesa_glsl_error(&@1, state, "duplicate const qualifier.\n");
+
+      $$ = $2;
+      $$.flags.q.constant = 1;
+   }
    | parameter_direction_qualifier parameter_qualifier
    {
       if (($1.flags.q.in || $1.flags.q.out) && ($2.flags.q.in || $2.flags.q.out))
-         _mesa_glsl_error(&@1, state, "duplicate in/out/inout qualifier");
+         _mesa_glsl_error(&@1, state, "duplicate in/out/inout qualifier\n");
+
+      if ($2.flags.q.constant)
+         _mesa_glsl_error(&@1, state, "const must be specified before "
+                          "in/out/inout.\n");
 
       $$ = $1;
       $$.merge_qualifier(&@1, state, $2);
@@ -1316,14 +1309,6 @@ interpolation_qualifier:
    }
    ;
 
-parameter_type_qualifier:
-   CONST_TOK
-   {
-      memset(& $$, 0, sizeof($$));
-      $$.flags.q.constant = 1;
-   }
-   ;
-
 type_qualifier:
    /* Single qualifiers */
    INVARIANT