xref: /llvm-project/flang/test/Semantics/bindings06.f90 (revision 7f7bbc73175d94f63cba905191a4ecc341b9fdba)
1*7f7bbc73SPeter Klausler! RUN: %flang_fc1 -fdebug-dump-symbols %s 2>&1 | FileCheck %s
2*7f7bbc73SPeter Klauslermodule ma
3*7f7bbc73SPeter Klausler  type a
4*7f7bbc73SPeter Klausler   contains
5*7f7bbc73SPeter Klausler    procedure, private, nopass :: tbp_private => sub_a1
6*7f7bbc73SPeter Klausler    procedure, public, nopass :: tbp_public => sub_a2
7*7f7bbc73SPeter Klausler    generic, public :: gen => tbp_private, tbp_public
8*7f7bbc73SPeter Klausler  end type
9*7f7bbc73SPeter Klausler contains
10*7f7bbc73SPeter Klausler  subroutine sub_a1(w)
11*7f7bbc73SPeter Klausler    character*(*), intent(in) :: w
12*7f7bbc73SPeter Klausler    print *, w, ' -> a1'
13*7f7bbc73SPeter Klausler  end
14*7f7bbc73SPeter Klausler  subroutine sub_a2(w, j)
15*7f7bbc73SPeter Klausler    character*(*), intent(in) :: w
16*7f7bbc73SPeter Klausler    integer, intent(in) :: j
17*7f7bbc73SPeter Klausler    print *, w, ' -> a2'
18*7f7bbc73SPeter Klausler  end
19*7f7bbc73SPeter Klausler  subroutine test_mono_a
20*7f7bbc73SPeter Klausler    type(a) x
21*7f7bbc73SPeter Klausler    call x%tbp_private('type(a) tbp_private')
22*7f7bbc73SPeter Klausler    call x%tbp_public('type(a) tbp_public', 0)
23*7f7bbc73SPeter Klausler    call x%gen('type(a) gen 1')
24*7f7bbc73SPeter Klausler    call x%gen('type(a) gen 2', 0)
25*7f7bbc73SPeter Klausler  end
26*7f7bbc73SPeter Klausler  subroutine test_poly_a(x, w)
27*7f7bbc73SPeter Klausler    class(a), intent(in) :: x
28*7f7bbc73SPeter Klausler    character*(*), intent(in) :: w
29*7f7bbc73SPeter Klausler    call x%tbp_private('class(a) (' // w // ') tbp_private')
30*7f7bbc73SPeter Klausler    call x%tbp_public('class(a) (' // w // ') tbp_public', 0)
31*7f7bbc73SPeter Klausler    call x%gen('class(a) (' // w // ') gen 1')
32*7f7bbc73SPeter Klausler    call x%gen('class(a) (' // w // ') gen 2', 0)
33*7f7bbc73SPeter Klausler  end
34*7f7bbc73SPeter Klauslerend
35*7f7bbc73SPeter Klausler
36*7f7bbc73SPeter Klauslermodule mb
37*7f7bbc73SPeter Klausler  use ma
38*7f7bbc73SPeter Klausler  type, extends(a) :: ab
39*7f7bbc73SPeter Klausler   contains
40*7f7bbc73SPeter Klausler    procedure, private, nopass :: tbp_private => sub_ab1
41*7f7bbc73SPeter Klausler    procedure, public, nopass :: tbp_public => sub_ab2
42*7f7bbc73SPeter Klausler  end type
43*7f7bbc73SPeter Klausler contains
44*7f7bbc73SPeter Klausler  subroutine sub_ab1(w)
45*7f7bbc73SPeter Klausler    character*(*), intent(in) :: w
46*7f7bbc73SPeter Klausler    print *, w, ' -> ab1'
47*7f7bbc73SPeter Klausler  end
48*7f7bbc73SPeter Klausler  subroutine sub_ab2(w, j)
49*7f7bbc73SPeter Klausler    character*(*), intent(in) :: w
50*7f7bbc73SPeter Klausler    integer, intent(in) :: j
51*7f7bbc73SPeter Klausler    print *, w, ' -> ab2'
52*7f7bbc73SPeter Klausler  end
53*7f7bbc73SPeter Klausler  subroutine test_mono_ab
54*7f7bbc73SPeter Klausler    type(ab) x
55*7f7bbc73SPeter Klausler    call x%tbp_private('type(ab) tbp_private')
56*7f7bbc73SPeter Klausler    call x%tbp_public('type(ab) tbp_public', 0)
57*7f7bbc73SPeter Klausler    call x%gen('type(ab) gen 1')
58*7f7bbc73SPeter Klausler    call x%gen('type(ab) gen 2', 0)
59*7f7bbc73SPeter Klausler  end
60*7f7bbc73SPeter Klausler  subroutine test_poly_ab(x, w)
61*7f7bbc73SPeter Klausler    class(ab), intent(in) :: x
62*7f7bbc73SPeter Klausler    character*(*), intent(in) :: w
63*7f7bbc73SPeter Klausler    call x%tbp_private('class(ab) (' // w // ') tbp_private')
64*7f7bbc73SPeter Klausler    call x%tbp_public('class(ab) (' // w // ') tbp_public', 0)
65*7f7bbc73SPeter Klausler    call x%gen('class(ab) (' // w // ') gen 1')
66*7f7bbc73SPeter Klausler    call x%gen('class(ab) (' // w // ') gen 2', 0)
67*7f7bbc73SPeter Klausler  end
68*7f7bbc73SPeter Klauslerend
69*7f7bbc73SPeter Klausler
70*7f7bbc73SPeter Klauslerprogram main
71*7f7bbc73SPeter Klausler  use mb
72*7f7bbc73SPeter Klausler  call test_mono_a
73*7f7bbc73SPeter Klausler  call test_mono_ab
74*7f7bbc73SPeter Klausler  call test_poly_a(a(), 'a')
75*7f7bbc73SPeter Klausler  call test_poly_a(ab(), 'ab')
76*7f7bbc73SPeter Klausler  call test_poly_ab(ab(), 'ab')
77*7f7bbc73SPeter Klauslerend
78*7f7bbc73SPeter Klausler
79*7f7bbc73SPeter Klausler!CHECK: .v.a, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(binding) shape: 0_8:1_8 init:[binding::binding(proc=sub_a1,name=.n.tbp_private),binding(proc=sub_a2,name=.n.tbp_public)]
80*7f7bbc73SPeter Klausler!CHECK: .v.ab, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(binding) shape: 0_8:2_8 init:[binding::binding(proc=sub_a1,name=.n.tbp_private),binding(proc=sub_ab2,name=.n.tbp_public),binding(proc=sub_ab1,name=.n.tbp_private)]
81*7f7bbc73SPeter Klausler!CHECK: tbp_private, NOPASS, PRIVATE: ProcBinding => sub_ab1 numPrivatesNotOverridden: 1
82