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