re PR c++/67354 (internal compiler error: in add_to_same_comdat_group, at symtab...
authorJakub Jelinek <jakub@redhat.com>
Fri, 20 Nov 2015 09:03:45 +0000 (10:03 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 20 Nov 2015 09:03:45 +0000 (10:03 +0100)
PR c++/67354
* cp-tree.h (defer_mangling_aliases): Declare.
(generate_mangling_aliases): New prototype.
* decl2.c (defer_mangling_aliases): New variable.
(note_mangling_alias): Use !defer_mangling_aliases
instead of at_eof.
(generate_mangling_aliases): No longer static. Clear
defer_mangling_aliases.
* optimize.c (maybe_thunk_body): Defer emitting mangling aliases
if !defer_mangling_aliases until the fns are put into the same
comdat group.

* g++.dg/abi/mangle67.C: New test.

From-SVN: r230646

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/cp/optimize.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/abi/mangle67.C [new file with mode: 0644]

index cf436d7d106bfe51c3e73cf66387c6638470e4ae..0428c3c93ae95acee2d7cec2c4a30b954bb64008 100644 (file)
@@ -1,3 +1,17 @@
+2015-11-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/67354
+       * cp-tree.h (defer_mangling_aliases): Declare.
+       (generate_mangling_aliases): New prototype.
+       * decl2.c (defer_mangling_aliases): New variable.
+       (note_mangling_alias): Use !defer_mangling_aliases
+       instead of at_eof.
+       (generate_mangling_aliases): No longer static. Clear
+       defer_mangling_aliases.
+       * optimize.c (maybe_thunk_body): Defer emitting mangling aliases
+       if !defer_mangling_aliases until the fns are put into the same
+       comdat group.
+
 2015-11-19  David Malcolm  <dmalcolm@redhat.com>
 
        * cp-tree.h (lookup_member_fuzzy): New decl.
index 38bd7dd614ffb5f7735e20eb10c2d89fe35307c4..1672291f9b691d5f14c40d8cbf7ebe1277cd2794 100644 (file)
@@ -4846,6 +4846,11 @@ extern GTY(()) vec<tree, va_gc> *local_classes;
 
 extern int at_eof;
 
+/* True if note_mangling_alias should enqueue mangling aliases for
+   later generation, rather than emitting them right away.  */
+
+extern bool defer_mangling_aliases;
+
 /* A list of namespace-scope objects which have constructors or
    destructors which reside in the global scope.  The decl is stored
    in the TREE_VALUE slot and the initializer is stored in the
@@ -5772,6 +5777,7 @@ extern tree cxx_maybe_build_cleanup               (tree, tsubst_flags_t);
 
 /* in decl2.c */
 extern void note_mangling_alias                        (tree, tree);
+extern void generate_mangling_aliases          (void);
 extern bool check_java_method                  (tree);
 extern tree build_memfn_type                   (tree, tree, cp_cv_quals, cp_ref_qualifier);
 extern tree build_pointer_ptrmemfn_type        (tree);
index 47c9ec96d24fa497fb7e30c1ade92955cb05c0f5..2cc51d6d428eec6917e8b1df3eeb5ecf2adac51b 100644 (file)
@@ -102,6 +102,11 @@ static GTY(()) vec<tree, va_gc> *mangling_aliases;
 /* Nonzero if we're done parsing and into end-of-file activities.  */
 
 int at_eof;
+
+/* True if note_mangling_alias should enqueue mangling aliases for
+   later generation, rather than emitting them right away.  */
+
+bool defer_mangling_aliases = true;
 \f
 
 /* Return a member function type (a METHOD_TYPE), given FNTYPE (a
@@ -4389,7 +4394,7 @@ void
 note_mangling_alias (tree decl ATTRIBUTE_UNUSED, tree id2 ATTRIBUTE_UNUSED)
 {
 #ifdef ASM_OUTPUT_DEF
-  if (at_eof)
+  if (!defer_mangling_aliases)
     generate_mangling_alias (decl, id2);
   else
     {
@@ -4399,7 +4404,9 @@ note_mangling_alias (tree decl ATTRIBUTE_UNUSED, tree id2 ATTRIBUTE_UNUSED)
 #endif
 }
 
-static void
+/* Emit all mangling aliases that were deferred up to this point.  */
+
+void
 generate_mangling_aliases ()
 {
   while (!vec_safe_is_empty (mangling_aliases))
@@ -4408,6 +4415,7 @@ generate_mangling_aliases ()
       tree decl = mangling_aliases->pop();
       generate_mangling_alias (decl, id2);
     }
+  defer_mangling_aliases = false;
 }
 
 /* The entire file is now complete.  If requested, dump everything
index c4e70206f2148c4aa04c31287ff52e3a011577fc..a5f84a0a4b5a2c2cbdd8d719a1b9568f58b59386 100644 (file)
@@ -270,7 +270,11 @@ maybe_thunk_body (tree fn, bool force)
     }
   else if (HAVE_COMDAT_GROUP)
     {
+      /* At eof, defer creation of mangling aliases temporarily.  */
+      bool save_defer_mangling_aliases = defer_mangling_aliases;
+      defer_mangling_aliases = true;
       tree comdat_group = cdtor_comdat_group (fns[1], fns[0]);
+      defer_mangling_aliases = save_defer_mangling_aliases;
       cgraph_node::get_create (fns[0])->set_comdat_group (comdat_group);
       cgraph_node::get_create (fns[1])->add_to_same_comdat_group
        (cgraph_node::get_create (fns[0]));
@@ -281,6 +285,9 @@ maybe_thunk_body (tree fn, bool force)
           virtual, it goes into the same comdat group as well.  */
        cgraph_node::get_create (fns[2])->add_to_same_comdat_group
          (symtab_node::get (fns[0]));
+      /* Emit them now that the thunks are same comdat group aliases.  */
+      if (!save_defer_mangling_aliases)
+       generate_mangling_aliases ();
       TREE_PUBLIC (fn) = false;
       DECL_EXTERNAL (fn) = false;
       DECL_INTERFACE_KNOWN (fn) = true;
index e1e88fa5e7085aced5cd487a869001d2535dc922..75ea160d76c44dcfdc5adbc2c092607993a354bd 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/67354
+       * g++.dg/abi/mangle67.C: New test.
+
 2015-11-20  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
 
        * gcc.target/s390/bswap-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/abi/mangle67.C b/gcc/testsuite/g++.dg/abi/mangle67.C
new file mode 100644 (file)
index 0000000..69ca90b
--- /dev/null
@@ -0,0 +1,21 @@
+// PR c++/67354
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=5 -Os" }
+
+class A
+{
+};
+
+template <typename T>
+void
+foo ()
+{
+  T ();
+}
+
+struct B : virtual A
+{
+  template <typename...> B () {}
+};
+
+auto f = foo<B>;