[Support][ErrorOr] Add support for implicit conversion from error code/condition...
authorMichael J. Spencer <bigcheesegs@gmail.com>
Thu, 28 Feb 2013 01:44:26 +0000 (01:44 +0000)
committerMichael J. Spencer <bigcheesegs@gmail.com>
Thu, 28 Feb 2013 01:44:26 +0000 (01:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176228 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/ErrorOr.h
unittests/Support/ErrorOrTest.cpp

index ceec33d1852621cfd773b7c5fc51a5d565e1e68b..f3ac305fe77560f34fc549ff953e02be22598be3 100644 (file)
@@ -180,6 +180,16 @@ private:
 public:
   ErrorOr() : IsValid(false) {}
 
+  template <class E>
+  ErrorOr(E ErrorCode, typename enable_if_c<is_error_code_enum<E>::value ||
+                                            is_error_condition_enum<E>::value,
+                                            void *>::type = 0)
+      : HasError(true), IsValid(true) {
+    Error = new ErrorHolderBase;
+    Error->Error = make_error_code(ErrorCode);
+    Error->HasUserData = false;
+  }
+
   ErrorOr(llvm::error_code EC) : HasError(true), IsValid(true) {
     Error = new ErrorHolderBase;
     Error->Error = EC;
@@ -387,6 +397,22 @@ class ErrorOr<void> {
 public:
   ErrorOr() : Error(0, 0) {}
 
+  template <class E>
+  ErrorOr(E ErrorCode, typename enable_if_c<is_error_code_enum<E>::value ||
+                                            is_error_condition_enum<E>::value,
+                                            void *> ::type = 0)
+      : Error(0, 0) {
+    error_code EC = make_error_code(ErrorCode);
+    if (EC == errc::success) {
+      Error.setInt(1);
+      return;
+    }
+    ErrorHolderBase *EHB = new ErrorHolderBase;
+    EHB->Error = EC;
+    EHB->HasUserData = false;
+    Error.setPointer(EHB);
+  }
+
   ErrorOr(llvm::error_code EC) : Error(0, 0) {
     if (EC == errc::success) {
       Error.setInt(1);
index aa0ddd5e79c922dcd1fd10bac5f84229568a5eef..4853426c9470671d9476553a6f788f56e09e60ce 100644 (file)
@@ -18,7 +18,7 @@ using namespace llvm;
 namespace {
 
 ErrorOr<int> t1() {return 1;}
-ErrorOr<int> t2() {return make_error_code(errc::invalid_argument);}
+ErrorOr<int> t2() { return errc::invalid_argument; }
 
 TEST(ErrorOr, SimpleValue) {
   ErrorOr<int> a = t1();
@@ -45,8 +45,8 @@ TEST(ErrorOr, Types) {
   *a = 42;
   EXPECT_EQ(42, x);
 
-  EXPECT_FALSE(ErrorOr<void>(make_error_code(errc::broken_pipe)));
-  EXPECT_TRUE(ErrorOr<void>(make_error_code(errc::success)));
+  EXPECT_FALSE(ErrorOr<void>(errc::broken_pipe));
+  EXPECT_TRUE(ErrorOr<void>(errc::success));
 
 #if LLVM_HAS_CXX11_STDLIB
   // Move only types.