[Bug c++/98935] New: [coroutines] co_await on statement expressions causes ICE
mail+gnu at tzik dot jp
gcc-bugzilla@gcc.gnu.org
Tue Feb 2 15:47:16 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98935
Bug ID: 98935
Summary: [coroutines] co_await on statement expressions causes
ICE
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: mail+gnu at tzik dot jp
Target Milestone: ---
In a repro case below, `co_await ({auto x = future{}; x;});` causes an internal
compiler error.
https://wandbox.org/permlink/3jX83p34mVDfBgc1
The compile command was:
$ g++ -std=c++20 failcase.cc
where g++ was the current trunk (11.0.0).
---- failcase.cc
#if __has_include(<coroutine>)
#include <coroutine>
#elif __has_include(<experimental/coroutine>)
#include <experimental/coroutine>
namespace std {
using namespace std::experimental;
}
#endif
struct future {
struct promise_type {
void return_void() {}
std::suspend_always initial_suspend() noexcept { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void unhandled_exception() {}
future get_return_object() { return {}; }
};
bool await_ready() { return false; }
void await_suspend(std::coroutine_handle<>) {}
void await_resume() {}
};
future failcase() {
co_await ({auto x = future{}; x;});
}
----
And its backtrace was:
----
prog.cc: In function 'future failcase()':
prog.cc:25:1: internal compiler error: Segmentation fault
25 | }
| ^
0xca67ef crash_signal
../../source/gcc/toplev.c:327
0xf1866b walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
../../source/gcc/tree.c:12105
0xf18c82 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
../../source/gcc/tree.c:12340
0xf18ad1 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
../../source/gcc/tree.c:12204
0x680293 transform_local_var_uses
../../source/gcc/cp/coroutines.cc:1903
0xf1865b walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
../../source/gcc/tree.c:12099
0x680293 transform_local_var_uses
../../source/gcc/cp/coroutines.cc:1903
0xf1865b walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
../../source/gcc/tree.c:12099
0xf18ad1 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
../../source/gcc/tree.c:12204
0xf187aa walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
../../source/gcc/tree.c:12436
0xf18ad1 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
../../source/gcc/tree.c:12204
0x680293 transform_local_var_uses
../../source/gcc/cp/coroutines.cc:1903
0xf1865b walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
../../source/gcc/tree.c:12099
0x680a27 build_actor_fn
../../source/gcc/cp/coroutines.cc:2085
0x6832a5 morph_fn_to_coro(tree_node*, tree_node**, tree_node**)
../../source/gcc/cp/coroutines.cc:4750
0x6b4f87 finish_function(bool)
../../source/gcc/cp/decl.c:17155
0x76da42 cp_parser_function_definition_after_declarator
../../source/gcc/cp/parser.c:29941
0x76eb9c cp_parser_function_definition_from_specifiers_and_declarator
../../source/gcc/cp/parser.c:29854
0x76eb9c cp_parser_init_declarator
../../source/gcc/cp/parser.c:21564
0x74d5b4 cp_parser_simple_declaration
../../source/gcc/cp/parser.c:14381
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
More information about the Gcc-bugs
mailing list