From 789c274118d76ab0aab936c51e62a792bab3ab98 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 17 Apr 2014 04:22:57 +0200 Subject: [PATCH] re PR ipa/60854 (inline constructor of extern template) PR ipa/60854 * ipa.c (symtab_remove_unreachable_nodes): Mark targets of external aliases alive, too. * g++.dg/torture/pr60854.C: New testcase. From-SVN: r209459 --- gcc/ChangeLog | 6 ++++++ gcc/ipa.c | 13 ++++++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/torture/pr60854.C | 13 +++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr60854.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ef1da88cc74f..5cff60ebc36f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-04-16 Jan Hubicka + + PR ipa/60854 + * ipa.c (symtab_remove_unreachable_nodes): Mark targets of + external aliases alive, too. + 2014-04-16 Andrew Pinski * config/host-linux.c (TRY_EMPTY_VM_SPACE): Change aarch64 ilp32 diff --git a/gcc/ipa.c b/gcc/ipa.c index 26e9b03b9bdb..3d82a39286c6 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -415,7 +415,18 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file) || !DECL_EXTERNAL (e->callee->decl) || e->callee->alias || before_inlining_p)) - pointer_set_insert (reachable, e->callee); + { + /* Be sure that we will not optimize out alias target + body. */ + if (DECL_EXTERNAL (e->callee->decl) + && e->callee->alias + && before_inlining_p) + { + pointer_set_insert (reachable, + cgraph_function_node (e->callee)); + } + pointer_set_insert (reachable, e->callee); + } enqueue_node (e->callee, &first, reachable); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8b83cd425ddd..de911fd4f404 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-16 Jan Hubicka + + PR ipa/60854 + * g++.dg/torture/pr60854.C: New testcase. + 2014-04-16 Catherine Moore * gcc.target/mips/umips-store16-2.c: New test. diff --git a/gcc/testsuite/g++.dg/torture/pr60854.C b/gcc/testsuite/g++.dg/torture/pr60854.C new file mode 100644 index 000000000000..fa4b2e71ab7e --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr60854.C @@ -0,0 +1,13 @@ +template +class MyClass +{ +public: + __attribute__ ((__always_inline__)) inline MyClass () { ; } +}; + +extern template class MyClass; + +void Func() +{ + MyClass x; +}