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