ErrorOrTest.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. //===- unittests/ErrorOrTest.cpp - ErrorOr.h tests ------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/Support/ErrorOr.h"
  10. #include "gtest/gtest.h"
  11. #include <memory>
  12. using namespace llvm;
  13. namespace {
  14. ErrorOr<int> t1() {return 1;}
  15. ErrorOr<int> t2() {return make_error_code(errc::invalid_argument);}
  16. TEST(ErrorOr, SimpleValue) {
  17. ErrorOr<int> a = t1();
  18. EXPECT_TRUE(a);
  19. EXPECT_EQ(1, *a);
  20. a = t2();
  21. EXPECT_FALSE(a);
  22. EXPECT_EQ(errc::invalid_argument, a);
  23. #ifdef EXPECT_DEBUG_DEATH
  24. EXPECT_DEBUG_DEATH(*a, "Cannot get value when an error exists");
  25. #endif
  26. }
  27. #if LLVM_HAS_CXX11_STDLIB
  28. ErrorOr<std::unique_ptr<int> > t3() {
  29. return std::unique_ptr<int>(new int(3));
  30. }
  31. #endif
  32. TEST(ErrorOr, Types) {
  33. int x;
  34. ErrorOr<int&> a(x);
  35. *a = 42;
  36. EXPECT_EQ(42, x);
  37. EXPECT_FALSE(ErrorOr<void>(make_error_code(errc::broken_pipe)));
  38. EXPECT_TRUE(ErrorOr<void>(make_error_code(errc::success)));
  39. #if LLVM_HAS_CXX11_STDLIB
  40. // Move only types.
  41. EXPECT_EQ(3, **t3());
  42. #endif
  43. }
  44. struct B {};
  45. struct D : B {};
  46. TEST(ErrorOr, Covariant) {
  47. ErrorOr<B*> b(ErrorOr<D*>(0));
  48. #if LLVM_HAS_CXX11_STDLIB
  49. ErrorOr<std::unique_ptr<B> > b1(ErrorOr<std::unique_ptr<D> >(0));
  50. #endif
  51. }
  52. } // end anon namespace
  53. struct InvalidArgError {
  54. InvalidArgError() {}
  55. InvalidArgError(std::string S) : ArgName(S) {}
  56. std::string ArgName;
  57. };
  58. namespace llvm {
  59. template<>
  60. struct ErrorOrUserDataTraits<InvalidArgError> : true_type {
  61. static error_code error() {
  62. return make_error_code(errc::invalid_argument);
  63. }
  64. };
  65. } // end namespace llvm
  66. ErrorOr<int> t4() {
  67. return InvalidArgError("adena");
  68. }
  69. ErrorOr<void> t5() {
  70. return InvalidArgError("pie");
  71. }
  72. namespace {
  73. TEST(ErrorOr, UserErrorData) {
  74. ErrorOr<int> a = t4();
  75. EXPECT_EQ(errc::invalid_argument, a);
  76. EXPECT_EQ("adena", t4().getError<InvalidArgError>().ArgName);
  77. ErrorOr<void> b = t5();
  78. EXPECT_EQ(errc::invalid_argument, b);
  79. EXPECT_EQ("pie", b.getError<InvalidArgError>().ArgName);
  80. }
  81. } // end anon namespace