diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2013-02-05 08:22:27 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2013-02-05 08:22:27 +0000 |
commit | a33e1fafac7fedb1b080ef07ddf9ad6ddff3a830 (patch) | |
tree | 2727b46a9768a084b243a39e79303d785b6b6745 | |
parent | ea59f896a672c2e1ef9f02277bce60257aa60989 (diff) | |
download | external_llvm-a33e1fafac7fedb1b080ef07ddf9ad6ddff3a830.zip external_llvm-a33e1fafac7fedb1b080ef07ddf9ad6ddff3a830.tar.gz external_llvm-a33e1fafac7fedb1b080ef07ddf9ad6ddff3a830.tar.bz2 |
[Support][ErrorOr] Add support for convertable types.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174357 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Support/ErrorOr.h | 8 | ||||
-rw-r--r-- | unittests/Support/ErrorOrTest.cpp | 11 |
2 files changed, 16 insertions, 3 deletions
diff --git a/include/llvm/Support/ErrorOr.h b/include/llvm/Support/ErrorOr.h index 452d85c..653b9e5 100644 --- a/include/llvm/Support/ErrorOr.h +++ b/include/llvm/Support/ErrorOr.h @@ -162,6 +162,7 @@ public: /// T cannot be a rvalue reference. template<class T> class ErrorOr { + template <class OtherT> friend class ErrorOr; static const bool isRef = is_reference<T>::value; typedef ReferenceStorage<typename remove_reference<T>::type> wrap; @@ -198,7 +199,8 @@ public: new (get()) storage_type(moveIfMoveConstructible<storage_type>(Val)); } - ErrorOr(const ErrorOr &Other) : IsValid(false) { + template <class OtherT> + ErrorOr(ErrorOr<OtherT> &Other) : IsValid(false) { // Construct an invalid ErrorOr if other is invalid. if (!Other.IsValid) return; @@ -227,7 +229,8 @@ public: } #if LLVM_HAS_RVALUE_REFERENCES - ErrorOr(ErrorOr &&Other) : IsValid(false) { + template <class OtherT> + ErrorOr(ErrorOr<OtherT> &&Other) : IsValid(false) { // Construct an invalid ErrorOr if other is invalid. if (!Other.IsValid) return; @@ -311,7 +314,6 @@ private: return &Val->get(); } -protected: storage_type *get() { assert(IsValid && "Can't do anything on a default constructed ErrorOr!"); assert(!HasError && "Cannot get value when an error exists!"); diff --git a/unittests/Support/ErrorOrTest.cpp b/unittests/Support/ErrorOrTest.cpp index a860886..6cef4fc 100644 --- a/unittests/Support/ErrorOrTest.cpp +++ b/unittests/Support/ErrorOrTest.cpp @@ -53,6 +53,17 @@ TEST(ErrorOr, Types) { EXPECT_EQ(3, **t3()); #endif } + +struct B {}; +struct D : B {}; + +TEST(ErrorOr, Covariant) { + ErrorOr<B*> b(ErrorOr<D*>(0)); + +#if LLVM_HAS_CXX11_STDLIB + ErrorOr<std::unique_ptr<B> > b1(ErrorOr<std::unique_ptr<D> >(0)); +#endif +} } // end anon namespace struct InvalidArgError { |