aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-04-12 09:52:50 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-04-12 09:52:50 +0000
commit3fc20697523443ed885f701923160ea22a19be62 (patch)
tree646b7ae4537e4b4af2ec922c630935f6a28d3659
parentc34f3839b8ff8d24530f33e9f015ec31ffadfbd9 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/semantics.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr43611.C22
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;