diff mbox

Extend -Wint-in-bool-context to warn for multiplications

Message ID AM4PR0701MB21625266E074BC45F9039C4DE4D40@AM4PR0701MB2162.eurprd07.prod.outlook.com
State Superseded
Headers show

Commit Message

Bernd Edlinger Oct. 21, 2016, 8:20 p.m. UTC
Hi!

This patch extends -Wint-in-bool-context to warn for multiplications if
used in boolean context.  This is rarely useful, and where used, could
be easily replaced with && for instance. I think that multiplications in
boolean context should be warned about, regardless of the used
data type.

This warning found already one bug in value-prof.c, at
stringop_block_profile where an undefined overflow in a signed
multiplication was used to terminate a loop.  Fixed as well.


Bootstrapped and reg-tested on x86_64-pc-linux-gnu.
Is it OK for trunk?


Thanks
Bernd.

Comments

Joseph Myers Oct. 21, 2016, 10:37 p.m. UTC | #1
The quoting in the diagnostic should be %<&&%>, not '&&'.

-- 
Joseph S. Myers
joseph@codesourcery.com
Martin Sebor Oct. 22, 2016, 2:17 a.m. UTC | #2
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.

Martin
diff mbox

Patch

c-family:
2016-10-21  Bernd Edlinger  <bernd.edlinger@hotmail.de>

	* c-common.c (c_common_truthvalue_conversion): Warn for
	multiplications in boolean context.

gcc:
2016-10-21  Bernd Edlinger  <bernd.edlinger@hotmail.de>

	* doc/invoke.text (Wint-in-bool-context): Update documentation.
	* value-prof.c (stringop_block_profile): Fix a warning.

testsuite:
2016-10-21  Bernd Edlinger  <bernd.edlinger@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 241400)
+++ 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, better use '&&' here");
+      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
Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi	(revision 241400)
+++ 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 241400)
+++ 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;
+}