aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/cp-gimplify.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-03-16 13:46:12 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2018-03-16 13:46:12 +0100
commit570f86f94eca76fbfab919dcbfe639a5ba69f20e (patch)
tree1139d8cfc2b9466af7e0ef552bbdca551cdc549b /gcc/cp/cp-gimplify.c
parentaafdbe06af7127972c483fb2c9bf07b542b49d23 (diff)
downloadgcc-570f86f94eca76fbfab919dcbfe639a5ba69f20e.zip
gcc-570f86f94eca76fbfab919dcbfe639a5ba69f20e.tar.gz
gcc-570f86f94eca76fbfab919dcbfe639a5ba69f20e.tar.bz2
re PR c++/79937 (ICE in replace_placeholders_r)
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. From-SVN: r258593
Diffstat (limited to 'gcc/cp/cp-gimplify.c')
-rw-r--r--gcc/cp/cp-gimplify.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 653d1dce..332ff2b 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -1538,6 +1538,13 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
}
break;
+ case TARGET_EXPR:
+ if (TARGET_EXPR_INITIAL (stmt)
+ && TREE_CODE (TARGET_EXPR_INITIAL (stmt)) == CONSTRUCTOR
+ && CONSTRUCTOR_PLACEHOLDER_BOUNDARY (TARGET_EXPR_INITIAL (stmt)))
+ TARGET_EXPR_NO_ELIDE (stmt) = 1;
+ break;
+
default:
if (IS_TYPE_OR_DECL_P (stmt))
*walk_subtrees = 0;
@@ -2492,7 +2499,11 @@ cp_fold (tree x)
}
}
if (nelts)
- x = build_constructor (TREE_TYPE (x), nelts);
+ {
+ x = build_constructor (TREE_TYPE (x), nelts);
+ CONSTRUCTOR_PLACEHOLDER_BOUNDARY (x)
+ = CONSTRUCTOR_PLACEHOLDER_BOUNDARY (org_x);
+ }
break;
}
case TREE_VEC: