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