From 3f46d6a577819e7db2c77fa369d5364afeaac9b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez-Ib=C3=A1=C3=B1ez?= Date: Wed, 7 Nov 2012 16:58:03 +0000 Subject: [PATCH] re PR c/51294 (spurious warning from -Wconversion in C and C++ in conditional expressions) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2012-11-07 Manuel López-Ibáñez PR c/51294 c-family/ * c-common.c (conversion_warning): Handle conditional expressions. testsuite/ * c-c++-common/pr51294.c: New. From-SVN: r193301 --- gcc/c-family/ChangeLog | 5 +++++ gcc/c-family/c-common.c | 24 ++++++++---------------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/c-c++-common/pr51294.c | 9 +++++++++ 4 files changed, 27 insertions(+), 16 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/pr51294.c diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index f7c942216bc..6f343ef2419 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2012-11-07 Manuel López-Ibáñez + + PR c/51294 + * c-common.c (conversion_warning): Handle conditional expressions. + 2012-10-29 Jonathan Wakely PR c++/54930 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 840bc84c6d2..90c1992129f 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -2670,22 +2670,14 @@ conversion_warning (tree type, tree expr) case COND_EXPR: { - /* In case of COND_EXPR, if both operands are constants or - COND_EXPR, then we do not care about the type of COND_EXPR, - only about the conversion of each operand. */ - tree op1 = TREE_OPERAND (expr, 1); - tree op2 = TREE_OPERAND (expr, 2); - - if ((TREE_CODE (op1) == REAL_CST || TREE_CODE (op1) == INTEGER_CST - || TREE_CODE (op1) == COND_EXPR) - && (TREE_CODE (op2) == REAL_CST || TREE_CODE (op2) == INTEGER_CST - || TREE_CODE (op2) == COND_EXPR)) - { - conversion_warning (type, op1); - conversion_warning (type, op2); - return; - } - /* Fall through. */ + /* In case of COND_EXPR, we do not care about the type of + COND_EXPR, only about the conversion of each operand. */ + tree op1 = TREE_OPERAND (expr, 1); + tree op2 = TREE_OPERAND (expr, 2); + + conversion_warning (type, op1); + conversion_warning (type, op2); + return; } default: /* 'expr' is not a constant. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3fb9de45bb6..7c2d5dfa39a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-11-07 Manuel López-Ibáñez + + PR c/51294 + * c-c++-common/pr51294.c: New. + 2012-11-07 Martin Jambor PR tree-optimization/53787 diff --git a/gcc/testsuite/c-c++-common/pr51294.c b/gcc/testsuite/c-c++-common/pr51294.c new file mode 100644 index 00000000000..395e6b2dfc3 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr51294.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-Wconversion -Wsign-conversion" } */ + +void foo(int haveBar, char bar_) +{ + char zuul = haveBar?bar_:0; + char zuul2 = haveBar?bar_:bar_; + char zuul3 = haveBar?0:bar_; +}