xref: /llvm-project/flang/test/Semantics/resolve54.f90 (revision 3d1157000db56a340e1dae90b587bd144ffeaa6c)
1! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic
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  !PORTABILITY: Generic 'bad8' should not have specific procedures 's8a' and 's8b' as their interfaces are not distinguishable by the rules in the standard
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