xref: /llvm-project/clang/test/Parser/cxx20-coroutines.cpp (revision 6ed67ccba7e4699e9e42302f2f9b7653444258ba)
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 Xu U 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 Xu void 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