1! { dg-do compile }
2!
3! PR 44549: [OOP][F2008] Type-bound procedure: bogus error from list after PROCEDURE
4!
5! Contributed by Dominique d'Humieres <dominiq@lps.ens.fr>
6
7MODULE rational_numbers
8  IMPLICIT NONE
9  PRIVATE
10  TYPE,PUBLIC :: rational
11    PRIVATE
12    INTEGER n,d
13
14    CONTAINS
15    ! ordinary type-bound procedure
16    PROCEDURE :: real => rat_to_real
17    ! specific type-bound procedures for generic support
18    PROCEDURE,PRIVATE :: rat_asgn_i, rat_plus_rat, rat_plus_i
19    PROCEDURE,PRIVATE,PASS(b) :: i_plus_rat
20    ! generic type-bound procedures
21    GENERIC :: ASSIGNMENT(=) => rat_asgn_i
22    GENERIC :: OPERATOR(+) => rat_plus_rat, rat_plus_i, i_plus_rat
23  END TYPE
24  CONTAINS
25    ELEMENTAL REAL FUNCTION rat_to_real(this) RESULT(r)
26      CLASS(rational),INTENT(IN) :: this
27      r = REAL(this%n)/this%d
28    END FUNCTION
29
30    impure ELEMENTAL SUBROUTINE rat_asgn_i(a,b)
31      CLASS(rational),INTENT(OUT) :: a
32      INTEGER,INTENT(IN) :: b
33      a%n = b
34      a%d = 1
35    END SUBROUTINE
36
37    ELEMENTAL TYPE(rational) FUNCTION rat_plus_i(a,b) RESULT(r)
38      CLASS(rational),INTENT(IN) :: a
39      INTEGER,INTENT(IN) :: b
40      r%n = a%n + b*a%d
41      r%d = a%d
42    END FUNCTION
43
44    ELEMENTAL TYPE(rational) FUNCTION i_plus_rat(a,b) RESULT(r)
45      INTEGER,INTENT(IN) :: a
46      CLASS(rational),INTENT(IN) :: b
47      r%n = b%n + a*b%d
48      r%d = b%d
49    END FUNCTION
50
51    ELEMENTAL TYPE(rational) FUNCTION rat_plus_rat(a,b) RESULT(r)
52      CLASS(rational),INTENT(IN) :: a,b
53      r%n = a%n*b%d + b%n*a%d
54      r%d = a%d*b%d
55    END FUNCTION
56END
57