aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-09-10 05:11:40 -0400
committerJason Merrill <jason@gcc.gnu.org>2017-09-10 05:11:40 -0400
commit7368cfa4986d83317fbfb839b1eeb249a9ef7199 (patch)
tree6ba2f4cbb11bda04c8d43bca61729bb1c8e59303 /gcc
parent84284f026469ddbede86d164c37924a1f8fe80d3 (diff)
downloadgcc-7368cfa4986d83317fbfb839b1eeb249a9ef7199.zip
gcc-7368cfa4986d83317fbfb839b1eeb249a9ef7199.tar.gz
gcc-7368cfa4986d83317fbfb839b1eeb249a9ef7199.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/constexpr.c23
2 files changed, 24 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index fa3e008..8395862 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index a5692fb..2d2f3b8 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: