]> gcc.gnu.org Git - gcc.git/commitdiff
libstdc++: Deprecate std::unexpected and handler functions
authorJonathan Wakely <jwakely@redhat.com>
Wed, 29 Sep 2021 20:18:42 +0000 (21:18 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Thu, 4 Nov 2021 20:53:29 +0000 (20:53 +0000)
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 <unwind-cxx.h> 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.

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.

25 files changed:
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C
gcc/testsuite/g++.dg/cpp0x/noexcept06.C
gcc/testsuite/g++.dg/cpp0x/noexcept07.C
gcc/testsuite/g++.dg/eh/forced3.C
gcc/testsuite/g++.dg/eh/unexpected1.C
gcc/testsuite/g++.old-deja/g++.eh/spec1.C
gcc/testsuite/g++.old-deja/g++.eh/spec2.C
gcc/testsuite/g++.old-deja/g++.eh/spec3.C
gcc/testsuite/g++.old-deja/g++.eh/spec4.C
gcc/testsuite/g++.old-deja/g++.mike/eh33.C
gcc/testsuite/g++.old-deja/g++.mike/eh34.C
gcc/testsuite/g++.old-deja/g++.mike/eh50.C
gcc/testsuite/g++.old-deja/g++.mike/eh51.C
libstdc++-v3/doc/html/manual/api.html
libstdc++-v3/doc/xml/manual/evolution.xml
libstdc++-v3/libsupc++/eh_personality.cc
libstdc++-v3/libsupc++/eh_ptr.cc
libstdc++-v3/libsupc++/eh_terminate.cc
libstdc++-v3/libsupc++/eh_throw.cc
libstdc++-v3/libsupc++/exception
libstdc++-v3/libsupc++/unwind-cxx.h
libstdc++-v3/testsuite/18_support/exception_ptr/60612-unexpected.cc
libstdc++-v3/testsuite/18_support/headers/exception/synopsis.cc
libstdc++-v3/testsuite/18_support/set_unexpected.cc
libstdc++-v3/testsuite/18_support/unexpected_handler.cc

index 3fb50df3f01e638966128a8280e524acf3ea9b01..eddd3c9dcc5e1e5ab4070659ec4444783a1afb62 100644 (file)
@@ -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" }
index ad9edec796b3108dbd2630a02ccffcfd91429897..ea152237d5450a95e96a6c4ac8c7c1765afa12ba 100644 (file)
@@ -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;
index de16e016ff412b885dcd918379860dc3b548f4a5..dbcc23e9610fd1b3f5c4d6f63c53c50ece507a8b 100644 (file)
@@ -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;
 }
index 9e92dafb08f96957dae33588cf5a1c6cb66da8f0..51cbc8de8ba13e06c76aa2fdd8719db6028aaee9 100644 (file)
@@ -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 ();
 }
