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