Another one of Gerhard's infamous testcases. We did not properly detect and reject array elements of type CLASS as argument to an intrinsic when it should be an array.
Regtested on x86_64-pc-linux-gnu. OK for mainline / 11-branch when it reopens? Thanks, Harald Fortran: extend check for array arguments and reject CLASS array elements. gcc/fortran/ChangeLog: PR fortran/101536 * check.c (array_check): Array elements of CLASS type are not arrays. gcc/testsuite/ChangeLog: PR fortran/101536 * gfortran.dg/pr101536.f90: New test.
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