Commit 3da2b176 by Aldy Hernandez Committed by Aldy Hernandez

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
parent cea55d34
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> 2012-12-07 Paolo Carlini <paolo.carlini@oracle.com>
* tree.c (build_aggr_init_expr): Remove tsubst_flags_t parameter. * tree.c (build_aggr_init_expr): Remove tsubst_flags_t parameter.
......
...@@ -45,6 +45,13 @@ along with GCC; see the file COPYING3. If not see ...@@ -45,6 +45,13 @@ along with GCC; see the file COPYING3. If not see
#include "bitmap.h" #include "bitmap.h"
#include "hash-table.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 /* There routines provide a modular interface to perform many parsing
operations. They may therefore be used during actual parsing, or operations. They may therefore be used during actual parsing, or
during template instantiation, which may be regarded as a during template instantiation, which may be regarded as a
...@@ -6437,7 +6444,9 @@ cxx_eval_builtin_function_call (const constexpr_call *call, tree t, ...@@ -6437,7 +6444,9 @@ cxx_eval_builtin_function_call (const constexpr_call *call, tree t,
return t; return t;
new_call = build_call_array_loc (EXPR_LOCATION (t), TREE_TYPE (t), new_call = build_call_array_loc (EXPR_LOCATION (t), TREE_TYPE (t),
CALL_EXPR_FN (t), nargs, args); 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 /* 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, ...@@ -6738,11 +6747,6 @@ verify_constant (tree t, bool allow_non_constant, bool *non_constant_p,
} }
return *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. /* Subroutine of cxx_eval_constant_expression.
Attempt to reduce the unary expression tree T to a compile time value. Attempt to reduce the unary expression tree T to a compile time value.
......
// { 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" } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment