On 10/28/21 08:19, Jakub Jelinek wrote:
On Thu, Oct 28, 2021 at 08:01:27AM -0400, Jason Merrill wrote:
--- gcc/cp/semantics.c.jj 2021-10-27 09:16:41.161600606 +0200
+++ gcc/cp/semantics.c 2021-10-28 13:06:59.325791588 +0200
@@ -3079,6 +3079,24 @@ finish_unary_op_expr (location_t op_loc,
return result;
}
+/* Return true if CONSTRUCTOR EXPR after pack expansion could have no
+ elements. */
+
+static bool
+maybe_zero_constructor_nelts (tree expr)
+{
+ if (CONSTRUCTOR_NELTS (expr) == 0)
+ return true;
+ if (!processing_template_decl)
+ return false;
+ unsigned int i;
+ tree val;
+ FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (expr), i, val)
Let's use
for (constructor_elt &elt : CONSTRUCTOR_ELTS (t))
Ok, will do.
@@ -3104,9 +3122,20 @@ finish_compound_literal (tree type, tree
if (!TYPE_OBJ_P (type))
{
- if (complain & tf_error)
- error ("compound literal of non-object type %qT", type);
- return error_mark_node;
+ /* DR2351 */
+ if (VOID_TYPE_P (type) && CONSTRUCTOR_NELTS (compound_literal) == 0)
+ return void_node;
This test now seems redundant with the one below (if you remove the &&
processing_template_decl).
It is not redundant, for the maybe case it doesn't return void_node, but
falls through into if (processing_template_decl), which, because
compound_literal is necessarily instantiation_dependent_expression_p
(it contains packs) will just create CONSTRUCTOR_IS_DEPENDENT CONSTRUCTOR
and we'll get here back during instantiation.
For the CONSTRUCTOR_NELTS == 0 case even in templates we know
compound_literal isn't dependent (it doesn't contain anything) and type
isn't either, so we can return void_node right away (and when
!processing_template_decl we have to do that).
Ah, right. Never mind that comment, then.
Jason