Skip to content

Commit

Permalink
Remove LVALUE / RVALUE workarounds
Browse files Browse the repository at this point in the history
Summary: LLVM_HAS_RVALUE_REFERENCE_THIS and LLVM_LVALUE_FUNCTION shouldn't be needed anymore because the minimum compiler versions support them.

Subscribers: jkorous, dexonsmith, cfe-commits, llvm-commits, hans, thakis, chandlerc, rnk

Tags: #clang, #llvm

Differential Revision: https://reviews.llvm.org/D66240

llvm-svn: 368939
  • Loading branch information
jfbastien committed Aug 14, 2019
1 parent 54f6be7 commit cad8356
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 40 deletions.
Expand Up @@ -167,7 +167,7 @@ class ExplodedNode : public llvm::FoldingSetNode {
const ProgramStateRef &getState() const { return State; }

template <typename T>
Optional<T> getLocationAs() const LLVM_LVALUE_FUNCTION {
Optional<T> getLocationAs() const & {
return Location.getAs<T>();
}

Expand Down
25 changes: 10 additions & 15 deletions llvm/include/llvm/ADT/Optional.h
Expand Up @@ -69,20 +69,18 @@ class OptionalStorage {

bool hasValue() const noexcept { return hasVal; }

T &getValue() LLVM_LVALUE_FUNCTION noexcept {
T &getValue() & noexcept {
assert(hasVal);
return value;
}
T const &getValue() const LLVM_LVALUE_FUNCTION noexcept {
T const &getValue() const & noexcept {
assert(hasVal);
return value;
}
#if LLVM_HAS_RVALUE_REFERENCE_THIS
T &&getValue() && noexcept {
assert(hasVal);
return std::move(value);
}
#endif

template <class... Args> void emplace(Args &&... args) {
reset();
Expand Down Expand Up @@ -169,20 +167,19 @@ template <typename T> class OptionalStorage<T, true> {

bool hasValue() const noexcept { return hasVal; }

T &getValue() LLVM_LVALUE_FUNCTION noexcept {
T &getValue() & noexcept {
assert(hasVal);
return value;
}
T const &getValue() const LLVM_LVALUE_FUNCTION noexcept {
T const &getValue() const & noexcept {
assert(hasVal);
return value;
}
#if LLVM_HAS_RVALUE_REFERENCE_THIS

T &&getValue() && noexcept {
assert(hasVal);
return std::move(value);
}
#endif

template <class... Args> void emplace(Args &&... args) {
reset();
Expand Down Expand Up @@ -252,30 +249,28 @@ template <typename T> class Optional {

const T *getPointer() const { return &Storage.getValue(); }
T *getPointer() { return &Storage.getValue(); }
const T &getValue() const LLVM_LVALUE_FUNCTION { return Storage.getValue(); }
T &getValue() LLVM_LVALUE_FUNCTION { return Storage.getValue(); }
const T &getValue() const & { return Storage.getValue(); }
T &getValue() & { return Storage.getValue(); }

explicit operator bool() const { return hasValue(); }
bool hasValue() const { return Storage.hasValue(); }
const T *operator->() const { return getPointer(); }
T *operator->() { return getPointer(); }
const T &operator*() const LLVM_LVALUE_FUNCTION { return getValue(); }
T &operator*() LLVM_LVALUE_FUNCTION { return getValue(); }
const T &operator*() const & { return getValue(); }
T &operator*() & { return getValue(); }

template <typename U>
constexpr T getValueOr(U &&value) const LLVM_LVALUE_FUNCTION {
constexpr T getValueOr(U &&value) const & {
return hasValue() ? getValue() : std::forward<U>(value);
}

#if LLVM_HAS_RVALUE_REFERENCE_THIS
T &&getValue() && { return std::move(Storage.getValue()); }
T &&operator*() && { return std::move(Storage.getValue()); }

template <typename U>
T getValueOr(U &&value) && {
return hasValue() ? std::move(getValue()) : std::forward<U>(value);
}
#endif
};

template <typename T, typename U>
Expand Down
20 changes: 0 additions & 20 deletions llvm/include/llvm/Support/Compiler.h
Expand Up @@ -83,26 +83,6 @@
#define LLVM_MSC_PREREQ(version) 0
#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
/// 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
Expand Down
4 changes: 0 additions & 4 deletions llvm/unittests/ADT/OptionalTest.cpp
Expand Up @@ -382,8 +382,6 @@ TEST_F(OptionalTest, ImmovableEmplace) {
EXPECT_EQ(0u, Immovable::Destructions);
}

#if LLVM_HAS_RVALUE_REFERENCE_THIS

TEST_F(OptionalTest, MoveGetValueOr) {
Optional<MoveOnly> A;

Expand All @@ -401,8 +399,6 @@ TEST_F(OptionalTest, MoveGetValueOr) {
EXPECT_EQ(2u, MoveOnly::Destructions);
}

#endif // LLVM_HAS_RVALUE_REFERENCE_THIS

struct EqualTo {
template <typename T, typename U> static bool apply(const T &X, const U &Y) {
return X == Y;
Expand Down

0 comments on commit cad8356

Please sign in to comment.