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