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