1! { dg-do run }
2! { dg-additional-sources value_4.c }
3! { dg-options "-ff2c -w -O0" }
4!
5! Tests the functionality of the patch for PR29642, which requested the
6! implementation of the F2003 VALUE attribute for gfortran, by calling
7! external C functions by value and by reference.  This is effectively
8! identical to c_by_val_1.f, which does the same for %VAL.
9!
10! Contributed by Paul Thomas  <pault@gcc.gnu.org>
11!
12module global
13  interface delta
14    module procedure deltai, deltar, deltac
15  end interface delta
16  real(4) :: epsi = epsilon (1.0_4)
17contains
18  function deltai (a, b) result (c)
19    integer(4) :: a, b
20    logical :: c
21    c = (a /= b)
22  end function deltai
23
24  function deltar (a, b) result (c)
25    real(4) :: a, b
26    logical :: c
27    c = (abs (a-b) > epsi)
28  end function deltar
29
30  function deltac (a, b) result (c)
31    complex(4) :: a, b
32    logical :: c
33    c = ((abs (real (a-b)) > epsi).or.(abs (aimag (a-b)) > epsi))
34  end function deltac
35end module global
36
37program value_4
38  use global
39  interface
40    function f_to_f (x, y)
41      real(4), pointer :: f_to_f
42      real(4) :: x, y
43      value :: x
44    end function f_to_f
45  end interface
46
47  interface
48    function i_to_i (x, y)
49      integer(4), pointer :: i_to_i
50      integer(4) :: x, y
51      value :: x
52    end function i_to_i
53  end interface
54
55  interface
56    complex(4) function c_to_c (x, y)
57      complex(4) :: x, y
58      value :: x
59    end function c_to_c
60  end interface
61
62  real(4)       a, b, c
63  integer(4)    i, j, k
64  complex(4)    u, v, w
65
66  a = 42.0
67  b = 0.0
68  c = a
69  b = f_to_f (a, c)
70  if (delta ((2.0 * a), b)) call abort ()
71
72  i = 99
73  j = 0
74  k = i
75  j = i_to_i (i, k)
76  if (delta ((3_4 * i), j)) call abort ()
77
78  u = (-1.0, 2.0)
79  v = (1.0, -2.0)
80  w = u
81  v = c_to_c (u, w)
82  if (delta ((4.0 * u), v)) call abort ()
83end program value_4
84