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