===================================================================
@@ -4617,7 +4617,22 @@ c_common_truthvalue_conversion (location_t locatio
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), OPT_Wint_in_bool_context,
+ "<< on signed integer in boolean context");
+ break;
+
case COND_EXPR:
+ if (TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST
+ && TREE_CODE (TREE_OPERAND (expr, 2)) == INTEGER_CST
+ && !integer_zerop (TREE_OPERAND (expr, 1))
+ && !integer_zerop (TREE_OPERAND (expr, 2))
+ && (!integer_onep (TREE_OPERAND (expr, 1))
+ || !integer_onep (TREE_OPERAND (expr, 2))))
+ 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 ())
{
===================================================================
@@ -525,6 +525,10 @@ Wint-conversion
C ObjC Var(warn_int_conversion) Init(1) Warning
Warn about incompatible integer to pointer and pointer to integer conversions.
+Wint-in-bool-context
+C ObjC C++ ObjC++ Var(warn_int_in_bool_context) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall)
+Warn for suspicious integer expressions in boolean context.
+
Wint-to-pointer-cast
C ObjC C++ ObjC++ Var(warn_int_to_pointer_cast) Init(1) Warning
Warn when there is a cast to a pointer from an integer of a different size.
===================================================================
@@ -11172,7 +11172,7 @@ cp_parser_condition (cp_parser* parser)
{
tree pushed_scope;
bool non_constant_p;
- bool flags = LOOKUP_ONLYCONVERTING;
+ int flags = LOOKUP_ONLYCONVERTING;
/* Create the declaration. */
decl = start_decl (declarator, &type_specifiers,
===================================================================
@@ -273,7 +273,7 @@ Objective-C and Objective-C++ Dialects}.
-Wframe-larger-than=@var{len} -Wno-free-nonheap-object -Wjump-misses-init @gol
-Wignored-qualifiers -Wignored-attributes -Wincompatible-pointer-types @gol
-Wimplicit -Wimplicit-function-declaration -Wimplicit-int @gol
--Winit-self -Winline -Wno-int-conversion @gol
+-Winit-self -Winline -Wno-int-conversion -Wint-in-bool-context @gol
-Wno-int-to-pointer-cast -Winvalid-memory-model -Wno-invalid-offsetof @gol
-Winvalid-pch -Wlarger-than=@var{len} @gol
-Wlogical-op -Wlogical-not-parentheses -Wlong-long @gol
@@ -5816,6 +5816,15 @@ warning about it.
The restrictions on @code{offsetof} may be relaxed in a future version
of the C++ standard.
+@item -Wint-in-bool-context
+@opindex Wint-in-bool-context
+@opindex Wno-int-in-bool-context
+Warn for suspicious use of integer values where boolean values are expected,
+such as conditional expressions (?:) using non-boolean integer constants in
+boolean context, like @code{if (a <= b ? 2 : 3)}. Or left shifting of a
+signed integer in boolean context, like @code{for (a = 0; 1 << a; a++);}.
+This warning is enabled by @option{-Wall}.
+
@item -Wno-int-to-pointer-cast
@opindex Wno-int-to-pointer-cast
@opindex Wint-to-pointer-cast
===================================================================
@@ -2051,9 +2051,9 @@ output_loc_operands (dw_loc_descr_ref loc, int for
/* Make sure the offset has been computed and that we can encode it as
an operand. */
gcc_assert (die_offset > 0
- && die_offset <= (loc->dw_loc_opc == DW_OP_call2)
+ && die_offset <= (loc->dw_loc_opc == DW_OP_call2
? 0xffff
- : 0xffffffff);
+ : 0xffffffff));
dw2_asm_output_data ((loc->dw_loc_opc == DW_OP_call2) ? 2 : 4,
die_offset, NULL);
}
===================================================================
@@ -0,0 +1,19 @@
+/* PR c++/77434 */
+/* { dg-options "-Wint-in-bool-context" } */
+/* { dg-do compile } */
+
+int foo (int a, int b)
+{
+ if (a > 0 && a <= (b == 1) ? 1 : 2) /* { dg-warning "boolean context" } */
+ return 1;
+
+ 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" } */
+ return 3;
+
+ for (a = 0; 1 << a; a++); /* { dg-warning "boolean context" } */
+
+ return 0;
+}