+2016-02-11 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/69768
+ * c-typeck.c (parser_build_binary_op): Strip nops from integer_zerop
+ arguments for -Waddress warning.
+
2016-02-04 Jakub Jelinek <jakub@redhat.com>
PR c/69669
of testing for equality or inequality of a string literal with NULL. */
if (code == EQ_EXPR || code == NE_EXPR)
{
- if ((code1 == STRING_CST && !integer_zerop (arg2.value))
- || (code2 == STRING_CST && !integer_zerop (arg1.value)))
+ if ((code1 == STRING_CST
+ && !integer_zerop (tree_strip_nop_conversions (arg2.value)))
+ || (code2 == STRING_CST
+ && !integer_zerop (tree_strip_nop_conversions (arg1.value))))
warning_at (location, OPT_Waddress,
"comparison with string literal results in unspecified behavior");
}
+2016-02-11 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/69768
+ * typeck.c (cp_build_binary_op): cp_fully_fold integer_zerop
+ arguments for -Waddress warning. Fix up formatting.
+
2016-02-11 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/68726
warning (OPT_Wfloat_equal,
"comparing floating point with == or != is unsafe");
if ((complain & tf_warning)
- && ((TREE_CODE (orig_op0) == STRING_CST && !integer_zerop (op1))
- || (TREE_CODE (orig_op1) == STRING_CST && !integer_zerop (op0))))
- warning (OPT_Waddress, "comparison with string literal results in unspecified behaviour");
+ && ((TREE_CODE (orig_op0) == STRING_CST
+ && !integer_zerop (cp_fully_fold (op1)))
+ || (TREE_CODE (orig_op1) == STRING_CST
+ && !integer_zerop (cp_fully_fold (op0)))))
+ warning (OPT_Waddress, "comparison with string literal results "
+ "in unspecified behaviour");
build_type = boolean_type_node;
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
+2016-02-11 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/69768
+ * c-c++-common/Waddress-1.c: New test.
+
2016-02-11 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/69296
--- /dev/null
+/* PR c/69768 */
+/* { dg-do compile } */
+/* { dg-options "-Waddress" } */
+
+static int e;
+
+int
+foo ()
+{
+ return "foo1" != (void *) 0 /* { dg-bogus "comparison with string literal results in unspecified behaviou?r" } */
+ && "foo2" != (const char *) ((void *) 0) /* { dg-bogus "comparison with string literal results in unspecified behaviou?r" } */
+ && "foo3" != (const char *) ((void *) (10 - 10)) /* { dg-bogus "comparison with string literal results in unspecified behaviou?r" } */
+ && "foo4" != (const char *) ((void *) (&e - &e)) /* { dg-warning "comparison with string literal results in unspecified behaviou?r" "" { target c } } */
+ && "foo5" != "foo6"; /* { dg-warning "comparison with string literal results in unspecified behaviou?r" } */
+}