https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77434

--- Comment #11 from Bernd Edlinger <bernd.edlinger at hotmail dot de> ---
As I said, I think "<<" on signed integers is generally bogus in a
truth value context.

So I tried an experiment for such a warning:

Index: c-common.c
===================================================================
--- c-common.c  (Revision 239953)
+++ c-common.c  (Arbeitskopie)
@@ -4601,6 +4601,13 @@ c_common_truthvalue_conversion (location_t locatio
       /* These don't change whether an object is nonzero or zero.  */
       return c_common_truthvalue_conversion (location, TREE_OPERAND (expr,
0));

+    case LSHIFT_EXPR:
+      if (TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE
+         && !TYPE_UNSIGNED (TREE_TYPE (expr)))
+       warning_at (EXPR_LOCATION (expr), 0,
+                   "<< on signed integer in boolean context");
+      break;
+
     case LROTATE_EXPR:
     case RROTATE_EXPR:
       /* These don't change whether an object is zero or nonzero, but


And guess what: it immediately found something!

In file included from ../../gcc-trunk/gcc/cp/parser.c:24:0:
../../gcc-trunk/gcc/cp/parser.c: In function 'tree_node*
cp_parser_condition(cp_parser*)':
../../gcc-trunk/gcc/cp/cp-tree.h:4964:34: error: << on signed integer in
boolean context [-Werror]
 #define LOOKUP_ONLYCONVERTING (1 << 2)
                               ~~~^~~~~
../../gcc-trunk/gcc/cp/parser.c:11175:17: note: in expansion of macro
'LOOKUP_ONLYCONVERTING'
    bool flags = LOOKUP_ONLYCONVERTING;
                 ^~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors
make[3]: *** [cp/parser.o] Error 1

Reply via email to