A partially initialized variable isn't constant.

* constexpr.c (reduced_constant_expression_p): If
	CONSTRUCTOR_NO_IMPLICIT_ZERO, check that all fields are initialized.

From-SVN: r251948
This commit is contained in:
Jason Merrill 2017-09-10 05:11:40 -04:00 committed by Jason Merrill
parent 84284f0264
commit 7368cfa498
2 changed files with 24 additions and 4 deletions

View file

@ -1,3 +1,8 @@
2017-09-09 Jason Merrill <jason@redhat.com>
* constexpr.c (reduced_constant_expression_p): If
CONSTRUCTOR_NO_IMPLICIT_ZERO, check that all fields are initialized.
2017-09-09 Eric Botcazou <ebotcazou@adacore.com>
PR bootstrap/81926

View file

@ -1732,15 +1732,30 @@ reduced_constant_expression_p (tree t)
case CONSTRUCTOR:
/* And we need to handle PTRMEM_CST wrapped in a CONSTRUCTOR. */
tree elt; unsigned HOST_WIDE_INT idx;
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), idx, elt)
tree idx, val, field; unsigned HOST_WIDE_INT i;
if (CONSTRUCTOR_NO_IMPLICIT_ZERO (t))
field = next_initializable_field (TYPE_FIELDS (TREE_TYPE (t)));
else
field = NULL_TREE;
FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, idx, val)
{
if (!elt)
if (!val)
/* We're in the middle of initializing this element. */
return false;
if (!reduced_constant_expression_p (elt))
if (!reduced_constant_expression_p (val))
return false;
if (field)
{
if (idx != field)
return false;
field = next_initializable_field (DECL_CHAIN (field));
}
}
if (field)
return false;
else if (CONSTRUCTOR_NO_IMPLICIT_ZERO (t))
/* All the fields are initialized. */
CONSTRUCTOR_NO_IMPLICIT_ZERO (t) = false;
return true;
default: