On 10/22/16 08:52, Bernd Edlinger wrote: > On 10/22/16 04:17, Martin Sebor wrote: >> On 10/21/2016 04:37 PM, Joseph Myers wrote: >>> The quoting in the diagnostic should be %<&&%>, not '&&'. >> >> Presumably same for '*' (i.e., %<*%>). >> >> But I would actually suggest a somewhat more formal phrasing than >> "better use xxx here" such as "suggest %<&&%> instead" or something >> akin to what's already in place elsewhere in gcc.pot. >> > > Aehm, yes. That would be better then: > > > Index: c-common.c > =================================================================== > --- c-common.c (revision 241400) > +++ c-common.c (working copy) > @@ -3327,6 +3327,11 @@ > return c_common_truthvalue_conversion (location, > TREE_OPERAND (expr, 0)); > > + case MULT_EXPR: > + warning_at (EXPR_LOCATION (expr), OPT_Wint_in_bool_context, > + "%<*%> in boolean context, suggest %<&&%> instead"); > + break; > + > case LSHIFT_EXPR: > /* We will only warn on signed shifts here, because the majority of > false positive warnings happen in code where unsigned arithmetic > > > I assume then I should adjust the warning a few lines below as well: > > warning_at (EXPR_LOCATION (expr), OPT_Wint_in_bool_context, > "<< in boolean context, did you mean '<' ?"); > >
Attached is the updated patch with those quotes fixed. I have now put the << and < in correct quotes, but left the ?: in the next two warnings unquoted: "?: using integer constants in boolean context, " "the expression will always evaluate to %<true%>" I copied that style from the warning about omitted middle operand of conditional expressions: "the omitted middle operand in ?: will always be %<true%>, suggest explicit " "middle operand" I think that could be explained because ?: is not really a keyword like <<, and is just a shorter phrase than "conditional expression". Bootstrapped and reg-tested on x86_64-pc-linux-gnu. Is it OK for trunk? Thanks Bernd.
c-family: 2016-10-23 Bernd Edlinger <bernd.edlin...@hotmail.de> * c-common.c (c_common_truthvalue_conversion): Warn for multiplications in boolean context. Fix the quoting of '<<' and '<' in the shift warning. gcc: 2016-10-23 Bernd Edlinger <bernd.edlin...@hotmail.de> * doc/invoke.text (Wint-in-bool-context): Update documentation. * value-prof.c (stringop_block_profile): Fix a warning. testsuite: 2016-10-23 Bernd Edlinger <bernd.edlin...@hotmail.de> * c-c++-common/Wint-in-bool-context-3.c: New test. Index: gcc/c-family/c-common.c =================================================================== --- gcc/c-family/c-common.c (revision 241437) +++ gcc/c-family/c-common.c (working copy) @@ -3327,6 +3327,11 @@ c_common_truthvalue_conversion (location_t locatio return c_common_truthvalue_conversion (location, TREE_OPERAND (expr, 0)); + case MULT_EXPR: + warning_at (EXPR_LOCATION (expr), OPT_Wint_in_bool_context, + "%<*%> in boolean context, suggest %<&&%> instead"); + break; + case LSHIFT_EXPR: /* We will only warn on signed shifts here, because the majority of false positive warnings happen in code where unsigned arithmetic @@ -3336,7 +3341,7 @@ c_common_truthvalue_conversion (location_t locatio if (TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE && !TYPE_UNSIGNED (TREE_TYPE (expr))) warning_at (EXPR_LOCATION (expr), OPT_Wint_in_bool_context, - "<< in boolean context, did you mean '<' ?"); + "%<<<%> in boolean context, did you mean %<<%> ?"); break; case COND_EXPR: Index: gcc/doc/invoke.texi =================================================================== --- gcc/doc/invoke.texi (revision 241437) +++ gcc/doc/invoke.texi (working copy) @@ -6169,8 +6169,9 @@ of the C++ standard. @opindex Wno-int-in-bool-context Warn for suspicious use of integer values where boolean values are expected, such as conditional expressions (?:) using non-boolean integer constants in -boolean context, like @code{if (a <= b ? 2 : 3)}. Or left shifting in -boolean context, like @code{for (a = 0; 1 << a; a++);}. +boolean context, like @code{if (a <= b ? 2 : 3)}. Or left shifting of signed +integers in boolean context, like @code{for (a = 0; 1 << a; a++);}. Likewise +for all kinds of multiplications regardless of the data type. This warning is enabled by @option{-Wall}. @item -Wno-int-to-pointer-cast Index: gcc/value-prof.c =================================================================== --- gcc/value-prof.c (revision 241437) +++ gcc/value-prof.c (working copy) @@ -1878,12 +1878,12 @@ stringop_block_profile (gimple *stmt, unsigned int else { gcov_type count; - int alignment; + unsigned int alignment; count = histogram->hvalue.counters[0]; alignment = 1; while (!(count & alignment) - && (alignment * 2 * BITS_PER_UNIT)) + && (alignment <= UINT_MAX / 2 / BITS_PER_UNIT)) alignment <<= 1; *expected_align = alignment * BITS_PER_UNIT; gimple_remove_histogram_value (cfun, stmt, histogram); Index: gcc/testsuite/c-c++-common/Wint-in-bool-context-3.c =================================================================== --- gcc/testsuite/c-c++-common/Wint-in-bool-context-3.c (revision 0) +++ gcc/testsuite/c-c++-common/Wint-in-bool-context-3.c (working copy) @@ -0,0 +1,15 @@ +/* { dg-options "-Wint-in-bool-context" } */ +/* { dg-do compile } */ + +#define BITS_PER_UNIT 8 + +int foo (int count) +{ + int alignment; + + alignment = 1; + while (!(count & alignment) + && (alignment * 2 * BITS_PER_UNIT)) /* { dg-warning "boolean context" } */ + alignment <<= 1; + return alignment * BITS_PER_UNIT; +}