Fortran: improve error recovery for EXTENDS_TYPE_OF() [PR106121]

gcc/fortran/ChangeLog:

	PR fortran/106121
	* simplify.cc (gfc_simplify_extends_type_of): Do not attempt to
	simplify when one of the arguments is a CLASS variable that was
	not properly declared.

gcc/testsuite/ChangeLog:

	PR fortran/106121
	* gfortran.dg/extends_type_of_4.f90: New test.

Co-authored-by: Steven G. Kargl <kargl@gcc.gnu.org>
This commit is contained in:
Harald Anlauf 2022-06-28 22:29:28 +02:00
parent 01779f4f3d
commit b8f284d367
2 changed files with 24 additions and 0 deletions

View File

@ -3096,6 +3096,10 @@ gfc_simplify_extends_type_of (gfc_expr *a, gfc_expr *mold)
if (UNLIMITED_POLY (a) || UNLIMITED_POLY (mold))
return NULL;
if ((a->ts.type == BT_CLASS && !gfc_expr_attr (a).class_ok)
|| (mold->ts.type == BT_CLASS && !gfc_expr_attr (mold).class_ok))
return NULL;
/* Return .false. if the dynamic type can never be an extension. */
if ((a->ts.type == BT_CLASS && mold->ts.type == BT_CLASS
&& !gfc_type_is_extension_of

View File

@ -0,0 +1,20 @@
! { dg-do compile }
! PR fortran/106121 - ICE in gfc_simplify_extends_type_of
! Contributed by G.Steinmetz
program p
type t
end type
type(t) :: x
class(t) :: y ! { dg-error "dummy, allocatable or pointer" }
print *, extends_type_of (x, y)
end
subroutine s
type t
integer :: i
end type
type(t) :: x
class(t) :: y ! { dg-error "dummy, allocatable or pointer" }
stop extends_type_of (x, y) ! { dg-error "STOP code" }
end