]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: Only do maybe_init_list_as_range optimization if !processing_template_decl ...
authorJakub Jelinek <jakub@redhat.com>
Mon, 9 Jan 2023 22:41:20 +0000 (23:41 +0100)
committerJakub Jelinek <jakub@redhat.com>
Mon, 9 Jan 2023 22:41:20 +0000 (23:41 +0100)
commit01ea66a6c56e53163d9430f4d87615d570848aa8
tree70ce38fd433a7df19cbc46482b8dcea158ea5443
parent799e2e7f023784b9cdcebfe5751d183d125b2bd8
c++: Only do maybe_init_list_as_range optimization if !processing_template_decl [PR108047]

The last testcase in this patch ICEs, because
maybe_init_list_as_range -> maybe_init_list_as_array
calls maybe_constant_init in:
  /* Don't do this if the conversion would be constant.  */
  first = maybe_constant_init (first);
  if (TREE_CONSTANT (first))
    return NULL_TREE;
but maybe_constant_init shouldn't be called when processing_template_decl.
While we could replace that call with fold_non_dependent_init, my limited
understanding is that this is an optimization and even if we don't optimize
it when processing_template_decl, build_user_type_conversion_1 will be
called again during instantiation with !processing_template_decl if it is
every instantiated and we can do the optimization only then.

2023-01-09  Jakub Jelinek  <jakub@redhat.com>

PR c++/105838
PR c++/108047
PR c++/108266
* call.cc (maybe_init_list_as_range): Always return NULL_TREE if
processing_template_decl.

* g++.dg/tree-ssa/initlist-opt2.C: New test.
* g++.dg/tree-ssa/initlist-opt3.C: New test.
gcc/cp/call.cc
gcc/testsuite/g++.dg/tree-ssa/initlist-opt2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tree-ssa/initlist-opt3.C [new file with mode: 0644]