1! { dg-do compile }
2! { dg-options "-std=f2008" }
3!
4! PR fortran/45170
5!
6! Character deferred type parameter
7!
8
9subroutine one(x, y) ! { dg-error "Entity .y. at .1. has a deferred type parameter" }
10  implicit none
11  character(len=:), pointer :: x
12  character(len=:) :: y
13  character(len=:), allocatable, target :: str2
14  character(len=:), target :: str ! { dg-error "deferred type parameter" }
15end subroutine one
16
17subroutine two()
18  implicit none
19  character(len=:), allocatable, target :: str1(:)
20  character(len=5), save, target :: str2
21  character(len=:), pointer :: pstr => str2
22  character(len=:), pointer :: pstr2(:)
23end subroutine two
24
25subroutine three()
26!  implicit none  ! Disabled because of PR 46152
27  character(len=:), allocatable, target :: str1(:)
28  character(len=5), save, target :: str2
29  character(len=:), pointer :: pstr
30  character(len=:), pointer :: pstr2(:)
31
32  pstr => str2
33  pstr2 => str1
34  str1 = ["abc"]
35  pstr2 => str1
36
37  allocate (character(len=77) :: str1(1))
38  allocate (pstr, source=str2)
39  allocate (pstr, mold=str2)
40  allocate (pstr) ! { dg-error "requires either a type-spec or SOURCE tag" }
41  allocate (character(len=:) :: str1(1)) ! { dg-error "cannot contain a deferred type parameter" }
42
43  str1 = [ character(len=2) :: "abc" ]
44  str1 = [ character(len=:) :: "abc" ] ! { dg-error "cannot contain a deferred type parameter" }
45end subroutine three
46
47subroutine four()
48  implicit none
49  character(len=:), allocatable, target :: str
50  character(len=:), pointer :: pstr
51  pstr => str
52  str = "abc"
53  if(len(pstr) /= len(str) .or. len(str)/= 3) STOP 1
54  str = "abcd"
55  if(len(pstr) /= len(str) .or. len(str)/= 4) STOP 2
56end subroutine four
57
58subroutine five()
59character(len=4) :: str*(:)
60allocatable :: str
61end subroutine five
62
63