From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa4.mentor.iphmx.com (esa4.mentor.iphmx.com [68.232.137.252]) by sourceware.org (Postfix) with ESMTPS id 7B5F53858D1E for ; Thu, 7 Sep 2023 16:18:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7B5F53858D1E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-CSE-ConnectionGUID: TBa2Fb2JSW+Omm6UjMerNA== X-CSE-MsgGUID: fyGkrh6yTOKTO2FFLkwM+A== X-IronPort-AV: E=Sophos;i="6.02,235,1688457600"; d="scan'208";a="16345220" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa4.mentor.iphmx.com with ESMTP; 07 Sep 2023 08:18:51 -0800 IronPort-SDR: OxTc0Hi1pBj2vUKakBJmYFpKr5uKstd4oud6cMIynr1Z9TwcaptrMKuEd4pVSfizkm4HtxMdFO GuihnxSXAWnBZue2hyQKw6yNO2PwoW/d5OjeTbDNaz++B9ABV1x80M0gkm+2Pn3sf7ioQ42JlD iG0swSdx5AN2lemhvtWdSzDa5ezlo3djTBt3xemj3C0KpREWDQvT3XXGXfhfuHgLpyPGBTU3lI sNn7WEty7a0UfokOkQKz1Xc0apWt49p7gkmJbib/la4lWoU9zSkO371TKFSba1tLUz+7ay6QD3 Gok= From: Sandra Loosemore To: CC: Subject: [PATCH] OpenMP: Fix ICE in fixup_blocks_walker [PR111274] Date: Thu, 7 Sep 2023 10:18:37 -0600 Message-ID: <20230907161837.4049453-1-sandra@codesourcery.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: svr-orw-mbx-12.mgc.mentorg.com (147.34.90.212) To svr-orw-mbx-13.mgc.mentorg.com (147.34.90.213) X-Spam-Status: No, score=-10.0 required=5.0 tests=BAYES_00,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,KAM_DMARC_STATUS,SPF_HELO_PASS,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: 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 --- gcc/cp/parser.cc | 5 ++++- gcc/testsuite/g++.dg/gomp/pr111274.C | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/gomp/pr111274.C diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 7811d582b07..15a98019a4a 100644 --- 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