From 6914ae239499b99ab8b3fcbc7c8b584875e29e1b Mon Sep 17 00:00:00 2001
From: Gennadiy Civil <misterg@google.com>
Date: Thu, 11 Jan 2018 11:31:23 -0500
Subject: [PATCH] Upstream cl 103120214

---
 googletest/include/gtest/gtest.h              |  7 ++++-
 .../include/gtest/internal/gtest-internal.h   | 28 +++++++++++++++++--
 googletest/src/gtest.cc                       |  5 ++--
 3 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/googletest/include/gtest/gtest.h b/googletest/include/gtest/gtest.h
index 2ad5a0cb..57201123 100644
--- a/googletest/include/gtest/gtest.h
+++ b/googletest/include/gtest/gtest.h
@@ -2110,9 +2110,14 @@ GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
 // of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
 // to appear in the same block - as long as they are on different
 // lines.
+//
+// Assuming that each thread maintains its own stack of traces.
+// Therefore, a SCOPED_TRACE() would (correctly) only affect the
+// assertions in its own thread.
 #define SCOPED_TRACE(message) \
   ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
-    __FILE__, __LINE__, ::testing::Message() << (message))
+    __FILE__, __LINE__, (message))
+
 
 // Compile-time assertion for type equality.
 // StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
diff --git a/googletest/include/gtest/internal/gtest-internal.h b/googletest/include/gtest/internal/gtest-internal.h
index 2a6e4dad..454fffbc 100644
--- a/googletest/include/gtest/internal/gtest-internal.h
+++ b/googletest/include/gtest/internal/gtest-internal.h
@@ -27,7 +27,6 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 //
-// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
 //
 // The Google C++ Testing Framework (Google Test)
 //
@@ -61,8 +60,8 @@
 #include <vector>
 
 #include "gtest/gtest-message.h"
-#include "gtest/internal/gtest-string.h"
 #include "gtest/internal/gtest-filepath.h"
+#include "gtest/internal/gtest-string.h"
 #include "gtest/internal/gtest-type-util.h"
 
 // Due to C++ preprocessor weirdness, we need double indirection to
@@ -157,7 +156,28 @@ class GTEST_API_ ScopedTrace {
  public:
   // The c'tor pushes the given source file location and message onto
   // a trace stack maintained by Google Test.
-  ScopedTrace(const char* file, int line, const Message& message);
+
+  // Template version. Uses Message() to convert the values into strings.
+  // Slow, but flexible.
+  template <typename T>
+  ScopedTrace(const char* file, int line, const T& message) {
+    PushTrace(file, line, (Message() << message).GetString());
+  }
+
+  // Optimize for some known types.
+  ScopedTrace(const char* file, int line, const char* message) {
+    PushTrace(file, line, message ? message : "(null)");
+  }
+
+#if GTEST_HAS_GLOBAL_STRING
+  ScopedTrace(const char* file, int line, const ::string& message) {
+    PushTrace(file, line, message);
+  }
+#endif
+
+  ScopedTrace(const char* file, int line, const std::string& message) {
+    PushTrace(file, line, message);
+  }
 
   // The d'tor pops the info pushed by the c'tor.
   //
@@ -166,6 +186,8 @@ class GTEST_API_ ScopedTrace {
   ~ScopedTrace();
 
  private:
+  void PushTrace(const char* file, int line, std::string message);
+
   GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
 } GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its
                             // c'tor and d'tor.  Therefore it doesn't
diff --git a/googletest/src/gtest.cc b/googletest/src/gtest.cc
index 42f04844..0aeeb8e7 100644
--- a/googletest/src/gtest.cc
+++ b/googletest/src/gtest.cc
@@ -3839,12 +3839,11 @@ void StreamingListener::SocketWriter::MakeConnection() {
 
 // Pushes the given source file location and message onto a per-thread
 // trace stack maintained by Google Test.
-ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
-    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+void ScopedTrace::PushTrace(const char* file, int line, std::string message) {
   TraceInfo trace;
   trace.file = file;
   trace.line = line;
-  trace.message = message.GetString();
+  trace.message.swap(message);
 
   UnitTest::GetInstance()->PushGTestTrace(trace);
 }