return iterative_hash_object (IDENTIFIER_HASH_VALUE (arg), val);
case TREE_VEC:
- for (int i = 0, len = TREE_VEC_LENGTH (arg); i < len; ++i)
- val = iterative_hash_template_arg (TREE_VEC_ELT (arg, i), val);
+ for (tree elt : tree_vec_range (arg))
+ val = iterative_hash_template_arg (elt, val);
return val;
case TYPE_PACK_EXPANSION:
tree
template_parms_level_to_args (tree parms)
{
- tree a = copy_node (parms);
- TREE_TYPE (a) = NULL_TREE;
- for (int i = TREE_VEC_LENGTH (a) - 1; i >= 0; --i)
- TREE_VEC_ELT (a, i) = template_parm_to_arg (TREE_VEC_ELT (a, i));
+ parms = copy_node (parms);
+ TREE_TYPE (parms) = NULL_TREE;
+ for (tree& parm : tree_vec_range (parms))
+ parm = template_parm_to_arg (parm);
if (CHECKING_P)
- SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (a, TREE_VEC_LENGTH (a));
+ SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (parms, TREE_VEC_LENGTH (parms));
- return a;
+ return parms;
}
/* Given a set of template parameters, return them as a set of template
static bool
deducible_template_args (tree args)
{
- for (int i = 0; i < TREE_VEC_LENGTH (args); ++i)
+ for (tree elt : tree_vec_range (args))
{
bool deducible;
- tree elt = TREE_VEC_ELT (args, i);
if (ARGUMENT_PACK_P (elt))
deducible = deducible_template_args (ARGUMENT_PACK_ARGS (elt));
else
check_undeduced_parms (tree targs, tree args, tree end)
{
bool found = false;
- int i;
- for (i = TREE_VEC_LENGTH (targs) - 1; i >= 0; --i)
- if (TREE_VEC_ELT (targs, i) == NULL_TREE)
+ for (tree& targ : tree_vec_range (targs))
+ if (targ == NULL_TREE)
{
found = true;
- TREE_VEC_ELT (targs, i) = error_mark_node;
+ targ = error_mark_node;
}
if (found)
{
if (TREE_CODE (type) == TYPE_ARGUMENT_PACK)
{
tree args = ARGUMENT_PACK_ARGS (type);
- int i, len = TREE_VEC_LENGTH (args);
- for (i = 0; i < len; ++i)
- if (dependent_template_arg_p (TREE_VEC_ELT (args, i)))
- return true;
+ for (tree arg : tree_vec_range (args))
+ if (dependent_template_arg_p (arg))
+ return true;
}
/* All TYPE_PACK_EXPANSIONs are dependent, because parameter packs must
case NONTYPE_ARGUMENT_PACK:
/* A NONTYPE_ARGUMENT_PACK is value-dependent if any packed argument
is value-dependent. */
- {
- tree values = ARGUMENT_PACK_ARGS (expression);
- int i, len = TREE_VEC_LENGTH (values);
-
- for (i = 0; i < len; ++i)
- if (value_dependent_expression_p (TREE_VEC_ELT (values, i)))
- return true;
-
- return false;
- }
+ for (tree arg : tree_vec_range (ARGUMENT_PACK_ARGS (expression)))
+ if (value_dependent_expression_p (arg))
+ return true;
+ return false;
case TRAIT_EXPR:
{
else if (ARGUMENT_PACK_P (arg))
{
tree args = ARGUMENT_PACK_ARGS (arg);
- int i, len = TREE_VEC_LENGTH (args);
- for (i = 0; i < len; ++i)
- {
- if (dependent_template_arg_p (TREE_VEC_ELT (args, i)))
- return true;
- }
-
+ for (tree arg : tree_vec_range (args))
+ if (dependent_template_arg_p (arg))
+ return true;
return false;
}
else if (TYPE_P (arg))
/* In a TREE_VEC node. */
#define TREE_VEC_LENGTH(NODE) (TREE_VEC_CHECK (NODE)->base.u.length)
+#define TREE_VEC_BEGIN(NODE) (&TREE_VEC_CHECK (NODE)->vec.a[0])
#define TREE_VEC_END(NODE) \
- ((void) TREE_VEC_CHECK (NODE), &((NODE)->vec.a[(NODE)->vec.base.u.length]))
+ ((void) TREE_VEC_CHECK (NODE), &((NODE)->vec.a[(NODE)->base.u.length]))
#define TREE_VEC_ELT(NODE,I) TREE_VEC_ELT_CHECK (NODE, I)
extern tree grow_tree_vec (tree v, int CXX_MEM_STAT_INFO);
+/* Treat a TREE_VEC as a range of trees, e.g.
+ for (tree e : tree_vec_range (v)) { ... } */
+
+class tree_vec_range
+{
+ tree v;
+public:
+ tree_vec_range(tree v) : v(v) { }
+ tree *begin() { return TREE_VEC_BEGIN (v); }
+ tree *end() { return TREE_VEC_END (v); }
+};
+
/* Construct various types of nodes. */
extern tree build_nt (enum tree_code, ...);