blob: 293dce84838d093669bca1e5f958ea6a54765b85 [file] [log] [blame] [edit]
! { dg-do run }
!
! Contributed by Neil Carlson <neil.n.carlson@gmail.com>
!
program main
character(2) :: c
type :: S
integer :: n
end type
type(S) :: Sobj
type, extends(S) :: S2
integer :: m
end type
type(S2) :: S2obj
type :: T
class(S), allocatable :: x
end type
type tContainer
class(*), allocatable :: x
end type
type(T) :: Tobj
Sobj = S(1)
Tobj = T(Sobj)
S2obj = S2(1,2)
Tobj = T(S2obj) ! Failed here
select type (x => Tobj%x)
type is (S2)
if ((x%n .ne. 1) .or. (x%m .ne. 2)) stop 1
class default
stop 2
end select
c = " "
call pass_it (T(Sobj))
if (c .ne. "S ") stop 3
call pass_it (T(S2obj)) ! and here
if (c .ne. "S2") stop 4
call bar
contains
subroutine pass_it (foo)
type(T), intent(in) :: foo
select type (x => foo%x)
type is (S)
c = "S "
if (x%n .ne. 1) stop 5
type is (S2)
c = "S2"
if ((x%n .ne. 1) .or. (x%m .ne. 2)) stop 6
class default
stop 7
end select
end subroutine
subroutine check_it (t, errno)
type(tContainer) :: t
integer :: errno
select type (x => t%x)
type is (integer)
if (x .ne. 42) stop errno
type is (integer(8))
if (x .ne. 42_8) stop errno
type is (real(8))
if (int(x**2) .ne. 2) stop errno
type is (character(*, kind=1))
if (x .ne. "end of tests") stop errno
type is (character(*, kind=4))
if ((x .ne. 4_"hello!") .and. (x .ne. 4_"goodbye")) stop errno
class default
stop errno
end select
end subroutine
subroutine bar
! Test from comment #29 extended by Harald Anlauf to check kinds /= default
integer(8), parameter :: i = 0_8
integer :: j = 42
character(7,kind=4) :: chr4 = 4_"goodbye"
type(tContainer) :: cont
cont%x = j
call check_it (cont, 8)
cont = tContainer(i+42_8)
call check_it (cont, 9)
cont = tContainer(sqrt (2.0_8))
call check_it (cont, 10)
cont = tContainer(4_"hello!")
call check_it (cont, 11)
cont = tContainer(chr4)
call check_it (cont, 12)
cont = tContainer("end of tests")
call check_it (cont, 13)
end subroutine bar
end program