// -*- C++ -*- //===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 // REQUIRES: fcoroutines-ts // RUN: %build -fcoroutines-ts // RUN: %run #include #include using namespace std::experimental; struct coro_t { struct promise_type { coro_t get_return_object() { coroutine_handle{}; return {}; } suspend_never initial_suspend() { return {}; } suspend_never final_suspend() { return {}; } void return_void(){} static void unhandled_exception() {} }; }; struct B { ~B() {} bool await_ready() { return true; } B await_resume() { return {}; } template void await_suspend(F) {} }; struct A { ~A(){} bool await_ready() { return true; } int await_resume() { return 42; } template void await_suspend(F) {} }; int last_value = -1; void set_value(int x) { last_value = x; } coro_t f(int n) { if (n == 0) { set_value(0); co_return; } int val = co_await A{}; set_value(42); } coro_t g() { B val = co_await B{}; } int main() { last_value = -1; f(0); assert(last_value == 0); f(1); assert(last_value == 42); }