// Exception Handling support header (exception_ptr class) for -*- C++ -*-
-// Copyright (C) 2008-2017 Free Software Foundation, Inc.
+// Copyright (C) 2008-2020 Free Software Foundation, Inc.
//
// This file is part of GCC.
//
* @addtogroup exceptions
* @{
*/
+
namespace __exception_ptr
{
class exception_ptr;
__attribute__ ((__pure__));
};
+ /// @relates exception_ptr @{
+
bool
operator==(const exception_ptr&, const exception_ptr&)
_GLIBCXX_USE_NOEXCEPT __attribute__ ((__pure__));
swap(exception_ptr& __lhs, exception_ptr& __rhs)
{ __lhs.swap(__rhs); }
+ // @}
+
+ /// @cond undocumented
template<typename _Ex>
inline void
__dest_thunk(void* __x)
{ static_cast<_Ex*>(__x)->~_Ex(); }
+ /// @endcond
} // namespace __exception_ptr
exception_ptr
make_exception_ptr(_Ex __ex) _GLIBCXX_USE_NOEXCEPT
{
-#if __cpp_exceptions
+#if __cpp_exceptions && __cpp_rtti && !_GLIBCXX_HAVE_CDTOR_CALLABI
+ void* __e = __cxxabiv1::__cxa_allocate_exception(sizeof(_Ex));
+ (void) __cxxabiv1::__cxa_init_primary_exception(
+ __e, const_cast<std::type_info*>(&typeid(__ex)),
+ __exception_ptr::__dest_thunk<_Ex>);
try
{
-#if __cpp_rtti && !_GLIBCXX_HAVE_CDTOR_CALLABI
- void *__e = __cxxabiv1::__cxa_allocate_exception(sizeof(_Ex));
- (void)__cxxabiv1::__cxa_init_primary_exception(
- __e, const_cast<std::type_info*>(&typeid(__ex)),
- __exception_ptr::__dest_thunk<_Ex>);
::new (__e) _Ex(__ex);
return exception_ptr(__e);
-#else
+ }
+ catch(...)
+ {
+ __cxxabiv1::__cxa_free_exception(__e);
+ return current_exception();
+ }
+#elif __cpp_exceptions
+ try
+ {
throw __ex;
-#endif
}
catch(...)
{
return current_exception();
}
-#else
+#else // no RTTI and no exceptions
return exception_ptr();
#endif
}