PR c++/55513
authoraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 8 Dec 2012 01:19:13 +0000 (01:19 +0000)
committeraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 8 Dec 2012 01:19:13 +0000 (01:19 +0000)
* 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
gcc/cp/semantics.c
gcc/testsuite/g++.dg/pr55513.C [new file with mode: 0644]

index e6138cd..cee5db6 100644 (file)
@@ -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.
index 491d97c..92b4a2b 100644 (file)
@@ -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 (file)
index 0000000..06eedee
--- /dev/null
@@ -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" } }