From c5fe651b8192c68a5fad8b1c75ee5fbff95c7bd6 Mon Sep 17 00:00:00 2001 From: aldyh Date: Sat, 8 Dec 2012 01:19:13 +0000 Subject: [PATCH] PR c++/55513 * semantics.c (cxx_eval_builtin_function_call): Set non_constant_p after folding. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194316 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/semantics.c | 16 ++++++++++------ gcc/testsuite/g++.dg/pr55513.C | 12 ++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/pr55513.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e6138cd..cee5db6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-12-07 Aldy Hernandez + + PR c++/55513 + * semantics.c (cxx_eval_builtin_function_call): Set non_constant_p + after folding. + 2012-12-07 Paolo Carlini * tree.c (build_aggr_init_expr): Remove tsubst_flags_t parameter. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 491d97c..92b4a2b 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -45,6 +45,13 @@ along with GCC; see the file COPYING3. If not see #include "bitmap.h" #include "hash-table.h" +static bool verify_constant (tree, bool, bool *, bool *); +#define VERIFY_CONSTANT(X) \ +do { \ + if (verify_constant ((X), allow_non_constant, non_constant_p, overflow_p)) \ + return t; \ + } while (0) + /* There routines provide a modular interface to perform many parsing operations. They may therefore be used during actual parsing, or during template instantiation, which may be regarded as a @@ -6437,7 +6444,9 @@ cxx_eval_builtin_function_call (const constexpr_call *call, tree t, return t; new_call = build_call_array_loc (EXPR_LOCATION (t), TREE_TYPE (t), CALL_EXPR_FN (t), nargs, args); - return fold (new_call); + new_call = fold (new_call); + VERIFY_CONSTANT (new_call); + return new_call; } /* TEMP is the constant value of a temporary object of type TYPE. Adjust @@ -6738,11 +6747,6 @@ verify_constant (tree t, bool allow_non_constant, bool *non_constant_p, } return *non_constant_p; } -#define VERIFY_CONSTANT(X) \ -do { \ - if (verify_constant ((X), allow_non_constant, non_constant_p, overflow_p)) \ - return t; \ - } while (0) /* Subroutine of cxx_eval_constant_expression. Attempt to reduce the unary expression tree T to a compile time value. diff --git a/gcc/testsuite/g++.dg/pr55513.C b/gcc/testsuite/g++.dg/pr55513.C new file mode 100644 index 0000000..06eedee --- /dev/null +++ b/gcc/testsuite/g++.dg/pr55513.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// { dg-options "-O0 -fdump-tree-gimple" } + +main () +{ + char s[10]; + const int t = (__builtin_memcpy (s, "Hello", 6), 777); + __builtin_printf ("%d %s\n", t, s); +} + +// { dg-final { scan-tree-dump-times "memcpy" 1 "gimple" } } +// { dg-final { cleanup-tree-dump "gimple" } } -- 2.7.4