diff options
author | Marek Polacek <mpolacek@gcc.gnu.org> | 2016-03-10 15:13:01 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2016-03-10 15:13:01 +0000 |
commit | d49b0aa091b9fc87a044941ac93155006ed3fd1e (patch) | |
tree | dfec5b3ca0b4f7db3854f2375b8f42a7f31b3ce7 /gcc | |
parent | c81e3837a900d99e7e57d8d180804c2b3337c1dc (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/delayedfold/unary-plus1.C | 22 |
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 (); +} |