Quoting Timothy Arceri (2018-09-05 19:40:34) > Cc: mesa-sta...@lists.freedesktop.org > > On 01/09/18 23:57, Timothy Arceri wrote: > > 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 <i...@freedesktop.org> > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107772 > > --- > > src/compiler/glsl/glcpp/glcpp-lex.l | 60 ++++++++++++++++++----------- > > 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; > > > _______________________________________________ > mesa-stable mailing list > mesa-sta...@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-stable
Staged for 18.1. CCing Andres. Dylan
signature.asc
Description: signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev