From: Jakub Jelinek Date: Thu, 6 Mar 2014 08:10:08 +0000 (+0100) Subject: backport: re PR preprocessor/58844 (ICE with invalid use of ##) X-Git-Tag: releases/gcc-4.8.3~285 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fa044a4afdb7ef3841b5f533a715b265f3d9aa46;p=thirdparty%2Fgcc.git backport: re PR preprocessor/58844 (ICE with invalid use of ##) Backport from mainline 2014-02-19 Jakub Jelinek 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: r208370 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 425cbf690faf..253b0a65b18d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,12 @@ 2014-03-06 Jakub Jelinek Backport from mainline + 2014-02-19 Jakub Jelinek + + PR preprocessor/58844 + * c-c++-common/cpp/pr58844-1.c: New test. + * c-c++-common/cpp/pr58844-2.c: New test. + 2014-02-13 Jakub Jelinek PR target/43546 diff --git a/gcc/testsuite/c-c++-common/cpp/pr58844-1.c b/gcc/testsuite/c-c++-common/cpp/pr58844-1.c new file mode 100644 index 000000000000..3abf8a768035 --- /dev/null +++ b/gcc/testsuite/c-c++-common/cpp/pr58844-1.c @@ -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" } */ diff --git a/gcc/testsuite/c-c++-common/cpp/pr58844-2.c b/gcc/testsuite/c-c++-common/cpp/pr58844-2.c new file mode 100644 index 000000000000..1e219152fc5d --- /dev/null +++ b/gcc/testsuite/c-c++-common/cpp/pr58844-2.c @@ -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" } */ diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 9fc829cf47f0..8ab4511ec08b 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,6 +1,14 @@ 2014-03-06 Jakub Jelinek Backport from mainline + 2014-02-19 Jakub Jelinek + + 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 PR preprocessor/56824 diff --git a/libcpp/macro.c b/libcpp/macro.c index 6d46027e4ea4..f2b7d0b9079f 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -1108,21 +1108,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, @@ -1134,16 +1135,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)