Index: gcc/c-family/c-common.c
===================================================================
--- gcc/c-family/c-common.c	(revision 192847)
+++ gcc/c-family/c-common.c	(working copy)
@@ -2668,28 +2668,20 @@ conversion_warning (tree type, tree expr
 		    type, expr_type);
       return;
 
     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.  */
       if (unsafe_conversion_p (type, expr, true))
 	warning_at (loc, OPT_Wconversion,
 		    "conversion to %qT from %qT may alter its value",
 		    type, expr_type);
Index: gcc/testsuite/c-c++-common/pr51294.c
===================================================================
--- gcc/testsuite/c-c++-common/pr51294.c	(revision 0)
+++ gcc/testsuite/c-c++-common/pr51294.c	(revision 0)
@@ -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_;
+}
