public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug c++/94661] New: coroutine ramp function return value ICE for default copy CTOR. @ 2020-04-19 19:23 iains at gcc dot gnu.org 2020-04-19 19:24 ` [Bug c++/94661] " iains at gcc dot gnu.org ` (2 more replies) 0 siblings, 3 replies; 4+ messages in thread From: iains at gcc dot gnu.org @ 2020-04-19 19:23 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94661 Bug ID: 94661 Summary: coroutine ramp function return value ICE for default copy CTOR. Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: iains at gcc dot gnu.org Target Milestone: --- Created attachment 48307 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=48307&action=edit fix being tested Coroutine ramp functions have synthesised return values (the user-authored function body cannot have an explicit 'return'). The current implementation attempts to optimise by building the return in-place, in the manner of C++17 code. Clearly, too ambitious : The following code ICEs with internal compiler error: in expand_expr_addr_expr_1, at expr.c:8075 This is because the default copy CTOR conflicts with the inlace construction. (NOTE: If the Copy CTOR is marked as deleted [which is the most common programming idiom for this] all is OK). --- template <typename T> struct promise { T _value; coro::coroutine_handle<> _continuation = nullptr; struct final_awaitable { bool _has_continuation; final_awaitable(bool has_continuation) : _has_continuation(has_continuation) {} bool await_ready() const noexcept { return !_has_continuation; } template <typename Promise> coro::coroutine_handle<> await_suspend(coro::coroutine_handle<Promise> coro) noexcept { return coro.promise()._continuation; } void await_resume() noexcept {} }; auto get_return_object() noexcept { return coro::coroutine_handle<promise>::from_promise(*this); } auto initial_suspend() noexcept { return coro::suspend_always(); } auto final_suspend() noexcept { return final_awaitable(_continuation != nullptr); } void return_value(T value) { _value = value; } void unhandled_exception() { /*std::terminate();*/ } }; template <typename T> struct task { using promise_type = promise<T>; coro::coroutine_handle<promise<T>> _handle; task(coro::coroutine_handle<promise<T>> handle) : _handle(handle) {} bool await_ready() noexcept { return _handle.done(); } coro::coroutine_handle<> await_suspend(coro::coroutine_handle<> handle) noexcept { _handle.promise()._continuation = handle; return _handle; } T await_resume() noexcept { return _handle.promise()._value; } }; task<int> foo() { co_return 1; } ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/94661] coroutine ramp function return value ICE for default copy CTOR. 2020-04-19 19:23 [Bug c++/94661] New: coroutine ramp function return value ICE for default copy CTOR iains at gcc dot gnu.org @ 2020-04-19 19:24 ` iains at gcc dot gnu.org 2020-04-21 10:09 ` cvs-commit at gcc dot gnu.org 2020-04-21 10:10 ` iains at gcc dot gnu.org 2 siblings, 0 replies; 4+ messages in thread From: iains at gcc dot gnu.org @ 2020-04-19 19:24 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94661 Iain Sandoe <iains at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Keywords| |ice-on-valid-code Assignee|unassigned at gcc dot gnu.org |iains at gcc dot gnu.org Last reconfirmed| |2020-04-19 Target Milestone|--- |10.0 Ever confirmed|0 |1 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/94661] coroutine ramp function return value ICE for default copy CTOR. 2020-04-19 19:23 [Bug c++/94661] New: coroutine ramp function return value ICE for default copy CTOR iains at gcc dot gnu.org 2020-04-19 19:24 ` [Bug c++/94661] " iains at gcc dot gnu.org @ 2020-04-21 10:09 ` cvs-commit at gcc dot gnu.org 2020-04-21 10:10 ` iains at gcc dot gnu.org 2 siblings, 0 replies; 4+ messages in thread From: cvs-commit at gcc dot gnu.org @ 2020-04-21 10:09 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94661 --- Comment #1 from CVS Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Iain D Sandoe <iains@gcc.gnu.org>: https://gcc.gnu.org/g:cd08718d57d1552fa2dbca96809e4915559685e7 commit r10-7842-gcd08718d57d1552fa2dbca96809e4915559685e7 Author: Iain Sandoe <iain@sandoe.co.uk> Date: Tue Apr 21 10:35:13 2020 +0100 coroutines: Fix handling of ramp return value [PR94661] Coroutine ramp functions have synthesised return values (the user-authored function body cannot have an explicit 'return'). The current implementation attempts to optimise by building the return in-place, in the manner of C++17 code. Clearly, that was too ambitious and the fix builds a target expr for the constructed version and passes that to finish_return_stmt. This also means that we now get the same error messages for implicit use of deleted CTORs etc. gcc/cp/ChangeLog: 2020-04-21 Iain Sandoe <iain@sandoe.co.uk> PR c++/94661 * coroutines.cc (morph_fn_to_coro): Simplify return value computation. gcc/testsuite/ChangeLog: 2020-04-21 Iain Sandoe <iain@sandoe.co.uk> PR c++/94661 * g++.dg/coroutines/ramp-return-a.C: New test. * g++.dg/coroutines/ramp-return-b.C: New test. * g++.dg/coroutines/ramp-return-c.C: New test. ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/94661] coroutine ramp function return value ICE for default copy CTOR. 2020-04-19 19:23 [Bug c++/94661] New: coroutine ramp function return value ICE for default copy CTOR iains at gcc dot gnu.org 2020-04-19 19:24 ` [Bug c++/94661] " iains at gcc dot gnu.org 2020-04-21 10:09 ` cvs-commit at gcc dot gnu.org @ 2020-04-21 10:10 ` iains at gcc dot gnu.org 2 siblings, 0 replies; 4+ messages in thread From: iains at gcc dot gnu.org @ 2020-04-21 10:10 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94661 Iain Sandoe <iains at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|--- |FIXED Status|NEW |RESOLVED --- Comment #2 from Iain Sandoe <iains at gcc dot gnu.org> --- so fixed. ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-04-21 10:10 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-04-19 19:23 [Bug c++/94661] New: coroutine ramp function return value ICE for default copy CTOR iains at gcc dot gnu.org 2020-04-19 19:24 ` [Bug c++/94661] " iains at gcc dot gnu.org 2020-04-21 10:09 ` cvs-commit at gcc dot gnu.org 2020-04-21 10:10 ` iains at gcc dot gnu.org
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).