blob: 28f24fc1e10adcb79f385f9a6f5a80153d201841 [file] [log] [blame]
! { dg-do run }
!
! Ensure that the lower bound starts with the correct
! value
!
! PR fortran/87580
! PR fortran/67125
!
! Contributed by Antony Lewis and mrestelli
!
program p
implicit none
integer, allocatable :: a(:), b(:), c(:), d(:), e(:)
type t
integer :: i
end type t
class(t), allocatable :: p1(:), p2(:), p3(:), p4(:)
integer :: vec(6)
vec = [1,2,3,4,5,6]
allocate(a, source=f(3))
allocate(b, source=g(3))
allocate(c, source=h(3))
allocate(d, source=[1,2,3,4,5])
allocate(e, source=vec)
allocate(p1(3:4))
p1(:)%i = [43,56]
allocate(p2, source=p1)
call do_allocate(p1, size(p1))
allocate(p4, source=poly_init())
if (lbound(p1, 1) /= 3 .or. ubound(p1, 1) /= 4 &
.or. lbound(p2, 1) /= 3 .or. ubound(p2, 1) /= 4 &
.or. lbound(p3, 1) /= 1 .or. ubound(p3, 1) /= 2 &
.or. lbound(p4, 1) /= 7 .or. ubound(p4, 1) /= 8 &
.or. p1(3)%i /= 43 .or. p1(4)%i /= 56 &
.or. p2(3)%i /= 43 .or. p2(4)%i /= 56 &
.or. p3(1)%i /= 43 .or. p3(2)%i /= 56 &
.or. p4(7)%i /= 11 .or. p4(8)%i /= 12) then
call abort()
endif
!write(*,*) lbound(a,1), ubound(a,1) ! prints 1 3
!write(*,*) lbound(b,1), ubound(b,1) ! prints 1 3
!write(*,*) lbound(c,1), ubound(c,1) ! prints 3 5
!write(*,*) lbound(d,1), ubound(d,1) ! prints 1 5
!write(*,*) lbound(e,1), ubound(e,1) ! prints 1 6
if (lbound(a,1) /= 1 .or. ubound(a,1) /= 3 &
.or. lbound(b,1) /= 1 .or. ubound(b,1) /= 3 &
.or. lbound(c,1) /= 3 .or. ubound(c,1) /= 5 &
.or. lbound(d,1) /= 1 .or. ubound(d,1) /= 5 &
.or. lbound(e,1) /= 1 .or. ubound(e,1) /= 6) then
call abort()
endif
contains
subroutine do_allocate(x, n)
integer, value :: n
class(t), intent(in) :: x(n)
allocate(p3, source=x)
end subroutine
function poly_init()
class(t), allocatable :: poly_init(:)
allocate(poly_init(7:8))
poly_init = [t :: t(11), t(12)]
end function poly_init
pure function f(i)
integer, intent(in) :: i
integer :: f(i)
f = 2*i
end function f
pure function g(i) result(r)
integer, value, intent(in) :: i
integer, allocatable :: r(:)
r = [1,2,3]
end function g
pure function h(i) result(r)
integer, value, intent(in) :: i
integer, allocatable :: r(:)
allocate(r(3:5))
r = [1,2,3]
end function h
end program p