index cd5585face8f05eaa3150e10c7ceea8c8dd22c10..973ebeacd033e11457ce88d97f95e46f74f937e2 100644 (file)
@@ -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
   {
index ea32045117903be512a53f84848b83451c8b6cd2..3c832fd2105123b350e9933e5ed486a514a3cb82 100644 (file)
@@ -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
     {
index d1aa6984f9f7c3f0767ca7d107b4c5aef28d3c5e..2f7556be44dd3bc71d3309caf01dbd8f130c4d33 100644 (file)
@@ -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
     {
index 1d57df3c335f7ba713903225f066af41b4f1672a..278de2ef9f4aff3f5abe08553723199e8d5d590e 100644 (file)
@@ -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
     {
index e102239ed89dd37baef7d928c6afc809a43b6bd2..d5d48968ff9fbf505d40403f41ec6551798f2830 100644 (file)
@@ -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
     {
index cffb0c48cda0e2a4905283fea35c7a6c05007f73..8d50f73a47584bea2b31fe361295aa2fe819ff4f 100644 (file)
@@ -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) {
index 3218dd9ef3ed333aa88d6dbb5421702537c7b5b2..36512ae6ab24c9e89f0dc54dcb82ed36b308be03 100644 (file)
@@ -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;
 }
index 028a2de0c238f4c17a6aed78b8cbbfed67fcbbbd..2507cf2e48cf2d663b1265f51bd6046bed8e9161 100644 (file)
@@ -12,7 +12,7 @@ template <class T> 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) {
index 428635b175d3ade4a7ca8c32c8e9fc34b381b963..d1902f08106bd1fe6047e0a7a8308c262d89a966 100644 (file)
@@ -12,7 +12,7 @@ template <class T> 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) {
index 376a4035fa6797073d482045536c6ff300a37f0d..32810788bf22012b25a1f1e057e88cb74972b199 100644 (file)
@@ -440,4 +440,8 @@ now defaults to zero.
 The <code class="function">std::random_shuffle</code> algorithms are deprecated
 for C++14 and later. The C++11 <code class="function">std::shuffle</code> algorithm
 can be used instead.
+</p><p>
+The <code class="function">std::unexpected</code> function and related typedef and
+accessors for the unexpected handler are deprecated for C++11 and later.
+Dynamic exception specifications should be replaced with <code class="code">noexcept</code>.
 </p></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="abi.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="appendix_porting.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="backwards.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">ABI Policy and Guidelines </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Backwards Compatibility</td></tr></table></div></body></html>
\ No newline at end of file
index 59b71b04442b124bf7f690f061e281f4e4233fd6..9aef84a09334a1812bcdff562531ac1be043fcf8 100644 (file)
@@ -1027,6 +1027,12 @@ for C++14 and later. The C++11 <function>std::shuffle</function> algorithm
 can be used instead.
 </para>
 
+<para>
+The <function>std::unexpected</function> function and related typedef and
+accessors for the unexpected handler are deprecated for C++11 and later.
+Dynamic exception specifications should be replaced with <code>noexcept</code>.
+</para>
+
 </section>
 
 </section>
index 33c3cc32fb53214e2f70e124f232d68ee332c257..edd5f6a1a775cff6047bf8dd6cf83fd3f8bb6b3e 100644 (file)
@@ -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
index 5c4685606fedbacef30c4c5662e028ba52b2ea8f..9f47b66634156cc28e2e2799af79550ab09101a8 100644 (file)
@@ -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;
index af257b63369f885daf0e591e8d329c947e4cf4bc..a94f173bb2e4fbdaaaebd9b4031be4b7c1ae2698 100644 (file)
@@ -58,6 +58,7 @@ std::terminate () throw()
   __cxxabiv1::__terminate (get_terminate ());
 }
 
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 void
 __cxxabiv1::__unexpected (std::unexpected_handler handler)
 {
index 765a6c18ccab351788fc95f344de8ef6e3647a48..51cbbc902c2ed69c58fb12d0494cc326681f1d3f 100644 (file)
@@ -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;
index a023e22ea89f39b82afa8cf0a2552d6a878d0805..5088681e1eb2a038a89b2529a07f41c64aff9cc3 100644 (file)
@@ -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
index 65fd5303b2b175a4eb095b22ab927ddda5c96de4..96d50eae412227233709ecb9d6c4da1c8fefdb5f 100644 (file)
@@ -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.
 
index 600ccb5698f5f3329a1aaff15aa3a174ca596ec6..18bd1fe4f0dc8b5dac4ff10ec7fd6123d743c404 100644 (file)
@@ -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.
index 2f0bae4be0ae21664ad9a9d0810ecfa025b04fd1..de35ec4c0e09a9b15c153169e89c1cdf7a74c94f 100644 (file)
@@ -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();
 
index 3f38431626d7a8f94e9330a7497dd202ff240e16..6cedc7d6cd142e4c72ab0c35adaa5c713cb124fa 100644 (file)
@@ -15,7 +15,7 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-// { dg-options "-std=gnu++11" }
+// { dg-options "-std=gnu++11 -Wno-deprecated-declarations" }
 // { dg-do run { target { c++11_only || c++14_only } } }
 
 #include <exception>
index 509bb5c31cd8f326153c3e4202a9698ef8a175dc..551b0e7f371a11ad7dc7698c1c94e47550e44ec5 100644 (file)
@@ -15,6 +15,7 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
+// { dg-options "-Wno-deprecated-declarations" }
 // { dg-do run { target c++11 } }
 
 // D.11 Violating exception-specifications
This page took 0.100892 seconds and 5 git commands to generate.