aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBernd Edlinger <edlinger@gcc.gnu.org>2016-10-19 21:00:39 +0000
committerBernd Edlinger <edlinger@gcc.gnu.org>2016-10-19 21:00:39 +0000
commit4c712374189739d77d7eaa7a3977ce8533e15163 (patch)
tree480d808d16c12ad38fd79a06b8bb8ab85fdb929b /gcc
parentf3070dab7a2ded2c2ee612d6e48ca01b77327379 (diff)
downloadgcc-4c712374189739d77d7eaa7a3977ce8533e15163.zip
gcc-4c712374189739d77d7eaa7a3977ce8533e15163.tar.gz
gcc-4c712374189739d77d7eaa7a3977ce8533e15163.tar.bz2
c-common.c (c_common_truthvalue_conversion): Warn only for signed integer shift ops in boolean context.
2016-10-19 Bernd Edlinger <bernd.edlinger@hotmail.de> * c-common.c (c_common_truthvalue_conversion): Warn only for signed integer shift ops in boolean context. testsuite: 2016-10-19 Bernd Edlinger <bernd.edlinger@hotmail.de> * c-c++-common/Wint-in-bool-context-2.c: New test. From-SVN: r241354
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/ChangeLog7
-rw-r--r--gcc/c-family/c-common.c11
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/c-c++-common/Wint-in-bool-context-2.c17
4 files changed, 36 insertions, 3 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index f305593..0ef8ef7 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,4 +1,9 @@
-2016-06-16 Aldy Hernandez <aldyh@redhat.com>
+2016-10-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ * c-common.c (c_common_truthvalue_conversion): Warn only for signed
+ integer shift ops in boolean context.
+
+2016-10-18 Aldy Hernandez <aldyh@redhat.com>
* c.opt (Walloca): New.
(Walloca-larger-than=): New.
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 326ff6f..8af3ad5 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -3328,8 +3328,15 @@ c_common_truthvalue_conversion (location_t location, tree expr)
TREE_OPERAND (expr, 0));
case LSHIFT_EXPR:
- warning_at (EXPR_LOCATION (expr), OPT_Wint_in_bool_context,
- "<< in boolean context, did you mean '<' ?");
+ /* We will only warn on unsigned shifts here, because the majority of
+ false positive warnings happen in code where unsigned arithmetic
+ was used in anticipation of a possible overflow.
+ Furthermore, if we see an unsigned type here we know that the
+ result of the shift is not subject to integer promotion rules. */
+ 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 '<' ?");
break;
case COND_EXPR:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1e83325..8f5230f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2016-10-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ * c-c++-common/Wint-in-bool-context-2.c: New test.
+
2016-10-19 Jerry DeLisle <jvdelisle@gcc.gnu.org>
* gfortran.dg/dtio_17.f90: Fix test.
diff --git a/gcc/testsuite/c-c++-common/Wint-in-bool-context-2.c b/gcc/testsuite/c-c++-common/Wint-in-bool-context-2.c
new file mode 100644
index 0000000..04c064d
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/Wint-in-bool-context-2.c
@@ -0,0 +1,17 @@
+/* { dg-options "-Wint-in-bool-context" } */
+/* { dg-do compile } */
+
+typedef unsigned u32;
+typedef unsigned char u8;
+#define KEYLENGTH 8
+
+int foo (u8 plen, u32 key)
+{
+ if ((plen < KEYLENGTH) && (key << plen)) /* { dg-bogus "boolean context" } */
+ return -1;
+
+ if ((plen << KEYLENGTH) && (key < plen)) /* { dg-warning "boolean context" } */
+ return -2;
+
+ return 0;
+}