diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c index 27bf3a7eafe..6d2d9fe4007 100644 --- a/gcc/fortran/check.c +++ b/gcc/fortran/check.c @@ -735,6 +735,10 @@ array_check (gfc_expr *e, int n) && CLASS_DATA (e)->attr.dimension && CLASS_DATA (e)->as->rank) { + if (e->ref && e->ref->type == REF_ARRAY + && e->ref->u.ar.type == AR_ELEMENT) + goto error; + gfc_add_class_array_ref (e); return true; } @@ -742,6 +746,7 @@ array_check (gfc_expr *e, int n) if (e->rank != 0 && e->ts.type != BT_PROCEDURE) return true; +error: gfc_error ("%qs argument of %qs intrinsic at %L must be an array", gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic, &e->where); diff --git a/gcc/testsuite/gfortran.dg/pr101536.f90 b/gcc/testsuite/gfortran.dg/pr101536.f90 new file mode 100644 index 00000000000..14cb4100bd6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr101536.f90 @@ -0,0 +1,12 @@ +! { dg-do compile } +! PR fortran/101536 - ICE in gfc_conv_expr_descriptor + +program p + type t + end type +contains + integer function f(x) + class(t), allocatable :: x(:) + f = size (x(1)) ! { dg-error "must be an array" } + end +end