From 1f48525ded40b968792c4dfd9a7614c3e88129a4 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Tue, 29 Jan 2019 00:47:25 +0000 Subject: [PATCH] Ensure pool resources always use normal mode vector The __pool_resource::_M_unpooled member was declared with type std::vector, which means that the type depends on whether debug mode is active or not. Because the non-inline definitions in src/c++17/memory_resource.cc are never compiled with debug mode, the type declared in the header doesn't match the type in the library definitions, leading to undefined behaviour. The solution is to ensure the header always uses the non-debug vector, even when debug mode is active. To make this easier a new alias template is defined: _GLIBCXX_STD_C::pmr::vector. * include/std/memory_resource (__pool_resource::_M_unpooled): Use normal mode vector, even for debug mode. * include/std/vector [_GLIBCXX_DEBUG] (_GLIBCXX_STD_C::pmr::vector): Define alias template for normal mode vector. From-SVN: r268354 --- libstdc++-v3/ChangeLog | 7 +++++++ libstdc++-v3/include/std/memory_resource | 2 +- libstdc++-v3/include/std/vector | 7 +++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 89b94a88cce..30038524ec3 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2019-01-29 Jonathan Wakely + + * include/std/memory_resource (__pool_resource::_M_unpooled): Use + normal mode vector, even for debug mode. + * include/std/vector [_GLIBCXX_DEBUG] (_GLIBCXX_STD_C::pmr::vector): + Define alias template for normal mode vector. + 2019-01-28 Jonathan Wakely PR libstdc++/68737 diff --git a/libstdc++-v3/include/std/memory_resource b/libstdc++-v3/include/std/memory_resource index 5573494b01f..93b2ebd9759 100644 --- a/libstdc++-v3/include/std/memory_resource +++ b/libstdc++-v3/include/std/memory_resource @@ -354,7 +354,7 @@ namespace pmr struct _BigBlock; // Collection of blocks too big for any pool, sorted by address. // This also stores the only copy of the upstream memory resource pointer. - pmr::vector<_BigBlock> _M_unpooled; + _GLIBCXX_STD_C::pmr::vector<_BigBlock> _M_unpooled; const int _M_npools; }; diff --git a/libstdc++-v3/include/std/vector b/libstdc++-v3/include/std/vector index 2c90765b058..e5e13ab3ef7 100644 --- a/libstdc++-v3/include/std/vector +++ b/libstdc++-v3/include/std/vector @@ -89,6 +89,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template using vector = std::vector<_Tp, polymorphic_allocator<_Tp>>; } // namespace pmr +# ifdef _GLIBCXX_DEBUG + namespace _GLIBCXX_STD_C::pmr { + template + using vector + = _GLIBCXX_STD_C::vector<_Tp, std::pmr::polymorphic_allocator<_Tp>>; + } // namespace _GLIBCXX_STD_C::pmr +# endif _GLIBCXX_END_NAMESPACE_VERSION } // namespace std #endif // C++17 -- 2.30.2