summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarl Worth <[email protected]>2014-06-12 10:39:39 -0700
committerCarl Worth <[email protected]>2014-07-09 12:05:13 -0700
commit98c0e3c7834f8a99f7641aa14b2bab5221aa66db (patch)
tree513fa5c5d1dfcfaf7205317b7b0bbfbfe0094631
parent1d862a0b39dfd2723aac6c64f9a7609c205b3cdc (diff)
glsl/glcpp: Fix glcpp to catch garbage after #if 1 ... #else
Previously, a line such as: #else garbage would flag an error if it followed "#if 0", but not if it followed "#if 1". We fix this by setting a new bit of state (lexing_else) that allows the lexer to defer switching to the <SKIP> start state until after the NEWLINE following the #else directive. A new test case is added for: #if 1 #else garbage #endif which was untested before, (and did not generate the desired error). This fixes the following Khronos GLES3 CTS tests: tokens_after_else_vertex tokens_after_else_fragment Reviewed-by: Matt Turner <[email protected]> Reviewed-by: Anuj Phogat <[email protected]>
-rw-r--r--src/glsl/glcpp/glcpp-lex.l25
-rw-r--r--src/glsl/glcpp/glcpp-parse.y6
-rw-r--r--src/glsl/glcpp/glcpp.h2
-rw-r--r--src/glsl/glcpp/tests/103-garbage-after-else-0.c (renamed from src/glsl/glcpp/tests/103-garbage-after-else.c)0
-rw-r--r--src/glsl/glcpp/tests/103-garbage-after-else-0.c.expected (renamed from src/glsl/glcpp/tests/103-garbage-after-else.c.expected)0
-rw-r--r--src/glsl/glcpp/tests/123-garbage-after-else-1.c3
-rw-r--r--src/glsl/glcpp/tests/123-garbage-after-else-1.c.expected4
7 files changed, 24 insertions, 16 deletions
diff --git a/src/glsl/glcpp/glcpp-lex.l b/src/glsl/glcpp/glcpp-lex.l
index 188e454664a..d5fb08707a9 100644
--- a/src/glsl/glcpp/glcpp-lex.l
+++ b/src/glsl/glcpp/glcpp-lex.l
@@ -137,14 +137,15 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
* 2. The skip_stack is NULL meaning that we've reached
* the last #endif.
*
- * 3. The lexing_if bit is set. This indicates that we
- * are lexing the expression following an "#if" of
- * "#elif". Even inside an "#if 0" we need to lex this
- * expression so the parser can correctly update the
- * skip_stack state.
+ * 3. The lexing_directive bit is set. This indicates that we are
+ * lexing a pre-processor directive, (such as #if, #elif, or
+ * #else). For the #if and #elif directives we always need to
+ * parse the conditions, (even if otherwise within an #if
+ * 0). And for #else, we want to be able to generate an error
+ * if any garbage follows #else.
*/
if (YY_START == INITIAL || YY_START == SKIP) {
- if (parser->lexing_if ||
+ if (parser->lexing_directive ||
parser->skip_stack == NULL ||
parser->skip_stack->type == SKIP_NO_SKIP)
{
@@ -193,25 +194,25 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
<SKIP,INITIAL>{
{HASH}ifdef {
- yyextra->lexing_if = 1;
+ yyextra->lexing_directive = 1;
yyextra->space_tokens = 0;
return HASH_IFDEF;
}
{HASH}ifndef {
- yyextra->lexing_if = 1;
+ yyextra->lexing_directive = 1;
yyextra->space_tokens = 0;
return HASH_IFNDEF;
}
{HASH}if/[^_a-zA-Z0-9] {
- yyextra->lexing_if = 1;
+ yyextra->lexing_directive = 1;
yyextra->space_tokens = 0;
return HASH_IF;
}
{HASH}elif/[^_a-zA-Z0-9] {
- yyextra->lexing_if = 1;
+ yyextra->lexing_directive = 1;
yyextra->space_tokens = 0;
return HASH_ELIF;
}
@@ -348,7 +349,7 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
if (parser->commented_newlines) {
BEGIN NEWLINE_CATCHUP;
}
- yyextra->lexing_if = 0;
+ yyextra->lexing_directive = 0;
yylineno++;
yycolumn = 0;
return NEWLINE;
@@ -357,7 +358,7 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
/* Handle missing newline at EOF. */
<INITIAL><<EOF>> {
BEGIN DONE; /* Don't keep matching this rule forever. */
- yyextra->lexing_if = 0;
+ yyextra->lexing_directive = 0;
return NEWLINE;
}
diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y
index 3fc8c868b07..82e310270d6 100644
--- a/src/glsl/glcpp/glcpp-parse.y
+++ b/src/glsl/glcpp/glcpp-parse.y
@@ -364,7 +364,7 @@ control_line:
glcpp_warning(& @1, parser, "ignoring illegal #elif without expression");
}
}
-| HASH_ELSE {
+| HASH_ELSE { parser->lexing_directive = 1; } NEWLINE {
if (parser->skip_stack &&
parser->skip_stack->has_else)
{
@@ -376,7 +376,7 @@ control_line:
if (parser->skip_stack)
parser->skip_stack->has_else = true;
}
- } NEWLINE
+ }
| HASH_ENDIF {
_glcpp_parser_skip_stack_pop (parser, & @1);
} NEWLINE
@@ -1211,7 +1211,7 @@ glcpp_parser_create (const struct gl_extensions *extensions, gl_api api)
parser->defines = hash_table_ctor (32, hash_table_string_hash,
hash_table_string_compare);
parser->active = NULL;
- parser->lexing_if = 0;
+ parser->lexing_directive = 0;
parser->space_tokens = 1;
parser->newline_as_space = 0;
parser->in_control_line = 0;
diff --git a/src/glsl/glcpp/glcpp.h b/src/glsl/glcpp/glcpp.h
index 79ccb234f4f..b2654ffbed2 100644
--- a/src/glsl/glcpp/glcpp.h
+++ b/src/glsl/glcpp/glcpp.h
@@ -168,7 +168,7 @@ struct glcpp_parser {
yyscan_t scanner;
struct hash_table *defines;
active_list_t *active;
- int lexing_if;
+ int lexing_directive;
int space_tokens;
int newline_as_space;
int in_control_line;
diff --git a/src/glsl/glcpp/tests/103-garbage-after-else.c b/src/glsl/glcpp/tests/103-garbage-after-else-0.c
index c460feadf57..c460feadf57 100644
--- a/src/glsl/glcpp/tests/103-garbage-after-else.c
+++ b/src/glsl/glcpp/tests/103-garbage-after-else-0.c
diff --git a/src/glsl/glcpp/tests/103-garbage-after-else.c.expected b/src/glsl/glcpp/tests/103-garbage-after-else-0.c.expected
index f9f5f1976f7..f9f5f1976f7 100644
--- a/src/glsl/glcpp/tests/103-garbage-after-else.c.expected
+++ b/src/glsl/glcpp/tests/103-garbage-after-else-0.c.expected
diff --git a/src/glsl/glcpp/tests/123-garbage-after-else-1.c b/src/glsl/glcpp/tests/123-garbage-after-else-1.c
new file mode 100644
index 00000000000..0b341a381f8
--- /dev/null
+++ b/src/glsl/glcpp/tests/123-garbage-after-else-1.c
@@ -0,0 +1,3 @@
+#if 1
+#else garbage
+#endif
diff --git a/src/glsl/glcpp/tests/123-garbage-after-else-1.c.expected b/src/glsl/glcpp/tests/123-garbage-after-else-1.c.expected
new file mode 100644
index 00000000000..f9f5f1976f7
--- /dev/null
+++ b/src/glsl/glcpp/tests/123-garbage-after-else-1.c.expected
@@ -0,0 +1,4 @@
+0:2(7): preprocessor error: syntax error, unexpected IDENTIFIER, expecting NEWLINE
+0:1(7): preprocessor error: Unterminated #if
+
+