]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/70153 (ICE on valid C++ code)
authorMarek Polacek <mpolacek@gcc.gnu.org>
Thu, 10 Mar 2016 15:13:01 +0000 (15:13 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Thu, 10 Mar 2016 15:13:01 +0000 (15:13 +0000)
PR c++/70153
* cp-gimplify.c (cp_fold): Handle UNARY_PLUS_EXPR.

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

From-SVN: r234111

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/delayedfold/unary-plus1.C [new file with mode: 0644]

index b4b9b24c87b70f13a4068cb2c39f1764fb3953f5..6e69e77b5ca5c72c918dfb1b1308025c0dffa719 100644 (file)
@@ -1,3 +1,8 @@
+2016-03-10  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/70153
+       * cp-gimplify.c (cp_fold): Handle UNARY_PLUS_EXPR.
+
 2016-03-09  Cesar Philippidis  <cesar@codesourcery.com>
 
        * parser.c (cp_parser_oacc_loop): Update cclauses and clauses
index 6af376081bd7a0fa81349a2073b596abd8fcd01b..6a767fa13a4e0828092ce72e1886c26ab0842e61 100644 (file)
@@ -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:
index 3a74819d7a0c3bf2a9bc3404c9820cb0fc45a764..093ef571965ecdc15f7a5480a7306243ccc428f7 100644 (file)
@@ -1,4 +1,9 @@
-2016-03-10 Andre Vieira <andre.simoesdiasvieira@arm.com>
+2016-03-10  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/70153
+       * g++.dg/delayedfold/unary-plus1.C: New test.
+
+2016-03-10  Andre Vieira  <andre.simoesdiasvieira@arm.com>
 
        * gcc.target/arm/pr45701-1.c: Escape brackets.
        * gcc.target/arm/pr45701-2.c: Likewise.
diff --git a/gcc/testsuite/g++.dg/delayedfold/unary-plus1.C b/gcc/testsuite/g++.dg/delayedfold/unary-plus1.C
new file mode 100644 (file)
index 0000000..ebf3493
--- /dev/null
@@ -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 ();
+}