aboutsummaryrefslogtreecommitdiffstats
path: root/src/glsl/glcpp
diff options
context:
space:
mode:
authorCarl Worth <[email protected]>2014-06-17 11:55:07 -0700
committerCarl Worth <[email protected]>2014-07-29 15:11:48 -0700
commitea2e9300ece89dffdc4a228dc86bea28a7cd58e2 (patch)
treef6057ff1a06c9037c52cd35d486f41eba2559ba0 /src/glsl/glcpp
parent9e45fb6f5127cecd02a1420aaea59a7012e74404 (diff)
glsl/glcpp: Emit proper error for #define with a non-identifier
Previously, if the preprocessor encountered a #define with a non-identifier, such as: #define 123 456 The lexer had no explicit rules to match non-identifiers in the <DEFINE> start state. Because of this, flex's default rule was being invoked, (printing characters to stdout), and all text was being discarded by the compiler until the next identifier. As one can imagine, this led to all sorts of interesting and surprising results. Fix this by adding an explicit rule complementing the existing identifier-based rules that should catch all non-identifiers after #define and reliably give a well-formatted error message. A new test is added to "make check" to ensure this bug stays fixed. This commit also fixes the following Khronos GLES3 CTS test: define_non_identifier_vertex (The "fragment" variant was passing earlier only because the preprocessor was behaving so randomly and causing the compilation to fail. It's lucky, in fact, that the "vertex" version succesfully compiled so we could find and fix this bug.) Reviewed-by: Jordan Justen <[email protected]>
Diffstat (limited to 'src/glsl/glcpp')
-rw-r--r--src/glsl/glcpp/glcpp-lex.l6
-rw-r--r--src/glsl/glcpp/tests/129-define-non-identifier.c1
-rw-r--r--src/glsl/glcpp/tests/129-define-non-identifier.c.expected2
3 files changed, 9 insertions, 0 deletions
diff --git a/src/glsl/glcpp/glcpp-lex.l b/src/glsl/glcpp/glcpp-lex.l
index cfb9f2a18be..0d4bfc8d443 100644
--- a/src/glsl/glcpp/glcpp-lex.l
+++ b/src/glsl/glcpp/glcpp-lex.l
@@ -259,6 +259,12 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
return OBJ_IDENTIFIER;
}
+<DEFINE>[^_a-zA-Z]{NONSPACE}* {
+ BEGIN INITIAL;
+ glcpp_error(yylloc, yyextra, "#define followed by a non-identifier: %s", yytext);
+ return INTEGER_STRING;
+}
+
{HASH}undef {
yyextra->space_tokens = 0;
return HASH_UNDEF;
diff --git a/src/glsl/glcpp/tests/129-define-non-identifier.c b/src/glsl/glcpp/tests/129-define-non-identifier.c
new file mode 100644
index 00000000000..a229179f18c
--- /dev/null
+++ b/src/glsl/glcpp/tests/129-define-non-identifier.c
@@ -0,0 +1 @@
+#define 123 456
diff --git a/src/glsl/glcpp/tests/129-define-non-identifier.c.expected b/src/glsl/glcpp/tests/129-define-non-identifier.c.expected
new file mode 100644
index 00000000000..b460357fe20
--- /dev/null
+++ b/src/glsl/glcpp/tests/129-define-non-identifier.c.expected
@@ -0,0 +1,2 @@
+0:1(10): preprocessor error: #define followed by a non-identifier: 123
+0:1(10): preprocessor error: syntax error, unexpected INTEGER_STRING, expecting FUNC_IDENTIFIER or OBJ_IDENTIFIER