https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104981
Bug ID: 104981 Summary: [coroutines] Internal compiler error when promise object's constructor takes a base class of the object parameter Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: ensadc at mailnesia dot com CC: iains at gcc dot gnu.org Target Milestone: --- #include <coroutine> class Base {}; struct PromiseType; struct Result { using promise_type = PromiseType; }; struct PromiseType { PromiseType(const Base& parser, auto&&...) {} Result get_return_object() { return {}; } static std::suspend_never initial_suspend() { return {}; } static std::suspend_always final_suspend() noexcept { return {}; } [[noreturn]] static void unhandled_exception() { throw; } void return_value(int) {} }; struct Derived : Base { Result f() { co_return 42; } }; int main() { Derived d; d.f(); } ==== test.cpp: In member function ‘Result Derived::f()’: test.cpp:26:5: internal compiler error: tree check: expected record_type or union_type or qual_union_type, have reference_type in lookup_base, at cp/search.cc:233 26 | } | ^ 0x8e421c tree_check_failed(tree_node const*, char const*, int, char const*, ...) ../../gcc/gcc/tree.cc:8724 0x751a6a tree_check3(tree_node*, char const*, int, char const*, tree_code, tree_code, tree_code) ../../gcc/gcc/tree.h:3490 0x751a6a lookup_base(tree_node*, tree_node*, int, base_kind*, int) ../../gcc/gcc/cp/search.cc:233 0xa58c38 convert_to_base(tree_node*, tree_node*, bool, bool, int) ../../gcc/gcc/cp/class.cc:627 0xa2cfc2 convert_like_internal ../../gcc/gcc/cp/call.cc:8166 0xa2c5b0 convert_like_internal ../../gcc/gcc/cp/call.cc:8122 0xa316e1 convert_like_with_context ../../gcc/gcc/cp/call.cc:8466 0xa316e1 build_over_call ../../gcc/gcc/cp/call.cc:9579 0xa34d5b build_new_method_call(tree_node*, tree_node*, vec<tree_node*, va_gc, vl_embed>**, tree_node*, int, tree_node**, int) ../../gcc/gcc/cp/call.cc:11171 0xa36147 build_special_member_call(tree_node*, tree_node*, vec<tree_node*, va_gc, vl_embed>**, tree_node*, int, int) ../../gcc/gcc/cp/call.cc:10645 0xa9375d morph_fn_to_coro(tree_node*, tree_node**, tree_node**) ../../gcc/gcc/cp/coroutines.cc:4912 0xade26f finish_function(bool) ../../gcc/gcc/cp/decl.cc:17718 0xbd22f2 cp_parser_function_definition_after_declarator ../../gcc/gcc/cp/parser.cc:31242 0xbd2645 cp_parser_late_parsing_for_member ../../gcc/gcc/cp/parser.cc:32161 0xba8c71 cp_parser_class_specifier_1 ../../gcc/gcc/cp/parser.cc:26176 0xba9f7c cp_parser_class_specifier ../../gcc/gcc/cp/parser.cc:26200 0xba9f7c cp_parser_type_specifier ../../gcc/gcc/cp/parser.cc:19344 0xbab06c cp_parser_decl_specifier_seq ../../gcc/gcc/cp/parser.cc:15903 0xbabc04 cp_parser_simple_declaration ../../gcc/gcc/cp/parser.cc:15151 0xbd9f32 cp_parser_declaration ../../gcc/gcc/cp/parser.cc:14964 Please submit a full bug report, with preprocessed source (by using -freport-bug). Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions.