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.
  • [Bug c++/117937] ICE: in expand... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to