summaryrefslogtreecommitdiffstats
path: root/libcxx/test
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2017-06-16 00:36:17 +0000
committerEric Fiselier <eric@efcs.ca>2017-06-16 00:36:17 +0000
commitf9bc0589353e8e478d798aa9b8790978f6b2432e (patch)
treeb2ccafbe0a05b3d7dc093657f5c1457fe8fb119d /libcxx/test
parentf63d41469caa0930be1954f105267ee802134b69 (diff)
downloadbcm5719-llvm-f9bc0589353e8e478d798aa9b8790978f6b2432e.tar.gz
bcm5719-llvm-f9bc0589353e8e478d798aa9b8790978f6b2432e.zip
Allow coroutine_handle<const T> to support creation from const references to the promise_type
It seems conceivable that a user would need to get a coroutine handle having only a const reference to the promise_type, for example from within a const member function of the promise. This patch allows that use case. A coroutine_handle<const T> can be used in essentially the same way a coroutine_handle<T>, ie to start and destroy the coroutine. The constness of the promise doesn't/shouldn't propagate to the handle. llvm-svn: 305536
Diffstat (limited to 'libcxx/test')
-rw-r--r--libcxx/test/std/experimental/language.support/support.coroutines/coroutine.handle/coroutine.handle.prom/promise.pass.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/libcxx/test/std/experimental/language.support/support.coroutines/coroutine.handle/coroutine.handle.prom/promise.pass.cpp b/libcxx/test/std/experimental/language.support/support.coroutines/coroutine.handle/coroutine.handle.prom/promise.pass.cpp
index 4a61047a830..f996886c4ca 100644
--- a/libcxx/test/std/experimental/language.support/support.coroutines/coroutine.handle/coroutine.handle.prom/promise.pass.cpp
+++ b/libcxx/test/std/experimental/language.support/support.coroutines/coroutine.handle/coroutine.handle.prom/promise.pass.cpp
@@ -28,6 +28,39 @@
namespace coro = std::experimental;
+struct MyCoro {
+ struct promise_type {
+ void unhandled_exception() {}
+ void return_void() {}
+ coro::suspend_never initial_suspend() { return {}; }
+ coro::suspend_never final_suspend() { return {}; }
+ MyCoro get_return_object() {
+ do_runtime_test();
+ return {};
+ }
+ void do_runtime_test() {
+ // Test that a coroutine_handle<const T> can be created from a const
+ // promise_type and that it represents the same coroutine as
+ // coroutine_handle<T>
+ using CH = coro::coroutine_handle<promise_type>;
+ using CCH = coro::coroutine_handle<const promise_type>;
+ const auto &cthis = *this;
+ CH h = CH::from_promise(*this);
+ CCH h2 = CCH::from_promise(*this);
+ CCH h3 = CCH::from_promise(cthis);
+ assert(&h.promise() == this);
+ assert(&h2.promise() == this);
+ assert(&h3.promise() == this);
+ assert(h.address() == h2.address());
+ assert(h2.address() == h3.address());
+ }
+ };
+};
+
+MyCoro do_runtime_test() {
+ co_await coro::suspend_never{};
+}
+
template <class Promise>
void do_test(coro::coroutine_handle<Promise>&& H) {
@@ -46,4 +79,6 @@ void do_test(coro::coroutine_handle<Promise>&& H) {
int main()
{
do_test(coro::coroutine_handle<int>{});
+ do_test(coro::coroutine_handle<const int>{});
+ do_runtime_test();
}
OpenPOWER on IntegriCloud