diff options
| -rw-r--r-- | libcxx/include/experimental/coroutine | 6 | ||||
| -rw-r--r-- | libcxx/test/std/experimental/language.support/support.coroutines/coroutine.handle/coroutine.handle.prom/promise.pass.cpp | 35 |
2 files changed, 39 insertions, 2 deletions
diff --git a/libcxx/include/experimental/coroutine b/libcxx/include/experimental/coroutine index 21c1ea56640..ce795ad452c 100644 --- a/libcxx/include/experimental/coroutine +++ b/libcxx/include/experimental/coroutine @@ -250,9 +250,11 @@ public: _LIBCPP_ALWAYS_INLINE static coroutine_handle from_promise(_Promise& __promise) _NOEXCEPT { + typedef typename remove_cv<_Promise>::type _RawPromise; coroutine_handle __tmp; - __tmp.__handle_ = __builtin_coro_promise(_VSTD::addressof(__promise), - __alignof(_Promise), true); + __tmp.__handle_ = __builtin_coro_promise( + _VSTD::addressof(const_cast<_RawPromise&>(__promise)), + __alignof(_Promise), true); return __tmp; } }; 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(); } |

