c-common.c (c_common_truthvalue_conversion): Warn also for suspicious conditional...
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Wed, 5 Oct 2016 18:34:17 +0000 (18:34 +0000)
committerBernd Edlinger <edlinger@gcc.gnu.org>
Wed, 5 Oct 2016 18:34:17 +0000 (18:34 +0000)
2016-10-05  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        * c-common.c (c_common_truthvalue_conversion): Warn also for suspicious
        conditional expression in boolean context when only one arm is
        non-boolean.

testsuite:
2016-10-05  Bernd Edlinger  <bernd.edlinger@hotmail.de>

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

From-SVN: r240799

gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/Wint-in-bool-context.c

index d3c7cd5c2c02b1f5152408b3c9526cda4d92f7ea..2bfce86c443e20abc729dafcefca13d9131cd7cf 100644 (file)
@@ -1,3 +1,9 @@
+2016-10-05  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       * c-common.c (c_common_truthvalue_conversion): Warn also for suspicious
+       conditional expression in boolean context when only one arm is
+       non-boolean.
+
 2016-10-05  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/77823
index dbef1999b55bf6fe681dc8a924645ecb64f55502..035afbceeb8c82979a616a22dc412549cb241cf2 100644 (file)
@@ -4675,6 +4675,14 @@ c_common_truthvalue_conversion (location_t location, tree expr)
            warning_at (EXPR_LOCATION (expr), OPT_Wint_in_bool_context,
                        "?: using integer constants in boolean context, "
                        "the expression will always evaluate to %<true%>");
+         else if ((TREE_CODE (val1) == INTEGER_CST
+                   && !integer_zerop (val1)
+                   && !integer_onep (val1))
+                  || (TREE_CODE (val2) == INTEGER_CST
+                      && !integer_zerop (val2)
+                      && !integer_onep (val2)))
+           warning_at (EXPR_LOCATION (expr), OPT_Wint_in_bool_context,
+                       "?: using integer constants in boolean context");
        }
       /* Distribute the conversion into the arms of a COND_EXPR.  */
       if (c_dialect_cxx ())
index 6c587f69d25de347b324e776c53ddb7ec59377ae..fa8cce764c6a35aab3fea97f278c315607aadab5 100644 (file)
@@ -1,3 +1,7 @@
+2016-10-05  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       * c-c++-common/Wint-in-bool-context.c: Update test.
+
 2016-10-05  Marek Polacek  <polacek@redhat.com>
 
        * g++.dg/cpp1z/init-statement1.C: New test.
index 832eb0a0ee37ca064a3771b034bf779338e2a6d3..36daf546834dd486b9cedf0b29707346501b4e9a 100644 (file)
@@ -10,7 +10,7 @@ int foo (int a, int b)
   if (a > 0 && a <= (b == 2) ? 1 : 1) /* { dg-bogus "boolean context" } */
     return 2;
 
-  if (a > 0 && a <= (b == 3) ? 0 : 2) /* { dg-bogus "boolean context" } */
+  if (a > 0 && a <= (b == 3) ? 0 : 2) /* { dg-warning "boolean context" } */
     return 3;
 
   if (a == b ? 0 : 0) /* { dg-bogus "boolean context" } */