Changeset View
Changeset View
Standalone View
Standalone View
clang/test/SemaCXX/coroutines.cpp
Show First 20 Lines • Show All 97 Lines • ▼ Show 20 Lines | double bad_promise_type(double) { // expected-error {{this function cannot be a coroutine: 'experimental::coroutine_traits<double, double>::promise_type' (aka 'int') is not a class}} | ||||
co_await a; | co_await a; | ||||
} | } | ||||
template <> | template <> | ||||
struct std::experimental::coroutine_traits<double, int> { | struct std::experimental::coroutine_traits<double, int> { | ||||
struct promise_type {}; | struct promise_type {}; | ||||
}; | }; | ||||
double bad_promise_type_2(int) { // expected-error {{no member named 'initial_suspend'}} | double bad_promise_type_2(int) { // expected-error {{no member named 'initial_suspend'}} | ||||
co_yield 0; // expected-error {{no member named 'yield_value' in 'std::experimental::coroutine_traits<double, int>::promise_type'}} | co_yield 0; | ||||
modocache: This test ought not change -- we do expect an error here. `co_yield` can only be used if the… | |||||
} | } | ||||
struct promise; // expected-note {{forward declaration}} | struct promise; // expected-note {{forward declaration}} | ||||
struct promise_void; | struct promise_void; | ||||
struct void_tag {}; | struct void_tag {}; | ||||
template <typename... T> | template <typename... T> | ||||
struct std::experimental::coroutine_traits<void, T...> { using promise_type = promise; }; | struct std::experimental::coroutine_traits<void, T...> { using promise_type = promise; }; | ||||
template <typename... T> | template <typename... T> | ||||
▲ Show 20 Lines • Show All 356 Lines • ▼ Show 20 Lines | namespace dependent_operator_co_await_lookup { | ||||
template <> | template <> | ||||
struct dependent_member<long> { | struct dependent_member<long> { | ||||
// FIXME this diagnostic is terrible | // FIXME this diagnostic is terrible | ||||
coro<transform_promise> mem_fn() const { // expected-error {{no member named 'await_ready' in 'dependent_operator_co_await_lookup::transformed'}} | coro<transform_promise> mem_fn() const { // expected-error {{no member named 'await_ready' in 'dependent_operator_co_await_lookup::transformed'}} | ||||
// expected-note@-1 {{call to 'initial_suspend' implicitly required by the initial suspend point}} | // expected-note@-1 {{call to 'initial_suspend' implicitly required by the initial suspend point}} | ||||
// expected-note@+1 {{function is a coroutine due to use of 'co_await' here}} | // expected-note@+1 {{function is a coroutine due to use of 'co_await' here}} | ||||
co_await transform_awaitable{}; | co_await transform_awaitable{}; | ||||
// expected-error@-1 {{no member named 'await_ready'}} | |||||
modocacheUnsubmitted Not Done ReplyInline ActionsSame as my comment above: this is a valuable diagnostic, why remove the test for it? Same goes for the rest of the test changes in this patch. modocache: Same as my comment above: this is a valuable diagnostic, why remove the test for it? Same goes… | |||||
} | } | ||||
template <class R, class U> | template <class R, class U> | ||||
coro<R> dep_mem_fn(U u) { co_await u; } | coro<R> dep_mem_fn(U u) { co_await u; } | ||||
}; | }; | ||||
awaitable operator co_await(await_arg_2); // expected-note {{'operator co_await' should be declared prior to the call site}} | awaitable operator co_await(await_arg_2); // expected-note {{'operator co_await' should be declared prior to the call site}} | ||||
template struct dependent_member<basic_promise<await_arg_1>, 0>; | template struct dependent_member<basic_promise<await_arg_1>, 0>; | ||||
template struct dependent_member<basic_promise<await_arg_2>, 0>; // expected-note {{in instantiation}} | template struct dependent_member<basic_promise<await_arg_2>, 0>; // expected-note {{in instantiation}} | ||||
template <> | template <> | ||||
coro<transform_promise> | coro<transform_promise> | ||||
// FIXME this diagnostic is terrible | // FIXME this diagnostic is terrible | ||||
dependent_member<long>::dep_mem_fn<transform_promise>(int) { // expected-error {{no member named 'await_ready' in 'dependent_operator_co_await_lookup::transformed'}} | dependent_member<long>::dep_mem_fn<transform_promise>(int) { // expected-error {{no member named 'await_ready' in 'dependent_operator_co_await_lookup::transformed'}} | ||||
//expected-note@-1 {{call to 'initial_suspend' implicitly required by the initial suspend point}} | //expected-note@-1 {{call to 'initial_suspend' implicitly required by the initial suspend point}} | ||||
//expected-note@+1 {{function is a coroutine due to use of 'co_await' here}} | //expected-note@+1 {{function is a coroutine due to use of 'co_await' here}} | ||||
co_await transform_awaitable{}; | co_await transform_awaitable{}; | ||||
// expected-error@-1 {{no member named 'await_ready'}} | |||||
} | } | ||||
void operator co_await(transform_awaitable) = delete; | void operator co_await(transform_awaitable) = delete; | ||||
awaitable operator co_await(transformed); | awaitable operator co_await(transformed); | ||||
template coro<transform_promise> | template coro<transform_promise> | ||||
dependent_member<long>::dep_mem_fn<transform_promise>(transform_awaitable); | dependent_member<long>::dep_mem_fn<transform_promise>(transform_awaitable); | ||||
▲ Show 20 Lines • Show All 936 Lines • Show Last 20 Lines |
This test ought not change -- we do expect an error here. co_yield can only be used if the promise type defines yield_value.