From c80ef6ed28d95c07755ecd90daadf441ff06891c Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Fri, 26 May 2017 01:52:59 +0000 Subject: [PATCH] Guard 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. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@303956 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/__config | 4 ++++ include/experimental/coroutine | 10 +++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/include/__config b/include/__config index 4ad700e23..32e542bd1 100644 --- a/include/__config +++ b/include/__config @@ -1126,6 +1126,10 @@ _LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_contiguous_container( # define _LIBCPP_HAS_NO_IS_AGGREGATE #endif +#if !defined(__cpp_coroutines) || __cpp_coroutines < 201703L +# define _LIBCPP_HAS_NO_COROUTINES +#endif + #endif // __cplusplus // Decide whether to use availability macros. diff --git a/include/experimental/coroutine b/include/experimental/coroutine index 161f95bde..a2ac9937e 100644 --- a/include/experimental/coroutine +++ b/include/experimental/coroutine @@ -59,7 +59,7 @@ template struct hash>; #pragma GCC system_header #endif -#ifndef __cpp_coroutines +#ifdef _LIBCPP_HAS_NO_COROUTINES # if defined(_LIBCPP_WARNING) _LIBCPP_WARNING(" cannot be used with this compiler") # else @@ -67,6 +67,8 @@ template struct hash>; # endif #endif +#ifndef _LIBCPP_HAS_NO_COROUTINES + _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_COROUTINES template @@ -88,8 +90,6 @@ struct _LIBCPP_TEMPLATE_VIS coroutine_traits template class _LIBCPP_TEMPLATE_VIS coroutine_handle; -#if defined(__cpp_coroutines) - template <> class _LIBCPP_TEMPLATE_VIS coroutine_handle { 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 */