Hello world, the attached patch fixes a 7/8/9 regression where dependency checking was for class arrays and a scalar value was mishandled when the dependency happened in an elemental function.
There was an ICE for the test case which is handled by fixing up the class refs in gfc_walk_variable_expr. Once this was gone, a wrong-code issue appeared which was fixed by the part in gfc_scalar_elemental_arg_saved_as_reference (is that the longest function name in gfortran?). Regression-tested. OK for all affected branches? Regards Thomas 2019-03-06 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/66089 * trans-array.c (gfc_scalar_elemental_arg_saved_as_reference): Return false if a scalar tempoary is needed. (gfc_walk_variable_expr): Fix up class refs. 2019-03-06 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/66089 * gfortran.dg/dependency_53.f90: New test.
Index: trans-array.c =================================================================== --- trans-array.c (Revision 269260) +++ trans-array.c (Arbeitskopie) @@ -2699,6 +2699,9 @@ gfc_scalar_elemental_arg_saved_as_reference (gfc_s if (ss_info->type != GFC_SS_REFERENCE) return false; + if (ss_info->data.scalar.needs_temporary) + return false; + /* If the actual argument can be absent (in other words, it can be a NULL reference), don't try to evaluate it; pass instead the reference directly. */ @@ -10515,6 +10518,8 @@ gfc_walk_variable_expr (gfc_ss * ss, gfc_expr * ex { gfc_ref *ref; + gfc_fix_class_refs (expr); + for (ref = expr->ref; ref; ref = ref->next) if (ref->type == REF_ARRAY && ref->u.ar.type != AR_ELEMENT) break;
! { dg-do run } ! PR fortran/66089 - used to ICE and, after that ICE was fixed, ! gave wrong results. type :: t integer :: c end type t class(t), dimension(:), allocatable :: b,c allocate (b(5), source=t(7)) allocate(c(5), source=t(13)) c = plus(c(1), b) if (any(c%c /= 20)) call abort c = t(13) c = plus(b, c(1)) if (any(c%c /= 20)) call abort contains elemental function plus(lhs, rhs) class(t), intent(in) :: lhs, rhs type(t) :: plus plus%c = lhs%c + rhs%c end function plus end