glcpp: Add line locations to "Unterminated #if" error message.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 17 Jun 2010 19:41:46 +0000 (12:41 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 21 Jun 2010 19:31:03 +0000 (12:31 -0700)
glcpp/glcpp-parse.y
glcpp/glcpp.h

index 02608644c38d2376a7bab7013fe3391646cece30..74159c19d81db51fe6498cb9605a5aee91cda943 100644 (file)
@@ -123,7 +123,8 @@ _glcpp_parser_print_expanded_token_list (glcpp_parser_t *parser,
                                         token_list_t *list);
 
 static void
-_glcpp_parser_skip_stack_push_if (glcpp_parser_t *parser, int condition);
+_glcpp_parser_skip_stack_push_if (glcpp_parser_t *parser, YYLTYPE *loc,
+                                 int condition);
 
 static void
 _glcpp_parser_skip_stack_change_if (glcpp_parser_t *parser, YYLTYPE *loc,
@@ -190,7 +191,7 @@ line:
 
 expanded_line:
        IF_EXPANDED expression NEWLINE {
-               _glcpp_parser_skip_stack_push_if (parser, $2);
+               _glcpp_parser_skip_stack_push_if (parser, & @1, $2);
        }
 |      ELIF_EXPANDED expression NEWLINE {
                _glcpp_parser_skip_stack_change_if (parser, & @1, "elif", $2);
@@ -234,12 +235,12 @@ control_line:
 |      HASH_IFDEF IDENTIFIER NEWLINE {
                macro_t *macro = hash_table_find (parser->defines, $2);
                talloc_free ($2);
-               _glcpp_parser_skip_stack_push_if (parser, macro != NULL);
+               _glcpp_parser_skip_stack_push_if (parser, & @1, macro != NULL);
        }
 |      HASH_IFNDEF IDENTIFIER NEWLINE {
                macro_t *macro = hash_table_find (parser->defines, $2);
                talloc_free ($2);
-               _glcpp_parser_skip_stack_push_if (parser, macro == NULL);
+               _glcpp_parser_skip_stack_push_if (parser, & @1, macro == NULL);
        }
 |      HASH_ELIF pp_tokens NEWLINE {
                token_list_t *expanded;
@@ -923,7 +924,7 @@ void
 glcpp_parser_destroy (glcpp_parser_t *parser)
 {
        if (parser->skip_stack)
-               glcpp_print (parser->errors, "Error: Unterminated #if\n");
+               glcpp_error (&parser->skip_stack->loc, parser, "Unterminated #if\n");
        glcpp_lex_destroy (parser->scanner);
        hash_table_dtor (parser->defines);
        talloc_free (parser);
@@ -1579,7 +1580,8 @@ glcpp_parser_lex_from (glcpp_parser_t *parser, token_list_t *list)
 }
 
 static void
-_glcpp_parser_skip_stack_push_if (glcpp_parser_t *parser, int condition)
+_glcpp_parser_skip_stack_push_if (glcpp_parser_t *parser, YYLTYPE *loc,
+                                 int condition)
 {
        skip_type_t current = SKIP_NO_SKIP;
        skip_node_t *node;
@@ -1588,6 +1590,7 @@ _glcpp_parser_skip_stack_push_if (glcpp_parser_t *parser, int condition)
                current = parser->skip_stack->type;
 
        node = xtalloc (parser, skip_node_t);
+       node->loc = *loc;
 
        if (current == SKIP_NO_SKIP) {
                if (condition)
index 45bbff3ad4ab970d23f5c286dd4997d9ad03a805..4a2489a96d9f92a27255d012ced7f9143206e5a1 100644 (file)
@@ -131,6 +131,7 @@ typedef enum skip_type {
 
 typedef struct skip_node {
        skip_type_t type;
+       YYLTYPE loc; /* location of the initial #if/#elif/... */
        struct skip_node *next;
 } skip_node_t;