The standard allows allocators to throw any kind of exception, not only
something that can be caught as std::bad_alloc. std::basic_stracktrace
was assuming std::bad_alloc.
libstdc++-v3/ChangeLog:
* include/std/stacktrace (basic_stacktrace::_Impl::_M_allocate):
Do not assume allocators only throw std::bad_alloc.
(cherry picked from commit
c45844eb7dadcd48e3ce84444a45c270382f7ad1)
if constexpr (is_same_v<allocator_type, allocator<value_type>>)
{
// For std::allocator we use nothrow-new directly so we
- // don't need to handle bad_alloc exceptions.
+ // don't need to handle exceptions from __alloc.allocate(n).
size_t __nb = __n * sizeof(value_type);
void* const __p = _GLIBCXX_OPERATOR_NEW (__nb, nothrow_t{});
if (__p == nullptr) [[unlikely]]
{
_M_frames = __alloc.allocate(__n);
}
- __catch (const std::bad_alloc&)
+ __catch (...)
{
return nullptr;
}