diff options
author | Gor Nishanov <GorNishanov@gmail.com> | 2017-05-24 14:19:48 +0000 |
---|---|---|
committer | Gor Nishanov <GorNishanov@gmail.com> | 2017-05-24 14:19:48 +0000 |
commit | ab7e8aebeeef9d029a7d44ef48b3530f2f7032b4 (patch) | |
tree | e8d13d96f550056a41f1e9125507adc59620aac4 /clang/test/CodeGenCoroutines/Inputs | |
parent | 183863fc3be326241178b189515e18e06dea5dce (diff) | |
download | bcm5719-llvm-ab7e8aebeeef9d029a7d44ef48b3530f2f7032b4.tar.gz bcm5719-llvm-ab7e8aebeeef9d029a7d44ef48b3530f2f7032b4.zip |
[coroutines] [NFC] Add tests for return_void, unhandled_exception and promise dtor
Summary:
* Test that coroutine promise destructor is called.
* Test that we call return_void on fallthrough
* Test that we call unhandled exception in a try catch surrounding the body
Reviewers: EricWF, GorNishanov
Reviewed By: GorNishanov
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D33479
llvm-svn: 303748
Diffstat (limited to 'clang/test/CodeGenCoroutines/Inputs')
-rw-r--r-- | clang/test/CodeGenCoroutines/Inputs/coroutine.h | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/clang/test/CodeGenCoroutines/Inputs/coroutine.h b/clang/test/CodeGenCoroutines/Inputs/coroutine.h new file mode 100644 index 00000000000..d58212b1d52 --- /dev/null +++ b/clang/test/CodeGenCoroutines/Inputs/coroutine.h @@ -0,0 +1,80 @@ +#pragma once + +namespace std { namespace experimental { inline namespace coroutines_v1 { + +template <typename R, typename...> struct coroutine_traits { + using promise_type = typename R::promise_type; +}; + +template <typename Promise = void> struct coroutine_handle; + +template <> struct coroutine_handle<void> { + static coroutine_handle from_address(void *addr) noexcept { + coroutine_handle me; + me.ptr = addr; + return me; + } + void operator()() { resume(); } + void *address() const { return ptr; } + void resume() const { __builtin_coro_resume(ptr); } + void destroy() const { __builtin_coro_destroy(ptr); } + bool done() const { return __builtin_coro_done(ptr); } + coroutine_handle &operator=(decltype(nullptr)) { + ptr = nullptr; + return *this; + } + coroutine_handle(decltype(nullptr)) : ptr(nullptr) {} + coroutine_handle() : ptr(nullptr) {} +// void reset() { ptr = nullptr; } // add to P0057? + explicit operator bool() const { return ptr; } + +protected: + void *ptr; +}; + +template <typename Promise> struct coroutine_handle : coroutine_handle<> { + using coroutine_handle<>::operator=; + + static coroutine_handle from_address(void *addr) noexcept { + coroutine_handle me; + me.ptr = addr; + return me; + } + + Promise &promise() const { + return *reinterpret_cast<Promise *>( + __builtin_coro_promise(ptr, alignof(Promise), false)); + } + static coroutine_handle from_promise(Promise &promise) { + coroutine_handle p; + p.ptr = __builtin_coro_promise(&promise, alignof(Promise), true); + return p; + } +}; + + template <typename _PromiseT> + bool operator==(coroutine_handle<_PromiseT> const& _Left, + coroutine_handle<_PromiseT> const& _Right) noexcept + { + return _Left.address() == _Right.address(); + } + + template <typename _PromiseT> + bool operator!=(coroutine_handle<_PromiseT> const& _Left, + coroutine_handle<_PromiseT> const& _Right) noexcept + { + return !(_Left == _Right); + } + +struct suspend_always { + bool await_ready() { return false; } + void await_suspend(coroutine_handle<>) {} + void await_resume() {} +}; +struct suspend_never { + bool await_ready() { return true; } + void await_suspend(coroutine_handle<>) {} + void await_resume() {} +}; + +}}} |