Hi!

As mentioned in the PR, we don't guarantee DECL_UID to be the same between
corresponding decls in -g and -g0 builds, -g can create more decls and all
that is guaranteed is that the DECL_UIDs of the corresponding decls compare
the same.
The following testcase gets a -fcompare-debug failure because these
functions use DECL_UID as the number in ASM_FORMAT_PRIVATE_NAME.

The patch fixes it by using just a sequential number there instead.
I don't think this can be called during PCH writing, this only happens for
non-public decls and the C/C++ FEs shouldn't mangling those at that point
(furthermore C++ FE uses a different set_decl_assembler_name hook and this
one is something only the gimplifier calls on C.NNNN temporaries.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2020-03-25  Jakub Jelinek  <ja...@redhat.com>

        PR c++/94223
        * langhooks.c (lhd_set_decl_assembler_name): Use a static ulong
        counter instead of DECL_UID.

        * lto-lang.c (lto_set_decl_assembler_name): Use a static ulong
        counter instead of DECL_UID.

        * g++.dg/opt/pr94223.C: New test.

--- gcc/langhooks.c.jj  2020-01-12 11:54:36.670409531 +0100
+++ gcc/langhooks.c     2020-03-24 16:05:26.728284808 +0100
@@ -160,16 +160,17 @@ lhd_set_decl_assembler_name (tree decl)
 
      Can't use just the variable's own name for a variable whose scope
      is less than the whole compilation.  Concatenate a distinguishing
-     number - we use the DECL_UID.  */
+     number.  */
 
   if (TREE_PUBLIC (decl) || DECL_FILE_SCOPE_P (decl))
     id = targetm.mangle_decl_assembler_name (decl, DECL_NAME (decl));
   else
     {
       const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
+      static unsigned long num;
       char *label;
 
-      ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
+      ASM_FORMAT_PRIVATE_NAME (label, name, num++);
       id = get_identifier (label);
     }
 
--- gcc/lto/lto-lang.c.jj       2020-01-12 11:54:36.678409411 +0100
+++ gcc/lto/lto-lang.c  2020-03-24 13:55:10.463826320 +0100
@@ -1179,8 +1179,9 @@ lto_set_decl_assembler_name (tree decl)
     {
       const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
       char *label;
+      static unsigned long num;
 
-      ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
+      ASM_FORMAT_PRIVATE_NAME (label, name, num++);
       id = get_identifier (label);
     }
 
--- gcc/testsuite/g++.dg/opt/pr94223.C.jj       2020-03-24 16:03:42.069863475 
+0100
+++ gcc/testsuite/g++.dg/opt/pr94223.C  2020-03-24 16:04:53.327788620 +0100
@@ -0,0 +1,5 @@
+// PR c++/94223
+// { dg-do compile }
+// { dg-options "-O0 -std=c++2a -fcompare-debug" }
+
+#include "../cpp1z/init-statement6.C"

        Jakub

Reply via email to