@@ -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);
}
}
@@ -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" }
@@ -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" }
@@ -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" }
@@ -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" }
}
new file mode 100644
@@ -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;
+}