* c-common.c (warn_logical_not_parentheses): Print fixit hints.
* c-common.h (warn_logical_not_parentheses): Update declaration.
* c-typeck.c (parser_build_binary_op): Pass LHS to
warn_logical_not_parentheses.
* parser.c (cp_parser_binary_expression): Pass LHS to
warn_logical_not_parentheses.
* c-c++-common/Wlogical-not-parentheses-2.c: New test.
Co-Authored-By: David Malcolm <dmalcolm@redhat.com>
From-SVN: r239756
+2016-08-25 Marek Polacek <polacek@redhat.com>
+ David Malcolm <dmalcolm@redhat.com>
+
+ * c-common.c (warn_logical_not_parentheses): Print fixit hints.
+ * c-common.h (warn_logical_not_parentheses): Update declaration.
+
2016-08-22 Marek Polacek <polacek@redhat.com>
PR c++/77321
void
warn_logical_not_parentheses (location_t location, enum tree_code code,
- tree rhs)
+ tree lhs, tree rhs)
{
if (TREE_CODE_CLASS (code) != tcc_comparison
|| TREE_TYPE (rhs) == NULL_TREE
&& integer_zerop (rhs))
return;
- warning_at (location, OPT_Wlogical_not_parentheses,
- "logical not is only applied to the left hand side of "
- "comparison");
+ if (warning_at (location, OPT_Wlogical_not_parentheses,
+ "logical not is only applied to the left hand side of "
+ "comparison")
+ && EXPR_HAS_LOCATION (lhs))
+ {
+ location_t lhs_loc = EXPR_LOCATION (lhs);
+ rich_location richloc (line_table, lhs_loc);
+ richloc.add_fixit_insert (lhs_loc, "(");
+ location_t finish = get_finish (lhs_loc);
+ location_t next_loc
+ = linemap_position_for_loc_and_offset (line_table, finish, 1);
+ richloc.add_fixit_insert (next_loc, ")");
+ inform_at_rich_loc (&richloc, "add parentheses around left hand side "
+ "expression to silence this warning");
+ }
}
/* Warn if EXP contains any computations whose results are not used.
extern bool warn_if_unused_value (const_tree, location_t);
extern void warn_logical_operator (location_t, enum tree_code, tree,
enum tree_code, tree, enum tree_code, tree);
-extern void warn_logical_not_parentheses (location_t, enum tree_code, tree);
+extern void warn_logical_not_parentheses (location_t, enum tree_code, tree,
+ tree);
extern void warn_tautological_cmp (location_t, enum tree_code, tree, tree);
extern void check_main_parameter_types (tree decl);
extern bool c_determine_visibility (tree);
+2016-08-25 Marek Polacek <polacek@redhat.com>
+
+ * c-typeck.c (parser_build_binary_op): Pass LHS to
+ warn_logical_not_parentheses.
+
2016-08-25 Marek Polacek <polacek@redhat.com>
PR c/77323
while (1);
}
if (TREE_CODE (TREE_TYPE (t)) != BOOLEAN_TYPE)
- warn_logical_not_parentheses (location, code, arg2.value);
+ warn_logical_not_parentheses (location, code, arg1.value, arg2.value);
}
/* Warn about comparisons against string literals, with the exception
+2016-08-25 Marek Polacek <polacek@redhat.com>
+
+ * parser.c (cp_parser_binary_expression): Pass LHS to
+ warn_logical_not_parentheses.
+
2016-08-18 Marek Polacek <polacek@redhat.com>
PR c/7652
|| TREE_TYPE (current.lhs) == NULL_TREE
|| TREE_CODE (TREE_TYPE (current.lhs)) != BOOLEAN_TYPE))
warn_logical_not_parentheses (current.loc, current.tree_type,
- maybe_constant_value (rhs));
+ current.lhs, maybe_constant_value (rhs));
overload = NULL;
+2016-08-25 Marek Polacek <polacek@redhat.com>
+
+ * c-c++-common/Wlogical-not-parentheses-2.c: New test.
+
2016-08-25 Marek Polacek <polacek@redhat.com>
PR c/77323
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wlogical-not-parentheses -fdiagnostics-show-caret" } */
+
+ /* Test fixit hints. */
+
+int
+foo (int aaa, int bbb)
+{
+ int r = 0;
+ r += (!aaa) == bbb;
+ r += !aaa == bbb; /* { dg-warning "logical not is only applied" } */
+/* { dg-begin-multiline-output "" }
+ r += !aaa == bbb;
+ ^~
+ r += !aaa == bbb;
+ ^~~~
+ ( )
+ { dg-end-multiline-output "" } */
+ return r;
+}