Rewrite RTC_CHECK macros to work in constexpr expression in gcc
tested with https://webrtc-review.googlesource.com/c/src/+/161642/5
Bug: webrtc:11191
Change-Id: Ia4ad21cb6148d7d86182d8bfcaec42966fd22eb2
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/166524
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30317}
diff --git a/rtc_base/checks.h b/rtc_base/checks.h
index 8d361cf..0b461c8 100644
--- a/rtc_base/checks.h
+++ b/rtc_base/checks.h
@@ -367,32 +367,36 @@
// RTC_CHECK_OP is a helper macro for binary operators.
// Don't use this macro directly in your code, use RTC_CHECK_EQ et al below.
#if RTC_CHECK_MSG_ENABLED
-#define RTC_CHECK(condition) \
- while (!(condition)) \
- rtc::webrtc_checks_impl::FatalLogCall<false>(__FILE__, __LINE__, \
- #condition) & \
- rtc::webrtc_checks_impl::LogStreamer<>()
-
-#define RTC_CHECK_OP(name, op, val1, val2) \
- while (!rtc::Safe##name((val1), (val2))) \
- rtc::webrtc_checks_impl::FatalLogCall<true>(__FILE__, __LINE__, \
- #val1 " " #op " " #val2) & \
- rtc::webrtc_checks_impl::LogStreamer<>() << (val1) << (val2)
-#else
-#define RTC_CHECK(condition) \
- while (!(condition)) \
- true \
- ? rtc::webrtc_checks_impl::FatalLogCall<false>(__FILE__, __LINE__, "") & \
- rtc::webrtc_checks_impl::LogStreamer<>() \
- : rtc::webrtc_checks_impl::FatalLogCall<false>("", 0, "") & \
- rtc::webrtc_checks_impl::LogStreamer<>()
+#define RTC_CHECK(condition) \
+ (condition) ? static_cast<void>(0) \
+ : rtc::webrtc_checks_impl::FatalLogCall<false>( \
+ __FILE__, __LINE__, #condition) & \
+ rtc::webrtc_checks_impl::LogStreamer<>()
#define RTC_CHECK_OP(name, op, val1, val2) \
- while (!rtc::Safe##name((val1), (val2))) \
- true ? rtc::webrtc_checks_impl::FatalLogCall<true>(__FILE__, __LINE__, "") & \
- rtc::webrtc_checks_impl::LogStreamer<>() \
- : rtc::webrtc_checks_impl::FatalLogCall<false>("", 0, "") & \
- rtc::webrtc_checks_impl::LogStreamer<>()
+ rtc::Safe##name((val1), (val2)) \
+ ? static_cast<void>(0) \
+ : rtc::webrtc_checks_impl::FatalLogCall<true>(__FILE__, __LINE__, \
+ #val1 " " #op " " #val2) & \
+ rtc::webrtc_checks_impl::LogStreamer<>() << (val1) << (val2)
+#else
+#define RTC_CHECK(condition) \
+ (condition) \
+ ? static_cast<void>(0) \
+ : true ? rtc::webrtc_checks_impl::FatalLogCall<false>(__FILE__, \
+ __LINE__, "") & \
+ rtc::webrtc_checks_impl::LogStreamer<>() \
+ : rtc::webrtc_checks_impl::FatalLogCall<false>("", 0, "") & \
+ rtc::webrtc_checks_impl::LogStreamer<>()
+
+#define RTC_CHECK_OP(name, op, val1, val2) \
+ rtc::Safe##name((val1), (val2)) \
+ ? static_cast<void>(0) \
+ : true ? rtc::webrtc_checks_impl::FatalLogCall<true>(__FILE__, __LINE__, \
+ "") & \
+ rtc::webrtc_checks_impl::LogStreamer<>() \
+ : rtc::webrtc_checks_impl::FatalLogCall<false>("", 0, "") & \
+ rtc::webrtc_checks_impl::LogStreamer<>()
#endif
#define RTC_CHECK_EQ(val1, val2) RTC_CHECK_OP(Eq, ==, val1, val2)