diff options
author | Bernd Edlinger <edlinger@gcc.gnu.org> | 2016-10-19 21:00:39 +0000 |
---|---|---|
committer | Bernd Edlinger <edlinger@gcc.gnu.org> | 2016-10-19 21:00:39 +0000 |
commit | 4c712374189739d77d7eaa7a3977ce8533e15163 (patch) | |
tree | 480d808d16c12ad38fd79a06b8bb8ab85fdb929b /gcc | |
parent | f3070dab7a2ded2c2ee612d6e48ca01b77327379 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c-family/c-common.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/Wint-in-bool-context-2.c | 17 |
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; +} |