xref: /llvm-project/flang/test/Semantics/modfile10.f90 (revision dc453dcf760e6d558da3a4d7fff301baa5f37aba)
1*dc453dcfSIvan Zhechev! RUN: %python %S/test_modfile.py %s %flang_fc1
264ab3302SCarolineConcatto! Test writing procedure bindings in a derived type.
364ab3302SCarolineConcatto
464ab3302SCarolineConcattomodule m
564ab3302SCarolineConcatto  interface
664ab3302SCarolineConcatto    subroutine a(i, j)
764ab3302SCarolineConcatto      integer :: i, j
864ab3302SCarolineConcatto    end subroutine
964ab3302SCarolineConcatto  end interface
1064ab3302SCarolineConcatto  type, abstract :: t
1164ab3302SCarolineConcatto    integer :: i
1264ab3302SCarolineConcatto  contains
1364ab3302SCarolineConcatto    procedure(a), deferred, nopass :: q
1464ab3302SCarolineConcatto    procedure(b), deferred, nopass :: p, r
1564ab3302SCarolineConcatto  end type
1664ab3302SCarolineConcatto  type t2
1764ab3302SCarolineConcatto    integer :: x
1864ab3302SCarolineConcatto  contains
1964ab3302SCarolineConcatto    private
2064ab3302SCarolineConcatto    final :: c
2164ab3302SCarolineConcatto    procedure, non_overridable :: d
2264ab3302SCarolineConcatto  end type
2364ab3302SCarolineConcatto  type, abstract :: t2a
2464ab3302SCarolineConcatto  contains
2564ab3302SCarolineConcatto    procedure(a), deferred, public, nopass :: e
2664ab3302SCarolineConcatto  end type
2764ab3302SCarolineConcatto  type t3
2864ab3302SCarolineConcatto    sequence
2964ab3302SCarolineConcatto    integer i
3064ab3302SCarolineConcatto    real x
3164ab3302SCarolineConcatto    double precision y
3264ab3302SCarolineConcatto    double complex z
3364ab3302SCarolineConcatto  end type
3464ab3302SCarolineConcattocontains
3564ab3302SCarolineConcatto  subroutine b()
3664ab3302SCarolineConcatto  end subroutine
3764ab3302SCarolineConcatto  subroutine c(x)
3864ab3302SCarolineConcatto    type(t2) :: x
3964ab3302SCarolineConcatto  end subroutine
4064ab3302SCarolineConcatto  subroutine d(x)
4164ab3302SCarolineConcatto    class(t2) :: x
4264ab3302SCarolineConcatto  end subroutine
4364ab3302SCarolineConcatto  subroutine test
4464ab3302SCarolineConcatto    type(t2) :: x
4564ab3302SCarolineConcatto    call x%d()
4664ab3302SCarolineConcatto  end subroutine
4764ab3302SCarolineConcattoend module
4864ab3302SCarolineConcatto
4964ab3302SCarolineConcatto!Expect: m.mod
5064ab3302SCarolineConcatto!module m
5164ab3302SCarolineConcatto!  interface
5264ab3302SCarolineConcatto!    subroutine a(i,j)
5364ab3302SCarolineConcatto!      integer(4)::i
5464ab3302SCarolineConcatto!      integer(4)::j
5564ab3302SCarolineConcatto!    end
5664ab3302SCarolineConcatto!  end interface
5764ab3302SCarolineConcatto!  type,abstract::t
5864ab3302SCarolineConcatto!    integer(4)::i
5964ab3302SCarolineConcatto!  contains
6064ab3302SCarolineConcatto!    procedure(a),deferred,nopass::q
6164ab3302SCarolineConcatto!    procedure(b),deferred,nopass::p
6264ab3302SCarolineConcatto!    procedure(b),deferred,nopass::r
6364ab3302SCarolineConcatto!  end type
6464ab3302SCarolineConcatto!  type::t2
6564ab3302SCarolineConcatto!    integer(4)::x
6664ab3302SCarolineConcatto!  contains
6764ab3302SCarolineConcatto!    procedure,non_overridable,private::d
6837b2e2b0Speter klausler!    final::c
6964ab3302SCarolineConcatto!  end type
7064ab3302SCarolineConcatto!  type,abstract::t2a
7164ab3302SCarolineConcatto!  contains
7264ab3302SCarolineConcatto!    procedure(a),deferred,nopass::e
7364ab3302SCarolineConcatto!  end type
7464ab3302SCarolineConcatto!  type::t3
7564ab3302SCarolineConcatto!    sequence
7664ab3302SCarolineConcatto!    integer(4)::i
7764ab3302SCarolineConcatto!    real(4)::x
7864ab3302SCarolineConcatto!    real(8)::y
7964ab3302SCarolineConcatto!    complex(8)::z
8064ab3302SCarolineConcatto!  end type
8164ab3302SCarolineConcatto!contains
8264ab3302SCarolineConcatto!  subroutine b()
8364ab3302SCarolineConcatto!  end
8464ab3302SCarolineConcatto!  subroutine c(x)
8564ab3302SCarolineConcatto!    type(t2)::x
8664ab3302SCarolineConcatto!  end
8764ab3302SCarolineConcatto!  subroutine d(x)
8864ab3302SCarolineConcatto!    class(t2)::x
8964ab3302SCarolineConcatto!  end
9064ab3302SCarolineConcatto!  subroutine test()
9164ab3302SCarolineConcatto!  end
9264ab3302SCarolineConcatto!end
93d55627d2STim Keith
94d55627d2STim Keith! Ensure the type is emitted before its use
95d55627d2STim Keithmodule m2
96d55627d2STim Keith  private s
97d55627d2STim Keith  type :: t
98d55627d2STim Keith  contains
99d55627d2STim Keith    procedure :: foo
100d55627d2STim Keith  end type
101d55627d2STim Keith  abstract interface
102d55627d2STim Keith    subroutine s(x)
103d55627d2STim Keith      import
104d55627d2STim Keith      type(t) :: x
105d55627d2STim Keith    end subroutine
106d55627d2STim Keith  end interface
107d55627d2STim Keithcontains
108d55627d2STim Keith  subroutine foo(x)
109d55627d2STim Keith    class(t) :: x
110d55627d2STim Keith  end subroutine
111d55627d2STim Keithend module
112d55627d2STim Keith!Expect: m2.mod
113d55627d2STim Keith!module m2
114d55627d2STim Keith!  type::t
115d55627d2STim Keith!  contains
116d55627d2STim Keith!    procedure::foo
117d55627d2STim Keith!  end type
118d55627d2STim Keith!  private::s
119d55627d2STim Keith!  abstract interface
120d55627d2STim Keith!    subroutine s(x)
121d55627d2STim Keith!      import::t
122d55627d2STim Keith!      type(t)::x
123d55627d2STim Keith!    end
124d55627d2STim Keith!  end interface
125d55627d2STim Keith!contains
126d55627d2STim Keith!  subroutine foo(x)
127d55627d2STim Keith!    class(t)::x
128d55627d2STim Keith!  end
129d55627d2STim Keith!end
130