| ! { dg-do run } |
| ! { dg-additional-options "-fdump-tree-original" } |
| ! { dg-final { scan-tree-dump-times "CLOBBER" 2 "original" } } |
| ! |
| ! PR fortran/106817 |
| ! Check that for an actual argument whose dummy is INTENT(OUT), |
| ! the clobber that is emitted in the caller before a procedure call |
| ! happens after any expression depending on the argument value has been |
| ! evaluated. |
| ! |
| |
| module m |
| implicit none |
| contains |
| subroutine copy1(out, in) |
| integer, intent(in) :: in |
| integer, intent(out) :: out |
| out = in |
| end subroutine copy1 |
| subroutine copy2(in, out) |
| integer, intent(in) :: in |
| integer, intent(out) :: out |
| out = in |
| end subroutine copy2 |
| end module m |
| |
| program p |
| use m |
| implicit none |
| integer :: a, b |
| |
| ! Clobbering of a should happen after a+1 has been evaluated. |
| a = 3 |
| call copy1(a, a+1) |
| if (a /= 4) stop 1 |
| |
| ! Clobbering order does not depend on the order of arguments. |
| ! It should also come last with reversed arguments. |
| b = 12 |
| call copy2(b+1, b) |
| if (b /= 13) stop 2 |
| |
| end program p |