| ! { dg-do run } |
| ! Test the fix for PR31293. |
| ! |
| ! File: interface4.f90 |
| ! http://home.comcast.net/%7Ekmbtib/Fortran_stuff/interface4.f90 |
| ! Public domain 2004 James Van Buskirk |
| ! Second attempt to actually create function with LEN |
| ! given by specification expression via function name, |
| ! and SIZE given by specification expression via |
| ! result name. |
| |
| ! g95 12/18/04: Error: Circular specification in variable 'r'. |
| ! ISO/IEC 1539-1:1997(E) section 512.5.2.2: |
| ! "If RESULT is specified, the name of the result variable |
| ! of the function is result-name, its characteristics |
| ! (12.2.2) are those of the function result, and..." |
| ! Also from the same section: |
| ! The type and type parameters (if any) of the result of the |
| ! function subprogram may be specified by a type specification |
| ! in the FUNCTION statement or by the name of the result variable |
| ! appearing in a type statement in the declaration part of the |
| ! function subprogram. It shall not be specified both ways." |
| ! Also in section 7.1.6.2: |
| ! "A restricted expression is one in which each operation is |
| ! intrinsic and each primary is |
| ! ... |
| ! (7) A reference to an intrinsic function that is |
| ! ... |
| ! (c) the character inquiry function LEN, |
| ! ... |
| ! and where each primary of the function is |
| ! ... |
| ! (b) a variable whose properties inquired about are not |
| ! (i) dependent on the upper bound of the last |
| ! dimension of an assumed-shape array. |
| ! (ii) defined by an expression that is not a |
| ! restricted expression |
| ! (iii) definable by an ALLOCATE or pointer |
| ! assignment statement." |
| ! So I think there is no problem with the specification of |
| ! the function result attributes; g95 flunks. |
| |
| ! CVF 6.6C3: Error: This name does not have a type, and must |
| ! have an explicit type. [R] |
| ! Clearly R has a type here: the type and type parameters of |
| ! the function result; CVF flunks. |
| |
| ! LF95 5.70f: Type parameters or bounds of variable r may |
| ! not be inquired. |
| ! Again, the type parameters, though not the bounds, of |
| ! variable r may in fact be inquired; LF95 flunks. |
| |
| module test1 |
| implicit none |
| contains |
| character(f (x)) function test2 (x) result(r) |
| implicit integer (x) |
| dimension r(modulo (len (r) - 1, 3) + 1) |
| integer, intent(in) :: x |
| interface |
| pure function f (x) |
| integer, intent(in) :: x |
| integer f |
| end function f |
| end interface |
| integer i |
| |
| do i = 1, len (r) |
| r(:)(i:i) = achar (mod (i, 32) + iachar ('@')) |
| end do |
| end function test2 |
| end module test1 |
| |
| program test |
| use test1 |
| implicit none |
| character(21) :: chr (3) |
| chr = "ABCDEFGHIJKLMNOPQRSTU" |
| |
| if (len (test2 (10)) .ne. 21) STOP 1 |
| if (any (test2 (10) .ne. chr)) STOP 2 |
| end program test |
| |
| pure function f (x) |
| integer, intent(in) :: x |
| integer f |
| |
| f = 2*x+1 |
| end function f |