re PR fortran/66089 (elemental dependency mishandling when class array are involved)

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/66089
    * gfortran.dg/dependency_53.f90: New test.

From-SVN: r269549
This commit is contained in:
Thomas Koenig 2019-03-10 10:42:23 +00:00
parent 2263c69edc
commit 4932364bd5
4 changed files with 42 additions and 0 deletions

View file

@ -1,3 +1,10 @@
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

View file

@ -2699,6 +2699,9 @@ gfc_scalar_elemental_arg_saved_as_reference (gfc_ss_info * ss_info)
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 * expr)
{
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;

View file

@ -1,3 +1,8 @@
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

View file

@ -0,0 +1,25 @@
! { 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