| ! { dg-do run } |
| ! |
| ! Test the behavior of lbound, ubound of shape with assumed rank arguments |
| ! in an array context (without DIM argument). |
| ! |
| |
| program test |
| |
| integer :: a(2:4,-2:5) |
| integer, allocatable :: b(:,:) |
| integer, allocatable :: c(:,:) |
| integer, pointer :: d(:,:) |
| character(52) :: buffer |
| |
| b = foo(a) |
| !print *,b(:,1) |
| if (any(b(:,1) /= [11, 101])) STOP 1 |
| buffer = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' |
| write(buffer,*) b(:,1) |
| if (buffer /= ' 11 101') STOP 2 |
| |
| !print *,b(:,2) |
| if (any(b(:,2) /= [3, 8])) STOP 3 |
| buffer = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' |
| write(buffer,*) b(:,2) |
| if (buffer /= ' 3 8') STOP 4 |
| |
| !print *,b(:,3) |
| if (any(b(:,3) /= [13, 108])) STOP 5 |
| buffer = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' |
| write(buffer,*) b(:,3) |
| if (buffer /= ' 13 108') STOP 6 |
| |
| |
| allocate(c(1:2,-3:6)) |
| b = bar(c) |
| !print *,b(:,1) |
| if (any(b(:,1) /= [11, 97])) STOP 7 |
| buffer = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' |
| write(buffer,*) b(:,1) |
| if (buffer /= ' 11 97') STOP 8 |
| |
| !print *,b(:,2) |
| if (any(b(:,2) /= [12, 106])) STOP 9 |
| buffer = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' |
| write(buffer,*) b(:,2) |
| if (buffer /= ' 12 106') STOP 10 |
| |
| !print *,b(:,3) |
| if (any(b(:,3) /= [2, 10])) STOP 11 |
| buffer = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' |
| write(buffer,*) b(:,3) |
| if (buffer /= ' 2 10') STOP 12 |
| |
| |
| allocate(d(3:5,-1:10)) |
| b = baz(d) |
| !print *,b(:,1) |
| if (any(b(:,1) /= [3, -1])) STOP 13 |
| buffer = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' |
| write(buffer,*) b(:,1) |
| if (buffer /= ' 3 -1') STOP 14 |
| |
| !print *,b(:,2) |
| if (any(b(:,2) /= [15, 110])) STOP 15 |
| buffer = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' |
| write(buffer,*) b(:,2) |
| if (buffer /= ' 15 110') STOP 16 |
| |
| !print *,b(:,3) |
| if (any(b(:,3) /= [13, 112])) STOP 17 |
| buffer = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' |
| write(buffer,*) b(:,3) |
| if (buffer /= ' 13 112') STOP 18 |
| |
| |
| contains |
| function foo(arg) result(res) |
| integer :: arg(..) |
| integer, allocatable :: res(:,:) |
| |
| allocate(res(rank(arg), 3)) |
| |
| res(:,1) = lbound(arg) + (/ 10, 100 /) |
| res(:,2) = ubound(arg) |
| res(:,3) = (/ 10, 100 /) + shape(arg) |
| |
| end function foo |
| function bar(arg) result(res) |
| integer, allocatable :: arg(..) |
| integer, allocatable :: res(:,:) |
| |
| allocate(res(-1:rank(arg)-2, 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(2:rank(arg)+1, 3)) |
| |
| res(:,1) = lbound(arg) |
| res(:,2) = (/ 10, 100 /) + ubound(arg) |
| res(:,3) = shape(arg) + (/ 10, 100 /) |
| |
| end function baz |
| end program test |
| |