]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: Properly detect calls to digest_init in build_vec_init [PR114619]
authorSimon Martin <simon@nasilyan.com>
Tue, 4 Feb 2025 09:44:10 +0000 (10:44 +0100)
committerSimon Martin <simon@nasilyan.com>
Tue, 4 Feb 2025 09:44:56 +0000 (10:44 +0100)
commit887bdabfe3e315d661bed55800cd4f64542c7029
tree2252210c849a26c007eac2ed1c94057ddb68c4cb
parent4b2726a62ddfe958302d6790725503ac09b28f11
c++: Properly detect calls to digest_init in build_vec_init [PR114619]

We currently ICE in checking mode with cxx_dialect < 17 on the following
valid code

=== cut here ===
struct X {
  X(const X&) {}
};
extern X x;
void foo () {
  new X[1]{x};
}
=== cut here ===

We trip on a gcc_checking_assert in cp_gimplify_expr due to a
TARGET_EXPR that is not TARGET_EXPR_ELIDING_P. As pointed by Jason, the
problem is that build_vec_init does not recognize that digest_init has
been called, and we end up calling the copy constructor twice.

This happens because the detection in build_vec_init assumes that BASE
is a reference to the array, while it's a pointer to its first element
here. This patch makes sure that the detection works in both cases.

PR c++/114619

gcc/cp/ChangeLog:

* init.cc (build_vec_init): Properly determine whether
digest_init has been called.

gcc/testsuite/ChangeLog:

* g++.dg/init/no-elide4.C: New test.
gcc/cp/init.cc
gcc/testsuite/g++.dg/init/no-elide4.C [new file with mode: 0644]