! { 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