On 26/07/2012 17:32, Tobias Burnus wrote: > On 07/26/2012 05:12 PM, Mikael Morin wrote: >> On 26/07/2012 16:53, Mikael Morin wrote: >>> Here is a draft for those. Lightly tested with print *, ... > > Looks rather nice. The output for test1 is also good: > > integer :: a(1:3,-2:5) > gives > lbound(arg) == [1, 1] > ubound(arg) == [3, 8] > shape(arg) == [3, 8] > > However, if the dummy is allocatable or a pointer, the result should be: > > lbound(arg) == [1, -2] > ubound(arg) == [3, 5] > shape(arg) == [3, 8] > > which your second test case doesn't give.
Hello, do you have a test case exhibiting the problem? It seems fine to me. $ ./test1 1 1 3 8 3 8 1 1 3 8 3 8 1 -2 3 5 3 8 1 -2 3 5 3 8 ./test2 11 101 13 108 3 8 11 97 12 106 2 10 13 99 15 110 3 12
program test integer :: a(1:3,-2:5) integer, allocatable :: b(:,:) call foo(a) allocate(b(1:3,-2:5)) call foo(b) call bar(b) call baz(b) contains subroutine foo(arg) integer :: arg(..) print *, lbound(arg) print *, ubound(arg) print *, shape(arg) end subroutine foo subroutine bar(arg) integer, allocatable :: arg(:,:) print *, lbound(arg) print *, ubound(arg) print *, shape(arg) end subroutine bar subroutine baz(arg) integer, allocatable :: arg(..) print *, lbound(arg) print *, ubound(arg) print *, shape(arg) end subroutine baz end program test
program test integer :: a(1:3,-2:5) integer, allocatable :: b(:,:) integer, allocatable :: c(:,:) integer, pointer :: d(:,:) b = foo(a) print *,b(:,1) print *,b(:,2) print *,b(:,3) allocate(c(1:2,-3:6)) b = bar(c) print *,b(:,1) print *,b(:,2) print *,b(:,3) allocate(d(3:5,-1:10)) b = baz(d) print *,b(:,1) print *,b(:,2) print *,b(:,3) contains function foo(arg) result(res) integer :: arg(..) integer, allocatable :: res(:,:) allocate(res(rank(arg), 3)) res(:,1) = lbound(arg) + (/ 10, 100 /) res(:,2) = (/ 10, 100 /) + ubound(arg) res(:,3) = shape(arg) end function foo function bar(arg) result(res) integer, allocatable :: arg(..) integer, allocatable :: res(:,:) allocate(res(rank(arg), 3)) res(:,1) = lbound(arg) + (/ 10, 100 /) res(:,2) = (/ 10, 100 /) + ubound(arg) res(:,3) = shape(arg) end function bar function baz(arg) result(res) integer, pointer :: arg(..) integer, allocatable :: res(:,:) allocate(res(rank(arg), 3)) res(:,1) = lbound(arg) + (/ 10, 100 /) res(:,2) = (/ 10, 100 /) + ubound(arg) res(:,3) = shape(arg) end function baz end program test