aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/fold-const.c7
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/warn/Wnonnull-compare-5.C18
4 files changed, 30 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 020a1b3..951f208 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
2016-02-23 Jakub Jelinek <jakub@redhat.com>
+ PR c++/69902
+ * fold-const.c (fold_truth_not_expr): Propagate TREE_NO_WARNING
+ when inverting comparison.
+
PR c/69900
* common.opt (Wunreachable-code): Add Warning flag.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 41c652e..5376d4d 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -3589,8 +3589,11 @@ fold_truth_not_expr (location_t loc, tree arg)
if (code == ERROR_MARK)
return NULL_TREE;
- return build2_loc (loc, code, type, TREE_OPERAND (arg, 0),
- TREE_OPERAND (arg, 1));
+ tree ret = build2_loc (loc, code, type, TREE_OPERAND (arg, 0),
+ TREE_OPERAND (arg, 1));
+ if (TREE_NO_WARNING (arg))
+ TREE_NO_WARNING (ret) = 1;
+ return ret;
}
switch (code)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f83aa50..2b7fe37 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2016-02-23 Jakub Jelinek <jakub@redhat.com>
+ PR c++/69902
+ * g++.dg/warn/Wnonnull-compare-5.C: New test.
+
PR c/69900
* gcc.dg/pr69900.c: New test.
diff --git a/gcc/testsuite/g++.dg/warn/Wnonnull-compare-5.C b/gcc/testsuite/g++.dg/warn/Wnonnull-compare-5.C
new file mode 100644
index 0000000..8b31e6c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wnonnull-compare-5.C
@@ -0,0 +1,18 @@
+// PR c++/69902
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+struct A { virtual ~A (); };
+struct B : A {};
+
+bool
+foo (A &a)
+{
+ return dynamic_cast<B *>(&a) == (B *) 0; // { dg-bogus "nonnull argument" }
+}
+
+bool
+bar (A &a)
+{
+ return dynamic_cast<B *>(&a) != (B *) 0; // { dg-bogus "nonnull argument" }
+}