Index: base/logging.h |
diff --git a/base/logging.h b/base/logging.h |
index 3088c291901453b1664a3b03e5240804e379f0fe..4888da8c5de81f7cfbcc4775e36687844df72105 100644 |
--- a/base/logging.h |
+++ b/base/logging.h |
@@ -725,24 +725,28 @@ const LogSeverity LOG_DCHECK = LOG_INFO; |
#else // _PREFAST_ |
-#if defined(__clang_analyzer__) |
+#if __has_feature(attribute_analyzer_noreturn) |
+// Alternative DCHECK implementation for Clang static analysis. |
-// Stops the analyzer from proceeding along the current codepath. |
-void AnalyzerNoReturn() __attribute__((analyzer_noreturn)) {} |
+// Prevents the analyzer from proceeding along the current codepath. |
+// Function is short-circuit evaluated when a DCHECK condition fails. |
+constexpr bool AnalyzerNoReturn() __attribute__((analyzer_noreturn)) { |
+ return false; |
+} |
-#define DCHECK(condition) \ |
- LAZY_STREAM( \ |
- LOG_STREAM(DCHECK), \ |
- DCHECK_IS_ON() ? (logging::AnalyzerNoReturn(), !(condition)) : false) \ |
+#define DCHECK(condition) \ |
+ LAZY_STREAM( \ |
+ LOG_STREAM(DCHECK), \ |
+ DCHECK_IS_ON() ? !((condition) || logging::AnalyzerNoReturn()) : false) \ |
<< "Check failed: " #condition ". " |
-#define DPCHECK(condition) \ |
- LAZY_STREAM( \ |
- PLOG_STREAM(DCHECK), \ |
- DCHECK_IS_ON() ? (logging::AnalyzerNoReturn(), !(condition)) : false) \ |
+#define DPCHECK(condition) \ |
+ LAZY_STREAM( \ |
+ PLOG_STREAM(DCHECK), \ |
+ DCHECK_IS_ON() ? !((condition) || logging::AnalyzerNoReturn()) : false) \ |
<< "Check failed: " #condition ". " |
-#else // __clang_analyzer__ |
+#else // attribute_analyzer_noreturn |
#define DCHECK(condition) \ |
LAZY_STREAM(LOG_STREAM(DCHECK), \ |
@@ -754,7 +758,7 @@ void AnalyzerNoReturn() __attribute__((analyzer_noreturn)) {} |
DCHECK_IS_ON() ? !(condition) : false) \ |
<< "Check failed: " #condition ". " |
-#endif // __clang_analyzer__ |
+#endif // attribute_analyzer_noreturn |
#define DCHECK_INTERNAL_TEST(condition) \ |
(DCHECK_IS_ON() ? !DCHECK_INTERNAL_ASSUME(condition) : false) |