diff options
| author | Eric Fiselier <eric@efcs.ca> | 2017-05-26 01:52:59 +0000 |
|---|---|---|
| committer | Eric Fiselier <eric@efcs.ca> | 2017-05-26 01:52:59 +0000 |
| commit | eb04c8cae2f0867c3959285a992f5319b8d6cfc7 (patch) | |
| tree | 7f943ee012222a8e5c89b2d6f49df1b51dfb6682 /libcxx/include/experimental | |
| parent | f56a6d84b6b7c3432db6c2ed7280d3dbe3cb4f3d (diff) | |
| download | bcm5719-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')
| -rw-r--r-- | libcxx/include/experimental/coroutine | 10 |
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 */ |

