diff options
author | Gor Nishanov <GorNishanov@gmail.com> | 2018-05-28 18:08:47 +0000 |
---|---|---|
committer | Gor Nishanov <GorNishanov@gmail.com> | 2018-05-28 18:08:47 +0000 |
commit | 45a3948091648495a97e5082bd14aaf4fbf45e08 (patch) | |
tree | b176b9caca61343b11d8885a42bbabf970583fb3 /test/CodeGenCoroutines | |
parent | cea74394edac856d8259be77634ce1d1150ba503 (diff) | |
download | clang-45a3948091648495a97e5082bd14aaf4fbf45e08.tar.gz |
[coroutines] Pass implicit object parameter to promise ctor (fix BUG37604)
Summary:
Complete the implementation of p0914r1.
Implicit object parameter should be passed to a promise constructor.
Fixes: https://bugs.llvm.org/show_bug.cgi?id=37604
Reviewers: modocache, rsmith, lewissbaker
Reviewed By: modocache
Subscribers: cfe-commits, EricWF
Differential Revision: https://reviews.llvm.org/D47454
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@333379 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCoroutines')
-rw-r--r-- | test/CodeGenCoroutines/coro-params.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/test/CodeGenCoroutines/coro-params.cpp b/test/CodeGenCoroutines/coro-params.cpp index 078d7eeb7b..d15286a52c 100644 --- a/test/CodeGenCoroutines/coro-params.cpp +++ b/test/CodeGenCoroutines/coro-params.cpp @@ -156,3 +156,28 @@ void coroutine_matching_promise_constructor(promise_matching_constructor, int, f // CHECK: invoke void @_ZNSt12experimental16coroutine_traitsIJv28promise_matching_constructorifdEE12promise_typeC1ES1_ifd(%"struct.std::experimental::coroutine_traits<void, promise_matching_constructor, int, float, double>::promise_type"* %__promise, i32 %[[INT]], float %[[FLOAT]], double %[[DOUBLE]]) co_return; } + +struct some_class; + +struct method {}; + +template <typename... Args> struct std::experimental::coroutine_traits<method, Args...> { + struct promise_type { + promise_type(some_class&, float); + method get_return_object(); + suspend_always initial_suspend(); + suspend_always final_suspend(); + void return_void(); + void unhandled_exception(); + }; +}; + +struct some_class { + method good_coroutine_calls_custom_constructor(float); +}; + +// CHECK-LABEL: define void @_ZN10some_class39good_coroutine_calls_custom_constructorEf(%struct.some_class* +method some_class::good_coroutine_calls_custom_constructor(float) { + // CHECK: invoke void @_ZNSt12experimental16coroutine_traitsIJ6methodR10some_classfEE12promise_typeC1ES3_f(%"struct.std::experimental::coroutine_traits<method, some_class &, float>::promise_type"* %__promise, %struct.some_class* dereferenceable(1) %{{.+}}, float + co_return; +} |