From 3fc20697523443ed885f701923160ea22a19be62 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Mon, 12 Apr 2010 09:52:50 +0000 Subject: [PATCH] re PR c++/43611 (ICE: SIGSEGV with -fipa-cp-clone -fkeep-inline-functions) 2010-04-12 Richard Guenther PR c++/43611 * semantics.c (expand_or_defer_fn_1): Do not keep extern template inline functions. * g++.dg/torture/pr43611.C: New testcase. From-SVN: r158218 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/semantics.c | 4 +++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/torture/pr43611.C | 22 ++++++++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr43611.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c40e368f46c8..e56c77c35a53 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-04-12 Richard Guenther + + PR c++/43611 + * semantics.c (expand_or_defer_fn_1): Do not keep extern + template inline functions. + 2010-04-09 Manuel López-Ibáñez PR c++/28584 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index d425402e3ce8..66d152de8b8b 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3446,7 +3446,9 @@ expand_or_defer_fn_1 (tree fn) this function as needed so that finish_file will make sure to output it later. Similarly, all dllexport'd functions must be emitted; there may be callers in other DLLs. */ - if ((flag_keep_inline_functions && DECL_DECLARED_INLINE_P (fn)) + if ((flag_keep_inline_functions + && DECL_DECLARED_INLINE_P (fn) + && !DECL_REALLY_EXTERN (fn)) || lookup_attribute ("dllexport", DECL_ATTRIBUTES (fn))) mark_needed (fn); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d5cddd4cf345..547ea328e2e5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-04-12 Richard Guenther + + PR c++/43611 + * g++.dg/torture/pr43611.C: New testcase. + 2010-04-12 Shujing Zhao PR c/36774 diff --git a/gcc/testsuite/g++.dg/torture/pr43611.C b/gcc/testsuite/g++.dg/torture/pr43611.C new file mode 100644 index 000000000000..6899a6ea400b --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr43611.C @@ -0,0 +1,22 @@ +// { dg-do compile } +// { dg-options "-fkeep-inline-functions" } + +template < typename > +struct A { + void init (int); + A () + { + this->init (0); + } +}; + +template < typename > +struct B : A < int > { + A < int > a; + B () {} +}; + +extern template struct A < int >; +extern template struct B < int >; + +B < int > b; -- 2.47.2