https://gcc.gnu.org/g:11b5ad5ba712c9c22e6eced415c839c67f617e52
commit r14-10533-g11b5ad5ba712c9c22e6eced415c839c67f617e52 Author: Jonathan Wakely <jwak...@redhat.com> Date: Wed Jul 10 10:29:52 2024 +0100 libstdc++: Use direct-initialization for std::vector<bool>'s allocator [PR115854] 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. (cherry picked from commit c5efc6eca8e3eee7038ae218cf7e2dbe9ed9d82a) Diff: --- libstdc++-v3/include/bits/stl_bvector.h | 2 +- .../testsuite/23_containers/vector/allocator/115854.cc | 10 ++++++++++ .../testsuite/23_containers/vector/bool/allocator/115854.cc | 10 ++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h index 4f1e7686a1c6..ffc7428a9278 100644 --- a/libstdc++-v3/include/bits/stl_bvector.h +++ b/libstdc++-v3/include/bits/stl_bvector.h @@ -654,7 +654,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _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; diff --git a/libstdc++-v3/testsuite/23_containers/vector/allocator/115854.cc b/libstdc++-v3/testsuite/23_containers/vector/allocator/115854.cc new file mode 100644 index 000000000000..6c9016b311f2 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/vector/allocator/115854.cc @@ -0,0 +1,10 @@ +// { 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); diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/allocator/115854.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/allocator/115854.cc new file mode 100644 index 000000000000..14b28cc3e964 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/vector/bool/allocator/115854.cc @@ -0,0 +1,10 @@ +// { 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);