<div dir="ltr"><div dir="ltr">On Wed, Jan 20, 2021 at 12:03 PM Andrews, Elizabeth via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div lang="EN-US">
<div class="gmail-m_3225166867235291030WordSection1">
<p class="MsoNormal">Hello, <u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Clang throws an error on Windows when I try to compile the following test.
<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">ksh-3.2$ cat test.cpp<u></u><u></u></p>
<p class="MsoNormal">#include <coroutine><u></u><u></u></p>
<p class="MsoNormal">#include <iostream><u></u><u></u></p>
<p class="MsoNormal">using namespace std;<u></u><u></u></p>
<p class="MsoNormal">using std::coroutine_handle;<u></u><u></u></p>
<p class="MsoNormal">using std::suspend_always;<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">ksh-3.2$ clang-cl -c /std:c++latest test.cpp<u></u><u></u></p>
<p class="MsoNormal">test2.cpp(4,12): error: no member named 'coroutine_handle' in namespace 'std'<u></u><u></u></p>
<p class="MsoNormal">using std::coroutine_handle;<u></u><u></u></p>
<p class="MsoNormal"> ~~~~~^<u></u><u></u></p>
<p class="MsoNormal">test2.cpp(5,12): error: no member named 'suspend_always' in namespace 'std'<u></u><u></u></p>
<p class="MsoNormal">using std::suspend_always;<u></u><u></u></p>
<p class="MsoNormal"> ~~~~~^<u></u><u></u></p>
<p class="MsoNormal">2 errors generated.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I noticed the STL implementation (<a href="https://github.com/microsoft/STL/blob/master/stl/inc/coroutine#L16" target="_blank">https://github.com/microsoft/STL/blob/master/stl/inc/coroutine#L16</a>) 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.
<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">From <a href="https://github.com/microsoft/STL/issues/1223" target="_blank">
https://github.com/microsoft/STL/issues/1223</a>, 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?</p></div></div></blockquote><div><br></div><div>STL <coroutine> 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.</div><div><br></div><div>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 <coroutine> header will light up automatically.</div></div></div>