Commit 6037d88d by Per Bothner Committed by Per Bothner

c-tree.h (struct c_declarator): New id_loc field.


	* 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.

From-SVN: r96329
parent 210e1852
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> 2005-03-11 Roger Sayle <roger@eyesopen.com>
PR middle-end/20419 PR middle-end/20419
......
...@@ -4584,6 +4584,7 @@ grokdeclarator (const struct c_declarator *declarator, ...@@ -4584,6 +4584,7 @@ grokdeclarator (const struct c_declarator *declarator,
} }
decl = build_decl (VAR_DECL, declarator->u.id, type); decl = build_decl (VAR_DECL, declarator->u.id, type);
DECL_SOURCE_LOCATION (decl) = declarator->id_loc;
if (size_varies) if (size_varies)
C_DECL_VARIABLE_SIZE (decl) = 1; C_DECL_VARIABLE_SIZE (decl) = 1;
...@@ -6709,6 +6710,8 @@ build_id_declarator (tree ident) ...@@ -6709,6 +6710,8 @@ build_id_declarator (tree ident)
ret->kind = cdk_id; ret->kind = cdk_id;
ret->declarator = 0; ret->declarator = 0;
ret->u.id = ident; ret->u.id = ident;
/* Default value - may get reset to a more precise location. */
ret->id_loc = input_location;
return ret; return ret;
} }
......
...@@ -332,7 +332,7 @@ cb_undef (cpp_reader * ARG_UNUSED (pfile), source_location loc, ...@@ -332,7 +332,7 @@ cb_undef (cpp_reader * ARG_UNUSED (pfile), source_location loc,
non-NULL. */ non-NULL. */
enum cpp_ttype 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; static bool no_more_pch;
const cpp_token *tok; const cpp_token *tok;
...@@ -344,6 +344,11 @@ c_lex_with_flags (tree *value, unsigned char *cpp_flags) ...@@ -344,6 +344,11 @@ c_lex_with_flags (tree *value, unsigned char *cpp_flags)
type = tok->type; type = tok->type;
retry_after_at: retry_after_at:
#ifdef USE_MAPPED_LOCATION
*loc = tok->src_loc;
#else
*loc = input_location;
#endif
switch (type) switch (type)
{ {
case CPP_PADDING: case CPP_PADDING:
...@@ -487,7 +492,8 @@ c_lex_with_flags (tree *value, unsigned char *cpp_flags) ...@@ -487,7 +492,8 @@ c_lex_with_flags (tree *value, unsigned char *cpp_flags)
enum cpp_ttype enum cpp_ttype
c_lex (tree *value) 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 /* Returns the narrowest C-visible unsigned type, starting with the
......
...@@ -295,8 +295,7 @@ static void ...@@ -295,8 +295,7 @@ static void
c_lex_one_token (c_token *token) c_lex_one_token (c_token *token)
{ {
timevar_push (TV_LEX); timevar_push (TV_LEX);
token->type = c_lex (&token->value); token->type = c_lex_with_flags (&token->value, &token->location, NULL);
token->location = input_location;
token->in_system_header = in_system_header; token->in_system_header = in_system_header;
switch (token->type) switch (token->type)
{ {
...@@ -2179,6 +2178,7 @@ c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind, ...@@ -2179,6 +2178,7 @@ c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
struct c_declarator *inner struct c_declarator *inner
= build_id_declarator (c_parser_peek_token (parser)->value); = build_id_declarator (c_parser_peek_token (parser)->value);
*seen_id = true; *seen_id = true;
inner->id_loc = c_parser_peek_token (parser)->location;
c_parser_consume_token (parser); c_parser_consume_token (parser);
return c_parser_direct_declarator_inner (parser, *seen_id, inner); return c_parser_direct_declarator_inner (parser, *seen_id, inner);
} }
......
...@@ -65,7 +65,7 @@ extern tree maybe_apply_renaming_pragma (tree, tree); ...@@ -65,7 +65,7 @@ extern tree maybe_apply_renaming_pragma (tree, tree);
extern void add_to_renaming_pragma_list (tree, tree); extern void add_to_renaming_pragma_list (tree, tree);
extern enum cpp_ttype c_lex (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 1, then lex strings into the execution character set.
If 0, lex strings into the host character set. If 0, lex strings into the host character set.
......
...@@ -287,6 +287,7 @@ struct c_declarator { ...@@ -287,6 +287,7 @@ struct c_declarator {
enum c_declarator_kind kind; enum c_declarator_kind kind;
/* Except for cdk_id, the contained declarator. For cdk_id, NULL. */ /* Except for cdk_id, the contained declarator. For cdk_id, NULL. */
struct c_declarator *declarator; struct c_declarator *declarator;
location_t id_loc; /* Currently only set for cdk_id. */
union { union {
/* For identifiers, an IDENTIFIER_NODE or NULL_TREE if an abstract /* For identifiers, an IDENTIFIER_NODE or NULL_TREE if an abstract
declarator. */ declarator. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment