aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-11-19 18:17:01 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-11-19 18:17:01 +0100
commitf9c59f7e9511856bd6dc13d2d4904ebd9249c095 (patch)
tree418d66f5607f88d0a122bfdd9c9fe4038f93d9f8 /gcc/cp
parent4397fc04e399e91fe53f0862fef41bb5b42a7c14 (diff)
downloadgcc-f9c59f7e9511856bd6dc13d2d4904ebd9249c095.zip
gcc-f9c59f7e9511856bd6dc13d2d4904ebd9249c095.tar.gz
gcc-f9c59f7e9511856bd6dc13d2d4904ebd9249c095.tar.bz2
re PR c/66618 (Failure to diagnose non-constant initializer for static object with -O1)
PR c/66618 PR c/69960 c-family/ * c-common.h (c_fully_fold): Add LVAL argument defaulted to false. c/ * c-parser.c (c_parser_omp_atomic): Pass true as LVAL to c_fully_fold where needed. * c-typeck.c (build_unary_op, build_modify_expr, build_asm_expr, handle_omp_array_sections): Likewise. (digest_init): Don't call decl_constant_value_for_optimization. * c-tree.h (decl_constant_value_for_optimization): Removed. * c-fold.c (c_fold_array_ref): New function. (c_fully_fold_internal): Add LVAL argument, propagate it through recursive calls. For VAR_P call decl_constant_value and unshare if not LVAL and either optimizing or IN_INIT. Remove decl_constant_value_for_optimization calls. If IN_INIT and not LVAL, fold ARRAY_REF with STRING_CST and INTEGER_CST operands. (c_fully_fold): Add LVAL argument, pass it through to c_fully_fold_internal. (decl_constant_value_for_optimization): Removed. cp/ * cp-gimplify.c (c_fully_fold): Add LVAL argument, call cp_fold_maybe_rvalue instead of cp_fold_rvalue and pass it !LVAL. testsuite/ * gcc.dg/pr69960.c: New test. * gcc.dg/pr66618.c: New test. * gcc.dg/pr66618-2.c: New test. From-SVN: r254930
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/cp-gimplify.c6
2 files changed, 9 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e0bb1b1..410b18b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2017-11-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/66618
+ PR c/69960
+ * cp-gimplify.c (c_fully_fold): Add LVAL argument, call
+ cp_fold_maybe_rvalue instead of cp_fold_rvalue and pass it !LVAL.
+
2017-11-16 Jason Merrill <jason@redhat.com>
PR c++/79092 - non-type args of different types are different
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 7c7c040..8849f9d 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -2048,11 +2048,9 @@ cp_fully_fold (tree x)
C_MAYBE_CONST_EXPR. */
tree
-c_fully_fold (tree x, bool /*in_init*/, bool */*maybe_const*/)
+c_fully_fold (tree x, bool /*in_init*/, bool */*maybe_const*/, bool lval)
{
- /* c_fully_fold is only used on rvalues, and we need to fold CONST_DECL to
- INTEGER_CST. */
- return cp_fold_rvalue (x);
+ return cp_fold_maybe_rvalue (x, !lval);
}
static GTY((deletable)) hash_map<tree, tree> *fold_cache;