glsl: Refactor parameter qualifier handling.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 15 Jul 2013 18:45:24 +0000 (11:45 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 18 Jul 2013 23:57:22 +0000 (16:57 -0700)
"Parameter direction qualifier" is a new term I invented just now; it's
not part of any GLSL specification.

This paves the way handling multiple parameter qualifiers, in any order,
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 ffaf0f3344b33bc68ef0773f2ff44bdd198e87be..0c5defb47a79852e1f8d4aa9ca93af33a68cd07c 100644 (file)
@@ -180,6 +180,7 @@ static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state *st, const char *msg)
 %type <parameter_declarator> parameter_declarator
 %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
@@ -903,7 +904,17 @@ parameter_qualifier:
    {
       memset(& $$, 0, sizeof($$));
    }
-   | IN_TOK
+   | 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");
+
+      $$ = $1;
+      $$.merge_qualifier(&@1, state, $2);
+   }
+
+parameter_direction_qualifier:
+   IN_TOK
    {
       memset(& $$, 0, sizeof($$));
       $$.flags.q.in = 1;