+2018-05-17 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/85812
+ * libsupc++/cxxabi_init_exception.h (__cxa_free_exception): Declare.
+ * libsupc++/exception_ptr.h (make_exception_ptr) [__cpp_exceptions]:
+ Refactor to separate non-throwing and throwing implementations.
+ [__cpp_rtti && !_GLIBCXX_HAVE_CDTOR_CALLABI]: Deallocate the memory
+ if constructing the object throws.
+
2018-05-15 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/85749
void*
__cxa_allocate_exception(size_t) _GLIBCXX_NOTHROW;
+ void
+ __cxa_free_exception(void*) _GLIBCXX_NOTHROW;
+
// Initialize exception (this is a GNU extension)
__cxa_refcounted_exception*
__cxa_init_primary_exception(void *object, std::type_info *tinfo,
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
}