! RUN: %python %S/test_modfile.py %s %flang_fc1 | |
! Test that subprogram interfaces get all of the symbols that they need. | |
module m1 | |
integer(8) :: i | |
type t1 | |
sequence | |
integer :: j | |
end type | |
type t2 | |
end type | |
end | |
!Expect: m1.mod | |
!module m1 | |
! integer(8)::i | |
! type::t1 | |
! sequence | |
! integer(4)::j | |
! end type | |
! type::t2 | |
! end type | |
!end | |
module m2 | |
integer(8) :: k | |
contains | |
subroutine s(a, j) | |
use m1 | |
integer(8) :: j | |
real :: a(i:j,1:k) ! need i from m1 | |
end | |
end | |
!Expect: m2.mod | |
!module m2 | |
! integer(8)::k | |
!contains | |
! subroutine s(a,j) | |
! use m1,only:i | |
! integer(8)::j | |
! real(4)::a(i:j,1_8:k) | |
! end | |
!end | |
module m3 | |
implicit none | |
contains | |
subroutine s(b, n) | |
type t2 | |
end type | |
type t4(l) | |
integer, len :: l | |
type(t2) :: x ! need t2 | |
end type | |
integer :: n | |
type(t4(n)) :: b | |
end | |
end module | |
!Expect: m3.mod | |
!module m3 | |
!contains | |
! subroutine s(b,n) | |
! integer(4)::n | |
! type::t2 | |
! end type | |
! type::t4(l) | |
! integer(4),len::l | |
! type(t2)::x | |
! end type | |
! type(t4(l=n))::b | |
! end | |
!end | |
module m4 | |
contains | |
subroutine s1(a) | |
use m1 | |
common /c/x,n ! x is needed | |
integer(8) :: n | |
real :: a(n) | |
type(t1) :: x | |
end | |
end | |
!Expect: m4.mod | |
!module m4 | |
!contains | |
! subroutine s1(a) | |
! use m1,only:t1 | |
! type(t1)::x | |
! common/c/x,n | |
! integer(8)::n | |
! real(4)::a(1_8:n) | |
! end | |
!end | |
module m5 | |
type t5 | |
end type | |
interface | |
subroutine s(x1,x5) | |
use m1 | |
import :: t5 | |
type(t1) :: x1 | |
type(t5) :: x5 | |
end subroutine | |
end interface | |
end | |
!Expect: m5.mod | |
!module m5 | |
! type::t5 | |
! end type | |
! interface | |
! subroutine s(x1,x5) | |
! use m1,only:t1 | |
! import::t5 | |
! type(t1)::x1 | |
! type(t5)::x5 | |
! end | |
! end interface | |
!end | |
module m6 | |
contains | |
subroutine s(x) | |
use m1 | |
type, extends(t2) :: t6 | |
end type | |
type, extends(t6) :: t7 | |
end type | |
type(t7) :: x | |
end | |
end | |
!Expect: m6.mod | |
!module m6 | |
!contains | |
! subroutine s(x) | |
! use m1,only:t2 | |
! type,extends(t2)::t6 | |
! end type | |
! type,extends(t6)::t7 | |
! end type | |
! type(t7)::x | |
! end | |
!end | |
module m7 | |
type :: t5(l) | |
integer, len :: l | |
end type | |
contains | |
subroutine s1(x) | |
use m1 | |
type(t5(i)) :: x | |
end subroutine | |
subroutine s2(x) | |
use m1 | |
character(i) :: x | |
end subroutine | |
end | |
!Expect: m7.mod | |
!module m7 | |
! type::t5(l) | |
! integer(4),len::l | |
! end type | |
!contains | |
! subroutine s1(x) | |
! use m1,only:i | |
! type(t5(l=int(i,kind=4)))::x | |
! end | |
! subroutine s2(x) | |
! use m1,only:i | |
! character(i,1)::x | |
! end | |
!end | |
module m8 | |
use m1, only: t1, t2 | |
interface | |
subroutine s1(x) | |
import | |
type(t1) :: x | |
end subroutine | |
subroutine s2(x) | |
import :: t2 | |
type(t2) :: x | |
end subroutine | |
end interface | |
end | |
!Expect: m8.mod | |
!module m8 | |
! use m1,only:t1 | |
! use m1,only:t2 | |
! interface | |
! subroutine s1(x) | |
! import::t1 | |
! type(t1)::x | |
! end | |
! end interface | |
! interface | |
! subroutine s2(x) | |
! import::t2 | |
! type(t2)::x | |
! end | |
! end interface | |
!end |