summaryrefslogtreecommitdiff
path: root/flang/test/Semantics/bindings06.f90
diff options
context:
space:
mode:
Diffstat (limited to 'flang/test/Semantics/bindings06.f90')
-rw-r--r--flang/test/Semantics/bindings06.f9081
1 files changed, 81 insertions, 0 deletions
diff --git a/flang/test/Semantics/bindings06.f90 b/flang/test/Semantics/bindings06.f90
new file mode 100644
index 000000000000..0ff5d62b2bed
--- /dev/null
+++ b/flang/test/Semantics/bindings06.f90
@@ -0,0 +1,81 @@
+! RUN: %flang_fc1 -fdebug-dump-symbols %s 2>&1 | FileCheck %s
+module ma
+ type a
+ contains
+ procedure, private, nopass :: tbp_private => sub_a1
+ procedure, public, nopass :: tbp_public => sub_a2
+ generic, public :: gen => tbp_private, tbp_public
+ end type
+ contains
+ subroutine sub_a1(w)
+ character*(*), intent(in) :: w
+ print *, w, ' -> a1'
+ end
+ subroutine sub_a2(w, j)
+ character*(*), intent(in) :: w
+ integer, intent(in) :: j
+ print *, w, ' -> a2'
+ end
+ subroutine test_mono_a
+ type(a) x
+ call x%tbp_private('type(a) tbp_private')
+ call x%tbp_public('type(a) tbp_public', 0)
+ call x%gen('type(a) gen 1')
+ call x%gen('type(a) gen 2', 0)
+ end
+ subroutine test_poly_a(x, w)
+ class(a), intent(in) :: x
+ character*(*), intent(in) :: w
+ call x%tbp_private('class(a) (' // w // ') tbp_private')
+ call x%tbp_public('class(a) (' // w // ') tbp_public', 0)
+ call x%gen('class(a) (' // w // ') gen 1')
+ call x%gen('class(a) (' // w // ') gen 2', 0)
+ end
+end
+
+module mb
+ use ma
+ type, extends(a) :: ab
+ contains
+ procedure, private, nopass :: tbp_private => sub_ab1
+ procedure, public, nopass :: tbp_public => sub_ab2
+ end type
+ contains
+ subroutine sub_ab1(w)
+ character*(*), intent(in) :: w
+ print *, w, ' -> ab1'
+ end
+ subroutine sub_ab2(w, j)
+ character*(*), intent(in) :: w
+ integer, intent(in) :: j
+ print *, w, ' -> ab2'
+ end
+ subroutine test_mono_ab
+ type(ab) x
+ call x%tbp_private('type(ab) tbp_private')
+ call x%tbp_public('type(ab) tbp_public', 0)
+ call x%gen('type(ab) gen 1')
+ call x%gen('type(ab) gen 2', 0)
+ end
+ subroutine test_poly_ab(x, w)
+ class(ab), intent(in) :: x
+ character*(*), intent(in) :: w
+ call x%tbp_private('class(ab) (' // w // ') tbp_private')
+ call x%tbp_public('class(ab) (' // w // ') tbp_public', 0)
+ call x%gen('class(ab) (' // w // ') gen 1')
+ call x%gen('class(ab) (' // w // ') gen 2', 0)
+ end
+end
+
+program main
+ use mb
+ call test_mono_a
+ call test_mono_ab
+ call test_poly_a(a(), 'a')
+ call test_poly_a(ab(), 'ab')
+ call test_poly_ab(ab(), 'ab')
+end
+
+!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)]
+!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)]
+!CHECK: tbp_private, NOPASS, PRIVATE: ProcBinding => sub_ab1 numPrivatesNotOverridden: 1