From patchwork Wed Nov 3 00:18:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 46975 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 433E2385840D for ; Wed, 3 Nov 2021 00:21:17 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 433E2385840D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1635898877; bh=gbv2z9AVRK0L5CtauSvCEjzV9YGUbtdh7yAzNdjGb44=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=IF6HGipSpXeezhksq+vWHsQM5VlkGzMUOg/1FFuTtBB2JUtkNBUQuJsGkrlZhxix2 mEbQJAlHkmaHPqZ8dYMIr7RXxTX2l7kEdLXDKKjCJAzMYxh/9FaSERfps1Sr98noqD dttErd6fUkndQa9s4fKqguDJCqjJq8AGo3DrDVXk= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 11D69385842B for ; Wed, 3 Nov 2021 00:18:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 11D69385842B Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-123-gXxdRF80OmKBFdN6-aQm9g-1; Tue, 02 Nov 2021 20:18:55 -0400 X-MC-Unique: gXxdRF80OmKBFdN6-aQm9g-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 979271006AA2; Wed, 3 Nov 2021 00:18:54 +0000 (UTC) Received: from localhost (unknown [10.33.36.17]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2189B57CAB; Wed, 3 Nov 2021 00:18:53 +0000 (UTC) To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [PATCH] libstdc++: Deprecate std::unexpected and handler functions Date: Wed, 3 Nov 2021 00:18:53 +0000 Message-Id: <20211103001853.1604387-1-jwakely@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-14.1 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=unavailable autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jonathan Wakely via Gcc-patches From: Jonathan Wakely Reply-To: Jonathan Wakely Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" These functions have been deprecated since C++11, and were removed in C++17. The proposal P0323 wants to reuse the name std::unexpected for a class template, so we will need to stop defining the current function for C++23 anyway. This marks them as deprecated for C++11 and up, to warn users they won't continue to be available. It disables them for C++17 and up, unless the _GLIBCXX_USE_DEPRECATED macro is defined. The header uses std::unexpected_handler in the public API, but since that type is the same as std::terminate_handler we can just use that instead, to avoid warnings about it being deprecated. Tested x86_64-linux. Are the changes to g++ tests OK for trunk? libstdc++-v3/ChangeLog: * doc/xml/manual/evolution.xml: Document deprecations. * doc/html/*: Regenerate. * libsupc++/exception (unexpected_handler, unexpected) (get_unexpected, set_unexpected): Add deprecated attribute. Do not define without _GLIBCXX_USE_DEPRECATED for C++17 and up. * libsupc++/eh_personality.cc (PERSONALITY_FUNCTION): Disable deprecated warnings. * libsupc++/eh_ptr.cc (std::rethrow_exception): Likewise. * libsupc++/eh_terminate.cc: Likewise. * libsupc++/eh_throw.cc (__cxa_init_primary_exception): Likewise. * libsupc++/unwind-cxx.h (struct __cxa_exception): Use terminate_handler instead of unexpected_handler. (struct __cxa_dependent_exception): Likewise. (__unexpected): Likewise. * testsuite/18_support/headers/exception/synopsis.cc: Add dg-warning for deprecated warning. * testsuite/18_support/exception_ptr/60612-unexpected.cc: Disable deprecated warnings. * testsuite/18_support/set_unexpected.cc: Likewise. * testsuite/18_support/unexpected_handler.cc: Likewise. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/lambda/lambda-eh2.C: Add dg-warning for new deprecation warnings. * g++.dg/cpp0x/noexcept06.C: Likewise. * g++.dg/cpp0x/noexcept07.C: Likewise. * g++.dg/eh/forced3.C: Likewise. * g++.dg/eh/unexpected1.C: Likewise. * g++.old-deja/g++.eh/spec1.C: Likewise. * g++.old-deja/g++.eh/spec2.C: Likewise. * g++.old-deja/g++.eh/spec3.C: Likewise. * g++.old-deja/g++.eh/spec4.C: Likewise. * g++.old-deja/g++.mike/eh33.C: Likewise. * g++.old-deja/g++.mike/eh34.C: Likewise. * g++.old-deja/g++.mike/eh50.C: Likewise. * g++.old-deja/g++.mike/eh51.C: Likewise. --- .../g++.dg/cpp0x/lambda/lambda-eh2.C | 2 +- gcc/testsuite/g++.dg/cpp0x/noexcept06.C | 2 +- gcc/testsuite/g++.dg/cpp0x/noexcept07.C | 2 +- gcc/testsuite/g++.dg/eh/forced3.C | 2 +- gcc/testsuite/g++.dg/eh/unexpected1.C | 2 +- gcc/testsuite/g++.old-deja/g++.eh/spec1.C | 2 +- gcc/testsuite/g++.old-deja/g++.eh/spec2.C | 2 +- gcc/testsuite/g++.old-deja/g++.eh/spec3.C | 2 +- gcc/testsuite/g++.old-deja/g++.eh/spec4.C | 2 +- gcc/testsuite/g++.old-deja/g++.mike/eh33.C | 2 +- gcc/testsuite/g++.old-deja/g++.mike/eh34.C | 2 +- gcc/testsuite/g++.old-deja/g++.mike/eh50.C | 2 +- gcc/testsuite/g++.old-deja/g++.mike/eh51.C | 2 +- libstdc++-v3/doc/html/manual/api.html | 4 +++ libstdc++-v3/doc/xml/manual/evolution.xml | 6 +++++ libstdc++-v3/libsupc++/eh_personality.cc | 9 ++++--- libstdc++-v3/libsupc++/eh_ptr.cc | 3 +++ libstdc++-v3/libsupc++/eh_terminate.cc | 1 + libstdc++-v3/libsupc++/eh_throw.cc | 3 +++ libstdc++-v3/libsupc++/exception | 27 ++++++++++++++----- libstdc++-v3/libsupc++/unwind-cxx.h | 8 +++--- .../exception_ptr/60612-unexpected.cc | 1 + .../18_support/headers/exception/synopsis.cc | 2 +- .../testsuite/18_support/set_unexpected.cc | 2 +- .../18_support/unexpected_handler.cc | 1 + 25 files changed, 65 insertions(+), 28 deletions(-) diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C index 3fb50df3f01..eddd3c9dcc5 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C @@ -7,7 +7,7 @@ int main( void ) { - std::set_unexpected( []{ throw 0; } ); + std::set_unexpected( []{ throw 0; } ); // { dg-warning "deprecated" } try { []() throw( int ) { throw nullptr; }(); // { dg-warning "deprecated" } diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept06.C b/gcc/testsuite/g++.dg/cpp0x/noexcept06.C index ad9edec796b..ea152237d54 100644 --- a/gcc/testsuite/g++.dg/cpp0x/noexcept06.C +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept06.C @@ -23,7 +23,7 @@ void f() noexcept int main() { - std::set_unexpected (my_unexpected); + std::set_unexpected (my_unexpected); // { dg-warning "deprecated" } std::set_terminate (my_terminate); f(); return 1; diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept07.C b/gcc/testsuite/g++.dg/cpp0x/noexcept07.C index de16e016ff4..dbcc23e9610 100644 --- a/gcc/testsuite/g++.dg/cpp0x/noexcept07.C +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept07.C @@ -18,7 +18,7 @@ void f() throw() int main() { - std::set_unexpected (my_unexpected); + std::set_unexpected (my_unexpected); // { dg-warning "deprecated" } f(); return 1; } diff --git a/gcc/testsuite/g++.dg/eh/forced3.C b/gcc/testsuite/g++.dg/eh/forced3.C index 9e92dafb08f..51cbc8de8ba 100644 --- a/gcc/testsuite/g++.dg/eh/forced3.C +++ b/gcc/testsuite/g++.dg/eh/forced3.C @@ -53,7 +53,7 @@ doit () throw() int main() { - std::set_unexpected (handle_unexpected); + std::set_unexpected (handle_unexpected); // { dg-warning "deprecated" "" { target c++11 } } doit (); abort (); } diff --git a/gcc/testsuite/g++.dg/eh/unexpected1.C b/gcc/testsuite/g++.dg/eh/unexpected1.C index cd5585face8..973ebeacd03 100644 --- a/gcc/testsuite/g++.dg/eh/unexpected1.C +++ b/gcc/testsuite/g++.dg/eh/unexpected1.C @@ -30,7 +30,7 @@ doit () throw (Two) // { dg-warning "deprecated" "" { target { c++11 } } } int main () { - std::set_unexpected (handle_unexpected); + std::set_unexpected (handle_unexpected); // { dg-warning "deprecated" "" { target { c++11 } } } try { diff --git a/gcc/testsuite/g++.old-deja/g++.eh/spec1.C b/gcc/testsuite/g++.old-deja/g++.eh/spec1.C index ea320451179..3c832fd2105 100644 --- a/gcc/testsuite/g++.old-deja/g++.eh/spec1.C +++ b/gcc/testsuite/g++.old-deja/g++.eh/spec1.C @@ -17,7 +17,7 @@ f () throw (char, int, std::bad_exception) // { dg-warning "deprecated" "" { tar int main () { std::set_terminate (my_term); - std::set_unexpected (my_unexp); + std::set_unexpected (my_unexp); // { dg-warning "deprecated" "" { target c++11 } } try { diff --git a/gcc/testsuite/g++.old-deja/g++.eh/spec2.C b/gcc/testsuite/g++.old-deja/g++.eh/spec2.C index d1aa6984f9f..2f7556be44d 100644 --- a/gcc/testsuite/g++.old-deja/g++.eh/spec2.C +++ b/gcc/testsuite/g++.old-deja/g++.eh/spec2.C @@ -17,7 +17,7 @@ f () throw (int, std::bad_exception) // { dg-warning "deprecated" "" { target c+ int main () { std::set_terminate (my_term); - std::set_unexpected (my_unexp); + std::set_unexpected (my_unexp); // { dg-warning "deprecated" "" { target c++11 } } try { diff --git a/gcc/testsuite/g++.old-deja/g++.eh/spec3.C b/gcc/testsuite/g++.old-deja/g++.eh/spec3.C index 1d57df3c335..278de2ef9f4 100644 --- a/gcc/testsuite/g++.old-deja/g++.eh/spec3.C +++ b/gcc/testsuite/g++.old-deja/g++.eh/spec3.C @@ -17,7 +17,7 @@ f () throw (std::bad_exception) // { dg-warning "deprecated" "" { target c++11 int main () { std::set_terminate (my_term); - std::set_unexpected (my_unexp); + std::set_unexpected (my_unexp); // { dg-warning "deprecated" "" { target c++11 } } try { diff --git a/gcc/testsuite/g++.old-deja/g++.eh/spec4.C b/gcc/testsuite/g++.old-deja/g++.eh/spec4.C index e102239ed89..d5d48968ff9 100644 --- a/gcc/testsuite/g++.old-deja/g++.eh/spec4.C +++ b/gcc/testsuite/g++.old-deja/g++.eh/spec4.C @@ -17,7 +17,7 @@ f () throw (short) // { dg-warning "deprecated" "" { target c++11 } } int main () { std::set_terminate (my_term); - std::set_unexpected (my_unexp); + std::set_unexpected (my_unexp); // { dg-warning "deprecated" "" { target c++11 } } try { diff --git a/gcc/testsuite/g++.old-deja/g++.mike/eh33.C b/gcc/testsuite/g++.old-deja/g++.mike/eh33.C index cffb0c48cda..8d50f73a475 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/eh33.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/eh33.C @@ -11,7 +11,7 @@ void my_unexpected() { void foo() throw (int) { throw "Hi"; } // { dg-warning "deprecated" "" { target c++11 } } int main() { - std::set_unexpected (my_unexpected); + std::set_unexpected (my_unexpected); // { dg-warning "deprecated" "" { target c++11 } } try { foo(); } catch (int i) { diff --git a/gcc/testsuite/g++.old-deja/g++.mike/eh34.C b/gcc/testsuite/g++.old-deja/g++.mike/eh34.C index 3218dd9ef3e..36512ae6ab2 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/eh34.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/eh34.C @@ -11,7 +11,7 @@ void my_unexpected() { void foo() throw () { throw "Hi"; } int main() { - std::set_unexpected (my_unexpected); + std::set_unexpected (my_unexpected); // { dg-warning "deprecated" "" { target c++11 } } foo(); return 1; } diff --git a/gcc/testsuite/g++.old-deja/g++.mike/eh50.C b/gcc/testsuite/g++.old-deja/g++.mike/eh50.C index 028a2de0c23..2507cf2e48c 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/eh50.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/eh50.C @@ -12,7 +12,7 @@ template void foo(T) throw (int) { throw "Hi"; } // { dg-warning "depr int main() { - std::set_unexpected (my_unexpected); + std::set_unexpected (my_unexpected); // { dg-warning "deprecated" "" { target c++11 } } try { foo(1); } catch (int i) { diff --git a/gcc/testsuite/g++.old-deja/g++.mike/eh51.C b/gcc/testsuite/g++.old-deja/g++.mike/eh51.C index 428635b175d..d1902f08106 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/eh51.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/eh51.C @@ -12,7 +12,7 @@ template void foo(T) throw (T) { throw "Hi"; } // { dg-warning "deprec int main() { - std::set_unexpected (my_unexpected); + std::set_unexpected (my_unexpected); // { dg-warning "deprecated" "" { target c++11 } } try { foo(1); } catch (int i) { diff --git a/libstdc++-v3/doc/html/manual/api.html b/libstdc++-v3/doc/html/manual/api.html index 376a4035fa6..32810788bf2 100644 --- a/libstdc++-v3/doc/html/manual/api.html +++ b/libstdc++-v3/doc/html/manual/api.html @@ -440,4 +440,8 @@ now defaults to zero. The std::random_shuffle algorithms are deprecated for C++14 and later. The C++11 std::shuffle algorithm can be used instead. +

+The std::unexpected function and related typedef and +accessors for the unexpected handler are deprecated for C++11 and later. +Dynamic exception specifications should be replaced with noexcept.

\ No newline at end of file diff --git a/libstdc++-v3/doc/xml/manual/evolution.xml b/libstdc++-v3/doc/xml/manual/evolution.xml index 59b71b04442..9aef84a0933 100644 --- a/libstdc++-v3/doc/xml/manual/evolution.xml +++ b/libstdc++-v3/doc/xml/manual/evolution.xml @@ -1027,6 +1027,12 @@ for C++14 and later. The C++11 std::shuffle algorithm can be used instead. + +The std::unexpected function and related typedef and +accessors for the unexpected handler are deprecated for C++11 and later. +Dynamic exception specifications should be replaced with noexcept. + + diff --git a/libstdc++-v3/libsupc++/eh_personality.cc b/libstdc++-v3/libsupc++/eh_personality.cc index 33c3cc32fb5..edd5f6a1a77 100644 --- a/libstdc++-v3/libsupc++/eh_personality.cc +++ b/libstdc++-v3/libsupc++/eh_personality.cc @@ -673,10 +673,13 @@ PERSONALITY_FUNCTION (int version, std::terminate (); else if (handler_switch_value < 0) { - __try - { std::unexpected (); } - __catch(...) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + __try + { std::unexpected (); } + __catch(...) { std::terminate (); } +#pragma GCC diagnostic pop } } else diff --git a/libstdc++-v3/libsupc++/eh_ptr.cc b/libstdc++-v3/libsupc++/eh_ptr.cc index 5c4685606fe..9f47b666341 100644 --- a/libstdc++-v3/libsupc++/eh_ptr.cc +++ b/libstdc++-v3/libsupc++/eh_ptr.cc @@ -198,7 +198,10 @@ std::rethrow_exception(std::exception_ptr ep) dep->primaryException = obj; __gnu_cxx::__eh_atomic_inc (&eh->referenceCount); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" dep->unexpectedHandler = get_unexpected (); +#pragma GCC diagnostic pop dep->terminateHandler = get_terminate (); __GXX_INIT_DEPENDENT_EXCEPTION_CLASS(dep->unwindHeader.exception_class); dep->unwindHeader.exception_cleanup = __gxx_dependent_exception_cleanup; diff --git a/libstdc++-v3/libsupc++/eh_terminate.cc b/libstdc++-v3/libsupc++/eh_terminate.cc index af257b63369..a94f173bb2e 100644 --- a/libstdc++-v3/libsupc++/eh_terminate.cc +++ b/libstdc++-v3/libsupc++/eh_terminate.cc @@ -58,6 +58,7 @@ std::terminate () throw() __cxxabiv1::__terminate (get_terminate ()); } +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" void __cxxabiv1::__unexpected (std::unexpected_handler handler) { diff --git a/libstdc++-v3/libsupc++/eh_throw.cc b/libstdc++-v3/libsupc++/eh_throw.cc index 765a6c18cca..51cbbc902c2 100644 --- a/libstdc++-v3/libsupc++/eh_throw.cc +++ b/libstdc++-v3/libsupc++/eh_throw.cc @@ -63,7 +63,10 @@ _GLIBCXX_NOTHROW header->referenceCount = 0; header->exc.exceptionType = tinfo; header->exc.exceptionDestructor = dest; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" header->exc.unexpectedHandler = std::get_unexpected (); +#pragma GCC diagnostic pop header->exc.terminateHandler = std::get_terminate (); __GXX_INIT_PRIMARY_EXCEPTION_CLASS(header->exc.unwindHeader.exception_class); header->exc.unwindHeader.exception_cleanup = __gxx_exception_cleanup; diff --git a/libstdc++-v3/libsupc++/exception b/libstdc++-v3/libsupc++/exception index a023e22ea89..5088681e1eb 100644 --- a/libstdc++-v3/libsupc++/exception +++ b/libstdc++-v3/libsupc++/exception @@ -67,9 +67,6 @@ namespace std /// If you write a replacement %terminate handler, it must be of this type. typedef void (*terminate_handler) (); - /// If you write a replacement %unexpected handler, it must be of this type. - typedef void (*unexpected_handler) (); - /// Takes a new handler function as an argument, returns the old function. terminate_handler set_terminate(terminate_handler) _GLIBCXX_USE_NOEXCEPT; @@ -82,17 +79,35 @@ namespace std * abandoned for any reason. It can also be called by the user. */ void terminate() _GLIBCXX_USE_NOEXCEPT __attribute__ ((__noreturn__)); - /// Takes a new handler function as an argument, returns the old function. +#if __cplusplus < 201703L || _GLIBCXX_USE_DEPRECATED + /// If you write a replacement %unexpected handler, it must be of this type. + typedef void (*_GLIBCXX11_DEPRECATED unexpected_handler) (); + + /** Takes a new handler function as an argument, returns the old function. + * + * @deprecated Removed from the C++ standard in C++17 + */ + _GLIBCXX11_DEPRECATED unexpected_handler set_unexpected(unexpected_handler) _GLIBCXX_USE_NOEXCEPT; #if __cplusplus >= 201103L - /// Return the current unexpected handler. + /** Return the current unexpected handler. + * + * @since C++11 + * @deprecated Removed from the C++ standard in C++17 + */ + _GLIBCXX11_DEPRECATED unexpected_handler get_unexpected() noexcept; #endif /** The runtime will call this function if an %exception is thrown which - * violates the function's %exception specification. */ + * violates the function's %exception specification. + * + * @deprecated Removed from the C++ standard in C++17 + */ + _GLIBCXX11_DEPRECATED void unexpected() __attribute__ ((__noreturn__)); +#endif /** [18.6.4]/1: 'Returns true after completing evaluation of a * throw-expression until either completing initialization of the diff --git a/libstdc++-v3/libsupc++/unwind-cxx.h b/libstdc++-v3/libsupc++/unwind-cxx.h index 65fd5303b2b..96d50eae412 100644 --- a/libstdc++-v3/libsupc++/unwind-cxx.h +++ b/libstdc++-v3/libsupc++/unwind-cxx.h @@ -67,7 +67,7 @@ struct __cxa_exception // The C++ standard has entertaining rules wrt calling set_terminate // and set_unexpected in the middle of the exception cleanup process. - std::unexpected_handler unexpectedHandler; + std::terminate_handler unexpectedHandler; std::terminate_handler terminateHandler; // The caught exception stack threads through here. @@ -121,7 +121,7 @@ struct __cxa_dependent_exception // The C++ standard has entertaining rules wrt calling set_terminate // and set_unexpected in the middle of the exception cleanup process. - std::unexpected_handler unexpectedHandler; + std::terminate_handler unexpectedHandler; std::terminate_handler terminateHandler; // The caught exception stack threads through here. @@ -191,12 +191,12 @@ extern "C" void __cxa_tm_cleanup (void *, void *, unsigned int) throw(); // so inconsiderate as to return. extern void __terminate(std::terminate_handler) throw () __attribute__((__noreturn__)); -extern void __unexpected(std::unexpected_handler) +extern void __unexpected(std::terminate_handler) __attribute__((__noreturn__)); // The current installed user handlers. extern std::terminate_handler __terminate_handler; -extern std::unexpected_handler __unexpected_handler; +extern std::terminate_handler __unexpected_handler; // These are explicitly GNU C++ specific. diff --git a/libstdc++-v3/testsuite/18_support/exception_ptr/60612-unexpected.cc b/libstdc++-v3/testsuite/18_support/exception_ptr/60612-unexpected.cc index 600ccb5698f..18bd1fe4f0d 100644 --- a/libstdc++-v3/testsuite/18_support/exception_ptr/60612-unexpected.cc +++ b/libstdc++-v3/testsuite/18_support/exception_ptr/60612-unexpected.cc @@ -1,3 +1,4 @@ +// { dg-options "-Wno-deprecated-declarations" } // { dg-do run { target { c++11_only || c++14_only } } } // Copyright (C) 2014-2021 Free Software Foundation, Inc. diff --git a/libstdc++-v3/testsuite/18_support/headers/exception/synopsis.cc b/libstdc++-v3/testsuite/18_support/headers/exception/synopsis.cc index 2f0bae4be0a..de35ec4c0e0 100644 --- a/libstdc++-v3/testsuite/18_support/headers/exception/synopsis.cc +++ b/libstdc++-v3/testsuite/18_support/headers/exception/synopsis.cc @@ -24,7 +24,7 @@ namespace std { class bad_exception; typedef void (*unexpected_handler)(); - unexpected_handler set_unexpected(unexpected_handler f ) throw(); + unexpected_handler set_unexpected(unexpected_handler f ) throw(); // { dg-warning "deprecated" { target c++11 } } unexpected_handler get_unexpected() noexcept; void unexpected(); diff --git a/libstdc++-v3/testsuite/18_support/set_unexpected.cc b/libstdc++-v3/testsuite/18_support/set_unexpected.cc index 3f38431626d..6cedc7d6cd1 100644 --- a/libstdc++-v3/testsuite/18_support/set_unexpected.cc +++ b/libstdc++-v3/testsuite/18_support/set_unexpected.cc @@ -15,7 +15,7 @@ // with this library; see the file COPYING3. If not see // . -// { dg-options "-std=gnu++11" } +// { dg-options "-std=gnu++11 -Wno-deprecated-declarations" } // { dg-do run { target { c++11_only || c++14_only } } } #include diff --git a/libstdc++-v3/testsuite/18_support/unexpected_handler.cc b/libstdc++-v3/testsuite/18_support/unexpected_handler.cc index 509bb5c31cd..551b0e7f371 100644 --- a/libstdc++-v3/testsuite/18_support/unexpected_handler.cc +++ b/libstdc++-v3/testsuite/18_support/unexpected_handler.cc @@ -15,6 +15,7 @@ // with this library; see the file COPYING3. If not see // . +// { dg-options "-Wno-deprecated-declarations" } // { dg-do run { target c++11 } } // D.11 Violating exception-specifications