aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gfortran.dg/typebound_generic_5.f03
blob: 561fcce1c3c0d0697b52fd28ee0cc9a1dd09e710 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
! { dg-do run }

! Check that generic bindings targetting ELEMENTAL procedures work.

MODULE m
  IMPLICIT NONE

  TYPE :: t
  CONTAINS
    PROCEDURE, NOPASS :: double
    PROCEDURE, NOPASS :: double_here
    GENERIC :: double_it => double
    GENERIC :: double_inplace => double_here
  END TYPE t

CONTAINS

  ELEMENTAL INTEGER FUNCTION double (val)
    IMPLICIT NONE
    INTEGER, INTENT(IN) :: val
    double = 2 * val
  END FUNCTION double

  ELEMENTAL SUBROUTINE double_here (val)
    IMPLICIT NONE
    INTEGER, INTENT(INOUT) :: val
    val = 2 * val
  END SUBROUTINE double_here

END MODULE m

PROGRAM main
  USE m
  IMPLICIT NONE

  TYPE(t) :: obj
  INTEGER :: arr(42), arr2(42), arr3(42), arr4(42)
  INTEGER :: i

  arr = (/ (i, i = 1, 42) /)

  arr2 = obj%double (arr)
  arr3 = obj%double_it (arr)

  arr4 = arr
  CALL obj%double_inplace (arr4)

  IF (ANY (arr2 /= 2 * arr) .OR. &
      ANY (arr3 /= 2 * arr) .OR. &
      ANY (arr4 /= 2 * arr)) THEN
    CALL abort ()
  END IF
END PROGRAM main