1! { dg-do run }
2!
3! Tests the fix for PR67177 in which MOVE_ALLOC was not assigning the string
4! length for deferred length characters.
5!
6! Contributed by <templed@tcd.ie>
7!
8program str
9  implicit none
10
11  type string
12    character(:), Allocatable :: text
13  end type string
14
15  type strings
16    type(string), allocatable, dimension(:) :: strlist
17  end type strings
18
19  type(strings) :: teststrs
20  type(string) :: tmpstr
21  integer :: strlen = 20
22
23  allocate (teststrs%strlist(1))
24  allocate (character(len=strlen) :: tmpstr%text)
25
26  allocate (character(len=strlen) :: teststrs%strlist(1)%text)
27
28! Full string reference was required because reallocation on assignment is
29! functioning when it should not if the lhs is a substring - PR67977
30  tmpstr%text(1:3) = 'foo'
31
32  if (.not.allocated (teststrs%strlist(1)%text)) call abort
33  if (len (tmpstr%text) .ne. strlen) call abort
34
35  call move_alloc(tmpstr%text,teststrs%strlist(1)%text)
36
37  if (.not.allocated (teststrs%strlist(1)%text)) call abort
38  if (len (teststrs%strlist(1)%text) .ne. strlen) call abort
39  if (trim (teststrs%strlist(1)%text(1:3)) .ne. 'foo') call abort
40
41! Clean up so that valgrind reports all allocated memory freed.
42  if (allocated (teststrs%strlist(1)%text)) deallocate (teststrs%strlist(1)%text)
43  if (allocated (teststrs%strlist)) deallocate (teststrs%strlist)
44end program str
45