Add ability to force lexed tokens' source_locations.

Use it to force BUILTINS_LOCATION when declaring builtins instead of creating a <built-in> entry in the line_table which is wrong.

	* c-opts.c (c_finish_options): Force BUILTINS_LOCATION for tokens
	defined in cpp_init_builtins and c_cpp_builtins.

	gcc/fortran/ChangeLog
	* cpp.c (gfc_cpp_init): Force BUILTINS_LOCATION for tokens
	defined in cpp_define_builtins.

	libcpp/ChangeLog
	* init.c (cpp_create_reader): Inititalize forced_token_location_p.
	* internal.h (struct cpp_reader): Add field forced_token_location_p.
	* lex.c (_cpp_lex_direct): Use forced_token_location_p.
	(cpp_force_token_locations): New.
	(cpp_stop_forcing_token_locations): New.

From-SVN: r177973
This commit is contained in:
Gabriel Charette
2011-08-22 20:41:07 +00:00
committed by Gabriel Charette
parent c4831cff11
commit e3dfef44ef
9 changed files with 72 additions and 9 deletions

View File

@@ -1,3 +1,11 @@
2011-08-22 Gabriel Charette <gchare@google.com>
* init.c (cpp_create_reader): Inititalize forced_token_location_p.
* internal.h (struct cpp_reader): Add field forced_token_location_p.
* lex.c (_cpp_lex_direct): Use forced_token_location_p.
(cpp_force_token_locations): New.
(cpp_stop_forcing_token_locations): New.
2011-08-18 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR libstdc++/1773

View File

@@ -989,4 +989,8 @@ extern void cpp_prepare_state (cpp_reader *, struct save_macro_data **);
extern int cpp_read_state (cpp_reader *, const char *, FILE *,
struct save_macro_data *);
/* In lex.c */
extern void cpp_force_token_locations (cpp_reader *, source_location *);
extern void cpp_stop_forcing_token_locations (cpp_reader *);
#endif /* ! LIBCPP_CPPLIB_H */

View File

@@ -223,6 +223,9 @@ cpp_create_reader (enum c_lang lang, hash_table *table,
/* Initialize table for push_macro/pop_macro. */
pfile->pushed_macros = 0;
/* Do not force token locations by default. */
pfile->forced_token_location_p = NULL;
/* The expression parser stack. */
_cpp_expand_op_stack (pfile);

View File

@@ -499,6 +499,10 @@ struct cpp_reader
/* List of saved macros by push_macro. */
struct def_pragma_macro *pushed_macros;
/* If non-null, the lexer will use this location for the next token
instead of getting a location from the linemap. */
source_location *forced_token_location_p;
};
/* Character classes. Based on the more primitive macros in safe-ctype.h.

View File

@@ -1975,8 +1975,11 @@ _cpp_lex_direct (cpp_reader *pfile)
}
c = *buffer->cur++;
result->src_loc = linemap_position_for_column (pfile->line_table,
CPP_BUF_COLUMN (buffer, buffer->cur));
if (pfile->forced_token_location_p)
result->src_loc = *pfile->forced_token_location_p;
else
result->src_loc = linemap_position_for_column (pfile->line_table,
CPP_BUF_COLUMN (buffer, buffer->cur));
switch (c)
{
@@ -2839,3 +2842,21 @@ cpp_token_val_index (cpp_token *tok)
return CPP_TOKEN_FLD_NONE;
}
}
/* All tokens lexed in R after calling this function will be forced to have
their source_location the same as the location referenced by P, until
cpp_stop_forcing_token_locations is called for R. */
void
cpp_force_token_locations (cpp_reader *r, source_location *p)
{
r->forced_token_location_p = p;
}
/* Go back to assigning locations naturally for lexed tokens. */
void
cpp_stop_forcing_token_locations (cpp_reader *r)
{
r->forced_token_location_p = NULL;
}