[Bug c++/95519] New: [coroutines] non-functions for promise_type::return_void not supported
bruck.michael at gmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Jun 3 22:34:18 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95519
Bug ID: 95519
Summary: [coroutines] non-functions for
promise_type::return_void not supported
Product: gcc
Version: 10.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: bruck.michael at gmail dot com
Target Milestone: ---
The standard only requires certain expressions e.g. "p.return_void()", not
specifically functions. return_void is the only one I tested, presumably this
applies to more.
The example uses a struct with operator() and a function pointer.
Both work on clang.
https://gcc.godbolt.org/z/oW8eQ3
#ifndef __clang__
#include <coroutine>
#else
#include <experimental/coroutine>
namespace std { using namespace experimental; }
#endif
#include <cstdio>
struct rv
{
void operator ()(){
printf("call to operator\n");
}
};
struct pt
{
using handle_t = std::coroutine_handle<pt>;
auto get_return_object() noexcept { return handle_t::from_promise(*this); }
std::suspend_never initial_suspend() const noexcept { return {}; }
std::suspend_never final_suspend() const noexcept { return {}; }
//void return_void() const noexcept { printf("call to function\n"); }
// error 1
rv return_void;
// error 2
//static constexpr auto return_void = []{ printf("call to lambda\n");};
void unhandled_exception() const noexcept {}
};
template <> struct std::coroutine_traits<pt::handle_t>
{ using promise_type = pt; };
static pt::handle_t foo()
{
co_return;
}
int main()
{
foo();
}
---
<source>: In function 'pt::handle_t foo()':
<source>:38:5: error: call to non-function 'pt::return_void'
38 | co_return;
| ^~~~~~~~~
<source>:39:1: error: call to non-function 'pt::return_void'
39 | }
| ^
More information about the Gcc-bugs
mailing list