From 9c0c3bf1ec2feb861f19867d4091350010b23de6 Mon Sep 17 00:00:00 2001 From: Jeffrey Yasskin Date: Sat, 5 Sep 2009 18:16:17 +0000 Subject: Teach googletest to use raw_ostream instead of just std::ostream. 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 --- .../include/gtest/internal/gtest-internal.h | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'utils/unittest/googletest/include/gtest/internal/gtest-internal.h') diff --git a/utils/unittest/googletest/include/gtest/internal/gtest-internal.h b/utils/unittest/googletest/include/gtest/internal/gtest-internal.h index 37faaae..242ffea 100644 --- a/utils/unittest/googletest/include/gtest/internal/gtest-internal.h +++ b/utils/unittest/googletest/include/gtest/internal/gtest-internal.h @@ -56,6 +56,8 @@ #include #include +#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 // @@ -92,9 +94,27 @@ // ::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 inline void GTestStreamToHelper(std::ostream* os, const T& val) { - *os << val; + llvm::convertible_fwd_ostream cos(*os); + cos << val; } namespace testing { -- cgit v1.1