1*6ed67ccbSChuanqi Xu // RUN: %clang_cc1 -std=c++20 %s -verify 2*6ed67ccbSChuanqi Xu 3*6ed67ccbSChuanqi Xu template<typename T, typename U> f(T t)4*6ed67ccbSChuanqi XuU f(T t) { 5*6ed67ccbSChuanqi Xu co_await t; 6*6ed67ccbSChuanqi Xu co_yield t; 7*6ed67ccbSChuanqi Xu 8*6ed67ccbSChuanqi Xu 1 + co_await t; 9*6ed67ccbSChuanqi Xu 1 + co_yield t; // expected-error {{expected expression}} 10*6ed67ccbSChuanqi Xu 11*6ed67ccbSChuanqi Xu auto x = co_await t; 12*6ed67ccbSChuanqi Xu auto y = co_yield t; 13*6ed67ccbSChuanqi Xu 14*6ed67ccbSChuanqi Xu for co_await (int x : t) {} // expected-warning {{'for co_await' belongs to CoroutineTS instead of C++20, which is deprecated}} 15*6ed67ccbSChuanqi Xu for co_await (int x = 0; x != 10; ++x) {} // expected-error {{'co_await' modifier can only be applied to range-based for loop}} 16*6ed67ccbSChuanqi Xu 17*6ed67ccbSChuanqi Xu if (t) 18*6ed67ccbSChuanqi Xu co_return t; 19*6ed67ccbSChuanqi Xu else 20*6ed67ccbSChuanqi Xu co_return {t}; 21*6ed67ccbSChuanqi Xu } 22*6ed67ccbSChuanqi Xu 23*6ed67ccbSChuanqi Xu struct Y {}; 24*6ed67ccbSChuanqi Xu struct X { Y operator co_await(); }; 25*6ed67ccbSChuanqi Xu struct Z {}; 26*6ed67ccbSChuanqi Xu Y operator co_await(Z); 27*6ed67ccbSChuanqi Xu f(X x,Z z)28*6ed67ccbSChuanqi Xuvoid f(X x, Z z) { 29*6ed67ccbSChuanqi Xu x.operator co_await(); 30*6ed67ccbSChuanqi Xu operator co_await(z); 31*6ed67ccbSChuanqi Xu } 32*6ed67ccbSChuanqi Xu 33*6ed67ccbSChuanqi Xu void operator co_await(); // expected-error {{must have at least one parameter}} 34*6ed67ccbSChuanqi Xu void operator co_await(X, Y, Z); // expected-error {{must be a unary operator}} 35*6ed67ccbSChuanqi Xu void operator co_await(int); // expected-error {{parameter of class or enumeration type}} 36