diff options
author | Marek Polacek <polacek@redhat.com> | 2024-12-12 14:56:07 -0500 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2024-12-17 12:01:18 -0500 |
commit | 40e5636e086e51f5908a1a01be9cba2218dc26d8 (patch) | |
tree | 7d98b6f76d5979e83120afff846661d2d61ea73b /gcc/tree-inline.h | |
parent | d17b09c07a1da0e3950718aabc2cbdb90cae402b (diff) | |
download | gcc-40e5636e086e51f5908a1a01be9cba2218dc26d8.zip gcc-40e5636e086e51f5908a1a01be9cba2218dc26d8.tar.gz gcc-40e5636e086e51f5908a1a01be9cba2218dc26d8.tar.bz2 |
c++: ICE initializing array of aggrs [PR117985]
This crash started with my r12-7803 but I believe the problem lies
elsewhere.
build_vec_init has cleanup_flags whose purpose is -- if I grok this
correctly -- to avoid destructing an object multiple times. Let's
say we are initializing an array of A. Then we might end up in
a scenario similar to initlist-eh1.C:
try
{
call A::A in a loop
// #0
try
{
call a fn using the array
}
finally
{
// #1
call A::~A in a loop
}
}
catch
{
// #2
call A::~A in a loop
}
cleanup_flags makes us emit a statement like
D.3048 = 2;
at #0 to disable performing the cleanup at #2, since #1 will take
care of the destruction of the array.
But if we are not emitting the loop because we can use a constant
initializer (and use a single { a, b, ...}), we shouldn't generate
the statement resetting the iterator to its initial value. Otherwise
we crash in gimplify_var_or_parm_decl because it gets the stray decl
D.3048.
PR c++/117985
gcc/cp/ChangeLog:
* init.cc (build_vec_init): Pop CLEANUP_FLAGS if we're not
generating the loop.
gcc/testsuite/ChangeLog:
* g++.dg/cpp0x/initlist-array23.C: New test.
* g++.dg/cpp0x/initlist-array24.C: New test.
Diffstat (limited to 'gcc/tree-inline.h')
0 files changed, 0 insertions, 0 deletions