| ! { dg-do run } |
| ! |
| ! PR fortran/114024 |
| |
| program foo |
| implicit none |
| complex :: cmp(3) = (3.,4.) |
| type ci ! pseudo "complex integer" type |
| integer :: re |
| integer :: im |
| end type ci |
| type cr ! pseudo "complex" type |
| real :: re |
| real :: im |
| end type cr |
| type u |
| type(ci) :: ii(3) |
| type(cr) :: rr(3) |
| end type u |
| type(u) :: cc |
| |
| cc% ii% re = nint (cmp% re) |
| cc% ii% im = nint (cmp% im) |
| cc% rr% re = cmp% re |
| cc% rr% im = cmp% im |
| |
| call test_substring () |
| call test_int_real () |
| call test_poly () |
| |
| contains |
| |
| subroutine test_substring () |
| character(4) :: str(3) = ["abcd","efgh","ijkl"] |
| character(:), allocatable :: ac(:) |
| allocate (ac, source=str(1::2)(2:4)) |
| if (size (ac) /= 2 .or. len (ac) /= 3) stop 11 |
| if (ac(2) /= "jkl") stop 12 |
| deallocate (ac) |
| allocate (ac, mold=str(1::2)(2:4)) |
| if (size (ac) /= 2 .or. len (ac) /= 3) stop 13 |
| deallocate (ac) |
| end |
| |
| subroutine test_int_real () |
| integer, allocatable :: aa(:) |
| real, pointer :: pp(:) |
| allocate (aa, source = cc% ii% im) |
| if (size (aa) /= 3) stop 21 |
| if (any (aa /= cmp% im)) stop 22 |
| allocate (pp, source = cc% rr% re) |
| if (size (pp) /= 3) stop 23 |
| if (any (pp /= cmp% re)) stop 24 |
| deallocate (aa, pp) |
| end |
| |
| subroutine test_poly () |
| class(*), allocatable :: uu(:), vv(:) |
| allocate (uu, source = cc% ii% im) |
| allocate (vv, source = cc% rr% re) |
| if (size (uu) /= 3) stop 31 |
| if (size (vv) /= 3) stop 32 |
| call check (uu) |
| call check (vv) |
| deallocate (uu, vv) |
| allocate (uu, mold = cc% ii% im) |
| allocate (vv, mold = cc% rr% re) |
| if (size (uu) /= 3) stop 33 |
| if (size (vv) /= 3) stop 34 |
| deallocate (uu, vv) |
| end |
| |
| subroutine check (x) |
| class(*), intent(in) :: x(:) |
| select type (x) |
| type is (integer) |
| if (any (x /= cmp% im)) then |
| print *, "'integer':", x |
| stop 41 |
| end if |
| type is (real) |
| if (any (x /= cmp% re)) then |
| print *, "'real':", x |
| stop 42 |
| end if |
| type is (character(*)) |
| print *, "'character':", x |
| end select |
| end |
| end |