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> 2014-02-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/60225 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> 2014-02-07 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/56824 PR preprocessor/56824

View File

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