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