coroutine support in clang


Clang throws an error on Windows when I try to compile the following test.

ksh-3.2$ cat test.cpp



using namespace std;

using std::coroutine_handle;

using std::suspend_always;

ksh-3.2$ clang-cl -c /std:c++latest test.cpp

test2.cpp(4,12): error: no member named ‘coroutine_handle’ in namespace ‘std’

using std::coroutine_handle;

test2.cpp(5,12): error: no member named 'suspend_always' in namespace 'std'

using std::suspend_always;


2 errors generated.

I noticed the STL implementation ([]( was guarded with __cpp_lib_coroutine. So I tried clang-cl -c /std:c++latest -D__cpp_lib_coroutine test.cpp and the header successfully compiled.

From [](, it looks like the errors are a known issue. __cpp_lib_coroutine will be defined by library only if compiler defines __cpp_impl_coroutine. I assume clang doesn’t define the feature test macro because we lack sufficient coroutine support. Would someone here be able to confirm?

Also, if anyone has information about current status of coroutine support/what is missing, any help is greatly appreciated.

Thank you,


STL developer here: my understanding is that a secret cabal of compiler developers agreed on a common ABI for C++20 coroutine frames, the so-called “Denver ABI”. MSVC implements this ABI under /std:c++latest (as of IIRC Visual Studio 2019 version 16.8) but Clang does not yet do so. The intrinsics used to interface the library to the compiler are the same that Clang has been using since the era of TS coroutines, so the header will compile, but the STL expects the Denver ABI so the behavior of those intrinsics is wrong.

We’re hopeful that Clang will start defining the C++20 feature-test macro (__cpp_impl_coroutine) when the Denver ABI is implemented so our header will light up automatically.

Thanks for the information Casey!

Would you happen to know where I can find this ABI and if anyone is working on the implementation in Clang?


Here is a copy of the original document, which is basically a napkin design. I don’t know if anyone is working on implementing it in Clang.

Ok. Thank you!