Fix MSVC build by not putting an error_code directly in a union.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 5 Nov 2013 01:07:06 +0000 (01:07 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 5 Nov 2013 01:07:06 +0000 (01:07 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194032 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/ErrorOr.h

index 148494c5d874885ce5103af838f291a648b690a3..0fdafa09d58f3df451091ad7bff720353c394e40 100644 (file)
@@ -115,11 +115,11 @@ public:
                                             is_error_condition_enum<E>::value,
                                             void *>::type = 0)
       : HasError(true), IsValid(true) {
-    Error = make_error_code(ErrorCode);
+    new (getError()) error_code(make_error_code(ErrorCode));
   }
 
   ErrorOr(llvm::error_code EC) : HasError(true), IsValid(true) {
-    Error = EC;
+    new (getError()) error_code(EC);
   }
 
   ErrorOr(T Val) : HasError(false), IsValid(true) {
@@ -186,7 +186,7 @@ public:
 
   operator llvm::error_code() const {
     assert(IsValid && "Can't do anything on a default constructed ErrorOr!");
-    return HasError ? Error : llvm::error_code::success();
+    return HasError ? *getError() : llvm::error_code::success();
   }
 
   pointer operator ->() {
@@ -210,8 +210,8 @@ private:
       new (get()) storage_type(*Other.get());
     } else {
       // Get other's error.
-      Error = Other.Error;
       HasError = true;
+      new (getError()) error_code(Other);
     }
   }
 
@@ -249,8 +249,8 @@ private:
       Other.IsValid = false;
     } else {
       // Get other's error.
-      Error = Other.Error;
       HasError = true;
+      new (getError()) error_code(Other);
       // Tell other not to do any destruction.
       Other.IsValid = false;
     }
@@ -286,9 +286,20 @@ private:
     return reinterpret_cast<const storage_type*>(TStorage.buffer);
   }
 
+  error_code *getError() {
+    assert(IsValid && "Can't do anything on a default constructed ErrorOr!");
+    assert(HasError && "Cannot get error when a value exists!");
+    return reinterpret_cast<error_code*>(ErrorStorage.buffer);
+  }
+
+  const error_code *getError() const {
+    return const_cast<ErrorOr<T> *>(this)->getError();
+  }
+
+
   union {
     AlignedCharArrayUnion<storage_type> TStorage;
-    error_code Error;
+    AlignedCharArrayUnion<error_code> ErrorStorage;
   };
   bool HasError : 1;
   bool IsValid : 1;