re PR c++/69850 (unnecessary -Wnonnull-compare warning)
authorJakub Jelinek <jakub@redhat.com>
Wed, 17 Feb 2016 22:27:24 +0000 (23:27 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 17 Feb 2016 22:27:24 +0000 (23:27 +0100)
PR c++/69850
* gimplify.c (gimplify_cond_expr): Call gimple_set_no_warning
on the cond_stmt from TREE_NO_WARNING on COND_EXPR_COND.
* gimple-ssa-nonnull-compare.c (do_warn_nonnull_compare): Don't
warn on gimple_no_warning_p statements.

* init.c (build_delete): Set TREE_NO_WARNING on ifexp.

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

From-SVN: r233508

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/init.c
gcc/gimple-ssa-nonnull-compare.c
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wnonnull-compare-1.C [new file with mode: 0644]

index e690691..6ca3c04 100644 (file)
@@ -1,3 +1,11 @@
+2016-02-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/69850
+       * gimplify.c (gimplify_cond_expr): Call gimple_set_no_warning
+       on the cond_stmt from TREE_NO_WARNING on COND_EXPR_COND.
+       * gimple-ssa-nonnull-compare.c (do_warn_nonnull_compare): Don't
+       warn on gimple_no_warning_p statements.
+
 2016-02-17  Jonathan Wakely  <jwakely@redhat.com>
 
        * doc/extend.texi (C++ Attributes): Correct description of
index c02ffac..ca5d838 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/69850
+       * init.c (build_delete): Set TREE_NO_WARNING on ifexp.
+
 2016-02-17  Jason Merrill  <jason@redhat.com>
 
        PR c++/69842
index 9f9c729..68cc1a7 100644 (file)
@@ -4525,6 +4525,10 @@ build_delete (tree otype, tree addr, special_function_kind auto_delete,
                                            complain));
          if (ifexp == error_mark_node)
            return error_mark_node;
+         /* This is a compiler generated comparison, don't emit
+            e.g. -Wnonnull-compare warning for it.  */
+         else if (TREE_CODE (ifexp) == NE_EXPR)
+           TREE_NO_WARNING (ifexp) = 1;
        }
 
       if (ifexp != integer_one_node)
index 910188b..8c55467 100644 (file)
@@ -96,7 +96,8 @@ do_warn_nonnull_compare (function *fun, tree arg)
          }
       if (op
          && (POINTER_TYPE_P (TREE_TYPE (arg))
-             ? integer_zerop (op) : integer_minus_onep (op)))
+             ? integer_zerop (op) : integer_minus_onep (op))
+         && !gimple_no_warning_p (stmt))
        warning_at (loc, OPT_Wnonnull_compare,
                    "nonnull argument %qD compared to NULL", arg);
     }
index 6aa9db2..7be6bd7 100644 (file)
@@ -3219,6 +3219,7 @@ gimplify_cond_expr (tree *expr_p, gimple_seq *pre_p, fallback_t fallback)
                                 &arm2);
   cond_stmt = gimple_build_cond (pred_code, arm1, arm2, label_true,
                                 label_false);
+  gimple_set_no_warning (cond_stmt, TREE_NO_WARNING (COND_EXPR_COND (expr)));
   gimplify_seq_add_stmt (&seq, cond_stmt);
   gimple_stmt_iterator gsi = gsi_last (seq);
   maybe_fold_stmt (&gsi);
index ce80cf7..13e3388 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/69850
+       * g++.dg/warn/Wnonnull-compare-1.C: New test.
+
 2012-02-17  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        * gcc.target/powerpc/vec-cg.c: New test.
diff --git a/gcc/testsuite/g++.dg/warn/Wnonnull-compare-1.C b/gcc/testsuite/g++.dg/warn/Wnonnull-compare-1.C
new file mode 100644 (file)
index 0000000..24a33fc
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/69850
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+struct C
+{
+  ~C () { delete this; }       // { dg-bogus "nonnull argument" }
+};
+C c;