From 18d002058ed0df083dc7cfa05dd3edd4849467f9 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Mon, 10 Jan 2005 23:55:33 +0000 Subject: [PATCH] re PR c++/19355 (ICE: tree check at c-common.c:2332) PR c++/19355 * c-common.c (c_common_truthvalue_conversion): TRUTH_NOT_EXPR is a unary operator and can't be treated as a binary/comparison operator. * g++.dg/expr/pr19355-1.C: New test case. From-SVN: r93159 --- gcc/ChangeLog | 6 ++++++ gcc/c-common.c | 7 ++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/expr/pr19355-1.C | 11 +++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/expr/pr19355-1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3aac2730ba4..c4e50cbee37 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-01-10 Roger Sayle + + PR c++/19355 + * c-common.c (c_common_truthvalue_conversion): TRUTH_NOT_EXPR is a + unary operator and can't be treated as a binary/comparison operator. + 2005-01-10 Richard Henderson * config/i386/i386.c (ix86_function_value): Use type_natural_mode. diff --git a/gcc/c-common.c b/gcc/c-common.c index a699cbcdc63..fd6df502ca9 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -2326,12 +2326,17 @@ c_common_truthvalue_conversion (tree expr) case TRUTH_AND_EXPR: case TRUTH_OR_EXPR: case TRUTH_XOR_EXPR: - case TRUTH_NOT_EXPR: if (TREE_TYPE (expr) != truthvalue_type_node) return build2 (TREE_CODE (expr), truthvalue_type_node, TREE_OPERAND (expr, 0), TREE_OPERAND (expr, 1)); return expr; + case TRUTH_NOT_EXPR: + if (TREE_TYPE (expr) != truthvalue_type_node) + return build1 (TREE_CODE (expr), truthvalue_type_node, + TREE_OPERAND (expr, 0)); + return expr; + case ERROR_MARK: return expr; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 90b149d3025..1bfdfb84b1d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-01-10 Roger Sayle + + PR c++/19355 + * g++.dg/expr/pr19355-1.C: New test case. + 2005-01-10 Laurent GUERBY * ada/acats/tests/c4/c456001.a: New from ACATS 2.5L diff --git a/gcc/testsuite/g++.dg/expr/pr19355-1.C b/gcc/testsuite/g++.dg/expr/pr19355-1.C new file mode 100644 index 00000000000..ce11b81880a --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/pr19355-1.C @@ -0,0 +1,11 @@ +// PR c++/19355 +// { dg-do compile } + +typedef bool Boolean; +extern Boolean is_nil (); +void f(void) +{ + unsigned int ilen; + if(!((ilen > 0 ? !is_nil () : 1))) {} +} + -- 2.30.2