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.
The provided fail-case seems to compile fine on godbolt.org 10.2, but started to ICE with 10.3, as well as 11.1 and 11.2.
statement expressions have never been handled explicitly (deferred since they are an extension) .. however, it is planned to support them,
GCC 10.4 is being released, retargeting bugs to GCC 10.5.
Fixed in GCC 11.3.
Broken in trunk internal compiler error: in register_local_var_uses, at cp/coroutines.cc:3903 https://godbolt.org/z/j9KTsroxj