summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael J. Spencer <bigcheesegs@gmail.com>2013-02-28 01:44:26 +0000
committerMichael J. Spencer <bigcheesegs@gmail.com>2013-02-28 01:44:26 +0000
commit9b4886ee55c4d13cf0f663fe0ee5e0cfacb39667 (patch)
tree04c623c4b90a0f279e1cb5405c5b62f7bbb7baeb
parent2b9a946f981963c226eaafe1dd8fb8801b87d411 (diff)
downloadllvm-9b4886ee55c4d13cf0f663fe0ee5e0cfacb39667.tar.gz
llvm-9b4886ee55c4d13cf0f663fe0ee5e0cfacb39667.tar.bz2
llvm-9b4886ee55c4d13cf0f663fe0ee5e0cfacb39667.tar.xz
[Support][ErrorOr] Add support for implicit conversion from error code/condition enums.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176228 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Support/ErrorOr.h26
-rw-r--r--unittests/Support/ErrorOrTest.cpp6
2 files changed, 29 insertions, 3 deletions
diff --git a/include/llvm/Support/ErrorOr.h b/include/llvm/Support/ErrorOr.h
index ceec33d185..f3ac305fe7 100644
--- a/include/llvm/Support/ErrorOr.h
+++ b/include/llvm/Support/ErrorOr.h
@@ -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);
diff --git a/unittests/Support/ErrorOrTest.cpp b/unittests/Support/ErrorOrTest.cpp
index aa0ddd5e79..4853426c94 100644
--- a/unittests/Support/ErrorOrTest.cpp
+++ b/unittests/Support/ErrorOrTest.cpp
@@ -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.