From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa3.mentor.iphmx.com (esa3.mentor.iphmx.com [68.232.137.180]) by sourceware.org (Postfix) with ESMTPS id C536D3842421; Thu, 25 Feb 2021 11:16:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org C536D3842421 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=Tobias_Burnus@mentor.com IronPort-SDR: 95UJLlcKEJsmb3W8MFuZhBNuvhyUUszPhnNqh5yxbCf8zkJQTTzmqfX/r2zMTNdCp8M1QEOJOH ChHKFbABiCW+q9DZgbQWDwTO/4f/m71IRfmP28N77CcIT0nfOZNlpiHTd8ggm3S1KAYQm2MuXU /NmpzKmyZvoN2osoVYv+NU1Lg5a3C8FyhTNAlByAfSI4dl+3wI2MWvlpORoA3dxCBe/Dnp1L4P CuVp7NQwTFedsw8aoNoH7hPTTltz2NoUVHqKl7P7L0wjwcN9BE/wiTad2YUDjMySea8FTXsniu Ieo= X-IronPort-AV: E=Sophos;i="5.81,205,1610438400"; d="diff'?scan'208";a="58489718" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa3.mentor.iphmx.com with ESMTP; 25 Feb 2021 03:16:44 -0800 IronPort-SDR: UnWdjFm0lgOpYbflYlA8PleRXS4itmxHaRNBtPX/pg9aC6gWhZtxGbKOd2yDuDOwI++sjmozF1 HV2MG/pEOSRf3KaumzOBoBC5KFys72EJoRDmWCDx0hT4kLh9SoxW8PQvBhmvXICMmsXuyvvxK1 kvYcUbduaY5rSaVG2Xv3e8/TMpLWRsWuP7yi9iYbtqI1g7htFbWZBZX+uH2NQVeKlM/6LFtY5D ZPXoU6n0uqaw3iWeuv5FYhf+CjRBF0gDaTL/jdOq2RvtjXJ1nz5+zK3zlBGYXDtQefQ0WXOXTF a4U= To: gcc-patches , fortran , Paul Richard Thomas From: Tobias Burnus Subject: Fortran: Create CLASS(*) early to avoid ICE [PR99254] Message-ID: Date: Thu, 25 Feb 2021 12:16:37 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------2E7764AAD35632F279BC4AC2" Content-Language: en-US X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-05.mgc.mentorg.com (139.181.222.5) To svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) X-Spam-Status: No, score=-12.1 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.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: fortran@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Fortran mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Feb 2021 11:16:47 -0000 --------------2E7764AAD35632F279BC4AC2 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: quoted-printable The issue is that for CLASS =E2=80=93 and in particular CLASS(*) the ts.u.derived->components is not yet created when it is accessed. =E2=80=93 PR99138 shows a similar case (unfixed! See comment 5 and initial report for two examples). There is an issue for code like: class(*) var dimension :: var(..) that the attribute is not properly encoded in the class. That's independent of this patch, cf. PR fortran/99266. NOTE: This patch causes a regression: subroutine foo() class(*) :: x allocatable :: x is now rejected with: CLASS variable =E2=80=98x=E2=80=99 at (1) must be dummy, allocatable or = pointer HOWEVER: While that was accepted before, subroutine foo(dummy) class(*) :: dummy allocatable :: dummy failed before and still fails. (=E2=86=92 class_ok handling in gfc_build_class_symbol). All those issues are tracked in that PR fortran/99266. OK for the trunk? What about GCC 10?? I am unsure about GCC 10 due to the new regression; the issue (PR99254) was reported as new ICE between 20190825 and 20190901. Tobias PS: I still do not like the way we represent CLASS internally, but I think I had complained about this already years ago... Can proponents of the current way please look at PR fortran/99266 ? ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 M=C3=BCnchen R= egistergericht M=C3=BCnchen HRB 106955, Gesch=C3=A4ftsf=C3=BChrer: Thomas H= eurung, Frank Th=C3=BCrauf --------------2E7764AAD35632F279BC4AC2 Content-Type: text/x-patch; charset="UTF-8"; name="class-star.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="class-star.diff" Fortran: Create CLASS(*) early to avoid ICE [PR99254] gcc/fortran/ChangeLog: PR fortran/99254 * class.c (gfc_build_class_symbol): Always build for CLASS(*). gcc/testsuite/ChangeLog: PR fortran/99254 * gfortran.dg/class_72.f90: New test. * gfortran.dg/pr96086.f90: Update dg-error. gcc/fortran/class.c | 5 ++++- gcc/testsuite/gfortran.dg/class_72.f90 | 26 ++++++++++++++++++++++++++ gcc/testsuite/gfortran.dg/pr96086.f90 | 4 ++-- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c index 89353218417..e49f5a5df77 100644 --- a/gcc/fortran/class.c +++ b/gcc/fortran/class.c @@ -659,7 +659,10 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr, attr->class_ok = attr->dummy || attr->pointer || attr->allocatable || attr->select_type_temporary || attr->associate_var; - if (!attr->class_ok) + bool build_star = (ts->u.derived && !ts->u.derived->components + && ts->u.derived->attr.unlimited_polymorphic); + + if (!attr->class_ok && !build_star) /* We cannot build the class container yet. */ return true; diff --git a/gcc/testsuite/gfortran.dg/class_72.f90 b/gcc/testsuite/gfortran.dg/class_72.f90 new file mode 100644 index 00000000000..0e181b27086 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/class_72.f90 @@ -0,0 +1,26 @@ +! { dg-do compile } +! +! PR fortran/99254 +! +! Contributed by G. Steinmetz +! +subroutine s1 + class(*) :: x(..) ! { dg-error "must be dummy, allocatable or pointer" } + select rank (y => x) + rank (1) + end select +end + +subroutine s2 + class(*), allocatable :: x(..) ! { dg-error "Assumed-rank array at .1. must be a dummy argument" } + select rank (y => x) + rank (1) + end select +end + +subroutine s3(x) + class(*) :: x(..) + select rank (y => x) + rank (1) + end select +end diff --git a/gcc/testsuite/gfortran.dg/pr96086.f90 b/gcc/testsuite/gfortran.dg/pr96086.f90 index b80967a7a07..58f11f51028 100644 --- a/gcc/testsuite/gfortran.dg/pr96086.f90 +++ b/gcc/testsuite/gfortran.dg/pr96086.f90 @@ -2,7 +2,7 @@ ! PR fortran/96086 - ICE in gfc_match_select_rank, at fortran/match.c:6645 subroutine s - class(*) :: x(..) ! { dg-error "Assumed-rank array" } - select rank (y => x) ! { dg-error "CLASS variable" } + class(*) :: x(..) ! { dg-error "must be dummy, allocatable or pointer" } + select rank (y => x) end select end --------------2E7764AAD35632F279BC4AC2--