summaryrefslogtreecommitdiffstats
path: root/libcxx/include/experimental/coroutine
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2017-05-26 01:52:59 +0000
committerEric Fiselier <eric@efcs.ca>2017-05-26 01:52:59 +0000
commiteb04c8cae2f0867c3959285a992f5319b8d6cfc7 (patch)
tree7f943ee012222a8e5c89b2d6f49df1b51dfb6682 /libcxx/include/experimental/coroutine
parentf56a6d84b6b7c3432db6c2ed7280d3dbe3cb4f3d (diff)
downloadbcm5719-llvm-eb04c8cae2f0867c3959285a992f5319b8d6cfc7.tar.gz
bcm5719-llvm-eb04c8cae2f0867c3959285a992f5319b8d6cfc7.zip
Guard <experimental/coroutine> against older Clang versions.
Clang started providing -fcoroutines and defining __cpp_coroutines way before it implemented the __builtin_coro_foo functions. This means that simply checking if __cpp_coroutines is not a sufficient way of detecting the actual feature. This patch implements _LIBCPP_HAS_NO_COROUTINES which implements a slightly more complex feature check. Specifically it requires __cpp_coroutines >= 201703L, which only holds for Clang 5.0 built after 2017/05/24. llvm-svn: 303956
Diffstat (limited to 'libcxx/include/experimental/coroutine')
-rw-r--r--libcxx/include/experimental/coroutine10
1 files changed, 5 insertions, 5 deletions
diff --git a/libcxx/include/experimental/coroutine b/libcxx/include/experimental/coroutine
index 161f95bde55..a2ac9937efb 100644
--- a/libcxx/include/experimental/coroutine
+++ b/libcxx/include/experimental/coroutine
@@ -59,7 +59,7 @@ template <class P> struct hash<coroutine_handle<P>>;
#pragma GCC system_header
#endif
-#ifndef __cpp_coroutines
+#ifdef _LIBCPP_HAS_NO_COROUTINES
# if defined(_LIBCPP_WARNING)
_LIBCPP_WARNING("<experimental/coroutine> cannot be used with this compiler")
# else
@@ -67,6 +67,8 @@ template <class P> struct hash<coroutine_handle<P>>;
# endif
#endif
+#ifndef _LIBCPP_HAS_NO_COROUTINES
+
_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_COROUTINES
template <class _Tp, class = void>
@@ -88,8 +90,6 @@ struct _LIBCPP_TEMPLATE_VIS coroutine_traits
template <typename _Promise = void>
class _LIBCPP_TEMPLATE_VIS coroutine_handle;
-#if defined(__cpp_coroutines)
-
template <>
class _LIBCPP_TEMPLATE_VIS coroutine_handle<void> {
public:
@@ -235,8 +235,6 @@ struct _LIBCPP_TYPE_VIS suspend_always {
void await_resume() const noexcept {}
};
-#endif // defined(__cpp_coroutines)
-
_LIBCPP_END_NAMESPACE_EXPERIMENTAL_COROUTINES
_LIBCPP_BEGIN_NAMESPACE_STD
@@ -251,4 +249,6 @@ struct hash<_VSTD_CORO::coroutine_handle<_Tp> > {
_LIBCPP_END_NAMESPACE_STD
+#endif // !defined(_LIBCPP_HAS_NO_COROUTINES)
+
#endif /* _LIBCPP_EXPERIMENTAL_COROUTINE */
OpenPOWER on IntegriCloud