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

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

https://gcc.gnu.org/g:173cf7c9b8c0d61bb2cb0bd3a9e3150b393ab59a

commit r15-7810-g173cf7c9b8c0d61bb2cb0bd3a9e3150b393ab59a
Author: Marek Polacek <pola...@redhat.com>
Date:   Thu Feb 27 17:42:49 2025 -0500

    c++: ICE with RANGE_EXPR and array init [PR109431]

    We crash because we generate

      {[0 ... 1]={.low=0, .high=1}, [1]={.low=0, .high=1}}

    which output_constructor_regular_field doesn't want to see.  This
    happens since r9-1483: process_init_constructor_array can now create
    a RANGE_EXPR.  But the bug isn't in that patch; the problem is that
    build_vec_init doesn't handle RANGE_EXPRs.

    build_vec_init has a FOR_EACH_CONSTRUCTOR_ELT loop which populates
    const_vec.  In this case it loops over the elements of

      {[0 ... 1]={.low=0, .high=1}}

    but assumes that each element initializes one element.  So after the
    loop num_initialized_elts was 1, and then below:

                  HOST_WIDE_INT last = tree_to_shwi (maxindex);
                  if (num_initialized_elts <= last)
                    {
                      tree field = size_int (num_initialized_elts);
                      if (num_initialized_elts != last)
                        field = build2 (RANGE_EXPR, sizetype, field,
                                        size_int (last));
                      CONSTRUCTOR_APPEND_ELT (const_vec, field, e);
                    }

    we added the extra initializer.

    It seemed convenient to use range_expr_nelts like below.

            PR c++/109431

    gcc/cp/ChangeLog:

            * cp-tree.h (range_expr_nelts): Declare.
            * init.cc (build_vec_init): If the CONSTRUCTOR's index is a
            RANGE_EXPR, use range_expr_nelts to count how many elements
            were initialized.

    gcc/testsuite/ChangeLog:

            * g++.dg/init/array67.C: New test.

    Reviewed-by: Jason Merrill <ja...@redhat.com>

Reply via email to