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:
parent
2263c69edc
commit
4932364bd5
4 changed files with 42 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
25
gcc/testsuite/gfortran.dg/dependency_53.f90
Normal file
25
gcc/testsuite/gfortran.dg/dependency_53.f90
Normal 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
|
Loading…
Add table
Reference in a new issue