1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

Revert r354199: Make Optional<T> Trivially Copyable when T is trivially copyable

llvm-svn: 354200
This commit is contained in:
Serge Guelton 2019-02-16 09:47:23 +00:00
parent 457d171662
commit 662ff1b052
2 changed files with 0 additions and 60 deletions

View File

@ -108,59 +108,6 @@ template <typename T, bool = is_trivially_copyable<T>::value> struct OptionalSto
return reinterpret_cast<const T *>(storage.buffer);
}
};
template <typename T> struct OptionalStorage<T, true> {
AlignedCharArrayUnion<T> storage;
bool hasVal = false;
OptionalStorage() = default;
OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
OptionalStorage(const OptionalStorage &O) = default;
OptionalStorage(T &&y) : hasVal(true) {
new (storage.buffer) T(std::forward<T>(y));
}
OptionalStorage(OptionalStorage &&O) = default;
OptionalStorage &operator=(T &&y) {
if (hasVal)
*getPointer() = std::move(y);
else {
new (storage.buffer) T(std::move(y));
hasVal = true;
}
return *this;
}
OptionalStorage &operator=(OptionalStorage &&O) = default;
OptionalStorage &operator=(const T &y) {
if (hasVal)
*getPointer() = y;
else {
new (storage.buffer) T(y);
hasVal = true;
}
return *this;
}
OptionalStorage &operator=(const OptionalStorage &O) = default;
~OptionalStorage() = default;
void reset() {
if (hasVal) {
(*getPointer()).~T();
hasVal = false;
}
}
T *getPointer() {
assert(hasVal);
return reinterpret_cast<T *>(storage.buffer);
}
const T *getPointer() const {
assert(hasVal);
return reinterpret_cast<const T *>(storage.buffer);
}
};
} // namespace optional_detail

View File

@ -14,15 +14,8 @@
#include <array>
using namespace llvm;
static_assert(llvm::is_trivially_copyable<Optional<int>>::value,
"trivially copyable");
static_assert(llvm::is_trivially_copyable<Optional<std::array<int, 3>>>::value,
"trivially copyable");
namespace {
struct NonDefaultConstructible {