aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-inline.h
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2024-12-12 14:56:07 -0500
committerMarek Polacek <polacek@redhat.com>2024-12-17 12:01:18 -0500
commit40e5636e086e51f5908a1a01be9cba2218dc26d8 (patch)
tree7d98b6f76d5979e83120afff846661d2d61ea73b /gcc/tree-inline.h
parentd17b09c07a1da0e3950718aabc2cbdb90cae402b (diff)
downloadgcc-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