re PR c++/63940 (C++ constexpr errors on AIX)
authorJason Merrill <jason@redhat.com>
Tue, 18 Nov 2014 21:14:49 +0000 (16:14 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 18 Nov 2014 21:14:49 +0000 (16:14 -0500)
PR c++/63940
* constexpr.c (cxx_eval_binary_expression): Don't assume the
expression was already folded.
(cxx_eval_unary_expression): Likewise.

From-SVN: r217738

gcc/cp/ChangeLog
gcc/cp/constexpr.c

index 2e18932dc491483d4954b88dcdeb5e98bd0c6176..0759a575c9ec4e451372b220dd3b294db15b2658 100644 (file)
@@ -1,3 +1,10 @@
+2014-11-18  Jason Merrill  <jason@redhat.com>
+
+       PR c++/63940
+       * constexpr.c (cxx_eval_binary_expression): Don't assume the
+       expression was already folded.
+       (cxx_eval_unary_expression): Likewise.
+
 2014-11-18  Marc Glisse  <marc.glisse@inria.fr>
 
        PR libstdc++/43622
index 5abea14ae393b319e8024f0a26b1b770ff9d008c..517bf23145f977dacc28b2311f756829de7df935 100644 (file)
@@ -1461,9 +1461,17 @@ cxx_eval_unary_expression (const constexpr_ctx *ctx, tree t,
                                           addr, non_constant_p, overflow_p,
                                           NULL);
   VERIFY_CONSTANT (arg);
-  if (arg == orig_arg)
-    return t;
-  r = fold_build1 (TREE_CODE (t), TREE_TYPE (t), arg);
+  location_t loc = EXPR_LOCATION (t);
+  enum tree_code code = TREE_CODE (t);
+  tree type = TREE_TYPE (t);
+  r = fold_unary_loc (loc, code, type, arg);
+  if (r == NULL_TREE)
+    {
+      if (arg == orig_arg)
+       r = t;
+      else
+       r = build1_loc (loc, code, type, arg);
+    }
   VERIFY_CONSTANT (r);
   return r;
 }
@@ -1488,9 +1496,18 @@ cxx_eval_binary_expression (const constexpr_ctx *ctx, tree t,
                                      allow_non_constant, addr,
                                      non_constant_p, overflow_p, NULL);
   VERIFY_CONSTANT (rhs);
-  if (lhs == orig_lhs && rhs == orig_rhs)
-    return t;
-  r = fold_build2 (TREE_CODE (t), TREE_TYPE (t), lhs, rhs);
+
+  location_t loc = EXPR_LOCATION (t);
+  enum tree_code code = TREE_CODE (t);
+  tree type = TREE_TYPE (t);
+  r = fold_binary_loc (loc, code, type, lhs, rhs);
+  if (r == NULL_TREE)
+    {
+      if (lhs == orig_lhs && rhs == orig_rhs)
+       r = t;
+      else
+       r = build2_loc (loc, code, type, lhs, rhs);
+    }
   VERIFY_CONSTANT (r);
   return r;
 }