Commit 3342fd71 by Bernd Schmidt Committed by Bernd Schmidt

Improve warning locations (PR66208)

	PR c/66208
	* c-common.c (check_function_nonnull): Remove unnecessary declaration.
	Add new arg loc and pass it down as context.
	(check_nonnull_arg): Don't mark ctx arg as unused. Use it as a pointer
	to the location to use for the warning.
	(check_function_arguments): New arg loc.  All callers changed.  Pass
	it to check_function_nonnull.
	* c-common.h (check_function_arguments): Adjust declaration.

testsuite/
	PR c/66208
	* c-c++-common/pr66208.c: New file.

From-SVN: r232345
parent 2ad3adf1
2016-01-13 Bernd Schmidt <bschmidt@redhat.com>
PR c/66208
* c-common.c (check_function_nonnull): Remove unnecessary declaration.
Add new arg loc and pass it down as context.
(check_nonnull_arg): Don't mark ctx arg as unused. Use it as a pointer
to the location to use for the warning.
(check_function_arguments): New arg loc. All callers changed. Pass
it to check_function_nonnull.
* c-common.h (check_function_arguments): Adjust declaration.
2016-01-13 Jakub Jelinek <jakub@redhat.com> 2016-01-13 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/69156 PR tree-optimization/69156
......
...@@ -394,7 +394,6 @@ static tree handle_bnd_variable_size_attribute (tree *, tree, tree, int, bool *) ...@@ -394,7 +394,6 @@ static tree handle_bnd_variable_size_attribute (tree *, tree, tree, int, bool *)
static tree handle_bnd_legacy (tree *, tree, tree, int, bool *); static tree handle_bnd_legacy (tree *, tree, tree, int, bool *);
static tree handle_bnd_instrument (tree *, tree, tree, int, bool *); static tree handle_bnd_instrument (tree *, tree, tree, int, bool *);
static void check_function_nonnull (tree, int, tree *);
static void check_nonnull_arg (void *, tree, unsigned HOST_WIDE_INT); static void check_nonnull_arg (void *, tree, unsigned HOST_WIDE_INT);
static bool nonnull_check_p (tree, unsigned HOST_WIDE_INT); static bool nonnull_check_p (tree, unsigned HOST_WIDE_INT);
static bool get_nonnull_operand (tree, unsigned HOST_WIDE_INT *); static bool get_nonnull_operand (tree, unsigned HOST_WIDE_INT *);
...@@ -9097,11 +9096,10 @@ handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name), ...@@ -9097,11 +9096,10 @@ handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name),
/* Check the argument list of a function call for null in argument slots /* Check the argument list of a function call for null in argument slots
that are marked as requiring a non-null pointer argument. The NARGS that are marked as requiring a non-null pointer argument. The NARGS
arguments are passed in the array ARGARRAY. arguments are passed in the array ARGARRAY. */
*/
static void static void
check_function_nonnull (tree attrs, int nargs, tree *argarray) check_function_nonnull (location_t loc, tree attrs, int nargs, tree *argarray)
{ {
tree a; tree a;
int i; int i;
...@@ -9121,7 +9119,7 @@ check_function_nonnull (tree attrs, int nargs, tree *argarray) ...@@ -9121,7 +9119,7 @@ check_function_nonnull (tree attrs, int nargs, tree *argarray)
if (a != NULL_TREE) if (a != NULL_TREE)
for (i = 0; i < nargs; i++) for (i = 0; i < nargs; i++)
check_function_arguments_recurse (check_nonnull_arg, NULL, argarray[i], check_function_arguments_recurse (check_nonnull_arg, &loc, argarray[i],
i + 1); i + 1);
else else
{ {
...@@ -9137,7 +9135,7 @@ check_function_nonnull (tree attrs, int nargs, tree *argarray) ...@@ -9137,7 +9135,7 @@ check_function_nonnull (tree attrs, int nargs, tree *argarray)
} }
if (a != NULL_TREE) if (a != NULL_TREE)
check_function_arguments_recurse (check_nonnull_arg, NULL, check_function_arguments_recurse (check_nonnull_arg, &loc,
argarray[i], i + 1); argarray[i], i + 1);
} }
} }
...@@ -9223,9 +9221,10 @@ nonnull_check_p (tree args, unsigned HOST_WIDE_INT param_num) ...@@ -9223,9 +9221,10 @@ nonnull_check_p (tree args, unsigned HOST_WIDE_INT param_num)
via check_function_arguments_recurse. */ via check_function_arguments_recurse. */
static void static void
check_nonnull_arg (void * ARG_UNUSED (ctx), tree param, check_nonnull_arg (void *ctx, tree param, unsigned HOST_WIDE_INT param_num)
unsigned HOST_WIDE_INT param_num)
{ {
location_t *ploc = (location_t *) ctx;
/* Just skip checking the argument if it's not a pointer. This can /* Just skip checking the argument if it's not a pointer. This can
happen if the "nonnull" attribute was given without an operand happen if the "nonnull" attribute was given without an operand
list (which means to check every pointer argument). */ list (which means to check every pointer argument). */
...@@ -9234,8 +9233,8 @@ check_nonnull_arg (void * ARG_UNUSED (ctx), tree param, ...@@ -9234,8 +9233,8 @@ check_nonnull_arg (void * ARG_UNUSED (ctx), tree param,
return; return;
if (integer_zerop (param)) if (integer_zerop (param))
warning (OPT_Wnonnull, "null argument where non-null required " warning_at (*ploc, OPT_Wnonnull, "null argument where non-null required "
"(argument %lu)", (unsigned long) param_num); "(argument %lu)", (unsigned long) param_num);
} }
/* Helper for nonnull attribute handling; fetch the operand number /* Helper for nonnull attribute handling; fetch the operand number
...@@ -9678,15 +9677,17 @@ handle_designated_init_attribute (tree *node, tree name, tree, int, ...@@ -9678,15 +9677,17 @@ handle_designated_init_attribute (tree *node, tree name, tree, int,
/* Check for valid arguments being passed to a function with FNTYPE. /* Check for valid arguments being passed to a function with FNTYPE.
There are NARGS arguments in the array ARGARRAY. */ There are NARGS arguments in the array ARGARRAY. LOC should be used for
diagnostics. */
void void
check_function_arguments (const_tree fntype, int nargs, tree *argarray) check_function_arguments (location_t loc, const_tree fntype, int nargs,
tree *argarray)
{ {
/* Check for null being passed in a pointer argument that must be /* Check for null being passed in a pointer argument that must be
non-null. We also need to do this if format checking is enabled. */ non-null. We also need to do this if format checking is enabled. */
if (warn_nonnull) if (warn_nonnull)
check_function_nonnull (TYPE_ATTRIBUTES (fntype), nargs, argarray); check_function_nonnull (loc, TYPE_ATTRIBUTES (fntype), nargs, argarray);
/* Check for errors in format strings. */ /* Check for errors in format strings. */
......
...@@ -782,7 +782,7 @@ extern const char *fname_as_string (int); ...@@ -782,7 +782,7 @@ extern const char *fname_as_string (int);
extern tree fname_decl (location_t, unsigned, tree); extern tree fname_decl (location_t, unsigned, tree);
extern int check_user_alignment (const_tree, bool); extern int check_user_alignment (const_tree, bool);
extern void check_function_arguments (const_tree, int, tree *); extern void check_function_arguments (location_t loc, const_tree, int, tree *);
extern void check_function_arguments_recurse (void (*) extern void check_function_arguments_recurse (void (*)
(void *, tree, (void *, tree,
unsigned HOST_WIDE_INT), unsigned HOST_WIDE_INT),
......
...@@ -3048,7 +3048,7 @@ build_function_call_vec (location_t loc, vec<location_t> arg_loc, ...@@ -3048,7 +3048,7 @@ build_function_call_vec (location_t loc, vec<location_t> arg_loc,
return error_mark_node; return error_mark_node;
/* Check that the arguments to the function are valid. */ /* Check that the arguments to the function are valid. */
check_function_arguments (fntype, nargs, argarray); check_function_arguments (loc, fntype, nargs, argarray);
if (name != NULL_TREE if (name != NULL_TREE
&& !strncmp (IDENTIFIER_POINTER (name), "__builtin_", 10)) && !strncmp (IDENTIFIER_POINTER (name), "__builtin_", 10))
......
...@@ -7536,7 +7536,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) ...@@ -7536,7 +7536,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
for (j = 0; j < nargs; j++) for (j = 0; j < nargs; j++)
fargs[j] = maybe_constant_value (argarray[j]); fargs[j] = maybe_constant_value (argarray[j]);
check_function_arguments (TREE_TYPE (fn), nargs, fargs); check_function_arguments (input_location, TREE_TYPE (fn), nargs, fargs);
} }
/* Avoid actually calling copy constructors and copy assignment operators, /* Avoid actually calling copy constructors and copy assignment operators,
......
...@@ -3598,7 +3598,7 @@ cp_build_function_call_vec (tree function, vec<tree, va_gc> **params, ...@@ -3598,7 +3598,7 @@ cp_build_function_call_vec (tree function, vec<tree, va_gc> **params,
/* Check for errors in format strings and inappropriately /* Check for errors in format strings and inappropriately
null parameters. */ null parameters. */
check_function_arguments (fntype, nargs, argarray); check_function_arguments (input_location, fntype, nargs, argarray);
ret = build_cxx_call (function, nargs, argarray, complain); ret = build_cxx_call (function, nargs, argarray, complain);
......
2016-01-13 Bernd Schmidt <bschmidt@redhat.com>
PR c/66208
* c-c++-common/pr66208.c: New file.
2016-01-13 Jakub Jelinek <jakub@redhat.com> 2016-01-13 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/69156 PR tree-optimization/69156
......
/* { dg-do compile } */
/* { dg-options "-Wnonnull" } */
void foox (char*, ...) __attribute__ ((nonnull (1)));
#define foo(p) foox (p, "p is null") /* { dg-warning "null argument" } */
void baz (void)
{
foo (0); /* { dg-message "note: in expansion" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment