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