I find this allowance in the standard baffling, but it is what it is.

Tested x86_64-linux. Pushed to trunk.

-- >8 --

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.
---
 libstdc++-v3/include/std/stacktrace | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libstdc++-v3/include/std/stacktrace 
b/libstdc++-v3/include/std/stacktrace
index de7446064c7..58d0c2a0fc2 100644
--- a/libstdc++-v3/include/std/stacktrace
+++ b/libstdc++-v3/include/std/stacktrace
@@ -560,7 +560,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
              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).
                  auto __p = __detail::__get_temporary_buffer<value_type>(__n);
                  if (__p == nullptr) [[unlikely]]
                    return nullptr;
@@ -572,7 +572,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                    {
                      _M_frames = __alloc.allocate(__n);
                    }
-                 __catch (const std::bad_alloc&)
+                 __catch (...)
                    {
                      return nullptr;
                    }
-- 
2.46.1

Reply via email to