tree: introduce range adaptor for TREE_VEC
commit25addf8352e590fab926e9d16c2cd4a7ea0963b9
authorPatrick Palka <ppalka@redhat.com>
Wed, 11 May 2022 20:14:59 +0000 (11 16:14 -0400)
committerPatrick Palka <ppalka@redhat.com>
Wed, 11 May 2022 20:14:59 +0000 (11 16:14 -0400)
treec7bfc1219fe51540c69b99c3ed97bcf9c4673e19
parent88459c3965e2a2f62ab4d4c8b2ac8460b1a15c33
tree: introduce range adaptor for TREE_VEC

This patch implements a simple tree wrapper, named tree_vec_range, which
lets us idiomatically loop over all the elements of a TREE_VEC using a
C++11 range-based for loop:

  // v is a TREE_VEC
  for (tree e : tree_vec_range (v))
    ...

This is similar to the existing tree-based range adaptors ovl_range and
lkp_range added to the C++ FE in r12-340-g3307b9a07a3c51.

This patch also converts some existing loops over TREE_VEC within the
C++ FE to use tree_vec_range / range-for.

gcc/cp/ChangeLog:

* constraint.cc (tsubst_parameter_mapping): Convert loop over
TREE_VEC into a range-based for loop using tree_vec_range.
* pt.cc (iterative_hash_template_arg): Likewise.
(template_parms_level_to_args): Likewise.
(deducible_template_args): Likewise.
(check_undeduced_parms): Likewise.
(dependent_type_p_r): Likewise.
(value_dependent_expression_p) <case NONTYPE_ARGUMENT_PACK>:
Likewise.
(dependent_template_arg_p): Likewise.
* tree.cc (cp_walk_subtrees) <case NONTYPE_ARGUMENT_PACK>:
Likewise.

gcc/ChangeLog:

* tree.h (TREE_VEC_BEGIN): Define.
(TREE_VEC_END): Correct 'length' member access.
(class tree_vec_range): Define.
gcc/cp/constraint.cc
gcc/cp/pt.cc
gcc/cp/tree.cc
gcc/tree.h