[libcxx] r303956 - Guard <experimental/coroutine> against older Clang versions.

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Thu May 25 18:53:00 PDT 2017


Author: ericwf
Date: Thu May 25 20:52:59 2017
New Revision: 303956

URL: http://llvm.org/viewvc/llvm-project?rev=303956&view=rev
Log:
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.

Modified:
    libcxx/trunk/include/__config
    libcxx/trunk/include/experimental/coroutine

Modified: libcxx/trunk/include/__config
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=303956&r1=303955&r2=303956&view=diff
==============================================================================
--- libcxx/trunk/include/__config (original)
+++ libcxx/trunk/include/__config Thu May 25 20:52:59 2017
@@ -1126,6 +1126,10 @@ _LIBCPP_FUNC_VIS extern "C" void __sanit
 # 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.

Modified: libcxx/trunk/include/experimental/coroutine
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/experimental/coroutine?rev=303956&r1=303955&r2=303956&view=diff
==============================================================================
--- libcxx/trunk/include/experimental/coroutine (original)
+++ libcxx/trunk/include/experimental/coroutine Thu May 25 20:52:59 2017
@@ -59,7 +59,7 @@ template <class P> struct hash<coroutine
 #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
 # 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_tr
 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
 
 _LIBCPP_END_NAMESPACE_STD
 
+#endif // !defined(_LIBCPP_HAS_NO_COROUTINES)
+
 #endif /* _LIBCPP_EXPERIMENTAL_COROUTINE */




More information about the cfe-commits mailing list