[Support][ErrorOr] Add support for convertable types.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174357 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Michael J. Spencer
2013-02-05 08:22:27 +00:00
parent ea59f896a6
commit a33e1fafac
2 changed files with 16 additions and 3 deletions

View File

@@ -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!");