public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jason Merrill <jason@redhat.com>
To: gcc-patches@gcc.gnu.org
Subject: Re: [PATCH RFA] tree-iterator: C++11 range-for and tree_stmt_iterator
Date: Thu, 13 May 2021 15:26:59 -0400	[thread overview]
Message-ID: <dbd0241a-6a4e-b385-fbb1-6078573b92ba@redhat.com> (raw)
In-Reply-To: <20210501162901.3164931-1-jason@redhat.com>

Ping.

On 5/1/21 12:29 PM, Jason Merrill wrote:
> Like my recent patch to add ovl_range and lkp_range in the C++ front end,
> this patch adds the tsi_range adaptor for using C++11 range-based 'for' with
> a STATEMENT_LIST, e.g.
> 
>    for (tree stmt : tsi_range (stmt_list)) { ... }
> 
> This also involves adding some operators to tree_stmt_iterator that are
> needed for range-for iterators, and should also be useful in code that uses
> the iterators directly.
> 
> The patch updates the suitable loops in the C++ front end, but does not
> touch any loops elsewhere in the compiler.
> 
> gcc/ChangeLog:
> 
> 	* tree-iterator.h (struct tree_stmt_iterator): Add operator++,
> 	operator--, operator*, operator==, and operator!=.
> 	(class tsi_range): New.
> 
> gcc/cp/ChangeLog:
> 
> 	* constexpr.c (build_data_member_initialization): Use tsi_range.
> 	(build_constexpr_constructor_member_initializers): Likewise.
> 	(constexpr_fn_retval, cxx_eval_statement_list): Likewise.
> 	(potential_constant_expression_1): Likewise.
> 	* coroutines.cc (await_statement_expander): Likewise.
> 	(await_statement_walker): Likewise.
> 	* module.cc (trees_out::core_vals): Likewise.
> 	* pt.c (tsubst_expr): Likewise.
> 	* semantics.c (set_cleanup_locs): Likewise.
> ---
>   gcc/tree-iterator.h  | 28 +++++++++++++++++++++++-----
>   gcc/cp/constexpr.c   | 42 ++++++++++++++----------------------------
>   gcc/cp/coroutines.cc | 10 ++++------
>   gcc/cp/module.cc     |  5 ++---
>   gcc/cp/pt.c          |  5 ++---
>   gcc/cp/semantics.c   |  5 ++---
>   6 files changed, 47 insertions(+), 48 deletions(-)
> 
> diff --git a/gcc/tree-iterator.h b/gcc/tree-iterator.h
> index 076fff8644c..f57456bb473 100644
> --- a/gcc/tree-iterator.h
> +++ b/gcc/tree-iterator.h
> @@ -1,4 +1,4 @@
> -/* Iterator routines for manipulating GENERIC tree statement list.
> +/* Iterator routines for manipulating GENERIC tree statement list. -*- C++ -*-
>      Copyright (C) 2003-2021 Free Software Foundation, Inc.
>      Contributed by Andrew MacLeod  <amacleod@redhat.com>
>   
> @@ -32,6 +32,13 @@ along with GCC; see the file COPYING3.  If not see
>   struct tree_stmt_iterator {
>     struct tree_statement_list_node *ptr;
>     tree container;
> +
> +  bool operator== (tree_stmt_iterator b) const
> +    { return b.ptr == ptr && b.container == container; }
> +  bool operator!= (tree_stmt_iterator b) const { return !(*this == b); }
> +  tree_stmt_iterator &operator++ () { ptr = ptr->next; return *this; }
> +  tree_stmt_iterator &operator-- () { ptr = ptr->prev; return *this; }
> +  tree &operator* () { return ptr->stmt; }
>   };
>   
>   static inline tree_stmt_iterator
> @@ -71,27 +78,38 @@ tsi_one_before_end_p (tree_stmt_iterator i)
>   static inline void
>   tsi_next (tree_stmt_iterator *i)
>   {
> -  i->ptr = i->ptr->next;
> +  ++(*i);
>   }
>   
>   static inline void
>   tsi_prev (tree_stmt_iterator *i)
>   {
> -  i->ptr = i->ptr->prev;
> +  --(*i);
>   }
>   
>   static inline tree *
>   tsi_stmt_ptr (tree_stmt_iterator i)
>   {
> -  return &i.ptr->stmt;
> +  return &(*i);
>   }
>   
>   static inline tree
>   tsi_stmt (tree_stmt_iterator i)
>   {
> -  return i.ptr->stmt;
> +  return *i;
>   }
>   
> +/* Make tree_stmt_iterator work as a C++ range, e.g.
> +   for (tree stmt : tsi_range (stmt_list)) { ... }  */
> +class tsi_range
> +{
> +  tree t;
> + public:
> +  tsi_range (tree t): t(t) { }
> +  tree_stmt_iterator begin() { return tsi_start (t); }
> +  tree_stmt_iterator end() { return { nullptr, t }; }
> +};
> +
>   enum tsi_iterator_update
>   {
>     TSI_NEW_STMT,		/* Only valid when single statement is added, move
> diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
> index 9481a5bfd3c..260b0122f59 100644
> --- a/gcc/cp/constexpr.c
> +++ b/gcc/cp/constexpr.c
> @@ -330,12 +330,9 @@ build_data_member_initialization (tree t, vec<constructor_elt, va_gc> **vec)
>       return false;
>     if (TREE_CODE (t) == STATEMENT_LIST)
>       {
> -      tree_stmt_iterator i;
> -      for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
> -	{
> -	  if (! build_data_member_initialization (tsi_stmt (i), vec))
> -	    return false;
> -	}
> +      for (tree stmt : tsi_range (t))
> +	if (! build_data_member_initialization (stmt, vec))
> +	  return false;
>         return true;
>       }
>     if (TREE_CODE (t) == CLEANUP_STMT)
> @@ -577,10 +574,9 @@ build_constexpr_constructor_member_initializers (tree type, tree body)
>   	break;
>   
>         case STATEMENT_LIST:
> -	for (tree_stmt_iterator i = tsi_start (body);
> -	     !tsi_end_p (i); tsi_next (&i))
> +	for (tree stmt : tsi_range (body))
>   	  {
> -	    body = tsi_stmt (i);
> +	    body = stmt;
>   	    if (TREE_CODE (body) == BIND_EXPR)
>   	      break;
>   	  }
> @@ -617,10 +613,9 @@ build_constexpr_constructor_member_initializers (tree type, tree body)
>       }
>     else if (TREE_CODE (body) == STATEMENT_LIST)
>       {
> -      tree_stmt_iterator i;
> -      for (i = tsi_start (body); !tsi_end_p (i); tsi_next (&i))
> +      for (tree stmt : tsi_range (body))
>   	{
> -	  ok = build_data_member_initialization (tsi_stmt (i), &vec);
> +	  ok = build_data_member_initialization (stmt, &vec);
>   	  if (!ok)
>   	    break;
>   	}
> @@ -675,11 +670,10 @@ constexpr_fn_retval (tree body)
>       {
>       case STATEMENT_LIST:
>         {
> -	tree_stmt_iterator i;
>   	tree expr = NULL_TREE;
> -	for (i = tsi_start (body); !tsi_end_p (i); tsi_next (&i))
> +	for (tree stmt : tsi_range (body))
>   	  {
> -	    tree s = constexpr_fn_retval (tsi_stmt (i));
> +	    tree s = constexpr_fn_retval (stmt);
>   	    if (s == error_mark_node)
>   	      return error_mark_node;
>   	    else if (s == NULL_TREE)
> @@ -5772,7 +5766,6 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
>   			 bool *non_constant_p, bool *overflow_p,
>   			 tree *jump_target)
>   {
> -  tree_stmt_iterator i;
>     tree local_target;
>     /* In a statement-expression we want to return the last value.
>        For empty statement expression return void_node.  */
> @@ -5782,9 +5775,8 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
>         local_target = NULL_TREE;
>         jump_target = &local_target;
>       }
> -  for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
> +  for (tree stmt : tsi_range (t))
>       {
> -      tree stmt = tsi_stmt (i);
>         /* We've found a continue, so skip everything until we reach
>   	 the label its jumping to.  */
>         if (continues (jump_target))
> @@ -8283,16 +8275,10 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
>         }
>   
>       case STATEMENT_LIST:
> -      {
> -	tree_stmt_iterator i;
> -	for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
> -	  {
> -	    if (!RECUR (tsi_stmt (i), any))
> -	      return false;
> -	  }
> -	return true;
> -      }
> -      break;
> +      for (tree stmt : tsi_range (t))
> +	if (!RECUR (stmt, any))
> +	  return false;
> +      return true;
>   
>       case MODIFY_EXPR:
>         if (cxx_dialect < cxx14)
> diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
> index dbd703a67cc..9b498f9d0b4 100644
> --- a/gcc/cp/coroutines.cc
> +++ b/gcc/cp/coroutines.cc
> @@ -1771,10 +1771,9 @@ await_statement_expander (tree *stmt, int *do_subtree, void *d)
>       return NULL_TREE; /* Just process the sub-trees.  */
>     else if (TREE_CODE (*stmt) == STATEMENT_LIST)
>       {
> -      tree_stmt_iterator i;
> -      for (i = tsi_start (*stmt); !tsi_end_p (i); tsi_next (&i))
> +      for (tree &s : tsi_range (*stmt))
>   	{
> -	  res = cp_walk_tree (tsi_stmt_ptr (i), await_statement_expander,
> +	  res = cp_walk_tree (&s, await_statement_expander,
>   			      d, NULL);
>   	  if (res)
>   	    return res;
> @@ -3523,10 +3522,9 @@ await_statement_walker (tree *stmt, int *do_subtree, void *d)
>       }
>     else if (TREE_CODE (*stmt) == STATEMENT_LIST)
>       {
> -      tree_stmt_iterator i;
> -      for (i = tsi_start (*stmt); !tsi_end_p (i); tsi_next (&i))
> +      for (tree &s : tsi_range (*stmt))
>   	{
> -	  res = cp_walk_tree (tsi_stmt_ptr (i), await_statement_walker,
> +	  res = cp_walk_tree (&s, await_statement_walker,
>   			      d, NULL);
>   	  if (res)
>   	    return res;
> diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
> index 02c19f55548..f0fb0144706 100644
> --- a/gcc/cp/module.cc
> +++ b/gcc/cp/module.cc
> @@ -6094,9 +6094,8 @@ trees_out::core_vals (tree t)
>         break;
>   
>       case STATEMENT_LIST:
> -      for (tree_stmt_iterator iter = tsi_start (t);
> -	   !tsi_end_p (iter); tsi_next (&iter))
> -	if (tree stmt = tsi_stmt (iter))
> +      for (tree stmt : tsi_range (t))
> +	if (stmt)
>   	  WT (stmt);
>         WT (NULL_TREE);
>         break;
> diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
> index 116bdd2e42a..ad140cfd586 100644
> --- a/gcc/cp/pt.c
> +++ b/gcc/cp/pt.c
> @@ -18234,9 +18234,8 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
>       {
>       case STATEMENT_LIST:
>         {
> -	tree_stmt_iterator i;
> -	for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
> -	  RECUR (tsi_stmt (i));
> +	for (tree stmt : tsi_range (t))
> +	  RECUR (stmt);
>   	break;
>         }
>   
> diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
> index 6224f49f189..2912efad9be 100644
> --- a/gcc/cp/semantics.c
> +++ b/gcc/cp/semantics.c
> @@ -613,9 +613,8 @@ set_cleanup_locs (tree stmts, location_t loc)
>         set_cleanup_locs (CLEANUP_BODY (stmts), loc);
>       }
>     else if (TREE_CODE (stmts) == STATEMENT_LIST)
> -    for (tree_stmt_iterator i = tsi_start (stmts);
> -	 !tsi_end_p (i); tsi_next (&i))
> -      set_cleanup_locs (tsi_stmt (i), loc);
> +    for (tree stmt : tsi_range (stmts))
> +      set_cleanup_locs (stmt, loc);
>   }
>   
>   /* Finish a scope.  */
> 
> base-commit: 3c65858787dc52b65b26fa7018587c01510f442c
> prerequisite-patch-id: 7ce9dff1f7d449f4a13fb882bf7b1a962a56de95
> 


  reply	other threads:[~2021-05-13 19:27 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-01 16:29 Jason Merrill
2021-05-13 19:26 ` Jason Merrill [this message]
2021-05-13 23:21   ` Martin Sebor
2021-05-14  1:50     ` Jason Merrill
2021-05-17  7:56     ` Richard Biener
2021-05-17 17:58       ` Jason Merrill
2021-05-26 13:56         ` Jason Merrill
2021-05-28  6:53           ` Richard Biener

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=dbd0241a-6a4e-b385-fbb1-6078573b92ba@redhat.com \
    --to=jason@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).