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
{
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
{
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;
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),
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)
}
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 ();
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
--- /dev/null
+// 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{};
+}