From 411bea5e69a5569ff38a89656aac05df2eded7f4 Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 10 Feb 2010 21:48:35 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@156672 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/method.c | 3 +++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/cpp0x/defaulted15.C | 5 +++++ gcc/testsuite/g++.dg/cpp0x/defaulted9.C | 4 +++- libstdc++-v3/ChangeLog | 8 ++++++++ libstdc++-v3/include/std/thread | 4 +++- libstdc++-v3/libsupc++/nested_exception.h | 4 +++- .../testsuite/18_support/nested_exception/rethrow_if_nested.cc | 3 ++- .../testsuite/18_support/nested_exception/throw_with_nested.cc | 3 ++- 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 + PR c++/42983, core issue 906 + * method.c (defaultable_fn_check): Check virtualness. + +2010-02-10 Jason Merrill + 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 + 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 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 + + 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 * 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 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() { -- 2.7.4