X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=unittests%2FSupport%2FErrorOrTest.cpp;h=73d0e3f2bb711f12656176f742b1f8a4b0c69787;hb=dae382206cce8018e43e0743d908abfb9108532c;hp=feb6a086e1943a012568ee7206adbe1477e92d5a;hpb=f94b3480fce38b376d02fb0775b9448bbda9313b;p=oota-llvm.git diff --git a/unittests/Support/ErrorOrTest.cpp b/unittests/Support/ErrorOrTest.cpp index feb6a086e19..73d0e3f2bb7 100644 --- a/unittests/Support/ErrorOrTest.cpp +++ b/unittests/Support/ErrorOrTest.cpp @@ -8,9 +8,8 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/ErrorOr.h" - +#include "llvm/Support/Errc.h" #include "gtest/gtest.h" - #include using namespace llvm; @@ -22,22 +21,25 @@ ErrorOr t2() { return errc::invalid_argument; } TEST(ErrorOr, SimpleValue) { ErrorOr a = t1(); - EXPECT_TRUE(a); + // FIXME: This is probably a bug in gtest. EXPECT_TRUE should expand to + // include the !! to make it friendly to explicit bool operators. + EXPECT_TRUE(!!a); EXPECT_EQ(1, *a); + ErrorOr b = a; + EXPECT_EQ(1, *b); + a = t2(); EXPECT_FALSE(a); - EXPECT_EQ(errc::invalid_argument, a); + EXPECT_EQ(a.getError(), errc::invalid_argument); #ifdef EXPECT_DEBUG_DEATH EXPECT_DEBUG_DEATH(*a, "Cannot get value when an error exists"); #endif } -#if LLVM_HAS_CXX11_STDLIB ErrorOr > t3() { return std::unique_ptr(new int(3)); } -#endif TEST(ErrorOr, Types) { int x; @@ -45,22 +47,54 @@ TEST(ErrorOr, Types) { *a = 42; EXPECT_EQ(42, x); -#if LLVM_HAS_CXX11_STDLIB // Move only types. EXPECT_EQ(3, **t3()); -#endif } struct B {}; struct D : B {}; TEST(ErrorOr, Covariant) { - ErrorOr b(ErrorOr(0)); - b = ErrorOr(0); + ErrorOr b(ErrorOr(nullptr)); + b = ErrorOr(nullptr); -#if LLVM_HAS_CXX11_STDLIB - ErrorOr > b1(ErrorOr >(0)); - b1 = ErrorOr >(0); -#endif + ErrorOr > b1(ErrorOr >(nullptr)); + b1 = ErrorOr >(nullptr); + + ErrorOr> b2(ErrorOr(nullptr)); + ErrorOr b3(nullptr); + ErrorOr> b4(b3); } + +TEST(ErrorOr, Comparison) { + ErrorOr x(errc::no_such_file_or_directory); + EXPECT_EQ(x, errc::no_such_file_or_directory); +} + +// ErrorOr x(nullptr); +// ErrorOr> y = x; // invalid conversion +static_assert( + !std::is_convertible &, + ErrorOr>>::value, + "do not invoke explicit ctors in implicit conversion from lvalue"); + +// ErrorOr> y = ErrorOr(nullptr); // invalid +// // conversion +static_assert( + !std::is_convertible &&, + ErrorOr>>::value, + "do not invoke explicit ctors in implicit conversion from rvalue"); + +// ErrorOr x(nullptr); +// ErrorOr> y; +// y = x; // invalid conversion +static_assert(!std::is_assignable>, + const ErrorOr &>::value, + "do not invoke explicit ctors in assignment"); + +// ErrorOr> x; +// x = ErrorOr(nullptr); // invalid conversion +static_assert(!std::is_assignable>, + ErrorOr &&>::value, + "do not invoke explicit ctors in assignment"); } // end anon namespace