]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/interface.c
Fortran: Fix testcases that violate C838, + revealed ICE
[thirdparty/gcc.git] / gcc / fortran / interface.c
CommitLineData
6de9cd9a 1/* Deal with interfaces.
99dee823 2 Copyright (C) 2000-2021 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
TK
2239 {
2240 gcc_assert (rank2 != -1);
2241 if (rank1 == 0)
2242 gfc_error_opt (0, "Rank mismatch between actual argument at %L "
2243 "and actual argument at %L (scalar and rank-%d)",
2244 where, where_formal, rank2);
2245 else if (rank2 == 0)
2246 gfc_error_opt (0, "Rank mismatch between actual argument at %L "
2247 "and actual argument at %L (rank-%d and scalar)",
2248 where, where_formal, rank1);
2249 else
2250 gfc_error_opt (0, "Rank mismatch between actual argument at %L "
92e8508e 2251 "and actual argument at %L (rank-%d and rank-%d)", where,
e0b9e5f9
TK
2252 where_formal, rank1, rank2);
2253 }
a516520c
PT
2254}
2255
2256
4a4fc7fe
TK
2257/* Under certain conditions, a scalar actual argument can be passed
2258 to an array dummy argument - see F2018, 15.5.2.4, paragraph 14.
2259 This function returns true for these conditions so that an error
2260 or warning for this can be suppressed later. Always return false
2261 for expressions with rank > 0. */
2262
2263bool
2264maybe_dummy_array_arg (gfc_expr *e)
2265{
2266 gfc_symbol *s;
2267 gfc_ref *ref;
2268 bool array_pointer = false;
2269 bool assumed_shape = false;
2270 bool scalar_ref = true;
2271
2272 if (e->rank > 0)
2273 return false;
2274
2275 if (e->ts.type == BT_CHARACTER && e->ts.kind == 1)
2276 return true;
2277
2278 /* If this comes from a constructor, it has been an array element
2279 originally. */
2280
2281 if (e->expr_type == EXPR_CONSTANT)
2282 return e->from_constructor;
2283
2284 if (e->expr_type != EXPR_VARIABLE)
2285 return false;
2286
2287 s = e->symtree->n.sym;
2288
2289 if (s->attr.dimension)
2290 {
2291 scalar_ref = false;
2292 array_pointer = s->attr.pointer;
2293 }
2294
2295 if (s->as && s->as->type == AS_ASSUMED_SHAPE)
2296 assumed_shape = true;
2297
2298 for (ref=e->ref; ref; ref=ref->next)
2299 {
2300 if (ref->type == REF_COMPONENT)
2301 {
2302 symbol_attribute *attr;
2303 attr = &ref->u.c.component->attr;
2304 if (attr->dimension)
2305 {
2306 array_pointer = attr->pointer;
2307 assumed_shape = false;
2308 scalar_ref = false;
2309 }
2310 else
2311 scalar_ref = true;
2312 }
2313 }
2314
2315 return !(scalar_ref || array_pointer || assumed_shape);
2316}
2317
6de9cd9a 2318/* Given a symbol of a formal argument list and an expression, see if
f3e1097b
JW
2319 the two are compatible as arguments. Returns true if
2320 compatible, false if not compatible. */
6de9cd9a 2321
f3e1097b 2322static bool
b251af97 2323compare_parameter (gfc_symbol *formal, gfc_expr *actual,
5ad6345e 2324 int ranks_must_agree, int is_elemental, locus *where)
6de9cd9a
DN
2325{
2326 gfc_ref *ref;
975b975b 2327 bool rank_check, is_pointer;
5c0ba546
JW
2328 char err[200];
2329 gfc_component *ppc;
fc27115d 2330 bool codimension = false;
6de9cd9a 2331
a8b3b0b6
CR
2332 /* If the formal arg has type BT_VOID, it's to one of the iso_c_binding
2333 procs c_f_pointer or c_f_procpointer, and we need to accept most
2334 pointers the user could give us. This should allow that. */
2335 if (formal->ts.type == BT_VOID)
f3e1097b 2336 return true;
a8b3b0b6
CR
2337
2338 if (formal->ts.type == BT_DERIVED
bc21d315 2339 && formal->ts.u.derived && formal->ts.u.derived->ts.is_iso_c
a8b3b0b6 2340 && actual->ts.type == BT_DERIVED
bc21d315 2341 && actual->ts.u.derived && actual->ts.u.derived->ts.is_iso_c)
f3e1097b 2342 return true;
a8b3b0b6 2343
7d58b9e7 2344 if (formal->ts.type == BT_CLASS && actual->ts.type == BT_DERIVED)
e10f52d0
JW
2345 /* Make sure the vtab symbol is present when
2346 the module variables are generated. */
7d58b9e7 2347 gfc_find_derived_vtab (actual->ts.u.derived);
e10f52d0 2348
6de9cd9a
DN
2349 if (actual->ts.type == BT_PROCEDURE)
2350 {
9b63f282 2351 gfc_symbol *act_sym = actual->symtree->n.sym;
6de9cd9a 2352
8ad15a0a
JW
2353 if (formal->attr.flavor != FL_PROCEDURE)
2354 {
2355 if (where)
2356 gfc_error ("Invalid procedure argument at %L", &actual->where);
f3e1097b 2357 return false;
8ad15a0a 2358 }
6de9cd9a 2359
889dc035 2360 if (!gfc_compare_interfaces (formal, act_sym, act_sym->name, 0, 1, err,
6f3ab30d 2361 sizeof(err), NULL, NULL))
8ad15a0a
JW
2362 {
2363 if (where)
e0b9e5f9 2364 gfc_error_opt (0, "Interface mismatch in dummy procedure %qs at %L:"
2700d0e3 2365 " %s", formal->name, &actual->where, err);
f3e1097b 2366 return false;
8ad15a0a 2367 }
5ad6345e 2368
9b63f282 2369 if (formal->attr.function && !act_sym->attr.function)
03bd096b
JW
2370 {
2371 gfc_add_function (&act_sym->attr, act_sym->name,
2372 &act_sym->declared_at);
2373 if (act_sym->ts.type == BT_UNKNOWN
524af0d6 2374 && !gfc_set_default_type (act_sym, 1, act_sym->ns))
f3e1097b 2375 return false;
03bd096b
JW
2376 }
2377 else if (formal->attr.subroutine && !act_sym->attr.subroutine)
9b63f282
JW
2378 gfc_add_subroutine (&act_sym->attr, act_sym->name,
2379 &act_sym->declared_at);
2380
f3e1097b 2381 return true;
6de9cd9a
DN
2382 }
2383
5c0ba546 2384 ppc = gfc_get_proc_ptr_comp (actual);
228eb42a 2385 if (ppc && ppc->ts.interface)
5c0ba546
JW
2386 {
2387 if (!gfc_compare_interfaces (formal, ppc->ts.interface, ppc->name, 0, 1,
2388 err, sizeof(err), NULL, NULL))
2389 {
2390 if (where)
e0b9e5f9 2391 gfc_error_opt (0, "Interface mismatch in dummy procedure %qs at %L:"
2700d0e3 2392 " %s", formal->name, &actual->where, err);
f3e1097b 2393 return false;
5c0ba546
JW
2394 }
2395 }
2396
fe4e525c
TB
2397 /* F2008, C1241. */
2398 if (formal->attr.pointer && formal->attr.contiguous
460263d0 2399 && !gfc_is_simply_contiguous (actual, true, false))
fe4e525c
TB
2400 {
2401 if (where)
c4100eae 2402 gfc_error ("Actual argument to contiguous pointer dummy %qs at %L "
62732c30 2403 "must be simply contiguous", formal->name, &actual->where);
f3e1097b 2404 return false;
fe4e525c
TB
2405 }
2406
fec5ce24
JW
2407 symbol_attribute actual_attr = gfc_expr_attr (actual);
2408 if (actual->ts.type == BT_CLASS && !actual_attr.class_ok)
f3e1097b 2409 return true;
fec5ce24 2410
90aeadcb 2411 if ((actual->expr_type != EXPR_NULL || actual->ts.type != BT_UNKNOWN)
df161b69 2412 && actual->ts.type != BT_HOLLERITH
45a69325 2413 && formal->ts.type != BT_ASSUMED
e7ac6a7c 2414 && !(formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
c49ea23d
PT
2415 && !gfc_compare_types (&formal->ts, &actual->ts)
2416 && !(formal->ts.type == BT_DERIVED && actual->ts.type == BT_CLASS
8b704316 2417 && gfc_compare_derived_types (formal->ts.u.derived,
c49ea23d 2418 CLASS_DATA (actual)->ts.u.derived)))
5ad6345e 2419 {
d68e117b 2420 if (where)
e0b9e5f9
TK
2421 {
2422 if (formal->attr.artificial)
2423 {
2424 if (!flag_allow_argument_mismatch || !formal->error)
2425 gfc_error_opt (0, "Type mismatch between actual argument at %L "
2426 "and actual argument at %L (%s/%s).",
2427 &actual->where,
2428 &formal->declared_at,
f61e54e5
ME
2429 gfc_typename (actual),
2430 gfc_dummy_typename (&formal->ts));
e0b9e5f9
TK
2431
2432 formal->error = 1;
2433 }
2434 else
2435 gfc_error_opt (0, "Type mismatch in argument %qs at %L; passed %s "
f61e54e5
ME
2436 "to %s", formal->name, where, gfc_typename (actual),
2437 gfc_dummy_typename (&formal->ts));
e0b9e5f9 2438 }
f3e1097b 2439 return false;
5ad6345e 2440 }
f18075ff 2441
3d54e576
TB
2442 if (actual->ts.type == BT_ASSUMED && formal->ts.type != BT_ASSUMED)
2443 {
2444 if (where)
2445 gfc_error ("Assumed-type actual argument at %L requires that dummy "
c4100eae 2446 "argument %qs is of assumed type", &actual->where,
3d54e576 2447 formal->name);
f3e1097b 2448 return false;
3d54e576
TB
2449 }
2450
f18075ff 2451 /* F2008, 12.5.2.5; IR F08/0073. */
67b1d004
JW
2452 if (formal->ts.type == BT_CLASS && formal->attr.class_ok
2453 && actual->expr_type != EXPR_NULL
f18075ff 2454 && ((CLASS_DATA (formal)->attr.class_pointer
86eb9e2f 2455 && formal->attr.intent != INTENT_IN)
5ac13b8e
JW
2456 || CLASS_DATA (formal)->attr.allocatable))
2457 {
2458 if (actual->ts.type != BT_CLASS)
2459 {
2460 if (where)
c4100eae 2461 gfc_error ("Actual argument to %qs at %L must be polymorphic",
5ac13b8e 2462 formal->name, &actual->where);
f3e1097b 2463 return false;
5ac13b8e 2464 }
67b1d004 2465
a8267f8d
TB
2466 if ((!UNLIMITED_POLY (formal) || !UNLIMITED_POLY(actual))
2467 && !gfc_compare_derived_types (CLASS_DATA (actual)->ts.u.derived,
2468 CLASS_DATA (formal)->ts.u.derived))
5ac13b8e
JW
2469 {
2470 if (where)
c4100eae 2471 gfc_error ("Actual argument to %qs at %L must have the same "
5ac13b8e 2472 "declared type", formal->name, &actual->where);
f3e1097b 2473 return false;
5ac13b8e
JW
2474 }
2475 }
6de9cd9a 2476
8b704316
PT
2477 /* F08: 12.5.2.5 Allocatable and pointer dummy variables. However, this
2478 is necessary also for F03, so retain error for both.
2479 NOTE: Other type/kind errors pre-empt this error. Since they are F03
2480 compatible, no attempt has been made to channel to this one. */
2481 if (UNLIMITED_POLY (formal) && !UNLIMITED_POLY (actual)
2482 && (CLASS_DATA (formal)->attr.allocatable
2483 ||CLASS_DATA (formal)->attr.class_pointer))
2484 {
2485 if (where)
c4100eae 2486 gfc_error ("Actual argument to %qs at %L must be unlimited "
8b704316
PT
2487 "polymorphic since the formal argument is a "
2488 "pointer or allocatable unlimited polymorphic "
2489 "entity [F2008: 12.5.2.5]", formal->name,
2490 &actual->where);
f3e1097b 2491 return false;
8b704316
PT
2492 }
2493
fc27115d
PT
2494 if (formal->ts.type == BT_CLASS && formal->attr.class_ok)
2495 codimension = CLASS_DATA (formal)->attr.codimension;
2496 else
2497 codimension = formal->attr.codimension;
2498
2499 if (codimension && !gfc_is_coarray (actual))
d3a9eea2 2500 {
394d3a2e 2501 if (where)
c4100eae 2502 gfc_error ("Actual argument to %qs at %L must be a coarray",
d3a9eea2 2503 formal->name, &actual->where);
f3e1097b 2504 return false;
394d3a2e 2505 }
d3a9eea2 2506
fc27115d 2507 if (codimension && formal->attr.allocatable)
394d3a2e
TB
2508 {
2509 gfc_ref *last = NULL;
a3935ffc 2510
d3a9eea2 2511 for (ref = actual->ref; ref; ref = ref->next)
394d3a2e
TB
2512 if (ref->type == REF_COMPONENT)
2513 last = ref;
d3a9eea2 2514
d3a9eea2 2515 /* F2008, 12.5.2.6. */
394d3a2e
TB
2516 if ((last && last->u.c.component->as->corank != formal->as->corank)
2517 || (!last
2518 && actual->symtree->n.sym->as->corank != formal->as->corank))
d3a9eea2
TB
2519 {
2520 if (where)
c4100eae 2521 gfc_error ("Corank mismatch in argument %qs at %L (%d and %d)",
d3a9eea2
TB
2522 formal->name, &actual->where, formal->as->corank,
2523 last ? last->u.c.component->as->corank
2524 : actual->symtree->n.sym->as->corank);
f3e1097b 2525 return false;
d3a9eea2 2526 }
394d3a2e 2527 }
fe4e525c 2528
fc27115d 2529 if (codimension)
394d3a2e 2530 {
460263d0 2531 /* F2008, 12.5.2.8 + Corrig 2 (IR F08/0048). */
8179b067 2532 /* F2018, 12.5.2.8. */
fe4e525c
TB
2533 if (formal->attr.dimension
2534 && (formal->attr.contiguous || formal->as->type != AS_ASSUMED_SHAPE)
fec5ce24 2535 && actual_attr.dimension
460263d0 2536 && !gfc_is_simply_contiguous (actual, true, true))
fe4e525c
TB
2537 {
2538 if (where)
c4100eae 2539 gfc_error ("Actual argument to %qs at %L must be simply "
460263d0
TB
2540 "contiguous or an element of such an array",
2541 formal->name, &actual->where);
f3e1097b 2542 return false;
fe4e525c 2543 }
fea54935
TB
2544
2545 /* F2008, C1303 and C1304. */
2546 if (formal->attr.intent != INTENT_INOUT
2547 && (((formal->ts.type == BT_DERIVED || formal->ts.type == BT_CLASS)
2548 && formal->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
2549 && formal->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
2550 || formal->attr.lock_comp))
2551
2552 {
2553 if (where)
c4100eae 2554 gfc_error ("Actual argument to non-INTENT(INOUT) dummy %qs at %L, "
fea54935
TB
2555 "which is LOCK_TYPE or has a LOCK_TYPE component",
2556 formal->name, &actual->where);
f3e1097b 2557 return false;
fea54935 2558 }
5df445a2
TB
2559
2560 /* TS18508, C702/C703. */
2561 if (formal->attr.intent != INTENT_INOUT
2562 && (((formal->ts.type == BT_DERIVED || formal->ts.type == BT_CLASS)
2563 && formal->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
2564 && formal->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
2565 || formal->attr.event_comp))
2566
2567 {
2568 if (where)
2569 gfc_error ("Actual argument to non-INTENT(INOUT) dummy %qs at %L, "
2570 "which is EVENT_TYPE or has a EVENT_TYPE component",
2571 formal->name, &actual->where);
f3e1097b 2572 return false;
5df445a2 2573 }
394d3a2e 2574 }
fe4e525c
TB
2575
2576 /* F2008, C1239/C1240. */
2577 if (actual->expr_type == EXPR_VARIABLE
2578 && (actual->symtree->n.sym->attr.asynchronous
2579 || actual->symtree->n.sym->attr.volatile_)
2580 && (formal->attr.asynchronous || formal->attr.volatile_)
460263d0
TB
2581 && actual->rank && formal->as
2582 && !gfc_is_simply_contiguous (actual, true, false)
f188272d
TB
2583 && ((formal->as->type != AS_ASSUMED_SHAPE
2584 && formal->as->type != AS_ASSUMED_RANK && !formal->attr.pointer)
fe4e525c
TB
2585 || formal->attr.contiguous))
2586 {
2587 if (where)
c4100eae 2588 gfc_error ("Dummy argument %qs has to be a pointer, assumed-shape or "
f188272d
TB
2589 "assumed-rank array without CONTIGUOUS attribute - as actual"
2590 " argument at %L is not simply contiguous and both are "
2591 "ASYNCHRONOUS or VOLATILE", formal->name, &actual->where);
f3e1097b 2592 return false;
d3a9eea2
TB
2593 }
2594
fc27115d 2595 if (formal->attr.allocatable && !codimension
fec5ce24 2596 && actual_attr.codimension)
427180d2
TB
2597 {
2598 if (formal->attr.intent == INTENT_OUT)
2599 {
2600 if (where)
2601 gfc_error ("Passing coarray at %L to allocatable, noncoarray, "
c4100eae 2602 "INTENT(OUT) dummy argument %qs", &actual->where,
427180d2 2603 formal->name);
f3e1097b 2604 return false;
427180d2 2605 }
73e42eef 2606 else if (warn_surprising && where && formal->attr.intent != INTENT_IN)
48749dbc
MLI
2607 gfc_warning (OPT_Wsurprising,
2608 "Passing coarray at %L to allocatable, noncoarray dummy "
2609 "argument %qs, which is invalid if the allocation status"
427180d2
TB
2610 " is modified", &actual->where, formal->name);
2611 }
2612
c62c6622
TB
2613 /* If the rank is the same or the formal argument has assumed-rank. */
2614 if (symbol_rank (formal) == actual->rank || symbol_rank (formal) == -1)
f3e1097b 2615 return true;
6de9cd9a 2616
5ad6345e
TB
2617 rank_check = where != NULL && !is_elemental && formal->as
2618 && (formal->as->type == AS_ASSUMED_SHAPE
d8a8dab3
TB
2619 || formal->as->type == AS_DEFERRED)
2620 && actual->expr_type != EXPR_NULL;
6de9cd9a 2621
e7ac6a7c
TB
2622 /* Skip rank checks for NO_ARG_CHECK. */
2623 if (formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
f3e1097b 2624 return true;
e7ac6a7c 2625
d3a9eea2 2626 /* Scalar & coindexed, see: F2008, Section 12.5.2.4. */
d8a8dab3
TB
2627 if (rank_check || ranks_must_agree
2628 || (formal->attr.pointer && actual->expr_type != EXPR_NULL)
5ad6345e 2629 || (actual->rank != 0 && !(is_elemental || formal->attr.dimension))
c49ea23d
PT
2630 || (actual->rank == 0
2631 && ((formal->ts.type == BT_CLASS
2632 && CLASS_DATA (formal)->as->type == AS_ASSUMED_SHAPE)
2633 || (formal->ts.type != BT_CLASS
2634 && formal->as->type == AS_ASSUMED_SHAPE))
08857b61 2635 && actual->expr_type != EXPR_NULL)
d3a9eea2
TB
2636 || (actual->rank == 0 && formal->attr.dimension
2637 && gfc_is_coindexed (actual)))
5ad6345e 2638 {
a5baf71b 2639 if (where
4a4fc7fe
TK
2640 && (!formal->attr.artificial || (!formal->maybe_array
2641 && !maybe_dummy_array_arg (actual))))
e0b9e5f9
TK
2642 {
2643 locus *where_formal;
2644 if (formal->attr.artificial)
2645 where_formal = &formal->declared_at;
2646 else
2647 where_formal = NULL;
2648
2649 argument_rank_mismatch (formal->name, &actual->where,
2650 symbol_rank (formal), actual->rank,
2651 where_formal);
2652 }
f3e1097b 2653 return false;
5ad6345e
TB
2654 }
2655 else if (actual->rank != 0 && (is_elemental || formal->attr.dimension))
f3e1097b 2656 return true;
5ad6345e
TB
2657
2658 /* At this point, we are considering a scalar passed to an array. This
975b975b 2659 is valid (cf. F95 12.4.1.1, F2003 12.4.1.2, and F2008 12.5.2.4),
5ad6345e 2660 - if the actual argument is (a substring of) an element of a
975b975b
TB
2661 non-assumed-shape/non-pointer/non-polymorphic array; or
2662 - (F2003) if the actual argument is of type character of default/c_char
2663 kind. */
2664
2665 is_pointer = actual->expr_type == EXPR_VARIABLE
2666 ? actual->symtree->n.sym->attr.pointer : false;
6de9cd9a
DN
2667
2668 for (ref = actual->ref; ref; ref = ref->next)
975b975b
TB
2669 {
2670 if (ref->type == REF_COMPONENT)
2671 is_pointer = ref->u.c.component->attr.pointer;
2672 else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT
2673 && ref->u.ar.dimen > 0
8b704316 2674 && (!ref->next
975b975b
TB
2675 || (ref->next->type == REF_SUBSTRING && !ref->next->next)))
2676 break;
2677 }
2678
2679 if (actual->ts.type == BT_CLASS && actual->expr_type != EXPR_NULL)
2680 {
2681 if (where)
c4100eae 2682 gfc_error ("Polymorphic scalar passed to array dummy argument %qs "
975b975b 2683 "at %L", formal->name, &actual->where);
f3e1097b 2684 return false;
975b975b
TB
2685 }
2686
2687 if (actual->expr_type != EXPR_NULL && ref && actual->ts.type != BT_CHARACTER
2688 && (is_pointer || ref->u.ar.as->type == AS_ASSUMED_SHAPE))
2689 {
2690 if (where)
4a4fc7fe
TK
2691 {
2692 if (formal->attr.artificial)
2693 gfc_error ("Element of assumed-shape or pointer array "
7260547d
TK
2694 "as actual argument at %L cannot correspond to "
2695 "actual argument at %L",
4a4fc7fe
TK
2696 &actual->where, &formal->declared_at);
2697 else
2698 gfc_error ("Element of assumed-shape or pointer "
2699 "array passed to array dummy argument %qs at %L",
2700 formal->name, &actual->where);
2701 }
f3e1097b 2702 return false;
975b975b 2703 }
6de9cd9a 2704
975b975b
TB
2705 if (actual->ts.type == BT_CHARACTER && actual->expr_type != EXPR_NULL
2706 && (!ref || is_pointer || ref->u.ar.as->type == AS_ASSUMED_SHAPE))
5ad6345e 2707 {
975b975b
TB
2708 if (formal->ts.kind != 1 && (gfc_option.allow_std & GFC_STD_GNU) == 0)
2709 {
2710 if (where)
2711 gfc_error ("Extension: Scalar non-default-kind, non-C_CHAR-kind "
2712 "CHARACTER actual argument with array dummy argument "
c4100eae 2713 "%qs at %L", formal->name, &actual->where);
f3e1097b 2714 return false;
975b975b
TB
2715 }
2716
5ad6345e
TB
2717 if (where && (gfc_option.allow_std & GFC_STD_F2003) == 0)
2718 {
2719 gfc_error ("Fortran 2003: Scalar CHARACTER actual argument with "
c4100eae 2720 "array dummy argument %qs at %L",
5ad6345e 2721 formal->name, &actual->where);
f3e1097b 2722 return false;
5ad6345e 2723 }
5ad6345e 2724 else
f3e1097b 2725 return ((gfc_option.allow_std & GFC_STD_F2003) != 0);
5ad6345e 2726 }
975b975b
TB
2727
2728 if (ref == NULL && actual->expr_type != EXPR_NULL)
5ad6345e 2729 {
a5baf71b 2730 if (where
4a4fc7fe
TK
2731 && (!formal->attr.artificial || (!formal->maybe_array
2732 && !maybe_dummy_array_arg (actual))))
e0b9e5f9
TK
2733 {
2734 locus *where_formal;
2735 if (formal->attr.artificial)
2736 where_formal = &formal->declared_at;
2737 else
2738 where_formal = NULL;
2739
2740 argument_rank_mismatch (formal->name, &actual->where,
2741 symbol_rank (formal), actual->rank,
2742 where_formal);
2743 }
f3e1097b 2744 return false;
5ad6345e
TB
2745 }
2746
f3e1097b 2747 return true;
6de9cd9a
DN
2748}
2749
2750
2d5b90b2
TB
2751/* Returns the storage size of a symbol (formal argument) or
2752 zero if it cannot be determined. */
2753
2754static unsigned long
2755get_sym_storage_size (gfc_symbol *sym)
2756{
2757 int i;
2758 unsigned long strlen, elements;
2759
2760 if (sym->ts.type == BT_CHARACTER)
2761 {
bc21d315
JW
2762 if (sym->ts.u.cl && sym->ts.u.cl->length
2763 && sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
2764 strlen = mpz_get_ui (sym->ts.u.cl->length->value.integer);
2d5b90b2
TB
2765 else
2766 return 0;
2767 }
2768 else
8b704316 2769 strlen = 1;
2d5b90b2
TB
2770
2771 if (symbol_rank (sym) == 0)
2772 return strlen;
2773
2774 elements = 1;
2775 if (sym->as->type != AS_EXPLICIT)
2776 return 0;
2777 for (i = 0; i < sym->as->rank; i++)
2778 {
efb63364 2779 if (sym->as->upper[i]->expr_type != EXPR_CONSTANT
2d5b90b2
TB
2780 || sym->as->lower[i]->expr_type != EXPR_CONSTANT)
2781 return 0;
2782
c13af44b
SK
2783 elements *= mpz_get_si (sym->as->upper[i]->value.integer)
2784 - mpz_get_si (sym->as->lower[i]->value.integer) + 1L;
2d5b90b2
TB
2785 }
2786
2787 return strlen*elements;
2788}
2789
2790
2791/* Returns the storage size of an expression (actual argument) or
2792 zero if it cannot be determined. For an array element, it returns
1207ac67 2793 the remaining size as the element sequence consists of all storage
2d5b90b2
TB
2794 units of the actual argument up to the end of the array. */
2795
2796static unsigned long
2797get_expr_storage_size (gfc_expr *e)
2798{
2799 int i;
2800 long int strlen, elements;
6da0839a 2801 long int substrlen = 0;
a0710c29 2802 bool is_str_storage = false;
2d5b90b2
TB
2803 gfc_ref *ref;
2804
2805 if (e == NULL)
2806 return 0;
8b704316 2807
2d5b90b2
TB
2808 if (e->ts.type == BT_CHARACTER)
2809 {
bc21d315
JW
2810 if (e->ts.u.cl && e->ts.u.cl->length
2811 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
2812 strlen = mpz_get_si (e->ts.u.cl->length->value.integer);
2d5b90b2 2813 else if (e->expr_type == EXPR_CONSTANT
bc21d315 2814 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
2d5b90b2
TB
2815 strlen = e->value.character.length;
2816 else
2817 return 0;
2818 }
2819 else
2820 strlen = 1; /* Length per element. */
2821
2822 if (e->rank == 0 && !e->ref)
2823 return strlen;
2824
2825 elements = 1;
2826 if (!e->ref)
2827 {
2828 if (!e->shape)
2829 return 0;
2830 for (i = 0; i < e->rank; i++)
2831 elements *= mpz_get_si (e->shape[i]);
2832 return elements*strlen;
2833 }
2834
2835 for (ref = e->ref; ref; ref = ref->next)
2836 {
6da0839a
TB
2837 if (ref->type == REF_SUBSTRING && ref->u.ss.start
2838 && ref->u.ss.start->expr_type == EXPR_CONSTANT)
2839 {
a0710c29
TB
2840 if (is_str_storage)
2841 {
2842 /* The string length is the substring length.
2843 Set now to full string length. */
e323640f 2844 if (!ref->u.ss.length || !ref->u.ss.length->length
a0710c29
TB
2845 || ref->u.ss.length->length->expr_type != EXPR_CONSTANT)
2846 return 0;
2847
2848 strlen = mpz_get_ui (ref->u.ss.length->length->value.integer);
2849 }
2850 substrlen = strlen - mpz_get_ui (ref->u.ss.start->value.integer) + 1;
6da0839a
TB
2851 continue;
2852 }
2853
efb63364 2854 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2d5b90b2
TB
2855 for (i = 0; i < ref->u.ar.dimen; i++)
2856 {
2857 long int start, end, stride;
2858 stride = 1;
37639728 2859
2d5b90b2
TB
2860 if (ref->u.ar.stride[i])
2861 {
2862 if (ref->u.ar.stride[i]->expr_type == EXPR_CONSTANT)
2863 stride = mpz_get_si (ref->u.ar.stride[i]->value.integer);
2864 else
2865 return 0;
2866 }
2867
2868 if (ref->u.ar.start[i])
2869 {
2870 if (ref->u.ar.start[i]->expr_type == EXPR_CONSTANT)
2871 start = mpz_get_si (ref->u.ar.start[i]->value.integer);
2872 else
2873 return 0;
2874 }
37639728
TB
2875 else if (ref->u.ar.as->lower[i]
2876 && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT)
2877 start = mpz_get_si (ref->u.ar.as->lower[i]->value.integer);
2878 else
2879 return 0;
2d5b90b2
TB
2880
2881 if (ref->u.ar.end[i])
2882 {
2883 if (ref->u.ar.end[i]->expr_type == EXPR_CONSTANT)
2884 end = mpz_get_si (ref->u.ar.end[i]->value.integer);
2885 else
2886 return 0;
2887 }
2888 else if (ref->u.ar.as->upper[i]
2889 && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT)
2890 end = mpz_get_si (ref->u.ar.as->upper[i]->value.integer);
2891 else
2892 return 0;
2893
2894 elements *= (end - start)/stride + 1L;
2895 }
c6423ef3 2896 else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_FULL)
2d5b90b2
TB
2897 for (i = 0; i < ref->u.ar.as->rank; i++)
2898 {
2899 if (ref->u.ar.as->lower[i] && ref->u.ar.as->upper[i]
2900 && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT
edcc76d5
SK
2901 && ref->u.ar.as->lower[i]->ts.type == BT_INTEGER
2902 && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT
2903 && ref->u.ar.as->upper[i]->ts.type == BT_INTEGER)
da9ad923
TB
2904 elements *= mpz_get_si (ref->u.ar.as->upper[i]->value.integer)
2905 - mpz_get_si (ref->u.ar.as->lower[i]->value.integer)
2d5b90b2
TB
2906 + 1L;
2907 else
2908 return 0;
2909 }
6da0839a 2910 else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT
a0710c29
TB
2911 && e->expr_type == EXPR_VARIABLE)
2912 {
93302a24 2913 if (ref->u.ar.as->type == AS_ASSUMED_SHAPE
a0710c29
TB
2914 || e->symtree->n.sym->attr.pointer)
2915 {
2916 elements = 1;
2917 continue;
2918 }
2919
2920 /* Determine the number of remaining elements in the element
2921 sequence for array element designators. */
2922 is_str_storage = true;
2923 for (i = ref->u.ar.dimen - 1; i >= 0; i--)
2924 {
2925 if (ref->u.ar.start[i] == NULL
2926 || ref->u.ar.start[i]->expr_type != EXPR_CONSTANT
2927 || ref->u.ar.as->upper[i] == NULL
2928 || ref->u.ar.as->lower[i] == NULL
2929 || ref->u.ar.as->upper[i]->expr_type != EXPR_CONSTANT
2930 || ref->u.ar.as->lower[i]->expr_type != EXPR_CONSTANT)
2931 return 0;
2932
2933 elements
2934 = elements
2935 * (mpz_get_si (ref->u.ar.as->upper[i]->value.integer)
2936 - mpz_get_si (ref->u.ar.as->lower[i]->value.integer)
2937 + 1L)
2938 - (mpz_get_si (ref->u.ar.start[i]->value.integer)
2939 - mpz_get_si (ref->u.ar.as->lower[i]->value.integer));
2940 }
2941 }
3436db75
JW
2942 else if (ref->type == REF_COMPONENT && ref->u.c.component->attr.function
2943 && ref->u.c.component->attr.proc_pointer
2944 && ref->u.c.component->attr.dimension)
2945 {
2946 /* Array-valued procedure-pointer components. */
2947 gfc_array_spec *as = ref->u.c.component->as;
2948 for (i = 0; i < as->rank; i++)
2949 {
2950 if (!as->upper[i] || !as->lower[i]
2951 || as->upper[i]->expr_type != EXPR_CONSTANT
2952 || as->lower[i]->expr_type != EXPR_CONSTANT)
2953 return 0;
2954
2955 elements = elements
2956 * (mpz_get_si (as->upper[i]->value.integer)
2957 - mpz_get_si (as->lower[i]->value.integer) + 1L);
2958 }
2959 }
2d5b90b2
TB
2960 }
2961
6da0839a 2962 if (substrlen)
a0710c29
TB
2963 return (is_str_storage) ? substrlen + (elements-1)*strlen
2964 : elements*strlen;
2965 else
2966 return elements*strlen;
2d5b90b2
TB
2967}
2968
2969
59be8071 2970/* Given an expression, check whether it is an array section
f3e1097b 2971 which has a vector subscript. */
59be8071 2972
f3e1097b 2973bool
03af1e4c 2974gfc_has_vector_subscript (gfc_expr *e)
59be8071
TB
2975{
2976 int i;
2977 gfc_ref *ref;
2978
2979 if (e == NULL || e->rank == 0 || e->expr_type != EXPR_VARIABLE)
f3e1097b 2980 return false;
59be8071
TB
2981
2982 for (ref = e->ref; ref; ref = ref->next)
2983 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2984 for (i = 0; i < ref->u.ar.dimen; i++)
2985 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
f3e1097b 2986 return true;
59be8071 2987
f3e1097b 2988 return false;
59be8071
TB
2989}
2990
2991
4294c093
JW
2992static bool
2993is_procptr_result (gfc_expr *expr)
2994{
2995 gfc_component *c = gfc_get_proc_ptr_comp (expr);
2996 if (c)
2997 return (c->ts.interface && (c->ts.interface->attr.proc_pointer == 1));
2998 else
2999 return ((expr->symtree->n.sym->result != expr->symtree->n.sym)
3000 && (expr->symtree->n.sym->result->attr.proc_pointer == 1));
3001}
3002
3003
bcc478b9
BRF
3004/* Recursively append candidate argument ARG to CANDIDATES. Store the
3005 number of total candidates in CANDIDATES_LEN. */
3006
3007static void
3008lookup_arg_fuzzy_find_candidates (gfc_formal_arglist *arg,
3009 char **&candidates,
3010 size_t &candidates_len)
3011{
3012 for (gfc_formal_arglist *p = arg; p && p->sym; p = p->next)
3013 vec_push (candidates, candidates_len, p->sym->name);
3014}
3015
3016
3017/* Lookup argument ARG fuzzily, taking names in ARGUMENTS into account. */
3018
3019static const char*
3020lookup_arg_fuzzy (const char *arg, gfc_formal_arglist *arguments)
3021{
3022 char **candidates = NULL;
3023 size_t candidates_len = 0;
3024 lookup_arg_fuzzy_find_candidates (arguments, candidates, candidates_len);
3025 return gfc_closest_fuzzy_match (arg, candidates);
3026}
3027
3028
6de9cd9a
DN
3029/* Given formal and actual argument lists, see if they are compatible.
3030 If they are compatible, the actual argument list is sorted to
3031 correspond with the formal list, and elements for missing optional
3032 arguments are inserted. If WHERE pointer is nonnull, then we issue
3033 errors when things don't match instead of just returning the status
3034 code. */
3035
e68a35ae
TK
3036bool
3037gfc_compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
3038 int ranks_must_agree, int is_elemental,
3039 bool in_statement_function, locus *where)
6de9cd9a 3040{
fab27f52 3041 gfc_actual_arglist **new_arg, *a, *actual;
6de9cd9a
DN
3042 gfc_formal_arglist *f;
3043 int i, n, na;
2d5b90b2 3044 unsigned long actual_size, formal_size;
c49ea23d 3045 bool full_array = false;
eb401400 3046 gfc_array_ref *actual_arr_ref;
6de9cd9a
DN
3047
3048 actual = *ap;
3049
3050 if (actual == NULL && formal == NULL)
f3e1097b 3051 return true;
6de9cd9a
DN
3052
3053 n = 0;
3054 for (f = formal; f; f = f->next)
3055 n++;
3056
1145e690 3057 new_arg = XALLOCAVEC (gfc_actual_arglist *, n);
6de9cd9a
DN
3058
3059 for (i = 0; i < n; i++)
7b901ac4 3060 new_arg[i] = NULL;
6de9cd9a
DN
3061
3062 na = 0;
3063 f = formal;
3064 i = 0;
3065
3066 for (a = actual; a; a = a->next, f = f->next)
3067 {
3453b6aa
SK
3068 if (a->name != NULL && in_statement_function)
3069 {
3070 gfc_error ("Keyword argument %qs at %L is invalid in "
3071 "a statement function", a->name, &a->expr->where);
3072 return false;
3073 }
3074
7fcafa71
PT
3075 /* Look for keywords but ignore g77 extensions like %VAL. */
3076 if (a->name != NULL && a->name[0] != '%')
6de9cd9a
DN
3077 {
3078 i = 0;
3079 for (f = formal; f; f = f->next, i++)
3080 {
3081 if (f->sym == NULL)
3082 continue;
3083 if (strcmp (f->sym->name, a->name) == 0)
3084 break;
3085 }
3086
3087 if (f == NULL)
3088 {
3089 if (where)
bcc478b9
BRF
3090 {
3091 const char *guessed = lookup_arg_fuzzy (a->name, formal);
3092 if (guessed)
3093 gfc_error ("Keyword argument %qs at %L is not in "
3094 "the procedure; did you mean %qs?",
3095 a->name, &a->expr->where, guessed);
3096 else
3097 gfc_error ("Keyword argument %qs at %L is not in "
3098 "the procedure", a->name, &a->expr->where);
3099 }
f3e1097b 3100 return false;
6de9cd9a
DN
3101 }
3102
7b901ac4 3103 if (new_arg[i] != NULL)
6de9cd9a
DN
3104 {
3105 if (where)
c4100eae 3106 gfc_error ("Keyword argument %qs at %L is already associated "
b251af97
SK
3107 "with another actual argument", a->name,
3108 &a->expr->where);
f3e1097b 3109 return false;
6de9cd9a
DN
3110 }
3111 }
3112
3113 if (f == NULL)
3114 {
3115 if (where)
b251af97
SK
3116 gfc_error ("More actual than formal arguments in procedure "
3117 "call at %L", where);
6de9cd9a 3118
f3e1097b 3119 return false;
6de9cd9a
DN
3120 }
3121
3122 if (f->sym == NULL && a->expr == NULL)
3123 goto match;
3124
3125 if (f->sym == NULL)
3126 {
866664a3
TK
3127 /* These errors have to be issued, otherwise an ICE can occur.
3128 See PR 78865. */
6de9cd9a 3129 if (where)
866664a3
TK
3130 gfc_error_now ("Missing alternate return specifier in subroutine "
3131 "call at %L", where);
f3e1097b 3132 return false;
6de9cd9a
DN
3133 }
3134
3135 if (a->expr == NULL)
3136 {
fb078366
TK
3137 if (f->sym->attr.optional)
3138 continue;
3139 else
3140 {
3141 if (where)
3142 gfc_error_now ("Unexpected alternate return specifier in "
3143 "subroutine call at %L", where);
3144 return false;
3145 }
6de9cd9a 3146 }
08857b61 3147
8b704316
PT
3148 /* Make sure that intrinsic vtables exist for calls to unlimited
3149 polymorphic formal arguments. */
524af0d6 3150 if (UNLIMITED_POLY (f->sym)
8b704316 3151 && a->expr->ts.type != BT_DERIVED
15e5858f
TK
3152 && a->expr->ts.type != BT_CLASS
3153 && a->expr->ts.type != BT_ASSUMED)
7289d1c9 3154 gfc_find_vtab (&a->expr->ts);
8b704316 3155
99091b70
TB
3156 if (a->expr->expr_type == EXPR_NULL
3157 && ((f->sym->ts.type != BT_CLASS && !f->sym->attr.pointer
3158 && (f->sym->attr.allocatable || !f->sym->attr.optional
3159 || (gfc_option.allow_std & GFC_STD_F2008) == 0))
3160 || (f->sym->ts.type == BT_CLASS
3161 && !CLASS_DATA (f->sym)->attr.class_pointer
3162 && (CLASS_DATA (f->sym)->attr.allocatable
3163 || !f->sym->attr.optional
3164 || (gfc_option.allow_std & GFC_STD_F2008) == 0))))
08857b61 3165 {
99091b70
TB
3166 if (where
3167 && (!f->sym->attr.optional
3168 || (f->sym->ts.type != BT_CLASS && f->sym->attr.allocatable)
3169 || (f->sym->ts.type == BT_CLASS
3170 && CLASS_DATA (f->sym)->attr.allocatable)))
c4100eae 3171 gfc_error ("Unexpected NULL() intrinsic at %L to dummy %qs",
08857b61
TB
3172 where, f->sym->name);
3173 else if (where)
3174 gfc_error ("Fortran 2008: Null pointer at %L to non-pointer "
c4100eae 3175 "dummy %qs", where, f->sym->name);
08857b61 3176
f3e1097b 3177 return false;
08857b61 3178 }
8b704316 3179
5ad6345e
TB
3180 if (!compare_parameter (f->sym, a->expr, ranks_must_agree,
3181 is_elemental, where))
f3e1097b 3182 return false;
6de9cd9a 3183
45a69325
TB
3184 /* TS 29113, 6.3p2. */
3185 if (f->sym->ts.type == BT_ASSUMED
3186 && (a->expr->ts.type == BT_DERIVED
3187 || (a->expr->ts.type == BT_CLASS && CLASS_DATA (a->expr))))
3188 {
3189 gfc_namespace *f2k_derived;
3190
3191 f2k_derived = a->expr->ts.type == BT_DERIVED
3192 ? a->expr->ts.u.derived->f2k_derived
3193 : CLASS_DATA (a->expr)->ts.u.derived->f2k_derived;
3194
3195 if (f2k_derived
3196 && (f2k_derived->finalizers || f2k_derived->tb_sym_root))
3197 {
3198 gfc_error ("Actual argument at %L to assumed-type dummy is of "
3199 "derived type with type-bound or FINAL procedures",
3200 &a->expr->where);
524af0d6 3201 return false;
45a69325
TB
3202 }
3203 }
3204
a0710c29
TB
3205 /* Special case for character arguments. For allocatable, pointer
3206 and assumed-shape dummies, the string length needs to match
3207 exactly. */
2d5b90b2 3208 if (a->expr->ts.type == BT_CHARACTER
eb401400
AV
3209 && a->expr->ts.u.cl && a->expr->ts.u.cl->length
3210 && a->expr->ts.u.cl->length->expr_type == EXPR_CONSTANT
3211 && f->sym->ts.type == BT_CHARACTER && f->sym->ts.u.cl
3212 && f->sym->ts.u.cl->length
3213 && f->sym->ts.u.cl->length->expr_type == EXPR_CONSTANT
3214 && (f->sym->attr.pointer || f->sym->attr.allocatable
3215 || (f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
3216 && (mpz_cmp (a->expr->ts.u.cl->length->value.integer,
3217 f->sym->ts.u.cl->length->value.integer) != 0))
3218 {
3219 if (where && (f->sym->attr.pointer || f->sym->attr.allocatable))
e0b9e5f9 3220 gfc_warning (0, "Character length mismatch (%ld/%ld) between actual "
eb401400
AV
3221 "argument and pointer or allocatable dummy argument "
3222 "%qs at %L",
3223 mpz_get_si (a->expr->ts.u.cl->length->value.integer),
3224 mpz_get_si (f->sym->ts.u.cl->length->value.integer),
3225 f->sym->name, &a->expr->where);
3226 else if (where)
e0b9e5f9 3227 gfc_warning (0, "Character length mismatch (%ld/%ld) between actual "
eb401400
AV
3228 "argument and assumed-shape dummy argument %qs "
3229 "at %L",
3230 mpz_get_si (a->expr->ts.u.cl->length->value.integer),
3231 mpz_get_si (f->sym->ts.u.cl->length->value.integer),
3232 f->sym->name, &a->expr->where);
f3e1097b 3233 return false;
eb401400 3234 }
a0324f7b 3235
8d51f26f 3236 if ((f->sym->attr.pointer || f->sym->attr.allocatable)
eb401400
AV
3237 && f->sym->ts.deferred != a->expr->ts.deferred
3238 && a->expr->ts.type == BT_CHARACTER)
8d51f26f
PT
3239 {
3240 if (where)
0c133211 3241 gfc_error ("Actual argument at %L to allocatable or "
c4100eae 3242 "pointer dummy argument %qs must have a deferred "
8d51f26f
PT
3243 "length type parameter if and only if the dummy has one",
3244 &a->expr->where, f->sym->name);
f3e1097b 3245 return false;
8d51f26f
PT
3246 }
3247
c49ea23d
PT
3248 if (f->sym->ts.type == BT_CLASS)
3249 goto skip_size_check;
3250
37639728
TB
3251 actual_size = get_expr_storage_size (a->expr);
3252 formal_size = get_sym_storage_size (f->sym);
93302a24
JW
3253 if (actual_size != 0 && actual_size < formal_size
3254 && a->expr->ts.type != BT_PROCEDURE
3255 && f->sym->attr.flavor != FL_PROCEDURE)
2d5b90b2
TB
3256 {
3257 if (a->expr->ts.type == BT_CHARACTER && !f->sym->as && where)
a8b79cc9
HA
3258 {
3259 gfc_warning (0, "Character length of actual argument shorter "
3260 "than of dummy argument %qs (%lu/%lu) at %L",
3261 f->sym->name, actual_size, formal_size,
3262 &a->expr->where);
3263 goto skip_size_check;
3264 }
2d5b90b2 3265 else if (where)
37d92a7e
DH
3266 {
3267 /* Emit a warning for -std=legacy and an error otherwise. */
3268 if (gfc_option.warn_std == 0)
e0b9e5f9 3269 gfc_warning (0, "Actual argument contains too few "
37d92a7e
DH
3270 "elements for dummy argument %qs (%lu/%lu) "
3271 "at %L", f->sym->name, actual_size,
3272 formal_size, &a->expr->where);
3273 else
3274 gfc_error_now ("Actual argument contains too few "
3275 "elements for dummy argument %qs (%lu/%lu) "
3276 "at %L", f->sym->name, actual_size,
3277 formal_size, &a->expr->where);
3278 }
f3e1097b 3279 return false;
2d5b90b2
TB
3280 }
3281
c49ea23d
PT
3282 skip_size_check:
3283
e9355cc3
JW
3284 /* Satisfy F03:12.4.1.3 by ensuring that a procedure pointer actual
3285 argument is provided for a procedure pointer formal argument. */
8fb74da4 3286 if (f->sym->attr.proc_pointer
a7c0b11d 3287 && !((a->expr->expr_type == EXPR_VARIABLE
4294c093
JW
3288 && (a->expr->symtree->n.sym->attr.proc_pointer
3289 || gfc_is_proc_ptr_comp (a->expr)))
a7c0b11d 3290 || (a->expr->expr_type == EXPR_FUNCTION
4294c093 3291 && is_procptr_result (a->expr))))
8fb74da4
JW
3292 {
3293 if (where)
c4100eae 3294 gfc_error ("Expected a procedure pointer for argument %qs at %L",
8fb74da4 3295 f->sym->name, &a->expr->where);
f3e1097b 3296 return false;
8fb74da4
JW
3297 }
3298
e9355cc3 3299 /* Satisfy F03:12.4.1.3 by ensuring that a procedure actual argument is
699fa7aa 3300 provided for a procedure formal argument. */
e9355cc3 3301 if (f->sym->attr.flavor == FL_PROCEDURE
4294c093
JW
3302 && !((a->expr->expr_type == EXPR_VARIABLE
3303 && (a->expr->symtree->n.sym->attr.flavor == FL_PROCEDURE
3304 || a->expr->symtree->n.sym->attr.proc_pointer
3305 || gfc_is_proc_ptr_comp (a->expr)))
3306 || (a->expr->expr_type == EXPR_FUNCTION
3307 && is_procptr_result (a->expr))))
699fa7aa 3308 {
9914f8cf 3309 if (where)
c4100eae 3310 gfc_error ("Expected a procedure for argument %qs at %L",
9914f8cf 3311 f->sym->name, &a->expr->where);
f3e1097b 3312 return false;
699fa7aa
PT
3313 }
3314
8e1be7ef
JRFS
3315 if (f->sym->as
3316 && (f->sym->as->type == AS_ASSUMED_SHAPE
3317 || f->sym->as->type == AS_DEFERRED
3318 || (f->sym->as->type == AS_ASSUMED_RANK && f->sym->attr.pointer))
bf9d2177
JJ
3319 && a->expr->expr_type == EXPR_VARIABLE
3320 && a->expr->symtree->n.sym->as
3321 && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SIZE
3322 && (a->expr->ref == NULL
3323 || (a->expr->ref->type == REF_ARRAY
3324 && a->expr->ref->u.ar.type == AR_FULL)))
3325 {
3326 if (where)
c4100eae 3327 gfc_error ("Actual argument for %qs cannot be an assumed-size"
bf9d2177 3328 " array at %L", f->sym->name, where);
f3e1097b 3329 return false;
bf9d2177
JJ
3330 }
3331
1600fe22
TS
3332 if (a->expr->expr_type != EXPR_NULL
3333 && compare_pointer (f->sym, a->expr) == 0)
6de9cd9a
DN
3334 {
3335 if (where)
c4100eae 3336 gfc_error ("Actual argument for %qs must be a pointer at %L",
6de9cd9a 3337 f->sym->name, &a->expr->where);
f3e1097b 3338 return false;
6de9cd9a
DN
3339 }
3340
7d54ef80
TB
3341 if (a->expr->expr_type != EXPR_NULL
3342 && (gfc_option.allow_std & GFC_STD_F2008) == 0
3343 && compare_pointer (f->sym, a->expr) == 2)
3344 {
3345 if (where)
3346 gfc_error ("Fortran 2008: Non-pointer actual argument at %L to "
c4100eae 3347 "pointer dummy %qs", &a->expr->where,f->sym->name);
f3e1097b 3348 return false;
7d54ef80 3349 }
8b704316 3350
7d54ef80 3351
d3a9eea2
TB
3352 /* Fortran 2008, C1242. */
3353 if (f->sym->attr.pointer && gfc_is_coindexed (a->expr))
3354 {
3355 if (where)
3356 gfc_error ("Coindexed actual argument at %L to pointer "
c4100eae 3357 "dummy %qs",
d3a9eea2 3358 &a->expr->where, f->sym->name);
f3e1097b 3359 return false;
d3a9eea2
TB
3360 }
3361
3362 /* Fortran 2008, 12.5.2.5 (no constraint). */
3363 if (a->expr->expr_type == EXPR_VARIABLE
3364 && f->sym->attr.intent != INTENT_IN
3365 && f->sym->attr.allocatable
3366 && gfc_is_coindexed (a->expr))
3367 {
3368 if (where)
3369 gfc_error ("Coindexed actual argument at %L to allocatable "
c4100eae 3370 "dummy %qs requires INTENT(IN)",
d3a9eea2 3371 &a->expr->where, f->sym->name);
f3e1097b 3372 return false;
d3a9eea2
TB
3373 }
3374
3375 /* Fortran 2008, C1237. */
3376 if (a->expr->expr_type == EXPR_VARIABLE
3377 && (f->sym->attr.asynchronous || f->sym->attr.volatile_)
3378 && gfc_is_coindexed (a->expr)
3379 && (a->expr->symtree->n.sym->attr.volatile_
3380 || a->expr->symtree->n.sym->attr.asynchronous))
3381 {
3382 if (where)
3383 gfc_error ("Coindexed ASYNCHRONOUS or VOLATILE actual argument at "
c4100eae 3384 "%L requires that dummy %qs has neither "
d3a9eea2
TB
3385 "ASYNCHRONOUS nor VOLATILE", &a->expr->where,
3386 f->sym->name);
f3e1097b 3387 return false;
d3a9eea2
TB
3388 }
3389
3390 /* Fortran 2008, 12.5.2.4 (no constraint). */
3391 if (a->expr->expr_type == EXPR_VARIABLE
3392 && f->sym->attr.intent != INTENT_IN && !f->sym->attr.value
3393 && gfc_is_coindexed (a->expr)
3394 && gfc_has_ultimate_allocatable (a->expr))
3395 {
3396 if (where)
3397 gfc_error ("Coindexed actual argument at %L with allocatable "
c4100eae 3398 "ultimate component to dummy %qs requires either VALUE "
d3a9eea2 3399 "or INTENT(IN)", &a->expr->where, f->sym->name);
f3e1097b 3400 return false;
d3a9eea2
TB
3401 }
3402
c49ea23d
PT
3403 if (f->sym->ts.type == BT_CLASS
3404 && CLASS_DATA (f->sym)->attr.allocatable
3405 && gfc_is_class_array_ref (a->expr, &full_array)
3406 && !full_array)
3407 {
3408 if (where)
c4100eae 3409 gfc_error ("Actual CLASS array argument for %qs must be a full "
c49ea23d 3410 "array at %L", f->sym->name, &a->expr->where);
f3e1097b 3411 return false;
c49ea23d
PT
3412 }
3413
3414
aa08038d 3415 if (a->expr->expr_type != EXPR_NULL
f3e1097b 3416 && !compare_allocatable (f->sym, a->expr))
aa08038d
EE
3417 {
3418 if (where)
c4100eae 3419 gfc_error ("Actual argument for %qs must be ALLOCATABLE at %L",
aa08038d 3420 f->sym->name, &a->expr->where);
f3e1097b 3421 return false;
aa08038d
EE
3422 }
3423
a920e94a 3424 /* Check intent = OUT/INOUT for definable actual argument. */
f3883269
SK
3425 if (!in_statement_function
3426 && (f->sym->attr.intent == INTENT_OUT
3427 || f->sym->attr.intent == INTENT_INOUT))
a920e94a 3428 {
8c91ab34
DK
3429 const char* context = (where
3430 ? _("actual argument to INTENT = OUT/INOUT")
3431 : NULL);
a920e94a 3432
bcb4ad36
TB
3433 if (((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3434 && CLASS_DATA (f->sym)->attr.class_pointer)
3435 || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
524af0d6 3436 && !gfc_check_vardef_context (a->expr, true, false, false, context))
f3e1097b 3437 return false;
524af0d6 3438 if (!gfc_check_vardef_context (a->expr, false, false, false, context))
f3e1097b 3439 return false;
ee7e677f
TB
3440 }
3441
59be8071
TB
3442 if ((f->sym->attr.intent == INTENT_OUT
3443 || f->sym->attr.intent == INTENT_INOUT
84efddb2
DF
3444 || f->sym->attr.volatile_
3445 || f->sym->attr.asynchronous)
03af1e4c 3446 && gfc_has_vector_subscript (a->expr))
59be8071
TB
3447 {
3448 if (where)
84efddb2
DF
3449 gfc_error ("Array-section actual argument with vector "
3450 "subscripts at %L is incompatible with INTENT(OUT), "
3451 "INTENT(INOUT), VOLATILE or ASYNCHRONOUS attribute "
c4100eae 3452 "of the dummy argument %qs",
59be8071 3453 &a->expr->where, f->sym->name);
f3e1097b 3454 return false;
59be8071
TB
3455 }
3456
9bce3c1c
TB
3457 /* C1232 (R1221) For an actual argument which is an array section or
3458 an assumed-shape array, the dummy argument shall be an assumed-
3459 shape array, if the dummy argument has the VOLATILE attribute. */
3460
3461 if (f->sym->attr.volatile_
271dd55c 3462 && a->expr->expr_type == EXPR_VARIABLE
9bce3c1c
TB
3463 && a->expr->symtree->n.sym->as
3464 && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SHAPE
3465 && !(f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
3466 {
3467 if (where)
3468 gfc_error ("Assumed-shape actual argument at %L is "
3469 "incompatible with the non-assumed-shape "
c4100eae 3470 "dummy argument %qs due to VOLATILE attribute",
9bce3c1c 3471 &a->expr->where,f->sym->name);
f3e1097b 3472 return false;
9bce3c1c
TB
3473 }
3474
eb401400
AV
3475 /* Find the last array_ref. */
3476 actual_arr_ref = NULL;
3477 if (a->expr->ref)
3478 actual_arr_ref = gfc_find_array_ref (a->expr, true);
3479
9bce3c1c 3480 if (f->sym->attr.volatile_
eb401400 3481 && actual_arr_ref && actual_arr_ref->type == AR_SECTION
9bce3c1c
TB
3482 && !(f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
3483 {
3484 if (where)
3485 gfc_error ("Array-section actual argument at %L is "
3486 "incompatible with the non-assumed-shape "
c4100eae 3487 "dummy argument %qs due to VOLATILE attribute",
eb401400 3488 &a->expr->where, f->sym->name);
f3e1097b 3489 return false;
9bce3c1c
TB
3490 }
3491
3492 /* C1233 (R1221) For an actual argument which is a pointer array, the
3493 dummy argument shall be an assumed-shape or pointer array, if the
3494 dummy argument has the VOLATILE attribute. */
3495
3496 if (f->sym->attr.volatile_
271dd55c 3497 && a->expr->expr_type == EXPR_VARIABLE
9bce3c1c
TB
3498 && a->expr->symtree->n.sym->attr.pointer
3499 && a->expr->symtree->n.sym->as
3500 && !(f->sym->as
3501 && (f->sym->as->type == AS_ASSUMED_SHAPE
3502 || f->sym->attr.pointer)))
3503 {
3504 if (where)
3505 gfc_error ("Pointer-array actual argument at %L requires "
3506 "an assumed-shape or pointer-array dummy "
c4100eae 3507 "argument %qs due to VOLATILE attribute",
9bce3c1c 3508 &a->expr->where,f->sym->name);
f3e1097b 3509 return false;
9bce3c1c
TB
3510 }
3511
6de9cd9a
DN
3512 match:
3513 if (a == actual)
3514 na = i;
3515
7b901ac4 3516 new_arg[i++] = a;
6de9cd9a
DN
3517 }
3518
3519 /* Make sure missing actual arguments are optional. */
3520 i = 0;
3521 for (f = formal; f; f = f->next, i++)
3522 {
7b901ac4 3523 if (new_arg[i] != NULL)
6de9cd9a 3524 continue;
3ab7b3de
BM
3525 if (f->sym == NULL)
3526 {
3527 if (where)
b251af97
SK
3528 gfc_error ("Missing alternate return spec in subroutine call "
3529 "at %L", where);
f3e1097b 3530 return false;
3ab7b3de 3531 }
f3883269
SK
3532 if (!f->sym->attr.optional
3533 || (in_statement_function && f->sym->attr.optional))
6de9cd9a
DN
3534 {
3535 if (where)
c4100eae 3536 gfc_error ("Missing actual argument for argument %qs at %L",
6de9cd9a 3537 f->sym->name, where);
f3e1097b 3538 return false;
6de9cd9a
DN
3539 }
3540 }
3541
a85e5696
SL
3542 /* We should have handled the cases where the formal arglist is null
3543 already. */
3544 gcc_assert (n > 0);
3545
6de9cd9a
DN
3546 /* The argument lists are compatible. We now relink a new actual
3547 argument list with null arguments in the right places. The head
3548 of the list remains the head. */
3549 for (i = 0; i < n; i++)
7b901ac4
KG
3550 if (new_arg[i] == NULL)
3551 new_arg[i] = gfc_get_actual_arglist ();
6de9cd9a
DN
3552
3553 if (na != 0)
3554 {
fab27f52
MM
3555 std::swap (*new_arg[0], *actual);
3556 std::swap (new_arg[0], new_arg[na]);
6de9cd9a
DN
3557 }
3558
3559 for (i = 0; i < n - 1; i++)
7b901ac4 3560 new_arg[i]->next = new_arg[i + 1];
6de9cd9a 3561
7b901ac4 3562 new_arg[i]->next = NULL;
6de9cd9a
DN
3563
3564 if (*ap == NULL && n > 0)
7b901ac4 3565 *ap = new_arg[0];
6de9cd9a 3566
1600fe22 3567 /* Note the types of omitted optional arguments. */
b5ca4fd2 3568 for (a = *ap, f = formal; a; a = a->next, f = f->next)
1600fe22
TS
3569 if (a->expr == NULL && a->label == NULL)
3570 a->missing_arg_type = f->sym->ts.type;
3571
f3e1097b 3572 return true;
6de9cd9a
DN
3573}
3574
3575
3576typedef struct
3577{
3578 gfc_formal_arglist *f;
3579 gfc_actual_arglist *a;
3580}
3581argpair;
3582
3583/* qsort comparison function for argument pairs, with the following
3584 order:
3585 - p->a->expr == NULL
3586 - p->a->expr->expr_type != EXPR_VARIABLE
c5014982 3587 - by gfc_symbol pointer value (larger first). */
6de9cd9a
DN
3588
3589static int
3590pair_cmp (const void *p1, const void *p2)
3591{
3592 const gfc_actual_arglist *a1, *a2;
3593
3594 /* *p1 and *p2 are elements of the to-be-sorted array. */
3595 a1 = ((const argpair *) p1)->a;
3596 a2 = ((const argpair *) p2)->a;
3597 if (!a1->expr)
3598 {
3599 if (!a2->expr)
3600 return 0;
3601 return -1;
3602 }
3603 if (!a2->expr)
3604 return 1;
3605 if (a1->expr->expr_type != EXPR_VARIABLE)
3606 {
3607 if (a2->expr->expr_type != EXPR_VARIABLE)
3608 return 0;
3609 return -1;
3610 }
3611 if (a2->expr->expr_type != EXPR_VARIABLE)
3612 return 1;
c5014982
AM
3613 if (a1->expr->symtree->n.sym > a2->expr->symtree->n.sym)
3614 return -1;
6de9cd9a
DN
3615 return a1->expr->symtree->n.sym < a2->expr->symtree->n.sym;
3616}
3617
3618
3619/* Given two expressions from some actual arguments, test whether they
3620 refer to the same expression. The analysis is conservative.
524af0d6 3621 Returning false will produce no warning. */
6de9cd9a 3622
524af0d6 3623static bool
b251af97 3624compare_actual_expr (gfc_expr *e1, gfc_expr *e2)
6de9cd9a
DN
3625{
3626 const gfc_ref *r1, *r2;
3627
3628 if (!e1 || !e2
3629 || e1->expr_type != EXPR_VARIABLE
3630 || e2->expr_type != EXPR_VARIABLE
3631 || e1->symtree->n.sym != e2->symtree->n.sym)
524af0d6 3632 return false;
6de9cd9a
DN
3633
3634 /* TODO: improve comparison, see expr.c:show_ref(). */
3635 for (r1 = e1->ref, r2 = e2->ref; r1 && r2; r1 = r1->next, r2 = r2->next)
3636 {
3637 if (r1->type != r2->type)
524af0d6 3638 return false;
6de9cd9a
DN
3639 switch (r1->type)
3640 {
3641 case REF_ARRAY:
3642 if (r1->u.ar.type != r2->u.ar.type)
524af0d6 3643 return false;
6de9cd9a
DN
3644 /* TODO: At the moment, consider only full arrays;
3645 we could do better. */
3646 if (r1->u.ar.type != AR_FULL || r2->u.ar.type != AR_FULL)
524af0d6 3647 return false;
6de9cd9a
DN
3648 break;
3649
3650 case REF_COMPONENT:
3651 if (r1->u.c.component != r2->u.c.component)
524af0d6 3652 return false;
6de9cd9a
DN
3653 break;
3654
3655 case REF_SUBSTRING:
524af0d6 3656 return false;
6de9cd9a 3657
f16be16d
SK
3658 case REF_INQUIRY:
3659 if (e1->symtree->n.sym->ts.type == BT_COMPLEX
3660 && e1->ts.type == BT_REAL && e2->ts.type == BT_REAL
3661 && r1->u.i != r2->u.i)
3662 return false;
3663 break;
3664
6de9cd9a
DN
3665 default:
3666 gfc_internal_error ("compare_actual_expr(): Bad component code");
3667 }
3668 }
3669 if (!r1 && !r2)
524af0d6
JB
3670 return true;
3671 return false;
6de9cd9a
DN
3672}
3673
b251af97 3674
6de9cd9a
DN
3675/* Given formal and actual argument lists that correspond to one
3676 another, check that identical actual arguments aren't not
3677 associated with some incompatible INTENTs. */
3678
524af0d6 3679static bool
b251af97 3680check_some_aliasing (gfc_formal_arglist *f, gfc_actual_arglist *a)
6de9cd9a
DN
3681{
3682 sym_intent f1_intent, f2_intent;
3683 gfc_formal_arglist *f1;
3684 gfc_actual_arglist *a1;
3685 size_t n, i, j;
3686 argpair *p;
524af0d6 3687 bool t = true;
6de9cd9a
DN
3688
3689 n = 0;
3690 for (f1 = f, a1 = a;; f1 = f1->next, a1 = a1->next)
3691 {
3692 if (f1 == NULL && a1 == NULL)
3693 break;
3694 if (f1 == NULL || a1 == NULL)
3695 gfc_internal_error ("check_some_aliasing(): List mismatch");
3696 n++;
3697 }
3698 if (n == 0)
3699 return t;
1145e690 3700 p = XALLOCAVEC (argpair, n);
6de9cd9a
DN
3701
3702 for (i = 0, f1 = f, a1 = a; i < n; i++, f1 = f1->next, a1 = a1->next)
3703 {
3704 p[i].f = f1;
3705 p[i].a = a1;
3706 }
3707
3708 qsort (p, n, sizeof (argpair), pair_cmp);
3709
3710 for (i = 0; i < n; i++)
3711 {
3712 if (!p[i].a->expr
3713 || p[i].a->expr->expr_type != EXPR_VARIABLE
3714 || p[i].a->expr->ts.type == BT_PROCEDURE)
3715 continue;
3716 f1_intent = p[i].f->sym->attr.intent;
3717 for (j = i + 1; j < n; j++)
3718 {
3719 /* Expected order after the sort. */
3720 if (!p[j].a->expr || p[j].a->expr->expr_type != EXPR_VARIABLE)
3721 gfc_internal_error ("check_some_aliasing(): corrupted data");
3722
3723 /* Are the expression the same? */
524af0d6 3724 if (!compare_actual_expr (p[i].a->expr, p[j].a->expr))
6de9cd9a
DN
3725 break;
3726 f2_intent = p[j].f->sym->attr.intent;
3727 if ((f1_intent == INTENT_IN && f2_intent == INTENT_OUT)
9f1930be
TB
3728 || (f1_intent == INTENT_OUT && f2_intent == INTENT_IN)
3729 || (f1_intent == INTENT_OUT && f2_intent == INTENT_OUT))
6de9cd9a 3730 {
db30e21c 3731 gfc_warning (0, "Same actual argument associated with INTENT(%s) "
48749dbc 3732 "argument %qs and INTENT(%s) argument %qs at %L",
6de9cd9a
DN
3733 gfc_intent_string (f1_intent), p[i].f->sym->name,
3734 gfc_intent_string (f2_intent), p[j].f->sym->name,
3735 &p[i].a->expr->where);
524af0d6 3736 t = false;
6de9cd9a
DN
3737 }
3738 }
3739 }
3740
3741 return t;
3742}
3743
3744
3745/* Given formal and actual argument lists that correspond to one
3746 another, check that they are compatible in the sense that intents
3747 are not mismatched. */
3748
524af0d6 3749static bool
b251af97 3750check_intents (gfc_formal_arglist *f, gfc_actual_arglist *a)
6de9cd9a 3751{
f17facac 3752 sym_intent f_intent;
6de9cd9a
DN
3753
3754 for (;; f = f->next, a = a->next)
3755 {
99c39534
TB
3756 gfc_expr *expr;
3757
6de9cd9a
DN
3758 if (f == NULL && a == NULL)
3759 break;
3760 if (f == NULL || a == NULL)
3761 gfc_internal_error ("check_intents(): List mismatch");
3762
99c39534
TB
3763 if (a->expr && a->expr->expr_type == EXPR_FUNCTION
3764 && a->expr->value.function.isym
3765 && a->expr->value.function.isym->id == GFC_ISYM_CAF_GET)
3766 expr = a->expr->value.function.actual->expr;
3767 else
3768 expr = a->expr;
3769
3770 if (expr == NULL || expr->expr_type != EXPR_VARIABLE)
6de9cd9a
DN
3771 continue;
3772
6de9cd9a
DN
3773 f_intent = f->sym->attr.intent;
3774
99c39534 3775 if (gfc_pure (NULL) && gfc_impure_variable (expr->symtree->n.sym))
6de9cd9a 3776 {
bcb4ad36
TB
3777 if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3778 && CLASS_DATA (f->sym)->attr.class_pointer)
3779 || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
6de9cd9a 3780 {
b251af97
SK
3781 gfc_error ("Procedure argument at %L is local to a PURE "
3782 "procedure and has the POINTER attribute",
99c39534 3783 &expr->where);
524af0d6 3784 return false;
6de9cd9a
DN
3785 }
3786 }
d3a9eea2
TB
3787
3788 /* Fortran 2008, C1283. */
99c39534 3789 if (gfc_pure (NULL) && gfc_is_coindexed (expr))
d3a9eea2
TB
3790 {
3791 if (f_intent == INTENT_INOUT || f_intent == INTENT_OUT)
3792 {
3793 gfc_error ("Coindexed actual argument at %L in PURE procedure "
3794 "is passed to an INTENT(%s) argument",
99c39534 3795 &expr->where, gfc_intent_string (f_intent));
524af0d6 3796 return false;
d3a9eea2
TB
3797 }
3798
bcb4ad36
TB
3799 if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3800 && CLASS_DATA (f->sym)->attr.class_pointer)
3801 || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
d3a9eea2
TB
3802 {
3803 gfc_error ("Coindexed actual argument at %L in PURE procedure "
3804 "is passed to a POINTER dummy argument",
99c39534 3805 &expr->where);
524af0d6 3806 return false;
d3a9eea2
TB
3807 }
3808 }
3809
3810 /* F2008, Section 12.5.2.4. */
99c39534
TB
3811 if (expr->ts.type == BT_CLASS && f->sym->ts.type == BT_CLASS
3812 && gfc_is_coindexed (expr))
d3a9eea2
TB
3813 {
3814 gfc_error ("Coindexed polymorphic actual argument at %L is passed "
c4100eae 3815 "polymorphic dummy argument %qs",
99c39534 3816 &expr->where, f->sym->name);
524af0d6 3817 return false;
d3a9eea2 3818 }
6de9cd9a
DN
3819 }
3820
524af0d6 3821 return true;
6de9cd9a
DN
3822}
3823
3824
3825/* Check how a procedure is used against its interface. If all goes
3826 well, the actual argument list will also end up being properly
3827 sorted. */
3828
524af0d6 3829bool
b251af97 3830gfc_procedure_use (gfc_symbol *sym, gfc_actual_arglist **ap, locus *where)
6de9cd9a 3831{
f3883269 3832 gfc_actual_arglist *a;
4cbc9039 3833 gfc_formal_arglist *dummy_args;
4a4fc7fe 3834 bool implicit = false;
4cbc9039 3835
a9c5fe7e 3836 /* Warn about calls with an implicit interface. Special case
6bd2c800 3837 for calling a ISO_C_BINDING because c_loc and c_funloc
ca071303
FXC
3838 are pseudo-unknown. Additionally, warn about procedures not
3839 explicitly declared at all if requested. */
8b7a967e 3840 if (sym->attr.if_source == IFSRC_UNKNOWN && !sym->attr.is_iso_c)
ca071303 3841 {
b31f8023 3842 bool has_implicit_none_export = false;
4a4fc7fe 3843 implicit = true;
b31f8023
TB
3844 if (sym->attr.proc == PROC_UNKNOWN)
3845 for (gfc_namespace *ns = sym->ns; ns; ns = ns->parent)
3846 if (ns->has_implicit_none_export)
3847 {
3848 has_implicit_none_export = true;
3849 break;
3850 }
3851 if (has_implicit_none_export)
8b7a967e 3852 {
bcc478b9
BRF
3853 const char *guessed
3854 = gfc_lookup_function_fuzzy (sym->name, sym->ns->sym_root);
3855 if (guessed)
3856 gfc_error ("Procedure %qs called at %L is not explicitly declared"
3857 "; did you mean %qs?",
3858 sym->name, where, guessed);
3859 else
3860 gfc_error ("Procedure %qs called at %L is not explicitly declared",
3861 sym->name, where);
8b7a967e
TB
3862 return false;
3863 }
73e42eef 3864 if (warn_implicit_interface)
48749dbc
MLI
3865 gfc_warning (OPT_Wimplicit_interface,
3866 "Procedure %qs called with an implicit interface at %L",
ca071303 3867 sym->name, where);
73e42eef 3868 else if (warn_implicit_procedure && sym->attr.proc == PROC_UNKNOWN)
48749dbc
MLI
3869 gfc_warning (OPT_Wimplicit_procedure,
3870 "Procedure %qs called at %L is not explicitly declared",
ca071303 3871 sym->name, where);
ffeebc4f 3872 gfc_find_proc_namespace (sym->ns)->implicit_interface_calls = 1;
ca071303 3873 }
6de9cd9a 3874
e6895430 3875 if (sym->attr.if_source == IFSRC_UNKNOWN)
ac05557c 3876 {
86d7449c
TB
3877 if (sym->attr.pointer)
3878 {
c4100eae
MLI
3879 gfc_error ("The pointer object %qs at %L must have an explicit "
3880 "function interface or be declared as array",
3881 sym->name, where);
524af0d6 3882 return false;
86d7449c
TB
3883 }
3884
3885 if (sym->attr.allocatable && !sym->attr.external)
3886 {
c4100eae
MLI
3887 gfc_error ("The allocatable object %qs at %L must have an explicit "
3888 "function interface or be declared as array",
3889 sym->name, where);
524af0d6 3890 return false;
86d7449c
TB
3891 }
3892
3893 if (sym->attr.allocatable)
3894 {
c4100eae
MLI
3895 gfc_error ("Allocatable function %qs at %L must have an explicit "
3896 "function interface", sym->name, where);
524af0d6 3897 return false;
86d7449c
TB
3898 }
3899
ac05557c
DF
3900 for (a = *ap; a; a = a->next)
3901 {
fb078366
TK
3902 if (a->expr && a->expr->error)
3903 return false;
3904
4a4fc7fe
TK
3905 /* F2018, 15.4.2.2 Explicit interface is required for a
3906 polymorphic dummy argument, so there is no way to
3907 legally have a class appear in an argument with an
3908 implicit interface. */
3909
3910 if (implicit && a->expr && a->expr->ts.type == BT_CLASS)
3911 {
3912 gfc_error ("Explicit interface required for polymorphic "
3913 "argument at %L",&a->expr->where);
3914 a->expr->error = 1;
3915 break;
3916 }
3917
ac05557c
DF
3918 /* Skip g77 keyword extensions like %VAL, %REF, %LOC. */
3919 if (a->name != NULL && a->name[0] != '%')
3920 {
c4100eae
MLI
3921 gfc_error ("Keyword argument requires explicit interface "
3922 "for procedure %qs at %L", sym->name, &a->expr->where);
ac05557c
DF
3923 break;
3924 }
fea54935 3925
45a69325
TB
3926 /* TS 29113, 6.2. */
3927 if (a->expr && a->expr->ts.type == BT_ASSUMED
3928 && sym->intmod_sym_id != ISOCBINDING_LOC)
3929 {
3930 gfc_error ("Assumed-type argument %s at %L requires an explicit "
3931 "interface", a->expr->symtree->n.sym->name,
3932 &a->expr->where);
fb078366 3933 a->expr->error = 1;
45a69325
TB
3934 break;
3935 }
3936
fea54935
TB
3937 /* F2008, C1303 and C1304. */
3938 if (a->expr
3939 && (a->expr->ts.type == BT_DERIVED || a->expr->ts.type == BT_CLASS)
f477062c 3940 && a->expr->ts.u.derived
fea54935
TB
3941 && ((a->expr->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
3942 && a->expr->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
3943 || gfc_expr_attr (a->expr).lock_comp))
3944 {
c4100eae
MLI
3945 gfc_error ("Actual argument of LOCK_TYPE or with LOCK_TYPE "
3946 "component at %L requires an explicit interface for "
3947 "procedure %qs", &a->expr->where, sym->name);
fb078366 3948 a->expr->error = 1;
fea54935
TB
3949 break;
3950 }
ea8ad3e5 3951
5df445a2
TB
3952 if (a->expr
3953 && (a->expr->ts.type == BT_DERIVED || a->expr->ts.type == BT_CLASS)
f477062c 3954 && a->expr->ts.u.derived
5df445a2
TB
3955 && ((a->expr->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
3956 && a->expr->ts.u.derived->intmod_sym_id
3957 == ISOFORTRAN_EVENT_TYPE)
3958 || gfc_expr_attr (a->expr).event_comp))
3959 {
3960 gfc_error ("Actual argument of EVENT_TYPE or with EVENT_TYPE "
3961 "component at %L requires an explicit interface for "
3962 "procedure %qs", &a->expr->where, sym->name);
fb078366 3963 a->expr->error = 1;
5df445a2
TB
3964 break;
3965 }
3966
ea8ad3e5
TB
3967 if (a->expr && a->expr->expr_type == EXPR_NULL
3968 && a->expr->ts.type == BT_UNKNOWN)
3969 {
fb078366
TK
3970 gfc_error ("MOLD argument to NULL required at %L",
3971 &a->expr->where);
3972 a->expr->error = 1;
524af0d6 3973 return false;
ea8ad3e5 3974 }
c62c6622
TB
3975
3976 /* TS 29113, C407b. */
3977 if (a->expr && a->expr->expr_type == EXPR_VARIABLE
3978 && symbol_rank (a->expr->symtree->n.sym) == -1)
3979 {
3980 gfc_error ("Assumed-rank argument requires an explicit interface "
3981 "at %L", &a->expr->where);
fb078366 3982 a->expr->error = 1;
524af0d6 3983 return false;
c62c6622 3984 }
ac05557c
DF
3985 }
3986
524af0d6 3987 return true;
ac05557c
DF
3988 }
3989
4cbc9039
JW
3990 dummy_args = gfc_sym_get_dummy_args (sym);
3991
f3883269
SK
3992 /* For a statement function, check that types and type parameters of actual
3993 arguments and dummy arguments match. */
e68a35ae
TK
3994 if (!gfc_compare_actual_formal (ap, dummy_args, 0, sym->attr.elemental,
3995 sym->attr.proc == PROC_ST_FUNCTION, where))
524af0d6 3996 return false;
a5baf71b 3997
524af0d6
JB
3998 if (!check_intents (dummy_args, *ap))
3999 return false;
6de9cd9a 4000
73e42eef 4001 if (warn_aliasing)
4cbc9039 4002 check_some_aliasing (dummy_args, *ap);
f8552cd4 4003
524af0d6 4004 return true;
6de9cd9a
DN
4005}
4006
4007
7e196f89
JW
4008/* Check how a procedure pointer component is used against its interface.
4009 If all goes well, the actual argument list will also end up being properly
4010 sorted. Completely analogous to gfc_procedure_use. */
4011
4012void
4013gfc_ppc_use (gfc_component *comp, gfc_actual_arglist **ap, locus *where)
4014{
7e196f89 4015 /* Warn about calls with an implicit interface. Special case
6bd2c800 4016 for calling a ISO_C_BINDING because c_loc and c_funloc
7e196f89 4017 are pseudo-unknown. */
73e42eef 4018 if (warn_implicit_interface
7e196f89
JW
4019 && comp->attr.if_source == IFSRC_UNKNOWN
4020 && !comp->attr.is_iso_c)
48749dbc
MLI
4021 gfc_warning (OPT_Wimplicit_interface,
4022 "Procedure pointer component %qs called with an implicit "
7e196f89
JW
4023 "interface at %L", comp->name, where);
4024
4025 if (comp->attr.if_source == IFSRC_UNKNOWN)
4026 {
4027 gfc_actual_arglist *a;
4028 for (a = *ap; a; a = a->next)
4029 {
4030 /* Skip g77 keyword extensions like %VAL, %REF, %LOC. */
4031 if (a->name != NULL && a->name[0] != '%')
4032 {
c4100eae
MLI
4033 gfc_error ("Keyword argument requires explicit interface "
4034 "for procedure pointer component %qs at %L",
4035 comp->name, &a->expr->where);
7e196f89
JW
4036 break;
4037 }
4038 }
4039
4040 return;
4041 }
4042
e68a35ae 4043 if (!gfc_compare_actual_formal (ap, comp->ts.interface->formal, 0,
f3883269 4044 comp->attr.elemental, false, where))
7e196f89
JW
4045 return;
4046
4cbc9039 4047 check_intents (comp->ts.interface->formal, *ap);
73e42eef 4048 if (warn_aliasing)
4cbc9039 4049 check_some_aliasing (comp->ts.interface->formal, *ap);
7e196f89
JW
4050}
4051
4052
f0ac18b7
DK
4053/* Try if an actual argument list matches the formal list of a symbol,
4054 respecting the symbol's attributes like ELEMENTAL. This is used for
4055 GENERIC resolution. */
4056
4057bool
4058gfc_arglist_matches_symbol (gfc_actual_arglist** args, gfc_symbol* sym)
4059{
4cbc9039 4060 gfc_formal_arglist *dummy_args;
f0ac18b7
DK
4061 bool r;
4062
1d101216
JD
4063 if (sym->attr.flavor != FL_PROCEDURE)
4064 return false;
f0ac18b7 4065
4cbc9039
JW
4066 dummy_args = gfc_sym_get_dummy_args (sym);
4067
f0ac18b7 4068 r = !sym->attr.elemental;
e68a35ae 4069 if (gfc_compare_actual_formal (args, dummy_args, r, !r, false, NULL))
f0ac18b7 4070 {
4cbc9039 4071 check_intents (dummy_args, *args);
73e42eef 4072 if (warn_aliasing)
4cbc9039 4073 check_some_aliasing (dummy_args, *args);
f0ac18b7
DK
4074 return true;
4075 }
4076
4077 return false;
4078}
4079
4080
6de9cd9a
DN
4081/* Given an interface pointer and an actual argument list, search for
4082 a formal argument list that matches the actual. If found, returns
4083 a pointer to the symbol of the correct interface. Returns NULL if
4084 not found. */
4085
4086gfc_symbol *
b251af97
SK
4087gfc_search_interface (gfc_interface *intr, int sub_flag,
4088 gfc_actual_arglist **ap)
6de9cd9a 4089{
22a0a780 4090 gfc_symbol *elem_sym = NULL;
ea8ad3e5
TB
4091 gfc_symbol *null_sym = NULL;
4092 locus null_expr_loc;
4093 gfc_actual_arglist *a;
4094 bool has_null_arg = false;
4095
4096 for (a = *ap; a; a = a->next)
4097 if (a->expr && a->expr->expr_type == EXPR_NULL
4098 && a->expr->ts.type == BT_UNKNOWN)
4099 {
4100 has_null_arg = true;
4101 null_expr_loc = a->expr->where;
4102 break;
8b704316 4103 }
ea8ad3e5 4104
6de9cd9a
DN
4105 for (; intr; intr = intr->next)
4106 {
f6288c24 4107 if (gfc_fl_struct (intr->sym->attr.flavor))
c3f34952 4108 continue;
6de9cd9a
DN
4109 if (sub_flag && intr->sym->attr.function)
4110 continue;
4111 if (!sub_flag && intr->sym->attr.subroutine)
4112 continue;
4113
f0ac18b7 4114 if (gfc_arglist_matches_symbol (ap, intr->sym))
22a0a780 4115 {
ea8ad3e5
TB
4116 if (has_null_arg && null_sym)
4117 {
4118 gfc_error ("MOLD= required in NULL() argument at %L: Ambiguity "
4119 "between specific functions %s and %s",
4120 &null_expr_loc, null_sym->name, intr->sym->name);
4121 return NULL;
4122 }
4123 else if (has_null_arg)
4124 {
4125 null_sym = intr->sym;
4126 continue;
4127 }
4128
22a0a780 4129 /* Satisfy 12.4.4.1 such that an elemental match has lower
8b704316 4130 weight than a non-elemental match. */
22a0a780
PT
4131 if (intr->sym->attr.elemental)
4132 {
4133 elem_sym = intr->sym;
4134 continue;
4135 }
4136 return intr->sym;
4137 }
6de9cd9a
DN
4138 }
4139
ea8ad3e5
TB
4140 if (null_sym)
4141 return null_sym;
4142
22a0a780 4143 return elem_sym ? elem_sym : NULL;
6de9cd9a
DN
4144}
4145
4146
4147/* Do a brute force recursive search for a symbol. */
4148
4149static gfc_symtree *
b251af97 4150find_symtree0 (gfc_symtree *root, gfc_symbol *sym)
6de9cd9a
DN
4151{
4152 gfc_symtree * st;
4153
4154 if (root->n.sym == sym)
4155 return root;
4156
4157 st = NULL;
4158 if (root->left)
4159 st = find_symtree0 (root->left, sym);
4160 if (root->right && ! st)
4161 st = find_symtree0 (root->right, sym);
4162 return st;
4163}
4164
4165
4166/* Find a symtree for a symbol. */
4167
f6fad28e
DK
4168gfc_symtree *
4169gfc_find_sym_in_symtree (gfc_symbol *sym)
6de9cd9a
DN
4170{
4171 gfc_symtree *st;
4172 gfc_namespace *ns;
4173
4174 /* First try to find it by name. */
4175 gfc_find_sym_tree (sym->name, gfc_current_ns, 1, &st);
4176 if (st && st->n.sym == sym)
4177 return st;
4178
66e4ab31 4179 /* If it's been renamed, resort to a brute-force search. */
6de9cd9a
DN
4180 /* TODO: avoid having to do this search. If the symbol doesn't exist
4181 in the symtree for the current namespace, it should probably be added. */
4182 for (ns = gfc_current_ns; ns; ns = ns->parent)
4183 {
4184 st = find_symtree0 (ns->sym_root, sym);
4185 if (st)
b251af97 4186 return st;
6de9cd9a 4187 }
17d5d49f 4188 gfc_internal_error ("Unable to find symbol %qs", sym->name);
66e4ab31 4189 /* Not reached. */
6de9cd9a
DN
4190}
4191
4192
4a44a72d
DK
4193/* See if the arglist to an operator-call contains a derived-type argument
4194 with a matching type-bound operator. If so, return the matching specific
4195 procedure defined as operator-target as well as the base-object to use
974df0f8
PT
4196 (which is the found derived-type argument with operator). The generic
4197 name, if any, is transmitted to the final expression via 'gname'. */
4a44a72d
DK
4198
4199static gfc_typebound_proc*
4200matching_typebound_op (gfc_expr** tb_base,
4201 gfc_actual_arglist* args,
974df0f8
PT
4202 gfc_intrinsic_op op, const char* uop,
4203 const char ** gname)
4a44a72d
DK
4204{
4205 gfc_actual_arglist* base;
4206
4207 for (base = args; base; base = base->next)
4b7dd692 4208 if (base->expr->ts.type == BT_DERIVED || base->expr->ts.type == BT_CLASS)
4a44a72d
DK
4209 {
4210 gfc_typebound_proc* tb;
4211 gfc_symbol* derived;
524af0d6 4212 bool result;
4a44a72d 4213
efd2e969
PT
4214 while (base->expr->expr_type == EXPR_OP
4215 && base->expr->value.op.op == INTRINSIC_PARENTHESES)
4216 base->expr = base->expr->value.op.op1;
4217
4b7dd692 4218 if (base->expr->ts.type == BT_CLASS)
528622fd 4219 {
fba5a793 4220 if (!base->expr->ts.u.derived || CLASS_DATA (base->expr) == NULL
0a59e583 4221 || !gfc_expr_attr (base->expr).class_ok)
528622fd
JW
4222 continue;
4223 derived = CLASS_DATA (base->expr)->ts.u.derived;
4224 }
4b7dd692
JW
4225 else
4226 derived = base->expr->ts.u.derived;
4a44a72d
DK
4227
4228 if (op == INTRINSIC_USER)
4229 {
4230 gfc_symtree* tb_uop;
4231
4232 gcc_assert (uop);
4233 tb_uop = gfc_find_typebound_user_op (derived, &result, uop,
4234 false, NULL);
4235
4236 if (tb_uop)
4237 tb = tb_uop->n.tb;
4238 else
4239 tb = NULL;
4240 }
4241 else
4242 tb = gfc_find_typebound_intrinsic_op (derived, &result, op,
4243 false, NULL);
4244
4245 /* This means we hit a PRIVATE operator which is use-associated and
4246 should thus not be seen. */
524af0d6 4247 if (!result)
4a44a72d
DK
4248 tb = NULL;
4249
4250 /* Look through the super-type hierarchy for a matching specific
4251 binding. */
4252 for (; tb; tb = tb->overridden)
4253 {
4254 gfc_tbp_generic* g;
4255
4256 gcc_assert (tb->is_generic);
4257 for (g = tb->u.generic; g; g = g->next)
4258 {
4259 gfc_symbol* target;
4260 gfc_actual_arglist* argcopy;
4261 bool matches;
4262
4263 gcc_assert (g->specific);
4264 if (g->specific->error)
4265 continue;
4266
4267 target = g->specific->u.specific->n.sym;
4268
4269 /* Check if this arglist matches the formal. */
4270 argcopy = gfc_copy_actual_arglist (args);
4271 matches = gfc_arglist_matches_symbol (&argcopy, target);
4272 gfc_free_actual_arglist (argcopy);
4273
4274 /* Return if we found a match. */
4275 if (matches)
4276 {
4277 *tb_base = base->expr;
974df0f8 4278 *gname = g->specific_st->name;
4a44a72d
DK
4279 return g->specific;
4280 }
4281 }
4282 }
4283 }
4284
4285 return NULL;
4286}
4287
4288
4289/* For the 'actual arglist' of an operator call and a specific typebound
4290 procedure that has been found the target of a type-bound operator, build the
4291 appropriate EXPR_COMPCALL and resolve it. We take this indirection over
4292 type-bound procedures rather than resolving type-bound operators 'directly'
4293 so that we can reuse the existing logic. */
4294
4295static void
4296build_compcall_for_operator (gfc_expr* e, gfc_actual_arglist* actual,
974df0f8
PT
4297 gfc_expr* base, gfc_typebound_proc* target,
4298 const char *gname)
4a44a72d
DK
4299{
4300 e->expr_type = EXPR_COMPCALL;
4301 e->value.compcall.tbp = target;
974df0f8 4302 e->value.compcall.name = gname ? gname : "$op";
4a44a72d
DK
4303 e->value.compcall.actual = actual;
4304 e->value.compcall.base_object = base;
4305 e->value.compcall.ignore_pass = 1;
4306 e->value.compcall.assign = 0;
94fae14b
PT
4307 if (e->ts.type == BT_UNKNOWN
4308 && target->function)
4309 {
4310 if (target->is_generic)
4311 e->ts = target->u.generic->specific->u.specific->n.sym->ts;
4312 else
4313 e->ts = target->u.specific->n.sym->ts;
4314 }
4a44a72d
DK
4315}
4316
4317
6de9cd9a
DN
4318/* This subroutine is called when an expression is being resolved.
4319 The expression node in question is either a user defined operator
1f2959f0 4320 or an intrinsic operator with arguments that aren't compatible
6de9cd9a
DN
4321 with the operator. This subroutine builds an actual argument list
4322 corresponding to the operands, then searches for a compatible
4323 interface. If one is found, the expression node is replaced with
eaee02a5
JW
4324 the appropriate function call. We use the 'match' enum to specify
4325 whether a replacement has been made or not, or if an error occurred. */
6de9cd9a 4326
eaee02a5
JW
4327match
4328gfc_extend_expr (gfc_expr *e)
6de9cd9a
DN
4329{
4330 gfc_actual_arglist *actual;
4331 gfc_symbol *sym;
4332 gfc_namespace *ns;
4333 gfc_user_op *uop;
4334 gfc_intrinsic_op i;
974df0f8 4335 const char *gname;
517d78be
JW
4336 gfc_typebound_proc* tbo;
4337 gfc_expr* tb_base;
6de9cd9a
DN
4338
4339 sym = NULL;
4340
4341 actual = gfc_get_actual_arglist ();
58b03ab2 4342 actual->expr = e->value.op.op1;
6de9cd9a 4343
974df0f8 4344 gname = NULL;
4a44a72d 4345
58b03ab2 4346 if (e->value.op.op2 != NULL)
6de9cd9a
DN
4347 {
4348 actual->next = gfc_get_actual_arglist ();
58b03ab2 4349 actual->next->expr = e->value.op.op2;
6de9cd9a
DN
4350 }
4351
e8d4f3fc 4352 i = fold_unary_intrinsic (e->value.op.op);
6de9cd9a 4353
517d78be
JW
4354 /* See if we find a matching type-bound operator. */
4355 if (i == INTRINSIC_USER)
4356 tbo = matching_typebound_op (&tb_base, actual,
4357 i, e->value.op.uop->name, &gname);
4358 else
4359 switch (i)
4360 {
4361#define CHECK_OS_COMPARISON(comp) \
4362 case INTRINSIC_##comp: \
4363 case INTRINSIC_##comp##_OS: \
4364 tbo = matching_typebound_op (&tb_base, actual, \
4365 INTRINSIC_##comp, NULL, &gname); \
4366 if (!tbo) \
4367 tbo = matching_typebound_op (&tb_base, actual, \
4368 INTRINSIC_##comp##_OS, NULL, &gname); \
4369 break;
4370 CHECK_OS_COMPARISON(EQ)
4371 CHECK_OS_COMPARISON(NE)
4372 CHECK_OS_COMPARISON(GT)
4373 CHECK_OS_COMPARISON(GE)
4374 CHECK_OS_COMPARISON(LT)
4375 CHECK_OS_COMPARISON(LE)
4376#undef CHECK_OS_COMPARISON
4377
4378 default:
4379 tbo = matching_typebound_op (&tb_base, actual, i, NULL, &gname);
4380 break;
4381 }
4382
4383 /* If there is a matching typebound-operator, replace the expression with
4384 a call to it and succeed. */
4385 if (tbo)
4386 {
4387 gcc_assert (tb_base);
4388 build_compcall_for_operator (e, actual, tb_base, tbo, gname);
4389
4390 if (!gfc_resolve_expr (e))
4391 return MATCH_ERROR;
4392 else
4393 return MATCH_YES;
4394 }
e73d3ca6 4395
6de9cd9a
DN
4396 if (i == INTRINSIC_USER)
4397 {
4398 for (ns = gfc_current_ns; ns; ns = ns->parent)
4399 {
58b03ab2 4400 uop = gfc_find_uop (e->value.op.uop->name, ns);
6de9cd9a
DN
4401 if (uop == NULL)
4402 continue;
4403
a1ee985f 4404 sym = gfc_search_interface (uop->op, 0, &actual);
6de9cd9a
DN
4405 if (sym != NULL)
4406 break;
4407 }
4408 }
4409 else
4410 {
4411 for (ns = gfc_current_ns; ns; ns = ns->parent)
4412 {
3bed9dd0
DF
4413 /* Due to the distinction between '==' and '.eq.' and friends, one has
4414 to check if either is defined. */
4415 switch (i)
4416 {
4a44a72d
DK
4417#define CHECK_OS_COMPARISON(comp) \
4418 case INTRINSIC_##comp: \
4419 case INTRINSIC_##comp##_OS: \
4420 sym = gfc_search_interface (ns->op[INTRINSIC_##comp], 0, &actual); \
4421 if (!sym) \
4422 sym = gfc_search_interface (ns->op[INTRINSIC_##comp##_OS], 0, &actual); \
4423 break;
4424 CHECK_OS_COMPARISON(EQ)
4425 CHECK_OS_COMPARISON(NE)
4426 CHECK_OS_COMPARISON(GT)
4427 CHECK_OS_COMPARISON(GE)
4428 CHECK_OS_COMPARISON(LT)
4429 CHECK_OS_COMPARISON(LE)
4430#undef CHECK_OS_COMPARISON
3bed9dd0
DF
4431
4432 default:
a1ee985f 4433 sym = gfc_search_interface (ns->op[i], 0, &actual);
3bed9dd0
DF
4434 }
4435
6de9cd9a
DN
4436 if (sym != NULL)
4437 break;
4438 }
4439 }
4440
4a44a72d
DK
4441 /* TODO: Do an ambiguity-check and error if multiple matching interfaces are
4442 found rather than just taking the first one and not checking further. */
4443
6de9cd9a
DN
4444 if (sym == NULL)
4445 {
66e4ab31 4446 /* Don't use gfc_free_actual_arglist(). */
04695783 4447 free (actual->next);
cede9502 4448 free (actual);
eaee02a5 4449 return MATCH_NO;
6de9cd9a
DN
4450 }
4451
4452 /* Change the expression node to a function call. */
4453 e->expr_type = EXPR_FUNCTION;
f6fad28e 4454 e->symtree = gfc_find_sym_in_symtree (sym);
6de9cd9a 4455 e->value.function.actual = actual;
58b03ab2
TS
4456 e->value.function.esym = NULL;
4457 e->value.function.isym = NULL;
cf013e9f 4458 e->value.function.name = NULL;
a1ab6660 4459 e->user_operator = 1;
6de9cd9a 4460
524af0d6 4461 if (!gfc_resolve_expr (e))
eaee02a5 4462 return MATCH_ERROR;
6de9cd9a 4463
eaee02a5 4464 return MATCH_YES;
6de9cd9a
DN
4465}
4466
4467
4f7395ff
JW
4468/* Tries to replace an assignment code node with a subroutine call to the
4469 subroutine associated with the assignment operator. Return true if the node
4470 was replaced. On false, no error is generated. */
6de9cd9a 4471
524af0d6 4472bool
b251af97 4473gfc_extend_assign (gfc_code *c, gfc_namespace *ns)
6de9cd9a
DN
4474{
4475 gfc_actual_arglist *actual;
4f7395ff
JW
4476 gfc_expr *lhs, *rhs, *tb_base;
4477 gfc_symbol *sym = NULL;
4478 const char *gname = NULL;
4479 gfc_typebound_proc* tbo;
6de9cd9a 4480
a513927a 4481 lhs = c->expr1;
6de9cd9a
DN
4482 rhs = c->expr2;
4483
8dc63166
SK
4484 /* Don't allow an intrinsic assignment with a BOZ rhs to be replaced. */
4485 if (c->op == EXEC_ASSIGN
4486 && c->expr1->expr_type == EXPR_VARIABLE
4487 && c->expr2->expr_type == EXPR_CONSTANT && c->expr2->ts.type == BT_BOZ)
4488 return false;
4489
6de9cd9a 4490 /* Don't allow an intrinsic assignment to be replaced. */
4b7dd692 4491 if (lhs->ts.type != BT_DERIVED && lhs->ts.type != BT_CLASS
e19bb186 4492 && (rhs->rank == 0 || rhs->rank == lhs->rank)
6de9cd9a 4493 && (lhs->ts.type == rhs->ts.type
b251af97 4494 || (gfc_numeric_ts (&lhs->ts) && gfc_numeric_ts (&rhs->ts))))
524af0d6 4495 return false;
6de9cd9a
DN
4496
4497 actual = gfc_get_actual_arglist ();
4498 actual->expr = lhs;
4499
4500 actual->next = gfc_get_actual_arglist ();
4501 actual->next->expr = rhs;
4502
4f7395ff
JW
4503 /* TODO: Ambiguity-check, see above for gfc_extend_expr. */
4504
4505 /* See if we find a matching type-bound assignment. */
4506 tbo = matching_typebound_op (&tb_base, actual, INTRINSIC_ASSIGN,
4507 NULL, &gname);
4508
4509 if (tbo)
4510 {
4511 /* Success: Replace the expression with a type-bound call. */
4512 gcc_assert (tb_base);
4513 c->expr1 = gfc_get_expr ();
4514 build_compcall_for_operator (c->expr1, actual, tb_base, tbo, gname);
4515 c->expr1->value.compcall.assign = 1;
4516 c->expr1->where = c->loc;
4517 c->expr2 = NULL;
4518 c->op = EXEC_COMPCALL;
4519 return true;
4520 }
6de9cd9a 4521
4f7395ff 4522 /* See if we find an 'ordinary' (non-typebound) assignment procedure. */
6de9cd9a
DN
4523 for (; ns; ns = ns->parent)
4524 {
a1ee985f 4525 sym = gfc_search_interface (ns->op[INTRINSIC_ASSIGN], 1, &actual);
6de9cd9a
DN
4526 if (sym != NULL)
4527 break;
4528 }
4529
4f7395ff 4530 if (sym)
6de9cd9a 4531 {
4f7395ff
JW
4532 /* Success: Replace the assignment with the call. */
4533 c->op = EXEC_ASSIGN_CALL;
4534 c->symtree = gfc_find_sym_in_symtree (sym);
4535 c->expr1 = NULL;
4536 c->expr2 = NULL;
4537 c->ext.actual = actual;
4538 return true;
6de9cd9a
DN
4539 }
4540
4f7395ff
JW
4541 /* Failure: No assignment procedure found. */
4542 free (actual->next);
4543 free (actual);
4544 return false;
6de9cd9a
DN
4545}
4546
4547
4548/* Make sure that the interface just parsed is not already present in
4549 the given interface list. Ambiguity isn't checked yet since module
4550 procedures can be present without interfaces. */
4551
524af0d6 4552bool
362aa474 4553gfc_check_new_interface (gfc_interface *base, gfc_symbol *new_sym, locus loc)
6de9cd9a
DN
4554{
4555 gfc_interface *ip;
4556
4557 for (ip = base; ip; ip = ip->next)
4558 {
7b901ac4 4559 if (ip->sym == new_sym)
6de9cd9a 4560 {
c4100eae 4561 gfc_error ("Entity %qs at %L is already present in the interface",
362aa474 4562 new_sym->name, &loc);
524af0d6 4563 return false;
6de9cd9a
DN
4564 }
4565 }
4566
524af0d6 4567 return true;
6de9cd9a
DN
4568}
4569
4570
4571/* Add a symbol to the current interface. */
4572
524af0d6 4573bool
7b901ac4 4574gfc_add_interface (gfc_symbol *new_sym)
6de9cd9a
DN
4575{
4576 gfc_interface **head, *intr;
4577 gfc_namespace *ns;
4578 gfc_symbol *sym;
4579
4580 switch (current_interface.type)
4581 {
4582 case INTERFACE_NAMELESS:
9e1d712c 4583 case INTERFACE_ABSTRACT:
524af0d6 4584 return true;
6de9cd9a
DN
4585
4586 case INTERFACE_INTRINSIC_OP:
4587 for (ns = current_interface.ns; ns; ns = ns->parent)
3bed9dd0
DF
4588 switch (current_interface.op)
4589 {
4590 case INTRINSIC_EQ:
4591 case INTRINSIC_EQ_OS:
e73d3ca6 4592 if (!gfc_check_new_interface (ns->op[INTRINSIC_EQ], new_sym,
524af0d6 4593 gfc_current_locus)
e73d3ca6 4594 || !gfc_check_new_interface (ns->op[INTRINSIC_EQ_OS],
524af0d6
JB
4595 new_sym, gfc_current_locus))
4596 return false;
3bed9dd0
DF
4597 break;
4598
4599 case INTRINSIC_NE:
4600 case INTRINSIC_NE_OS:
e73d3ca6 4601 if (!gfc_check_new_interface (ns->op[INTRINSIC_NE], new_sym,
524af0d6 4602 gfc_current_locus)
e73d3ca6 4603 || !gfc_check_new_interface (ns->op[INTRINSIC_NE_OS],
524af0d6
JB
4604 new_sym, gfc_current_locus))
4605 return false;
3bed9dd0
DF
4606 break;
4607
4608 case INTRINSIC_GT:
4609 case INTRINSIC_GT_OS:
e73d3ca6 4610 if (!gfc_check_new_interface (ns->op[INTRINSIC_GT],
524af0d6 4611 new_sym, gfc_current_locus)
e73d3ca6 4612 || !gfc_check_new_interface (ns->op[INTRINSIC_GT_OS],
524af0d6
JB
4613 new_sym, gfc_current_locus))
4614 return false;
3bed9dd0
DF
4615 break;
4616
4617 case INTRINSIC_GE:
4618 case INTRINSIC_GE_OS:
e73d3ca6 4619 if (!gfc_check_new_interface (ns->op[INTRINSIC_GE],
524af0d6 4620 new_sym, gfc_current_locus)
e73d3ca6 4621 || !gfc_check_new_interface (ns->op[INTRINSIC_GE_OS],
524af0d6
JB
4622 new_sym, gfc_current_locus))
4623 return false;
3bed9dd0
DF
4624 break;
4625
4626 case INTRINSIC_LT:
4627 case INTRINSIC_LT_OS:
e73d3ca6 4628 if (!gfc_check_new_interface (ns->op[INTRINSIC_LT],
524af0d6 4629 new_sym, gfc_current_locus)
e73d3ca6 4630 || !gfc_check_new_interface (ns->op[INTRINSIC_LT_OS],
524af0d6
JB
4631 new_sym, gfc_current_locus))
4632 return false;
3bed9dd0
DF
4633 break;
4634
4635 case INTRINSIC_LE:
4636 case INTRINSIC_LE_OS:
e73d3ca6 4637 if (!gfc_check_new_interface (ns->op[INTRINSIC_LE],
524af0d6 4638 new_sym, gfc_current_locus)
e73d3ca6 4639 || !gfc_check_new_interface (ns->op[INTRINSIC_LE_OS],
524af0d6
JB
4640 new_sym, gfc_current_locus))
4641 return false;
3bed9dd0
DF
4642 break;
4643
4644 default:
e73d3ca6 4645 if (!gfc_check_new_interface (ns->op[current_interface.op],
524af0d6
JB
4646 new_sym, gfc_current_locus))
4647 return false;
3bed9dd0 4648 }
6de9cd9a 4649
a1ee985f 4650 head = &current_interface.ns->op[current_interface.op];
6de9cd9a
DN
4651 break;
4652
4653 case INTERFACE_GENERIC:
e73d3ca6 4654 case INTERFACE_DTIO:
6de9cd9a
DN
4655 for (ns = current_interface.ns; ns; ns = ns->parent)
4656 {
4657 gfc_find_symbol (current_interface.sym->name, ns, 0, &sym);
4658 if (sym == NULL)
4659 continue;
4660
e73d3ca6 4661 if (!gfc_check_new_interface (sym->generic,
524af0d6
JB
4662 new_sym, gfc_current_locus))
4663 return false;
6de9cd9a
DN
4664 }
4665
4666 head = &current_interface.sym->generic;
4667 break;
4668
4669 case INTERFACE_USER_OP:
e73d3ca6 4670 if (!gfc_check_new_interface (current_interface.uop->op,
524af0d6
JB
4671 new_sym, gfc_current_locus))
4672 return false;
6de9cd9a 4673
a1ee985f 4674 head = &current_interface.uop->op;
6de9cd9a
DN
4675 break;
4676
4677 default:
4678 gfc_internal_error ("gfc_add_interface(): Bad interface type");
4679 }
4680
4681 intr = gfc_get_interface ();
7b901ac4 4682 intr->sym = new_sym;
63645982 4683 intr->where = gfc_current_locus;
6de9cd9a
DN
4684
4685 intr->next = *head;
4686 *head = intr;
4687
524af0d6 4688 return true;
6de9cd9a
DN
4689}
4690
4691
2b77e908
FXC
4692gfc_interface *
4693gfc_current_interface_head (void)
4694{
4695 switch (current_interface.type)
4696 {
4697 case INTERFACE_INTRINSIC_OP:
a1ee985f 4698 return current_interface.ns->op[current_interface.op];
2b77e908
FXC
4699
4700 case INTERFACE_GENERIC:
e73d3ca6 4701 case INTERFACE_DTIO:
2b77e908 4702 return current_interface.sym->generic;
2b77e908
FXC
4703
4704 case INTERFACE_USER_OP:
a1ee985f 4705 return current_interface.uop->op;
2b77e908
FXC
4706
4707 default:
4708 gcc_unreachable ();
4709 }
4710}
4711
4712
4713void
4714gfc_set_current_interface_head (gfc_interface *i)
4715{
4716 switch (current_interface.type)
4717 {
4718 case INTERFACE_INTRINSIC_OP:
a1ee985f 4719 current_interface.ns->op[current_interface.op] = i;
2b77e908
FXC
4720 break;
4721
4722 case INTERFACE_GENERIC:
e73d3ca6 4723 case INTERFACE_DTIO:
2b77e908
FXC
4724 current_interface.sym->generic = i;
4725 break;
4726
4727 case INTERFACE_USER_OP:
a1ee985f 4728 current_interface.uop->op = i;
2b77e908
FXC
4729 break;
4730
4731 default:
4732 gcc_unreachable ();
4733 }
4734}
4735
4736
6de9cd9a
DN
4737/* Gets rid of a formal argument list. We do not free symbols.
4738 Symbols are freed when a namespace is freed. */
4739
4740void
b251af97 4741gfc_free_formal_arglist (gfc_formal_arglist *p)
6de9cd9a
DN
4742{
4743 gfc_formal_arglist *q;
4744
4745 for (; p; p = q)
4746 {
4747 q = p->next;
cede9502 4748 free (p);
6de9cd9a
DN
4749 }
4750}
99fc1b90
JW
4751
4752
9795c594
JW
4753/* Check that it is ok for the type-bound procedure 'proc' to override the
4754 procedure 'old', cf. F08:4.5.7.3. */
99fc1b90 4755
524af0d6 4756bool
99fc1b90
JW
4757gfc_check_typebound_override (gfc_symtree* proc, gfc_symtree* old)
4758{
4759 locus where;
edc802c7 4760 gfc_symbol *proc_target, *old_target;
99fc1b90 4761 unsigned proc_pass_arg, old_pass_arg, argpos;
9795c594
JW
4762 gfc_formal_arglist *proc_formal, *old_formal;
4763 bool check_type;
4764 char err[200];
99fc1b90
JW
4765
4766 /* This procedure should only be called for non-GENERIC proc. */
4767 gcc_assert (!proc->n.tb->is_generic);
4768
4769 /* If the overwritten procedure is GENERIC, this is an error. */
4770 if (old->n.tb->is_generic)
4771 {
1fe61adf 4772 gfc_error ("Cannot overwrite GENERIC %qs at %L",
99fc1b90 4773 old->name, &proc->n.tb->where);
524af0d6 4774 return false;
99fc1b90
JW
4775 }
4776
4777 where = proc->n.tb->where;
4778 proc_target = proc->n.tb->u.specific->n.sym;
4779 old_target = old->n.tb->u.specific->n.sym;
4780
4781 /* Check that overridden binding is not NON_OVERRIDABLE. */
4782 if (old->n.tb->non_overridable)
4783 {
c4100eae 4784 gfc_error ("%qs at %L overrides a procedure binding declared"
99fc1b90 4785 " NON_OVERRIDABLE", proc->name, &where);
524af0d6 4786 return false;
99fc1b90
JW
4787 }
4788
4789 /* It's an error to override a non-DEFERRED procedure with a DEFERRED one. */
4790 if (!old->n.tb->deferred && proc->n.tb->deferred)
4791 {
c4100eae 4792 gfc_error ("%qs at %L must not be DEFERRED as it overrides a"
99fc1b90 4793 " non-DEFERRED binding", proc->name, &where);
524af0d6 4794 return false;
99fc1b90
JW
4795 }
4796
4797 /* If the overridden binding is PURE, the overriding must be, too. */
4798 if (old_target->attr.pure && !proc_target->attr.pure)
4799 {
c4100eae 4800 gfc_error ("%qs at %L overrides a PURE procedure and must also be PURE",
99fc1b90 4801 proc->name, &where);
524af0d6 4802 return false;
99fc1b90
JW
4803 }
4804
4805 /* If the overridden binding is ELEMENTAL, the overriding must be, too. If it
4806 is not, the overriding must not be either. */
4807 if (old_target->attr.elemental && !proc_target->attr.elemental)
4808 {
c4100eae 4809 gfc_error ("%qs at %L overrides an ELEMENTAL procedure and must also be"
99fc1b90 4810 " ELEMENTAL", proc->name, &where);
524af0d6 4811 return false;
99fc1b90
JW
4812 }
4813 if (!old_target->attr.elemental && proc_target->attr.elemental)
4814 {
c4100eae 4815 gfc_error ("%qs at %L overrides a non-ELEMENTAL procedure and must not"
99fc1b90 4816 " be ELEMENTAL, either", proc->name, &where);
524af0d6 4817 return false;
99fc1b90
JW
4818 }
4819
4820 /* If the overridden binding is a SUBROUTINE, the overriding must also be a
4821 SUBROUTINE. */
4822 if (old_target->attr.subroutine && !proc_target->attr.subroutine)
4823 {
c4100eae 4824 gfc_error ("%qs at %L overrides a SUBROUTINE and must also be a"
99fc1b90 4825 " SUBROUTINE", proc->name, &where);
524af0d6 4826 return false;
99fc1b90
JW
4827 }
4828
4829 /* If the overridden binding is a FUNCTION, the overriding must also be a
4830 FUNCTION and have the same characteristics. */
4831 if (old_target->attr.function)
4832 {
4833 if (!proc_target->attr.function)
4834 {
c4100eae 4835 gfc_error ("%qs at %L overrides a FUNCTION and must also be a"
99fc1b90 4836 " FUNCTION", proc->name, &where);
524af0d6 4837 return false;
99fc1b90 4838 }
8b704316 4839
4668d6f9
PT
4840 if (!gfc_check_result_characteristics (proc_target, old_target,
4841 err, sizeof(err)))
2240d1cf 4842 {
edc802c7 4843 gfc_error ("Result mismatch for the overriding procedure "
c4100eae 4844 "%qs at %L: %s", proc->name, &where, err);
524af0d6 4845 return false;
2240d1cf 4846 }
99fc1b90
JW
4847 }
4848
4849 /* If the overridden binding is PUBLIC, the overriding one must not be
4850 PRIVATE. */
4851 if (old->n.tb->access == ACCESS_PUBLIC
4852 && proc->n.tb->access == ACCESS_PRIVATE)
4853 {
c4100eae 4854 gfc_error ("%qs at %L overrides a PUBLIC procedure and must not be"
99fc1b90 4855 " PRIVATE", proc->name, &where);
524af0d6 4856 return false;
99fc1b90
JW
4857 }
4858
4859 /* Compare the formal argument lists of both procedures. This is also abused
4860 to find the position of the passed-object dummy arguments of both
4861 bindings as at least the overridden one might not yet be resolved and we
4862 need those positions in the check below. */
4863 proc_pass_arg = old_pass_arg = 0;
4864 if (!proc->n.tb->nopass && !proc->n.tb->pass_arg)
4865 proc_pass_arg = 1;
4866 if (!old->n.tb->nopass && !old->n.tb->pass_arg)
4867 old_pass_arg = 1;
4868 argpos = 1;
4cbc9039
JW
4869 proc_formal = gfc_sym_get_dummy_args (proc_target);
4870 old_formal = gfc_sym_get_dummy_args (old_target);
4871 for ( ; proc_formal && old_formal;
99fc1b90
JW
4872 proc_formal = proc_formal->next, old_formal = old_formal->next)
4873 {
4874 if (proc->n.tb->pass_arg
4875 && !strcmp (proc->n.tb->pass_arg, proc_formal->sym->name))
4876 proc_pass_arg = argpos;
4877 if (old->n.tb->pass_arg
4878 && !strcmp (old->n.tb->pass_arg, old_formal->sym->name))
4879 old_pass_arg = argpos;
4880
4881 /* Check that the names correspond. */
4882 if (strcmp (proc_formal->sym->name, old_formal->sym->name))
4883 {
c4100eae 4884 gfc_error ("Dummy argument %qs of %qs at %L should be named %qs as"
99fc1b90
JW
4885 " to match the corresponding argument of the overridden"
4886 " procedure", proc_formal->sym->name, proc->name, &where,
4887 old_formal->sym->name);
524af0d6 4888 return false;
99fc1b90
JW
4889 }
4890
9795c594 4891 check_type = proc_pass_arg != argpos && old_pass_arg != argpos;
4668d6f9 4892 if (!gfc_check_dummy_characteristics (proc_formal->sym, old_formal->sym,
524af0d6 4893 check_type, err, sizeof(err)))
99fc1b90 4894 {
e0b9e5f9 4895 gfc_error_opt (0, "Argument mismatch for the overriding procedure "
2700d0e3 4896 "%qs at %L: %s", proc->name, &where, err);
524af0d6 4897 return false;
99fc1b90
JW
4898 }
4899
4900 ++argpos;
4901 }
4902 if (proc_formal || old_formal)
4903 {
c4100eae 4904 gfc_error ("%qs at %L must have the same number of formal arguments as"
99fc1b90 4905 " the overridden procedure", proc->name, &where);
524af0d6 4906 return false;
99fc1b90
JW
4907 }
4908
4909 /* If the overridden binding is NOPASS, the overriding one must also be
4910 NOPASS. */
4911 if (old->n.tb->nopass && !proc->n.tb->nopass)
4912 {
c4100eae 4913 gfc_error ("%qs at %L overrides a NOPASS binding and must also be"
99fc1b90 4914 " NOPASS", proc->name, &where);
524af0d6 4915 return false;
99fc1b90
JW
4916 }
4917
4918 /* If the overridden binding is PASS(x), the overriding one must also be
4919 PASS and the passed-object dummy arguments must correspond. */
4920 if (!old->n.tb->nopass)
4921 {
4922 if (proc->n.tb->nopass)
4923 {
c4100eae 4924 gfc_error ("%qs at %L overrides a binding with PASS and must also be"
99fc1b90 4925 " PASS", proc->name, &where);
524af0d6 4926 return false;
99fc1b90
JW
4927 }
4928
4929 if (proc_pass_arg != old_pass_arg)
4930 {
c4100eae 4931 gfc_error ("Passed-object dummy argument of %qs at %L must be at"
99fc1b90
JW
4932 " the same position as the passed-object dummy argument of"
4933 " the overridden procedure", proc->name, &where);
524af0d6 4934 return false;
99fc1b90
JW
4935 }
4936 }
4937
524af0d6 4938 return true;
99fc1b90 4939}
e73d3ca6
PT
4940
4941
4942/* The following three functions check that the formal arguments
4943 of user defined derived type IO procedures are compliant with
f3ad8745 4944 the requirements of the standard, see F03:9.5.3.7.2 (F08:9.6.4.8.3). */
e73d3ca6
PT
4945
4946static void
4947check_dtio_arg_TKR_intent (gfc_symbol *fsym, bool typebound, bt type,
4948 int kind, int rank, sym_intent intent)
4949{
4950 if (fsym->ts.type != type)
739d9339
PT
4951 {
4952 gfc_error ("DTIO dummy argument at %L must be of type %s",
4953 &fsym->declared_at, gfc_basic_typename (type));
4954 return;
4955 }
e73d3ca6
PT
4956
4957 if (fsym->ts.type != BT_CLASS && fsym->ts.type != BT_DERIVED
4958 && fsym->ts.kind != kind)
4959 gfc_error ("DTIO dummy argument at %L must be of KIND = %d",
4960 &fsym->declared_at, kind);
4961
4962 if (!typebound
4963 && rank == 0
4964 && (((type == BT_CLASS) && CLASS_DATA (fsym)->attr.dimension)
4965 || ((type != BT_CLASS) && fsym->attr.dimension)))
b93a9a15 4966 gfc_error ("DTIO dummy argument at %L must be a scalar",
e73d3ca6
PT
4967 &fsym->declared_at);
4968 else if (rank == 1
4969 && (fsym->as == NULL || fsym->as->type != AS_ASSUMED_SHAPE))
4970 gfc_error ("DTIO dummy argument at %L must be an "
4971 "ASSUMED SHAPE ARRAY", &fsym->declared_at);
4972
f3ad8745
JW
4973 if (type == BT_CHARACTER && fsym->ts.u.cl->length != NULL)
4974 gfc_error ("DTIO character argument at %L must have assumed length",
4975 &fsym->declared_at);
4976
e73d3ca6 4977 if (fsym->attr.intent != intent)
77be9417 4978 gfc_error ("DTIO dummy argument at %L must have INTENT %s",
e73d3ca6
PT
4979 &fsym->declared_at, gfc_code2string (intents, (int)intent));
4980 return;
4981}
4982
4983
4984static void
4985check_dtio_interface1 (gfc_symbol *derived, gfc_symtree *tb_io_st,
4986 bool typebound, bool formatted, int code)
4987{
4988 gfc_symbol *dtio_sub, *generic_proc, *fsym;
4989 gfc_typebound_proc *tb_io_proc, *specific_proc;
4990 gfc_interface *intr;
4991 gfc_formal_arglist *formal;
4992 int arg_num;
4993
4994 bool read = ((dtio_codes)code == DTIO_RF)
4995 || ((dtio_codes)code == DTIO_RUF);
4996 bt type;
4997 sym_intent intent;
4998 int kind;
4999
5000 dtio_sub = NULL;
5001 if (typebound)
5002 {
5003 /* Typebound DTIO binding. */
5004 tb_io_proc = tb_io_st->n.tb;
739d9339
PT
5005 if (tb_io_proc == NULL)
5006 return;
5007
e73d3ca6 5008 gcc_assert (tb_io_proc->is_generic);
e73d3ca6
PT
5009
5010 specific_proc = tb_io_proc->u.generic->specific;
739d9339
PT
5011 if (specific_proc == NULL || specific_proc->is_generic)
5012 return;
e73d3ca6
PT
5013
5014 dtio_sub = specific_proc->u.specific->n.sym;
5015 }
5016 else
5017 {
5018 generic_proc = tb_io_st->n.sym;
739d9339
PT
5019 if (generic_proc == NULL || generic_proc->generic == NULL)
5020 return;
e73d3ca6
PT
5021
5022 for (intr = tb_io_st->n.sym->generic; intr; intr = intr->next)
5023 {
a8de3002 5024 if (intr->sym && intr->sym->formal && intr->sym->formal->sym
e73d3ca6
PT
5025 && ((intr->sym->formal->sym->ts.type == BT_CLASS
5026 && CLASS_DATA (intr->sym->formal->sym)->ts.u.derived
5027 == derived)
5028 || (intr->sym->formal->sym->ts.type == BT_DERIVED
5029 && intr->sym->formal->sym->ts.u.derived == derived)))
5030 {
5031 dtio_sub = intr->sym;
5032 break;
5033 }
a8de3002
PT
5034 else if (intr->sym && intr->sym->formal && !intr->sym->formal->sym)
5035 {
5036 gfc_error ("Alternate return at %L is not permitted in a DTIO "
5037 "procedure", &intr->sym->declared_at);
5038 return;
5039 }
e73d3ca6
PT
5040 }
5041
5042 if (dtio_sub == NULL)
5043 return;
5044 }
5045
5046 gcc_assert (dtio_sub);
5047 if (!dtio_sub->attr.subroutine)
2f029c08 5048 gfc_error ("DTIO procedure %qs at %L must be a subroutine",
e73d3ca6
PT
5049 dtio_sub->name, &dtio_sub->declared_at);
5050
dbeaa7ab 5051 if (!dtio_sub->resolve_symbol_called)
3ab216a4
TB
5052 gfc_resolve_formal_arglist (dtio_sub);
5053
a8de3002
PT
5054 arg_num = 0;
5055 for (formal = dtio_sub->formal; formal; formal = formal->next)
5056 arg_num++;
5057
5058 if (arg_num < (formatted ? 6 : 4))
5059 {
2f029c08 5060 gfc_error ("Too few dummy arguments in DTIO procedure %qs at %L",
a8de3002
PT
5061 dtio_sub->name, &dtio_sub->declared_at);
5062 return;
5063 }
5064
5065 if (arg_num > (formatted ? 6 : 4))
5066 {
2f029c08 5067 gfc_error ("Too many dummy arguments in DTIO procedure %qs at %L",
a8de3002
PT
5068 dtio_sub->name, &dtio_sub->declared_at);
5069 return;
5070 }
5071
e73d3ca6
PT
5072 /* Now go through the formal arglist. */
5073 arg_num = 1;
5074 for (formal = dtio_sub->formal; formal; formal = formal->next, arg_num++)
5075 {
5076 if (!formatted && arg_num == 3)
5077 arg_num = 5;
5078 fsym = formal->sym;
a8de3002
PT
5079
5080 if (fsym == NULL)
5081 {
5082 gfc_error ("Alternate return at %L is not permitted in a DTIO "
5083 "procedure", &dtio_sub->declared_at);
5084 return;
5085 }
5086
e73d3ca6
PT
5087 switch (arg_num)
5088 {
5089 case(1): /* DTV */
5090 type = derived->attr.sequence || derived->attr.is_bind_c ?
5091 BT_DERIVED : BT_CLASS;
5092 kind = 0;
5093 intent = read ? INTENT_INOUT : INTENT_IN;
5094 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5095 0, intent);
5096 break;
5097
5098 case(2): /* UNIT */
5099 type = BT_INTEGER;
5100 kind = gfc_default_integer_kind;
5101 intent = INTENT_IN;
5102 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5103 0, intent);
5104 break;
5105 case(3): /* IOTYPE */
5106 type = BT_CHARACTER;
5107 kind = gfc_default_character_kind;
5108 intent = INTENT_IN;
5109 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5110 0, intent);
5111 break;
5112 case(4): /* VLIST */
5113 type = BT_INTEGER;
5114 kind = gfc_default_integer_kind;
5115 intent = INTENT_IN;
5116 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5117 1, intent);
5118 break;
5119 case(5): /* IOSTAT */
5120 type = BT_INTEGER;
5121 kind = gfc_default_integer_kind;
5122 intent = INTENT_OUT;
5123 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5124 0, intent);
5125 break;
5126 case(6): /* IOMSG */
5127 type = BT_CHARACTER;
5128 kind = gfc_default_character_kind;
5129 intent = INTENT_INOUT;
5130 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5131 0, intent);
5132 break;
5133 default:
5134 gcc_unreachable ();
5135 }
5136 }
5137 derived->attr.has_dtio_procs = 1;
5138 return;
5139}
5140
5141void
5142gfc_check_dtio_interfaces (gfc_symbol *derived)
5143{
5144 gfc_symtree *tb_io_st;
5145 bool t = false;
5146 int code;
5147 bool formatted;
5148
5149 if (derived->attr.is_class == 1 || derived->attr.vtype == 1)
5150 return;
5151
5152 /* Check typebound DTIO bindings. */
5153 for (code = 0; code < 4; code++)
5154 {
5155 formatted = ((dtio_codes)code == DTIO_RF)
5156 || ((dtio_codes)code == DTIO_WF);
5157
5158 tb_io_st = gfc_find_typebound_proc (derived, &t,
5159 gfc_code2string (dtio_procs, code),
5160 true, &derived->declared_at);
5161 if (tb_io_st != NULL)
5162 check_dtio_interface1 (derived, tb_io_st, true, formatted, code);
5163 }
5164
5165 /* Check generic DTIO interfaces. */
5166 for (code = 0; code < 4; code++)
5167 {
5168 formatted = ((dtio_codes)code == DTIO_RF)
5169 || ((dtio_codes)code == DTIO_WF);
5170
5171 tb_io_st = gfc_find_symtree (derived->ns->sym_root,
5172 gfc_code2string (dtio_procs, code));
5173 if (tb_io_st != NULL)
5174 check_dtio_interface1 (derived, tb_io_st, false, formatted, code);
5175 }
5176}
5177
5178
e4e659b9
JW
5179gfc_symtree*
5180gfc_find_typebound_dtio_proc (gfc_symbol *derived, bool write, bool formatted)
e73d3ca6
PT
5181{
5182 gfc_symtree *tb_io_st = NULL;
e73d3ca6
PT
5183 bool t = false;
5184
dbeaa7ab
ME
5185 if (!derived || !derived->resolve_symbol_called
5186 || derived->attr.flavor != FL_DERIVED)
9beb81ed
PT
5187 return NULL;
5188
e73d3ca6
PT
5189 /* Try to find a typebound DTIO binding. */
5190 if (formatted == true)
5191 {
5192 if (write == true)
5193 tb_io_st = gfc_find_typebound_proc (derived, &t,
5194 gfc_code2string (dtio_procs,
5195 DTIO_WF),
5196 true,
5197 &derived->declared_at);
5198 else
5199 tb_io_st = gfc_find_typebound_proc (derived, &t,
5200 gfc_code2string (dtio_procs,
5201 DTIO_RF),
5202 true,
5203 &derived->declared_at);
5204 }
5205 else
5206 {
5207 if (write == true)
5208 tb_io_st = gfc_find_typebound_proc (derived, &t,
5209 gfc_code2string (dtio_procs,
5210 DTIO_WUF),
5211 true,
5212 &derived->declared_at);
5213 else
5214 tb_io_st = gfc_find_typebound_proc (derived, &t,
5215 gfc_code2string (dtio_procs,
5216 DTIO_RUF),
5217 true,
5218 &derived->declared_at);
5219 }
e4e659b9
JW
5220 return tb_io_st;
5221}
5222
5223
5224gfc_symbol *
5225gfc_find_specific_dtio_proc (gfc_symbol *derived, bool write, bool formatted)
5226{
5227 gfc_symtree *tb_io_st = NULL;
5228 gfc_symbol *dtio_sub = NULL;
5229 gfc_symbol *extended;
5230 gfc_typebound_proc *tb_io_proc, *specific_proc;
5231
5232 tb_io_st = gfc_find_typebound_dtio_proc (derived, write, formatted);
e73d3ca6
PT
5233
5234 if (tb_io_st != NULL)
5235 {
096506bb
PT
5236 const char *genname;
5237 gfc_symtree *st;
5238
e73d3ca6
PT
5239 tb_io_proc = tb_io_st->n.tb;
5240 gcc_assert (tb_io_proc != NULL);
5241 gcc_assert (tb_io_proc->is_generic);
5242 gcc_assert (tb_io_proc->u.generic->next == NULL);
5243
5244 specific_proc = tb_io_proc->u.generic->specific;
5245 gcc_assert (!specific_proc->is_generic);
5246
096506bb
PT
5247 /* Go back and make sure that we have the right specific procedure.
5248 Here we most likely have a procedure from the parent type, which
5249 can be overridden in extensions. */
5250 genname = tb_io_proc->u.generic->specific_st->name;
5251 st = gfc_find_typebound_proc (derived, NULL, genname,
5252 true, &tb_io_proc->where);
5253 if (st)
5254 dtio_sub = st->n.tb->u.specific->n.sym;
5255 else
5256 dtio_sub = specific_proc->u.specific->n.sym;
e73d3ca6 5257
e4e659b9
JW
5258 goto finish;
5259 }
e73d3ca6
PT
5260
5261 /* If there is not a typebound binding, look for a generic
5262 DTIO interface. */
5263 for (extended = derived; extended;
5264 extended = gfc_get_derived_super_type (extended))
5265 {
e4e659b9
JW
5266 if (extended == NULL || extended->ns == NULL
5267 || extended->attr.flavor == FL_UNKNOWN)
a8de3002
PT
5268 return NULL;
5269
e73d3ca6
PT
5270 if (formatted == true)
5271 {
5272 if (write == true)
5273 tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5274 gfc_code2string (dtio_procs,
5275 DTIO_WF));
5276 else
5277 tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5278 gfc_code2string (dtio_procs,
5279 DTIO_RF));
5280 }
5281 else
5282 {
5283 if (write == true)
5284 tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5285 gfc_code2string (dtio_procs,
5286 DTIO_WUF));
5287 else
5288 tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5289 gfc_code2string (dtio_procs,
5290 DTIO_RUF));
5291 }
5292
5293 if (tb_io_st != NULL
5294 && tb_io_st->n.sym
5295 && tb_io_st->n.sym->generic)
5296 {
40109581 5297 for (gfc_interface *intr = tb_io_st->n.sym->generic;
413e859c 5298 intr && intr->sym; intr = intr->next)
e73d3ca6 5299 {
413e859c 5300 if (intr->sym->formal)
e73d3ca6 5301 {
413e859c
JW
5302 gfc_symbol *fsym = intr->sym->formal->sym;
5303 if ((fsym->ts.type == BT_CLASS
5304 && CLASS_DATA (fsym)->ts.u.derived == extended)
5305 || (fsym->ts.type == BT_DERIVED
5306 && fsym->ts.u.derived == extended))
5307 {
5308 dtio_sub = intr->sym;
5309 break;
5310 }
e73d3ca6
PT
5311 }
5312 }
5313 }
5314 }
5315
5316finish:
72d91d6c
TB
5317 if (dtio_sub
5318 && dtio_sub->formal->sym->ts.type == BT_CLASS
5319 && derived != CLASS_DATA (dtio_sub->formal->sym)->ts.u.derived)
e73d3ca6
PT
5320 gfc_find_derived_vtab (derived);
5321
5322 return dtio_sub;
5323}
e68a35ae
TK
5324
5325/* Helper function - if we do not find an interface for a procedure,
5326 construct it from the actual arglist. Luckily, this can only
5327 happen for call by reference, so the information we actually need
5328 to provide (and which would be impossible to guess from the call
5329 itself) is not actually needed. */
5330
5331void
5332gfc_get_formal_from_actual_arglist (gfc_symbol *sym,
5333 gfc_actual_arglist *actual_args)
5334{
5335 gfc_actual_arglist *a;
5336 gfc_formal_arglist **f;
5337 gfc_symbol *s;
5338 char name[GFC_MAX_SYMBOL_LEN + 1];
5339 static int var_num;
5340
5341 f = &sym->formal;
5342 for (a = actual_args; a != NULL; a = a->next)
5343 {
5344 (*f) = gfc_get_formal_arglist ();
5345 if (a->expr)
5346 {
5347 snprintf (name, GFC_MAX_SYMBOL_LEN, "_formal_%d", var_num ++);
5348 gfc_get_symbol (name, gfc_current_ns, &s);
5349 if (a->expr->ts.type == BT_PROCEDURE)
5350 {
5351 s->attr.flavor = FL_PROCEDURE;
5352 }
5353 else
5354 {
5355 s->ts = a->expr->ts;
5356
5357 if (s->ts.type == BT_CHARACTER)
5358 s->ts.u.cl = gfc_get_charlen ();
5359
5360 s->ts.deferred = 0;
5361 s->ts.is_iso_c = 0;
5362 s->ts.is_c_interop = 0;
5363 s->attr.flavor = FL_VARIABLE;
e68a35ae
TK
5364 if (a->expr->rank > 0)
5365 {
5366 s->attr.dimension = 1;
5367 s->as = gfc_get_array_spec ();
5368 s->as->rank = 1;
5369 s->as->lower[0] = gfc_get_int_expr (gfc_index_integer_kind,
5370 &a->expr->where, 1);
5371 s->as->upper[0] = NULL;
5372 s->as->type = AS_ASSUMED_SIZE;
5373 }
4a4fc7fe
TK
5374 else
5375 s->maybe_array = maybe_dummy_array_arg (a->expr);
e68a35ae
TK
5376 }
5377 s->attr.dummy = 1;
3b0e49a5 5378 s->attr.artificial = 1;
e0b9e5f9 5379 s->declared_at = a->expr->where;
e68a35ae
TK
5380 s->attr.intent = INTENT_UNKNOWN;
5381 (*f)->sym = s;
5382 }
5383 else /* If a->expr is NULL, this is an alternate rerturn. */
5384 (*f)->sym = NULL;
5385
5386 f = &((*f)->next);
5387 }
5388}