https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101907
Bug ID: 101907 Summary: ICE in build_special_member_call (with co_await and initializer list) Product: gcc Version: 11.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: rcopley at gmail dot com Target Milestone: --- The C++ program included at the end of this message causes an ICE at the last line, in GCC versions 10.3.0, 11.1.0, 11.2.0 and on trunk. It compiles successfully in version 10.2.0. Compile command "g++ -std=c++2a -fcoroutines -c x.cpp". See <https://www.godbolt.org/z/3YEnox3sz>. The error message from version 11.2.0 is: source>:24:33: internal compiler error: in build_special_member_call, at cp/call.c:10188 24 | dummy f2() { co_await g2({{}}); } // ICE | ^ 0x1786229 internal_error(char const*, ...) ???:0 0x678608 fancy_abort(char const*, int, char const*) ???:0 0x694170 build_special_member_call(tree_node*, tree_node*, vec<tree_node*, va_gc, vl_embed>**, tree_node*, int, int) ???:0 0xfba6f5 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*> >*)) ???:0 0xfba6f5 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*> >*)) ???:0 0xfbad4e 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*> >*)) ???:0 0xfba6f5 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*> >*)) ???:0 0xfba6f5 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*> >*)) ???:0 0x6cd85b morph_fn_to_coro(tree_node*, tree_node**, tree_node**) ???:0 0x6fd221 finish_function(bool) ???:0 0x7c47db c_parse_file() ???:0 0x896762 c_common_parse_file() ???:0 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. Compiler returned: 1 ---------- #include <vector> #include <string> #include <coroutine> struct dummy { struct promise_type { std::suspend_always initial_suspend() noexcept; std::suspend_always final_suspend() noexcept; void unhandled_exception() noexcept; void get_return_object() noexcept; }; bool await_ready() const noexcept; template <class U> void await_suspend(U); void await_resume(); }; dummy g1(std::vector<int>); dummy f1() { co_await g1({}); } // no ICE dummy g2(std::vector<std::string>); dummy f2() { co_await g2({{}}); } // ICE