blob: d804d62f400c300b6ced248c023a6fbb4d30fac7 [file] [log] [blame]
! { dg-do run }
!
! Tests fixes for various pr87477 dependencies
!
! Contributed by Gerhard Steinmetz <gscfq@t-online.de> except for pr102106:
! which was contributed by Brad Richardson <everythingfunctional@protonmail.com>
!
program associate_60
implicit none
character(20) :: buffer
call pr102106
call pr100948
call pr85686
call pr88247
call pr91941
call pr92779
call pr93339
call pr93813
contains
subroutine pr102106
type :: sub_class_t
integer :: i
end type
type :: with_polymorphic_component_t
class(sub_class_t), allocatable :: sub_obj_
end type
associate(obj => with_polymorphic_component_t(sub_class_t(42)))
if (obj%sub_obj_%i .ne. 42) stop 1
end associate
end
subroutine pr100948
type t
character(:), allocatable :: c(:)
end type
type(t), allocatable :: x
!
! Valid test in comment 1
!
x = t(['ab','cd'])
associate (y => x%c(:))
if (any (y .ne. x%c)) stop 2
if (any (y .ne. ['ab','cd'])) stop 3
end associate
deallocate (x)
!
! Allocation with source was found to only copy over one of the array elements
!
allocate (x, source = t(['ef','gh']))
associate (y => x%c(:))
if (any (y .ne. x%c)) stop 4
if (any (y .ne. ['ef','gh'])) stop 5
end associate
deallocate (x)
end
subroutine pr85686
call s85686([" g'day "," bye!! "])
if (trim (buffer) .ne. " a g'day a bye!!") stop 6
end
subroutine s85686(x)
character(*) :: x(:)
associate (y => 'a'//x)
write (buffer, *) y ! Used to segfault at the write statement.
end associate
end
subroutine pr88247
type t
character(:), dimension(:), allocatable :: d
end type t
type(t), allocatable :: x
character(5) :: buffer(3)
allocate (x, source = t (['ab','cd'])) ! Didn't work
write(buffer(1), *) x%d(2:1:-1) ! Was found to be broken
write(buffer(2), *) [x%d(2:1:-1)] ! Was OK
associate (y => [x%d(2:1:-1)])
write(buffer(3), *) y ! Bug in comment 7
end associate
if (any (buffer .ne. " cdab")) stop 7
end
subroutine pr91941
character(:), allocatable :: x(:), z(:)
x = [' abc', ' xyz']
z = adjustl(x)
associate (y => adjustl(x)) ! Wrong character length was passed
if (any(y .ne. ['abc ', 'xyz '])) stop 8
end associate
end
subroutine pr92779
character(3) :: a = 'abc'
associate (y => spread(trim(a),1,2) // 'd')
if (any (y .ne. ['abcd','abcd'])) stop 9
end associate
end
subroutine pr93339
type t
character(:), allocatable :: a(:)
end type
type(t) :: x
x = t(["abc "]) ! Didn't assign anything
! allocate (x%a(1), source = 'abc') ! Worked OK
associate (y => x%a)
if (any (y .ne. 'abc ')) stop 10
associate (z => x%a)
if (any (y .ne. z)) stop 11
end associate
end associate
end
subroutine pr93813
type t
end type
type, extends(t) :: t2
end type
class(t), allocatable :: x
integer :: i = 0
allocate (t :: x)
associate (y => (x)) ! The parentheses triggered an ICE in select type
select type (y)
type is (t2)
stop 12
type is (t)
i = 42
class default
stop 13
end select
end associate
if (i .ne. 42) stop 14
end
end