https://gcc.gnu.org/g:6e0376b42d4c6eff348a151b0f66453c5a5d8f00
commit r15-11254-g6e0376b42d4c6eff348a151b0f66453c5a5d8f00 Author: François Dumont <[email protected]> Date: Mon Sep 22 18:58:52 2025 +0200 libstdc++: Backport constexpr support for debug mode helpers [PR119163] This is a partial backport of r16-5845-g8a2e6590cc4a2f to fix a test failure with -D_GLIBCXX_DEBUG: FAIL: 20_util/specialized_algorithms/uninitialized_copy/constexpr.cc -std=gnu++26 (test for excess errors) libstdc++-v3/ChangeLog: PR libstdc++/119163 * include/debug/functions.h (__check_valid_range): Add C++20 constexpr. * include/debug/helper_functions.h (__valid_range): Likewise. * include/debug/safe_iterator.h (__valid_range): Likewise. Diff: --- libstdc++-v3/include/debug/functions.h | 10 +++++++--- libstdc++-v3/include/debug/helper_functions.h | 4 ++-- libstdc++-v3/include/debug/safe_iterator.h | 12 +++++++++++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/libstdc++-v3/include/debug/functions.h b/libstdc++-v3/include/debug/functions.h index c5f5582b0050..4e6fdae71935 100644 --- a/libstdc++-v3/include/debug/functions.h +++ b/libstdc++-v3/include/debug/functions.h @@ -53,15 +53,19 @@ namespace __gnu_debug * assertion statement because, e.g., we are in a constructor. */ template<typename _InputIterator> - inline _InputIterator + _GLIBCXX20_CONSTEXPR inline _InputIterator __check_valid_range(const _InputIterator& __first, const _InputIterator& __last, const char* __file, unsigned int __line, const char* __function) { - __glibcxx_check_valid_range_at(__first, __last, - __file, __line, __function); + if (!std::__is_constant_evaluated()) + { + __glibcxx_check_valid_range_at(__first, __last, + __file, __line, __function); + } + return __first; } diff --git a/libstdc++-v3/include/debug/helper_functions.h b/libstdc++-v3/include/debug/helper_functions.h index 9395892b537c..b9771034bf34 100644 --- a/libstdc++-v3/include/debug/helper_functions.h +++ b/libstdc++-v3/include/debug/helper_functions.h @@ -249,7 +249,7 @@ namespace __gnu_debug } template<typename _Iterator, typename _Sequence, typename _Category> - bool + _GLIBCXX20_CONSTEXPR bool __valid_range(const _Safe_iterator<_Iterator, _Sequence, _Category>&, const _Safe_iterator<_Iterator, _Sequence, _Category>&, typename _Distance_traits<_Iterator>::__type&); @@ -272,7 +272,7 @@ namespace __gnu_debug } template<typename _Iterator, typename _Sequence, typename _Category> - bool + _GLIBCXX20_CONSTEXPR bool __valid_range(const _Safe_iterator<_Iterator, _Sequence, _Category>&, const _Safe_iterator<_Iterator, _Sequence, _Category>&); diff --git a/libstdc++-v3/include/debug/safe_iterator.h b/libstdc++-v3/include/debug/safe_iterator.h index 7c563381d0bf..9c5f360414bf 100644 --- a/libstdc++-v3/include/debug/safe_iterator.h +++ b/libstdc++-v3/include/debug/safe_iterator.h @@ -1108,21 +1108,31 @@ namespace __gnu_debug /** Safe iterators know how to check if they form a valid range. */ template<typename _Iterator, typename _Sequence, typename _Category> + _GLIBCXX20_CONSTEXPR inline bool __valid_range(const _Safe_iterator<_Iterator, _Sequence, _Category>& __first, const _Safe_iterator<_Iterator, _Sequence, _Category>& __last, typename _Distance_traits<_Iterator>::__type& __dist) - { return __first._M_valid_range(__last, __dist); } + { + if (std::__is_constant_evaluated()) + return true; + + return __first._M_valid_range(__last, __dist); + } template<typename _Iterator, typename _Sequence, typename _Category> + _GLIBCXX20_CONSTEXPR inline bool __valid_range(const _Safe_iterator<_Iterator, _Sequence, _Category>& __first, const _Safe_iterator<_Iterator, _Sequence, _Category>& __last) { + if (std::__is_constant_evaluated()) + return true; + typename _Distance_traits<_Iterator>::__type __dist; return __first._M_valid_range(__last, __dist); }
