Line data Source code
1 : /* Deal with interfaces.
2 : Copyright (C) 2000-2026 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 the leading members of the gfc_interface linked list given in INTR
82 : up to the END element (exclusive: the END element is not freed).
83 : If END is not nullptr, it is assumed that END is in the linked list starting
84 : with INTR. */
85 :
86 : static void
87 21755056 : free_interface_elements_until (gfc_interface *intr, gfc_interface *end)
88 : {
89 21755056 : gfc_interface *next;
90 :
91 21947820 : for (; intr != end; intr = next)
92 : {
93 192764 : next = intr->next;
94 192764 : free (intr);
95 : }
96 0 : }
97 :
98 :
99 : /* Free a singly linked list of gfc_interface structures. */
100 :
101 : void
102 21054886 : gfc_free_interface (gfc_interface *intr)
103 : {
104 21054886 : free_interface_elements_until (intr, nullptr);
105 21054886 : }
106 :
107 :
108 : /* Update the interface pointer given by IFC_PTR to make it point to TAIL.
109 : It is expected that TAIL (if non-null) is in the list pointed to by
110 : IFC_PTR, hence the tail of it. The members of the list before TAIL are
111 : freed before the pointer reassignment. */
112 :
113 : void
114 9062168 : gfc_drop_interface_elements_before (gfc_interface **ifc_ptr,
115 : gfc_interface *tail)
116 : {
117 9062168 : if (ifc_ptr == nullptr)
118 : return;
119 :
120 700170 : free_interface_elements_until (*ifc_ptr, tail);
121 700170 : *ifc_ptr = tail;
122 : }
123 :
124 :
125 : /* Change the operators unary plus and minus into binary plus and
126 : minus respectively, leaving the rest unchanged. */
127 :
128 : static gfc_intrinsic_op
129 3000 : fold_unary_intrinsic (gfc_intrinsic_op op)
130 : {
131 0 : switch (op)
132 : {
133 0 : case INTRINSIC_UPLUS:
134 0 : op = INTRINSIC_PLUS;
135 0 : break;
136 56 : case INTRINSIC_UMINUS:
137 56 : op = INTRINSIC_MINUS;
138 0 : break;
139 : default:
140 : break;
141 : }
142 :
143 2986 : return op;
144 : }
145 :
146 :
147 : /* Return the operator depending on the DTIO moded string. Note that
148 : these are not operators in the normal sense and so have been placed
149 : beyond GFC_INTRINSIC_END in gfortran.h:enum gfc_intrinsic_op. */
150 :
151 : static gfc_intrinsic_op
152 410 : dtio_op (char* mode)
153 : {
154 410 : if (strcmp (mode, "formatted") == 0)
155 : return INTRINSIC_FORMATTED;
156 84 : if (strcmp (mode, "unformatted") == 0)
157 84 : return INTRINSIC_UNFORMATTED;
158 : return INTRINSIC_NONE;
159 : }
160 :
161 :
162 : /* Match a generic specification. Depending on which type of
163 : interface is found, the 'name' or 'op' pointers may be set.
164 : This subroutine doesn't return MATCH_NO. */
165 :
166 : match
167 28825 : gfc_match_generic_spec (interface_type *type,
168 : char *name,
169 : gfc_intrinsic_op *op)
170 : {
171 28825 : char buffer[GFC_MAX_SYMBOL_LEN + 1];
172 28825 : match m;
173 28825 : gfc_intrinsic_op i;
174 :
175 28825 : if (gfc_match (" assignment ( = )") == MATCH_YES)
176 : {
177 574 : *type = INTERFACE_INTRINSIC_OP;
178 574 : *op = INTRINSIC_ASSIGN;
179 574 : return MATCH_YES;
180 : }
181 :
182 28251 : if (gfc_match (" operator ( %o )", &i) == MATCH_YES)
183 : { /* Operator i/f */
184 770 : *type = INTERFACE_INTRINSIC_OP;
185 770 : *op = fold_unary_intrinsic (i);
186 770 : return MATCH_YES;
187 : }
188 :
189 27481 : *op = INTRINSIC_NONE;
190 27481 : if (gfc_match (" operator ( ") == MATCH_YES)
191 : {
192 364 : m = gfc_match_defined_op_name (buffer, 1);
193 364 : if (m == MATCH_NO)
194 0 : goto syntax;
195 364 : if (m != MATCH_YES)
196 : return MATCH_ERROR;
197 :
198 364 : m = gfc_match_char (')');
199 364 : if (m == MATCH_NO)
200 0 : goto syntax;
201 364 : if (m != MATCH_YES)
202 : return MATCH_ERROR;
203 :
204 364 : strcpy (name, buffer);
205 364 : *type = INTERFACE_USER_OP;
206 364 : return MATCH_YES;
207 : }
208 :
209 27117 : if (gfc_match (" read ( %n )", buffer) == MATCH_YES)
210 : {
211 166 : *op = dtio_op (buffer);
212 166 : if (*op == INTRINSIC_FORMATTED)
213 : {
214 123 : if (flag_default_integer)
215 0 : goto conflict;
216 123 : strcpy (name, gfc_code2string (dtio_procs, DTIO_RF));
217 123 : *type = INTERFACE_DTIO;
218 : }
219 166 : if (*op == INTRINSIC_UNFORMATTED)
220 : {
221 43 : if (flag_default_integer)
222 0 : goto conflict;
223 43 : strcpy (name, gfc_code2string (dtio_procs, DTIO_RUF));
224 43 : *type = INTERFACE_DTIO;
225 : }
226 166 : if (*op != INTRINSIC_NONE)
227 : return MATCH_YES;
228 : }
229 :
230 26951 : if (gfc_match (" write ( %n )", buffer) == MATCH_YES)
231 : {
232 244 : *op = dtio_op (buffer);
233 244 : if (*op == INTRINSIC_FORMATTED)
234 : {
235 203 : if (flag_default_integer)
236 1 : goto conflict;
237 202 : strcpy (name, gfc_code2string (dtio_procs, DTIO_WF));
238 202 : *type = INTERFACE_DTIO;
239 : }
240 243 : if (*op == INTRINSIC_UNFORMATTED)
241 : {
242 41 : if (flag_default_integer)
243 0 : goto conflict;
244 41 : strcpy (name, gfc_code2string (dtio_procs, DTIO_WUF));
245 41 : *type = INTERFACE_DTIO;
246 : }
247 243 : if (*op != INTRINSIC_NONE)
248 : return MATCH_YES;
249 : }
250 :
251 26707 : if (gfc_match_name (buffer) == MATCH_YES)
252 : {
253 21287 : strcpy (name, buffer);
254 21287 : *type = INTERFACE_GENERIC;
255 21287 : return MATCH_YES;
256 : }
257 :
258 5420 : *type = INTERFACE_NAMELESS;
259 5420 : return MATCH_YES;
260 :
261 1 : conflict:
262 1 : gfc_error ("Sorry: -fdefault-integer-8 option is not supported with "
263 : "user-defined input/output at %C");
264 1 : return MATCH_ERROR;
265 :
266 0 : syntax:
267 0 : gfc_error ("Syntax error in generic specification at %C");
268 0 : return MATCH_ERROR;
269 : }
270 :
271 :
272 : /* Match one of the five F95 forms of an interface statement. The
273 : matcher for the abstract interface follows. */
274 :
275 : match
276 10311 : gfc_match_interface (void)
277 : {
278 10311 : char name[GFC_MAX_SYMBOL_LEN + 1];
279 10311 : interface_type type;
280 10311 : gfc_symbol *sym;
281 10311 : gfc_intrinsic_op op;
282 10311 : match m;
283 :
284 10311 : m = gfc_match_space ();
285 :
286 10311 : if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
287 : return MATCH_ERROR;
288 :
289 : /* If we're not looking at the end of the statement now, or if this
290 : is not a nameless interface but we did not see a space, punt. */
291 10310 : if (gfc_match_eos () != MATCH_YES
292 10310 : || (type != INTERFACE_NAMELESS && m != MATCH_YES))
293 : {
294 0 : gfc_error ("Syntax error: Trailing garbage in INTERFACE statement "
295 : "at %C");
296 0 : return MATCH_ERROR;
297 : }
298 :
299 10310 : current_interface.type = type;
300 :
301 10310 : switch (type)
302 : {
303 4183 : case INTERFACE_DTIO:
304 4183 : case INTERFACE_GENERIC:
305 4183 : if (gfc_get_symbol (name, NULL, &sym))
306 : return MATCH_ERROR;
307 :
308 4183 : if (!sym->attr.generic
309 4183 : && !gfc_add_generic (&sym->attr, sym->name, NULL))
310 : return MATCH_ERROR;
311 :
312 4182 : if (sym->attr.dummy)
313 : {
314 0 : gfc_error ("Dummy procedure %qs at %C cannot have a "
315 : "generic interface", sym->name);
316 0 : return MATCH_ERROR;
317 : }
318 :
319 4182 : current_interface.sym = gfc_new_block = sym;
320 4182 : break;
321 :
322 155 : case INTERFACE_USER_OP:
323 155 : current_interface.uop = gfc_get_uop (name);
324 155 : break;
325 :
326 556 : case INTERFACE_INTRINSIC_OP:
327 556 : current_interface.op = op;
328 556 : break;
329 :
330 : case INTERFACE_NAMELESS:
331 : case INTERFACE_ABSTRACT:
332 : break;
333 : }
334 :
335 : return MATCH_YES;
336 : }
337 :
338 :
339 :
340 : /* Match a F2003 abstract interface. */
341 :
342 : match
343 476 : gfc_match_abstract_interface (void)
344 : {
345 476 : match m;
346 :
347 476 : if (!gfc_notify_std (GFC_STD_F2003, "ABSTRACT INTERFACE at %C"))
348 : return MATCH_ERROR;
349 :
350 475 : m = gfc_match_eos ();
351 :
352 475 : if (m != MATCH_YES)
353 : {
354 1 : gfc_error ("Syntax error in ABSTRACT INTERFACE statement at %C");
355 1 : return MATCH_ERROR;
356 : }
357 :
358 474 : current_interface.type = INTERFACE_ABSTRACT;
359 :
360 474 : return m;
361 : }
362 :
363 :
364 : /* Match the different sort of generic-specs that can be present after
365 : the END INTERFACE itself. */
366 :
367 : match
368 693 : gfc_match_end_interface (void)
369 : {
370 693 : char name[GFC_MAX_SYMBOL_LEN + 1];
371 693 : interface_type type;
372 693 : gfc_intrinsic_op op;
373 693 : match m;
374 :
375 693 : m = gfc_match_space ();
376 :
377 693 : if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
378 : return MATCH_ERROR;
379 :
380 : /* If we're not looking at the end of the statement now, or if this
381 : is not a nameless interface but we did not see a space, punt. */
382 693 : if (gfc_match_eos () != MATCH_YES
383 693 : || (type != INTERFACE_NAMELESS && m != MATCH_YES))
384 : {
385 0 : gfc_error ("Syntax error: Trailing garbage in END INTERFACE "
386 : "statement at %C");
387 0 : return MATCH_ERROR;
388 : }
389 :
390 693 : m = MATCH_YES;
391 :
392 693 : switch (current_interface.type)
393 : {
394 0 : case INTERFACE_NAMELESS:
395 0 : case INTERFACE_ABSTRACT:
396 0 : if (type != INTERFACE_NAMELESS)
397 : {
398 0 : gfc_error ("Expected a nameless interface at %C");
399 0 : m = MATCH_ERROR;
400 : }
401 :
402 : break;
403 :
404 157 : case INTERFACE_INTRINSIC_OP:
405 157 : if (type != current_interface.type || op != current_interface.op)
406 : {
407 :
408 14 : if (current_interface.op == INTRINSIC_ASSIGN)
409 : {
410 0 : m = MATCH_ERROR;
411 0 : gfc_error ("Expected %<END INTERFACE ASSIGNMENT (=)%> at %C");
412 : }
413 : else
414 : {
415 14 : const char *s1, *s2;
416 14 : s1 = gfc_op2string (current_interface.op);
417 14 : s2 = gfc_op2string (op);
418 :
419 : /* The following if-statements are used to enforce C1202
420 : from F2003. */
421 14 : if ((strcmp(s1, "==") == 0 && strcmp (s2, ".eq.") == 0)
422 13 : || (strcmp(s1, ".eq.") == 0 && strcmp (s2, "==") == 0))
423 : break;
424 12 : if ((strcmp(s1, "/=") == 0 && strcmp (s2, ".ne.") == 0)
425 11 : || (strcmp(s1, ".ne.") == 0 && strcmp (s2, "/=") == 0))
426 : break;
427 10 : if ((strcmp(s1, "<=") == 0 && strcmp (s2, ".le.") == 0)
428 9 : || (strcmp(s1, ".le.") == 0 && strcmp (s2, "<=") == 0))
429 : break;
430 8 : if ((strcmp(s1, "<") == 0 && strcmp (s2, ".lt.") == 0)
431 7 : || (strcmp(s1, ".lt.") == 0 && strcmp (s2, "<") == 0))
432 : break;
433 6 : if ((strcmp(s1, ">=") == 0 && strcmp (s2, ".ge.") == 0)
434 5 : || (strcmp(s1, ".ge.") == 0 && strcmp (s2, ">=") == 0))
435 : break;
436 4 : if ((strcmp(s1, ">") == 0 && strcmp (s2, ".gt.") == 0)
437 3 : || (strcmp(s1, ".gt.") == 0 && strcmp (s2, ">") == 0))
438 : break;
439 :
440 2 : m = MATCH_ERROR;
441 2 : if (strcmp(s2, "none") == 0)
442 1 : gfc_error ("Expecting %<END INTERFACE OPERATOR (%s)%> "
443 : "at %C", s1);
444 : else
445 1 : gfc_error ("Expecting %<END INTERFACE OPERATOR (%s)%> at %C, "
446 : "but got %qs", s1, s2);
447 : }
448 :
449 : }
450 :
451 : break;
452 :
453 14 : case INTERFACE_USER_OP:
454 : /* Comparing the symbol node names is OK because only use-associated
455 : symbols can be renamed. */
456 14 : if (type != current_interface.type
457 14 : || strcmp (current_interface.uop->name, name) != 0)
458 : {
459 0 : gfc_error ("Expecting %<END INTERFACE OPERATOR (.%s.)%> at %C",
460 0 : current_interface.uop->name);
461 0 : m = MATCH_ERROR;
462 : }
463 :
464 : break;
465 :
466 522 : case INTERFACE_DTIO:
467 522 : case INTERFACE_GENERIC:
468 : /* If a use-associated symbol is renamed, check the local_name. */
469 522 : const char *local_name = current_interface.sym->name;
470 :
471 522 : if (current_interface.sym->attr.use_assoc
472 4 : && current_interface.sym->attr.use_rename
473 2 : && current_interface.sym->ns->use_stmts->rename
474 2 : && (current_interface.sym->ns->use_stmts->rename->local_name[0]
475 : != '\0'))
476 1 : local_name = current_interface.sym->ns->use_stmts->rename->local_name;
477 :
478 522 : if (type != current_interface.type
479 522 : || strcmp (local_name, name) != 0)
480 : {
481 0 : gfc_error ("Expecting %<END INTERFACE %s%> at %C", local_name);
482 0 : m = MATCH_ERROR;
483 : }
484 :
485 : break;
486 : }
487 :
488 : return m;
489 : }
490 :
491 :
492 : /* Return whether the component was defined anonymously. */
493 :
494 : static bool
495 10401 : is_anonymous_component (gfc_component *cmp)
496 : {
497 : /* Only UNION and MAP components are anonymous. In the case of a MAP,
498 : the derived type symbol is FL_STRUCT and the component name looks like mM*.
499 : This is the only case in which the second character of a component name is
500 : uppercase. */
501 10401 : return cmp->ts.type == BT_UNION
502 10401 : || (cmp->ts.type == BT_DERIVED
503 3752 : && cmp->ts.u.derived->attr.flavor == FL_STRUCT
504 72 : && cmp->name[0] && cmp->name[1] && ISUPPER (cmp->name[1]));
505 : }
506 :
507 :
508 : /* Return whether the derived type was defined anonymously. */
509 :
510 : static bool
511 608233 : is_anonymous_dt (gfc_symbol *derived)
512 : {
513 : /* UNION and MAP types are always anonymous. Otherwise, only nested STRUCTURE
514 : types can be anonymous. For anonymous MAP/STRUCTURE, we have FL_STRUCT
515 : and the type name looks like XX*. This is the only case in which the
516 : second character of a type name is uppercase. */
517 608233 : return derived->attr.flavor == FL_UNION
518 608233 : || (derived->attr.flavor == FL_STRUCT
519 3345 : && derived->name[0] && derived->name[1] && ISUPPER (derived->name[1]));
520 : }
521 :
522 :
523 : /* Compare components according to 4.4.2 of the Fortran standard. */
524 :
525 : static bool
526 5364 : compare_components (gfc_component *cmp1, gfc_component *cmp2,
527 : gfc_symbol *derived1, gfc_symbol *derived2)
528 : {
529 : /* Compare names, but not for anonymous components such as UNION or MAP. */
530 5037 : if (!is_anonymous_component (cmp1) && !is_anonymous_component (cmp2)
531 10116 : && strcmp (cmp1->name, cmp2->name) != 0)
532 : return false;
533 :
534 4501 : if (cmp1->attr.access != cmp2->attr.access)
535 : return false;
536 :
537 4500 : if (cmp1->attr.pointer != cmp2->attr.pointer)
538 : return false;
539 :
540 4500 : if (cmp1->attr.dimension != cmp2->attr.dimension)
541 : return false;
542 :
543 4366 : if (cmp1->attr.codimension != cmp2->attr.codimension)
544 : return false;
545 :
546 4366 : if (cmp1->attr.allocatable != cmp2->attr.allocatable)
547 : return false;
548 :
549 4366 : if (cmp1->attr.dimension && gfc_compare_array_spec (cmp1->as, cmp2->as) == 0)
550 : return false;
551 :
552 3962 : if (cmp1->attr.codimension
553 3962 : && gfc_compare_array_spec (cmp1->as, cmp2->as) == 0)
554 : return false;
555 :
556 3962 : if (cmp1->ts.type == BT_CHARACTER && cmp2->ts.type == BT_CHARACTER)
557 : {
558 75 : gfc_charlen *l1 = cmp1->ts.u.cl;
559 75 : gfc_charlen *l2 = cmp2->ts.u.cl;
560 75 : if (l1 && l2 && l1->length && l2->length
561 75 : && l1->length->expr_type == EXPR_CONSTANT
562 75 : && l2->length->expr_type == EXPR_CONSTANT
563 150 : && gfc_dep_compare_expr (l1->length, l2->length) != 0)
564 : return false;
565 : }
566 :
567 : /* Make sure that link lists do not put this function into an
568 : endless recursive loop! */
569 1477 : if (!(cmp1->ts.type == BT_DERIVED && derived1 == cmp1->ts.u.derived)
570 3758 : && !(cmp2->ts.type == BT_DERIVED && derived2 == cmp2->ts.u.derived)
571 7715 : && !gfc_compare_types (&cmp1->ts, &cmp2->ts))
572 : return false;
573 :
574 3539 : else if ( (cmp1->ts.type == BT_DERIVED && derived1 == cmp1->ts.u.derived)
575 199 : && !(cmp2->ts.type == BT_DERIVED && derived2 == cmp2->ts.u.derived))
576 : return false;
577 :
578 3539 : else if (!(cmp1->ts.type == BT_DERIVED && derived1 == cmp1->ts.u.derived)
579 3340 : && (cmp2->ts.type == BT_DERIVED && derived2 == cmp2->ts.u.derived))
580 : return false;
581 :
582 : return true;
583 : }
584 :
585 :
586 : /* Compare two union types by comparing the components of their maps.
587 : Because unions and maps are anonymous their types get special internal
588 : names; therefore the usual derived type comparison will fail on them.
589 :
590 : Returns nonzero if equal, as with gfc_compare_derived_types. Also as with
591 : gfc_compare_derived_types, 'equal' is closer to meaning 'duplicate
592 : definitions' than 'equivalent structure'. */
593 :
594 : static bool
595 793 : compare_union_types (gfc_symbol *un1, gfc_symbol *un2)
596 : {
597 793 : gfc_component *map1, *map2, *cmp1, *cmp2;
598 793 : gfc_symbol *map1_t, *map2_t;
599 :
600 793 : if (un1->attr.flavor != FL_UNION || un2->attr.flavor != FL_UNION)
601 : return false;
602 :
603 148 : if (un1->attr.zero_comp != un2->attr.zero_comp)
604 : return false;
605 :
606 148 : if (un1->attr.zero_comp)
607 : return true;
608 :
609 146 : map1 = un1->components;
610 146 : map2 = un2->components;
611 :
612 : /* In terms of 'equality' here we are worried about types which are
613 : declared the same in two places, not types that represent equivalent
614 : structures. (This is common because of FORTRAN's weird scoping rules.)
615 : Though two unions with their maps in different orders could be equivalent,
616 : we will say they are not equal for the purposes of this test; therefore
617 : we compare the maps sequentially. */
618 229 : for (;;)
619 : {
620 229 : map1_t = map1->ts.u.derived;
621 229 : map2_t = map2->ts.u.derived;
622 :
623 229 : cmp1 = map1_t->components;
624 229 : cmp2 = map2_t->components;
625 :
626 : /* Protect against null components. */
627 229 : if (map1_t->attr.zero_comp != map2_t->attr.zero_comp)
628 : return false;
629 :
630 229 : if (map1_t->attr.zero_comp)
631 : return true;
632 :
633 609 : for (;;)
634 : {
635 : /* No two fields will ever point to the same map type unless they are
636 : the same component, because one map field is created with its type
637 : declaration. Therefore don't worry about recursion here. */
638 : /* TODO: worry about recursion into parent types of the unions? */
639 609 : if (!compare_components (cmp1, cmp2, map1_t, map2_t))
640 : return false;
641 :
642 603 : cmp1 = cmp1->next;
643 603 : cmp2 = cmp2->next;
644 :
645 603 : if (cmp1 == NULL && cmp2 == NULL)
646 : break;
647 384 : if (cmp1 == NULL || cmp2 == NULL)
648 : return false;
649 : }
650 :
651 219 : map1 = map1->next;
652 219 : map2 = map2->next;
653 :
654 219 : if (map1 == NULL && map2 == NULL)
655 : break;
656 83 : if (map1 == NULL || map2 == NULL)
657 : return false;
658 : }
659 :
660 : return true;
661 : }
662 :
663 :
664 :
665 : /* Compare two derived types using the criteria in 4.4.2 of the standard,
666 : recursing through gfc_compare_types for the components. */
667 :
668 : bool
669 631827 : gfc_compare_derived_types (gfc_symbol *derived1, gfc_symbol *derived2)
670 : {
671 631827 : gfc_component *cmp1, *cmp2;
672 :
673 631827 : if (derived1 == derived2)
674 : return true;
675 :
676 335435 : if (!derived1 || !derived2)
677 0 : gfc_internal_error ("gfc_compare_derived_types: invalid derived type");
678 :
679 335435 : if (derived1->attr.unlimited_polymorphic
680 187 : && derived2->attr.unlimited_polymorphic)
681 : return true;
682 :
683 335262 : if (derived1->attr.unlimited_polymorphic
684 335262 : != derived2->attr.unlimited_polymorphic)
685 : return false;
686 :
687 : /* Compare UNION types specially. */
688 335173 : if (derived1->attr.flavor == FL_UNION || derived2->attr.flavor == FL_UNION)
689 645 : return compare_union_types (derived1, derived2);
690 :
691 : /* Special case for comparing derived types across namespaces. If the
692 : true names and module names are the same and the module name is
693 : nonnull, then they are equal. */
694 334528 : if (strcmp (derived1->name, derived2->name) == 0
695 32753 : && derived1->module != NULL && derived2->module != NULL
696 30333 : && strcmp (derived1->module, derived2->module) == 0)
697 : return true;
698 :
699 : /* Compare type via the rules of the standard. Both types must have the
700 : SEQUENCE or BIND(C) attribute to be equal. We also compare types
701 : recursively if they are class descriptors types or virtual tables types.
702 : STRUCTUREs are special because they can be anonymous; therefore two
703 : structures with different names may be equal. */
704 :
705 : /* Compare names, but not for anonymous types such as UNION or MAP. */
706 303552 : if (!is_anonymous_dt (derived1) && !is_anonymous_dt (derived2)
707 607878 : && strcmp (derived1->name, derived2->name) != 0)
708 : return false;
709 :
710 4390 : if (derived1->component_access == ACCESS_PRIVATE
711 4389 : || derived2->component_access == ACCESS_PRIVATE)
712 : return false;
713 :
714 4389 : if (!(derived1->attr.sequence && derived2->attr.sequence)
715 2648 : && !(derived1->attr.is_bind_c && derived2->attr.is_bind_c)
716 2635 : && !(derived1->attr.is_class && derived2->attr.is_class)
717 1727 : && !(derived1->attr.vtype && derived2->attr.vtype)
718 1517 : && !(derived1->attr.pdt_type && derived2->attr.pdt_type))
719 : return false;
720 :
721 : /* Protect against null components. */
722 2872 : if (derived1->attr.zero_comp != derived2->attr.zero_comp)
723 : return false;
724 :
725 2863 : if (derived1->attr.zero_comp)
726 : return true;
727 :
728 2863 : cmp1 = derived1->components;
729 2863 : cmp2 = derived2->components;
730 :
731 : /* Since subtypes of SEQUENCE types must be SEQUENCE types as well, a
732 : simple test can speed things up. Otherwise, lots of things have to
733 : match. */
734 4755 : for (;;)
735 : {
736 4755 : if (!compare_components (cmp1, cmp2, derived1, derived2))
737 : return false;
738 :
739 2936 : cmp1 = cmp1->next;
740 2936 : cmp2 = cmp2->next;
741 :
742 2936 : if (cmp1 == NULL && cmp2 == NULL)
743 : break;
744 1898 : if (cmp1 == NULL || cmp2 == NULL)
745 : return false;
746 : }
747 :
748 : return true;
749 : }
750 :
751 :
752 : /* Compare two typespecs, recursively if necessary. */
753 :
754 : bool
755 7469565 : gfc_compare_types (gfc_typespec *ts1, gfc_typespec *ts2)
756 : {
757 : /* See if one of the typespecs is a BT_VOID, which is what is being used
758 : to allow the funcs like c_f_pointer to accept any pointer type.
759 : TODO: Possibly should narrow this to just the one typespec coming in
760 : that is for the formal arg, but oh well. */
761 7469565 : if (ts1->type == BT_VOID || ts2->type == BT_VOID)
762 : return true;
763 :
764 : /* Special case for our C interop types. FIXME: There should be a
765 : better way of doing this. When ISO C binding is cleared up,
766 : this can probably be removed. See PR 57048. */
767 :
768 7469536 : if ((ts1->type == BT_INTEGER
769 1970336 : && ts2->type == BT_DERIVED
770 5620 : && ts1->f90_type == BT_VOID
771 86 : && ts2->u.derived->from_intmod == INTMOD_ISO_C_BINDING
772 86 : && ts1->u.derived
773 86 : && strcmp (ts1->u.derived->name, ts2->u.derived->name) == 0)
774 7469451 : || (ts2->type == BT_INTEGER
775 2093776 : && ts1->type == BT_DERIVED
776 5176 : && ts2->f90_type == BT_VOID
777 84 : && ts1->u.derived->from_intmod == INTMOD_ISO_C_BINDING
778 84 : && ts2->u.derived
779 84 : && strcmp (ts1->u.derived->name, ts2->u.derived->name) == 0))
780 : return true;
781 :
782 : /* The _data component is not always present, therefore check for its
783 : presence before assuming, that its derived->attr is available.
784 : When the _data component is not present, then nevertheless the
785 : unlimited_polymorphic flag may be set in the derived type's attr. */
786 7469367 : if (ts1->type == BT_CLASS && ts1->u.derived->components
787 32179 : && ((ts1->u.derived->attr.is_class
788 32172 : && ts1->u.derived->components->ts.u.derived->attr
789 32172 : .unlimited_polymorphic)
790 26744 : || ts1->u.derived->attr.unlimited_polymorphic))
791 : return true;
792 :
793 : /* F2003: C717 */
794 7463932 : if (ts2->type == BT_CLASS && ts1->type == BT_DERIVED
795 977 : && ts2->u.derived->components
796 976 : && ((ts2->u.derived->attr.is_class
797 974 : && ts2->u.derived->components->ts.u.derived->attr
798 974 : .unlimited_polymorphic)
799 935 : || ts2->u.derived->attr.unlimited_polymorphic)
800 41 : && (ts1->u.derived->attr.sequence || ts1->u.derived->attr.is_bind_c))
801 : return true;
802 :
803 7463906 : if (ts1->type != ts2->type
804 1039123 : && ((ts1->type != BT_DERIVED && ts1->type != BT_CLASS)
805 72261 : || (ts2->type != BT_DERIVED && ts2->type != BT_CLASS)))
806 : return false;
807 :
808 6433750 : if (ts1->type == BT_UNION)
809 148 : return compare_union_types (ts1->u.derived, ts2->u.derived);
810 :
811 6433602 : if (ts1->type != BT_DERIVED && ts1->type != BT_CLASS)
812 6150801 : return (ts1->kind == ts2->kind);
813 :
814 : /* Compare derived types. */
815 282801 : return gfc_type_compatible (ts1, ts2);
816 : }
817 :
818 :
819 : static bool
820 5238747 : compare_type (gfc_symbol *s1, gfc_symbol *s2)
821 : {
822 5238747 : if (s2->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
823 : return true;
824 :
825 5061315 : return gfc_compare_types (&s1->ts, &s2->ts) || s2->ts.type == BT_ASSUMED;
826 : }
827 :
828 :
829 : static bool
830 290389 : compare_type_characteristics (gfc_symbol *s1, gfc_symbol *s2)
831 : {
832 : /* TYPE and CLASS of the same declared type are type compatible,
833 : but have different characteristics. */
834 290389 : if ((s1->ts.type == BT_CLASS && s2->ts.type == BT_DERIVED)
835 290381 : || (s1->ts.type == BT_DERIVED && s2->ts.type == BT_CLASS))
836 : return false;
837 :
838 290380 : return compare_type (s1, s2);
839 : }
840 :
841 :
842 : static bool
843 878423 : compare_rank (gfc_symbol *s1, gfc_symbol *s2)
844 : {
845 878423 : gfc_array_spec *as1, *as2;
846 878423 : int r1, r2;
847 :
848 878423 : if (s2->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
849 : return true;
850 :
851 696522 : as1 = (s1->ts.type == BT_CLASS
852 5169 : && !s1->ts.u.derived->attr.unlimited_polymorphic)
853 706856 : ? CLASS_DATA (s1)->as : s1->as;
854 696540 : as2 = (s2->ts.type == BT_CLASS
855 5151 : && !s2->ts.u.derived->attr.unlimited_polymorphic)
856 706838 : ? CLASS_DATA (s2)->as : s2->as;
857 :
858 701689 : r1 = as1 ? as1->rank : 0;
859 701689 : r2 = as2 ? as2->rank : 0;
860 :
861 701689 : if (r1 != r2 && (!as2 || as2->type != AS_ASSUMED_RANK))
862 3838 : return false; /* Ranks differ. */
863 :
864 : return true;
865 : }
866 :
867 :
868 : /* Given two symbols that are formal arguments, compare their ranks
869 : and types. Returns true if they have the same rank and type,
870 : false otherwise. */
871 :
872 : static bool
873 4945060 : compare_type_rank (gfc_symbol *s1, gfc_symbol *s2)
874 : {
875 4945060 : return compare_type (s1, s2) && compare_rank (s1, s2);
876 : }
877 :
878 :
879 : /* Given two symbols that are formal arguments, compare their types
880 : and rank and their formal interfaces if they are both dummy
881 : procedures. Returns true if the same, false if different. */
882 :
883 : static bool
884 4834109 : compare_type_rank_if (gfc_symbol *s1, gfc_symbol *s2)
885 : {
886 4834109 : if (s1 == NULL || s2 == NULL)
887 120 : return (s1 == s2);
888 :
889 4833989 : if (s1 == s2)
890 : return true;
891 :
892 4833989 : if (s1->attr.flavor != FL_PROCEDURE && s2->attr.flavor != FL_PROCEDURE)
893 4833819 : return compare_type_rank (s1, s2);
894 :
895 170 : if (s1->attr.flavor != FL_PROCEDURE || s2->attr.flavor != FL_PROCEDURE)
896 : return false;
897 :
898 : /* At this point, both symbols are procedures. It can happen that
899 : external procedures are compared, where one is identified by usage
900 : to be a function or subroutine but the other is not. Check TKR
901 : nonetheless for these cases. */
902 6 : if (s1->attr.function == 0 && s1->attr.subroutine == 0)
903 2 : return s1->attr.external ? compare_type_rank (s1, s2) : false;
904 :
905 4 : if (s2->attr.function == 0 && s2->attr.subroutine == 0)
906 0 : return s2->attr.external ? compare_type_rank (s1, s2) : false;
907 :
908 : /* Now the type of procedure has been identified. */
909 4 : if (s1->attr.function != s2->attr.function
910 4 : || s1->attr.subroutine != s2->attr.subroutine)
911 : return false;
912 :
913 4 : if (s1->attr.function && !compare_type_rank (s1, s2))
914 : return false;
915 :
916 : /* Originally, gfortran recursed here to check the interfaces of passed
917 : procedures. This is explicitly not required by the standard. */
918 : return true;
919 : }
920 :
921 :
922 : /* Given a formal argument list and a keyword name, search the list
923 : for that keyword. Returns the correct symbol node if found, NULL
924 : if not found. */
925 :
926 : static gfc_symbol *
927 32564 : find_keyword_arg (const char *name, gfc_formal_arglist *f)
928 : {
929 46058 : for (; f; f = f->next)
930 46058 : if (strcmp (f->sym->name, name) == 0)
931 : return f->sym;
932 :
933 : return NULL;
934 : }
935 :
936 :
937 : /******** Interface checking subroutines **********/
938 :
939 :
940 : /* Given an operator interface and the operator, make sure that all
941 : interfaces for that operator are legal. */
942 :
943 : bool
944 3599 : gfc_check_operator_interface (gfc_symbol *sym, gfc_intrinsic_op op,
945 : locus opwhere)
946 : {
947 3599 : gfc_formal_arglist *formal;
948 3599 : sym_intent i1, i2;
949 3599 : bt t1, t2;
950 3599 : int args, r1, r2, k1, k2;
951 :
952 3599 : gcc_assert (sym);
953 :
954 3599 : args = 0;
955 3599 : t1 = t2 = BT_UNKNOWN;
956 3599 : i1 = i2 = INTENT_UNKNOWN;
957 3599 : r1 = r2 = -1;
958 3599 : k1 = k2 = -1;
959 :
960 10765 : for (formal = gfc_sym_get_dummy_args (sym); formal; formal = formal->next)
961 : {
962 7167 : gfc_symbol *fsym = formal->sym;
963 7167 : if (fsym == NULL)
964 : {
965 1 : gfc_error ("Alternate return cannot appear in operator "
966 : "interface at %L", &sym->declared_at);
967 1 : return false;
968 : }
969 7166 : if (args == 0)
970 : {
971 3599 : t1 = fsym->ts.type;
972 3599 : i1 = fsym->attr.intent;
973 3599 : r1 = (fsym->as != NULL) ? fsym->as->rank : 0;
974 3599 : k1 = fsym->ts.kind;
975 : }
976 7166 : if (args == 1)
977 : {
978 3567 : t2 = fsym->ts.type;
979 3567 : i2 = fsym->attr.intent;
980 3567 : r2 = (fsym->as != NULL) ? fsym->as->rank : 0;
981 3567 : k2 = fsym->ts.kind;
982 : }
983 7166 : args++;
984 : }
985 :
986 : /* Only +, - and .not. can be unary operators.
987 : .not. cannot be a binary operator. */
988 3598 : if (args == 0 || args > 2 || (args == 1 && op != INTRINSIC_PLUS
989 30 : && op != INTRINSIC_MINUS
990 30 : && op != INTRINSIC_NOT)
991 3597 : || (args == 2 && op == INTRINSIC_NOT))
992 : {
993 1 : if (op == INTRINSIC_ASSIGN)
994 0 : gfc_error ("Assignment operator interface at %L must have "
995 : "two arguments", &sym->declared_at);
996 : else
997 1 : gfc_error ("Operator interface at %L has the wrong number of arguments",
998 : &sym->declared_at);
999 1 : return false;
1000 : }
1001 :
1002 : /* Check that intrinsics are mapped to functions, except
1003 : INTRINSIC_ASSIGN which should map to a subroutine. */
1004 3597 : if (op == INTRINSIC_ASSIGN)
1005 : {
1006 1385 : gfc_formal_arglist *dummy_args;
1007 :
1008 1385 : if (!sym->attr.subroutine)
1009 : {
1010 1 : gfc_error ("Assignment operator interface at %L must be "
1011 : "a SUBROUTINE", &sym->declared_at);
1012 1 : return false;
1013 : }
1014 :
1015 : /* Allowed are (per F2003, 12.3.2.1.2 Defined assignments):
1016 : - First argument an array with different rank than second,
1017 : - First argument is a scalar and second an array,
1018 : - Types and kinds do not conform, or
1019 : - First argument is of derived type. */
1020 1384 : dummy_args = gfc_sym_get_dummy_args (sym);
1021 1384 : if (dummy_args->sym->ts.type != BT_DERIVED
1022 1153 : && dummy_args->sym->ts.type != BT_CLASS
1023 94 : && (r2 == 0 || r1 == r2)
1024 1473 : && (dummy_args->sym->ts.type == dummy_args->next->sym->ts.type
1025 84 : || (gfc_numeric_ts (&dummy_args->sym->ts)
1026 50 : && gfc_numeric_ts (&dummy_args->next->sym->ts))))
1027 : {
1028 5 : gfc_error ("Assignment operator interface at %L must not redefine "
1029 : "an INTRINSIC type assignment", &sym->declared_at);
1030 5 : return false;
1031 : }
1032 : }
1033 : else
1034 : {
1035 2212 : if (!sym->attr.function)
1036 : {
1037 1 : gfc_error ("Intrinsic operator interface at %L must be a FUNCTION",
1038 : &sym->declared_at);
1039 1 : return false;
1040 : }
1041 : }
1042 :
1043 : /* Check intents on operator interfaces. */
1044 3590 : if (op == INTRINSIC_ASSIGN)
1045 : {
1046 1379 : if (i1 != INTENT_OUT && i1 != INTENT_INOUT)
1047 : {
1048 0 : gfc_error ("First argument of defined assignment at %L must be "
1049 : "INTENT(OUT) or INTENT(INOUT)", &sym->declared_at);
1050 0 : return false;
1051 : }
1052 :
1053 1379 : if (i2 != INTENT_IN)
1054 : {
1055 0 : gfc_error ("Second argument of defined assignment at %L must be "
1056 : "INTENT(IN)", &sym->declared_at);
1057 0 : return false;
1058 : }
1059 : }
1060 : else
1061 : {
1062 2211 : if (i1 != INTENT_IN)
1063 : {
1064 0 : gfc_error ("First argument of operator interface at %L must be "
1065 : "INTENT(IN)", &sym->declared_at);
1066 0 : return false;
1067 : }
1068 :
1069 2211 : if (args == 2 && i2 != INTENT_IN)
1070 : {
1071 0 : gfc_error ("Second argument of operator interface at %L must be "
1072 : "INTENT(IN)", &sym->declared_at);
1073 0 : return false;
1074 : }
1075 : }
1076 :
1077 : /* From now on, all we have to do is check that the operator definition
1078 : doesn't conflict with an intrinsic operator. The rules for this
1079 : game are defined in 7.1.2 and 7.1.3 of both F95 and F2003 standards,
1080 : as well as 12.3.2.1.1 of Fortran 2003:
1081 :
1082 : "If the operator is an intrinsic-operator (R310), the number of
1083 : function arguments shall be consistent with the intrinsic uses of
1084 : that operator, and the types, kind type parameters, or ranks of the
1085 : dummy arguments shall differ from those required for the intrinsic
1086 : operation (7.1.2)." */
1087 :
1088 : #define IS_NUMERIC_TYPE(t) \
1089 : ((t) == BT_INTEGER || (t) == BT_REAL || (t) == BT_COMPLEX)
1090 :
1091 : /* Unary ops are easy, do them first. */
1092 3590 : if (op == INTRINSIC_NOT)
1093 : {
1094 5 : if (t1 == BT_LOGICAL)
1095 0 : goto bad_repl;
1096 : else
1097 : return true;
1098 : }
1099 :
1100 3585 : if (args == 1 && (op == INTRINSIC_PLUS || op == INTRINSIC_MINUS))
1101 : {
1102 25 : if (IS_NUMERIC_TYPE (t1))
1103 0 : goto bad_repl;
1104 : else
1105 : return true;
1106 : }
1107 :
1108 : /* Character intrinsic operators have same character kind, thus
1109 : operator definitions with operands of different character kinds
1110 : are always safe. */
1111 3560 : if (t1 == BT_CHARACTER && t2 == BT_CHARACTER && k1 != k2)
1112 : return true;
1113 :
1114 : /* Intrinsic operators always perform on arguments of same rank,
1115 : so different ranks is also always safe. (rank == 0) is an exception
1116 : to that, because all intrinsic operators are elemental. */
1117 3560 : if (r1 != r2 && r1 != 0 && r2 != 0)
1118 : return true;
1119 :
1120 3494 : switch (op)
1121 : {
1122 1019 : case INTRINSIC_EQ:
1123 1019 : case INTRINSIC_EQ_OS:
1124 1019 : case INTRINSIC_NE:
1125 1019 : case INTRINSIC_NE_OS:
1126 1019 : if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
1127 0 : goto bad_repl;
1128 : /* Fall through. */
1129 :
1130 1748 : case INTRINSIC_PLUS:
1131 1748 : case INTRINSIC_MINUS:
1132 1748 : case INTRINSIC_TIMES:
1133 1748 : case INTRINSIC_DIVIDE:
1134 1748 : case INTRINSIC_POWER:
1135 1748 : if (IS_NUMERIC_TYPE (t1) && IS_NUMERIC_TYPE (t2))
1136 2 : goto bad_repl;
1137 : break;
1138 :
1139 278 : case INTRINSIC_GT:
1140 278 : case INTRINSIC_GT_OS:
1141 278 : case INTRINSIC_GE:
1142 278 : case INTRINSIC_GE_OS:
1143 278 : case INTRINSIC_LT:
1144 278 : case INTRINSIC_LT_OS:
1145 278 : case INTRINSIC_LE:
1146 278 : case INTRINSIC_LE_OS:
1147 278 : if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
1148 1 : goto bad_repl;
1149 277 : if ((t1 == BT_INTEGER || t1 == BT_REAL)
1150 0 : && (t2 == BT_INTEGER || t2 == BT_REAL))
1151 0 : goto bad_repl;
1152 : break;
1153 :
1154 36 : case INTRINSIC_CONCAT:
1155 36 : if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
1156 0 : goto bad_repl;
1157 : break;
1158 :
1159 56 : case INTRINSIC_AND:
1160 56 : case INTRINSIC_OR:
1161 56 : case INTRINSIC_EQV:
1162 56 : case INTRINSIC_NEQV:
1163 56 : if (t1 == BT_LOGICAL && t2 == BT_LOGICAL)
1164 0 : goto bad_repl;
1165 : break;
1166 :
1167 : default:
1168 : break;
1169 : }
1170 :
1171 : return true;
1172 :
1173 : #undef IS_NUMERIC_TYPE
1174 :
1175 3 : bad_repl:
1176 3 : gfc_error ("Operator interface at %L conflicts with intrinsic interface",
1177 : &opwhere);
1178 3 : return false;
1179 : }
1180 :
1181 :
1182 : /* Given a pair of formal argument lists, we see if the two lists can
1183 : be distinguished by counting the number of nonoptional arguments of
1184 : a given type/rank in f1 and seeing if there are less then that
1185 : number of those arguments in f2 (including optional arguments).
1186 : Since this test is asymmetric, it has to be called twice to make it
1187 : symmetric. Returns nonzero if the argument lists are incompatible
1188 : by this test. This subroutine implements rule 1 of section F03:16.2.3.
1189 : 'p1' and 'p2' are the PASS arguments of both procedures (if applicable). */
1190 :
1191 : static bool
1192 888692 : count_types_test (gfc_formal_arglist *f1, gfc_formal_arglist *f2,
1193 : const char *p1, const char *p2)
1194 : {
1195 888692 : int ac1, ac2, i, j, k, n1;
1196 888692 : gfc_formal_arglist *f;
1197 :
1198 888692 : typedef struct
1199 : {
1200 : int flag;
1201 : gfc_symbol *sym;
1202 : }
1203 : arginfo;
1204 :
1205 888692 : arginfo *arg;
1206 :
1207 888692 : n1 = 0;
1208 :
1209 2511872 : for (f = f1; f; f = f->next)
1210 1623180 : n1++;
1211 :
1212 : /* Build an array of integers that gives the same integer to
1213 : arguments of the same type/rank. */
1214 888692 : arg = XCNEWVEC (arginfo, n1);
1215 :
1216 888692 : f = f1;
1217 3400564 : for (i = 0; i < n1; i++, f = f->next)
1218 : {
1219 1623180 : arg[i].flag = -1;
1220 1623180 : arg[i].sym = f->sym;
1221 : }
1222 :
1223 : k = 0;
1224 :
1225 2511872 : for (i = 0; i < n1; i++)
1226 : {
1227 1623180 : if (arg[i].flag != -1)
1228 265873 : continue;
1229 :
1230 1357307 : if (arg[i].sym && (arg[i].sym->attr.optional
1231 1357118 : || (p1 && strcmp (arg[i].sym->name, p1) == 0)))
1232 505 : continue; /* Skip OPTIONAL and PASS arguments. */
1233 :
1234 1356802 : arg[i].flag = k;
1235 :
1236 : /* Find other non-optional, non-pass arguments of the same type/rank. */
1237 2108157 : for (j = i + 1; j < n1; j++)
1238 751355 : if ((arg[j].sym == NULL
1239 751323 : || !(arg[j].sym->attr.optional
1240 188 : || (p1 && strcmp (arg[j].sym->name, p1) == 0)))
1241 1502320 : && (compare_type_rank_if (arg[i].sym, arg[j].sym)
1242 564780 : || compare_type_rank_if (arg[j].sym, arg[i].sym)))
1243 265873 : arg[j].flag = k;
1244 :
1245 1356802 : k++;
1246 : }
1247 :
1248 : /* Now loop over each distinct type found in f1. */
1249 : k = 0;
1250 1198682 : bool rc = false;
1251 :
1252 1198682 : for (i = 0; i < n1; i++)
1253 : {
1254 1100494 : if (arg[i].flag != k)
1255 42718 : continue;
1256 :
1257 1057776 : ac1 = 1;
1258 1808870 : for (j = i + 1; j < n1; j++)
1259 751094 : if (arg[j].flag == k)
1260 265852 : ac1++;
1261 :
1262 : /* Count the number of non-pass arguments in f2 with that type,
1263 : including those that are optional. */
1264 : ac2 = 0;
1265 :
1266 2996071 : for (f = f2; f; f = f->next)
1267 627 : if ((!p2 || strcmp (f->sym->name, p2) != 0)
1268 1938566 : && (compare_type_rank_if (arg[i].sym, f->sym)
1269 1580393 : || compare_type_rank_if (f->sym, arg[i].sym)))
1270 423762 : ac2++;
1271 :
1272 1057776 : if (ac1 > ac2)
1273 : {
1274 : rc = true;
1275 : break;
1276 : }
1277 :
1278 267272 : k++;
1279 : }
1280 :
1281 888692 : free (arg);
1282 :
1283 888692 : return rc;
1284 : }
1285 :
1286 :
1287 : /* Returns true if two dummy arguments are distinguishable due to their POINTER
1288 : and ALLOCATABLE attributes according to F2018 section 15.4.3.4.5 (3).
1289 : The function is asymmetric wrt to the arguments s1 and s2 and should always
1290 : be called twice (with flipped arguments in the second call). */
1291 :
1292 : static bool
1293 27801 : compare_ptr_alloc(gfc_symbol *s1, gfc_symbol *s2)
1294 : {
1295 : /* Is s1 allocatable? */
1296 27801 : const bool a1 = s1->ts.type == BT_CLASS ?
1297 27801 : CLASS_DATA(s1)->attr.allocatable : s1->attr.allocatable;
1298 : /* Is s2 a pointer? */
1299 27801 : const bool p2 = s2->ts.type == BT_CLASS ?
1300 27801 : CLASS_DATA(s2)->attr.class_pointer : s2->attr.pointer;
1301 27801 : return a1 && p2 && (s2->attr.intent != INTENT_IN);
1302 : }
1303 :
1304 :
1305 : /* Perform the correspondence test in rule (3) of F08:C1215.
1306 : Returns zero if no argument is found that satisfies this rule,
1307 : nonzero otherwise. 'p1' and 'p2' are the PASS arguments of both procedures
1308 : (if applicable).
1309 :
1310 : This test is also not symmetric in f1 and f2 and must be called
1311 : twice. This test finds problems caused by sorting the actual
1312 : argument list with keywords. For example:
1313 :
1314 : INTERFACE FOO
1315 : SUBROUTINE F1(A, B)
1316 : INTEGER :: A ; REAL :: B
1317 : END SUBROUTINE F1
1318 :
1319 : SUBROUTINE F2(B, A)
1320 : INTEGER :: A ; REAL :: B
1321 : END SUBROUTINE F1
1322 : END INTERFACE FOO
1323 :
1324 : At this point, 'CALL FOO(A=1, B=1.0)' is ambiguous. */
1325 :
1326 : static bool
1327 32614 : generic_correspondence (gfc_formal_arglist *f1, gfc_formal_arglist *f2,
1328 : const char *p1, const char *p2)
1329 : {
1330 32614 : gfc_formal_arglist *f2_save, *g;
1331 32614 : gfc_symbol *sym;
1332 :
1333 32614 : f2_save = f2;
1334 :
1335 46176 : while (f1)
1336 : {
1337 46126 : if (!f1->sym || f1->sym->attr.optional)
1338 4 : goto next;
1339 :
1340 46122 : if (p1 && strcmp (f1->sym->name, p1) == 0)
1341 7 : f1 = f1->next;
1342 46122 : if (f2 && p2 && strcmp (f2->sym->name, p2) == 0)
1343 5 : f2 = f2->next;
1344 :
1345 46118 : if (f2 != NULL && (compare_type_rank (f1->sym, f2->sym)
1346 32555 : || compare_type_rank (f2->sym, f1->sym))
1347 59688 : && !((gfc_option.allow_std & GFC_STD_F2008)
1348 13566 : && (compare_ptr_alloc(f1->sym, f2->sym)
1349 13559 : || compare_ptr_alloc(f2->sym, f1->sym))))
1350 13554 : goto next;
1351 :
1352 : /* Now search for a disambiguating keyword argument starting at
1353 : the current non-match. */
1354 32568 : for (g = f1; g; g = g->next)
1355 : {
1356 32564 : if (g->sym->attr.optional || (p1 && strcmp (g->sym->name, p1) == 0))
1357 0 : continue;
1358 :
1359 32564 : sym = find_keyword_arg (g->sym->name, f2_save);
1360 32564 : if (sym == NULL || !compare_type_rank (g->sym, sym)
1361 32578 : || ((gfc_option.allow_std & GFC_STD_F2008)
1362 14 : && (compare_ptr_alloc(sym, g->sym)
1363 7 : || compare_ptr_alloc(g->sym, sym))))
1364 32564 : return true;
1365 : }
1366 :
1367 13562 : next:
1368 13562 : if (f1 != NULL)
1369 13558 : f1 = f1->next;
1370 13562 : if (f2 != NULL)
1371 13558 : f2 = f2->next;
1372 : }
1373 :
1374 : return false;
1375 : }
1376 :
1377 :
1378 : int
1379 564093 : gfc_symbol_rank (gfc_symbol *sym)
1380 : {
1381 564093 : gfc_array_spec *as = NULL;
1382 :
1383 564093 : if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
1384 17055 : as = CLASS_DATA (sym)->as;
1385 : else
1386 547038 : as = sym->as;
1387 :
1388 564093 : return as ? as->rank : 0;
1389 : }
1390 :
1391 :
1392 : /* Check if the characteristics of two dummy arguments match,
1393 : cf. F08:12.3.2. */
1394 :
1395 : bool
1396 120491 : gfc_check_dummy_characteristics (gfc_symbol *s1, gfc_symbol *s2,
1397 : bool type_must_agree, char *errmsg,
1398 : int err_len)
1399 : {
1400 120491 : if (s1 == NULL || s2 == NULL)
1401 27 : return s1 == s2 ? true : false;
1402 :
1403 120464 : if (s1->attr.proc == PROC_ST_FUNCTION || s2->attr.proc == PROC_ST_FUNCTION)
1404 : {
1405 1 : strncpy (errmsg, "Statement function", err_len);
1406 1 : return false;
1407 : }
1408 :
1409 : /* Check type and rank. */
1410 120463 : if (type_must_agree)
1411 : {
1412 119294 : if (!compare_type_characteristics (s1, s2)
1413 119294 : || !compare_type_characteristics (s2, s1))
1414 : {
1415 24 : snprintf (errmsg, err_len, "Type mismatch in argument '%s' (%s/%s)",
1416 : s1->name, gfc_dummy_typename (&s1->ts),
1417 : gfc_dummy_typename (&s2->ts));
1418 24 : return false;
1419 : }
1420 119270 : if (!compare_rank (s1, s2))
1421 : {
1422 5 : snprintf (errmsg, err_len, "Rank mismatch in argument '%s' (%i/%i)",
1423 : s1->name, gfc_symbol_rank (s1), gfc_symbol_rank (s2));
1424 5 : return false;
1425 : }
1426 : }
1427 :
1428 : /* A lot of information is missing for artificially generated
1429 : formal arguments, let's not look into that. */
1430 :
1431 120434 : if (!s1->attr.artificial && !s2->attr.artificial)
1432 : {
1433 : /* Check INTENT. */
1434 94928 : if (s1->attr.intent != s2->attr.intent)
1435 : {
1436 5 : snprintf (errmsg, err_len, "INTENT mismatch in argument '%s'",
1437 : s1->name);
1438 5 : return false;
1439 : }
1440 :
1441 : /* Check OPTIONAL attribute. */
1442 94923 : if (s1->attr.optional != s2->attr.optional)
1443 : {
1444 1 : snprintf (errmsg, err_len, "OPTIONAL mismatch in argument '%s'",
1445 : s1->name);
1446 1 : return false;
1447 : }
1448 :
1449 : /* Check ALLOCATABLE attribute. */
1450 94922 : if (s1->attr.allocatable != s2->attr.allocatable)
1451 : {
1452 0 : snprintf (errmsg, err_len, "ALLOCATABLE mismatch in argument '%s'",
1453 : s1->name);
1454 0 : return false;
1455 : }
1456 :
1457 : /* Check POINTER attribute. */
1458 94922 : if (s1->attr.pointer != s2->attr.pointer)
1459 : {
1460 0 : snprintf (errmsg, err_len, "POINTER mismatch in argument '%s'",
1461 : s1->name);
1462 0 : return false;
1463 : }
1464 :
1465 : /* Check TARGET attribute. */
1466 94922 : if (s1->attr.target != s2->attr.target)
1467 : {
1468 0 : snprintf (errmsg, err_len, "TARGET mismatch in argument '%s'",
1469 : s1->name);
1470 0 : return false;
1471 : }
1472 :
1473 : /* Check ASYNCHRONOUS attribute. */
1474 94922 : if (s1->attr.asynchronous != s2->attr.asynchronous)
1475 : {
1476 1 : snprintf (errmsg, err_len, "ASYNCHRONOUS mismatch in argument '%s'",
1477 : s1->name);
1478 1 : return false;
1479 : }
1480 :
1481 : /* Check CONTIGUOUS attribute. */
1482 94921 : if (s1->attr.contiguous != s2->attr.contiguous)
1483 : {
1484 1 : snprintf (errmsg, err_len, "CONTIGUOUS mismatch in argument '%s'",
1485 : s1->name);
1486 1 : return false;
1487 : }
1488 :
1489 : /* Check VALUE attribute. */
1490 94920 : if (s1->attr.value != s2->attr.value)
1491 : {
1492 1 : snprintf (errmsg, err_len, "VALUE mismatch in argument '%s'",
1493 : s1->name);
1494 1 : return false;
1495 : }
1496 :
1497 : /* Check VOLATILE attribute. */
1498 94919 : if (s1->attr.volatile_ != s2->attr.volatile_)
1499 : {
1500 1 : snprintf (errmsg, err_len, "VOLATILE mismatch in argument '%s'",
1501 : s1->name);
1502 1 : return false;
1503 : }
1504 : }
1505 :
1506 : /* Check interface of dummy procedures. */
1507 120424 : if (s1->attr.flavor == FL_PROCEDURE)
1508 : {
1509 129 : char err[200];
1510 129 : if (!gfc_compare_interfaces (s1, s2, s2->name, 0, 1, err, sizeof(err),
1511 : NULL, NULL))
1512 : {
1513 1 : snprintf (errmsg, err_len, "Interface mismatch in dummy procedure "
1514 : "'%s': %s", s1->name, err);
1515 1 : return false;
1516 : }
1517 : }
1518 :
1519 : /* Check string length. */
1520 120423 : if (s1->ts.type == BT_CHARACTER
1521 2784 : && s1->ts.u.cl && s1->ts.u.cl->length
1522 883 : && s2->ts.u.cl && s2->ts.u.cl->length)
1523 : {
1524 883 : int compval = gfc_dep_compare_expr (s1->ts.u.cl->length,
1525 : s2->ts.u.cl->length);
1526 883 : switch (compval)
1527 : {
1528 0 : case -1:
1529 0 : case 1:
1530 0 : case -3:
1531 0 : snprintf (errmsg, err_len, "Character length mismatch "
1532 : "in argument '%s'", s1->name);
1533 0 : return false;
1534 :
1535 : case -2:
1536 : /* FIXME: Implement a warning for this case.
1537 : gfc_warning (0, "Possible character length mismatch in argument %qs",
1538 : s1->name);*/
1539 : break;
1540 :
1541 : case 0:
1542 : break;
1543 :
1544 0 : default:
1545 0 : gfc_internal_error ("check_dummy_characteristics: Unexpected result "
1546 : "%i of gfc_dep_compare_expr", compval);
1547 : break;
1548 : }
1549 : }
1550 :
1551 : /* Check array shape. */
1552 120423 : if (s1->as && s2->as)
1553 : {
1554 21423 : int i, compval;
1555 21423 : gfc_expr *shape1, *shape2;
1556 :
1557 21423 : if (s1->as->rank != s2->as->rank)
1558 : {
1559 2 : snprintf (errmsg, err_len, "Rank mismatch in argument '%s' (%i/%i)",
1560 : s1->name, s1->as->rank, s2->as->rank);
1561 2 : return false;
1562 : }
1563 :
1564 : /* Sometimes the ambiguity between deferred shape and assumed shape
1565 : does not get resolved in module procedures, where the only explicit
1566 : declaration of the dummy is in the interface. */
1567 21421 : if (s1->ns->proc_name && s1->ns->proc_name->attr.module_procedure
1568 114 : && s1->as->type == AS_ASSUMED_SHAPE
1569 67 : && s2->as->type == AS_DEFERRED)
1570 : {
1571 7 : s2->as->type = AS_ASSUMED_SHAPE;
1572 14 : for (i = 0; i < s2->as->rank; i++)
1573 7 : if (s1->as->lower[i] != NULL)
1574 7 : s2->as->lower[i] = gfc_copy_expr (s1->as->lower[i]);
1575 : }
1576 :
1577 21421 : if (s1->as->type != s2->as->type
1578 4 : && !(s1->as->type == AS_DEFERRED
1579 : && s2->as->type == AS_ASSUMED_SHAPE))
1580 : {
1581 2 : snprintf (errmsg, err_len, "Shape mismatch in argument '%s'",
1582 : s1->name);
1583 2 : return false;
1584 : }
1585 :
1586 21419 : if (s1->as->corank != s2->as->corank)
1587 : {
1588 1 : snprintf (errmsg, err_len, "Corank mismatch in argument '%s' (%i/%i)",
1589 : s1->name, s1->as->corank, s2->as->corank);
1590 1 : return false;
1591 : }
1592 :
1593 21418 : if (s1->as->type == AS_EXPLICIT)
1594 3863 : for (i = 0; i < s1->as->rank + MAX (0, s1->as->corank-1); i++)
1595 : {
1596 2082 : shape1 = gfc_subtract (gfc_copy_expr (s1->as->upper[i]),
1597 2082 : gfc_copy_expr (s1->as->lower[i]));
1598 2082 : shape2 = gfc_subtract (gfc_copy_expr (s2->as->upper[i]),
1599 2082 : gfc_copy_expr (s2->as->lower[i]));
1600 2082 : compval = gfc_dep_compare_expr (shape1, shape2);
1601 2082 : gfc_free_expr (shape1);
1602 2082 : gfc_free_expr (shape2);
1603 2082 : switch (compval)
1604 : {
1605 2 : case -1:
1606 2 : case 1:
1607 2 : case -3:
1608 2 : if (i < s1->as->rank)
1609 2 : snprintf (errmsg, err_len, "Shape mismatch in dimension %i of"
1610 : " argument '%s'", i + 1, s1->name);
1611 : else
1612 0 : snprintf (errmsg, err_len, "Shape mismatch in codimension %i "
1613 0 : "of argument '%s'", i - s1->as->rank + 1, s1->name);
1614 2 : return false;
1615 :
1616 : case -2:
1617 : /* FIXME: Implement a warning for this case.
1618 : gfc_warning (0, "Possible shape mismatch in argument %qs",
1619 : s1->name);*/
1620 : break;
1621 :
1622 : case 0:
1623 : break;
1624 :
1625 0 : default:
1626 0 : gfc_internal_error ("check_dummy_characteristics: Unexpected "
1627 : "result %i of gfc_dep_compare_expr",
1628 : compval);
1629 2080 : break;
1630 : }
1631 : }
1632 : }
1633 :
1634 : return true;
1635 : }
1636 :
1637 :
1638 : /* Check if the characteristics of two function results match,
1639 : cf. F08:12.3.3. */
1640 :
1641 : bool
1642 52090 : gfc_check_result_characteristics (gfc_symbol *s1, gfc_symbol *s2,
1643 : char *errmsg, int err_len)
1644 : {
1645 52090 : gfc_symbol *r1, *r2;
1646 :
1647 52090 : if (s1->ts.interface && s1->ts.interface->result)
1648 : r1 = s1->ts.interface->result;
1649 : else
1650 51619 : r1 = s1->result ? s1->result : s1;
1651 :
1652 52090 : if (s2->ts.interface && s2->ts.interface->result)
1653 : r2 = s2->ts.interface->result;
1654 : else
1655 51621 : r2 = s2->result ? s2->result : s2;
1656 :
1657 52090 : if (r1->ts.type == BT_UNKNOWN)
1658 : return true;
1659 :
1660 : /* Check type and rank. */
1661 51823 : if (!compare_type_characteristics (r1, r2))
1662 : {
1663 21 : snprintf (errmsg, err_len, "Type mismatch in function result (%s/%s)",
1664 : gfc_typename (&r1->ts), gfc_typename (&r2->ts));
1665 21 : return false;
1666 : }
1667 51802 : if (!compare_rank (r1, r2))
1668 : {
1669 5 : snprintf (errmsg, err_len, "Rank mismatch in function result (%i/%i)",
1670 : gfc_symbol_rank (r1), gfc_symbol_rank (r2));
1671 5 : return false;
1672 : }
1673 :
1674 : /* Check ALLOCATABLE attribute. */
1675 51797 : if (r1->attr.allocatable != r2->attr.allocatable)
1676 : {
1677 2 : snprintf (errmsg, err_len, "ALLOCATABLE attribute mismatch in "
1678 : "function result");
1679 2 : return false;
1680 : }
1681 :
1682 : /* Check POINTER attribute. */
1683 51795 : if (r1->attr.pointer != r2->attr.pointer)
1684 : {
1685 2 : snprintf (errmsg, err_len, "POINTER attribute mismatch in "
1686 : "function result");
1687 2 : return false;
1688 : }
1689 :
1690 : /* Check CONTIGUOUS attribute. */
1691 51793 : if (r1->attr.contiguous != r2->attr.contiguous)
1692 : {
1693 1 : snprintf (errmsg, err_len, "CONTIGUOUS attribute mismatch in "
1694 : "function result");
1695 1 : return false;
1696 : }
1697 :
1698 : /* Check PROCEDURE POINTER attribute. */
1699 51792 : if (r1 != s1 && r1->attr.proc_pointer != r2->attr.proc_pointer)
1700 : {
1701 3 : snprintf (errmsg, err_len, "PROCEDURE POINTER mismatch in "
1702 : "function result");
1703 3 : return false;
1704 : }
1705 :
1706 : /* Check string length. */
1707 51789 : if (r1->ts.type == BT_CHARACTER && r1->ts.u.cl && r2->ts.u.cl)
1708 : {
1709 2211 : if (r1->ts.deferred != r2->ts.deferred)
1710 : {
1711 0 : snprintf (errmsg, err_len, "Character length mismatch "
1712 : "in function result");
1713 0 : return false;
1714 : }
1715 :
1716 2211 : if (r1->ts.u.cl->length && r2->ts.u.cl->length)
1717 : {
1718 1647 : int compval = gfc_dep_compare_expr (r1->ts.u.cl->length,
1719 : r2->ts.u.cl->length);
1720 1647 : switch (compval)
1721 : {
1722 3 : case -1:
1723 3 : case 1:
1724 3 : case -3:
1725 3 : snprintf (errmsg, err_len, "Character length mismatch "
1726 : "in function result");
1727 3 : return false;
1728 :
1729 75 : case -2:
1730 75 : if (r1->ts.u.cl->length->expr_type == EXPR_CONSTANT)
1731 : {
1732 0 : snprintf (errmsg, err_len,
1733 : "Function declared with a non-constant character "
1734 : "length referenced with a constant length");
1735 0 : return false;
1736 : }
1737 75 : else if (r2->ts.u.cl->length->expr_type == EXPR_CONSTANT)
1738 : {
1739 3 : snprintf (errmsg, err_len,
1740 : "Function declared with a constant character "
1741 : "length referenced with a non-constant length");
1742 3 : return false;
1743 : }
1744 : /* Warn if length expression types are different, except for
1745 : possibly false positives where complex expressions might have
1746 : been used. */
1747 72 : else if ((r1->ts.u.cl->length->expr_type
1748 : != r2->ts.u.cl->length->expr_type)
1749 4 : && (r1->ts.u.cl->length->expr_type != EXPR_OP
1750 2 : || r2->ts.u.cl->length->expr_type != EXPR_OP))
1751 4 : gfc_warning (0, "Possible character length mismatch in "
1752 : "function result between %L and %L",
1753 : &r1->declared_at, &r2->declared_at);
1754 : break;
1755 :
1756 : case 0:
1757 : break;
1758 :
1759 0 : default:
1760 0 : gfc_internal_error ("check_result_characteristics (1): Unexpected "
1761 : "result %i of gfc_dep_compare_expr", compval);
1762 : break;
1763 : }
1764 : }
1765 : }
1766 :
1767 : /* Check array shape. */
1768 51783 : if (!r1->attr.allocatable && !r1->attr.pointer && r1->as && r2->as)
1769 : {
1770 989 : int i, compval;
1771 989 : gfc_expr *shape1, *shape2;
1772 :
1773 989 : if (r1->as->type != r2->as->type)
1774 : {
1775 0 : snprintf (errmsg, err_len, "Shape mismatch in function result");
1776 0 : return false;
1777 : }
1778 :
1779 989 : if (r1->as->type == AS_EXPLICIT)
1780 2493 : for (i = 0; i < r1->as->rank + r1->as->corank; i++)
1781 : {
1782 1505 : shape1 = gfc_subtract (gfc_copy_expr (r1->as->upper[i]),
1783 1505 : gfc_copy_expr (r1->as->lower[i]));
1784 1505 : shape2 = gfc_subtract (gfc_copy_expr (r2->as->upper[i]),
1785 1505 : gfc_copy_expr (r2->as->lower[i]));
1786 1505 : compval = gfc_dep_compare_expr (shape1, shape2);
1787 1505 : gfc_free_expr (shape1);
1788 1505 : gfc_free_expr (shape2);
1789 1505 : switch (compval)
1790 : {
1791 1 : case -1:
1792 1 : case 1:
1793 1 : case -3:
1794 1 : snprintf (errmsg, err_len, "Shape mismatch in dimension %i of "
1795 : "function result", i + 1);
1796 1 : return false;
1797 :
1798 : case -2:
1799 : /* FIXME: Implement a warning for this case.
1800 : gfc_warning (0, "Possible shape mismatch in return value");*/
1801 : break;
1802 :
1803 : case 0:
1804 : break;
1805 :
1806 0 : default:
1807 0 : gfc_internal_error ("check_result_characteristics (2): "
1808 : "Unexpected result %i of "
1809 : "gfc_dep_compare_expr", compval);
1810 1504 : break;
1811 : }
1812 : }
1813 : }
1814 :
1815 : return true;
1816 : }
1817 :
1818 :
1819 : /* 'Compare' two formal interfaces associated with a pair of symbols.
1820 : We return true if there exists an actual argument list that
1821 : would be ambiguous between the two interfaces, zero otherwise.
1822 : 'strict_flag' specifies whether all the characteristics are
1823 : required to match, which is not the case for ambiguity checks.
1824 : 'p1' and 'p2' are the PASS arguments of both procedures (if applicable). */
1825 :
1826 : bool
1827 885169 : gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol *s2, const char *name2,
1828 : int generic_flag, int strict_flag,
1829 : char *errmsg, int err_len,
1830 : const char *p1, const char *p2,
1831 : bool *bad_result_characteristics)
1832 : {
1833 885169 : gfc_formal_arglist *f1, *f2;
1834 :
1835 885169 : gcc_assert (name2 != NULL);
1836 :
1837 885169 : if (bad_result_characteristics)
1838 14931 : *bad_result_characteristics = false;
1839 :
1840 885169 : if (s1->attr.function && (s2->attr.subroutine
1841 793221 : || (!s2->attr.function && s2->ts.type == BT_UNKNOWN
1842 5 : && gfc_get_default_type (name2, s2->ns)->type == BT_UNKNOWN)))
1843 : {
1844 3 : if (errmsg != NULL)
1845 3 : snprintf (errmsg, err_len, "'%s' is not a function", name2);
1846 3 : return false;
1847 : }
1848 :
1849 885166 : if (s1->attr.subroutine && s2->attr.function)
1850 : {
1851 6 : if (errmsg != NULL)
1852 6 : snprintf (errmsg, err_len, "'%s' is not a subroutine", name2);
1853 6 : return false;
1854 : }
1855 :
1856 885160 : if (s2->attr.subroutine && s1->attr.flavor == FL_VARIABLE)
1857 : {
1858 2 : if (errmsg != NULL)
1859 2 : snprintf (errmsg, err_len, "subroutine proc pointer '%s' passed "
1860 : "to dummy variable '%s'", name2, s1->name);
1861 2 : return false;
1862 : }
1863 :
1864 : /* Do strict checks on all characteristics
1865 : (for dummy procedures and procedure pointer assignments). */
1866 885158 : if (!generic_flag && strict_flag)
1867 : {
1868 59067 : if (s1->attr.function && s2->attr.function)
1869 : {
1870 : /* If both are functions, check result characteristics. */
1871 25501 : if (!gfc_check_result_characteristics (s1, s2, errmsg, err_len)
1872 25501 : || !gfc_check_result_characteristics (s2, s1, errmsg, err_len))
1873 : {
1874 30 : if (bad_result_characteristics)
1875 6 : *bad_result_characteristics = true;
1876 30 : return false;
1877 : }
1878 : }
1879 :
1880 59037 : if (s1->attr.pure && !s2->attr.pure)
1881 : {
1882 2 : snprintf (errmsg, err_len, "Mismatch in PURE attribute");
1883 2 : return false;
1884 : }
1885 59035 : if (s1->attr.elemental && !s2->attr.elemental)
1886 : {
1887 0 : snprintf (errmsg, err_len, "Mismatch in ELEMENTAL attribute");
1888 0 : return false;
1889 : }
1890 : }
1891 :
1892 885126 : if (s1->attr.if_source == IFSRC_UNKNOWN
1893 869481 : || s2->attr.if_source == IFSRC_UNKNOWN)
1894 : return true;
1895 :
1896 869405 : f1 = gfc_sym_get_dummy_args (s1);
1897 869405 : f2 = gfc_sym_get_dummy_args (s2);
1898 :
1899 : /* Special case: No arguments. */
1900 869405 : if (f1 == NULL && f2 == NULL)
1901 : return true;
1902 :
1903 867314 : if (generic_flag)
1904 : {
1905 823096 : if (count_types_test (f1, f2, p1, p2)
1906 823096 : || count_types_test (f2, f1, p2, p1))
1907 790504 : return false;
1908 :
1909 : /* Special case: alternate returns. If both f1->sym and f2->sym are
1910 : NULL, then the leading formal arguments are alternate returns.
1911 : The previous conditional should catch argument lists with
1912 : different number of argument. */
1913 32592 : if (f1 && f1->sym == NULL && f2 && f2->sym == NULL)
1914 : return true;
1915 :
1916 32589 : if (generic_correspondence (f1, f2, p1, p2)
1917 32589 : || generic_correspondence (f2, f1, p2, p1))
1918 32564 : return false;
1919 : }
1920 : else
1921 : /* Perform the abbreviated correspondence test for operators (the
1922 : arguments cannot be optional and are always ordered correctly).
1923 : This is also done when comparing interfaces for dummy procedures and in
1924 : procedure pointer assignments. */
1925 :
1926 162531 : for (; f1 || f2; f1 = f1->next, f2 = f2->next)
1927 : {
1928 : /* Check existence. */
1929 121344 : if (f1 == NULL || f2 == NULL)
1930 : {
1931 10 : if (errmsg != NULL)
1932 6 : snprintf (errmsg, err_len, "'%s' has the wrong number of "
1933 : "arguments", name2);
1934 10 : return false;
1935 : }
1936 :
1937 121334 : if (strict_flag)
1938 : {
1939 : /* Check all characteristics. */
1940 118027 : if (!gfc_check_dummy_characteristics (f1->sym, f2->sym, true,
1941 : errmsg, err_len))
1942 : return false;
1943 : }
1944 : else
1945 : {
1946 : /* Operators: Only check type and rank of arguments. */
1947 3307 : if (!compare_type (f2->sym, f1->sym))
1948 : {
1949 2975 : if (errmsg != NULL)
1950 0 : snprintf (errmsg, err_len, "Type mismatch in argument '%s' "
1951 0 : "(%s/%s)", f1->sym->name,
1952 0 : gfc_typename (&f1->sym->ts),
1953 0 : gfc_typename (&f2->sym->ts));
1954 2975 : return false;
1955 : }
1956 332 : if (!compare_rank (f2->sym, f1->sym))
1957 : {
1958 4 : if (errmsg != NULL)
1959 0 : snprintf (errmsg, err_len, "Rank mismatch in argument "
1960 0 : "'%s' (%i/%i)", f1->sym->name,
1961 0 : gfc_symbol_rank (f1->sym), gfc_symbol_rank (f2->sym));
1962 4 : return false;
1963 : }
1964 328 : if ((gfc_option.allow_std & GFC_STD_F2008)
1965 328 : && (compare_ptr_alloc(f1->sym, f2->sym)
1966 327 : || compare_ptr_alloc(f2->sym, f1->sym)))
1967 : {
1968 2 : if (errmsg != NULL)
1969 0 : snprintf (errmsg, err_len, "Mismatching POINTER/ALLOCATABLE "
1970 : "attribute in argument '%s' ", f1->sym->name);
1971 2 : return false;
1972 : }
1973 : }
1974 : }
1975 :
1976 : return true;
1977 : }
1978 :
1979 :
1980 : /* Given a pointer to an interface pointer, remove duplicate
1981 : interfaces and make sure that all symbols are either functions
1982 : or subroutines, and all of the same kind. Returns true if
1983 : something goes wrong. */
1984 :
1985 : static bool
1986 9466217 : check_interface0 (gfc_interface *p, const char *interface_name)
1987 : {
1988 9466217 : gfc_interface *psave, *q, *qlast;
1989 :
1990 9466217 : psave = p;
1991 9664120 : for (; p; p = p->next)
1992 : {
1993 : /* Make sure all symbols in the interface have been defined as
1994 : functions or subroutines. */
1995 197919 : if (((!p->sym->attr.function && !p->sym->attr.subroutine)
1996 161437 : || !p->sym->attr.if_source)
1997 36485 : && !gfc_fl_struct (p->sym->attr.flavor))
1998 : {
1999 12 : const char *guessed
2000 12 : = gfc_lookup_function_fuzzy (p->sym->name, p->sym->ns->sym_root);
2001 :
2002 12 : if (p->sym->attr.external)
2003 5 : if (guessed)
2004 5 : gfc_error ("Procedure %qs in %s at %L has no explicit interface"
2005 : "; did you mean %qs?",
2006 : p->sym->name, interface_name, &p->sym->declared_at,
2007 : guessed);
2008 : else
2009 0 : gfc_error ("Procedure %qs in %s at %L has no explicit interface",
2010 : p->sym->name, interface_name, &p->sym->declared_at);
2011 : else
2012 7 : if (guessed)
2013 4 : gfc_error ("Procedure %qs in %s at %L is neither function nor "
2014 : "subroutine; did you mean %qs?", p->sym->name,
2015 : interface_name, &p->sym->declared_at, guessed);
2016 : else
2017 3 : gfc_error ("Procedure %qs in %s at %L is neither function nor "
2018 : "subroutine", p->sym->name, interface_name,
2019 : &p->sym->declared_at);
2020 12 : return true;
2021 : }
2022 :
2023 : /* Verify that procedures are either all SUBROUTINEs or all FUNCTIONs. */
2024 197907 : if ((psave->sym->attr.function && !p->sym->attr.function
2025 282 : && !gfc_fl_struct (p->sym->attr.flavor))
2026 197905 : || (psave->sym->attr.subroutine && !p->sym->attr.subroutine))
2027 : {
2028 3 : if (!gfc_fl_struct (p->sym->attr.flavor))
2029 3 : gfc_error ("In %s at %L procedures must be either all SUBROUTINEs"
2030 : " or all FUNCTIONs", interface_name,
2031 : &p->sym->declared_at);
2032 0 : else if (p->sym->attr.flavor == FL_DERIVED)
2033 0 : gfc_error ("In %s at %L procedures must be all FUNCTIONs as the "
2034 : "generic name is also the name of a derived type",
2035 : interface_name, &p->sym->declared_at);
2036 3 : return true;
2037 : }
2038 :
2039 : /* F2003, C1207. F2008, C1207. */
2040 197904 : if (p->sym->attr.proc == PROC_INTERNAL
2041 197904 : && !gfc_notify_std (GFC_STD_F2008, "Internal procedure "
2042 : "%qs in %s at %L", p->sym->name,
2043 : interface_name, &p->sym->declared_at))
2044 : return true;
2045 : }
2046 : p = psave;
2047 :
2048 : /* Remove duplicate interfaces in this interface list. */
2049 9659074 : for (; p; p = p->next)
2050 : {
2051 192873 : qlast = p;
2052 :
2053 622409 : for (q = p->next; q;)
2054 : {
2055 429536 : if (p->sym != q->sym)
2056 : {
2057 424510 : qlast = q;
2058 424510 : q = q->next;
2059 : }
2060 : else
2061 : {
2062 : /* Duplicate interface. */
2063 5026 : qlast->next = q->next;
2064 5026 : free (q);
2065 5026 : q = qlast->next;
2066 : }
2067 : }
2068 : }
2069 :
2070 : return false;
2071 : }
2072 :
2073 :
2074 : /* Check lists of interfaces to make sure that no two interfaces are
2075 : ambiguous. Duplicate interfaces (from the same symbol) are OK here. */
2076 :
2077 : static bool
2078 17151532 : check_interface1 (gfc_interface *p, gfc_interface *q0,
2079 : int generic_flag, const char *interface_name,
2080 : bool referenced)
2081 : {
2082 17151532 : gfc_interface *q;
2083 17347608 : for (; p; p = p->next)
2084 1215022 : for (q = q0; q; q = q->next)
2085 : {
2086 1018946 : if (p->sym == q->sym)
2087 192835 : continue; /* Duplicates OK here. */
2088 :
2089 826111 : if (p->sym->name == q->sym->name && p->sym->module == q->sym->module)
2090 128 : continue;
2091 :
2092 825983 : if (!gfc_fl_struct (p->sym->attr.flavor)
2093 825661 : && !gfc_fl_struct (q->sym->attr.flavor)
2094 825343 : && gfc_compare_interfaces (p->sym, q->sym, q->sym->name,
2095 : generic_flag, 0, NULL, 0, NULL, NULL))
2096 : {
2097 30 : if (referenced)
2098 27 : gfc_error ("Ambiguous interfaces in %s for %qs at %L "
2099 : "and %qs at %L", interface_name,
2100 27 : q->sym->name, &q->sym->declared_at,
2101 27 : p->sym->name, &p->sym->declared_at);
2102 3 : else if (!p->sym->attr.use_assoc && q->sym->attr.use_assoc)
2103 1 : gfc_warning (0, "Ambiguous interfaces in %s for %qs at %L "
2104 : "and %qs at %L", interface_name,
2105 : q->sym->name, &q->sym->declared_at,
2106 : p->sym->name, &p->sym->declared_at);
2107 : else
2108 2 : gfc_warning (0, "Although not referenced, %qs has ambiguous "
2109 : "interfaces at %L", interface_name, &p->where);
2110 30 : return true;
2111 : }
2112 : }
2113 : return false;
2114 : }
2115 :
2116 :
2117 : /* Check the generic and operator interfaces of symbols to make sure
2118 : that none of the interfaces conflict. The check has to be done
2119 : after all of the symbols are actually loaded. */
2120 :
2121 : static void
2122 1894819 : check_sym_interfaces (gfc_symbol *sym)
2123 : {
2124 : /* Provide sufficient space to hold "generic interface 'symbol.symbol'". */
2125 1894819 : char interface_name[2*GFC_MAX_SYMBOL_LEN+2 + sizeof("generic interface ''")];
2126 1894819 : gfc_interface *p;
2127 :
2128 1894819 : if (sym->ns != gfc_current_ns)
2129 60871 : return;
2130 :
2131 1833966 : if (sym->generic != NULL)
2132 : {
2133 79223 : size_t len = strlen (sym->name) + sizeof("generic interface ''");
2134 79223 : gcc_assert (len < sizeof (interface_name));
2135 79223 : sprintf (interface_name, "generic interface '%s'", sym->name);
2136 79223 : if (check_interface0 (sym->generic, interface_name))
2137 : return;
2138 :
2139 268103 : for (p = sym->generic; p; p = p->next)
2140 : {
2141 188898 : if (p->sym->attr.mod_proc
2142 1218 : && !p->sym->attr.module_procedure
2143 1212 : && (p->sym->attr.if_source != IFSRC_DECL
2144 1208 : || p->sym->attr.procedure))
2145 : {
2146 4 : gfc_error ("%qs at %L is not a module procedure",
2147 : p->sym->name, &p->where);
2148 4 : return;
2149 : }
2150 : }
2151 :
2152 : /* Originally, this test was applied to host interfaces too;
2153 : this is incorrect since host associated symbols, from any
2154 : source, cannot be ambiguous with local symbols. */
2155 79205 : check_interface1 (sym->generic, sym->generic, 1, interface_name,
2156 79205 : sym->attr.referenced || !sym->attr.use_assoc);
2157 : }
2158 : }
2159 :
2160 :
2161 : static void
2162 398 : check_uop_interfaces (gfc_user_op *uop)
2163 : {
2164 398 : char interface_name[GFC_MAX_SYMBOL_LEN + sizeof("operator interface ''")];
2165 398 : gfc_user_op *uop2;
2166 398 : gfc_namespace *ns;
2167 :
2168 398 : sprintf (interface_name, "operator interface '%s'", uop->name);
2169 398 : if (check_interface0 (uop->op, interface_name))
2170 2 : return;
2171 :
2172 821 : for (ns = gfc_current_ns; ns; ns = ns->parent)
2173 : {
2174 425 : uop2 = gfc_find_uop (uop->name, ns);
2175 425 : if (uop2 == NULL)
2176 16 : continue;
2177 :
2178 409 : check_interface1 (uop->op, uop2->op, 0,
2179 : interface_name, true);
2180 : }
2181 : }
2182 :
2183 : /* Given an intrinsic op, return an equivalent op if one exists,
2184 : or INTRINSIC_NONE otherwise. */
2185 :
2186 : gfc_intrinsic_op
2187 11819095 : gfc_equivalent_op (gfc_intrinsic_op op)
2188 : {
2189 11819095 : switch(op)
2190 : {
2191 : case INTRINSIC_EQ:
2192 : return INTRINSIC_EQ_OS;
2193 :
2194 : case INTRINSIC_EQ_OS:
2195 : return INTRINSIC_EQ;
2196 :
2197 : case INTRINSIC_NE:
2198 : return INTRINSIC_NE_OS;
2199 :
2200 : case INTRINSIC_NE_OS:
2201 : return INTRINSIC_NE;
2202 :
2203 : case INTRINSIC_GT:
2204 : return INTRINSIC_GT_OS;
2205 :
2206 : case INTRINSIC_GT_OS:
2207 : return INTRINSIC_GT;
2208 :
2209 : case INTRINSIC_GE:
2210 : return INTRINSIC_GE_OS;
2211 :
2212 : case INTRINSIC_GE_OS:
2213 : return INTRINSIC_GE;
2214 :
2215 : case INTRINSIC_LT:
2216 : return INTRINSIC_LT_OS;
2217 :
2218 : case INTRINSIC_LT_OS:
2219 : return INTRINSIC_LT;
2220 :
2221 : case INTRINSIC_LE:
2222 : return INTRINSIC_LE_OS;
2223 :
2224 : case INTRINSIC_LE_OS:
2225 : return INTRINSIC_LE;
2226 :
2227 : default:
2228 : return INTRINSIC_NONE;
2229 : }
2230 : }
2231 :
2232 : /* For the namespace, check generic, user operator and intrinsic
2233 : operator interfaces for consistency and to remove duplicate
2234 : interfaces. We traverse the whole namespace, counting on the fact
2235 : that most symbols will not have generic or operator interfaces. */
2236 :
2237 : void
2238 347654 : gfc_check_interfaces (gfc_namespace *ns)
2239 : {
2240 347654 : gfc_namespace *old_ns, *ns2;
2241 347654 : char interface_name[GFC_MAX_SYMBOL_LEN + sizeof("intrinsic '' operator")];
2242 347654 : int i;
2243 :
2244 347654 : old_ns = gfc_current_ns;
2245 347654 : gfc_current_ns = ns;
2246 :
2247 347654 : gfc_traverse_ns (ns, check_sym_interfaces);
2248 :
2249 347654 : gfc_traverse_user_op (ns, check_uop_interfaces);
2250 :
2251 10081898 : for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
2252 : {
2253 9734247 : if (i == INTRINSIC_USER)
2254 347651 : continue;
2255 :
2256 9386596 : if (i == INTRINSIC_ASSIGN)
2257 347651 : strcpy (interface_name, "intrinsic assignment operator");
2258 : else
2259 9038945 : sprintf (interface_name, "intrinsic '%s' operator",
2260 : gfc_op2string ((gfc_intrinsic_op) i));
2261 :
2262 9386596 : if (check_interface0 (ns->op[i], interface_name))
2263 0 : continue;
2264 :
2265 9386596 : if (ns->op[i])
2266 2472 : gfc_check_operator_interface (ns->op[i]->sym, (gfc_intrinsic_op) i,
2267 : ns->op[i]->where);
2268 :
2269 21205619 : for (ns2 = ns; ns2; ns2 = ns2->parent)
2270 : {
2271 11819026 : gfc_intrinsic_op other_op;
2272 :
2273 11819026 : if (check_interface1 (ns->op[i], ns2->op[i], 0,
2274 : interface_name, true))
2275 3 : goto done;
2276 :
2277 : /* i should be gfc_intrinsic_op, but has to be int with this cast
2278 : here for stupid C++ compatibility rules. */
2279 11819023 : other_op = gfc_equivalent_op ((gfc_intrinsic_op) i);
2280 11819023 : if (other_op != INTRINSIC_NONE
2281 11819023 : && check_interface1 (ns->op[i], ns2->op[other_op],
2282 : 0, interface_name, true))
2283 0 : goto done;
2284 : }
2285 : }
2286 :
2287 347651 : done:
2288 347654 : gfc_current_ns = old_ns;
2289 347654 : }
2290 :
2291 :
2292 : /* Given a symbol of a formal argument list and an expression, if the
2293 : formal argument is allocatable, check that the actual argument is
2294 : allocatable. Returns true if compatible, zero if not compatible. */
2295 :
2296 : static bool
2297 256643 : compare_allocatable (gfc_symbol *formal, gfc_expr *actual)
2298 : {
2299 256643 : if (formal->attr.allocatable
2300 253537 : || (formal->ts.type == BT_CLASS && CLASS_DATA (formal)->attr.allocatable))
2301 : {
2302 3980 : symbol_attribute attr = gfc_expr_attr (actual);
2303 3980 : if (actual->ts.type == BT_CLASS && !attr.class_ok)
2304 23 : return true;
2305 3966 : else if (!attr.allocatable)
2306 : return false;
2307 : }
2308 :
2309 : return true;
2310 : }
2311 :
2312 :
2313 : /* Given a symbol of a formal argument list and an expression, if the
2314 : formal argument is a pointer, see if the actual argument is a
2315 : pointer. Returns nonzero if compatible, zero if not compatible. */
2316 :
2317 : static int
2318 256664 : compare_pointer (gfc_symbol *formal, gfc_expr *actual)
2319 : {
2320 256664 : symbol_attribute attr;
2321 :
2322 256664 : if (formal->attr.pointer
2323 251861 : || (formal->ts.type == BT_CLASS && CLASS_DATA (formal)
2324 14202 : && CLASS_DATA (formal)->attr.class_pointer))
2325 : {
2326 5743 : attr = gfc_expr_attr (actual);
2327 :
2328 : /* Fortran 2008 allows non-pointer actual arguments. */
2329 5743 : if (!attr.pointer && attr.target && formal->attr.intent == INTENT_IN)
2330 : return 2;
2331 :
2332 5356 : if (!attr.pointer)
2333 : return 0;
2334 : }
2335 :
2336 : return 1;
2337 : }
2338 :
2339 :
2340 : /* Emit clear error messages for rank mismatch. */
2341 :
2342 : static void
2343 153 : argument_rank_mismatch (const char *name, locus *where,
2344 : int rank1, int rank2, locus *where_formal)
2345 : {
2346 :
2347 : /* TS 29113, C407b. */
2348 153 : if (where_formal == NULL)
2349 : {
2350 143 : if (rank2 == -1)
2351 10 : gfc_error ("The assumed-rank array at %L requires that the dummy "
2352 : "argument %qs has assumed-rank", where, name);
2353 133 : else if (rank1 == 0)
2354 22 : gfc_error_opt (0, "Rank mismatch in argument %qs "
2355 : "at %L (scalar and rank-%d)", name, where, rank2);
2356 111 : else if (rank2 == 0)
2357 104 : gfc_error_opt (0, "Rank mismatch in argument %qs "
2358 : "at %L (rank-%d and scalar)", name, where, rank1);
2359 : else
2360 7 : gfc_error_opt (0, "Rank mismatch in argument %qs "
2361 : "at %L (rank-%d and rank-%d)", name, where, rank1,
2362 : rank2);
2363 : }
2364 : else
2365 : {
2366 10 : if (rank2 == -1)
2367 : /* This is an assumed rank-actual passed to a function without
2368 : an explicit interface, which is already diagnosed in
2369 : gfc_procedure_use. */
2370 : return;
2371 8 : if (rank1 == 0)
2372 6 : gfc_error_opt (0, "Rank mismatch between actual argument at %L "
2373 : "and actual argument at %L (scalar and rank-%d)",
2374 : where, where_formal, rank2);
2375 2 : else if (rank2 == 0)
2376 2 : gfc_error_opt (0, "Rank mismatch between actual argument at %L "
2377 : "and actual argument at %L (rank-%d and scalar)",
2378 : where, where_formal, rank1);
2379 : else
2380 0 : gfc_error_opt (0, "Rank mismatch between actual argument at %L "
2381 : "and actual argument at %L (rank-%d and rank-%d)", where,
2382 : where_formal, rank1, rank2);
2383 : }
2384 : }
2385 :
2386 :
2387 : /* Under certain conditions, a scalar actual argument can be passed
2388 : to an array dummy argument - see F2018, 15.5.2.4, paragraph 14.
2389 : This function returns true for these conditions so that an error
2390 : or warning for this can be suppressed later. Always return false
2391 : for expressions with rank > 0. */
2392 :
2393 : bool
2394 3069 : maybe_dummy_array_arg (gfc_expr *e)
2395 : {
2396 3069 : gfc_symbol *s;
2397 3069 : gfc_ref *ref;
2398 3069 : bool array_pointer = false;
2399 3069 : bool assumed_shape = false;
2400 3069 : bool scalar_ref = true;
2401 :
2402 3069 : if (e->rank > 0)
2403 : return false;
2404 :
2405 3063 : if (e->ts.type == BT_CHARACTER && e->ts.kind == 1)
2406 : return true;
2407 :
2408 : /* If this comes from a constructor, it has been an array element
2409 : originally. */
2410 :
2411 2914 : if (e->expr_type == EXPR_CONSTANT)
2412 687 : return e->from_constructor;
2413 :
2414 2227 : if (e->expr_type != EXPR_VARIABLE)
2415 : return false;
2416 :
2417 2119 : s = e->symtree->n.sym;
2418 :
2419 2119 : if (s->attr.dimension)
2420 : {
2421 235 : scalar_ref = false;
2422 235 : array_pointer = s->attr.pointer;
2423 : }
2424 :
2425 2119 : if (s->as && s->as->type == AS_ASSUMED_SHAPE)
2426 2119 : assumed_shape = true;
2427 :
2428 2383 : for (ref=e->ref; ref; ref=ref->next)
2429 : {
2430 264 : if (ref->type == REF_COMPONENT)
2431 : {
2432 20 : symbol_attribute *attr;
2433 20 : attr = &ref->u.c.component->attr;
2434 20 : if (attr->dimension)
2435 : {
2436 2 : array_pointer = attr->pointer;
2437 2 : assumed_shape = false;
2438 2 : scalar_ref = false;
2439 : }
2440 : else
2441 : scalar_ref = true;
2442 : }
2443 : }
2444 :
2445 2119 : return !(scalar_ref || array_pointer || assumed_shape);
2446 : }
2447 :
2448 : /* Given a symbol of a formal argument list and an expression, see if
2449 : the two are compatible as arguments. Returns true if
2450 : compatible, false if not compatible. */
2451 :
2452 : static bool
2453 363847 : compare_parameter (gfc_symbol *formal, gfc_expr *actual,
2454 : int ranks_must_agree, int is_elemental, locus *where)
2455 : {
2456 363847 : gfc_ref *ref;
2457 363847 : bool rank_check, is_pointer;
2458 363847 : char err[200];
2459 363847 : gfc_component *ppc;
2460 363847 : bool codimension = false;
2461 363847 : gfc_array_spec *formal_as;
2462 363847 : const char *actual_name;
2463 :
2464 : /* If the formal arg has type BT_VOID, it's to one of the iso_c_binding
2465 : procs c_f_pointer or c_f_procpointer, and we need to accept most
2466 : pointers the user could give us. This should allow that. */
2467 363847 : if (formal->ts.type == BT_VOID)
2468 : return true;
2469 :
2470 363847 : if (formal->ts.type == BT_DERIVED
2471 29880 : && formal->ts.u.derived && formal->ts.u.derived->ts.is_iso_c
2472 4406 : && actual->ts.type == BT_DERIVED
2473 4396 : && actual->ts.u.derived && actual->ts.u.derived->ts.is_iso_c)
2474 : {
2475 4396 : if (formal->ts.u.derived->intmod_sym_id
2476 4396 : != actual->ts.u.derived->intmod_sym_id)
2477 : return false;
2478 :
2479 4295 : if (ranks_must_agree
2480 136 : && gfc_symbol_rank (formal) != actual->rank
2481 4355 : && gfc_symbol_rank (formal) != -1)
2482 : {
2483 42 : if (where)
2484 0 : argument_rank_mismatch (formal->name, &actual->where,
2485 : gfc_symbol_rank (formal), actual->rank,
2486 : NULL);
2487 42 : return false;
2488 : }
2489 4253 : return true;
2490 : }
2491 :
2492 359451 : if (formal->ts.type == BT_CLASS && actual->ts.type == BT_DERIVED)
2493 : /* Make sure the vtab symbol is present when
2494 : the module variables are generated. */
2495 7433 : gfc_find_derived_vtab (actual->ts.u.derived);
2496 :
2497 359451 : if (actual->ts.type == BT_PROCEDURE)
2498 : {
2499 1991 : gfc_symbol *act_sym = actual->symtree->n.sym;
2500 :
2501 1991 : if (formal->attr.flavor != FL_PROCEDURE && !act_sym->ts.interface)
2502 : {
2503 4 : if (where)
2504 2 : gfc_error ("Invalid procedure argument at %L", &actual->where);
2505 4 : return false;
2506 : }
2507 1987 : else if (act_sym->ts.interface
2508 1987 : && !gfc_compare_interfaces (formal, act_sym->ts.interface,
2509 : act_sym->name, 0, 1, err,
2510 : sizeof(err),NULL, NULL))
2511 : {
2512 1 : if (where)
2513 : {
2514 : /* Artificially generated symbol names would only confuse. */
2515 1 : if (formal->attr.artificial)
2516 0 : gfc_error_opt (0, "Interface mismatch in dummy procedure "
2517 : "at %L conflicts with %L: %s", &actual->where,
2518 : &formal->declared_at, err);
2519 : else
2520 1 : gfc_error_opt (0, "Interface mismatch in dummy procedure %qs "
2521 : "at %L: %s", formal->name, &actual->where, err);
2522 : }
2523 1 : return false;
2524 : }
2525 :
2526 1986 : if (!gfc_compare_interfaces (formal, act_sym, act_sym->name, 0, 1, err,
2527 : sizeof(err), NULL, NULL))
2528 : {
2529 40 : if (where)
2530 : {
2531 40 : if (formal->attr.artificial)
2532 1 : gfc_error_opt (0, "Interface mismatch in dummy procedure "
2533 : "at %L conflicts with %L: %s", &actual->where,
2534 : &formal->declared_at, err);
2535 : else
2536 39 : gfc_error_opt (0, "Interface mismatch in dummy procedure %qs at "
2537 : "%L: %s", formal->name, &actual->where, err);
2538 :
2539 : }
2540 40 : return false;
2541 : }
2542 :
2543 : /* The actual symbol may disagree with a global symbol. If so, issue an
2544 : error, but only if no previous error has been reported on the formal
2545 : argument. */
2546 1946 : actual_name = act_sym->name;
2547 1946 : if (!formal->error && actual_name)
2548 : {
2549 1946 : gfc_gsymbol *gsym;
2550 1946 : gsym = gfc_find_gsymbol (gfc_gsym_root, actual_name);
2551 1946 : if (gsym != NULL)
2552 : {
2553 180 : if (gsym->type == GSYM_SUBROUTINE && formal->attr.function)
2554 : {
2555 1 : gfc_error ("Passing global subroutine %qs declared at %L "
2556 : "as function at %L", actual_name, &gsym->where,
2557 : &actual->where);
2558 1 : return false;
2559 : }
2560 179 : if (gsym->type == GSYM_FUNCTION && formal->attr.subroutine)
2561 : {
2562 1 : gfc_error ("Passing global function %qs declared at %L "
2563 : "as subroutine at %L", actual_name, &gsym->where,
2564 : &actual->where);
2565 1 : return false;
2566 : }
2567 178 : if (gsym->type == GSYM_FUNCTION)
2568 : {
2569 99 : gfc_symbol *global_asym;
2570 99 : gfc_find_symbol (actual_name, gsym->ns, 0, &global_asym);
2571 99 : if (global_asym != NULL)
2572 : {
2573 99 : if (formal->attr.subroutine)
2574 : {
2575 0 : gfc_error ("Mismatch between subroutine and "
2576 : "function at %L", &actual->where);
2577 1 : return false;
2578 : }
2579 99 : else if (formal->attr.function)
2580 : {
2581 98 : gfc_typespec ts;
2582 :
2583 98 : if (global_asym->result)
2584 97 : ts = global_asym->result->ts;
2585 : else
2586 1 : ts = global_asym->ts;
2587 :
2588 98 : if (!gfc_compare_types (&ts,
2589 : &formal->ts))
2590 : {
2591 2 : gfc_error ("Type mismatch at %L passing global "
2592 : "function %qs declared at %L (%s/%s)",
2593 : &actual->where, actual_name,
2594 : &gsym->where,
2595 1 : gfc_typename (&global_asym->ts),
2596 : gfc_dummy_typename (&formal->ts));
2597 1 : return false;
2598 : }
2599 : }
2600 : else
2601 : {
2602 : /* The global symbol is a function. Set the formal
2603 : argument accordingly. */
2604 1 : formal->attr.function = 1;
2605 1 : formal->ts = global_asym->ts;
2606 : }
2607 : }
2608 : }
2609 : }
2610 : }
2611 :
2612 1943 : if (formal->attr.function && !act_sym->attr.function)
2613 : {
2614 5 : gfc_add_function (&act_sym->attr, act_sym->name,
2615 : &act_sym->declared_at);
2616 5 : if (act_sym->ts.type == BT_UNKNOWN
2617 5 : && !gfc_set_default_type (act_sym, 1, act_sym->ns))
2618 : return false;
2619 : }
2620 1938 : else if (formal->attr.subroutine && !act_sym->attr.subroutine)
2621 50 : gfc_add_subroutine (&act_sym->attr, act_sym->name,
2622 : &act_sym->declared_at);
2623 :
2624 1943 : return true;
2625 : }
2626 357460 : ppc = gfc_get_proc_ptr_comp (actual);
2627 357460 : if (ppc && ppc->ts.interface)
2628 : {
2629 496 : if (!gfc_compare_interfaces (formal, ppc->ts.interface, ppc->name, 0, 1,
2630 : err, sizeof(err), NULL, NULL))
2631 : {
2632 2 : if (where)
2633 2 : gfc_error_opt (0, "Interface mismatch in dummy procedure %qs at %L:"
2634 : " %s", formal->name, &actual->where, err);
2635 2 : return false;
2636 : }
2637 : }
2638 :
2639 : /* F2008, C1241. */
2640 5318 : if (formal->attr.pointer && formal->attr.contiguous
2641 357493 : && !gfc_is_simply_contiguous (actual, true, false))
2642 : {
2643 4 : if (where)
2644 4 : gfc_error ("Actual argument to contiguous pointer dummy %qs at %L "
2645 : "must be simply contiguous", formal->name, &actual->where);
2646 4 : return false;
2647 : }
2648 :
2649 357454 : symbol_attribute actual_attr = gfc_expr_attr (actual);
2650 357454 : if (actual->ts.type == BT_CLASS && !actual_attr.class_ok)
2651 : return true;
2652 :
2653 807 : if ((actual->expr_type != EXPR_NULL || actual->ts.type != BT_UNKNOWN)
2654 357139 : && actual->ts.type != BT_HOLLERITH
2655 357120 : && formal->ts.type != BT_ASSUMED
2656 353653 : && !(formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
2657 353653 : && !gfc_compare_types (&formal->ts, &actual->ts)
2658 463155 : && !(formal->ts.type == BT_DERIVED && actual->ts.type == BT_CLASS
2659 2 : && gfc_compare_derived_types (formal->ts.u.derived,
2660 2 : CLASS_DATA (actual)->ts.u.derived)))
2661 : {
2662 105756 : if (where)
2663 : {
2664 68 : if (formal->attr.artificial)
2665 : {
2666 19 : if (!flag_allow_argument_mismatch || !formal->error)
2667 14 : gfc_error_opt (0, "Type mismatch between actual argument at %L "
2668 : "and actual argument at %L (%s/%s).",
2669 : &actual->where,
2670 : &formal->declared_at,
2671 : gfc_typename (actual),
2672 : gfc_dummy_typename (&formal->ts));
2673 :
2674 19 : formal->error = 1;
2675 : }
2676 : else
2677 49 : gfc_error_opt (0, "Type mismatch in argument %qs at %L; passed %s "
2678 : "to %s", formal->name, where, gfc_typename (actual),
2679 : gfc_dummy_typename (&formal->ts));
2680 : }
2681 105756 : return false;
2682 : }
2683 :
2684 251641 : if (actual->ts.type == BT_ASSUMED && formal->ts.type != BT_ASSUMED)
2685 : {
2686 3 : if (where)
2687 1 : gfc_error ("Assumed-type actual argument at %L requires that dummy "
2688 : "argument %qs is of assumed type", &actual->where,
2689 : formal->name);
2690 3 : return false;
2691 : }
2692 :
2693 : /* TS29113 C407c; F2018 C711. */
2694 251638 : if (actual->ts.type == BT_ASSUMED
2695 326 : && gfc_symbol_rank (formal) == -1
2696 27 : && actual->rank != -1
2697 251645 : && !(actual->symtree->n.sym->as
2698 5 : && actual->symtree->n.sym->as->type == AS_ASSUMED_SHAPE))
2699 : {
2700 4 : if (where)
2701 4 : gfc_error ("Assumed-type actual argument at %L corresponding to "
2702 : "assumed-rank dummy argument %qs must be "
2703 : "assumed-shape or assumed-rank",
2704 : &actual->where, formal->name);
2705 4 : return false;
2706 : }
2707 :
2708 : /* F2008, 12.5.2.5; IR F08/0073. */
2709 251634 : if (formal->ts.type == BT_CLASS && formal->attr.class_ok
2710 14196 : && actual->expr_type != EXPR_NULL
2711 14196 : && ((CLASS_DATA (formal)->attr.class_pointer
2712 917 : && formal->attr.intent != INTENT_IN)
2713 13944 : || CLASS_DATA (formal)->attr.allocatable))
2714 : {
2715 1114 : if (actual->ts.type != BT_CLASS)
2716 : {
2717 2 : if (where)
2718 2 : gfc_error ("Actual argument to %qs at %L must be polymorphic",
2719 : formal->name, &actual->where);
2720 2 : return false;
2721 : }
2722 :
2723 1112 : if ((!UNLIMITED_POLY (formal) || !UNLIMITED_POLY(actual))
2724 769 : && !gfc_compare_derived_types (CLASS_DATA (actual)->ts.u.derived,
2725 769 : CLASS_DATA (formal)->ts.u.derived))
2726 : {
2727 1 : if (where)
2728 1 : gfc_error ("Actual argument to %qs at %L must have the same "
2729 : "declared type", formal->name, &actual->where);
2730 1 : return false;
2731 : }
2732 : }
2733 :
2734 : /* F08: 12.5.2.5 Allocatable and pointer dummy variables. However, this
2735 : is necessary also for F03, so retain error for both.
2736 : NOTE: Other type/kind errors pre-empt this error. Since they are F03
2737 : compatible, no attempt has been made to channel to this one. */
2738 251631 : if (UNLIMITED_POLY (formal) && !UNLIMITED_POLY (actual)
2739 1616 : && (CLASS_DATA (formal)->attr.allocatable
2740 1616 : ||CLASS_DATA (formal)->attr.class_pointer))
2741 : {
2742 0 : if (where)
2743 0 : gfc_error ("Actual argument to %qs at %L must be unlimited "
2744 : "polymorphic since the formal argument is a "
2745 : "pointer or allocatable unlimited polymorphic "
2746 : "entity [F2008: 12.5.2.5]", formal->name,
2747 : &actual->where);
2748 0 : return false;
2749 : }
2750 :
2751 251631 : if (formal->ts.type == BT_CLASS && formal->attr.class_ok)
2752 14193 : codimension = CLASS_DATA (formal)->attr.codimension;
2753 : else
2754 237438 : codimension = formal->attr.codimension;
2755 :
2756 251631 : if (codimension && !gfc_is_coarray (actual))
2757 : {
2758 4 : if (where)
2759 4 : gfc_error ("Actual argument to %qs at %L must be a coarray",
2760 : formal->name, &actual->where);
2761 4 : return false;
2762 : }
2763 :
2764 237435 : formal_as = (formal->ts.type == BT_CLASS
2765 251627 : ? CLASS_DATA (formal)->as : formal->as);
2766 :
2767 251627 : if (codimension && formal->attr.allocatable)
2768 : {
2769 27 : gfc_ref *last = NULL;
2770 :
2771 54 : for (ref = actual->ref; ref; ref = ref->next)
2772 27 : if (ref->type == REF_COMPONENT)
2773 0 : last = ref;
2774 :
2775 : /* F2008, 12.5.2.6. */
2776 27 : if ((last && last->u.c.component->as->corank != formal->as->corank)
2777 : || (!last
2778 27 : && actual->symtree->n.sym->as->corank != formal->as->corank))
2779 : {
2780 1 : if (where)
2781 1 : gfc_error ("Corank mismatch in argument %qs at %L (%d and %d)",
2782 1 : formal->name, &actual->where, formal->as->corank,
2783 0 : last ? last->u.c.component->as->corank
2784 1 : : actual->symtree->n.sym->as->corank);
2785 1 : return false;
2786 : }
2787 : }
2788 :
2789 417 : if (codimension)
2790 : {
2791 : /* F2008, 12.5.2.8 + Corrig 2 (IR F08/0048). */
2792 : /* F2018, 12.5.2.8. */
2793 417 : if (formal->attr.dimension
2794 162 : && (formal->attr.contiguous || formal->as->type != AS_ASSUMED_SHAPE)
2795 103 : && actual_attr.dimension
2796 519 : && !gfc_is_simply_contiguous (actual, true, true))
2797 : {
2798 2 : if (where)
2799 2 : gfc_error ("Actual argument to %qs at %L must be simply "
2800 : "contiguous or an element of such an array",
2801 : formal->name, &actual->where);
2802 2 : return false;
2803 : }
2804 :
2805 : /* F2008, C1303 and C1304. */
2806 415 : if (formal->attr.intent != INTENT_INOUT
2807 406 : && (((formal->ts.type == BT_DERIVED || formal->ts.type == BT_CLASS)
2808 203 : && formal->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
2809 1 : && formal->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
2810 405 : || formal->attr.lock_comp))
2811 :
2812 : {
2813 1 : if (where)
2814 1 : gfc_error ("Actual argument to non-INTENT(INOUT) dummy %qs at %L, "
2815 : "which is LOCK_TYPE or has a LOCK_TYPE component",
2816 : formal->name, &actual->where);
2817 1 : return false;
2818 : }
2819 :
2820 : /* TS18508, C702/C703. */
2821 414 : if (formal->attr.intent != INTENT_INOUT
2822 405 : && (((formal->ts.type == BT_DERIVED || formal->ts.type == BT_CLASS)
2823 202 : && formal->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
2824 0 : && formal->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
2825 405 : || formal->attr.event_comp))
2826 :
2827 : {
2828 0 : if (where)
2829 0 : gfc_error ("Actual argument to non-INTENT(INOUT) dummy %qs at %L, "
2830 : "which is EVENT_TYPE or has a EVENT_TYPE component",
2831 : formal->name, &actual->where);
2832 0 : return false;
2833 : }
2834 : }
2835 :
2836 : /* F2008, C1239/C1240. */
2837 251623 : if (actual->expr_type == EXPR_VARIABLE
2838 103757 : && (actual->symtree->n.sym->attr.asynchronous
2839 103720 : || actual->symtree->n.sym->attr.volatile_)
2840 3284 : && (formal->attr.asynchronous || formal->attr.volatile_)
2841 75 : && actual->rank && formal->as
2842 70 : && !gfc_is_simply_contiguous (actual, true, false)
2843 251671 : && ((formal->as->type != AS_ASSUMED_SHAPE
2844 19 : && formal->as->type != AS_ASSUMED_RANK && !formal->attr.pointer)
2845 37 : || formal->attr.contiguous))
2846 : {
2847 22 : if (where)
2848 22 : gfc_error ("Dummy argument %qs has to be a pointer, assumed-shape or "
2849 : "assumed-rank array without CONTIGUOUS attribute - as actual"
2850 : " argument at %L is not simply contiguous and both are "
2851 : "ASYNCHRONOUS or VOLATILE", formal->name, &actual->where);
2852 22 : return false;
2853 : }
2854 :
2855 251601 : if (formal->attr.allocatable && !codimension
2856 3184 : && actual_attr.codimension)
2857 : {
2858 5 : if (formal->attr.intent == INTENT_OUT)
2859 : {
2860 1 : if (where)
2861 1 : gfc_error ("Passing coarray at %L to allocatable, noncoarray, "
2862 : "INTENT(OUT) dummy argument %qs", &actual->where,
2863 : formal->name);
2864 1 : return false;
2865 : }
2866 4 : else if (warn_surprising && where && formal->attr.intent != INTENT_IN)
2867 1 : gfc_warning (OPT_Wsurprising,
2868 : "Passing coarray at %L to allocatable, noncoarray dummy "
2869 : "argument %qs, which is invalid if the allocation status"
2870 : " is modified", &actual->where, formal->name);
2871 : }
2872 :
2873 : /* If the rank is the same or the formal argument has assumed-rank. */
2874 251600 : if (gfc_symbol_rank (formal) == actual->rank || gfc_symbol_rank (formal) == -1)
2875 243499 : return true;
2876 :
2877 1818 : rank_check = where != NULL && !is_elemental && formal_as
2878 1785 : && (formal_as->type == AS_ASSUMED_SHAPE
2879 1785 : || formal_as->type == AS_DEFERRED)
2880 8252 : && !(actual->expr_type == EXPR_NULL
2881 86 : && actual->ts.type == BT_UNKNOWN);
2882 :
2883 : /* Skip rank checks for NO_ARG_CHECK. */
2884 8101 : if (formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
2885 : return true;
2886 :
2887 : /* Scalar & coindexed, see: F2008, Section 12.5.2.4. */
2888 7763 : if (rank_check || ranks_must_agree
2889 7605 : || (formal->attr.pointer && actual->expr_type != EXPR_NULL)
2890 7605 : || (actual->rank != 0
2891 6814 : && !(is_elemental || formal->attr.dimension
2892 118 : || (formal->ts.type == BT_CLASS
2893 85 : && CLASS_DATA (formal)->attr.dimension)))
2894 7572 : || (actual->rank == 0
2895 791 : && ((formal->ts.type == BT_CLASS
2896 1 : && CLASS_DATA (formal)->as->type == AS_ASSUMED_SHAPE)
2897 791 : || (formal->ts.type != BT_CLASS
2898 790 : && formal->as->type == AS_ASSUMED_SHAPE))
2899 13 : && actual->expr_type != EXPR_NULL)
2900 7572 : || (actual->rank == 0
2901 791 : && (formal->attr.dimension
2902 1 : || (formal->ts.type == BT_CLASS
2903 1 : && CLASS_DATA (formal)->attr.dimension))
2904 791 : && gfc_is_coindexed (actual))
2905 : /* Assumed-rank actual argument; F2018 C838. */
2906 15332 : || actual->rank == -1)
2907 : {
2908 199 : if (where
2909 199 : && (!formal->attr.artificial || (!formal->maybe_array
2910 8 : && !maybe_dummy_array_arg (actual))))
2911 : {
2912 104 : locus *where_formal;
2913 104 : if (formal->attr.artificial)
2914 8 : where_formal = &formal->declared_at;
2915 : else
2916 : where_formal = NULL;
2917 :
2918 104 : argument_rank_mismatch (formal->name, &actual->where,
2919 : gfc_symbol_rank (formal), actual->rank,
2920 : where_formal);
2921 : }
2922 199 : return false;
2923 : }
2924 7564 : else if (actual->rank != 0
2925 6776 : && (is_elemental || formal->attr.dimension
2926 85 : || (formal->ts.type == BT_CLASS
2927 85 : && CLASS_DATA (formal)->attr.dimension)))
2928 : return true;
2929 :
2930 : /* At this point, we are considering a scalar passed to an array. This
2931 : is valid (cf. F95 12.4.1.1, F2003 12.4.1.2, and F2008 12.5.2.4),
2932 : - if the actual argument is (a substring of) an element of a
2933 : non-assumed-shape/non-pointer/non-polymorphic array; or
2934 : - (F2003) if the actual argument is of type character of default/c_char
2935 : kind.
2936 : - (F2018) if the dummy argument is type(*). */
2937 :
2938 1576 : is_pointer = actual->expr_type == EXPR_VARIABLE
2939 788 : ? actual->symtree->n.sym->attr.pointer : false;
2940 :
2941 811 : for (ref = actual->ref; ref; ref = ref->next)
2942 : {
2943 439 : if (ref->type == REF_COMPONENT)
2944 12 : is_pointer = ref->u.c.component->attr.pointer;
2945 427 : else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT
2946 420 : && ref->u.ar.dimen > 0
2947 417 : && (!ref->next
2948 9 : || (ref->next->type == REF_SUBSTRING && !ref->next->next)))
2949 : break;
2950 : }
2951 :
2952 788 : if (actual->ts.type == BT_CLASS && actual->expr_type != EXPR_NULL)
2953 : {
2954 0 : if (where)
2955 0 : gfc_error ("Polymorphic scalar passed to array dummy argument %qs "
2956 : "at %L", formal->name, &actual->where);
2957 0 : return false;
2958 : }
2959 :
2960 788 : if (actual->expr_type != EXPR_NULL && ref && actual->ts.type != BT_CHARACTER
2961 367 : && (is_pointer || ref->u.ar.as->type == AS_ASSUMED_SHAPE))
2962 : {
2963 10 : if (where)
2964 : {
2965 10 : if (formal->attr.artificial)
2966 3 : gfc_error ("Element of assumed-shape or pointer array "
2967 : "as actual argument at %L cannot correspond to "
2968 : "actual argument at %L",
2969 : &actual->where, &formal->declared_at);
2970 : else
2971 7 : gfc_error ("Element of assumed-shape or pointer "
2972 : "array passed to array dummy argument %qs at %L",
2973 : formal->name, &actual->where);
2974 : }
2975 10 : return false;
2976 : }
2977 :
2978 778 : if (actual->ts.type == BT_CHARACTER && actual->expr_type != EXPR_NULL
2979 280 : && (!ref || is_pointer || ref->u.ar.as->type == AS_ASSUMED_SHAPE))
2980 : {
2981 263 : if (formal->ts.kind != 1 && (gfc_option.allow_std & GFC_STD_GNU) == 0)
2982 : {
2983 0 : if (where)
2984 0 : gfc_error ("Extension: Scalar non-default-kind, non-C_CHAR-kind "
2985 : "CHARACTER actual argument with array dummy argument "
2986 : "%qs at %L", formal->name, &actual->where);
2987 0 : return false;
2988 : }
2989 :
2990 263 : if (where && (gfc_option.allow_std & GFC_STD_F2003) == 0)
2991 : {
2992 50 : gfc_error ("Fortran 2003: Scalar CHARACTER actual argument with "
2993 : "array dummy argument %qs at %L",
2994 : formal->name, &actual->where);
2995 50 : return false;
2996 : }
2997 : else
2998 213 : return ((gfc_option.allow_std & GFC_STD_F2003) != 0);
2999 : }
3000 :
3001 498 : if (ref == NULL && actual->expr_type != EXPR_NULL)
3002 : {
3003 53 : if (actual->rank == 0
3004 53 : && formal->ts.type == BT_ASSUMED
3005 3 : && formal->as
3006 3 : && formal->as->type == AS_ASSUMED_SIZE)
3007 : /* This is new in F2018, type(*) is new in TS29113, but gfortran does
3008 : not differentiate. Thus, if type(*) exists, it is valid;
3009 : otherwise, type(*) is already rejected. */
3010 : return true;
3011 50 : if (where
3012 50 : && (!formal->attr.artificial || (!formal->maybe_array
3013 3 : && !maybe_dummy_array_arg (actual))))
3014 : {
3015 49 : locus *where_formal;
3016 49 : if (formal->attr.artificial)
3017 2 : where_formal = &formal->declared_at;
3018 : else
3019 : where_formal = NULL;
3020 :
3021 49 : argument_rank_mismatch (formal->name, &actual->where,
3022 : gfc_symbol_rank (formal), actual->rank,
3023 : where_formal);
3024 : }
3025 50 : return false;
3026 : }
3027 :
3028 : return true;
3029 : }
3030 :
3031 :
3032 : /* Returns the storage size of a symbol (formal argument) or sets argument
3033 : size_known to false if it cannot be determined. */
3034 :
3035 : static unsigned long
3036 243051 : get_sym_storage_size (gfc_symbol *sym, bool *size_known)
3037 : {
3038 243051 : int i;
3039 243051 : unsigned long strlen, elements;
3040 :
3041 243051 : *size_known = false;
3042 :
3043 243051 : if (sym->ts.type == BT_CHARACTER)
3044 : {
3045 33615 : if (sym->ts.u.cl && sym->ts.u.cl->length
3046 7170 : && sym->ts.u.cl->length->expr_type == EXPR_CONSTANT
3047 6183 : && sym->ts.u.cl->length->ts.type == BT_INTEGER)
3048 6181 : strlen = mpz_get_ui (sym->ts.u.cl->length->value.integer);
3049 : else
3050 : return 0;
3051 : }
3052 : else
3053 : strlen = 1;
3054 :
3055 215617 : if (gfc_symbol_rank (sym) == 0)
3056 : {
3057 182487 : *size_known = true;
3058 182487 : return strlen;
3059 : }
3060 :
3061 33130 : elements = 1;
3062 33130 : if (sym->as->type != AS_EXPLICIT)
3063 : return 0;
3064 14724 : for (i = 0; i < sym->as->rank; i++)
3065 : {
3066 9702 : if (sym->as->upper[i]->expr_type != EXPR_CONSTANT
3067 6524 : || sym->as->lower[i]->expr_type != EXPR_CONSTANT
3068 6524 : || sym->as->upper[i]->ts.type != BT_INTEGER
3069 6523 : || sym->as->lower[i]->ts.type != BT_INTEGER)
3070 : return 0;
3071 :
3072 6521 : elements *= mpz_get_si (sym->as->upper[i]->value.integer)
3073 6521 : - mpz_get_si (sym->as->lower[i]->value.integer) + 1L;
3074 : }
3075 :
3076 5022 : *size_known = true;
3077 :
3078 5022 : return strlen*elements;
3079 : }
3080 :
3081 :
3082 : /* Returns the storage size of an expression (actual argument) or sets argument
3083 : size_known to false if it cannot be determined. For an array element, it
3084 : returns the remaining size as the element sequence consists of all storage
3085 : units of the actual argument up to the end of the array. */
3086 :
3087 : static unsigned long
3088 243051 : get_expr_storage_size (gfc_expr *e, bool *size_known, long int *charlen)
3089 : {
3090 243051 : int i;
3091 243051 : long int strlen, elements;
3092 243051 : long int substrlen = 0;
3093 243051 : bool is_str_storage = false;
3094 243051 : gfc_ref *ref;
3095 :
3096 243051 : *size_known = false;
3097 243051 : *charlen = -1;
3098 :
3099 243051 : if (e == NULL)
3100 : return 0;
3101 :
3102 243051 : if (e->ts.type == BT_CHARACTER)
3103 : {
3104 34008 : if (e->ts.u.cl && e->ts.u.cl->length
3105 11574 : && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
3106 10765 : && e->ts.u.cl->length->ts.type == BT_INTEGER)
3107 10764 : strlen = mpz_get_si (e->ts.u.cl->length->value.integer);
3108 23244 : else if (e->expr_type == EXPR_CONSTANT
3109 19545 : && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
3110 19545 : strlen = e->value.character.length;
3111 : else
3112 : return 0;
3113 30309 : *charlen = strlen;
3114 : }
3115 : else
3116 : strlen = 1; /* Length per element. */
3117 :
3118 239352 : if (e->rank == 0 && !e->ref)
3119 : {
3120 194529 : *size_known = true;
3121 194529 : return strlen;
3122 : }
3123 :
3124 44823 : elements = 1;
3125 44823 : if (!e->ref)
3126 : {
3127 6536 : if (!e->shape)
3128 : return 0;
3129 11853 : for (i = 0; i < e->rank; i++)
3130 6417 : elements *= mpz_get_si (e->shape[i]);
3131 5436 : {
3132 5436 : *size_known = true;
3133 5436 : return elements*strlen;
3134 : }
3135 : }
3136 :
3137 62860 : for (ref = e->ref; ref; ref = ref->next)
3138 : {
3139 39781 : if (ref->type == REF_SUBSTRING && ref->u.ss.start
3140 64 : && ref->u.ss.start->expr_type == EXPR_CONSTANT)
3141 : {
3142 58 : if (is_str_storage)
3143 : {
3144 : /* The string length is the substring length.
3145 : Set now to full string length. */
3146 5 : if (!ref->u.ss.length || !ref->u.ss.length->length
3147 4 : || ref->u.ss.length->length->expr_type != EXPR_CONSTANT)
3148 : return 0;
3149 :
3150 4 : strlen = mpz_get_ui (ref->u.ss.length->length->value.integer);
3151 : }
3152 57 : substrlen = strlen - mpz_get_ui (ref->u.ss.start->value.integer) + 1;
3153 57 : continue;
3154 : }
3155 :
3156 39723 : if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
3157 11470 : for (i = 0; i < ref->u.ar.dimen; i++)
3158 : {
3159 7056 : long int start, end, stride;
3160 7056 : stride = 1;
3161 :
3162 7056 : if (ref->u.ar.stride[i])
3163 : {
3164 2736 : if (ref->u.ar.stride[i]->expr_type == EXPR_CONSTANT
3165 2573 : && ref->u.ar.stride[i]->ts.type == BT_INTEGER)
3166 2573 : stride = mpz_get_si (ref->u.ar.stride[i]->value.integer);
3167 : else
3168 : return 0;
3169 : }
3170 :
3171 6893 : if (ref->u.ar.start[i])
3172 : {
3173 3995 : if (ref->u.ar.start[i]->expr_type == EXPR_CONSTANT
3174 3600 : && ref->u.ar.start[i]->ts.type == BT_INTEGER)
3175 3600 : start = mpz_get_si (ref->u.ar.start[i]->value.integer);
3176 : else
3177 : return 0;
3178 : }
3179 2898 : else if (ref->u.ar.as->lower[i]
3180 2602 : && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT
3181 2602 : && ref->u.ar.as->lower[i]->ts.type == BT_INTEGER)
3182 2602 : start = mpz_get_si (ref->u.ar.as->lower[i]->value.integer);
3183 : else
3184 : return 0;
3185 :
3186 6202 : if (ref->u.ar.end[i])
3187 : {
3188 4831 : if (ref->u.ar.end[i]->expr_type == EXPR_CONSTANT
3189 4712 : && ref->u.ar.end[i]->ts.type == BT_INTEGER)
3190 4712 : end = mpz_get_si (ref->u.ar.end[i]->value.integer);
3191 : else
3192 : return 0;
3193 : }
3194 1371 : else if (ref->u.ar.as->upper[i]
3195 1117 : && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT
3196 1083 : && ref->u.ar.as->upper[i]->ts.type == BT_INTEGER)
3197 1082 : end = mpz_get_si (ref->u.ar.as->upper[i]->value.integer);
3198 : else
3199 : return 0;
3200 :
3201 5794 : elements *= (end - start)/stride + 1L;
3202 : }
3203 34047 : else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_FULL)
3204 49238 : for (i = 0; i < ref->u.ar.as->rank; i++)
3205 : {
3206 33154 : if (ref->u.ar.as->lower[i] && ref->u.ar.as->upper[i]
3207 23291 : && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT
3208 23242 : && ref->u.ar.as->lower[i]->ts.type == BT_INTEGER
3209 23242 : && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT
3210 21612 : && ref->u.ar.as->upper[i]->ts.type == BT_INTEGER)
3211 21612 : elements *= mpz_get_si (ref->u.ar.as->upper[i]->value.integer)
3212 21612 : - mpz_get_si (ref->u.ar.as->lower[i]->value.integer)
3213 21612 : + 1L;
3214 : else
3215 : return 0;
3216 : }
3217 6421 : else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT
3218 4035 : && e->expr_type == EXPR_VARIABLE)
3219 : {
3220 4035 : if (ref->u.ar.as->type == AS_ASSUMED_SHAPE
3221 3860 : || e->symtree->n.sym->attr.pointer)
3222 : {
3223 216 : elements = 1;
3224 216 : continue;
3225 : }
3226 :
3227 : /* Determine the number of remaining elements in the element
3228 : sequence for array element designators. */
3229 3819 : is_str_storage = true;
3230 5334 : for (i = ref->u.ar.dimen - 1; i >= 0; i--)
3231 : {
3232 3917 : if (ref->u.ar.start[i] == NULL
3233 3917 : || ref->u.ar.start[i]->expr_type != EXPR_CONSTANT
3234 2113 : || ref->u.ar.as->upper[i] == NULL
3235 1542 : || ref->u.ar.as->lower[i] == NULL
3236 1542 : || ref->u.ar.as->upper[i]->expr_type != EXPR_CONSTANT
3237 1515 : || ref->u.ar.as->lower[i]->expr_type != EXPR_CONSTANT
3238 1515 : || ref->u.ar.as->upper[i]->ts.type != BT_INTEGER
3239 1515 : || ref->u.ar.as->lower[i]->ts.type != BT_INTEGER)
3240 : return 0;
3241 :
3242 1515 : elements
3243 1515 : = elements
3244 1515 : * (mpz_get_si (ref->u.ar.as->upper[i]->value.integer)
3245 1515 : - mpz_get_si (ref->u.ar.as->lower[i]->value.integer)
3246 1515 : + 1L)
3247 1515 : - (mpz_get_si (ref->u.ar.start[i]->value.integer)
3248 1515 : - mpz_get_si (ref->u.ar.as->lower[i]->value.integer));
3249 : }
3250 : }
3251 2386 : else if (ref->type == REF_COMPONENT && ref->u.c.component->attr.function
3252 91 : && ref->u.c.component->attr.proc_pointer
3253 91 : && ref->u.c.component->attr.dimension)
3254 : {
3255 : /* Array-valued procedure-pointer components. */
3256 8 : gfc_array_spec *as = ref->u.c.component->as;
3257 15 : for (i = 0; i < as->rank; i++)
3258 : {
3259 8 : if (!as->upper[i] || !as->lower[i]
3260 8 : || as->upper[i]->expr_type != EXPR_CONSTANT
3261 7 : || as->lower[i]->expr_type != EXPR_CONSTANT
3262 7 : || as->upper[i]->ts.type != BT_INTEGER
3263 7 : || as->lower[i]->ts.type != BT_INTEGER)
3264 : return 0;
3265 :
3266 7 : elements = elements
3267 7 : * (mpz_get_si (as->upper[i]->value.integer)
3268 7 : - mpz_get_si (as->lower[i]->value.integer) + 1L);
3269 : }
3270 : }
3271 : }
3272 :
3273 23079 : *size_known = true;
3274 :
3275 23079 : if (substrlen)
3276 51 : return (is_str_storage) ? substrlen + (elements-1)*strlen
3277 51 : : elements*strlen;
3278 : else
3279 23028 : return elements*strlen;
3280 : }
3281 :
3282 :
3283 : /* Given an expression, check whether it is an array section
3284 : which has a vector subscript. */
3285 :
3286 : bool
3287 14064 : gfc_has_vector_subscript (gfc_expr *e)
3288 : {
3289 14064 : int i;
3290 14064 : gfc_ref *ref;
3291 :
3292 14064 : if (e == NULL || e->rank == 0 || e->expr_type != EXPR_VARIABLE)
3293 : return false;
3294 :
3295 13381 : for (ref = e->ref; ref; ref = ref->next)
3296 7738 : if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
3297 1067 : for (i = 0; i < ref->u.ar.dimen; i++)
3298 635 : if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
3299 : return true;
3300 :
3301 : return false;
3302 : }
3303 :
3304 :
3305 : static bool
3306 27 : is_procptr_result (gfc_expr *expr)
3307 : {
3308 27 : gfc_component *c = gfc_get_proc_ptr_comp (expr);
3309 27 : if (c)
3310 2 : return (c->ts.interface && (c->ts.interface->attr.proc_pointer == 1));
3311 : else
3312 26 : return ((expr->symtree->n.sym->result != expr->symtree->n.sym)
3313 28 : && (expr->symtree->n.sym->result->attr.proc_pointer == 1));
3314 : }
3315 :
3316 :
3317 : /* Recursively append candidate argument ARG to CANDIDATES. Store the
3318 : number of total candidates in CANDIDATES_LEN. */
3319 :
3320 : static void
3321 1 : lookup_arg_fuzzy_find_candidates (gfc_formal_arglist *arg,
3322 : char **&candidates,
3323 : size_t &candidates_len)
3324 : {
3325 2 : for (gfc_formal_arglist *p = arg; p && p->sym; p = p->next)
3326 1 : vec_push (candidates, candidates_len, p->sym->name);
3327 1 : }
3328 :
3329 :
3330 : /* Lookup argument ARG fuzzily, taking names in ARGUMENTS into account. */
3331 :
3332 : static const char*
3333 1 : lookup_arg_fuzzy (const char *arg, gfc_formal_arglist *arguments)
3334 : {
3335 1 : char **candidates = NULL;
3336 1 : size_t candidates_len = 0;
3337 1 : lookup_arg_fuzzy_find_candidates (arguments, candidates, candidates_len);
3338 1 : return gfc_closest_fuzzy_match (arg, candidates);
3339 : }
3340 :
3341 :
3342 : static gfc_dummy_arg *
3343 369442 : get_nonintrinsic_dummy_arg (gfc_formal_arglist *formal)
3344 : {
3345 0 : gfc_dummy_arg * const dummy_arg = gfc_get_dummy_arg ();
3346 :
3347 369442 : dummy_arg->intrinsicness = GFC_NON_INTRINSIC_DUMMY_ARG;
3348 369442 : dummy_arg->u.non_intrinsic = formal;
3349 :
3350 369442 : return dummy_arg;
3351 : }
3352 :
3353 :
3354 : /* Given formal and actual argument lists, see if they are compatible.
3355 : If they are compatible, the actual argument list is sorted to
3356 : correspond with the formal list, and elements for missing optional
3357 : arguments are inserted. If WHERE pointer is nonnull, then we issue
3358 : errors when things don't match instead of just returning the status
3359 : code. */
3360 :
3361 : bool
3362 195765 : gfc_compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
3363 : int ranks_must_agree, int is_elemental,
3364 : bool in_statement_function, locus *where)
3365 : {
3366 195765 : gfc_actual_arglist **new_arg, *a, *actual;
3367 195765 : gfc_formal_arglist *f;
3368 195765 : int i, n, na;
3369 195765 : unsigned long actual_size, formal_size;
3370 195765 : long int charlen;
3371 195765 : bool full_array = false;
3372 195765 : gfc_array_ref *actual_arr_ref;
3373 195765 : gfc_array_spec *fas, *aas;
3374 195765 : bool pointer_dummy, pointer_arg, allocatable_arg;
3375 195765 : bool procptr_dummy, optional_dummy, allocatable_dummy;
3376 195765 : bool actual_size_known = false;
3377 195765 : bool formal_size_known = false;
3378 195765 : bool ok = true;
3379 :
3380 195765 : actual = *ap;
3381 :
3382 195765 : if (actual == NULL && formal == NULL)
3383 : return true;
3384 :
3385 : n = 0;
3386 547868 : for (f = formal; f; f = f->next)
3387 369859 : n++;
3388 :
3389 178009 : new_arg = XALLOCAVEC (gfc_actual_arglist *, n);
3390 :
3391 547868 : for (i = 0; i < n; i++)
3392 369859 : new_arg[i] = NULL;
3393 :
3394 : na = 0;
3395 : f = formal;
3396 : i = 0;
3397 :
3398 542079 : for (a = actual; a; a = a->next, f = f->next)
3399 : {
3400 365271 : if (a->name != NULL && in_statement_function)
3401 : {
3402 1 : gfc_error ("Keyword argument %qs at %L is invalid in "
3403 1 : "a statement function", a->name, &a->expr->where);
3404 1 : return false;
3405 : }
3406 :
3407 : /* Look for keywords but ignore g77 extensions like %VAL. */
3408 365270 : if (a->name != NULL && a->name[0] != '%')
3409 : {
3410 : i = 0;
3411 12205 : for (f = formal; f; f = f->next, i++)
3412 : {
3413 12171 : if (f->sym == NULL)
3414 0 : continue;
3415 12171 : if (strcmp (f->sym->name, a->name) == 0)
3416 : break;
3417 : }
3418 :
3419 3518 : if (f == NULL)
3420 : {
3421 34 : if (where)
3422 : {
3423 1 : const char *guessed = lookup_arg_fuzzy (a->name, formal);
3424 1 : if (guessed)
3425 1 : gfc_error ("Keyword argument %qs at %L is not in "
3426 : "the procedure; did you mean %qs?",
3427 1 : a->name, &a->expr->where, guessed);
3428 : else
3429 0 : gfc_error ("Keyword argument %qs at %L is not in "
3430 0 : "the procedure", a->name, &a->expr->where);
3431 : }
3432 34 : return false;
3433 : }
3434 :
3435 3518 : if (new_arg[i] != NULL)
3436 : {
3437 0 : if (where)
3438 0 : gfc_error ("Keyword argument %qs at %L is already associated "
3439 : "with another actual argument", a->name,
3440 0 : &a->expr->where);
3441 0 : return false;
3442 : }
3443 : }
3444 :
3445 365236 : if (f == NULL)
3446 : {
3447 1158 : if (where)
3448 8 : gfc_error ("More actual than formal arguments in procedure "
3449 : "call at %L", where);
3450 1158 : return false;
3451 : }
3452 :
3453 364078 : if (f->sym == NULL && a->expr == NULL)
3454 210 : goto match;
3455 :
3456 363868 : if (f->sym == NULL)
3457 : {
3458 : /* These errors have to be issued, otherwise an ICE can occur.
3459 : See PR 78865. */
3460 6 : if (where)
3461 6 : gfc_error_now ("Missing alternate return specifier in subroutine "
3462 : "call at %L", where);
3463 6 : return false;
3464 : }
3465 : else
3466 : {
3467 363862 : if (a->associated_dummy)
3468 124369 : free (a->associated_dummy);
3469 363862 : a->associated_dummy = get_nonintrinsic_dummy_arg (f);
3470 : }
3471 :
3472 363862 : if (a->expr == NULL)
3473 : {
3474 8 : if (f->sym->attr.optional)
3475 6 : continue;
3476 : else
3477 : {
3478 2 : if (where)
3479 1 : gfc_error_now ("Unexpected alternate return specifier in "
3480 : "subroutine call at %L", where);
3481 2 : return false;
3482 : }
3483 : }
3484 :
3485 : /* Make sure that intrinsic vtables exist for calls to unlimited
3486 : polymorphic formal arguments. */
3487 363854 : if (UNLIMITED_POLY (f->sym)
3488 2849 : && a->expr->ts.type != BT_DERIVED
3489 : && a->expr->ts.type != BT_CLASS
3490 : && a->expr->ts.type != BT_ASSUMED)
3491 929 : gfc_find_vtab (&a->expr->ts);
3492 :
3493 : /* Interp J3/22-146:
3494 : "If the context of the reference to NULL is an <actual argument>
3495 : corresponding to an <assumed-rank> dummy argument, MOLD shall be
3496 : present." */
3497 363854 : if (a->expr->expr_type == EXPR_NULL
3498 826 : && a->expr->ts.type == BT_UNKNOWN
3499 264 : && f->sym->as
3500 97 : && f->sym->as->type == AS_ASSUMED_RANK)
3501 : {
3502 1 : gfc_error ("Intrinsic %<NULL()%> without %<MOLD%> argument at %L "
3503 : "passed to assumed-rank dummy %qs",
3504 : &a->expr->where, f->sym->name);
3505 1 : ok = false;
3506 1 : goto match;
3507 : }
3508 :
3509 363853 : if (warn_surprising
3510 1279 : && a->expr->expr_type == EXPR_VARIABLE
3511 618 : && a->expr->symtree->n.sym->as
3512 263 : && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SIZE
3513 153 : && f->sym->as
3514 153 : && f->sym->as->type == AS_ASSUMED_RANK)
3515 1 : gfc_warning (0, "The assumed-size dummy %qs is being passed at %L to "
3516 : "an assumed-rank dummy %qs", a->expr->symtree->name,
3517 : &a->expr->where, f->sym->name);
3518 :
3519 363853 : if (a->expr->expr_type == EXPR_NULL
3520 825 : && a->expr->ts.type == BT_UNKNOWN
3521 263 : && f->sym->ts.type == BT_CHARACTER
3522 83 : && !f->sym->ts.deferred
3523 46 : && f->sym->ts.u.cl
3524 46 : && f->sym->ts.u.cl->length == NULL)
3525 : {
3526 1 : gfc_error ("Intrinsic %<NULL()%> without %<MOLD%> argument at %L "
3527 : "passed to assumed-length dummy %qs",
3528 : &a->expr->where, f->sym->name);
3529 1 : ok = false;
3530 1 : goto match;
3531 : }
3532 :
3533 : /* Allow passing of NULL() as disassociated pointer, procedure
3534 : pointer, or unallocated allocatable (F2008+) to a respective dummy
3535 : argument. */
3536 727704 : pointer_dummy = ((f->sym->ts.type != BT_CLASS
3537 348853 : && f->sym->attr.pointer)
3538 707343 : || (f->sym->ts.type == BT_CLASS
3539 14999 : && CLASS_DATA (f->sym)->attr.class_pointer));
3540 :
3541 727704 : procptr_dummy = ((f->sym->ts.type != BT_CLASS
3542 348853 : && f->sym->attr.proc_pointer)
3543 712493 : || (f->sym->ts.type == BT_CLASS
3544 14999 : && CLASS_DATA (f->sym)->attr.proc_pointer));
3545 :
3546 363852 : optional_dummy = f->sym->attr.optional;
3547 :
3548 727704 : allocatable_dummy = ((f->sym->ts.type != BT_CLASS
3549 348853 : && f->sym->attr.allocatable)
3550 709460 : || (f->sym->ts.type == BT_CLASS
3551 14999 : && CLASS_DATA (f->sym)->attr.allocatable));
3552 :
3553 363852 : if (a->expr->expr_type == EXPR_NULL
3554 : && !pointer_dummy
3555 824 : && !procptr_dummy
3556 338 : && !(optional_dummy
3557 287 : && (gfc_option.allow_std & GFC_STD_F2008) != 0)
3558 54 : && !(allocatable_dummy
3559 50 : && (gfc_option.allow_std & GFC_STD_F2008) != 0))
3560 : {
3561 5 : if (where
3562 4 : && (!f->sym->attr.optional
3563 2 : || (f->sym->ts.type != BT_CLASS && f->sym->attr.allocatable)
3564 1 : || (f->sym->ts.type == BT_CLASS
3565 0 : && CLASS_DATA (f->sym)->attr.allocatable)))
3566 3 : gfc_error ("Unexpected NULL() intrinsic at %L to dummy %qs",
3567 : where, f->sym->name);
3568 1 : else if (where)
3569 1 : gfc_error ("Fortran 2008: Null pointer at %L to non-pointer "
3570 : "dummy %qs", where, f->sym->name);
3571 5 : ok = false;
3572 5 : goto match;
3573 : }
3574 :
3575 363847 : if (!compare_parameter (f->sym, a->expr, ranks_must_agree,
3576 : is_elemental, where))
3577 : {
3578 106303 : ok = false;
3579 106303 : goto match;
3580 : }
3581 :
3582 : /* TS 29113, 6.3p2; F2018 15.5.2.4. */
3583 257544 : if (f->sym->ts.type == BT_ASSUMED
3584 3473 : && (a->expr->ts.type == BT_DERIVED
3585 3029 : || (a->expr->ts.type == BT_CLASS && CLASS_DATA (a->expr))))
3586 : {
3587 651 : gfc_symbol *derived = (a->expr->ts.type == BT_DERIVED
3588 : ? a->expr->ts.u.derived
3589 207 : : CLASS_DATA (a->expr)->ts.u.derived);
3590 651 : gfc_namespace *f2k_derived = derived->f2k_derived;
3591 651 : if (derived->attr.pdt_type
3592 650 : || (f2k_derived
3593 585 : && (f2k_derived->finalizers || f2k_derived->tb_sym_root)))
3594 : {
3595 5 : gfc_error ("Actual argument at %L to assumed-type dummy "
3596 : "has type parameters or is of "
3597 : "derived type with type-bound or FINAL procedures",
3598 : &a->expr->where);
3599 5 : ok = false;
3600 5 : goto match;
3601 : }
3602 : }
3603 :
3604 257539 : if (UNLIMITED_POLY (a->expr)
3605 1207 : && !(f->sym->ts.type == BT_ASSUMED || UNLIMITED_POLY (f->sym)))
3606 : {
3607 1 : gfc_error ("Unlimited polymorphic actual argument at %L is not "
3608 : "matched with either an unlimited polymorphic or "
3609 : "assumed type dummy argument", &a->expr->where);
3610 1 : ok = false;
3611 1 : goto match;
3612 : }
3613 :
3614 : /* Special case for character arguments. For allocatable, pointer
3615 : and assumed-shape dummies, the string length needs to match
3616 : exactly. */
3617 257538 : if (a->expr->ts.type == BT_CHARACTER
3618 34201 : && a->expr->ts.u.cl && a->expr->ts.u.cl->length
3619 11714 : && a->expr->ts.u.cl->length->expr_type == EXPR_CONSTANT
3620 10905 : && a->expr->ts.u.cl->length->ts.type == BT_INTEGER
3621 10904 : && f->sym->ts.type == BT_CHARACTER && f->sym->ts.u.cl
3622 10573 : && f->sym->ts.u.cl->length
3623 5572 : && f->sym->ts.u.cl->length->expr_type == EXPR_CONSTANT
3624 4719 : && f->sym->ts.u.cl->length->ts.type == BT_INTEGER
3625 4717 : && (f->sym->attr.pointer || f->sym->attr.allocatable
3626 4307 : || (f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
3627 1020 : && (mpz_cmp (a->expr->ts.u.cl->length->value.integer,
3628 1020 : f->sym->ts.u.cl->length->value.integer) != 0))
3629 : {
3630 14 : long actual_len, formal_len;
3631 14 : actual_len = mpz_get_si (a->expr->ts.u.cl->length->value.integer);
3632 14 : formal_len = mpz_get_si (f->sym->ts.u.cl->length->value.integer);
3633 :
3634 14 : if (where && (f->sym->attr.pointer || f->sym->attr.allocatable))
3635 : {
3636 : /* Emit a warning for -std=legacy and an error otherwise. */
3637 5 : if (gfc_option.warn_std == 0)
3638 4 : gfc_warning (0, "Character length mismatch (%ld/%ld) between "
3639 : "actual argument and pointer or allocatable "
3640 : "dummy argument %qs at %L", actual_len, formal_len,
3641 : f->sym->name, &a->expr->where);
3642 : else
3643 1 : gfc_error ("Character length mismatch (%ld/%ld) between "
3644 : "actual argument and pointer or allocatable "
3645 : "dummy argument %qs at %L", actual_len, formal_len,
3646 : f->sym->name, &a->expr->where);
3647 : }
3648 9 : else if (where)
3649 : {
3650 : /* Emit a warning for -std=legacy and an error otherwise. */
3651 9 : if (gfc_option.warn_std == 0)
3652 0 : gfc_warning (0, "Character length mismatch (%ld/%ld) between "
3653 : "actual argument and assumed-shape dummy argument "
3654 : "%qs at %L", actual_len, formal_len,
3655 : f->sym->name, &a->expr->where);
3656 : else
3657 9 : gfc_error ("Character length mismatch (%ld/%ld) between "
3658 : "actual argument and assumed-shape dummy argument "
3659 : "%qs at %L", actual_len, formal_len,
3660 : f->sym->name, &a->expr->where);
3661 :
3662 : }
3663 14 : ok = false;
3664 14 : goto match;
3665 : }
3666 :
3667 257524 : if ((f->sym->attr.pointer || f->sym->attr.allocatable)
3668 8437 : && f->sym->ts.deferred != a->expr->ts.deferred
3669 38 : && a->expr->ts.type == BT_CHARACTER)
3670 : {
3671 1 : if (where)
3672 1 : gfc_error ("Actual argument at %L to allocatable or "
3673 : "pointer dummy argument %qs must have a deferred "
3674 : "length type parameter if and only if the dummy has one",
3675 : &a->expr->where, f->sym->name);
3676 1 : ok = false;
3677 1 : goto match;
3678 : }
3679 :
3680 257523 : if (f->sym->ts.type == BT_CLASS)
3681 14215 : goto skip_size_check;
3682 :
3683 : /* Skip size check for NULL() actual without MOLD argument. */
3684 243308 : if (a->expr->expr_type == EXPR_NULL && a->expr->ts.type == BT_UNKNOWN)
3685 257 : goto skip_size_check;
3686 :
3687 243051 : actual_size = get_expr_storage_size (a->expr, &actual_size_known, &charlen);
3688 243051 : formal_size = get_sym_storage_size (f->sym, &formal_size_known);
3689 :
3690 : /* If the formal is a scalar character variable, use the charlen of the
3691 : actual. */
3692 243051 : if (actual_size_known && formal_size_known && charlen >= 0
3693 4264 : && a->expr->ts.type == BT_CHARACTER
3694 4264 : && f->sym->attr.flavor != FL_PROCEDURE
3695 4264 : && !f->sym->attr.dimension)
3696 3717 : actual_size = charlen;
3697 :
3698 243051 : if (actual_size_known && formal_size_known
3699 182856 : && actual_size != formal_size
3700 3898 : && a->expr->ts.type == BT_CHARACTER
3701 256 : && f->sym->attr.flavor != FL_PROCEDURE)
3702 : {
3703 : /* F2018:15.5.2.4:
3704 : (3) "The length type parameter values of a present actual argument
3705 : shall agree with the corresponding ones of the dummy argument that
3706 : are not assumed, except for the case of the character length
3707 : parameter of an actual argument of type character with default
3708 : kind or C character kind associated with a dummy argument that is
3709 : not assumed-shape or assumed-rank."
3710 :
3711 : (4) "If a present scalar dummy argument is of type character with
3712 : default kind or C character kind, the length len of the dummy
3713 : argument shall be less than or equal to the length of the actual
3714 : argument. The dummy argument becomes associated with the leftmost
3715 : len characters of the actual argument. If a present array dummy
3716 : argument is of type character with default kind or C character
3717 : kind and is not assumed-shape or assumed-rank, it becomes
3718 : associated with the leftmost characters of the actual argument
3719 : element sequence."
3720 :
3721 : As an extension we treat kind=4 character similarly to kind=1. */
3722 :
3723 256 : if (actual_size > formal_size)
3724 : {
3725 175 : if (a->expr->ts.type == BT_CHARACTER && where
3726 175 : && (!f->sym->as || f->sym->as->type == AS_EXPLICIT))
3727 175 : gfc_warning (OPT_Wcharacter_truncation,
3728 : "Character length of actual argument longer "
3729 : "than of dummy argument %qs (%lu/%lu) at %L",
3730 : f->sym->name, actual_size, formal_size,
3731 : &a->expr->where);
3732 175 : goto skip_size_check;
3733 : }
3734 :
3735 81 : if (a->expr->ts.type == BT_CHARACTER && where && !f->sym->as)
3736 : {
3737 : /* Emit warning for -std=legacy/gnu and an error otherwise. */
3738 57 : if (gfc_notification_std (GFC_STD_LEGACY) == ERROR)
3739 : {
3740 11 : gfc_error ("Character length of actual argument shorter "
3741 : "than of dummy argument %qs (%lu/%lu) at %L",
3742 11 : f->sym->name, actual_size, formal_size,
3743 11 : &a->expr->where);
3744 11 : ok = false;
3745 11 : goto match;
3746 : }
3747 : else
3748 46 : gfc_warning (0, "Character length of actual argument shorter "
3749 : "than of dummy argument %qs (%lu/%lu) at %L",
3750 46 : f->sym->name, actual_size, formal_size,
3751 46 : &a->expr->where);
3752 46 : goto skip_size_check;
3753 : }
3754 : }
3755 :
3756 242819 : if (actual_size_known && formal_size_known
3757 182624 : && actual_size < formal_size
3758 54 : && f->sym->as
3759 48 : && a->expr->ts.type != BT_PROCEDURE
3760 48 : && f->sym->attr.flavor != FL_PROCEDURE)
3761 : {
3762 48 : if (where)
3763 : {
3764 : /* Emit a warning for -std=legacy and an error otherwise. */
3765 48 : if (gfc_option.warn_std == 0)
3766 0 : gfc_warning (0, "Actual argument contains too few "
3767 : "elements for dummy argument %qs (%lu/%lu) "
3768 : "at %L", f->sym->name, actual_size,
3769 : formal_size, &a->expr->where);
3770 : else
3771 48 : gfc_error_now ("Actual argument contains too few "
3772 : "elements for dummy argument %qs (%lu/%lu) "
3773 : "at %L", f->sym->name, actual_size,
3774 : formal_size, &a->expr->where);
3775 : }
3776 48 : ok = false;
3777 48 : goto match;
3778 : }
3779 :
3780 242771 : skip_size_check:
3781 :
3782 : /* Satisfy either: F03:12.4.1.3 by ensuring that a procedure pointer
3783 : actual argument is provided for a procedure pointer formal argument;
3784 : or: F08:12.5.2.9 (F18:15.5.2.10) by ensuring that the effective
3785 : argument shall be an external, internal, module, or dummy procedure.
3786 : The interfaces are checked elsewhere. */
3787 257464 : if (f->sym->attr.proc_pointer
3788 257464 : && !((a->expr->expr_type == EXPR_VARIABLE
3789 200 : && (a->expr->symtree->n.sym->attr.proc_pointer
3790 31 : || gfc_is_proc_ptr_comp (a->expr)))
3791 16 : || (a->expr->ts.type == BT_PROCEDURE
3792 10 : && f->sym->ts.interface)
3793 6 : || (a->expr->expr_type == EXPR_FUNCTION
3794 6 : && is_procptr_result (a->expr))))
3795 : {
3796 0 : if (where)
3797 0 : gfc_error ("Expected a procedure pointer for argument %qs at %L",
3798 0 : f->sym->name, &a->expr->where);
3799 0 : ok = false;
3800 0 : goto match;
3801 : }
3802 :
3803 : /* Satisfy F03:12.4.1.3 by ensuring that a procedure actual argument is
3804 : provided for a procedure formal argument. */
3805 257464 : if (f->sym->attr.flavor == FL_PROCEDURE
3806 257464 : && !((a->expr->expr_type == EXPR_VARIABLE
3807 1968 : && (a->expr->symtree->n.sym->attr.flavor == FL_PROCEDURE
3808 32 : || a->expr->symtree->n.sym->attr.proc_pointer
3809 32 : || gfc_is_proc_ptr_comp (a->expr)))
3810 30 : || (a->expr->expr_type == EXPR_FUNCTION
3811 21 : && is_procptr_result (a->expr))))
3812 : {
3813 12 : if (where)
3814 6 : gfc_error ("Expected a procedure for argument %qs at %L",
3815 6 : f->sym->name, &a->expr->where);
3816 12 : ok = false;
3817 12 : goto match;
3818 : }
3819 :
3820 : /* F23:15.5.2.5, para 2: A procedure pointer actual argument cannot correspond
3821 : to a data-object dummy argument (reverse of the two checks above).
3822 : Only flag EXPR_VARIABLE to avoid false positives on function calls
3823 : through procedure pointer components (e.g. o%f(args)). */
3824 257452 : if (!f->sym->attr.proc_pointer
3825 257246 : && f->sym->attr.flavor != FL_PROCEDURE
3826 255469 : && a->expr->expr_type == EXPR_VARIABLE
3827 363507 : && (a->expr->symtree->n.sym->attr.proc_pointer
3828 106048 : || gfc_is_proc_ptr_comp (a->expr)))
3829 : {
3830 8 : if (where)
3831 2 : gfc_error ("Procedure pointer actual argument at %L cannot "
3832 : "be passed to data-object dummy argument %qs",
3833 2 : &a->expr->where, f->sym->name);
3834 8 : ok = false;
3835 8 : goto match;
3836 : }
3837 :
3838 : /* Class array variables and expressions store array info in a
3839 : different place from non-class objects; consolidate the logic
3840 : to access it here instead of repeating it below. Note that
3841 : pointer_arg and allocatable_arg are not fully general and are
3842 : only used in a specific situation below with an assumed-rank
3843 : argument. */
3844 257444 : if (f->sym->ts.type == BT_CLASS && CLASS_DATA (f->sym))
3845 : {
3846 14215 : gfc_component *classdata = CLASS_DATA (f->sym);
3847 14215 : fas = classdata->as;
3848 14215 : pointer_dummy = classdata->attr.class_pointer;
3849 14215 : }
3850 : else
3851 : {
3852 243229 : fas = f->sym->as;
3853 243229 : pointer_dummy = f->sym->attr.pointer;
3854 : }
3855 :
3856 257444 : if (a->expr->expr_type != EXPR_VARIABLE
3857 149432 : && !(a->expr->expr_type == EXPR_NULL
3858 758 : && a->expr->ts.type != BT_UNKNOWN))
3859 : {
3860 : aas = NULL;
3861 : pointer_arg = false;
3862 : allocatable_arg = false;
3863 : }
3864 108513 : else if (a->expr->ts.type == BT_CLASS
3865 6649 : && a->expr->symtree->n.sym
3866 6649 : && CLASS_DATA (a->expr->symtree->n.sym))
3867 : {
3868 6646 : gfc_component *classdata = CLASS_DATA (a->expr->symtree->n.sym);
3869 6646 : aas = classdata->as;
3870 6646 : pointer_arg = classdata->attr.class_pointer;
3871 6646 : allocatable_arg = classdata->attr.allocatable;
3872 6646 : }
3873 : else
3874 : {
3875 101867 : aas = a->expr->symtree->n.sym->as;
3876 101867 : pointer_arg = a->expr->symtree->n.sym->attr.pointer;
3877 101867 : allocatable_arg = a->expr->symtree->n.sym->attr.allocatable;
3878 : }
3879 :
3880 : /* F2018:9.5.2(2) permits assumed-size whole array expressions as
3881 : actual arguments only if the shape is not required; thus it
3882 : cannot be passed to an assumed-shape array dummy.
3883 : F2018:15.5.2.(2) permits passing a nonpointer actual to an
3884 : intent(in) pointer dummy argument and this is accepted by
3885 : the compare_pointer check below, but this also requires shape
3886 : information.
3887 : There's more discussion of this in PR94110. */
3888 257444 : if (fas
3889 43215 : && (fas->type == AS_ASSUMED_SHAPE
3890 43215 : || fas->type == AS_DEFERRED
3891 21884 : || (fas->type == AS_ASSUMED_RANK && pointer_dummy))
3892 22393 : && aas
3893 17770 : && aas->type == AS_ASSUMED_SIZE
3894 14 : && (a->expr->ref == NULL
3895 14 : || (a->expr->ref->type == REF_ARRAY
3896 14 : && a->expr->ref->u.ar.type == AR_FULL)))
3897 : {
3898 10 : if (where)
3899 10 : gfc_error ("Actual argument for %qs cannot be an assumed-size"
3900 : " array at %L", f->sym->name, where);
3901 10 : ok = false;
3902 10 : goto match;
3903 : }
3904 :
3905 : /* Diagnose F2018 C839 (TS29113 C535c). Here the problem is
3906 : passing an assumed-size array to an INTENT(OUT) assumed-rank
3907 : dummy when it doesn't have the size information needed to run
3908 : initializers and finalizers. */
3909 257434 : if (f->sym->attr.intent == INTENT_OUT
3910 6658 : && fas
3911 1237 : && fas->type == AS_ASSUMED_RANK
3912 276 : && aas
3913 223 : && ((aas->type == AS_ASSUMED_SIZE
3914 61 : && (a->expr->ref == NULL
3915 61 : || (a->expr->ref->type == REF_ARRAY
3916 61 : && a->expr->ref->u.ar.type == AR_FULL)))
3917 173 : || (aas->type == AS_ASSUMED_RANK
3918 : && !pointer_arg
3919 34 : && !allocatable_arg))
3920 257502 : && (a->expr->ts.type == BT_CLASS
3921 62 : || (a->expr->ts.type == BT_DERIVED
3922 16 : && (gfc_is_finalizable (a->expr->ts.u.derived, NULL)
3923 14 : || gfc_has_ultimate_allocatable (a->expr)
3924 12 : || gfc_has_default_initializer
3925 12 : (a->expr->ts.u.derived)))))
3926 : {
3927 12 : if (where)
3928 12 : gfc_error ("Actual argument to assumed-rank INTENT(OUT) "
3929 : "dummy %qs at %L cannot be of unknown size",
3930 12 : f->sym->name, where);
3931 12 : ok = false;
3932 12 : goto match;
3933 : }
3934 :
3935 257422 : if (a->expr->expr_type != EXPR_NULL)
3936 : {
3937 256664 : int cmp = compare_pointer (f->sym, a->expr);
3938 256664 : bool pre2008 = ((gfc_option.allow_std & GFC_STD_F2008) == 0);
3939 :
3940 256664 : if (pre2008 && cmp == 0)
3941 : {
3942 1 : if (where)
3943 1 : gfc_error ("Actual argument for %qs at %L must be a pointer",
3944 1 : f->sym->name, &a->expr->where);
3945 1 : ok = false;
3946 1 : goto match;
3947 : }
3948 :
3949 256663 : if (pre2008 && cmp == 2)
3950 : {
3951 3 : if (where)
3952 3 : gfc_error ("Fortran 2008: Non-pointer actual argument at %L to "
3953 3 : "pointer dummy %qs", &a->expr->where, f->sym->name);
3954 3 : ok = false;
3955 3 : goto match;
3956 : }
3957 :
3958 256660 : if (!pre2008 && cmp == 0)
3959 : {
3960 11 : if (where)
3961 5 : gfc_error ("Actual argument for %qs at %L must be a pointer "
3962 : "or a valid target for the dummy pointer in a "
3963 : "pointer assignment statement",
3964 5 : f->sym->name, &a->expr->where);
3965 11 : ok = false;
3966 11 : goto match;
3967 : }
3968 : }
3969 :
3970 :
3971 : /* Fortran 2008, C1242. */
3972 257407 : if (f->sym->attr.pointer && gfc_is_coindexed (a->expr))
3973 : {
3974 2 : if (where)
3975 2 : gfc_error ("Coindexed actual argument at %L to pointer "
3976 : "dummy %qs",
3977 2 : &a->expr->where, f->sym->name);
3978 2 : ok = false;
3979 2 : goto match;
3980 : }
3981 :
3982 : /* Fortran 2008, 12.5.2.5 (no constraint). */
3983 257405 : if (a->expr->expr_type == EXPR_VARIABLE
3984 107974 : && f->sym->attr.intent != INTENT_IN
3985 61822 : && f->sym->attr.allocatable
3986 260328 : && gfc_is_coindexed (a->expr))
3987 : {
3988 1 : if (where)
3989 1 : gfc_error ("Coindexed actual argument at %L to allocatable "
3990 : "dummy %qs requires INTENT(IN)",
3991 1 : &a->expr->where, f->sym->name);
3992 1 : ok = false;
3993 1 : goto match;
3994 : }
3995 :
3996 : /* Fortran 2008, C1237. */
3997 257404 : if (a->expr->expr_type == EXPR_VARIABLE
3998 107973 : && (f->sym->attr.asynchronous || f->sym->attr.volatile_)
3999 65 : && gfc_is_coindexed (a->expr)
4000 257406 : && (a->expr->symtree->n.sym->attr.volatile_
4001 1 : || a->expr->symtree->n.sym->attr.asynchronous))
4002 : {
4003 2 : if (where)
4004 2 : gfc_error ("Coindexed ASYNCHRONOUS or VOLATILE actual argument at "
4005 : "%L requires that dummy %qs has neither "
4006 : "ASYNCHRONOUS nor VOLATILE", &a->expr->where,
4007 2 : f->sym->name);
4008 2 : ok = false;
4009 2 : goto match;
4010 : }
4011 :
4012 : /* Fortran 2008, 12.5.2.4 (no constraint). */
4013 257402 : if (a->expr->expr_type == EXPR_VARIABLE
4014 107971 : && f->sym->attr.intent != INTENT_IN && !f->sym->attr.value
4015 57385 : && gfc_is_coindexed (a->expr)
4016 257413 : && gfc_has_ultimate_allocatable (a->expr))
4017 : {
4018 1 : if (where)
4019 1 : gfc_error ("Coindexed actual argument at %L with allocatable "
4020 : "ultimate component to dummy %qs requires either VALUE "
4021 1 : "or INTENT(IN)", &a->expr->where, f->sym->name);
4022 1 : ok = false;
4023 1 : goto match;
4024 : }
4025 :
4026 257401 : if (f->sym->ts.type == BT_CLASS
4027 14207 : && CLASS_DATA (f->sym)->attr.allocatable
4028 874 : && gfc_is_class_array_ref (a->expr, &full_array)
4029 257846 : && !full_array)
4030 : {
4031 0 : if (where)
4032 0 : gfc_error ("Actual CLASS array argument for %qs must be a full "
4033 0 : "array at %L", f->sym->name, &a->expr->where);
4034 0 : ok = false;
4035 0 : goto match;
4036 : }
4037 :
4038 :
4039 257401 : if (a->expr->expr_type != EXPR_NULL
4040 257401 : && !compare_allocatable (f->sym, a->expr))
4041 : {
4042 9 : if (where)
4043 9 : gfc_error ("Actual argument for %qs must be ALLOCATABLE at %L",
4044 9 : f->sym->name, &a->expr->where);
4045 9 : ok = false;
4046 9 : goto match;
4047 : }
4048 :
4049 257392 : if (a->expr->expr_type == EXPR_FUNCTION
4050 15131 : && a->expr->value.function.esym
4051 5033 : && f->sym->attr.allocatable)
4052 : {
4053 4 : if (where)
4054 4 : gfc_error ("Actual argument for %qs at %L is a function result "
4055 : "and the dummy argument is ALLOCATABLE",
4056 : f->sym->name, &a->expr->where);
4057 4 : ok = false;
4058 4 : goto match;
4059 : }
4060 :
4061 : /* Check intent = OUT/INOUT for definable actual argument. */
4062 257388 : if (!in_statement_function
4063 256913 : && (f->sym->attr.intent == INTENT_OUT
4064 250269 : || f->sym->attr.intent == INTENT_INOUT))
4065 : {
4066 10909 : const char* context = (where
4067 10909 : ? _("actual argument to INTENT = OUT/INOUT")
4068 : : NULL);
4069 :
4070 2873 : if (((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
4071 2873 : && CLASS_DATA (f->sym)->attr.class_pointer)
4072 10889 : || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
4073 11099 : && !gfc_check_vardef_context (a->expr, true, false, false, context))
4074 : {
4075 6 : ok = false;
4076 6 : goto match;
4077 : }
4078 10903 : if (!gfc_check_vardef_context (a->expr, false, false, false, context))
4079 : {
4080 21 : ok = false;
4081 21 : goto match;
4082 : }
4083 : }
4084 : /* F2023: 15.5.2.5 Ordinary dummy variables:
4085 : "(21) If the procedure is nonelemental, the dummy argument does not
4086 : have the VALUE attribute, and the actual argument is an array section
4087 : having a vector subscript, the dummy argument is not definable and
4088 : shall not have the ASYNCHRONOUS, INTENT (OUT), INTENT (INOUT), or
4089 : VOLATILE attributes."
4090 : */
4091 257361 : if ((f->sym->attr.intent == INTENT_OUT
4092 250725 : || f->sym->attr.intent == INTENT_INOUT
4093 246477 : || f->sym->attr.volatile_
4094 246441 : || f->sym->attr.asynchronous)
4095 10948 : && !f->sym->attr.value
4096 10948 : && !is_elemental
4097 264590 : && gfc_has_vector_subscript (a->expr))
4098 : {
4099 3 : if (where)
4100 3 : gfc_error ("Array-section actual argument with vector "
4101 : "subscripts at %L is incompatible with INTENT(OUT), "
4102 : "INTENT(INOUT), VOLATILE or ASYNCHRONOUS attribute "
4103 : "of the dummy argument %qs",
4104 3 : &a->expr->where, f->sym->name);
4105 3 : ok = false;
4106 3 : goto match;
4107 : }
4108 :
4109 : /* C1232 (R1221) For an actual argument which is an array section or
4110 : an assumed-shape array, the dummy argument shall be an assumed-
4111 : shape array, if the dummy argument has the VOLATILE attribute. */
4112 :
4113 257358 : if (f->sym->attr.volatile_
4114 37 : && a->expr->expr_type == EXPR_VARIABLE
4115 34 : && a->expr->symtree->n.sym->as
4116 29 : && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SHAPE
4117 2 : && !(fas && fas->type == AS_ASSUMED_SHAPE))
4118 : {
4119 1 : if (where)
4120 1 : gfc_error ("Assumed-shape actual argument at %L is "
4121 : "incompatible with the non-assumed-shape "
4122 : "dummy argument %qs due to VOLATILE attribute",
4123 : &a->expr->where,f->sym->name);
4124 1 : ok = false;
4125 1 : goto match;
4126 : }
4127 :
4128 : /* Find the last array_ref. */
4129 257357 : actual_arr_ref = NULL;
4130 257357 : if (a->expr->ref)
4131 46219 : actual_arr_ref = gfc_find_array_ref (a->expr, true);
4132 :
4133 257357 : if (f->sym->attr.volatile_
4134 36 : && actual_arr_ref && actual_arr_ref->type == AR_SECTION
4135 5 : && !(fas && fas->type == AS_ASSUMED_SHAPE))
4136 : {
4137 1 : if (where)
4138 1 : gfc_error ("Array-section actual argument at %L is "
4139 : "incompatible with the non-assumed-shape "
4140 : "dummy argument %qs due to VOLATILE attribute",
4141 1 : &a->expr->where, f->sym->name);
4142 1 : ok = false;
4143 1 : goto match;
4144 : }
4145 :
4146 : /* C1233 (R1221) For an actual argument which is a pointer array, the
4147 : dummy argument shall be an assumed-shape or pointer array, if the
4148 : dummy argument has the VOLATILE attribute. */
4149 :
4150 257356 : if (f->sym->attr.volatile_
4151 35 : && a->expr->expr_type == EXPR_VARIABLE
4152 32 : && a->expr->symtree->n.sym->attr.pointer
4153 17 : && a->expr->symtree->n.sym->as
4154 17 : && !(fas
4155 17 : && (fas->type == AS_ASSUMED_SHAPE
4156 6 : || f->sym->attr.pointer)))
4157 : {
4158 3 : if (where)
4159 2 : gfc_error ("Pointer-array actual argument at %L requires "
4160 : "an assumed-shape or pointer-array dummy "
4161 : "argument %qs due to VOLATILE attribute",
4162 : &a->expr->where,f->sym->name);
4163 3 : ok = false;
4164 3 : goto match;
4165 : }
4166 :
4167 : /* C_LOC/C_FUNLOC from ISO_C_BINDING as actual argument can only be
4168 : passed to a dummy argument of matching type C_PTR/C_FUNPTR. */
4169 257353 : if (a->expr->expr_type == EXPR_FUNCTION
4170 15124 : && a->expr->ts.type == BT_VOID
4171 5 : && a->expr->symtree->n.sym
4172 5 : && a->expr->symtree->n.sym->from_intmod == INTMOD_ISO_C_BINDING
4173 5 : && (f->sym->ts.type != BT_DERIVED
4174 3 : || f->sym->ts.u.derived->from_intmod != INTMOD_ISO_C_BINDING
4175 3 : || !((a->expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_FUNLOC
4176 1 : && f->sym->ts.u.derived->intmod_sym_id == ISOCBINDING_FUNPTR)
4177 : || (a->expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_LOC
4178 2 : && f->sym->ts.u.derived->intmod_sym_id == ISOCBINDING_PTR))))
4179 : {
4180 3 : if (where)
4181 0 : gfc_error ("ISO_C_BINDING function actual argument at %L "
4182 : "requires dummy argument %qs to have a matching "
4183 : "type from ISO_C_BINDING",
4184 : &a->expr->where,f->sym->name);
4185 3 : ok = false;
4186 3 : goto match;
4187 : }
4188 :
4189 257350 : match:
4190 364064 : if (a == actual)
4191 176649 : na = i;
4192 :
4193 364064 : new_arg[i++] = a;
4194 : }
4195 :
4196 : /* Give up now if we saw any bad argument. */
4197 176808 : if (!ok)
4198 : return false;
4199 :
4200 : /* Make sure missing actual arguments are optional. */
4201 : i = 0;
4202 357298 : for (f = formal; f; f = f->next, i++)
4203 : {
4204 246585 : if (new_arg[i] != NULL)
4205 240917 : continue;
4206 5668 : if (f->sym == NULL)
4207 : {
4208 1 : if (where)
4209 1 : gfc_error ("Missing alternate return spec in subroutine call "
4210 : "at %L", where);
4211 1 : return false;
4212 : }
4213 : /* For CLASS, the optional attribute might be set at either location. */
4214 5667 : if (((f->sym->ts.type != BT_CLASS || !CLASS_DATA (f->sym)->attr.optional)
4215 5667 : && !f->sym->attr.optional)
4216 5581 : || (in_statement_function
4217 1 : && (f->sym->attr.optional
4218 0 : || (f->sym->ts.type == BT_CLASS
4219 0 : && CLASS_DATA (f->sym)->attr.optional))))
4220 : {
4221 87 : if (where)
4222 4 : gfc_error ("Missing actual argument for argument %qs at %L",
4223 : f->sym->name, where);
4224 87 : return false;
4225 : }
4226 : }
4227 :
4228 : /* We should have handled the cases where the formal arglist is null
4229 : already. */
4230 110713 : gcc_assert (n > 0);
4231 :
4232 : /* The argument lists are compatible. We now relink a new actual
4233 : argument list with null arguments in the right places. The head
4234 : of the list remains the head. */
4235 357131 : for (f = formal, i = 0; f; f = f->next, i++)
4236 246418 : if (new_arg[i] == NULL)
4237 : {
4238 5580 : new_arg[i] = gfc_get_actual_arglist ();
4239 5580 : new_arg[i]->associated_dummy = get_nonintrinsic_dummy_arg (f);
4240 : }
4241 :
4242 110713 : if (na != 0)
4243 : {
4244 385 : std::swap (*new_arg[0], *actual);
4245 385 : std::swap (new_arg[0], new_arg[na]);
4246 : }
4247 :
4248 246418 : for (i = 0; i < n - 1; i++)
4249 135705 : new_arg[i]->next = new_arg[i + 1];
4250 :
4251 110713 : new_arg[i]->next = NULL;
4252 :
4253 110713 : if (*ap == NULL && n > 0)
4254 796 : *ap = new_arg[0];
4255 :
4256 110713 : if (!in_statement_function)
4257 356372 : for (f = formal, i = 0; f; f = f->next, i++)
4258 : {
4259 245943 : if (new_arg[i]->expr)
4260 : {
4261 240154 : gfc_expr *e = new_arg[i]->expr;
4262 :
4263 240154 : if (f->sym->attr.value)
4264 : {
4265 21897 : gfc_value_used_expr (e, VALUE_VALUE_ARG);
4266 21897 : continue;
4267 : }
4268 218257 : switch (f->sym->attr.intent)
4269 : {
4270 6509 : case INTENT_OUT:
4271 6509 : {
4272 6509 : gfc_symbol *s = e->symtree->n.sym;
4273 6509 : gfc_expr_set_at (e, &e->where, VALUE_INTENT_OUT);
4274 :
4275 : /* INTENT(OUT) allocates variables as far as we know. */
4276 6509 : if (s->attr.allocatable)
4277 861 : s->attr.allocated = 1;
4278 : }
4279 : break;
4280 114863 : case INTENT_IN:
4281 114863 : gfc_value_used_expr (e, VALUE_INTENT_IN);
4282 114863 : break;
4283 96885 : case INTENT_INOUT:
4284 96885 : case INTENT_UNKNOWN:
4285 96885 : gfc_value_set_and_used (e, &e->where, VALUE_ARG,
4286 : VALUE_MAYBE_USED);
4287 96885 : break;
4288 : }
4289 : }
4290 : }
4291 :
4292 : return true;
4293 : }
4294 :
4295 :
4296 : typedef struct
4297 : {
4298 : gfc_formal_arglist *f;
4299 : gfc_actual_arglist *a;
4300 : }
4301 : argpair;
4302 :
4303 : /* qsort comparison function for argument pairs, with the following
4304 : order:
4305 : - p->a->expr == NULL
4306 : - p->a->expr->expr_type != EXPR_VARIABLE
4307 : - by gfc_symbol pointer value (larger first). */
4308 :
4309 : static int
4310 2345 : pair_cmp (const void *p1, const void *p2)
4311 : {
4312 2345 : const gfc_actual_arglist *a1, *a2;
4313 :
4314 : /* *p1 and *p2 are elements of the to-be-sorted array. */
4315 2345 : a1 = ((const argpair *) p1)->a;
4316 2345 : a2 = ((const argpair *) p2)->a;
4317 2345 : if (!a1->expr)
4318 : {
4319 23 : if (!a2->expr)
4320 : return 0;
4321 23 : return -1;
4322 : }
4323 2322 : if (!a2->expr)
4324 : return 1;
4325 2313 : if (a1->expr->expr_type != EXPR_VARIABLE)
4326 : {
4327 1658 : if (a2->expr->expr_type != EXPR_VARIABLE)
4328 : return 0;
4329 1110 : return -1;
4330 : }
4331 655 : if (a2->expr->expr_type != EXPR_VARIABLE)
4332 : return 1;
4333 195 : if (a1->expr->symtree->n.sym > a2->expr->symtree->n.sym)
4334 : return -1;
4335 82 : return a1->expr->symtree->n.sym < a2->expr->symtree->n.sym;
4336 : }
4337 :
4338 :
4339 : /* Given two expressions from some actual arguments, test whether they
4340 : refer to the same expression. The analysis is conservative.
4341 : Returning false will produce no warning. */
4342 :
4343 : static bool
4344 43 : compare_actual_expr (gfc_expr *e1, gfc_expr *e2)
4345 : {
4346 43 : const gfc_ref *r1, *r2;
4347 :
4348 43 : if (!e1 || !e2
4349 43 : || e1->expr_type != EXPR_VARIABLE
4350 43 : || e2->expr_type != EXPR_VARIABLE
4351 43 : || e1->symtree->n.sym != e2->symtree->n.sym)
4352 : return false;
4353 :
4354 : /* TODO: improve comparison, see expr.cc:show_ref(). */
4355 4 : for (r1 = e1->ref, r2 = e2->ref; r1 && r2; r1 = r1->next, r2 = r2->next)
4356 : {
4357 1 : if (r1->type != r2->type)
4358 : return false;
4359 1 : switch (r1->type)
4360 : {
4361 0 : case REF_ARRAY:
4362 0 : if (r1->u.ar.type != r2->u.ar.type)
4363 : return false;
4364 : /* TODO: At the moment, consider only full arrays;
4365 : we could do better. */
4366 0 : if (r1->u.ar.type != AR_FULL || r2->u.ar.type != AR_FULL)
4367 : return false;
4368 : break;
4369 :
4370 0 : case REF_COMPONENT:
4371 0 : if (r1->u.c.component != r2->u.c.component)
4372 : return false;
4373 : break;
4374 :
4375 : case REF_SUBSTRING:
4376 : return false;
4377 :
4378 1 : case REF_INQUIRY:
4379 1 : if (e1->symtree->n.sym->ts.type == BT_COMPLEX
4380 1 : && e1->ts.type == BT_REAL && e2->ts.type == BT_REAL
4381 1 : && r1->u.i != r2->u.i)
4382 : return false;
4383 : break;
4384 :
4385 0 : default:
4386 0 : gfc_internal_error ("compare_actual_expr(): Bad component code");
4387 : }
4388 : }
4389 3 : if (!r1 && !r2)
4390 : return true;
4391 : return false;
4392 : }
4393 :
4394 :
4395 : /* Given formal and actual argument lists that correspond to one
4396 : another, check that identical actual arguments aren't not
4397 : associated with some incompatible INTENTs. */
4398 :
4399 : static bool
4400 737 : check_some_aliasing (gfc_formal_arglist *f, gfc_actual_arglist *a)
4401 : {
4402 737 : sym_intent f1_intent, f2_intent;
4403 737 : gfc_formal_arglist *f1;
4404 737 : gfc_actual_arglist *a1;
4405 737 : size_t n, i, j;
4406 737 : argpair *p;
4407 737 : bool t = true;
4408 :
4409 737 : n = 0;
4410 737 : for (f1 = f, a1 = a;; f1 = f1->next, a1 = a1->next)
4411 : {
4412 1934 : if (f1 == NULL && a1 == NULL)
4413 : break;
4414 1197 : if (f1 == NULL || a1 == NULL)
4415 0 : gfc_internal_error ("check_some_aliasing(): List mismatch");
4416 1197 : n++;
4417 : }
4418 737 : if (n == 0)
4419 : return t;
4420 655 : p = XALLOCAVEC (argpair, n);
4421 :
4422 1852 : for (i = 0, f1 = f, a1 = a; i < n; i++, f1 = f1->next, a1 = a1->next)
4423 : {
4424 1197 : p[i].f = f1;
4425 1197 : p[i].a = a1;
4426 : }
4427 :
4428 655 : qsort (p, n, sizeof (argpair), pair_cmp);
4429 :
4430 2507 : for (i = 0; i < n; i++)
4431 : {
4432 1197 : if (!p[i].a->expr
4433 1192 : || p[i].a->expr->expr_type != EXPR_VARIABLE
4434 570 : || p[i].a->expr->ts.type == BT_PROCEDURE)
4435 628 : continue;
4436 569 : f1_intent = p[i].f->sym->attr.intent;
4437 572 : for (j = i + 1; j < n; j++)
4438 : {
4439 : /* Expected order after the sort. */
4440 43 : if (!p[j].a->expr || p[j].a->expr->expr_type != EXPR_VARIABLE)
4441 0 : gfc_internal_error ("check_some_aliasing(): corrupted data");
4442 :
4443 : /* Are the expression the same? */
4444 43 : if (!compare_actual_expr (p[i].a->expr, p[j].a->expr))
4445 : break;
4446 3 : f2_intent = p[j].f->sym->attr.intent;
4447 3 : if ((f1_intent == INTENT_IN && f2_intent == INTENT_OUT)
4448 2 : || (f1_intent == INTENT_OUT && f2_intent == INTENT_IN)
4449 1 : || (f1_intent == INTENT_OUT && f2_intent == INTENT_OUT))
4450 : {
4451 3 : gfc_warning (0, "Same actual argument associated with INTENT(%s) "
4452 : "argument %qs and INTENT(%s) argument %qs at %L",
4453 3 : gfc_intent_string (f1_intent), p[i].f->sym->name,
4454 : gfc_intent_string (f2_intent), p[j].f->sym->name,
4455 : &p[i].a->expr->where);
4456 3 : t = false;
4457 : }
4458 : }
4459 : }
4460 :
4461 : return t;
4462 : }
4463 :
4464 :
4465 : /* Given formal and actual argument lists that correspond to one
4466 : another, check that they are compatible in the sense that intents
4467 : are not mismatched. */
4468 :
4469 : static bool
4470 114052 : check_intents (gfc_formal_arglist *f, gfc_actual_arglist *a)
4471 : {
4472 332835 : sym_intent f_intent;
4473 :
4474 551618 : for (;; f = f->next, a = a->next)
4475 : {
4476 332835 : gfc_expr *expr;
4477 :
4478 332835 : if (f == NULL && a == NULL)
4479 : break;
4480 218787 : if (f == NULL || a == NULL)
4481 0 : gfc_internal_error ("check_intents(): List mismatch");
4482 :
4483 218787 : if (a->expr && a->expr->expr_type == EXPR_FUNCTION
4484 12666 : && a->expr->value.function.isym
4485 7607 : && a->expr->value.function.isym->id == GFC_ISYM_CAF_GET)
4486 0 : expr = a->expr->value.function.actual->expr;
4487 : else
4488 : expr = a->expr;
4489 :
4490 218787 : if (expr == NULL || expr->expr_type != EXPR_VARIABLE)
4491 126866 : continue;
4492 :
4493 91921 : f_intent = f->sym->attr.intent;
4494 :
4495 91921 : if (gfc_pure (NULL) && gfc_impure_variable (expr->symtree->n.sym))
4496 : {
4497 412 : if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
4498 16 : && CLASS_DATA (f->sym)->attr.class_pointer)
4499 411 : || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
4500 : {
4501 2 : gfc_error ("Procedure argument at %L is local to a PURE "
4502 : "procedure and has the POINTER attribute",
4503 : &expr->where);
4504 2 : return false;
4505 : }
4506 : }
4507 :
4508 : /* Fortran 2008, C1283. */
4509 91919 : if (gfc_pure (NULL) && gfc_is_coindexed (expr))
4510 : {
4511 1 : if (f_intent == INTENT_INOUT || f_intent == INTENT_OUT)
4512 : {
4513 1 : gfc_error ("Coindexed actual argument at %L in PURE procedure "
4514 : "is passed to an INTENT(%s) argument",
4515 : &expr->where, gfc_intent_string (f_intent));
4516 1 : return false;
4517 : }
4518 :
4519 0 : if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
4520 0 : && CLASS_DATA (f->sym)->attr.class_pointer)
4521 0 : || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
4522 : {
4523 0 : gfc_error ("Coindexed actual argument at %L in PURE procedure "
4524 : "is passed to a POINTER dummy argument",
4525 : &expr->where);
4526 0 : return false;
4527 : }
4528 : }
4529 :
4530 : /* F2008, Section 12.5.2.4. */
4531 6514 : if (expr->ts.type == BT_CLASS && f->sym->ts.type == BT_CLASS
4532 97732 : && gfc_is_coindexed (expr))
4533 : {
4534 1 : gfc_error ("Coindexed polymorphic actual argument at %L is passed "
4535 : "polymorphic dummy argument %qs",
4536 1 : &expr->where, f->sym->name);
4537 1 : return false;
4538 : }
4539 218783 : }
4540 :
4541 : return true;
4542 : }
4543 :
4544 :
4545 : /* Check how a procedure is used against its interface. If all goes
4546 : well, the actual argument list will also end up being properly
4547 : sorted. */
4548 :
4549 : bool
4550 104489 : gfc_procedure_use (gfc_symbol *sym, gfc_actual_arglist **ap, locus *where)
4551 : {
4552 104489 : gfc_actual_arglist *a;
4553 104489 : gfc_formal_arglist *dummy_args;
4554 104489 : bool implicit = false;
4555 :
4556 : /* Warn about calls with an implicit interface. Special case
4557 : for calling a ISO_C_BINDING because c_loc and c_funloc
4558 : are pseudo-unknown. Additionally, warn about procedures not
4559 : explicitly declared at all if requested. */
4560 104489 : if (sym->attr.if_source == IFSRC_UNKNOWN && !sym->attr.is_iso_c)
4561 : {
4562 16434 : bool has_implicit_none_export = false;
4563 16434 : implicit = true;
4564 16434 : if (sym->attr.proc == PROC_UNKNOWN)
4565 23262 : for (gfc_namespace *ns = sym->ns; ns; ns = ns->parent)
4566 11722 : if (ns->has_implicit_none_export)
4567 : {
4568 : has_implicit_none_export = true;
4569 : break;
4570 : }
4571 11544 : if (has_implicit_none_export)
4572 : {
4573 4 : const char *guessed
4574 4 : = gfc_lookup_function_fuzzy (sym->name, sym->ns->sym_root);
4575 4 : if (guessed)
4576 1 : gfc_error ("Procedure %qs called at %L is not explicitly declared"
4577 : "; did you mean %qs?",
4578 : sym->name, where, guessed);
4579 : else
4580 3 : gfc_error ("Procedure %qs called at %L is not explicitly declared",
4581 : sym->name, where);
4582 4 : return false;
4583 : }
4584 16430 : if (warn_implicit_interface)
4585 0 : gfc_warning (OPT_Wimplicit_interface,
4586 : "Procedure %qs called with an implicit interface at %L",
4587 : sym->name, where);
4588 16430 : else if (warn_implicit_procedure && sym->attr.proc == PROC_UNKNOWN)
4589 1 : gfc_warning (OPT_Wimplicit_procedure,
4590 : "Procedure %qs called at %L is not explicitly declared",
4591 : sym->name, where);
4592 16430 : gfc_find_proc_namespace (sym->ns)->implicit_interface_calls = 1;
4593 : }
4594 :
4595 104485 : if (sym->attr.if_source == IFSRC_UNKNOWN)
4596 : {
4597 16430 : if (sym->attr.pointer)
4598 : {
4599 1 : gfc_error ("The pointer object %qs at %L must have an explicit "
4600 : "function interface or be declared as array",
4601 : sym->name, where);
4602 1 : return false;
4603 : }
4604 :
4605 16429 : if (sym->attr.allocatable && !sym->attr.external)
4606 : {
4607 1 : gfc_error ("The allocatable object %qs at %L must have an explicit "
4608 : "function interface or be declared as array",
4609 : sym->name, where);
4610 1 : return false;
4611 : }
4612 :
4613 16428 : if (sym->attr.allocatable)
4614 : {
4615 1 : gfc_error ("Allocatable function %qs at %L must have an explicit "
4616 : "function interface", sym->name, where);
4617 1 : return false;
4618 : }
4619 :
4620 46878 : for (a = *ap; a; a = a->next)
4621 : {
4622 30466 : if (a->expr && a->expr->error)
4623 : return false;
4624 :
4625 : /* F2018, 15.4.2.2 Explicit interface is required for a
4626 : polymorphic dummy argument, so there is no way to
4627 : legally have a class appear in an argument with an
4628 : implicit interface. */
4629 :
4630 30466 : if (implicit && a->expr && a->expr->ts.type == BT_CLASS)
4631 : {
4632 3 : gfc_error ("Explicit interface required for polymorphic "
4633 : "argument at %L",&a->expr->where);
4634 3 : a->expr->error = 1;
4635 3 : break;
4636 : }
4637 :
4638 : /* Skip g77 keyword extensions like %VAL, %REF, %LOC. */
4639 30463 : if (a->name != NULL && a->name[0] != '%')
4640 : {
4641 2 : gfc_error ("Keyword argument requires explicit interface "
4642 : "for procedure %qs at %L", sym->name, &a->expr->where);
4643 2 : break;
4644 : }
4645 :
4646 : /* TS 29113, 6.2. */
4647 30461 : if (a->expr && a->expr->ts.type == BT_ASSUMED
4648 3 : && sym->intmod_sym_id != ISOCBINDING_LOC)
4649 : {
4650 3 : gfc_error ("Assumed-type argument %s at %L requires an explicit "
4651 3 : "interface", a->expr->symtree->n.sym->name,
4652 : &a->expr->where);
4653 3 : a->expr->error = 1;
4654 3 : break;
4655 : }
4656 :
4657 : /* F2008, C1303 and C1304. */
4658 30458 : if (a->expr
4659 30283 : && (a->expr->ts.type == BT_DERIVED || a->expr->ts.type == BT_CLASS)
4660 73 : && a->expr->ts.u.derived
4661 30529 : && ((a->expr->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
4662 1 : && a->expr->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
4663 70 : || gfc_expr_attr (a->expr).lock_comp))
4664 : {
4665 1 : gfc_error ("Actual argument of LOCK_TYPE or with LOCK_TYPE "
4666 : "component at %L requires an explicit interface for "
4667 1 : "procedure %qs", &a->expr->where, sym->name);
4668 1 : a->expr->error = 1;
4669 1 : break;
4670 : }
4671 :
4672 30457 : if (a->expr
4673 30282 : && (a->expr->ts.type == BT_DERIVED || a->expr->ts.type == BT_CLASS)
4674 72 : && a->expr->ts.u.derived
4675 30527 : && ((a->expr->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
4676 0 : && a->expr->ts.u.derived->intmod_sym_id
4677 : == ISOFORTRAN_EVENT_TYPE)
4678 70 : || gfc_expr_attr (a->expr).event_comp))
4679 : {
4680 0 : gfc_error ("Actual argument of EVENT_TYPE or with EVENT_TYPE "
4681 : "component at %L requires an explicit interface for "
4682 0 : "procedure %qs", &a->expr->where, sym->name);
4683 0 : a->expr->error = 1;
4684 0 : break;
4685 : }
4686 :
4687 30457 : if (a->expr && a->expr->expr_type == EXPR_NULL
4688 2 : && a->expr->ts.type == BT_UNKNOWN)
4689 : {
4690 1 : gfc_error ("MOLD argument to NULL required at %L",
4691 : &a->expr->where);
4692 1 : a->expr->error = 1;
4693 1 : return false;
4694 : }
4695 :
4696 30456 : if (a->expr && a->expr->expr_type == EXPR_NULL)
4697 : {
4698 1 : gfc_error ("Passing intrinsic NULL as actual argument at %L "
4699 : "requires an explicit interface", &a->expr->where);
4700 1 : a->expr->error = 1;
4701 1 : return false;
4702 : }
4703 :
4704 : /* TS 29113, C407b. */
4705 30280 : if (a->expr && a->expr->expr_type == EXPR_VARIABLE
4706 43739 : && gfc_symbol_rank (a->expr->symtree->n.sym) == -1)
4707 : {
4708 4 : gfc_error ("Assumed-rank argument requires an explicit interface "
4709 4 : "at %L", &a->expr->where);
4710 4 : a->expr->error = 1;
4711 4 : return false;
4712 : }
4713 : }
4714 :
4715 16421 : if (implicit)
4716 46881 : for (a = *ap; a; a = a->next)
4717 30460 : if (a->expr)
4718 30285 : gfc_value_set_and_used (a->expr, &a->expr->where, VALUE_ARG,
4719 : VALUE_MAYBE_USED);
4720 :
4721 16421 : return true;
4722 : }
4723 :
4724 88055 : dummy_args = gfc_sym_get_dummy_args (sym);
4725 :
4726 : /* For a statement function, check that types and type parameters of actual
4727 : arguments and dummy arguments match. */
4728 88055 : if (!gfc_compare_actual_formal (ap, dummy_args, 0, sym->attr.elemental,
4729 88055 : sym->attr.proc == PROC_ST_FUNCTION, where))
4730 : return false;
4731 :
4732 87616 : if (!check_intents (dummy_args, *ap))
4733 : return false;
4734 :
4735 87612 : if (warn_aliasing)
4736 725 : check_some_aliasing (dummy_args, *ap);
4737 :
4738 : return true;
4739 : }
4740 :
4741 :
4742 : /* Check how a procedure pointer component is used against its interface.
4743 : If all goes well, the actual argument list will also end up being properly
4744 : sorted. Completely analogous to gfc_procedure_use. */
4745 :
4746 : void
4747 569 : gfc_ppc_use (gfc_component *comp, gfc_actual_arglist **ap, locus *where)
4748 : {
4749 : /* Warn about calls with an implicit interface. Special case
4750 : for calling a ISO_C_BINDING because c_loc and c_funloc
4751 : are pseudo-unknown. */
4752 569 : if (warn_implicit_interface
4753 0 : && comp->attr.if_source == IFSRC_UNKNOWN
4754 0 : && !comp->attr.is_iso_c)
4755 0 : gfc_warning (OPT_Wimplicit_interface,
4756 : "Procedure pointer component %qs called with an implicit "
4757 : "interface at %L", comp->name, where);
4758 :
4759 569 : if (comp->attr.if_source == IFSRC_UNKNOWN)
4760 : {
4761 60 : gfc_actual_arglist *a;
4762 105 : for (a = *ap; a; a = a->next)
4763 : {
4764 : /* Skip g77 keyword extensions like %VAL, %REF, %LOC. */
4765 45 : if (a->name != NULL && a->name[0] != '%')
4766 : {
4767 0 : gfc_error ("Keyword argument requires explicit interface "
4768 : "for procedure pointer component %qs at %L",
4769 0 : comp->name, &a->expr->where);
4770 0 : break;
4771 : }
4772 : }
4773 :
4774 60 : return;
4775 : }
4776 :
4777 509 : if (!gfc_compare_actual_formal (ap, comp->ts.interface->formal, 0,
4778 509 : comp->attr.elemental, false, where))
4779 : return;
4780 :
4781 509 : check_intents (comp->ts.interface->formal, *ap);
4782 509 : if (warn_aliasing)
4783 0 : check_some_aliasing (comp->ts.interface->formal, *ap);
4784 : }
4785 :
4786 :
4787 : /* Try if an actual argument list matches the formal list of a symbol,
4788 : respecting the symbol's attributes like ELEMENTAL. This is used for
4789 : GENERIC resolution. */
4790 :
4791 : bool
4792 92712 : gfc_arglist_matches_symbol (gfc_actual_arglist** args, gfc_symbol* sym)
4793 : {
4794 92712 : gfc_formal_arglist *dummy_args;
4795 92712 : bool r;
4796 :
4797 92712 : if (sym->attr.flavor != FL_PROCEDURE)
4798 : return false;
4799 :
4800 92708 : dummy_args = gfc_sym_get_dummy_args (sym);
4801 :
4802 92708 : r = !sym->attr.elemental;
4803 92708 : if (gfc_compare_actual_formal (args, dummy_args, r, !r, false, NULL))
4804 : {
4805 25927 : check_intents (dummy_args, *args);
4806 25927 : if (warn_aliasing)
4807 12 : check_some_aliasing (dummy_args, *args);
4808 25927 : return true;
4809 : }
4810 :
4811 : return false;
4812 : }
4813 :
4814 :
4815 : /* Given an interface pointer and an actual argument list, search for
4816 : a formal argument list that matches the actual. If found, returns
4817 : a pointer to the symbol of the correct interface. Returns NULL if
4818 : not found. */
4819 :
4820 : gfc_symbol *
4821 45664 : gfc_search_interface (gfc_interface *intr, int sub_flag,
4822 : gfc_actual_arglist **ap)
4823 : {
4824 45664 : gfc_symbol *elem_sym = NULL;
4825 45664 : gfc_symbol *null_sym = NULL;
4826 45664 : locus null_expr_loc;
4827 45664 : gfc_actual_arglist *a;
4828 45664 : bool has_null_arg = false;
4829 :
4830 127205 : for (a = *ap; a; a = a->next)
4831 81670 : if (a->expr && a->expr->expr_type == EXPR_NULL
4832 175 : && a->expr->ts.type == BT_UNKNOWN)
4833 : {
4834 129 : has_null_arg = true;
4835 129 : null_expr_loc = a->expr->where;
4836 129 : break;
4837 : }
4838 :
4839 131964 : for (; intr; intr = intr->next)
4840 : {
4841 97243 : if (gfc_fl_struct (intr->sym->attr.flavor))
4842 6598 : continue;
4843 90645 : if (sub_flag && intr->sym->attr.function)
4844 0 : continue;
4845 83695 : if (!sub_flag && intr->sym->attr.subroutine)
4846 0 : continue;
4847 :
4848 90645 : if (gfc_arglist_matches_symbol (ap, intr->sym))
4849 : {
4850 24666 : if (has_null_arg && null_sym)
4851 : {
4852 2 : gfc_error ("MOLD= required in NULL() argument at %L: Ambiguity "
4853 : "between specific functions %s and %s",
4854 2 : &null_expr_loc, null_sym->name, intr->sym->name);
4855 2 : return NULL;
4856 : }
4857 24664 : else if (has_null_arg)
4858 : {
4859 4 : null_sym = intr->sym;
4860 4 : continue;
4861 : }
4862 :
4863 : /* Satisfy 12.4.4.1 such that an elemental match has lower
4864 : weight than a non-elemental match. */
4865 24660 : if (intr->sym->attr.elemental)
4866 : {
4867 13719 : elem_sym = intr->sym;
4868 13719 : continue;
4869 : }
4870 : return intr->sym;
4871 : }
4872 : }
4873 :
4874 34721 : if (null_sym)
4875 2 : return null_sym;
4876 :
4877 : return elem_sym ? elem_sym : NULL;
4878 : }
4879 :
4880 :
4881 : /* Do a brute force recursive search for a symbol. */
4882 :
4883 : static gfc_symtree *
4884 58804 : find_symtree0 (gfc_symtree *root, gfc_symbol *sym)
4885 : {
4886 113740 : gfc_symtree * st;
4887 :
4888 113740 : if (root->n.sym == sym)
4889 : return root;
4890 :
4891 112717 : st = NULL;
4892 112717 : if (root->left)
4893 57724 : st = find_symtree0 (root->left, sym);
4894 112717 : if (root->right && ! st)
4895 : st = find_symtree0 (root->right, sym);
4896 : return st;
4897 : }
4898 :
4899 :
4900 : /* Find a symtree for a symbol. */
4901 :
4902 : gfc_symtree *
4903 4648 : gfc_find_sym_in_symtree (gfc_symbol *sym)
4904 : {
4905 4648 : gfc_symtree *st;
4906 4648 : gfc_namespace *ns;
4907 :
4908 : /* First try to find it by name. */
4909 4648 : gfc_find_sym_tree (sym->name, gfc_current_ns, 1, &st);
4910 4648 : if (st && st->n.sym == sym)
4911 : return st;
4912 :
4913 : /* If it's been renamed, resort to a brute-force search. */
4914 : /* TODO: avoid having to do this search. If the symbol doesn't exist
4915 : in the symtree for the current namespace, it should probably be added. */
4916 1080 : for (ns = gfc_current_ns; ns; ns = ns->parent)
4917 : {
4918 1080 : st = find_symtree0 (ns->sym_root, sym);
4919 1080 : if (st)
4920 : return st;
4921 : }
4922 0 : gfc_internal_error ("Unable to find symbol %qs", sym->name);
4923 : /* Not reached. */
4924 : }
4925 :
4926 :
4927 : /* See if the arglist to an operator-call contains a derived-type argument
4928 : with a matching type-bound operator. If so, return the matching specific
4929 : procedure defined as operator-target as well as the base-object to use
4930 : (which is the found derived-type argument with operator). The generic
4931 : name, if any, is transmitted to the final expression via 'gname'. */
4932 :
4933 : static gfc_typebound_proc*
4934 13663 : matching_typebound_op (gfc_expr** tb_base,
4935 : gfc_actual_arglist* args,
4936 : gfc_intrinsic_op op, const char* uop,
4937 : const char ** gname)
4938 : {
4939 13663 : gfc_actual_arglist* base;
4940 :
4941 39228 : for (base = args; base; base = base->next)
4942 26393 : if (base->expr->ts.type == BT_DERIVED || base->expr->ts.type == BT_CLASS)
4943 : {
4944 : gfc_typebound_proc* tb;
4945 : gfc_symbol* derived;
4946 : bool result;
4947 :
4948 22358 : while (base->expr->expr_type == EXPR_OP
4949 22358 : && base->expr->value.op.op == INTRINSIC_PARENTHESES)
4950 123 : base->expr = base->expr->value.op.op1;
4951 :
4952 22235 : if (base->expr->ts.type == BT_CLASS)
4953 : {
4954 1936 : if (!base->expr->ts.u.derived || CLASS_DATA (base->expr) == NULL
4955 3869 : || !gfc_expr_attr (base->expr).class_ok)
4956 87 : continue;
4957 1850 : derived = CLASS_DATA (base->expr)->ts.u.derived;
4958 : }
4959 : else
4960 20298 : derived = base->expr->ts.u.derived;
4961 :
4962 : /* A use associated derived type is resolvable during parsing. */
4963 22148 : if (derived && derived->attr.use_assoc && !gfc_current_ns->resolved)
4964 4015 : gfc_resolve_symbol (derived);
4965 :
4966 22148 : if (op == INTRINSIC_USER)
4967 : {
4968 222 : gfc_symtree* tb_uop;
4969 :
4970 222 : gcc_assert (uop);
4971 222 : tb_uop = gfc_find_typebound_user_op (derived, &result, uop,
4972 : false, NULL);
4973 :
4974 222 : if (tb_uop)
4975 84 : tb = tb_uop->n.tb;
4976 : else
4977 : tb = NULL;
4978 : }
4979 : else
4980 21926 : tb = gfc_find_typebound_intrinsic_op (derived, &result, op,
4981 : false, NULL);
4982 :
4983 : /* This means we hit a PRIVATE operator which is use-associated and
4984 : should thus not be seen. */
4985 22148 : if (!result)
4986 21170 : tb = NULL;
4987 :
4988 : /* Look through the super-type hierarchy for a matching specific
4989 : binding. */
4990 22298 : for (; tb; tb = tb->overridden)
4991 : {
4992 978 : gfc_tbp_generic* g;
4993 :
4994 978 : gcc_assert (tb->is_generic);
4995 1550 : for (g = tb->u.generic; g; g = g->next)
4996 : {
4997 1400 : gfc_symbol* target;
4998 1400 : gfc_actual_arglist* argcopy;
4999 1400 : bool matches;
5000 :
5001 : /* If expression matching comes here during parsing, eg. when
5002 : parsing ASSOCIATE, generic TBPs have not yet been resolved
5003 : and g->specific will not have been set. Wait for expression
5004 : resolution by returning NULL. */
5005 1400 : if (!g->specific && !gfc_current_ns->resolved)
5006 828 : return NULL;
5007 :
5008 1400 : gcc_assert (g->specific);
5009 1400 : if (g->specific->error)
5010 0 : continue;
5011 :
5012 1400 : target = g->specific->u.specific->n.sym;
5013 :
5014 : /* Check if this arglist matches the formal. */
5015 1400 : argcopy = gfc_copy_actual_arglist (args);
5016 1400 : matches = gfc_arglist_matches_symbol (&argcopy, target);
5017 1400 : gfc_free_actual_arglist (argcopy);
5018 :
5019 : /* Return if we found a match. */
5020 1400 : if (matches)
5021 : {
5022 828 : *tb_base = base->expr;
5023 828 : *gname = g->specific_st->name;
5024 828 : return g->specific;
5025 : }
5026 : }
5027 : }
5028 : }
5029 :
5030 : return NULL;
5031 : }
5032 :
5033 :
5034 : /* For the 'actual arglist' of an operator call and a specific typebound
5035 : procedure that has been found the target of a type-bound operator, build the
5036 : appropriate EXPR_COMPCALL and resolve it. We take this indirection over
5037 : type-bound procedures rather than resolving type-bound operators 'directly'
5038 : so that we can reuse the existing logic. */
5039 :
5040 : static void
5041 828 : build_compcall_for_operator (gfc_expr* e, gfc_actual_arglist* actual,
5042 : gfc_expr* base, gfc_typebound_proc* target,
5043 : const char *gname)
5044 : {
5045 828 : e->expr_type = EXPR_COMPCALL;
5046 828 : e->value.compcall.tbp = target;
5047 828 : e->value.compcall.name = gname ? gname : "$op";
5048 828 : e->value.compcall.actual = actual;
5049 828 : e->value.compcall.base_object = base;
5050 828 : e->value.compcall.ignore_pass = 1;
5051 828 : e->value.compcall.assign = 0;
5052 828 : if (e->ts.type == BT_UNKNOWN
5053 810 : && target->function)
5054 : {
5055 361 : if (target->is_generic)
5056 0 : e->ts = target->u.generic->specific->u.specific->n.sym->ts;
5057 : else
5058 361 : e->ts = target->u.specific->n.sym->ts;
5059 : }
5060 828 : }
5061 :
5062 :
5063 : /* This subroutine is called when an expression is being resolved.
5064 : The expression node in question is either a user defined operator
5065 : or an intrinsic operator with arguments that aren't compatible
5066 : with the operator. This subroutine builds an actual argument list
5067 : corresponding to the operands, then searches for a compatible
5068 : interface. If one is found, the expression node is replaced with
5069 : the appropriate function call. We use the 'match' enum to specify
5070 : whether a replacement has been made or not, or if an error occurred. */
5071 :
5072 : match
5073 2230 : gfc_extend_expr (gfc_expr *e)
5074 : {
5075 2230 : gfc_actual_arglist *actual;
5076 2230 : gfc_symbol *sym;
5077 2230 : gfc_namespace *ns;
5078 2230 : gfc_user_op *uop;
5079 2230 : gfc_intrinsic_op i;
5080 2230 : const char *gname;
5081 2230 : gfc_typebound_proc* tbo;
5082 2230 : gfc_expr* tb_base;
5083 :
5084 2230 : sym = NULL;
5085 :
5086 2230 : actual = gfc_get_actual_arglist ();
5087 2230 : actual->expr = e->value.op.op1;
5088 :
5089 2230 : gname = NULL;
5090 :
5091 2230 : if (e->value.op.op2 != NULL)
5092 : {
5093 2003 : actual->next = gfc_get_actual_arglist ();
5094 2003 : actual->next->expr = e->value.op.op2;
5095 : }
5096 :
5097 2230 : i = fold_unary_intrinsic (e->value.op.op);
5098 :
5099 : /* See if we find a matching type-bound operator. */
5100 2216 : if (i == INTRINSIC_USER)
5101 326 : tbo = matching_typebound_op (&tb_base, actual,
5102 326 : i, e->value.op.uop->name, &gname);
5103 : else
5104 1904 : switch (i)
5105 : {
5106 : #define CHECK_OS_COMPARISON(comp) \
5107 : case INTRINSIC_##comp: \
5108 : case INTRINSIC_##comp##_OS: \
5109 : tbo = matching_typebound_op (&tb_base, actual, \
5110 : INTRINSIC_##comp, NULL, &gname); \
5111 : if (!tbo) \
5112 : tbo = matching_typebound_op (&tb_base, actual, \
5113 : INTRINSIC_##comp##_OS, NULL, &gname); \
5114 : break;
5115 193 : CHECK_OS_COMPARISON(EQ)
5116 828 : CHECK_OS_COMPARISON(NE)
5117 41 : CHECK_OS_COMPARISON(GT)
5118 40 : CHECK_OS_COMPARISON(GE)
5119 78 : CHECK_OS_COMPARISON(LT)
5120 40 : CHECK_OS_COMPARISON(LE)
5121 : #undef CHECK_OS_COMPARISON
5122 :
5123 684 : default:
5124 684 : tbo = matching_typebound_op (&tb_base, actual, i, NULL, &gname);
5125 684 : break;
5126 : }
5127 :
5128 : /* If there is a matching typebound-operator, replace the expression with
5129 : a call to it and succeed. */
5130 2226 : if (tbo)
5131 : {
5132 379 : gcc_assert (tb_base);
5133 379 : build_compcall_for_operator (e, actual, tb_base, tbo, gname);
5134 :
5135 379 : if (!gfc_resolve_expr (e))
5136 : return MATCH_ERROR;
5137 : else
5138 : return MATCH_YES;
5139 : }
5140 :
5141 1851 : if (i == INTRINSIC_USER)
5142 : {
5143 267 : for (ns = gfc_current_ns; ns; ns = ns->parent)
5144 : {
5145 257 : uop = gfc_find_uop (e->value.op.uop->name, ns);
5146 257 : if (uop == NULL)
5147 0 : continue;
5148 :
5149 257 : sym = gfc_search_interface (uop->op, 0, &actual);
5150 257 : if (sym != NULL)
5151 : break;
5152 : }
5153 : }
5154 : else
5155 : {
5156 1923 : for (ns = gfc_current_ns; ns; ns = ns->parent)
5157 : {
5158 : /* Due to the distinction between '==' and '.eq.' and friends, one has
5159 : to check if either is defined. */
5160 1683 : switch (i)
5161 : {
5162 : #define CHECK_OS_COMPARISON(comp) \
5163 : case INTRINSIC_##comp: \
5164 : case INTRINSIC_##comp##_OS: \
5165 : sym = gfc_search_interface (ns->op[INTRINSIC_##comp], 0, &actual); \
5166 : if (!sym) \
5167 : sym = gfc_search_interface (ns->op[INTRINSIC_##comp##_OS], 0, &actual); \
5168 : break;
5169 196 : CHECK_OS_COMPARISON(EQ)
5170 872 : CHECK_OS_COMPARISON(NE)
5171 41 : CHECK_OS_COMPARISON(GT)
5172 40 : CHECK_OS_COMPARISON(GE)
5173 65 : CHECK_OS_COMPARISON(LT)
5174 40 : CHECK_OS_COMPARISON(LE)
5175 : #undef CHECK_OS_COMPARISON
5176 :
5177 429 : default:
5178 429 : sym = gfc_search_interface (ns->op[i], 0, &actual);
5179 : }
5180 :
5181 1449 : if (sym != NULL)
5182 : break;
5183 : }
5184 :
5185 : /* F2018(15.4.3.4.2) requires that the use of unlimited polymorphic
5186 : formal arguments does not override the intrinsic uses. */
5187 1608 : gfc_push_suppress_errors ();
5188 1608 : if (sym
5189 1368 : && (UNLIMITED_POLY (sym->formal->sym)
5190 1358 : || (sym->formal->next
5191 1332 : && UNLIMITED_POLY (sym->formal->next->sym)))
5192 1618 : && !gfc_check_operator_interface (sym, e->value.op.op, e->where))
5193 0 : sym = NULL;
5194 1608 : gfc_pop_suppress_errors ();
5195 : }
5196 :
5197 : /* TODO: Do an ambiguity-check and error if multiple matching interfaces are
5198 : found rather than just taking the first one and not checking further. */
5199 :
5200 1851 : if (sym == NULL)
5201 : {
5202 : /* Don't use gfc_free_actual_arglist(). */
5203 250 : free (actual->next);
5204 250 : free (actual);
5205 250 : return MATCH_NO;
5206 : }
5207 :
5208 : /* Change the expression node to a function call. */
5209 1601 : e->expr_type = EXPR_FUNCTION;
5210 1601 : e->symtree = gfc_find_sym_in_symtree (sym);
5211 1601 : e->value.function.actual = actual;
5212 1601 : e->value.function.esym = NULL;
5213 1601 : e->value.function.isym = NULL;
5214 1601 : e->value.function.name = NULL;
5215 1601 : e->user_operator = 1;
5216 :
5217 1601 : if (!gfc_resolve_expr (e))
5218 : return MATCH_ERROR;
5219 :
5220 : return MATCH_YES;
5221 : }
5222 :
5223 :
5224 : /* Tries to replace an assignment code node with a subroutine call to the
5225 : subroutine associated with the assignment operator. Return true if the node
5226 : was replaced. On false, no error is generated. */
5227 :
5228 : bool
5229 286825 : gfc_extend_assign (gfc_code *c, gfc_namespace *ns)
5230 : {
5231 286825 : gfc_actual_arglist *actual;
5232 286825 : gfc_expr *lhs, *rhs, *tb_base;
5233 286825 : gfc_symbol *sym = NULL;
5234 286825 : const char *gname = NULL;
5235 286825 : gfc_typebound_proc* tbo;
5236 :
5237 286825 : lhs = c->expr1;
5238 286825 : rhs = c->expr2;
5239 :
5240 : /* Don't allow an intrinsic assignment with a BOZ rhs to be replaced. */
5241 286825 : if (c->op == EXEC_ASSIGN
5242 286825 : && c->expr1->expr_type == EXPR_VARIABLE
5243 286825 : && c->expr2->expr_type == EXPR_CONSTANT && c->expr2->ts.type == BT_BOZ)
5244 : return false;
5245 :
5246 : /* Don't allow an intrinsic assignment to be replaced. */
5247 278842 : if (lhs->ts.type != BT_DERIVED && lhs->ts.type != BT_CLASS
5248 277728 : && (rhs->rank == 0 || rhs->rank == lhs->rank)
5249 564526 : && (lhs->ts.type == rhs->ts.type
5250 6834 : || (gfc_numeric_ts (&lhs->ts) && gfc_numeric_ts (&rhs->ts))))
5251 276605 : return false;
5252 :
5253 10217 : actual = gfc_get_actual_arglist ();
5254 10217 : actual->expr = lhs;
5255 :
5256 10217 : actual->next = gfc_get_actual_arglist ();
5257 10217 : actual->next->expr = rhs;
5258 :
5259 : /* TODO: Ambiguity-check, see above for gfc_extend_expr. */
5260 :
5261 : /* See if we find a matching type-bound assignment. */
5262 10217 : tbo = matching_typebound_op (&tb_base, actual, INTRINSIC_ASSIGN,
5263 : NULL, &gname);
5264 :
5265 10217 : if (tbo)
5266 : {
5267 : /* Success: Replace the expression with a type-bound call. */
5268 449 : gcc_assert (tb_base);
5269 449 : c->expr1 = gfc_get_expr ();
5270 449 : build_compcall_for_operator (c->expr1, actual, tb_base, tbo, gname);
5271 449 : c->expr1->value.compcall.assign = 1;
5272 449 : c->expr1->where = c->loc;
5273 449 : c->expr2 = NULL;
5274 449 : c->op = EXEC_COMPCALL;
5275 449 : return true;
5276 : }
5277 :
5278 : /* See if we find an 'ordinary' (non-typebound) assignment procedure. */
5279 22778 : for (; ns; ns = ns->parent)
5280 : {
5281 13479 : sym = gfc_search_interface (ns->op[INTRINSIC_ASSIGN], 1, &actual);
5282 13479 : if (sym != NULL)
5283 : break;
5284 : }
5285 :
5286 9768 : if (sym)
5287 : {
5288 : /* Success: Replace the assignment with the call. */
5289 469 : c->op = EXEC_ASSIGN_CALL;
5290 469 : c->symtree = gfc_find_sym_in_symtree (sym);
5291 469 : c->expr1 = NULL;
5292 469 : c->expr2 = NULL;
5293 469 : c->ext.actual = actual;
5294 469 : return true;
5295 : }
5296 :
5297 : /* Failure: No assignment procedure found. */
5298 9299 : free (actual->next);
5299 9299 : free (actual);
5300 9299 : return false;
5301 : }
5302 :
5303 :
5304 : /* Make sure that the interface just parsed is not already present in
5305 : the given interface list. Ambiguity isn't checked yet since module
5306 : procedures can be present without interfaces. */
5307 :
5308 : bool
5309 10149 : gfc_check_new_interface (gfc_interface *base, gfc_symbol *new_sym, locus loc)
5310 : {
5311 10149 : gfc_interface *ip;
5312 :
5313 19986 : for (ip = base; ip; ip = ip->next)
5314 : {
5315 9844 : if (ip->sym == new_sym)
5316 : {
5317 7 : gfc_error ("Entity %qs at %L is already present in the interface",
5318 : new_sym->name, &loc);
5319 7 : return false;
5320 : }
5321 : }
5322 :
5323 : return true;
5324 : }
5325 :
5326 :
5327 : /* Add a symbol to the current interface. */
5328 :
5329 : bool
5330 18480 : gfc_add_interface (gfc_symbol *new_sym)
5331 : {
5332 18480 : gfc_interface **head, *intr;
5333 18480 : gfc_namespace *ns;
5334 18480 : gfc_symbol *sym;
5335 :
5336 18480 : switch (current_interface.type)
5337 : {
5338 : case INTERFACE_NAMELESS:
5339 : case INTERFACE_ABSTRACT:
5340 : return true;
5341 :
5342 672 : case INTERFACE_INTRINSIC_OP:
5343 1347 : for (ns = current_interface.ns; ns; ns = ns->parent)
5344 678 : switch (current_interface.op)
5345 : {
5346 75 : case INTRINSIC_EQ:
5347 75 : case INTRINSIC_EQ_OS:
5348 75 : if (!gfc_check_new_interface (ns->op[INTRINSIC_EQ], new_sym,
5349 : gfc_current_locus)
5350 75 : || !gfc_check_new_interface (ns->op[INTRINSIC_EQ_OS],
5351 : new_sym, gfc_current_locus))
5352 2 : return false;
5353 : break;
5354 :
5355 44 : case INTRINSIC_NE:
5356 44 : case INTRINSIC_NE_OS:
5357 44 : if (!gfc_check_new_interface (ns->op[INTRINSIC_NE], new_sym,
5358 : gfc_current_locus)
5359 44 : || !gfc_check_new_interface (ns->op[INTRINSIC_NE_OS],
5360 : new_sym, gfc_current_locus))
5361 0 : return false;
5362 : break;
5363 :
5364 19 : case INTRINSIC_GT:
5365 19 : case INTRINSIC_GT_OS:
5366 19 : if (!gfc_check_new_interface (ns->op[INTRINSIC_GT],
5367 : new_sym, gfc_current_locus)
5368 19 : || !gfc_check_new_interface (ns->op[INTRINSIC_GT_OS],
5369 : new_sym, gfc_current_locus))
5370 0 : return false;
5371 : break;
5372 :
5373 17 : case INTRINSIC_GE:
5374 17 : case INTRINSIC_GE_OS:
5375 17 : if (!gfc_check_new_interface (ns->op[INTRINSIC_GE],
5376 : new_sym, gfc_current_locus)
5377 17 : || !gfc_check_new_interface (ns->op[INTRINSIC_GE_OS],
5378 : new_sym, gfc_current_locus))
5379 0 : return false;
5380 : break;
5381 :
5382 29 : case INTRINSIC_LT:
5383 29 : case INTRINSIC_LT_OS:
5384 29 : if (!gfc_check_new_interface (ns->op[INTRINSIC_LT],
5385 : new_sym, gfc_current_locus)
5386 29 : || !gfc_check_new_interface (ns->op[INTRINSIC_LT_OS],
5387 : new_sym, gfc_current_locus))
5388 0 : return false;
5389 : break;
5390 :
5391 17 : case INTRINSIC_LE:
5392 17 : case INTRINSIC_LE_OS:
5393 17 : if (!gfc_check_new_interface (ns->op[INTRINSIC_LE],
5394 : new_sym, gfc_current_locus)
5395 17 : || !gfc_check_new_interface (ns->op[INTRINSIC_LE_OS],
5396 : new_sym, gfc_current_locus))
5397 0 : return false;
5398 : break;
5399 :
5400 477 : default:
5401 477 : if (!gfc_check_new_interface (ns->op[current_interface.op],
5402 : new_sym, gfc_current_locus))
5403 : return false;
5404 : }
5405 :
5406 669 : head = ¤t_interface.ns->op[current_interface.op];
5407 669 : break;
5408 :
5409 8735 : case INTERFACE_GENERIC:
5410 8735 : case INTERFACE_DTIO:
5411 17479 : for (ns = current_interface.ns; ns; ns = ns->parent)
5412 : {
5413 8745 : gfc_find_symbol (current_interface.sym->name, ns, 0, &sym);
5414 8745 : if (sym == NULL)
5415 11 : continue;
5416 :
5417 8734 : if (!gfc_check_new_interface (sym->generic,
5418 : new_sym, gfc_current_locus))
5419 : return false;
5420 : }
5421 :
5422 8734 : head = ¤t_interface.sym->generic;
5423 8734 : break;
5424 :
5425 168 : case INTERFACE_USER_OP:
5426 168 : if (!gfc_check_new_interface (current_interface.uop->op,
5427 : new_sym, gfc_current_locus))
5428 : return false;
5429 :
5430 167 : head = ¤t_interface.uop->op;
5431 167 : break;
5432 :
5433 0 : default:
5434 0 : gfc_internal_error ("gfc_add_interface(): Bad interface type");
5435 : }
5436 :
5437 9570 : intr = gfc_get_interface ();
5438 9570 : intr->sym = new_sym;
5439 9570 : intr->where = gfc_current_locus;
5440 :
5441 9570 : intr->next = *head;
5442 9570 : *head = intr;
5443 :
5444 9570 : return true;
5445 : }
5446 :
5447 :
5448 : gfc_interface *&
5449 93137 : gfc_current_interface_head (void)
5450 : {
5451 93137 : switch (current_interface.type)
5452 : {
5453 12183 : case INTERFACE_INTRINSIC_OP:
5454 12183 : return current_interface.ns->op[current_interface.op];
5455 :
5456 78103 : case INTERFACE_GENERIC:
5457 78103 : case INTERFACE_DTIO:
5458 78103 : return current_interface.sym->generic;
5459 :
5460 2851 : case INTERFACE_USER_OP:
5461 2851 : return current_interface.uop->op;
5462 :
5463 0 : default:
5464 0 : gcc_unreachable ();
5465 : }
5466 : }
5467 :
5468 :
5469 : void
5470 3 : gfc_set_current_interface_head (gfc_interface *i)
5471 : {
5472 3 : switch (current_interface.type)
5473 : {
5474 0 : case INTERFACE_INTRINSIC_OP:
5475 0 : current_interface.ns->op[current_interface.op] = i;
5476 0 : break;
5477 :
5478 3 : case INTERFACE_GENERIC:
5479 3 : case INTERFACE_DTIO:
5480 3 : current_interface.sym->generic = i;
5481 3 : break;
5482 :
5483 0 : case INTERFACE_USER_OP:
5484 0 : current_interface.uop->op = i;
5485 0 : break;
5486 :
5487 0 : default:
5488 0 : gcc_unreachable ();
5489 : }
5490 3 : }
5491 :
5492 :
5493 : /* Gets rid of a formal argument list. We do not free symbols.
5494 : Symbols are freed when a namespace is freed. */
5495 :
5496 : void
5497 6328219 : gfc_free_formal_arglist (gfc_formal_arglist *p)
5498 : {
5499 6328219 : gfc_formal_arglist *q;
5500 :
5501 7074617 : for (; p; p = q)
5502 : {
5503 746398 : q = p->next;
5504 746398 : free (p);
5505 : }
5506 6328219 : }
5507 :
5508 :
5509 : /* Check that it is ok for the type-bound procedure 'proc' to override the
5510 : procedure 'old', cf. F08:4.5.7.3. */
5511 :
5512 : bool
5513 1218 : gfc_check_typebound_override (gfc_symtree* proc, gfc_symtree* old)
5514 : {
5515 1218 : locus where;
5516 1218 : gfc_symbol *proc_target, *old_target;
5517 1218 : unsigned proc_pass_arg, old_pass_arg, argpos;
5518 1218 : gfc_formal_arglist *proc_formal, *old_formal;
5519 1218 : bool check_type;
5520 1218 : char err[200];
5521 :
5522 : /* This procedure should only be called for non-GENERIC proc. */
5523 1218 : gcc_assert (!proc->n.tb->is_generic);
5524 :
5525 : /* If the overwritten procedure is GENERIC, this is an error. */
5526 1218 : if (old->n.tb->is_generic)
5527 : {
5528 1 : gfc_error ("Cannot overwrite GENERIC %qs at %L",
5529 : old->name, &proc->n.tb->where);
5530 1 : return false;
5531 : }
5532 :
5533 1217 : where = proc->n.tb->where;
5534 1217 : proc_target = proc->n.tb->u.specific->n.sym;
5535 1217 : old_target = old->n.tb->u.specific->n.sym;
5536 :
5537 : /* Check that overridden binding is not NON_OVERRIDABLE. */
5538 1217 : if (old->n.tb->non_overridable)
5539 : {
5540 1 : gfc_error ("%qs at %L overrides a procedure binding declared"
5541 : " NON_OVERRIDABLE", proc->name, &where);
5542 1 : return false;
5543 : }
5544 :
5545 : /* It's an error to override a non-DEFERRED procedure with a DEFERRED one. */
5546 1216 : if (!old->n.tb->deferred && proc->n.tb->deferred)
5547 : {
5548 1 : gfc_error ("%qs at %L must not be DEFERRED as it overrides a"
5549 : " non-DEFERRED binding", proc->name, &where);
5550 1 : return false;
5551 : }
5552 :
5553 : /* If the overridden binding is PURE, the overriding must be, too. */
5554 1215 : if (old_target->attr.pure && !proc_target->attr.pure)
5555 : {
5556 2 : gfc_error ("%qs at %L overrides a PURE procedure and must also be PURE",
5557 : proc->name, &where);
5558 2 : return false;
5559 : }
5560 :
5561 : /* If the overridden binding is ELEMENTAL, the overriding must be, too. If it
5562 : is not, the overriding must not be either. */
5563 1213 : if (old_target->attr.elemental && !proc_target->attr.elemental)
5564 : {
5565 0 : gfc_error ("%qs at %L overrides an ELEMENTAL procedure and must also be"
5566 : " ELEMENTAL", proc->name, &where);
5567 0 : return false;
5568 : }
5569 1213 : if (!old_target->attr.elemental && proc_target->attr.elemental)
5570 : {
5571 1 : gfc_error ("%qs at %L overrides a non-ELEMENTAL procedure and must not"
5572 : " be ELEMENTAL, either", proc->name, &where);
5573 1 : return false;
5574 : }
5575 :
5576 : /* If the overridden binding is a SUBROUTINE, the overriding must also be a
5577 : SUBROUTINE. */
5578 1212 : if (old_target->attr.subroutine && !proc_target->attr.subroutine)
5579 : {
5580 1 : gfc_error ("%qs at %L overrides a SUBROUTINE and must also be a"
5581 : " SUBROUTINE", proc->name, &where);
5582 1 : return false;
5583 : }
5584 :
5585 : /* If the overridden binding is a FUNCTION, the overriding must also be a
5586 : FUNCTION and have the same characteristics. */
5587 1211 : if (old_target->attr.function)
5588 : {
5589 661 : if (!proc_target->attr.function)
5590 : {
5591 1 : gfc_error ("%qs at %L overrides a FUNCTION and must also be a"
5592 : " FUNCTION", proc->name, &where);
5593 1 : return false;
5594 : }
5595 :
5596 660 : if (!gfc_check_result_characteristics (proc_target, old_target,
5597 : err, sizeof(err)))
5598 : {
5599 6 : gfc_error ("Result mismatch for the overriding procedure "
5600 : "%qs at %L: %s", proc->name, &where, err);
5601 6 : return false;
5602 : }
5603 : }
5604 :
5605 : /* If the overridden binding is PUBLIC, the overriding one must not be
5606 : PRIVATE. */
5607 1204 : if (old->n.tb->access == ACCESS_PUBLIC
5608 1179 : && proc->n.tb->access == ACCESS_PRIVATE)
5609 : {
5610 1 : gfc_error ("%qs at %L overrides a PUBLIC procedure and must not be"
5611 : " PRIVATE", proc->name, &where);
5612 1 : return false;
5613 : }
5614 :
5615 : /* Compare the formal argument lists of both procedures. This is also abused
5616 : to find the position of the passed-object dummy arguments of both
5617 : bindings as at least the overridden one might not yet be resolved and we
5618 : need those positions in the check below. */
5619 1203 : proc_pass_arg = old_pass_arg = 0;
5620 1203 : if (!proc->n.tb->nopass && !proc->n.tb->pass_arg)
5621 1203 : proc_pass_arg = 1;
5622 1203 : if (!old->n.tb->nopass && !old->n.tb->pass_arg)
5623 1203 : old_pass_arg = 1;
5624 1203 : argpos = 1;
5625 1203 : proc_formal = gfc_sym_get_dummy_args (proc_target);
5626 1203 : old_formal = gfc_sym_get_dummy_args (old_target);
5627 4342 : for ( ; proc_formal && old_formal;
5628 1936 : proc_formal = proc_formal->next, old_formal = old_formal->next)
5629 : {
5630 1943 : if (proc->n.tb->pass_arg
5631 493 : && !strcmp (proc->n.tb->pass_arg, proc_formal->sym->name))
5632 1943 : proc_pass_arg = argpos;
5633 1943 : if (old->n.tb->pass_arg
5634 495 : && !strcmp (old->n.tb->pass_arg, old_formal->sym->name))
5635 1943 : old_pass_arg = argpos;
5636 :
5637 : /* Check that the names correspond. */
5638 1943 : if (strcmp (proc_formal->sym->name, old_formal->sym->name))
5639 : {
5640 1 : gfc_error ("Dummy argument %qs of %qs at %L should be named %qs as"
5641 : " to match the corresponding argument of the overridden"
5642 : " procedure", proc_formal->sym->name, proc->name, &where,
5643 : old_formal->sym->name);
5644 1 : return false;
5645 : }
5646 :
5647 1942 : check_type = proc_pass_arg != argpos && old_pass_arg != argpos;
5648 1942 : if (!gfc_check_dummy_characteristics (proc_formal->sym, old_formal->sym,
5649 : check_type, err, sizeof(err)))
5650 : {
5651 6 : gfc_error_opt (0, "Argument mismatch for the overriding procedure "
5652 : "%qs at %L: %s", proc->name, &where, err);
5653 6 : return false;
5654 : }
5655 :
5656 1936 : ++argpos;
5657 : }
5658 1196 : if (proc_formal || old_formal)
5659 : {
5660 1 : gfc_error ("%qs at %L must have the same number of formal arguments as"
5661 : " the overridden procedure", proc->name, &where);
5662 1 : return false;
5663 : }
5664 :
5665 : /* If the overridden binding is NOPASS, the overriding one must also be
5666 : NOPASS. */
5667 1195 : if (old->n.tb->nopass && !proc->n.tb->nopass)
5668 : {
5669 1 : gfc_error ("%qs at %L overrides a NOPASS binding and must also be"
5670 : " NOPASS", proc->name, &where);
5671 1 : return false;
5672 : }
5673 :
5674 : /* If the overridden binding is PASS(x), the overriding one must also be
5675 : PASS and the passed-object dummy arguments must correspond. */
5676 1194 : if (!old->n.tb->nopass)
5677 : {
5678 1160 : if (proc->n.tb->nopass)
5679 : {
5680 1 : gfc_error ("%qs at %L overrides a binding with PASS and must also be"
5681 : " PASS", proc->name, &where);
5682 1 : return false;
5683 : }
5684 :
5685 1159 : if (proc_pass_arg != old_pass_arg)
5686 : {
5687 1 : gfc_error ("Passed-object dummy argument of %qs at %L must be at"
5688 : " the same position as the passed-object dummy argument of"
5689 : " the overridden procedure", proc->name, &where);
5690 1 : return false;
5691 : }
5692 : }
5693 :
5694 : return true;
5695 : }
5696 :
5697 :
5698 : /* The following three functions check that the formal arguments
5699 : of user defined derived type IO procedures are compliant with
5700 : the requirements of the standard, see F03:9.5.3.7.2 (F08:9.6.4.8.3). */
5701 :
5702 : static void
5703 4572 : check_dtio_arg_TKR_intent (gfc_symbol *fsym, bool typebound, bt type,
5704 : int kind, int rank, sym_intent intent)
5705 : {
5706 4572 : if (fsym->ts.type != type)
5707 : {
5708 3 : gfc_error ("DTIO dummy argument at %L must be of type %s",
5709 : &fsym->declared_at, gfc_basic_typename (type));
5710 3 : return;
5711 : }
5712 :
5713 4569 : if (fsym->ts.type != BT_CLASS && fsym->ts.type != BT_DERIVED
5714 3767 : && fsym->ts.kind != kind)
5715 1 : gfc_error ("DTIO dummy argument at %L must be of KIND = %d",
5716 : &fsym->declared_at, kind);
5717 :
5718 4569 : if (!typebound
5719 4569 : && rank == 0
5720 1148 : && (((type == BT_CLASS) && CLASS_DATA (fsym)->attr.dimension)
5721 950 : || ((type != BT_CLASS) && fsym->attr.dimension)))
5722 0 : gfc_error ("DTIO dummy argument at %L must be a scalar",
5723 : &fsym->declared_at);
5724 4569 : else if (rank == 1
5725 677 : && (fsym->as == NULL || fsym->as->type != AS_ASSUMED_SHAPE))
5726 1 : gfc_error ("DTIO dummy argument at %L must be an "
5727 : "ASSUMED SHAPE ARRAY", &fsym->declared_at);
5728 :
5729 4569 : if (type == BT_CHARACTER && fsym->ts.u.cl->length != NULL)
5730 1 : gfc_error ("DTIO character argument at %L must have assumed length",
5731 : &fsym->declared_at);
5732 :
5733 4569 : if (fsym->attr.intent != intent)
5734 1 : gfc_error ("DTIO dummy argument at %L must have INTENT %s",
5735 : &fsym->declared_at, gfc_code2string (intents, (int)intent));
5736 : return;
5737 : }
5738 :
5739 :
5740 : static void
5741 889 : check_dtio_interface1 (gfc_symbol *derived, gfc_symtree *tb_io_st,
5742 : bool typebound, bool formatted, int code)
5743 : {
5744 889 : gfc_symbol *dtio_sub, *generic_proc, *fsym;
5745 889 : gfc_typebound_proc *tb_io_proc, *specific_proc;
5746 889 : gfc_interface *intr;
5747 889 : gfc_formal_arglist *formal;
5748 889 : int arg_num;
5749 :
5750 889 : bool read = ((dtio_codes)code == DTIO_RF)
5751 889 : || ((dtio_codes)code == DTIO_RUF);
5752 889 : bt type;
5753 889 : sym_intent intent;
5754 889 : int kind;
5755 :
5756 889 : dtio_sub = NULL;
5757 889 : if (typebound)
5758 : {
5759 : /* Typebound DTIO binding. */
5760 559 : tb_io_proc = tb_io_st->n.tb;
5761 559 : if (tb_io_proc == NULL)
5762 : return;
5763 :
5764 559 : gcc_assert (tb_io_proc->is_generic);
5765 :
5766 559 : specific_proc = tb_io_proc->u.generic->specific;
5767 559 : if (specific_proc == NULL || specific_proc->is_generic)
5768 : return;
5769 :
5770 559 : dtio_sub = specific_proc->u.specific->n.sym;
5771 : }
5772 : else
5773 : {
5774 330 : generic_proc = tb_io_st->n.sym;
5775 330 : if (generic_proc == NULL || generic_proc->generic == NULL)
5776 : return;
5777 :
5778 407 : for (intr = tb_io_st->n.sym->generic; intr; intr = intr->next)
5779 : {
5780 334 : if (intr->sym && intr->sym->formal && intr->sym->formal->sym
5781 330 : && ((intr->sym->formal->sym->ts.type == BT_CLASS
5782 231 : && CLASS_DATA (intr->sym->formal->sym)->ts.u.derived
5783 : == derived)
5784 127 : || (intr->sym->formal->sym->ts.type == BT_DERIVED
5785 99 : && intr->sym->formal->sym->ts.u.derived == derived)))
5786 : {
5787 : dtio_sub = intr->sym;
5788 : break;
5789 : }
5790 80 : else if (intr->sym && intr->sym->formal && !intr->sym->formal->sym)
5791 : {
5792 1 : gfc_error ("Alternate return at %L is not permitted in a DTIO "
5793 : "procedure", &intr->sym->declared_at);
5794 1 : return;
5795 : }
5796 : }
5797 :
5798 327 : if (dtio_sub == NULL)
5799 : return;
5800 : }
5801 :
5802 559 : gcc_assert (dtio_sub);
5803 813 : if (!dtio_sub->attr.subroutine)
5804 0 : gfc_error ("DTIO procedure %qs at %L must be a subroutine",
5805 : dtio_sub->name, &dtio_sub->declared_at);
5806 :
5807 813 : if (!dtio_sub->resolve_symbol_called)
5808 1 : gfc_resolve_formal_arglist (dtio_sub);
5809 :
5810 813 : arg_num = 0;
5811 5416 : for (formal = dtio_sub->formal; formal; formal = formal->next)
5812 4603 : arg_num++;
5813 :
5814 944 : if (arg_num < (formatted ? 6 : 4))
5815 : {
5816 5 : gfc_error ("Too few dummy arguments in DTIO procedure %qs at %L",
5817 : dtio_sub->name, &dtio_sub->declared_at);
5818 5 : return;
5819 : }
5820 :
5821 808 : if (arg_num > (formatted ? 6 : 4))
5822 : {
5823 3 : gfc_error ("Too many dummy arguments in DTIO procedure %qs at %L",
5824 : dtio_sub->name, &dtio_sub->declared_at);
5825 3 : return;
5826 : }
5827 :
5828 : /* Now go through the formal arglist. */
5829 : arg_num = 1;
5830 5377 : for (formal = dtio_sub->formal; formal; formal = formal->next, arg_num++)
5831 : {
5832 4573 : if (!formatted && arg_num == 3)
5833 128 : arg_num = 5;
5834 4573 : fsym = formal->sym;
5835 :
5836 4573 : if (fsym == NULL)
5837 : {
5838 1 : gfc_error ("Alternate return at %L is not permitted in a DTIO "
5839 : "procedure", &dtio_sub->declared_at);
5840 1 : return;
5841 : }
5842 :
5843 4572 : switch (arg_num)
5844 : {
5845 805 : case(1): /* DTV */
5846 805 : type = derived->attr.sequence || derived->attr.is_bind_c ?
5847 : BT_DERIVED : BT_CLASS;
5848 805 : kind = 0;
5849 805 : intent = read ? INTENT_INOUT : INTENT_IN;
5850 805 : check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5851 : 0, intent);
5852 805 : break;
5853 :
5854 805 : case(2): /* UNIT */
5855 805 : type = BT_INTEGER;
5856 805 : kind = gfc_default_integer_kind;
5857 805 : intent = INTENT_IN;
5858 805 : check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5859 : 0, intent);
5860 805 : break;
5861 677 : case(3): /* IOTYPE */
5862 677 : type = BT_CHARACTER;
5863 677 : kind = gfc_default_character_kind;
5864 677 : intent = INTENT_IN;
5865 677 : check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5866 : 0, intent);
5867 677 : break;
5868 677 : case(4): /* VLIST */
5869 677 : type = BT_INTEGER;
5870 677 : kind = gfc_default_integer_kind;
5871 677 : intent = INTENT_IN;
5872 677 : check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5873 : 1, intent);
5874 677 : break;
5875 804 : case(5): /* IOSTAT */
5876 804 : type = BT_INTEGER;
5877 804 : kind = gfc_default_integer_kind;
5878 804 : intent = INTENT_OUT;
5879 804 : check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5880 : 0, intent);
5881 804 : break;
5882 804 : case(6): /* IOMSG */
5883 804 : type = BT_CHARACTER;
5884 804 : kind = gfc_default_character_kind;
5885 804 : intent = INTENT_INOUT;
5886 804 : check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
5887 : 0, intent);
5888 804 : break;
5889 0 : default:
5890 0 : gcc_unreachable ();
5891 : }
5892 : }
5893 804 : derived->attr.has_dtio_procs = 1;
5894 804 : return;
5895 : }
5896 :
5897 : void
5898 93550 : gfc_check_dtio_interfaces (gfc_symbol *derived)
5899 : {
5900 93550 : gfc_symtree *tb_io_st;
5901 93550 : bool t = false;
5902 93550 : int code;
5903 93550 : bool formatted;
5904 :
5905 93550 : if (derived->attr.is_class == 1 || derived->attr.vtype == 1)
5906 36848 : return;
5907 :
5908 : /* Check typebound DTIO bindings. */
5909 283510 : for (code = 0; code < 4; code++)
5910 : {
5911 226808 : formatted = ((dtio_codes)code == DTIO_RF)
5912 : || ((dtio_codes)code == DTIO_WF);
5913 :
5914 226808 : tb_io_st = gfc_find_typebound_proc (derived, &t,
5915 : gfc_code2string (dtio_procs, code),
5916 : true, &derived->declared_at);
5917 226808 : if (tb_io_st != NULL)
5918 559 : check_dtio_interface1 (derived, tb_io_st, true, formatted, code);
5919 : }
5920 :
5921 : /* Check generic DTIO interfaces. */
5922 283510 : for (code = 0; code < 4; code++)
5923 : {
5924 226808 : formatted = ((dtio_codes)code == DTIO_RF)
5925 : || ((dtio_codes)code == DTIO_WF);
5926 :
5927 226808 : tb_io_st = gfc_find_symtree (derived->ns->sym_root,
5928 : gfc_code2string (dtio_procs, code));
5929 226808 : if (tb_io_st != NULL)
5930 330 : check_dtio_interface1 (derived, tb_io_st, false, formatted, code);
5931 : }
5932 : }
5933 :
5934 :
5935 : gfc_symtree*
5936 4349 : gfc_find_typebound_dtio_proc (gfc_symbol *derived, bool write, bool formatted)
5937 : {
5938 4349 : gfc_symtree *tb_io_st = NULL;
5939 4349 : bool t = false;
5940 :
5941 4349 : if (!derived || !derived->resolve_symbol_called
5942 4349 : || derived->attr.flavor != FL_DERIVED)
5943 : return NULL;
5944 :
5945 : /* Try to find a typebound DTIO binding. */
5946 4343 : if (formatted == true)
5947 : {
5948 4098 : if (write == true)
5949 1929 : tb_io_st = gfc_find_typebound_proc (derived, &t,
5950 : gfc_code2string (dtio_procs,
5951 : DTIO_WF),
5952 : true,
5953 : &derived->declared_at);
5954 : else
5955 2169 : tb_io_st = gfc_find_typebound_proc (derived, &t,
5956 : gfc_code2string (dtio_procs,
5957 : DTIO_RF),
5958 : true,
5959 : &derived->declared_at);
5960 : }
5961 : else
5962 : {
5963 245 : if (write == true)
5964 109 : tb_io_st = gfc_find_typebound_proc (derived, &t,
5965 : gfc_code2string (dtio_procs,
5966 : DTIO_WUF),
5967 : true,
5968 : &derived->declared_at);
5969 : else
5970 136 : tb_io_st = gfc_find_typebound_proc (derived, &t,
5971 : gfc_code2string (dtio_procs,
5972 : DTIO_RUF),
5973 : true,
5974 : &derived->declared_at);
5975 : }
5976 : return tb_io_st;
5977 : }
5978 :
5979 :
5980 : gfc_symbol *
5981 2907 : gfc_find_specific_dtio_proc (gfc_symbol *derived, bool write, bool formatted)
5982 : {
5983 2907 : gfc_symtree *tb_io_st = NULL;
5984 2907 : gfc_symbol *dtio_sub = NULL;
5985 2907 : gfc_symbol *extended;
5986 2907 : gfc_typebound_proc *tb_io_proc, *specific_proc;
5987 :
5988 2907 : tb_io_st = gfc_find_typebound_dtio_proc (derived, write, formatted);
5989 :
5990 2907 : if (tb_io_st != NULL)
5991 : {
5992 860 : const char *genname;
5993 860 : gfc_symtree *st;
5994 :
5995 860 : tb_io_proc = tb_io_st->n.tb;
5996 860 : gcc_assert (tb_io_proc != NULL);
5997 860 : gcc_assert (tb_io_proc->is_generic);
5998 860 : gcc_assert (tb_io_proc->u.generic->next == NULL);
5999 :
6000 860 : specific_proc = tb_io_proc->u.generic->specific;
6001 860 : gcc_assert (!specific_proc->is_generic);
6002 :
6003 : /* Go back and make sure that we have the right specific procedure.
6004 : Here we most likely have a procedure from the parent type, which
6005 : can be overridden in extensions. */
6006 860 : genname = tb_io_proc->u.generic->specific_st->name;
6007 860 : st = gfc_find_typebound_proc (derived, NULL, genname,
6008 : true, &tb_io_proc->where);
6009 860 : if (st)
6010 860 : dtio_sub = st->n.tb->u.specific->n.sym;
6011 : else
6012 0 : dtio_sub = specific_proc->u.specific->n.sym;
6013 :
6014 860 : goto finish;
6015 : }
6016 :
6017 : /* If there is not a typebound binding, look for a generic
6018 : DTIO interface. */
6019 4173 : for (extended = derived; extended;
6020 2126 : extended = gfc_get_derived_super_type (extended))
6021 : {
6022 2126 : if (extended == NULL || extended->ns == NULL
6023 2126 : || extended->attr.flavor == FL_UNKNOWN)
6024 : return NULL;
6025 :
6026 2126 : if (formatted == true)
6027 : {
6028 2039 : if (write == true)
6029 928 : tb_io_st = gfc_find_symtree (extended->ns->sym_root,
6030 : gfc_code2string (dtio_procs,
6031 : DTIO_WF));
6032 : else
6033 1111 : tb_io_st = gfc_find_symtree (extended->ns->sym_root,
6034 : gfc_code2string (dtio_procs,
6035 : DTIO_RF));
6036 : }
6037 : else
6038 : {
6039 87 : if (write == true)
6040 37 : tb_io_st = gfc_find_symtree (extended->ns->sym_root,
6041 : gfc_code2string (dtio_procs,
6042 : DTIO_WUF));
6043 : else
6044 50 : tb_io_st = gfc_find_symtree (extended->ns->sym_root,
6045 : gfc_code2string (dtio_procs,
6046 : DTIO_RUF));
6047 : }
6048 :
6049 2126 : if (tb_io_st != NULL
6050 269 : && tb_io_st->n.sym
6051 269 : && tb_io_st->n.sym->generic)
6052 : {
6053 26 : for (gfc_interface *intr = tb_io_st->n.sym->generic;
6054 295 : intr && intr->sym; intr = intr->next)
6055 : {
6056 273 : if (intr->sym->formal)
6057 : {
6058 268 : gfc_symbol *fsym = intr->sym->formal->sym;
6059 268 : if ((fsym->ts.type == BT_CLASS
6060 218 : && CLASS_DATA (fsym)->ts.u.derived == extended)
6061 71 : || (fsym->ts.type == BT_DERIVED
6062 50 : && fsym->ts.u.derived == extended))
6063 : {
6064 : dtio_sub = intr->sym;
6065 : break;
6066 : }
6067 : }
6068 : }
6069 : }
6070 : }
6071 :
6072 2047 : finish:
6073 2907 : if (dtio_sub
6074 1107 : && dtio_sub->formal->sym->ts.type == BT_CLASS
6075 1057 : && derived != CLASS_DATA (dtio_sub->formal->sym)->ts.u.derived)
6076 97 : gfc_find_derived_vtab (derived);
6077 :
6078 : return dtio_sub;
6079 : }
6080 :
6081 : /* Helper function - if we do not find an interface for a procedure,
6082 : construct it from the actual arglist. Luckily, this can only
6083 : happen for call by reference, so the information we actually need
6084 : to provide (and which would be impossible to guess from the call
6085 : itself) is not actually needed. */
6086 :
6087 : void
6088 1989 : gfc_get_formal_from_actual_arglist (gfc_symbol *sym,
6089 : gfc_actual_arglist *actual_args)
6090 : {
6091 1989 : gfc_actual_arglist *a;
6092 1989 : gfc_formal_arglist **f;
6093 1989 : gfc_symbol *s;
6094 1989 : char name[GFC_MAX_SYMBOL_LEN + 1];
6095 1989 : static int var_num;
6096 :
6097 : /* Do not infer the formal from actual arguments if we are dealing with
6098 : classes. */
6099 :
6100 1989 : if (sym->ts.type == BT_CLASS)
6101 1 : return;
6102 :
6103 1988 : f = &sym->formal;
6104 5970 : for (a = actual_args; a != NULL; a = a->next)
6105 : {
6106 3982 : (*f) = gfc_get_formal_arglist ();
6107 3982 : if (a->expr)
6108 : {
6109 3974 : snprintf (name, GFC_MAX_SYMBOL_LEN, "_formal_%d", var_num ++);
6110 3974 : gfc_get_symbol (name, gfc_current_ns, &s);
6111 3974 : if (a->expr->ts.type == BT_PROCEDURE)
6112 : {
6113 44 : gfc_symbol *asym = a->expr->symtree->n.sym;
6114 44 : s->attr.flavor = FL_PROCEDURE;
6115 44 : if (asym->attr.function)
6116 : {
6117 24 : s->attr.function = 1;
6118 24 : s->ts = asym->ts;
6119 : }
6120 44 : s->attr.subroutine = asym->attr.subroutine;
6121 : }
6122 : else
6123 : {
6124 3930 : s->ts = a->expr->ts;
6125 :
6126 3930 : if (s->ts.type == BT_CHARACTER)
6127 180 : s->ts.u.cl = gfc_get_charlen ();
6128 :
6129 3930 : s->ts.deferred = 0;
6130 3930 : s->ts.is_iso_c = 0;
6131 3930 : s->ts.is_c_interop = 0;
6132 3930 : s->attr.flavor = FL_VARIABLE;
6133 3930 : if (a->expr->rank > 0)
6134 : {
6135 872 : s->attr.dimension = 1;
6136 872 : s->as = gfc_get_array_spec ();
6137 872 : s->as->rank = 1;
6138 1744 : s->as->lower[0] = gfc_get_int_expr (gfc_index_integer_kind,
6139 872 : &a->expr->where, 1);
6140 872 : s->as->upper[0] = NULL;
6141 872 : s->as->type = AS_ASSUMED_SIZE;
6142 : }
6143 : else
6144 3058 : s->maybe_array = maybe_dummy_array_arg (a->expr);
6145 : }
6146 3974 : s->attr.dummy = 1;
6147 3974 : s->attr.artificial = 1;
6148 3974 : s->declared_at = a->expr->where;
6149 3974 : s->attr.intent = INTENT_UNKNOWN;
6150 3974 : (*f)->sym = s;
6151 3974 : gfc_commit_symbol (s);
6152 : }
6153 : else /* If a->expr is NULL, this is an alternate rerturn. */
6154 8 : (*f)->sym = NULL;
6155 :
6156 3982 : f = &((*f)->next);
6157 : }
6158 :
6159 : }
6160 :
6161 :
6162 : const char *
6163 241 : gfc_dummy_arg_get_name (gfc_dummy_arg & dummy_arg)
6164 : {
6165 241 : switch (dummy_arg.intrinsicness)
6166 : {
6167 241 : case GFC_INTRINSIC_DUMMY_ARG:
6168 241 : return dummy_arg.u.intrinsic->name;
6169 :
6170 0 : case GFC_NON_INTRINSIC_DUMMY_ARG:
6171 0 : return dummy_arg.u.non_intrinsic->sym->name;
6172 :
6173 0 : default:
6174 0 : gcc_unreachable ();
6175 : }
6176 : }
6177 :
6178 :
6179 : const gfc_typespec &
6180 2460 : gfc_dummy_arg_get_typespec (gfc_dummy_arg & dummy_arg)
6181 : {
6182 2460 : switch (dummy_arg.intrinsicness)
6183 : {
6184 1352 : case GFC_INTRINSIC_DUMMY_ARG:
6185 1352 : return dummy_arg.u.intrinsic->ts;
6186 :
6187 1108 : case GFC_NON_INTRINSIC_DUMMY_ARG:
6188 1108 : return dummy_arg.u.non_intrinsic->sym->ts;
6189 :
6190 0 : default:
6191 0 : gcc_unreachable ();
6192 : }
6193 : }
6194 :
6195 :
6196 : bool
6197 26420 : gfc_dummy_arg_is_optional (gfc_dummy_arg & dummy_arg)
6198 : {
6199 26420 : switch (dummy_arg.intrinsicness)
6200 : {
6201 12434 : case GFC_INTRINSIC_DUMMY_ARG:
6202 12434 : return dummy_arg.u.intrinsic->optional;
6203 :
6204 13986 : case GFC_NON_INTRINSIC_DUMMY_ARG:
6205 13986 : return dummy_arg.u.non_intrinsic->sym->attr.optional;
6206 :
6207 0 : default:
6208 0 : gcc_unreachable ();
6209 : }
6210 : }
|