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