libstdc++: Fix <ext/pointer.h> incompatibilities with C++20

The equality operators for _ExtPtr_allocator are defined as non-const
member functions, which causes ambiguities in C++20 due to the
synthesized operator!= candidates. They should always have been const.

The _Pointer_adapter class template has both value_type and element_type
members, which makes readable_traits<_Pointer_adapter<T>> ambiguous. The
intended workaround is to add a specialization of readable_traits.

	* include/ext/extptr_allocator.h (_ExtPtr_allocator::operator==)
	(_ExtPtr_allocator::operator!=): Add missing const qualifiers.
	* include/ext/pointer.h (readable_traits<_Pointer_adapter<S>>): Add
	partial specialization to disambiguate the two constrained
	specializations.

From-SVN: r280067
This commit is contained in:
Jonathan Wakely 2020-01-09 21:31:55 +00:00 committed by Jonathan Wakely
parent caa39b2e84
commit 1a7886386c
3 changed files with 21 additions and 4 deletions

View File

@ -1,5 +1,11 @@
2020-01-09 Jonathan Wakely <jwakely@redhat.com>
* include/ext/extptr_allocator.h (_ExtPtr_allocator::operator==)
(_ExtPtr_allocator::operator!=): Add missing const qualifiers.
* include/ext/pointer.h (readable_traits<_Pointer_adapter<S>>): Add
partial specialization to disambiguate the two constrained
specializations.
* include/experimental/type_traits (experimental::is_pod_v): Disable
-Wdeprecated-declarations warnings around reference to std::is_pod.
* include/std/type_traits (is_pod_v): Likewise.

View File

@ -131,20 +131,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _Up>
inline bool
operator==(const _ExtPtr_allocator<_Up>& __rarg)
operator==(const _ExtPtr_allocator<_Up>& __rarg) const
{ return _M_real_alloc == __rarg._M_getUnderlyingImp(); }
inline bool
operator==(const _ExtPtr_allocator& __rarg)
operator==(const _ExtPtr_allocator& __rarg) const
{ return _M_real_alloc == __rarg._M_real_alloc; }
template<typename _Up>
inline bool
operator!=(const _ExtPtr_allocator<_Up>& __rarg)
operator!=(const _ExtPtr_allocator<_Up>& __rarg) const
{ return _M_real_alloc != __rarg._M_getUnderlyingImp(); }
inline bool
operator!=(const _ExtPtr_allocator& __rarg)
operator!=(const _ExtPtr_allocator& __rarg) const
{ return _M_real_alloc != __rarg._M_real_alloc; }
template<typename _Up>

View File

@ -46,6 +46,9 @@
# include <bits/move.h>
# include <bits/ptr_traits.h>
#endif
#if __cplusplus > 201703L
# include <iterator> // for readable_traits
#endif
namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
{
@ -594,6 +597,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return pointer(std::addressof(__r)); }
};
#if __cpp_lib_concepts
template<typename _Storage_policy>
struct readable_traits<__gnu_cxx::_Pointer_adapter<_Storage_policy>>
{
using value_type
= typename __gnu_cxx::_Pointer_adapter<_Storage_policy>::value_type;
};
#endif
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
#endif