don't use TYPE_ARG_TYPES in the Ada frontend
authorNathan Froyd <froydnj@codesourcery.com>
Fri, 6 May 2011 01:39:32 +0000 (01:39 +0000)
committerNathan Froyd <froydnj@gcc.gnu.org>
Fri, 6 May 2011 01:39:32 +0000 (01:39 +0000)
don't use TYPE_ARG_TYPES in the Ada frontend
* 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.

From-SVN: r173466

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c
gcc/ada/gcc-interface/utils.c

index dbc06473ebb518be62483306545a9d529b171ec6..922460c27c3b23e89d57eb8ae74a413db57a356e 100644 (file)
@@ -1,3 +1,9 @@
+2011-05-05  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * 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.
+
 2011-05-05  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR ada/48844
index b5406e9c9b84d843bde59c2136f8079cb36b266c..e014d04352624bc4ac881afbcc6a1d05b7520db0 100644 (file)
@@ -8330,23 +8330,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
@@ -8373,8 +8377,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;
index 57a62ab9bb6b530675130bffe604081824ba44f0..1703a8b89a8b877563c63340d104b31fbd2884d8 100644 (file)
@@ -5210,7 +5210,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))
@@ -5221,18 +5220,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)",
@@ -5241,7 +5243,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)",