! { dg-do run } ! { dg-options "-fdump-tree-original" } ! ! PR fortran/48820 ! ! Ensure that the value of scalars to assumed-rank arrays is ! copied back, if and only its pointer address could have changed. ! program test implicit none type t integer :: aa end type t integer, allocatable :: iia integer, pointer :: iip type(t), allocatable :: jja type(t), pointer :: jjp logical :: is_present is_present = .true. allocate (iip, jjp) iia = 7 iip = 7 jja = t(88) jjp = t(88) call faa(iia, jja) ! Copy back if (iia /= 7 .and. jja%aa /= 88) STOP 1 call fai(iia, jja) ! No copy back if (iia /= 7 .and. jja%aa /= 88) STOP 2 call fpa(iip, jjp) ! Copy back if (iip /= 7 .and. jjp%aa /= 88) STOP 3 call fpi(iip, jjp) ! No copy back if (iip /= 7 .and. jjp%aa /= 88) STOP 4 call fnn(iia, jja) ! No copy back if (iia /= 7 .and. jja%aa /= 88) STOP 5 call fno(iia, jja) ! No copy back if (iia /= 7 .and. jja%aa /= 88) STOP 6 call fnn(iip, jjp) ! No copy back if (iip /= 7 .and. jjp%aa /= 88) STOP 7 call fno(iip, jjp) ! No copy back if (iip /= 7 .and. jjp%aa /= 88) STOP 8 is_present = .false. call fpa(null(), null()) ! No copy back call fpi(null(), null()) ! No copy back call fno(null(), null()) ! No copy back call fno() ! No copy back contains subroutine faa (xx1, yy1) integer, allocatable :: xx1(..) type(t), allocatable :: yy1(..) if (.not. allocated (xx1)) STOP 9 if (.not. allocated (yy1)) STOP 10 end subroutine faa subroutine fai (xx1, yy1) integer, allocatable, intent(in) :: xx1(..) type(t), allocatable, intent(in) :: yy1(..) if (.not. allocated (xx1)) STOP 11 if (.not. allocated (yy1)) STOP 12 end subroutine fai subroutine fpa (xx1, yy1) integer, pointer :: xx1(..) type(t), pointer :: yy1(..) if (is_present .neqv. associated (xx1)) STOP 13 if (is_present .neqv. associated (yy1)) STOP 14 end subroutine fpa subroutine fpi (xx1, yy1) integer, pointer, intent(in) :: xx1(..) type(t), pointer, intent(in) :: yy1(..) if (is_present .neqv. associated (xx1)) STOP 15 if (is_present .neqv. associated (yy1)) STOP 16 end subroutine fpi subroutine fnn(xx2,yy2) integer :: xx2(..) type(t) :: yy2(..) end subroutine fnn subroutine fno(xx2,yy2) integer, optional :: xx2(..) type(t), optional :: yy2(..) if (is_present .neqv. present (xx2)) STOP 17 if (is_present .neqv. present (yy2)) STOP 18 end subroutine fno end program test ! We should have exactly one copy back per variable ! ! { dg-final { scan-tree-dump-times "iip = .integer.kind=4. .. desc.\[0-9\]+.data;" 1 "original" } } ! { dg-final { scan-tree-dump-times "iia = .integer.kind=4. .. desc.\[0-9\]+.data;" 1 "original" } } ! { dg-final { scan-tree-dump-times "jjp = .struct t .. desc.\[0-9\]+.data;" 1 "original" } } ! { dg-final { scan-tree-dump-times "jja = .struct t .. desc.\[0-9\]+.data;" 1 "original" } }