diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2012-12-08 01:19:13 +0000 |
---|---|---|
committer | Aldy Hernandez <aldyh@gcc.gnu.org> | 2012-12-08 01:19:13 +0000 |
commit | 3da2b176b387f367a02f5299607204ee6b27e359 (patch) | |
tree | 4c535a0da796f017a8885686ffc62ef2d9e1130a | |
parent | cea55d343c4e04b1c2bd568d809c791f8c98c088 (diff) | |
download | gcc-3da2b176b387f367a02f5299607204ee6b27e359.zip gcc-3da2b176b387f367a02f5299607204ee6b27e359.tar.gz gcc-3da2b176b387f367a02f5299607204ee6b27e359.tar.bz2 |
re PR c++/55513 (Incorrect snprintf folding when building with -std=c++0x)
PR c++/55513
* semantics.c (cxx_eval_builtin_function_call): Set non_constant_p
after folding.
From-SVN: r194316
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr55513.C | 12 |
3 files changed, 28 insertions, 6 deletions
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 <aldyh@redhat.com> + + PR c++/55513 + * semantics.c (cxx_eval_builtin_function_call): Set non_constant_p + after folding. + 2012-12-07 Paolo Carlini <paolo.carlini@oracle.com> * 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" } } |