From: Marek Polacek Date: Thu, 10 Mar 2016 15:13:01 +0000 (+0000) Subject: re PR c++/70153 (ICE on valid C++ code) X-Git-Tag: basepoints/gcc-7~495 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d49b0aa091b9fc87a044941ac93155006ed3fd1e;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b4b9b24c87b7..6e69e77b5ca5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2016-03-10 Marek Polacek + + PR c++/70153 + * cp-gimplify.c (cp_fold): Handle UNARY_PLUS_EXPR. + 2016-03-09 Cesar Philippidis * 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 6af376081bd7..6a767fa13a4e 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 3a74819d7a0c..093ef571965e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,9 @@ -2016-03-10 Andre Vieira +2016-03-10 Marek Polacek + + PR c++/70153 + * g++.dg/delayedfold/unary-plus1.C: New test. + +2016-03-10 Andre Vieira * 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 000000000000..ebf34934b726 --- /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 (); +}