@@ -487,6 +487,16 @@ namespace std
# define _GLIBCXX_EXTERN_TEMPLATE -1
#endif
+
+#if __has_builtin(__builtin_is_constant_evaluated)
+# define __glibcxx_constexpr_assert(cond) \
+ if (__builtin_is_constant_evaluated() && !bool(cond)) \
+ __builtin_unreachable() /* precondition violation detected! */
+#else
+# define __glibcxx_constexpr_assert(unevaluated)
+#endif
+
+
// Assert.
#if defined(_GLIBCXX_ASSERTIONS) \
|| defined(_GLIBCXX_PARALLEL) || defined(_GLIBCXX_PARALLEL_ASSERTIONS)
@@ -506,14 +516,19 @@ namespace std
}
#define __glibcxx_assert_impl(_Condition) \
if (__builtin_expect(!bool(_Condition), false)) \
+ { \
+ __glibcxx_constexpr_assert(_Condition); \
std::__replacement_assert(__FILE__, __LINE__, __PRETTY_FUNCTION__, \
- #_Condition)
+ #_Condition); \
+ }
#endif
#if defined(_GLIBCXX_ASSERTIONS)
-# define __glibcxx_assert_2(_Condition) __glibcxx_assert_impl(_Condition)
+# define __glibcxx_assert(cond) \
+ do { __glibcxx_assert_impl(cond); } while (false)
#else
-# define __glibcxx_assert_2(_Condition)
+# define __glibcxx_assert(cond) \
+ do { __glibcxx_constexpr_assert(cond); } while (false)
#endif
// Macros for race detectors.
@@ -736,25 +751,6 @@ namespace std
#undef _GLIBCXX_HAS_BUILTIN
-#if _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED && __cplusplus >= 201402L
-# define __glibcxx_assert_1(_Condition) \
- if (__builtin_is_constant_evaluated()) \
- { \
- void __failed_assertion(); \
- if (!bool(_Condition)) \
- __failed_assertion(); \
- } \
- else
-#else
-# define __glibcxx_assert_1(_Condition)
-#endif
-
-# define __glibcxx_assert(_Condition) \
- do { \
- __glibcxx_assert_1(_Condition) \
- { __glibcxx_assert_2(_Condition); } \
- } while (false)
-
// PSTL configuration
@@ -45,8 +45,8 @@
#define _GLIBCXX_DEBUG_VERIFY_AT_F(_Cond,_ErrMsg,_File,_Line,_Func) \
do { \
- __glibcxx_assert_1(_Cond) \
- { _GLIBCXX_DEBUG_VERIFY_COND_AT(_Cond,_ErrMsg,_File,_Line,_Func); } \
+ __glibcxx_constexpr_assert(_Cond); \
+ _GLIBCXX_DEBUG_VERIFY_COND_AT(_Cond,_ErrMsg,_File,_Line,_Func); \
} while (false)
#define _GLIBCXX_DEBUG_VERIFY_AT(_Cond,_ErrMsg,_File,_Line) \
@@ -32,4 +32,4 @@ back()
static_assert(back() != 'a'); // { dg-error "non-constant condition" }
// { dg-prune-output "in 'constexpr' expansion" }
-// { dg-prune-output "failed_assertion" }
+// { dg-prune-output "unreachable" }
@@ -31,4 +31,4 @@ test()
static_assert(test() == 0); // { dg-error "non-constant condition" }
// { dg-prune-output "in 'constexpr' expansion" }
-// { dg-prune-output "failed_assertion" }
+// { dg-prune-output "unreachable" }
@@ -32,4 +32,4 @@ front()
static_assert(front() != 'a'); // { dg-error "non-constant condition" }
// { dg-prune-output "in 'constexpr' expansion" }
-// { dg-prune-output "failed_assertion" }
+// { dg-prune-output "unreachable" }
@@ -32,4 +32,4 @@ back()
static_assert(back() != L'a'); // { dg-error "non-constant condition" }
// { dg-prune-output "in 'constexpr' expansion" }
-// { dg-prune-output "failed_assertion" }
+// { dg-prune-output "unreachable" }
@@ -31,4 +31,4 @@ test()
static_assert(test() == 0); // { dg-error "non-constant condition" }
// { dg-prune-output "in 'constexpr' expansion" }
-// { dg-prune-output "failed_assertion" }
+// { dg-prune-output "unreachable" }
@@ -32,4 +32,4 @@ front()
static_assert(front() != L'a'); // { dg-error "non-constant condition" }
// { dg-prune-output "in 'constexpr' expansion" }
-// { dg-prune-output "failed_assertion" }
+// { dg-prune-output "unreachable" }
@@ -31,5 +31,5 @@ test01(bool b)
static_assert(test01(false));
static_assert(test01(true)); // { dg-error "non-constant" }
-// { dg-error "assert" "" { target *-*-* } 0 }
+// { dg-error "unreachable" "" { target *-*-* } 0 }
// { dg-prune-output "in 'constexpr' expansion" }
@@ -31,5 +31,5 @@ test01(bool b)
static_assert(test01(false));
static_assert(test01(true)); // { dg-error "non-constant" }
-// { dg-error "assert" "" { target *-*-* } 0 }
+// { dg-error "unreachable" "" { target *-*-* } 0 }
// { dg-prune-output "in 'constexpr' expansion" }
@@ -31,5 +31,5 @@ test01(bool b)
static_assert(test01(false));
static_assert(test01(true)); // { dg-error "non-constant" }
-// { dg-error "assert" "" { target *-*-* } 0 }
+// { dg-error "unreachable" "" { target *-*-* } 0 }
// { dg-prune-output "in 'constexpr' expansion" }