[Mesa-dev] [PATCH v2] glsl: Fix glcpp to catch garbage after #if 1 ... #else
Matt Turner
mattst88 at gmail.com
Thu Jun 12 13:40:30 PDT 2014
On Thu, Jun 12, 2014 at 12:58 PM, Carl Worth <cworth at cworth.org> wrote:
> 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).
> ---
>
> Matt Turner <mattst88 at gmail.com> writes:
>> The preprocessor is one of the only bits that uses tabs. I'd rather we
>> stick with that, or convert the whole thing.
>
> Thanks for the catch. There are a handful of lines indented with spaces that
> have managed to sneak in, but I might as well not add more. So I've fixed
> that. Also, here in v2, instead of adding a lexing_else bit next to lexing_if,
> instead I'm reusing the original bit and renaming it to lexing_directive.
>
> src/glsl/glcpp/glcpp-lex.l | 25 +++++++++++-----------
> src/glsl/glcpp/glcpp-parse.y | 6 +++---
> src/glsl/glcpp/glcpp.h | 2 +-
> src/glsl/glcpp/tests/103-garbage-after-else-0.c | 3 +++
> .../tests/103-garbage-after-else-0.c.expected | 4 ++++
> src/glsl/glcpp/tests/103-garbage-after-else.c | 3 ---
> .../glcpp/tests/103-garbage-after-else.c.expected | 4 ----
> src/glsl/glcpp/tests/123-garbage-after-else-1.c | 3 +++
> .../tests/123-garbage-after-else-1.c.expected | 4 ++++
> 9 files changed, 31 insertions(+), 23 deletions(-)
> create mode 100644 src/glsl/glcpp/tests/103-garbage-after-else-0.c
> create mode 100644 src/glsl/glcpp/tests/103-garbage-after-else-0.c.expected
> delete mode 100644 src/glsl/glcpp/tests/103-garbage-after-else.c
> delete mode 100644 src/glsl/glcpp/tests/103-garbage-after-else.c.expected
> create mode 100644 src/glsl/glcpp/tests/123-garbage-after-else-1.c
> create mode 100644 src/glsl/glcpp/tests/123-garbage-after-else-1.c.expected
>
> diff --git a/src/glsl/glcpp/glcpp-lex.l b/src/glsl/glcpp/glcpp-lex.l
> index 188e454..d5fb087 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
This regressed from 4 to 3. :)
Reviewed-by: Matt Turner <mattst88 at gmail.com>
More information about the mesa-dev
mailing list