| ! { dg-do run } |
| ! |
| ! PR fortran/110618 |
| ! Check that if a data reference is passed as actual argument whose dummy |
| ! has INTENT(OUT) attribute, any other argument depending on the |
| ! same data reference is evaluated before the data reference deallocation. |
| |
| program p |
| implicit none |
| type t |
| integer :: i |
| end type t |
| type u |
| class(t), allocatable :: ta(:) |
| end type u |
| type(u), allocatable :: c(:) |
| class(t), allocatable :: d(:) |
| allocate(c, source = [u([t(1), t(3)]), u([t(4), t(9)])]) |
| allocate(d, source = [t(1), t(5)]) |
| call bar ( & |
| allocated(c(d(1)%i)%ta), & |
| d, & |
| c(d(1)%i)%ta, & |
| allocated (c(d(1)%i)%ta) & |
| ) |
| if (allocated (c(1)%ta)) stop 11 |
| if (.not. allocated (c(2)%ta)) stop 11 |
| contains |
| subroutine bar (alloc, x, y, alloc2) |
| logical :: alloc, alloc2 |
| class(t), allocatable, intent(out) :: x(:) |
| class(t), allocatable, intent(out) :: y(:) |
| if (allocated (x)) stop 1 |
| if (.not. alloc) stop 2 |
| if (.not. alloc2) stop 3 |
| end subroutine bar |
| end |