I somehow only added the is_always_equal nested typedef to the allocator<void> specialization, not the primary template. All the containers still do the right thing, because they use allocator_traits<allocator<T>>::is_always_equal which gives the right answer, but we still need to provide allocator<T>::is_always_equal to be conforming.
* include/bits/allocator.h (allocator<T>::is_always_equal): Define. * testsuite/20_util/allocator/requirements/typedefs.cc: Test for is_always_equal. * testsuite/util/testsuite_allocator.h (uneq_allocator::is_always_equal): Define as false_type. Tested powerpc64le-linux, committed to trunk/
commit f5020f0fa1dc815eda37d8b1040e7c16f1554114 Author: Jonathan Wakely <jwak...@redhat.com> Date: Mon Oct 10 12:04:24 2016 +0100 Define std::allocator<T>::is_always_equal * include/bits/allocator.h (allocator<T>::is_always_equal): Define. * testsuite/20_util/allocator/requirements/typedefs.cc: Test for is_always_equal. * testsuite/util/testsuite_allocator.h (uneq_allocator::is_always_equal): Define as false_type. diff --git a/libstdc++-v3/include/bits/allocator.h b/libstdc++-v3/include/bits/allocator.h index 984d800..8e78165 100644 --- a/libstdc++-v3/include/bits/allocator.h +++ b/libstdc++-v3/include/bits/allocator.h @@ -50,6 +50,9 @@ #endif #define __cpp_lib_incomplete_container_elements 201505 +#if __cplusplus >= 201103L +# define __cpp_lib_allocator_is_always_equal 201411 +#endif namespace std _GLIBCXX_VISIBILITY(default) { @@ -80,7 +83,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // 2103. std::allocator propagate_on_container_move_assignment typedef true_type propagate_on_container_move_assignment; -#define __cpp_lib_allocator_is_always_equal 201411 typedef true_type is_always_equal; #endif }; @@ -113,6 +115,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // _GLIBCXX_RESOLVE_LIB_DEFECTS // 2103. std::allocator propagate_on_container_move_assignment typedef true_type propagate_on_container_move_assignment; + + typedef true_type is_always_equal; #endif allocator() throw() { } diff --git a/libstdc++-v3/testsuite/20_util/allocator/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/allocator/requirements/typedefs.cc index 028daa9..1b3f14f 100644 --- a/libstdc++-v3/testsuite/20_util/allocator/requirements/typedefs.cc +++ b/libstdc++-v3/testsuite/20_util/allocator/requirements/typedefs.cc @@ -48,3 +48,6 @@ static_assert( is_same<allocator<int>::rebind<char>::other, static_assert( is_same<allocator<int>::propagate_on_container_move_assignment, std::true_type>::value, "propagate_on_container_move_assignment" ); + +static_assert( is_same<allocator<int>::is_always_equal, std::true_type>::value, + "is_always_equal" ); diff --git a/libstdc++-v3/testsuite/util/testsuite_allocator.h b/libstdc++-v3/testsuite/util/testsuite_allocator.h index 8537a83..dd7e22d 100644 --- a/libstdc++-v3/testsuite/util/testsuite_allocator.h +++ b/libstdc++-v3/testsuite/util/testsuite_allocator.h @@ -297,6 +297,7 @@ namespace __gnu_test #if __cplusplus >= 201103L typedef std::true_type propagate_on_container_swap; + typedef std::false_type is_always_equal; #endif template<typename Tp1>