From: Jason Merrill Date: Mon, 4 Jan 2021 21:11:08 +0000 (-0500) Subject: c++: Add TARGET_EXPR comments X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6c59b8a93cf4784e3e3137416a3d32a1ecc8e00b;p=gcc.git c++: Add TARGET_EXPR comments Discussing the 98469 patch and class prvalues with Jakub led me to double-check our handling of TARGET_EXPR in constexpr.c, and add a note about why we don't strip them in parameter initialization. And another to clarify that we're handling an INIT_EXPR in a place we do strip them. gcc/cp/ChangeLog: * constexpr.c (cxx_bind_parameters_in_call): Add comment. (cxx_eval_store_expression): Add comment. --- diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 0c12f608d36..4a5e6384da6 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -1591,6 +1591,9 @@ cxx_bind_parameters_in_call (const constexpr_ctx *ctx, tree t, if (TREE_ADDRESSABLE (type)) /* Undo convert_for_arg_passing work here. */ x = convert_from_reference (x); + /* Normally we would strip a TARGET_EXPR in an initialization context + such as this, but here we do the elision differently: we keep the + TARGET_EXPR, and use its CONSTRUCTOR as the value of the parm. */ arg = cxx_eval_constant_expression (ctx, x, /*lval=*/false, non_constant_p, overflow_p); /* Don't VERIFY_CONSTANT here. */ @@ -5388,6 +5391,9 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t, if (!preeval) { + /* We're handling an INIT_EXPR of class type, so the value of the + initializer can depend on the object it's initializing. */ + /* Create a new CONSTRUCTOR in case evaluation of the initializer wants to modify it. */ if (*valp == NULL_TREE)