PR c++/69850
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Feb 2016 19:16:31 +0000 (19:16 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Feb 2016 19:16:31 +0000 (19:16 +0000)
* rtti.c (ifnonnull): Set TREE_NO_WARNING on the condition, use
NE_EXPR instead of EQ_EXPR and swap last two arguments on COND_EXPR.

* g++.dg/warn/Wnonnull-compare-4.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233568 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/rtti.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wnonnull-compare-4.C [new file with mode: 0644]

index 8f9b0be..a80abb5 100644 (file)
@@ -1,3 +1,9 @@
+2016-02-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/69850
+       * rtti.c (ifnonnull): Set TREE_NO_WARNING on the condition, use
+       NE_EXPR instead of EQ_EXPR and swap last two arguments on COND_EXPR.
+
 2016-02-19  Patrick Palka  <ppalka@gcc.gnu.org>
 
        PR c++/68948
index 69c3905..244c34d 100644 (file)
@@ -507,12 +507,13 @@ get_typeid (tree type, tsubst_flags_t complain)
 static tree
 ifnonnull (tree test, tree result, tsubst_flags_t complain)
 {
-  return build3 (COND_EXPR, TREE_TYPE (result),
-                build2 (EQ_EXPR, boolean_type_node, test,
-                        cp_convert (TREE_TYPE (test), nullptr_node,
-                                    complain)),
-                cp_convert (TREE_TYPE (result), nullptr_node, complain),
-                result);
+  tree cond = build2 (NE_EXPR, boolean_type_node, test,
+                     cp_convert (TREE_TYPE (test), nullptr_node, complain));
+  /* This is a compiler generated comparison, don't emit
+     e.g. -Wnonnull-compare warning for it.  */
+  TREE_NO_WARNING (cond) = 1;
+  return build3 (COND_EXPR, TREE_TYPE (result), cond, result,
+                cp_convert (TREE_TYPE (result), nullptr_node, complain));
 }
 
 /* Execute a dynamic cast, as described in section 5.2.6 of the 9/93 working
index f753e7b..74fd5c3 100644 (file)
@@ -1,5 +1,8 @@
 2016-02-19  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/69850
+       * g++.dg/warn/Wnonnull-compare-4.C: New test.
+
        PR c++/69851
        * g++.dg/torture/pr69851.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/warn/Wnonnull-compare-4.C b/gcc/testsuite/g++.dg/warn/Wnonnull-compare-4.C
new file mode 100644 (file)
index 0000000..851ed72
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/69850
+// { dg-do compile }
+// { dg-options "-Wnonnull-compare" }
+
+struct A { virtual ~A (); int foo (); };
+struct B { virtual ~B () { } };
+struct C : B, A { };
+
+int
+A::foo ()
+{
+  C *c = dynamic_cast<C *> (this);     // { dg-bogus "nonnull argument" }
+  return !c;
+}