Add a new C++11 compatibility macro, LLVM_LVALUE_FUNCTION.

This expands to '&', and is intended to be used when an /optional/ rvalue
override is available.

Before:
  void foo() const { ... }

After:
  void foo() const LLVM_LVALUE_FUNCTION { ... }
  void foo() && { ... }

This is used to allow moving the contents of an Optional.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168963 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jordan Rose 2012-11-30 00:38:53 +00:00
parent 1c83093cd5
commit adf0c3d82d
2 changed files with 17 additions and 2 deletions

View File

@ -48,12 +48,17 @@ public:
}
const T* getPointer() const { assert(hasVal); return &x; }
const T& getValue() const { assert(hasVal); return x; }
const T& getValue() const LLVM_LVALUE_FUNCTION { assert(hasVal); return x; }
operator bool() const { return hasVal; }
bool hasValue() const { return hasVal; }
const T* operator->() const { return getPointer(); }
const T& operator*() const { assert(hasVal); return x; }
const T& operator*() const LLVM_LVALUE_FUNCTION { assert(hasVal); return x; }
#if LLVM_USE_RVALUE_REFERENCES
T&& getValue() && { assert(hasVal); return std::move(x); }
T&& operator*() && { assert(hasVal); return std::move(x); }
#endif
};
template<typename T> struct simplify_type;

View File

@ -38,6 +38,16 @@
#define llvm_move(value) (value)
#endif
/// Expands to '&' if r-value references are supported.
///
/// This can be used to provide l-value/r-value overrides of member functions.
/// The r-value override should be guarded by LLVM_USE_RVALUE_REFERENCES
#if LLVM_USE_RVALUE_REFERENCES
#define LLVM_LVALUE_FUNCTION &
#else
#define LLVM_LVALUE_FUNCTION
#endif
/// LLVM_DELETED_FUNCTION - Expands to = delete if the compiler supports it.
/// Use to mark functions as uncallable. Member functions with this should
/// be declared private so that some behavior is kept in C++03 mode.