summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2012-11-30 00:38:53 +0000
committerJordan Rose <jordan_rose@apple.com>2012-11-30 00:38:53 +0000
commitadf0c3d82dbff1480c63f1ebe68c7c1e6bb5828c (patch)
treea10f4de7a0982b7ffdabdc2cd57707bb31797843 /include
parent1c83093cd5f4f6d33e732c817bb5afd033531beb (diff)
downloadllvm-adf0c3d82dbff1480c63f1ebe68c7c1e6bb5828c.tar.gz
llvm-adf0c3d82dbff1480c63f1ebe68c7c1e6bb5828c.tar.bz2
llvm-adf0c3d82dbff1480c63f1ebe68c7c1e6bb5828c.tar.xz
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
Diffstat (limited to 'include')
-rw-r--r--include/llvm/ADT/Optional.h9
-rw-r--r--include/llvm/Support/Compiler.h10
2 files changed, 17 insertions, 2 deletions
diff --git a/include/llvm/ADT/Optional.h b/include/llvm/ADT/Optional.h
index f43aeb1bc4..23100ab1b7 100644
--- a/include/llvm/ADT/Optional.h
+++ b/include/llvm/ADT/Optional.h
@@ -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;
diff --git a/include/llvm/Support/Compiler.h b/include/llvm/Support/Compiler.h
index 5acc7160ab..7d9785cdae 100644
--- a/include/llvm/Support/Compiler.h
+++ b/include/llvm/Support/Compiler.h
@@ -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.