+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
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.
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;
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;
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);
}
}
+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
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" }
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)
;
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" }
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" }
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" }
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" }
}
--- /dev/null
+// 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;
+}