From 76ce14016e10c3cef54dde18650ce1640a7798ad Mon Sep 17 00:00:00 2001 From: rguenth Date: Thu, 20 Oct 2005 15:19:03 +0000 Subject: [PATCH] 2005-10-20 Richard Guenther PR c++/24439 * fold-const.c (invert_truthvalue): Handle COND_EXPR with void type operands. * g++.dg/tree-ssa/pr24439.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@105678 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/fold-const.c | 15 ++++++++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/tree-ssa/pr24439.C | 10 ++++++++++ 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr24439.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e5de23f8421..e3a9a8fa564 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-10-20 Richard Guenther + + PR c++/24439 + * fold-const.c (invert_truthvalue): Handle COND_EXPR with + void type operands. + 2005-10-20 Eric Botcazou PR rtl-optimization/23585 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index a6aa1df818c..16e7eb30b30 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -3025,9 +3025,18 @@ invert_truthvalue (tree arg) return TREE_OPERAND (arg, 0); case COND_EXPR: - return build3 (COND_EXPR, type, TREE_OPERAND (arg, 0), - invert_truthvalue (TREE_OPERAND (arg, 1)), - invert_truthvalue (TREE_OPERAND (arg, 2))); + { + tree arg1 = TREE_OPERAND (arg, 1); + tree arg2 = TREE_OPERAND (arg, 2); + /* A COND_EXPR may have a throw as one operand, which + then has void type. Just leave void operands + as they are. */ + return build3 (COND_EXPR, type, TREE_OPERAND (arg, 0), + VOID_TYPE_P (TREE_TYPE (arg1)) + ? arg1 : invert_truthvalue (arg1), + VOID_TYPE_P (TREE_TYPE (arg2)) + ? arg2 : invert_truthvalue (arg2)); + } case COMPOUND_EXPR: return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0), diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 82e1f048e18..b94bce86936 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-10-20 Richard Guenther + + PR c++/24439 + * g++.dg/tree-ssa/pr24439.C: New testcase. + 2005-10-20 Eric Botcazou * g++.dg/opt/delay-slot-1.C: New test. diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr24439.C b/gcc/testsuite/g++.dg/tree-ssa/pr24439.C new file mode 100644 index 00000000000..74576b5f84f --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr24439.C @@ -0,0 +1,10 @@ +/* { dg-do compile } */ + +/* We used to ICE in invert_truthvalue on the void type + 2nd argument of the COND_EXPR. */ + +void foo(void) +{ + int value=1; + !(value?true:throw); +} -- 2.11.0