aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <mpolacek@gcc.gnu.org>2016-03-10 15:13:01 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2016-03-10 15:13:01 +0000
commitd49b0aa091b9fc87a044941ac93155006ed3fd1e (patch)
treedfec5b3ca0b4f7db3854f2375b8f42a7f31b3ce7 /gcc
parentc81e3837a900d99e7e57d8d180804c2b3337c1dc (diff)
downloadgcc-d49b0aa091b9fc87a044941ac93155006ed3fd1e.zip
gcc-d49b0aa091b9fc87a044941ac93155006ed3fd1e.tar.gz
gcc-d49b0aa091b9fc87a044941ac93155006ed3fd1e.tar.bz2
re PR c++/70153 (ICE on valid C++ code)
PR c++/70153 * cp-gimplify.c (cp_fold): Handle UNARY_PLUS_EXPR. * g++.dg/delayedfold/unary-plus1.C: New test. From-SVN: r234111
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/cp-gimplify.c9
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/delayedfold/unary-plus1.C22
4 files changed, 41 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b4b9b24..6e69e77 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 6af3760..6a767fa 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/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 a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3a74819..093ef57 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..ebf3493
--- /dev/null
+++ b/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 ();
+}