https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117937
--- Comment #8 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The trunk branch has been updated by Marek Polacek <mpola...@gcc.gnu.org>: https://gcc.gnu.org/g:d64447946b0c8964dfd9731c3792af0fe4158cda commit r15-6792-gd64447946b0c8964dfd9731c3792af0fe4158cda Author: Marek Polacek <pola...@redhat.com> Date: Thu Dec 19 17:26:27 2024 -0500 c++: ICE with pack indexing and partial inst [PR117937] Here we ICE in expand_expr_real_1: if (exp) { tree context = decl_function_context (exp); gcc_assert (SCOPE_FILE_SCOPE_P (context) || context == current_function_decl on something like this test: void f (auto... args) { [&]<size_t... i>(seq<i...>) { g(args...[i]...); }(seq<0>()); } because while current_function_decl is: f<int>(int)::<lambda(seq<i ...>)> [with long unsigned int ...i = {0}] (correct), context is: f<int>(int)::<lambda(seq<i ...>)> which is only the partial instantiation. I think that when tsubst_pack_index gets a partial instantiation, e.g. {*args#0} as the pack, we should still tsubst it. The args#0's value-expr can be __closure->__args#0 where the closure's context is the partially instantiated operator(). So we should let retrieve_local_specialization find the right args#0. PR c++/117937 gcc/cp/ChangeLog: * pt.cc (tsubst_pack_index): tsubst the pack even when it's not PACK_EXPANSION_P. gcc/testsuite/ChangeLog: * g++.dg/cpp26/pack-indexing13.C: New test. * g++.dg/cpp26/pack-indexing14.C: New test.