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