[gcc r15-11255] libstdc++: Make more _Safe_iterator functions in constexpr in C++20.
Jonathan Wakely
redi@gcc.gnu.org
Thu Jun 4 14:45:39 GMT 2026
https://gcc.gnu.org/g:2bb5a6255821e3588c476541d78a010203db1ee5
commit r15-11255-g2bb5a6255821e3588c476541d78a010203db1ee5
Author: Tomasz Kamiński <tkaminsk@redhat.com>
Date: Fri Dec 19 13:07:00 2025 +0100
libstdc++: Make more _Safe_iterator functions in constexpr in C++20.
This functions are indirectly called from flat_ containers operations
(from preconditions check of lower_bound, upper_bound, ...) that were
made constexpr by r16-6026-gbf9dd44a97400e, leading to test with
in _GLIBCXX_DEBUG mode.
For __can_advance we uncoditionally return true in constant evaluation,
similary to __valid_range. The constexpr iterator will detect comparision
of iterator to different ranges.
libstdc++-v3/ChangeLog:
* include/debug/helper_functions.h (__gnu_debug::__can_advance):
Declare as _GLIBCXX20_CONSTEXPR.
* include/debug/safe_iterator.h (__gnu_debug::__can_advance):
Define as _GLIBCXX20_CONSTEXPR, and return true for constexpr
evaluation.
(__gnu_debug::__base): Define as _GLIBCXX20_CONSTEXPR.
(cherry picked from commit 158acb680582d99d359eb4e609e956aaf1d45ab4)
Diff:
---
libstdc++-v3/include/debug/helper_functions.h | 4 ++--
libstdc++-v3/include/debug/safe_iterator.h | 18 +++++++++++++++---
2 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/libstdc++-v3/include/debug/helper_functions.h b/libstdc++-v3/include/debug/helper_functions.h
index b9771034bf34..b058408a1e3f 100644
--- a/libstdc++-v3/include/debug/helper_functions.h
+++ b/libstdc++-v3/include/debug/helper_functions.h
@@ -292,7 +292,7 @@ namespace __gnu_debug
template<typename _Iterator, typename _Sequence, typename _Category,
typename _Size>
- bool
+ _GLIBCXX20_CONSTEXPR bool
__can_advance(const _Safe_iterator<_Iterator, _Sequence, _Category>&,
_Size);
@@ -304,7 +304,7 @@ namespace __gnu_debug
template<typename _Iterator, typename _Sequence, typename _Category,
typename _Diff>
- bool
+ _GLIBCXX20_CONSTEXPR bool
__can_advance(const _Safe_iterator<_Iterator, _Sequence, _Category>&,
const std::pair<_Diff, _Distance_precision>&, int);
diff --git a/libstdc++-v3/include/debug/safe_iterator.h b/libstdc++-v3/include/debug/safe_iterator.h
index 9c5f360414bf..0a5ef0097751 100644
--- a/libstdc++-v3/include/debug/safe_iterator.h
+++ b/libstdc++-v3/include/debug/safe_iterator.h
@@ -1139,21 +1139,33 @@ namespace __gnu_debug
template<typename _Iterator, typename _Sequence, typename _Category,
typename _Size>
+ _GLIBCXX20_CONSTEXPR
inline bool
__can_advance(const _Safe_iterator<_Iterator, _Sequence, _Category>& __it,
_Size __n)
- { return __it._M_can_advance(__n); }
+ {
+ if (std::__is_constant_evaluated())
+ return true;
+
+ return __it._M_can_advance(__n);
+ }
template<typename _Iterator, typename _Sequence, typename _Category,
typename _Diff>
+ _GLIBCXX20_CONSTEXPR
inline bool
__can_advance(const _Safe_iterator<_Iterator, _Sequence, _Category>& __it,
const std::pair<_Diff, _Distance_precision>& __dist,
int __way)
- { return __it._M_can_advance(__dist, __way); }
+ {
+ if (std::__is_constant_evaluated())
+ return true;
+
+ return __it._M_can_advance(__dist, __way);
+ }
template<typename _Iterator, typename _Sequence>
- _Iterator
+ _GLIBCXX20_CONSTEXPR _Iterator
__base(const _Safe_iterator<_Iterator, _Sequence,
std::random_access_iterator_tag>& __it)
{ return __it.base(); }
More information about the Libstdc++-cvs
mailing list