1! { dg-do run }
2!
3! PR fortran/35203
4!
5! Test VALUE + OPTIONAL
6! for integer/real/complex/logical which are passed by value
7!
8program main
9  implicit none
10  call value_test ()
11contains
12  subroutine value_test (ii, rr, cc, ll, ii2, rr2, cc2, ll2)
13    integer, optional :: ii, ii2
14    real,    optional :: rr, rr2
15    complex, optional :: cc, cc2
16    logical, optional :: ll, ll2
17    value :: ii, rr, cc, ll
18
19    call int_test (.false., 0)
20    call int_test (.false., 0, ii)
21    call int_test (.false., 0, ii2)
22    call int_test (.true., 0, 0)
23    call int_test (.true., 2, 2)
24
25    call real_test (.false., 0.0)
26    call real_test (.false., 0.0, rr)
27    call real_test (.false., 0.0, rr2)
28    call real_test (.true., 0.0, 0.0)
29    call real_test (.true., 2.0, 2.0)
30
31    call cmplx_test (.false., cmplx (0.0))
32    call cmplx_test (.false., cmplx (0.0), cc)
33    call cmplx_test (.false., cmplx (0.0), cc2)
34    call cmplx_test (.true., cmplx (0.0), cmplx (0.0))
35    call cmplx_test (.true., cmplx (2.0), cmplx (2.0))
36
37    call bool_test (.false., .false.)
38    call bool_test (.false., .false., ll)
39    call bool_test (.false., .false., ll2)
40    call bool_test (.true., .false., .false.)
41    call bool_test (.true., .true., .true.)
42  end subroutine value_test
43
44  subroutine int_test (ll, val, x)
45    logical, value :: ll
46    integer, value :: val
47    integer, value, optional :: x
48    if (ll .neqv. present(x)) STOP 1
49    if (present(x)) then
50      if (x /= val) STOP 1
51    endif
52  end subroutine int_test
53
54  subroutine real_test (ll, val, x)
55    logical, value :: ll
56    real, value :: val
57    real, value, optional :: x
58    if (ll .neqv. present(x)) STOP 2
59    if (present(x)) then
60      if (x /= val) STOP 2
61    endif
62  end subroutine real_test
63
64  subroutine cmplx_test (ll, val, x)
65    logical, value :: ll
66    complex, value :: val
67    complex, value, optional :: x
68    if (ll .neqv. present(x)) STOP 3
69    if (present(x)) then
70      if (x /= val) STOP 3
71    endif
72  end subroutine cmplx_test
73
74  subroutine bool_test (ll, val, x)
75    logical, value :: ll
76    logical, value :: val
77    logical, value, optional :: x
78    if (ll .neqv. present(x)) STOP 4
79    if (present(x)) then
80      if (x .neqv. val) STOP 4
81    endif
82  end subroutine bool_test
83end program main
84