mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
Revert "Unconditionally enable lvalue function designators; NFC"
This reverts commit 968561bcdc34c7d74482fe3bb69a045abf08d2c1
This commit is contained in:
parent
aa258c1b77
commit
3be16c9bda
@ -16,6 +16,7 @@
|
|||||||
#define LLVM_ADT_OPTIONAL_H
|
#define LLVM_ADT_OPTIONAL_H
|
||||||
|
|
||||||
#include "llvm/ADT/None.h"
|
#include "llvm/ADT/None.h"
|
||||||
|
#include "llvm/Support/Compiler.h"
|
||||||
#include "llvm/Support/type_traits.h"
|
#include "llvm/Support/type_traits.h"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@ -68,18 +69,20 @@ public:
|
|||||||
|
|
||||||
bool hasValue() const noexcept { return hasVal; }
|
bool hasValue() const noexcept { return hasVal; }
|
||||||
|
|
||||||
T &getValue() & noexcept {
|
T &getValue() LLVM_LVALUE_FUNCTION noexcept {
|
||||||
assert(hasVal);
|
assert(hasVal);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
T const &getValue() const & noexcept {
|
T const &getValue() const LLVM_LVALUE_FUNCTION noexcept {
|
||||||
assert(hasVal);
|
assert(hasVal);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
#if LLVM_HAS_RVALUE_REFERENCE_THIS
|
||||||
T &&getValue() && noexcept {
|
T &&getValue() && noexcept {
|
||||||
assert(hasVal);
|
assert(hasVal);
|
||||||
return std::move(value);
|
return std::move(value);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
template <class... Args> void emplace(Args &&... args) {
|
template <class... Args> void emplace(Args &&... args) {
|
||||||
reset();
|
reset();
|
||||||
@ -166,18 +169,20 @@ public:
|
|||||||
|
|
||||||
bool hasValue() const noexcept { return hasVal; }
|
bool hasValue() const noexcept { return hasVal; }
|
||||||
|
|
||||||
T &getValue() & noexcept {
|
T &getValue() LLVM_LVALUE_FUNCTION noexcept {
|
||||||
assert(hasVal);
|
assert(hasVal);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
T const &getValue() const & noexcept {
|
T const &getValue() const LLVM_LVALUE_FUNCTION noexcept {
|
||||||
assert(hasVal);
|
assert(hasVal);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
#if LLVM_HAS_RVALUE_REFERENCE_THIS
|
||||||
T &&getValue() && noexcept {
|
T &&getValue() && noexcept {
|
||||||
assert(hasVal);
|
assert(hasVal);
|
||||||
return std::move(value);
|
return std::move(value);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
template <class... Args> void emplace(Args &&... args) {
|
template <class... Args> void emplace(Args &&... args) {
|
||||||
reset();
|
reset();
|
||||||
@ -247,29 +252,30 @@ public:
|
|||||||
|
|
||||||
const T *getPointer() const { return &Storage.getValue(); }
|
const T *getPointer() const { return &Storage.getValue(); }
|
||||||
T *getPointer() { return &Storage.getValue(); }
|
T *getPointer() { return &Storage.getValue(); }
|
||||||
const T &getValue() const & { return Storage.getValue(); }
|
const T &getValue() const LLVM_LVALUE_FUNCTION { return Storage.getValue(); }
|
||||||
T &getValue() & { return Storage.getValue(); }
|
T &getValue() LLVM_LVALUE_FUNCTION { return Storage.getValue(); }
|
||||||
|
|
||||||
explicit operator bool() const { return hasValue(); }
|
explicit operator bool() const { return hasValue(); }
|
||||||
bool hasValue() const { return Storage.hasValue(); }
|
bool hasValue() const { return Storage.hasValue(); }
|
||||||
const T *operator->() const { return getPointer(); }
|
const T *operator->() const { return getPointer(); }
|
||||||
T *operator->() { return getPointer(); }
|
T *operator->() { return getPointer(); }
|
||||||
const T &operator*() const & { return getValue(); }
|
const T &operator*() const LLVM_LVALUE_FUNCTION { return getValue(); }
|
||||||
T &operator*() & { return getValue(); }
|
T &operator*() LLVM_LVALUE_FUNCTION { return getValue(); }
|
||||||
|
|
||||||
template <typename U>
|
template <typename U>
|
||||||
constexpr T getValueOr(U &&value) const & {
|
constexpr T getValueOr(U &&value) const LLVM_LVALUE_FUNCTION {
|
||||||
return hasValue() ? getValue() : std::forward<U>(value);
|
return hasValue() ? getValue() : std::forward<U>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Apply a function to the value if present; otherwise return None.
|
/// Apply a function to the value if present; otherwise return None.
|
||||||
template <class Function>
|
template <class Function>
|
||||||
auto map(const Function &F) const &
|
auto map(const Function &F) const
|
||||||
-> Optional<decltype(F(getValue()))> {
|
-> Optional<decltype(F(getValue()))> {
|
||||||
if (*this) return F(getValue());
|
if (*this) return F(getValue());
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LLVM_HAS_RVALUE_REFERENCE_THIS
|
||||||
T &&getValue() && { return std::move(Storage.getValue()); }
|
T &&getValue() && { return std::move(Storage.getValue()); }
|
||||||
T &&operator*() && { return std::move(Storage.getValue()); }
|
T &&operator*() && { return std::move(Storage.getValue()); }
|
||||||
|
|
||||||
@ -285,6 +291,7 @@ public:
|
|||||||
if (*this) return F(std::move(*this).getValue());
|
if (*this) return F(std::move(*this).getValue());
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T, typename U>
|
template <typename T, typename U>
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#ifndef LLVM_ADT_POINTERINTPAIR_H
|
#ifndef LLVM_ADT_POINTERINTPAIR_H
|
||||||
#define LLVM_ADT_POINTERINTPAIR_H
|
#define LLVM_ADT_POINTERINTPAIR_H
|
||||||
|
|
||||||
|
#include "llvm/Support/Compiler.h"
|
||||||
#include "llvm/Support/PointerLikeTypeTraits.h"
|
#include "llvm/Support/PointerLikeTypeTraits.h"
|
||||||
#include "llvm/Support/type_traits.h"
|
#include "llvm/Support/type_traits.h"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
@ -59,19 +60,19 @@ public:
|
|||||||
|
|
||||||
IntType getInt() const { return (IntType)Info::getInt(Value); }
|
IntType getInt() const { return (IntType)Info::getInt(Value); }
|
||||||
|
|
||||||
void setPointer(PointerTy PtrVal) & {
|
void setPointer(PointerTy PtrVal) LLVM_LVALUE_FUNCTION {
|
||||||
Value = Info::updatePointer(Value, PtrVal);
|
Value = Info::updatePointer(Value, PtrVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setInt(IntType IntVal) & {
|
void setInt(IntType IntVal) LLVM_LVALUE_FUNCTION {
|
||||||
Value = Info::updateInt(Value, static_cast<intptr_t>(IntVal));
|
Value = Info::updateInt(Value, static_cast<intptr_t>(IntVal));
|
||||||
}
|
}
|
||||||
|
|
||||||
void initWithPointer(PointerTy PtrVal) & {
|
void initWithPointer(PointerTy PtrVal) LLVM_LVALUE_FUNCTION {
|
||||||
Value = Info::updatePointer(0, PtrVal);
|
Value = Info::updatePointer(0, PtrVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setPointerAndInt(PointerTy PtrVal, IntType IntVal) & {
|
void setPointerAndInt(PointerTy PtrVal, IntType IntVal) LLVM_LVALUE_FUNCTION {
|
||||||
Value = Info::updateInt(Info::updatePointer(0, PtrVal),
|
Value = Info::updateInt(Info::updatePointer(0, PtrVal),
|
||||||
static_cast<intptr_t>(IntVal));
|
static_cast<intptr_t>(IntVal));
|
||||||
}
|
}
|
||||||
@ -89,7 +90,7 @@ public:
|
|||||||
|
|
||||||
void *getOpaqueValue() const { return reinterpret_cast<void *>(Value); }
|
void *getOpaqueValue() const { return reinterpret_cast<void *>(Value); }
|
||||||
|
|
||||||
void setFromOpaqueValue(void *Val) & {
|
void setFromOpaqueValue(void *Val) LLVM_LVALUE_FUNCTION {
|
||||||
Value = reinterpret_cast<intptr_t>(Val);
|
Value = reinterpret_cast<intptr_t>(Val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,6 +92,26 @@
|
|||||||
#define LLVM_MSC_PREREQ(version) 0
|
#define LLVM_MSC_PREREQ(version) 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/// Does the compiler support ref-qualifiers for *this?
|
||||||
|
///
|
||||||
|
/// Sadly, this is separate from just rvalue reference support because GCC
|
||||||
|
/// and MSVC implemented this later than everything else.
|
||||||
|
#if __has_feature(cxx_rvalue_references) || LLVM_GNUC_PREREQ(4, 8, 1)
|
||||||
|
#define LLVM_HAS_RVALUE_REFERENCE_THIS 1
|
||||||
|
#else
|
||||||
|
#define LLVM_HAS_RVALUE_REFERENCE_THIS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// Expands to '&' if ref-qualifiers for *this are supported.
|
||||||
|
///
|
||||||
|
/// This can be used to provide lvalue/rvalue overrides of member functions.
|
||||||
|
/// The rvalue override should be guarded by LLVM_HAS_RVALUE_REFERENCE_THIS
|
||||||
|
#if LLVM_HAS_RVALUE_REFERENCE_THIS
|
||||||
|
#define LLVM_LVALUE_FUNCTION &
|
||||||
|
#else
|
||||||
|
#define LLVM_LVALUE_FUNCTION
|
||||||
|
#endif
|
||||||
|
|
||||||
/// LLVM_LIBRARY_VISIBILITY - If a class marked with this attribute is linked
|
/// LLVM_LIBRARY_VISIBILITY - If a class marked with this attribute is linked
|
||||||
/// into a shared library, then the class should be private to the library and
|
/// into a shared library, then the class should be private to the library and
|
||||||
/// not accessible from outside it. Can also be used to mark variables and
|
/// not accessible from outside it. Can also be used to mark variables and
|
||||||
|
@ -382,6 +382,8 @@ TEST_F(OptionalTest, ImmovableEmplace) {
|
|||||||
EXPECT_EQ(0u, Immovable::Destructions);
|
EXPECT_EQ(0u, Immovable::Destructions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LLVM_HAS_RVALUE_REFERENCE_THIS
|
||||||
|
|
||||||
TEST_F(OptionalTest, MoveGetValueOr) {
|
TEST_F(OptionalTest, MoveGetValueOr) {
|
||||||
Optional<MoveOnly> A;
|
Optional<MoveOnly> A;
|
||||||
|
|
||||||
@ -399,6 +401,8 @@ TEST_F(OptionalTest, MoveGetValueOr) {
|
|||||||
EXPECT_EQ(2u, MoveOnly::Destructions);
|
EXPECT_EQ(2u, MoveOnly::Destructions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // LLVM_HAS_RVALUE_REFERENCE_THIS
|
||||||
|
|
||||||
struct EqualTo {
|
struct EqualTo {
|
||||||
template <typename T, typename U> static bool apply(const T &X, const U &Y) {
|
template <typename T, typename U> static bool apply(const T &X, const U &Y) {
|
||||||
return X == Y;
|
return X == Y;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user