[PATCH] D115187: [clangd] Expose CoawaitExpr's operand in the AST

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Apr 25 03:09:06 PDT 2022

sammccall added a comment.

In D115187#3471003 <https://reviews.llvm.org/D115187#3471003>, @nridge wrote:

> Without my patch, this compiles fine. With it, I clang gives the following errors:
>   coroutines.cpp:35:9: error: no viable conversion from 'awaitable' to 'transform_awaitable'
>   coro<T> await_template(U t) {
>           ^~~~~~~~~~~~~~
>   coroutines.cpp:39:34: note: in instantiation of function template specialization 'await_template<transform_promise, transform_awaitable>' requested here
>   template coro<transform_promise> await_template<transform_promise>(transform_awaitable);

Poked at this a bit locally.
>From the message we see there's a call to `BuildUnresolvedCoawaitExpr` with an `awaitable` rather than `transform_awaitable`, so the `await_transform` call fails.

It turns out this is the `initial_suspend` call (CXXMemberCallExpr). We're not supposed to <https://eel.is/c++draft/expr.await#3.2> transform initial/final suspends, but the code is now doing so.

This seems to be a consequence of switching from BuildResolvedCoawaitExpr (which does not apply the transform) to BuildUnresolvedCoawaitExpr (which does) during template instantiation.

  rG LLVM Github Monorepo



More information about the cfe-commits mailing list