https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104432
Bug ID: 104432 Summary: [12 Regression] ICE in operator() from filter_memfn_lookup since r12-6080 Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: jakub at gcc dot gnu.org Target Milestone: --- Since r12-6080-gab85331c58223e483c55ff0316a92265d7910e9b the following testcase ICEs: rh2051651.C: In instantiation of ‘void E< <template-parameter-1-1> >::bar() [with <template-parameter-1-1> = int]’: rh2051651.C:22:8: required from here rh2051651.C:22:38: internal compiler error: in operator(), at cp/pt.c:16271 22 | void bar () { for (auto i : b) foo (i); } | ~~~~^~~ 0xddb7b4 operator() ../../gcc/cp/pt.c:16271 0xddbac4 filter_memfn_lookup ../../gcc/cp/pt.c:16276 0xddc1cf tsubst_baselink ../../gcc/cp/pt.c:16363 0xdf6444 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/cp/pt.c:20864 0xdf42e3 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/cp/pt.c:20494 0xdeed6a tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/cp/pt.c:19313 0xde6c18 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/cp/pt.c:18326 0xde8c90 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/cp/pt.c:18557 0xde9a37 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/cp/pt.c:18655 0xe0d76a instantiate_body ../../gcc/cp/pt.c:26236 0xe0f136 instantiate_decl(tree_node*, bool, bool) ../../gcc/cp/pt.c:26529 0xe0f4d2 instantiate_pending_templates(int) ../../gcc/cp/pt.c:26608 0xc10624 c_parse_final_cleanups() ../../gcc/cp/decl2.c:5097 0xf5edcd c_common_parse_file() ../../gcc/c-family/c-opts.c:1260 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. struct A { int operator* (); void operator++ (); bool operator!= (A); }; struct B { A begin (); A end (); }; struct C { template <typename> void foo (); }; struct D : public C { void foo (int); virtual void bar (); }; template <typename = int> struct E : D { using D::foo; using C::foo; B b; void bar () { for (auto i : b) foo (i); } }; struct F { using G = E<>; F() {} G g; };