1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

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.

llvm-svn: 81093
This commit is contained in:
Jeffrey Yasskin 2009-09-05 18:16:17 +00:00
parent 3aafa8d4a3
commit 25713a50a3
3 changed files with 26 additions and 8 deletions

View File

@ -16,13 +16,6 @@ using namespace llvm;
namespace { 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 { class ConstantRangeTest : public ::testing::Test {
protected: protected:
static ConstantRange Full; static ConstantRange Full;

View File

@ -24,3 +24,8 @@ $ perl -pi -e 's|^#include "src/|#include "gtest/internal/|' *.cc
$ rm -f gtest-all.cc gtest_main.cc $ rm -f gtest-all.cc gtest_main.cc
$ mv COPYING LICENSE.TXT $ 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.

View File

@ -56,6 +56,8 @@
#include <gtest/internal/gtest-filepath.h> #include <gtest/internal/gtest-filepath.h>
#include <gtest/internal/gtest-type-util.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 // Due to C++ preprocessor weirdness, we need double indirection to
// concatenate two tokens when one of them is __LINE__. Writing // concatenate two tokens when one of them is __LINE__. Writing
// //
@ -92,9 +94,27 @@
// ::operator<<;" in the definition of Message's operator<<. That fix // ::operator<<;" in the definition of Message's operator<<. That fix
// doesn't require a helper function, but unfortunately doesn't // doesn't require a helper function, but unfortunately doesn't
// compile with MSVC. // 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> template <typename T>
inline void GTestStreamToHelper(std::ostream* os, const T& val) { inline void GTestStreamToHelper(std::ostream* os, const T& val) {
*os << val; llvm::convertible_fwd_ostream cos(*os);
cos << val;
} }
namespace testing { namespace testing {