aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-02-11 23:55:02 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-02-11 23:55:02 +0100
commit66756373c1940650568173b6d9c32325429bfc34 (patch)
tree77d4fdb0a1276a8329dd63f42ddb790207c0364b /gcc
parentec4836a75da03d1b93df6a9dff3da3b597676ed9 (diff)
downloadgcc-66756373c1940650568173b6d9c32325429bfc34.zip
gcc-66756373c1940650568173b6d9c32325429bfc34.tar.gz
gcc-66756373c1940650568173b6d9c32325429bfc34.tar.bz2
re PR c/69768 (Bogus -Waddress warning)
PR c/69768 * c-typeck.c (parser_build_binary_op): Strip nops from integer_zerop arguments for -Waddress warning. * typeck.c (cp_build_binary_op): cp_fully_fold integer_zerop arguments for -Waddress warning. Fix up formatting. * c-c++-common/Waddress-1.c: New test. From-SVN: r233357
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c/ChangeLog6
-rw-r--r--gcc/c/c-typeck.c6
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/typeck.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/Waddress-1.c15
6 files changed, 42 insertions, 5 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 931e51d..b595b81 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,9 @@
+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
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 65925cb..82efacf 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -3597,8 +3597,10 @@ parser_build_binary_op (location_t location, enum tree_code code,
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");
}
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7a80565..1b4ebd3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+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
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index c9fa112..3a247d8 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -4487,9 +4487,12 @@ cp_build_binary_op (location_t location,
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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c99f763..baf28f5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/c-c++-common/Waddress-1.c b/gcc/testsuite/c-c++-common/Waddress-1.c
new file mode 100644
index 0000000..a5d128f
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/Waddress-1.c
@@ -0,0 +1,15 @@
+/* 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" } */
+}