diff options
author | Jason Merrill <jason@redhat.com> | 2017-09-10 05:11:40 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2017-09-10 05:11:40 -0400 |
commit | 7368cfa4986d83317fbfb839b1eeb249a9ef7199 (patch) | |
tree | 6ba2f4cbb11bda04c8d43bca61729bb1c8e59303 /gcc | |
parent | 84284f026469ddbede86d164c37924a1f8fe80d3 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 23 |
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: |