! { 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) call abort () | |

if (any (test2 (10) .ne. chr)) call abort () | |

end program test | |

pure function f (x) | |

integer, intent(in) :: x | |

integer f | |

f = 2*x+1 | |

end function f |