diff options
author | Gor Nishanov <GorNishanov@gmail.com> | 2017-07-25 18:01:49 +0000 |
---|---|---|
committer | Gor Nishanov <GorNishanov@gmail.com> | 2017-07-25 18:01:49 +0000 |
commit | 6a4e0d5fc1fcf5ce7e11193d49ec969cb7da8db5 (patch) | |
tree | b5eebcafcb62cd6bf677f5790eab5dbcef78239c /test/PCH | |
parent | 4d083037ef57bef3ac11f28bc8dfeaa15983c87c (diff) | |
download | clang-6a4e0d5fc1fcf5ce7e11193d49ec969cb7da8db5.tar.gz |
[coroutines] Add serialization/deserialization of coroutines
Reviewers: rsmith
Reviewed By: rsmith
Subscribers: EricWF, cfe-commits
Differential Revision: https://reviews.llvm.org/D35383
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@308996 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/PCH')
-rw-r--r-- | test/PCH/coroutines.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/test/PCH/coroutines.cpp b/test/PCH/coroutines.cpp new file mode 100644 index 0000000000..46a2872420 --- /dev/null +++ b/test/PCH/coroutines.cpp @@ -0,0 +1,77 @@ +// Test this without pch. +// RUN: %clang_cc1 -include %s -verify -std=c++1z -fcoroutines-ts %s + +// Test with pch. +// RUN: %clang_cc1 -std=c++1z -fcoroutines-ts -emit-pch -o %t %s +// RUN: %clang_cc1 -include-pch %t -verify -std=c++1z -fcoroutines-ts %s + +#ifndef HEADER +#define HEADER + +namespace std::experimental { +template <typename... T> struct coroutine_traits; + +template <class Promise = void> struct coroutine_handle { + coroutine_handle() = default; + static coroutine_handle from_address(void *) noexcept; +}; +template <> struct coroutine_handle<void> { + static coroutine_handle from_address(void *) noexcept; + coroutine_handle() = default; + template <class PromiseType> + coroutine_handle(coroutine_handle<PromiseType>) noexcept; +}; +} + +struct suspend_always { + bool await_ready() noexcept; + void await_suspend(std::experimental::coroutine_handle<>) noexcept; + void await_resume() noexcept; +}; + +template <typename... Args> struct std::experimental::coroutine_traits<void, Args...> { + struct promise_type { + void get_return_object() noexcept; + suspend_always initial_suspend() noexcept; + suspend_always final_suspend() noexcept; + void return_void() noexcept; + suspend_always yield_value(int) noexcept; + promise_type(); + ~promise_type() noexcept; + void unhandled_exception() noexcept; + }; +}; + +template <typename... Args> struct std::experimental::coroutine_traits<int, Args...> { + struct promise_type { + int get_return_object() noexcept; + suspend_always initial_suspend() noexcept; + suspend_always final_suspend() noexcept; + void return_value(int) noexcept; + promise_type(); + ~promise_type() noexcept; + void unhandled_exception() noexcept; + }; +}; + +template <typename T> +void f(T x) { // checks coawait_expr and coroutine_body_stmt + co_yield 42; // checks coyield_expr + co_await x; // checks dependent_coawait + co_return; // checks coreturn_stmt +} + +template <typename T> +int f2(T x) { // checks coawait_expr and coroutine_body_stmt + co_return x; // checks coreturn_stmt with expr +} + +#else + +// expected-no-diagnostics +void g() { + f(suspend_always{}); + f2(42); +} + +#endif |