A partially initialized variable isn't constant.
authorJason Merrill <jason@redhat.com>
Sun, 10 Sep 2017 09:11:40 +0000 (05:11 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 10 Sep 2017 09:11:40 +0000 (05:11 -0400)
* constexpr.c (reduced_constant_expression_p): If
CONSTRUCTOR_NO_IMPLICIT_ZERO, check that all fields are initialized.

From-SVN: r251948

gcc/cp/ChangeLog
gcc/cp/constexpr.c

index fa3e00889c3eac801a7e6397e9a9a464c1d6acc5..8395862620b60073d6b1232769d25f78e6461669 100644 (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
index a5692fb3b3a7bae58656f29139ace8a6b55682e8..2d2f3b854ba72b3f35adc68a37ed5b9092962029 100644 (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: