]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/interface.cc
Daily bump.
[thirdparty/gcc.git] / gcc / fortran / interface.cc
CommitLineData
6de9cd9a 1/* Deal with interfaces.
7adcbafe 2 Copyright (C) 2000-2022 Free Software Foundation, Inc.
6de9cd9a
DN
3 Contributed by Andy Vaught
4
9fc4d79b 5This file is part of GCC.
6de9cd9a 6
9fc4d79b
TS
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
d234d788 9Software Foundation; either version 3, or (at your option) any later
9fc4d79b 10version.
6de9cd9a 11
9fc4d79b
TS
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
6de9cd9a
DN
16
17You should have received a copy of the GNU General Public License
d234d788
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
6de9cd9a
DN
20
21
22/* Deal with interfaces. An explicit interface is represented as a
23 singly linked list of formal argument structures attached to the
24 relevant symbols. For an implicit interface, the arguments don't
25 point to symbols. Explicit interfaces point to namespaces that
26 contain the symbols within that interface.
27
28 Implicit interfaces are linked together in a singly linked list
29 along the next_if member of symbol nodes. Since a particular
30 symbol can only have a single explicit interface, the symbol cannot
31 be part of multiple lists and a single next-member suffices.
32
33 This is not the case for general classes, though. An operator
34 definition is independent of just about all other uses and has it's
35 own head pointer.
36
37 Nameless interfaces:
38 Nameless interfaces create symbols with explicit interfaces within
39 the current namespace. They are otherwise unlinked.
40
41 Generic interfaces:
42 The generic name points to a linked list of symbols. Each symbol
6892757c 43 has an explicit interface. Each explicit interface has its own
6de9cd9a
DN
44 namespace containing the arguments. Module procedures are symbols in
45 which the interface is added later when the module procedure is parsed.
46
47 User operators:
48 User-defined operators are stored in a their own set of symtrees
49 separate from regular symbols. The symtrees point to gfc_user_op
50 structures which in turn head up a list of relevant interfaces.
51
52 Extended intrinsics and assignment:
53 The head of these interface lists are stored in the containing namespace.
54
55 Implicit interfaces:
56 An implicit interface is represented as a singly linked list of
57 formal argument list structures that don't point to any symbol
58 nodes -- they just contain types.
59
60
61 When a subprogram is defined, the program unit's name points to an
62 interface as usual, but the link to the namespace is NULL and the
63 formal argument list points to symbols within the same namespace as
64 the program unit name. */
65
66#include "config.h"
d22e4895 67#include "system.h"
953bee7c 68#include "coretypes.h"
1916bcb5 69#include "options.h"
6de9cd9a
DN
70#include "gfortran.h"
71#include "match.h"
97f26732 72#include "arith.h"
6de9cd9a 73
6de9cd9a
DN
74/* The current_interface structure holds information about the
75 interface currently being parsed. This structure is saved and
76 restored during recursive interfaces. */
77
78gfc_interface_info current_interface;
79
80
81/* Free a singly linked list of gfc_interface structures. */
82
83void
b251af97 84gfc_free_interface (gfc_interface *intr)
6de9cd9a
DN
85{
86 gfc_interface *next;
87
88 for (; intr; intr = next)
89 {
90 next = intr->next;
cede9502 91 free (intr);
6de9cd9a
DN
92 }
93}
94
95
96/* Change the operators unary plus and minus into binary plus and
97 minus respectively, leaving the rest unchanged. */
98
99static gfc_intrinsic_op
e8d4f3fc 100fold_unary_intrinsic (gfc_intrinsic_op op)
6de9cd9a 101{
a1ee985f 102 switch (op)
6de9cd9a
DN
103 {
104 case INTRINSIC_UPLUS:
a1ee985f 105 op = INTRINSIC_PLUS;
6de9cd9a
DN
106 break;
107 case INTRINSIC_UMINUS:
a1ee985f 108 op = INTRINSIC_MINUS;
6de9cd9a
DN
109 break;
110 default:
111 break;
112 }
113
a1ee985f 114 return op;
6de9cd9a
DN
115}
116
117
195d1431
PT
118/* Return the operator depending on the DTIO moded string. Note that
119 these are not operators in the normal sense and so have been placed
120 beyond GFC_INTRINSIC_END in gfortran.h:enum gfc_intrinsic_op. */
e73d3ca6
PT
121
122static gfc_intrinsic_op
123dtio_op (char* mode)
124{
2eb3745a 125 if (strcmp (mode, "formatted") == 0)
e73d3ca6 126 return INTRINSIC_FORMATTED;
2eb3745a 127 if (strcmp (mode, "unformatted") == 0)
e73d3ca6
PT
128 return INTRINSIC_UNFORMATTED;
129 return INTRINSIC_NONE;
130}
131
132
6de9cd9a 133/* Match a generic specification. Depending on which type of
a1ee985f 134 interface is found, the 'name' or 'op' pointers may be set.
6de9cd9a
DN
135 This subroutine doesn't return MATCH_NO. */
136
137match
b251af97 138gfc_match_generic_spec (interface_type *type,
6de9cd9a 139 char *name,
a1ee985f 140 gfc_intrinsic_op *op)
6de9cd9a
DN
141{
142 char buffer[GFC_MAX_SYMBOL_LEN + 1];
143 match m;
144 gfc_intrinsic_op i;
145
146 if (gfc_match (" assignment ( = )") == MATCH_YES)
147 {
148 *type = INTERFACE_INTRINSIC_OP;
a1ee985f 149 *op = INTRINSIC_ASSIGN;
6de9cd9a
DN
150 return MATCH_YES;
151 }
152
153 if (gfc_match (" operator ( %o )", &i) == MATCH_YES)
154 { /* Operator i/f */
155 *type = INTERFACE_INTRINSIC_OP;
e8d4f3fc 156 *op = fold_unary_intrinsic (i);
6de9cd9a
DN
157 return MATCH_YES;
158 }
159
e8d4f3fc 160 *op = INTRINSIC_NONE;
6de9cd9a
DN
161 if (gfc_match (" operator ( ") == MATCH_YES)
162 {
163 m = gfc_match_defined_op_name (buffer, 1);
164 if (m == MATCH_NO)
165 goto syntax;
166 if (m != MATCH_YES)
167 return MATCH_ERROR;
168
169 m = gfc_match_char (')');
170 if (m == MATCH_NO)
171 goto syntax;
172 if (m != MATCH_YES)
173 return MATCH_ERROR;
174
175 strcpy (name, buffer);
176 *type = INTERFACE_USER_OP;
177 return MATCH_YES;
178 }
179
e73d3ca6
PT
180 if (gfc_match (" read ( %n )", buffer) == MATCH_YES)
181 {
182 *op = dtio_op (buffer);
183 if (*op == INTRINSIC_FORMATTED)
184 {
185 strcpy (name, gfc_code2string (dtio_procs, DTIO_RF));
186 *type = INTERFACE_DTIO;
187 }
188 if (*op == INTRINSIC_UNFORMATTED)
189 {
190 strcpy (name, gfc_code2string (dtio_procs, DTIO_RUF));
191 *type = INTERFACE_DTIO;
192 }
193 if (*op != INTRINSIC_NONE)
194 return MATCH_YES;
195 }
196
197 if (gfc_match (" write ( %n )", buffer) == MATCH_YES)
198 {
199 *op = dtio_op (buffer);
200 if (*op == INTRINSIC_FORMATTED)
201 {
202 strcpy (name, gfc_code2string (dtio_procs, DTIO_WF));
203 *type = INTERFACE_DTIO;
204 }
205 if (*op == INTRINSIC_UNFORMATTED)
206 {
207 strcpy (name, gfc_code2string (dtio_procs, DTIO_WUF));
208 *type = INTERFACE_DTIO;
209 }
210 if (*op != INTRINSIC_NONE)
211 return MATCH_YES;
212 }
213
6de9cd9a
DN
214 if (gfc_match_name (buffer) == MATCH_YES)
215 {
216 strcpy (name, buffer);
217 *type = INTERFACE_GENERIC;
218 return MATCH_YES;
219 }
220
221 *type = INTERFACE_NAMELESS;
222 return MATCH_YES;
223
224syntax:
225 gfc_error ("Syntax error in generic specification at %C");
226 return MATCH_ERROR;
227}
228
229
9e1d712c
TB
230/* Match one of the five F95 forms of an interface statement. The
231 matcher for the abstract interface follows. */
6de9cd9a
DN
232
233match
234gfc_match_interface (void)
235{
236 char name[GFC_MAX_SYMBOL_LEN + 1];
237 interface_type type;
238 gfc_symbol *sym;
a1ee985f 239 gfc_intrinsic_op op;
6de9cd9a
DN
240 match m;
241
242 m = gfc_match_space ();
243
a1ee985f 244 if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
6de9cd9a
DN
245 return MATCH_ERROR;
246
6de9cd9a
DN
247 /* If we're not looking at the end of the statement now, or if this
248 is not a nameless interface but we did not see a space, punt. */
249 if (gfc_match_eos () != MATCH_YES
b251af97 250 || (type != INTERFACE_NAMELESS && m != MATCH_YES))
6de9cd9a 251 {
b251af97
SK
252 gfc_error ("Syntax error: Trailing garbage in INTERFACE statement "
253 "at %C");
6de9cd9a
DN
254 return MATCH_ERROR;
255 }
256
257 current_interface.type = type;
258
259 switch (type)
260 {
e73d3ca6 261 case INTERFACE_DTIO:
6de9cd9a
DN
262 case INTERFACE_GENERIC:
263 if (gfc_get_symbol (name, NULL, &sym))
264 return MATCH_ERROR;
265
8b704316 266 if (!sym->attr.generic
524af0d6 267 && !gfc_add_generic (&sym->attr, sym->name, NULL))
6de9cd9a
DN
268 return MATCH_ERROR;
269
e5d7f6f7
FXC
270 if (sym->attr.dummy)
271 {
c4100eae 272 gfc_error ("Dummy procedure %qs at %C cannot have a "
e5d7f6f7
FXC
273 "generic interface", sym->name);
274 return MATCH_ERROR;
275 }
276
6de9cd9a
DN
277 current_interface.sym = gfc_new_block = sym;
278 break;
279
280 case INTERFACE_USER_OP:
281 current_interface.uop = gfc_get_uop (name);
282 break;
283
284 case INTERFACE_INTRINSIC_OP:
a1ee985f 285 current_interface.op = op;
6de9cd9a
DN
286 break;
287
288 case INTERFACE_NAMELESS:
9e1d712c 289 case INTERFACE_ABSTRACT:
6de9cd9a
DN
290 break;
291 }
292
293 return MATCH_YES;
294}
295
296
9e1d712c
TB
297
298/* Match a F2003 abstract interface. */
299
300match
301gfc_match_abstract_interface (void)
302{
303 match m;
304
524af0d6 305 if (!gfc_notify_std (GFC_STD_F2003, "ABSTRACT INTERFACE at %C"))
9e1d712c
TB
306 return MATCH_ERROR;
307
308 m = gfc_match_eos ();
309
310 if (m != MATCH_YES)
311 {
312 gfc_error ("Syntax error in ABSTRACT INTERFACE statement at %C");
313 return MATCH_ERROR;
314 }
315
316 current_interface.type = INTERFACE_ABSTRACT;
317
318 return m;
319}
320
321
6de9cd9a
DN
322/* Match the different sort of generic-specs that can be present after
323 the END INTERFACE itself. */
324
325match
326gfc_match_end_interface (void)
327{
328 char name[GFC_MAX_SYMBOL_LEN + 1];
329 interface_type type;
a1ee985f 330 gfc_intrinsic_op op;
6de9cd9a
DN
331 match m;
332
333 m = gfc_match_space ();
334
a1ee985f 335 if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
6de9cd9a
DN
336 return MATCH_ERROR;
337
338 /* If we're not looking at the end of the statement now, or if this
339 is not a nameless interface but we did not see a space, punt. */
340 if (gfc_match_eos () != MATCH_YES
b251af97 341 || (type != INTERFACE_NAMELESS && m != MATCH_YES))
6de9cd9a 342 {
b251af97
SK
343 gfc_error ("Syntax error: Trailing garbage in END INTERFACE "
344 "statement at %C");
6de9cd9a
DN
345 return MATCH_ERROR;
346 }
347
348 m = MATCH_YES;
349
350 switch (current_interface.type)
351 {
352 case INTERFACE_NAMELESS:
9e1d712c
TB
353 case INTERFACE_ABSTRACT:
354 if (type != INTERFACE_NAMELESS)
6de9cd9a
DN
355 {
356 gfc_error ("Expected a nameless interface at %C");
357 m = MATCH_ERROR;
358 }
359
360 break;
361
362 case INTERFACE_INTRINSIC_OP:
a1ee985f 363 if (type != current_interface.type || op != current_interface.op)
6de9cd9a
DN
364 {
365
366 if (current_interface.op == INTRINSIC_ASSIGN)
c6d6e62f
SK
367 {
368 m = MATCH_ERROR;
a4d9b221 369 gfc_error ("Expected %<END INTERFACE ASSIGNMENT (=)%> at %C");
c6d6e62f 370 }
6de9cd9a 371 else
c6d6e62f 372 {
915acec4 373 const char *s1, *s2;
c6d6e62f
SK
374 s1 = gfc_op2string (current_interface.op);
375 s2 = gfc_op2string (op);
376
377 /* The following if-statements are used to enforce C1202
378 from F2003. */
524af0d6
JB
379 if ((strcmp(s1, "==") == 0 && strcmp (s2, ".eq.") == 0)
380 || (strcmp(s1, ".eq.") == 0 && strcmp (s2, "==") == 0))
c6d6e62f 381 break;
524af0d6
JB
382 if ((strcmp(s1, "/=") == 0 && strcmp (s2, ".ne.") == 0)
383 || (strcmp(s1, ".ne.") == 0 && strcmp (s2, "/=") == 0))
c6d6e62f 384 break;
524af0d6
JB
385 if ((strcmp(s1, "<=") == 0 && strcmp (s2, ".le.") == 0)
386 || (strcmp(s1, ".le.") == 0 && strcmp (s2, "<=") == 0))
c6d6e62f 387 break;
524af0d6
JB
388 if ((strcmp(s1, "<") == 0 && strcmp (s2, ".lt.") == 0)
389 || (strcmp(s1, ".lt.") == 0 && strcmp (s2, "<") == 0))
c6d6e62f 390 break;
524af0d6
JB
391 if ((strcmp(s1, ">=") == 0 && strcmp (s2, ".ge.") == 0)
392 || (strcmp(s1, ".ge.") == 0 && strcmp (s2, ">=") == 0))
c6d6e62f 393 break;
524af0d6
JB
394 if ((strcmp(s1, ">") == 0 && strcmp (s2, ".gt.") == 0)
395 || (strcmp(s1, ".gt.") == 0 && strcmp (s2, ">") == 0))
c6d6e62f
SK
396 break;
397
398 m = MATCH_ERROR;
898344a9
SK
399 if (strcmp(s2, "none") == 0)
400 gfc_error ("Expecting %<END INTERFACE OPERATOR (%s)%> "
77be9417 401 "at %C", s1);
e73d3ca6 402 else
898344a9 403 gfc_error ("Expecting %<END INTERFACE OPERATOR (%s)%> at %C, "
77be9417 404 "but got %qs", s1, s2);
c6d6e62f 405 }
8b704316 406
6de9cd9a
DN
407 }
408
409 break;
410
411 case INTERFACE_USER_OP:
412 /* Comparing the symbol node names is OK because only use-associated
b251af97 413 symbols can be renamed. */
6de9cd9a 414 if (type != current_interface.type
9b46f94f 415 || strcmp (current_interface.uop->name, name) != 0)
6de9cd9a 416 {
a4d9b221 417 gfc_error ("Expecting %<END INTERFACE OPERATOR (.%s.)%> at %C",
55898b2c 418 current_interface.uop->name);
6de9cd9a
DN
419 m = MATCH_ERROR;
420 }
421
422 break;
423
e73d3ca6 424 case INTERFACE_DTIO:
6de9cd9a
DN
425 case INTERFACE_GENERIC:
426 if (type != current_interface.type
427 || strcmp (current_interface.sym->name, name) != 0)
428 {
a4d9b221 429 gfc_error ("Expecting %<END INTERFACE %s%> at %C",
6de9cd9a
DN
430 current_interface.sym->name);
431 m = MATCH_ERROR;
432 }
433
434 break;
435 }
436
437 return m;
438}
439
440
5f88e9b2
FR
441/* Return whether the component was defined anonymously. */
442
443static bool
444is_anonymous_component (gfc_component *cmp)
445{
446 /* Only UNION and MAP components are anonymous. In the case of a MAP,
447 the derived type symbol is FL_STRUCT and the component name looks like mM*.
448 This is the only case in which the second character of a component name is
449 uppercase. */
450 return cmp->ts.type == BT_UNION
451 || (cmp->ts.type == BT_DERIVED
452 && cmp->ts.u.derived->attr.flavor == FL_STRUCT
453 && cmp->name[0] && cmp->name[1] && ISUPPER (cmp->name[1]));
454}
455
456
457/* Return whether the derived type was defined anonymously. */
458
459static bool
460is_anonymous_dt (gfc_symbol *derived)
461{
462 /* UNION and MAP types are always anonymous. Otherwise, only nested STRUCTURE
463 types can be anonymous. For anonymous MAP/STRUCTURE, we have FL_STRUCT
464 and the type name looks like XX*. This is the only case in which the
465 second character of a type name is uppercase. */
466 return derived->attr.flavor == FL_UNION
467 || (derived->attr.flavor == FL_STRUCT
468 && derived->name[0] && derived->name[1] && ISUPPER (derived->name[1]));
469}
470
471
f6288c24
FR
472/* Compare components according to 4.4.2 of the Fortran standard. */
473
f3e1097b 474static bool
f6288c24
FR
475compare_components (gfc_component *cmp1, gfc_component *cmp2,
476 gfc_symbol *derived1, gfc_symbol *derived2)
477{
5f88e9b2
FR
478 /* Compare names, but not for anonymous components such as UNION or MAP. */
479 if (!is_anonymous_component (cmp1) && !is_anonymous_component (cmp2)
480 && strcmp (cmp1->name, cmp2->name) != 0)
f3e1097b 481 return false;
f6288c24
FR
482
483 if (cmp1->attr.access != cmp2->attr.access)
f3e1097b 484 return false;
f6288c24
FR
485
486 if (cmp1->attr.pointer != cmp2->attr.pointer)
f3e1097b 487 return false;
f6288c24
FR
488
489 if (cmp1->attr.dimension != cmp2->attr.dimension)
f3e1097b 490 return false;
f6288c24
FR
491
492 if (cmp1->attr.allocatable != cmp2->attr.allocatable)
f3e1097b 493 return false;
f6288c24
FR
494
495 if (cmp1->attr.dimension && gfc_compare_array_spec (cmp1->as, cmp2->as) == 0)
f3e1097b 496 return false;
f6288c24 497
56d3a930
FR
498 if (cmp1->ts.type == BT_CHARACTER && cmp2->ts.type == BT_CHARACTER)
499 {
500 gfc_charlen *l1 = cmp1->ts.u.cl;
501 gfc_charlen *l2 = cmp2->ts.u.cl;
502 if (l1 && l2 && l1->length && l2->length
503 && l1->length->expr_type == EXPR_CONSTANT
504 && l2->length->expr_type == EXPR_CONSTANT
505 && gfc_dep_compare_expr (l1->length, l2->length) != 0)
f3e1097b 506 return false;
56d3a930
FR
507 }
508
f6288c24
FR
509 /* Make sure that link lists do not put this function into an
510 endless recursive loop! */
511 if (!(cmp1->ts.type == BT_DERIVED && derived1 == cmp1->ts.u.derived)
512 && !(cmp2->ts.type == BT_DERIVED && derived2 == cmp2->ts.u.derived)
f3e1097b
JW
513 && !gfc_compare_types (&cmp1->ts, &cmp2->ts))
514 return false;
f6288c24
FR
515
516 else if ( (cmp1->ts.type == BT_DERIVED && derived1 == cmp1->ts.u.derived)
517 && !(cmp2->ts.type == BT_DERIVED && derived2 == cmp2->ts.u.derived))
f3e1097b 518 return false;
f6288c24
FR
519
520 else if (!(cmp1->ts.type == BT_DERIVED && derived1 == cmp1->ts.u.derived)
521 && (cmp2->ts.type == BT_DERIVED && derived2 == cmp2->ts.u.derived))
f3e1097b 522 return false;
f6288c24 523
f3e1097b 524 return true;
f6288c24
FR
525}
526
527
528/* Compare two union types by comparing the components of their maps.
529 Because unions and maps are anonymous their types get special internal
530 names; therefore the usual derived type comparison will fail on them.
531
532 Returns nonzero if equal, as with gfc_compare_derived_types. Also as with
533 gfc_compare_derived_types, 'equal' is closer to meaning 'duplicate
534 definitions' than 'equivalent structure'. */
535
f3e1097b
JW
536static bool
537compare_union_types (gfc_symbol *un1, gfc_symbol *un2)
f6288c24
FR
538{
539 gfc_component *map1, *map2, *cmp1, *cmp2;
c39747d2 540 gfc_symbol *map1_t, *map2_t;
f6288c24
FR
541
542 if (un1->attr.flavor != FL_UNION || un2->attr.flavor != FL_UNION)
f3e1097b 543 return false;
f6288c24 544
908b8296 545 if (un1->attr.zero_comp != un2->attr.zero_comp)
f3e1097b 546 return false;
908b8296
FR
547
548 if (un1->attr.zero_comp)
f3e1097b 549 return true;
908b8296 550
f6288c24
FR
551 map1 = un1->components;
552 map2 = un2->components;
553
554 /* In terms of 'equality' here we are worried about types which are
555 declared the same in two places, not types that represent equivalent
556 structures. (This is common because of FORTRAN's weird scoping rules.)
557 Though two unions with their maps in different orders could be equivalent,
558 we will say they are not equal for the purposes of this test; therefore
559 we compare the maps sequentially. */
560 for (;;)
05b8fcb4
FR
561 {
562 map1_t = map1->ts.u.derived;
563 map2_t = map2->ts.u.derived;
c39747d2 564
05b8fcb4
FR
565 cmp1 = map1_t->components;
566 cmp2 = map2_t->components;
c39747d2 567
05b8fcb4
FR
568 /* Protect against null components. */
569 if (map1_t->attr.zero_comp != map2_t->attr.zero_comp)
f3e1097b 570 return false;
c39747d2 571
05b8fcb4 572 if (map1_t->attr.zero_comp)
f3e1097b 573 return true;
c39747d2 574
05b8fcb4
FR
575 for (;;)
576 {
577 /* No two fields will ever point to the same map type unless they are
578 the same component, because one map field is created with its type
579 declaration. Therefore don't worry about recursion here. */
580 /* TODO: worry about recursion into parent types of the unions? */
f3e1097b
JW
581 if (!compare_components (cmp1, cmp2, map1_t, map2_t))
582 return false;
05b8fcb4
FR
583
584 cmp1 = cmp1->next;
585 cmp2 = cmp2->next;
586
587 if (cmp1 == NULL && cmp2 == NULL)
588 break;
589 if (cmp1 == NULL || cmp2 == NULL)
f3e1097b 590 return false;
05b8fcb4 591 }
f6288c24 592
05b8fcb4
FR
593 map1 = map1->next;
594 map2 = map2->next;
f6288c24 595
05b8fcb4
FR
596 if (map1 == NULL && map2 == NULL)
597 break;
598 if (map1 == NULL || map2 == NULL)
f3e1097b 599 return false;
f6288c24
FR
600 }
601
f3e1097b 602 return true;
f6288c24
FR
603}
604
605
606
e0e85e06
PT
607/* Compare two derived types using the criteria in 4.4.2 of the standard,
608 recursing through gfc_compare_types for the components. */
6de9cd9a 609
f3e1097b 610bool
b251af97 611gfc_compare_derived_types (gfc_symbol *derived1, gfc_symbol *derived2)
6de9cd9a 612{
f6288c24 613 gfc_component *cmp1, *cmp2;
6de9cd9a 614
cf2b3c22 615 if (derived1 == derived2)
f3e1097b 616 return true;
cf2b3c22 617
c7082171
SK
618 if (!derived1 || !derived2)
619 gfc_internal_error ("gfc_compare_derived_types: invalid derived type");
c6423ef3 620
00074dd8
FR
621 /* Compare UNION types specially. */
622 if (derived1->attr.flavor == FL_UNION || derived2->attr.flavor == FL_UNION)
f3e1097b 623 return compare_union_types (derived1, derived2);
00074dd8 624
6de9cd9a
DN
625 /* Special case for comparing derived types across namespaces. If the
626 true names and module names are the same and the module name is
627 nonnull, then they are equal. */
c6423ef3 628 if (strcmp (derived1->name, derived2->name) == 0
b251af97
SK
629 && derived1->module != NULL && derived2->module != NULL
630 && strcmp (derived1->module, derived2->module) == 0)
f3e1097b 631 return true;
6de9cd9a
DN
632
633 /* Compare type via the rules of the standard. Both types must have
f6288c24
FR
634 the SEQUENCE or BIND(C) attribute to be equal. STRUCTUREs are special
635 because they can be anonymous; therefore two structures with different
636 names may be equal. */
6de9cd9a 637
5f88e9b2
FR
638 /* Compare names, but not for anonymous types such as UNION or MAP. */
639 if (!is_anonymous_dt (derived1) && !is_anonymous_dt (derived2)
640 && strcmp (derived1->name, derived2->name) != 0)
f3e1097b 641 return false;
6de9cd9a 642
e0e85e06 643 if (derived1->component_access == ACCESS_PRIVATE
b251af97 644 || derived2->component_access == ACCESS_PRIVATE)
f3e1097b 645 return false;
6de9cd9a 646
a9e88ec6 647 if (!(derived1->attr.sequence && derived2->attr.sequence)
5bab4c96
PT
648 && !(derived1->attr.is_bind_c && derived2->attr.is_bind_c)
649 && !(derived1->attr.pdt_type && derived2->attr.pdt_type))
f3e1097b 650 return false;
6de9cd9a 651
f6288c24
FR
652 /* Protect against null components. */
653 if (derived1->attr.zero_comp != derived2->attr.zero_comp)
f3e1097b 654 return false;
f6288c24
FR
655
656 if (derived1->attr.zero_comp)
f3e1097b 657 return true;
f6288c24
FR
658
659 cmp1 = derived1->components;
660 cmp2 = derived2->components;
e0e85e06 661
6de9cd9a
DN
662 /* Since subtypes of SEQUENCE types must be SEQUENCE types as well, a
663 simple test can speed things up. Otherwise, lots of things have to
664 match. */
665 for (;;)
666 {
f6288c24 667 if (!compare_components (cmp1, cmp2, derived1, derived2))
f3e1097b 668 return false;
6de9cd9a 669
f6288c24
FR
670 cmp1 = cmp1->next;
671 cmp2 = cmp2->next;
2eae3dc7 672
f6288c24 673 if (cmp1 == NULL && cmp2 == NULL)
6de9cd9a 674 break;
f6288c24 675 if (cmp1 == NULL || cmp2 == NULL)
f3e1097b 676 return false;
6de9cd9a
DN
677 }
678
f3e1097b 679 return true;
6de9cd9a
DN
680}
681
b251af97 682
e0e85e06
PT
683/* Compare two typespecs, recursively if necessary. */
684
f3e1097b 685bool
b251af97 686gfc_compare_types (gfc_typespec *ts1, gfc_typespec *ts2)
e0e85e06 687{
a8b3b0b6
CR
688 /* See if one of the typespecs is a BT_VOID, which is what is being used
689 to allow the funcs like c_f_pointer to accept any pointer type.
690 TODO: Possibly should narrow this to just the one typespec coming in
691 that is for the formal arg, but oh well. */
692 if (ts1->type == BT_VOID || ts2->type == BT_VOID)
f3e1097b 693 return true;
8b704316 694
5af5f1de
TK
695 /* Special case for our C interop types. FIXME: There should be a
696 better way of doing this. When ISO C binding is cleared up,
697 this can probably be removed. See PR 57048. */
698
699 if (((ts1->type == BT_INTEGER && ts2->type == BT_DERIVED)
700 || (ts1->type == BT_DERIVED && ts2->type == BT_INTEGER))
701 && ts1->u.derived && ts2->u.derived
702 && ts1->u.derived == ts2->u.derived)
703 return true;
704
77b7d71e
AV
705 /* The _data component is not always present, therefore check for its
706 presence before assuming, that its derived->attr is available.
707 When the _data component is not present, then nevertheless the
708 unlimited_polymorphic flag may be set in the derived type's attr. */
709 if (ts1->type == BT_CLASS && ts1->u.derived->components
710 && ((ts1->u.derived->attr.is_class
711 && ts1->u.derived->components->ts.u.derived->attr
712 .unlimited_polymorphic)
713 || ts1->u.derived->attr.unlimited_polymorphic))
f3e1097b 714 return true;
8b704316
PT
715
716 /* F2003: C717 */
717 if (ts2->type == BT_CLASS && ts1->type == BT_DERIVED
77b7d71e
AV
718 && ts2->u.derived->components
719 && ((ts2->u.derived->attr.is_class
720 && ts2->u.derived->components->ts.u.derived->attr
721 .unlimited_polymorphic)
722 || ts2->u.derived->attr.unlimited_polymorphic)
8b704316 723 && (ts1->u.derived->attr.sequence || ts1->u.derived->attr.is_bind_c))
f3e1097b 724 return true;
8b704316 725
cf2b3c22 726 if (ts1->type != ts2->type
908b8296
FR
727 && ((ts1->type != BT_DERIVED && ts1->type != BT_CLASS)
728 || (ts2->type != BT_DERIVED && ts2->type != BT_CLASS)))
f3e1097b 729 return false;
908b8296
FR
730
731 if (ts1->type == BT_UNION)
f3e1097b 732 return compare_union_types (ts1->u.derived, ts2->u.derived);
908b8296 733
cf2b3c22 734 if (ts1->type != BT_DERIVED && ts1->type != BT_CLASS)
e0e85e06
PT
735 return (ts1->kind == ts2->kind);
736
737 /* Compare derived types. */
f6288c24 738 return gfc_type_compatible (ts1, ts2);
e0e85e06
PT
739}
740
6de9cd9a 741
f3e1097b 742static bool
e7333b69
JW
743compare_type (gfc_symbol *s1, gfc_symbol *s2)
744{
745 if (s2->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
f3e1097b 746 return true;
e7333b69 747
0ce0e6e8
JW
748 return gfc_compare_types (&s1->ts, &s2->ts) || s2->ts.type == BT_ASSUMED;
749}
750
751
752static bool
753compare_type_characteristics (gfc_symbol *s1, gfc_symbol *s2)
754{
60de1c7d
TB
755 /* TYPE and CLASS of the same declared type are type compatible,
756 but have different characteristics. */
757 if ((s1->ts.type == BT_CLASS && s2->ts.type == BT_DERIVED)
758 || (s1->ts.type == BT_DERIVED && s2->ts.type == BT_CLASS))
f3e1097b 759 return false;
60de1c7d 760
0ce0e6e8 761 return compare_type (s1, s2);
e7333b69
JW
762}
763
6de9cd9a 764
f3e1097b 765static bool
e7333b69 766compare_rank (gfc_symbol *s1, gfc_symbol *s2)
6de9cd9a 767{
aa6590cf 768 gfc_array_spec *as1, *as2;
6de9cd9a
DN
769 int r1, r2;
770
e7333b69 771 if (s2->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
f3e1097b 772 return true;
e7ac6a7c 773
75a3c61a
LK
774 as1 = (s1->ts.type == BT_CLASS
775 && !s1->ts.u.derived->attr.unlimited_polymorphic)
776 ? CLASS_DATA (s1)->as : s1->as;
777 as2 = (s2->ts.type == BT_CLASS
778 && !s2->ts.u.derived->attr.unlimited_polymorphic)
779 ? CLASS_DATA (s2)->as : s2->as;
aa6590cf
JW
780
781 r1 = as1 ? as1->rank : 0;
782 r2 = as2 ? as2->rank : 0;
6de9cd9a 783
e7333b69 784 if (r1 != r2 && (!as2 || as2->type != AS_ASSUMED_RANK))
f3e1097b 785 return false; /* Ranks differ. */
6de9cd9a 786
f3e1097b 787 return true;
e7333b69
JW
788}
789
790
791/* Given two symbols that are formal arguments, compare their ranks
f3e1097b
JW
792 and types. Returns true if they have the same rank and type,
793 false otherwise. */
e7333b69 794
f3e1097b 795static bool
e7333b69
JW
796compare_type_rank (gfc_symbol *s1, gfc_symbol *s2)
797{
798 return compare_type (s1, s2) && compare_rank (s1, s2);
6de9cd9a
DN
799}
800
801
6de9cd9a
DN
802/* Given two symbols that are formal arguments, compare their types
803 and rank and their formal interfaces if they are both dummy
f3e1097b 804 procedures. Returns true if the same, false if different. */
6de9cd9a 805
f3e1097b 806static bool
b251af97 807compare_type_rank_if (gfc_symbol *s1, gfc_symbol *s2)
6de9cd9a 808{
26f2ca2b 809 if (s1 == NULL || s2 == NULL)
f3e1097b 810 return (s1 == s2);
6de9cd9a 811
489ec4e3 812 if (s1 == s2)
f3e1097b 813 return true;
489ec4e3 814
6de9cd9a
DN
815 if (s1->attr.flavor != FL_PROCEDURE && s2->attr.flavor != FL_PROCEDURE)
816 return compare_type_rank (s1, s2);
817
818 if (s1->attr.flavor != FL_PROCEDURE || s2->attr.flavor != FL_PROCEDURE)
f3e1097b 819 return false;
6de9cd9a 820
489ec4e3
PT
821 /* At this point, both symbols are procedures. It can happen that
822 external procedures are compared, where one is identified by usage
823 to be a function or subroutine but the other is not. Check TKR
824 nonetheless for these cases. */
825 if (s1->attr.function == 0 && s1->attr.subroutine == 0)
f3e1097b 826 return s1->attr.external ? compare_type_rank (s1, s2) : false;
489ec4e3
PT
827
828 if (s2->attr.function == 0 && s2->attr.subroutine == 0)
f3e1097b 829 return s2->attr.external ? compare_type_rank (s1, s2) : false;
6de9cd9a 830
489ec4e3 831 /* Now the type of procedure has been identified. */
6de9cd9a
DN
832 if (s1->attr.function != s2->attr.function
833 || s1->attr.subroutine != s2->attr.subroutine)
f3e1097b 834 return false;
6de9cd9a 835
f3e1097b
JW
836 if (s1->attr.function && !compare_type_rank (s1, s2))
837 return false;
6de9cd9a 838
993ef28f
PT
839 /* Originally, gfortran recursed here to check the interfaces of passed
840 procedures. This is explicitly not required by the standard. */
f3e1097b 841 return true;
6de9cd9a
DN
842}
843
844
845/* Given a formal argument list and a keyword name, search the list
846 for that keyword. Returns the correct symbol node if found, NULL
847 if not found. */
848
849static gfc_symbol *
b251af97 850find_keyword_arg (const char *name, gfc_formal_arglist *f)
6de9cd9a 851{
6de9cd9a
DN
852 for (; f; f = f->next)
853 if (strcmp (f->sym->name, name) == 0)
854 return f->sym;
855
856 return NULL;
857}
858
859
860/******** Interface checking subroutines **********/
861
862
863/* Given an operator interface and the operator, make sure that all
864 interfaces for that operator are legal. */
865
94747289
DK
866bool
867gfc_check_operator_interface (gfc_symbol *sym, gfc_intrinsic_op op,
868 locus opwhere)
6de9cd9a
DN
869{
870 gfc_formal_arglist *formal;
871 sym_intent i1, i2;
6de9cd9a 872 bt t1, t2;
27189292 873 int args, r1, r2, k1, k2;
6de9cd9a 874
94747289 875 gcc_assert (sym);
6de9cd9a
DN
876
877 args = 0;
878 t1 = t2 = BT_UNKNOWN;
879 i1 = i2 = INTENT_UNKNOWN;
27189292
FXC
880 r1 = r2 = -1;
881 k1 = k2 = -1;
6de9cd9a 882
4cbc9039 883 for (formal = gfc_sym_get_dummy_args (sym); formal; formal = formal->next)
6de9cd9a 884 {
94747289
DK
885 gfc_symbol *fsym = formal->sym;
886 if (fsym == NULL)
8c086c9c
PT
887 {
888 gfc_error ("Alternate return cannot appear in operator "
94747289
DK
889 "interface at %L", &sym->declared_at);
890 return false;
8c086c9c 891 }
6de9cd9a
DN
892 if (args == 0)
893 {
94747289
DK
894 t1 = fsym->ts.type;
895 i1 = fsym->attr.intent;
896 r1 = (fsym->as != NULL) ? fsym->as->rank : 0;
897 k1 = fsym->ts.kind;
6de9cd9a
DN
898 }
899 if (args == 1)
900 {
94747289
DK
901 t2 = fsym->ts.type;
902 i2 = fsym->attr.intent;
903 r2 = (fsym->as != NULL) ? fsym->as->rank : 0;
904 k2 = fsym->ts.kind;
6de9cd9a
DN
905 }
906 args++;
907 }
908
27189292
FXC
909 /* Only +, - and .not. can be unary operators.
910 .not. cannot be a binary operator. */
a1ee985f
KG
911 if (args == 0 || args > 2 || (args == 1 && op != INTRINSIC_PLUS
912 && op != INTRINSIC_MINUS
913 && op != INTRINSIC_NOT)
914 || (args == 2 && op == INTRINSIC_NOT))
27189292 915 {
efb63364
TB
916 if (op == INTRINSIC_ASSIGN)
917 gfc_error ("Assignment operator interface at %L must have "
918 "two arguments", &sym->declared_at);
919 else
920 gfc_error ("Operator interface at %L has the wrong number of arguments",
921 &sym->declared_at);
94747289 922 return false;
27189292
FXC
923 }
924
925 /* Check that intrinsics are mapped to functions, except
926 INTRINSIC_ASSIGN which should map to a subroutine. */
a1ee985f 927 if (op == INTRINSIC_ASSIGN)
6de9cd9a 928 {
4cbc9039
JW
929 gfc_formal_arglist *dummy_args;
930
6de9cd9a
DN
931 if (!sym->attr.subroutine)
932 {
b251af97 933 gfc_error ("Assignment operator interface at %L must be "
94747289
DK
934 "a SUBROUTINE", &sym->declared_at);
935 return false;
6de9cd9a 936 }
e19bb186
TB
937
938 /* Allowed are (per F2003, 12.3.2.1.2 Defined assignments):
94747289 939 - First argument an array with different rank than second,
315d905f
TB
940 - First argument is a scalar and second an array,
941 - Types and kinds do not conform, or
94747289 942 - First argument is of derived type. */
4cbc9039
JW
943 dummy_args = gfc_sym_get_dummy_args (sym);
944 if (dummy_args->sym->ts.type != BT_DERIVED
945 && dummy_args->sym->ts.type != BT_CLASS
315d905f 946 && (r2 == 0 || r1 == r2)
4cbc9039
JW
947 && (dummy_args->sym->ts.type == dummy_args->next->sym->ts.type
948 || (gfc_numeric_ts (&dummy_args->sym->ts)
949 && gfc_numeric_ts (&dummy_args->next->sym->ts))))
8c086c9c 950 {
b251af97 951 gfc_error ("Assignment operator interface at %L must not redefine "
94747289
DK
952 "an INTRINSIC type assignment", &sym->declared_at);
953 return false;
8c086c9c 954 }
6de9cd9a
DN
955 }
956 else
957 {
958 if (!sym->attr.function)
959 {
960 gfc_error ("Intrinsic operator interface at %L must be a FUNCTION",
94747289
DK
961 &sym->declared_at);
962 return false;
6de9cd9a
DN
963 }
964 }
965
27189292 966 /* Check intents on operator interfaces. */
a1ee985f 967 if (op == INTRINSIC_ASSIGN)
6de9cd9a 968 {
27189292 969 if (i1 != INTENT_OUT && i1 != INTENT_INOUT)
94747289
DK
970 {
971 gfc_error ("First argument of defined assignment at %L must be "
972 "INTENT(OUT) or INTENT(INOUT)", &sym->declared_at);
973 return false;
974 }
27189292
FXC
975
976 if (i2 != INTENT_IN)
94747289
DK
977 {
978 gfc_error ("Second argument of defined assignment at %L must be "
979 "INTENT(IN)", &sym->declared_at);
980 return false;
981 }
27189292
FXC
982 }
983 else
984 {
985 if (i1 != INTENT_IN)
94747289
DK
986 {
987 gfc_error ("First argument of operator interface at %L must be "
988 "INTENT(IN)", &sym->declared_at);
989 return false;
990 }
27189292
FXC
991
992 if (args == 2 && i2 != INTENT_IN)
94747289
DK
993 {
994 gfc_error ("Second argument of operator interface at %L must be "
995 "INTENT(IN)", &sym->declared_at);
996 return false;
997 }
27189292
FXC
998 }
999
1000 /* From now on, all we have to do is check that the operator definition
1001 doesn't conflict with an intrinsic operator. The rules for this
1002 game are defined in 7.1.2 and 7.1.3 of both F95 and F2003 standards,
1003 as well as 12.3.2.1.1 of Fortran 2003:
1004
1005 "If the operator is an intrinsic-operator (R310), the number of
1006 function arguments shall be consistent with the intrinsic uses of
1007 that operator, and the types, kind type parameters, or ranks of the
1008 dummy arguments shall differ from those required for the intrinsic
1009 operation (7.1.2)." */
1010
1011#define IS_NUMERIC_TYPE(t) \
1012 ((t) == BT_INTEGER || (t) == BT_REAL || (t) == BT_COMPLEX)
1013
1014 /* Unary ops are easy, do them first. */
a1ee985f 1015 if (op == INTRINSIC_NOT)
27189292
FXC
1016 {
1017 if (t1 == BT_LOGICAL)
6de9cd9a 1018 goto bad_repl;
27189292 1019 else
94747289 1020 return true;
27189292 1021 }
6de9cd9a 1022
a1ee985f 1023 if (args == 1 && (op == INTRINSIC_PLUS || op == INTRINSIC_MINUS))
27189292
FXC
1024 {
1025 if (IS_NUMERIC_TYPE (t1))
6de9cd9a 1026 goto bad_repl;
27189292 1027 else
94747289 1028 return true;
27189292 1029 }
6de9cd9a 1030
27189292
FXC
1031 /* Character intrinsic operators have same character kind, thus
1032 operator definitions with operands of different character kinds
1033 are always safe. */
1034 if (t1 == BT_CHARACTER && t2 == BT_CHARACTER && k1 != k2)
94747289 1035 return true;
6de9cd9a 1036
27189292
FXC
1037 /* Intrinsic operators always perform on arguments of same rank,
1038 so different ranks is also always safe. (rank == 0) is an exception
1039 to that, because all intrinsic operators are elemental. */
1040 if (r1 != r2 && r1 != 0 && r2 != 0)
94747289 1041 return true;
6de9cd9a 1042
a1ee985f 1043 switch (op)
27189292 1044 {
6de9cd9a 1045 case INTRINSIC_EQ:
3bed9dd0 1046 case INTRINSIC_EQ_OS:
6de9cd9a 1047 case INTRINSIC_NE:
3bed9dd0 1048 case INTRINSIC_NE_OS:
27189292 1049 if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
6de9cd9a 1050 goto bad_repl;
27189292 1051 /* Fall through. */
6de9cd9a 1052
27189292
FXC
1053 case INTRINSIC_PLUS:
1054 case INTRINSIC_MINUS:
1055 case INTRINSIC_TIMES:
1056 case INTRINSIC_DIVIDE:
1057 case INTRINSIC_POWER:
1058 if (IS_NUMERIC_TYPE (t1) && IS_NUMERIC_TYPE (t2))
1059 goto bad_repl;
6de9cd9a
DN
1060 break;
1061
6de9cd9a 1062 case INTRINSIC_GT:
3bed9dd0 1063 case INTRINSIC_GT_OS:
27189292 1064 case INTRINSIC_GE:
3bed9dd0 1065 case INTRINSIC_GE_OS:
27189292 1066 case INTRINSIC_LT:
3bed9dd0 1067 case INTRINSIC_LT_OS:
27189292 1068 case INTRINSIC_LE:
3bed9dd0 1069 case INTRINSIC_LE_OS:
27189292
FXC
1070 if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
1071 goto bad_repl;
6de9cd9a
DN
1072 if ((t1 == BT_INTEGER || t1 == BT_REAL)
1073 && (t2 == BT_INTEGER || t2 == BT_REAL))
1074 goto bad_repl;
27189292 1075 break;
6de9cd9a 1076
27189292
FXC
1077 case INTRINSIC_CONCAT:
1078 if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
1079 goto bad_repl;
6de9cd9a
DN
1080 break;
1081
6de9cd9a 1082 case INTRINSIC_AND:
27189292 1083 case INTRINSIC_OR:
6de9cd9a
DN
1084 case INTRINSIC_EQV:
1085 case INTRINSIC_NEQV:
6de9cd9a
DN
1086 if (t1 == BT_LOGICAL && t2 == BT_LOGICAL)
1087 goto bad_repl;
1088 break;
1089
6de9cd9a 1090 default:
27189292
FXC
1091 break;
1092 }
6de9cd9a 1093
94747289 1094 return true;
6de9cd9a 1095
27189292
FXC
1096#undef IS_NUMERIC_TYPE
1097
6de9cd9a
DN
1098bad_repl:
1099 gfc_error ("Operator interface at %L conflicts with intrinsic interface",
94747289
DK
1100 &opwhere);
1101 return false;
6de9cd9a
DN
1102}
1103
1104
1105/* Given a pair of formal argument lists, we see if the two lists can
1106 be distinguished by counting the number of nonoptional arguments of
1107 a given type/rank in f1 and seeing if there are less then that
1108 number of those arguments in f2 (including optional arguments).
1109 Since this test is asymmetric, it has to be called twice to make it
6f3ab30d
JW
1110 symmetric. Returns nonzero if the argument lists are incompatible
1111 by this test. This subroutine implements rule 1 of section F03:16.2.3.
1112 'p1' and 'p2' are the PASS arguments of both procedures (if applicable). */
6de9cd9a 1113
f3e1097b 1114static bool
6f3ab30d
JW
1115count_types_test (gfc_formal_arglist *f1, gfc_formal_arglist *f2,
1116 const char *p1, const char *p2)
6de9cd9a 1117{
f3e1097b 1118 int ac1, ac2, i, j, k, n1;
6de9cd9a
DN
1119 gfc_formal_arglist *f;
1120
1121 typedef struct
1122 {
1123 int flag;
1124 gfc_symbol *sym;
1125 }
1126 arginfo;
1127
1128 arginfo *arg;
1129
1130 n1 = 0;
1131
1132 for (f = f1; f; f = f->next)
1133 n1++;
1134
1135 /* Build an array of integers that gives the same integer to
1136 arguments of the same type/rank. */
ece3f663 1137 arg = XCNEWVEC (arginfo, n1);
6de9cd9a
DN
1138
1139 f = f1;
1140 for (i = 0; i < n1; i++, f = f->next)
1141 {
1142 arg[i].flag = -1;
1143 arg[i].sym = f->sym;
1144 }
1145
1146 k = 0;
1147
1148 for (i = 0; i < n1; i++)
1149 {
1150 if (arg[i].flag != -1)
1151 continue;
1152
6f3ab30d
JW
1153 if (arg[i].sym && (arg[i].sym->attr.optional
1154 || (p1 && strcmp (arg[i].sym->name, p1) == 0)))
1155 continue; /* Skip OPTIONAL and PASS arguments. */
6de9cd9a
DN
1156
1157 arg[i].flag = k;
1158
6f3ab30d 1159 /* Find other non-optional, non-pass arguments of the same type/rank. */
6de9cd9a 1160 for (j = i + 1; j < n1; j++)
6f3ab30d
JW
1161 if ((arg[j].sym == NULL
1162 || !(arg[j].sym->attr.optional
1163 || (p1 && strcmp (arg[j].sym->name, p1) == 0)))
2b603773
JW
1164 && (compare_type_rank_if (arg[i].sym, arg[j].sym)
1165 || compare_type_rank_if (arg[j].sym, arg[i].sym)))
6de9cd9a
DN
1166 arg[j].flag = k;
1167
1168 k++;
1169 }
1170
1171 /* Now loop over each distinct type found in f1. */
1172 k = 0;
f3e1097b 1173 bool rc = false;
6de9cd9a
DN
1174
1175 for (i = 0; i < n1; i++)
1176 {
1177 if (arg[i].flag != k)
1178 continue;
1179
1180 ac1 = 1;
1181 for (j = i + 1; j < n1; j++)
1182 if (arg[j].flag == k)
1183 ac1++;
1184
6f3ab30d
JW
1185 /* Count the number of non-pass arguments in f2 with that type,
1186 including those that are optional. */
6de9cd9a
DN
1187 ac2 = 0;
1188
1189 for (f = f2; f; f = f->next)
6f3ab30d
JW
1190 if ((!p2 || strcmp (f->sym->name, p2) != 0)
1191 && (compare_type_rank_if (arg[i].sym, f->sym)
1192 || compare_type_rank_if (f->sym, arg[i].sym)))
6de9cd9a
DN
1193 ac2++;
1194
1195 if (ac1 > ac2)
1196 {
f3e1097b 1197 rc = true;
6de9cd9a
DN
1198 break;
1199 }
1200
1201 k++;
1202 }
1203
cede9502 1204 free (arg);
6de9cd9a
DN
1205
1206 return rc;
1207}
1208
1209
c7927c3b
JW
1210/* Returns true if two dummy arguments are distinguishable due to their POINTER
1211 and ALLOCATABLE attributes according to F2018 section 15.4.3.4.5 (3).
1212 The function is asymmetric wrt to the arguments s1 and s2 and should always
1213 be called twice (with flipped arguments in the second call). */
1214
1215static bool
1216compare_ptr_alloc(gfc_symbol *s1, gfc_symbol *s2)
1217{
1218 /* Is s1 allocatable? */
1219 const bool a1 = s1->ts.type == BT_CLASS ?
1220 CLASS_DATA(s1)->attr.allocatable : s1->attr.allocatable;
1221 /* Is s2 a pointer? */
1222 const bool p2 = s2->ts.type == BT_CLASS ?
1223 CLASS_DATA(s2)->attr.class_pointer : s2->attr.pointer;
1224 return a1 && p2 && (s2->attr.intent != INTENT_IN);
1225}
1226
1227
e9355cc3
JW
1228/* Perform the correspondence test in rule (3) of F08:C1215.
1229 Returns zero if no argument is found that satisfies this rule,
1230 nonzero otherwise. 'p1' and 'p2' are the PASS arguments of both procedures
6f3ab30d 1231 (if applicable).
6de9cd9a
DN
1232
1233 This test is also not symmetric in f1 and f2 and must be called
1234 twice. This test finds problems caused by sorting the actual
1235 argument list with keywords. For example:
1236
1237 INTERFACE FOO
e9355cc3
JW
1238 SUBROUTINE F1(A, B)
1239 INTEGER :: A ; REAL :: B
1240 END SUBROUTINE F1
6de9cd9a 1241
e9355cc3
JW
1242 SUBROUTINE F2(B, A)
1243 INTEGER :: A ; REAL :: B
1244 END SUBROUTINE F1
6de9cd9a
DN
1245 END INTERFACE FOO
1246
1247 At this point, 'CALL FOO(A=1, B=1.0)' is ambiguous. */
1248
f3e1097b 1249static bool
6f3ab30d
JW
1250generic_correspondence (gfc_formal_arglist *f1, gfc_formal_arglist *f2,
1251 const char *p1, const char *p2)
6de9cd9a 1252{
6de9cd9a
DN
1253 gfc_formal_arglist *f2_save, *g;
1254 gfc_symbol *sym;
1255
1256 f2_save = f2;
1257
1258 while (f1)
1259 {
8f8ea4a4 1260 if (!f1->sym || f1->sym->attr.optional)
6de9cd9a
DN
1261 goto next;
1262
6f3ab30d
JW
1263 if (p1 && strcmp (f1->sym->name, p1) == 0)
1264 f1 = f1->next;
1265 if (f2 && p2 && strcmp (f2->sym->name, p2) == 0)
1266 f2 = f2->next;
1267
2b603773 1268 if (f2 != NULL && (compare_type_rank (f1->sym, f2->sym)
e9355cc3
JW
1269 || compare_type_rank (f2->sym, f1->sym))
1270 && !((gfc_option.allow_std & GFC_STD_F2008)
c7927c3b
JW
1271 && (compare_ptr_alloc(f1->sym, f2->sym)
1272 || compare_ptr_alloc(f2->sym, f1->sym))))
6de9cd9a
DN
1273 goto next;
1274
1275 /* Now search for a disambiguating keyword argument starting at
b251af97 1276 the current non-match. */
6de9cd9a
DN
1277 for (g = f1; g; g = g->next)
1278 {
6f3ab30d 1279 if (g->sym->attr.optional || (p1 && strcmp (g->sym->name, p1) == 0))
6de9cd9a
DN
1280 continue;
1281
1282 sym = find_keyword_arg (g->sym->name, f2_save);
e9355cc3
JW
1283 if (sym == NULL || !compare_type_rank (g->sym, sym)
1284 || ((gfc_option.allow_std & GFC_STD_F2008)
c7927c3b
JW
1285 && (compare_ptr_alloc(sym, g->sym)
1286 || compare_ptr_alloc(g->sym, sym))))
f3e1097b 1287 return true;
6de9cd9a
DN
1288 }
1289
1290 next:
6f3ab30d
JW
1291 if (f1 != NULL)
1292 f1 = f1->next;
6de9cd9a
DN
1293 if (f2 != NULL)
1294 f2 = f2->next;
1295 }
1296
f3e1097b 1297 return false;
6de9cd9a
DN
1298}
1299
1300
e7333b69
JW
1301static int
1302symbol_rank (gfc_symbol *sym)
1303{
1fb84d5b
SK
1304 gfc_array_spec *as = NULL;
1305
f11600c9 1306 if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
1fb84d5b
SK
1307 as = CLASS_DATA (sym)->as;
1308 else
1309 as = sym->as;
1310
e7333b69
JW
1311 return as ? as->rank : 0;
1312}
1313
1314
9795c594
JW
1315/* Check if the characteristics of two dummy arguments match,
1316 cf. F08:12.3.2. */
1317
4668d6f9
PT
1318bool
1319gfc_check_dummy_characteristics (gfc_symbol *s1, gfc_symbol *s2,
1320 bool type_must_agree, char *errmsg,
1321 int err_len)
9795c594 1322{
9362a03b 1323 if (s1 == NULL || s2 == NULL)
524af0d6 1324 return s1 == s2 ? true : false;
9362a03b 1325
9795c594 1326 /* Check type and rank. */
e7333b69 1327 if (type_must_agree)
9795c594 1328 {
0ce0e6e8
JW
1329 if (!compare_type_characteristics (s1, s2)
1330 || !compare_type_characteristics (s2, s1))
e7333b69
JW
1331 {
1332 snprintf (errmsg, err_len, "Type mismatch in argument '%s' (%s/%s)",
f61e54e5
ME
1333 s1->name, gfc_dummy_typename (&s1->ts),
1334 gfc_dummy_typename (&s2->ts));
e7333b69
JW
1335 return false;
1336 }
1337 if (!compare_rank (s1, s2))
1338 {
1339 snprintf (errmsg, err_len, "Rank mismatch in argument '%s' (%i/%i)",
1340 s1->name, symbol_rank (s1), symbol_rank (s2));
1341 return false;
1342 }
9795c594
JW
1343 }
1344
1345 /* Check INTENT. */
90efb251
TK
1346 if (s1->attr.intent != s2->attr.intent && !s1->attr.artificial
1347 && !s2->attr.artificial)
9795c594
JW
1348 {
1349 snprintf (errmsg, err_len, "INTENT mismatch in argument '%s'",
1350 s1->name);
524af0d6 1351 return false;
9795c594
JW
1352 }
1353
1354 /* Check OPTIONAL attribute. */
1355 if (s1->attr.optional != s2->attr.optional)
1356 {
1357 snprintf (errmsg, err_len, "OPTIONAL mismatch in argument '%s'",
1358 s1->name);
524af0d6 1359 return false;
9795c594
JW
1360 }
1361
1362 /* Check ALLOCATABLE attribute. */
1363 if (s1->attr.allocatable != s2->attr.allocatable)
1364 {
1365 snprintf (errmsg, err_len, "ALLOCATABLE mismatch in argument '%s'",
1366 s1->name);
524af0d6 1367 return false;
9795c594
JW
1368 }
1369
1370 /* Check POINTER attribute. */
1371 if (s1->attr.pointer != s2->attr.pointer)
1372 {
1373 snprintf (errmsg, err_len, "POINTER mismatch in argument '%s'",
1374 s1->name);
524af0d6 1375 return false;
9795c594
JW
1376 }
1377
1378 /* Check TARGET attribute. */
1379 if (s1->attr.target != s2->attr.target)
1380 {
1381 snprintf (errmsg, err_len, "TARGET mismatch in argument '%s'",
1382 s1->name);
524af0d6 1383 return false;
9795c594
JW
1384 }
1385
688974a3
JW
1386 /* Check ASYNCHRONOUS attribute. */
1387 if (s1->attr.asynchronous != s2->attr.asynchronous)
1388 {
1389 snprintf (errmsg, err_len, "ASYNCHRONOUS mismatch in argument '%s'",
1390 s1->name);
1391 return false;
1392 }
1393
1394 /* Check CONTIGUOUS attribute. */
1395 if (s1->attr.contiguous != s2->attr.contiguous)
1396 {
1397 snprintf (errmsg, err_len, "CONTIGUOUS mismatch in argument '%s'",
1398 s1->name);
1399 return false;
1400 }
1401
1402 /* Check VALUE attribute. */
1403 if (s1->attr.value != s2->attr.value)
1404 {
1405 snprintf (errmsg, err_len, "VALUE mismatch in argument '%s'",
1406 s1->name);
1407 return false;
1408 }
1409
1410 /* Check VOLATILE attribute. */
1411 if (s1->attr.volatile_ != s2->attr.volatile_)
1412 {
1413 snprintf (errmsg, err_len, "VOLATILE mismatch in argument '%s'",
1414 s1->name);
1415 return false;
1416 }
9795c594 1417
f2f8171f
JW
1418 /* Check interface of dummy procedures. */
1419 if (s1->attr.flavor == FL_PROCEDURE)
1420 {
1421 char err[200];
1422 if (!gfc_compare_interfaces (s1, s2, s2->name, 0, 1, err, sizeof(err),
1423 NULL, NULL))
1424 {
1425 snprintf (errmsg, err_len, "Interface mismatch in dummy procedure "
1426 "'%s': %s", s1->name, err);
524af0d6 1427 return false;
f2f8171f
JW
1428 }
1429 }
1430
9795c594
JW
1431 /* Check string length. */
1432 if (s1->ts.type == BT_CHARACTER
1433 && s1->ts.u.cl && s1->ts.u.cl->length
1434 && s2->ts.u.cl && s2->ts.u.cl->length)
1435 {
1436 int compval = gfc_dep_compare_expr (s1->ts.u.cl->length,
1437 s2->ts.u.cl->length);
1438 switch (compval)
1439 {
1440 case -1:
1441 case 1:
1442 case -3:
1443 snprintf (errmsg, err_len, "Character length mismatch "
1444 "in argument '%s'", s1->name);
524af0d6 1445 return false;
9795c594
JW
1446
1447 case -2:
1448 /* FIXME: Implement a warning for this case.
db30e21c 1449 gfc_warning (0, "Possible character length mismatch in argument %qs",
9795c594
JW
1450 s1->name);*/
1451 break;
1452
1453 case 0:
1454 break;
1455
1456 default:
1457 gfc_internal_error ("check_dummy_characteristics: Unexpected result "
1458 "%i of gfc_dep_compare_expr", compval);
1459 break;
1460 }
1461 }
1462
1463 /* Check array shape. */
1464 if (s1->as && s2->as)
1465 {
97f26732
JW
1466 int i, compval;
1467 gfc_expr *shape1, *shape2;
1468
a5baf71b
PT
1469 /* Sometimes the ambiguity between deferred shape and assumed shape
1470 does not get resolved in module procedures, where the only explicit
1471 declaration of the dummy is in the interface. */
1472 if (s1->ns->proc_name && s1->ns->proc_name->attr.module_procedure
1473 && s1->as->type == AS_ASSUMED_SHAPE
1474 && s2->as->type == AS_DEFERRED)
1475 {
1476 s2->as->type = AS_ASSUMED_SHAPE;
1477 for (i = 0; i < s2->as->rank; i++)
1478 if (s1->as->lower[i] != NULL)
1479 s2->as->lower[i] = gfc_copy_expr (s1->as->lower[i]);
1480 }
1481
9795c594
JW
1482 if (s1->as->type != s2->as->type)
1483 {
1484 snprintf (errmsg, err_len, "Shape mismatch in argument '%s'",
1485 s1->name);
524af0d6 1486 return false;
9795c594 1487 }
97f26732 1488
b25affbd
TB
1489 if (s1->as->corank != s2->as->corank)
1490 {
1491 snprintf (errmsg, err_len, "Corank mismatch in argument '%s' (%i/%i)",
1492 s1->name, s1->as->corank, s2->as->corank);
1493 return false;
1494 }
1495
97f26732 1496 if (s1->as->type == AS_EXPLICIT)
47da0bf6 1497 for (i = 0; i < s1->as->rank + MAX (0, s1->as->corank-1); i++)
97f26732
JW
1498 {
1499 shape1 = gfc_subtract (gfc_copy_expr (s1->as->upper[i]),
1500 gfc_copy_expr (s1->as->lower[i]));
1501 shape2 = gfc_subtract (gfc_copy_expr (s2->as->upper[i]),
1502 gfc_copy_expr (s2->as->lower[i]));
1503 compval = gfc_dep_compare_expr (shape1, shape2);
1504 gfc_free_expr (shape1);
1505 gfc_free_expr (shape2);
1506 switch (compval)
1507 {
1508 case -1:
1509 case 1:
1510 case -3:
b25affbd
TB
1511 if (i < s1->as->rank)
1512 snprintf (errmsg, err_len, "Shape mismatch in dimension %i of"
1513 " argument '%s'", i + 1, s1->name);
1514 else
1515 snprintf (errmsg, err_len, "Shape mismatch in codimension %i "
1516 "of argument '%s'", i - s1->as->rank + 1, s1->name);
524af0d6 1517 return false;
97f26732
JW
1518
1519 case -2:
1520 /* FIXME: Implement a warning for this case.
db30e21c 1521 gfc_warning (0, "Possible shape mismatch in argument %qs",
97f26732
JW
1522 s1->name);*/
1523 break;
1524
1525 case 0:
1526 break;
1527
1528 default:
1529 gfc_internal_error ("check_dummy_characteristics: Unexpected "
1530 "result %i of gfc_dep_compare_expr",
1531 compval);
1532 break;
1533 }
1534 }
9795c594 1535 }
8b704316 1536
524af0d6 1537 return true;
9795c594
JW
1538}
1539
1540
edc802c7
JW
1541/* Check if the characteristics of two function results match,
1542 cf. F08:12.3.3. */
1543
4668d6f9
PT
1544bool
1545gfc_check_result_characteristics (gfc_symbol *s1, gfc_symbol *s2,
2298af08 1546 char *errmsg, int err_len)
edc802c7
JW
1547{
1548 gfc_symbol *r1, *r2;
1549
82b541a1
JW
1550 if (s1->ts.interface && s1->ts.interface->result)
1551 r1 = s1->ts.interface->result;
1552 else
1553 r1 = s1->result ? s1->result : s1;
1554
1555 if (s2->ts.interface && s2->ts.interface->result)
1556 r2 = s2->ts.interface->result;
1557 else
1558 r2 = s2->result ? s2->result : s2;
edc802c7
JW
1559
1560 if (r1->ts.type == BT_UNKNOWN)
524af0d6 1561 return true;
edc802c7
JW
1562
1563 /* Check type and rank. */
0ce0e6e8 1564 if (!compare_type_characteristics (r1, r2))
edc802c7 1565 {
e7333b69
JW
1566 snprintf (errmsg, err_len, "Type mismatch in function result (%s/%s)",
1567 gfc_typename (&r1->ts), gfc_typename (&r2->ts));
1568 return false;
1569 }
1570 if (!compare_rank (r1, r2))
1571 {
1572 snprintf (errmsg, err_len, "Rank mismatch in function result (%i/%i)",
1573 symbol_rank (r1), symbol_rank (r2));
524af0d6 1574 return false;
edc802c7
JW
1575 }
1576
1577 /* Check ALLOCATABLE attribute. */
1578 if (r1->attr.allocatable != r2->attr.allocatable)
1579 {
1580 snprintf (errmsg, err_len, "ALLOCATABLE attribute mismatch in "
1581 "function result");
524af0d6 1582 return false;
edc802c7
JW
1583 }
1584
1585 /* Check POINTER attribute. */
1586 if (r1->attr.pointer != r2->attr.pointer)
1587 {
1588 snprintf (errmsg, err_len, "POINTER attribute mismatch in "
1589 "function result");
524af0d6 1590 return false;
edc802c7
JW
1591 }
1592
1593 /* Check CONTIGUOUS attribute. */
1594 if (r1->attr.contiguous != r2->attr.contiguous)
1595 {
1596 snprintf (errmsg, err_len, "CONTIGUOUS attribute mismatch in "
1597 "function result");
524af0d6 1598 return false;
edc802c7
JW
1599 }
1600
1601 /* Check PROCEDURE POINTER attribute. */
1602 if (r1 != s1 && r1->attr.proc_pointer != r2->attr.proc_pointer)
1603 {
1604 snprintf (errmsg, err_len, "PROCEDURE POINTER mismatch in "
1605 "function result");
524af0d6 1606 return false;
edc802c7
JW
1607 }
1608
1609 /* Check string length. */
1610 if (r1->ts.type == BT_CHARACTER && r1->ts.u.cl && r2->ts.u.cl)
1611 {
1612 if (r1->ts.deferred != r2->ts.deferred)
1613 {
1614 snprintf (errmsg, err_len, "Character length mismatch "
1615 "in function result");
524af0d6 1616 return false;
edc802c7
JW
1617 }
1618
96486998 1619 if (r1->ts.u.cl->length && r2->ts.u.cl->length)
edc802c7
JW
1620 {
1621 int compval = gfc_dep_compare_expr (r1->ts.u.cl->length,
1622 r2->ts.u.cl->length);
1623 switch (compval)
1624 {
1625 case -1:
1626 case 1:
1627 case -3:
1628 snprintf (errmsg, err_len, "Character length mismatch "
1629 "in function result");
524af0d6 1630 return false;
edc802c7
JW
1631
1632 case -2:
1633 /* FIXME: Implement a warning for this case.
1634 snprintf (errmsg, err_len, "Possible character length mismatch "
1635 "in function result");*/
1636 break;
1637
1638 case 0:
1639 break;
1640
1641 default:
1642 gfc_internal_error ("check_result_characteristics (1): Unexpected "
1643 "result %i of gfc_dep_compare_expr", compval);
1644 break;
1645 }
1646 }
1647 }
1648
1649 /* Check array shape. */
1650 if (!r1->attr.allocatable && !r1->attr.pointer && r1->as && r2->as)
1651 {
1652 int i, compval;
1653 gfc_expr *shape1, *shape2;
1654
1655 if (r1->as->type != r2->as->type)
1656 {
1657 snprintf (errmsg, err_len, "Shape mismatch in function result");
524af0d6 1658 return false;
edc802c7
JW
1659 }
1660
1661 if (r1->as->type == AS_EXPLICIT)
1662 for (i = 0; i < r1->as->rank + r1->as->corank; i++)
1663 {
1664 shape1 = gfc_subtract (gfc_copy_expr (r1->as->upper[i]),
1665 gfc_copy_expr (r1->as->lower[i]));
1666 shape2 = gfc_subtract (gfc_copy_expr (r2->as->upper[i]),
1667 gfc_copy_expr (r2->as->lower[i]));
1668 compval = gfc_dep_compare_expr (shape1, shape2);
1669 gfc_free_expr (shape1);
1670 gfc_free_expr (shape2);
1671 switch (compval)
1672 {
1673 case -1:
1674 case 1:
1675 case -3:
1676 snprintf (errmsg, err_len, "Shape mismatch in dimension %i of "
1677 "function result", i + 1);
524af0d6 1678 return false;
edc802c7
JW
1679
1680 case -2:
1681 /* FIXME: Implement a warning for this case.
db30e21c 1682 gfc_warning (0, "Possible shape mismatch in return value");*/
edc802c7
JW
1683 break;
1684
1685 case 0:
1686 break;
1687
1688 default:
1689 gfc_internal_error ("check_result_characteristics (2): "
1690 "Unexpected result %i of "
1691 "gfc_dep_compare_expr", compval);
1692 break;
1693 }
1694 }
1695 }
1696
524af0d6 1697 return true;
edc802c7
JW
1698}
1699
1700
6de9cd9a 1701/* 'Compare' two formal interfaces associated with a pair of symbols.
f3e1097b 1702 We return true if there exists an actual argument list that
8ad15a0a 1703 would be ambiguous between the two interfaces, zero otherwise.
58c1ae36 1704 'strict_flag' specifies whether all the characteristics are
6f3ab30d
JW
1705 required to match, which is not the case for ambiguity checks.
1706 'p1' and 'p2' are the PASS arguments of both procedures (if applicable). */
6de9cd9a 1707
f3e1097b 1708bool
889dc035 1709gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol *s2, const char *name2,
58c1ae36 1710 int generic_flag, int strict_flag,
6f3ab30d 1711 char *errmsg, int err_len,
2298af08
TK
1712 const char *p1, const char *p2,
1713 bool *bad_result_characteristics)
6de9cd9a
DN
1714{
1715 gfc_formal_arglist *f1, *f2;
1716
0175478d
JD
1717 gcc_assert (name2 != NULL);
1718
2298af08
TK
1719 if (bad_result_characteristics)
1720 *bad_result_characteristics = false;
1721
9b63f282
JW
1722 if (s1->attr.function && (s2->attr.subroutine
1723 || (!s2->attr.function && s2->ts.type == BT_UNKNOWN
889dc035 1724 && gfc_get_default_type (name2, s2->ns)->type == BT_UNKNOWN)))
8ad15a0a
JW
1725 {
1726 if (errmsg != NULL)
889dc035 1727 snprintf (errmsg, err_len, "'%s' is not a function", name2);
f3e1097b 1728 return false;
8ad15a0a
JW
1729 }
1730
1731 if (s1->attr.subroutine && s2->attr.function)
1732 {
1733 if (errmsg != NULL)
889dc035 1734 snprintf (errmsg, err_len, "'%s' is not a subroutine", name2);
f3e1097b 1735 return false;
8ad15a0a 1736 }
3afadac3 1737
58c1ae36
JW
1738 /* Do strict checks on all characteristics
1739 (for dummy procedures and procedure pointer assignments). */
1740 if (!generic_flag && strict_flag)
6cc309c9 1741 {
58c1ae36 1742 if (s1->attr.function && s2->attr.function)
8ad15a0a 1743 {
edc802c7 1744 /* If both are functions, check result characteristics. */
4668d6f9
PT
1745 if (!gfc_check_result_characteristics (s1, s2, errmsg, err_len)
1746 || !gfc_check_result_characteristics (s2, s1, errmsg, err_len))
2298af08
TK
1747 {
1748 if (bad_result_characteristics)
1749 *bad_result_characteristics = true;
1750 return false;
1751 }
58c1ae36
JW
1752 }
1753
1754 if (s1->attr.pure && !s2->attr.pure)
1755 {
1756 snprintf (errmsg, err_len, "Mismatch in PURE attribute");
f3e1097b 1757 return false;
58c1ae36
JW
1758 }
1759 if (s1->attr.elemental && !s2->attr.elemental)
1760 {
1761 snprintf (errmsg, err_len, "Mismatch in ELEMENTAL attribute");
f3e1097b 1762 return false;
8ad15a0a 1763 }
6cc309c9 1764 }
26033479 1765
8ad15a0a
JW
1766 if (s1->attr.if_source == IFSRC_UNKNOWN
1767 || s2->attr.if_source == IFSRC_UNKNOWN)
f3e1097b 1768 return true;
26033479 1769
4cbc9039
JW
1770 f1 = gfc_sym_get_dummy_args (s1);
1771 f2 = gfc_sym_get_dummy_args (s2);
26033479 1772
bd845c14 1773 /* Special case: No arguments. */
c73b6478 1774 if (f1 == NULL && f2 == NULL)
f3e1097b 1775 return true;
6cc309c9 1776
c73b6478 1777 if (generic_flag)
6cc309c9 1778 {
6f3ab30d
JW
1779 if (count_types_test (f1, f2, p1, p2)
1780 || count_types_test (f2, f1, p2, p1))
f3e1097b 1781 return false;
bd845c14
SK
1782
1783 /* Special case: alternate returns. If both f1->sym and f2->sym are
e4e659b9
JW
1784 NULL, then the leading formal arguments are alternate returns.
1785 The previous conditional should catch argument lists with
bd845c14
SK
1786 different number of argument. */
1787 if (f1 && f1->sym == NULL && f2 && f2->sym == NULL)
f3e1097b 1788 return true;
bd845c14 1789
6f3ab30d
JW
1790 if (generic_correspondence (f1, f2, p1, p2)
1791 || generic_correspondence (f2, f1, p2, p1))
f3e1097b 1792 return false;
6cc309c9 1793 }
c73b6478 1794 else
8ad15a0a
JW
1795 /* Perform the abbreviated correspondence test for operators (the
1796 arguments cannot be optional and are always ordered correctly).
1797 This is also done when comparing interfaces for dummy procedures and in
1798 procedure pointer assignments. */
1799
f76c4d97 1800 for (; f1 || f2; f1 = f1->next, f2 = f2->next)
8ad15a0a
JW
1801 {
1802 /* Check existence. */
8ad15a0a
JW
1803 if (f1 == NULL || f2 == NULL)
1804 {
1805 if (errmsg != NULL)
1806 snprintf (errmsg, err_len, "'%s' has the wrong number of "
889dc035 1807 "arguments", name2);
f3e1097b 1808 return false;
8ad15a0a
JW
1809 }
1810
58c1ae36 1811 if (strict_flag)
8ad15a0a 1812 {
9795c594 1813 /* Check all characteristics. */
4668d6f9 1814 if (!gfc_check_dummy_characteristics (f1->sym, f2->sym, true,
524af0d6 1815 errmsg, err_len))
f3e1097b 1816 return false;
9795c594 1817 }
e7333b69 1818 else
9795c594 1819 {
d50cd259 1820 /* Operators: Only check type and rank of arguments. */
e7333b69
JW
1821 if (!compare_type (f2->sym, f1->sym))
1822 {
1823 if (errmsg != NULL)
1824 snprintf (errmsg, err_len, "Type mismatch in argument '%s' "
1825 "(%s/%s)", f1->sym->name,
1826 gfc_typename (&f1->sym->ts),
1827 gfc_typename (&f2->sym->ts));
f3e1097b 1828 return false;
e7333b69
JW
1829 }
1830 if (!compare_rank (f2->sym, f1->sym))
1831 {
1832 if (errmsg != NULL)
e0b9e5f9
TK
1833 snprintf (errmsg, err_len, "Rank mismatch in argument "
1834 "'%s' (%i/%i)", f1->sym->name,
1835 symbol_rank (f1->sym), symbol_rank (f2->sym));
f3e1097b 1836 return false;
e7333b69 1837 }
d50cd259
JW
1838 if ((gfc_option.allow_std & GFC_STD_F2008)
1839 && (compare_ptr_alloc(f1->sym, f2->sym)
1840 || compare_ptr_alloc(f2->sym, f1->sym)))
1841 {
1842 if (errmsg != NULL)
1843 snprintf (errmsg, err_len, "Mismatching POINTER/ALLOCATABLE "
1844 "attribute in argument '%s' ", f1->sym->name);
1845 return false;
1846 }
8ad15a0a 1847 }
8ad15a0a
JW
1848 }
1849
f3e1097b 1850 return true;
6cc309c9
JD
1851}
1852
1853
6de9cd9a 1854/* Given a pointer to an interface pointer, remove duplicate
284d58f1 1855 interfaces and make sure that all symbols are either functions
f3e1097b 1856 or subroutines, and all of the same kind. Returns true if
284d58f1 1857 something goes wrong. */
6de9cd9a 1858
f3e1097b 1859static bool
b251af97 1860check_interface0 (gfc_interface *p, const char *interface_name)
6de9cd9a
DN
1861{
1862 gfc_interface *psave, *q, *qlast;
1863
1864 psave = p;
6de9cd9a 1865 for (; p; p = p->next)
284d58f1
DF
1866 {
1867 /* Make sure all symbols in the interface have been defined as
1868 functions or subroutines. */
c3f34952
TB
1869 if (((!p->sym->attr.function && !p->sym->attr.subroutine)
1870 || !p->sym->attr.if_source)
f6288c24 1871 && !gfc_fl_struct (p->sym->attr.flavor))
284d58f1 1872 {
bcc478b9
BRF
1873 const char *guessed
1874 = gfc_lookup_function_fuzzy (p->sym->name, p->sym->ns->sym_root);
1875
284d58f1 1876 if (p->sym->attr.external)
bcc478b9
BRF
1877 if (guessed)
1878 gfc_error ("Procedure %qs in %s at %L has no explicit interface"
1879 "; did you mean %qs?",
1880 p->sym->name, interface_name, &p->sym->declared_at,
1881 guessed);
1882 else
1883 gfc_error ("Procedure %qs in %s at %L has no explicit interface",
1884 p->sym->name, interface_name, &p->sym->declared_at);
284d58f1 1885 else
bcc478b9
BRF
1886 if (guessed)
1887 gfc_error ("Procedure %qs in %s at %L is neither function nor "
1888 "subroutine; did you mean %qs?", p->sym->name,
1889 interface_name, &p->sym->declared_at, guessed);
1890 else
1891 gfc_error ("Procedure %qs in %s at %L is neither function nor "
1892 "subroutine", p->sym->name, interface_name,
1893 &p->sym->declared_at);
f3e1097b 1894 return true;
284d58f1
DF
1895 }
1896
1897 /* Verify that procedures are either all SUBROUTINEs or all FUNCTIONs. */
c3f34952 1898 if ((psave->sym->attr.function && !p->sym->attr.function
f6288c24 1899 && !gfc_fl_struct (p->sym->attr.flavor))
284d58f1
DF
1900 || (psave->sym->attr.subroutine && !p->sym->attr.subroutine))
1901 {
f6288c24 1902 if (!gfc_fl_struct (p->sym->attr.flavor))
c3f34952
TB
1903 gfc_error ("In %s at %L procedures must be either all SUBROUTINEs"
1904 " or all FUNCTIONs", interface_name,
1905 &p->sym->declared_at);
f6288c24 1906 else if (p->sym->attr.flavor == FL_DERIVED)
c3f34952
TB
1907 gfc_error ("In %s at %L procedures must be all FUNCTIONs as the "
1908 "generic name is also the name of a derived type",
1909 interface_name, &p->sym->declared_at);
f3e1097b 1910 return true;
284d58f1 1911 }
a300121e 1912
d2c5dbf2 1913 /* F2003, C1207. F2008, C1207. */
a300121e 1914 if (p->sym->attr.proc == PROC_INTERNAL
524af0d6 1915 && !gfc_notify_std (GFC_STD_F2008, "Internal procedure "
a4d9b221 1916 "%qs in %s at %L", p->sym->name,
524af0d6 1917 interface_name, &p->sym->declared_at))
f3e1097b 1918 return true;
284d58f1 1919 }
6de9cd9a
DN
1920 p = psave;
1921
1922 /* Remove duplicate interfaces in this interface list. */
1923 for (; p; p = p->next)
1924 {
1925 qlast = p;
1926
1927 for (q = p->next; q;)
1928 {
1929 if (p->sym != q->sym)
1930 {
1931 qlast = q;
1932 q = q->next;
6de9cd9a
DN
1933 }
1934 else
1935 {
66e4ab31 1936 /* Duplicate interface. */
6de9cd9a 1937 qlast->next = q->next;
cede9502 1938 free (q);
6de9cd9a
DN
1939 q = qlast->next;
1940 }
1941 }
1942 }
1943
f3e1097b 1944 return false;
6de9cd9a
DN
1945}
1946
1947
1948/* Check lists of interfaces to make sure that no two interfaces are
66e4ab31 1949 ambiguous. Duplicate interfaces (from the same symbol) are OK here. */
6de9cd9a 1950
f3e1097b 1951static bool
b251af97 1952check_interface1 (gfc_interface *p, gfc_interface *q0,
993ef28f 1953 int generic_flag, const char *interface_name,
26f2ca2b 1954 bool referenced)
6de9cd9a 1955{
b251af97 1956 gfc_interface *q;
6de9cd9a 1957 for (; p; p = p->next)
991f3b12 1958 for (q = q0; q; q = q->next)
6de9cd9a
DN
1959 {
1960 if (p->sym == q->sym)
66e4ab31 1961 continue; /* Duplicates OK here. */
6de9cd9a 1962
312ae8f4 1963 if (p->sym->name == q->sym->name && p->sym->module == q->sym->module)
6de9cd9a
DN
1964 continue;
1965
f6288c24
FR
1966 if (!gfc_fl_struct (p->sym->attr.flavor)
1967 && !gfc_fl_struct (q->sym->attr.flavor)
c3f34952 1968 && gfc_compare_interfaces (p->sym, q->sym, q->sym->name,
6f3ab30d 1969 generic_flag, 0, NULL, 0, NULL, NULL))
6de9cd9a 1970 {
993ef28f 1971 if (referenced)
bd845c14
SK
1972 gfc_error ("Ambiguous interfaces in %s for %qs at %L "
1973 "and %qs at %L", interface_name,
1974 q->sym->name, &q->sym->declared_at,
1975 p->sym->name, &p->sym->declared_at);
ae7c61de 1976 else if (!p->sym->attr.use_assoc && q->sym->attr.use_assoc)
bd845c14
SK
1977 gfc_warning (0, "Ambiguous interfaces in %s for %qs at %L "
1978 "and %qs at %L", interface_name,
1979 q->sym->name, &q->sym->declared_at,
1980 p->sym->name, &p->sym->declared_at);
ae7c61de 1981 else
db30e21c 1982 gfc_warning (0, "Although not referenced, %qs has ambiguous "
ae7c61de 1983 "interfaces at %L", interface_name, &p->where);
f3e1097b 1984 return true;
6de9cd9a
DN
1985 }
1986 }
f3e1097b 1987 return false;
6de9cd9a
DN
1988}
1989
1990
1991/* Check the generic and operator interfaces of symbols to make sure
1992 that none of the interfaces conflict. The check has to be done
1993 after all of the symbols are actually loaded. */
1994
1995static void
b251af97 1996check_sym_interfaces (gfc_symbol *sym)
6de9cd9a 1997{
62c0c0ea
HA
1998 /* Provide sufficient space to hold "generic interface 'symbol.symbol'". */
1999 char interface_name[2*GFC_MAX_SYMBOL_LEN+2 + sizeof("generic interface ''")];
71f77fd7 2000 gfc_interface *p;
6de9cd9a
DN
2001
2002 if (sym->ns != gfc_current_ns)
2003 return;
2004
2005 if (sym->generic != NULL)
2006 {
62c0c0ea
HA
2007 size_t len = strlen (sym->name) + sizeof("generic interface ''");
2008 gcc_assert (len < sizeof (interface_name));
6de9cd9a
DN
2009 sprintf (interface_name, "generic interface '%s'", sym->name);
2010 if (check_interface0 (sym->generic, interface_name))
2011 return;
2012
71f77fd7
PT
2013 for (p = sym->generic; p; p = p->next)
2014 {
abf86978 2015 if (p->sym->attr.mod_proc
4668d6f9 2016 && !p->sym->attr.module_procedure
abf86978
TB
2017 && (p->sym->attr.if_source != IFSRC_DECL
2018 || p->sym->attr.procedure))
71f77fd7 2019 {
c4100eae 2020 gfc_error ("%qs at %L is not a module procedure",
e9f63ace 2021 p->sym->name, &p->where);
71f77fd7
PT
2022 return;
2023 }
2024 }
2025
4c256e34 2026 /* Originally, this test was applied to host interfaces too;
993ef28f
PT
2027 this is incorrect since host associated symbols, from any
2028 source, cannot be ambiguous with local symbols. */
ae7c61de
JW
2029 check_interface1 (sym->generic, sym->generic, 1, interface_name,
2030 sym->attr.referenced || !sym->attr.use_assoc);
6de9cd9a
DN
2031 }
2032}
2033
2034
2035static void
b251af97 2036check_uop_interfaces (gfc_user_op *uop)
6de9cd9a 2037{
439d2350 2038 char interface_name[GFC_MAX_SYMBOL_LEN + sizeof("operator interface ''")];
6de9cd9a
DN
2039 gfc_user_op *uop2;
2040 gfc_namespace *ns;
2041
2042 sprintf (interface_name, "operator interface '%s'", uop->name);
a1ee985f 2043 if (check_interface0 (uop->op, interface_name))
6de9cd9a
DN
2044 return;
2045
2046 for (ns = gfc_current_ns; ns; ns = ns->parent)
2047 {
2048 uop2 = gfc_find_uop (uop->name, ns);
2049 if (uop2 == NULL)
2050 continue;
2051
a1ee985f 2052 check_interface1 (uop->op, uop2->op, 0,
26f2ca2b 2053 interface_name, true);
6de9cd9a
DN
2054 }
2055}
2056
fb03a37e
TK
2057/* Given an intrinsic op, return an equivalent op if one exists,
2058 or INTRINSIC_NONE otherwise. */
2059
2060gfc_intrinsic_op
2061gfc_equivalent_op (gfc_intrinsic_op op)
2062{
2063 switch(op)
2064 {
2065 case INTRINSIC_EQ:
2066 return INTRINSIC_EQ_OS;
2067
2068 case INTRINSIC_EQ_OS:
2069 return INTRINSIC_EQ;
2070
2071 case INTRINSIC_NE:
2072 return INTRINSIC_NE_OS;
2073
2074 case INTRINSIC_NE_OS:
2075 return INTRINSIC_NE;
2076
2077 case INTRINSIC_GT:
2078 return INTRINSIC_GT_OS;
2079
2080 case INTRINSIC_GT_OS:
2081 return INTRINSIC_GT;
2082
2083 case INTRINSIC_GE:
2084 return INTRINSIC_GE_OS;
2085
2086 case INTRINSIC_GE_OS:
2087 return INTRINSIC_GE;
2088
2089 case INTRINSIC_LT:
2090 return INTRINSIC_LT_OS;
2091
2092 case INTRINSIC_LT_OS:
2093 return INTRINSIC_LT;
2094
2095 case INTRINSIC_LE:
2096 return INTRINSIC_LE_OS;
2097
2098 case INTRINSIC_LE_OS:
2099 return INTRINSIC_LE;
2100
2101 default:
2102 return INTRINSIC_NONE;
2103 }
2104}
6de9cd9a
DN
2105
2106/* For the namespace, check generic, user operator and intrinsic
2107 operator interfaces for consistency and to remove duplicate
2108 interfaces. We traverse the whole namespace, counting on the fact
2109 that most symbols will not have generic or operator interfaces. */
2110
2111void
b251af97 2112gfc_check_interfaces (gfc_namespace *ns)
6de9cd9a
DN
2113{
2114 gfc_namespace *old_ns, *ns2;
439d2350 2115 char interface_name[GFC_MAX_SYMBOL_LEN + sizeof("intrinsic '' operator")];
09639a83 2116 int i;
6de9cd9a
DN
2117
2118 old_ns = gfc_current_ns;
2119 gfc_current_ns = ns;
2120
2121 gfc_traverse_ns (ns, check_sym_interfaces);
2122
2123 gfc_traverse_user_op (ns, check_uop_interfaces);
2124
2125 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
2126 {
2127 if (i == INTRINSIC_USER)
2128 continue;
2129
2130 if (i == INTRINSIC_ASSIGN)
2131 strcpy (interface_name, "intrinsic assignment operator");
2132 else
2133 sprintf (interface_name, "intrinsic '%s' operator",
09639a83 2134 gfc_op2string ((gfc_intrinsic_op) i));
6de9cd9a 2135
a1ee985f 2136 if (check_interface0 (ns->op[i], interface_name))
6de9cd9a
DN
2137 continue;
2138
94747289
DK
2139 if (ns->op[i])
2140 gfc_check_operator_interface (ns->op[i]->sym, (gfc_intrinsic_op) i,
2141 ns->op[i]->where);
6de9cd9a 2142
3bed9dd0
DF
2143 for (ns2 = ns; ns2; ns2 = ns2->parent)
2144 {
fb03a37e 2145 gfc_intrinsic_op other_op;
8b704316 2146
a1ee985f 2147 if (check_interface1 (ns->op[i], ns2->op[i], 0,
3bed9dd0
DF
2148 interface_name, true))
2149 goto done;
2150
fb03a37e
TK
2151 /* i should be gfc_intrinsic_op, but has to be int with this cast
2152 here for stupid C++ compatibility rules. */
2153 other_op = gfc_equivalent_op ((gfc_intrinsic_op) i);
2154 if (other_op != INTRINSIC_NONE
2155 && check_interface1 (ns->op[i], ns2->op[other_op],
2156 0, interface_name, true))
2157 goto done;
3bed9dd0 2158 }
6de9cd9a
DN
2159 }
2160
3bed9dd0 2161done:
6de9cd9a
DN
2162 gfc_current_ns = old_ns;
2163}
2164
2165
aa08038d
EE
2166/* Given a symbol of a formal argument list and an expression, if the
2167 formal argument is allocatable, check that the actual argument is
f3e1097b 2168 allocatable. Returns true if compatible, zero if not compatible. */
aa08038d 2169
f3e1097b 2170static bool
b251af97 2171compare_allocatable (gfc_symbol *formal, gfc_expr *actual)
aa08038d 2172{
5ac13b8e
JW
2173 if (formal->attr.allocatable
2174 || (formal->ts.type == BT_CLASS && CLASS_DATA (formal)->attr.allocatable))
aa08038d 2175 {
fec5ce24
JW
2176 symbol_attribute attr = gfc_expr_attr (actual);
2177 if (actual->ts.type == BT_CLASS && !attr.class_ok)
f3e1097b 2178 return true;
fec5ce24 2179 else if (!attr.allocatable)
f3e1097b 2180 return false;
aa08038d
EE
2181 }
2182
f3e1097b 2183 return true;
aa08038d
EE
2184}
2185
2186
6de9cd9a
DN
2187/* Given a symbol of a formal argument list and an expression, if the
2188 formal argument is a pointer, see if the actual argument is a
2189 pointer. Returns nonzero if compatible, zero if not compatible. */
2190
2191static int
b251af97 2192compare_pointer (gfc_symbol *formal, gfc_expr *actual)
6de9cd9a
DN
2193{
2194 symbol_attribute attr;
2195
f18075ff
TB
2196 if (formal->attr.pointer
2197 || (formal->ts.type == BT_CLASS && CLASS_DATA (formal)
2198 && CLASS_DATA (formal)->attr.class_pointer))
6de9cd9a
DN
2199 {
2200 attr = gfc_expr_attr (actual);
7d54ef80
TB
2201
2202 /* Fortran 2008 allows non-pointer actual arguments. */
2203 if (!attr.pointer && attr.target && formal->attr.intent == INTENT_IN)
2204 return 2;
2205
6de9cd9a
DN
2206 if (!attr.pointer)
2207 return 0;
2208 }
2209
2210 return 1;
2211}
2212
2213
a516520c
PT
2214/* Emit clear error messages for rank mismatch. */
2215
2216static void
2217argument_rank_mismatch (const char *name, locus *where,
e0b9e5f9 2218 int rank1, int rank2, locus *where_formal)
a516520c 2219{
c62c6622
TB
2220
2221 /* TS 29113, C407b. */
e0b9e5f9
TK
2222 if (where_formal == NULL)
2223 {
2224 if (rank2 == -1)
2225 gfc_error ("The assumed-rank array at %L requires that the dummy "
2226 "argument %qs has assumed-rank", where, name);
2227 else if (rank1 == 0)
2228 gfc_error_opt (0, "Rank mismatch in argument %qs "
2229 "at %L (scalar and rank-%d)", name, where, rank2);
2230 else if (rank2 == 0)
2231 gfc_error_opt (0, "Rank mismatch in argument %qs "
2232 "at %L (rank-%d and scalar)", name, where, rank1);
2233 else
2234 gfc_error_opt (0, "Rank mismatch in argument %qs "
2235 "at %L (rank-%d and rank-%d)", name, where, rank1,
2236 rank2);
2237 }
a516520c 2238 else
e0b9e5f9 2239 {
8e277106
SL
2240 if (rank2 == -1)
2241 /* This is an assumed rank-actual passed to a function without
2242 an explicit interface, which is already diagnosed in
2243 gfc_procedure_use. */
2244 return;
e0b9e5f9
TK
2245 if (rank1 == 0)
2246 gfc_error_opt (0, "Rank mismatch between actual argument at %L "
2247 "and actual argument at %L (scalar and rank-%d)",
2248 where, where_formal, rank2);
2249 else if (rank2 == 0)
2250 gfc_error_opt (0, "Rank mismatch between actual argument at %L "
2251 "and actual argument at %L (rank-%d and scalar)",
2252 where, where_formal, rank1);
2253 else
2254 gfc_error_opt (0, "Rank mismatch between actual argument at %L "
92e8508e 2255 "and actual argument at %L (rank-%d and rank-%d)", where,
e0b9e5f9
TK
2256 where_formal, rank1, rank2);
2257 }
a516520c
PT
2258}
2259
2260
4a4fc7fe
TK
2261/* Under certain conditions, a scalar actual argument can be passed
2262 to an array dummy argument - see F2018, 15.5.2.4, paragraph 14.
2263 This function returns true for these conditions so that an error
2264 or warning for this can be suppressed later. Always return false
2265 for expressions with rank > 0. */
2266
2267bool
2268maybe_dummy_array_arg (gfc_expr *e)
2269{
2270 gfc_symbol *s;
2271 gfc_ref *ref;
2272 bool array_pointer = false;
2273 bool assumed_shape = false;
2274 bool scalar_ref = true;
2275
2276 if (e->rank > 0)
2277 return false;
2278
2279 if (e->ts.type == BT_CHARACTER && e->ts.kind == 1)
2280 return true;
2281
2282 /* If this comes from a constructor, it has been an array element
2283 originally. */
2284
2285 if (e->expr_type == EXPR_CONSTANT)
2286 return e->from_constructor;
2287
2288 if (e->expr_type != EXPR_VARIABLE)
2289 return false;
2290
2291 s = e->symtree->n.sym;
2292
2293 if (s->attr.dimension)
2294 {
2295 scalar_ref = false;
2296 array_pointer = s->attr.pointer;
2297 }
2298
2299 if (s->as && s->as->type == AS_ASSUMED_SHAPE)
2300 assumed_shape = true;
2301
2302 for (ref=e->ref; ref; ref=ref->next)
2303 {
2304 if (ref->type == REF_COMPONENT)
2305 {
2306 symbol_attribute *attr;
2307 attr = &ref->u.c.component->attr;
2308 if (attr->dimension)
2309 {
2310 array_pointer = attr->pointer;
2311 assumed_shape = false;
2312 scalar_ref = false;
2313 }
2314 else
2315 scalar_ref = true;
2316 }
2317 }
2318
2319 return !(scalar_ref || array_pointer || assumed_shape);
2320}
2321
6de9cd9a 2322/* Given a symbol of a formal argument list and an expression, see if
f3e1097b
JW
2323 the two are compatible as arguments. Returns true if
2324 compatible, false if not compatible. */
6de9cd9a 2325
f3e1097b 2326static bool
b251af97 2327compare_parameter (gfc_symbol *formal, gfc_expr *actual,
5ad6345e 2328 int ranks_must_agree, int is_elemental, locus *where)
6de9cd9a
DN
2329{
2330 gfc_ref *ref;
975b975b 2331 bool rank_check, is_pointer;
5c0ba546
JW
2332 char err[200];
2333 gfc_component *ppc;
fc27115d 2334 bool codimension = false;
6de9cd9a 2335
a8b3b0b6
CR
2336 /* If the formal arg has type BT_VOID, it's to one of the iso_c_binding
2337 procs c_f_pointer or c_f_procpointer, and we need to accept most
2338 pointers the user could give us. This should allow that. */
2339 if (formal->ts.type == BT_VOID)
f3e1097b 2340 return true;
a8b3b0b6
CR
2341
2342 if (formal->ts.type == BT_DERIVED
bc21d315 2343 && formal->ts.u.derived && formal->ts.u.derived->ts.is_iso_c
a8b3b0b6 2344 && actual->ts.type == BT_DERIVED
bc21d315 2345 && actual->ts.u.derived && actual->ts.u.derived->ts.is_iso_c)
f3e1097b 2346 return true;
a8b3b0b6 2347
7d58b9e7 2348 if (formal->ts.type == BT_CLASS && actual->ts.type == BT_DERIVED)
e10f52d0
JW
2349 /* Make sure the vtab symbol is present when
2350 the module variables are generated. */
7d58b9e7 2351 gfc_find_derived_vtab (actual->ts.u.derived);
e10f52d0 2352
6de9cd9a
DN
2353 if (actual->ts.type == BT_PROCEDURE)
2354 {
9b63f282 2355 gfc_symbol *act_sym = actual->symtree->n.sym;
6de9cd9a 2356
8ad15a0a
JW
2357 if (formal->attr.flavor != FL_PROCEDURE)
2358 {
2359 if (where)
2360 gfc_error ("Invalid procedure argument at %L", &actual->where);
f3e1097b 2361 return false;
8ad15a0a 2362 }
6de9cd9a 2363
889dc035 2364 if (!gfc_compare_interfaces (formal, act_sym, act_sym->name, 0, 1, err,
6f3ab30d 2365 sizeof(err), NULL, NULL))
8ad15a0a
JW
2366 {
2367 if (where)
e0b9e5f9 2368 gfc_error_opt (0, "Interface mismatch in dummy procedure %qs at %L:"
2700d0e3 2369 " %s", formal->name, &actual->where, err);
f3e1097b 2370 return false;
8ad15a0a 2371 }
5ad6345e 2372
9b63f282 2373 if (formal->attr.function && !act_sym->attr.function)
03bd096b
JW
2374 {
2375 gfc_add_function (&act_sym->attr, act_sym->name,
2376 &act_sym->declared_at);
2377 if (act_sym->ts.type == BT_UNKNOWN
524af0d6 2378 && !gfc_set_default_type (act_sym, 1, act_sym->ns))
f3e1097b 2379 return false;
03bd096b
JW
2380 }
2381 else if (formal->attr.subroutine && !act_sym->attr.subroutine)
9b63f282
JW
2382 gfc_add_subroutine (&act_sym->attr, act_sym->name,
2383 &act_sym->declared_at);
2384
f3e1097b 2385 return true;
6de9cd9a
DN
2386 }
2387
5c0ba546 2388 ppc = gfc_get_proc_ptr_comp (actual);
228eb42a 2389 if (ppc && ppc->ts.interface)
5c0ba546
JW
2390 {
2391 if (!gfc_compare_interfaces (formal, ppc->ts.interface, ppc->name, 0, 1,
2392 err, sizeof(err), NULL, NULL))
2393 {
2394 if (where)
e0b9e5f9 2395 gfc_error_opt (0, "Interface mismatch in dummy procedure %qs at %L:"
2700d0e3 2396 " %s", formal->name, &actual->where, err);
f3e1097b 2397 return false;
5c0ba546
JW
2398 }
2399 }
2400
fe4e525c
TB
2401 /* F2008, C1241. */
2402 if (formal->attr.pointer && formal->attr.contiguous
460263d0 2403 && !gfc_is_simply_contiguous (actual, true, false))
fe4e525c
TB
2404 {
2405 if (where)
c4100eae 2406 gfc_error ("Actual argument to contiguous pointer dummy %qs at %L "
62732c30 2407 "must be simply contiguous", formal->name, &actual->where);
f3e1097b 2408 return false;
fe4e525c
TB
2409 }
2410
fec5ce24
JW
2411 symbol_attribute actual_attr = gfc_expr_attr (actual);
2412 if (actual->ts.type == BT_CLASS && !actual_attr.class_ok)
f3e1097b 2413 return true;
fec5ce24 2414
90aeadcb 2415 if ((actual->expr_type != EXPR_NULL || actual->ts.type != BT_UNKNOWN)
df161b69 2416 && actual->ts.type != BT_HOLLERITH
45a69325 2417 && formal->ts.type != BT_ASSUMED
e7ac6a7c 2418 && !(formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
c49ea23d
PT
2419 && !gfc_compare_types (&formal->ts, &actual->ts)
2420 && !(formal->ts.type == BT_DERIVED && actual->ts.type == BT_CLASS
8b704316 2421 && gfc_compare_derived_types (formal->ts.u.derived,
c49ea23d 2422 CLASS_DATA (actual)->ts.u.derived)))
5ad6345e 2423 {
d68e117b 2424 if (where)
e0b9e5f9
TK
2425 {
2426 if (formal->attr.artificial)
2427 {
2428 if (!flag_allow_argument_mismatch || !formal->error)
2429 gfc_error_opt (0, "Type mismatch between actual argument at %L "
2430 "and actual argument at %L (%s/%s).",
2431 &actual->where,
2432 &formal->declared_at,
f61e54e5
ME
2433 gfc_typename (actual),
2434 gfc_dummy_typename (&formal->ts));
e0b9e5f9
TK
2435
2436 formal->error = 1;
2437 }
2438 else
2439 gfc_error_opt (0, "Type mismatch in argument %qs at %L; passed %s "
f61e54e5
ME
2440 "to %s", formal->name, where, gfc_typename (actual),
2441 gfc_dummy_typename (&formal->ts));
e0b9e5f9 2442 }
f3e1097b 2443 return false;
5ad6345e 2444 }
f18075ff 2445
3d54e576
TB
2446 if (actual->ts.type == BT_ASSUMED && formal->ts.type != BT_ASSUMED)
2447 {
2448 if (where)
2449 gfc_error ("Assumed-type actual argument at %L requires that dummy "
c4100eae 2450 "argument %qs is of assumed type", &actual->where,
3d54e576 2451 formal->name);
f3e1097b 2452 return false;
3d54e576
TB
2453 }
2454
2364250e
SL
2455 /* TS29113 C407c; F2018 C711. */
2456 if (actual->ts.type == BT_ASSUMED
2457 && symbol_rank (formal) == -1
2458 && actual->rank != -1
2459 && !(actual->symtree->n.sym->as
2460 && actual->symtree->n.sym->as->type == AS_ASSUMED_SHAPE))
2461 {
2462 if (where)
2463 gfc_error ("Assumed-type actual argument at %L corresponding to "
2464 "assumed-rank dummy argument %qs must be "
2465 "assumed-shape or assumed-rank",
2466 &actual->where, formal->name);
2467 return false;
2468 }
2469
f18075ff 2470 /* F2008, 12.5.2.5; IR F08/0073. */
67b1d004
JW
2471 if (formal->ts.type == BT_CLASS && formal->attr.class_ok
2472 && actual->expr_type != EXPR_NULL
f18075ff 2473 && ((CLASS_DATA (formal)->attr.class_pointer
86eb9e2f 2474 && formal->attr.intent != INTENT_IN)
5ac13b8e
JW
2475 || CLASS_DATA (formal)->attr.allocatable))
2476 {
2477 if (actual->ts.type != BT_CLASS)
2478 {
2479 if (where)
c4100eae 2480 gfc_error ("Actual argument to %qs at %L must be polymorphic",
5ac13b8e 2481 formal->name, &actual->where);
f3e1097b 2482 return false;
5ac13b8e 2483 }
67b1d004 2484
a8267f8d
TB
2485 if ((!UNLIMITED_POLY (formal) || !UNLIMITED_POLY(actual))
2486 && !gfc_compare_derived_types (CLASS_DATA (actual)->ts.u.derived,
2487 CLASS_DATA (formal)->ts.u.derived))
5ac13b8e
JW
2488 {
2489 if (where)
c4100eae 2490 gfc_error ("Actual argument to %qs at %L must have the same "
5ac13b8e 2491 "declared type", formal->name, &actual->where);
f3e1097b 2492 return false;
5ac13b8e
JW
2493 }
2494 }
6de9cd9a 2495
8b704316
PT
2496 /* F08: 12.5.2.5 Allocatable and pointer dummy variables. However, this
2497 is necessary also for F03, so retain error for both.
2498 NOTE: Other type/kind errors pre-empt this error. Since they are F03
2499 compatible, no attempt has been made to channel to this one. */
2500 if (UNLIMITED_POLY (formal) && !UNLIMITED_POLY (actual)
2501 && (CLASS_DATA (formal)->attr.allocatable
2502 ||CLASS_DATA (formal)->attr.class_pointer))
2503 {
2504 if (where)
c4100eae 2505 gfc_error ("Actual argument to %qs at %L must be unlimited "
8b704316
PT
2506 "polymorphic since the formal argument is a "
2507 "pointer or allocatable unlimited polymorphic "
2508 "entity [F2008: 12.5.2.5]", formal->name,
2509 &actual->where);
f3e1097b 2510 return false;
8b704316
PT
2511 }
2512
fc27115d
PT
2513 if (formal->ts.type == BT_CLASS && formal->attr.class_ok)
2514 codimension = CLASS_DATA (formal)->attr.codimension;
2515 else
2516 codimension = formal->attr.codimension;
2517
2518 if (codimension && !gfc_is_coarray (actual))
d3a9eea2 2519 {
394d3a2e 2520 if (where)
c4100eae 2521 gfc_error ("Actual argument to %qs at %L must be a coarray",
d3a9eea2 2522 formal->name, &actual->where);
f3e1097b 2523 return false;
394d3a2e 2524 }
d3a9eea2 2525
fc27115d 2526 if (codimension && formal->attr.allocatable)
394d3a2e
TB
2527 {
2528 gfc_ref *last = NULL;
a3935ffc 2529
d3a9eea2 2530 for (ref = actual->ref; ref; ref = ref->next)
394d3a2e
TB
2531 if (ref->type == REF_COMPONENT)
2532 last = ref;
d3a9eea2 2533
d3a9eea2 2534 /* F2008, 12.5.2.6. */
394d3a2e
TB
2535 if ((last && last->u.c.component->as->corank != formal->as->corank)
2536 || (!last
2537 && actual->symtree->n.sym->as->corank != formal->as->corank))
d3a9eea2
TB
2538 {
2539 if (where)
c4100eae 2540 gfc_error ("Corank mismatch in argument %qs at %L (%d and %d)",
d3a9eea2
TB
2541 formal->name, &actual->where, formal->as->corank,
2542 last ? last->u.c.component->as->corank
2543 : actual->symtree->n.sym->as->corank);
f3e1097b 2544 return false;
d3a9eea2 2545 }
394d3a2e 2546 }
fe4e525c 2547
fc27115d 2548 if (codimension)
394d3a2e 2549 {
460263d0 2550 /* F2008, 12.5.2.8 + Corrig 2 (IR F08/0048). */
8179b067 2551 /* F2018, 12.5.2.8. */
fe4e525c
TB
2552 if (formal->attr.dimension
2553 && (formal->attr.contiguous || formal->as->type != AS_ASSUMED_SHAPE)
fec5ce24 2554 && actual_attr.dimension
460263d0 2555 && !gfc_is_simply_contiguous (actual, true, true))
fe4e525c
TB
2556 {
2557 if (where)
c4100eae 2558 gfc_error ("Actual argument to %qs at %L must be simply "
460263d0
TB
2559 "contiguous or an element of such an array",
2560 formal->name, &actual->where);
f3e1097b 2561 return false;
fe4e525c 2562 }
fea54935
TB
2563
2564 /* F2008, C1303 and C1304. */
2565 if (formal->attr.intent != INTENT_INOUT
2566 && (((formal->ts.type == BT_DERIVED || formal->ts.type == BT_CLASS)
2567 && formal->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
2568 && formal->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
2569 || formal->attr.lock_comp))
2570
2571 {
2572 if (where)
c4100eae 2573 gfc_error ("Actual argument to non-INTENT(INOUT) dummy %qs at %L, "
fea54935
TB
2574 "which is LOCK_TYPE or has a LOCK_TYPE component",
2575 formal->name, &actual->where);
f3e1097b 2576 return false;
fea54935 2577 }
5df445a2
TB
2578
2579 /* TS18508, C702/C703. */
2580 if (formal->attr.intent != INTENT_INOUT
2581 && (((formal->ts.type == BT_DERIVED || formal->ts.type == BT_CLASS)
2582 && formal->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
2583 && formal->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
2584 || formal->attr.event_comp))
2585
2586 {
2587 if (where)
2588 gfc_error ("Actual argument to non-INTENT(INOUT) dummy %qs at %L, "
2589 "which is EVENT_TYPE or has a EVENT_TYPE component",
2590 formal->name, &actual->where);
f3e1097b 2591 return false;
5df445a2 2592 }
394d3a2e 2593 }
fe4e525c
TB
2594
2595 /* F2008, C1239/C1240. */
2596 if (actual->expr_type == EXPR_VARIABLE
2597 && (actual->symtree->n.sym->attr.asynchronous
2598 || actual->symtree->n.sym->attr.volatile_)
2599 && (formal->attr.asynchronous || formal->attr.volatile_)
460263d0
TB
2600 && actual->rank && formal->as
2601 && !gfc_is_simply_contiguous (actual, true, false)
f188272d
TB
2602 && ((formal->as->type != AS_ASSUMED_SHAPE
2603 && formal->as->type != AS_ASSUMED_RANK && !formal->attr.pointer)
fe4e525c
TB
2604 || formal->attr.contiguous))
2605 {
2606 if (where)
c4100eae 2607 gfc_error ("Dummy argument %qs has to be a pointer, assumed-shape or "
f188272d
TB
2608 "assumed-rank array without CONTIGUOUS attribute - as actual"
2609 " argument at %L is not simply contiguous and both are "
2610 "ASYNCHRONOUS or VOLATILE", formal->name, &actual->where);
f3e1097b 2611 return false;
d3a9eea2
TB
2612 }
2613
fc27115d 2614 if (formal->attr.allocatable && !codimension
fec5ce24 2615 && actual_attr.codimension)
427180d2
TB
2616 {
2617 if (formal->attr.intent == INTENT_OUT)
2618 {
2619 if (where)
2620 gfc_error ("Passing coarray at %L to allocatable, noncoarray, "
c4100eae 2621 "INTENT(OUT) dummy argument %qs", &actual->where,
427180d2 2622 formal->name);
f3e1097b 2623 return false;
427180d2 2624 }
73e42eef 2625 else if (warn_surprising && where && formal->attr.intent != INTENT_IN)
48749dbc
MLI
2626 gfc_warning (OPT_Wsurprising,
2627 "Passing coarray at %L to allocatable, noncoarray dummy "
2628 "argument %qs, which is invalid if the allocation status"
427180d2
TB
2629 " is modified", &actual->where, formal->name);
2630 }
2631
c62c6622
TB
2632 /* If the rank is the same or the formal argument has assumed-rank. */
2633 if (symbol_rank (formal) == actual->rank || symbol_rank (formal) == -1)
f3e1097b 2634 return true;
6de9cd9a 2635
5ad6345e
TB
2636 rank_check = where != NULL && !is_elemental && formal->as
2637 && (formal->as->type == AS_ASSUMED_SHAPE
d8a8dab3
TB
2638 || formal->as->type == AS_DEFERRED)
2639 && actual->expr_type != EXPR_NULL;
6de9cd9a 2640
e7ac6a7c
TB
2641 /* Skip rank checks for NO_ARG_CHECK. */
2642 if (formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
f3e1097b 2643 return true;
e7ac6a7c 2644
d3a9eea2 2645 /* Scalar & coindexed, see: F2008, Section 12.5.2.4. */
d8a8dab3
TB
2646 if (rank_check || ranks_must_agree
2647 || (formal->attr.pointer && actual->expr_type != EXPR_NULL)
5ad6345e 2648 || (actual->rank != 0 && !(is_elemental || formal->attr.dimension))
c49ea23d
PT
2649 || (actual->rank == 0
2650 && ((formal->ts.type == BT_CLASS
2651 && CLASS_DATA (formal)->as->type == AS_ASSUMED_SHAPE)
2652 || (formal->ts.type != BT_CLASS
2653 && formal->as->type == AS_ASSUMED_SHAPE))
08857b61 2654 && actual->expr_type != EXPR_NULL)
d3a9eea2 2655 || (actual->rank == 0 && formal->attr.dimension
7a40f2e7
SL
2656 && gfc_is_coindexed (actual))
2657 /* Assumed-rank actual argument; F2018 C838. */
2658 || actual->rank == -1)
5ad6345e 2659 {
a5baf71b 2660 if (where
4a4fc7fe
TK
2661 && (!formal->attr.artificial || (!formal->maybe_array
2662 && !maybe_dummy_array_arg (actual))))
e0b9e5f9
TK
2663 {
2664 locus *where_formal;
2665 if (formal->attr.artificial)
2666 where_formal = &formal->declared_at;
2667 else
2668 where_formal = NULL;
2669
2670 argument_rank_mismatch (formal->name, &actual->where,
2671 symbol_rank (formal), actual->rank,
2672 where_formal);
2673 }
f3e1097b 2674 return false;
5ad6345e
TB
2675 }
2676 else if (actual->rank != 0 && (is_elemental || formal->attr.dimension))
f3e1097b 2677 return true;
5ad6345e
TB
2678
2679 /* At this point, we are considering a scalar passed to an array. This
975b975b 2680 is valid (cf. F95 12.4.1.1, F2003 12.4.1.2, and F2008 12.5.2.4),
5ad6345e 2681 - if the actual argument is (a substring of) an element of a
975b975b
TB
2682 non-assumed-shape/non-pointer/non-polymorphic array; or
2683 - (F2003) if the actual argument is of type character of default/c_char
2684 kind. */
2685
2686 is_pointer = actual->expr_type == EXPR_VARIABLE
2687 ? actual->symtree->n.sym->attr.pointer : false;
6de9cd9a
DN
2688
2689 for (ref = actual->ref; ref; ref = ref->next)
975b975b
TB
2690 {
2691 if (ref->type == REF_COMPONENT)
2692 is_pointer = ref->u.c.component->attr.pointer;
2693 else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT
2694 && ref->u.ar.dimen > 0
8b704316 2695 && (!ref->next
975b975b
TB
2696 || (ref->next->type == REF_SUBSTRING && !ref->next->next)))
2697 break;
2698 }
2699
2700 if (actual->ts.type == BT_CLASS && actual->expr_type != EXPR_NULL)
2701 {
2702 if (where)
c4100eae 2703 gfc_error ("Polymorphic scalar passed to array dummy argument %qs "
975b975b 2704 "at %L", formal->name, &actual->where);
f3e1097b 2705 return false;
975b975b
TB
2706 }
2707
2708 if (actual->expr_type != EXPR_NULL && ref && actual->ts.type != BT_CHARACTER
2709 && (is_pointer || ref->u.ar.as->type == AS_ASSUMED_SHAPE))
2710 {
2711 if (where)
4a4fc7fe
TK
2712 {
2713 if (formal->attr.artificial)
2714 gfc_error ("Element of assumed-shape or pointer array "
7260547d
TK
2715 "as actual argument at %L cannot correspond to "
2716 "actual argument at %L",
4a4fc7fe
TK
2717 &actual->where, &formal->declared_at);
2718 else
2719 gfc_error ("Element of assumed-shape or pointer "
2720 "array passed to array dummy argument %qs at %L",
2721 formal->name, &actual->where);
2722 }
f3e1097b 2723 return false;
975b975b 2724 }
6de9cd9a 2725
975b975b
TB
2726 if (actual->ts.type == BT_CHARACTER && actual->expr_type != EXPR_NULL
2727 && (!ref || is_pointer || ref->u.ar.as->type == AS_ASSUMED_SHAPE))
5ad6345e 2728 {
975b975b
TB
2729 if (formal->ts.kind != 1 && (gfc_option.allow_std & GFC_STD_GNU) == 0)
2730 {
2731 if (where)
2732 gfc_error ("Extension: Scalar non-default-kind, non-C_CHAR-kind "
2733 "CHARACTER actual argument with array dummy argument "
c4100eae 2734 "%qs at %L", formal->name, &actual->where);
f3e1097b 2735 return false;
975b975b
TB
2736 }
2737
5ad6345e
TB
2738 if (where && (gfc_option.allow_std & GFC_STD_F2003) == 0)
2739 {
2740 gfc_error ("Fortran 2003: Scalar CHARACTER actual argument with "
c4100eae 2741 "array dummy argument %qs at %L",
5ad6345e 2742 formal->name, &actual->where);
f3e1097b 2743 return false;
5ad6345e 2744 }
5ad6345e 2745 else
f3e1097b 2746 return ((gfc_option.allow_std & GFC_STD_F2003) != 0);
5ad6345e 2747 }
975b975b
TB
2748
2749 if (ref == NULL && actual->expr_type != EXPR_NULL)
5ad6345e 2750 {
a5baf71b 2751 if (where
4a4fc7fe
TK
2752 && (!formal->attr.artificial || (!formal->maybe_array
2753 && !maybe_dummy_array_arg (actual))))
e0b9e5f9
TK
2754 {
2755 locus *where_formal;
2756 if (formal->attr.artificial)
2757 where_formal = &formal->declared_at;
2758 else
2759 where_formal = NULL;
2760
2761 argument_rank_mismatch (formal->name, &actual->where,
2762 symbol_rank (formal), actual->rank,
2763 where_formal);
2764 }
f3e1097b 2765 return false;
5ad6345e
TB
2766 }
2767
f3e1097b 2768 return true;
6de9cd9a
DN
2769}
2770
2771
2d5b90b2
TB
2772/* Returns the storage size of a symbol (formal argument) or
2773 zero if it cannot be determined. */
2774
2775static unsigned long
2776get_sym_storage_size (gfc_symbol *sym)
2777{
2778 int i;
2779 unsigned long strlen, elements;
2780
2781 if (sym->ts.type == BT_CHARACTER)
2782 {
bc21d315
JW
2783 if (sym->ts.u.cl && sym->ts.u.cl->length
2784 && sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
2785 strlen = mpz_get_ui (sym->ts.u.cl->length->value.integer);
2d5b90b2
TB
2786 else
2787 return 0;
2788 }
2789 else
8b704316 2790 strlen = 1;
2d5b90b2
TB
2791
2792 if (symbol_rank (sym) == 0)
2793 return strlen;
2794
2795 elements = 1;
2796 if (sym->as->type != AS_EXPLICIT)
2797 return 0;
2798 for (i = 0; i < sym->as->rank; i++)
2799 {
efb63364 2800 if (sym->as->upper[i]->expr_type != EXPR_CONSTANT
2d5b90b2
TB
2801 || sym->as->lower[i]->expr_type != EXPR_CONSTANT)
2802 return 0;
2803
c13af44b
SK
2804 elements *= mpz_get_si (sym->as->upper[i]->value.integer)
2805 - mpz_get_si (sym->as->lower[i]->value.integer) + 1L;
2d5b90b2
TB
2806 }
2807
2808 return strlen*elements;
2809}
2810
2811
2812/* Returns the storage size of an expression (actual argument) or
2813 zero if it cannot be determined. For an array element, it returns
1207ac67 2814 the remaining size as the element sequence consists of all storage
2d5b90b2
TB
2815 units of the actual argument up to the end of the array. */
2816
2817static unsigned long
2818get_expr_storage_size (gfc_expr *e)
2819{
2820 int i;
2821 long int strlen, elements;
6da0839a 2822 long int substrlen = 0;
a0710c29 2823 bool is_str_storage = false;
2d5b90b2
TB
2824 gfc_ref *ref;
2825
2826 if (e == NULL)
2827 return 0;
8b704316 2828
2d5b90b2
TB
2829 if (e->ts.type == BT_CHARACTER)
2830 {
bc21d315
JW
2831 if (e->ts.u.cl && e->ts.u.cl->length
2832 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
2833 strlen = mpz_get_si (e->ts.u.cl->length->value.integer);
2d5b90b2 2834 else if (e->expr_type == EXPR_CONSTANT
bc21d315 2835 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
2d5b90b2
TB
2836 strlen = e->value.character.length;
2837 else
2838 return 0;
2839 }
2840 else
2841 strlen = 1; /* Length per element. */
2842
2843 if (e->rank == 0 && !e->ref)
2844 return strlen;
2845
2846 elements = 1;
2847 if (!e->ref)
2848 {
2849 if (!e->shape)
2850 return 0;
2851 for (i = 0; i < e->rank; i++)
2852 elements *= mpz_get_si (e->shape[i]);
2853 return elements*strlen;
2854 }
2855
2856 for (ref = e->ref; ref; ref = ref->next)
2857 {
6da0839a
TB
2858 if (ref->type == REF_SUBSTRING && ref->u.ss.start
2859 && ref->u.ss.start->expr_type == EXPR_CONSTANT)
2860 {
a0710c29
TB
2861 if (is_str_storage)
2862 {
2863 /* The string length is the substring length.
2864 Set now to full string length. */
e323640f 2865 if (!ref->u.ss.length || !ref->u.ss.length->length
a0710c29
TB
2866 || ref->u.ss.length->length->expr_type != EXPR_CONSTANT)
2867 return 0;
2868
2869 strlen = mpz_get_ui (ref->u.ss.length->length->value.integer);
2870 }
2871 substrlen = strlen - mpz_get_ui (ref->u.ss.start->value.integer) + 1;
6da0839a
TB
2872 continue;
2873 }
2874
efb63364 2875 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2d5b90b2
TB
2876 for (i = 0; i < ref->u.ar.dimen; i++)
2877 {
2878 long int start, end, stride;
2879 stride = 1;
37639728 2880
2d5b90b2
TB
2881 if (ref->u.ar.stride[i])
2882 {
2883 if (ref->u.ar.stride[i]->expr_type == EXPR_CONSTANT)
2884 stride = mpz_get_si (ref->u.ar.stride[i]->value.integer);
2885 else
2886 return 0;
2887 }
2888
2889 if (ref->u.ar.start[i])
2890 {
2891 if (ref->u.ar.start[i]->expr_type == EXPR_CONSTANT)
2892 start = mpz_get_si (ref->u.ar.start[i]->value.integer);
2893 else
2894 return 0;
2895 }
37639728
TB
2896 else if (ref->u.ar.as->lower[i]
2897 && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT)
2898 start = mpz_get_si (ref->u.ar.as->lower[i]->value.integer);
2899 else
2900 return 0;
2d5b90b2
TB
2901
2902 if (ref->u.ar.end[i])
2903 {
2904 if (ref->u.ar.end[i]->expr_type == EXPR_CONSTANT)
2905 end = mpz_get_si (ref->u.ar.end[i]->value.integer);
2906 else
2907 return 0;
2908 }
2909 else if (ref->u.ar.as->upper[i]
2910 && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT)
2911 end = mpz_get_si (ref->u.ar.as->upper[i]->value.integer);
2912 else
2913 return 0;
2914
2915 elements *= (end - start)/stride + 1L;
2916 }
c6423ef3 2917 else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_FULL)
2d5b90b2
TB
2918 for (i = 0; i < ref->u.ar.as->rank; i++)
2919 {
2920 if (ref->u.ar.as->lower[i] && ref->u.ar.as->upper[i]
2921 && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT
edcc76d5
SK
2922 && ref->u.ar.as->lower[i]->ts.type == BT_INTEGER
2923 && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT
2924 && ref->u.ar.as->upper[i]->ts.type == BT_INTEGER)
da9ad923
TB
2925 elements *= mpz_get_si (ref->u.ar.as->upper[i]->value.integer)
2926 - mpz_get_si (ref->u.ar.as->lower[i]->value.integer)
2d5b90b2
TB
2927 + 1L;
2928 else
2929 return 0;
2930 }
6da0839a 2931 else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT
a0710c29
TB
2932 && e->expr_type == EXPR_VARIABLE)
2933 {
93302a24 2934 if (ref->u.ar.as->type == AS_ASSUMED_SHAPE
a0710c29
TB
2935 || e->symtree->n.sym->attr.pointer)
2936 {
2937 elements = 1;
2938 continue;
2939 }
2940
2941 /* Determine the number of remaining elements in the element
2942 sequence for array element designators. */
2943 is_str_storage = true;
2944 for (i = ref->u.ar.dimen - 1; i >= 0; i--)
2945 {
2946 if (ref->u.ar.start[i] == NULL
2947 || ref->u.ar.start[i]->expr_type != EXPR_CONSTANT
2948 || ref->u.ar.as->upper[i] == NULL
2949 || ref->u.ar.as->lower[i] == NULL
2950 || ref->u.ar.as->upper[i]->expr_type != EXPR_CONSTANT
2951 || ref->u.ar.as->lower[i]->expr_type != EXPR_CONSTANT)
2952 return 0;
2953
2954 elements
2955 = elements
2956 * (mpz_get_si (ref->u.ar.as->upper[i]->value.integer)
2957 - mpz_get_si (ref->u.ar.as->lower[i]->value.integer)
2958 + 1L)
2959 - (mpz_get_si (ref->u.ar.start[i]->value.integer)
2960 - mpz_get_si (ref->u.ar.as->lower[i]->value.integer));
2961 }
2962 }
3436db75
JW
2963 else if (ref->type == REF_COMPONENT && ref->u.c.component->attr.function
2964 && ref->u.c.component->attr.proc_pointer
2965 && ref->u.c.component->attr.dimension)
2966 {
2967 /* Array-valued procedure-pointer components. */
2968 gfc_array_spec *as = ref->u.c.component->as;
2969 for (i = 0; i < as->rank; i++)
2970 {
2971 if (!as->upper[i] || !as->lower[i]
2972 || as->upper[i]->expr_type != EXPR_CONSTANT
2973 || as->lower[i]->expr_type != EXPR_CONSTANT)
2974 return 0;
2975
2976 elements = elements
2977 * (mpz_get_si (as->upper[i]->value.integer)
2978 - mpz_get_si (as->lower[i]->value.integer) + 1L);
2979 }
2980 }
2d5b90b2
TB
2981 }
2982
6da0839a 2983 if (substrlen)
a0710c29
TB
2984 return (is_str_storage) ? substrlen + (elements-1)*strlen
2985 : elements*strlen;
2986 else
2987 return elements*strlen;
2d5b90b2
TB
2988}
2989
2990
59be8071 2991/* Given an expression, check whether it is an array section
f3e1097b 2992 which has a vector subscript. */
59be8071 2993
f3e1097b 2994bool
03af1e4c 2995gfc_has_vector_subscript (gfc_expr *e)
59be8071
TB
2996{
2997 int i;
2998 gfc_ref *ref;
2999
3000 if (e == NULL || e->rank == 0 || e->expr_type != EXPR_VARIABLE)
f3e1097b 3001 return false;
59be8071
TB
3002
3003 for (ref = e->ref; ref; ref = ref->next)
3004 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
3005 for (i = 0; i < ref->u.ar.dimen; i++)
3006 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
f3e1097b 3007 return true;
59be8071 3008
f3e1097b 3009 return false;
59be8071
TB
3010}
3011
3012
4294c093
JW
3013static bool
3014is_procptr_result (gfc_expr *expr)
3015{
3016 gfc_component *c = gfc_get_proc_ptr_comp (expr);
3017 if (c)
3018 return (c->ts.interface && (c->ts.interface->attr.proc_pointer == 1));
3019 else
3020 return ((expr->symtree->n.sym->result != expr->symtree->n.sym)
3021 && (expr->symtree->n.sym->result->attr.proc_pointer == 1));
3022}
3023
3024
bcc478b9
BRF
3025/* Recursively append candidate argument ARG to CANDIDATES. Store the
3026 number of total candidates in CANDIDATES_LEN. */
3027
3028static void
3029lookup_arg_fuzzy_find_candidates (gfc_formal_arglist *arg,
3030 char **&candidates,
3031 size_t &candidates_len)
3032{
3033 for (gfc_formal_arglist *p = arg; p && p->sym; p = p->next)
3034 vec_push (candidates, candidates_len, p->sym->name);
3035}
3036
3037
3038/* Lookup argument ARG fuzzily, taking names in ARGUMENTS into account. */
3039
3040static const char*
3041lookup_arg_fuzzy (const char *arg, gfc_formal_arglist *arguments)
3042{
3043 char **candidates = NULL;
3044 size_t candidates_len = 0;
3045 lookup_arg_fuzzy_find_candidates (arguments, candidates, candidates_len);
3046 return gfc_closest_fuzzy_match (arg, candidates);
3047}
3048
3049
5888512f
MM
3050static gfc_dummy_arg *
3051get_nonintrinsic_dummy_arg (gfc_formal_arglist *formal)
3052{
3053 gfc_dummy_arg * const dummy_arg = gfc_get_dummy_arg ();
3054
3055 dummy_arg->intrinsicness = GFC_NON_INTRINSIC_DUMMY_ARG;
3056 dummy_arg->u.non_intrinsic = formal;
3057
3058 return dummy_arg;
3059}
3060
3061
6de9cd9a
DN
3062/* Given formal and actual argument lists, see if they are compatible.
3063 If they are compatible, the actual argument list is sorted to
3064 correspond with the formal list, and elements for missing optional
3065 arguments are inserted. If WHERE pointer is nonnull, then we issue
3066 errors when things don't match instead of just returning the status
3067 code. */
3068
e68a35ae
TK
3069bool
3070gfc_compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
3071 int ranks_must_agree, int is_elemental,
3072 bool in_statement_function, locus *where)
6de9cd9a 3073{
fab27f52 3074 gfc_actual_arglist **new_arg, *a, *actual;
6de9cd9a
DN
3075 gfc_formal_arglist *f;
3076 int i, n, na;
2d5b90b2 3077 unsigned long actual_size, formal_size;
c49ea23d 3078 bool full_array = false;
eb401400 3079 gfc_array_ref *actual_arr_ref;
7afb6108
SL
3080 gfc_array_spec *fas, *aas;
3081 bool pointer_dummy, pointer_arg, allocatable_arg;
6de9cd9a 3082
ee11be7f
SL
3083 bool ok = true;
3084
6de9cd9a
DN
3085 actual = *ap;
3086
3087 if (actual == NULL && formal == NULL)
f3e1097b 3088 return true;
6de9cd9a
DN
3089
3090 n = 0;
3091 for (f = formal; f; f = f->next)
3092 n++;
3093
1145e690 3094 new_arg = XALLOCAVEC (gfc_actual_arglist *, n);
6de9cd9a
DN
3095
3096 for (i = 0; i < n; i++)
7b901ac4 3097 new_arg[i] = NULL;
6de9cd9a
DN
3098
3099 na = 0;
3100 f = formal;
3101 i = 0;
3102
3103 for (a = actual; a; a = a->next, f = f->next)
3104 {
3453b6aa
SK
3105 if (a->name != NULL && in_statement_function)
3106 {
3107 gfc_error ("Keyword argument %qs at %L is invalid in "
3108 "a statement function", a->name, &a->expr->where);
3109 return false;
3110 }
3111
7fcafa71
PT
3112 /* Look for keywords but ignore g77 extensions like %VAL. */
3113 if (a->name != NULL && a->name[0] != '%')
6de9cd9a
DN
3114 {
3115 i = 0;
3116 for (f = formal; f; f = f->next, i++)
3117 {
3118 if (f->sym == NULL)
3119 continue;
3120 if (strcmp (f->sym->name, a->name) == 0)
3121 break;
3122 }
3123
3124 if (f == NULL)
3125 {
3126 if (where)
bcc478b9
BRF
3127 {
3128 const char *guessed = lookup_arg_fuzzy (a->name, formal);
3129 if (guessed)
3130 gfc_error ("Keyword argument %qs at %L is not in "
3131 "the procedure; did you mean %qs?",
3132 a->name, &a->expr->where, guessed);
3133 else
3134 gfc_error ("Keyword argument %qs at %L is not in "
3135 "the procedure", a->name, &a->expr->where);
3136 }
f3e1097b 3137 return false;
6de9cd9a
DN
3138 }
3139
7b901ac4 3140 if (new_arg[i] != NULL)
6de9cd9a
DN
3141 {
3142 if (where)
c4100eae 3143 gfc_error ("Keyword argument %qs at %L is already associated "
b251af97
SK
3144 "with another actual argument", a->name,
3145 &a->expr->where);
f3e1097b 3146 return false;
6de9cd9a
DN
3147 }
3148 }
3149
3150 if (f == NULL)
3151 {
3152 if (where)
b251af97
SK
3153 gfc_error ("More actual than formal arguments in procedure "
3154 "call at %L", where);
f3e1097b 3155 return false;
6de9cd9a
DN
3156 }
3157
3158 if (f->sym == NULL && a->expr == NULL)
3159 goto match;
3160
3161 if (f->sym == NULL)
3162 {
866664a3
TK
3163 /* These errors have to be issued, otherwise an ICE can occur.
3164 See PR 78865. */
6de9cd9a 3165 if (where)
866664a3
TK
3166 gfc_error_now ("Missing alternate return specifier in subroutine "
3167 "call at %L", where);
f3e1097b 3168 return false;
6de9cd9a 3169 }
5888512f
MM
3170 else
3171 a->associated_dummy = get_nonintrinsic_dummy_arg (f);
6de9cd9a
DN
3172
3173 if (a->expr == NULL)
3174 {
fb078366
TK
3175 if (f->sym->attr.optional)
3176 continue;
3177 else
3178 {
3179 if (where)
3180 gfc_error_now ("Unexpected alternate return specifier in "
3181 "subroutine call at %L", where);
3182 return false;
3183 }
6de9cd9a 3184 }
08857b61 3185
8b704316
PT
3186 /* Make sure that intrinsic vtables exist for calls to unlimited
3187 polymorphic formal arguments. */
524af0d6 3188 if (UNLIMITED_POLY (f->sym)
8b704316 3189 && a->expr->ts.type != BT_DERIVED
15e5858f
TK
3190 && a->expr->ts.type != BT_CLASS
3191 && a->expr->ts.type != BT_ASSUMED)
7289d1c9 3192 gfc_find_vtab (&a->expr->ts);
8b704316 3193
99091b70
TB
3194 if (a->expr->expr_type == EXPR_NULL
3195 && ((f->sym->ts.type != BT_CLASS && !f->sym->attr.pointer
3196 && (f->sym->attr.allocatable || !f->sym->attr.optional
3197 || (gfc_option.allow_std & GFC_STD_F2008) == 0))
3198 || (f->sym->ts.type == BT_CLASS
3199 && !CLASS_DATA (f->sym)->attr.class_pointer
3200 && (CLASS_DATA (f->sym)->attr.allocatable
3201 || !f->sym->attr.optional
3202 || (gfc_option.allow_std & GFC_STD_F2008) == 0))))
08857b61 3203 {
99091b70
TB
3204 if (where
3205 && (!f->sym->attr.optional
3206 || (f->sym->ts.type != BT_CLASS && f->sym->attr.allocatable)
3207 || (f->sym->ts.type == BT_CLASS
3208 && CLASS_DATA (f->sym)->attr.allocatable)))
c4100eae 3209 gfc_error ("Unexpected NULL() intrinsic at %L to dummy %qs",
08857b61
TB
3210 where, f->sym->name);
3211 else if (where)
3212 gfc_error ("Fortran 2008: Null pointer at %L to non-pointer "
c4100eae 3213 "dummy %qs", where, f->sym->name);
ee11be7f
SL
3214 ok = false;
3215 goto match;
08857b61 3216 }
8b704316 3217
5ad6345e
TB
3218 if (!compare_parameter (f->sym, a->expr, ranks_must_agree,
3219 is_elemental, where))
ee11be7f
SL
3220 {
3221 ok = false;
3222 goto match;
3223 }
6de9cd9a 3224
5098e707 3225 /* TS 29113, 6.3p2; F2018 15.5.2.4. */
45a69325
TB
3226 if (f->sym->ts.type == BT_ASSUMED
3227 && (a->expr->ts.type == BT_DERIVED
3228 || (a->expr->ts.type == BT_CLASS && CLASS_DATA (a->expr))))
3229 {
5098e707
SL
3230 gfc_symbol *derived = (a->expr->ts.type == BT_DERIVED
3231 ? a->expr->ts.u.derived
3232 : CLASS_DATA (a->expr)->ts.u.derived);
3233 gfc_namespace *f2k_derived = derived->f2k_derived;
3234 if (derived->attr.pdt_type
3235 || (f2k_derived
3236 && (f2k_derived->finalizers || f2k_derived->tb_sym_root)))
45a69325 3237 {
5098e707
SL
3238 gfc_error ("Actual argument at %L to assumed-type dummy "
3239 "has type parameters or is of "
45a69325
TB
3240 "derived type with type-bound or FINAL procedures",
3241 &a->expr->where);
ee11be7f
SL
3242 ok = false;
3243 goto match;
45a69325
TB
3244 }
3245 }
3246
a0710c29
TB
3247 /* Special case for character arguments. For allocatable, pointer
3248 and assumed-shape dummies, the string length needs to match
3249 exactly. */
2d5b90b2 3250 if (a->expr->ts.type == BT_CHARACTER
eb401400
AV
3251 && a->expr->ts.u.cl && a->expr->ts.u.cl->length
3252 && a->expr->ts.u.cl->length->expr_type == EXPR_CONSTANT
3253 && f->sym->ts.type == BT_CHARACTER && f->sym->ts.u.cl
3254 && f->sym->ts.u.cl->length
3255 && f->sym->ts.u.cl->length->expr_type == EXPR_CONSTANT
3256 && (f->sym->attr.pointer || f->sym->attr.allocatable
3257 || (f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
3258 && (mpz_cmp (a->expr->ts.u.cl->length->value.integer,
3259 f->sym->ts.u.cl->length->value.integer) != 0))
3260 {
3261 if (where && (f->sym->attr.pointer || f->sym->attr.allocatable))
e0b9e5f9 3262 gfc_warning (0, "Character length mismatch (%ld/%ld) between actual "
eb401400
AV
3263 "argument and pointer or allocatable dummy argument "
3264 "%qs at %L",
3265 mpz_get_si (a->expr->ts.u.cl->length->value.integer),
3266 mpz_get_si (f->sym->ts.u.cl->length->value.integer),
3267 f->sym->name, &a->expr->where);
3268 else if (where)
e0b9e5f9 3269 gfc_warning (0, "Character length mismatch (%ld/%ld) between actual "
eb401400
AV
3270 "argument and assumed-shape dummy argument %qs "
3271 "at %L",
3272 mpz_get_si (a->expr->ts.u.cl->length->value.integer),
3273 mpz_get_si (f->sym->ts.u.cl->length->value.integer),
3274 f->sym->name, &a->expr->where);
ee11be7f
SL
3275 ok = false;
3276 goto match;
eb401400 3277 }
a0324f7b 3278
8d51f26f 3279 if ((f->sym->attr.pointer || f->sym->attr.allocatable)
eb401400
AV
3280 && f->sym->ts.deferred != a->expr->ts.deferred
3281 && a->expr->ts.type == BT_CHARACTER)
8d51f26f
PT
3282 {
3283 if (where)
0c133211 3284 gfc_error ("Actual argument at %L to allocatable or "
c4100eae 3285 "pointer dummy argument %qs must have a deferred "
8d51f26f
PT
3286 "length type parameter if and only if the dummy has one",
3287 &a->expr->where, f->sym->name);
ee11be7f
SL
3288 ok = false;
3289 goto match;
8d51f26f
PT
3290 }
3291
c49ea23d
PT
3292 if (f->sym->ts.type == BT_CLASS)
3293 goto skip_size_check;
3294
37639728
TB
3295 actual_size = get_expr_storage_size (a->expr);
3296 formal_size = get_sym_storage_size (f->sym);
93302a24
JW
3297 if (actual_size != 0 && actual_size < formal_size
3298 && a->expr->ts.type != BT_PROCEDURE
3299 && f->sym->attr.flavor != FL_PROCEDURE)
2d5b90b2
TB
3300 {
3301 if (a->expr->ts.type == BT_CHARACTER && !f->sym->as && where)
a8b79cc9
HA
3302 {
3303 gfc_warning (0, "Character length of actual argument shorter "
3304 "than of dummy argument %qs (%lu/%lu) at %L",
3305 f->sym->name, actual_size, formal_size,
3306 &a->expr->where);
3307 goto skip_size_check;
3308 }
2d5b90b2 3309 else if (where)
37d92a7e
DH
3310 {
3311 /* Emit a warning for -std=legacy and an error otherwise. */
3312 if (gfc_option.warn_std == 0)
e0b9e5f9 3313 gfc_warning (0, "Actual argument contains too few "
37d92a7e
DH
3314 "elements for dummy argument %qs (%lu/%lu) "
3315 "at %L", f->sym->name, actual_size,
3316 formal_size, &a->expr->where);
3317 else
3318 gfc_error_now ("Actual argument contains too few "
3319 "elements for dummy argument %qs (%lu/%lu) "
3320 "at %L", f->sym->name, actual_size,
3321 formal_size, &a->expr->where);
3322 }
ee11be7f
SL
3323 ok = false;
3324 goto match;
2d5b90b2
TB
3325 }
3326
c49ea23d
PT
3327 skip_size_check:
3328
e9355cc3
JW
3329 /* Satisfy F03:12.4.1.3 by ensuring that a procedure pointer actual
3330 argument is provided for a procedure pointer formal argument. */
8fb74da4 3331 if (f->sym->attr.proc_pointer
a7c0b11d 3332 && !((a->expr->expr_type == EXPR_VARIABLE
4294c093
JW
3333 && (a->expr->symtree->n.sym->attr.proc_pointer
3334 || gfc_is_proc_ptr_comp (a->expr)))
a7c0b11d 3335 || (a->expr->expr_type == EXPR_FUNCTION
4294c093 3336 && is_procptr_result (a->expr))))
8fb74da4
JW
3337 {
3338 if (where)
c4100eae 3339 gfc_error ("Expected a procedure pointer for argument %qs at %L",
8fb74da4 3340 f->sym->name, &a->expr->where);
ee11be7f
SL
3341 ok = false;
3342 goto match;
8fb74da4
JW
3343 }
3344
e9355cc3 3345 /* Satisfy F03:12.4.1.3 by ensuring that a procedure actual argument is
699fa7aa 3346 provided for a procedure formal argument. */
e9355cc3 3347 if (f->sym->attr.flavor == FL_PROCEDURE
4294c093
JW
3348 && !((a->expr->expr_type == EXPR_VARIABLE
3349 && (a->expr->symtree->n.sym->attr.flavor == FL_PROCEDURE
3350 || a->expr->symtree->n.sym->attr.proc_pointer
3351 || gfc_is_proc_ptr_comp (a->expr)))
3352 || (a->expr->expr_type == EXPR_FUNCTION
3353 && is_procptr_result (a->expr))))
699fa7aa 3354 {
9914f8cf 3355 if (where)
c4100eae 3356 gfc_error ("Expected a procedure for argument %qs at %L",
9914f8cf 3357 f->sym->name, &a->expr->where);
ee11be7f
SL
3358 ok = false;
3359 goto match;
699fa7aa
PT
3360 }
3361
7afb6108
SL
3362 /* Class array variables and expressions store array info in a
3363 different place from non-class objects; consolidate the logic
3364 to access it here instead of repeating it below. Note that
3365 pointer_arg and allocatable_arg are not fully general and are
3366 only used in a specific situation below with an assumed-rank
3367 argument. */
3368 if (f->sym->ts.type == BT_CLASS && CLASS_DATA (f->sym))
3369 {
3370 gfc_component *classdata = CLASS_DATA (f->sym);
3371 fas = classdata->as;
3372 pointer_dummy = classdata->attr.class_pointer;
3373 }
3374 else
3375 {
3376 fas = f->sym->as;
3377 pointer_dummy = f->sym->attr.pointer;
3378 }
3379
3380 if (a->expr->expr_type != EXPR_VARIABLE)
3381 {
3382 aas = NULL;
3383 pointer_arg = false;
3384 allocatable_arg = false;
3385 }
3386 else if (a->expr->ts.type == BT_CLASS
3387 && a->expr->symtree->n.sym
3388 && CLASS_DATA (a->expr->symtree->n.sym))
3389 {
3390 gfc_component *classdata = CLASS_DATA (a->expr->symtree->n.sym);
3391 aas = classdata->as;
3392 pointer_arg = classdata->attr.class_pointer;
3393 allocatable_arg = classdata->attr.allocatable;
3394 }
3395 else
3396 {
3397 aas = a->expr->symtree->n.sym->as;
3398 pointer_arg = a->expr->symtree->n.sym->attr.pointer;
3399 allocatable_arg = a->expr->symtree->n.sym->attr.allocatable;
3400 }
3401
3402 /* F2018:9.5.2(2) permits assumed-size whole array expressions as
3403 actual arguments only if the shape is not required; thus it
3404 cannot be passed to an assumed-shape array dummy.
3405 F2018:15.5.2.(2) permits passing a nonpointer actual to an
3406 intent(in) pointer dummy argument and this is accepted by
3407 the compare_pointer check below, but this also requires shape
3408 information.
3409 There's more discussion of this in PR94110. */
3410 if (fas
3411 && (fas->type == AS_ASSUMED_SHAPE
3412 || fas->type == AS_DEFERRED
3413 || (fas->type == AS_ASSUMED_RANK && pointer_dummy))
3414 && aas
3415 && aas->type == AS_ASSUMED_SIZE
bf9d2177
JJ
3416 && (a->expr->ref == NULL
3417 || (a->expr->ref->type == REF_ARRAY
3418 && a->expr->ref->u.ar.type == AR_FULL)))
3419 {
3420 if (where)
c4100eae 3421 gfc_error ("Actual argument for %qs cannot be an assumed-size"
bf9d2177 3422 " array at %L", f->sym->name, where);
ee11be7f
SL
3423 ok = false;
3424 goto match;
bf9d2177
JJ
3425 }
3426
7afb6108
SL
3427 /* Diagnose F2018 C839 (TS29113 C535c). Here the problem is
3428 passing an assumed-size array to an INTENT(OUT) assumed-rank
3429 dummy when it doesn't have the size information needed to run
3430 initializers and finalizers. */
3431 if (f->sym->attr.intent == INTENT_OUT
3432 && fas
3433 && fas->type == AS_ASSUMED_RANK
3434 && aas
3435 && ((aas->type == AS_ASSUMED_SIZE
3436 && (a->expr->ref == NULL
3437 || (a->expr->ref->type == REF_ARRAY
3438 && a->expr->ref->u.ar.type == AR_FULL)))
3439 || (aas->type == AS_ASSUMED_RANK
3440 && !pointer_arg
3441 && !allocatable_arg))
3442 && (a->expr->ts.type == BT_CLASS
3443 || (a->expr->ts.type == BT_DERIVED
3444 && (gfc_is_finalizable (a->expr->ts.u.derived, NULL)
3445 || gfc_has_ultimate_allocatable (a->expr)
3446 || gfc_has_default_initializer
3447 (a->expr->ts.u.derived)))))
3448 {
3449 if (where)
3450 gfc_error ("Actual argument to assumed-rank INTENT(OUT) "
3451 "dummy %qs at %L cannot be of unknown size",
3452 f->sym->name, where);
ee11be7f
SL
3453 ok = false;
3454 goto match;
7afb6108
SL
3455 }
3456
1600fe22
TS
3457 if (a->expr->expr_type != EXPR_NULL
3458 && compare_pointer (f->sym, a->expr) == 0)
6de9cd9a
DN
3459 {
3460 if (where)
c4100eae 3461 gfc_error ("Actual argument for %qs must be a pointer at %L",
6de9cd9a 3462 f->sym->name, &a->expr->where);
ee11be7f
SL
3463 ok = false;
3464 goto match;
6de9cd9a
DN
3465 }
3466
7d54ef80
TB
3467 if (a->expr->expr_type != EXPR_NULL
3468 && (gfc_option.allow_std & GFC_STD_F2008) == 0
3469 && compare_pointer (f->sym, a->expr) == 2)
3470 {
3471 if (where)
3472 gfc_error ("Fortran 2008: Non-pointer actual argument at %L to "
c4100eae 3473 "pointer dummy %qs", &a->expr->where,f->sym->name);
ee11be7f
SL
3474 ok = false;
3475 goto match;
7d54ef80 3476 }
8b704316 3477
7d54ef80 3478
d3a9eea2
TB
3479 /* Fortran 2008, C1242. */
3480 if (f->sym->attr.pointer && gfc_is_coindexed (a->expr))
3481 {
3482 if (where)
3483 gfc_error ("Coindexed actual argument at %L to pointer "
c4100eae 3484 "dummy %qs",
d3a9eea2 3485 &a->expr->where, f->sym->name);
ee11be7f
SL
3486 ok = false;
3487 goto match;
d3a9eea2
TB
3488 }
3489
3490 /* Fortran 2008, 12.5.2.5 (no constraint). */
3491 if (a->expr->expr_type == EXPR_VARIABLE
3492 && f->sym->attr.intent != INTENT_IN
3493 && f->sym->attr.allocatable
3494 && gfc_is_coindexed (a->expr))
3495 {
3496 if (where)
3497 gfc_error ("Coindexed actual argument at %L to allocatable "
c4100eae 3498 "dummy %qs requires INTENT(IN)",
d3a9eea2 3499 &a->expr->where, f->sym->name);
ee11be7f
SL
3500 ok = false;
3501 goto match;
d3a9eea2
TB
3502 }
3503
3504 /* Fortran 2008, C1237. */
3505 if (a->expr->expr_type == EXPR_VARIABLE
3506 && (f->sym->attr.asynchronous || f->sym->attr.volatile_)
3507 && gfc_is_coindexed (a->expr)
3508 && (a->expr->symtree->n.sym->attr.volatile_
3509 || a->expr->symtree->n.sym->attr.asynchronous))
3510 {
3511 if (where)
3512 gfc_error ("Coindexed ASYNCHRONOUS or VOLATILE actual argument at "
c4100eae 3513 "%L requires that dummy %qs has neither "
d3a9eea2
TB
3514 "ASYNCHRONOUS nor VOLATILE", &a->expr->where,
3515 f->sym->name);
ee11be7f
SL
3516 ok = false;
3517 goto match;
d3a9eea2
TB
3518 }
3519
3520 /* Fortran 2008, 12.5.2.4 (no constraint). */
3521 if (a->expr->expr_type == EXPR_VARIABLE
3522 && f->sym->attr.intent != INTENT_IN && !f->sym->attr.value
3523 && gfc_is_coindexed (a->expr)
3524 && gfc_has_ultimate_allocatable (a->expr))
3525 {
3526 if (where)
3527 gfc_error ("Coindexed actual argument at %L with allocatable "
c4100eae 3528 "ultimate component to dummy %qs requires either VALUE "
d3a9eea2 3529 "or INTENT(IN)", &a->expr->where, f->sym->name);
ee11be7f
SL
3530 ok = false;
3531 goto match;
d3a9eea2
TB
3532 }
3533
c49ea23d
PT
3534 if (f->sym->ts.type == BT_CLASS
3535 && CLASS_DATA (f->sym)->attr.allocatable
3536 && gfc_is_class_array_ref (a->expr, &full_array)
3537 && !full_array)
3538 {
3539 if (where)
c4100eae 3540 gfc_error ("Actual CLASS array argument for %qs must be a full "
c49ea23d 3541 "array at %L", f->sym->name, &a->expr->where);
ee11be7f
SL
3542 ok = false;
3543 goto match;
c49ea23d
PT
3544 }
3545
3546
aa08038d 3547 if (a->expr->expr_type != EXPR_NULL
f3e1097b 3548 && !compare_allocatable (f->sym, a->expr))
aa08038d
EE
3549 {
3550 if (where)
c4100eae 3551 gfc_error ("Actual argument for %qs must be ALLOCATABLE at %L",
aa08038d 3552 f->sym->name, &a->expr->where);
ee11be7f
SL
3553 ok = false;
3554 goto match;
aa08038d
EE
3555 }
3556
a920e94a 3557 /* Check intent = OUT/INOUT for definable actual argument. */
f3883269
SK
3558 if (!in_statement_function
3559 && (f->sym->attr.intent == INTENT_OUT
3560 || f->sym->attr.intent == INTENT_INOUT))
a920e94a 3561 {
8c91ab34
DK
3562 const char* context = (where
3563 ? _("actual argument to INTENT = OUT/INOUT")
3564 : NULL);
a920e94a 3565
bcb4ad36
TB
3566 if (((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3567 && CLASS_DATA (f->sym)->attr.class_pointer)
3568 || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
524af0d6 3569 && !gfc_check_vardef_context (a->expr, true, false, false, context))
ee11be7f
SL
3570 {
3571 ok = false;
3572 goto match;
3573 }
524af0d6 3574 if (!gfc_check_vardef_context (a->expr, false, false, false, context))
ee11be7f
SL
3575 {
3576 ok = false;
3577 goto match;
3578 }
ee7e677f
TB
3579 }
3580
59be8071
TB
3581 if ((f->sym->attr.intent == INTENT_OUT
3582 || f->sym->attr.intent == INTENT_INOUT
84efddb2
DF
3583 || f->sym->attr.volatile_
3584 || f->sym->attr.asynchronous)
03af1e4c 3585 && gfc_has_vector_subscript (a->expr))
59be8071
TB
3586 {
3587 if (where)
84efddb2
DF
3588 gfc_error ("Array-section actual argument with vector "
3589 "subscripts at %L is incompatible with INTENT(OUT), "
3590 "INTENT(INOUT), VOLATILE or ASYNCHRONOUS attribute "
c4100eae 3591 "of the dummy argument %qs",
59be8071 3592 &a->expr->where, f->sym->name);
ee11be7f
SL
3593 ok = false;
3594 goto match;
59be8071
TB
3595 }
3596
9bce3c1c
TB
3597 /* C1232 (R1221) For an actual argument which is an array section or
3598 an assumed-shape array, the dummy argument shall be an assumed-
3599 shape array, if the dummy argument has the VOLATILE attribute. */
3600
3601 if (f->sym->attr.volatile_
271dd55c 3602 && a->expr->expr_type == EXPR_VARIABLE
9bce3c1c
TB
3603 && a->expr->symtree->n.sym->as
3604 && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SHAPE
7afb6108 3605 && !(fas && fas->type == AS_ASSUMED_SHAPE))
9bce3c1c
TB
3606 {
3607 if (where)
3608 gfc_error ("Assumed-shape actual argument at %L is "
3609 "incompatible with the non-assumed-shape "
c4100eae 3610 "dummy argument %qs due to VOLATILE attribute",
9bce3c1c 3611 &a->expr->where,f->sym->name);
ee11be7f
SL
3612 ok = false;
3613 goto match;
9bce3c1c
TB
3614 }
3615
eb401400
AV
3616 /* Find the last array_ref. */
3617 actual_arr_ref = NULL;
3618 if (a->expr->ref)
3619 actual_arr_ref = gfc_find_array_ref (a->expr, true);
3620
9bce3c1c 3621 if (f->sym->attr.volatile_
eb401400 3622 && actual_arr_ref && actual_arr_ref->type == AR_SECTION
7afb6108 3623 && !(fas && fas->type == AS_ASSUMED_SHAPE))
9bce3c1c
TB
3624 {
3625 if (where)
3626 gfc_error ("Array-section actual argument at %L is "
3627 "incompatible with the non-assumed-shape "
c4100eae 3628 "dummy argument %qs due to VOLATILE attribute",
eb401400 3629 &a->expr->where, f->sym->name);
ee11be7f
SL
3630 ok = false;
3631 goto match;
9bce3c1c
TB
3632 }
3633
3634 /* C1233 (R1221) For an actual argument which is a pointer array, the
3635 dummy argument shall be an assumed-shape or pointer array, if the
3636 dummy argument has the VOLATILE attribute. */
3637
3638 if (f->sym->attr.volatile_
271dd55c 3639 && a->expr->expr_type == EXPR_VARIABLE
9bce3c1c
TB
3640 && a->expr->symtree->n.sym->attr.pointer
3641 && a->expr->symtree->n.sym->as
7afb6108
SL
3642 && !(fas
3643 && (fas->type == AS_ASSUMED_SHAPE
9bce3c1c
TB
3644 || f->sym->attr.pointer)))
3645 {
3646 if (where)
3647 gfc_error ("Pointer-array actual argument at %L requires "
3648 "an assumed-shape or pointer-array dummy "
c4100eae 3649 "argument %qs due to VOLATILE attribute",
9bce3c1c 3650 &a->expr->where,f->sym->name);
ee11be7f
SL
3651 ok = false;
3652 goto match;
9bce3c1c
TB
3653 }
3654
6de9cd9a
DN
3655 match:
3656 if (a == actual)
3657 na = i;
3658
7b901ac4 3659 new_arg[i++] = a;
6de9cd9a
DN
3660 }
3661
ee11be7f
SL
3662 /* Give up now if we saw any bad argument. */
3663 if (!ok)
3664 return false;
3665
6de9cd9a
DN
3666 /* Make sure missing actual arguments are optional. */
3667 i = 0;
3668 for (f = formal; f; f = f->next, i++)
3669 {
7b901ac4 3670 if (new_arg[i] != NULL)
6de9cd9a 3671 continue;
3ab7b3de
BM
3672 if (f->sym == NULL)
3673 {
3674 if (where)
b251af97
SK
3675 gfc_error ("Missing alternate return spec in subroutine call "
3676 "at %L", where);
f3e1097b 3677 return false;
3ab7b3de 3678 }
eb92cd57
TB
3679 /* For CLASS, the optional attribute might be set at either location. */
3680 if (((f->sym->ts.type != BT_CLASS || !CLASS_DATA (f->sym)->attr.optional)
3681 && !f->sym->attr.optional)
3682 || (in_statement_function
3683 && (f->sym->attr.optional
3684 || (f->sym->ts.type == BT_CLASS
3685 && CLASS_DATA (f->sym)->attr.optional))))
6de9cd9a
DN
3686 {
3687 if (where)
c4100eae 3688 gfc_error ("Missing actual argument for argument %qs at %L",
6de9cd9a 3689 f->sym->name, where);
f3e1097b 3690 return false;
6de9cd9a
DN
3691 }
3692 }
3693
a85e5696
SL
3694 /* We should have handled the cases where the formal arglist is null
3695 already. */
3696 gcc_assert (n > 0);
3697
6de9cd9a
DN
3698 /* The argument lists are compatible. We now relink a new actual
3699 argument list with null arguments in the right places. The head
3700 of the list remains the head. */
5888512f 3701 for (f = formal, i = 0; f; f = f->next, i++)
7b901ac4 3702 if (new_arg[i] == NULL)
5888512f
MM
3703 {
3704 new_arg[i] = gfc_get_actual_arglist ();
3705 new_arg[i]->associated_dummy = get_nonintrinsic_dummy_arg (f);
3706 }
6de9cd9a
DN
3707
3708 if (na != 0)
3709 {
fab27f52
MM
3710 std::swap (*new_arg[0], *actual);
3711 std::swap (new_arg[0], new_arg[na]);
6de9cd9a
DN
3712 }
3713
3714 for (i = 0; i < n - 1; i++)
7b901ac4 3715 new_arg[i]->next = new_arg[i + 1];
6de9cd9a 3716
7b901ac4 3717 new_arg[i]->next = NULL;
6de9cd9a
DN
3718
3719 if (*ap == NULL && n > 0)
7b901ac4 3720 *ap = new_arg[0];
6de9cd9a 3721
f3e1097b 3722 return true;
6de9cd9a
DN
3723}
3724
3725
3726typedef struct
3727{
3728 gfc_formal_arglist *f;
3729 gfc_actual_arglist *a;
3730}
3731argpair;
3732
3733/* qsort comparison function for argument pairs, with the following
3734 order:
3735 - p->a->expr == NULL
3736 - p->a->expr->expr_type != EXPR_VARIABLE
c5014982 3737 - by gfc_symbol pointer value (larger first). */
6de9cd9a
DN
3738
3739static int
3740pair_cmp (const void *p1, const void *p2)
3741{
3742 const gfc_actual_arglist *a1, *a2;
3743
3744 /* *p1 and *p2 are elements of the to-be-sorted array. */
3745 a1 = ((const argpair *) p1)->a;
3746 a2 = ((const argpair *) p2)->a;
3747 if (!a1->expr)
3748 {
3749 if (!a2->expr)
3750 return 0;
3751 return -1;
3752 }
3753 if (!a2->expr)
3754 return 1;
3755 if (a1->expr->expr_type != EXPR_VARIABLE)
3756 {
3757 if (a2->expr->expr_type != EXPR_VARIABLE)
3758 return 0;
3759 return -1;
3760 }
3761 if (a2->expr->expr_type != EXPR_VARIABLE)
3762 return 1;
c5014982
AM
3763 if (a1->expr->symtree->n.sym > a2->expr->symtree->n.sym)
3764 return -1;
6de9cd9a
DN
3765 return a1->expr->symtree->n.sym < a2->expr->symtree->n.sym;
3766}
3767
3768
3769/* Given two expressions from some actual arguments, test whether they
3770 refer to the same expression. The analysis is conservative.
524af0d6 3771 Returning false will produce no warning. */
6de9cd9a 3772
524af0d6 3773static bool
b251af97 3774compare_actual_expr (gfc_expr *e1, gfc_expr *e2)
6de9cd9a
DN
3775{
3776 const gfc_ref *r1, *r2;
3777
3778 if (!e1 || !e2
3779 || e1->expr_type != EXPR_VARIABLE
3780 || e2->expr_type != EXPR_VARIABLE
3781 || e1->symtree->n.sym != e2->symtree->n.sym)
524af0d6 3782 return false;
6de9cd9a 3783
e53b6e56 3784 /* TODO: improve comparison, see expr.cc:show_ref(). */
6de9cd9a
DN
3785 for (r1 = e1->ref, r2 = e2->ref; r1 && r2; r1 = r1->next, r2 = r2->next)
3786 {
3787 if (r1->type != r2->type)
524af0d6 3788 return false;
6de9cd9a
DN
3789 switch (r1->type)
3790 {
3791 case REF_ARRAY:
3792 if (r1->u.ar.type != r2->u.ar.type)
524af0d6 3793 return false;
6de9cd9a
DN
3794 /* TODO: At the moment, consider only full arrays;
3795 we could do better. */
3796 if (r1->u.ar.type != AR_FULL || r2->u.ar.type != AR_FULL)
524af0d6 3797 return false;
6de9cd9a
DN
3798 break;
3799
3800 case REF_COMPONENT:
3801 if (r1->u.c.component != r2->u.c.component)
524af0d6 3802 return false;
6de9cd9a
DN
3803 break;
3804
3805 case REF_SUBSTRING:
524af0d6 3806 return false;
6de9cd9a 3807
f16be16d
SK
3808 case REF_INQUIRY:
3809 if (e1->symtree->n.sym->ts.type == BT_COMPLEX
3810 && e1->ts.type == BT_REAL && e2->ts.type == BT_REAL
3811 && r1->u.i != r2->u.i)
3812 return false;
3813 break;
3814
6de9cd9a
DN
3815 default:
3816 gfc_internal_error ("compare_actual_expr(): Bad component code");
3817 }
3818 }
3819 if (!r1 && !r2)
524af0d6
JB
3820 return true;
3821 return false;
6de9cd9a
DN
3822}
3823
b251af97 3824
6de9cd9a
DN
3825/* Given formal and actual argument lists that correspond to one
3826 another, check that identical actual arguments aren't not
3827 associated with some incompatible INTENTs. */
3828
524af0d6 3829static bool
b251af97 3830check_some_aliasing (gfc_formal_arglist *f, gfc_actual_arglist *a)
6de9cd9a
DN
3831{
3832 sym_intent f1_intent, f2_intent;
3833 gfc_formal_arglist *f1;
3834 gfc_actual_arglist *a1;
3835 size_t n, i, j;
3836 argpair *p;
524af0d6 3837 bool t = true;
6de9cd9a
DN
3838
3839 n = 0;
3840 for (f1 = f, a1 = a;; f1 = f1->next, a1 = a1->next)
3841 {
3842 if (f1 == NULL && a1 == NULL)
3843 break;
3844 if (f1 == NULL || a1 == NULL)
3845 gfc_internal_error ("check_some_aliasing(): List mismatch");
3846 n++;
3847 }
3848 if (n == 0)
3849 return t;
1145e690 3850 p = XALLOCAVEC (argpair, n);
6de9cd9a
DN
3851
3852 for (i = 0, f1 = f, a1 = a; i < n; i++, f1 = f1->next, a1 = a1->next)
3853 {
3854 p[i].f = f1;
3855 p[i].a = a1;
3856 }
3857
3858 qsort (p, n, sizeof (argpair), pair_cmp);
3859
3860 for (i = 0; i < n; i++)
3861 {
3862 if (!p[i].a->expr
3863 || p[i].a->expr->expr_type != EXPR_VARIABLE
3864 || p[i].a->expr->ts.type == BT_PROCEDURE)
3865 continue;
3866 f1_intent = p[i].f->sym->attr.intent;
3867 for (j = i + 1; j < n; j++)
3868 {
3869 /* Expected order after the sort. */
3870 if (!p[j].a->expr || p[j].a->expr->expr_type != EXPR_VARIABLE)
3871 gfc_internal_error ("check_some_aliasing(): corrupted data");
3872
3873 /* Are the expression the same? */
524af0d6 3874 if (!compare_actual_expr (p[i].a->expr, p[j].a->expr))
6de9cd9a
DN
3875 break;
3876 f2_intent = p[j].f->sym->attr.intent;
3877 if ((f1_intent == INTENT_IN && f2_intent == INTENT_OUT)
9f1930be
TB
3878 || (f1_intent == INTENT_OUT && f2_intent == INTENT_IN)
3879 || (f1_intent == INTENT_OUT && f2_intent == INTENT_OUT))
6de9cd9a 3880 {
db30e21c 3881 gfc_warning (0, "Same actual argument associated with INTENT(%s) "
48749dbc 3882 "argument %qs and INTENT(%s) argument %qs at %L",
6de9cd9a
DN
3883 gfc_intent_string (f1_intent), p[i].f->sym->name,
3884 gfc_intent_string (f2_intent), p[j].f->sym->name,
3885 &p[i].a->expr->where);
524af0d6 3886 t = false;
6de9cd9a
DN
3887 }
3888 }
3889 }
3890
3891 return t;
3892}
3893
3894
3895/* Given formal and actual argument lists that correspond to one
3896 another, check that they are compatible in the sense that intents
3897 are not mismatched. */
3898
524af0d6 3899static bool
b251af97 3900check_intents (gfc_formal_arglist *f, gfc_actual_arglist *a)
6de9cd9a 3901{
f17facac 3902 sym_intent f_intent;
6de9cd9a
DN
3903
3904 for (;; f = f->next, a = a->next)
3905 {
99c39534
TB
3906 gfc_expr *expr;
3907
6de9cd9a
DN
3908 if (f == NULL && a == NULL)
3909 break;
3910 if (f == NULL || a == NULL)
3911 gfc_internal_error ("check_intents(): List mismatch");
3912
99c39534
TB
3913 if (a->expr && a->expr->expr_type == EXPR_FUNCTION
3914 && a->expr->value.function.isym
3915 && a->expr->value.function.isym->id == GFC_ISYM_CAF_GET)
3916 expr = a->expr->value.function.actual->expr;
3917 else
3918 expr = a->expr;
3919
3920 if (expr == NULL || expr->expr_type != EXPR_VARIABLE)
6de9cd9a
DN
3921 continue;
3922
6de9cd9a
DN
3923 f_intent = f->sym->attr.intent;
3924
99c39534 3925 if (gfc_pure (NULL) && gfc_impure_variable (expr->symtree->n.sym))
6de9cd9a 3926 {
bcb4ad36
TB
3927 if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3928 && CLASS_DATA (f->sym)->attr.class_pointer)
3929 || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
6de9cd9a 3930 {
b251af97
SK
3931 gfc_error ("Procedure argument at %L is local to a PURE "
3932 "procedure and has the POINTER attribute",
99c39534 3933 &expr->where);
524af0d6 3934 return false;
6de9cd9a
DN
3935 }
3936 }
d3a9eea2
TB
3937
3938 /* Fortran 2008, C1283. */
99c39534 3939 if (gfc_pure (NULL) && gfc_is_coindexed (expr))
d3a9eea2
TB
3940 {
3941 if (f_intent == INTENT_INOUT || f_intent == INTENT_OUT)
3942 {
3943 gfc_error ("Coindexed actual argument at %L in PURE procedure "
3944 "is passed to an INTENT(%s) argument",
99c39534 3945 &expr->where, gfc_intent_string (f_intent));
524af0d6 3946 return false;
d3a9eea2
TB
3947 }
3948
bcb4ad36
TB
3949 if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3950 && CLASS_DATA (f->sym)->attr.class_pointer)
3951 || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
d3a9eea2
TB
3952 {
3953 gfc_error ("Coindexed actual argument at %L in PURE procedure "
3954 "is passed to a POINTER dummy argument",
99c39534 3955 &expr->where);
524af0d6 3956 return false;
d3a9eea2
TB
3957 }
3958 }
3959
3960 /* F2008, Section 12.5.2.4. */
99c39534
TB
3961 if (expr->ts.type == BT_CLASS && f->sym->ts.type == BT_CLASS
3962 && gfc_is_coindexed (expr))
d3a9eea2
TB
3963 {
3964 gfc_error ("Coindexed polymorphic actual argument at %L is passed "
c4100eae 3965 "polymorphic dummy argument %qs",
99c39534 3966 &expr->where, f->sym->name);
524af0d6 3967 return false;
d3a9eea2 3968 }
6de9cd9a
DN
3969 }
3970
524af0d6 3971 return true;
6de9cd9a
DN
3972}
3973
3974
3975/* Check how a procedure is used against its interface. If all goes
3976 well, the actual argument list will also end up being properly
3977 sorted. */
3978
524af0d6 3979bool
b251af97 3980gfc_procedure_use (gfc_symbol *sym, gfc_actual_arglist **ap, locus *where)
6de9cd9a 3981{
f3883269 3982 gfc_actual_arglist *a;
4cbc9039 3983 gfc_formal_arglist *dummy_args;
4a4fc7fe 3984 bool implicit = false;
4cbc9039 3985
a9c5fe7e 3986 /* Warn about calls with an implicit interface. Special case
6bd2c800 3987 for calling a ISO_C_BINDING because c_loc and c_funloc
ca071303
FXC
3988 are pseudo-unknown. Additionally, warn about procedures not
3989 explicitly declared at all if requested. */
8b7a967e 3990 if (sym->attr.if_source == IFSRC_UNKNOWN && !sym->attr.is_iso_c)
ca071303 3991 {
b31f8023 3992 bool has_implicit_none_export = false;
4a4fc7fe 3993 implicit = true;
b31f8023
TB
3994 if (sym->attr.proc == PROC_UNKNOWN)
3995 for (gfc_namespace *ns = sym->ns; ns; ns = ns->parent)
3996 if (ns->has_implicit_none_export)
3997 {
3998 has_implicit_none_export = true;
3999 break;
4000 }
4001 if (has_implicit_none_export)
8b7a967e 4002 {
bcc478b9
BRF
4003 const char *guessed
4004 = gfc_lookup_function_fuzzy (sym->name, sym->ns->sym_root);
4005 if (guessed)
4006 gfc_error ("Procedure %qs called at %L is not explicitly declared"
4007 "; did you mean %qs?",
4008 sym->name, where, guessed);
4009 else
4010 gfc_error ("Procedure %qs called at %L is not explicitly declared",
4011 sym->name, where);
8b7a967e
TB
4012 return false;
4013 }
73e42eef 4014 if (warn_implicit_interface)
48749dbc
MLI
4015 gfc_warning (OPT_Wimplicit_interface,
4016 "Procedure %qs called with an implicit interface at %L",
ca071303 4017 sym->name, where);
73e42eef 4018 else if (warn_implicit_procedure && sym->attr.proc == PROC_UNKNOWN)
48749dbc
MLI
4019 gfc_warning (OPT_Wimplicit_procedure,
4020 "Procedure %qs called at %L is not explicitly declared",
ca071303 4021 sym->name, where);
ffeebc4f 4022 gfc_find_proc_namespace (sym->ns)->implicit_interface_calls = 1;
ca071303 4023 }
6de9cd9a 4024
e6895430 4025 if (sym->attr.if_source == IFSRC_UNKNOWN)
ac05557c 4026 {
86d7449c
TB
4027 if (sym->attr.pointer)
4028 {
c4100eae
MLI
4029 gfc_error ("The pointer object %qs at %L must have an explicit "
4030 "function interface or be declared as array",
4031 sym->name, where);
524af0d6 4032 return false;
86d7449c
TB
4033 }
4034
4035 if (sym->attr.allocatable && !sym->attr.external)
4036 {
c4100eae
MLI
4037 gfc_error ("The allocatable object %qs at %L must have an explicit "
4038 "function interface or be declared as array",
4039 sym->name, where);
524af0d6 4040 return false;
86d7449c
TB
4041 }
4042
4043 if (sym->attr.allocatable)
4044 {
c4100eae
MLI
4045 gfc_error ("Allocatable function %qs at %L must have an explicit "
4046 "function interface", sym->name, where);
524af0d6 4047 return false;
86d7449c
TB
4048 }
4049
ac05557c
DF
4050 for (a = *ap; a; a = a->next)
4051 {
fb078366
TK
4052 if (a->expr && a->expr->error)
4053 return false;
4054
4a4fc7fe
TK
4055 /* F2018, 15.4.2.2 Explicit interface is required for a
4056 polymorphic dummy argument, so there is no way to
4057 legally have a class appear in an argument with an
4058 implicit interface. */
4059
4060 if (implicit && a->expr && a->expr->ts.type == BT_CLASS)
4061 {
4062 gfc_error ("Explicit interface required for polymorphic "
4063 "argument at %L",&a->expr->where);
4064 a->expr->error = 1;
4065 break;
4066 }
4067
ac05557c
DF
4068 /* Skip g77 keyword extensions like %VAL, %REF, %LOC. */
4069 if (a->name != NULL && a->name[0] != '%')
4070 {
c4100eae
MLI
4071 gfc_error ("Keyword argument requires explicit interface "
4072 "for procedure %qs at %L", sym->name, &a->expr->where);
ac05557c
DF
4073 break;
4074 }
fea54935 4075
45a69325
TB
4076 /* TS 29113, 6.2. */
4077 if (a->expr && a->expr->ts.type == BT_ASSUMED
4078 && sym->intmod_sym_id != ISOCBINDING_LOC)
4079 {
4080 gfc_error ("Assumed-type argument %s at %L requires an explicit "
4081 "interface", a->expr->symtree->n.sym->name,
4082 &a->expr->where);
fb078366 4083 a->expr->error = 1;
45a69325
TB
4084 break;
4085 }
4086
fea54935
TB
4087 /* F2008, C1303 and C1304. */
4088 if (a->expr
4089 && (a->expr->ts.type == BT_DERIVED || a->expr->ts.type == BT_CLASS)
f477062c 4090 && a->expr->ts.u.derived
fea54935
TB
4091 && ((a->expr->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
4092 && a->expr->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
4093 || gfc_expr_attr (a->expr).lock_comp))
4094 {
c4100eae
MLI
4095 gfc_error ("Actual argument of LOCK_TYPE or with LOCK_TYPE "
4096 "component at %L requires an explicit interface for "
4097 "procedure %qs", &a->expr->where, sym->name);
fb078366 4098 a->expr->error = 1;
fea54935
TB
4099 break;
4100 }
ea8ad3e5 4101
5df445a2
TB
4102 if (a->expr
4103 && (a->expr->ts.type == BT_DERIVED || a->expr->ts.type == BT_CLASS)
f477062c 4104 && a->expr->ts.u.derived
5df445a2
TB
4105 && ((a->expr->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
4106 && a->expr->ts.u.derived->intmod_sym_id
4107 == ISOFORTRAN_EVENT_TYPE)
4108 || gfc_expr_attr (a->expr).event_comp))
4109 {
4110 gfc_error ("Actual argument of EVENT_TYPE or with EVENT_TYPE "
4111 "component at %L requires an explicit interface for "
4112 "procedure %qs", &a->expr->where, sym->name);
fb078366 4113 a->expr->error = 1;
5df445a2
TB
4114 break;
4115 }
4116
ea8ad3e5
TB
4117 if (a->expr && a->expr->expr_type == EXPR_NULL
4118 && a->expr->ts.type == BT_UNKNOWN)
4119 {
fb078366
TK
4120 gfc_error ("MOLD argument to NULL required at %L",
4121 &a->expr->where);
4122 a->expr->error = 1;
524af0d6 4123 return false;
ea8ad3e5 4124 }
c62c6622
TB
4125
4126 /* TS 29113, C407b. */
4127 if (a->expr && a->expr->expr_type == EXPR_VARIABLE
4128 && symbol_rank (a->expr->symtree->n.sym) == -1)
4129 {
4130 gfc_error ("Assumed-rank argument requires an explicit interface "
4131 "at %L", &a->expr->where);
fb078366 4132 a->expr->error = 1;
524af0d6 4133 return false;
c62c6622 4134 }
ac05557c
DF
4135 }
4136
524af0d6 4137 return true;
ac05557c
DF
4138 }
4139
4cbc9039
JW
4140 dummy_args = gfc_sym_get_dummy_args (sym);
4141
f3883269
SK
4142 /* For a statement function, check that types and type parameters of actual
4143 arguments and dummy arguments match. */
e68a35ae
TK
4144 if (!gfc_compare_actual_formal (ap, dummy_args, 0, sym->attr.elemental,
4145 sym->attr.proc == PROC_ST_FUNCTION, where))
524af0d6 4146 return false;
a5baf71b 4147
524af0d6
JB
4148 if (!check_intents (dummy_args, *ap))
4149 return false;
6de9cd9a 4150
73e42eef 4151 if (warn_aliasing)
4cbc9039 4152 check_some_aliasing (dummy_args, *ap);
f8552cd4 4153
524af0d6 4154 return true;
6de9cd9a
DN
4155}
4156
4157
7e196f89
JW
4158/* Check how a procedure pointer component is used against its interface.
4159 If all goes well, the actual argument list will also end up being properly
4160 sorted. Completely analogous to gfc_procedure_use. */
4161
4162void
4163gfc_ppc_use (gfc_component *comp, gfc_actual_arglist **ap, locus *where)
4164{
7e196f89 4165 /* Warn about calls with an implicit interface. Special case
6bd2c800 4166 for calling a ISO_C_BINDING because c_loc and c_funloc
7e196f89 4167 are pseudo-unknown. */
73e42eef 4168 if (warn_implicit_interface
7e196f89
JW
4169 && comp->attr.if_source == IFSRC_UNKNOWN
4170 && !comp->attr.is_iso_c)
48749dbc
MLI
4171 gfc_warning (OPT_Wimplicit_interface,
4172 "Procedure pointer component %qs called with an implicit "
7e196f89
JW
4173 "interface at %L", comp->name, where);
4174
4175 if (comp->attr.if_source == IFSRC_UNKNOWN)
4176 {
4177 gfc_actual_arglist *a;
4178 for (a = *ap; a; a = a->next)
4179 {
4180 /* Skip g77 keyword extensions like %VAL, %REF, %LOC. */
4181 if (a->name != NULL && a->name[0] != '%')
4182 {
c4100eae
MLI
4183 gfc_error ("Keyword argument requires explicit interface "
4184 "for procedure pointer component %qs at %L",
4185 comp->name, &a->expr->where);
7e196f89
JW
4186 break;
4187 }
4188 }
4189
4190 return;
4191 }
4192
e68a35ae 4193 if (!gfc_compare_actual_formal (ap, comp->ts.interface->formal, 0,
f3883269 4194 comp->attr.elemental, false, where))
7e196f89
JW
4195 return;
4196
4cbc9039 4197 check_intents (comp->ts.interface->formal, *ap);
73e42eef 4198 if (warn_aliasing)
4cbc9039 4199 check_some_aliasing (comp->ts.interface->formal, *ap);
7e196f89
JW
4200}
4201
4202
f0ac18b7
DK
4203/* Try if an actual argument list matches the formal list of a symbol,
4204 respecting the symbol's attributes like ELEMENTAL. This is used for
4205 GENERIC resolution. */
4206
4207bool
4208gfc_arglist_matches_symbol (gfc_actual_arglist** args, gfc_symbol* sym)
4209{
4cbc9039 4210 gfc_formal_arglist *dummy_args;
f0ac18b7
DK
4211 bool r;
4212
1d101216
JD
4213 if (sym->attr.flavor != FL_PROCEDURE)
4214 return false;
f0ac18b7 4215
4cbc9039
JW
4216 dummy_args = gfc_sym_get_dummy_args (sym);
4217
f0ac18b7 4218 r = !sym->attr.elemental;
e68a35ae 4219 if (gfc_compare_actual_formal (args, dummy_args, r, !r, false, NULL))
f0ac18b7 4220 {
4cbc9039 4221 check_intents (dummy_args, *args);
73e42eef 4222 if (warn_aliasing)
4cbc9039 4223 check_some_aliasing (dummy_args, *args);
f0ac18b7
DK
4224 return true;
4225 }
4226
4227 return false;
4228}
4229
4230
6de9cd9a
DN
4231/* Given an interface pointer and an actual argument list, search for
4232 a formal argument list that matches the actual. If found, returns
4233 a pointer to the symbol of the correct interface. Returns NULL if
4234 not found. */
4235
4236gfc_symbol *
b251af97
SK
4237gfc_search_interface (gfc_interface *intr, int sub_flag,
4238 gfc_actual_arglist **ap)
6de9cd9a 4239{
22a0a780 4240 gfc_symbol *elem_sym = NULL;
ea8ad3e5
TB
4241 gfc_symbol *null_sym = NULL;
4242 locus null_expr_loc;
4243 gfc_actual_arglist *a;
4244 bool has_null_arg = false;
4245
4246 for (a = *ap; a; a = a->next)
4247 if (a->expr && a->expr->expr_type == EXPR_NULL
4248 && a->expr->ts.type == BT_UNKNOWN)
4249 {
4250 has_null_arg = true;
4251 null_expr_loc = a->expr->where;
4252 break;
8b704316 4253 }
ea8ad3e5 4254
6de9cd9a
DN
4255 for (; intr; intr = intr->next)
4256 {
f6288c24 4257 if (gfc_fl_struct (intr->sym->attr.flavor))
c3f34952 4258 continue;
6de9cd9a
DN
4259 if (sub_flag && intr->sym->attr.function)
4260 continue;
4261 if (!sub_flag && intr->sym->attr.subroutine)
4262 continue;
4263
f0ac18b7 4264 if (gfc_arglist_matches_symbol (ap, intr->sym))
22a0a780 4265 {
ea8ad3e5
TB
4266 if (has_null_arg && null_sym)
4267 {
4268 gfc_error ("MOLD= required in NULL() argument at %L: Ambiguity "
4269 "between specific functions %s and %s",
4270 &null_expr_loc, null_sym->name, intr->sym->name);
4271 return NULL;
4272 }
4273 else if (has_null_arg)
4274 {
4275 null_sym = intr->sym;
4276 continue;
4277 }
4278
22a0a780 4279 /* Satisfy 12.4.4.1 such that an elemental match has lower
8b704316 4280 weight than a non-elemental match. */
22a0a780
PT
4281 if (intr->sym->attr.elemental)
4282 {
4283 elem_sym = intr->sym;
4284 continue;
4285 }
4286 return intr->sym;
4287 }
6de9cd9a
DN
4288 }
4289
ea8ad3e5
TB
4290 if (null_sym)
4291 return null_sym;
4292
22a0a780 4293 return elem_sym ? elem_sym : NULL;
6de9cd9a
DN
4294}
4295
4296
4297/* Do a brute force recursive search for a symbol. */
4298
4299static gfc_symtree *
b251af97 4300find_symtree0 (gfc_symtree *root, gfc_symbol *sym)
6de9cd9a
DN
4301{
4302 gfc_symtree * st;
4303
4304 if (root->n.sym == sym)
4305 return root;
4306
4307 st = NULL;
4308 if (root->left)
4309 st = find_symtree0 (root->left, sym);
4310 if (root->right && ! st)
4311 st = find_symtree0 (root->right, sym);
4312 return st;
4313}
4314
4315
4316/* Find a symtree for a symbol. */
4317
f6fad28e
DK
4318gfc_symtree *
4319gfc_find_sym_in_symtree (gfc_symbol *sym)
6de9cd9a
DN
4320{
4321 gfc_symtree *st;
4322 gfc_namespace *ns;
4323
4324 /* First try to find it by name. */
4325 gfc_find_sym_tree (sym->name, gfc_current_ns, 1, &st);
4326 if (st && st->n.sym == sym)
4327 return st;
4328
66e4ab31 4329 /* If it's been renamed, resort to a brute-force search. */
6de9cd9a
DN
4330 /* TODO: avoid having to do this search. If the symbol doesn't exist
4331 in the symtree for the current namespace, it should probably be added. */
4332 for (ns = gfc_current_ns; ns; ns = ns->parent)
4333 {
4334 st = find_symtree0 (ns->sym_root, sym);
4335 if (st)
b251af97 4336 return st;
6de9cd9a 4337 }
17d5d49f 4338 gfc_internal_error ("Unable to find symbol %qs", sym->name);
66e4ab31 4339 /* Not reached. */
6de9cd9a
DN
4340}
4341
4342
4a44a72d
DK
4343/* See if the arglist to an operator-call contains a derived-type argument
4344 with a matching type-bound operator. If so, return the matching specific
4345 procedure defined as operator-target as well as the base-object to use
974df0f8
PT
4346 (which is the found derived-type argument with operator). The generic
4347 name, if any, is transmitted to the final expression via 'gname'. */
4a44a72d
DK
4348
4349static gfc_typebound_proc*
4350matching_typebound_op (gfc_expr** tb_base,
4351 gfc_actual_arglist* args,
974df0f8
PT
4352 gfc_intrinsic_op op, const char* uop,
4353 const char ** gname)
4a44a72d
DK
4354{
4355 gfc_actual_arglist* base;
4356
4357 for (base = args; base; base = base->next)
4b7dd692 4358 if (base->expr->ts.type == BT_DERIVED || base->expr->ts.type == BT_CLASS)
4a44a72d
DK
4359 {
4360 gfc_typebound_proc* tb;
4361 gfc_symbol* derived;
524af0d6 4362 bool result;
4a44a72d 4363
efd2e969
PT
4364 while (base->expr->expr_type == EXPR_OP
4365 && base->expr->value.op.op == INTRINSIC_PARENTHESES)
4366 base->expr = base->expr->value.op.op1;
4367
4b7dd692 4368 if (base->expr->ts.type == BT_CLASS)
528622fd 4369 {
fba5a793 4370 if (!base->expr->ts.u.derived || CLASS_DATA (base->expr) == NULL
0a59e583 4371 || !gfc_expr_attr (base->expr).class_ok)
528622fd
JW
4372 continue;
4373 derived = CLASS_DATA (base->expr)->ts.u.derived;
4374 }
4b7dd692
JW
4375 else
4376 derived = base->expr->ts.u.derived;
4a44a72d
DK
4377
4378 if (op == INTRINSIC_USER)
4379 {
4380 gfc_symtree* tb_uop;
4381
4382 gcc_assert (uop);
4383 tb_uop = gfc_find_typebound_user_op (derived, &result, uop,
4384 false, NULL);
4385
4386 if (tb_uop)
4387 tb = tb_uop->n.tb;
4388 else
4389 tb = NULL;
4390 }
4391 else
4392 tb = gfc_find_typebound_intrinsic_op (derived, &result, op,
4393 false, NULL);
4394
4395 /* This means we hit a PRIVATE operator which is use-associated and
4396 should thus not be seen. */
524af0d6 4397 if (!result)
4a44a72d
DK
4398 tb = NULL;
4399
4400 /* Look through the super-type hierarchy for a matching specific
4401 binding. */
4402 for (; tb; tb = tb->overridden)
4403 {
4404 gfc_tbp_generic* g;
4405
4406 gcc_assert (tb->is_generic);
4407 for (g = tb->u.generic; g; g = g->next)
4408 {
4409 gfc_symbol* target;
4410 gfc_actual_arglist* argcopy;
4411 bool matches;
4412
4413 gcc_assert (g->specific);
4414 if (g->specific->error)
4415 continue;
4416
4417 target = g->specific->u.specific->n.sym;
4418
4419 /* Check if this arglist matches the formal. */
4420 argcopy = gfc_copy_actual_arglist (args);
4421 matches = gfc_arglist_matches_symbol (&argcopy, target);
4422 gfc_free_actual_arglist (argcopy);
4423
4424 /* Return if we found a match. */
4425 if (matches)
4426 {
4427 *tb_base = base->expr;
974df0f8 4428 *gname = g->specific_st->name;
4a44a72d
DK
4429 return g->specific;
4430 }
4431 }
4432 }
4433 }
4434
4435 return NULL;
4436}
4437
4438
4439/* For the 'actual arglist' of an operator call and a specific typebound
4440 procedure that has been found the target of a type-bound operator, build the
4441 appropriate EXPR_COMPCALL and resolve it. We take this indirection over
4442 type-bound procedures rather than resolving type-bound operators 'directly'
4443 so that we can reuse the existing logic. */
4444
4445static void
4446build_compcall_for_operator (gfc_expr* e, gfc_actual_arglist* actual,
974df0f8
PT
4447 gfc_expr* base, gfc_typebound_proc* target,
4448 const char *gname)
4a44a72d
DK
4449{
4450 e->expr_type = EXPR_COMPCALL;
4451 e->value.compcall.tbp = target;
974df0f8 4452 e->value.compcall.name = gname ? gname : "$op";
4a44a72d
DK
4453 e->value.compcall.actual = actual;
4454 e->value.compcall.base_object = base;
4455 e->value.compcall.ignore_pass = 1;
4456 e->value.compcall.assign = 0;
94fae14b
PT
4457 if (e->ts.type == BT_UNKNOWN
4458 && target->function)
4459 {
4460 if (target->is_generic)
4461 e->ts = target->u.generic->specific->u.specific->n.sym->ts;
4462 else
4463 e->ts = target->u.specific->n.sym->ts;
4464 }
4a44a72d
DK
4465}
4466
4467
6de9cd9a
DN
4468/* This subroutine is called when an expression is being resolved.
4469 The expression node in question is either a user defined operator
1f2959f0 4470 or an intrinsic operator with arguments that aren't compatible
6de9cd9a
DN
4471 with the operator. This subroutine builds an actual argument list
4472 corresponding to the operands, then searches for a compatible
4473 interface. If one is found, the expression node is replaced with
eaee02a5
JW
4474 the appropriate function call. We use the 'match' enum to specify
4475 whether a replacement has been made or not, or if an error occurred. */
6de9cd9a 4476
eaee02a5
JW
4477match
4478gfc_extend_expr (gfc_expr *e)
6de9cd9a
DN
4479{
4480 gfc_actual_arglist *actual;
4481 gfc_symbol *sym;
4482 gfc_namespace *ns;
4483 gfc_user_op *uop;
4484 gfc_intrinsic_op i;
974df0f8 4485 const char *gname;
517d78be
JW
4486 gfc_typebound_proc* tbo;
4487 gfc_expr* tb_base;
6de9cd9a
DN
4488
4489 sym = NULL;
4490
4491 actual = gfc_get_actual_arglist ();
58b03ab2 4492 actual->expr = e->value.op.op1;
6de9cd9a 4493
974df0f8 4494 gname = NULL;
4a44a72d 4495
58b03ab2 4496 if (e->value.op.op2 != NULL)
6de9cd9a
DN
4497 {
4498 actual->next = gfc_get_actual_arglist ();
58b03ab2 4499 actual->next->expr = e->value.op.op2;
6de9cd9a
DN
4500 }
4501
e8d4f3fc 4502 i = fold_unary_intrinsic (e->value.op.op);
6de9cd9a 4503
517d78be
JW
4504 /* See if we find a matching type-bound operator. */
4505 if (i == INTRINSIC_USER)
4506 tbo = matching_typebound_op (&tb_base, actual,
4507 i, e->value.op.uop->name, &gname);
4508 else
4509 switch (i)
4510 {
4511#define CHECK_OS_COMPARISON(comp) \
4512 case INTRINSIC_##comp: \
4513 case INTRINSIC_##comp##_OS: \
4514 tbo = matching_typebound_op (&tb_base, actual, \
4515 INTRINSIC_##comp, NULL, &gname); \
4516 if (!tbo) \
4517 tbo = matching_typebound_op (&tb_base, actual, \
4518 INTRINSIC_##comp##_OS, NULL, &gname); \
4519 break;
4520 CHECK_OS_COMPARISON(EQ)
4521 CHECK_OS_COMPARISON(NE)
4522 CHECK_OS_COMPARISON(GT)
4523 CHECK_OS_COMPARISON(GE)
4524 CHECK_OS_COMPARISON(LT)
4525 CHECK_OS_COMPARISON(LE)
4526#undef CHECK_OS_COMPARISON
4527
4528 default:
4529 tbo = matching_typebound_op (&tb_base, actual, i, NULL, &gname);
4530 break;
4531 }
4532
4533 /* If there is a matching typebound-operator, replace the expression with
4534 a call to it and succeed. */
4535 if (tbo)
4536 {
4537 gcc_assert (tb_base);
4538 build_compcall_for_operator (e, actual, tb_base, tbo, gname);
4539
4540 if (!gfc_resolve_expr (e))
4541 return MATCH_ERROR;
4542 else
4543 return MATCH_YES;
4544 }
e73d3ca6 4545
6de9cd9a
DN
4546 if (i == INTRINSIC_USER)
4547 {
4548 for (ns = gfc_current_ns; ns; ns = ns->parent)
4549 {
58b03ab2 4550 uop = gfc_find_uop (e->value.op.uop->name, ns);
6de9cd9a
DN
4551 if (uop == NULL)
4552 continue;
4553
a1ee985f 4554 sym = gfc_search_interface (uop->op, 0, &actual);
6de9cd9a
DN
4555 if (sym != NULL)
4556 break;
4557 }
4558 }
4559 else
4560 {
4561 for (ns = gfc_current_ns; ns; ns = ns->parent)
4562 {
3bed9dd0
DF
4563 /* Due to the distinction between '==' and '.eq.' and friends, one has
4564 to check if either is defined. */
4565 switch (i)
4566 {
4a44a72d
DK
4567#define CHECK_OS_COMPARISON(comp) \
4568 case INTRINSIC_##comp: \
4569 case INTRINSIC_##comp##_OS: \
4570 sym = gfc_search_interface (ns->op[INTRINSIC_##comp], 0, &actual); \
4571 if (!sym) \
4572 sym = gfc_search_interface (ns->op[INTRINSIC_##comp##_OS], 0, &actual); \
4573 break;
4574 CHECK_OS_COMPARISON(EQ)
4575 CHECK_OS_COMPARISON(NE)
4576 CHECK_OS_COMPARISON(GT)
4577 CHECK_OS_COMPARISON(GE)
4578 CHECK_OS_COMPARISON(LT)
4579 CHECK_OS_COMPARISON(LE)
4580#undef CHECK_OS_COMPARISON
3bed9dd0
DF
4581
4582 default:
a1ee985f 4583 sym = gfc_search_interface (ns->op[i], 0, &actual);
3bed9dd0
DF
4584 }
4585
6de9cd9a
DN
4586 if (sym != NULL)
4587 break;
4588 }
4589 }
4590
4a44a72d
DK
4591 /* TODO: Do an ambiguity-check and error if multiple matching interfaces are
4592 found rather than just taking the first one and not checking further. */
4593
6de9cd9a
DN
4594 if (sym == NULL)
4595 {
66e4ab31 4596 /* Don't use gfc_free_actual_arglist(). */
04695783 4597 free (actual->next);
cede9502 4598 free (actual);
eaee02a5 4599 return MATCH_NO;
6de9cd9a
DN
4600 }
4601
4602 /* Change the expression node to a function call. */
4603 e->expr_type = EXPR_FUNCTION;
f6fad28e 4604 e->symtree = gfc_find_sym_in_symtree (sym);
6de9cd9a 4605 e->value.function.actual = actual;
58b03ab2
TS
4606 e->value.function.esym = NULL;
4607 e->value.function.isym = NULL;
cf013e9f 4608 e->value.function.name = NULL;
a1ab6660 4609 e->user_operator = 1;
6de9cd9a 4610
524af0d6 4611 if (!gfc_resolve_expr (e))
eaee02a5 4612 return MATCH_ERROR;
6de9cd9a 4613
eaee02a5 4614 return MATCH_YES;
6de9cd9a
DN
4615}
4616
4617
4f7395ff
JW
4618/* Tries to replace an assignment code node with a subroutine call to the
4619 subroutine associated with the assignment operator. Return true if the node
4620 was replaced. On false, no error is generated. */
6de9cd9a 4621
524af0d6 4622bool
b251af97 4623gfc_extend_assign (gfc_code *c, gfc_namespace *ns)
6de9cd9a
DN
4624{
4625 gfc_actual_arglist *actual;
4f7395ff
JW
4626 gfc_expr *lhs, *rhs, *tb_base;
4627 gfc_symbol *sym = NULL;
4628 const char *gname = NULL;
4629 gfc_typebound_proc* tbo;
6de9cd9a 4630
a513927a 4631 lhs = c->expr1;
6de9cd9a
DN
4632 rhs = c->expr2;
4633
8dc63166
SK
4634 /* Don't allow an intrinsic assignment with a BOZ rhs to be replaced. */
4635 if (c->op == EXEC_ASSIGN
4636 && c->expr1->expr_type == EXPR_VARIABLE
4637 && c->expr2->expr_type == EXPR_CONSTANT && c->expr2->ts.type == BT_BOZ)
4638 return false;
4639
6de9cd9a 4640 /* Don't allow an intrinsic assignment to be replaced. */
4b7dd692 4641 if (lhs->ts.type != BT_DERIVED && lhs->ts.type != BT_CLASS
e19bb186 4642 && (rhs->rank == 0 || rhs->rank == lhs->rank)
6de9cd9a 4643 && (lhs->ts.type == rhs->ts.type
b251af97 4644 || (gfc_numeric_ts (&lhs->ts) && gfc_numeric_ts (&rhs->ts))))
524af0d6 4645 return false;
6de9cd9a
DN
4646
4647 actual = gfc_get_actual_arglist ();
4648 actual->expr = lhs;
4649
4650 actual->next = gfc_get_actual_arglist ();
4651 actual->next->expr = rhs;
4652
4f7395ff
JW
4653 /* TODO: Ambiguity-check, see above for gfc_extend_expr. */
4654
4655 /* See if we find a matching type-bound assignment. */
4656 tbo = matching_typebound_op (&tb_base, actual, INTRINSIC_ASSIGN,
4657 NULL, &gname);
4658
4659 if (tbo)
4660 {
4661 /* Success: Replace the expression with a type-bound call. */
4662 gcc_assert (tb_base);
4663 c->expr1 = gfc_get_expr ();
4664 build_compcall_for_operator (c->expr1, actual, tb_base, tbo, gname);
4665 c->expr1->value.compcall.assign = 1;
4666 c->expr1->where = c->loc;
4667 c->expr2 = NULL;
4668 c->op = EXEC_COMPCALL;
4669 return true;
4670 }
6de9cd9a 4671
4f7395ff 4672 /* See if we find an 'ordinary' (non-typebound) assignment procedure. */
6de9cd9a
DN
4673 for (; ns; ns = ns->parent)
4674 {
a1ee985f 4675 sym = gfc_search_interface (ns->op[INTRINSIC_ASSIGN], 1, &actual);
6de9cd9a
DN
4676 if (sym != NULL)
4677 break;
4678 }
4679
4f7395ff 4680 if (sym)
6de9cd9a 4681 {
4f7395ff
JW
4682 /* Success: Replace the assignment with the call. */
4683 c->op = EXEC_ASSIGN_CALL;
4684 c->symtree = gfc_find_sym_in_symtree (sym);
4685 c->expr1 = NULL;
4686 c->expr2 = NULL;
4687 c->ext.actual = actual;
4688 return true;
6de9cd9a
DN
4689 }
4690
4f7395ff
JW
4691 /* Failure: No assignment procedure found. */
4692 free (actual->next);
4693 free (actual);
4694 return false;
6de9cd9a
DN
4695}
4696
4697
4698/* Make sure that the interface just parsed is not already present in
4699 the given interface list. Ambiguity isn't checked yet since module
4700 procedures can be present without interfaces. */
4701
524af0d6 4702bool
362aa474 4703gfc_check_new_interface (gfc_interface *base, gfc_symbol *new_sym, locus loc)
6de9cd9a
DN
4704{
4705 gfc_interface *ip;
4706
4707 for (ip = base; ip; ip = ip->next)
4708 {
7b901ac4 4709 if (ip->sym == new_sym)
6de9cd9a 4710 {
c4100eae 4711 gfc_error ("Entity %qs at %L is already present in the interface",
362aa474 4712 new_sym->name, &loc);
524af0d6 4713 return false;
6de9cd9a
DN
4714 }
4715 }
4716
524af0d6 4717 return true;
6de9cd9a
DN
4718}
4719
4720
4721/* Add a symbol to the current interface. */
4722
524af0d6 4723bool
7b901ac4 4724gfc_add_interface (gfc_symbol *new_sym)
6de9cd9a
DN
4725{
4726 gfc_interface **head, *intr;
4727 gfc_namespace *ns;
4728 gfc_symbol *sym;
4729
4730 switch (current_interface.type)
4731 {
4732 case INTERFACE_NAMELESS:
9e1d712c 4733 case INTERFACE_ABSTRACT:
524af0d6 4734 return true;
6de9cd9a
DN
4735
4736 case INTERFACE_INTRINSIC_OP:
4737 for (ns = current_interface.ns; ns; ns = ns->parent)
3bed9dd0
DF
4738 switch (current_interface.op)
4739 {
4740 case INTRINSIC_EQ:
4741 case INTRINSIC_EQ_OS:
e73d3ca6 4742 if (!gfc_check_new_interface (ns->op[INTRINSIC_EQ], new_sym,
524af0d6 4743 gfc_current_locus)
e73d3ca6 4744 || !gfc_check_new_interface (ns->op[INTRINSIC_EQ_OS],
524af0d6
JB
4745 new_sym, gfc_current_locus))
4746 return false;
3bed9dd0
DF
4747 break;
4748
4749 case INTRINSIC_NE:
4750 case INTRINSIC_NE_OS:
e73d3ca6 4751 if (!gfc_check_new_interface (ns->op[INTRINSIC_NE], new_sym,
524af0d6 4752 gfc_current_locus)
e73d3ca6 4753 || !gfc_check_new_interface (ns->op[INTRINSIC_NE_OS],
524af0d6
JB
4754 new_sym, gfc_current_locus))
4755 return false;
3bed9dd0
DF
4756 break;
4757
4758 case INTRINSIC_GT:
4759 case INTRINSIC_GT_OS:
e73d3ca6 4760 if (!gfc_check_new_interface (ns->op[INTRINSIC_GT],
524af0d6 4761 new_sym, gfc_current_locus)
e73d3ca6 4762 || !gfc_check_new_interface (ns->op[INTRINSIC_GT_OS],
524af0d6
JB
4763 new_sym, gfc_current_locus))
4764 return false;
3bed9dd0
DF
4765 break;
4766
4767 case INTRINSIC_GE:
4768 case INTRINSIC_GE_OS:
e73d3ca6 4769 if (!gfc_check_new_interface (ns->op[INTRINSIC_GE],
524af0d6 4770 new_sym, gfc_current_locus)
e73d3ca6 4771 || !gfc_check_new_interface (ns->op[INTRINSIC_GE_OS],
524af0d6
JB
4772 new_sym, gfc_current_locus))
4773 return false;
3bed9dd0
DF
4774 break;
4775
4776 case INTRINSIC_LT:
4777 case INTRINSIC_LT_OS:
e73d3ca6 4778 if (!gfc_check_new_interface (ns->op[INTRINSIC_LT],
524af0d6 4779 new_sym, gfc_current_locus)
e73d3ca6 4780 || !gfc_check_new_interface (ns->op[INTRINSIC_LT_OS],
524af0d6
JB
4781 new_sym, gfc_current_locus))
4782 return false;
3bed9dd0
DF
4783 break;
4784
4785 case INTRINSIC_LE:
4786 case INTRINSIC_LE_OS:
e73d3ca6 4787 if (!gfc_check_new_interface (ns->op[INTRINSIC_LE],
524af0d6 4788 new_sym, gfc_current_locus)
e73d3ca6 4789 || !gfc_check_new_interface (ns->op[INTRINSIC_LE_OS],
524af0d6
JB
4790 new_sym, gfc_current_locus))
4791 return false;
3bed9dd0
DF
4792 break;
4793
4794 default:
e73d3ca6 4795 if (!gfc_check_new_interface (ns->op[current_interface.op],
524af0d6
JB
4796 new_sym, gfc_current_locus))
4797 return false;
3bed9dd0 4798 }
6de9cd9a 4799
a1ee985f 4800 head = &current_interface.ns->op[current_interface.op];
6de9cd9a
DN
4801 break;
4802
4803 case INTERFACE_GENERIC:
e73d3ca6 4804 case INTERFACE_DTIO:
6de9cd9a
DN
4805 for (ns = current_interface.ns; ns; ns = ns->parent)
4806 {
4807 gfc_find_symbol (current_interface.sym->name, ns, 0, &sym);
4808 if (sym == NULL)
4809 continue;
4810
e73d3ca6 4811 if (!gfc_check_new_interface (sym->generic,
524af0d6
JB
4812 new_sym, gfc_current_locus))
4813 return false;
6de9cd9a
DN
4814 }
4815
4816 head = &current_interface.sym->generic;
4817 break;
4818
4819 case INTERFACE_USER_OP:
e73d3ca6 4820 if (!gfc_check_new_interface (current_interface.uop->op,
524af0d6
JB
4821 new_sym, gfc_current_locus))
4822 return false;
6de9cd9a 4823
a1ee985f 4824 head = &current_interface.uop->op;
6de9cd9a
DN
4825 break;
4826
4827 default:
4828 gfc_internal_error ("gfc_add_interface(): Bad interface type");
4829 }
4830
4831 intr = gfc_get_interface ();
7b901ac4 4832 intr->sym = new_sym;
63645982 4833 intr->where = gfc_current_locus;
6de9cd9a
DN
4834
4835 intr->next = *head;
4836 *head = intr;
4837
524af0d6 4838 return true;
6de9cd9a
DN
4839}
4840
4841
2b77e908
FXC
4842gfc_interface *
4843gfc_current_interface_head (void)
4844{
4845 switch (current_interface.type)
4846 {
4847 case INTERFACE_INTRINSIC_OP:
a1ee985f 4848 return current_interface.ns->op[current_interface.op];
2b77e908
FXC
4849
4850 case INTERFACE_GENERIC:
e73d3ca6 4851 case INTERFACE_DTIO:
2b77e908 4852 return current_interface.sym->generic;
2b77e908
FXC
4853
4854 case INTERFACE_USER_OP:
a1ee985f 4855 return current_interface.uop->op;
2b77e908
FXC
4856
4857 default:
4858 gcc_unreachable ();
4859 }
4860}
4861
4862
4863void
4864gfc_set_current_interface_head (gfc_interface *i)
4865{
4866 switch (current_interface.type)
4867 {
4868 case INTERFACE_INTRINSIC_OP:
a1ee985f 4869 current_interface.ns->op[current_interface.op] = i;
2b77e908
FXC
4870 break;
4871
4872 case INTERFACE_GENERIC:
e73d3ca6 4873 case INTERFACE_DTIO:
2b77e908
FXC
4874 current_interface.sym->generic = i;
4875 break;
4876
4877 case INTERFACE_USER_OP:
a1ee985f 4878 current_interface.uop->op = i;
2b77e908
FXC
4879 break;
4880
4881 default:
4882 gcc_unreachable ();
4883 }
4884}
4885
4886
6de9cd9a
DN
4887/* Gets rid of a formal argument list. We do not free symbols.
4888 Symbols are freed when a namespace is freed. */
4889
4890void
b251af97 4891gfc_free_formal_arglist (gfc_formal_arglist *p)
6de9cd9a
DN
4892{
4893 gfc_formal_arglist *q;
4894
4895 for (; p; p = q)
4896 {
4897 q = p->next;
cede9502 4898 free (p);
6de9cd9a
DN
4899 }
4900}
99fc1b90
JW
4901
4902
9795c594
JW
4903/* Check that it is ok for the type-bound procedure 'proc' to override the
4904 procedure 'old', cf. F08:4.5.7.3. */
99fc1b90 4905
524af0d6 4906bool
99fc1b90
JW
4907gfc_check_typebound_override (gfc_symtree* proc, gfc_symtree* old)
4908{
4909 locus where;
edc802c7 4910 gfc_symbol *proc_target, *old_target;
99fc1b90 4911 unsigned proc_pass_arg, old_pass_arg, argpos;
9795c594
JW
4912 gfc_formal_arglist *proc_formal, *old_formal;
4913 bool check_type;
4914 char err[200];
99fc1b90
JW
4915
4916 /* This procedure should only be called for non-GENERIC proc. */
4917 gcc_assert (!proc->n.tb->is_generic);
4918
4919 /* If the overwritten procedure is GENERIC, this is an error. */
4920 if (old->n.tb->is_generic)
4921 {
1fe61adf 4922 gfc_error ("Cannot overwrite GENERIC %qs at %L",
99fc1b90 4923 old->name, &proc->n.tb->where);
524af0d6 4924 return false;
99fc1b90
JW
4925 }
4926
4927 where = proc->n.tb->where;
4928 proc_target = proc->n.tb->u.specific->n.sym;
4929 old_target = old->n.tb->u.specific->n.sym;
4930
4931 /* Check that overridden binding is not NON_OVERRIDABLE. */
4932 if (old->n.tb->non_overridable)
4933 {
c4100eae 4934 gfc_error ("%qs at %L overrides a procedure binding declared"
99fc1b90 4935 " NON_OVERRIDABLE", proc->name, &where);
524af0d6 4936 return false;
99fc1b90
JW
4937 }
4938
4939 /* It's an error to override a non-DEFERRED procedure with a DEFERRED one. */
4940 if (!old->n.tb->deferred && proc->n.tb->deferred)
4941 {
c4100eae 4942 gfc_error ("%qs at %L must not be DEFERRED as it overrides a"
99fc1b90 4943 " non-DEFERRED binding", proc->name, &where);
524af0d6 4944 return false;
99fc1b90
JW
4945 }
4946
4947 /* If the overridden binding is PURE, the overriding must be, too. */
4948 if (old_target->attr.pure && !proc_target->attr.pure)
4949 {
c4100eae 4950 gfc_error ("%qs at %L overrides a PURE procedure and must also be PURE",
99fc1b90 4951 proc->name, &where);
524af0d6 4952 return false;
99fc1b90
JW
4953 }
4954
4955 /* If the overridden binding is ELEMENTAL, the overriding must be, too. If it
4956 is not, the overriding must not be either. */
4957 if (old_target->attr.elemental && !proc_target->attr.elemental)
4958 {
c4100eae 4959 gfc_error ("%qs at %L overrides an ELEMENTAL procedure and must also be"
99fc1b90 4960 " ELEMENTAL", proc->name, &where);
524af0d6 4961 return false;
99fc1b90
JW
4962 }
4963 if (!old_target->attr.elemental && proc_target->attr.elemental)
4964 {
c4100eae 4965 gfc_error ("%qs at %L overrides a non-ELEMENTAL procedure and must not"
99fc1b90 4966 " be ELEMENTAL, either", proc->name, &where);
524af0d6 4967 return false;
99fc1b90
JW
4968 }
4969
4970 /* If the overridden binding is a SUBROUTINE, the overriding must also be a
4971 SUBROUTINE. */
4972 if (old_target->attr.subroutine && !proc_target->attr.subroutine)
4973 {
c4100eae 4974 gfc_error ("%qs at %L overrides a SUBROUTINE and must also be a"
99fc1b90 4975 " SUBROUTINE", proc->name, &where);
524af0d6 4976 return false;
99fc1b90
JW
4977 }
4978
4979 /* If the overridden binding is a FUNCTION, the overriding must also be a
4980 FUNCTION and have the same characteristics. */
4981 if (old_target->attr.function)
4982 {
4983 if (!proc_target->attr.function)
4984 {
c4100eae 4985 gfc_error ("%qs at %L overrides a FUNCTION and must also be a"
99fc1b90 4986 " FUNCTION", proc->name, &where);
524af0d6 4987 return false;
99fc1b90 4988 }
8b704316 4989
4668d6f9
PT
4990 if (!gfc_check_result_characteristics (proc_target, old_target,
4991 err, sizeof(err)))
2240d1cf 4992 {
edc802c7 4993 gfc_error ("Result mismatch for the overriding procedure "
c4100eae 4994 "%qs at %L: %s", proc->name, &where, err);
524af0d6 4995 return false;
2240d1cf 4996 }
99fc1b90
JW
4997 }
4998
4999 /* If the overridden binding is PUBLIC, the overriding one must not be
5000 PRIVATE. */
5001 if (old->n.tb->access == ACCESS_PUBLIC
5002 && proc->n.tb->access == ACCESS_PRIVATE)
5003 {
c4100eae 5004 gfc_error ("%qs at %L overrides a PUBLIC procedure and must not be"
99fc1b90 5005 " PRIVATE", proc->name, &where);
524af0d6 5006 return false;
99fc1b90
JW
5007 }
5008
5009 /* Compare the formal argument lists of both procedures. This is also abused
5010 to find the position of the passed-object dummy arguments of both
5011 bindings as at least the overridden one might not yet be resolved and we
5012 need those positions in the check below. */
5013 proc_pass_arg = old_pass_arg = 0;
5014 if (!proc->n.tb->nopass && !proc->n.tb->pass_arg)
5015 proc_pass_arg = 1;
5016 if (!old->n.tb->nopass && !old->n.tb->pass_arg)
5017 old_pass_arg = 1;
5018 argpos = 1;
4cbc9039
JW
5019 proc_formal = gfc_sym_get_dummy_args (proc_target);
5020 old_formal = gfc_sym_get_dummy_args (old_target);
5021 for ( ; proc_formal && old_formal;
99fc1b90
JW
5022 proc_formal = proc_formal->next, old_formal = old_formal->next)
5023 {
5024 if (proc->n.tb->pass_arg
5025 && !strcmp (proc->n.tb->pass_arg, proc_formal->sym->name))
5026 proc_pass_arg = argpos;
5027 if (old->n.tb->pass_arg
5028 && !strcmp (old->n.tb->pass_arg, old_formal->sym->name))
5029 old_pass_arg = argpos;
5030
5031 /* Check that the names correspond. */
5032 if (strcmp (proc_formal->sym->name, old_formal->sym->name))
5033 {
c4100eae 5034 gfc_error ("Dummy argument %qs of %qs at %L should be named %qs as"
99fc1b90
JW
5035 " to match the corresponding argument of the overridden"
5036 " procedure", proc_formal->sym->name, proc->name, &where,
5037 old_formal->sym->name);
524af0d6 5038 return false;
99fc1b90
JW
5039 }
5040
9795c594 5041 check_type = proc_pass_arg != argpos && old_pass_arg != argpos;
4668d6f9 5042 if (!gfc_check_dummy_characteristics (proc_formal->sym, old_formal->sym,
524af0d6 5043 check_type, err, sizeof(err)))
99fc1b90 5044 {
e0b9e5f9 5045 gfc_error_opt (0, "Argument mismatch for the overriding procedure "
2700d0e3 5046 "%qs at %L: %s", proc->name, &where, err);
524af0d6 5047 return false;
99fc1b90
JW
5048 }
5049
5050 ++argpos;
5051 }
5052 if (proc_formal || old_formal)
5053 {
c4100eae 5054 gfc_error ("%qs at %L must have the same number of formal arguments as"
99fc1b90 5055 " the overridden procedure", proc->name, &where);
524af0d6 5056 return false;
99fc1b90
JW
5057 }
5058
5059 /* If the overridden binding is NOPASS, the overriding one must also be
5060 NOPASS. */
5061 if (old->n.tb->nopass && !proc->n.tb->nopass)
5062 {
c4100eae 5063 gfc_error ("%qs at %L overrides a NOPASS binding and must also be"
99fc1b90 5064 " NOPASS", proc->name, &where);
524af0d6 5065 return false;
99fc1b90
JW
5066 }
5067
5068 /* If the overridden binding is PASS(x), the overriding one must also be
5069 PASS and the passed-object dummy arguments must correspond. */
5070 if (!old->n.tb->nopass)
5071 {
5072 if (proc->n.tb->nopass)
5073 {
c4100eae 5074 gfc_error ("%qs at %L overrides a binding with PASS and must also be"
99fc1b90 5075 " PASS", proc->name, &where);
524af0d6 5076 return false;
99fc1b90
JW
5077 }
5078
5079 if (proc_pass_arg != old_pass_arg)
5080 {
c4100eae 5081 gfc_error ("Passed-object dummy argument of %qs at %L must be at"
99fc1b90
JW
5082 " the same position as the passed-object dummy argument of"
5083 " the overridden procedure", proc->name, &where);
524af0d6 5084 return false;
99fc1b90
JW
5085 }
5086 }
5087
524af0d6 5088 return true;
99fc1b90 5089}
e73d3ca6
PT
5090
5091
5092/* The following three functions check that the formal arguments
5093 of user defined derived type IO procedures are compliant with
f3ad8745 5094 the requirements of the standard, see F03:9.5.3.7.2 (F08:9.6.4.8.3). */
e73d3ca6
PT
5095
5096static void
5097check_dtio_arg_TKR_intent (gfc_symbol *fsym, bool typebound, bt type,
5098 int kind, int rank, sym_intent intent)
5099{
5100 if (fsym->ts.type != type)
739d9339
PT
5101 {
5102 gfc_error ("DTIO dummy argument at %L must be of type %s",
5103 &fsym->declared_at, gfc_basic_typename (type));
5104 return;
5105 }
e73d3ca6
PT
5106
5107 if (fsym->ts.type != BT_CLASS && fsym->ts.type != BT_DERIVED
5108 && fsym->ts.kind != kind)
5109 gfc_error ("DTIO dummy argument at %L must be of KIND = %d",
5110 &fsym->declared_at, kind);
5111
5112 if (!typebound
5113 && rank == 0
5114 && (((type == BT_CLASS) && CLASS_DATA (fsym)->attr.dimension)
5115 || ((type != BT_CLASS) && fsym->attr.dimension)))
b93a9a15 5116 gfc_error ("DTIO dummy argument at %L must be a scalar",
e73d3ca6
PT
5117 &fsym->declared_at);
5118 else if (rank == 1
5119 && (fsym->as == NULL || fsym->as->type != AS_ASSUMED_SHAPE))
5120 gfc_error ("DTIO dummy argument at %L must be an "
5121 "ASSUMED SHAPE ARRAY", &fsym->declared_at);
5122
f3ad8745
JW
5123 if (type == BT_CHARACTER && fsym->ts.u.cl->length != NULL)
5124 gfc_error ("DTIO character argument at %L must have assumed length",
5125 &fsym->declared_at);
5126
e73d3ca6 5127 if (fsym->attr.intent != intent)
77be9417 5128 gfc_error ("DTIO dummy argument at %L must have INTENT %s",
e73d3ca6
PT
5129 &fsym->declared_at, gfc_code2string (intents, (int)intent));
5130 return;
5131}
5132
5133
5134static void
5135check_dtio_interface1 (gfc_symbol *derived, gfc_symtree *tb_io_st,
5136 bool typebound, bool formatted, int code)
5137{
5138 gfc_symbol *dtio_sub, *generic_proc, *fsym;
5139 gfc_typebound_proc *tb_io_proc, *specific_proc;
5140 gfc_interface *intr;
5141 gfc_formal_arglist *formal;
5142 int arg_num;
5143
5144 bool read = ((dtio_codes)code == DTIO_RF)
5145 || ((dtio_codes)code == DTIO_RUF);
5146 bt type;
5147 sym_intent intent;
5148 int kind;
5149
5150 dtio_sub = NULL;
5151 if (typebound)
5152 {
5153 /* Typebound DTIO binding. */
5154 tb_io_proc = tb_io_st->n.tb;
739d9339
PT
5155 if (tb_io_proc == NULL)
5156 return;
5157
e73d3ca6 5158 gcc_assert (tb_io_proc->is_generic);
e73d3ca6
PT
5159
5160 specific_proc = tb_io_proc->u.generic->specific;
739d9339
PT
5161 if (specific_proc == NULL || specific_proc->is_generic)
5162 return;
e73d3ca6
PT
5163
5164 dtio_sub = specific_proc->u.specific->n.sym;
5165 }
5166 else
5167 {
5168 generic_proc = tb_io_st->n.sym;
739d9339
PT
5169 if (generic_proc == NULL || generic_proc->generic == NULL)
5170 return;
e73d3ca6
PT
5171
5172 for (intr = tb_io_st->n.sym->generic; intr; intr = intr->next)
5173 {
a8de3002 5174 if (intr->sym && intr->sym->formal && intr->sym->formal->sym
e73d3ca6
PT
5175 && ((intr->sym->formal->sym->ts.type == BT_CLASS
5176 && CLASS_DATA (intr->sym->formal->sym)->ts.u.derived
5177 == derived)
5178 || (intr->sym->formal->sym->ts.type == BT_DERIVED
5179 && intr->sym->formal->sym->ts.u.derived == derived)))
5180 {
5181 dtio_sub = intr->sym;
5182 break;
5183 }
a8de3002
PT
5184 else if (intr->sym && intr->sym->formal && !intr->sym->formal->sym)
5185 {
5186 gfc_error ("Alternate return at %L is not permitted in a DTIO "
5187 "procedure", &intr->sym->declared_at);
5188 return;
5189 }
e73d3ca6
PT
5190 }
5191
5192 if (dtio_sub == NULL)
5193 return;
5194 }
5195
5196 gcc_assert (dtio_sub);
5197 if (!dtio_sub->attr.subroutine)
2f029c08 5198 gfc_error ("DTIO procedure %qs at %L must be a subroutine",
e73d3ca6
PT
5199 dtio_sub->name, &dtio_sub->declared_at);
5200
dbeaa7ab 5201 if (!dtio_sub->resolve_symbol_called)
3ab216a4
TB
5202 gfc_resolve_formal_arglist (dtio_sub);
5203
a8de3002
PT
5204 arg_num = 0;
5205 for (formal = dtio_sub->formal; formal; formal = formal->next)
5206 arg_num++;
5207
5208 if (arg_num < (formatted ? 6 : 4))
5209 {
2f029c08 5210 gfc_error ("Too few dummy arguments in DTIO procedure %qs at %L",
a8de3002
PT
5211 dtio_sub->name, &dtio_sub->declared_at);
5212 return;
5213 }
5214
5215 if (arg_num > (formatted ? 6 : 4))
5216 {
2f029c08 5217 gfc_error ("Too many dummy arguments in DTIO procedure %qs at %L",
a8de3002
PT
5218 dtio_sub->name, &dtio_sub->declared_at);
5219 return;
5220 }
5221
e73d3ca6
PT
5222 /* Now go through the formal arglist. */
5223 arg_num = 1;
5224 for (formal = dtio_sub->formal; formal; formal = formal->next, arg_num++)
5225 {
5226 if (!formatted && arg_num == 3)
5227 arg_num = 5;
5228 fsym = formal->sym;
a8de3002
PT
5229
5230 if (fsym == NULL)
5231 {
5232 gfc_error ("Alternate return at %L is not permitted in a DTIO "
5233 "procedure", &dtio_sub->declared_at);
5234 return;
5235 }
5236
e73d3ca6
PT
5237 switch (arg_num)
5238 {
5239 case(1): /* DTV */
5240 type = derived->attr.sequence || derived->attr.is_bind_c ?
5241 BT_DERIVED : BT_CLASS;
5242 kind = 0;
5243 intent = read ? INTENT_INOUT : INTENT_IN;
5244 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5245 0, intent);
5246 break;
5247
5248 case(2): /* UNIT */
5249 type = BT_INTEGER;
5250 kind = gfc_default_integer_kind;
5251 intent = INTENT_IN;
5252 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5253 0, intent);
5254 break;
5255 case(3): /* IOTYPE */
5256 type = BT_CHARACTER;
5257 kind = gfc_default_character_kind;
5258 intent = INTENT_IN;
5259 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5260 0, intent);
5261 break;
5262 case(4): /* VLIST */
5263 type = BT_INTEGER;
5264 kind = gfc_default_integer_kind;
5265 intent = INTENT_IN;
5266 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5267 1, intent);
5268 break;
5269 case(5): /* IOSTAT */
5270 type = BT_INTEGER;
5271 kind = gfc_default_integer_kind;
5272 intent = INTENT_OUT;
5273 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5274 0, intent);
5275 break;
5276 case(6): /* IOMSG */
5277 type = BT_CHARACTER;
5278 kind = gfc_default_character_kind;
5279 intent = INTENT_INOUT;
5280 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5281 0, intent);
5282 break;
5283 default:
5284 gcc_unreachable ();
5285 }
5286 }
5287 derived->attr.has_dtio_procs = 1;
5288 return;
5289}
5290
5291void
5292gfc_check_dtio_interfaces (gfc_symbol *derived)
5293{
5294 gfc_symtree *tb_io_st;
5295 bool t = false;
5296 int code;
5297 bool formatted;
5298
5299 if (derived->attr.is_class == 1 || derived->attr.vtype == 1)
5300 return;
5301
5302 /* Check typebound DTIO bindings. */
5303 for (code = 0; code < 4; code++)
5304 {
5305 formatted = ((dtio_codes)code == DTIO_RF)
5306 || ((dtio_codes)code == DTIO_WF);
5307
5308 tb_io_st = gfc_find_typebound_proc (derived, &t,
5309 gfc_code2string (dtio_procs, code),
5310 true, &derived->declared_at);
5311 if (tb_io_st != NULL)
5312 check_dtio_interface1 (derived, tb_io_st, true, formatted, code);
5313 }
5314
5315 /* Check generic DTIO interfaces. */
5316 for (code = 0; code < 4; code++)
5317 {
5318 formatted = ((dtio_codes)code == DTIO_RF)
5319 || ((dtio_codes)code == DTIO_WF);
5320
5321 tb_io_st = gfc_find_symtree (derived->ns->sym_root,
5322 gfc_code2string (dtio_procs, code));
5323 if (tb_io_st != NULL)
5324 check_dtio_interface1 (derived, tb_io_st, false, formatted, code);
5325 }
5326}
5327
5328
e4e659b9
JW
5329gfc_symtree*
5330gfc_find_typebound_dtio_proc (gfc_symbol *derived, bool write, bool formatted)
e73d3ca6
PT
5331{
5332 gfc_symtree *tb_io_st = NULL;
e73d3ca6
PT
5333 bool t = false;
5334
dbeaa7ab
ME
5335 if (!derived || !derived->resolve_symbol_called
5336 || derived->attr.flavor != FL_DERIVED)
9beb81ed
PT
5337 return NULL;
5338
e73d3ca6
PT
5339 /* Try to find a typebound DTIO binding. */
5340 if (formatted == true)
5341 {
5342 if (write == true)
5343 tb_io_st = gfc_find_typebound_proc (derived, &t,
5344 gfc_code2string (dtio_procs,
5345 DTIO_WF),
5346 true,
5347 &derived->declared_at);
5348 else
5349 tb_io_st = gfc_find_typebound_proc (derived, &t,
5350 gfc_code2string (dtio_procs,
5351 DTIO_RF),
5352 true,
5353 &derived->declared_at);
5354 }
5355 else
5356 {
5357 if (write == true)
5358 tb_io_st = gfc_find_typebound_proc (derived, &t,
5359 gfc_code2string (dtio_procs,
5360 DTIO_WUF),
5361 true,
5362 &derived->declared_at);
5363 else
5364 tb_io_st = gfc_find_typebound_proc (derived, &t,
5365 gfc_code2string (dtio_procs,
5366 DTIO_RUF),
5367 true,
5368 &derived->declared_at);
5369 }
e4e659b9
JW
5370 return tb_io_st;
5371}
5372
5373
5374gfc_symbol *
5375gfc_find_specific_dtio_proc (gfc_symbol *derived, bool write, bool formatted)
5376{
5377 gfc_symtree *tb_io_st = NULL;
5378 gfc_symbol *dtio_sub = NULL;
5379 gfc_symbol *extended;
5380 gfc_typebound_proc *tb_io_proc, *specific_proc;
5381
5382 tb_io_st = gfc_find_typebound_dtio_proc (derived, write, formatted);
e73d3ca6
PT
5383
5384 if (tb_io_st != NULL)
5385 {
096506bb
PT
5386 const char *genname;
5387 gfc_symtree *st;
5388
e73d3ca6
PT
5389 tb_io_proc = tb_io_st->n.tb;
5390 gcc_assert (tb_io_proc != NULL);
5391 gcc_assert (tb_io_proc->is_generic);
5392 gcc_assert (tb_io_proc->u.generic->next == NULL);
5393
5394 specific_proc = tb_io_proc->u.generic->specific;
5395 gcc_assert (!specific_proc->is_generic);
5396
096506bb
PT
5397 /* Go back and make sure that we have the right specific procedure.
5398 Here we most likely have a procedure from the parent type, which
5399 can be overridden in extensions. */
5400 genname = tb_io_proc->u.generic->specific_st->name;
5401 st = gfc_find_typebound_proc (derived, NULL, genname,
5402 true, &tb_io_proc->where);
5403 if (st)
5404 dtio_sub = st->n.tb->u.specific->n.sym;
5405 else
5406 dtio_sub = specific_proc->u.specific->n.sym;
e73d3ca6 5407
e4e659b9
JW
5408 goto finish;
5409 }
e73d3ca6
PT
5410
5411 /* If there is not a typebound binding, look for a generic
5412 DTIO interface. */
5413 for (extended = derived; extended;
5414 extended = gfc_get_derived_super_type (extended))
5415 {
e4e659b9
JW
5416 if (extended == NULL || extended->ns == NULL
5417 || extended->attr.flavor == FL_UNKNOWN)
a8de3002
PT
5418 return NULL;
5419
e73d3ca6
PT
5420 if (formatted == true)
5421 {
5422 if (write == true)
5423 tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5424 gfc_code2string (dtio_procs,
5425 DTIO_WF));
5426 else
5427 tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5428 gfc_code2string (dtio_procs,
5429 DTIO_RF));
5430 }
5431 else
5432 {
5433 if (write == true)
5434 tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5435 gfc_code2string (dtio_procs,
5436 DTIO_WUF));
5437 else
5438 tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5439 gfc_code2string (dtio_procs,
5440 DTIO_RUF));
5441 }
5442
5443 if (tb_io_st != NULL
5444 && tb_io_st->n.sym
5445 && tb_io_st->n.sym->generic)
5446 {
40109581 5447 for (gfc_interface *intr = tb_io_st->n.sym->generic;
413e859c 5448 intr && intr->sym; intr = intr->next)
e73d3ca6 5449 {
413e859c 5450 if (intr->sym->formal)
e73d3ca6 5451 {
413e859c
JW
5452 gfc_symbol *fsym = intr->sym->formal->sym;
5453 if ((fsym->ts.type == BT_CLASS
5454 && CLASS_DATA (fsym)->ts.u.derived == extended)
5455 || (fsym->ts.type == BT_DERIVED
5456 && fsym->ts.u.derived == extended))
5457 {
5458 dtio_sub = intr->sym;
5459 break;
5460 }
e73d3ca6
PT
5461 }
5462 }
5463 }
5464 }
5465
5466finish:
72d91d6c
TB
5467 if (dtio_sub
5468 && dtio_sub->formal->sym->ts.type == BT_CLASS
5469 && derived != CLASS_DATA (dtio_sub->formal->sym)->ts.u.derived)
e73d3ca6
PT
5470 gfc_find_derived_vtab (derived);
5471
5472 return dtio_sub;
5473}
e68a35ae
TK
5474
5475/* Helper function - if we do not find an interface for a procedure,
5476 construct it from the actual arglist. Luckily, this can only
5477 happen for call by reference, so the information we actually need
5478 to provide (and which would be impossible to guess from the call
5479 itself) is not actually needed. */
5480
5481void
5482gfc_get_formal_from_actual_arglist (gfc_symbol *sym,
5483 gfc_actual_arglist *actual_args)
5484{
5485 gfc_actual_arglist *a;
5486 gfc_formal_arglist **f;
5487 gfc_symbol *s;
5488 char name[GFC_MAX_SYMBOL_LEN + 1];
5489 static int var_num;
5490
5491 f = &sym->formal;
5492 for (a = actual_args; a != NULL; a = a->next)
5493 {
5494 (*f) = gfc_get_formal_arglist ();
5495 if (a->expr)
5496 {
5497 snprintf (name, GFC_MAX_SYMBOL_LEN, "_formal_%d", var_num ++);
5498 gfc_get_symbol (name, gfc_current_ns, &s);
5499 if (a->expr->ts.type == BT_PROCEDURE)
5500 {
5501 s->attr.flavor = FL_PROCEDURE;
5502 }
5503 else
5504 {
5505 s->ts = a->expr->ts;
5506
5507 if (s->ts.type == BT_CHARACTER)
5508 s->ts.u.cl = gfc_get_charlen ();
5509
5510 s->ts.deferred = 0;
5511 s->ts.is_iso_c = 0;
5512 s->ts.is_c_interop = 0;
5513 s->attr.flavor = FL_VARIABLE;
e68a35ae
TK
5514 if (a->expr->rank > 0)
5515 {
5516 s->attr.dimension = 1;
5517 s->as = gfc_get_array_spec ();
5518 s->as->rank = 1;
5519 s->as->lower[0] = gfc_get_int_expr (gfc_index_integer_kind,
5520 &a->expr->where, 1);
5521 s->as->upper[0] = NULL;
5522 s->as->type = AS_ASSUMED_SIZE;
5523 }
4a4fc7fe
TK
5524 else
5525 s->maybe_array = maybe_dummy_array_arg (a->expr);
e68a35ae
TK
5526 }
5527 s->attr.dummy = 1;
3b0e49a5 5528 s->attr.artificial = 1;
e0b9e5f9 5529 s->declared_at = a->expr->where;
e68a35ae
TK
5530 s->attr.intent = INTENT_UNKNOWN;
5531 (*f)->sym = s;
5532 }
5533 else /* If a->expr is NULL, this is an alternate rerturn. */
5534 (*f)->sym = NULL;
5535
5536 f = &((*f)->next);
5537 }
5538}
5d9d16db
MM
5539
5540
48a8c5be
MM
5541const char *
5542gfc_dummy_arg_get_name (gfc_dummy_arg & dummy_arg)
5543{
5544 switch (dummy_arg.intrinsicness)
5545 {
5546 case GFC_INTRINSIC_DUMMY_ARG:
5547 return dummy_arg.u.intrinsic->name;
5548
5549 case GFC_NON_INTRINSIC_DUMMY_ARG:
5550 return dummy_arg.u.non_intrinsic->sym->name;
5551
5552 default:
5553 gcc_unreachable ();
5554 }
5555}
5556
5557
5d9d16db
MM
5558const gfc_typespec &
5559gfc_dummy_arg_get_typespec (gfc_dummy_arg & dummy_arg)
5560{
5561 switch (dummy_arg.intrinsicness)
5562 {
5563 case GFC_INTRINSIC_DUMMY_ARG:
5564 return dummy_arg.u.intrinsic->ts;
5565
5566 case GFC_NON_INTRINSIC_DUMMY_ARG:
5567 return dummy_arg.u.non_intrinsic->sym->ts;
5568
5569 default:
5570 gcc_unreachable ();
5571 }
5572}
5573
5574
5575bool
5576gfc_dummy_arg_is_optional (gfc_dummy_arg & dummy_arg)
5577{
5578 switch (dummy_arg.intrinsicness)
5579 {
5580 case GFC_INTRINSIC_DUMMY_ARG:
5581 return dummy_arg.u.intrinsic->optional;
5582
5583 case GFC_NON_INTRINSIC_DUMMY_ARG:
5584 return dummy_arg.u.non_intrinsic->sym->attr.optional;
5585
5586 default:
5587 gcc_unreachable ();
5588 }
5589}