diff options
author | Pavel Labath <pavel@labath.sk> | 2019-01-18 12:52:03 +0000 |
---|---|---|
committer | Pavel Labath <pavel@labath.sk> | 2019-01-18 12:52:03 +0000 |
commit | 47e9a21d34849b52bbde557f3aacca2941f34092 (patch) | |
tree | acf5460e9a8b9c0a2f8cce87790d7880efeb3bd2 /llvm/unittests/ADT | |
parent | 5e36433189ba3297af33a9088ee17abde10c7871 (diff) | |
download | bcm5719-llvm-47e9a21d34849b52bbde557f3aacca2941f34092.tar.gz bcm5719-llvm-47e9a21d34849b52bbde557f3aacca2941f34092.zip |
[ADT] Add streaming operators for llvm::Optional
Summary:
The operators simply print the underlying value or "None".
The trickier part of this patch is making sure the streaming operators
work even in unit tests (which was my primary motivation, though I can
also see them being useful elsewhere). Since the stream operator was a
template, implicit conversions did not kick in, and our gtest glue code
was explicitly introducing an implicit conversion to make sure other
implicit conversions do not kick in :P. I resolve that by specializing
llvm_gtest::StreamSwitch for llvm:Optional<T>.
Reviewers: sammccall, dblaikie
Reviewed By: sammccall
Subscribers: mgorny, dexonsmith, kristina, llvm-commits
Differential Revision: https://reviews.llvm.org/D56795
llvm-svn: 351548
Diffstat (limited to 'llvm/unittests/ADT')
-rw-r--r-- | llvm/unittests/ADT/OptionalTest.cpp | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/llvm/unittests/ADT/OptionalTest.cpp b/llvm/unittests/ADT/OptionalTest.cpp index 20bc9da4d59..e6997ef8be7 100644 --- a/llvm/unittests/ADT/OptionalTest.cpp +++ b/llvm/unittests/ADT/OptionalTest.cpp @@ -8,6 +8,9 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/Optional.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/Support/raw_ostream.h" +#include "gtest/gtest-spi.h" #include "gtest/gtest.h" using namespace llvm; @@ -518,5 +521,52 @@ TEST_F(OptionalTest, OperatorGreaterEqual) { CheckRelation<GreaterEqual>(InequalityLhs, InequalityRhs, !IsLess); } -} // end anonymous namespace +struct ComparableAndStreamable { + friend bool operator==(ComparableAndStreamable, + ComparableAndStreamable) LLVM_ATTRIBUTE_USED { + return true; + } + + friend raw_ostream &operator<<(raw_ostream &OS, ComparableAndStreamable) { + return OS << "ComparableAndStreamable"; + } + static Optional<ComparableAndStreamable> get() { + return ComparableAndStreamable(); + } +}; + +TEST_F(OptionalTest, StreamOperator) { + auto to_string = [](Optional<ComparableAndStreamable> O) { + SmallString<16> S; + raw_svector_ostream OS(S); + OS << O; + return S; + }; + EXPECT_EQ("ComparableAndStreamable", + to_string(ComparableAndStreamable::get())); + EXPECT_EQ("None", to_string(None)); +} + +struct Comparable { + friend bool operator==(Comparable, Comparable) LLVM_ATTRIBUTE_USED { + return true; + } + static Optional<Comparable> get() { return Comparable(); } +}; + +TEST_F(OptionalTest, UseInUnitTests) { + // Test that we invoke the streaming operators when pretty-printing values in + // EXPECT macros. + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(llvm::None, ComparableAndStreamable::get()), + R"(Expected: llvm::None + Which is: None +To be equal to: ComparableAndStreamable::get() + Which is: ComparableAndStreamable)"); + + // Test that it is still possible to compare objects which do not have a + // custom streaming operator. + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(llvm::None, Comparable::get()), "object"); +} + +} // end anonymous namespace |