From eeb9ccaa0009369d17220cbe1d366f5ba40fc9a1 Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Fri, 17 Jan 2020 17:35:13 +0100 Subject: [PATCH] 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 Commit-Queue: Danil Chapovalov Cr-Commit-Position: refs/heads/master@{#30317} --- rtc_base/checks.h | 52 +++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/rtc_base/checks.h b/rtc_base/checks.h index 8d361cf05d..0b461c8984 100644 --- a/rtc_base/checks.h +++ b/rtc_base/checks.h @@ -367,32 +367,36 @@ class FatalLogCall final { // 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(__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(__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(__FILE__, __LINE__, "") & \ - rtc::webrtc_checks_impl::LogStreamer<>() \ - : rtc::webrtc_checks_impl::FatalLogCall("", 0, "") & \ - rtc::webrtc_checks_impl::LogStreamer<>() +#define RTC_CHECK(condition) \ + (condition) ? static_cast(0) \ + : rtc::webrtc_checks_impl::FatalLogCall( \ + __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(__FILE__, __LINE__, "") & \ - rtc::webrtc_checks_impl::LogStreamer<>() \ - : rtc::webrtc_checks_impl::FatalLogCall("", 0, "") & \ - rtc::webrtc_checks_impl::LogStreamer<>() + rtc::Safe##name((val1), (val2)) \ + ? static_cast(0) \ + : rtc::webrtc_checks_impl::FatalLogCall(__FILE__, __LINE__, \ + #val1 " " #op " " #val2) & \ + rtc::webrtc_checks_impl::LogStreamer<>() << (val1) << (val2) +#else +#define RTC_CHECK(condition) \ + (condition) \ + ? static_cast(0) \ + : true ? rtc::webrtc_checks_impl::FatalLogCall(__FILE__, \ + __LINE__, "") & \ + rtc::webrtc_checks_impl::LogStreamer<>() \ + : rtc::webrtc_checks_impl::FatalLogCall("", 0, "") & \ + rtc::webrtc_checks_impl::LogStreamer<>() + +#define RTC_CHECK_OP(name, op, val1, val2) \ + rtc::Safe##name((val1), (val2)) \ + ? static_cast(0) \ + : true ? rtc::webrtc_checks_impl::FatalLogCall(__FILE__, __LINE__, \ + "") & \ + rtc::webrtc_checks_impl::LogStreamer<>() \ + : rtc::webrtc_checks_impl::FatalLogCall("", 0, "") & \ + rtc::webrtc_checks_impl::LogStreamer<>() #endif #define RTC_CHECK_EQ(val1, val2) RTC_CHECK_OP(Eq, ==, val1, val2)