Skip to content

Commit

Permalink
PR c++/80095
Browse files Browse the repository at this point in the history
	* call.c (build_over_call): Don't check cxx_dialect.
	* cp-gimplify.c (cp_gimplify_init_expr): Don't check cxx_dialect nor
	whether SUB is a CONSTRUCTOR.
	* init.c (build_new_1): Don't check cxx_dialect.
	* tree.c (replace_placeholders): Add a function comment.  Return if
	not in C++14, or if the object isn't a (member of a) class.
	* typeck2.c (store_init_value): Don't check cxx_dialect nor whether
	TYPE is CLASS_TYPE_P.

	* g++.dg/cpp1y/nsdmi-aggr8.C: New test.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@246772 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
mpolacek committed Apr 7, 2017
1 parent 5eca48e commit ffc5ad9
Show file tree
Hide file tree
Showing 8 changed files with 50 additions and 11 deletions.
10 changes: 10 additions & 0 deletions gcc/cp/ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@
PR sanitizer/80348
* typeck.c (cp_build_binary_op): Convert COP[01] to ORIG_TYPE.

PR c++/80095
* call.c (build_over_call): Don't check cxx_dialect.
* cp-gimplify.c (cp_gimplify_init_expr): Don't check cxx_dialect nor
whether SUB is a CONSTRUCTOR.
* init.c (build_new_1): Don't check cxx_dialect.
* tree.c (replace_placeholders): Add a function comment. Return if
not in C++14, or if the object isn't a (member of a) class.
* typeck2.c (store_init_value): Don't check cxx_dialect nor whether
TYPE is CLASS_TYPE_P.

2017-04-05 Jakub Jelinek <jakub@redhat.com>

PR c++/80309
Expand Down
5 changes: 2 additions & 3 deletions gcc/cp/call.c
Original file line number Diff line number Diff line change
Expand Up @@ -8047,9 +8047,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
{
arg = cp_build_indirect_ref (arg, RO_NULL, complain);
val = build2 (MODIFY_EXPR, TREE_TYPE (to), to, arg);
if (cxx_dialect >= cxx14)
/* Handle NSDMI that refer to the object being initialized. */
replace_placeholders (arg, to);
/* Handle NSDMI that refer to the object being initialized. */
replace_placeholders (arg, to);
}
else
{
Expand Down
5 changes: 2 additions & 3 deletions gcc/cp/cp-gimplify.c
Original file line number Diff line number Diff line change
Expand Up @@ -496,9 +496,8 @@ cp_gimplify_init_expr (tree *expr_p)
TREE_TYPE (from) = void_type_node;
}

if (cxx_dialect >= cxx14 && TREE_CODE (sub) == CONSTRUCTOR)
/* Handle aggregate NSDMI. */
replace_placeholders (sub, to);
/* Handle aggregate NSDMI. */
replace_placeholders (sub, to);

if (t == sub)
break;
Expand Down
3 changes: 1 addition & 2 deletions gcc/cp/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -3373,8 +3373,7 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
object being initialized, replace them now and don't try to
preevaluate. */
bool had_placeholder = false;
if (cxx_dialect >= cxx14
&& !processing_template_decl
if (!processing_template_decl
&& TREE_CODE (init_expr) == INIT_EXPR)
TREE_OPERAND (init_expr, 1)
= replace_placeholders (TREE_OPERAND (init_expr, 1),
Expand Down
14 changes: 14 additions & 0 deletions gcc/cp/tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -2813,9 +2813,23 @@ replace_placeholders_r (tree* t, int* walk_subtrees, void* data_)
return NULL_TREE;
}

/* Replace PLACEHOLDER_EXPRs in EXP with object OBJ. SEEN_P is set if
a PLACEHOLDER_EXPR has been encountered. */

tree
replace_placeholders (tree exp, tree obj, bool *seen_p)
{
/* This is only relevant for C++14. */
if (cxx_dialect < cxx14)
return exp;

/* If the object isn't a (member of a) class, do nothing. */
tree op0 = obj;
while (TREE_CODE (op0) == COMPONENT_REF)
op0 = TREE_OPERAND (op0, 0);
if (!CLASS_TYPE_P (strip_array_types (TREE_TYPE (op0))))
return exp;

tree *tp = &exp;
replace_placeholders_t data = { obj, false };
if (TREE_CODE (exp) == TARGET_EXPR)
Expand Down
5 changes: 2 additions & 3 deletions gcc/cp/typeck2.c
Original file line number Diff line number Diff line change
Expand Up @@ -840,9 +840,8 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags)
}
value = cp_fully_fold (value);

if (cxx_dialect >= cxx14 && CLASS_TYPE_P (strip_array_types (type)))
/* Handle aggregate NSDMI in non-constant initializers, too. */
value = replace_placeholders (value, decl);
/* Handle aggregate NSDMI in non-constant initializers, too. */
value = replace_placeholders (value, decl);

/* DECL may change value; purge caches. */
clear_cv_and_fold_caches ();
Expand Down
3 changes: 3 additions & 0 deletions gcc/testsuite/ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
PR sanitizer/80348
* g++.dg/ubsan/div-by-zero-2.C: New test.

PR c++/80095
* g++.dg/cpp1y/nsdmi-aggr8.C: New test.

2017-04-07 Vladimir Makarov <vmakarov@redhat.com>

PR rtl-optimization/70478
Expand Down
16 changes: 16 additions & 0 deletions gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr8.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// PR c++/80095
// { dg-do compile { target c++14 } }

struct A
{
void* p = this;
};

void
foo ()
{
const A& a = A{};
A&& a2 = A{};
const A& a3{};
A&& a4{};
}

0 comments on commit ffc5ad9

Please sign in to comment.