Merge from mainline (163495:164578).
[official-gcc/graphite-test-results.git] / gcc / testsuite / gfortran.dg / internal_dummy_3.f08
blobb5a50ee6c6c6fbd6b2ebd36b00400add82c09b5a
1 ! { dg-do run }
2 ! [ dg-options "-std=f2008" }
4 ! PR fortran/34162
5 ! Internal procedures as actual arguments (like restricted closures).
6 ! More challenging test involving recursion.
8 ! Contributed by Daniel Kraft, d@domob.eu.
10 MODULE m
11   IMPLICIT NONE
13   ABSTRACT INTERFACE
14     FUNCTION returnValue ()
15       INTEGER :: returnValue
16     END FUNCTION returnValue
17   END INTERFACE
19   PROCEDURE(returnValue), POINTER :: first
21 CONTAINS
23   RECURSIVE SUBROUTINE test (level, current, previous)
24     INTEGER, INTENT(IN) :: level
25     PROCEDURE(returnValue), OPTIONAL :: previous, current
27     IF (PRESENT (current)) THEN
28       IF (current () /= level - 1) CALL abort ()
29     END IF
31     IF (PRESENT (previous)) THEN
32       IF (previous () /= level - 2) CALL abort ()
33     END IF
35     IF (level == 1) THEN
36       first => myLevel
37     END IF
38     IF (first () /= 1) CALL abort ()
40     IF (level == 10) RETURN
42     IF (PRESENT (current)) THEN
43       CALL test (level + 1, myLevel, current)
44     ELSE
45       CALL test (level + 1, myLevel)
46     END IF
48   CONTAINS
50     FUNCTION myLevel ()
51       INTEGER :: myLevel
52       myLevel = level
53     END FUNCTION myLevel
54     
55   END SUBROUTINE test
57 END MODULE m
59 PROGRAM main
60   USE :: m
61   IMPLICIT NONE
63   CALL test (1)
64 END PROGRAM main
66 ! { dg-final { cleanup-modules "m" } }