1! RUN: %S/test_errors.sh %s %t %flang_fc1
2! REQUIRES: shell
3! C772
4module m1
5  type t1
6  contains
7    procedure, nopass :: s1
8    !ERROR: Binding name 's2' not found in this derived type
9    generic :: g1 => s2
10  end type
11  type t2
12    integer :: s1
13  contains
14    !ERROR: 's1' is not the name of a specific binding of this type
15    generic :: g2 => s1
16  end type
17contains
18  subroutine s1
19  end
20end
21
22module m2
23  type :: t3
24  contains
25    private
26    procedure, nopass :: s3
27    generic, public :: g3 => s3
28    generic :: h3 => s3
29  end type
30contains
31  subroutine s3(i)
32  end
33end
34
35! C771
36module m3
37  use m2
38  type, extends(t3) :: t4
39  contains
40    procedure, nopass :: s4
41    procedure, nopass :: s5
42    !ERROR: 'g3' does not have the same accessibility as its previous declaration
43    generic, private :: g3 => s4
44    !ERROR: 'h3' does not have the same accessibility as its previous declaration
45    generic, public :: h3 => s4
46    generic :: i3 => s4
47    !ERROR: 'i3' does not have the same accessibility as its previous declaration
48    generic, private :: i3 => s5
49  end type
50  type :: t5
51  contains
52    private
53    procedure, nopass :: s3
54    procedure, nopass :: s4
55    procedure, nopass :: s5
56    generic :: g5 => s3, s4
57    !ERROR: 'g5' does not have the same accessibility as its previous declaration
58    generic, public :: g5 => s5
59  end type
60contains
61  subroutine s4(r)
62  end
63  subroutine s5(z)
64    complex :: z
65  end
66end
67
68! Test forward reference in type-bound generic to binding is allowed
69module m4
70  type :: t1
71  contains
72    generic :: g => s1
73    generic :: g => s2
74    procedure, nopass :: s1
75    procedure, nopass :: s2
76  end type
77  type :: t2
78  contains
79    generic :: g => p1
80    generic :: g => p2
81    procedure, nopass :: p1 => s1
82    procedure, nopass :: p2 => s2
83  end type
84contains
85  subroutine s1()
86  end
87  subroutine s2(x)
88  end
89end
90
91! C773 - duplicate binding names
92module m5
93  type :: t1
94  contains
95    generic :: g => s1
96    generic :: g => s2
97    procedure, nopass :: s1
98    procedure, nopass :: s2
99    !ERROR: Binding name 's1' was already specified for generic 'g'
100    generic :: g => s1
101  end type
102contains
103  subroutine s1()
104  end
105  subroutine s2(x)
106  end
107end
108
109module m6
110  type t
111  contains
112    procedure :: f1
113    procedure :: f2
114    generic :: operator(.eq.) => f1
115    !ERROR: Binding name 'f1' was already specified for generic 'operator(.eq.)'
116    generic :: operator(==) => f2, f1
117  end type
118contains
119  logical function f1(x, y) result(result)
120    class(t), intent(in) :: x
121    real, intent(in) :: y
122    result = .true.
123  end
124  logical function f2(x, y) result(result)
125    class(t), intent(in) :: x
126    integer, intent(in) :: y
127    result = .true.
128  end
129end
130