Index: clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h =================================================================== --- clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h +++ clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h @@ -34,7 +34,6 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SetVector.h" #include "llvm/Support/Allocator.h" -#include "llvm/Support/Compiler.h" #include #include #include @@ -169,7 +168,7 @@ const ProgramStateRef &getState() const { return State; } template - Optional getLocationAs() const LLVM_LVALUE_FUNCTION { + Optional getLocationAs() const & { return Location.getAs(); } Index: llvm/include/llvm/ADT/Optional.h =================================================================== --- llvm/include/llvm/ADT/Optional.h +++ llvm/include/llvm/ADT/Optional.h @@ -16,7 +16,6 @@ #define LLVM_ADT_OPTIONAL_H #include "llvm/ADT/None.h" -#include "llvm/Support/Compiler.h" #include "llvm/Support/type_traits.h" #include #include @@ -69,20 +68,18 @@ 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 void emplace(Args &&... args) { reset(); @@ -169,20 +166,18 @@ 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 void emplace(Args &&... args) { reset(); @@ -252,30 +247,29 @@ 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 - constexpr T getValueOr(U &&value) const LLVM_LVALUE_FUNCTION { + constexpr T getValueOr(U &&value) const & { return hasValue() ? getValue() : std::forward(value); } /// Apply a function to the value if present; otherwise return None. template - auto map(const Function &F) const + auto map(const Function &F) const & -> Optional { if (*this) return F(getValue()); return None; } -#if LLVM_HAS_RVALUE_REFERENCE_THIS T &&getValue() && { return std::move(Storage.getValue()); } T &&operator*() && { return std::move(Storage.getValue()); } @@ -291,7 +285,6 @@ if (*this) return F(std::move(*this).getValue()); return None; } -#endif }; template Index: llvm/include/llvm/ADT/PointerIntPair.h =================================================================== --- llvm/include/llvm/ADT/PointerIntPair.h +++ llvm/include/llvm/ADT/PointerIntPair.h @@ -13,7 +13,6 @@ #ifndef LLVM_ADT_POINTERINTPAIR_H #define LLVM_ADT_POINTERINTPAIR_H -#include "llvm/Support/Compiler.h" #include "llvm/Support/PointerLikeTypeTraits.h" #include "llvm/Support/type_traits.h" #include @@ -60,19 +59,19 @@ IntType getInt() const { return (IntType)Info::getInt(Value); } - void setPointer(PointerTy PtrVal) LLVM_LVALUE_FUNCTION { + void setPointer(PointerTy PtrVal) & { Value = Info::updatePointer(Value, PtrVal); } - void setInt(IntType IntVal) LLVM_LVALUE_FUNCTION { + void setInt(IntType IntVal) & { Value = Info::updateInt(Value, static_cast(IntVal)); } - void initWithPointer(PointerTy PtrVal) LLVM_LVALUE_FUNCTION { + void initWithPointer(PointerTy PtrVal) & { Value = Info::updatePointer(0, PtrVal); } - void setPointerAndInt(PointerTy PtrVal, IntType IntVal) LLVM_LVALUE_FUNCTION { + void setPointerAndInt(PointerTy PtrVal, IntType IntVal) & { Value = Info::updateInt(Info::updatePointer(0, PtrVal), static_cast(IntVal)); } @@ -90,7 +89,7 @@ void *getOpaqueValue() const { return reinterpret_cast(Value); } - void setFromOpaqueValue(void *Val) LLVM_LVALUE_FUNCTION { + void setFromOpaqueValue(void *Val) & { Value = reinterpret_cast(Val); } Index: llvm/include/llvm/Support/Compiler.h =================================================================== --- llvm/include/llvm/Support/Compiler.h +++ llvm/include/llvm/Support/Compiler.h @@ -92,26 +92,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 Index: llvm/unittests/ADT/OptionalTest.cpp =================================================================== --- llvm/unittests/ADT/OptionalTest.cpp +++ llvm/unittests/ADT/OptionalTest.cpp @@ -382,8 +382,6 @@ EXPECT_EQ(0u, Immovable::Destructions); } -#if LLVM_HAS_RVALUE_REFERENCE_THIS - TEST_F(OptionalTest, MoveGetValueOr) { Optional A; @@ -401,8 +399,6 @@ EXPECT_EQ(2u, MoveOnly::Destructions); } -#endif // LLVM_HAS_RVALUE_REFERENCE_THIS - struct EqualTo { template static bool apply(const T &X, const U &Y) { return X == Y;