From: Jason Merrill Date: Sun, 10 Sep 2017 09:11:40 +0000 (-0400) Subject: A partially initialized variable isn't constant. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7368cfa4986d83317fbfb839b1eeb249a9ef7199;p=gcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fa3e00889c3..8395862620b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2017-09-09 Jason Merrill + + * constexpr.c (reduced_constant_expression_p): If + CONSTRUCTOR_NO_IMPLICIT_ZERO, check that all fields are initialized. + 2017-09-09 Eric Botcazou PR bootstrap/81926 diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index a5692fb3b3a..2d2f3b854ba 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -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: