| 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)
|
|
|