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

Reply via email to