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