| ! { dg-do run } |
| ! PR fortran/81978 - do not copy back for parameter actual arguments |
| |
| module test_mod |
| implicit none |
| |
| type pp_struct |
| character(10) :: name |
| real :: value |
| end type pp_struct |
| |
| type(pp_struct), parameter :: pp(4) = [ & |
| pp_struct('one', 1.), & |
| pp_struct('two', 2.), & |
| pp_struct('three', 3.), & |
| pp_struct('four', 4.) ] |
| |
| contains |
| |
| subroutine match_word (names) |
| character(*) :: names(:) |
| end subroutine match_word |
| |
| subroutine sub0 (a) |
| real :: a(:) |
| end |
| |
| subroutine sub1 (a, n) |
| integer, intent(in) :: n |
| real :: a(n) |
| end |
| |
| subroutine subx (a) |
| real :: a(..) |
| end |
| end module |
| |
| program test |
| use test_mod |
| implicit none |
| integer :: i, n |
| integer, parameter :: m = 8 |
| real, parameter :: x(m) = [(i,i=1,m)] |
| |
| n = size (x) |
| call sub0 (x) |
| call sub1 (x, n) |
| call sub2 (x, n) |
| call subx (x) |
| |
| i = 1 |
| call sub0 (x(1::i)) |
| call sub1 (x(1::i), n) |
| call sub2 (x(1::i), n) |
| call subx (x(1::i)) |
| |
| n = size (x(1::2)) |
| call sub0 (x(1::2)) |
| call sub1 (x(1::2), n) |
| call sub2 (x(1::2), n) |
| call subx (x(1::2)) |
| |
| i = 2 |
| call sub0 (x(1::i)) |
| call sub1 (x(1::i), n) |
| call sub2 (x(1::i), n) |
| call subx (x(1::i)) |
| |
| call match_word (pp%name) |
| call sub0 (pp%value) |
| call subx (pp%value) |
| call match_word (pp(1::2)%name) |
| call sub0 (pp(1::2)%value) |
| call subx (pp(1::2)%value) |
| i = 1 |
| call match_word (pp(1::i)%name) |
| call sub0 (pp(1::i)%value) |
| call subx (pp(1::i)%value) |
| i = 2 |
| call match_word (pp(1::i)%name) |
| call sub0 (pp(1::i)%value) |
| call subx (pp(1::i)%value) |
| |
| call foo (pp%name, size(pp%name)) |
| call foo (pp(1::2)%name, size(pp(1::2)%name)) |
| call sub1 (pp(1::2)%value, size(pp(1::2)%value)) |
| call sub2 (pp(1::2)%value, size(pp(1::2)%value)) |
| i = 1 |
| call foo (pp(1::i)%name, size(pp(1::i)%name)) |
| call sub1 (pp(1::i)%value, size(pp(1::i)%value)) |
| call sub2 (pp(1::i)%value, size(pp(1::i)%value)) |
| i = 2 |
| call foo (pp(1::i)%name, size(pp(1::i)%name)) |
| call sub1 (pp(1::i)%value, size(pp(1::i)%value)) |
| call sub2 (pp(1::i)%value, size(pp(1::i)%value)) |
| end program |
| |
| subroutine sub2 (a, n) |
| integer, intent(in) :: n |
| real :: a(n) |
| end |
| |
| subroutine foo (s, n) |
| integer, intent(in) :: n |
| character(*) :: s(*) |
| ! print *, len(s), n, s(n) |
| end |