1! RUN: %S/test_errors.sh %s %t %f18
2! Tests based on examples in C.10.6
3
4! C.10.6(10)
5module m1
6  interface GOOD1
7    function F1A(X)
8      real :: F1A, X
9    end function
10    function F1B(X)
11      integer :: F1B, X
12    end function
13  end interface
14end
15
16! C.10.6(13)
17module m2
18  interface GOOD2
19    function F2A(X)
20      real :: F2A, X
21    end function
22    function F2B(X, Y)
23      complex :: F2B
24      real :: X, Y
25    end function
26  end interface
27end
28
29! C.10.6(15)
30module m3
31  interface GOOD3
32    subroutine S3A(W, X, Y, Z)
33      real :: W, Y
34      integer :: X, Z
35    end subroutine
36    subroutine S3B(X, W, Z, Y)
37      real :: W, Z
38      integer :: X, Y
39    end subroutine
40  end interface
41end
42module m3b
43  interface GOOD3
44    subroutine S3B(X, W, Z, Y)
45      real :: W, Z
46      integer :: X, Y
47    end subroutine
48    subroutine S3A(W, X, Y, Z)
49      real :: W, Y
50      integer :: X, Z
51    end subroutine
52  end interface
53end
54
55! C.10.6(17)
56! BAD4(1.0,2,Y=3.0,Z=4) could apply to either procedure
57module m4
58  !ERROR: Generic 'bad4' may not have specific procedures 's4a' and 's4b' as their interfaces are not distinguishable
59  interface BAD4
60    subroutine S4A(W, X, Y, Z)
61      real :: W, Y
62      integer :: X, Z
63    end subroutine
64    subroutine S4B(X, W, Z, Y)
65      real :: X, Y
66      integer :: W, Z
67    end subroutine
68  end interface
69end
70module m4b
71  !ERROR: Generic 'bad4' may not have specific procedures 's4b' and 's4a' as their interfaces are not distinguishable
72  interface BAD4
73    subroutine S4B(X, W, Z, Y)
74      real :: X, Y
75      integer :: W, Z
76    end subroutine
77    subroutine S4A(W, X, Y, Z)
78      real :: W, Y
79      integer :: X, Z
80    end subroutine
81  end interface
82end
83
84! C.10.6(19)
85module m5
86  interface GOOD5
87    subroutine S5A(X)
88      real :: X
89    end subroutine
90    subroutine S5B(Y, X)
91      real :: Y, X
92    end subroutine
93  end interface
94end
95
96module FRUITS
97  type :: FRUIT
98  end type
99  type, extends(FRUIT) :: APPLE
100  end type
101  type, extends(FRUIT) :: PEAR
102  end type
103  type, extends(PEAR) :: BOSC
104  end type
105end
106
107! C.10.6(21)
108! type(PEAR) :: A_PEAR
109! type(BOSC) :: A_BOSC
110! BAD6(A_PEAR,A_BOSC)  ! could be s6a or s6b
111module m6
112  !ERROR: Generic 'bad6' may not have specific procedures 's6a' and 's6b' as their interfaces are not distinguishable
113  interface BAD6
114    subroutine S6A(X, Y)
115      use FRUITS
116      class(PEAR) :: X, Y
117    end subroutine
118    subroutine S6B(X, Y)
119      use FRUITS
120      class(FRUIT) :: X
121      class(BOSC) :: Y
122    end subroutine
123  end interface
124end
125module m6b
126  !ERROR: Generic 'bad6' may not have specific procedures 's6b' and 's6a' as their interfaces are not distinguishable
127  interface BAD6
128    subroutine S6B(X, Y)
129      use FRUITS
130      class(FRUIT) :: X
131      class(BOSC) :: Y
132    end subroutine
133    subroutine S6A(X, Y)
134      use FRUITS
135      class(PEAR) :: X, Y
136    end subroutine
137  end interface
138end
139
140! C.10.6(22)
141module m7
142  interface GOOD7
143    subroutine S7A(X, Y, Z)
144      use FRUITS
145      class(PEAR) :: X, Y, Z
146    end subroutine
147    subroutine S7B(X, Z, W)
148      use FRUITS
149      class(FRUIT) :: X
150      class(BOSC) :: Z
151      class(APPLE), optional :: W
152    end subroutine
153  end interface
154end
155module m7b
156  interface GOOD7
157    subroutine S7B(X, Z, W)
158      use FRUITS
159      class(FRUIT) :: X
160      class(BOSC) :: Z
161      class(APPLE), optional :: W
162    end subroutine
163    subroutine S7A(X, Y, Z)
164      use FRUITS
165      class(PEAR) :: X, Y, Z
166    end subroutine
167  end interface
168end
169
170! C.10.6(25)
171! Invalid generic (according to the rules), despite the fact that it is unambiguous
172module m8
173  !ERROR: Generic 'bad8' may not have specific procedures 's8a' and 's8b' as their interfaces are not distinguishable
174  interface BAD8
175    subroutine S8A(X, Y, Z)
176      real, optional :: X
177      integer :: Y
178      real :: Z
179    end subroutine
180    subroutine S8B(X, Z, Y)
181      integer, optional :: X
182      integer :: Z
183      real :: Y
184    end subroutine
185  end interface
186end
187