aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gimplify.c2
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/c-c++-common/nonnull-1.c8
-rw-r--r--gcc/testsuite/g++.dg/warn/Wnonnull-compare-8.C14
5 files changed, 37 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c98a209..5193c97 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-03-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/70295
+ * gimplify.c (gimplify_modify_expr): Call gimple_set_no_warning
+ on assign if (*from_p) is a comparison, set it to
+ TREE_NO_WARNING (*from_p).
+
2016-03-21 Jakub Jelinek <jakub@redhat.com>
PR middle-end/70326
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 3687e7a..5d03435 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -4850,6 +4850,8 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
{
assign = gimple_build_assign (*to_p, *from_p);
gimple_set_location (assign, EXPR_LOCATION (*expr_p));
+ if (COMPARISON_CLASS_P (*from_p))
+ gimple_set_no_warning (assign, TREE_NO_WARNING (*from_p));
}
if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dc47ef1..25a36dd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2016-03-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/70295
+ * c-c++-common/nonnull-1.c (func): Remove parens around cp4 != 0.
+ (func2): New function for cond with parens, xfail warning for c++.
+ * g++.dg/warn/Wnonnull-compare-8.C: New test.
+
2016-03-22 Patrick Palka <ppalka@gcc.gnu.org>
PR c++/70096
diff --git a/gcc/testsuite/c-c++-common/nonnull-1.c b/gcc/testsuite/c-c++-common/nonnull-1.c
index fb2814c..2446d6f 100644
--- a/gcc/testsuite/c-c++-common/nonnull-1.c
+++ b/gcc/testsuite/c-c++-common/nonnull-1.c
@@ -24,5 +24,11 @@ func (char *cp1, char *cp2, char *cp3, char *cp4)
if (NULL != cp3) /* { dg-warning "nonnull argument" "cp3 compared to NULL" } */
return 3;
- return (cp4 != 0) ? 0 : 1; /* { dg-warning "nonnull argument" "cp4 compared to NULL" } */
+ return cp4 != 0 ? 0 : 1; /* { dg-warning "nonnull argument" "cp4 compared to NULL" } */
+}
+
+__attribute__((nonnull (1))) int
+func2 (char *cp)
+{
+ return (cp != NULL) ? 1 : 0; /* { dg-warning "nonnull argument" "cp compared to NULL" { xfail c++ } } */
}
diff --git a/gcc/testsuite/g++.dg/warn/Wnonnull-compare-8.C b/gcc/testsuite/g++.dg/warn/Wnonnull-compare-8.C
new file mode 100644
index 0000000..28dcac8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wnonnull-compare-8.C
@@ -0,0 +1,14 @@
+// PR c++/70295
+// { dg-do compile }
+// { dg-options "-O2 -Wnonnull-compare" }
+
+struct A { A (); virtual ~A (); bool foo (bool); };
+struct B : virtual public A { B (); virtual ~B (); };
+
+bool
+A::foo (bool x)
+{
+ if (x && dynamic_cast<B *>(this) != (B *) 0) // { dg-bogus "nonnull argument" }
+ return true;
+ return false;
+}