| ! { dg-do run } |
| ! PR fortran/92887 |
| ! |
| ! Test passing nullified/disassociated pointer or unalloc allocatable |
| ! to OPTIONAL + VALUE |
| |
| program p |
| implicit none !(type, external) |
| integer, allocatable :: aa |
| real, pointer :: pp |
| character, allocatable :: ca |
| character, pointer :: cp |
| complex, allocatable :: za |
| complex, pointer :: zp |
| type t |
| integer, allocatable :: aa |
| real, pointer :: pp => NULL() |
| complex, allocatable :: za |
| end type t |
| type(t) :: tt |
| nullify (pp, cp, zp) |
| call sub (aa, pp, ca, cp, za) |
| call sub (tt% aa, tt% pp, z=tt% za) |
| allocate (aa, pp, ca, cp, za, zp, tt% za) |
| aa = 1; pp = 2.; ca = "c"; cp = "d"; za = 3.; zp = 4.; tt% za = 4. |
| call ref (1, 2., "c", "d", (3.,0.)) |
| call ref (aa, pp, ca, cp, za) |
| call val (1, 2., "c", "d", (4.,0.)) |
| call val (aa, pp, ca, cp, zp) |
| call opt (1, 2., "c", "d", (4.,0.)) |
| call opt (aa, pp, ca, cp, tt% za) |
| deallocate (aa, pp, ca, cp, za, zp, tt% za) |
| contains |
| subroutine sub (x, y, c, d, z) |
| integer, value, optional :: x |
| real, value, optional :: y |
| character, value, optional :: c, d |
| complex, value, optional :: z |
| if (present(x)) stop 1 |
| if (present(y)) stop 2 |
| if (present(c)) stop 3 |
| if (present(d)) stop 4 |
| if (present(z)) stop 5 |
| end |
| ! call by reference |
| subroutine ref (x, y, c, d, z) |
| integer :: x |
| real :: y |
| character :: c, d |
| complex :: z |
| print *, "by reference :", x, y, c, d, z |
| if (x /= 1 .or. y /= 2.0) stop 11 |
| if (c /= "c" .or. d /= "d") stop 12 |
| if (z /= (3.,0.) ) stop 13 |
| end |
| ! call by value |
| subroutine val (x, y, c, d, z) |
| integer, value :: x |
| real, value :: y |
| character, value :: c, d |
| complex, value :: z |
| print *, "by value :", x, y, c, d, z |
| if (x /= 1 .or. y /= 2.0) stop 21 |
| if (c /= "c" .or. d /= "d") stop 22 |
| if (z /= (4.,0.) ) stop 23 |
| end |
| ! call by value, optional arguments |
| subroutine opt (x, y, c, d, z) |
| integer, value, optional :: x |
| real, value, optional :: y |
| character, value, optional :: c, d |
| complex, value, optional :: z |
| if (.not. present(x)) stop 31 |
| if (.not. present(y)) stop 32 |
| if (.not. present(c)) stop 33 |
| if (.not. present(d)) stop 34 |
| if (.not. present(z)) stop 35 |
| print *, "value+optional:", x, y, c, d, z |
| if (x /= 1 .or. y /= 2.0) stop 36 |
| if (c /= "c" .or. d /= "d") stop 37 |
| if (z /= (4.,0.) ) stop 38 |
| end |
| end |