Patchwork don't use TYPE_ARG_TYPES in the Ada FE

login
register
mail settings
Submitter Nathan Froyd
Date May 4, 2011, 3:54 a.m.
Message ID <20110504035434.GE23480@codesourcery.com>
Download mbox | patch
Permalink /patch/93969/
State New
Headers show

Comments

Nathan Froyd - May 4, 2011, 3:54 a.m.
As $SUBJECT suggests; the patch makes the Ada FE use iterators instead.

Tested on x86_64-unknown-linux-gnu.  OK to commit?

-Nathan

	* gcc-interface/decl.c (intrin_arglists_compatible_p): Use iterators
	instead of accessing TYPE_ARG_TYPES directly.
	* gcc-interface/utils.c (handle_nonnull_attribute): Likewise.
Eric Botcazou - May 4, 2011, 7:26 a.m.
> 	* gcc-interface/decl.c (intrin_arglists_compatible_p): Use iterators
> 	instead of accessing TYPE_ARG_TYPES directly.
> 	* gcc-interface/utils.c (handle_nonnull_attribute): Likewise.

Probably fine, but please patch the C front-end first.  I'm afraid that the 
coverage of this part of the gigi code by the Ada testsuite is zero and the 
second chunk is a copy of the equivalent C code.

Patch

diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index 14929b8..2a55940 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -8331,23 +8331,27 @@  intrin_types_incompatible_p (tree t1, tree t2)
 static bool
 intrin_arglists_compatible_p (intrin_binding_t * inb)
 {
-  tree ada_args = TYPE_ARG_TYPES (inb->ada_fntype);
-  tree btin_args = TYPE_ARG_TYPES (inb->btin_fntype);
+  function_args_iterator ada_iter, btin_iter;
+
+  function_args_iter_init (&ada_iter, inb->ada_fntype);
+  function_args_iter_init (&btin_iter, inb->btin_fntype);
 
   /* Sequence position of the last argument we checked.  */
   int argpos = 0;
 
-  while (ada_args != 0 || btin_args != 0)
+  while (1)
     {
-      tree ada_type, btin_type;
+      tree ada_type = function_args_iter_cond (&ada_iter);
+      tree btin_type = function_args_iter_cond (&btin_iter);
+
+      /* If we've exhausted both lists simultaneously, we're done.  */
+      if (ada_type == NULL_TREE && btin_type == NULL_TREE)
+	break;
 
       /* If one list is shorter than the other, they fail to match.  */
-      if (ada_args == 0 || btin_args == 0)
+      if (ada_type == NULL_TREE || btin_type == NULL_TREE)
 	return false;
 
-      ada_type = TREE_VALUE (ada_args);
-      btin_type = TREE_VALUE (btin_args);
-
       /* If we're done with the Ada args and not with the internal builtin
 	 args, or the other way around, complain.  */
       if (ada_type == void_type_node
@@ -8374,8 +8378,9 @@  intrin_arglists_compatible_p (intrin_binding_t * inb)
 	  return false;
 	}
 
-      ada_args = TREE_CHAIN (ada_args);
-      btin_args = TREE_CHAIN (btin_args);
+      
+      function_args_iter_next (&ada_iter);
+      function_args_iter_next (&btin_iter);
     }
 
   return true;
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 2e81c18..2b29748 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -5219,7 +5219,6 @@  handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name),
      a pointer argument.  */
   for (attr_arg_num = 1; args; args = TREE_CHAIN (args))
     {
-      tree argument;
       unsigned HOST_WIDE_INT arg_num = 0, ck_num;
 
       if (!get_nonnull_operand (TREE_VALUE (args), &arg_num))
@@ -5230,18 +5229,21 @@  handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name),
 	  return NULL_TREE;
 	}
 
-      argument = TYPE_ARG_TYPES (type);
-      if (argument)
+      if (prototype_p (type))
 	{
-	  for (ck_num = 1; ; ck_num++)
+	  function_args_iterator iter;
+	  tree argument;
+
+	  function_args_iter_init (&iter, type);
+	  for (ck_num = 1; ; ck_num++, function_args_iter_next (&iter))
 	    {
+	      argument = function_args_iter_cond (&iter);
 	      if (!argument || ck_num == arg_num)
 		break;
-	      argument = TREE_CHAIN (argument);
 	    }
 
 	  if (!argument
-	      || TREE_CODE (TREE_VALUE (argument)) == VOID_TYPE)
+	      || TREE_CODE (argument) == VOID_TYPE)
 	    {
 	      error ("nonnull argument with out-of-range operand number "
 		     "(argument %lu, operand %lu)",
@@ -5250,7 +5252,7 @@  handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name),
 	      return NULL_TREE;
 	    }
 
-	  if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE)
+	  if (TREE_CODE (argument) != POINTER_TYPE)
 	    {
 	      error ("nonnull argument references non-pointer operand "
 		     "(argument %lu, operand %lu)",