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
|
module class_87_mod
implicit none
type, abstract :: toml_value
end type toml_value
type :: xx
integer :: v = 0
end type xx
type, extends(toml_value) :: toml_table
class(xx), allocatable :: data
end type toml_table
contains
function cast_to_table(ptr) result(table)
class(toml_value), intent(in), target :: ptr
type(toml_table), pointer :: table
nullify(table)
select type (ptr)
type is (toml_table)
table => ptr
end select
end function cast_to_table
end module class_87_mod
program class_87
use class_87_mod
implicit none
class(toml_value), allocatable :: t
type(toml_table) :: p
! Allocate polymorphic object
allocate(toml_table :: t)
! Allocate component
select type (t)
type is (toml_table)
allocate(t%data)
t%data%v = 42
class default
error stop "Wrong dynamic type"
end select
p = cast_to_table(t)
if (.not. allocated(p%data)) then
error stop "allocatable member not allocated"
end if
if (p%data%v /= 42) then
error stop "data value corrupted"
end if
print *, "TEST PASSED"
end program class_87
|