From: Jason Merrill Date: Wed, 10 Feb 2010 21:48:35 +0000 (-0500) Subject: PR c++/42983, core issue 906 X-Git-Tag: releases/gcc-4.5.0~823 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f1c3cf3c931a57f565ea7d4fe117875bc8701cd9;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fd637fbba104..11ec213bc8a6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +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 diff --git a/gcc/cp/method.c b/gcc/cp/method.c index cda7ed3b8634..ccc977d9df3c 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 c63c1ff73807..1ddd79182957 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 092b5605901b..b54cedb0bccb 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 f083479e21d0..1e5e2cbf9fbc 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 0420fd425f0c..be668b755875 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 2d7a75138343..628c34a7f98b 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 9b054840effc..713c33433e0a 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 37d1d80f8e89..ec8d172c400e 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 9ce31f06f035..c846d0944fbd 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() {