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