| ! RUN: %python %S/test_errors.py %s %flang_fc1 |
| |
| ! Tests for circularly defined procedures |
| !ERROR: Procedure 'sub' is recursively defined. Procedures in the cycle: 'sub', 'p2' |
| subroutine sub(p2) |
| PROCEDURE(sub) :: p2 |
| |
| call sub() |
| end subroutine |
| |
| subroutine circular |
| !ERROR: Procedure 'p' is recursively defined. Procedures in the cycle: 'p', 'sub', 'p2' |
| procedure(sub) :: p |
| |
| call p(sub) |
| |
| contains |
| subroutine sub(p2) |
| procedure(p) :: p2 |
| end subroutine |
| end subroutine circular |
| |
| program iface |
| !ERROR: Procedure 'p' is recursively defined. Procedures in the cycle: 'p', 'sub', 'p2' |
| procedure(sub) :: p |
| interface |
| subroutine sub(p2) |
| import p |
| procedure(p) :: p2 |
| end subroutine |
| end interface |
| call p(sub) |
| end program |
| |
| Program mutual |
| Procedure(sub1) :: p |
| |
| Call p(sub) |
| |
| contains |
| !ERROR: Procedure 'sub1' is recursively defined. Procedures in the cycle: 'p', 'sub1', 'arg' |
| Subroutine sub1(arg) |
| procedure(sub1) :: arg |
| End Subroutine |
| |
| Subroutine sub(p2) |
| Procedure(sub1) :: p2 |
| End Subroutine |
| End Program |
| |
| Program mutual1 |
| Procedure(sub1) :: p |
| |
| Call p(sub) |
| |
| contains |
| !ERROR: Procedure 'sub1' is recursively defined. Procedures in the cycle: 'p', 'sub1', 'arg', 'sub', 'p2' |
| Subroutine sub1(arg) |
| procedure(sub) :: arg |
| End Subroutine |
| |
| Subroutine sub(p2) |
| Procedure(sub1) :: p2 |
| End Subroutine |
| End Program |
| |
| program twoCycle |
| !ERROR: The interface for procedure 'p1' is recursively defined |
| !ERROR: The interface for procedure 'p2' is recursively defined |
| procedure(p1) p2 |
| procedure(p2) p1 |
| call p1 |
| call p2 |
| end program |
| |
| program threeCycle |
| !ERROR: The interface for procedure 'p1' is recursively defined |
| !ERROR: The interface for procedure 'p2' is recursively defined |
| procedure(p1) p2 |
| !ERROR: The interface for procedure 'p3' is recursively defined |
| procedure(p2) p3 |
| procedure(p3) p1 |
| call p1 |
| call p2 |
| call p3 |
| end program |
| |
| module mutualSpecExprs |
| contains |
| pure integer function f(n) |
| integer, intent(in) :: n |
| real arr(g(n)) |
| f = size(arr) |
| end function |
| pure integer function g(n) |
| integer, intent(in) :: n |
| !ERROR: Procedure 'f' is referenced before being sufficiently defined in a context where it must be so |
| real arr(f(n)) |
| g = size(arr) |
| end function |
| end |