blob: 885dcb63192eec0d2facdda86c4e13b14cf76eb1 [file] [log] [blame]
! { dg-do compile }
! { dg-options "-std=f2008" }
!
! PR fortran/45170
!
! Character deferred type parameter
!
subroutine one(x, y) ! { dg-error "Entity .y. at .1. has a deferred type parameter" }
implicit none
character(len=:), pointer :: x
character(len=:) :: y
character(len=:), allocatable, target :: str2
character(len=:), target :: str ! { dg-error "deferred type parameter" }
end subroutine one
subroutine two()
implicit none
character(len=:), allocatable, target :: str1(:)
character(len=5), save, target :: str2
character(len=:), pointer :: pstr => str2
character(len=:), pointer :: pstr2(:)
end subroutine two
subroutine three()
! implicit none ! Disabled because of PR 46152
character(len=:), allocatable, target :: str1(:)
character(len=5), save, target :: str2
character(len=:), pointer :: pstr
character(len=:), pointer :: pstr2(:)
pstr => str2
pstr2 => str1
str1 = ["abc"]
pstr2 => str1
allocate (character(len=77) :: str1(1))
allocate (pstr, source=str2)
allocate (pstr, mold=str2)
allocate (pstr) ! { dg-error "requires either a type-spec or SOURCE tag" }
allocate (character(len=:) :: str1(1)) ! { dg-error "cannot contain a deferred type parameter" }
str1 = [ character(len=2) :: "abc" ]
str1 = [ character(len=:) :: "abc" ] ! { dg-error "cannot contain a deferred type parameter" }
end subroutine three
subroutine four()
implicit none
character(len=:), allocatable, target :: str
character(len=:), pointer :: pstr
pstr => str
str = "abc"
if(len(pstr) /= len(str) .or. len(str)/= 3) STOP 1
str = "abcd"
if(len(pstr) /= len(str) .or. len(str)/= 4) STOP 2
end subroutine four
subroutine five()
character(len=4) :: str*(:)
allocatable :: str
end subroutine five