[Bug libstdc++/93960] std::to_address doesn't work with past-the-end Debug Mode iterators
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Feb 28 15:17:00 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93960
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |ASSIGNED
Last reconfirmed| |2020-02-28
Assignee|unassigned at gcc dot gnu.org |redi at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
This seems to work:
--- a/libstdc++-v3/include/debug/safe_iterator.h
+++ b/libstdc++-v3/include/debug/safe_iterator.h
@@ -35,6 +35,9 @@
#include <debug/safe_base.h>
#include <bits/stl_pair.h>
#include <ext/type_traits.h>
+#if __cplusplus > 201703L
+# include <concepts>
+#endif
#define _GLIBCXX_DEBUG_VERIFY_OPERANDS(_Lhs, _Rhs, _BadMsgId, _DiffMsgId) \
_GLIBCXX_DEBUG_VERIFY(!_Lhs._M_singular() && !_Rhs._M_singular(), \
@@ -952,6 +955,13 @@ namespace __gnu_debug
__unsafe(const _Safe_iterator<_Iterator, _Sequence>& __it)
{ return __it.base(); }
+#if __cplusplus > 201703L && __cpp_lib_concepts
+ template<std::derived_from<_Safe_iterator_base> _Iter>
+ constexpr auto
+ __to_address(const _Iter& __iter) noexcept
+ { return std::__to_address(__iter.operator->()); }
+#endif
+
} // namespace __gnu_debug
#undef _GLIBCXX_DEBUG_VERIFY_DIST_OPERANDS
This overload is more constrained than the existing ones, so gets chosen by
overload resolution.
More information about the Gcc-bugs
mailing list