aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2010-02-10 16:48:35 -0500
committerJason Merrill <jason@gcc.gnu.org>2010-02-10 16:48:35 -0500
commitf1c3cf3c931a57f565ea7d4fe117875bc8701cd9 (patch)
tree1a4635e30a19420754667446c235f2ef0f178b88
parent7a79ff3be3d08ef53b5b6ca9a0adb7fc84ebdb19 (diff)
downloadgcc-f1c3cf3c931a57f565ea7d4fe117875bc8701cd9.zip
gcc-f1c3cf3c931a57f565ea7d4fe117875bc8701cd9.tar.gz
gcc-f1c3cf3c931a57f565ea7d4fe117875bc8701cd9.tar.bz2
PR c++/42983, core issue 906
PR c++/42983, core issue 906 * method.c (defaultable_fn_check): Check virtualness. * include/std/thread (~_Impl_base): Move default out of line. * libsupc++/nested_exception.h (~nested_exception): Likewise. From-SVN: r156672
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/method.c3
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/defaulted15.C5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/defaulted9.C4
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/include/std/thread4
-rw-r--r--libstdc++-v3/libsupc++/nested_exception.h4
-rw-r--r--libstdc++-v3/testsuite/18_support/nested_exception/rethrow_if_nested.cc3
-rw-r--r--libstdc++-v3/testsuite/18_support/nested_exception/throw_with_nested.cc3
10 files changed, 38 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index fd637fb..11ec213 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2010-02-10 Jason Merrill <jason@redhat.com>
+ PR c++/42983, core issue 906
+ * method.c (defaultable_fn_check): Check virtualness.
+
+2010-02-10 Jason Merrill <jason@redhat.com>
+
PR c++/43016
* semantics.c (maybe_add_lambda_conv_op): Set DECL_INTERFACE_KNOWN.
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index cda7ed3..ccc977d 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -1069,6 +1069,9 @@ defaultable_fn_check (tree fn)
if (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn)))
error ("function %q+D defaulted on its first declaration "
"must not have an exception-specification", fn);
+ if (DECL_VIRTUAL_P (fn))
+ error ("%qD declared virtual cannot be defaulted in the class "
+ "body", fn);
}
else if (!processing_template_decl)
defaulted_late_check (fn);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c63c1ff..1ddd791 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2010-02-10 Jason Merrill <jason@redhat.com>
+ PR c++/42983, core issue 906
+ * g++.dg/cpp0x/defaulted15.C: Add virtualness test.
+ * g++.dg/cpp0x/defaulted9.C: Move virtual default outside class.
+
PR c++/43016
* g++.dg/cpp0x/lambda/lambda-conv.C: Test for weakness.
diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted15.C b/gcc/testsuite/g++.dg/cpp0x/defaulted15.C
index 092b560..b54cedb 100644
--- a/gcc/testsuite/g++.dg/cpp0x/defaulted15.C
+++ b/gcc/testsuite/g++.dg/cpp0x/defaulted15.C
@@ -41,3 +41,8 @@ struct G: public F
// Can't be const because F copy ctor isn't.
G(const G&) = default; // { dg-error "const" }
};
+
+struct H
+{
+ virtual ~H() = default; // { dg-error "declared virtual" }
+};
diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted9.C b/gcc/testsuite/g++.dg/cpp0x/defaulted9.C
index f083479..1e5e2cb 100644
--- a/gcc/testsuite/g++.dg/cpp0x/defaulted9.C
+++ b/gcc/testsuite/g++.dg/cpp0x/defaulted9.C
@@ -4,9 +4,11 @@
struct _Impl_base
{
_Impl_base() = default;
- virtual ~_Impl_base() = default;
+ virtual ~_Impl_base();
};
+inline _Impl_base::~_Impl_base() = default;
+
template<typename _Tp>
class _Impl : public _Impl_base
{ };
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 0420fd4..be668b7 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,11 @@
+2010-02-10 Jason Merrill <jason@redhat.com>
+
+ Core issue 906
+ * include/std/thread (~_Impl_base): Move defaulted dtor out of line.
+ * libsupc++/nested_exception.h (~nested_exception): Likewise.
+ * testsuite/18_support/nested_exception/throw_with_nested.cc: Likewise.
+ * testsuite/18_support/nested_exception/rethrow_if_nested.cc: Likewise.
+
2010-02-10 Paolo Carlini <paolo.carlini@oracle.com>
* include/tr1/hashtable.h: Fold in include/tr1_impl/hashtable.h
diff --git a/libstdc++-v3/include/std/thread b/libstdc++-v3/include/std/thread
index 2d7a751..628c34a 100644
--- a/libstdc++-v3/include/std/thread
+++ b/libstdc++-v3/include/std/thread
@@ -97,7 +97,7 @@ namespace std
{
__shared_base_type _M_this_ptr;
- virtual ~_Impl_base() = default;
+ virtual ~_Impl_base();
virtual void _M_run() = 0;
};
@@ -193,6 +193,8 @@ namespace std
}
};
+ inline thread::_Impl_base::~_Impl_base() = default;
+
inline void
swap(thread& __x, thread& __y)
{ __x.swap(__y); }
diff --git a/libstdc++-v3/libsupc++/nested_exception.h b/libstdc++-v3/libsupc++/nested_exception.h
index 9b05484..713c334 100644
--- a/libstdc++-v3/libsupc++/nested_exception.h
+++ b/libstdc++-v3/libsupc++/nested_exception.h
@@ -63,7 +63,7 @@ namespace std
nested_exception& operator=(const nested_exception&) = default;
- virtual ~nested_exception() = default;
+ virtual ~nested_exception();
void
rethrow_nested() const __attribute__ ((__noreturn__))
@@ -74,6 +74,8 @@ namespace std
{ return _M_ptr; }
};
+ inline nested_exception::~nested_exception() = default;
+
template<typename _Except>
struct _Nested_exception : public _Except, public nested_exception
{
diff --git a/libstdc++-v3/testsuite/18_support/nested_exception/rethrow_if_nested.cc b/libstdc++-v3/testsuite/18_support/nested_exception/rethrow_if_nested.cc
index 37d1d80..ec8d172 100644
--- a/libstdc++-v3/testsuite/18_support/nested_exception/rethrow_if_nested.cc
+++ b/libstdc++-v3/testsuite/18_support/nested_exception/rethrow_if_nested.cc
@@ -23,7 +23,8 @@
struct derived : std::nested_exception { };
-struct base { virtual ~base() = default; };
+struct base { virtual ~base(); };
+inline base::~base() = default;
struct derived2 : base, std::nested_exception { };
diff --git a/libstdc++-v3/testsuite/18_support/nested_exception/throw_with_nested.cc b/libstdc++-v3/testsuite/18_support/nested_exception/throw_with_nested.cc
index 9ce31f0..c846d09 100644
--- a/libstdc++-v3/testsuite/18_support/nested_exception/throw_with_nested.cc
+++ b/libstdc++-v3/testsuite/18_support/nested_exception/throw_with_nested.cc
@@ -23,7 +23,8 @@
struct derived : std::nested_exception { };
-struct not_derived { virtual ~not_derived() = default; };
+struct not_derived { virtual ~not_derived(); };
+inline not_derived::~not_derived() = default;
void test01()
{