From aa9dc19314914cb0a59493fa97d34a5881759d0e Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Wed, 6 Feb 2019 19:44:52 +0000 Subject: [PATCH] Fix locations in conversion_null_warnings (PR c++/71302) 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 | 11 +++++ gcc/cp/call.c | 24 ++++++++-- gcc/testsuite/ChangeLog | 9 ++++ .../cpp0x/Wzero-as-null-pointer-constant-1.C | 8 ++-- .../warn/Wzero-as-null-pointer-constant-1.C | 36 +++++++------- .../warn/Wzero-as-null-pointer-constant-5.C | 2 +- .../warn/Wzero-as-null-pointer-constant-7.C | 4 +- .../warn/Wzero-as-null-pointer-constant-8.C | 47 +++++++++++++++++++ 8 files changed, 111 insertions(+), 30 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 660d746ef74..ff049b5de80 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2019-02-06 David Malcolm + + 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 PR c++/89187 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 18b813866c8..c12857db1be 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5a000fef16a..0e6d85e9dd0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2019-02-06 David Malcolm + + 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 PR debug/87451 diff --git a/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C b/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C index a9dd155475d..e280a056381 100644 --- a/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C +++ b/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C @@ -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" } diff --git a/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-1.C b/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-1.C index d0f62b212ec..5047a617225 100644 --- a/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-1.C +++ b/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-1.C @@ -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" } diff --git a/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-5.C b/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-5.C index 4269beda28a..01662f539a0 100644 --- a/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-5.C +++ b/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-5.C @@ -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" } 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 index 0d06dbf0ec7..571a4cf4c83 100644 --- 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 @@ -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 index 00000000000..18257f12bbd --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wzero-as-null-pointer-constant-8.C @@ -0,0 +1,47 @@ +// PR c++/71302 +// { dg-options "-Wzero-as-null-pointer-constant -fdiagnostics-show-caret" } + +#include + +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 +void +callee_2 (int param1, T* param2, int param3) {} + +void +test_2 (int param1, const char* param2, int param3) +{ + callee_2 (0, 0, 0); // { dg-warning "29: zero as null pointer constant" } + /* { dg-begin-multiline-output "" } + callee_2 (0, 0, 0); + ^ + { dg-end-multiline-output "" } */ + + callee_2 (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; +} -- 2.30.2