llvm / llvm-project / flang / eda5f3e1c500d89c4a053b151d7073412c3d02f2 / . / test / Semantics / resolve102.f90

! RUN: %S/test_errors.sh %s %t %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 |