Skip to content
Snippets Groups Projects
Commit d6444794 authored by Marek Polacek's avatar Marek Polacek
Browse files

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.
parent 8a2d5bc2
No related branches found
No related tags found
No related merge requests found
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment