1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
module class_56_mod1
implicit none
type :: toml_value
integer :: x = 0
contains
procedure :: accept
end type
type :: string_t
character(len=:), allocatable :: s
end type string_t
contains
subroutine accept(self)
class(toml_value), intent(inout) :: self
self%x = self%x + 1
end subroutine
end module
module class_56_mod2
use class_56_mod1
implicit none
type :: ser_config
contains
procedure :: temp
procedure :: temp2
end type
contains
subroutine temp(self, val)
class(ser_config), intent(inout) :: self
class(toml_value), intent(inout) :: val
select type(val)
type is (toml_value)
call val%accept()
class default
print *, "Unknown type"
end select
end subroutine
subroutine temp2(self, val)
class(ser_config), intent(inout) :: self
class(toml_value), intent(inout) :: val
select type(val)
class is (toml_value)
call val%accept()
class default
print *, "Unknown type"
end select
end subroutine
subroutine pkgcfg_list_all(descriptions)
type(string_t), optional, allocatable, intent(out) :: descriptions(:)
allocate(descriptions(2))
descriptions(1)%s = "Package 1"
descriptions(2)%s = "Package 2"
end subroutine
end module
program class_56
use class_56_mod2
implicit none
type(ser_config) :: cfg
type(toml_value) :: v
type(string_t), allocatable :: descriptions(:)
v%x = 1
call cfg%temp(v)
if (v%x /= 2) error stop
call cfg%temp2(v)
if (v%x /= 3) error stop
call pkgcfg_list_all(descriptions)
if (descriptions(1)%s /= "Package 1") error stop
if (descriptions(2)%s /= "Package 2") error stop
end program
|