1// Exception Handling support header for -*- C++ -*- 
2 
3// Copyright (C) 1995-2021 Free Software Foundation, Inc. 
4// 
5// This file is part of GCC. 
6// 
7// GCC is free software; you can redistribute it and/or modify 
8// it under the terms of the GNU General Public License as published by 
9// the Free Software Foundation; either version 3, or (at your option) 
10// any later version. 
11// 
12// GCC is distributed in the hope that it will be useful, 
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. 
16// 
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/>. 
25 
26/** @file exception 
27 * This is a Standard C++ Library header. 
28 */ 
29 
30#ifndef __EXCEPTION__ 
31#define __EXCEPTION__ 
32 
33#pragma GCC system_header 
34 
35#pragma GCC visibility push(default) 
36 
37#include <bits/c++config.h> 
38#include <bits/exception.h> 
39 
40extern "C++"
41 
42namespace std 
43
44 /** @addtogroup exceptions 
45 * @{ 
46 */ 
47 
48 /** If an %exception is thrown which is not listed in a function's 
49 * %exception specification, one of these may be thrown. 
50 * 
51 * @ingroup exceptions 
52 */ 
53 class bad_exception : public exception 
54
55 public
56 bad_exception() _GLIBCXX_USE_NOEXCEPT { } 
57 
58 // This declaration is not useless: 
59 // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 
60 virtual ~bad_exception() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT
61 
62 // See comment in eh_exception.cc. 
63 virtual const char
64 what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT
65 }; 
66 
67 /// If you write a replacement %terminate handler, it must be of this type. 
68 typedef void (*terminate_handler) (); 
69 
70 /// If you write a replacement %unexpected handler, it must be of this type. 
71 typedef void (*unexpected_handler) (); 
72 
73 /// Takes a new handler function as an argument, returns the old function. 
74 terminate_handler set_terminate(terminate_handler) _GLIBCXX_USE_NOEXCEPT
75 
76#if __cplusplus >= 201103L 
77 /// Return the current terminate handler. 
78 terminate_handler get_terminate() noexcept
79#endif 
80 
81 /** The runtime will call this function if %exception handling must be 
82 * abandoned for any reason. It can also be called by the user. */ 
83 void terminate() _GLIBCXX_USE_NOEXCEPT __attribute__ ((__noreturn__)); 
84 
85 /// Takes a new handler function as an argument, returns the old function. 
86 unexpected_handler set_unexpected(unexpected_handler) _GLIBCXX_USE_NOEXCEPT
87 
88#if __cplusplus >= 201103L 
89 /// Return the current unexpected handler. 
90 unexpected_handler get_unexpected() noexcept
91#endif 
92 
93 /** The runtime will call this function if an %exception is thrown which 
94 * violates the function's %exception specification. */ 
95 void unexpected() __attribute__ ((__noreturn__)); 
96 
97 /** [18.6.4]/1: 'Returns true after completing evaluation of a 
98 * throw-expression until either completing initialization of the 
99 * exception-declaration in the matching handler or entering `unexpected()` 
100 * due to the throw; or after entering `terminate()` for any reason 
101 * other than an explicit call to `terminate()`. [Note: This includes 
102 * stack unwinding [15.2]. end note]' 
103 * 
104 * 2: 'When `uncaught_exception()` is true, throwing an 
105 * %exception can result in a call of 1terminate()` 
106 * (15.5.1).' 
107 */ 
108 _GLIBCXX17_DEPRECATED_SUGGEST("std::uncaught_exceptions()"
109 bool uncaught_exception() _GLIBCXX_USE_NOEXCEPT __attribute__ ((__pure__)); 
110 
111#if __cplusplus >= 201703L || !defined(__STRICT_ANSI__) // c++17 or gnu++98 
112#define __cpp_lib_uncaught_exceptions 201411L 
113 /** The number of uncaught exceptions. 
114 * @since C++17, or any non-strict mode, e.g. `-std=gnu++98` 
115 * @see uncaught_exception() 
116 */ 
117 int uncaught_exceptions() _GLIBCXX_USE_NOEXCEPT __attribute__ ((__pure__)); 
118#endif 
119 
120 /// @} group exceptions 
121} // namespace std 
122 
123namespace __gnu_cxx 
124
125_GLIBCXX_BEGIN_NAMESPACE_VERSION 
126 
127 /** 
128 * @brief A replacement for the standard terminate_handler which 
129 * prints more information about the terminating exception (if any) 
130 * on stderr. 
131 * 
132 * @ingroup exceptions 
133 * 
134 * Call 
135 * @code 
136 * std::set_terminate(__gnu_cxx::__verbose_terminate_handler) 
137 * @endcode 
138 * to use. For more info, see 
139 * http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt02ch06s02.html 
140 * 
141 * In 3.4 and later, this is on by default. 
142 */ 
143 void __verbose_terminate_handler(); 
144 
145_GLIBCXX_END_NAMESPACE_VERSION 
146} // namespace 
147 
148} // extern "C++" 
149 
150#pragma GCC visibility pop 
151 
152#if (__cplusplus >= 201103L) 
153#include <bits/exception_ptr.h> 
154#include <bits/nested_exception.h> 
155#endif 
156 
157#endif 
158