On Thu, Apr 30, 2015 at 11:42:18AM +0200, Andreas Schwab wrote:
> Marek Polacek <pola...@redhat.com> writes:
> 
> >     PR c/64610
> >     * c-common.c (maybe_warn_bool_compare): Warn when comparing a boolean
> >     with 0/1.
> 
> /usr/local/gcc/gcc-20150430/Build/./prev-gcc/xg++ 
> -B/usr/local/gcc/gcc-20150430/Build/./prev-gcc/ 
> -B/usr/aarch64-suse-linux/bin/ -nostdinc++ 
> -B/usr/local/gcc/gcc-20150430/Build/prev-aarch64-suse-linux/libstdc++-v3/src/.libs
>  
> -B/usr/local/gcc/gcc-20150430/Build/prev-aarch64-suse-linux/libstdc++-v3/libsupc++/.libs
>   
> -I/usr/local/gcc/gcc-20150430/Build/prev-aarch64-suse-linux/libstdc++-v3/include/aarch64-suse-linux
>   
> -I/usr/local/gcc/gcc-20150430/Build/prev-aarch64-suse-linux/libstdc++-v3/include
>   -I/usr/local/gcc/gcc-20150430/libstdc++-v3/libsupc++ 
> -L/usr/local/gcc/gcc-20150430/Build/prev-aarch64-suse-linux/libstdc++-v3/src/.libs
>  
> -L/usr/local/gcc/gcc-20150430/Build/prev-aarch64-suse-linux/libstdc++-v3/libsupc++/.libs
>  -c   -g -O2 -gtoggle -DIN_GCC    -fno-exceptions -fno-rtti 
> -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings 
> -Wcast-qual -Wmissing-format-attribute -Woverloaded-virtual -pedantic 
> -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -Werror 
> -fno-common  -DHAVE_CONFIG_H -I. -I. -I../../gcc -I../../gcc/. 
> -I../../gcc/../include -I../../gcc/../libcpp/include  
> -I../../gcc/../libdecnumber -I../../gcc/../libdecnumber/dpd -I../libdecnumber 
> -I../../gcc/../libbacktrace   -o expr.o -MT expr.o -MMD -MP -MF 
> ./.deps/expr.TPo ../../gcc/expr.c
> ../../gcc/expr.c: In function 'int can_store_by_pieces(long unsigned int, 
> rtx_def* (*)(void*, long int, machine_mode), void*, unsigned int, bool)':
> ../../gcc/expr.c:2496:16: error: comparison of constant 'true' with boolean 
> expression is always true [-Werror=bool-compare]
>         reverse <= (HAVE_PRE_DECREMENT || HAVE_POST_DECREMENT);
>                 ^

Yes, that is a bug in my code; I think I'll apply the following after
regtest/bootstrap (with a proper test).  If you could perhaps try the
patch as well, it'd be appreciated.

diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c
index 7d314f8..ada8e8a 100644
--- gcc/c-family/c-common.c
+++ gcc/c-family/c-common.c
@@ -11924,6 +11924,17 @@ maybe_warn_bool_compare (location_t loc, enum 
tree_code code, tree op0,
     }
   else if (integer_zerop (cst) || integer_onep (cst))
     {
+      /* If the non-constant operand isn't of a boolean type, we
+        don't want to warn here.  */
+      tree noncst = TREE_CODE (op0) == INTEGER_CST ? op1 : op0;
+      /* Handle booleans promoted to integers.  */
+      if (CONVERT_EXPR_P (noncst)
+         && TREE_TYPE (noncst) == integer_type_node
+         && TREE_CODE (TREE_TYPE (TREE_OPERAND (noncst, 0))) == BOOLEAN_TYPE)
+       /* Warn.  */;
+      else if (TREE_CODE (TREE_TYPE (noncst)) != BOOLEAN_TYPE
+              && !truth_value_p (TREE_CODE (noncst)))
+       return;
       /* Do some magic to get the right diagnostics.  */
       bool flag = TREE_CODE (op0) == INTEGER_CST;
       flag = integer_zerop (cst) ? flag : !flag;

        Marek

Reply via email to