[Bug c++/79937] [6/7/8 Regression] ICE in replace_placeholders_r

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Mar 16 12:46:00 GMT 2018


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

--- Comment #22 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Author: jakub
Date: Fri Mar 16 12:46:12 2018
New Revision: 258593

URL: https://gcc.gnu.org/viewcvs?rev=258593&root=gcc&view=rev
Log:
        PR c++/79937
        PR c++/82410
        * tree.h (TARGET_EXPR_NO_ELIDE): Define.
        * gimplify.c (gimplify_modify_expr_rhs): Don't elide TARGET_EXPRs with
        TARGET_EXPR_NO_ELIDE flag set unless *expr_p is INIT_EXPR.

        * cp-tree.h (CONSTRUCTOR_PLACEHOLDER_BOUNDARY): Define.
        (find_placeholder): Declare.
        * tree.c (struct replace_placeholders_t): Add exp member.
        (replace_placeholders_r): Don't walk into ctors with
        CONSTRUCTOR_PLACEHOLDER_BOUNDARY flag set, unless they are equal to
        d->exp.  Replace PLACEHOLDER_EXPR with unshare_expr (x) rather than x.
        (replace_placeholders): Initialize data.exp.
        (find_placeholders_r, find_placeholders): New functions.
        * typeck2.c (process_init_constructor_record,
        process_init_constructor_union): Set CONSTRUCTOR_PLACEHOLDER_BOUNDARY
        if adding NSDMI on which find_placeholder returns true.
        * call.c (build_over_call): Don't call replace_placeholders here.
        * cp-gimplify.c (cp_genericize_r): Set TARGET_EXPR_NO_ELIDE on
        TARGET_EXPRs with CONSTRUCTOR_PLACEHOLDER_BOUNDARY set on
        TARGET_EXPR_INITIAL.
        (cp_fold): Copy over CONSTRUCTOR_PLACEHOLDER_BOUNDARY bit to new
        ctor.

        * g++.dg/cpp1y/pr79937-1.C: New test.
        * g++.dg/cpp1y/pr79937-2.C: New test.
        * g++.dg/cpp1y/pr79937-3.C: New test.
        * g++.dg/cpp1y/pr79937-4.C: New test.
        * g++.dg/cpp1y/pr82410.C: New test.

Added:
    trunk/gcc/testsuite/g++.dg/cpp1y/pr79937-1.C
    trunk/gcc/testsuite/g++.dg/cpp1y/pr79937-2.C
    trunk/gcc/testsuite/g++.dg/cpp1y/pr79937-3.C
    trunk/gcc/testsuite/g++.dg/cpp1y/pr79937-4.C
    trunk/gcc/testsuite/g++.dg/cpp1y/pr82410.C
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/call.c
    trunk/gcc/cp/cp-gimplify.c
    trunk/gcc/cp/cp-tree.h
    trunk/gcc/cp/tree.c
    trunk/gcc/cp/typeck2.c
    trunk/gcc/gimplify.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/tree.h


More information about the Gcc-bugs mailing list