1! Program to test STATEMENT function 2program st_fuction 3 call simple_case 4 call with_function_call 5 call with_character_dummy 6 call with_derived_type_dummy 7 call with_pointer_dummy 8 call multiple_eval 9 10contains 11 subroutine simple_case 12 integer st1, st2 13 integer c(10, 10) 14 st1 (i, j) = i + j 15 st2 (i, j) = c(i, j) 16 17 if (st1 (1, 2) .ne. 3) call abort 18 c = 3 19 if (st2 (1, 2) .ne. 3 .or. st2 (2, 3) .ne. 3) call abort 20 end subroutine 21 22 subroutine with_function_call 23 integer fun, st3 24 st3 (i, j) = fun (i) + fun (j) 25 26 if (st3 (fun (2), 4) .ne. 16) call abort 27 end subroutine 28 29 subroutine with_character_dummy 30 character (len=4) s1, s2, st4 31 character (len=10) st5, s0 32 st4 (i, j) = "0123456789"(i:j) 33 st5 (s1, s2) = s1 // s2 34 35 if (st4 (1, 4) .ne. "0123" ) call abort 36 if (st5 ("01", "02") .ne. "01 02 ") call abort ! { dg-warning "Character length of actual argument shorter" } 37 end subroutine 38 39 subroutine with_derived_type_dummy 40 type person 41 integer age 42 character (len=50) name 43 end type person 44 type (person) me, p, tom 45 type (person) st6 46 st6 (p) = p 47 48 me%age = 5 49 me%name = "Tom" 50 tom = st6 (me) 51 if (tom%age .ne. 5) call abort 52 if (tom%name .gt. "Tom") call abort 53 end subroutine 54 55 subroutine with_pointer_dummy 56 character(len=4), pointer:: p, p1 57 character(len=4), target:: i 58 character(len=6) a 59 a (p) = p // '10' 60 61 p1 => i 62 i = '1234' 63 if (a (p1) .ne. '123410') call abort 64 end subroutine 65 66 subroutine multiple_eval 67 integer st7, fun2, fun 68 69 st7(i) = i + fun(i) 70 71 if (st7(fun2(10)) .ne. 3) call abort 72 end subroutine 73end 74 75! This functon returns the argument passed on the previous call. 76integer function fun2 (i) 77 integer i 78 integer, save :: val = 1 79 80 fun2 = val 81 val = i 82end function 83 84integer function fun (i) 85 integer i 86 fun = i * 2 87end function 88