Fix locations in conversion_null_warnings (PR c++/71302)
authorDavid Malcolm <dmalcolm@redhat.com>
Wed, 6 Feb 2019 19:44:52 +0000 (19:44 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Wed, 6 Feb 2019 19:44:52 +0000 (19:44 +0000)
PR c++/71302 reports that g++ shows poor locations for
-Wzero-as-null-pointer-constant for pointers in function calls,
using the close parenthesis of the call, rather than showing the
pertinent argument.

This particular case was fixed in GCC 8, but regressed on trunk
in r260973.

This patch fixes the regression, and adds column numbers to the
test cases (where they're correct) to avoid regressing them in the
future.  There are still various places where the locations aren't
correct, but fixing them isn't stage 4 material.

gcc/cp/ChangeLog:
PR c++/71302
* call.c (get_location_for_expr_unwinding_for_system_header): New
function.
(conversion_null_warnings): Use it when getting locations for
EXPR, effectively adding a call to
get_location_for_expr_unwinding_for_system_header for
-Wconversion-null and making use of EXPR_LOCATION for
-Wzero-as-null-pointer-constant.

gcc/testsuite/ChangeLog:
PR c++/71302
* g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C: Add expected
column numbers to dg-warning directives where they are correct.
* g++.dg/warn/Wzero-as-null-pointer-constant-5.C: Likewise.
* g++.dg/warn/Wzero-as-null-pointer-constant-7.C: Likewise.
* g++.dg/warn/Wzero-as-null-pointer-constant-8.C: New test.

From-SVN: r268589

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

index 660d746ef7444976345dbaf593d056d1c97f6e4a..ff049b5de80389e18eefd4852bcbcbfd95c6b3f1 100644 (file)
@@ -1,3 +1,14 @@
+2019-02-06  David Malcolm  <dmalcolm@redhat.com>
+
+       PR c++/71302
+       * call.c (get_location_for_expr_unwinding_for_system_header): New
+       function.
+       (conversion_null_warnings): Use it when getting locations for
+       EXPR, effectively adding a call to
+       get_location_for_expr_unwinding_for_system_header for
+       -Wconversion-null and making use of EXPR_LOCATION for
+       -Wzero-as-null-pointer-constant.
+
 2019-02-05  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/89187
index 18b813866c80201070964b536b652293cf699ff0..c12857db1be573a0cbb951f6215df9edab2e4c0b 100644 (file)
@@ -6718,6 +6718,22 @@ build_temp (tree expr, tree type, int flags,
   return expr;
 }
 
+/* Get any location for EXPR, falling back to input_location.
+
+   If the result is in a system header and is the virtual location for
+   a token coming from the expansion of a macro, unwind it to the
+   location of the expansion point of the macro (e.g. to avoid the
+   diagnostic being suppressed for expansions of NULL where "NULL" is
+   in a system header).  */
+
+static location_t
+get_location_for_expr_unwinding_for_system_header (tree expr)
+{
+  location_t loc = EXPR_LOC_OR_LOC (expr, input_location);
+  loc = expansion_point_location_if_in_system_header (loc);
+  return loc;
+}
+
 /* 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.
@@ -6730,8 +6746,7 @@ conversion_null_warnings (tree totype, tree expr, tree fn, int argnum)
   if (null_node_p (expr) && TREE_CODE (totype) != BOOLEAN_TYPE
       && ARITHMETIC_TYPE_P (totype))
     {
-      location_t loc = EXPR_LOC_OR_LOC (expr, input_location);
-      loc = expansion_point_location_if_in_system_header (loc);
+      location_t loc = get_location_for_expr_unwinding_for_system_header (expr);
       if (fn)
        {
          auto_diagnostic_group d;
@@ -6750,7 +6765,7 @@ conversion_null_warnings (tree totype, tree expr, tree fn, int argnum)
   else if (TREE_CODE (TREE_TYPE (expr)) == BOOLEAN_TYPE
           && TYPE_PTR_P (totype))
     {
-      location_t loc = EXPR_LOC_OR_LOC (expr, input_location);
+      location_t loc = get_location_for_expr_unwinding_for_system_header (expr);
       if (fn)
        {
          auto_diagnostic_group d;
@@ -6769,8 +6784,7 @@ conversion_null_warnings (tree totype, tree expr, tree fn, int argnum)
   else if (null_ptr_cst_p (expr) &&
           (TYPE_PTR_OR_PTRMEM_P (totype) || NULLPTR_TYPE_P (totype)))
     {
-      location_t loc =
-       expansion_point_location_if_in_system_header (input_location);
+      location_t loc = get_location_for_expr_unwinding_for_system_header (expr);
       maybe_warn_zero_as_null_pointer_constant (expr, loc);
     }
 }
index 5a000fef16adf353a84142e750d20222a9fa789e..0e6d85e9dd02331a777aab7d0256b36c4e3a739d 100644 (file)
@@ -1,3 +1,12 @@
+2019-02-06  David Malcolm  <dmalcolm@redhat.com>
+
+       PR c++/71302
+       * g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C: Add expected
+       column numbers to dg-warning directives where they are correct.
+       * g++.dg/warn/Wzero-as-null-pointer-constant-5.C: Likewise.
+       * g++.dg/warn/Wzero-as-null-pointer-constant-7.C: Likewise.
+       * g++.dg/warn/Wzero-as-null-pointer-constant-8.C: New test.
+
 2019-02-06  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR debug/87451
index a9dd155475de01c033d88fc410b77afd1945d18f..e280a056381c0b445eee3d6d3e9cc0eae91e9dc9 100644 (file)
@@ -64,16 +64,16 @@ void f()
   if (!p)
     ;
 
-  if (pmf == 0)         // { dg-warning "zero as null pointer" }
+  if (pmf == 0)         // { dg-warning "14: zero as null pointer" }
     ;
   
-  if (pdm == 0)         // { dg-warning "zero as null pointer" }
+  if (pdm == 0)         // { dg-warning "14: zero as null pointer" }
     ;
 
-  if (pf == 0)          // { dg-warning "zero as null pointer" }
+  if (pf == 0)          // { dg-warning "13: zero as null pointer" }
     ;
 
-  if (p == 0)           // { dg-warning "zero as null pointer" }
+  if (p == 0)           // { dg-warning "12: zero as null pointer" }
     ;
 
   if (0 == pmf)         // { dg-warning "zero as null pointer" }
index d0f62b212ec5de6738c6de0e91120caef16f54d9..5047a617225239f63b05aabd507de11eee0a8765 100644 (file)
@@ -13,18 +13,18 @@ int*        ps;
 
 void f()
 {
-  pointmemfun pmf(0);   // { dg-warning "zero as null pointer" }
-  pointdmem   pdm(0);   // { dg-warning "zero as null pointer" }
-  pointfun    pf(0);    // { dg-warning "zero as null pointer" }
-  int*        p(0);     // { dg-warning "zero as null pointer" }
+  pointmemfun pmf(0);   // { dg-warning "19: zero as null pointer" }
+  pointdmem   pdm(0);   // { dg-warning "19: zero as null pointer" }
+  pointfun    pf(0);    // { dg-warning "18: zero as null pointer" }
+  int*        p(0);     // { dg-warning "17: zero as null pointer" }
 
-  pmf = 0;              // { dg-warning "zero as null pointer" }
+  pmf = 0;              // { dg-warning "9: zero as null pointer" }
 
-  pdm = 0;              // { dg-warning "zero as null pointer" }
+  pdm = 0;              // { dg-warning "9: zero as null pointer" }
 
-  pf = 0;               // { dg-warning "zero as null pointer" }
+  pf = 0;               // { dg-warning "8: zero as null pointer" }
 
-  p = 0;                // { dg-warning "zero as null pointer" }
+  p = 0;                // { dg-warning "7: zero as null pointer" }
 
   if (pmf)
     ;
@@ -50,22 +50,22 @@ void f()
   if (!p)
     ;
 
-  if (pmf == 0)         // { dg-warning "zero as null pointer" }
+  if (pmf == 0)         // { dg-warning "14: zero as null pointer" }
     ;
   
-  if (pdm == 0)         // { dg-warning "zero as null pointer" }
+  if (pdm == 0)         // { dg-warning "14: zero as null pointer" }
     ;
 
-  if (pf == 0)          // { dg-warning "zero as null pointer" }
+  if (pf == 0)          // { dg-warning "13: zero as null pointer" }
     ;
 
-  if (p == 0)           // { dg-warning "zero as null pointer" }
+  if (p == 0)           // { dg-warning "12: zero as null pointer" }
     ;
 
-  if (0 == pmf)         // { dg-warning "zero as null pointer" }
+  if (0 == pmf)         // { dg-warning "12: zero as null pointer" }
     ;
   
-  if (0 == pdm)         // { dg-warning "zero as null pointer" }
+  if (0 == pdm)         // { dg-warning "12: zero as null pointer" }
     ;
 
   if (0 == pf)          // { dg-warning "zero as null pointer" }
@@ -74,16 +74,16 @@ void f()
   if (0 == p)           // { dg-warning "zero as null pointer" }
     ;
 
-  if (pmf != 0)         // { dg-warning "zero as null pointer" }
+  if (pmf != 0)         // { dg-warning "14: zero as null pointer" }
     ;
   
-  if (pdm != 0)         // { dg-warning "zero as null pointer" }
+  if (pdm != 0)         // { dg-warning "14: zero as null pointer" }
     ;
 
-  if (pf != 0)          // { dg-warning "zero as null pointer" }
+  if (pf != 0)          // { dg-warning "13: zero as null pointer" }
     ;
 
-  if (p != 0)           // { dg-warning "zero as null pointer" }
+  if (p != 0)           // { dg-warning "12: zero as null pointer" }
     ;
 
   if (0 != pmf)         // { dg-warning "zero as null pointer" }
index 4269beda28a8ac764a52e9083bd3d1577c2fe94f..01662f539a039318e955e76893fdfe0b4d72c7f7 100644 (file)
@@ -3,7 +3,7 @@
 
 struct foo
 {
-  foo(void* a = 0) {};      // { dg-warning "zero as null pointer" }
+  foo(void* a = 0) {};      // { dg-warning "17: zero as null pointer" }
 };
 
 void* fun(void* a = 0) {};  // { dg-warning "zero as null pointer" }
index 0d06dbf0ec74bd506d64f7b966d01b509e777634..571a4cf4c83f68ce2e0ea3147bafe34eab81dd0f 100644 (file)
@@ -8,6 +8,6 @@ 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" }
+  char* x4(0); // { dg-warning "12: zero as null pointer" }
+  char* x5 = 0; // { dg-warning "14: zero as null pointer" }
 }
diff --git a/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-8.C b/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-8.C
new file mode 100644 (file)
index 0000000..18257f1
--- /dev/null
@@ -0,0 +1,47 @@
+// PR c++/71302
+// { dg-options "-Wzero-as-null-pointer-constant -fdiagnostics-show-caret" }
+
+#include <cstddef>
+
+static void
+callee_1 (int param1, const char* param2, int param3) {}
+
+void
+test_1 (int param1, const char* param2, int param3)
+{
+  callee_1 (0, 0, 0); // { dg-warning "16: zero as null pointer constant" }
+  /* { dg-begin-multiline-output "" }
+   callee_1 (0, 0, 0);
+                ^
+     { dg-end-multiline-output "" } */
+
+  callee_1 (0, NULL, 0);
+}
+
+template <typename T>
+void
+callee_2 (int param1, T* param2, int param3) {}
+
+void
+test_2 (int param1, const char* param2, int param3)
+{
+  callee_2<const char*> (0, 0, 0); // { dg-warning "29: zero as null pointer constant" }
+  /* { dg-begin-multiline-output "" }
+   callee_2<const char*> (0, 0, 0);
+                             ^
+     { dg-end-multiline-output "" } */
+
+  callee_2<const char*> (0, NULL, 0);
+}
+
+void
+test_3 ()
+{
+  const char *msg_a = 0; // { dg-warning "23: zero as null pointer constant" }
+  /* { dg-begin-multiline-output "" }
+   const char *msg_a = 0;
+                       ^
+     { dg-end-multiline-output "" } */
+
+  const char *msg_b = NULL;
+}