glsl: Properly lex extra tokens when handling # directives.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 12 Jun 2014 05:04:09 +0000 (22:04 -0700)
committerCarl Worth <cworth@cworth.org>
Tue, 29 Jul 2014 22:11:50 +0000 (15:11 -0700)
Without this, in the <PP> state, we would hit Flex's default rule, which
prints tokens to stdout, rather than returning them as tokens. (Or, after the
previous commit, we would hit the new catch-all rule and generate an internal
compiler error.)

With this commit in place, we generate the desired syntax error.

This manifested as a weird bug where shaders with semicolons after
extension directives, such as:

   #extension GL_foo_bar : enable;

would print semicolons to the screen, but otherwise compile just fine
(even though this is illegal).

Fixes Piglit's extension-semicolon.frag test.

This also fixes the following Khronos GLES3 conformance tests, (and for real
this time):

invalid_char_in_name_vertex
invalid_char_in_name_fragment

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Carl Worth <cworth@cworth.org>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/glsl/glsl_lexer.ll

index 1cadf1f9b5802ec735b896a97a38ee5cabb45021..1a0dde2e9b81226bf38a3b75d0429f96e839e438 100644 (file)
@@ -239,6 +239,7 @@ HASH                ^{SPC}#{SPC}
                                    return INTCONSTANT;
                                }
 <PP>\n                         { BEGIN 0; yylineno++; yycolumn = 0; return EOL; }
+<PP>.                          { return yytext[0]; }
 
 \n             { yylineno++; yycolumn = 0; }