https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117985

--- Comment #8 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-13 branch has been updated by Marek Polacek
<mpola...@gcc.gnu.org>:

https://gcc.gnu.org/g:ff0e01a99daa1784f1d0adc5b2a1aab86693b1ca

commit r13-9298-gff0e01a99daa1784f1d0adc5b2a1aab86693b1ca
Author: Marek Polacek <pola...@redhat.com>
Date:   Thu Dec 12 14:56:07 2024 -0500

    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.

    (cherry picked from commit 40e5636e086e51f5908a1a01be9cba2218dc26d8)

Reply via email to