summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2012-11-30 11:04:18 +0000
committerChandler Carruth <chandlerc@gmail.com>2012-11-30 11:04:18 +0000
commit9c7462a8b8321551a0db42d15ab8349b4834d14c (patch)
treeadb26da48b3f9aad51f3762393229f60b6ef1c94 /llvm
parent436462046ab60463d6e9415f8c79ea645e29d5d2 (diff)
downloadbcm5719-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.h2
-rw-r--r--llvm/include/llvm/Support/Compiler.h16
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
OpenPOWER on IntegriCloud