diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2019-03-10 10:42:23 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2019-03-10 10:42:23 +0000 |
commit | 4932364bd569d131e6f0dbb68ed5a538be3d07f3 (patch) | |
tree | 9ba42260481ecfc8c22628b12bdd09b6d36b193f | |
parent | 2263c69edc270c1e762c88e771d12dd5d09b052d (diff) | |
download | gcc-4932364bd569d131e6f0dbb68ed5a538be3d07f3.zip gcc-4932364bd569d131e6f0dbb68ed5a538be3d07f3.tar.gz gcc-4932364bd569d131e6f0dbb68ed5a538be3d07f3.tar.bz2 |
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
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/trans-array.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/dependency_53.f90 | 25 |
4 files changed, 42 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d8f5abb..8ad4361 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,12 @@ 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 * symbol.c (gfc_add_procedure): Only throw an error if the procedure has not been declared either PUBLIC or PRIVATE. diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 6192e68..1379426 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 05be099..cb07129 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 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 * gfortran.dg/public_private_module_10.f90: New test. diff --git a/gcc/testsuite/gfortran.dg/dependency_53.f90 b/gcc/testsuite/gfortran.dg/dependency_53.f90 new file mode 100644 index 0000000..a45302f --- /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 |