diff options
author | Timothy Arceri <[email protected]> | 2018-09-01 23:57:38 +1000 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2018-09-06 10:13:21 +1000 |
commit | b9fe8ff23dcfe4956be1eac4de0838d4a3720315 (patch) | |
tree | 6b67cbebef5bc34151ff374e76f89a8093dbbbd1 | |
parent | 2454742a8447ef021bfbb17f1e87e59bc8cbfcb6 (diff) |
glsl: fixer lexer for unreachable defines
If we have something like:
#ifdef NOT_DEFINED
#define A_MACRO(x) \
if (x)
#endif
The # on the #define is not skipped but the define itself is so
this then gets recognised as #if.
Until 28a3731e3f this didn't happen because we ended up in
<HASH>{NONSPACE} where BEGIN INITIAL was called stopping the
problem from happening.
This change makes sure we never call RETURN_TOKEN_NEVER_SKIP for
if/else/endif when processing a define.
Cc: Ian Romanick <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107772
Tested-By: Eero Tamminen <[email protected]>
Reviewed-by: Ian Romanick <[email protected]>
-rw-r--r-- | src/compiler/glsl/glcpp/glcpp-lex.l | 60 | ||||
-rw-r--r-- | src/compiler/glsl/glcpp/glcpp.h | 1 |
2 files changed, 38 insertions, 23 deletions
diff --git a/src/compiler/glsl/glcpp/glcpp-lex.l b/src/compiler/glsl/glcpp/glcpp-lex.l index fe5845acd4e..f7003da0cc8 100644 --- a/src/compiler/glsl/glcpp/glcpp-lex.l +++ b/src/compiler/glsl/glcpp/glcpp-lex.l @@ -289,6 +289,7 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]? * token. */ if (parser->first_non_space_token_this_line) { BEGIN HASH; + yyextra->in_define = false; } RETURN_TOKEN_NEVER_SKIP (HASH_TOKEN); @@ -336,43 +337,55 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]? /* For the pre-processor directives, we return these tokens * even when we are otherwise skipping. */ <HASH>ifdef { - BEGIN INITIAL; - yyextra->lexing_directive = 1; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (IFDEF); + if (!yyextra->in_define) { + BEGIN INITIAL; + yyextra->lexing_directive = 1; + yyextra->space_tokens = 0; + RETURN_TOKEN_NEVER_SKIP (IFDEF); + } } <HASH>ifndef { - BEGIN INITIAL; - yyextra->lexing_directive = 1; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (IFNDEF); + if (!yyextra->in_define) { + BEGIN INITIAL; + yyextra->lexing_directive = 1; + yyextra->space_tokens = 0; + RETURN_TOKEN_NEVER_SKIP (IFNDEF); + } } <HASH>if/[^_a-zA-Z0-9] { - BEGIN INITIAL; - yyextra->lexing_directive = 1; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (IF); + if (!yyextra->in_define) { + BEGIN INITIAL; + yyextra->lexing_directive = 1; + yyextra->space_tokens = 0; + RETURN_TOKEN_NEVER_SKIP (IF); + } } <HASH>elif/[^_a-zA-Z0-9] { - BEGIN INITIAL; - yyextra->lexing_directive = 1; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (ELIF); + if (!yyextra->in_define) { + BEGIN INITIAL; + yyextra->lexing_directive = 1; + yyextra->space_tokens = 0; + RETURN_TOKEN_NEVER_SKIP (ELIF); + } } <HASH>else { - BEGIN INITIAL; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (ELSE); + if (!yyextra->in_define) { + BEGIN INITIAL; + yyextra->space_tokens = 0; + RETURN_TOKEN_NEVER_SKIP (ELSE); + } } <HASH>endif { - BEGIN INITIAL; - yyextra->space_tokens = 0; - RETURN_TOKEN_NEVER_SKIP (ENDIF); + if (!yyextra->in_define) { + BEGIN INITIAL; + yyextra->space_tokens = 0; + RETURN_TOKEN_NEVER_SKIP (ENDIF); + } } <HASH>error[^\r\n]* { @@ -399,7 +412,8 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]? * and not whitespace). This will generate an error. */ <HASH>define{HSPACE}* { - if (! parser->skipping) { + yyextra->in_define = true; + if (!parser->skipping) { BEGIN DEFINE; yyextra->space_tokens = 0; RETURN_TOKEN (DEFINE_TOKEN); diff --git a/src/compiler/glsl/glcpp/glcpp.h b/src/compiler/glsl/glcpp/glcpp.h index c7e382ed30c..e786b24b132 100644 --- a/src/compiler/glsl/glcpp/glcpp.h +++ b/src/compiler/glsl/glcpp/glcpp.h @@ -197,6 +197,7 @@ struct glcpp_parser { int first_non_space_token_this_line; int newline_as_space; int in_control_line; + bool in_define; int paren_count; int commented_newlines; skip_node_t *skip_stack; |