diff options
Diffstat (limited to 'test/std/experimental/language.support/support.coroutines/end.to.end/await_result.pass.cpp')
-rw-r--r-- | test/std/experimental/language.support/support.coroutines/end.to.end/await_result.pass.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/test/std/experimental/language.support/support.coroutines/end.to.end/await_result.pass.cpp b/test/std/experimental/language.support/support.coroutines/end.to.end/await_result.pass.cpp new file mode 100644 index 000000000000..769a825df001 --- /dev/null +++ b/test/std/experimental/language.support/support.coroutines/end.to.end/await_result.pass.cpp @@ -0,0 +1,69 @@ +// -*- 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 + +#include <experimental/coroutine> +#include <cassert> + +using namespace std::experimental; + +struct coro_t { + struct promise_type { + coro_t get_return_object() { + coroutine_handle<promise_type>{}; + 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 <typename F> void await_suspend(F) {} +}; + + +struct A { + ~A(){} + bool await_ready() { return true; } + int await_resume() { return 42; } + template <typename F> 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{}; + ((void)val); + 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); +} |