1! RUN: %S/test_errors.sh %s %t %f18 -Mstandard -Werror
2
3! Issue 458 -- semantic checks for a normal DO loop.  The DO variable
4! and the initial, final, and step expressions must be INTEGER if the
5! options for standard conformance and turning warnings into errors
6! are both in effect.  This test turns on the options for standards
7! conformance and turning warnings into errors.  This produces error
8! messages for the cases where REAL and DOUBLE PRECISION variables
9! and expressions are used in the DO controls.
10
11! C1120 -- DO variable (and associated expressions) must be INTEGER.
12! This is extended by allowing REAL and DOUBLE PRECISION
13
14MODULE share
15  INTEGER :: intvarshare
16  REAL :: realvarshare
17  DOUBLE PRECISION :: dpvarshare
18END MODULE share
19
20PROGRAM do_issue_458
21  USE share
22  IMPLICIT NONE
23  INTEGER :: ivar
24  REAL :: rvar
25  DOUBLE PRECISION :: dvar
26  LOGICAL :: lvar
27  COMPLEX :: cvar
28  CHARACTER :: chvar
29  INTEGER, DIMENSION(3) :: avar
30  TYPE derived
31    REAL :: first
32    INTEGER :: second
33  END TYPE derived
34  TYPE(derived) :: devar
35  INTEGER, POINTER :: pivar
36  REAL, POINTER :: prvar
37  DOUBLE PRECISION, POINTER :: pdvar
38  LOGICAL, POINTER :: plvar
39  INTERFACE
40    SUBROUTINE sub()
41    END SUBROUTINE sub
42    FUNCTION ifunc()
43    END FUNCTION ifunc
44  END INTERFACE
45  PROCEDURE(ifunc), POINTER :: pifunc => NULL()
46
47! DO variables
48! INTEGER DO variable
49  DO ivar = 1, 10, 3
50    PRINT *, "ivar is: ", ivar
51  END DO
52
53! REAL DO variable
54  DO rvar = 1, 10, 3
55    PRINT *, "rvar is: ", rvar
56  END DO
57
58! DOUBLE PRECISISON DO variable
59  DO dvar = 1, 10, 3
60    PRINT *, "dvar is: ", dvar
61  END DO
62
63! Pointer to INTEGER DO variable
64  ALLOCATE(pivar)
65  DO pivar = 1, 10, 3
66    PRINT *, "pivar is: ", pivar
67  END DO
68
69! Pointer to REAL DO variable
70  ALLOCATE(prvar)
71  DO prvar = 1, 10, 3
72    PRINT *, "prvar is: ", prvar
73  END DO
74
75! Pointer to DOUBLE PRECISION DO variable
76  ALLOCATE(pdvar)
77  DO pdvar = 1, 10, 3
78    PRINT *, "pdvar is: ", pdvar
79  END DO
80
81! CHARACTER DO variable
82!ERROR: DO controls should be INTEGER
83  DO chvar = 1, 10, 3
84    PRINT *, "chvar is: ", chvar
85  END DO
86
87! LOGICAL DO variable
88!ERROR: DO controls should be INTEGER
89  DO lvar = 1, 10, 3
90    PRINT *, "lvar is: ", lvar
91  END DO
92
93! COMPLEX DO variable
94!ERROR: DO controls should be INTEGER
95  DO cvar = 1, 10, 3
96    PRINT *, "cvar is: ", cvar
97  END DO
98
99! Derived type DO variable
100!ERROR: DO controls should be INTEGER
101  DO devar = 1, 10, 3
102    PRINT *, "devar is: ", devar
103  END DO
104
105! Pointer to LOGICAL DO variable
106  ALLOCATE(plvar)
107!ERROR: DO controls should be INTEGER
108  DO plvar = 1, 10, 3
109    PRINT *, "plvar is: ", plvar
110  END DO
111
112! SUBROUTINE DO variable
113!ERROR: DO control must be an INTEGER variable
114  DO sub = 1, 10, 3
115    PRINT *, "ivar is: ", ivar
116  END DO
117
118! FUNCTION DO variable
119!ERROR: DO control must be an INTEGER variable
120  DO ifunc = 1, 10, 3
121    PRINT *, "ivar is: ", ivar
122  END DO
123
124! POINTER to FUNCTION DO variable
125!ERROR: DO control must be an INTEGER variable
126  DO pifunc = 1, 10, 3
127    PRINT *, "ivar is: ", ivar
128  END DO
129
130! Array DO variable
131!ERROR: Must be a scalar value, but is a rank-1 array
132  DO avar = 1, 10, 3
133    PRINT *, "plvar is: ", plvar
134  END DO
135
136! Undeclared DO variable
137!ERROR: No explicit type declared for 'undeclared'
138  DO undeclared = 1, 10, 3
139    PRINT *, "plvar is: ", plvar
140  END DO
141
142! Shared association INTEGER DO variable
143  DO intvarshare = 1, 10, 3
144    PRINT *, "ivar is: ", ivar
145  END DO
146
147! Shared association REAL DO variable
148  DO realvarshare = 1, 10, 3
149    PRINT *, "ivar is: ", ivar
150  END DO
151
152! Shared association DOUBLE PRECISION DO variable
153  DO dpvarshare = 1, 10, 3
154    PRINT *, "ivar is: ", ivar
155  END DO
156
157! Initial expressions
158! REAL initial expression
159  DO ivar = rvar, 10, 3
160    PRINT *, "ivar is: ", ivar
161  END DO
162
163! DOUBLE PRECISION initial expression
164  DO ivar = dvar, 10, 3
165    PRINT *, "ivar is: ", ivar
166  END DO
167
168! Pointer to INTEGER initial expression
169  DO ivar = pivar, 10, 3
170    PRINT *, "ivar is: ", ivar
171  END DO
172
173! Pointer to REAL initial expression
174  DO ivar = prvar, 10, 3
175    PRINT *, "ivar is: ", ivar
176  END DO
177
178! Pointer to DOUBLE PRECISION initial expression
179  DO ivar = pdvar, 10, 3
180    PRINT *, "ivar is: ", ivar
181  END DO
182
183! LOGICAL initial expression
184!ERROR: DO controls should be INTEGER
185  DO ivar = lvar, 10, 3
186    PRINT *, "ivar is: ", ivar
187  END DO
188
189! COMPLEX initial expression
190!ERROR: DO controls should be INTEGER
191  DO ivar = cvar, 10, 3
192    PRINT *, "ivar is: ", ivar
193  END DO
194
195! Derived type initial expression
196!ERROR: DO controls should be INTEGER
197  DO ivar = devar, 10, 3
198    PRINT *, "ivar is: ", ivar
199  END DO
200
201! Pointer to LOGICAL initial expression
202!ERROR: DO controls should be INTEGER
203  DO ivar = plvar, 10, 3
204    PRINT *, "ivar is: ", ivar
205  END DO
206
207! Invalid initial expression
208!ERROR: Integer literal is too large for INTEGER(KIND=4)
209  DO ivar = -2147483648_4, 10, 3
210    PRINT *, "ivar is: ", ivar
211  END DO
212
213! Final expression
214! REAL final expression
215  DO ivar = 1, rvar, 3
216    PRINT *, "ivar is: ", ivar
217  END DO
218
219! DOUBLE PRECISION final expression
220  DO ivar = 1, dvar, 3
221    PRINT *, "ivar is: ", ivar
222  END DO
223
224! Pointer to INTEGER final expression
225  DO ivar = 1, pivar, 3
226    PRINT *, "ivar is: ", ivar
227  END DO
228
229! Pointer to REAL final expression
230  DO ivar = 1, prvar, 3
231    PRINT *, "ivar is: ", ivar
232  END DO
233
234! Pointer to DOUBLE PRECISION final expression
235  DO ivar = pdvar, 10, 3
236    PRINT *, "ivar is: ", ivar
237  END DO
238
239! COMPLEX final expression
240!ERROR: DO controls should be INTEGER
241  DO ivar = 1, cvar, 3
242    PRINT *, "ivar is: ", ivar
243  END DO
244
245! Invalid final expression
246!ERROR: Integer literal is too large for INTEGER(KIND=4)
247  DO ivar = 1, -2147483648_4, 3
248    PRINT *, "ivar is: ", ivar
249  END DO
250
251! Step expression
252! REAL step expression
253  DO ivar = 1, 10, rvar
254    PRINT *, "ivar is: ", ivar
255  END DO
256
257! DOUBLE PRECISION step expression
258  DO ivar = 1, 10, dvar
259    PRINT *, "ivar is: ", ivar
260  END DO
261
262! Pointer to INTEGER step expression
263  DO ivar = 1, 10, pivar
264    PRINT *, "ivar is: ", ivar
265  END DO
266
267! Pointer to REAL step expression
268  DO ivar = 1, 10, prvar
269    PRINT *, "ivar is: ", ivar
270  END DO
271
272! Pointer to DOUBLE PRECISION step expression
273  DO ivar = 1, 10, pdvar
274    PRINT *, "ivar is: ", ivar
275  END DO
276
277! COMPLEX Step expression
278!ERROR: DO controls should be INTEGER
279  DO ivar = 1, 10, cvar
280    PRINT *, "ivar is: ", ivar
281  END DO
282
283! Invalid step expression
284!ERROR: Integer literal is too large for INTEGER(KIND=4)
285  DO ivar = 1, 10, -2147483648_4
286    PRINT *, "ivar is: ", ivar
287  END DO
288
289END PROGRAM do_issue_458
290