On Thu, Sep 07, 2023 at 10:18:37AM -0600, Sandra Loosemore wrote: > This ICE was caused by an invalid assumption that all BIND_EXPRs have > a non-null BIND_EXPR_BLOCK. In C++ these do exist and are used for > temporaries introduced in expressions that are not full-expressions. > Since they have no block to fix up, the traversal can just ignore > these tree nodes. > > gcc/cp/ChangeLog > * parser.cc (fixup_blocks_walker): Check for null BIND_EXPR_BLOCK. > > gcc/testsuite/ChangeLog > * g++.dg/gomp/pr111274.C: New test case
Missing . at the end of the ChangeLog line. Otherwise LGTM. > --- a/gcc/cp/parser.cc > +++ b/gcc/cp/parser.cc > @@ -44485,7 +44485,10 @@ fixup_blocks_walker (tree *tp, int *walk_subtrees, > void *dp) > { > tree superblock = *(tree *)dp; > > - if (TREE_CODE (*tp) == BIND_EXPR) > + /* BIND_EXPR_BLOCK may be null if the expression is not a > + full-expression; if there's no block, no patching is necessary > + for this node. */ > + if (TREE_CODE (*tp) == BIND_EXPR && BIND_EXPR_BLOCK (*tp)) > { > tree block = BIND_EXPR_BLOCK (*tp); > if (superblock) > diff --git a/gcc/testsuite/g++.dg/gomp/pr111274.C > b/gcc/testsuite/g++.dg/gomp/pr111274.C > new file mode 100644 > index 00000000000..6d3414fc82c > --- /dev/null > +++ b/gcc/testsuite/g++.dg/gomp/pr111274.C > @@ -0,0 +1,15 @@ > +// { dg-do "compile" } > + > +// This example used to ICE in fixup_blocks_walker due to a BIND_EXPR with > +// null BIND_EXPR_BLOCK. > + > +struct _Vector_base { > + ~_Vector_base(); > +}; > +int ColumnSmallestLastOrdering_OMP_i_MaxNumThreads, > + ColumnSmallestLastOrdering_OMP_i_MaxDegree; > +void ColumnSmallestLastOrdering_OMP() { > +#pragma omp for > + for (int i = 0; i < ColumnSmallestLastOrdering_OMP_i_MaxNumThreads; i++) > + new _Vector_base[ColumnSmallestLastOrdering_OMP_i_MaxDegree]; > +} > -- > 2.31.1 Jakub