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

Reply via email to