glsl/glcpp: Don't choke on an empty pragma
authorCarl Worth <cworth@cworth.org>
Fri, 13 Jun 2014 22:53:39 +0000 (15:53 -0700)
committerCarl Worth <cworth@cworth.org>
Wed, 9 Jul 2014 19:05:14 +0000 (12:05 -0700)
The lexer was insisting that there be at least one character after "#pragma"
and before the end of the line. This caused an error for a line consisting
only of "#pragma" which volates at least the following sentence from the GLSL
ES Specification 3.00.4:

The scope as well as the effect of the optimize and debug pragmas is
implementation-dependent except that their use must not generate an
error. [Page 12 (Page 28 of PDF)]

and likely the following sentence from that specification and also in
GLSLangSpec 4.30.6:

If an implementation does not recognize the tokens following #pragma,
then it will ignore that pragma.

Add a "make check" test to ensure no future regressions.

This change fixes at least part of the following Khronos GLES3 CTS test:

preprocessor.pragmas.pragma_vertex

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/glcpp/glcpp-lex.l
src/glsl/glcpp/tests/127-pragma-empty.c [new file with mode: 0644]
src/glsl/glcpp/tests/127-pragma-empty.c.expected [new file with mode: 0644]

index 95638179f28329b602e8fdab03f73f197121218e..a1a8e76af0a2e937beb9f723b3fd743264680bd4 100644 (file)
@@ -180,7 +180,7 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
 
        /* glcpp doesn't handle #extension, #version, or #pragma directives.
         * Simply pass them through to the main compiler's lexer/parser. */
-{HASH}(extension|pragma)[^\n]+ {
+{HASH}(extension|pragma)[^\n]* {
        if (parser->commented_newlines)
                BEGIN NEWLINE_CATCHUP;
        yylval->str = ralloc_strdup (yyextra, yytext);
diff --git a/src/glsl/glcpp/tests/127-pragma-empty.c b/src/glsl/glcpp/tests/127-pragma-empty.c
new file mode 100644 (file)
index 0000000..0f9b0b3
--- /dev/null
@@ -0,0 +1,3 @@
+/* It seems an odd (and particularly useless) thing to have an empty pragma,
+ * but we probably shouldn't trigger an error in this case. */
+#pragma
diff --git a/src/glsl/glcpp/tests/127-pragma-empty.c.expected b/src/glsl/glcpp/tests/127-pragma-empty.c.expected
new file mode 100644 (file)
index 0000000..957daff
--- /dev/null
@@ -0,0 +1,4 @@
+
+#pragma
+