http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50012
--- Comment #2 from Mikael Pettersson <mikpe at it dot uu.se> 2011-08-14 12:25:12 UTC --- The warning is lost due to this fragment of r148952 (with the rest of r148952 disabled): --- gcc/cp/typeck.c (revision 148951) +++ gcc/cp/typeck.c (revision 148952) @@ -4018,6 +4018,8 @@ cp_build_binary_op (location_t location, if ((short_compare || code == MIN_EXPR || code == MAX_EXPR) && warn_sign_compare + && !TREE_NO_WARNING (orig_op0) + && !TREE_NO_WARNING (orig_op1) /* Do not warn until the template is instantiated; we cannot bound the ranges of the arguments until that point. */ && !processing_template_decl In this test case (the foo() function) the LHS is a parenthesized expression, and cp/semantics.c:finish_parenthesized_expr() contains the following gem: tree finish_parenthesized_expr (tree expr) { if (EXPR_P (expr)) /* This inhibits warnings in c_common_truthvalue_conversion. */ TREE_NO_WARNING (expr) = 1; Disabling either the setting of TREE_NO_WARNING in finish_parenthesized_expr or the && !TREE_NO_WARNING check in cp_build_binary_op restores the warning for this test case. Alas I'm sure something else will break in that case ...