Do not warn about zero-as-null when NULL is used.
authorVille Voutilainen <ville.voutilainen@gmail.com>
Wed, 30 May 2018 19:33:38 +0000 (22:33 +0300)
committerVille Voutilainen <ville@gcc.gnu.org>
Wed, 30 May 2018 19:33:38 +0000 (22:33 +0300)
gcc/cp/

Do not warn about zero-as-null when NULL is used.
* call.c (conversion_null_warnings): Check for pointer
types converted from zero constants.
(convert_like_real): Add a warning sentinel at the end.
* tree.c (maybe_warn_zero_as_null_pointer_constant): Also
check null_node_p.

testsuite/

Do not warn about zero-as-null when NULL is used.
* g++.dg/warn/Wzero-as-null-pointer-constant-7.C: New.

From-SVN: r260973

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/tree.c
gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-7.C [new file with mode: 0644]

index ec5ee7eb9dd13792077a724ee5163bcc45548653..70554be6f87740ca25d7bded9109cf022082d417 100644 (file)
@@ -1,3 +1,12 @@
+2018-05-30  Ville Voutilainen  <ville.voutilainen@gmail.com>
+
+       Do not warn about zero-as-null when NULL is used.
+       * call.c (conversion_null_warnings): Check for pointer
+       types converted from zero constants.
+       (convert_like_real): Add a warning sentinel at the end.
+       * tree.c (maybe_warn_zero_as_null_pointer_constant): Also
+       check null_node_p.
+
 2018-05-24  Jason Merrill  <jason@redhat.com>
 
        PR c++/85807 - ICE with call in template NSDMI.
index 67e404d1cb234c8fce6ae12920c52b29bbad0c2f..98319f98c7d50ec3b0ba6932654eae5a433804c5 100644 (file)
@@ -6517,6 +6517,7 @@ build_temp (tree expr, tree type, int flags,
 }
 
 /* Perform warnings about peculiar, but valid, conversions from/to NULL.
+   Also handle a subset of zero as null warnings.
    EXPR is implicitly converted to type TOTYPE.
    FN and ARGNUM are used for diagnostics.  */
 
@@ -6551,6 +6552,15 @@ conversion_null_warnings (tree totype, tree expr, tree fn, int argnum)
        warning_at (input_location, OPT_Wconversion_null,
                    "converting %<false%> to pointer type %qT", totype);
     }
+  /* Handle zero as null pointer warnings for cases other
+     than EQ_EXPR and NE_EXPR */
+  else if (null_ptr_cst_p (expr) &&
+          (TYPE_PTR_OR_PTRMEM_P (totype) || NULLPTR_TYPE_P (totype)))
+    {
+      source_location loc =
+       expansion_point_location_if_in_system_header (input_location);
+      maybe_warn_zero_as_null_pointer_constant (expr, loc);
+    }
 }
 
 /* We gave a diagnostic during a conversion.  If this was in the second
@@ -7101,6 +7111,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
       && !check_narrowing (totype, expr, complain))
     return error_mark_node;
 
+  warning_sentinel w (warn_zero_as_null_pointer_constant);
   if (issue_conversion_warnings)
     expr = cp_convert_and_check (totype, expr, complain);
   else
index 4bb2879dc5980897d381c90d565ecc369b442de4..c5b6e9689b68739f89d6459ea328c6fad7088890 100644 (file)
@@ -5432,7 +5432,7 @@ bool
 maybe_warn_zero_as_null_pointer_constant (tree expr, location_t loc)
 {
   if (c_inhibit_evaluation_warnings == 0
-      && !NULLPTR_TYPE_P (TREE_TYPE (expr)))
+      && !null_node_p (expr) && !NULLPTR_TYPE_P (TREE_TYPE (expr)))
     {
       warning_at (loc, OPT_Wzero_as_null_pointer_constant,
                  "zero as null pointer constant");
diff --git a/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-7.C b/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-7.C
new file mode 100644 (file)
index 0000000..0d06dbf
--- /dev/null
@@ -0,0 +1,13 @@
+// { dg-options "-Wzero-as-null-pointer-constant" }
+// { dg-do compile { target c++11 } }
+
+#include <cstddef>
+
+void test01()
+{
+  char* x(NULL);
+  char* x2{NULL};
+  char* x3 = NULL;
+  char* x4(0); // { dg-warning "zero as null pointer" }
+  char* x5 = 0; // { dg-warning "zero as null pointer" }
+}