aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/c-family/ChangeLog7
-rw-r--r--gcc/c-family/c-common.c13
-rw-r--r--gcc/c-family/c.opt4
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/cvt.c1
-rw-r--r--gcc/doc/invoke.texi11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/Wint-in-bool-context.c29
9 files changed, 77 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5011595..e42b2e7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,8 @@
2016-09-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
+ PR c++/77434
+ * doc/invoke.texi: Document -Wint-in-bool-context.
+
PR middle-end/77421
* dwarf2out.c (output_loc_operands): Fix an assertion.
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 41afbc5..5efbf55 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,10 @@
+2016-09-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ PR c++/77434
+ * c.opt (Wint-in-bool-context): New warning.
+ * c-common.c (c_common_truthvalue_conversion): Warn on integer
+ constants in boolean context.
+
2016-09-19 Joseph Myers <joseph@codesourcery.com>
* c-common.c (max_align_t_align): Also consider alignment of
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index b6545c0..d1372a4 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -4652,6 +4652,19 @@ c_common_truthvalue_conversion (location_t location, tree expr)
TREE_OPERAND (expr, 0));
case COND_EXPR:
+ if (warn_int_in_bool_context)
+ {
+ tree val1 = fold_for_warn (TREE_OPERAND (expr, 1));
+ tree val2 = fold_for_warn (TREE_OPERAND (expr, 2));
+ if (TREE_CODE (val1) == INTEGER_CST
+ && TREE_CODE (val2) == INTEGER_CST
+ && !integer_zerop (val1)
+ && !integer_zerop (val2)
+ && (!integer_onep (val1)
+ || !integer_onep (val2)))
+ 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 ())
{
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index c55c7c3..6cf915d 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -545,6 +545,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.
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e4bd392..6aa79a9 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2016-09-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ PR c++/77434
+ * cvt.c (cp_convert_and_check): Suppress Wint-in-bool-context here.
+
2016-09-16 Patrick Palka <ppalka@gcc.gnu.org>
PR c++/77639
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index 977c665..2f5f15a 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -645,6 +645,7 @@ cp_convert_and_check (tree type, tree expr, tsubst_flags_t complain)
{
/* Avoid bogus -Wparentheses warnings. */
warning_sentinel w (warn_parentheses);
+ warning_sentinel c (warn_int_in_bool_context);
folded_result = cp_convert (type, folded, tf_none);
}
folded_result = fold_simple (folded_result);
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 8eb5eff..3c27283 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -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
@@ -3660,6 +3660,7 @@ Options} and @ref{Objective-C and Objective-C++ Dialect Options}.
-Wduplicate-decl-specifier @r{(C and Objective-C only)} @gol
-Wenum-compare @r{(in C/ObjC; this is on by default in C++)} @gol
-Wformat @gol
+-Wint-in-bool-context @gol
-Wimplicit @r{(C and Objective-C only)} @gol
-Wimplicit-int @r{(C and Objective-C only)} @gol
-Wimplicit-function-declaration @r{(C and Objective-C only)} @gol
@@ -5837,6 +5838,14 @@ 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)}.
+This warning is enabled by @option{-Wall}.
+
@item -Wno-int-to-pointer-cast
@opindex Wno-int-to-pointer-cast
@opindex Wint-to-pointer-cast
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c825702..ca54995 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-09-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ PR c++/77434
+ * c-c++-common/Wint-in-bool-context.c: New test.
+
2016-09-19 Joseph Myers <joseph@codesourcery.com>
* gcc.dg/cr-decimal-dig-1.c: New test.
diff --git a/gcc/testsuite/c-c++-common/Wint-in-bool-context.c b/gcc/testsuite/c-c++-common/Wint-in-bool-context.c
new file mode 100644
index 0000000..38832d7
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/Wint-in-bool-context.c
@@ -0,0 +1,29 @@
+/* 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;
+
+ if (a == b ? 0 : 0) /* { dg-bogus "boolean context" } */
+ return 4;
+
+ if (a == ((b ? 2|4 : 1) & 3 ? 0 : 2)) /* { dg-bogus "boolean context" } */
+ return 5;
+
+ if (a ? 1 : 1+1) /* { dg-warning "boolean context" } */
+ return 6;
+
+ if (b ? 1+1 : 1) /* { dg-warning "boolean context" } */
+ return 7;
+
+ return 0;
+}