http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51294
--- Comment #10 from Manuel López-Ibáñez <manu at gcc dot gnu.org> 2012-05-12 18:38:33 UTC --- Latest patch by Paolo, who run out of time: http://gcc.gnu.org/ml/gcc-patches/2012-05/msg00861.html BTW, I think the patch is not wrong, and if fixes some cases, then it is a step forward. I think a more complete fix would be something like: Index: gcc/c-family/c-common.c =================================================================== --- gcc/c-family/c-common.c (revision 187427) +++ gcc/c-family/c-common.c (working copy) @@ -2262,10 +2262,15 @@ conversion_warning (tree type, tree expr location_t loc = EXPR_LOC_OR_HERE (expr); if (!warn_conversion && !warn_sign_conversion) return; + STRIP_USELESS_TYPE_CONVERSION (expr); + /* Don't warn about unsigned char y = 0xff, x = (int) y; */ + expr = get_unwidened (expr, 0); + expr_type = TREE_TYPE (expr); + switch (TREE_CODE (expr)) { case EQ_EXPR: case NE_EXPR: case LE_EXPR: @@ -2294,26 +2299,18 @@ 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, Totally untested, and it lacks testcases, ChangeLog, etc. Neither Paolo nor I have time to pursue this, so someone new will have to step forward.