diff options
author | Jakub Jelinek <jakub@redhat.com> | 2009-01-09 14:41:08 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2009-01-09 14:41:08 +0100 |
commit | 4017e262b6c5c8dfbb225f3599bf5c08990e022f (patch) | |
tree | 4290b4558216fb8f894300391d450df99de641af | |
parent | 76601ca966444e9cd7d1098d47e468bceb77e321 (diff) | |
download | gcc-4017e262b6c5c8dfbb225f3599bf5c08990e022f.zip gcc-4017e262b6c5c8dfbb225f3599bf5c08990e022f.tar.gz gcc-4017e262b6c5c8dfbb225f3599bf5c08990e022f.tar.bz2 |
re PR middle-end/38771 (error: non-trivial conversion in unary operation)
PR middle-end/38771
* fold-const.c (fold_unary): For COMPOUND_EXPR and COND_EXPR,
fold_convert arg0 operands to TREE_TYPE (op0) first.
* gcc.c-torture/compile/pr38771.c: New test.
From-SVN: r143202
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr38771.c | 7 |
4 files changed, 25 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 03a9e87..3a9d0e1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-01-09 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/38771 + * fold-const.c (fold_unary): For COMPOUND_EXPR and COND_EXPR, + fold_convert arg0 operands to TREE_TYPE (op0) first. + 2009-01-08 Vladimir Makarov <vmakarov@redhat.com> * params.def (ira-max-conflict-table-size): Decrease default value diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 9b4106b..820ca5a 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -8053,15 +8053,19 @@ fold_unary (enum tree_code code, tree type, tree op0) { if (TREE_CODE (arg0) == COMPOUND_EXPR) return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0), - fold_build1 (code, type, TREE_OPERAND (arg0, 1))); + fold_build1 (code, type, + fold_convert (TREE_TYPE (op0), + TREE_OPERAND (arg0, 1)))); else if (TREE_CODE (arg0) == COND_EXPR) { tree arg01 = TREE_OPERAND (arg0, 1); tree arg02 = TREE_OPERAND (arg0, 2); if (! VOID_TYPE_P (TREE_TYPE (arg01))) - arg01 = fold_build1 (code, type, arg01); + arg01 = fold_build1 (code, type, + fold_convert (TREE_TYPE (op0), arg01)); if (! VOID_TYPE_P (TREE_TYPE (arg02))) - arg02 = fold_build1 (code, type, arg02); + arg02 = fold_build1 (code, type, + fold_convert (TREE_TYPE (op0), arg02)); tem = fold_build3 (COND_EXPR, type, TREE_OPERAND (arg0, 0), arg01, arg02); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2874af0..199cd6e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-01-09 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/38771 + * gcc.c-torture/compile/pr38771.c: New test. + 2009-01-08 Nathan Froyd <froydnj@codesourcery.com> * gcc.dg/pr34856.c: Ignore irrelevant warning. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr38771.c b/gcc/testsuite/gcc.c-torture/compile/pr38771.c new file mode 100644 index 0000000..7988680 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr38771.c @@ -0,0 +1,7 @@ +/* PR middle-end/38771 */ + +unsigned long long +foo (long long x) +{ + return -(unsigned long long) (x ? : x); +} |