Hi,

the testcase shows that after Jason's r222134 in some cases it can still happen that TREE_PUBLIC is false and DECL_COMDAT is true, thus the assertion in vague_linkage_p triggers. For the testcase, in duplicate_decls, newdecl starts with both flags true and only the former becomes false when its value is copied from olddecl. Alternately to the simple tweak which I tested succesfully, I briefly wondered if we shouldn't just copy DECL_COMDAT too, in duplicate_decls, but that also causes the regression of ext/gnu-inline-global.C and ext/gnu-inline-namespace.C.

Thanks,
Paolo.

////////////////////
/cp
2015-06-23  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/65811
        * decl.c (duplicate_decls): Adjust DECL_COMDAT of newdecl.

/testsuite
2015-06-23  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/65811
        * g++.dg/other/linkage2.C: New.
Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 224854)
+++ cp/decl.c   (working copy)
@@ -2106,6 +2106,8 @@ duplicate_decls (tree newdecl, tree olddecl, bool
   TREE_STATIC (olddecl) = TREE_STATIC (newdecl) |= TREE_STATIC (olddecl);
   if (! DECL_EXTERNAL (olddecl))
     DECL_EXTERNAL (newdecl) = 0;
+  if (! DECL_COMDAT (olddecl))
+    DECL_COMDAT (newdecl) = 0;
 
   new_template_info = NULL_TREE;
   if (DECL_LANG_SPECIFIC (newdecl) && DECL_LANG_SPECIFIC (olddecl))
Index: testsuite/g++.dg/other/linkage2.C
===================================================================
--- testsuite/g++.dg/other/linkage2.C   (revision 0)
+++ testsuite/g++.dg/other/linkage2.C   (working copy)
@@ -0,0 +1,10 @@
+// PR c++/65811
+
+struct foo { int i; };
+
+static void fn1 ();
+inline void
+fn1 ()
+{
+  static struct foo a[1];
+}

Reply via email to