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