diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index 82d2b5087e5..8063fcad295 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -5700,6 +5700,11 @@ gfc_match_equivalence (void) if (!gfc_add_in_equivalence (&sym->attr, sym->name, NULL)) goto cleanup; + if (sym->ts.type == BT_CLASS + && CLASS_DATA (sym) + && !gfc_add_in_equivalence (&CLASS_DATA (sym)->attr, + sym->name, NULL)) + goto cleanup; if (sym->attr.in_common) { diff --git a/gcc/testsuite/gfortran.dg/pr95587.f90 b/gcc/testsuite/gfortran.dg/pr95587.f90 new file mode 100644 index 00000000000..a543fb92a18 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr95587.f90 @@ -0,0 +1,13 @@ +! { dg-do compile } +! PR fortran/95587 - ICE in gfc_target_encode_expr, at fortran/target-memory.c:362 + +program p + type t + end type t + class(*), allocatable :: x, y + class(t), allocatable :: u, v + class(t), pointer :: c, d + equivalence (x, y) ! { dg-error "conflicts with ALLOCATABLE" } + equivalence (u, v) ! { dg-error "conflicts with ALLOCATABLE" } + equivalence (c, d) ! { dg-error "conflicts with POINTER" } +end