The calling interface for check_function_arguments requires the caller
to extract TYPE_ATTRIBUTES and TYPE_ARG_TYPES prior to calling it. This
is somewhat silly, as well as being incompatible with an eventual
removal of TYPE_ARG_TYPES. The patch below changes things to pass the
FUNCTION_TYPE itself into check_function_arguments, wherein it extracts
TYPE_ATTRIBUTES and iterates over the argument types as necessary.
Tested on x86_64-unknown-linux-gnu. OK to commit? (The approval is for
the c-family bits; I think the C/C++ bits are obvious once that's
approved.)
-Nathan
gcc/
* c-typeck.c (build_function_call_vec): Tweak call to
check_function_arguments.
gcc/c-family/
* c-common.h (check_function_arguments): Tweak prototype of
check_function_arguments.
* c-common.c (check_function_arguments): Likewise. Adjust
calls to check_function_nonnull, check_function_format, and
check_function_sentinel.
(check_function_sentinel): Take a FUNCTION_TYPE rather than
separate attributes and typelist arguments. Use
FOREACH_FUNCTION_ARGS to iterate over argument types.
gcc/cp/
* call.c (build_over_call): Tweak call to check_function_arguments.
* typeck.c (cp_build_function_call_vec): Likewise.
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 8fc68eb..fef8ded 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -7479,20 +7479,23 @@ check_function_nonnull (tree attrs, int nargs, tree
*argarray)
array ARGARRAY. */
static void
-check_function_sentinel (tree attrs, int nargs, tree *argarray, tree typelist)
+check_function_sentinel (const_tree fntype, int nargs, tree *argarray)
{
- tree attr = lookup_attribute (sentinel, attrs);
+ tree attr = lookup_attribute (sentinel, TYPE_ATTRIBUTES (fntype));
if (attr)
{
int len = 0;
int pos = 0;
tree sentinel;
+ function_args_iterator iter;
+ tree t;
/* Skip over the named arguments. */
- while (typelist len nargs)
+ FOREACH_FUNCTION_ARGS (fntype, t, iter)
{
- typelist = TREE_CHAIN (typelist);
+ if (len == nargs)
+ break;
len++;
}
@@ -7937,26 +7940,24 @@ handle_no_split_stack_attribute (tree *node, tree name,
return NULL_TREE;
}
-/* Check for valid arguments being passed to a function.
- ATTRS is a list of attributes. There are NARGS arguments in the array
- ARGARRAY. TYPELIST is the list of argument types for the function.
- */
+/* Check for valid arguments being passed to a function with FNTYPE.
+ There are NARGS arguments in the array ARGARRAY. */
void
-check_function_arguments (tree attrs, int nargs, tree *argarray, tree typelist)
+check_function_arguments (const_tree fntype, int nargs, tree *argarray)
{
/* 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. */
if (warn_nonnull)
-check_function_nonnull (attrs, nargs, argarray);
+check_function_nonnull (TYPE_ATTRIBUTES (fntype), nargs, argarray);
/* Check for errors in format strings. */
if (warn_format || warn_missing_format_attribute)
-check_function_format (attrs, nargs, argarray);
+check_function_format (TYPE_ATTRIBUTES (fntype), nargs, argarray);
if (warn_format)
-check_function_sentinel (attrs, nargs, argarray, typelist);
+check_function_sentinel (fntype, nargs, argarray);
}
/* Generic argument checking recursion routine. PARAM is the argument to
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index 7136b01..89d4b80 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -687,7 +687,7 @@ extern void finish_fname_decls (void);
extern const char *fname_as_string (int);
extern tree fname_decl (location_t, unsigned, tree);
-extern void check_function_arguments (tree, int, tree *, tree);
+extern void check_function_arguments (const_tree, int, tree *);
extern void check_function_arguments_recurse (void (*)
(void *, tree,
unsigned HOST_WIDE_INT),
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index 6016db2..e609611 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -2808,8 +2808,7 @@ build_function_call_vec (location_t loc, tree function,
VEC(tree,gc) *params,
return error_mark_node;
/* Check that the arguments to the function are valid. */
- check_function_arguments (TYPE_ATTRIBUTES (fntype), nargs, argarray,
- TYPE_ARG_TYPES (fntype));
+ check_function_arguments (fntype, nargs, argarray);
if (name != NULL_TREE
!strncmp (IDENTIFIER_POINTER (name), __builtin_, 10))
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 09ad4ae..972dca3 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -6477,8 +6477,7 @@ build_over_call (struct z_candidate *cand, int