-
Notifications
You must be signed in to change notification settings - Fork 11.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[flang] Detect circularly defined procedures
It's possible to define a procedure that has a procedure dummy argument which names the procedure that contains it. This was causing the compiler to fall into an infinite loop when characterizing a call to the procedure. Following a suggestion from Peter, I fixed this be maintaining a set of procedure symbols that had already been seen while characterizing a procedure. This required passing a new parameter to the functions that characterized a Procedure, a DummyArgument, and a DummyProcedure. I also added several tests that will crash the compiler without this change. Differential Revision: https://reviews.llvm.org/D96631
- Loading branch information
1 parent
bfa4235
commit 77dc203
Showing
3 changed files
with
204 additions
and
106 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
! RUN: %S/test_errors.sh %s %t %f18 | ||
|
||
! 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 |