Ensure pool resources always use normal mode vector
authorJonathan Wakely <jwakely@redhat.com>
Tue, 29 Jan 2019 00:47:25 +0000 (00:47 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 29 Jan 2019 00:47:25 +0000 (00:47 +0000)
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
libstdc++-v3/include/std/memory_resource
libstdc++-v3/include/std/vector

index 89b94a88ccefd758a8856a09e2359cc4a8e3fa26..30038524ec3789bf6fef8244f249b736524efb7c 100644 (file)
@@ -1,3 +1,10 @@
+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>
 
        PR libstdc++/68737
index 5573494b01f7126581a27334ee31d6838bd6f0c4..93b2ebd97599a34501b00b6481e76b6e6366ddcb 100644 (file)
@@ -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;
   };
index 2c90765b0589fdd1a1b9a1c181af343bf7e8c0fd..e5e13ab3ef7cde0eea162a4dc38117c95dda87d1 100644 (file)
@@ -89,6 +89,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     template<typename _Tp>
       using vector = std::vector<_Tp, polymorphic_allocator<_Tp>>;
   } // 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
 } // namespace std
 #endif // C++17