The consensus in the standard committee is that this change shouldn't be
necessary, and the Allocator requirements should require conversions
between rebound allocators to be implicit. But we can make it work for
now anyway.
libstdc++-v3/ChangeLog:
PR libstdc++/115854
* include/bits/stl_bvector.h (_Bvector_base): Convert allocator
to rebound type explicitly.
* testsuite/23_containers/vector/allocator/115854.cc: New test.
* testsuite/23_containers/vector/bool/allocator/115854.cc: New test.
_GLIBCXX20_CONSTEXPR
_Bvector_base(const allocator_type& __a)
- : _M_impl(__a) { }
+ : _M_impl(_Bit_alloc_type(__a)) { }
#if __cplusplus >= 201103L
_Bvector_base(_Bvector_base&&) = default;
--- /dev/null
+// { dg-do compile { target c++11 } }
+
+#include <vector>
+#include <testsuite_allocator.h>
+
+__gnu_test::ExplicitConsAlloc<int> alloc;
+std::vector<int, __gnu_test::ExplicitConsAlloc<int>> v;
+std::vector<int, __gnu_test::ExplicitConsAlloc<int>> v1(alloc);
+std::vector<int, __gnu_test::ExplicitConsAlloc<int>> v2(v1, alloc);
+std::vector<int, __gnu_test::ExplicitConsAlloc<int>> v3(std::move(v1), alloc);
--- /dev/null
+// { dg-do compile { target c++11 } }
+
+#include <vector>
+#include <testsuite_allocator.h>
+
+__gnu_test::ExplicitConsAlloc<bool> alloc;
+std::vector<bool, __gnu_test::ExplicitConsAlloc<bool>> v;
+std::vector<bool, __gnu_test::ExplicitConsAlloc<bool>> v1(alloc);
+std::vector<bool, __gnu_test::ExplicitConsAlloc<bool>> v2(v1, alloc);
+std::vector<bool, __gnu_test::ExplicitConsAlloc<bool>> v3(std::move(v1), alloc);