glsl/glcpp: Add explicit error for "#define without macro name"
authorCarl Worth <cworth@cworth.org>
Wed, 2 Jul 2014 00:40:28 +0000 (17:40 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 7 Aug 2014 23:08:28 +0000 (16:08 -0700)
Previously, glcpp would emit an error like this if <EOF> happened to occur
immediately after the "#define", but in general would just get confused,
(leading to un-helpful error messages).

To fix things to generate a clean error message, we do a few things:

1. Don't require horizontal whitespace immediately after #define

2. Add a production for the error case, (DEFINE_TOKEN followed
   immediately by a NEWLINE token).

3. Make the lexer reset to the <INITIAL> state after every NEWLINE.

This 3rd point prevents the lexer from getting so confused and generating
further spurious errors in the file because it was stuck in the <DEFINE> start
condition.

We also drop the similar error message from the <EOF> rule since the
newly-added rule will have already printed the error message.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glsl/glcpp/glcpp-lex.l
src/glsl/glcpp/glcpp-parse.y
src/glsl/glcpp/tests/132-eof-without-newline-define.c.expected

index c126850d0c2936cf11fad6f6ed187d9127041a60..6e197d12a1a1d3142d780582f9a6d9dbd8988e72 100644 (file)
@@ -371,7 +371,7 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
         *      * Anything else, (not an identifier, not a comment,
         *        and not whitespace). This will generate an error.
         */
-<HASH>define{HSPACE}+ {
+<HASH>define{HSPACE}* {
        if (! parser->skipping) {
                BEGIN DEFINE;
                yyextra->space_tokens = 0;
@@ -520,6 +520,8 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
 <*>[\r\n] {
        if (parser->commented_newlines) {
                BEGIN NEWLINE_CATCHUP;
+       } else {
+               BEGIN INITIAL;
        }
        yyextra->space_tokens = 1;
        yyextra->lexing_directive = 0;
@@ -531,8 +533,6 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
 <INITIAL,COMMENT,DEFINE,HASH><<EOF>> {
        if (YY_START == COMMENT)
                glcpp_error(yylloc, yyextra, "Unterminated comment");
-       if (YY_START == DEFINE)
-               glcpp_error(yylloc, yyextra, "#define without macro name");
        BEGIN DONE; /* Don't keep matching this rule forever. */
        yyextra->lexing_directive = 0;
        if (! parser->last_token_was_newline)
index e2e8aca58a86ac44ae97237cb4c6c22ddd2448a6..25da2a515b279150b711f308ab6140e2d6672c26 100644 (file)
@@ -424,6 +424,9 @@ control_line_error:
        HASH_TOKEN ERROR_TOKEN NEWLINE {
                glcpp_error(& @1, parser, "#%s", $2);
        }
+|      HASH_TOKEN DEFINE_TOKEN NEWLINE {
+               glcpp_error (& @1, parser, "#define without macro name");
+       }
 |      HASH_TOKEN GARBAGE pp_tokens NEWLINE  {
                glcpp_error (& @1, parser, "Illegal non-directive after #");
        }
index a3ace0f3966a0f86fffb63a55ba3eddb48078f39..341e5e2aa67acffe05e3978b7e5909c4893b8aba 100644 (file)
@@ -1,2 +1 @@
-0:1(2): preprocessor error: #define without macro name
-0:1(2): preprocessor error: syntax error, unexpected NEWLINE, expecting FUNC_IDENTIFIER or OBJ_IDENTIFIER
+0:1(1): preprocessor error: #define without macro name