annotate gcc/testsuite/gfortran.dg/dynamic_dispatch_8.f03 @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ! { dg-do run }
kono
parents:
diff changeset
2 !
kono
parents:
diff changeset
3 ! PR 41829: [OOP] Runtime error with dynamic dispatching. Tests
kono
parents:
diff changeset
4 ! dynamic dispatch in a case where the caller knows nothing about
kono
parents:
diff changeset
5 ! the dynamic type at compile time.
kono
parents:
diff changeset
6 !
kono
parents:
diff changeset
7 ! Contributed by Salvatore Filippone <sfilippone@uniroma2.it>
kono
parents:
diff changeset
8 !
kono
parents:
diff changeset
9 module foo_mod
kono
parents:
diff changeset
10 type foo
kono
parents:
diff changeset
11 integer :: i
kono
parents:
diff changeset
12 contains
kono
parents:
diff changeset
13 procedure, pass(a) :: doit
kono
parents:
diff changeset
14 procedure, pass(a) :: getit
kono
parents:
diff changeset
15 end type foo
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 private doit,getit
kono
parents:
diff changeset
18 contains
kono
parents:
diff changeset
19 subroutine doit(a)
kono
parents:
diff changeset
20 class(foo) :: a
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 a%i = 1
kono
parents:
diff changeset
23 ! write(*,*) 'FOO%DOIT base version'
kono
parents:
diff changeset
24 end subroutine doit
kono
parents:
diff changeset
25 function getit(a) result(res)
kono
parents:
diff changeset
26 class(foo) :: a
kono
parents:
diff changeset
27 integer :: res
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 res = a%i
kono
parents:
diff changeset
30 end function getit
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 end module foo_mod
kono
parents:
diff changeset
33 module foo2_mod
kono
parents:
diff changeset
34 use foo_mod
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 type, extends(foo) :: foo2
kono
parents:
diff changeset
37 integer :: j
kono
parents:
diff changeset
38 contains
kono
parents:
diff changeset
39 procedure, pass(a) :: doit => doit2
kono
parents:
diff changeset
40 procedure, pass(a) :: getit => getit2
kono
parents:
diff changeset
41 end type foo2
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 private doit2, getit2
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 contains
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 subroutine doit2(a)
kono
parents:
diff changeset
48 class(foo2) :: a
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 a%i = 2
kono
parents:
diff changeset
51 a%j = 3
kono
parents:
diff changeset
52 ! write(*,*) 'FOO2%DOIT derived version'
kono
parents:
diff changeset
53 end subroutine doit2
kono
parents:
diff changeset
54 function getit2(a) result(res)
kono
parents:
diff changeset
55 class(foo2) :: a
kono
parents:
diff changeset
56 integer :: res
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 res = a%j
kono
parents:
diff changeset
59 end function getit2
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 end module foo2_mod
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 module bar_mod
kono
parents:
diff changeset
64 use foo_mod
kono
parents:
diff changeset
65 type bar
kono
parents:
diff changeset
66 class(foo), allocatable :: a
kono
parents:
diff changeset
67 contains
kono
parents:
diff changeset
68 procedure, pass(a) :: doit
kono
parents:
diff changeset
69 procedure, pass(a) :: getit
kono
parents:
diff changeset
70 end type bar
kono
parents:
diff changeset
71 private doit,getit
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 contains
kono
parents:
diff changeset
74 subroutine doit(a)
kono
parents:
diff changeset
75 class(bar) :: a
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 call a%a%doit()
kono
parents:
diff changeset
78 end subroutine doit
kono
parents:
diff changeset
79 function getit(a) result(res)
kono
parents:
diff changeset
80 class(bar) :: a
kono
parents:
diff changeset
81 integer :: res
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 res = a%a%getit()
kono
parents:
diff changeset
84 end function getit
kono
parents:
diff changeset
85 end module bar_mod
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 program testd10
kono
parents:
diff changeset
89 use foo_mod
kono
parents:
diff changeset
90 use foo2_mod
kono
parents:
diff changeset
91 use bar_mod
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 type(bar) :: a
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 allocate(foo :: a%a)
kono
parents:
diff changeset
96 call a%doit()
kono
parents:
diff changeset
97 ! write(*,*) 'Getit value : ', a%getit()
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
98 if (a%getit() .ne. 1) STOP 1
111
kono
parents:
diff changeset
99 deallocate(a%a)
kono
parents:
diff changeset
100 allocate(foo2 :: a%a)
kono
parents:
diff changeset
101 call a%doit()
kono
parents:
diff changeset
102 ! write(*,*) 'Getit value : ', a%getit()
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
103 if (a%getit() .ne. 3) STOP 2
111
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 end program testd10