https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100362
Marek Polacek <mpolacek at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target Milestone|--- |11.2 Summary|ICE with Boost.Asio |[11/12 Regression] ICE with |async_initiate |Boost.Asio async_initiate CC| |ppalka at gcc dot gnu.org --- Comment #2 from Marek Polacek <mpolacek at gcc dot gnu.org> --- template <typename _Tp> struct remove_cv { using type = _Tp; }; class async_result { public: template <typename Initiation, typename RawCompletionToken> static void initiate(Initiation initiation, RawCompletionToken token) { initiation(token); } }; template <typename CompletionToken, typename, typename Initiation> void async_initiate(Initiation initiation, CompletionToken token) { async_result::initiate(initiation, token); } template <typename> class allocator {}; template <typename, typename _Alloc> void allocate_shared(_Alloc) { } template <typename _Tp> void make_shared() { allocate_shared<_Tp>(allocator<typename remove_cv<_Tp>::type>()); } template <typename> class Foo {}; template <typename> class Qux { public: template <typename CompletionToken> decltype(auto) AsyncOp(CompletionToken &&); int a_; }; template <typename T> template <typename CompletionToken> decltype(auto) Qux<T>::AsyncOp(CompletionToken &&token) { using SignatureType = void; async_initiate<CompletionToken, SignatureType>( [this](auto) { struct Grault : Foo<decltype(a_)> {}; auto ptr{make_shared<Grault>}; }, token); } void corge() { Qux<int> qux; qux.AsyncOp([] {}); } $ xg++-10 -c 100362.C $ xg++-11 -c 100362.C 100362.C: In instantiation of ‘struct Qux<int>::AsyncOp<corge()::<lambda()> >(corge()::<lambda()>&&)::<lambda(auto:1)>::Grault’: 100362.C:16:23: required from ‘void make_shared() [with _Tp = Qux<int>::AsyncOp<corge()::<lambda()> >(corge()::<lambda()>&&)::<lambda(auto:1)>::Grault]’ 100362.C:32:14: required from ‘Qux<int>::AsyncOp<corge()::<lambda()> >(corge()::<lambda()>&&)::<lambda(auto:1)> [with auto:1 = corge()::<lambda()>]’ 100362.C:6:15: required from ‘static void async_result::initiate(Initiation, RawCompletionToken) [with Initiation = Qux<int>::AsyncOp<corge()::<lambda()> >(corge()::<lambda()>&&)::<lambda(auto:1)>; RawCompletionToken = corge()::<lambda()>]’ 100362.C:11:25: required from ‘void async_initiate(Initiation, CompletionToken) [with CompletionToken = corge()::<lambda()>; <template-parameter-1-2> = void; Initiation = Qux<int>::AsyncOp<corge()::<lambda()> >(corge()::<lambda()>&&)::<lambda(auto:1)>]’ 100362.C:29:49: required from ‘decltype(auto) Qux< <template-parameter-1-1> >::AsyncOp(CompletionToken&&) [with CompletionToken = corge()::<lambda()>; <template-parameter-1-1> = int]’ 100362.C:38:14: required from here 100362.C:30:18: internal compiler error: in lookup_template_class_1, at cp/pt.c:10005 30 | [this](auto) { | ^ 0xd154c5 lookup_template_class_1 /home/mpolacek/src/gcc11/gcc/cp/pt.c:10005 0xd16c95 lookup_template_class(tree_node*, tree_node*, tree_node*, tree_node*, int, int) /home/mpolacek/src/gcc11/gcc/cp/pt.c:10244 0xd2585c tsubst_aggr_type /home/mpolacek/src/gcc11/gcc/cp/pt.c:13639 0xd3227f tsubst(tree_node*, tree_node*, int, tree_node*) /home/mpolacek/src/gcc11/gcc/cp/pt.c:15578 0xd3221f tsubst(tree_node*, tree_node*, int, tree_node*) /home/mpolacek/src/gcc11/gcc/cp/pt.c:15569 0xd2d9d6 tsubst_decl /home/mpolacek/src/gcc11/gcc/cp/pt.c:14583 0xd36633 tsubst_copy /home/mpolacek/src/gcc11/gcc/cp/pt.c:16661 0xd4eeef tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) /home/mpolacek/src/gcc11/gcc/cp/pt.c:20821 0xd492ec tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) /home/mpolacek/src/gcc11/gcc/cp/pt.c:19719 0xd4774c tsubst_non_call_postfix_expression /home/mpolacek/src/gcc11/gcc/cp/pt.c:19292 0xd4daed tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) /home/mpolacek/src/gcc11/gcc/cp/pt.c:20601 0xd4711f tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) /home/mpolacek/src/gcc11/gcc/cp/pt.c:19198 0xd2f8c2 tsubst_decl /home/mpolacek/src/gcc11/gcc/cp/pt.c:14933 0xd37939 tsubst_copy /home/mpolacek/src/gcc11/gcc/cp/pt.c:16796 0xd4eeef tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) /home/mpolacek/src/gcc11/gcc/cp/pt.c:20821 0xd492ec tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) /home/mpolacek/src/gcc11/gcc/cp/pt.c:19719 0xd4774c tsubst_non_call_postfix_expression /home/mpolacek/src/gcc11/gcc/cp/pt.c:19292 0xd4daed tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) /home/mpolacek/src/gcc11/gcc/cp/pt.c:20601 0xd34dbb tsubst(tree_node*, tree_node*, int, tree_node*) /home/mpolacek/src/gcc11/gcc/cp/pt.c:16223 0xd2036e tsubst_template_arg(tree_node*, tree_node*, int, tree_node*) /home/mpolacek/src/gcc11/gcc/cp/pt.c:12300