re PR preprocessor/58844 (ICE with invalid use of ##)

PR preprocessor/58844
	* macro.c (enter_macro_context): Only push
	macro_real_token_count (macro) tokens rather than
	macro->count tokens, regardless of
	CPP_OPTION (pfile, track-macro-expansion).

	* c-c++-common/cpp/pr58844-1.c: New test.
	* c-c++-common/cpp/pr58844-2.c: New test.

From-SVN: r207871
This commit is contained in:
Jakub Jelinek 2014-02-19 07:05:55 +01:00 committed by Jakub Jelinek
parent 0cfe1b4698
commit 179652df33
5 changed files with 41 additions and 14 deletions

View File

@ -1,3 +1,9 @@
2014-02-19 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/58844
* c-c++-common/cpp/pr58844-1.c: New test.
* c-c++-common/cpp/pr58844-2.c: New test.
2014-02-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/60225

View File

@ -0,0 +1,8 @@
/* PR preprocessor/58844 */
/* { dg-do compile } */
/* { dg-options "-ftrack-macro-expansion=0" } */
#define A x######x
int A = 1;
#define A x######x /* { dg-message "previous definition" } */
#define A x##x /* { dg-warning "redefined" } */

View File

@ -0,0 +1,8 @@
/* PR preprocessor/58844 */
/* { dg-do compile } */
/* { dg-options "-ftrack-macro-expansion=2" } */
#define A x######x
int A = 1;
#define A x######x /* { dg-message "previous definition" } */
#define A x##x /* { dg-warning "redefined" } */

View File

@ -1,3 +1,11 @@
2014-02-19 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/58844
* macro.c (enter_macro_context): Only push
macro_real_token_count (macro) tokens rather than
macro->count tokens, regardless of
CPP_OPTION (pfile, track-macro-expansion).
2014-02-07 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/56824

View File

@ -1115,21 +1115,22 @@ enter_macro_context (cpp_reader *pfile, cpp_hashnode *node,
if (macro->paramc == 0)
{
unsigned tokens_count = macro_real_token_count (macro);
if (CPP_OPTION (pfile, track_macro_expansion))
{
unsigned int i, count = macro->count;
unsigned int i;
const cpp_token *src = macro->exp.tokens;
const struct line_map *map;
source_location *virt_locs = NULL;
_cpp_buff *macro_tokens =
tokens_buff_new (pfile, count, &virt_locs);
_cpp_buff *macro_tokens
= tokens_buff_new (pfile, tokens_count, &virt_locs);
/* Create a macro map to record the locations of the
tokens that are involved in the expansion. LOCATION
is the location of the macro expansion point. */
map = linemap_enter_macro (pfile->line_table,
node, location, count);
for (i = 0; i < count; ++i)
map = linemap_enter_macro (pfile->line_table,
node, location, tokens_count);
for (i = 0; i < tokens_count; ++i)
{
tokens_buff_add_token (macro_tokens, virt_locs,
src, src->src_loc,
@ -1141,16 +1142,12 @@ enter_macro_context (cpp_reader *pfile, cpp_hashnode *node,
virt_locs,
(const cpp_token **)
macro_tokens->base,
count);
num_macro_tokens_counter += count;
tokens_count);
}
else
{
unsigned tokens_count = macro_real_token_count (macro);
_cpp_push_token_context (pfile, node, macro->exp.tokens,
tokens_count);
num_macro_tokens_counter += tokens_count;
}
_cpp_push_token_context (pfile, node, macro->exp.tokens,
tokens_count);
num_macro_tokens_counter += tokens_count;
}
if (pragma_buff)