re PR c++/67354 (internal compiler error: in add_to_same_comdat_group, at symtab.c:421)
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
This commit is contained in:
parent
511f5bb114
commit
ec5a0fe042
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
||||
/* 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
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
21
gcc/testsuite/g++.dg/abi/mangle67.C
Normal file
21
gcc/testsuite/g++.dg/abi/mangle67.C
Normal file
@ -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>;
|
Loading…
Reference in New Issue
Block a user