-
Notifications
You must be signed in to change notification settings - Fork 10.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[flang] Enable more usage of generics with forward-referenced specifi…
…cs in specification parts Earlier work allowed a specification expression to reference a generic function that was defined earlier, so long as the relevant specific procedure of the generic had been defined before the generic. This patch extends that work so that the generic can also be used in cases where the relevant specific procedure has been defined after the generic and before the reference. Differential Revision: https://reviews.llvm.org/D159034
- Loading branch information
Showing
2 changed files
with
113 additions
and
34 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
! RUN: %python %S/test_symbols.py %s %flang_fc1 | ||
! References to generic functions with forward-referenced specifics. | ||
!DEF: /m Module | ||
module m | ||
contains | ||
!DEF: /m/specific4 PUBLIC (Function) Subprogram INTEGER(4) | ||
!DEF: /m/specific4/x INTENT(IN) ObjectEntity INTEGER(4) | ||
integer function specific4(x) | ||
!REF: /m/specific4/x | ||
integer, intent(in) :: x(*) | ||
end function | ||
!DEF: /m/test PUBLIC (Subroutine) Subprogram | ||
!DEF: /m/test/specific1 EXTERNAL (Function) Subprogram INTEGER(4) | ||
subroutine test (specific1) | ||
!DEF: /m/test/generic (Function) Generic | ||
interface generic | ||
!REF: /m/test/specific1 | ||
procedure :: specific1 | ||
!DEF: /m/test/specific2 EXTERNAL, PURE (Function) Subprogram INTEGER(4) | ||
procedure :: specific2 | ||
!DEF: /m/test/specific3 EXTERNAL (Function) Subprogram INTEGER(4) | ||
procedure :: specific3 | ||
!DEF: /m/test/specific4 EXTERNAL (Function) Subprogram INTEGER(4) | ||
procedure :: specific4 | ||
end interface | ||
interface | ||
!REF: /m/test/specific1 | ||
!DEF: /m/test/specific1/x INTENT(IN) ObjectEntity INTEGER(4) | ||
integer function specific1(x) | ||
!REF: /m/test/specific1/x | ||
integer, intent(in) :: x | ||
end function | ||
!REF: /m/test/specific2 | ||
!DEF: /m/test/specific2/x INTENT(IN) ObjectEntity INTEGER(4) | ||
!DEF: /m/test/specific2/y INTENT(IN) ObjectEntity INTEGER(4) | ||
pure integer function specific2(x, y) | ||
!REF: /m/test/specific2/x | ||
!REF: /m/test/specific2/y | ||
integer, intent(in) :: x, y | ||
end function | ||
!REF: /m/test/specific3 | ||
!DEF: /m/test/specific3/x INTENT(IN) ObjectEntity INTEGER(4) | ||
!DEF: /m/test/specific3/y INTENT(IN) ObjectEntity INTEGER(4) | ||
integer function specific3(x, y) | ||
!REF: /m/test/generic | ||
import :: generic | ||
!REF: /m/test/specific3/x | ||
!REF: /m/test/specific3/y | ||
!REF: /m/test/specific2 | ||
integer, intent(in) :: x, y(generic(1, x)) | ||
end function | ||
!REF: /m/test/specific4 | ||
!DEF: /m/test/specific4/x INTENT(IN) ObjectEntity INTEGER(4) | ||
integer function specific4(x) | ||
!REF: /m/test/specific4/x | ||
integer, intent(in) :: x(:) | ||
end function | ||
end interface | ||
!REF: /m/test/specific4 | ||
print *, generic([1]) | ||
end subroutine | ||
end module |