Commit 1f48525d by Jonathan Wakely Committed by Jonathan Wakely

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
parent a097ba8a
2019-01-29 Jonathan Wakely <jwakely@redhat.com>
* 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 <jwakely@redhat.com> 2019-01-28 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/68737 PR libstdc++/68737
......
...@@ -354,7 +354,7 @@ namespace pmr ...@@ -354,7 +354,7 @@ namespace pmr
struct _BigBlock; struct _BigBlock;
// Collection of blocks too big for any pool, sorted by address. // Collection of blocks too big for any pool, sorted by address.
// This also stores the only copy of the upstream memory resource pointer. // 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; const int _M_npools;
}; };
......
...@@ -89,6 +89,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -89,6 +89,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _Tp> template<typename _Tp>
using vector = std::vector<_Tp, polymorphic_allocator<_Tp>>; using vector = std::vector<_Tp, polymorphic_allocator<_Tp>>;
} // namespace pmr } // namespace pmr
# ifdef _GLIBCXX_DEBUG
namespace _GLIBCXX_STD_C::pmr {
template<typename _Tp>
using vector
= _GLIBCXX_STD_C::vector<_Tp, std::pmr::polymorphic_allocator<_Tp>>;
} // namespace _GLIBCXX_STD_C::pmr
# endif
_GLIBCXX_END_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION
} // namespace std } // namespace std
#endif // C++17 #endif // C++17
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment