c-common.c (c_common_truthvalue_conversion): Warn for multiplications in boolean...
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Mon, 24 Oct 2016 17:14:41 +0000 (17:14 +0000)
committerBernd Edlinger <edlinger@gcc.gnu.org>
Mon, 24 Oct 2016 17:14:41 +0000 (17:14 +0000)
2016-10-24  Bernd Edlinger  <bernd.edlinger@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-24  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-24  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        * c-c++-common/Wint-in-bool-context-3.c: New test.

From-SVN: r241490

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/Wint-in-bool-context-3.c [new file with mode: 0644]
gcc/value-prof.c

index a8528b91c41f95d70f1d07e2881209cbe9e5ae52..1f6712e6144aa674086f9a64c842c0f3a3beb5a5 100644 (file)
@@ -1,3 +1,8 @@
+2016-10-24  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       * doc/invoke.text (Wint-in-bool-context): Update documentation.
+       * value-prof.c (stringop_block_profile): Fix a warning.
+
 2016-10-24  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/77735
index b16b1c1fac44e026bef148bbb568f9cb7905935d..6a6dba2859318d52980dd9b8ed37e93b3fc3a56a 100644 (file)
@@ -1,3 +1,9 @@
+2016-10-24  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       * c-common.c (c_common_truthvalue_conversion): Warn for
+       multiplications in boolean context.  Fix the quoting of '<<' and '<'
+       in the shift warning.
+
 2016-10-20  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        * c-common.c (c_common_truthvalue_conversion): Fix the comment.
index abc074026402907acb9aec17cfbd55ce6c9502e0..c0dafc08652a81c0610951bf928cb6d2bccac898 100644 (file)
@@ -3327,6 +3327,11 @@ c_common_truthvalue_conversion (location_t location, tree expr)
        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 location, tree expr)
       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 9f57d52d51629056d04276b10433687bcc827535..5ccd4244ef396696f1a7ca962a7a7fe9973fcf6e 100644 (file)
@@ -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 28c755036d84c372bdf4e3d2f64fffa0f7aab27c..5b83f4de12523e86ee8dc46690bd6509f93d79e2 100644 (file)
@@ -1,3 +1,7 @@
+2016-10-24  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       * c-c++-common/Wint-in-bool-context-3.c: New test.
+
 2016-10-24  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/77735
diff --git a/gcc/testsuite/c-c++-common/Wint-in-bool-context-3.c b/gcc/testsuite/c-c++-common/Wint-in-bool-context-3.c
new file mode 100644 (file)
index 0000000..869132a
--- /dev/null
@@ -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;
+}
index e794e6d5aefd45de86522453b9f152e9954786c9..dc570692fbf32985431732672fe46882c33581c6 100644 (file)
@@ -1878,12 +1878,12 @@ stringop_block_profile (gimple *stmt, unsigned int *expected_align,
   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);