https://gcc.gnu.org/g:73e5d2f87c257c2c12ee72fd4de9bdbb6a8e1aa9

commit r15-5733-g73e5d2f87c257c2c12ee72fd4de9bdbb6a8e1aa9
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Wed Nov 27 12:28:30 2024 +0000

    libstdc++: Remove __builtin_expect from consteval assertion
    
    libstdc++-v3/ChangeLog:
    
            * include/bits/c++config (__glibcxx_assert): Remove useless
            __builtin_expect from constexpr-only assertion. Improve
            comments.

Diff:
---
 libstdc++-v3/include/bits/c++config | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/libstdc++-v3/include/bits/c++config 
b/libstdc++-v3/include/bits/c++config
index c74b03013fdb..a5001d0a0b0b 100644
--- a/libstdc++-v3/include/bits/c++config
+++ b/libstdc++-v3/include/bits/c++config
@@ -626,14 +626,17 @@ namespace std
 #endif
 
 #if defined(_GLIBCXX_ASSERTIONS)
-// Enable runtime assertion checks, and also check in constant expressions.
+// When _GLIBCXX_ASSERTIONS is defined we enable runtime assertion checks.
+// These checks will also be done during constant evaluation.
 # define __glibcxx_assert(cond)                                                
\
   do {                                                                 \
     if (__builtin_expect(!bool(cond), false))                          \
       _GLIBCXX_ASSERT_FAIL(cond);                                      \
   } while (false)
 #elif _GLIBCXX_HAVE_IS_CONSTANT_EVALUATED
-// Only check assertions during constant evaluation.
+// _GLIBCXX_ASSERTIONS is not defined, so assertions checks are only enabled
+// during constant evaluation. This ensures we diagnose undefined behaviour
+// in constant expressions.
 namespace std
 {
   __attribute__((__always_inline__,__visibility__("default")))
@@ -643,12 +646,12 @@ namespace std
 }
 # define __glibcxx_assert(cond)                                                
\
   do {                                                                 \
-    if (std::__is_constant_evaluated())                                        
\
-      if (__builtin_expect(!bool(cond), false))                                
\
-       std::__glibcxx_assert_fail();                                   \
+    if (std::__is_constant_evaluated() && !bool(cond))                 \
+      std::__glibcxx_assert_fail();                                    \
   } while (false)
 #else
-// Don't check any assertions.
+// _GLIBCXX_ASSERTIONS is not defined and __is_constant_evaluated() doesn't
+// work so don't check any assertions.
 # define __glibcxx_assert(cond)
 #endif

Reply via email to