comparison gcc/testsuite/gfortran.dg/dynamic_dispatch_8.f03 @ 111:04ced10e8804

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