blob: a325d384fc390c2d213ddce3450a05d33536ded4 [file] [log] [blame]
// { dg-additional-options "-fsyntax-only " }
#ifdef __clang__
#include <experimental/coroutine>
namespace std {
using namespace std::experimental;
}
#else
#include <coroutine>
#endif
struct Task
{
struct promise_type
{
void return_void() const noexcept {}
void* operator new(std::size_t, auto &&...args) noexcept
{
static_assert(sizeof...(args) > 0);
static_assert(sizeof...(args) == 2);
return nullptr;
}
void operator delete(void *, std::size_t) noexcept
{
}
static Task get_return_object_on_allocation_failure() noexcept
{
return {};
}
Task get_return_object() noexcept
{
return Task{ *this };
}
std::suspend_always initial_suspend() noexcept
{
return {};
}
std::suspend_always final_suspend() noexcept
{
return {};
}
void unhandled_exception() noexcept {}
};
using promise_handle = std::coroutine_handle<promise_type>;
Task() = default;
Task(promise_type & promise) noexcept
: m_handle{ promise_handle::from_promise(promise) }
{}
~Task()
{
if (m_handle.address()) { m_handle.destroy(); }
}
promise_handle m_handle{};
};
Task Foo(auto && ... args) noexcept
{
co_return;
}
int main()
{
int v;
Foo(v, 2134);
}