]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/interface.c
re PR testsuite/86153 (test case g++.dg/pr83239.C fails starting with r261585)
[thirdparty/gcc.git] / gcc / fortran / interface.c
CommitLineData
6de9cd9a 1/* Deal with interfaces.
85ec4feb 2 Copyright (C) 2000-2018 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{
125 if (strncmp (mode, "formatted", 9) == 0)
126 return INTRINSIC_FORMATTED;
127 if (strncmp (mode, "unformatted", 9) == 0)
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
77b7d71e
AV
695 /* The _data component is not always present, therefore check for its
696 presence before assuming, that its derived->attr is available.
697 When the _data component is not present, then nevertheless the
698 unlimited_polymorphic flag may be set in the derived type's attr. */
699 if (ts1->type == BT_CLASS && ts1->u.derived->components
700 && ((ts1->u.derived->attr.is_class
701 && ts1->u.derived->components->ts.u.derived->attr
702 .unlimited_polymorphic)
703 || ts1->u.derived->attr.unlimited_polymorphic))
f3e1097b 704 return true;
8b704316
PT
705
706 /* F2003: C717 */
707 if (ts2->type == BT_CLASS && ts1->type == BT_DERIVED
77b7d71e
AV
708 && ts2->u.derived->components
709 && ((ts2->u.derived->attr.is_class
710 && ts2->u.derived->components->ts.u.derived->attr
711 .unlimited_polymorphic)
712 || ts2->u.derived->attr.unlimited_polymorphic)
8b704316 713 && (ts1->u.derived->attr.sequence || ts1->u.derived->attr.is_bind_c))
f3e1097b 714 return true;
8b704316 715
cf2b3c22 716 if (ts1->type != ts2->type
908b8296
FR
717 && ((ts1->type != BT_DERIVED && ts1->type != BT_CLASS)
718 || (ts2->type != BT_DERIVED && ts2->type != BT_CLASS)))
f3e1097b 719 return false;
908b8296
FR
720
721 if (ts1->type == BT_UNION)
f3e1097b 722 return compare_union_types (ts1->u.derived, ts2->u.derived);
908b8296 723
cf2b3c22 724 if (ts1->type != BT_DERIVED && ts1->type != BT_CLASS)
e0e85e06
PT
725 return (ts1->kind == ts2->kind);
726
727 /* Compare derived types. */
f6288c24 728 return gfc_type_compatible (ts1, ts2);
e0e85e06
PT
729}
730
6de9cd9a 731
f3e1097b 732static bool
e7333b69
JW
733compare_type (gfc_symbol *s1, gfc_symbol *s2)
734{
735 if (s2->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
f3e1097b 736 return true;
e7333b69 737
60de1c7d
TB
738 /* TYPE and CLASS of the same declared type are type compatible,
739 but have different characteristics. */
740 if ((s1->ts.type == BT_CLASS && s2->ts.type == BT_DERIVED)
741 || (s1->ts.type == BT_DERIVED && s2->ts.type == BT_CLASS))
f3e1097b 742 return false;
60de1c7d 743
e7333b69
JW
744 return gfc_compare_types (&s1->ts, &s2->ts) || s2->ts.type == BT_ASSUMED;
745}
746
6de9cd9a 747
f3e1097b 748static bool
e7333b69 749compare_rank (gfc_symbol *s1, gfc_symbol *s2)
6de9cd9a 750{
aa6590cf 751 gfc_array_spec *as1, *as2;
6de9cd9a
DN
752 int r1, r2;
753
e7333b69 754 if (s2->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
f3e1097b 755 return true;
e7ac6a7c 756
75a3c61a
LK
757 as1 = (s1->ts.type == BT_CLASS
758 && !s1->ts.u.derived->attr.unlimited_polymorphic)
759 ? CLASS_DATA (s1)->as : s1->as;
760 as2 = (s2->ts.type == BT_CLASS
761 && !s2->ts.u.derived->attr.unlimited_polymorphic)
762 ? CLASS_DATA (s2)->as : s2->as;
aa6590cf
JW
763
764 r1 = as1 ? as1->rank : 0;
765 r2 = as2 ? as2->rank : 0;
6de9cd9a 766
e7333b69 767 if (r1 != r2 && (!as2 || as2->type != AS_ASSUMED_RANK))
f3e1097b 768 return false; /* Ranks differ. */
6de9cd9a 769
f3e1097b 770 return true;
e7333b69
JW
771}
772
773
774/* Given two symbols that are formal arguments, compare their ranks
f3e1097b
JW
775 and types. Returns true if they have the same rank and type,
776 false otherwise. */
e7333b69 777
f3e1097b 778static bool
e7333b69
JW
779compare_type_rank (gfc_symbol *s1, gfc_symbol *s2)
780{
781 return compare_type (s1, s2) && compare_rank (s1, s2);
6de9cd9a
DN
782}
783
784
6de9cd9a
DN
785/* Given two symbols that are formal arguments, compare their types
786 and rank and their formal interfaces if they are both dummy
f3e1097b 787 procedures. Returns true if the same, false if different. */
6de9cd9a 788
f3e1097b 789static bool
b251af97 790compare_type_rank_if (gfc_symbol *s1, gfc_symbol *s2)
6de9cd9a 791{
26f2ca2b 792 if (s1 == NULL || s2 == NULL)
f3e1097b 793 return (s1 == s2);
6de9cd9a 794
489ec4e3 795 if (s1 == s2)
f3e1097b 796 return true;
489ec4e3 797
6de9cd9a
DN
798 if (s1->attr.flavor != FL_PROCEDURE && s2->attr.flavor != FL_PROCEDURE)
799 return compare_type_rank (s1, s2);
800
801 if (s1->attr.flavor != FL_PROCEDURE || s2->attr.flavor != FL_PROCEDURE)
f3e1097b 802 return false;
6de9cd9a 803
489ec4e3
PT
804 /* At this point, both symbols are procedures. It can happen that
805 external procedures are compared, where one is identified by usage
806 to be a function or subroutine but the other is not. Check TKR
807 nonetheless for these cases. */
808 if (s1->attr.function == 0 && s1->attr.subroutine == 0)
f3e1097b 809 return s1->attr.external ? compare_type_rank (s1, s2) : false;
489ec4e3
PT
810
811 if (s2->attr.function == 0 && s2->attr.subroutine == 0)
f3e1097b 812 return s2->attr.external ? compare_type_rank (s1, s2) : false;
6de9cd9a 813
489ec4e3 814 /* Now the type of procedure has been identified. */
6de9cd9a
DN
815 if (s1->attr.function != s2->attr.function
816 || s1->attr.subroutine != s2->attr.subroutine)
f3e1097b 817 return false;
6de9cd9a 818
f3e1097b
JW
819 if (s1->attr.function && !compare_type_rank (s1, s2))
820 return false;
6de9cd9a 821
993ef28f
PT
822 /* Originally, gfortran recursed here to check the interfaces of passed
823 procedures. This is explicitly not required by the standard. */
f3e1097b 824 return true;
6de9cd9a
DN
825}
826
827
828/* Given a formal argument list and a keyword name, search the list
829 for that keyword. Returns the correct symbol node if found, NULL
830 if not found. */
831
832static gfc_symbol *
b251af97 833find_keyword_arg (const char *name, gfc_formal_arglist *f)
6de9cd9a 834{
6de9cd9a
DN
835 for (; f; f = f->next)
836 if (strcmp (f->sym->name, name) == 0)
837 return f->sym;
838
839 return NULL;
840}
841
842
843/******** Interface checking subroutines **********/
844
845
846/* Given an operator interface and the operator, make sure that all
847 interfaces for that operator are legal. */
848
94747289
DK
849bool
850gfc_check_operator_interface (gfc_symbol *sym, gfc_intrinsic_op op,
851 locus opwhere)
6de9cd9a
DN
852{
853 gfc_formal_arglist *formal;
854 sym_intent i1, i2;
6de9cd9a 855 bt t1, t2;
27189292 856 int args, r1, r2, k1, k2;
6de9cd9a 857
94747289 858 gcc_assert (sym);
6de9cd9a
DN
859
860 args = 0;
861 t1 = t2 = BT_UNKNOWN;
862 i1 = i2 = INTENT_UNKNOWN;
27189292
FXC
863 r1 = r2 = -1;
864 k1 = k2 = -1;
6de9cd9a 865
4cbc9039 866 for (formal = gfc_sym_get_dummy_args (sym); formal; formal = formal->next)
6de9cd9a 867 {
94747289
DK
868 gfc_symbol *fsym = formal->sym;
869 if (fsym == NULL)
8c086c9c
PT
870 {
871 gfc_error ("Alternate return cannot appear in operator "
94747289
DK
872 "interface at %L", &sym->declared_at);
873 return false;
8c086c9c 874 }
6de9cd9a
DN
875 if (args == 0)
876 {
94747289
DK
877 t1 = fsym->ts.type;
878 i1 = fsym->attr.intent;
879 r1 = (fsym->as != NULL) ? fsym->as->rank : 0;
880 k1 = fsym->ts.kind;
6de9cd9a
DN
881 }
882 if (args == 1)
883 {
94747289
DK
884 t2 = fsym->ts.type;
885 i2 = fsym->attr.intent;
886 r2 = (fsym->as != NULL) ? fsym->as->rank : 0;
887 k2 = fsym->ts.kind;
6de9cd9a
DN
888 }
889 args++;
890 }
891
27189292
FXC
892 /* Only +, - and .not. can be unary operators.
893 .not. cannot be a binary operator. */
a1ee985f
KG
894 if (args == 0 || args > 2 || (args == 1 && op != INTRINSIC_PLUS
895 && op != INTRINSIC_MINUS
896 && op != INTRINSIC_NOT)
897 || (args == 2 && op == INTRINSIC_NOT))
27189292 898 {
efb63364
TB
899 if (op == INTRINSIC_ASSIGN)
900 gfc_error ("Assignment operator interface at %L must have "
901 "two arguments", &sym->declared_at);
902 else
903 gfc_error ("Operator interface at %L has the wrong number of arguments",
904 &sym->declared_at);
94747289 905 return false;
27189292
FXC
906 }
907
908 /* Check that intrinsics are mapped to functions, except
909 INTRINSIC_ASSIGN which should map to a subroutine. */
a1ee985f 910 if (op == INTRINSIC_ASSIGN)
6de9cd9a 911 {
4cbc9039
JW
912 gfc_formal_arglist *dummy_args;
913
6de9cd9a
DN
914 if (!sym->attr.subroutine)
915 {
b251af97 916 gfc_error ("Assignment operator interface at %L must be "
94747289
DK
917 "a SUBROUTINE", &sym->declared_at);
918 return false;
6de9cd9a 919 }
e19bb186
TB
920
921 /* Allowed are (per F2003, 12.3.2.1.2 Defined assignments):
94747289 922 - First argument an array with different rank than second,
315d905f
TB
923 - First argument is a scalar and second an array,
924 - Types and kinds do not conform, or
94747289 925 - First argument is of derived type. */
4cbc9039
JW
926 dummy_args = gfc_sym_get_dummy_args (sym);
927 if (dummy_args->sym->ts.type != BT_DERIVED
928 && dummy_args->sym->ts.type != BT_CLASS
315d905f 929 && (r2 == 0 || r1 == r2)
4cbc9039
JW
930 && (dummy_args->sym->ts.type == dummy_args->next->sym->ts.type
931 || (gfc_numeric_ts (&dummy_args->sym->ts)
932 && gfc_numeric_ts (&dummy_args->next->sym->ts))))
8c086c9c 933 {
b251af97 934 gfc_error ("Assignment operator interface at %L must not redefine "
94747289
DK
935 "an INTRINSIC type assignment", &sym->declared_at);
936 return false;
8c086c9c 937 }
6de9cd9a
DN
938 }
939 else
940 {
941 if (!sym->attr.function)
942 {
943 gfc_error ("Intrinsic operator interface at %L must be a FUNCTION",
94747289
DK
944 &sym->declared_at);
945 return false;
6de9cd9a
DN
946 }
947 }
948
27189292 949 /* Check intents on operator interfaces. */
a1ee985f 950 if (op == INTRINSIC_ASSIGN)
6de9cd9a 951 {
27189292 952 if (i1 != INTENT_OUT && i1 != INTENT_INOUT)
94747289
DK
953 {
954 gfc_error ("First argument of defined assignment at %L must be "
955 "INTENT(OUT) or INTENT(INOUT)", &sym->declared_at);
956 return false;
957 }
27189292
FXC
958
959 if (i2 != INTENT_IN)
94747289
DK
960 {
961 gfc_error ("Second argument of defined assignment at %L must be "
962 "INTENT(IN)", &sym->declared_at);
963 return false;
964 }
27189292
FXC
965 }
966 else
967 {
968 if (i1 != INTENT_IN)
94747289
DK
969 {
970 gfc_error ("First argument of operator interface at %L must be "
971 "INTENT(IN)", &sym->declared_at);
972 return false;
973 }
27189292
FXC
974
975 if (args == 2 && i2 != INTENT_IN)
94747289
DK
976 {
977 gfc_error ("Second argument of operator interface at %L must be "
978 "INTENT(IN)", &sym->declared_at);
979 return false;
980 }
27189292
FXC
981 }
982
983 /* From now on, all we have to do is check that the operator definition
984 doesn't conflict with an intrinsic operator. The rules for this
985 game are defined in 7.1.2 and 7.1.3 of both F95 and F2003 standards,
986 as well as 12.3.2.1.1 of Fortran 2003:
987
988 "If the operator is an intrinsic-operator (R310), the number of
989 function arguments shall be consistent with the intrinsic uses of
990 that operator, and the types, kind type parameters, or ranks of the
991 dummy arguments shall differ from those required for the intrinsic
992 operation (7.1.2)." */
993
994#define IS_NUMERIC_TYPE(t) \
995 ((t) == BT_INTEGER || (t) == BT_REAL || (t) == BT_COMPLEX)
996
997 /* Unary ops are easy, do them first. */
a1ee985f 998 if (op == INTRINSIC_NOT)
27189292
FXC
999 {
1000 if (t1 == BT_LOGICAL)
6de9cd9a 1001 goto bad_repl;
27189292 1002 else
94747289 1003 return true;
27189292 1004 }
6de9cd9a 1005
a1ee985f 1006 if (args == 1 && (op == INTRINSIC_PLUS || op == INTRINSIC_MINUS))
27189292
FXC
1007 {
1008 if (IS_NUMERIC_TYPE (t1))
6de9cd9a 1009 goto bad_repl;
27189292 1010 else
94747289 1011 return true;
27189292 1012 }
6de9cd9a 1013
27189292
FXC
1014 /* Character intrinsic operators have same character kind, thus
1015 operator definitions with operands of different character kinds
1016 are always safe. */
1017 if (t1 == BT_CHARACTER && t2 == BT_CHARACTER && k1 != k2)
94747289 1018 return true;
6de9cd9a 1019
27189292
FXC
1020 /* Intrinsic operators always perform on arguments of same rank,
1021 so different ranks is also always safe. (rank == 0) is an exception
1022 to that, because all intrinsic operators are elemental. */
1023 if (r1 != r2 && r1 != 0 && r2 != 0)
94747289 1024 return true;
6de9cd9a 1025
a1ee985f 1026 switch (op)
27189292 1027 {
6de9cd9a 1028 case INTRINSIC_EQ:
3bed9dd0 1029 case INTRINSIC_EQ_OS:
6de9cd9a 1030 case INTRINSIC_NE:
3bed9dd0 1031 case INTRINSIC_NE_OS:
27189292 1032 if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
6de9cd9a 1033 goto bad_repl;
27189292 1034 /* Fall through. */
6de9cd9a 1035
27189292
FXC
1036 case INTRINSIC_PLUS:
1037 case INTRINSIC_MINUS:
1038 case INTRINSIC_TIMES:
1039 case INTRINSIC_DIVIDE:
1040 case INTRINSIC_POWER:
1041 if (IS_NUMERIC_TYPE (t1) && IS_NUMERIC_TYPE (t2))
1042 goto bad_repl;
6de9cd9a
DN
1043 break;
1044
6de9cd9a 1045 case INTRINSIC_GT:
3bed9dd0 1046 case INTRINSIC_GT_OS:
27189292 1047 case INTRINSIC_GE:
3bed9dd0 1048 case INTRINSIC_GE_OS:
27189292 1049 case INTRINSIC_LT:
3bed9dd0 1050 case INTRINSIC_LT_OS:
27189292 1051 case INTRINSIC_LE:
3bed9dd0 1052 case INTRINSIC_LE_OS:
27189292
FXC
1053 if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
1054 goto bad_repl;
6de9cd9a
DN
1055 if ((t1 == BT_INTEGER || t1 == BT_REAL)
1056 && (t2 == BT_INTEGER || t2 == BT_REAL))
1057 goto bad_repl;
27189292 1058 break;
6de9cd9a 1059
27189292
FXC
1060 case INTRINSIC_CONCAT:
1061 if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
1062 goto bad_repl;
6de9cd9a
DN
1063 break;
1064
6de9cd9a 1065 case INTRINSIC_AND:
27189292 1066 case INTRINSIC_OR:
6de9cd9a
DN
1067 case INTRINSIC_EQV:
1068 case INTRINSIC_NEQV:
6de9cd9a
DN
1069 if (t1 == BT_LOGICAL && t2 == BT_LOGICAL)
1070 goto bad_repl;
1071 break;
1072
6de9cd9a 1073 default:
27189292
FXC
1074 break;
1075 }
6de9cd9a 1076
94747289 1077 return true;
6de9cd9a 1078
27189292
FXC
1079#undef IS_NUMERIC_TYPE
1080
6de9cd9a
DN
1081bad_repl:
1082 gfc_error ("Operator interface at %L conflicts with intrinsic interface",
94747289
DK
1083 &opwhere);
1084 return false;
6de9cd9a
DN
1085}
1086
1087
1088/* Given a pair of formal argument lists, we see if the two lists can
1089 be distinguished by counting the number of nonoptional arguments of
1090 a given type/rank in f1 and seeing if there are less then that
1091 number of those arguments in f2 (including optional arguments).
1092 Since this test is asymmetric, it has to be called twice to make it
6f3ab30d
JW
1093 symmetric. Returns nonzero if the argument lists are incompatible
1094 by this test. This subroutine implements rule 1 of section F03:16.2.3.
1095 'p1' and 'p2' are the PASS arguments of both procedures (if applicable). */
6de9cd9a 1096
f3e1097b 1097static bool
6f3ab30d
JW
1098count_types_test (gfc_formal_arglist *f1, gfc_formal_arglist *f2,
1099 const char *p1, const char *p2)
6de9cd9a 1100{
f3e1097b 1101 int ac1, ac2, i, j, k, n1;
6de9cd9a
DN
1102 gfc_formal_arglist *f;
1103
1104 typedef struct
1105 {
1106 int flag;
1107 gfc_symbol *sym;
1108 }
1109 arginfo;
1110
1111 arginfo *arg;
1112
1113 n1 = 0;
1114
1115 for (f = f1; f; f = f->next)
1116 n1++;
1117
1118 /* Build an array of integers that gives the same integer to
1119 arguments of the same type/rank. */
ece3f663 1120 arg = XCNEWVEC (arginfo, n1);
6de9cd9a
DN
1121
1122 f = f1;
1123 for (i = 0; i < n1; i++, f = f->next)
1124 {
1125 arg[i].flag = -1;
1126 arg[i].sym = f->sym;
1127 }
1128
1129 k = 0;
1130
1131 for (i = 0; i < n1; i++)
1132 {
1133 if (arg[i].flag != -1)
1134 continue;
1135
6f3ab30d
JW
1136 if (arg[i].sym && (arg[i].sym->attr.optional
1137 || (p1 && strcmp (arg[i].sym->name, p1) == 0)))
1138 continue; /* Skip OPTIONAL and PASS arguments. */
6de9cd9a
DN
1139
1140 arg[i].flag = k;
1141
6f3ab30d 1142 /* Find other non-optional, non-pass arguments of the same type/rank. */
6de9cd9a 1143 for (j = i + 1; j < n1; j++)
6f3ab30d
JW
1144 if ((arg[j].sym == NULL
1145 || !(arg[j].sym->attr.optional
1146 || (p1 && strcmp (arg[j].sym->name, p1) == 0)))
2b603773
JW
1147 && (compare_type_rank_if (arg[i].sym, arg[j].sym)
1148 || compare_type_rank_if (arg[j].sym, arg[i].sym)))
6de9cd9a
DN
1149 arg[j].flag = k;
1150
1151 k++;
1152 }
1153
1154 /* Now loop over each distinct type found in f1. */
1155 k = 0;
f3e1097b 1156 bool rc = false;
6de9cd9a
DN
1157
1158 for (i = 0; i < n1; i++)
1159 {
1160 if (arg[i].flag != k)
1161 continue;
1162
1163 ac1 = 1;
1164 for (j = i + 1; j < n1; j++)
1165 if (arg[j].flag == k)
1166 ac1++;
1167
6f3ab30d
JW
1168 /* Count the number of non-pass arguments in f2 with that type,
1169 including those that are optional. */
6de9cd9a
DN
1170 ac2 = 0;
1171
1172 for (f = f2; f; f = f->next)
6f3ab30d
JW
1173 if ((!p2 || strcmp (f->sym->name, p2) != 0)
1174 && (compare_type_rank_if (arg[i].sym, f->sym)
1175 || compare_type_rank_if (f->sym, arg[i].sym)))
6de9cd9a
DN
1176 ac2++;
1177
1178 if (ac1 > ac2)
1179 {
f3e1097b 1180 rc = true;
6de9cd9a
DN
1181 break;
1182 }
1183
1184 k++;
1185 }
1186
cede9502 1187 free (arg);
6de9cd9a
DN
1188
1189 return rc;
1190}
1191
1192
c7927c3b
JW
1193/* Returns true if two dummy arguments are distinguishable due to their POINTER
1194 and ALLOCATABLE attributes according to F2018 section 15.4.3.4.5 (3).
1195 The function is asymmetric wrt to the arguments s1 and s2 and should always
1196 be called twice (with flipped arguments in the second call). */
1197
1198static bool
1199compare_ptr_alloc(gfc_symbol *s1, gfc_symbol *s2)
1200{
1201 /* Is s1 allocatable? */
1202 const bool a1 = s1->ts.type == BT_CLASS ?
1203 CLASS_DATA(s1)->attr.allocatable : s1->attr.allocatable;
1204 /* Is s2 a pointer? */
1205 const bool p2 = s2->ts.type == BT_CLASS ?
1206 CLASS_DATA(s2)->attr.class_pointer : s2->attr.pointer;
1207 return a1 && p2 && (s2->attr.intent != INTENT_IN);
1208}
1209
1210
e9355cc3
JW
1211/* Perform the correspondence test in rule (3) of F08:C1215.
1212 Returns zero if no argument is found that satisfies this rule,
1213 nonzero otherwise. 'p1' and 'p2' are the PASS arguments of both procedures
6f3ab30d 1214 (if applicable).
6de9cd9a
DN
1215
1216 This test is also not symmetric in f1 and f2 and must be called
1217 twice. This test finds problems caused by sorting the actual
1218 argument list with keywords. For example:
1219
1220 INTERFACE FOO
e9355cc3
JW
1221 SUBROUTINE F1(A, B)
1222 INTEGER :: A ; REAL :: B
1223 END SUBROUTINE F1
6de9cd9a 1224
e9355cc3
JW
1225 SUBROUTINE F2(B, A)
1226 INTEGER :: A ; REAL :: B
1227 END SUBROUTINE F1
6de9cd9a
DN
1228 END INTERFACE FOO
1229
1230 At this point, 'CALL FOO(A=1, B=1.0)' is ambiguous. */
1231
f3e1097b 1232static bool
6f3ab30d
JW
1233generic_correspondence (gfc_formal_arglist *f1, gfc_formal_arglist *f2,
1234 const char *p1, const char *p2)
6de9cd9a 1235{
6de9cd9a
DN
1236 gfc_formal_arglist *f2_save, *g;
1237 gfc_symbol *sym;
1238
1239 f2_save = f2;
1240
1241 while (f1)
1242 {
1243 if (f1->sym->attr.optional)
1244 goto next;
1245
6f3ab30d
JW
1246 if (p1 && strcmp (f1->sym->name, p1) == 0)
1247 f1 = f1->next;
1248 if (f2 && p2 && strcmp (f2->sym->name, p2) == 0)
1249 f2 = f2->next;
1250
2b603773 1251 if (f2 != NULL && (compare_type_rank (f1->sym, f2->sym)
e9355cc3
JW
1252 || compare_type_rank (f2->sym, f1->sym))
1253 && !((gfc_option.allow_std & GFC_STD_F2008)
c7927c3b
JW
1254 && (compare_ptr_alloc(f1->sym, f2->sym)
1255 || compare_ptr_alloc(f2->sym, f1->sym))))
6de9cd9a
DN
1256 goto next;
1257
1258 /* Now search for a disambiguating keyword argument starting at
b251af97 1259 the current non-match. */
6de9cd9a
DN
1260 for (g = f1; g; g = g->next)
1261 {
6f3ab30d 1262 if (g->sym->attr.optional || (p1 && strcmp (g->sym->name, p1) == 0))
6de9cd9a
DN
1263 continue;
1264
1265 sym = find_keyword_arg (g->sym->name, f2_save);
e9355cc3
JW
1266 if (sym == NULL || !compare_type_rank (g->sym, sym)
1267 || ((gfc_option.allow_std & GFC_STD_F2008)
c7927c3b
JW
1268 && (compare_ptr_alloc(sym, g->sym)
1269 || compare_ptr_alloc(g->sym, sym))))
f3e1097b 1270 return true;
6de9cd9a
DN
1271 }
1272
1273 next:
6f3ab30d
JW
1274 if (f1 != NULL)
1275 f1 = f1->next;
6de9cd9a
DN
1276 if (f2 != NULL)
1277 f2 = f2->next;
1278 }
1279
f3e1097b 1280 return false;
6de9cd9a
DN
1281}
1282
1283
e7333b69
JW
1284static int
1285symbol_rank (gfc_symbol *sym)
1286{
1fb84d5b
SK
1287 gfc_array_spec *as = NULL;
1288
f11600c9 1289 if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
1fb84d5b
SK
1290 as = CLASS_DATA (sym)->as;
1291 else
1292 as = sym->as;
1293
e7333b69
JW
1294 return as ? as->rank : 0;
1295}
1296
1297
9795c594
JW
1298/* Check if the characteristics of two dummy arguments match,
1299 cf. F08:12.3.2. */
1300
4668d6f9
PT
1301bool
1302gfc_check_dummy_characteristics (gfc_symbol *s1, gfc_symbol *s2,
1303 bool type_must_agree, char *errmsg,
1304 int err_len)
9795c594 1305{
9362a03b 1306 if (s1 == NULL || s2 == NULL)
524af0d6 1307 return s1 == s2 ? true : false;
9362a03b 1308
9795c594 1309 /* Check type and rank. */
e7333b69 1310 if (type_must_agree)
9795c594 1311 {
e7333b69
JW
1312 if (!compare_type (s1, s2) || !compare_type (s2, s1))
1313 {
1314 snprintf (errmsg, err_len, "Type mismatch in argument '%s' (%s/%s)",
1315 s1->name, gfc_typename (&s1->ts), gfc_typename (&s2->ts));
1316 return false;
1317 }
1318 if (!compare_rank (s1, s2))
1319 {
1320 snprintf (errmsg, err_len, "Rank mismatch in argument '%s' (%i/%i)",
1321 s1->name, symbol_rank (s1), symbol_rank (s2));
1322 return false;
1323 }
9795c594
JW
1324 }
1325
1326 /* Check INTENT. */
1327 if (s1->attr.intent != s2->attr.intent)
1328 {
1329 snprintf (errmsg, err_len, "INTENT mismatch in argument '%s'",
1330 s1->name);
524af0d6 1331 return false;
9795c594
JW
1332 }
1333
1334 /* Check OPTIONAL attribute. */
1335 if (s1->attr.optional != s2->attr.optional)
1336 {
1337 snprintf (errmsg, err_len, "OPTIONAL mismatch in argument '%s'",
1338 s1->name);
524af0d6 1339 return false;
9795c594
JW
1340 }
1341
1342 /* Check ALLOCATABLE attribute. */
1343 if (s1->attr.allocatable != s2->attr.allocatable)
1344 {
1345 snprintf (errmsg, err_len, "ALLOCATABLE mismatch in argument '%s'",
1346 s1->name);
524af0d6 1347 return false;
9795c594
JW
1348 }
1349
1350 /* Check POINTER attribute. */
1351 if (s1->attr.pointer != s2->attr.pointer)
1352 {
1353 snprintf (errmsg, err_len, "POINTER mismatch in argument '%s'",
1354 s1->name);
524af0d6 1355 return false;
9795c594
JW
1356 }
1357
1358 /* Check TARGET attribute. */
1359 if (s1->attr.target != s2->attr.target)
1360 {
1361 snprintf (errmsg, err_len, "TARGET mismatch in argument '%s'",
1362 s1->name);
524af0d6 1363 return false;
9795c594
JW
1364 }
1365
688974a3
JW
1366 /* Check ASYNCHRONOUS attribute. */
1367 if (s1->attr.asynchronous != s2->attr.asynchronous)
1368 {
1369 snprintf (errmsg, err_len, "ASYNCHRONOUS mismatch in argument '%s'",
1370 s1->name);
1371 return false;
1372 }
1373
1374 /* Check CONTIGUOUS attribute. */
1375 if (s1->attr.contiguous != s2->attr.contiguous)
1376 {
1377 snprintf (errmsg, err_len, "CONTIGUOUS mismatch in argument '%s'",
1378 s1->name);
1379 return false;
1380 }
1381
1382 /* Check VALUE attribute. */
1383 if (s1->attr.value != s2->attr.value)
1384 {
1385 snprintf (errmsg, err_len, "VALUE mismatch in argument '%s'",
1386 s1->name);
1387 return false;
1388 }
1389
1390 /* Check VOLATILE attribute. */
1391 if (s1->attr.volatile_ != s2->attr.volatile_)
1392 {
1393 snprintf (errmsg, err_len, "VOLATILE mismatch in argument '%s'",
1394 s1->name);
1395 return false;
1396 }
9795c594 1397
f2f8171f
JW
1398 /* Check interface of dummy procedures. */
1399 if (s1->attr.flavor == FL_PROCEDURE)
1400 {
1401 char err[200];
1402 if (!gfc_compare_interfaces (s1, s2, s2->name, 0, 1, err, sizeof(err),
1403 NULL, NULL))
1404 {
1405 snprintf (errmsg, err_len, "Interface mismatch in dummy procedure "
1406 "'%s': %s", s1->name, err);
524af0d6 1407 return false;
f2f8171f
JW
1408 }
1409 }
1410
9795c594
JW
1411 /* Check string length. */
1412 if (s1->ts.type == BT_CHARACTER
1413 && s1->ts.u.cl && s1->ts.u.cl->length
1414 && s2->ts.u.cl && s2->ts.u.cl->length)
1415 {
1416 int compval = gfc_dep_compare_expr (s1->ts.u.cl->length,
1417 s2->ts.u.cl->length);
1418 switch (compval)
1419 {
1420 case -1:
1421 case 1:
1422 case -3:
1423 snprintf (errmsg, err_len, "Character length mismatch "
1424 "in argument '%s'", s1->name);
524af0d6 1425 return false;
9795c594
JW
1426
1427 case -2:
1428 /* FIXME: Implement a warning for this case.
db30e21c 1429 gfc_warning (0, "Possible character length mismatch in argument %qs",
9795c594
JW
1430 s1->name);*/
1431 break;
1432
1433 case 0:
1434 break;
1435
1436 default:
1437 gfc_internal_error ("check_dummy_characteristics: Unexpected result "
1438 "%i of gfc_dep_compare_expr", compval);
1439 break;
1440 }
1441 }
1442
1443 /* Check array shape. */
1444 if (s1->as && s2->as)
1445 {
97f26732
JW
1446 int i, compval;
1447 gfc_expr *shape1, *shape2;
1448
9795c594
JW
1449 if (s1->as->type != s2->as->type)
1450 {
1451 snprintf (errmsg, err_len, "Shape mismatch in argument '%s'",
1452 s1->name);
524af0d6 1453 return false;
9795c594 1454 }
97f26732 1455
b25affbd
TB
1456 if (s1->as->corank != s2->as->corank)
1457 {
1458 snprintf (errmsg, err_len, "Corank mismatch in argument '%s' (%i/%i)",
1459 s1->name, s1->as->corank, s2->as->corank);
1460 return false;
1461 }
1462
97f26732 1463 if (s1->as->type == AS_EXPLICIT)
47da0bf6 1464 for (i = 0; i < s1->as->rank + MAX (0, s1->as->corank-1); i++)
97f26732
JW
1465 {
1466 shape1 = gfc_subtract (gfc_copy_expr (s1->as->upper[i]),
1467 gfc_copy_expr (s1->as->lower[i]));
1468 shape2 = gfc_subtract (gfc_copy_expr (s2->as->upper[i]),
1469 gfc_copy_expr (s2->as->lower[i]));
1470 compval = gfc_dep_compare_expr (shape1, shape2);
1471 gfc_free_expr (shape1);
1472 gfc_free_expr (shape2);
1473 switch (compval)
1474 {
1475 case -1:
1476 case 1:
1477 case -3:
b25affbd
TB
1478 if (i < s1->as->rank)
1479 snprintf (errmsg, err_len, "Shape mismatch in dimension %i of"
1480 " argument '%s'", i + 1, s1->name);
1481 else
1482 snprintf (errmsg, err_len, "Shape mismatch in codimension %i "
1483 "of argument '%s'", i - s1->as->rank + 1, s1->name);
524af0d6 1484 return false;
97f26732
JW
1485
1486 case -2:
1487 /* FIXME: Implement a warning for this case.
db30e21c 1488 gfc_warning (0, "Possible shape mismatch in argument %qs",
97f26732
JW
1489 s1->name);*/
1490 break;
1491
1492 case 0:
1493 break;
1494
1495 default:
1496 gfc_internal_error ("check_dummy_characteristics: Unexpected "
1497 "result %i of gfc_dep_compare_expr",
1498 compval);
1499 break;
1500 }
1501 }
9795c594 1502 }
8b704316 1503
524af0d6 1504 return true;
9795c594
JW
1505}
1506
1507
edc802c7
JW
1508/* Check if the characteristics of two function results match,
1509 cf. F08:12.3.3. */
1510
4668d6f9
PT
1511bool
1512gfc_check_result_characteristics (gfc_symbol *s1, gfc_symbol *s2,
edc802c7
JW
1513 char *errmsg, int err_len)
1514{
1515 gfc_symbol *r1, *r2;
1516
82b541a1
JW
1517 if (s1->ts.interface && s1->ts.interface->result)
1518 r1 = s1->ts.interface->result;
1519 else
1520 r1 = s1->result ? s1->result : s1;
1521
1522 if (s2->ts.interface && s2->ts.interface->result)
1523 r2 = s2->ts.interface->result;
1524 else
1525 r2 = s2->result ? s2->result : s2;
edc802c7
JW
1526
1527 if (r1->ts.type == BT_UNKNOWN)
524af0d6 1528 return true;
edc802c7
JW
1529
1530 /* Check type and rank. */
e7333b69 1531 if (!compare_type (r1, r2))
edc802c7 1532 {
e7333b69
JW
1533 snprintf (errmsg, err_len, "Type mismatch in function result (%s/%s)",
1534 gfc_typename (&r1->ts), gfc_typename (&r2->ts));
1535 return false;
1536 }
1537 if (!compare_rank (r1, r2))
1538 {
1539 snprintf (errmsg, err_len, "Rank mismatch in function result (%i/%i)",
1540 symbol_rank (r1), symbol_rank (r2));
524af0d6 1541 return false;
edc802c7
JW
1542 }
1543
1544 /* Check ALLOCATABLE attribute. */
1545 if (r1->attr.allocatable != r2->attr.allocatable)
1546 {
1547 snprintf (errmsg, err_len, "ALLOCATABLE attribute mismatch in "
1548 "function result");
524af0d6 1549 return false;
edc802c7
JW
1550 }
1551
1552 /* Check POINTER attribute. */
1553 if (r1->attr.pointer != r2->attr.pointer)
1554 {
1555 snprintf (errmsg, err_len, "POINTER attribute mismatch in "
1556 "function result");
524af0d6 1557 return false;
edc802c7
JW
1558 }
1559
1560 /* Check CONTIGUOUS attribute. */
1561 if (r1->attr.contiguous != r2->attr.contiguous)
1562 {
1563 snprintf (errmsg, err_len, "CONTIGUOUS attribute mismatch in "
1564 "function result");
524af0d6 1565 return false;
edc802c7
JW
1566 }
1567
1568 /* Check PROCEDURE POINTER attribute. */
1569 if (r1 != s1 && r1->attr.proc_pointer != r2->attr.proc_pointer)
1570 {
1571 snprintf (errmsg, err_len, "PROCEDURE POINTER mismatch in "
1572 "function result");
524af0d6 1573 return false;
edc802c7
JW
1574 }
1575
1576 /* Check string length. */
1577 if (r1->ts.type == BT_CHARACTER && r1->ts.u.cl && r2->ts.u.cl)
1578 {
1579 if (r1->ts.deferred != r2->ts.deferred)
1580 {
1581 snprintf (errmsg, err_len, "Character length mismatch "
1582 "in function result");
524af0d6 1583 return false;
edc802c7
JW
1584 }
1585
96486998 1586 if (r1->ts.u.cl->length && r2->ts.u.cl->length)
edc802c7
JW
1587 {
1588 int compval = gfc_dep_compare_expr (r1->ts.u.cl->length,
1589 r2->ts.u.cl->length);
1590 switch (compval)
1591 {
1592 case -1:
1593 case 1:
1594 case -3:
1595 snprintf (errmsg, err_len, "Character length mismatch "
1596 "in function result");
524af0d6 1597 return false;
edc802c7
JW
1598
1599 case -2:
1600 /* FIXME: Implement a warning for this case.
1601 snprintf (errmsg, err_len, "Possible character length mismatch "
1602 "in function result");*/
1603 break;
1604
1605 case 0:
1606 break;
1607
1608 default:
1609 gfc_internal_error ("check_result_characteristics (1): Unexpected "
1610 "result %i of gfc_dep_compare_expr", compval);
1611 break;
1612 }
1613 }
1614 }
1615
1616 /* Check array shape. */
1617 if (!r1->attr.allocatable && !r1->attr.pointer && r1->as && r2->as)
1618 {
1619 int i, compval;
1620 gfc_expr *shape1, *shape2;
1621
1622 if (r1->as->type != r2->as->type)
1623 {
1624 snprintf (errmsg, err_len, "Shape mismatch in function result");
524af0d6 1625 return false;
edc802c7
JW
1626 }
1627
1628 if (r1->as->type == AS_EXPLICIT)
1629 for (i = 0; i < r1->as->rank + r1->as->corank; i++)
1630 {
1631 shape1 = gfc_subtract (gfc_copy_expr (r1->as->upper[i]),
1632 gfc_copy_expr (r1->as->lower[i]));
1633 shape2 = gfc_subtract (gfc_copy_expr (r2->as->upper[i]),
1634 gfc_copy_expr (r2->as->lower[i]));
1635 compval = gfc_dep_compare_expr (shape1, shape2);
1636 gfc_free_expr (shape1);
1637 gfc_free_expr (shape2);
1638 switch (compval)
1639 {
1640 case -1:
1641 case 1:
1642 case -3:
1643 snprintf (errmsg, err_len, "Shape mismatch in dimension %i of "
1644 "function result", i + 1);
524af0d6 1645 return false;
edc802c7
JW
1646
1647 case -2:
1648 /* FIXME: Implement a warning for this case.
db30e21c 1649 gfc_warning (0, "Possible shape mismatch in return value");*/
edc802c7
JW
1650 break;
1651
1652 case 0:
1653 break;
1654
1655 default:
1656 gfc_internal_error ("check_result_characteristics (2): "
1657 "Unexpected result %i of "
1658 "gfc_dep_compare_expr", compval);
1659 break;
1660 }
1661 }
1662 }
1663
524af0d6 1664 return true;
edc802c7
JW
1665}
1666
1667
6de9cd9a 1668/* 'Compare' two formal interfaces associated with a pair of symbols.
f3e1097b 1669 We return true if there exists an actual argument list that
8ad15a0a 1670 would be ambiguous between the two interfaces, zero otherwise.
58c1ae36 1671 'strict_flag' specifies whether all the characteristics are
6f3ab30d
JW
1672 required to match, which is not the case for ambiguity checks.
1673 'p1' and 'p2' are the PASS arguments of both procedures (if applicable). */
6de9cd9a 1674
f3e1097b 1675bool
889dc035 1676gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol *s2, const char *name2,
58c1ae36 1677 int generic_flag, int strict_flag,
6f3ab30d
JW
1678 char *errmsg, int err_len,
1679 const char *p1, const char *p2)
6de9cd9a
DN
1680{
1681 gfc_formal_arglist *f1, *f2;
1682
0175478d
JD
1683 gcc_assert (name2 != NULL);
1684
9b63f282
JW
1685 if (s1->attr.function && (s2->attr.subroutine
1686 || (!s2->attr.function && s2->ts.type == BT_UNKNOWN
889dc035 1687 && gfc_get_default_type (name2, s2->ns)->type == BT_UNKNOWN)))
8ad15a0a
JW
1688 {
1689 if (errmsg != NULL)
889dc035 1690 snprintf (errmsg, err_len, "'%s' is not a function", name2);
f3e1097b 1691 return false;
8ad15a0a
JW
1692 }
1693
1694 if (s1->attr.subroutine && s2->attr.function)
1695 {
1696 if (errmsg != NULL)
889dc035 1697 snprintf (errmsg, err_len, "'%s' is not a subroutine", name2);
f3e1097b 1698 return false;
8ad15a0a 1699 }
3afadac3 1700
58c1ae36
JW
1701 /* Do strict checks on all characteristics
1702 (for dummy procedures and procedure pointer assignments). */
1703 if (!generic_flag && strict_flag)
6cc309c9 1704 {
58c1ae36 1705 if (s1->attr.function && s2->attr.function)
8ad15a0a 1706 {
edc802c7 1707 /* If both are functions, check result characteristics. */
4668d6f9
PT
1708 if (!gfc_check_result_characteristics (s1, s2, errmsg, err_len)
1709 || !gfc_check_result_characteristics (s2, s1, errmsg, err_len))
f3e1097b 1710 return false;
58c1ae36
JW
1711 }
1712
1713 if (s1->attr.pure && !s2->attr.pure)
1714 {
1715 snprintf (errmsg, err_len, "Mismatch in PURE attribute");
f3e1097b 1716 return false;
58c1ae36
JW
1717 }
1718 if (s1->attr.elemental && !s2->attr.elemental)
1719 {
1720 snprintf (errmsg, err_len, "Mismatch in ELEMENTAL attribute");
f3e1097b 1721 return false;
8ad15a0a 1722 }
6cc309c9 1723 }
26033479 1724
8ad15a0a
JW
1725 if (s1->attr.if_source == IFSRC_UNKNOWN
1726 || s2->attr.if_source == IFSRC_UNKNOWN)
f3e1097b 1727 return true;
26033479 1728
4cbc9039
JW
1729 f1 = gfc_sym_get_dummy_args (s1);
1730 f2 = gfc_sym_get_dummy_args (s2);
26033479 1731
bd845c14 1732 /* Special case: No arguments. */
c73b6478 1733 if (f1 == NULL && f2 == NULL)
f3e1097b 1734 return true;
6cc309c9 1735
c73b6478 1736 if (generic_flag)
6cc309c9 1737 {
6f3ab30d
JW
1738 if (count_types_test (f1, f2, p1, p2)
1739 || count_types_test (f2, f1, p2, p1))
f3e1097b 1740 return false;
bd845c14
SK
1741
1742 /* Special case: alternate returns. If both f1->sym and f2->sym are
e4e659b9
JW
1743 NULL, then the leading formal arguments are alternate returns.
1744 The previous conditional should catch argument lists with
bd845c14
SK
1745 different number of argument. */
1746 if (f1 && f1->sym == NULL && f2 && f2->sym == NULL)
f3e1097b 1747 return true;
bd845c14 1748
6f3ab30d
JW
1749 if (generic_correspondence (f1, f2, p1, p2)
1750 || generic_correspondence (f2, f1, p2, p1))
f3e1097b 1751 return false;
6cc309c9 1752 }
c73b6478 1753 else
8ad15a0a
JW
1754 /* Perform the abbreviated correspondence test for operators (the
1755 arguments cannot be optional and are always ordered correctly).
1756 This is also done when comparing interfaces for dummy procedures and in
1757 procedure pointer assignments. */
1758
f76c4d97 1759 for (; f1 || f2; f1 = f1->next, f2 = f2->next)
8ad15a0a
JW
1760 {
1761 /* Check existence. */
8ad15a0a
JW
1762 if (f1 == NULL || f2 == NULL)
1763 {
1764 if (errmsg != NULL)
1765 snprintf (errmsg, err_len, "'%s' has the wrong number of "
889dc035 1766 "arguments", name2);
f3e1097b 1767 return false;
8ad15a0a
JW
1768 }
1769
58c1ae36 1770 if (strict_flag)
8ad15a0a 1771 {
9795c594 1772 /* Check all characteristics. */
4668d6f9 1773 if (!gfc_check_dummy_characteristics (f1->sym, f2->sym, true,
524af0d6 1774 errmsg, err_len))
f3e1097b 1775 return false;
9795c594 1776 }
e7333b69 1777 else
9795c594
JW
1778 {
1779 /* Only check type and rank. */
e7333b69
JW
1780 if (!compare_type (f2->sym, f1->sym))
1781 {
1782 if (errmsg != NULL)
1783 snprintf (errmsg, err_len, "Type mismatch in argument '%s' "
1784 "(%s/%s)", f1->sym->name,
1785 gfc_typename (&f1->sym->ts),
1786 gfc_typename (&f2->sym->ts));
f3e1097b 1787 return false;
e7333b69
JW
1788 }
1789 if (!compare_rank (f2->sym, f1->sym))
1790 {
1791 if (errmsg != NULL)
1792 snprintf (errmsg, err_len, "Rank mismatch in argument '%s' "
1793 "(%i/%i)", f1->sym->name, symbol_rank (f1->sym),
1794 symbol_rank (f2->sym));
f3e1097b 1795 return false;
e7333b69 1796 }
8ad15a0a 1797 }
8ad15a0a
JW
1798 }
1799
f3e1097b 1800 return true;
6cc309c9
JD
1801}
1802
1803
6de9cd9a 1804/* Given a pointer to an interface pointer, remove duplicate
284d58f1 1805 interfaces and make sure that all symbols are either functions
f3e1097b 1806 or subroutines, and all of the same kind. Returns true if
284d58f1 1807 something goes wrong. */
6de9cd9a 1808
f3e1097b 1809static bool
b251af97 1810check_interface0 (gfc_interface *p, const char *interface_name)
6de9cd9a
DN
1811{
1812 gfc_interface *psave, *q, *qlast;
1813
1814 psave = p;
6de9cd9a 1815 for (; p; p = p->next)
284d58f1
DF
1816 {
1817 /* Make sure all symbols in the interface have been defined as
1818 functions or subroutines. */
c3f34952
TB
1819 if (((!p->sym->attr.function && !p->sym->attr.subroutine)
1820 || !p->sym->attr.if_source)
f6288c24 1821 && !gfc_fl_struct (p->sym->attr.flavor))
284d58f1 1822 {
bcc478b9
BRF
1823 const char *guessed
1824 = gfc_lookup_function_fuzzy (p->sym->name, p->sym->ns->sym_root);
1825
284d58f1 1826 if (p->sym->attr.external)
bcc478b9
BRF
1827 if (guessed)
1828 gfc_error ("Procedure %qs in %s at %L has no explicit interface"
1829 "; did you mean %qs?",
1830 p->sym->name, interface_name, &p->sym->declared_at,
1831 guessed);
1832 else
1833 gfc_error ("Procedure %qs in %s at %L has no explicit interface",
1834 p->sym->name, interface_name, &p->sym->declared_at);
284d58f1 1835 else
bcc478b9
BRF
1836 if (guessed)
1837 gfc_error ("Procedure %qs in %s at %L is neither function nor "
1838 "subroutine; did you mean %qs?", p->sym->name,
1839 interface_name, &p->sym->declared_at, guessed);
1840 else
1841 gfc_error ("Procedure %qs in %s at %L is neither function nor "
1842 "subroutine", p->sym->name, interface_name,
1843 &p->sym->declared_at);
f3e1097b 1844 return true;
284d58f1
DF
1845 }
1846
1847 /* Verify that procedures are either all SUBROUTINEs or all FUNCTIONs. */
c3f34952 1848 if ((psave->sym->attr.function && !p->sym->attr.function
f6288c24 1849 && !gfc_fl_struct (p->sym->attr.flavor))
284d58f1
DF
1850 || (psave->sym->attr.subroutine && !p->sym->attr.subroutine))
1851 {
f6288c24 1852 if (!gfc_fl_struct (p->sym->attr.flavor))
c3f34952
TB
1853 gfc_error ("In %s at %L procedures must be either all SUBROUTINEs"
1854 " or all FUNCTIONs", interface_name,
1855 &p->sym->declared_at);
f6288c24 1856 else if (p->sym->attr.flavor == FL_DERIVED)
c3f34952
TB
1857 gfc_error ("In %s at %L procedures must be all FUNCTIONs as the "
1858 "generic name is also the name of a derived type",
1859 interface_name, &p->sym->declared_at);
f3e1097b 1860 return true;
284d58f1 1861 }
a300121e 1862
d2c5dbf2 1863 /* F2003, C1207. F2008, C1207. */
a300121e 1864 if (p->sym->attr.proc == PROC_INTERNAL
524af0d6 1865 && !gfc_notify_std (GFC_STD_F2008, "Internal procedure "
a4d9b221 1866 "%qs in %s at %L", p->sym->name,
524af0d6 1867 interface_name, &p->sym->declared_at))
f3e1097b 1868 return true;
284d58f1 1869 }
6de9cd9a
DN
1870 p = psave;
1871
1872 /* Remove duplicate interfaces in this interface list. */
1873 for (; p; p = p->next)
1874 {
1875 qlast = p;
1876
1877 for (q = p->next; q;)
1878 {
1879 if (p->sym != q->sym)
1880 {
1881 qlast = q;
1882 q = q->next;
6de9cd9a
DN
1883 }
1884 else
1885 {
66e4ab31 1886 /* Duplicate interface. */
6de9cd9a 1887 qlast->next = q->next;
cede9502 1888 free (q);
6de9cd9a
DN
1889 q = qlast->next;
1890 }
1891 }
1892 }
1893
f3e1097b 1894 return false;
6de9cd9a
DN
1895}
1896
1897
1898/* Check lists of interfaces to make sure that no two interfaces are
66e4ab31 1899 ambiguous. Duplicate interfaces (from the same symbol) are OK here. */
6de9cd9a 1900
f3e1097b 1901static bool
b251af97 1902check_interface1 (gfc_interface *p, gfc_interface *q0,
993ef28f 1903 int generic_flag, const char *interface_name,
26f2ca2b 1904 bool referenced)
6de9cd9a 1905{
b251af97 1906 gfc_interface *q;
6de9cd9a 1907 for (; p; p = p->next)
991f3b12 1908 for (q = q0; q; q = q->next)
6de9cd9a
DN
1909 {
1910 if (p->sym == q->sym)
66e4ab31 1911 continue; /* Duplicates OK here. */
6de9cd9a 1912
312ae8f4 1913 if (p->sym->name == q->sym->name && p->sym->module == q->sym->module)
6de9cd9a
DN
1914 continue;
1915
f6288c24
FR
1916 if (!gfc_fl_struct (p->sym->attr.flavor)
1917 && !gfc_fl_struct (q->sym->attr.flavor)
c3f34952 1918 && gfc_compare_interfaces (p->sym, q->sym, q->sym->name,
6f3ab30d 1919 generic_flag, 0, NULL, 0, NULL, NULL))
6de9cd9a 1920 {
993ef28f 1921 if (referenced)
bd845c14
SK
1922 gfc_error ("Ambiguous interfaces in %s for %qs at %L "
1923 "and %qs at %L", interface_name,
1924 q->sym->name, &q->sym->declared_at,
1925 p->sym->name, &p->sym->declared_at);
ae7c61de 1926 else if (!p->sym->attr.use_assoc && q->sym->attr.use_assoc)
bd845c14
SK
1927 gfc_warning (0, "Ambiguous interfaces in %s for %qs at %L "
1928 "and %qs at %L", interface_name,
1929 q->sym->name, &q->sym->declared_at,
1930 p->sym->name, &p->sym->declared_at);
ae7c61de 1931 else
db30e21c 1932 gfc_warning (0, "Although not referenced, %qs has ambiguous "
ae7c61de 1933 "interfaces at %L", interface_name, &p->where);
f3e1097b 1934 return true;
6de9cd9a
DN
1935 }
1936 }
f3e1097b 1937 return false;
6de9cd9a
DN
1938}
1939
1940
1941/* Check the generic and operator interfaces of symbols to make sure
1942 that none of the interfaces conflict. The check has to be done
1943 after all of the symbols are actually loaded. */
1944
1945static void
b251af97 1946check_sym_interfaces (gfc_symbol *sym)
6de9cd9a 1947{
439d2350 1948 char interface_name[GFC_MAX_SYMBOL_LEN + sizeof("generic interface ''")];
71f77fd7 1949 gfc_interface *p;
6de9cd9a
DN
1950
1951 if (sym->ns != gfc_current_ns)
1952 return;
1953
1954 if (sym->generic != NULL)
1955 {
1956 sprintf (interface_name, "generic interface '%s'", sym->name);
1957 if (check_interface0 (sym->generic, interface_name))
1958 return;
1959
71f77fd7
PT
1960 for (p = sym->generic; p; p = p->next)
1961 {
abf86978 1962 if (p->sym->attr.mod_proc
4668d6f9 1963 && !p->sym->attr.module_procedure
abf86978
TB
1964 && (p->sym->attr.if_source != IFSRC_DECL
1965 || p->sym->attr.procedure))
71f77fd7 1966 {
c4100eae 1967 gfc_error ("%qs at %L is not a module procedure",
e9f63ace 1968 p->sym->name, &p->where);
71f77fd7
PT
1969 return;
1970 }
1971 }
1972
4c256e34 1973 /* Originally, this test was applied to host interfaces too;
993ef28f
PT
1974 this is incorrect since host associated symbols, from any
1975 source, cannot be ambiguous with local symbols. */
ae7c61de
JW
1976 check_interface1 (sym->generic, sym->generic, 1, interface_name,
1977 sym->attr.referenced || !sym->attr.use_assoc);
6de9cd9a
DN
1978 }
1979}
1980
1981
1982static void
b251af97 1983check_uop_interfaces (gfc_user_op *uop)
6de9cd9a 1984{
439d2350 1985 char interface_name[GFC_MAX_SYMBOL_LEN + sizeof("operator interface ''")];
6de9cd9a
DN
1986 gfc_user_op *uop2;
1987 gfc_namespace *ns;
1988
1989 sprintf (interface_name, "operator interface '%s'", uop->name);
a1ee985f 1990 if (check_interface0 (uop->op, interface_name))
6de9cd9a
DN
1991 return;
1992
1993 for (ns = gfc_current_ns; ns; ns = ns->parent)
1994 {
1995 uop2 = gfc_find_uop (uop->name, ns);
1996 if (uop2 == NULL)
1997 continue;
1998
a1ee985f 1999 check_interface1 (uop->op, uop2->op, 0,
26f2ca2b 2000 interface_name, true);
6de9cd9a
DN
2001 }
2002}
2003
fb03a37e
TK
2004/* Given an intrinsic op, return an equivalent op if one exists,
2005 or INTRINSIC_NONE otherwise. */
2006
2007gfc_intrinsic_op
2008gfc_equivalent_op (gfc_intrinsic_op op)
2009{
2010 switch(op)
2011 {
2012 case INTRINSIC_EQ:
2013 return INTRINSIC_EQ_OS;
2014
2015 case INTRINSIC_EQ_OS:
2016 return INTRINSIC_EQ;
2017
2018 case INTRINSIC_NE:
2019 return INTRINSIC_NE_OS;
2020
2021 case INTRINSIC_NE_OS:
2022 return INTRINSIC_NE;
2023
2024 case INTRINSIC_GT:
2025 return INTRINSIC_GT_OS;
2026
2027 case INTRINSIC_GT_OS:
2028 return INTRINSIC_GT;
2029
2030 case INTRINSIC_GE:
2031 return INTRINSIC_GE_OS;
2032
2033 case INTRINSIC_GE_OS:
2034 return INTRINSIC_GE;
2035
2036 case INTRINSIC_LT:
2037 return INTRINSIC_LT_OS;
2038
2039 case INTRINSIC_LT_OS:
2040 return INTRINSIC_LT;
2041
2042 case INTRINSIC_LE:
2043 return INTRINSIC_LE_OS;
2044
2045 case INTRINSIC_LE_OS:
2046 return INTRINSIC_LE;
2047
2048 default:
2049 return INTRINSIC_NONE;
2050 }
2051}
6de9cd9a
DN
2052
2053/* For the namespace, check generic, user operator and intrinsic
2054 operator interfaces for consistency and to remove duplicate
2055 interfaces. We traverse the whole namespace, counting on the fact
2056 that most symbols will not have generic or operator interfaces. */
2057
2058void
b251af97 2059gfc_check_interfaces (gfc_namespace *ns)
6de9cd9a
DN
2060{
2061 gfc_namespace *old_ns, *ns2;
439d2350 2062 char interface_name[GFC_MAX_SYMBOL_LEN + sizeof("intrinsic '' operator")];
09639a83 2063 int i;
6de9cd9a
DN
2064
2065 old_ns = gfc_current_ns;
2066 gfc_current_ns = ns;
2067
2068 gfc_traverse_ns (ns, check_sym_interfaces);
2069
2070 gfc_traverse_user_op (ns, check_uop_interfaces);
2071
2072 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
2073 {
2074 if (i == INTRINSIC_USER)
2075 continue;
2076
2077 if (i == INTRINSIC_ASSIGN)
2078 strcpy (interface_name, "intrinsic assignment operator");
2079 else
2080 sprintf (interface_name, "intrinsic '%s' operator",
09639a83 2081 gfc_op2string ((gfc_intrinsic_op) i));
6de9cd9a 2082
a1ee985f 2083 if (check_interface0 (ns->op[i], interface_name))
6de9cd9a
DN
2084 continue;
2085
94747289
DK
2086 if (ns->op[i])
2087 gfc_check_operator_interface (ns->op[i]->sym, (gfc_intrinsic_op) i,
2088 ns->op[i]->where);
6de9cd9a 2089
3bed9dd0
DF
2090 for (ns2 = ns; ns2; ns2 = ns2->parent)
2091 {
fb03a37e 2092 gfc_intrinsic_op other_op;
8b704316 2093
a1ee985f 2094 if (check_interface1 (ns->op[i], ns2->op[i], 0,
3bed9dd0
DF
2095 interface_name, true))
2096 goto done;
2097
fb03a37e
TK
2098 /* i should be gfc_intrinsic_op, but has to be int with this cast
2099 here for stupid C++ compatibility rules. */
2100 other_op = gfc_equivalent_op ((gfc_intrinsic_op) i);
2101 if (other_op != INTRINSIC_NONE
2102 && check_interface1 (ns->op[i], ns2->op[other_op],
2103 0, interface_name, true))
2104 goto done;
3bed9dd0 2105 }
6de9cd9a
DN
2106 }
2107
3bed9dd0 2108done:
6de9cd9a
DN
2109 gfc_current_ns = old_ns;
2110}
2111
2112
aa08038d
EE
2113/* Given a symbol of a formal argument list and an expression, if the
2114 formal argument is allocatable, check that the actual argument is
f3e1097b 2115 allocatable. Returns true if compatible, zero if not compatible. */
aa08038d 2116
f3e1097b 2117static bool
b251af97 2118compare_allocatable (gfc_symbol *formal, gfc_expr *actual)
aa08038d 2119{
5ac13b8e
JW
2120 if (formal->attr.allocatable
2121 || (formal->ts.type == BT_CLASS && CLASS_DATA (formal)->attr.allocatable))
aa08038d 2122 {
fec5ce24
JW
2123 symbol_attribute attr = gfc_expr_attr (actual);
2124 if (actual->ts.type == BT_CLASS && !attr.class_ok)
f3e1097b 2125 return true;
fec5ce24 2126 else if (!attr.allocatable)
f3e1097b 2127 return false;
aa08038d
EE
2128 }
2129
f3e1097b 2130 return true;
aa08038d
EE
2131}
2132
2133
6de9cd9a
DN
2134/* Given a symbol of a formal argument list and an expression, if the
2135 formal argument is a pointer, see if the actual argument is a
2136 pointer. Returns nonzero if compatible, zero if not compatible. */
2137
2138static int
b251af97 2139compare_pointer (gfc_symbol *formal, gfc_expr *actual)
6de9cd9a
DN
2140{
2141 symbol_attribute attr;
2142
f18075ff
TB
2143 if (formal->attr.pointer
2144 || (formal->ts.type == BT_CLASS && CLASS_DATA (formal)
2145 && CLASS_DATA (formal)->attr.class_pointer))
6de9cd9a
DN
2146 {
2147 attr = gfc_expr_attr (actual);
7d54ef80
TB
2148
2149 /* Fortran 2008 allows non-pointer actual arguments. */
2150 if (!attr.pointer && attr.target && formal->attr.intent == INTENT_IN)
2151 return 2;
2152
6de9cd9a
DN
2153 if (!attr.pointer)
2154 return 0;
2155 }
2156
2157 return 1;
2158}
2159
2160
a516520c
PT
2161/* Emit clear error messages for rank mismatch. */
2162
2163static void
2164argument_rank_mismatch (const char *name, locus *where,
2165 int rank1, int rank2)
2166{
c62c6622
TB
2167
2168 /* TS 29113, C407b. */
2169 if (rank2 == -1)
2700d0e3
JJ
2170 gfc_error ("The assumed-rank array at %L requires that the dummy argument"
2171 " %qs has assumed-rank", where, name);
c62c6622 2172 else if (rank1 == 0)
2700d0e3
JJ
2173 gfc_error_opt (OPT_Wargument_mismatch, "Rank mismatch in argument %qs "
2174 "at %L (scalar and rank-%d)", name, where, rank2);
a516520c 2175 else if (rank2 == 0)
2700d0e3
JJ
2176 gfc_error_opt (OPT_Wargument_mismatch, "Rank mismatch in argument %qs "
2177 "at %L (rank-%d and scalar)", name, where, rank1);
a516520c 2178 else
2700d0e3
JJ
2179 gfc_error_opt (OPT_Wargument_mismatch, "Rank mismatch in argument %qs "
2180 "at %L (rank-%d and rank-%d)", name, where, rank1, rank2);
a516520c
PT
2181}
2182
2183
6de9cd9a 2184/* Given a symbol of a formal argument list and an expression, see if
f3e1097b
JW
2185 the two are compatible as arguments. Returns true if
2186 compatible, false if not compatible. */
6de9cd9a 2187
f3e1097b 2188static bool
b251af97 2189compare_parameter (gfc_symbol *formal, gfc_expr *actual,
5ad6345e 2190 int ranks_must_agree, int is_elemental, locus *where)
6de9cd9a
DN
2191{
2192 gfc_ref *ref;
975b975b 2193 bool rank_check, is_pointer;
5c0ba546
JW
2194 char err[200];
2195 gfc_component *ppc;
6de9cd9a 2196
a8b3b0b6
CR
2197 /* If the formal arg has type BT_VOID, it's to one of the iso_c_binding
2198 procs c_f_pointer or c_f_procpointer, and we need to accept most
2199 pointers the user could give us. This should allow that. */
2200 if (formal->ts.type == BT_VOID)
f3e1097b 2201 return true;
a8b3b0b6
CR
2202
2203 if (formal->ts.type == BT_DERIVED
bc21d315 2204 && formal->ts.u.derived && formal->ts.u.derived->ts.is_iso_c
a8b3b0b6 2205 && actual->ts.type == BT_DERIVED
bc21d315 2206 && actual->ts.u.derived && actual->ts.u.derived->ts.is_iso_c)
f3e1097b 2207 return true;
a8b3b0b6 2208
7d58b9e7 2209 if (formal->ts.type == BT_CLASS && actual->ts.type == BT_DERIVED)
e10f52d0
JW
2210 /* Make sure the vtab symbol is present when
2211 the module variables are generated. */
7d58b9e7 2212 gfc_find_derived_vtab (actual->ts.u.derived);
e10f52d0 2213
6de9cd9a
DN
2214 if (actual->ts.type == BT_PROCEDURE)
2215 {
9b63f282 2216 gfc_symbol *act_sym = actual->symtree->n.sym;
6de9cd9a 2217
8ad15a0a
JW
2218 if (formal->attr.flavor != FL_PROCEDURE)
2219 {
2220 if (where)
2221 gfc_error ("Invalid procedure argument at %L", &actual->where);
f3e1097b 2222 return false;
8ad15a0a 2223 }
6de9cd9a 2224
889dc035 2225 if (!gfc_compare_interfaces (formal, act_sym, act_sym->name, 0, 1, err,
6f3ab30d 2226 sizeof(err), NULL, NULL))
8ad15a0a
JW
2227 {
2228 if (where)
2700d0e3
JJ
2229 gfc_error_opt (OPT_Wargument_mismatch,
2230 "Interface mismatch in dummy procedure %qs at %L:"
2231 " %s", formal->name, &actual->where, err);
f3e1097b 2232 return false;
8ad15a0a 2233 }
5ad6345e 2234
9b63f282 2235 if (formal->attr.function && !act_sym->attr.function)
03bd096b
JW
2236 {
2237 gfc_add_function (&act_sym->attr, act_sym->name,
2238 &act_sym->declared_at);
2239 if (act_sym->ts.type == BT_UNKNOWN
524af0d6 2240 && !gfc_set_default_type (act_sym, 1, act_sym->ns))
f3e1097b 2241 return false;
03bd096b
JW
2242 }
2243 else if (formal->attr.subroutine && !act_sym->attr.subroutine)
9b63f282
JW
2244 gfc_add_subroutine (&act_sym->attr, act_sym->name,
2245 &act_sym->declared_at);
2246
f3e1097b 2247 return true;
6de9cd9a
DN
2248 }
2249
5c0ba546 2250 ppc = gfc_get_proc_ptr_comp (actual);
228eb42a 2251 if (ppc && ppc->ts.interface)
5c0ba546
JW
2252 {
2253 if (!gfc_compare_interfaces (formal, ppc->ts.interface, ppc->name, 0, 1,
2254 err, sizeof(err), NULL, NULL))
2255 {
2256 if (where)
2700d0e3
JJ
2257 gfc_error_opt (OPT_Wargument_mismatch,
2258 "Interface mismatch in dummy procedure %qs at %L:"
2259 " %s", formal->name, &actual->where, err);
f3e1097b 2260 return false;
5c0ba546
JW
2261 }
2262 }
2263
fe4e525c
TB
2264 /* F2008, C1241. */
2265 if (formal->attr.pointer && formal->attr.contiguous
460263d0 2266 && !gfc_is_simply_contiguous (actual, true, false))
fe4e525c
TB
2267 {
2268 if (where)
c4100eae 2269 gfc_error ("Actual argument to contiguous pointer dummy %qs at %L "
62732c30 2270 "must be simply contiguous", formal->name, &actual->where);
f3e1097b 2271 return false;
fe4e525c
TB
2272 }
2273
fec5ce24
JW
2274 symbol_attribute actual_attr = gfc_expr_attr (actual);
2275 if (actual->ts.type == BT_CLASS && !actual_attr.class_ok)
f3e1097b 2276 return true;
fec5ce24 2277
90aeadcb 2278 if ((actual->expr_type != EXPR_NULL || actual->ts.type != BT_UNKNOWN)
df161b69 2279 && actual->ts.type != BT_HOLLERITH
45a69325 2280 && formal->ts.type != BT_ASSUMED
e7ac6a7c 2281 && !(formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
c49ea23d
PT
2282 && !gfc_compare_types (&formal->ts, &actual->ts)
2283 && !(formal->ts.type == BT_DERIVED && actual->ts.type == BT_CLASS
8b704316 2284 && gfc_compare_derived_types (formal->ts.u.derived,
c49ea23d 2285 CLASS_DATA (actual)->ts.u.derived)))
5ad6345e 2286 {
d68e117b 2287 if (where)
2700d0e3
JJ
2288 gfc_error_opt (OPT_Wargument_mismatch,
2289 "Type mismatch in argument %qs at %L; passed %s to %s",
2290 formal->name, where, gfc_typename (&actual->ts),
2291 gfc_typename (&formal->ts));
f3e1097b 2292 return false;
5ad6345e 2293 }
f18075ff 2294
3d54e576
TB
2295 if (actual->ts.type == BT_ASSUMED && formal->ts.type != BT_ASSUMED)
2296 {
2297 if (where)
2298 gfc_error ("Assumed-type actual argument at %L requires that dummy "
c4100eae 2299 "argument %qs is of assumed type", &actual->where,
3d54e576 2300 formal->name);
f3e1097b 2301 return false;
3d54e576
TB
2302 }
2303
f18075ff 2304 /* F2008, 12.5.2.5; IR F08/0073. */
67b1d004
JW
2305 if (formal->ts.type == BT_CLASS && formal->attr.class_ok
2306 && actual->expr_type != EXPR_NULL
f18075ff 2307 && ((CLASS_DATA (formal)->attr.class_pointer
86eb9e2f 2308 && formal->attr.intent != INTENT_IN)
5ac13b8e
JW
2309 || CLASS_DATA (formal)->attr.allocatable))
2310 {
2311 if (actual->ts.type != BT_CLASS)
2312 {
2313 if (where)
c4100eae 2314 gfc_error ("Actual argument to %qs at %L must be polymorphic",
5ac13b8e 2315 formal->name, &actual->where);
f3e1097b 2316 return false;
5ac13b8e 2317 }
67b1d004 2318
a8267f8d
TB
2319 if ((!UNLIMITED_POLY (formal) || !UNLIMITED_POLY(actual))
2320 && !gfc_compare_derived_types (CLASS_DATA (actual)->ts.u.derived,
2321 CLASS_DATA (formal)->ts.u.derived))
5ac13b8e
JW
2322 {
2323 if (where)
c4100eae 2324 gfc_error ("Actual argument to %qs at %L must have the same "
5ac13b8e 2325 "declared type", formal->name, &actual->where);
f3e1097b 2326 return false;
5ac13b8e
JW
2327 }
2328 }
6de9cd9a 2329
8b704316
PT
2330 /* F08: 12.5.2.5 Allocatable and pointer dummy variables. However, this
2331 is necessary also for F03, so retain error for both.
2332 NOTE: Other type/kind errors pre-empt this error. Since they are F03
2333 compatible, no attempt has been made to channel to this one. */
2334 if (UNLIMITED_POLY (formal) && !UNLIMITED_POLY (actual)
2335 && (CLASS_DATA (formal)->attr.allocatable
2336 ||CLASS_DATA (formal)->attr.class_pointer))
2337 {
2338 if (where)
c4100eae 2339 gfc_error ("Actual argument to %qs at %L must be unlimited "
8b704316
PT
2340 "polymorphic since the formal argument is a "
2341 "pointer or allocatable unlimited polymorphic "
2342 "entity [F2008: 12.5.2.5]", formal->name,
2343 &actual->where);
f3e1097b 2344 return false;
8b704316
PT
2345 }
2346
394d3a2e 2347 if (formal->attr.codimension && !gfc_is_coarray (actual))
d3a9eea2 2348 {
394d3a2e 2349 if (where)
c4100eae 2350 gfc_error ("Actual argument to %qs at %L must be a coarray",
d3a9eea2 2351 formal->name, &actual->where);
f3e1097b 2352 return false;
394d3a2e 2353 }
d3a9eea2 2354
394d3a2e
TB
2355 if (formal->attr.codimension && formal->attr.allocatable)
2356 {
2357 gfc_ref *last = NULL;
a3935ffc 2358
d3a9eea2 2359 for (ref = actual->ref; ref; ref = ref->next)
394d3a2e
TB
2360 if (ref->type == REF_COMPONENT)
2361 last = ref;
d3a9eea2 2362
d3a9eea2 2363 /* F2008, 12.5.2.6. */
394d3a2e
TB
2364 if ((last && last->u.c.component->as->corank != formal->as->corank)
2365 || (!last
2366 && actual->symtree->n.sym->as->corank != formal->as->corank))
d3a9eea2
TB
2367 {
2368 if (where)
c4100eae 2369 gfc_error ("Corank mismatch in argument %qs at %L (%d and %d)",
d3a9eea2
TB
2370 formal->name, &actual->where, formal->as->corank,
2371 last ? last->u.c.component->as->corank
2372 : actual->symtree->n.sym->as->corank);
f3e1097b 2373 return false;
d3a9eea2 2374 }
394d3a2e 2375 }
fe4e525c 2376
394d3a2e
TB
2377 if (formal->attr.codimension)
2378 {
460263d0 2379 /* F2008, 12.5.2.8 + Corrig 2 (IR F08/0048). */
8179b067 2380 /* F2018, 12.5.2.8. */
fe4e525c
TB
2381 if (formal->attr.dimension
2382 && (formal->attr.contiguous || formal->as->type != AS_ASSUMED_SHAPE)
fec5ce24 2383 && actual_attr.dimension
460263d0 2384 && !gfc_is_simply_contiguous (actual, true, true))
fe4e525c
TB
2385 {
2386 if (where)
c4100eae 2387 gfc_error ("Actual argument to %qs at %L must be simply "
460263d0
TB
2388 "contiguous or an element of such an array",
2389 formal->name, &actual->where);
f3e1097b 2390 return false;
fe4e525c 2391 }
fea54935
TB
2392
2393 /* F2008, C1303 and C1304. */
2394 if (formal->attr.intent != INTENT_INOUT
2395 && (((formal->ts.type == BT_DERIVED || formal->ts.type == BT_CLASS)
2396 && formal->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
2397 && formal->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
2398 || formal->attr.lock_comp))
2399
2400 {
2401 if (where)
c4100eae 2402 gfc_error ("Actual argument to non-INTENT(INOUT) dummy %qs at %L, "
fea54935
TB
2403 "which is LOCK_TYPE or has a LOCK_TYPE component",
2404 formal->name, &actual->where);
f3e1097b 2405 return false;
fea54935 2406 }
5df445a2
TB
2407
2408 /* TS18508, C702/C703. */
2409 if (formal->attr.intent != INTENT_INOUT
2410 && (((formal->ts.type == BT_DERIVED || formal->ts.type == BT_CLASS)
2411 && formal->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
2412 && formal->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
2413 || formal->attr.event_comp))
2414
2415 {
2416 if (where)
2417 gfc_error ("Actual argument to non-INTENT(INOUT) dummy %qs at %L, "
2418 "which is EVENT_TYPE or has a EVENT_TYPE component",
2419 formal->name, &actual->where);
f3e1097b 2420 return false;
5df445a2 2421 }
394d3a2e 2422 }
fe4e525c
TB
2423
2424 /* F2008, C1239/C1240. */
2425 if (actual->expr_type == EXPR_VARIABLE
2426 && (actual->symtree->n.sym->attr.asynchronous
2427 || actual->symtree->n.sym->attr.volatile_)
2428 && (formal->attr.asynchronous || formal->attr.volatile_)
460263d0
TB
2429 && actual->rank && formal->as
2430 && !gfc_is_simply_contiguous (actual, true, false)
f188272d
TB
2431 && ((formal->as->type != AS_ASSUMED_SHAPE
2432 && formal->as->type != AS_ASSUMED_RANK && !formal->attr.pointer)
fe4e525c
TB
2433 || formal->attr.contiguous))
2434 {
2435 if (where)
c4100eae 2436 gfc_error ("Dummy argument %qs has to be a pointer, assumed-shape or "
f188272d
TB
2437 "assumed-rank array without CONTIGUOUS attribute - as actual"
2438 " argument at %L is not simply contiguous and both are "
2439 "ASYNCHRONOUS or VOLATILE", formal->name, &actual->where);
f3e1097b 2440 return false;
d3a9eea2
TB
2441 }
2442
427180d2 2443 if (formal->attr.allocatable && !formal->attr.codimension
fec5ce24 2444 && actual_attr.codimension)
427180d2
TB
2445 {
2446 if (formal->attr.intent == INTENT_OUT)
2447 {
2448 if (where)
2449 gfc_error ("Passing coarray at %L to allocatable, noncoarray, "
c4100eae 2450 "INTENT(OUT) dummy argument %qs", &actual->where,
427180d2 2451 formal->name);
f3e1097b 2452 return false;
427180d2 2453 }
73e42eef 2454 else if (warn_surprising && where && formal->attr.intent != INTENT_IN)
48749dbc
MLI
2455 gfc_warning (OPT_Wsurprising,
2456 "Passing coarray at %L to allocatable, noncoarray dummy "
2457 "argument %qs, which is invalid if the allocation status"
427180d2
TB
2458 " is modified", &actual->where, formal->name);
2459 }
2460
c62c6622
TB
2461 /* If the rank is the same or the formal argument has assumed-rank. */
2462 if (symbol_rank (formal) == actual->rank || symbol_rank (formal) == -1)
f3e1097b 2463 return true;
6de9cd9a 2464
5ad6345e
TB
2465 rank_check = where != NULL && !is_elemental && formal->as
2466 && (formal->as->type == AS_ASSUMED_SHAPE
d8a8dab3
TB
2467 || formal->as->type == AS_DEFERRED)
2468 && actual->expr_type != EXPR_NULL;
6de9cd9a 2469
e7ac6a7c
TB
2470 /* Skip rank checks for NO_ARG_CHECK. */
2471 if (formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
f3e1097b 2472 return true;
e7ac6a7c 2473
d3a9eea2 2474 /* Scalar & coindexed, see: F2008, Section 12.5.2.4. */
d8a8dab3
TB
2475 if (rank_check || ranks_must_agree
2476 || (formal->attr.pointer && actual->expr_type != EXPR_NULL)
5ad6345e 2477 || (actual->rank != 0 && !(is_elemental || formal->attr.dimension))
c49ea23d
PT
2478 || (actual->rank == 0
2479 && ((formal->ts.type == BT_CLASS
2480 && CLASS_DATA (formal)->as->type == AS_ASSUMED_SHAPE)
2481 || (formal->ts.type != BT_CLASS
2482 && formal->as->type == AS_ASSUMED_SHAPE))
08857b61 2483 && actual->expr_type != EXPR_NULL)
d3a9eea2
TB
2484 || (actual->rank == 0 && formal->attr.dimension
2485 && gfc_is_coindexed (actual)))
5ad6345e
TB
2486 {
2487 if (where)
a516520c
PT
2488 argument_rank_mismatch (formal->name, &actual->where,
2489 symbol_rank (formal), actual->rank);
f3e1097b 2490 return false;
5ad6345e
TB
2491 }
2492 else if (actual->rank != 0 && (is_elemental || formal->attr.dimension))
f3e1097b 2493 return true;
5ad6345e
TB
2494
2495 /* At this point, we are considering a scalar passed to an array. This
975b975b 2496 is valid (cf. F95 12.4.1.1, F2003 12.4.1.2, and F2008 12.5.2.4),
5ad6345e 2497 - if the actual argument is (a substring of) an element of a
975b975b
TB
2498 non-assumed-shape/non-pointer/non-polymorphic array; or
2499 - (F2003) if the actual argument is of type character of default/c_char
2500 kind. */
2501
2502 is_pointer = actual->expr_type == EXPR_VARIABLE
2503 ? actual->symtree->n.sym->attr.pointer : false;
6de9cd9a
DN
2504
2505 for (ref = actual->ref; ref; ref = ref->next)
975b975b
TB
2506 {
2507 if (ref->type == REF_COMPONENT)
2508 is_pointer = ref->u.c.component->attr.pointer;
2509 else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT
2510 && ref->u.ar.dimen > 0
8b704316 2511 && (!ref->next
975b975b
TB
2512 || (ref->next->type == REF_SUBSTRING && !ref->next->next)))
2513 break;
2514 }
2515
2516 if (actual->ts.type == BT_CLASS && actual->expr_type != EXPR_NULL)
2517 {
2518 if (where)
c4100eae 2519 gfc_error ("Polymorphic scalar passed to array dummy argument %qs "
975b975b 2520 "at %L", formal->name, &actual->where);
f3e1097b 2521 return false;
975b975b
TB
2522 }
2523
2524 if (actual->expr_type != EXPR_NULL && ref && actual->ts.type != BT_CHARACTER
2525 && (is_pointer || ref->u.ar.as->type == AS_ASSUMED_SHAPE))
2526 {
2527 if (where)
2528 gfc_error ("Element of assumed-shaped or pointer "
c4100eae 2529 "array passed to array dummy argument %qs at %L",
975b975b 2530 formal->name, &actual->where);
f3e1097b 2531 return false;
975b975b 2532 }
6de9cd9a 2533
975b975b
TB
2534 if (actual->ts.type == BT_CHARACTER && actual->expr_type != EXPR_NULL
2535 && (!ref || is_pointer || ref->u.ar.as->type == AS_ASSUMED_SHAPE))
5ad6345e 2536 {
975b975b
TB
2537 if (formal->ts.kind != 1 && (gfc_option.allow_std & GFC_STD_GNU) == 0)
2538 {
2539 if (where)
2540 gfc_error ("Extension: Scalar non-default-kind, non-C_CHAR-kind "
2541 "CHARACTER actual argument with array dummy argument "
c4100eae 2542 "%qs at %L", formal->name, &actual->where);
f3e1097b 2543 return false;
975b975b
TB
2544 }
2545
5ad6345e
TB
2546 if (where && (gfc_option.allow_std & GFC_STD_F2003) == 0)
2547 {
2548 gfc_error ("Fortran 2003: Scalar CHARACTER actual argument with "
c4100eae 2549 "array dummy argument %qs at %L",
5ad6345e 2550 formal->name, &actual->where);
f3e1097b 2551 return false;
5ad6345e 2552 }
5ad6345e 2553 else
f3e1097b 2554 return ((gfc_option.allow_std & GFC_STD_F2003) != 0);
5ad6345e 2555 }
975b975b
TB
2556
2557 if (ref == NULL && actual->expr_type != EXPR_NULL)
5ad6345e
TB
2558 {
2559 if (where)
a516520c
PT
2560 argument_rank_mismatch (formal->name, &actual->where,
2561 symbol_rank (formal), actual->rank);
f3e1097b 2562 return false;
5ad6345e
TB
2563 }
2564
f3e1097b 2565 return true;
6de9cd9a
DN
2566}
2567
2568
2d5b90b2
TB
2569/* Returns the storage size of a symbol (formal argument) or
2570 zero if it cannot be determined. */
2571
2572static unsigned long
2573get_sym_storage_size (gfc_symbol *sym)
2574{
2575 int i;
2576 unsigned long strlen, elements;
2577
2578 if (sym->ts.type == BT_CHARACTER)
2579 {
bc21d315
JW
2580 if (sym->ts.u.cl && sym->ts.u.cl->length
2581 && sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
2582 strlen = mpz_get_ui (sym->ts.u.cl->length->value.integer);
2d5b90b2
TB
2583 else
2584 return 0;
2585 }
2586 else
8b704316 2587 strlen = 1;
2d5b90b2
TB
2588
2589 if (symbol_rank (sym) == 0)
2590 return strlen;
2591
2592 elements = 1;
2593 if (sym->as->type != AS_EXPLICIT)
2594 return 0;
2595 for (i = 0; i < sym->as->rank; i++)
2596 {
efb63364 2597 if (sym->as->upper[i]->expr_type != EXPR_CONSTANT
2d5b90b2
TB
2598 || sym->as->lower[i]->expr_type != EXPR_CONSTANT)
2599 return 0;
2600
c13af44b
SK
2601 elements *= mpz_get_si (sym->as->upper[i]->value.integer)
2602 - mpz_get_si (sym->as->lower[i]->value.integer) + 1L;
2d5b90b2
TB
2603 }
2604
2605 return strlen*elements;
2606}
2607
2608
2609/* Returns the storage size of an expression (actual argument) or
2610 zero if it cannot be determined. For an array element, it returns
1207ac67 2611 the remaining size as the element sequence consists of all storage
2d5b90b2
TB
2612 units of the actual argument up to the end of the array. */
2613
2614static unsigned long
2615get_expr_storage_size (gfc_expr *e)
2616{
2617 int i;
2618 long int strlen, elements;
6da0839a 2619 long int substrlen = 0;
a0710c29 2620 bool is_str_storage = false;
2d5b90b2
TB
2621 gfc_ref *ref;
2622
2623 if (e == NULL)
2624 return 0;
8b704316 2625
2d5b90b2
TB
2626 if (e->ts.type == BT_CHARACTER)
2627 {
bc21d315
JW
2628 if (e->ts.u.cl && e->ts.u.cl->length
2629 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
2630 strlen = mpz_get_si (e->ts.u.cl->length->value.integer);
2d5b90b2 2631 else if (e->expr_type == EXPR_CONSTANT
bc21d315 2632 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
2d5b90b2
TB
2633 strlen = e->value.character.length;
2634 else
2635 return 0;
2636 }
2637 else
2638 strlen = 1; /* Length per element. */
2639
2640 if (e->rank == 0 && !e->ref)
2641 return strlen;
2642
2643 elements = 1;
2644 if (!e->ref)
2645 {
2646 if (!e->shape)
2647 return 0;
2648 for (i = 0; i < e->rank; i++)
2649 elements *= mpz_get_si (e->shape[i]);
2650 return elements*strlen;
2651 }
2652
2653 for (ref = e->ref; ref; ref = ref->next)
2654 {
6da0839a
TB
2655 if (ref->type == REF_SUBSTRING && ref->u.ss.start
2656 && ref->u.ss.start->expr_type == EXPR_CONSTANT)
2657 {
a0710c29
TB
2658 if (is_str_storage)
2659 {
2660 /* The string length is the substring length.
2661 Set now to full string length. */
e323640f 2662 if (!ref->u.ss.length || !ref->u.ss.length->length
a0710c29
TB
2663 || ref->u.ss.length->length->expr_type != EXPR_CONSTANT)
2664 return 0;
2665
2666 strlen = mpz_get_ui (ref->u.ss.length->length->value.integer);
2667 }
2668 substrlen = strlen - mpz_get_ui (ref->u.ss.start->value.integer) + 1;
6da0839a
TB
2669 continue;
2670 }
2671
efb63364 2672 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2d5b90b2
TB
2673 for (i = 0; i < ref->u.ar.dimen; i++)
2674 {
2675 long int start, end, stride;
2676 stride = 1;
37639728 2677
2d5b90b2
TB
2678 if (ref->u.ar.stride[i])
2679 {
2680 if (ref->u.ar.stride[i]->expr_type == EXPR_CONSTANT)
2681 stride = mpz_get_si (ref->u.ar.stride[i]->value.integer);
2682 else
2683 return 0;
2684 }
2685
2686 if (ref->u.ar.start[i])
2687 {
2688 if (ref->u.ar.start[i]->expr_type == EXPR_CONSTANT)
2689 start = mpz_get_si (ref->u.ar.start[i]->value.integer);
2690 else
2691 return 0;
2692 }
37639728
TB
2693 else if (ref->u.ar.as->lower[i]
2694 && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT)
2695 start = mpz_get_si (ref->u.ar.as->lower[i]->value.integer);
2696 else
2697 return 0;
2d5b90b2
TB
2698
2699 if (ref->u.ar.end[i])
2700 {
2701 if (ref->u.ar.end[i]->expr_type == EXPR_CONSTANT)
2702 end = mpz_get_si (ref->u.ar.end[i]->value.integer);
2703 else
2704 return 0;
2705 }
2706 else if (ref->u.ar.as->upper[i]
2707 && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT)
2708 end = mpz_get_si (ref->u.ar.as->upper[i]->value.integer);
2709 else
2710 return 0;
2711
2712 elements *= (end - start)/stride + 1L;
2713 }
c6423ef3 2714 else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_FULL)
2d5b90b2
TB
2715 for (i = 0; i < ref->u.ar.as->rank; i++)
2716 {
2717 if (ref->u.ar.as->lower[i] && ref->u.ar.as->upper[i]
2718 && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT
edcc76d5
SK
2719 && ref->u.ar.as->lower[i]->ts.type == BT_INTEGER
2720 && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT
2721 && ref->u.ar.as->upper[i]->ts.type == BT_INTEGER)
da9ad923
TB
2722 elements *= mpz_get_si (ref->u.ar.as->upper[i]->value.integer)
2723 - mpz_get_si (ref->u.ar.as->lower[i]->value.integer)
2d5b90b2
TB
2724 + 1L;
2725 else
2726 return 0;
2727 }
6da0839a 2728 else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT
a0710c29
TB
2729 && e->expr_type == EXPR_VARIABLE)
2730 {
93302a24 2731 if (ref->u.ar.as->type == AS_ASSUMED_SHAPE
a0710c29
TB
2732 || e->symtree->n.sym->attr.pointer)
2733 {
2734 elements = 1;
2735 continue;
2736 }
2737
2738 /* Determine the number of remaining elements in the element
2739 sequence for array element designators. */
2740 is_str_storage = true;
2741 for (i = ref->u.ar.dimen - 1; i >= 0; i--)
2742 {
2743 if (ref->u.ar.start[i] == NULL
2744 || ref->u.ar.start[i]->expr_type != EXPR_CONSTANT
2745 || ref->u.ar.as->upper[i] == NULL
2746 || ref->u.ar.as->lower[i] == NULL
2747 || ref->u.ar.as->upper[i]->expr_type != EXPR_CONSTANT
2748 || ref->u.ar.as->lower[i]->expr_type != EXPR_CONSTANT)
2749 return 0;
2750
2751 elements
2752 = elements
2753 * (mpz_get_si (ref->u.ar.as->upper[i]->value.integer)
2754 - mpz_get_si (ref->u.ar.as->lower[i]->value.integer)
2755 + 1L)
2756 - (mpz_get_si (ref->u.ar.start[i]->value.integer)
2757 - mpz_get_si (ref->u.ar.as->lower[i]->value.integer));
2758 }
2759 }
3436db75
JW
2760 else if (ref->type == REF_COMPONENT && ref->u.c.component->attr.function
2761 && ref->u.c.component->attr.proc_pointer
2762 && ref->u.c.component->attr.dimension)
2763 {
2764 /* Array-valued procedure-pointer components. */
2765 gfc_array_spec *as = ref->u.c.component->as;
2766 for (i = 0; i < as->rank; i++)
2767 {
2768 if (!as->upper[i] || !as->lower[i]
2769 || as->upper[i]->expr_type != EXPR_CONSTANT
2770 || as->lower[i]->expr_type != EXPR_CONSTANT)
2771 return 0;
2772
2773 elements = elements
2774 * (mpz_get_si (as->upper[i]->value.integer)
2775 - mpz_get_si (as->lower[i]->value.integer) + 1L);
2776 }
2777 }
2d5b90b2
TB
2778 }
2779
6da0839a 2780 if (substrlen)
a0710c29
TB
2781 return (is_str_storage) ? substrlen + (elements-1)*strlen
2782 : elements*strlen;
2783 else
2784 return elements*strlen;
2d5b90b2
TB
2785}
2786
2787
59be8071 2788/* Given an expression, check whether it is an array section
f3e1097b 2789 which has a vector subscript. */
59be8071 2790
f3e1097b 2791bool
03af1e4c 2792gfc_has_vector_subscript (gfc_expr *e)
59be8071
TB
2793{
2794 int i;
2795 gfc_ref *ref;
2796
2797 if (e == NULL || e->rank == 0 || e->expr_type != EXPR_VARIABLE)
f3e1097b 2798 return false;
59be8071
TB
2799
2800 for (ref = e->ref; ref; ref = ref->next)
2801 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2802 for (i = 0; i < ref->u.ar.dimen; i++)
2803 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
f3e1097b 2804 return true;
59be8071 2805
f3e1097b 2806 return false;
59be8071
TB
2807}
2808
2809
4294c093
JW
2810static bool
2811is_procptr_result (gfc_expr *expr)
2812{
2813 gfc_component *c = gfc_get_proc_ptr_comp (expr);
2814 if (c)
2815 return (c->ts.interface && (c->ts.interface->attr.proc_pointer == 1));
2816 else
2817 return ((expr->symtree->n.sym->result != expr->symtree->n.sym)
2818 && (expr->symtree->n.sym->result->attr.proc_pointer == 1));
2819}
2820
2821
bcc478b9
BRF
2822/* Recursively append candidate argument ARG to CANDIDATES. Store the
2823 number of total candidates in CANDIDATES_LEN. */
2824
2825static void
2826lookup_arg_fuzzy_find_candidates (gfc_formal_arglist *arg,
2827 char **&candidates,
2828 size_t &candidates_len)
2829{
2830 for (gfc_formal_arglist *p = arg; p && p->sym; p = p->next)
2831 vec_push (candidates, candidates_len, p->sym->name);
2832}
2833
2834
2835/* Lookup argument ARG fuzzily, taking names in ARGUMENTS into account. */
2836
2837static const char*
2838lookup_arg_fuzzy (const char *arg, gfc_formal_arglist *arguments)
2839{
2840 char **candidates = NULL;
2841 size_t candidates_len = 0;
2842 lookup_arg_fuzzy_find_candidates (arguments, candidates, candidates_len);
2843 return gfc_closest_fuzzy_match (arg, candidates);
2844}
2845
2846
6de9cd9a
DN
2847/* Given formal and actual argument lists, see if they are compatible.
2848 If they are compatible, the actual argument list is sorted to
2849 correspond with the formal list, and elements for missing optional
2850 arguments are inserted. If WHERE pointer is nonnull, then we issue
2851 errors when things don't match instead of just returning the status
2852 code. */
2853
f3e1097b 2854static bool
f0ac18b7 2855compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
f3883269
SK
2856 int ranks_must_agree, int is_elemental,
2857 bool in_statement_function, locus *where)
6de9cd9a 2858{
fab27f52 2859 gfc_actual_arglist **new_arg, *a, *actual;
6de9cd9a
DN
2860 gfc_formal_arglist *f;
2861 int i, n, na;
2d5b90b2 2862 unsigned long actual_size, formal_size;
c49ea23d 2863 bool full_array = false;
eb401400 2864 gfc_array_ref *actual_arr_ref;
6de9cd9a
DN
2865
2866 actual = *ap;
2867
2868 if (actual == NULL && formal == NULL)
f3e1097b 2869 return true;
6de9cd9a
DN
2870
2871 n = 0;
2872 for (f = formal; f; f = f->next)
2873 n++;
2874
1145e690 2875 new_arg = XALLOCAVEC (gfc_actual_arglist *, n);
6de9cd9a
DN
2876
2877 for (i = 0; i < n; i++)
7b901ac4 2878 new_arg[i] = NULL;
6de9cd9a
DN
2879
2880 na = 0;
2881 f = formal;
2882 i = 0;
2883
2884 for (a = actual; a; a = a->next, f = f->next)
2885 {
3453b6aa
SK
2886 if (a->name != NULL && in_statement_function)
2887 {
2888 gfc_error ("Keyword argument %qs at %L is invalid in "
2889 "a statement function", a->name, &a->expr->where);
2890 return false;
2891 }
2892
7fcafa71
PT
2893 /* Look for keywords but ignore g77 extensions like %VAL. */
2894 if (a->name != NULL && a->name[0] != '%')
6de9cd9a
DN
2895 {
2896 i = 0;
2897 for (f = formal; f; f = f->next, i++)
2898 {
2899 if (f->sym == NULL)
2900 continue;
2901 if (strcmp (f->sym->name, a->name) == 0)
2902 break;
2903 }
2904
2905 if (f == NULL)
2906 {
2907 if (where)
bcc478b9
BRF
2908 {
2909 const char *guessed = lookup_arg_fuzzy (a->name, formal);
2910 if (guessed)
2911 gfc_error ("Keyword argument %qs at %L is not in "
2912 "the procedure; did you mean %qs?",
2913 a->name, &a->expr->where, guessed);
2914 else
2915 gfc_error ("Keyword argument %qs at %L is not in "
2916 "the procedure", a->name, &a->expr->where);
2917 }
f3e1097b 2918 return false;
6de9cd9a
DN
2919 }
2920
7b901ac4 2921 if (new_arg[i] != NULL)
6de9cd9a
DN
2922 {
2923 if (where)
c4100eae 2924 gfc_error ("Keyword argument %qs at %L is already associated "
b251af97
SK
2925 "with another actual argument", a->name,
2926 &a->expr->where);
f3e1097b 2927 return false;
6de9cd9a
DN
2928 }
2929 }
2930
2931 if (f == NULL)
2932 {
2933 if (where)
b251af97
SK
2934 gfc_error ("More actual than formal arguments in procedure "
2935 "call at %L", where);
6de9cd9a 2936
f3e1097b 2937 return false;
6de9cd9a
DN
2938 }
2939
2940 if (f->sym == NULL && a->expr == NULL)
2941 goto match;
2942
2943 if (f->sym == NULL)
2944 {
2945 if (where)
b251af97
SK
2946 gfc_error ("Missing alternate return spec in subroutine call "
2947 "at %L", where);
f3e1097b 2948 return false;
6de9cd9a
DN
2949 }
2950
2951 if (a->expr == NULL)
2952 {
2953 if (where)
b251af97
SK
2954 gfc_error ("Unexpected alternate return spec in subroutine "
2955 "call at %L", where);
f3e1097b 2956 return false;
6de9cd9a 2957 }
08857b61 2958
8b704316
PT
2959 /* Make sure that intrinsic vtables exist for calls to unlimited
2960 polymorphic formal arguments. */
524af0d6 2961 if (UNLIMITED_POLY (f->sym)
8b704316
PT
2962 && a->expr->ts.type != BT_DERIVED
2963 && a->expr->ts.type != BT_CLASS)
7289d1c9 2964 gfc_find_vtab (&a->expr->ts);
8b704316 2965
99091b70
TB
2966 if (a->expr->expr_type == EXPR_NULL
2967 && ((f->sym->ts.type != BT_CLASS && !f->sym->attr.pointer
2968 && (f->sym->attr.allocatable || !f->sym->attr.optional
2969 || (gfc_option.allow_std & GFC_STD_F2008) == 0))
2970 || (f->sym->ts.type == BT_CLASS
2971 && !CLASS_DATA (f->sym)->attr.class_pointer
2972 && (CLASS_DATA (f->sym)->attr.allocatable
2973 || !f->sym->attr.optional
2974 || (gfc_option.allow_std & GFC_STD_F2008) == 0))))
08857b61 2975 {
99091b70
TB
2976 if (where
2977 && (!f->sym->attr.optional
2978 || (f->sym->ts.type != BT_CLASS && f->sym->attr.allocatable)
2979 || (f->sym->ts.type == BT_CLASS
2980 && CLASS_DATA (f->sym)->attr.allocatable)))
c4100eae 2981 gfc_error ("Unexpected NULL() intrinsic at %L to dummy %qs",
08857b61
TB
2982 where, f->sym->name);
2983 else if (where)
2984 gfc_error ("Fortran 2008: Null pointer at %L to non-pointer "
c4100eae 2985 "dummy %qs", where, f->sym->name);
08857b61 2986
f3e1097b 2987 return false;
08857b61 2988 }
8b704316 2989
5ad6345e
TB
2990 if (!compare_parameter (f->sym, a->expr, ranks_must_agree,
2991 is_elemental, where))
f3e1097b 2992 return false;
6de9cd9a 2993
45a69325
TB
2994 /* TS 29113, 6.3p2. */
2995 if (f->sym->ts.type == BT_ASSUMED
2996 && (a->expr->ts.type == BT_DERIVED
2997 || (a->expr->ts.type == BT_CLASS && CLASS_DATA (a->expr))))
2998 {
2999 gfc_namespace *f2k_derived;
3000
3001 f2k_derived = a->expr->ts.type == BT_DERIVED
3002 ? a->expr->ts.u.derived->f2k_derived
3003 : CLASS_DATA (a->expr)->ts.u.derived->f2k_derived;
3004
3005 if (f2k_derived
3006 && (f2k_derived->finalizers || f2k_derived->tb_sym_root))
3007 {
3008 gfc_error ("Actual argument at %L to assumed-type dummy is of "
3009 "derived type with type-bound or FINAL procedures",
3010 &a->expr->where);
524af0d6 3011 return false;
45a69325
TB
3012 }
3013 }
3014
a0710c29
TB
3015 /* Special case for character arguments. For allocatable, pointer
3016 and assumed-shape dummies, the string length needs to match
3017 exactly. */
2d5b90b2 3018 if (a->expr->ts.type == BT_CHARACTER
eb401400
AV
3019 && a->expr->ts.u.cl && a->expr->ts.u.cl->length
3020 && a->expr->ts.u.cl->length->expr_type == EXPR_CONSTANT
3021 && f->sym->ts.type == BT_CHARACTER && f->sym->ts.u.cl
3022 && f->sym->ts.u.cl->length
3023 && f->sym->ts.u.cl->length->expr_type == EXPR_CONSTANT
3024 && (f->sym->attr.pointer || f->sym->attr.allocatable
3025 || (f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
3026 && (mpz_cmp (a->expr->ts.u.cl->length->value.integer,
3027 f->sym->ts.u.cl->length->value.integer) != 0))
3028 {
3029 if (where && (f->sym->attr.pointer || f->sym->attr.allocatable))
3030 gfc_warning (OPT_Wargument_mismatch,
3031 "Character length mismatch (%ld/%ld) between actual "
3032 "argument and pointer or allocatable dummy argument "
3033 "%qs at %L",
3034 mpz_get_si (a->expr->ts.u.cl->length->value.integer),
3035 mpz_get_si (f->sym->ts.u.cl->length->value.integer),
3036 f->sym->name, &a->expr->where);
3037 else if (where)
3038 gfc_warning (OPT_Wargument_mismatch,
3039 "Character length mismatch (%ld/%ld) between actual "
3040 "argument and assumed-shape dummy argument %qs "
3041 "at %L",
3042 mpz_get_si (a->expr->ts.u.cl->length->value.integer),
3043 mpz_get_si (f->sym->ts.u.cl->length->value.integer),
3044 f->sym->name, &a->expr->where);
f3e1097b 3045 return false;
eb401400 3046 }
a0324f7b 3047
8d51f26f 3048 if ((f->sym->attr.pointer || f->sym->attr.allocatable)
eb401400
AV
3049 && f->sym->ts.deferred != a->expr->ts.deferred
3050 && a->expr->ts.type == BT_CHARACTER)
8d51f26f
PT
3051 {
3052 if (where)
0c133211 3053 gfc_error ("Actual argument at %L to allocatable or "
c4100eae 3054 "pointer dummy argument %qs must have a deferred "
8d51f26f
PT
3055 "length type parameter if and only if the dummy has one",
3056 &a->expr->where, f->sym->name);
f3e1097b 3057 return false;
8d51f26f
PT
3058 }
3059
c49ea23d
PT
3060 if (f->sym->ts.type == BT_CLASS)
3061 goto skip_size_check;
3062
37639728
TB
3063 actual_size = get_expr_storage_size (a->expr);
3064 formal_size = get_sym_storage_size (f->sym);
93302a24
JW
3065 if (actual_size != 0 && actual_size < formal_size
3066 && a->expr->ts.type != BT_PROCEDURE
3067 && f->sym->attr.flavor != FL_PROCEDURE)
2d5b90b2
TB
3068 {
3069 if (a->expr->ts.type == BT_CHARACTER && !f->sym->as && where)
3df19fa0
FR
3070 gfc_warning (OPT_Wargument_mismatch,
3071 "Character length of actual argument shorter "
48749dbc 3072 "than of dummy argument %qs (%lu/%lu) at %L",
8d51f26f
PT
3073 f->sym->name, actual_size, formal_size,
3074 &a->expr->where);
2d5b90b2 3075 else if (where)
37d92a7e
DH
3076 {
3077 /* Emit a warning for -std=legacy and an error otherwise. */
3078 if (gfc_option.warn_std == 0)
3079 gfc_warning (OPT_Wargument_mismatch,
3080 "Actual argument contains too few "
3081 "elements for dummy argument %qs (%lu/%lu) "
3082 "at %L", f->sym->name, actual_size,
3083 formal_size, &a->expr->where);
3084 else
3085 gfc_error_now ("Actual argument contains too few "
3086 "elements for dummy argument %qs (%lu/%lu) "
3087 "at %L", f->sym->name, actual_size,
3088 formal_size, &a->expr->where);
3089 }
f3e1097b 3090 return false;
2d5b90b2
TB
3091 }
3092
c49ea23d
PT
3093 skip_size_check:
3094
e9355cc3
JW
3095 /* Satisfy F03:12.4.1.3 by ensuring that a procedure pointer actual
3096 argument is provided for a procedure pointer formal argument. */
8fb74da4 3097 if (f->sym->attr.proc_pointer
a7c0b11d 3098 && !((a->expr->expr_type == EXPR_VARIABLE
4294c093
JW
3099 && (a->expr->symtree->n.sym->attr.proc_pointer
3100 || gfc_is_proc_ptr_comp (a->expr)))
a7c0b11d 3101 || (a->expr->expr_type == EXPR_FUNCTION
4294c093 3102 && is_procptr_result (a->expr))))
8fb74da4
JW
3103 {
3104 if (where)
c4100eae 3105 gfc_error ("Expected a procedure pointer for argument %qs at %L",
8fb74da4 3106 f->sym->name, &a->expr->where);
f3e1097b 3107 return false;
8fb74da4
JW
3108 }
3109
e9355cc3 3110 /* Satisfy F03:12.4.1.3 by ensuring that a procedure actual argument is
699fa7aa 3111 provided for a procedure formal argument. */
e9355cc3 3112 if (f->sym->attr.flavor == FL_PROCEDURE
4294c093
JW
3113 && !((a->expr->expr_type == EXPR_VARIABLE
3114 && (a->expr->symtree->n.sym->attr.flavor == FL_PROCEDURE
3115 || a->expr->symtree->n.sym->attr.proc_pointer
3116 || gfc_is_proc_ptr_comp (a->expr)))
3117 || (a->expr->expr_type == EXPR_FUNCTION
3118 && is_procptr_result (a->expr))))
699fa7aa 3119 {
9914f8cf 3120 if (where)
c4100eae 3121 gfc_error ("Expected a procedure for argument %qs at %L",
9914f8cf 3122 f->sym->name, &a->expr->where);
f3e1097b 3123 return false;
699fa7aa
PT
3124 }
3125
b251af97 3126 if (f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE
bf9d2177
JJ
3127 && a->expr->expr_type == EXPR_VARIABLE
3128 && a->expr->symtree->n.sym->as
3129 && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SIZE
3130 && (a->expr->ref == NULL
3131 || (a->expr->ref->type == REF_ARRAY
3132 && a->expr->ref->u.ar.type == AR_FULL)))
3133 {
3134 if (where)
c4100eae 3135 gfc_error ("Actual argument for %qs cannot be an assumed-size"
bf9d2177 3136 " array at %L", f->sym->name, where);
f3e1097b 3137 return false;
bf9d2177
JJ
3138 }
3139
1600fe22
TS
3140 if (a->expr->expr_type != EXPR_NULL
3141 && compare_pointer (f->sym, a->expr) == 0)
6de9cd9a
DN
3142 {
3143 if (where)
c4100eae 3144 gfc_error ("Actual argument for %qs must be a pointer at %L",
6de9cd9a 3145 f->sym->name, &a->expr->where);
f3e1097b 3146 return false;
6de9cd9a
DN
3147 }
3148
7d54ef80
TB
3149 if (a->expr->expr_type != EXPR_NULL
3150 && (gfc_option.allow_std & GFC_STD_F2008) == 0
3151 && compare_pointer (f->sym, a->expr) == 2)
3152 {
3153 if (where)
3154 gfc_error ("Fortran 2008: Non-pointer actual argument at %L to "
c4100eae 3155 "pointer dummy %qs", &a->expr->where,f->sym->name);
f3e1097b 3156 return false;
7d54ef80 3157 }
8b704316 3158
7d54ef80 3159
d3a9eea2
TB
3160 /* Fortran 2008, C1242. */
3161 if (f->sym->attr.pointer && gfc_is_coindexed (a->expr))
3162 {
3163 if (where)
3164 gfc_error ("Coindexed actual argument at %L to pointer "
c4100eae 3165 "dummy %qs",
d3a9eea2 3166 &a->expr->where, f->sym->name);
f3e1097b 3167 return false;
d3a9eea2
TB
3168 }
3169
3170 /* Fortran 2008, 12.5.2.5 (no constraint). */
3171 if (a->expr->expr_type == EXPR_VARIABLE
3172 && f->sym->attr.intent != INTENT_IN
3173 && f->sym->attr.allocatable
3174 && gfc_is_coindexed (a->expr))
3175 {
3176 if (where)
3177 gfc_error ("Coindexed actual argument at %L to allocatable "
c4100eae 3178 "dummy %qs requires INTENT(IN)",
d3a9eea2 3179 &a->expr->where, f->sym->name);
f3e1097b 3180 return false;
d3a9eea2
TB
3181 }
3182
3183 /* Fortran 2008, C1237. */
3184 if (a->expr->expr_type == EXPR_VARIABLE
3185 && (f->sym->attr.asynchronous || f->sym->attr.volatile_)
3186 && gfc_is_coindexed (a->expr)
3187 && (a->expr->symtree->n.sym->attr.volatile_
3188 || a->expr->symtree->n.sym->attr.asynchronous))
3189 {
3190 if (where)
3191 gfc_error ("Coindexed ASYNCHRONOUS or VOLATILE actual argument at "
c4100eae 3192 "%L requires that dummy %qs has neither "
d3a9eea2
TB
3193 "ASYNCHRONOUS nor VOLATILE", &a->expr->where,
3194 f->sym->name);
f3e1097b 3195 return false;
d3a9eea2
TB
3196 }
3197
3198 /* Fortran 2008, 12.5.2.4 (no constraint). */
3199 if (a->expr->expr_type == EXPR_VARIABLE
3200 && f->sym->attr.intent != INTENT_IN && !f->sym->attr.value
3201 && gfc_is_coindexed (a->expr)
3202 && gfc_has_ultimate_allocatable (a->expr))
3203 {
3204 if (where)
3205 gfc_error ("Coindexed actual argument at %L with allocatable "
c4100eae 3206 "ultimate component to dummy %qs requires either VALUE "
d3a9eea2 3207 "or INTENT(IN)", &a->expr->where, f->sym->name);
f3e1097b 3208 return false;
d3a9eea2
TB
3209 }
3210
c49ea23d
PT
3211 if (f->sym->ts.type == BT_CLASS
3212 && CLASS_DATA (f->sym)->attr.allocatable
3213 && gfc_is_class_array_ref (a->expr, &full_array)
3214 && !full_array)
3215 {
3216 if (where)
c4100eae 3217 gfc_error ("Actual CLASS array argument for %qs must be a full "
c49ea23d 3218 "array at %L", f->sym->name, &a->expr->where);
f3e1097b 3219 return false;
c49ea23d
PT
3220 }
3221
3222
aa08038d 3223 if (a->expr->expr_type != EXPR_NULL
f3e1097b 3224 && !compare_allocatable (f->sym, a->expr))
aa08038d
EE
3225 {
3226 if (where)
c4100eae 3227 gfc_error ("Actual argument for %qs must be ALLOCATABLE at %L",
aa08038d 3228 f->sym->name, &a->expr->where);
f3e1097b 3229 return false;
aa08038d
EE
3230 }
3231
a920e94a 3232 /* Check intent = OUT/INOUT for definable actual argument. */
f3883269
SK
3233 if (!in_statement_function
3234 && (f->sym->attr.intent == INTENT_OUT
3235 || f->sym->attr.intent == INTENT_INOUT))
a920e94a 3236 {
8c91ab34
DK
3237 const char* context = (where
3238 ? _("actual argument to INTENT = OUT/INOUT")
3239 : NULL);
a920e94a 3240
bcb4ad36
TB
3241 if (((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3242 && CLASS_DATA (f->sym)->attr.class_pointer)
3243 || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
524af0d6 3244 && !gfc_check_vardef_context (a->expr, true, false, false, context))
f3e1097b 3245 return false;
524af0d6 3246 if (!gfc_check_vardef_context (a->expr, false, false, false, context))
f3e1097b 3247 return false;
ee7e677f
TB
3248 }
3249
59be8071
TB
3250 if ((f->sym->attr.intent == INTENT_OUT
3251 || f->sym->attr.intent == INTENT_INOUT
84efddb2
DF
3252 || f->sym->attr.volatile_
3253 || f->sym->attr.asynchronous)
03af1e4c 3254 && gfc_has_vector_subscript (a->expr))
59be8071
TB
3255 {
3256 if (where)
84efddb2
DF
3257 gfc_error ("Array-section actual argument with vector "
3258 "subscripts at %L is incompatible with INTENT(OUT), "
3259 "INTENT(INOUT), VOLATILE or ASYNCHRONOUS attribute "
c4100eae 3260 "of the dummy argument %qs",
59be8071 3261 &a->expr->where, f->sym->name);
f3e1097b 3262 return false;
59be8071
TB
3263 }
3264
9bce3c1c
TB
3265 /* C1232 (R1221) For an actual argument which is an array section or
3266 an assumed-shape array, the dummy argument shall be an assumed-
3267 shape array, if the dummy argument has the VOLATILE attribute. */
3268
3269 if (f->sym->attr.volatile_
271dd55c 3270 && a->expr->expr_type == EXPR_VARIABLE
9bce3c1c
TB
3271 && a->expr->symtree->n.sym->as
3272 && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SHAPE
3273 && !(f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
3274 {
3275 if (where)
3276 gfc_error ("Assumed-shape actual argument at %L is "
3277 "incompatible with the non-assumed-shape "
c4100eae 3278 "dummy argument %qs due to VOLATILE attribute",
9bce3c1c 3279 &a->expr->where,f->sym->name);
f3e1097b 3280 return false;
9bce3c1c
TB
3281 }
3282
eb401400
AV
3283 /* Find the last array_ref. */
3284 actual_arr_ref = NULL;
3285 if (a->expr->ref)
3286 actual_arr_ref = gfc_find_array_ref (a->expr, true);
3287
9bce3c1c 3288 if (f->sym->attr.volatile_
eb401400 3289 && actual_arr_ref && actual_arr_ref->type == AR_SECTION
9bce3c1c
TB
3290 && !(f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
3291 {
3292 if (where)
3293 gfc_error ("Array-section actual argument at %L is "
3294 "incompatible with the non-assumed-shape "
c4100eae 3295 "dummy argument %qs due to VOLATILE attribute",
eb401400 3296 &a->expr->where, f->sym->name);
f3e1097b 3297 return false;
9bce3c1c
TB
3298 }
3299
3300 /* C1233 (R1221) For an actual argument which is a pointer array, the
3301 dummy argument shall be an assumed-shape or pointer array, if the
3302 dummy argument has the VOLATILE attribute. */
3303
3304 if (f->sym->attr.volatile_
271dd55c 3305 && a->expr->expr_type == EXPR_VARIABLE
9bce3c1c
TB
3306 && a->expr->symtree->n.sym->attr.pointer
3307 && a->expr->symtree->n.sym->as
3308 && !(f->sym->as
3309 && (f->sym->as->type == AS_ASSUMED_SHAPE
3310 || f->sym->attr.pointer)))
3311 {
3312 if (where)
3313 gfc_error ("Pointer-array actual argument at %L requires "
3314 "an assumed-shape or pointer-array dummy "
c4100eae 3315 "argument %qs due to VOLATILE attribute",
9bce3c1c 3316 &a->expr->where,f->sym->name);
f3e1097b 3317 return false;
9bce3c1c
TB
3318 }
3319
6de9cd9a
DN
3320 match:
3321 if (a == actual)
3322 na = i;
3323
7b901ac4 3324 new_arg[i++] = a;
6de9cd9a
DN
3325 }
3326
3327 /* Make sure missing actual arguments are optional. */
3328 i = 0;
3329 for (f = formal; f; f = f->next, i++)
3330 {
7b901ac4 3331 if (new_arg[i] != NULL)
6de9cd9a 3332 continue;
3ab7b3de
BM
3333 if (f->sym == NULL)
3334 {
3335 if (where)
b251af97
SK
3336 gfc_error ("Missing alternate return spec in subroutine call "
3337 "at %L", where);
f3e1097b 3338 return false;
3ab7b3de 3339 }
f3883269
SK
3340 if (!f->sym->attr.optional
3341 || (in_statement_function && f->sym->attr.optional))
6de9cd9a
DN
3342 {
3343 if (where)
c4100eae 3344 gfc_error ("Missing actual argument for argument %qs at %L",
6de9cd9a 3345 f->sym->name, where);
f3e1097b 3346 return false;
6de9cd9a
DN
3347 }
3348 }
3349
3350 /* The argument lists are compatible. We now relink a new actual
3351 argument list with null arguments in the right places. The head
3352 of the list remains the head. */
3353 for (i = 0; i < n; i++)
7b901ac4
KG
3354 if (new_arg[i] == NULL)
3355 new_arg[i] = gfc_get_actual_arglist ();
6de9cd9a
DN
3356
3357 if (na != 0)
3358 {
fab27f52
MM
3359 std::swap (*new_arg[0], *actual);
3360 std::swap (new_arg[0], new_arg[na]);
6de9cd9a
DN
3361 }
3362
3363 for (i = 0; i < n - 1; i++)
7b901ac4 3364 new_arg[i]->next = new_arg[i + 1];
6de9cd9a 3365
7b901ac4 3366 new_arg[i]->next = NULL;
6de9cd9a
DN
3367
3368 if (*ap == NULL && n > 0)
7b901ac4 3369 *ap = new_arg[0];
6de9cd9a 3370
1600fe22 3371 /* Note the types of omitted optional arguments. */
b5ca4fd2 3372 for (a = *ap, f = formal; a; a = a->next, f = f->next)
1600fe22
TS
3373 if (a->expr == NULL && a->label == NULL)
3374 a->missing_arg_type = f->sym->ts.type;
3375
f3e1097b 3376 return true;
6de9cd9a
DN
3377}
3378
3379
3380typedef struct
3381{
3382 gfc_formal_arglist *f;
3383 gfc_actual_arglist *a;
3384}
3385argpair;
3386
3387/* qsort comparison function for argument pairs, with the following
3388 order:
3389 - p->a->expr == NULL
3390 - p->a->expr->expr_type != EXPR_VARIABLE
c5014982 3391 - by gfc_symbol pointer value (larger first). */
6de9cd9a
DN
3392
3393static int
3394pair_cmp (const void *p1, const void *p2)
3395{
3396 const gfc_actual_arglist *a1, *a2;
3397
3398 /* *p1 and *p2 are elements of the to-be-sorted array. */
3399 a1 = ((const argpair *) p1)->a;
3400 a2 = ((const argpair *) p2)->a;
3401 if (!a1->expr)
3402 {
3403 if (!a2->expr)
3404 return 0;
3405 return -1;
3406 }
3407 if (!a2->expr)
3408 return 1;
3409 if (a1->expr->expr_type != EXPR_VARIABLE)
3410 {
3411 if (a2->expr->expr_type != EXPR_VARIABLE)
3412 return 0;
3413 return -1;
3414 }
3415 if (a2->expr->expr_type != EXPR_VARIABLE)
3416 return 1;
c5014982
AM
3417 if (a1->expr->symtree->n.sym > a2->expr->symtree->n.sym)
3418 return -1;
6de9cd9a
DN
3419 return a1->expr->symtree->n.sym < a2->expr->symtree->n.sym;
3420}
3421
3422
3423/* Given two expressions from some actual arguments, test whether they
3424 refer to the same expression. The analysis is conservative.
524af0d6 3425 Returning false will produce no warning. */
6de9cd9a 3426
524af0d6 3427static bool
b251af97 3428compare_actual_expr (gfc_expr *e1, gfc_expr *e2)
6de9cd9a
DN
3429{
3430 const gfc_ref *r1, *r2;
3431
3432 if (!e1 || !e2
3433 || e1->expr_type != EXPR_VARIABLE
3434 || e2->expr_type != EXPR_VARIABLE
3435 || e1->symtree->n.sym != e2->symtree->n.sym)
524af0d6 3436 return false;
6de9cd9a
DN
3437
3438 /* TODO: improve comparison, see expr.c:show_ref(). */
3439 for (r1 = e1->ref, r2 = e2->ref; r1 && r2; r1 = r1->next, r2 = r2->next)
3440 {
3441 if (r1->type != r2->type)
524af0d6 3442 return false;
6de9cd9a
DN
3443 switch (r1->type)
3444 {
3445 case REF_ARRAY:
3446 if (r1->u.ar.type != r2->u.ar.type)
524af0d6 3447 return false;
6de9cd9a
DN
3448 /* TODO: At the moment, consider only full arrays;
3449 we could do better. */
3450 if (r1->u.ar.type != AR_FULL || r2->u.ar.type != AR_FULL)
524af0d6 3451 return false;
6de9cd9a
DN
3452 break;
3453
3454 case REF_COMPONENT:
3455 if (r1->u.c.component != r2->u.c.component)
524af0d6 3456 return false;
6de9cd9a
DN
3457 break;
3458
3459 case REF_SUBSTRING:
524af0d6 3460 return false;
6de9cd9a
DN
3461
3462 default:
3463 gfc_internal_error ("compare_actual_expr(): Bad component code");
3464 }
3465 }
3466 if (!r1 && !r2)
524af0d6
JB
3467 return true;
3468 return false;
6de9cd9a
DN
3469}
3470
b251af97 3471
6de9cd9a
DN
3472/* Given formal and actual argument lists that correspond to one
3473 another, check that identical actual arguments aren't not
3474 associated with some incompatible INTENTs. */
3475
524af0d6 3476static bool
b251af97 3477check_some_aliasing (gfc_formal_arglist *f, gfc_actual_arglist *a)
6de9cd9a
DN
3478{
3479 sym_intent f1_intent, f2_intent;
3480 gfc_formal_arglist *f1;
3481 gfc_actual_arglist *a1;
3482 size_t n, i, j;
3483 argpair *p;
524af0d6 3484 bool t = true;
6de9cd9a
DN
3485
3486 n = 0;
3487 for (f1 = f, a1 = a;; f1 = f1->next, a1 = a1->next)
3488 {
3489 if (f1 == NULL && a1 == NULL)
3490 break;
3491 if (f1 == NULL || a1 == NULL)
3492 gfc_internal_error ("check_some_aliasing(): List mismatch");
3493 n++;
3494 }
3495 if (n == 0)
3496 return t;
1145e690 3497 p = XALLOCAVEC (argpair, n);
6de9cd9a
DN
3498
3499 for (i = 0, f1 = f, a1 = a; i < n; i++, f1 = f1->next, a1 = a1->next)
3500 {
3501 p[i].f = f1;
3502 p[i].a = a1;
3503 }
3504
3505 qsort (p, n, sizeof (argpair), pair_cmp);
3506
3507 for (i = 0; i < n; i++)
3508 {
3509 if (!p[i].a->expr
3510 || p[i].a->expr->expr_type != EXPR_VARIABLE
3511 || p[i].a->expr->ts.type == BT_PROCEDURE)
3512 continue;
3513 f1_intent = p[i].f->sym->attr.intent;
3514 for (j = i + 1; j < n; j++)
3515 {
3516 /* Expected order after the sort. */
3517 if (!p[j].a->expr || p[j].a->expr->expr_type != EXPR_VARIABLE)
3518 gfc_internal_error ("check_some_aliasing(): corrupted data");
3519
3520 /* Are the expression the same? */
524af0d6 3521 if (!compare_actual_expr (p[i].a->expr, p[j].a->expr))
6de9cd9a
DN
3522 break;
3523 f2_intent = p[j].f->sym->attr.intent;
3524 if ((f1_intent == INTENT_IN && f2_intent == INTENT_OUT)
9f1930be
TB
3525 || (f1_intent == INTENT_OUT && f2_intent == INTENT_IN)
3526 || (f1_intent == INTENT_OUT && f2_intent == INTENT_OUT))
6de9cd9a 3527 {
db30e21c 3528 gfc_warning (0, "Same actual argument associated with INTENT(%s) "
48749dbc 3529 "argument %qs and INTENT(%s) argument %qs at %L",
6de9cd9a
DN
3530 gfc_intent_string (f1_intent), p[i].f->sym->name,
3531 gfc_intent_string (f2_intent), p[j].f->sym->name,
3532 &p[i].a->expr->where);
524af0d6 3533 t = false;
6de9cd9a
DN
3534 }
3535 }
3536 }
3537
3538 return t;
3539}
3540
3541
3542/* Given formal and actual argument lists that correspond to one
3543 another, check that they are compatible in the sense that intents
3544 are not mismatched. */
3545
524af0d6 3546static bool
b251af97 3547check_intents (gfc_formal_arglist *f, gfc_actual_arglist *a)
6de9cd9a 3548{
f17facac 3549 sym_intent f_intent;
6de9cd9a
DN
3550
3551 for (;; f = f->next, a = a->next)
3552 {
99c39534
TB
3553 gfc_expr *expr;
3554
6de9cd9a
DN
3555 if (f == NULL && a == NULL)
3556 break;
3557 if (f == NULL || a == NULL)
3558 gfc_internal_error ("check_intents(): List mismatch");
3559
99c39534
TB
3560 if (a->expr && a->expr->expr_type == EXPR_FUNCTION
3561 && a->expr->value.function.isym
3562 && a->expr->value.function.isym->id == GFC_ISYM_CAF_GET)
3563 expr = a->expr->value.function.actual->expr;
3564 else
3565 expr = a->expr;
3566
3567 if (expr == NULL || expr->expr_type != EXPR_VARIABLE)
6de9cd9a
DN
3568 continue;
3569
6de9cd9a
DN
3570 f_intent = f->sym->attr.intent;
3571
99c39534 3572 if (gfc_pure (NULL) && gfc_impure_variable (expr->symtree->n.sym))
6de9cd9a 3573 {
bcb4ad36
TB
3574 if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3575 && CLASS_DATA (f->sym)->attr.class_pointer)
3576 || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
6de9cd9a 3577 {
b251af97
SK
3578 gfc_error ("Procedure argument at %L is local to a PURE "
3579 "procedure and has the POINTER attribute",
99c39534 3580 &expr->where);
524af0d6 3581 return false;
6de9cd9a
DN
3582 }
3583 }
d3a9eea2
TB
3584
3585 /* Fortran 2008, C1283. */
99c39534 3586 if (gfc_pure (NULL) && gfc_is_coindexed (expr))
d3a9eea2
TB
3587 {
3588 if (f_intent == INTENT_INOUT || f_intent == INTENT_OUT)
3589 {
3590 gfc_error ("Coindexed actual argument at %L in PURE procedure "
3591 "is passed to an INTENT(%s) argument",
99c39534 3592 &expr->where, gfc_intent_string (f_intent));
524af0d6 3593 return false;
d3a9eea2
TB
3594 }
3595
bcb4ad36
TB
3596 if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3597 && CLASS_DATA (f->sym)->attr.class_pointer)
3598 || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
d3a9eea2
TB
3599 {
3600 gfc_error ("Coindexed actual argument at %L in PURE procedure "
3601 "is passed to a POINTER dummy argument",
99c39534 3602 &expr->where);
524af0d6 3603 return false;
d3a9eea2
TB
3604 }
3605 }
3606
3607 /* F2008, Section 12.5.2.4. */
99c39534
TB
3608 if (expr->ts.type == BT_CLASS && f->sym->ts.type == BT_CLASS
3609 && gfc_is_coindexed (expr))
d3a9eea2
TB
3610 {
3611 gfc_error ("Coindexed polymorphic actual argument at %L is passed "
c4100eae 3612 "polymorphic dummy argument %qs",
99c39534 3613 &expr->where, f->sym->name);
524af0d6 3614 return false;
d3a9eea2 3615 }
6de9cd9a
DN
3616 }
3617
524af0d6 3618 return true;
6de9cd9a
DN
3619}
3620
3621
3622/* Check how a procedure is used against its interface. If all goes
3623 well, the actual argument list will also end up being properly
3624 sorted. */
3625
524af0d6 3626bool
b251af97 3627gfc_procedure_use (gfc_symbol *sym, gfc_actual_arglist **ap, locus *where)
6de9cd9a 3628{
f3883269 3629 gfc_actual_arglist *a;
4cbc9039
JW
3630 gfc_formal_arglist *dummy_args;
3631
a9c5fe7e 3632 /* Warn about calls with an implicit interface. Special case
6bd2c800 3633 for calling a ISO_C_BINDING because c_loc and c_funloc
ca071303
FXC
3634 are pseudo-unknown. Additionally, warn about procedures not
3635 explicitly declared at all if requested. */
8b7a967e 3636 if (sym->attr.if_source == IFSRC_UNKNOWN && !sym->attr.is_iso_c)
ca071303 3637 {
8b7a967e
TB
3638 if (sym->ns->has_implicit_none_export && sym->attr.proc == PROC_UNKNOWN)
3639 {
bcc478b9
BRF
3640 const char *guessed
3641 = gfc_lookup_function_fuzzy (sym->name, sym->ns->sym_root);
3642 if (guessed)
3643 gfc_error ("Procedure %qs called at %L is not explicitly declared"
3644 "; did you mean %qs?",
3645 sym->name, where, guessed);
3646 else
3647 gfc_error ("Procedure %qs called at %L is not explicitly declared",
3648 sym->name, where);
8b7a967e
TB
3649 return false;
3650 }
73e42eef 3651 if (warn_implicit_interface)
48749dbc
MLI
3652 gfc_warning (OPT_Wimplicit_interface,
3653 "Procedure %qs called with an implicit interface at %L",
ca071303 3654 sym->name, where);
73e42eef 3655 else if (warn_implicit_procedure && sym->attr.proc == PROC_UNKNOWN)
48749dbc
MLI
3656 gfc_warning (OPT_Wimplicit_procedure,
3657 "Procedure %qs called at %L is not explicitly declared",
ca071303
FXC
3658 sym->name, where);
3659 }
6de9cd9a 3660
e6895430 3661 if (sym->attr.if_source == IFSRC_UNKNOWN)
ac05557c 3662 {
86d7449c
TB
3663 if (sym->attr.pointer)
3664 {
c4100eae
MLI
3665 gfc_error ("The pointer object %qs at %L must have an explicit "
3666 "function interface or be declared as array",
3667 sym->name, where);
524af0d6 3668 return false;
86d7449c
TB
3669 }
3670
3671 if (sym->attr.allocatable && !sym->attr.external)
3672 {
c4100eae
MLI
3673 gfc_error ("The allocatable object %qs at %L must have an explicit "
3674 "function interface or be declared as array",
3675 sym->name, where);
524af0d6 3676 return false;
86d7449c
TB
3677 }
3678
3679 if (sym->attr.allocatable)
3680 {
c4100eae
MLI
3681 gfc_error ("Allocatable function %qs at %L must have an explicit "
3682 "function interface", sym->name, where);
524af0d6 3683 return false;
86d7449c
TB
3684 }
3685
ac05557c
DF
3686 for (a = *ap; a; a = a->next)
3687 {
3688 /* Skip g77 keyword extensions like %VAL, %REF, %LOC. */
3689 if (a->name != NULL && a->name[0] != '%')
3690 {
c4100eae
MLI
3691 gfc_error ("Keyword argument requires explicit interface "
3692 "for procedure %qs at %L", sym->name, &a->expr->where);
ac05557c
DF
3693 break;
3694 }
fea54935 3695
45a69325
TB
3696 /* TS 29113, 6.2. */
3697 if (a->expr && a->expr->ts.type == BT_ASSUMED
3698 && sym->intmod_sym_id != ISOCBINDING_LOC)
3699 {
3700 gfc_error ("Assumed-type argument %s at %L requires an explicit "
3701 "interface", a->expr->symtree->n.sym->name,
3702 &a->expr->where);
3703 break;
3704 }
3705
fea54935
TB
3706 /* F2008, C1303 and C1304. */
3707 if (a->expr
3708 && (a->expr->ts.type == BT_DERIVED || a->expr->ts.type == BT_CLASS)
3709 && ((a->expr->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
3710 && a->expr->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
3711 || gfc_expr_attr (a->expr).lock_comp))
3712 {
c4100eae
MLI
3713 gfc_error ("Actual argument of LOCK_TYPE or with LOCK_TYPE "
3714 "component at %L requires an explicit interface for "
3715 "procedure %qs", &a->expr->where, sym->name);
fea54935
TB
3716 break;
3717 }
ea8ad3e5 3718
5df445a2
TB
3719 if (a->expr
3720 && (a->expr->ts.type == BT_DERIVED || a->expr->ts.type == BT_CLASS)
3721 && ((a->expr->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
3722 && a->expr->ts.u.derived->intmod_sym_id
3723 == ISOFORTRAN_EVENT_TYPE)
3724 || gfc_expr_attr (a->expr).event_comp))
3725 {
3726 gfc_error ("Actual argument of EVENT_TYPE or with EVENT_TYPE "
3727 "component at %L requires an explicit interface for "
3728 "procedure %qs", &a->expr->where, sym->name);
3729 break;
3730 }
3731
ea8ad3e5
TB
3732 if (a->expr && a->expr->expr_type == EXPR_NULL
3733 && a->expr->ts.type == BT_UNKNOWN)
3734 {
3735 gfc_error ("MOLD argument to NULL required at %L", &a->expr->where);
524af0d6 3736 return false;
ea8ad3e5 3737 }
c62c6622
TB
3738
3739 /* TS 29113, C407b. */
3740 if (a->expr && a->expr->expr_type == EXPR_VARIABLE
3741 && symbol_rank (a->expr->symtree->n.sym) == -1)
3742 {
3743 gfc_error ("Assumed-rank argument requires an explicit interface "
3744 "at %L", &a->expr->where);
524af0d6 3745 return false;
c62c6622 3746 }
ac05557c
DF
3747 }
3748
524af0d6 3749 return true;
ac05557c
DF
3750 }
3751
4cbc9039
JW
3752 dummy_args = gfc_sym_get_dummy_args (sym);
3753
f3883269
SK
3754 /* For a statement function, check that types and type parameters of actual
3755 arguments and dummy arguments match. */
3756 if (!compare_actual_formal (ap, dummy_args, 0, sym->attr.elemental,
3757 sym->attr.proc == PROC_ST_FUNCTION, where))
524af0d6 3758 return false;
f3883269 3759
524af0d6
JB
3760 if (!check_intents (dummy_args, *ap))
3761 return false;
6de9cd9a 3762
73e42eef 3763 if (warn_aliasing)
4cbc9039 3764 check_some_aliasing (dummy_args, *ap);
f8552cd4 3765
524af0d6 3766 return true;
6de9cd9a
DN
3767}
3768
3769
7e196f89
JW
3770/* Check how a procedure pointer component is used against its interface.
3771 If all goes well, the actual argument list will also end up being properly
3772 sorted. Completely analogous to gfc_procedure_use. */
3773
3774void
3775gfc_ppc_use (gfc_component *comp, gfc_actual_arglist **ap, locus *where)
3776{
7e196f89 3777 /* Warn about calls with an implicit interface. Special case
6bd2c800 3778 for calling a ISO_C_BINDING because c_loc and c_funloc
7e196f89 3779 are pseudo-unknown. */
73e42eef 3780 if (warn_implicit_interface
7e196f89
JW
3781 && comp->attr.if_source == IFSRC_UNKNOWN
3782 && !comp->attr.is_iso_c)
48749dbc
MLI
3783 gfc_warning (OPT_Wimplicit_interface,
3784 "Procedure pointer component %qs called with an implicit "
7e196f89
JW
3785 "interface at %L", comp->name, where);
3786
3787 if (comp->attr.if_source == IFSRC_UNKNOWN)
3788 {
3789 gfc_actual_arglist *a;
3790 for (a = *ap; a; a = a->next)
3791 {
3792 /* Skip g77 keyword extensions like %VAL, %REF, %LOC. */
3793 if (a->name != NULL && a->name[0] != '%')
3794 {
c4100eae
MLI
3795 gfc_error ("Keyword argument requires explicit interface "
3796 "for procedure pointer component %qs at %L",
3797 comp->name, &a->expr->where);
7e196f89
JW
3798 break;
3799 }
3800 }
3801
3802 return;
3803 }
3804
4cbc9039 3805 if (!compare_actual_formal (ap, comp->ts.interface->formal, 0,
f3883269 3806 comp->attr.elemental, false, where))
7e196f89
JW
3807 return;
3808
4cbc9039 3809 check_intents (comp->ts.interface->formal, *ap);
73e42eef 3810 if (warn_aliasing)
4cbc9039 3811 check_some_aliasing (comp->ts.interface->formal, *ap);
7e196f89
JW
3812}
3813
3814
f0ac18b7
DK
3815/* Try if an actual argument list matches the formal list of a symbol,
3816 respecting the symbol's attributes like ELEMENTAL. This is used for
3817 GENERIC resolution. */
3818
3819bool
3820gfc_arglist_matches_symbol (gfc_actual_arglist** args, gfc_symbol* sym)
3821{
4cbc9039 3822 gfc_formal_arglist *dummy_args;
f0ac18b7
DK
3823 bool r;
3824
1d101216
JD
3825 if (sym->attr.flavor != FL_PROCEDURE)
3826 return false;
f0ac18b7 3827
4cbc9039
JW
3828 dummy_args = gfc_sym_get_dummy_args (sym);
3829
f0ac18b7 3830 r = !sym->attr.elemental;
f3883269 3831 if (compare_actual_formal (args, dummy_args, r, !r, false, NULL))
f0ac18b7 3832 {
4cbc9039 3833 check_intents (dummy_args, *args);
73e42eef 3834 if (warn_aliasing)
4cbc9039 3835 check_some_aliasing (dummy_args, *args);
f0ac18b7
DK
3836 return true;
3837 }
3838
3839 return false;
3840}
3841
3842
6de9cd9a
DN
3843/* Given an interface pointer and an actual argument list, search for
3844 a formal argument list that matches the actual. If found, returns
3845 a pointer to the symbol of the correct interface. Returns NULL if
3846 not found. */
3847
3848gfc_symbol *
b251af97
SK
3849gfc_search_interface (gfc_interface *intr, int sub_flag,
3850 gfc_actual_arglist **ap)
6de9cd9a 3851{
22a0a780 3852 gfc_symbol *elem_sym = NULL;
ea8ad3e5
TB
3853 gfc_symbol *null_sym = NULL;
3854 locus null_expr_loc;
3855 gfc_actual_arglist *a;
3856 bool has_null_arg = false;
3857
3858 for (a = *ap; a; a = a->next)
3859 if (a->expr && a->expr->expr_type == EXPR_NULL
3860 && a->expr->ts.type == BT_UNKNOWN)
3861 {
3862 has_null_arg = true;
3863 null_expr_loc = a->expr->where;
3864 break;
8b704316 3865 }
ea8ad3e5 3866
6de9cd9a
DN
3867 for (; intr; intr = intr->next)
3868 {
f6288c24 3869 if (gfc_fl_struct (intr->sym->attr.flavor))
c3f34952 3870 continue;
6de9cd9a
DN
3871 if (sub_flag && intr->sym->attr.function)
3872 continue;
3873 if (!sub_flag && intr->sym->attr.subroutine)
3874 continue;
3875
f0ac18b7 3876 if (gfc_arglist_matches_symbol (ap, intr->sym))
22a0a780 3877 {
ea8ad3e5
TB
3878 if (has_null_arg && null_sym)
3879 {
3880 gfc_error ("MOLD= required in NULL() argument at %L: Ambiguity "
3881 "between specific functions %s and %s",
3882 &null_expr_loc, null_sym->name, intr->sym->name);
3883 return NULL;
3884 }
3885 else if (has_null_arg)
3886 {
3887 null_sym = intr->sym;
3888 continue;
3889 }
3890
22a0a780 3891 /* Satisfy 12.4.4.1 such that an elemental match has lower
8b704316 3892 weight than a non-elemental match. */
22a0a780
PT
3893 if (intr->sym->attr.elemental)
3894 {
3895 elem_sym = intr->sym;
3896 continue;
3897 }
3898 return intr->sym;
3899 }
6de9cd9a
DN
3900 }
3901
ea8ad3e5
TB
3902 if (null_sym)
3903 return null_sym;
3904
22a0a780 3905 return elem_sym ? elem_sym : NULL;
6de9cd9a
DN
3906}
3907
3908
3909/* Do a brute force recursive search for a symbol. */
3910
3911static gfc_symtree *
b251af97 3912find_symtree0 (gfc_symtree *root, gfc_symbol *sym)
6de9cd9a
DN
3913{
3914 gfc_symtree * st;
3915
3916 if (root->n.sym == sym)
3917 return root;
3918
3919 st = NULL;
3920 if (root->left)
3921 st = find_symtree0 (root->left, sym);
3922 if (root->right && ! st)
3923 st = find_symtree0 (root->right, sym);
3924 return st;
3925}
3926
3927
3928/* Find a symtree for a symbol. */
3929
f6fad28e
DK
3930gfc_symtree *
3931gfc_find_sym_in_symtree (gfc_symbol *sym)
6de9cd9a
DN
3932{
3933 gfc_symtree *st;
3934 gfc_namespace *ns;
3935
3936 /* First try to find it by name. */
3937 gfc_find_sym_tree (sym->name, gfc_current_ns, 1, &st);
3938 if (st && st->n.sym == sym)
3939 return st;
3940
66e4ab31 3941 /* If it's been renamed, resort to a brute-force search. */
6de9cd9a
DN
3942 /* TODO: avoid having to do this search. If the symbol doesn't exist
3943 in the symtree for the current namespace, it should probably be added. */
3944 for (ns = gfc_current_ns; ns; ns = ns->parent)
3945 {
3946 st = find_symtree0 (ns->sym_root, sym);
3947 if (st)
b251af97 3948 return st;
6de9cd9a 3949 }
17d5d49f 3950 gfc_internal_error ("Unable to find symbol %qs", sym->name);
66e4ab31 3951 /* Not reached. */
6de9cd9a
DN
3952}
3953
3954
4a44a72d
DK
3955/* See if the arglist to an operator-call contains a derived-type argument
3956 with a matching type-bound operator. If so, return the matching specific
3957 procedure defined as operator-target as well as the base-object to use
974df0f8
PT
3958 (which is the found derived-type argument with operator). The generic
3959 name, if any, is transmitted to the final expression via 'gname'. */
4a44a72d
DK
3960
3961static gfc_typebound_proc*
3962matching_typebound_op (gfc_expr** tb_base,
3963 gfc_actual_arglist* args,
974df0f8
PT
3964 gfc_intrinsic_op op, const char* uop,
3965 const char ** gname)
4a44a72d
DK
3966{
3967 gfc_actual_arglist* base;
3968
3969 for (base = args; base; base = base->next)
4b7dd692 3970 if (base->expr->ts.type == BT_DERIVED || base->expr->ts.type == BT_CLASS)
4a44a72d
DK
3971 {
3972 gfc_typebound_proc* tb;
3973 gfc_symbol* derived;
524af0d6 3974 bool result;
4a44a72d 3975
efd2e969
PT
3976 while (base->expr->expr_type == EXPR_OP
3977 && base->expr->value.op.op == INTRINSIC_PARENTHESES)
3978 base->expr = base->expr->value.op.op1;
3979
4b7dd692 3980 if (base->expr->ts.type == BT_CLASS)
528622fd 3981 {
fba5a793 3982 if (!base->expr->ts.u.derived || CLASS_DATA (base->expr) == NULL
0a59e583 3983 || !gfc_expr_attr (base->expr).class_ok)
528622fd
JW
3984 continue;
3985 derived = CLASS_DATA (base->expr)->ts.u.derived;
3986 }
4b7dd692
JW
3987 else
3988 derived = base->expr->ts.u.derived;
4a44a72d
DK
3989
3990 if (op == INTRINSIC_USER)
3991 {
3992 gfc_symtree* tb_uop;
3993
3994 gcc_assert (uop);
3995 tb_uop = gfc_find_typebound_user_op (derived, &result, uop,
3996 false, NULL);
3997
3998 if (tb_uop)
3999 tb = tb_uop->n.tb;
4000 else
4001 tb = NULL;
4002 }
4003 else
4004 tb = gfc_find_typebound_intrinsic_op (derived, &result, op,
4005 false, NULL);
4006
4007 /* This means we hit a PRIVATE operator which is use-associated and
4008 should thus not be seen. */
524af0d6 4009 if (!result)
4a44a72d
DK
4010 tb = NULL;
4011
4012 /* Look through the super-type hierarchy for a matching specific
4013 binding. */
4014 for (; tb; tb = tb->overridden)
4015 {
4016 gfc_tbp_generic* g;
4017
4018 gcc_assert (tb->is_generic);
4019 for (g = tb->u.generic; g; g = g->next)
4020 {
4021 gfc_symbol* target;
4022 gfc_actual_arglist* argcopy;
4023 bool matches;
4024
4025 gcc_assert (g->specific);
4026 if (g->specific->error)
4027 continue;
4028
4029 target = g->specific->u.specific->n.sym;
4030
4031 /* Check if this arglist matches the formal. */
4032 argcopy = gfc_copy_actual_arglist (args);
4033 matches = gfc_arglist_matches_symbol (&argcopy, target);
4034 gfc_free_actual_arglist (argcopy);
4035
4036 /* Return if we found a match. */
4037 if (matches)
4038 {
4039 *tb_base = base->expr;
974df0f8 4040 *gname = g->specific_st->name;
4a44a72d
DK
4041 return g->specific;
4042 }
4043 }
4044 }
4045 }
4046
4047 return NULL;
4048}
4049
4050
4051/* For the 'actual arglist' of an operator call and a specific typebound
4052 procedure that has been found the target of a type-bound operator, build the
4053 appropriate EXPR_COMPCALL and resolve it. We take this indirection over
4054 type-bound procedures rather than resolving type-bound operators 'directly'
4055 so that we can reuse the existing logic. */
4056
4057static void
4058build_compcall_for_operator (gfc_expr* e, gfc_actual_arglist* actual,
974df0f8
PT
4059 gfc_expr* base, gfc_typebound_proc* target,
4060 const char *gname)
4a44a72d
DK
4061{
4062 e->expr_type = EXPR_COMPCALL;
4063 e->value.compcall.tbp = target;
974df0f8 4064 e->value.compcall.name = gname ? gname : "$op";
4a44a72d
DK
4065 e->value.compcall.actual = actual;
4066 e->value.compcall.base_object = base;
4067 e->value.compcall.ignore_pass = 1;
4068 e->value.compcall.assign = 0;
94fae14b
PT
4069 if (e->ts.type == BT_UNKNOWN
4070 && target->function)
4071 {
4072 if (target->is_generic)
4073 e->ts = target->u.generic->specific->u.specific->n.sym->ts;
4074 else
4075 e->ts = target->u.specific->n.sym->ts;
4076 }
4a44a72d
DK
4077}
4078
4079
6de9cd9a
DN
4080/* This subroutine is called when an expression is being resolved.
4081 The expression node in question is either a user defined operator
1f2959f0 4082 or an intrinsic operator with arguments that aren't compatible
6de9cd9a
DN
4083 with the operator. This subroutine builds an actual argument list
4084 corresponding to the operands, then searches for a compatible
4085 interface. If one is found, the expression node is replaced with
eaee02a5
JW
4086 the appropriate function call. We use the 'match' enum to specify
4087 whether a replacement has been made or not, or if an error occurred. */
6de9cd9a 4088
eaee02a5
JW
4089match
4090gfc_extend_expr (gfc_expr *e)
6de9cd9a
DN
4091{
4092 gfc_actual_arglist *actual;
4093 gfc_symbol *sym;
4094 gfc_namespace *ns;
4095 gfc_user_op *uop;
4096 gfc_intrinsic_op i;
974df0f8 4097 const char *gname;
517d78be
JW
4098 gfc_typebound_proc* tbo;
4099 gfc_expr* tb_base;
6de9cd9a
DN
4100
4101 sym = NULL;
4102
4103 actual = gfc_get_actual_arglist ();
58b03ab2 4104 actual->expr = e->value.op.op1;
6de9cd9a 4105
974df0f8 4106 gname = NULL;
4a44a72d 4107
58b03ab2 4108 if (e->value.op.op2 != NULL)
6de9cd9a
DN
4109 {
4110 actual->next = gfc_get_actual_arglist ();
58b03ab2 4111 actual->next->expr = e->value.op.op2;
6de9cd9a
DN
4112 }
4113
e8d4f3fc 4114 i = fold_unary_intrinsic (e->value.op.op);
6de9cd9a 4115
517d78be
JW
4116 /* See if we find a matching type-bound operator. */
4117 if (i == INTRINSIC_USER)
4118 tbo = matching_typebound_op (&tb_base, actual,
4119 i, e->value.op.uop->name, &gname);
4120 else
4121 switch (i)
4122 {
4123#define CHECK_OS_COMPARISON(comp) \
4124 case INTRINSIC_##comp: \
4125 case INTRINSIC_##comp##_OS: \
4126 tbo = matching_typebound_op (&tb_base, actual, \
4127 INTRINSIC_##comp, NULL, &gname); \
4128 if (!tbo) \
4129 tbo = matching_typebound_op (&tb_base, actual, \
4130 INTRINSIC_##comp##_OS, NULL, &gname); \
4131 break;
4132 CHECK_OS_COMPARISON(EQ)
4133 CHECK_OS_COMPARISON(NE)
4134 CHECK_OS_COMPARISON(GT)
4135 CHECK_OS_COMPARISON(GE)
4136 CHECK_OS_COMPARISON(LT)
4137 CHECK_OS_COMPARISON(LE)
4138#undef CHECK_OS_COMPARISON
4139
4140 default:
4141 tbo = matching_typebound_op (&tb_base, actual, i, NULL, &gname);
4142 break;
4143 }
4144
4145 /* If there is a matching typebound-operator, replace the expression with
4146 a call to it and succeed. */
4147 if (tbo)
4148 {
4149 gcc_assert (tb_base);
4150 build_compcall_for_operator (e, actual, tb_base, tbo, gname);
4151
4152 if (!gfc_resolve_expr (e))
4153 return MATCH_ERROR;
4154 else
4155 return MATCH_YES;
4156 }
e73d3ca6 4157
6de9cd9a
DN
4158 if (i == INTRINSIC_USER)
4159 {
4160 for (ns = gfc_current_ns; ns; ns = ns->parent)
4161 {
58b03ab2 4162 uop = gfc_find_uop (e->value.op.uop->name, ns);
6de9cd9a
DN
4163 if (uop == NULL)
4164 continue;
4165
a1ee985f 4166 sym = gfc_search_interface (uop->op, 0, &actual);
6de9cd9a
DN
4167 if (sym != NULL)
4168 break;
4169 }
4170 }
4171 else
4172 {
4173 for (ns = gfc_current_ns; ns; ns = ns->parent)
4174 {
3bed9dd0
DF
4175 /* Due to the distinction between '==' and '.eq.' and friends, one has
4176 to check if either is defined. */
4177 switch (i)
4178 {
4a44a72d
DK
4179#define CHECK_OS_COMPARISON(comp) \
4180 case INTRINSIC_##comp: \
4181 case INTRINSIC_##comp##_OS: \
4182 sym = gfc_search_interface (ns->op[INTRINSIC_##comp], 0, &actual); \
4183 if (!sym) \
4184 sym = gfc_search_interface (ns->op[INTRINSIC_##comp##_OS], 0, &actual); \
4185 break;
4186 CHECK_OS_COMPARISON(EQ)
4187 CHECK_OS_COMPARISON(NE)
4188 CHECK_OS_COMPARISON(GT)
4189 CHECK_OS_COMPARISON(GE)
4190 CHECK_OS_COMPARISON(LT)
4191 CHECK_OS_COMPARISON(LE)
4192#undef CHECK_OS_COMPARISON
3bed9dd0
DF
4193
4194 default:
a1ee985f 4195 sym = gfc_search_interface (ns->op[i], 0, &actual);
3bed9dd0
DF
4196 }
4197
6de9cd9a
DN
4198 if (sym != NULL)
4199 break;
4200 }
4201 }
4202
4a44a72d
DK
4203 /* TODO: Do an ambiguity-check and error if multiple matching interfaces are
4204 found rather than just taking the first one and not checking further. */
4205
6de9cd9a
DN
4206 if (sym == NULL)
4207 {
66e4ab31 4208 /* Don't use gfc_free_actual_arglist(). */
04695783 4209 free (actual->next);
cede9502 4210 free (actual);
eaee02a5 4211 return MATCH_NO;
6de9cd9a
DN
4212 }
4213
4214 /* Change the expression node to a function call. */
4215 e->expr_type = EXPR_FUNCTION;
f6fad28e 4216 e->symtree = gfc_find_sym_in_symtree (sym);
6de9cd9a 4217 e->value.function.actual = actual;
58b03ab2
TS
4218 e->value.function.esym = NULL;
4219 e->value.function.isym = NULL;
cf013e9f 4220 e->value.function.name = NULL;
a1ab6660 4221 e->user_operator = 1;
6de9cd9a 4222
524af0d6 4223 if (!gfc_resolve_expr (e))
eaee02a5 4224 return MATCH_ERROR;
6de9cd9a 4225
eaee02a5 4226 return MATCH_YES;
6de9cd9a
DN
4227}
4228
4229
4f7395ff
JW
4230/* Tries to replace an assignment code node with a subroutine call to the
4231 subroutine associated with the assignment operator. Return true if the node
4232 was replaced. On false, no error is generated. */
6de9cd9a 4233
524af0d6 4234bool
b251af97 4235gfc_extend_assign (gfc_code *c, gfc_namespace *ns)
6de9cd9a
DN
4236{
4237 gfc_actual_arglist *actual;
4f7395ff
JW
4238 gfc_expr *lhs, *rhs, *tb_base;
4239 gfc_symbol *sym = NULL;
4240 const char *gname = NULL;
4241 gfc_typebound_proc* tbo;
6de9cd9a 4242
a513927a 4243 lhs = c->expr1;
6de9cd9a
DN
4244 rhs = c->expr2;
4245
4246 /* Don't allow an intrinsic assignment to be replaced. */
4b7dd692 4247 if (lhs->ts.type != BT_DERIVED && lhs->ts.type != BT_CLASS
e19bb186 4248 && (rhs->rank == 0 || rhs->rank == lhs->rank)
6de9cd9a 4249 && (lhs->ts.type == rhs->ts.type
b251af97 4250 || (gfc_numeric_ts (&lhs->ts) && gfc_numeric_ts (&rhs->ts))))
524af0d6 4251 return false;
6de9cd9a
DN
4252
4253 actual = gfc_get_actual_arglist ();
4254 actual->expr = lhs;
4255
4256 actual->next = gfc_get_actual_arglist ();
4257 actual->next->expr = rhs;
4258
4f7395ff
JW
4259 /* TODO: Ambiguity-check, see above for gfc_extend_expr. */
4260
4261 /* See if we find a matching type-bound assignment. */
4262 tbo = matching_typebound_op (&tb_base, actual, INTRINSIC_ASSIGN,
4263 NULL, &gname);
4264
4265 if (tbo)
4266 {
4267 /* Success: Replace the expression with a type-bound call. */
4268 gcc_assert (tb_base);
4269 c->expr1 = gfc_get_expr ();
4270 build_compcall_for_operator (c->expr1, actual, tb_base, tbo, gname);
4271 c->expr1->value.compcall.assign = 1;
4272 c->expr1->where = c->loc;
4273 c->expr2 = NULL;
4274 c->op = EXEC_COMPCALL;
4275 return true;
4276 }
6de9cd9a 4277
4f7395ff 4278 /* See if we find an 'ordinary' (non-typebound) assignment procedure. */
6de9cd9a
DN
4279 for (; ns; ns = ns->parent)
4280 {
a1ee985f 4281 sym = gfc_search_interface (ns->op[INTRINSIC_ASSIGN], 1, &actual);
6de9cd9a
DN
4282 if (sym != NULL)
4283 break;
4284 }
4285
4f7395ff 4286 if (sym)
6de9cd9a 4287 {
4f7395ff
JW
4288 /* Success: Replace the assignment with the call. */
4289 c->op = EXEC_ASSIGN_CALL;
4290 c->symtree = gfc_find_sym_in_symtree (sym);
4291 c->expr1 = NULL;
4292 c->expr2 = NULL;
4293 c->ext.actual = actual;
4294 return true;
6de9cd9a
DN
4295 }
4296
4f7395ff
JW
4297 /* Failure: No assignment procedure found. */
4298 free (actual->next);
4299 free (actual);
4300 return false;
6de9cd9a
DN
4301}
4302
4303
4304/* Make sure that the interface just parsed is not already present in
4305 the given interface list. Ambiguity isn't checked yet since module
4306 procedures can be present without interfaces. */
4307
524af0d6 4308bool
362aa474 4309gfc_check_new_interface (gfc_interface *base, gfc_symbol *new_sym, locus loc)
6de9cd9a
DN
4310{
4311 gfc_interface *ip;
4312
4313 for (ip = base; ip; ip = ip->next)
4314 {
7b901ac4 4315 if (ip->sym == new_sym)
6de9cd9a 4316 {
c4100eae 4317 gfc_error ("Entity %qs at %L is already present in the interface",
362aa474 4318 new_sym->name, &loc);
524af0d6 4319 return false;
6de9cd9a
DN
4320 }
4321 }
4322
524af0d6 4323 return true;
6de9cd9a
DN
4324}
4325
4326
4327/* Add a symbol to the current interface. */
4328
524af0d6 4329bool
7b901ac4 4330gfc_add_interface (gfc_symbol *new_sym)
6de9cd9a
DN
4331{
4332 gfc_interface **head, *intr;
4333 gfc_namespace *ns;
4334 gfc_symbol *sym;
4335
4336 switch (current_interface.type)
4337 {
4338 case INTERFACE_NAMELESS:
9e1d712c 4339 case INTERFACE_ABSTRACT:
524af0d6 4340 return true;
6de9cd9a
DN
4341
4342 case INTERFACE_INTRINSIC_OP:
4343 for (ns = current_interface.ns; ns; ns = ns->parent)
3bed9dd0
DF
4344 switch (current_interface.op)
4345 {
4346 case INTRINSIC_EQ:
4347 case INTRINSIC_EQ_OS:
e73d3ca6 4348 if (!gfc_check_new_interface (ns->op[INTRINSIC_EQ], new_sym,
524af0d6 4349 gfc_current_locus)
e73d3ca6 4350 || !gfc_check_new_interface (ns->op[INTRINSIC_EQ_OS],
524af0d6
JB
4351 new_sym, gfc_current_locus))
4352 return false;
3bed9dd0
DF
4353 break;
4354
4355 case INTRINSIC_NE:
4356 case INTRINSIC_NE_OS:
e73d3ca6 4357 if (!gfc_check_new_interface (ns->op[INTRINSIC_NE], new_sym,
524af0d6 4358 gfc_current_locus)
e73d3ca6 4359 || !gfc_check_new_interface (ns->op[INTRINSIC_NE_OS],
524af0d6
JB
4360 new_sym, gfc_current_locus))
4361 return false;
3bed9dd0
DF
4362 break;
4363
4364 case INTRINSIC_GT:
4365 case INTRINSIC_GT_OS:
e73d3ca6 4366 if (!gfc_check_new_interface (ns->op[INTRINSIC_GT],
524af0d6 4367 new_sym, gfc_current_locus)
e73d3ca6 4368 || !gfc_check_new_interface (ns->op[INTRINSIC_GT_OS],
524af0d6
JB
4369 new_sym, gfc_current_locus))
4370 return false;
3bed9dd0
DF
4371 break;
4372
4373 case INTRINSIC_GE:
4374 case INTRINSIC_GE_OS:
e73d3ca6 4375 if (!gfc_check_new_interface (ns->op[INTRINSIC_GE],
524af0d6 4376 new_sym, gfc_current_locus)
e73d3ca6 4377 || !gfc_check_new_interface (ns->op[INTRINSIC_GE_OS],
524af0d6
JB
4378 new_sym, gfc_current_locus))
4379 return false;
3bed9dd0
DF
4380 break;
4381
4382 case INTRINSIC_LT:
4383 case INTRINSIC_LT_OS:
e73d3ca6 4384 if (!gfc_check_new_interface (ns->op[INTRINSIC_LT],
524af0d6 4385 new_sym, gfc_current_locus)
e73d3ca6 4386 || !gfc_check_new_interface (ns->op[INTRINSIC_LT_OS],
524af0d6
JB
4387 new_sym, gfc_current_locus))
4388 return false;
3bed9dd0
DF
4389 break;
4390
4391 case INTRINSIC_LE:
4392 case INTRINSIC_LE_OS:
e73d3ca6 4393 if (!gfc_check_new_interface (ns->op[INTRINSIC_LE],
524af0d6 4394 new_sym, gfc_current_locus)
e73d3ca6 4395 || !gfc_check_new_interface (ns->op[INTRINSIC_LE_OS],
524af0d6
JB
4396 new_sym, gfc_current_locus))
4397 return false;
3bed9dd0
DF
4398 break;
4399
4400 default:
e73d3ca6 4401 if (!gfc_check_new_interface (ns->op[current_interface.op],
524af0d6
JB
4402 new_sym, gfc_current_locus))
4403 return false;
3bed9dd0 4404 }
6de9cd9a 4405
a1ee985f 4406 head = &current_interface.ns->op[current_interface.op];
6de9cd9a
DN
4407 break;
4408
4409 case INTERFACE_GENERIC:
e73d3ca6 4410 case INTERFACE_DTIO:
6de9cd9a
DN
4411 for (ns = current_interface.ns; ns; ns = ns->parent)
4412 {
4413 gfc_find_symbol (current_interface.sym->name, ns, 0, &sym);
4414 if (sym == NULL)
4415 continue;
4416
e73d3ca6 4417 if (!gfc_check_new_interface (sym->generic,
524af0d6
JB
4418 new_sym, gfc_current_locus))
4419 return false;
6de9cd9a
DN
4420 }
4421
4422 head = &current_interface.sym->generic;
4423 break;
4424
4425 case INTERFACE_USER_OP:
e73d3ca6 4426 if (!gfc_check_new_interface (current_interface.uop->op,
524af0d6
JB
4427 new_sym, gfc_current_locus))
4428 return false;
6de9cd9a 4429
a1ee985f 4430 head = &current_interface.uop->op;
6de9cd9a
DN
4431 break;
4432
4433 default:
4434 gfc_internal_error ("gfc_add_interface(): Bad interface type");
4435 }
4436
4437 intr = gfc_get_interface ();
7b901ac4 4438 intr->sym = new_sym;
63645982 4439 intr->where = gfc_current_locus;
6de9cd9a
DN
4440
4441 intr->next = *head;
4442 *head = intr;
4443
524af0d6 4444 return true;
6de9cd9a
DN
4445}
4446
4447
2b77e908
FXC
4448gfc_interface *
4449gfc_current_interface_head (void)
4450{
4451 switch (current_interface.type)
4452 {
4453 case INTERFACE_INTRINSIC_OP:
a1ee985f 4454 return current_interface.ns->op[current_interface.op];
2b77e908
FXC
4455
4456 case INTERFACE_GENERIC:
e73d3ca6 4457 case INTERFACE_DTIO:
2b77e908 4458 return current_interface.sym->generic;
2b77e908
FXC
4459
4460 case INTERFACE_USER_OP:
a1ee985f 4461 return current_interface.uop->op;
2b77e908
FXC
4462
4463 default:
4464 gcc_unreachable ();
4465 }
4466}
4467
4468
4469void
4470gfc_set_current_interface_head (gfc_interface *i)
4471{
4472 switch (current_interface.type)
4473 {
4474 case INTERFACE_INTRINSIC_OP:
a1ee985f 4475 current_interface.ns->op[current_interface.op] = i;
2b77e908
FXC
4476 break;
4477
4478 case INTERFACE_GENERIC:
e73d3ca6 4479 case INTERFACE_DTIO:
2b77e908
FXC
4480 current_interface.sym->generic = i;
4481 break;
4482
4483 case INTERFACE_USER_OP:
a1ee985f 4484 current_interface.uop->op = i;
2b77e908
FXC
4485 break;
4486
4487 default:
4488 gcc_unreachable ();
4489 }
4490}
4491
4492
6de9cd9a
DN
4493/* Gets rid of a formal argument list. We do not free symbols.
4494 Symbols are freed when a namespace is freed. */
4495
4496void
b251af97 4497gfc_free_formal_arglist (gfc_formal_arglist *p)
6de9cd9a
DN
4498{
4499 gfc_formal_arglist *q;
4500
4501 for (; p; p = q)
4502 {
4503 q = p->next;
cede9502 4504 free (p);
6de9cd9a
DN
4505 }
4506}
99fc1b90
JW
4507
4508
9795c594
JW
4509/* Check that it is ok for the type-bound procedure 'proc' to override the
4510 procedure 'old', cf. F08:4.5.7.3. */
99fc1b90 4511
524af0d6 4512bool
99fc1b90
JW
4513gfc_check_typebound_override (gfc_symtree* proc, gfc_symtree* old)
4514{
4515 locus where;
edc802c7 4516 gfc_symbol *proc_target, *old_target;
99fc1b90 4517 unsigned proc_pass_arg, old_pass_arg, argpos;
9795c594
JW
4518 gfc_formal_arglist *proc_formal, *old_formal;
4519 bool check_type;
4520 char err[200];
99fc1b90
JW
4521
4522 /* This procedure should only be called for non-GENERIC proc. */
4523 gcc_assert (!proc->n.tb->is_generic);
4524
4525 /* If the overwritten procedure is GENERIC, this is an error. */
4526 if (old->n.tb->is_generic)
4527 {
c4100eae 4528 gfc_error ("Can't overwrite GENERIC %qs at %L",
99fc1b90 4529 old->name, &proc->n.tb->where);
524af0d6 4530 return false;
99fc1b90
JW
4531 }
4532
4533 where = proc->n.tb->where;
4534 proc_target = proc->n.tb->u.specific->n.sym;
4535 old_target = old->n.tb->u.specific->n.sym;
4536
4537 /* Check that overridden binding is not NON_OVERRIDABLE. */
4538 if (old->n.tb->non_overridable)
4539 {
c4100eae 4540 gfc_error ("%qs at %L overrides a procedure binding declared"
99fc1b90 4541 " NON_OVERRIDABLE", proc->name, &where);
524af0d6 4542 return false;
99fc1b90
JW
4543 }
4544
4545 /* It's an error to override a non-DEFERRED procedure with a DEFERRED one. */
4546 if (!old->n.tb->deferred && proc->n.tb->deferred)
4547 {
c4100eae 4548 gfc_error ("%qs at %L must not be DEFERRED as it overrides a"
99fc1b90 4549 " non-DEFERRED binding", proc->name, &where);
524af0d6 4550 return false;
99fc1b90
JW
4551 }
4552
4553 /* If the overridden binding is PURE, the overriding must be, too. */
4554 if (old_target->attr.pure && !proc_target->attr.pure)
4555 {
c4100eae 4556 gfc_error ("%qs at %L overrides a PURE procedure and must also be PURE",
99fc1b90 4557 proc->name, &where);
524af0d6 4558 return false;
99fc1b90
JW
4559 }
4560
4561 /* If the overridden binding is ELEMENTAL, the overriding must be, too. If it
4562 is not, the overriding must not be either. */
4563 if (old_target->attr.elemental && !proc_target->attr.elemental)
4564 {
c4100eae 4565 gfc_error ("%qs at %L overrides an ELEMENTAL procedure and must also be"
99fc1b90 4566 " ELEMENTAL", proc->name, &where);
524af0d6 4567 return false;
99fc1b90
JW
4568 }
4569 if (!old_target->attr.elemental && proc_target->attr.elemental)
4570 {
c4100eae 4571 gfc_error ("%qs at %L overrides a non-ELEMENTAL procedure and must not"
99fc1b90 4572 " be ELEMENTAL, either", proc->name, &where);
524af0d6 4573 return false;
99fc1b90
JW
4574 }
4575
4576 /* If the overridden binding is a SUBROUTINE, the overriding must also be a
4577 SUBROUTINE. */
4578 if (old_target->attr.subroutine && !proc_target->attr.subroutine)
4579 {
c4100eae 4580 gfc_error ("%qs at %L overrides a SUBROUTINE and must also be a"
99fc1b90 4581 " SUBROUTINE", proc->name, &where);
524af0d6 4582 return false;
99fc1b90
JW
4583 }
4584
4585 /* If the overridden binding is a FUNCTION, the overriding must also be a
4586 FUNCTION and have the same characteristics. */
4587 if (old_target->attr.function)
4588 {
4589 if (!proc_target->attr.function)
4590 {
c4100eae 4591 gfc_error ("%qs at %L overrides a FUNCTION and must also be a"
99fc1b90 4592 " FUNCTION", proc->name, &where);
524af0d6 4593 return false;
99fc1b90 4594 }
8b704316 4595
4668d6f9
PT
4596 if (!gfc_check_result_characteristics (proc_target, old_target,
4597 err, sizeof(err)))
2240d1cf 4598 {
edc802c7 4599 gfc_error ("Result mismatch for the overriding procedure "
c4100eae 4600 "%qs at %L: %s", proc->name, &where, err);
524af0d6 4601 return false;
2240d1cf 4602 }
99fc1b90
JW
4603 }
4604
4605 /* If the overridden binding is PUBLIC, the overriding one must not be
4606 PRIVATE. */
4607 if (old->n.tb->access == ACCESS_PUBLIC
4608 && proc->n.tb->access == ACCESS_PRIVATE)
4609 {
c4100eae 4610 gfc_error ("%qs at %L overrides a PUBLIC procedure and must not be"
99fc1b90 4611 " PRIVATE", proc->name, &where);
524af0d6 4612 return false;
99fc1b90
JW
4613 }
4614
4615 /* Compare the formal argument lists of both procedures. This is also abused
4616 to find the position of the passed-object dummy arguments of both
4617 bindings as at least the overridden one might not yet be resolved and we
4618 need those positions in the check below. */
4619 proc_pass_arg = old_pass_arg = 0;
4620 if (!proc->n.tb->nopass && !proc->n.tb->pass_arg)
4621 proc_pass_arg = 1;
4622 if (!old->n.tb->nopass && !old->n.tb->pass_arg)
4623 old_pass_arg = 1;
4624 argpos = 1;
4cbc9039
JW
4625 proc_formal = gfc_sym_get_dummy_args (proc_target);
4626 old_formal = gfc_sym_get_dummy_args (old_target);
4627 for ( ; proc_formal && old_formal;
99fc1b90
JW
4628 proc_formal = proc_formal->next, old_formal = old_formal->next)
4629 {
4630 if (proc->n.tb->pass_arg
4631 && !strcmp (proc->n.tb->pass_arg, proc_formal->sym->name))
4632 proc_pass_arg = argpos;
4633 if (old->n.tb->pass_arg
4634 && !strcmp (old->n.tb->pass_arg, old_formal->sym->name))
4635 old_pass_arg = argpos;
4636
4637 /* Check that the names correspond. */
4638 if (strcmp (proc_formal->sym->name, old_formal->sym->name))
4639 {
c4100eae 4640 gfc_error ("Dummy argument %qs of %qs at %L should be named %qs as"
99fc1b90
JW
4641 " to match the corresponding argument of the overridden"
4642 " procedure", proc_formal->sym->name, proc->name, &where,
4643 old_formal->sym->name);
524af0d6 4644 return false;
99fc1b90
JW
4645 }
4646
9795c594 4647 check_type = proc_pass_arg != argpos && old_pass_arg != argpos;
4668d6f9 4648 if (!gfc_check_dummy_characteristics (proc_formal->sym, old_formal->sym,
524af0d6 4649 check_type, err, sizeof(err)))
99fc1b90 4650 {
2700d0e3
JJ
4651 gfc_error_opt (OPT_Wargument_mismatch,
4652 "Argument mismatch for the overriding procedure "
4653 "%qs at %L: %s", proc->name, &where, err);
524af0d6 4654 return false;
99fc1b90
JW
4655 }
4656
4657 ++argpos;
4658 }
4659 if (proc_formal || old_formal)
4660 {
c4100eae 4661 gfc_error ("%qs at %L must have the same number of formal arguments as"
99fc1b90 4662 " the overridden procedure", proc->name, &where);
524af0d6 4663 return false;
99fc1b90
JW
4664 }
4665
4666 /* If the overridden binding is NOPASS, the overriding one must also be
4667 NOPASS. */
4668 if (old->n.tb->nopass && !proc->n.tb->nopass)
4669 {
c4100eae 4670 gfc_error ("%qs at %L overrides a NOPASS binding and must also be"
99fc1b90 4671 " NOPASS", proc->name, &where);
524af0d6 4672 return false;
99fc1b90
JW
4673 }
4674
4675 /* If the overridden binding is PASS(x), the overriding one must also be
4676 PASS and the passed-object dummy arguments must correspond. */
4677 if (!old->n.tb->nopass)
4678 {
4679 if (proc->n.tb->nopass)
4680 {
c4100eae 4681 gfc_error ("%qs at %L overrides a binding with PASS and must also be"
99fc1b90 4682 " PASS", proc->name, &where);
524af0d6 4683 return false;
99fc1b90
JW
4684 }
4685
4686 if (proc_pass_arg != old_pass_arg)
4687 {
c4100eae 4688 gfc_error ("Passed-object dummy argument of %qs at %L must be at"
99fc1b90
JW
4689 " the same position as the passed-object dummy argument of"
4690 " the overridden procedure", proc->name, &where);
524af0d6 4691 return false;
99fc1b90
JW
4692 }
4693 }
4694
524af0d6 4695 return true;
99fc1b90 4696}
e73d3ca6
PT
4697
4698
4699/* The following three functions check that the formal arguments
4700 of user defined derived type IO procedures are compliant with
f3ad8745 4701 the requirements of the standard, see F03:9.5.3.7.2 (F08:9.6.4.8.3). */
e73d3ca6
PT
4702
4703static void
4704check_dtio_arg_TKR_intent (gfc_symbol *fsym, bool typebound, bt type,
4705 int kind, int rank, sym_intent intent)
4706{
4707 if (fsym->ts.type != type)
739d9339
PT
4708 {
4709 gfc_error ("DTIO dummy argument at %L must be of type %s",
4710 &fsym->declared_at, gfc_basic_typename (type));
4711 return;
4712 }
e73d3ca6
PT
4713
4714 if (fsym->ts.type != BT_CLASS && fsym->ts.type != BT_DERIVED
4715 && fsym->ts.kind != kind)
4716 gfc_error ("DTIO dummy argument at %L must be of KIND = %d",
4717 &fsym->declared_at, kind);
4718
4719 if (!typebound
4720 && rank == 0
4721 && (((type == BT_CLASS) && CLASS_DATA (fsym)->attr.dimension)
4722 || ((type != BT_CLASS) && fsym->attr.dimension)))
b93a9a15 4723 gfc_error ("DTIO dummy argument at %L must be a scalar",
e73d3ca6
PT
4724 &fsym->declared_at);
4725 else if (rank == 1
4726 && (fsym->as == NULL || fsym->as->type != AS_ASSUMED_SHAPE))
4727 gfc_error ("DTIO dummy argument at %L must be an "
4728 "ASSUMED SHAPE ARRAY", &fsym->declared_at);
4729
f3ad8745
JW
4730 if (type == BT_CHARACTER && fsym->ts.u.cl->length != NULL)
4731 gfc_error ("DTIO character argument at %L must have assumed length",
4732 &fsym->declared_at);
4733
e73d3ca6 4734 if (fsym->attr.intent != intent)
77be9417 4735 gfc_error ("DTIO dummy argument at %L must have INTENT %s",
e73d3ca6
PT
4736 &fsym->declared_at, gfc_code2string (intents, (int)intent));
4737 return;
4738}
4739
4740
4741static void
4742check_dtio_interface1 (gfc_symbol *derived, gfc_symtree *tb_io_st,
4743 bool typebound, bool formatted, int code)
4744{
4745 gfc_symbol *dtio_sub, *generic_proc, *fsym;
4746 gfc_typebound_proc *tb_io_proc, *specific_proc;
4747 gfc_interface *intr;
4748 gfc_formal_arglist *formal;
4749 int arg_num;
4750
4751 bool read = ((dtio_codes)code == DTIO_RF)
4752 || ((dtio_codes)code == DTIO_RUF);
4753 bt type;
4754 sym_intent intent;
4755 int kind;
4756
4757 dtio_sub = NULL;
4758 if (typebound)
4759 {
4760 /* Typebound DTIO binding. */
4761 tb_io_proc = tb_io_st->n.tb;
739d9339
PT
4762 if (tb_io_proc == NULL)
4763 return;
4764
e73d3ca6 4765 gcc_assert (tb_io_proc->is_generic);
e73d3ca6
PT
4766
4767 specific_proc = tb_io_proc->u.generic->specific;
739d9339
PT
4768 if (specific_proc == NULL || specific_proc->is_generic)
4769 return;
e73d3ca6
PT
4770
4771 dtio_sub = specific_proc->u.specific->n.sym;
4772 }
4773 else
4774 {
4775 generic_proc = tb_io_st->n.sym;
739d9339
PT
4776 if (generic_proc == NULL || generic_proc->generic == NULL)
4777 return;
e73d3ca6
PT
4778
4779 for (intr = tb_io_st->n.sym->generic; intr; intr = intr->next)
4780 {
a8de3002 4781 if (intr->sym && intr->sym->formal && intr->sym->formal->sym
e73d3ca6
PT
4782 && ((intr->sym->formal->sym->ts.type == BT_CLASS
4783 && CLASS_DATA (intr->sym->formal->sym)->ts.u.derived
4784 == derived)
4785 || (intr->sym->formal->sym->ts.type == BT_DERIVED
4786 && intr->sym->formal->sym->ts.u.derived == derived)))
4787 {
4788 dtio_sub = intr->sym;
4789 break;
4790 }
a8de3002
PT
4791 else if (intr->sym && intr->sym->formal && !intr->sym->formal->sym)
4792 {
4793 gfc_error ("Alternate return at %L is not permitted in a DTIO "
4794 "procedure", &intr->sym->declared_at);
4795 return;
4796 }
e73d3ca6
PT
4797 }
4798
4799 if (dtio_sub == NULL)
4800 return;
4801 }
4802
4803 gcc_assert (dtio_sub);
4804 if (!dtio_sub->attr.subroutine)
2f029c08 4805 gfc_error ("DTIO procedure %qs at %L must be a subroutine",
e73d3ca6
PT
4806 dtio_sub->name, &dtio_sub->declared_at);
4807
a8de3002
PT
4808 arg_num = 0;
4809 for (formal = dtio_sub->formal; formal; formal = formal->next)
4810 arg_num++;
4811
4812 if (arg_num < (formatted ? 6 : 4))
4813 {
2f029c08 4814 gfc_error ("Too few dummy arguments in DTIO procedure %qs at %L",
a8de3002
PT
4815 dtio_sub->name, &dtio_sub->declared_at);
4816 return;
4817 }
4818
4819 if (arg_num > (formatted ? 6 : 4))
4820 {
2f029c08 4821 gfc_error ("Too many dummy arguments in DTIO procedure %qs at %L",
a8de3002
PT
4822 dtio_sub->name, &dtio_sub->declared_at);
4823 return;
4824 }
4825
4826
e73d3ca6
PT
4827 /* Now go through the formal arglist. */
4828 arg_num = 1;
4829 for (formal = dtio_sub->formal; formal; formal = formal->next, arg_num++)
4830 {
4831 if (!formatted && arg_num == 3)
4832 arg_num = 5;
4833 fsym = formal->sym;
a8de3002
PT
4834
4835 if (fsym == NULL)
4836 {
4837 gfc_error ("Alternate return at %L is not permitted in a DTIO "
4838 "procedure", &dtio_sub->declared_at);
4839 return;
4840 }
4841
e73d3ca6
PT
4842 switch (arg_num)
4843 {
4844 case(1): /* DTV */
4845 type = derived->attr.sequence || derived->attr.is_bind_c ?
4846 BT_DERIVED : BT_CLASS;
4847 kind = 0;
4848 intent = read ? INTENT_INOUT : INTENT_IN;
4849 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
4850 0, intent);
4851 break;
4852
4853 case(2): /* UNIT */
4854 type = BT_INTEGER;
4855 kind = gfc_default_integer_kind;
4856 intent = INTENT_IN;
4857 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
4858 0, intent);
4859 break;
4860 case(3): /* IOTYPE */
4861 type = BT_CHARACTER;
4862 kind = gfc_default_character_kind;
4863 intent = INTENT_IN;
4864 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
4865 0, intent);
4866 break;
4867 case(4): /* VLIST */
4868 type = BT_INTEGER;
4869 kind = gfc_default_integer_kind;
4870 intent = INTENT_IN;
4871 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
4872 1, intent);
4873 break;
4874 case(5): /* IOSTAT */
4875 type = BT_INTEGER;
4876 kind = gfc_default_integer_kind;
4877 intent = INTENT_OUT;
4878 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
4879 0, intent);
4880 break;
4881 case(6): /* IOMSG */
4882 type = BT_CHARACTER;
4883 kind = gfc_default_character_kind;
4884 intent = INTENT_INOUT;
4885 check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
4886 0, intent);
4887 break;
4888 default:
4889 gcc_unreachable ();
4890 }
4891 }
4892 derived->attr.has_dtio_procs = 1;
4893 return;
4894}
4895
4896void
4897gfc_check_dtio_interfaces (gfc_symbol *derived)
4898{
4899 gfc_symtree *tb_io_st;
4900 bool t = false;
4901 int code;
4902 bool formatted;
4903
4904 if (derived->attr.is_class == 1 || derived->attr.vtype == 1)
4905 return;
4906
4907 /* Check typebound DTIO bindings. */
4908 for (code = 0; code < 4; code++)
4909 {
4910 formatted = ((dtio_codes)code == DTIO_RF)
4911 || ((dtio_codes)code == DTIO_WF);
4912
4913 tb_io_st = gfc_find_typebound_proc (derived, &t,
4914 gfc_code2string (dtio_procs, code),
4915 true, &derived->declared_at);
4916 if (tb_io_st != NULL)
4917 check_dtio_interface1 (derived, tb_io_st, true, formatted, code);
4918 }
4919
4920 /* Check generic DTIO interfaces. */
4921 for (code = 0; code < 4; code++)
4922 {
4923 formatted = ((dtio_codes)code == DTIO_RF)
4924 || ((dtio_codes)code == DTIO_WF);
4925
4926 tb_io_st = gfc_find_symtree (derived->ns->sym_root,
4927 gfc_code2string (dtio_procs, code));
4928 if (tb_io_st != NULL)
4929 check_dtio_interface1 (derived, tb_io_st, false, formatted, code);
4930 }
4931}
4932
4933
e4e659b9
JW
4934gfc_symtree*
4935gfc_find_typebound_dtio_proc (gfc_symbol *derived, bool write, bool formatted)
e73d3ca6
PT
4936{
4937 gfc_symtree *tb_io_st = NULL;
e73d3ca6
PT
4938 bool t = false;
4939
b93a9a15 4940 if (!derived || !derived->resolved || derived->attr.flavor != FL_DERIVED)
9beb81ed
PT
4941 return NULL;
4942
e73d3ca6
PT
4943 /* Try to find a typebound DTIO binding. */
4944 if (formatted == true)
4945 {
4946 if (write == true)
4947 tb_io_st = gfc_find_typebound_proc (derived, &t,
4948 gfc_code2string (dtio_procs,
4949 DTIO_WF),
4950 true,
4951 &derived->declared_at);
4952 else
4953 tb_io_st = gfc_find_typebound_proc (derived, &t,
4954 gfc_code2string (dtio_procs,
4955 DTIO_RF),
4956 true,
4957 &derived->declared_at);
4958 }
4959 else
4960 {
4961 if (write == true)
4962 tb_io_st = gfc_find_typebound_proc (derived, &t,
4963 gfc_code2string (dtio_procs,
4964 DTIO_WUF),
4965 true,
4966 &derived->declared_at);
4967 else
4968 tb_io_st = gfc_find_typebound_proc (derived, &t,
4969 gfc_code2string (dtio_procs,
4970 DTIO_RUF),
4971 true,
4972 &derived->declared_at);
4973 }
e4e659b9
JW
4974 return tb_io_st;
4975}
4976
4977
4978gfc_symbol *
4979gfc_find_specific_dtio_proc (gfc_symbol *derived, bool write, bool formatted)
4980{
4981 gfc_symtree *tb_io_st = NULL;
4982 gfc_symbol *dtio_sub = NULL;
4983 gfc_symbol *extended;
4984 gfc_typebound_proc *tb_io_proc, *specific_proc;
4985
4986 tb_io_st = gfc_find_typebound_dtio_proc (derived, write, formatted);
e73d3ca6
PT
4987
4988 if (tb_io_st != NULL)
4989 {
096506bb
PT
4990 const char *genname;
4991 gfc_symtree *st;
4992
e73d3ca6
PT
4993 tb_io_proc = tb_io_st->n.tb;
4994 gcc_assert (tb_io_proc != NULL);
4995 gcc_assert (tb_io_proc->is_generic);
4996 gcc_assert (tb_io_proc->u.generic->next == NULL);
4997
4998 specific_proc = tb_io_proc->u.generic->specific;
4999 gcc_assert (!specific_proc->is_generic);
5000
096506bb
PT
5001 /* Go back and make sure that we have the right specific procedure.
5002 Here we most likely have a procedure from the parent type, which
5003 can be overridden in extensions. */
5004 genname = tb_io_proc->u.generic->specific_st->name;
5005 st = gfc_find_typebound_proc (derived, NULL, genname,
5006 true, &tb_io_proc->where);
5007 if (st)
5008 dtio_sub = st->n.tb->u.specific->n.sym;
5009 else
5010 dtio_sub = specific_proc->u.specific->n.sym;
e73d3ca6 5011
e4e659b9
JW
5012 goto finish;
5013 }
e73d3ca6
PT
5014
5015 /* If there is not a typebound binding, look for a generic
5016 DTIO interface. */
5017 for (extended = derived; extended;
5018 extended = gfc_get_derived_super_type (extended))
5019 {
e4e659b9
JW
5020 if (extended == NULL || extended->ns == NULL
5021 || extended->attr.flavor == FL_UNKNOWN)
a8de3002
PT
5022 return NULL;
5023
e73d3ca6
PT
5024 if (formatted == true)
5025 {
5026 if (write == true)
5027 tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5028 gfc_code2string (dtio_procs,
5029 DTIO_WF));
5030 else
5031 tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5032 gfc_code2string (dtio_procs,
5033 DTIO_RF));
5034 }
5035 else
5036 {
5037 if (write == true)
5038 tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5039 gfc_code2string (dtio_procs,
5040 DTIO_WUF));
5041 else
5042 tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5043 gfc_code2string (dtio_procs,
5044 DTIO_RUF));
5045 }
5046
5047 if (tb_io_st != NULL
5048 && tb_io_st->n.sym
5049 && tb_io_st->n.sym->generic)
5050 {
40109581 5051 for (gfc_interface *intr = tb_io_st->n.sym->generic;
413e859c 5052 intr && intr->sym; intr = intr->next)
e73d3ca6 5053 {
413e859c 5054 if (intr->sym->formal)
e73d3ca6 5055 {
413e859c
JW
5056 gfc_symbol *fsym = intr->sym->formal->sym;
5057 if ((fsym->ts.type == BT_CLASS
5058 && CLASS_DATA (fsym)->ts.u.derived == extended)
5059 || (fsym->ts.type == BT_DERIVED
5060 && fsym->ts.u.derived == extended))
5061 {
5062 dtio_sub = intr->sym;
5063 break;
5064 }
e73d3ca6
PT
5065 }
5066 }
5067 }
5068 }
5069
5070finish:
5071 if (dtio_sub && derived != CLASS_DATA (dtio_sub->formal->sym)->ts.u.derived)
5072 gfc_find_derived_vtab (derived);
5073
5074 return dtio_sub;
5075}