[gcc r13-9470] libstdc++: Disable __gnu_debug::__is_singular(T*) in constexpr [PR109517]
Jonathan Wakely
redi@gcc.gnu.org
Mon Mar 31 12:06:48 GMT 2025
https://gcc.gnu.org/g:031cb46341690a66f5b31486942f69105db15297
commit r13-9470-g031cb46341690a66f5b31486942f69105db15297
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Tue Dec 10 10:56:41 2024 +0000
libstdc++: Disable __gnu_debug::__is_singular(T*) in constexpr [PR109517]
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
fixed by avoiding redundant debug checks in std::array, there are many
more cases where similar __glibcxx_requires_valid_range checks fail to
compile and removing the checks everywhere isn't desirable.
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 (if it doesn't fail then it's
a compiler bug and not the library's problem). Disabling this check
during constant evaluation 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.
(cherry picked from commit 9616deb23a17ebe81ad89ede191d7f9f752abdec)
Diff:
---
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 052b36b484c4..64fef27cc89f 100644
--- a/libstdc++-v3/include/debug/helper_functions.h
+++ b/libstdc++-v3/include/debug/helper_functions.h
@@ -169,6 +169,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));
More information about the Libstdc++-cvs
mailing list