X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=unittests%2FSupport%2FErrorOrTest.cpp;h=73d0e3f2bb711f12656176f742b1f8a4b0c69787;hb=9fc3869acde3a67528cd87f5ead02b5b8eccbd0a;hp=aa0ddd5e79c922dcd1fd10bac5f84229568a5eef;hpb=780e9004c85ee33a0bdd592aebe9b959f29c4fb2;p=oota-llvm.git diff --git a/unittests/Support/ErrorOrTest.cpp b/unittests/Support/ErrorOrTest.cpp index aa0ddd5e79c..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; @@ -18,26 +17,29 @@ using namespace llvm; namespace { ErrorOr t1() {return 1;} -ErrorOr t2() {return make_error_code(errc::invalid_argument);} +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,60 +47,54 @@ TEST(ErrorOr, Types) { *a = 42; EXPECT_EQ(42, x); - EXPECT_FALSE(ErrorOr(make_error_code(errc::broken_pipe))); - EXPECT_TRUE(ErrorOr(make_error_code(errc::success))); - -#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 -} -} // end anon namespace + ErrorOr > b1(ErrorOr >(nullptr)); + b1 = ErrorOr >(nullptr); -struct InvalidArgError { - InvalidArgError() {} - InvalidArgError(std::string S) : ArgName(S) {} - std::string ArgName; -}; - -namespace llvm { -template<> -struct ErrorOrUserDataTraits : true_type { - static error_code error() { - return make_error_code(errc::invalid_argument); - } -}; -} // end namespace llvm - -ErrorOr t4() { - return InvalidArgError("adena"); + ErrorOr> b2(ErrorOr(nullptr)); + ErrorOr b3(nullptr); + ErrorOr> b4(b3); } -ErrorOr t5() { - return InvalidArgError("pie"); +TEST(ErrorOr, Comparison) { + ErrorOr x(errc::no_such_file_or_directory); + EXPECT_EQ(x, errc::no_such_file_or_directory); } -namespace { -TEST(ErrorOr, UserErrorData) { - ErrorOr a = t4(); - EXPECT_EQ(errc::invalid_argument, a); - EXPECT_EQ("adena", t4().getError().ArgName); - - ErrorOr b = t5(); - EXPECT_EQ(errc::invalid_argument, b); - EXPECT_EQ("pie", b.getError().ArgName); -} +// 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