aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-10-18 15:36:28 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-10-18 15:36:28 -0400
commit15e0646fde23f549c224be5ba3ee9bd11eb748de (patch)
treea1100a8b4b514c22a4f0f025219d9d00f406feb8
parentd2f706418a847ebd9565638d76defc30ba9c30a0 (diff)
downloadgcc-15e0646fde23f549c224be5ba3ee9bd11eb748de.zip
gcc-15e0646fde23f549c224be5ba3ee9bd11eb748de.tar.gz
gcc-15e0646fde23f549c224be5ba3ee9bd11eb748de.tar.bz2
re PR c++/50531 ([C++0x] ICE on defaulted template destructor)
PR c++/50531 * pt.c (instantiate_decl): Recognize when a function defaulted outside the class is already instantiated. From-SVN: r180162
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/defaulted32.C21
4 files changed, 30 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 24ca654..402f5b5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2011-10-18 Jason Merrill <jason@redhat.com>
+ PR c++/50531
+ * pt.c (instantiate_decl): Recognize when a function defaulted
+ outside the class is already instantiated.
+
PR c++/50742
* decl.c (check_previous_goto_1): Handle using-decl.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 6fc60d5..56fa632 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -18045,6 +18045,8 @@ instantiate_decl (tree d, int defer_ok,
d = DECL_CLONED_FUNCTION (d);
if (DECL_TEMPLATE_INSTANTIATED (d)
+ || (TREE_CODE (d) == FUNCTION_DECL
+ && DECL_DEFAULTED_FN (d) && DECL_INITIAL (d))
|| DECL_TEMPLATE_SPECIALIZATION (d))
/* D has already been instantiated or explicitly specialized, so
there's nothing for us to do here.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d2cf1a8..ed9a8e6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2011-10-18 Jason Merrill <jason@redhat.com>
+ PR c++/50531
+ * g++.dg/cpp0x/defaulted32.C: New.
+
PR c++/50742
* g++.dg/lookup/using23.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted32.C b/gcc/testsuite/g++.dg/cpp0x/defaulted32.C
new file mode 100644
index 0000000..351cdae1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/defaulted32.C
@@ -0,0 +1,21 @@
+// PR c++/50531
+// { dg-options -std=c++0x }
+
+template <typename T>
+class DataFilter
+{
+ public:
+ inline virtual ~DataFilter();
+};
+
+template<typename T>
+inline DataFilter<T>::~DataFilter() = default;
+
+class ARCalculator : public DataFilter<ARCalculator>
+{
+ public:
+ virtual void dataStart(int, int);
+};
+
+void ARCalculator::dataStart(int, int)
+{}