[Bug c++/94219] ICE in cxx_eval_bare_aggregate, at cp/constexpr.c:3790

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sat Apr 4 16:18:02 GMT 2020


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

--- Comment #2 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>:

https://gcc.gnu.org/g:37244b217a7329792f4ec48027f63cf5010b0ea8

commit r10-7556-g37244b217a7329792f4ec48027f63cf5010b0ea8
Author: Patrick Palka <ppalka@redhat.com>
Date:   Thu Apr 2 12:59:34 2020 -0400

    c++: Fix constexpr evaluation of self-modifying CONSTRUCTORs [PR94219]

    This PR reveals that cxx_eval_bare_aggregate and cxx_eval_store_expression
do
    not anticipate that a constructor element's initializer could mutate the
    underlying CONSTRUCTOR.  Evaluation of the initializer could add new
elements to
    the underlying CONSTRUCTOR, thereby potentially invalidating any pointers
to
    or assumptions about the CONSTRUCTOR's elements, and so these routines
should be
    prepared for that.

    To fix this problem, this patch makes cxx_eval_bare_aggregate and
    cxx_eval_store_expression recompute the constructor_elt pointers through
which
    we're assigning, after it evaluates the initializer.  Care is taken to to
not
    slow down the common case where the initializer does not modify the
underlying
    CONSTRUCTOR.

    gcc/cp/ChangeLog:

            PR c++/94219
            PR c++/94205
            * constexpr.c (get_or_insert_ctor_field): Split out (while adding
            support for VECTOR_TYPEs, and optimizations for the common case)
            from ...
            (cxx_eval_store_expression): ... here.  Rename local variable
            'changed_active_union_member_p' to 'activated_union_member_p'. 
Record
            the sequence of indexes into 'indexes' that yields the subobject
we're
            assigning to.  Record the integer offsets of the constructor
indexes
            we're assigning through into 'index_pos_hints'.  After evaluating
the
            initializer of the store expression, recompute 'valp' using
'indexes'
            and using 'index_pos_hints' as hints.
            (cxx_eval_bare_aggregate): Tweak comments.  Use
get_or_insert_ctor_field
            to recompute the constructor_elt pointer we're assigning through
after
            evaluating each initializer.

    gcc/testsuite/ChangeLog:

            PR c++/94219
            PR c++/94205
            * g++.dg/cpp1y/constexpr-nsdmi3.C: New test.
            * g++.dg/cpp1y/constexpr-nsdmi4.C: New test.
            * g++.dg/cpp1y/constexpr-nsdmi5.C: New test.
            * g++.dg/cpp1z/lambda-this5.C: New test.


More information about the Gcc-bugs mailing list