On 30 May 2018 at 18:32, Ville Voutilainen <ville.voutilai...@gmail.com> wrote:
> Now it does. This passes all the Wzero-as-null-pointer-constant tests in warn/
> and cpp0x/, running full suite on Linux-PPC64. Ok for trunk if the tests
> pass?

Here we go again. :)

2018-05-30  Ville Voutilainen  <ville.voutilai...@gmail.com>

    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.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 7aadd64..18e1ab9 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -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,16 @@ 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_PTRMEMFUNC_P (totype) || TYPE_PTRDATAMEM_P (totype)
+	       || TYPE_PTR_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 +7112,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
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index f21daac..332d51d 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -5423,7 +5423,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
index 0000000..0d06dbf
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-7.C
@@ -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" }
+}

Reply via email to