diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/c-decl.c | 3 | ||||
-rw-r--r-- | gcc/c-lex.c | 10 | ||||
-rw-r--r-- | gcc/c-parser.c | 4 | ||||
-rw-r--r-- | gcc/c-pragma.h | 2 | ||||
-rw-r--r-- | gcc/c-tree.h | 1 |
6 files changed, 30 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3e9f384253d..5d85aba3b12 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2005-03-11 Per Bothner <per@bothner.com> + + * c-tree.h (struct c_declarator): New id_loc field. + * c-pragma.h (c_lex_with_flags): Take position reference. + * c-lex.c (c_lex_with_flags): Set passed-in location from cpp token, + iff USE_MAPPED_LOCATION. (Type doesn't match otherwise.) + (c_lex): Pass dummy location to c_lex_with_flags. + * c-parser.c (c_lex_one_token): Set c_token's location using + c_lex_with_flags, instead of input_location, which might be "ahead". + (c_parser_direct_declarator): Set declarator's id_loc from + c_token's id_loc. + * c-decl.c (grokdeclarator): Set DECL_SOURCE_LOCATION from + declarator's id_loc, rather than probably-imprecise input_location. + (build_id_declarator): Initialize c_declarator's id_loc field. + 2005-03-11 Roger Sayle <roger@eyesopen.com> PR middle-end/20419 diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 42f8bad4254..070a94b8bc9 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -4584,6 +4584,7 @@ grokdeclarator (const struct c_declarator *declarator, } decl = build_decl (VAR_DECL, declarator->u.id, type); + DECL_SOURCE_LOCATION (decl) = declarator->id_loc; if (size_varies) C_DECL_VARIABLE_SIZE (decl) = 1; @@ -6709,6 +6710,8 @@ build_id_declarator (tree ident) ret->kind = cdk_id; ret->declarator = 0; ret->u.id = ident; + /* Default value - may get reset to a more precise location. */ + ret->id_loc = input_location; return ret; } diff --git a/gcc/c-lex.c b/gcc/c-lex.c index f5425ce49e9..fdc1ff6e311 100644 --- a/gcc/c-lex.c +++ b/gcc/c-lex.c @@ -332,7 +332,7 @@ cb_undef (cpp_reader * ARG_UNUSED (pfile), source_location loc, non-NULL. */ enum cpp_ttype -c_lex_with_flags (tree *value, unsigned char *cpp_flags) +c_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags) { static bool no_more_pch; const cpp_token *tok; @@ -344,6 +344,11 @@ c_lex_with_flags (tree *value, unsigned char *cpp_flags) type = tok->type; retry_after_at: +#ifdef USE_MAPPED_LOCATION + *loc = tok->src_loc; +#else + *loc = input_location; +#endif switch (type) { case CPP_PADDING: @@ -487,7 +492,8 @@ c_lex_with_flags (tree *value, unsigned char *cpp_flags) enum cpp_ttype c_lex (tree *value) { - return c_lex_with_flags (value, NULL); + location_t loc; + return c_lex_with_flags (value, &loc, NULL); } /* Returns the narrowest C-visible unsigned type, starting with the diff --git a/gcc/c-parser.c b/gcc/c-parser.c index 94874226514..6fd09b94be0 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -295,8 +295,7 @@ static void c_lex_one_token (c_token *token) { timevar_push (TV_LEX); - token->type = c_lex (&token->value); - token->location = input_location; + token->type = c_lex_with_flags (&token->value, &token->location, NULL); token->in_system_header = in_system_header; switch (token->type) { @@ -2179,6 +2178,7 @@ c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind, struct c_declarator *inner = build_id_declarator (c_parser_peek_token (parser)->value); *seen_id = true; + inner->id_loc = c_parser_peek_token (parser)->location; c_parser_consume_token (parser); return c_parser_direct_declarator_inner (parser, *seen_id, inner); } diff --git a/gcc/c-pragma.h b/gcc/c-pragma.h index f7f609c407f..9a7895a43fc 100644 --- a/gcc/c-pragma.h +++ b/gcc/c-pragma.h @@ -65,7 +65,7 @@ extern tree maybe_apply_renaming_pragma (tree, tree); extern void add_to_renaming_pragma_list (tree, tree); extern enum cpp_ttype c_lex (tree *); -extern enum cpp_ttype c_lex_with_flags (tree *, unsigned char *); +extern enum cpp_ttype c_lex_with_flags (tree *, location_t *, unsigned char *); /* If 1, then lex strings into the execution character set. If 0, lex strings into the host character set. diff --git a/gcc/c-tree.h b/gcc/c-tree.h index 18b2634c1b7..adace275c38 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -287,6 +287,7 @@ struct c_declarator { enum c_declarator_kind kind; /* Except for cdk_id, the contained declarator. For cdk_id, NULL. */ struct c_declarator *declarator; + location_t id_loc; /* Currently only set for cdk_id. */ union { /* For identifiers, an IDENTIFIER_NODE or NULL_TREE if an abstract declarator. */ |