From: Tobias Burnus <tobias@codesourcery.com>
To: gcc-patches <gcc-patches@gcc.gnu.org>,
fortran <fortran@gcc.gnu.org>,
Paul Richard Thomas <paul.richard.thomas@gmail.com>
Subject: Fortran: Create CLASS(*) early to avoid ICE [PR99254]
Date: Thu, 25 Feb 2021 12:16:37 +0100 [thread overview]
Message-ID: <b2a64ecf-4354-c6b2-5837-c60bad74de05@codesourcery.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1443 bytes --]
The issue is that for CLASS – and in particular CLASS(*)
the ts.u.derived->components is not yet created when it is
accessed. – 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 ‘x’ 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. (→ 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ünchen Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf
[-- Attachment #2: class-star.diff --]
[-- Type: text/x-patch, Size: 2438 bytes --]
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
next reply other threads:[~2021-02-25 11:16 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-25 11:16 Tobias Burnus [this message]
2021-03-03 11:47 ` *PING* — " Tobias Burnus
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b2a64ecf-4354-c6b2-5837-c60bad74de05@codesourcery.com \
--to=tobias@codesourcery.com \
--cc=fortran@gcc.gnu.org \
--cc=gcc-patches@gcc.gnu.org \
--cc=paul.richard.thomas@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).