Because of PR c++/85944 we have several bugs where _GLIBCXX_DEBUG causes
errors for constexpr code. Although Bug 117966 could be fixed by
avoiding redundant debug checks in std::span, and Bug 106212 could be
fixe by avoiding redundant debug checks in std::array, there are many
more cases where the same checks fail and can't be avoided.

This just disables the __gnu_debug::__check_singular(T*) check during
constant evaluation. Attempting to dereference a null pointer will
certainly fail during constant evaluation (or it's a compiler bug and
not the library's problem if it doesn't fail). Disabling this check
shouldn't do any harm.

libstdc++-v3/ChangeLog:

        PR libstdc++/109517
        PR libstdc++/109976
        * include/debug/helper_functions.h (__valid_range_aux): Treat
        all input iterator ranges as valid during constant evaluation.
---

Tested x86_64-linux.

 libstdc++-v3/include/debug/helper_functions.h | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/libstdc++-v3/include/debug/helper_functions.h 
b/libstdc++-v3/include/debug/helper_functions.h
index d686a29e8ee..8d6a5fb41fb 100644
--- a/libstdc++-v3/include/debug/helper_functions.h
+++ b/libstdc++-v3/include/debug/helper_functions.h
@@ -168,6 +168,11 @@ namespace __gnu_debug
     __valid_range_aux(_InputIterator __first, _InputIterator __last,
                      std::input_iterator_tag)
     {
+      // FIXME: The checks for singular iterators fail during constant eval
+      // due to PR c++/85944. e.g. PR libstdc++/109517 and PR libstdc++/109976.
+      if (std::__is_constant_evaluated())
+       return true;
+
       return __first == __last
        || (!__gnu_debug::__check_singular(__first)
              && !__gnu_debug::__check_singular(__last));
-- 
2.47.1

Reply via email to