nridge added a comment. Here is a reduced testcase for the semantic regression:
namespace std { template <class PromiseType = void> struct coroutine_handle { static coroutine_handle from_address(void *) noexcept; }; template <class Ret, class... Args> struct coroutine_traits; } // end of namespace std template <typename Promise> struct coro {}; template <typename Promise, typename... Ps> struct std::coroutine_traits<coro<Promise>, Ps...> { using promise_type = Promise; }; struct awaitable { bool await_ready() noexcept; template <typename F> void await_suspend(F) noexcept; void await_resume() noexcept; } a; struct transform_awaitable {}; struct transform_promise { coro<transform_promise> get_return_object(); awaitable initial_suspend(); awaitable final_suspend() noexcept; awaitable await_transform(transform_awaitable); void unhandled_exception(); void return_void(); }; template <typename T, typename U> coro<T> await_template(U t) { co_await t; } template coro<transform_promise> await_template<transform_promise>(transform_awaitable); 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); ^ coroutines.cpp:23:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'awaitable' to 'const transform_awaitable &' for 1st argument struct transform_awaitable {}; ^ coroutines.cpp:23:8: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'awaitable' to 'transform_awaitable &&' for 1st argument struct transform_awaitable {}; ^ coroutines.cpp:29:48: note: passing argument to parameter here awaitable await_transform(transform_awaitable); ^ coroutines.cpp:35:9: note: call to 'await_transform' implicitly required by 'co_await' here coro<T> await_template(U t) { ^~~~~~~~~~~~~~ 1 error generated. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D115187/new/ https://reviews.llvm.org/D115187 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits