cp/coroutines: add a test for PR c++/103953
This PR seems to have been fixed by a fix for a seemingly unrelated PR. Lets add a regression test to make sure it stays fixed. PR c++/103953 - Leak of coroutine return object PR c++/103953 gcc/testsuite/ChangeLog: * g++.dg/coroutines/torture/pr103953.C: New test. Reviewed-by: Iain Sandoe <iain@sandoe.co.uk>
This commit is contained in:
parent
b95c82d60c
commit
826134760c
1 changed files with 75 additions and 0 deletions
75
gcc/testsuite/g++.dg/coroutines/torture/pr103953.C
Normal file
75
gcc/testsuite/g++.dg/coroutines/torture/pr103953.C
Normal file
|
@ -0,0 +1,75 @@
|
|||
// { dg-do run }
|
||||
// https://gcc.gnu.org/PR103953
|
||||
#include <coroutine>
|
||||
#include <utility>
|
||||
|
||||
static int ctor_dtor_count = 0;
|
||||
|
||||
struct task {
|
||||
struct promise_type;
|
||||
|
||||
using handle_type = std::coroutine_handle<promise_type>;
|
||||
|
||||
task(handle_type h) : handle(h) {
|
||||
ctor_dtor_count++;
|
||||
}
|
||||
task(const task & t) : handle(t.handle) {
|
||||
ctor_dtor_count++;
|
||||
}
|
||||
task(task && t) : handle(std::move(t.handle)) {
|
||||
ctor_dtor_count++;
|
||||
}
|
||||
~task() {
|
||||
if (--ctor_dtor_count < 0)
|
||||
__builtin_abort ();
|
||||
}
|
||||
|
||||
struct promise_type {
|
||||
auto get_return_object() {
|
||||
return task{handle_type::from_promise(*this)};
|
||||
}
|
||||
|
||||
auto initial_suspend() {
|
||||
return std::suspend_always {};
|
||||
}
|
||||
|
||||
auto unhandled_exception() {}
|
||||
|
||||
auto final_suspend() noexcept {
|
||||
return std::suspend_always{};
|
||||
}
|
||||
|
||||
void return_void() {}
|
||||
};
|
||||
|
||||
handle_type handle;
|
||||
|
||||
void await_resume() {
|
||||
handle.resume();
|
||||
}
|
||||
|
||||
auto await_suspend(handle_type) {
|
||||
return handle;
|
||||
}
|
||||
|
||||
auto await_ready() {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
{
|
||||
task coroutine_A = []() ->task {
|
||||
co_return;
|
||||
}();
|
||||
|
||||
task coroutine_B = [&coroutine_A]() ->task {
|
||||
co_await coroutine_A;
|
||||
}();
|
||||
|
||||
coroutine_B.handle.resume();
|
||||
}
|
||||
|
||||
if (ctor_dtor_count != 0)
|
||||
__builtin_abort ();
|
||||
}
|
Loading…
Add table
Reference in a new issue