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