diff mbox

C++ PATCH for c++/70153 (unhandled UNARY_PLUS_EXPR causes stack overflow)

Message ID 20160310150805.GZ10006@redhat.com
State New
Headers show

Commit Message

Marek Polacek March 10, 2016, 3:08 p.m. UTC
On Thu, Mar 10, 2016 at 09:59:07AM -0500, Jason Merrill wrote:
> On 03/10/2016 09:53 AM, Marek Polacek wrote:
> >+    case UNARY_PLUS_EXPR:
> >+      op0 = cp_fold_maybe_rvalue (TREE_OPERAND (x, 0), rval_ops);
> 
> You can just use cp_fold_rvalue here.  OK with that change.

Thanks.  Final patch I'm about to install:

2016-03-10  Marek Polacek  <polacek@redhat.com>

	PR c++/70153
	* cp-gimplify.c (cp_fold): Handle UNARY_PLUS_EXPR.

	* g++.dg/delayedfold/unary-plus1.C: New test.


	Marek
diff mbox

Patch

diff --git gcc/cp/cp-gimplify.c gcc/cp/cp-gimplify.c
index 6af3760..6a767fa 100644
--- gcc/cp/cp-gimplify.c
+++ gcc/cp/cp-gimplify.c
@@ -1996,7 +1996,6 @@  cp_fold (tree x)
     case BIT_NOT_EXPR:
     case TRUTH_NOT_EXPR:
     case FIXED_CONVERT_EXPR:
-    case UNARY_PLUS_EXPR:
     case INDIRECT_REF:
 
       loc = EXPR_LOCATION (x);
@@ -2016,6 +2015,14 @@  cp_fold (tree x)
 		  || !VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (x, 0))));
       break;
 
+    case UNARY_PLUS_EXPR:
+      op0 = cp_fold_rvalue (TREE_OPERAND (x, 0));
+      if (op0 == error_mark_node)
+	x = error_mark_node;
+      else
+	x = fold_convert (TREE_TYPE (x), op0);
+      break;
+
     case POSTDECREMENT_EXPR:
     case POSTINCREMENT_EXPR:
     case INIT_EXPR:
diff --git gcc/testsuite/g++.dg/delayedfold/unary-plus1.C gcc/testsuite/g++.dg/delayedfold/unary-plus1.C
index e69de29..ebf3493 100644
--- gcc/testsuite/g++.dg/delayedfold/unary-plus1.C
+++ gcc/testsuite/g++.dg/delayedfold/unary-plus1.C
@@ -0,0 +1,22 @@ 
+// PR c++/70153
+// { dg-do run }
+
+unsigned long long int
+fn1 (unsigned long long int i)
+{
+  return 2ULL * ((1 + (unsigned long int) +1) * i);
+}
+
+unsigned long long int
+fn2 (unsigned long long int i)
+{
+  return 2ULL * ((1 + (unsigned long int) +(1 + 0)) * i);
+}
+
+int
+main (void)
+{
+  if (fn1 (3ULL) != 12ULL
+      || fn2 (3ULL) != 12ULL)
+    __builtin_abort ();
+}