On Sat, Mar 22, 2025 at 9:35 PM Jonathan Wakely <jwak...@redhat.com> wrote:

> This is the subject of LWG 4228 which notes that libstdc++ doesn't
> enforce this requirement. That's just a bug because I forgot to add it
> to vector<bool> when adding it elsewhere.
>
> For consistency with the other containers we should not allow incorrect
> allocator types for strict -std=c++NN modes, but it is very late to make
> that change for GCC 15 so this only enables the assertion for C++20
> (where it's required). For GCC 16 we can enable it for strict modes too.
>
> libstdc++-v3/ChangeLog:
>
>         * include/bits/stl_bvector.h (vector<bool, A>): Enforce the
>         C++20 requirement that the allocator's value_type matches the
>         container.
>         * testsuite/23_containers/vector/bool/cons/from_range.cc: Fix
>         incorrect allocator type.
> ---
>
> Tested x86_64-linux.
>
LGTM

>
>  libstdc++-v3/include/bits/stl_bvector.h                       | 4 ++++
>  .../testsuite/23_containers/vector/bool/cons/from_range.cc    | 2 +-
>  2 files changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/libstdc++-v3/include/bits/stl_bvector.h
> b/libstdc++-v3/include/bits/stl_bvector.h
> index 14a0b0fdbb6..3e4831b1cb5 100644
> --- a/libstdc++-v3/include/bits/stl_bvector.h
> +++ b/libstdc++-v3/include/bits/stl_bvector.h
> @@ -751,6 +751,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
>
>  #if __cplusplus >= 201103L
>        friend struct std::hash<vector>;
> +# if __cplusplus > 201703L // || defined __STRICT_ANSI__
> +      static_assert(is_same<typename _Alloc::value_type, bool>::value,
> +         "std::vector must have the same value_type as its allocator");
> +# endif
>  #endif
>
>      public:
> diff --git
> a/libstdc++-v3/testsuite/23_containers/vector/bool/cons/from_range.cc
> b/libstdc++-v3/testsuite/23_containers/vector/bool/cons/from_range.cc
> index f531e7f5039..37f0ecf32ad 100644
> --- a/libstdc++-v3/testsuite/23_containers/vector/bool/cons/from_range.cc
> +++ b/libstdc++-v3/testsuite/23_containers/vector/bool/cons/from_range.cc
> @@ -71,7 +71,7 @@ test_ranges()
>      bool val;
>    };
>    using rvalue_input_range = test_range<C, input_iterator_wrapper_rval>;
> -  do_test<rvalue_input_range>(std::allocator<int>());
> +  do_test<rvalue_input_range>(std::allocator<bool>());
>
>    return true;
>  }
> --
> 2.49.0
>
>

Reply via email to