Teach googletest to use raw_ostream instead of just std::ostream.
authorJeffrey Yasskin <jyasskin@google.com>
Sat, 5 Sep 2009 18:16:17 +0000 (18:16 +0000)
committerJeffrey Yasskin <jyasskin@google.com>
Sat, 5 Sep 2009 18:16:17 +0000 (18:16 +0000)
This can break when there are implicit conversions from types raw_ostream
understands but std::ostream doesn't, but it increases the number of cases that
Just Work.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81093 91177308-0d34-0410-b5e6-96231b3b80d8

unittests/Support/ConstantRangeTest.cpp
utils/unittest/googletest/README.LLVM
utils/unittest/googletest/include/gtest/internal/gtest-internal.h

index 937b8805cf074677bc134239aff4a7d34ae0d765..64c945dedcade8c38af2fad5112a292392237f62 100644 (file)
@@ -16,13 +16,6 @@ using namespace llvm;
 
 namespace {
 
-// Support APInt output to an std::ostream.
-inline std::ostream &operator<<(std::ostream &OS, const APInt &Value) {
-  raw_os_ostream RawOS(OS);
-  RawOS << Value;
-  return OS;
-}
-
 class ConstantRangeTest : public ::testing::Test {
 protected:
   static ConstantRange Full;
index 2c673cc6ab749272ebe7835e750b027432e898c2..e907a5e6ea28f756196ae689b63d3a848ba554e2 100644 (file)
@@ -24,3 +24,8 @@ $ perl -pi -e 's|^#include "src/|#include "gtest/internal/|' *.cc
 $ rm -f gtest-all.cc gtest_main.cc
 
 $ mv COPYING LICENSE.TXT
+
+
+Modified as follows:
+* To GTestStreamToHelper in include/gtest/internal/gtest-internal.h,
+  added the ability to stream with raw_os_ostream.
index 37faaaebea48220c8570cd1f004f113fcb22e9be..242ffea12f925c9ccb4ce47e2943c610e84001f9 100644 (file)
@@ -56,6 +56,8 @@
 #include <gtest/internal/gtest-filepath.h>
 #include <gtest/internal/gtest-type-util.h>
 
+#include "llvm/Support/raw_os_ostream.h"
+
 // Due to C++ preprocessor weirdness, we need double indirection to
 // concatenate two tokens when one of them is __LINE__.  Writing
 //
 // ::operator<<;" in the definition of Message's operator<<.  That fix
 // doesn't require a helper function, but unfortunately doesn't
 // compile with MSVC.
+
+// LLVM INTERNAL CHANGE: To allow operator<< to work with both
+// std::ostreams and LLVM's raw_ostreams, we define a special
+// std::ostream with an implicit conversion to raw_ostream& and stream
+// to that.  This causes the compiler to prefer std::ostream overloads
+// but still find raw_ostream& overloads.
+namespace llvm {
+class convertible_fwd_ostream : public std::ostream {
+  std::ostream& os_;
+  raw_os_ostream ros_;
+
+public:
+  convertible_fwd_ostream(std::ostream& os)
+    : std::ostream(os.rdbuf()), os_(os), ros_(*this) {}
+  operator raw_ostream&() { return ros_; }
+};
+}
 template <typename T>
 inline void GTestStreamToHelper(std::ostream* os, const T& val) {
-  *os << val;
+  llvm::convertible_fwd_ostream cos(*os);
+  cos << val;
 }
 
 namespace testing {