| ! { dg-do compile } |
| ! PR fortran/114474 - DATA and derived types with pointer components |
| |
| program pr114474 |
| implicit none |
| integer, target :: ii = 42 ! initial data target |
| |
| integer, target :: jj = 24 |
| integer, pointer :: qq => jj |
| ! ii and jj resolve slightly differently when the data statement below |
| ! is reached, as jj is resolved outside the structure constructor first |
| |
| type t |
| integer, pointer :: h |
| end type t |
| |
| integer, target :: kk(7) = 23 |
| integer, pointer :: ll(:) => kk |
| |
| type t1 |
| integer :: m(7) |
| end type t1 |
| |
| type(t) :: x1, x2, x3, x4, x5 |
| type(t), parameter :: z1 = t(null()) |
| |
| type(t1), target :: tt = t1([1,2,3,4,5,6,7]) |
| type(t1), parameter :: vv = t1(22) |
| type(t1) :: w1, w2 |
| integer, pointer :: p1(:) => tt% m |
| |
| data x1 / t(null()) / |
| data x2 / t(ii) / ! ii is initial data target |
| data x3 / t(jj) / ! jj is resolved differently... |
| data x4 / t(tt%m(3)) / ! pointer association with 3rd element |
| |
| data w1 / t1(12) / |
| data w2 / t1(vv%m) / |
| |
| if ( associated (x1% h)) stop 1 |
| if (.not. associated (x2% h)) stop 2 |
| if (.not. associated (x3% h)) stop 3 |
| if (.not. associated (x4% h)) stop 4 |
| if (x2% h /= 42) stop 5 |
| if (x3% h /= 24) stop 6 |
| if (x4% h /= 3) stop 7 |
| |
| if (any (w1%m /= 12 )) stop 8 |
| if (any (w2%m /= vv%m)) stop 9 |
| end |
| |
| |
| subroutine sub |
| implicit none |
| |
| interface |
| real function myfun (x) |
| real, intent(in) :: x |
| end function myfun |
| end interface |
| |
| type u |
| procedure(myfun), pointer, nopass :: p |
| end type u |
| |
| type(u) :: u3 = u(null()) |
| type(u), parameter :: u4 = u(null()) |
| type(u) :: u1, u2 |
| |
| data u1 / u(null()) / |
| data u2 / u(myfun) / |
| end |
| |
| real function myfun (x) |
| real, intent(in) :: x |
| myfun = x |
| end function myfun |