Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2606)

Unified Diff: base/logging.h

Issue 2559323007: Improve EAT_STREAM_PARAMETERS for Windows x86 (Closed)
Patch Set: 0 Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/check_example.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/logging.h
diff --git a/base/logging.h b/base/logging.h
index ce87a5351f7877245f673fb1b255986be95a5bda..25c37c2612aaf1fce46d55a330c6d30db42dd9f6 100644
--- a/base/logging.h
+++ b/base/logging.h
@@ -426,9 +426,19 @@ const LogSeverity LOG_0 = LOG_ERROR;
#define PLOG_IF(severity, condition) \
LAZY_STREAM(PLOG_STREAM(severity), LOG_IS_ON(severity) && (condition))
-// The actual stream used isn't important.
-#define EAT_STREAM_PARAMETERS \
- true ? (void) 0 : ::logging::LogMessageVoidify() & LOG_STREAM(FATAL)
+// Note that the null ostream is used instead of an arbitrary LOG() stream to
+// avoid the creation of an object with a non-trivial destructor (LogMessage).
+// On MSVC x86 (checked on 2015 Update 3), doing so causes a few additional
+// pointless instructions to be emitted even at full optimization level, and
dcheng 2016/12/10 03:44:03 Nit: remove 'and'
scottmg 2016/12/10 05:02:01 Oops, done.
+// even though the : arm of the ternary operator is clearly never executed.
+// Using a simpler POD object with a templated operator<< also works to avoid
+// these instructions. However, this causes warnings on statically defined
+// implementations of operator<<(std::ostream, ...) in some .cc files, because
+// they become defined-but-unreferenced functions.
+#define EAT_STREAM_PARAMETERS \
+ true \
+ ? (void)0 \
+ : ::logging::LogMessageVoidify() & (*reinterpret_cast<std::ostream*>(0))
// Captures the result of a CHECK_EQ (for example) and facilitates testing as a
// boolean.
« no previous file with comments | « base/check_example.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698