]>
Commit | Line | Data |
---|---|---|
6305f20a | 1 | // Exception Handling support header for -*- C++ -*- |
d34786e3 | 2 | |
818ab71a | 3 | // Copyright (C) 1995-2016 Free Software Foundation, Inc. |
e2c09482 | 4 | // |
cbecceb9 | 5 | // This file is part of GCC. |
6305f20a | 6 | // |
cbecceb9 | 7 | // GCC is free software; you can redistribute it and/or modify |
6305f20a | 8 | // it under the terms of the GNU General Public License as published by |
748086b7 | 9 | // the Free Software Foundation; either version 3, or (at your option) |
6305f20a | 10 | // any later version. |
4cdc8761 | 11 | // |
cbecceb9 | 12 | // GCC is distributed in the hope that it will be useful, |
6305f20a BK |
13 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | // GNU General Public License for more details. | |
4cdc8761 | 16 | // |
748086b7 JJ |
17 | // Under Section 7 of GPL version 3, you are granted additional |
18 | // permissions described in the GCC Runtime Library Exception, version | |
19 | // 3.1, as published by the Free Software Foundation. | |
20 | ||
21 | // You should have received a copy of the GNU General Public License and | |
22 | // a copy of the GCC Runtime Library Exception along with this program; | |
23 | // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |
24 | // <http://www.gnu.org/licenses/>. | |
6305f20a | 25 | |
669f7a03 | 26 | /** @file exception |
78a53887 | 27 | * This is a Standard C++ Library header. |
669f7a03 PE |
28 | */ |
29 | ||
6305f20a BK |
30 | #ifndef __EXCEPTION__ |
31 | #define __EXCEPTION__ | |
32 | ||
584fd146 PC |
33 | #pragma GCC system_header |
34 | ||
723acbd5 MM |
35 | #pragma GCC visibility push(default) |
36 | ||
3cbc7af0 | 37 | #include <bits/c++config.h> |
a152e96f | 38 | #include <bits/atomic_lockfree_defines.h> |
27abac26 | 39 | #include <bits/exception.h> |
3cbc7af0 | 40 | |
6305f20a BK |
41 | extern "C++" { |
42 | ||
4cdc8761 | 43 | namespace std |
d34786e3 | 44 | { |
669f7a03 PE |
45 | /** If an %exception is thrown which is not listed in a function's |
46 | * %exception specification, one of these may be thrown. */ | |
4cdc8761 | 47 | class bad_exception : public exception |
d34786e3 BK |
48 | { |
49 | public: | |
8535715d | 50 | bad_exception() _GLIBCXX_USE_NOEXCEPT { } |
949d9ae1 | 51 | |
e05cd3dd PC |
52 | // This declaration is not useless: |
53 | // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 | |
a04d5fc9 | 54 | virtual ~bad_exception() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT; |
949d9ae1 | 55 | |
c3f0f556 | 56 | // See comment in eh_exception.cc. |
a04d5fc9 TR |
57 | virtual const char* |
58 | what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT; | |
d34786e3 | 59 | }; |
6305f20a | 60 | |
669f7a03 | 61 | /// If you write a replacement %terminate handler, it must be of this type. |
d34786e3 | 62 | typedef void (*terminate_handler) (); |
949d9ae1 | 63 | |
669f7a03 | 64 | /// If you write a replacement %unexpected handler, it must be of this type. |
d34786e3 | 65 | typedef void (*unexpected_handler) (); |
6305f20a | 66 | |
669f7a03 | 67 | /// Takes a new handler function as an argument, returns the old function. |
8535715d | 68 | terminate_handler set_terminate(terminate_handler) _GLIBCXX_USE_NOEXCEPT; |
949d9ae1 | 69 | |
dca77a8a JW |
70 | #if __cplusplus >= 201103L |
71 | /// Return the current terminate handler. | |
72 | terminate_handler get_terminate() noexcept; | |
73 | #endif | |
74 | ||
669f7a03 | 75 | /** The runtime will call this function if %exception handling must be |
bad38757 | 76 | * abandoned for any reason. It can also be called by the user. */ |
8535715d | 77 | void terminate() _GLIBCXX_USE_NOEXCEPT __attribute__ ((__noreturn__)); |
6305f20a | 78 | |
669f7a03 | 79 | /// Takes a new handler function as an argument, returns the old function. |
8535715d | 80 | unexpected_handler set_unexpected(unexpected_handler) _GLIBCXX_USE_NOEXCEPT; |
949d9ae1 | 81 | |
dca77a8a JW |
82 | #if __cplusplus >= 201103L |
83 | /// Return the current unexpected handler. | |
84 | unexpected_handler get_unexpected() noexcept; | |
85 | #endif | |
86 | ||
669f7a03 PE |
87 | /** The runtime will call this function if an %exception is thrown which |
88 | * violates the function's %exception specification. */ | |
d34786e3 | 89 | void unexpected() __attribute__ ((__noreturn__)); |
6305f20a | 90 | |
8e32aa11 | 91 | /** [18.6.4]/1: 'Returns true after completing evaluation of a |
669f7a03 PE |
92 | * throw-expression until either completing initialization of the |
93 | * exception-declaration in the matching handler or entering @c unexpected() | |
94 | * due to the throw; or after entering @c terminate() for any reason | |
95 | * other than an explicit call to @c terminate(). [Note: This includes | |
8e32aa11 | 96 | * stack unwinding [15.2]. end note]' |
669f7a03 | 97 | * |
8e32aa11 BK |
98 | * 2: 'When @c uncaught_exception() is true, throwing an |
99 | * %exception can result in a call of @c terminate() | |
100 | * (15.5.1).' | |
669f7a03 | 101 | */ |
8535715d | 102 | bool uncaught_exception() _GLIBCXX_USE_NOEXCEPT __attribute__ ((__pure__)); |
30a333ce | 103 | |
196e0493 | 104 | #if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++98 |
03a16cc4 | 105 | #define __cpp_lib_uncaught_exceptions 201411 |
196e0493 | 106 | /// The number of uncaught exceptions. |
03a16cc4 VV |
107 | int uncaught_exceptions() _GLIBCXX_USE_NOEXCEPT __attribute__ ((__pure__)); |
108 | #endif | |
109 | ||
5b9daa7e | 110 | // @} group exceptions |
6305f20a BK |
111 | } // namespace std |
112 | ||
12ffa228 BK |
113 | namespace __gnu_cxx |
114 | { | |
115 | _GLIBCXX_BEGIN_NAMESPACE_VERSION | |
3cbc7af0 | 116 | |
4cdc8761 | 117 | /** |
5b9daa7e BK |
118 | * @brief A replacement for the standard terminate_handler which |
119 | * prints more information about the terminating exception (if any) | |
4cdc8761 | 120 | * on stderr. |
5b9daa7e BK |
121 | * |
122 | * @ingroup exceptions | |
123 | * | |
124 | * Call | |
125 | * @code | |
126 | * std::set_terminate(__gnu_cxx::__verbose_terminate_handler) | |
127 | * @endcode | |
128 | * to use. For more info, see | |
129 | * http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt02ch06s02.html | |
130 | * | |
131 | * In 3.4 and later, this is on by default. | |
132 | */ | |
133 | void __verbose_terminate_handler(); | |
3cbc7af0 | 134 | |
12ffa228 BK |
135 | _GLIBCXX_END_NAMESPACE_VERSION |
136 | } // namespace | |
4cdc8761 | 137 | |
6305f20a BK |
138 | } // extern "C++" |
139 | ||
723acbd5 MM |
140 | #pragma GCC visibility pop |
141 | ||
734f5023 | 142 | #if (__cplusplus >= 201103L) && (ATOMIC_INT_LOCK_FREE > 1) |
7c3e9502 BK |
143 | #include <bits/exception_ptr.h> |
144 | #include <bits/nested_exception.h> | |
30a333ce PC |
145 | #endif |
146 | ||
6305f20a | 147 | #endif |