diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2020-01-09 21:31:55 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2020-01-09 21:31:55 +0000 |
commit | 1a7886386cea722d0d7b61730b4d1dd6d9a19109 (patch) | |
tree | 64790bbbe31216714a01e9328debb4b49a4a1040 | |
parent | caa39b2e842b03226551231688ef7190cbe44f89 (diff) | |
download | gcc-1a7886386cea722d0d7b61730b4d1dd6d9a19109.zip gcc-1a7886386cea722d0d7b61730b4d1dd6d9a19109.tar.gz gcc-1a7886386cea722d0d7b61730b4d1dd6d9a19109.tar.bz2 |
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
-rw-r--r-- | libstdc++-v3/ChangeLog | 6 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/extptr_allocator.h | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/pointer.h | 11 |
3 files changed, 21 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 721b465..65cd480 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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. diff --git a/libstdc++-v3/include/ext/extptr_allocator.h b/libstdc++-v3/include/ext/extptr_allocator.h index 933bdb6..8809054 100644 --- a/libstdc++-v3/include/ext/extptr_allocator.h +++ b/libstdc++-v3/include/ext/extptr_allocator.h @@ -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> diff --git a/libstdc++-v3/include/ext/pointer.h b/libstdc++-v3/include/ext/pointer.h index 84d5300..02d3e60 100644 --- a/libstdc++-v3/include/ext/pointer.h +++ b/libstdc++-v3/include/ext/pointer.h @@ -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 |