Hi!

The following testcase build with -ftrack-macro-expansion=0,
but don't build otherwise.  The problem seems to be that
the libcpp for macro redefinition warning/error purposes if it sees
more than one paste operator adds those extra CPP_PASTE tokens at the end,
after normal tokens from the macro.  For -ftrack-macro-expansion=0 we were
using macro_real_token_count (macro) to only use the real tokens for macro
expansion purposes, but for track_macro_expansion it used macro->count,
which includes also the extra tokens.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
ok for trunk (and after a while for 4.8)?

2014-02-18  Jakub Jelinek  <ja...@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).

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

--- libcpp/macro.c.jj   2014-01-03 11:42:25.000000000 +0100
+++ libcpp/macro.c      2014-02-18 12:20:30.679451456 +0100
@@ -1115,21 +1115,22 @@ enter_macro_context (cpp_reader *pfile,
 
       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,
                                            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)
--- gcc/testsuite/c-c++-common/cpp/pr58844-1.c.jj       2014-02-18 
12:18:40.501075448 +0100
+++ gcc/testsuite/c-c++-common/cpp/pr58844-1.c  2014-02-18 12:18:12.000000000 
+0100
@@ -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" } */
--- gcc/testsuite/c-c++-common/cpp/pr58844-2.c.jj       2014-02-18 
12:18:47.415034981 +0100
+++ gcc/testsuite/c-c++-common/cpp/pr58844-2.c  2014-02-18 12:18:53.375009859 
+0100
@@ -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" } */

        Jakub

Reply via email to