[llvm] r354142 - Revert r354137 - OptionalStorage implementation for trivial type, take III

Serge Guelton via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 15 08:12:46 PST 2019


Author: serge_sans_paille
Date: Fri Feb 15 08:12:46 2019
New Revision: 354142

URL: http://llvm.org/viewvc/llvm-project?rev=354142&view=rev
Log:
Revert r354137 - OptionalStorage implementation for trivial type, take III

This still fails on some random platform, and I fail to reproduce the issue.

Modified:
    llvm/trunk/include/llvm/ADT/Optional.h

Modified: llvm/trunk/include/llvm/ADT/Optional.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/Optional.h?rev=354142&r1=354141&r2=354142&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/Optional.h (original)
+++ llvm/trunk/include/llvm/ADT/Optional.h Fri Feb 15 08:12:46 2019
@@ -109,54 +109,6 @@ template <typename T, bool = is_triviall
   }
 };
 
-template <typename T> struct OptionalStorage<T, true> {
-  struct empty_type {};
-  union {
-    empty_type empty;
-    T value;
-  };
-  bool hasVal = false;
-
-  OptionalStorage() : empty{} {}
-
-  OptionalStorage(const T &y) : hasVal(true) {
-    new ((void*)std::addressof(value)) T(y);
-  }
-  OptionalStorage(const OptionalStorage &O) = default;
-  OptionalStorage(T &&y) : hasVal(true) {
-    new ((void*)std::addressof(value)) T(std::move(y));
-  }
-
-  OptionalStorage(OptionalStorage &&O) = default;
-
-  OptionalStorage &operator=(T &&y) {
-    hasVal = true;
-    new ((void*)std::addressof(value)) T(std::move(y));
-    return *this;
-  }
-  OptionalStorage &operator=(OptionalStorage &&O) = default;
-
-  OptionalStorage &operator=(const T &y) {
-    hasVal = true;
-    new ((void*)std::addressof(value)) T(y);
-    return *this;
-  }
-  OptionalStorage &operator=(const OptionalStorage &O) = default;
-
-  ~OptionalStorage() = default;
-
-  T *getPointer() {
-    assert(hasVal);
-    return &value;
-  }
-  const T *getPointer() const {
-    assert(hasVal);
-    return &value;
-  }
-
-  void reset() { hasVal = false; }
-};
-
 } // namespace optional_detail
 
 template <typename T> class Optional {
@@ -201,11 +153,11 @@ public:
 
   const T *getPointer() const {
     assert(Storage.hasVal);
-    return Storage.getPointer();
+    return reinterpret_cast<const T *>(Storage.storage.buffer);
   }
   T *getPointer() {
     assert(Storage.hasVal);
-    return Storage.getPointer();
+    return reinterpret_cast<T *>(Storage.storage.buffer);
   }
   const T &getValue() const LLVM_LVALUE_FUNCTION { return *getPointer(); }
   T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }




More information about the llvm-commits mailing list