diff options
author | Richard Guenther <rguenther@suse.de> | 2010-04-12 09:52:50 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-04-12 09:52:50 +0000 |
commit | 3fc20697523443ed885f701923160ea22a19be62 (patch) | |
tree | 646b7ae4537e4b4af2ec922c630935f6a28d3659 | |
parent | c34f3839b8ff8d24530f33e9f015ec31ffadfbd9 (diff) | |
download | gcc-3fc20697523443ed885f701923160ea22a19be62.zip gcc-3fc20697523443ed885f701923160ea22a19be62.tar.gz gcc-3fc20697523443ed885f701923160ea22a19be62.tar.bz2 |
re PR c++/43611 (ICE: SIGSEGV with -fipa-cp-clone -fkeep-inline-functions)
2010-04-12 Richard Guenther <rguenther@suse.de>
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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr43611.C | 22 |
4 files changed, 36 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c40e368..e56c77c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-04-12 Richard Guenther <rguenther@suse.de> + + 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 <manu@gcc.gnu.org> PR c++/28584 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index d425402..66d152d 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 d5cddd4..547ea32 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-04-12 Richard Guenther <rguenther@suse.de> + + PR c++/43611 + * g++.dg/torture/pr43611.C: New testcase. + 2010-04-12 Shujing Zhao <pearly.zhao@oracle.com> 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 0000000..6899a6e --- /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; |