On Fri, May 23, 2025 at 11:10:46AM +0200, Tobias Burnus wrote:
> OpenMP/C++: Avoid ICE for BIND_EXPR with empty BIND_EXPR_BLOCK [PR120413]
> 
>       PR c++/120413
> 
> gcc/cp/ChangeLog:
> 
>       * semantics.cc (finish_omp_target_clauses_r): Handle
>       BIND_EXPR with empty BIND_EXPR_BLOCK.
> 
> gcc/testsuite/ChangeLog:
> 
>       * g++.dg/gomp/target-4.C: New test.
> 
>  gcc/cp/semantics.cc                  |  7 ++++---
>  gcc/testsuite/g++.dg/gomp/target-4.C | 22 ++++++++++++++++++++++
>  2 files changed, 26 insertions(+), 3 deletions(-)
> 
> diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc
> index 43a0eabfa12..8651009a43f 100644
> --- a/gcc/cp/semantics.cc
> +++ b/gcc/cp/semantics.cc
> @@ -10566,9 +10566,10 @@ finish_omp_target_clauses_r (tree *tp, int 
> *walk_subtrees, void *ptr)
>    if (TREE_CODE (t) == BIND_EXPR)
>      {
>        tree block = BIND_EXPR_BLOCK (t);
> -      for (tree var = BLOCK_VARS (block); var; var = DECL_CHAIN (var))
> -     if (!data->local_decls.contains (var))
> -       data->local_decls.add (var);
> +      if (block)
> +     for (tree var = BLOCK_VARS (block); var; var = DECL_CHAIN (var))
> +       if (!data->local_decls.contains (var))
> +         data->local_decls.add (var);
>        return NULL_TREE;
>      }

There is also BIND_EXPR_VARS, dunno if that should be walked instead or
in addition.
Anyway, from formatting POV, it would be nicer to do
  if (TREE_CODE (t) == BIND_EXPR)
    {
      if (tree block = BIND_EXPR_BLOCK (t))
        for (tree var = BLOCK_VARS (block); var; var = DECL_CHAIN (var))
          if (!data->local_decls.contains (var))
            data->local_decls.add (var);
      return NULL_TREE;
    }

        Jakub

Reply via email to