Patchwork don't use TYPE_ARG_TYPES when calling c-family:check_function_arguments

login
register
mail settings
Submitter Nathan Froyd
Date May 21, 2011, 12:03 p.m.
Message ID <20110521120348.GA15909@nightcrawler>
Download mbox | patch
Permalink /patch/96694/
State New
Headers show

Comments

Nathan Froyd - May 21, 2011, 12:03 p.m.
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.
Joseph S. Myers - May 21, 2011, 4:17 p.m.
On Sat, 21 May 2011, Nathan Froyd wrote:

> 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.

The C and C family changes are OK.

Patch

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 flags, tsubst_flags_t complain)
   gcc_assert (j <= nargs);
   nargs = j;
 
-  check_function_arguments (TYPE_ATTRIBUTES (TREE_TYPE (fn)),
-			    nargs, argarray, TYPE_ARG_TYPES (TREE_TYPE (fn)));
+  check_function_arguments (TREE_TYPE (fn), nargs, argarray);
 
   /* Avoid actually calling copy constructors and copy assignment operators,
      if possible.  */
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index d98c62b..4642e08 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -3266,8 +3266,7 @@  cp_build_function_call_vec (tree function, VEC(tree,gc) **params,
 
   /* Check for errors in format strings and inappropriately
      null parameters.  */
-  check_function_arguments (TYPE_ATTRIBUTES (fntype), nargs, argarray,
-			    parm_types);
+  check_function_arguments (fntype, nargs, argarray);
 
   ret = build_cxx_call (function, nargs, argarray);