1 // Exception Handling support header (exception_ptr class) for -*- C++ -*-
3 // Copyright (C) 2008 Free Software Foundation
5 // This file is part of GCC.
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 2, or (at your option)
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.
17 // You should have received a copy of the GNU General Public License
18 // along with GCC; see the file COPYING. If not, write to
19 // the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20 // Boston, MA 02110-1301, USA.
22 // As a special exception, you may use this file as part of a free software
23 // library without restriction. Specifically, if other files instantiate
24 // templates or use macros or inline functions from this file, or you compile
25 // this file and link it with other files to produce an executable, this
26 // file does not by itself cause the resulting executable to be covered by
27 // the GNU General Public License. This exception does not however
28 // invalidate any other reasons why the executable file might be covered by
29 // the GNU General Public License.
31 /** @file exception_ptr.h
32 * This is an internal header file, included by other headers and the
33 * implementation. You should not attempt to use it directly.
36 #ifndef _EXCEPTION_PTR_H
37 #define _EXCEPTION_PTR_H
39 #pragma GCC visibility push(default)
41 #include <bits/c++config.h>
43 #if !defined(_GLIBCXX_ATOMIC_BUILTINS_4)
44 # error This platform does not support exception propagation.
51 // Hide the free operators from other types
52 namespace __exception_ptr
55 * @brief An opaque pointer to an arbitrary exception.
60 using __exception_ptr::exception_ptr
;
62 /** Obtain an %exception_ptr to the currently handled exception. If there
63 * is none, or the currently handled exception is foreign, return the null
66 exception_ptr
current_exception() throw();
68 /// Throw the object pointed to by the %exception_ptr.
69 void rethrow_exception(exception_ptr
) __attribute__ ((__noreturn__
));
71 /// Obtain an %exception_ptr pointing to a copy of the supplied object.
73 exception_ptr
copy_exception(_Ex __ex
) throw();
76 namespace __exception_ptr
78 bool operator==(const exception_ptr
&,
79 const exception_ptr
&) throw();
80 bool operator!=(const exception_ptr
&,
81 const exception_ptr
&) throw();
85 void* _M_exception_object
;
87 explicit exception_ptr(void* __e
) throw();
89 void _M_addref() throw();
90 void _M_release() throw();
92 void *_M_get() const throw();
94 void _M_safe_bool_dummy();
96 friend exception_ptr
std::current_exception() throw();
97 friend void std::rethrow_exception(exception_ptr
);
100 exception_ptr() throw();
102 typedef void (exception_ptr::*__safe_bool
)();
104 // For construction from nullptr or 0.
105 exception_ptr(__safe_bool
) throw();
107 exception_ptr(const exception_ptr
&) throw();
109 #ifdef __GXX_EXPERIMENTAL_CXX0X__
110 exception_ptr(exception_ptr
&& __o
) throw()
111 : _M_exception_object(__o
._M_exception_object
)
113 __o
._M_exception_object
= 0;
117 exception_ptr
& operator=(const exception_ptr
&) throw();
119 #ifdef __GXX_EXPERIMENTAL_CXX0X__
120 exception_ptr
& operator=(exception_ptr
&& __o
) throw()
122 exception_ptr(__o
).swap(*this);
127 ~exception_ptr() throw();
129 void swap(exception_ptr
&) throw();
131 #ifdef __GXX_EXPERIMENTAL_CXX0X__
132 void swap(exception_ptr
&&__o
) throw()
134 void *__tmp
= _M_exception_object
;
135 _M_exception_object
= __o
._M_exception_object
;
136 __o
._M_exception_object
= __tmp
;
140 bool operator!() const throw();
141 operator __safe_bool() const throw();
143 friend bool operator==(const exception_ptr
&,
144 const exception_ptr
&) throw();
146 const type_info
*__cxa_exception_type() const throw();
149 } // namespace __exception_ptr
153 exception_ptr
copy_exception(_Ex __ex
) throw()
161 return current_exception ();
169 #pragma GCC visibility pop