diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2012-11-30 11:04:18 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2012-11-30 11:04:18 +0000 |
commit | 9c7462a8b8321551a0db42d15ab8349b4834d14c (patch) | |
tree | adb26da48b3f9aad51f3762393229f60b6ef1c94 /llvm | |
parent | 436462046ab60463d6e9415f8c79ea645e29d5d2 (diff) | |
download | bcm5719-llvm-9c7462a8b8321551a0db42d15ab8349b4834d14c.tar.gz bcm5719-llvm-9c7462a8b8321551a0db42d15ab8349b4834d14c.zip |
Separate out the tests for whether the compiler suports R-value
references from whether it supports an R-value reference *this. No
version of GCC today supports the latter, which breaks GCC C++11
compiles of LLVM and Clang now.
Also add doxygen comments clarifying what's going on here, and update
the usage in Optional. I'll update the usages in Clang next.
llvm-svn: 168993
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/ADT/Optional.h | 2 | ||||
-rw-r--r-- | llvm/include/llvm/Support/Compiler.h | 16 |
2 files changed, 15 insertions, 3 deletions
diff --git a/llvm/include/llvm/ADT/Optional.h b/llvm/include/llvm/ADT/Optional.h index 23100ab1b7a..10fd75b738f 100644 --- a/llvm/include/llvm/ADT/Optional.h +++ b/llvm/include/llvm/ADT/Optional.h @@ -55,7 +55,7 @@ public: const T* operator->() const { return getPointer(); } const T& operator*() const LLVM_LVALUE_FUNCTION { assert(hasVal); return x; } -#if LLVM_USE_RVALUE_REFERENCES +#if LLVM_HAS_RVALUE_REFERENCE_THIS T&& getValue() && { assert(hasVal); return std::move(x); } T&& operator*() && { assert(hasVal); return std::move(x); } #endif diff --git a/llvm/include/llvm/Support/Compiler.h b/llvm/include/llvm/Support/Compiler.h index 7d9785cdae5..6cb397555f6 100644 --- a/llvm/include/llvm/Support/Compiler.h +++ b/llvm/include/llvm/Support/Compiler.h @@ -30,6 +30,18 @@ #define LLVM_USE_RVALUE_REFERENCES 0 #endif +/// \brief Does the compiler support r-value reference *this? +/// +/// Sadly, this is separate from just r-value reference support because GCC +/// implemented everything but this thus far. No release of GCC yet has support +/// for this feature so it is enabled with Clang only. +/// FIXME: This should change to a version check when GCC grows support for it. +#if __has_feature(cxx_rvalue_references) +#define LLVM_HAS_RVALUE_REFERENCE_THIS 1 +#else +#define LLVM_HAS_RVALUE_REFERENCE_THIS 0 +#endif + /// llvm_move - Expands to ::std::move if the compiler supports /// r-value references; otherwise, expands to the argument. #if LLVM_USE_RVALUE_REFERENCES @@ -41,8 +53,8 @@ /// 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 +/// The r-value 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 |