1 // Exception Handling support header (exception_ptr class) for -*- C++ -*- 2 3 // Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation 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 bits/exception_ptr.h 27 * This is an internal header file, included by other library headers. 28 * Do not attempt to use it directly. @headername{exception} 29 */ 30 31 #ifndef _EXCEPTION_PTR_H 32 #define _EXCEPTION_PTR_H 33 34 #pragma GCC visibility push(default) 35 36 #include <bits/c++config.h> 37 #include <bits/exception_defines.h> 38 39 #if !defined(_GLIBCXX_ATOMIC_BUILTINS_4) 40 # error This platform does not support exception propagation. 41 #endif 42 43 extern "C++" { 44 45 namespace std 46 { 47 /** 48 * @addtogroup exceptions 49 * @{ 50 */ 51 namespace __exception_ptr 52 { 53 class exception_ptr; 54 } 55 56 using __exception_ptr::exception_ptr; 57 58 /** Obtain an exception_ptr to the currently handled exception. If there 59 * is none, or the currently handled exception is foreign, return the null 60 * value. 61 */ 62 exception_ptr current_exception() throw(); 63 64 /// Throw the object pointed to by the exception_ptr. 65 void rethrow_exception(exception_ptr) __attribute__ ((__noreturn__)); 66 67 namespace __exception_ptr 68 { 69 /** 70 * @brief An opaque pointer to an arbitrary exception. 71 * @ingroup exceptions 72 */ 73 class exception_ptr 74 { 75 void* _M_exception_object; 76 77 explicit exception_ptr(void* __e) throw(); 78 79 void _M_addref() throw(); 80 void _M_release() throw(); 81 82 void *_M_get() const throw() __attribute__ ((__pure__)); 83 84 friend exception_ptr std::current_exception() throw(); 85 friend void std::rethrow_exception(exception_ptr); 86 87 public: 88 exception_ptr() throw(); 89 90 exception_ptr(const exception_ptr&) throw(); 91 92 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 93 exception_ptr(nullptr_t) throw() 94 : _M_exception_object(0) 95 { } 96 97 exception_ptr(exception_ptr&& __o) throw() 98 : _M_exception_object(__o._M_exception_object) 99 { __o._M_exception_object = 0; } 100 #else 101 typedef void (exception_ptr::*__safe_bool)(); 102 103 // For construction from nullptr or 0. 104 exception_ptr(__safe_bool) throw(); 105 #endif 106 107 exception_ptr& 108 operator=(const exception_ptr&) throw(); 109 110 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 111 exception_ptr& 112 operator=(exception_ptr&& __o) throw() 113 { 114 exception_ptr(static_cast<exception_ptr&&>(__o)).swap(*this); 115 return *this; 116 } 117 #endif 118 119 ~exception_ptr() throw(); 120 121 void 122 swap(exception_ptr&) throw(); 123 124 #ifdef _GLIBCXX_EH_PTR_COMPAT 125 // Retained for compatibility with CXXABI_1.3. 126 void _M_safe_bool_dummy() throw() __attribute__ ((__const__)); 127 bool operator!() const throw() __attribute__ ((__pure__)); 128 operator __safe_bool() const throw(); 129 #endif 130 131 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 132 explicit operator bool() const 133 { return _M_exception_object; } 134 #endif 135 136 friend bool 137 operator==(const exception_ptr&, const exception_ptr&) throw() 138 __attribute__ ((__pure__)); 139 140 const class type_info* 141 __cxa_exception_type() const throw() __attribute__ ((__pure__)); 142 }; 143 144 bool 145 operator==(const exception_ptr&, const exception_ptr&) throw() 146 __attribute__ ((__pure__)); 147 148 bool 149 operator!=(const exception_ptr&, const exception_ptr&) throw() 150 __attribute__ ((__pure__)); 151 152 inline void 153 swap(exception_ptr& __lhs, exception_ptr& __rhs) 154 { __lhs.swap(__rhs); } 155 156 } // namespace __exception_ptr 157 158 159 /// Obtain an exception_ptr pointing to a copy of the supplied object. 160 template<typename _Ex> 161 exception_ptr 162 copy_exception(_Ex __ex) throw() 163 { 164 __try 165 { 166 #ifdef __EXCEPTIONS 167 throw __ex; 168 #endif 169 } 170 __catch(...) 171 { 172 return current_exception(); 173 } 174 } 175 176 // _GLIBCXX_RESOLVE_LIB_DEFECTS 177 // 1130. copy_exception name misleading 178 /// Obtain an exception_ptr pointing to a copy of the supplied object. 179 template<typename _Ex> 180 exception_ptr 181 make_exception_ptr(_Ex __ex) throw() 182 { return std::copy_exception<_Ex>(__ex); } 183 184 // @} group exceptions 185 } // namespace std 186 187 } // extern "C++" 188 189 #pragma GCC visibility pop 190 191 #endif 192