From 4932364bd569d131e6f0dbb68ed5a538be3d07f3 Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Sun, 10 Mar 2019 10:42:23 +0000 Subject: [PATCH] re PR fortran/66089 (elemental dependency mishandling when class array are involved) 2019-03-10 Thomas Koenig 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 PR fortran/66089 * gfortran.dg/dependency_53.f90: New test. From-SVN: r269549 --- gcc/fortran/ChangeLog | 7 ++++++ gcc/fortran/trans-array.c | 5 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/dependency_53.f90 | 25 +++++++++++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/dependency_53.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d8f5abb1c5d..8ad43614091 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2019-03-10 Thomas Koenig + + 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 PR fortran/87734 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 6192e6830dd..1379426d8e1 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 05be0994120..cb07129671f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-03-10 Thomas Koenig + + PR fortran/66089 + * gfortran.dg/dependency_53.f90: New test. + 2019-03-10 Thomas Koenig PR fortran/87734 diff --git a/gcc/testsuite/gfortran.dg/dependency_53.f90 b/gcc/testsuite/gfortran.dg/dependency_53.f90 new file mode 100644 index 00000000000..a45302fb0a3 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dependency_53.f90 @@ -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 -- 2.30.2