glcpp: Accept #elif without an expression if the expression doesn't matter.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 21 Jun 2010 19:20:22 +0000 (12:20 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 21 Jun 2010 19:41:05 +0000 (12:41 -0700)
Issue a warning.  nVidia's compiler seems to accept this; apparently
GCC < 4.4 did as well: http://gcc.gnu.org/gcc-4.4/porting_to.html

glcpp/glcpp-parse.y

index 37c2f97c23d058c2891b96f4e2eeb04abd543574..c314e9556cedbf858adb016eccf931afc61a71ed 100644 (file)
@@ -249,6 +249,17 @@ control_line:
                _token_list_append_list (expanded, $2);
                glcpp_parser_lex_from (parser, expanded);
        }
+|      HASH_ELIF NEWLINE {
+               /* #elif without an expression results in a warning if the
+                * condition doesn't matter (we just handled #if 1 or such)
+                * but an error otherwise. */
+               if (parser->skip_stack != NULL && parser->skip_stack->type == SKIP_NO_SKIP) {
+                       parser->skip_stack->type = SKIP_TO_ENDIF;
+                       glcpp_warning(& @1, parser, "ignoring illegal #elif without expression");
+               } else {
+                       glcpp_error(& @1, parser, "#elif needs an expression");
+               }
+       }
 |      HASH_ELSE NEWLINE {
                _glcpp_parser_skip_stack_change_if (parser, & @1, "else", 1);
        }