+2019-03-10 Thomas Koenig <tkoenig@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-10 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/87734
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. */
{
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;
+2019-03-10 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/66089
+ * gfortran.dg/dependency_53.f90: New test.
+
2019-03-10 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/87734
--- /dev/null
+! { 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)) stop 1
+ c = t(13)
+ c = plus(b, c(1))
+ if (any(c%c /= 20)) stop 2
+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