// 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
}
- // _GLIBCXX_RESOLVE_LIB_DEFECTS
- // 1130. copy_exception name misleading
- /// Obtain an exception_ptr pointing to a copy of the supplied object.
- /// This function is deprecated, use std::make_exception_ptr instead.
- template<typename _Ex>
- exception_ptr
- copy_exception(_Ex __ex) _GLIBCXX_USE_NOEXCEPT _GLIBCXX_DEPRECATED;
-
- template<typename _Ex>
- exception_ptr
- copy_exception(_Ex __ex) _GLIBCXX_USE_NOEXCEPT
- { return std::make_exception_ptr<_Ex>(__ex); }
-
// @} group exceptions
} // namespace std