| ! RUN: %flang_fc1 -fdebug-dump-symbols %s 2>&1 | FileCheck %s |
| module ma |
| type a |
| contains |
| procedure, private, nopass :: tbp => sub_a |
| generic :: gen => tbp |
| end type |
| type, extends(a) :: aa |
| contains |
| procedure, private, nopass :: tbp => sub_aa |
| end type |
| type, extends(aa) :: aaa |
| contains |
| procedure, public, nopass :: tbp => sub_aaa |
| end type |
| contains |
| subroutine sub_a(w) |
| character*(*), intent(in) :: w |
| print *, w, ' -> a' |
| end |
| subroutine sub_aa(w) |
| character*(*), intent(in) :: w |
| print *, w, ' -> aa' |
| end |
| subroutine sub_aaa(w) |
| character*(*), intent(in) :: w |
| print *, w, ' -> aaa' |
| end |
| subroutine mono1 |
| type(a) :: xa |
| type(aa) :: xaa |
| call xa%tbp('type(a) tbp') |
| call xaa%tbp('type(aa) tbp') |
| end |
| subroutine pa(x, w) |
| class(a), intent(in) :: x |
| character*(*), intent(in) :: w |
| call x%tbp('class(a) ' // w // ' tbp') |
| call x%gen('class(a) ' // w // ' gen') |
| end |
| subroutine pta1 |
| call pa(a(), 'a') |
| call pa(aa(), 'aa') |
| end |
| subroutine paa(x, w) |
| class(aa), intent(in) :: x |
| character*(*), intent(in) :: w |
| call x%tbp('class(aa) ' // w // ' tbp') |
| call x%gen('class(aa) ' // w // ' gen') |
| end |
| subroutine ptaa1 |
| call paa(aa(), 'aa') |
| end |
| subroutine paaa(x, w) |
| class(aaa), intent(in) :: x |
| character*(*), intent(in) :: w |
| call x%tbp('class(aaa) ' // w // ' tbp') |
| call x%gen('class(aaa) ' // w // ' gen') |
| end |
| subroutine ptaaa1 |
| call paaa(aaa(), 'aaa') |
| end |
| end |
| |
| module mb |
| use ma |
| type, extends(a) :: ab |
| contains |
| procedure, public, nopass :: tbp => sub_ab |
| end type |
| type, extends(aa) :: aab |
| contains |
| procedure, public, nopass :: tbp => sub_aab |
| end type |
| type, extends(aaa) :: aaab |
| contains |
| procedure, public, nopass :: tbp => sub_aaab |
| end type |
| type, extends(ab) :: aba |
| contains |
| procedure, public, nopass :: tbp => sub_aba |
| end type |
| type, extends(aab) :: aaba |
| contains |
| procedure, public, nopass :: tbp => sub_aaba |
| end type |
| type, extends(aaab) :: aaaba |
| contains |
| procedure, public, nopass :: tbp => sub_aaaba |
| end type |
| contains |
| subroutine sub_ab(w) |
| character*(*), intent(in) :: w |
| print *, w, ' -> ab' |
| end |
| subroutine sub_aab(w) |
| character*(*), intent(in) :: w |
| print *, w, ' -> aab' |
| end |
| subroutine sub_aaab(w) |
| character*(*), intent(in) :: w |
| print *, w, ' -> aaab' |
| end |
| subroutine sub_aba(w) |
| character*(*), intent(in) :: w |
| print *, w, ' -> aba' |
| end |
| subroutine sub_aaba(w) |
| character*(*), intent(in) :: w |
| print *, w, ' -> aaba' |
| end |
| subroutine sub_aaaba(w) |
| character*(*), intent(in) :: w |
| print *, w, ' -> aaaba' |
| end |
| end |
| |
| module t |
| use mb |
| contains |
| subroutine mono2 |
| type(a) :: xa |
| type(aa) :: xaa |
| type(aaa) :: xaaa |
| type(ab) :: xab |
| type(aab) :: xaab |
| type(aaab) :: xaaab |
| type(aba) :: xaba |
| type(aaba) :: xaaba |
| type(aaaba) :: xaaaba |
| call xa%gen('type(a) gen') |
| call xaa%gen('type(aa) gen') |
| call xaaa%tbp('type(aaa) tbp') |
| call xaaa%gen('type(aaa) gen') |
| call xab%tbp('type(ab) tbp') |
| call xab%gen('type(ab) gen') |
| call xaab%tbp('type(aab) tbp') |
| call xaab%gen('type(aab) gen') |
| call xaaab%tbp('type(aaab) tbp') |
| call xaaab%gen('type(aaab) gen') |
| call xaba%tbp('type(aba) tbp') |
| call xaba%gen('type(aba) gen') |
| call xaaba%tbp('type(aaba) tbp') |
| call xaaba%gen('type(aaba) gen') |
| call xaaaba%tbp('type(aaaba) tbp') |
| call xaaaba%gen('type(aaaba) gen') |
| end |
| subroutine pta2 |
| call pa(a(), 'a') |
| call pa(aa(), 'aa') |
| call pa(aaa(), 'aaa') |
| call pa(ab(), 'ab') |
| call pa(aab(), 'aab') |
| call pa(aaab(), 'aaab') |
| call pa(aba(), 'aba') |
| call pa(aaba(), 'aaba') |
| call pa(aaaba(), 'aaaba') |
| end |
| subroutine ptaa2 |
| call paa(aa(), 'aa') |
| call paa(aaa(), 'aaa') |
| call paa(aab(), 'aab') |
| call paa(aaab(), 'aaab') |
| call paa(aaba(), 'aaba') |
| call paa(aaaba(), 'aaaba') |
| end |
| subroutine ptaaa2 |
| call paaa(aaa(), 'aaa') |
| call paaa(aaab(), 'aaab') |
| call paaa(aaaba(), 'aaaba') |
| end |
| subroutine pab(x, w) |
| class(ab), intent(in) :: x |
| character*(*), intent(in) :: w |
| call x%tbp('class(ab) ' // w // ' tbp') |
| call x%gen('class(ab) ' // w // ' gen') |
| end |
| subroutine ptab |
| call pab(ab(), 'ab') |
| call pab(aba(), 'aba') |
| end |
| subroutine paab(x, w) |
| class(aab), intent(in) :: x |
| character*(*), intent(in) :: w |
| call x%tbp('class(aab) ' // w // ' tbp') |
| call x%gen('class(aab) ' // w // ' gen') |
| end |
| subroutine ptaab |
| call pa(aab(), 'aab') |
| call pa(aaba(), 'aaba') |
| end |
| subroutine paaab(x, w) |
| class(aaab), intent(in) :: x |
| character*(*), intent(in) :: w |
| call x%tbp('class(aaab) ' // w // ' tbp') |
| call x%gen('class(aaab) ' // w // ' gen') |
| end |
| subroutine ptaaab |
| call pa(aaab(), 'aaab') |
| call pa(aaaba(), 'aaaba') |
| end |
| subroutine paba(x, w) |
| class(aba), intent(in) :: x |
| character*(*), intent(in) :: w |
| call x%tbp('class(aba) ' // w // ' tbp') |
| call x%gen('class(aba) ' // w // ' gen') |
| end |
| subroutine ptaba |
| call paba(aba(), 'aba') |
| end |
| subroutine paaba(x, w) |
| class(aaba), intent(in) :: x |
| character*(*), intent(in) :: w |
| call x%tbp('class(aaba) ' // w // ' tbp') |
| call x%gen('class(aaba) ' // w // ' gen') |
| end |
| subroutine ptaaba |
| call paaba(aaba(), 'aaba') |
| end |
| subroutine paaaba(x, w) |
| class(aaaba), intent(in) :: x |
| character*(*), intent(in) :: w |
| call x%tbp('class(aaaba) ' // w // ' tbp') |
| call x%gen('class(aaaba) ' // w // ' gen') |
| end |
| subroutine ptaaaba |
| call pa(aaaba(), 'aaaba') |
| end |
| end |
| |
| program main |
| use t |
| call mono1 |
| call mono2 |
| call pta1 |
| call ptaa1 |
| call ptaaa1 |
| call pta2 |
| call ptaa2 |
| call ptaaa2 |
| call ptab |
| call ptaab |
| call ptaaab |
| call ptaba |
| call ptaaba |
| call ptaaaba |
| end |
| |
| !CHECK: .v.a, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(binding) shape: 0_8:0_8 init:[binding::binding(proc=sub_a,name=.n.tbp)] |
| !CHECK: .v.aa, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(binding) shape: 0_8:0_8 init:[binding::binding(proc=sub_aa,name=.n.tbp)] |
| !CHECK: .v.aaa, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(binding) shape: 0_8:0_8 init:[binding::binding(proc=sub_aaa,name=.n.tbp)] |
| !CHECK: .v.aaab, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(binding) shape: 0_8:0_8 init:[binding::binding(proc=sub_aaab,name=.n.tbp)] |
| !CHECK: .v.aaaba, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(binding) shape: 0_8:0_8 init:[binding::binding(proc=sub_aaaba,name=.n.tbp)] |
| !CHECK: .v.aab, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(binding) shape: 0_8:1_8 init:[binding::binding(proc=sub_aa,name=.n.tbp),binding(proc=sub_aab,name=.n.tbp)] |
| !CHECK: .v.aaba, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(binding) shape: 0_8:1_8 init:[binding::binding(proc=sub_aa,name=.n.tbp),binding(proc=sub_aaba,name=.n.tbp)] |
| !CHECK: .v.ab, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(binding) shape: 0_8:1_8 init:[binding::binding(proc=sub_a,name=.n.tbp),binding(proc=sub_ab,name=.n.tbp)] |
| !CHECK: .v.aba, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(binding) shape: 0_8:1_8 init:[binding::binding(proc=sub_a,name=.n.tbp),binding(proc=sub_aba,name=.n.tbp)] |
| !CHECK: tbp, NOPASS, PUBLIC: ProcBinding => sub_ab numPrivatesNotOverridden: 1 |
| !CHECK: tbp, NOPASS, PUBLIC: ProcBinding => sub_aab numPrivatesNotOverridden: 1 |
| !CHECK: tbp, NOPASS, PUBLIC: ProcBinding => sub_aba numPrivatesNotOverridden: 1 |
| !CHECK: tbp, NOPASS, PUBLIC: ProcBinding => sub_aaba numPrivatesNotOverridden: 1 |