xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/fortran/interface.c (revision 53b02e147d4ed531c0d2a5ca9b3e8026ba3e99b5)
1 /* Deal with interfaces.
2    Copyright (C) 2000-2019 Free Software Foundation, Inc.
3    Contributed by Andy Vaught
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 
22 /* Deal with interfaces.  An explicit interface is represented as a
23    singly linked list of formal argument structures attached to the
24    relevant symbols.  For an implicit interface, the arguments don't
25    point to symbols.  Explicit interfaces point to namespaces that
26    contain the symbols within that interface.
27 
28    Implicit interfaces are linked together in a singly linked list
29    along the next_if member of symbol nodes.  Since a particular
30    symbol can only have a single explicit interface, the symbol cannot
31    be part of multiple lists and a single next-member suffices.
32 
33    This is not the case for general classes, though.  An operator
34    definition is independent of just about all other uses and has it's
35    own head pointer.
36 
37    Nameless interfaces:
38      Nameless interfaces create symbols with explicit interfaces within
39      the current namespace.  They are otherwise unlinked.
40 
41    Generic interfaces:
42      The generic name points to a linked list of symbols.  Each symbol
43      has an explicit interface.  Each explicit interface has its own
44      namespace containing the arguments.  Module procedures are symbols in
45      which the interface is added later when the module procedure is parsed.
46 
47    User operators:
48      User-defined operators are stored in a their own set of symtrees
49      separate from regular symbols.  The symtrees point to gfc_user_op
50      structures which in turn head up a list of relevant interfaces.
51 
52    Extended intrinsics and assignment:
53      The head of these interface lists are stored in the containing namespace.
54 
55    Implicit interfaces:
56      An implicit interface is represented as a singly linked list of
57      formal argument list structures that don't point to any symbol
58      nodes -- they just contain types.
59 
60 
61    When a subprogram is defined, the program unit's name points to an
62    interface as usual, but the link to the namespace is NULL and the
63    formal argument list points to symbols within the same namespace as
64    the program unit name.  */
65 
66 #include "config.h"
67 #include "system.h"
68 #include "coretypes.h"
69 #include "options.h"
70 #include "gfortran.h"
71 #include "match.h"
72 #include "arith.h"
73 
74 /* The current_interface structure holds information about the
75    interface currently being parsed.  This structure is saved and
76    restored during recursive interfaces.  */
77 
78 gfc_interface_info current_interface;
79 
80 
81 /* Free a singly linked list of gfc_interface structures.  */
82 
83 void
84 gfc_free_interface (gfc_interface *intr)
85 {
86   gfc_interface *next;
87 
88   for (; intr; intr = next)
89     {
90       next = intr->next;
91       free (intr);
92     }
93 }
94 
95 
96 /* Change the operators unary plus and minus into binary plus and
97    minus respectively, leaving the rest unchanged.  */
98 
99 static gfc_intrinsic_op
100 fold_unary_intrinsic (gfc_intrinsic_op op)
101 {
102   switch (op)
103     {
104     case INTRINSIC_UPLUS:
105       op = INTRINSIC_PLUS;
106       break;
107     case INTRINSIC_UMINUS:
108       op = INTRINSIC_MINUS;
109       break;
110     default:
111       break;
112     }
113 
114   return op;
115 }
116 
117 
118 /* Return the operator depending on the DTIO moded string.  Note that
119    these are not operators in the normal sense and so have been placed
120    beyond GFC_INTRINSIC_END in gfortran.h:enum gfc_intrinsic_op.  */
121 
122 static gfc_intrinsic_op
123 dtio_op (char* mode)
124 {
125   if (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
138 gfc_match_generic_spec (interface_type *type,
139 			char *name,
140 			gfc_intrinsic_op *op)
141 {
142   char buffer[GFC_MAX_SYMBOL_LEN + 1];
143   match m;
144   gfc_intrinsic_op i;
145 
146   if (gfc_match (" assignment ( = )") == MATCH_YES)
147     {
148       *type = INTERFACE_INTRINSIC_OP;
149       *op = INTRINSIC_ASSIGN;
150       return MATCH_YES;
151     }
152 
153   if (gfc_match (" operator ( %o )", &i) == MATCH_YES)
154     {				/* Operator i/f */
155       *type = INTERFACE_INTRINSIC_OP;
156       *op = fold_unary_intrinsic (i);
157       return MATCH_YES;
158     }
159 
160   *op = INTRINSIC_NONE;
161   if (gfc_match (" operator ( ") == MATCH_YES)
162     {
163       m = gfc_match_defined_op_name (buffer, 1);
164       if (m == MATCH_NO)
165 	goto syntax;
166       if (m != MATCH_YES)
167 	return MATCH_ERROR;
168 
169       m = gfc_match_char (')');
170       if (m == MATCH_NO)
171 	goto syntax;
172       if (m != MATCH_YES)
173 	return MATCH_ERROR;
174 
175       strcpy (name, buffer);
176       *type = INTERFACE_USER_OP;
177       return MATCH_YES;
178     }
179 
180   if (gfc_match (" read ( %n )", buffer) == MATCH_YES)
181     {
182       *op = dtio_op (buffer);
183       if (*op == INTRINSIC_FORMATTED)
184 	{
185 	  strcpy (name, gfc_code2string (dtio_procs, DTIO_RF));
186 	  *type = INTERFACE_DTIO;
187 	}
188       if (*op == INTRINSIC_UNFORMATTED)
189 	{
190 	  strcpy (name, gfc_code2string (dtio_procs, DTIO_RUF));
191 	  *type = INTERFACE_DTIO;
192 	}
193       if (*op != INTRINSIC_NONE)
194 	return MATCH_YES;
195     }
196 
197   if (gfc_match (" write ( %n )", buffer) == MATCH_YES)
198     {
199       *op = dtio_op (buffer);
200       if (*op == INTRINSIC_FORMATTED)
201 	{
202 	  strcpy (name, gfc_code2string (dtio_procs, DTIO_WF));
203 	  *type = INTERFACE_DTIO;
204 	}
205       if (*op == INTRINSIC_UNFORMATTED)
206 	{
207 	  strcpy (name, gfc_code2string (dtio_procs, DTIO_WUF));
208 	  *type = INTERFACE_DTIO;
209 	}
210       if (*op != INTRINSIC_NONE)
211 	return MATCH_YES;
212     }
213 
214   if (gfc_match_name (buffer) == MATCH_YES)
215     {
216       strcpy (name, buffer);
217       *type = INTERFACE_GENERIC;
218       return MATCH_YES;
219     }
220 
221   *type = INTERFACE_NAMELESS;
222   return MATCH_YES;
223 
224 syntax:
225   gfc_error ("Syntax error in generic specification at %C");
226   return MATCH_ERROR;
227 }
228 
229 
230 /* Match one of the five F95 forms of an interface statement.  The
231    matcher for the abstract interface follows.  */
232 
233 match
234 gfc_match_interface (void)
235 {
236   char name[GFC_MAX_SYMBOL_LEN + 1];
237   interface_type type;
238   gfc_symbol *sym;
239   gfc_intrinsic_op op;
240   match m;
241 
242   m = gfc_match_space ();
243 
244   if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
245     return MATCH_ERROR;
246 
247   /* If we're not looking at the end of the statement now, or if this
248      is not a nameless interface but we did not see a space, punt.  */
249   if (gfc_match_eos () != MATCH_YES
250       || (type != INTERFACE_NAMELESS && m != MATCH_YES))
251     {
252       gfc_error ("Syntax error: Trailing garbage in INTERFACE statement "
253 		 "at %C");
254       return MATCH_ERROR;
255     }
256 
257   current_interface.type = type;
258 
259   switch (type)
260     {
261     case INTERFACE_DTIO:
262     case INTERFACE_GENERIC:
263       if (gfc_get_symbol (name, NULL, &sym))
264 	return MATCH_ERROR;
265 
266       if (!sym->attr.generic
267 	  && !gfc_add_generic (&sym->attr, sym->name, NULL))
268 	return MATCH_ERROR;
269 
270       if (sym->attr.dummy)
271 	{
272 	  gfc_error ("Dummy procedure %qs at %C cannot have a "
273 		     "generic interface", sym->name);
274 	  return MATCH_ERROR;
275 	}
276 
277       current_interface.sym = gfc_new_block = sym;
278       break;
279 
280     case INTERFACE_USER_OP:
281       current_interface.uop = gfc_get_uop (name);
282       break;
283 
284     case INTERFACE_INTRINSIC_OP:
285       current_interface.op = op;
286       break;
287 
288     case INTERFACE_NAMELESS:
289     case INTERFACE_ABSTRACT:
290       break;
291     }
292 
293   return MATCH_YES;
294 }
295 
296 
297 
298 /* Match a F2003 abstract interface.  */
299 
300 match
301 gfc_match_abstract_interface (void)
302 {
303   match m;
304 
305   if (!gfc_notify_std (GFC_STD_F2003, "ABSTRACT INTERFACE at %C"))
306     return MATCH_ERROR;
307 
308   m = gfc_match_eos ();
309 
310   if (m != MATCH_YES)
311     {
312       gfc_error ("Syntax error in ABSTRACT INTERFACE statement at %C");
313       return MATCH_ERROR;
314     }
315 
316   current_interface.type = INTERFACE_ABSTRACT;
317 
318   return m;
319 }
320 
321 
322 /* Match the different sort of generic-specs that can be present after
323    the END INTERFACE itself.  */
324 
325 match
326 gfc_match_end_interface (void)
327 {
328   char name[GFC_MAX_SYMBOL_LEN + 1];
329   interface_type type;
330   gfc_intrinsic_op op;
331   match m;
332 
333   m = gfc_match_space ();
334 
335   if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
336     return MATCH_ERROR;
337 
338   /* If we're not looking at the end of the statement now, or if this
339      is not a nameless interface but we did not see a space, punt.  */
340   if (gfc_match_eos () != MATCH_YES
341       || (type != INTERFACE_NAMELESS && m != MATCH_YES))
342     {
343       gfc_error ("Syntax error: Trailing garbage in END INTERFACE "
344 		 "statement at %C");
345       return MATCH_ERROR;
346     }
347 
348   m = MATCH_YES;
349 
350   switch (current_interface.type)
351     {
352     case INTERFACE_NAMELESS:
353     case INTERFACE_ABSTRACT:
354       if (type != INTERFACE_NAMELESS)
355 	{
356 	  gfc_error ("Expected a nameless interface at %C");
357 	  m = MATCH_ERROR;
358 	}
359 
360       break;
361 
362     case INTERFACE_INTRINSIC_OP:
363       if (type != current_interface.type || op != current_interface.op)
364 	{
365 
366 	  if (current_interface.op == INTRINSIC_ASSIGN)
367 	    {
368 	      m = MATCH_ERROR;
369 	      gfc_error ("Expected %<END INTERFACE ASSIGNMENT (=)%> at %C");
370 	    }
371 	  else
372 	    {
373 	      const char *s1, *s2;
374 	      s1 = gfc_op2string (current_interface.op);
375 	      s2 = gfc_op2string (op);
376 
377 	      /* The following if-statements are used to enforce C1202
378 		 from F2003.  */
379 	      if ((strcmp(s1, "==") == 0 && strcmp (s2, ".eq.") == 0)
380 		  || (strcmp(s1, ".eq.") == 0 && strcmp (s2, "==") == 0))
381 		break;
382 	      if ((strcmp(s1, "/=") == 0 && strcmp (s2, ".ne.") == 0)
383 		  || (strcmp(s1, ".ne.") == 0 && strcmp (s2, "/=") == 0))
384 		break;
385 	      if ((strcmp(s1, "<=") == 0 && strcmp (s2, ".le.") == 0)
386 		  || (strcmp(s1, ".le.") == 0 && strcmp (s2, "<=") == 0))
387 		break;
388 	      if ((strcmp(s1, "<") == 0 && strcmp (s2, ".lt.") == 0)
389 		  || (strcmp(s1, ".lt.") == 0 && strcmp (s2, "<") == 0))
390 		break;
391 	      if ((strcmp(s1, ">=") == 0 && strcmp (s2, ".ge.") == 0)
392 		  || (strcmp(s1, ".ge.") == 0 && strcmp (s2, ">=") == 0))
393 		break;
394 	      if ((strcmp(s1, ">") == 0 && strcmp (s2, ".gt.") == 0)
395 		  || (strcmp(s1, ".gt.") == 0 && strcmp (s2, ">") == 0))
396 		break;
397 
398 	      m = MATCH_ERROR;
399 	      if (strcmp(s2, "none") == 0)
400 		gfc_error ("Expecting %<END INTERFACE OPERATOR (%s)%> "
401 			   "at %C", s1);
402 	      else
403 		gfc_error ("Expecting %<END INTERFACE OPERATOR (%s)%> at %C, "
404 			   "but got %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
444 is_anonymous_component (gfc_component *cmp)
445 {
446   /* Only UNION and MAP components are anonymous.  In the case of a MAP,
447      the derived type symbol is FL_STRUCT and the component name looks like mM*.
448      This is the only case in which the second character of a component name is
449      uppercase.  */
450   return cmp->ts.type == BT_UNION
451     || (cmp->ts.type == BT_DERIVED
452         && cmp->ts.u.derived->attr.flavor == FL_STRUCT
453         && cmp->name[0] && cmp->name[1] && ISUPPER (cmp->name[1]));
454 }
455 
456 
457 /* Return whether the derived type was defined anonymously.  */
458 
459 static bool
460 is_anonymous_dt (gfc_symbol *derived)
461 {
462   /* UNION and MAP types are always anonymous. Otherwise, only nested STRUCTURE
463      types can be anonymous.  For anonymous MAP/STRUCTURE, we have FL_STRUCT
464      and the type name looks like XX*.  This is the only case in which the
465      second character of a type name is uppercase.  */
466   return derived->attr.flavor == FL_UNION
467     || (derived->attr.flavor == FL_STRUCT
468         && derived->name[0] && derived->name[1] && ISUPPER (derived->name[1]));
469 }
470 
471 
472 /* Compare components according to 4.4.2 of the Fortran standard.  */
473 
474 static bool
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
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
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
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
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
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
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
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
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 *
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
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
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
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
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->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
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
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_typename (&s1->ts), gfc_typename (&s2->ts));
1334 	  return false;
1335 	}
1336       if (!compare_rank (s1, s2))
1337 	{
1338 	  snprintf (errmsg, err_len, "Rank mismatch in argument '%s' (%i/%i)",
1339 		    s1->name, symbol_rank (s1), symbol_rank (s2));
1340 	  return false;
1341 	}
1342     }
1343 
1344   /* Check INTENT.  */
1345   if (s1->attr.intent != s2->attr.intent)
1346     {
1347       snprintf (errmsg, err_len, "INTENT mismatch in argument '%s'",
1348 		s1->name);
1349       return false;
1350     }
1351 
1352   /* Check OPTIONAL attribute.  */
1353   if (s1->attr.optional != s2->attr.optional)
1354     {
1355       snprintf (errmsg, err_len, "OPTIONAL mismatch in argument '%s'",
1356 		s1->name);
1357       return false;
1358     }
1359 
1360   /* Check ALLOCATABLE attribute.  */
1361   if (s1->attr.allocatable != s2->attr.allocatable)
1362     {
1363       snprintf (errmsg, err_len, "ALLOCATABLE mismatch in argument '%s'",
1364 		s1->name);
1365       return false;
1366     }
1367 
1368   /* Check POINTER attribute.  */
1369   if (s1->attr.pointer != s2->attr.pointer)
1370     {
1371       snprintf (errmsg, err_len, "POINTER mismatch in argument '%s'",
1372 		s1->name);
1373       return false;
1374     }
1375 
1376   /* Check TARGET attribute.  */
1377   if (s1->attr.target != s2->attr.target)
1378     {
1379       snprintf (errmsg, err_len, "TARGET mismatch in argument '%s'",
1380 		s1->name);
1381       return false;
1382     }
1383 
1384   /* Check ASYNCHRONOUS attribute.  */
1385   if (s1->attr.asynchronous != s2->attr.asynchronous)
1386     {
1387       snprintf (errmsg, err_len, "ASYNCHRONOUS mismatch in argument '%s'",
1388 		s1->name);
1389       return false;
1390     }
1391 
1392   /* Check CONTIGUOUS attribute.  */
1393   if (s1->attr.contiguous != s2->attr.contiguous)
1394     {
1395       snprintf (errmsg, err_len, "CONTIGUOUS mismatch in argument '%s'",
1396 		s1->name);
1397       return false;
1398     }
1399 
1400   /* Check VALUE attribute.  */
1401   if (s1->attr.value != s2->attr.value)
1402     {
1403       snprintf (errmsg, err_len, "VALUE mismatch in argument '%s'",
1404 		s1->name);
1405       return false;
1406     }
1407 
1408   /* Check VOLATILE attribute.  */
1409   if (s1->attr.volatile_ != s2->attr.volatile_)
1410     {
1411       snprintf (errmsg, err_len, "VOLATILE mismatch in argument '%s'",
1412 		s1->name);
1413       return false;
1414     }
1415 
1416   /* Check interface of dummy procedures.  */
1417   if (s1->attr.flavor == FL_PROCEDURE)
1418     {
1419       char err[200];
1420       if (!gfc_compare_interfaces (s1, s2, s2->name, 0, 1, err, sizeof(err),
1421 				   NULL, NULL))
1422 	{
1423 	  snprintf (errmsg, err_len, "Interface mismatch in dummy procedure "
1424 		    "'%s': %s", s1->name, err);
1425 	  return false;
1426 	}
1427     }
1428 
1429   /* Check string length.  */
1430   if (s1->ts.type == BT_CHARACTER
1431       && s1->ts.u.cl && s1->ts.u.cl->length
1432       && s2->ts.u.cl && s2->ts.u.cl->length)
1433     {
1434       int compval = gfc_dep_compare_expr (s1->ts.u.cl->length,
1435 					  s2->ts.u.cl->length);
1436       switch (compval)
1437       {
1438 	case -1:
1439 	case  1:
1440 	case -3:
1441 	  snprintf (errmsg, err_len, "Character length mismatch "
1442 		    "in argument '%s'", s1->name);
1443 	  return false;
1444 
1445 	case -2:
1446 	  /* FIXME: Implement a warning for this case.
1447 	  gfc_warning (0, "Possible character length mismatch in argument %qs",
1448 		       s1->name);*/
1449 	  break;
1450 
1451 	case 0:
1452 	  break;
1453 
1454 	default:
1455 	  gfc_internal_error ("check_dummy_characteristics: Unexpected result "
1456 			      "%i of gfc_dep_compare_expr", compval);
1457 	  break;
1458       }
1459     }
1460 
1461   /* Check array shape.  */
1462   if (s1->as && s2->as)
1463     {
1464       int i, compval;
1465       gfc_expr *shape1, *shape2;
1466 
1467       if (s1->as->type != s2->as->type)
1468 	{
1469 	  snprintf (errmsg, err_len, "Shape mismatch in argument '%s'",
1470 		    s1->name);
1471 	  return false;
1472 	}
1473 
1474       if (s1->as->corank != s2->as->corank)
1475 	{
1476 	  snprintf (errmsg, err_len, "Corank mismatch in argument '%s' (%i/%i)",
1477 		    s1->name, s1->as->corank, s2->as->corank);
1478 	  return false;
1479 	}
1480 
1481       if (s1->as->type == AS_EXPLICIT)
1482 	for (i = 0; i < s1->as->rank + MAX (0, s1->as->corank-1); i++)
1483 	  {
1484 	    shape1 = gfc_subtract (gfc_copy_expr (s1->as->upper[i]),
1485 				  gfc_copy_expr (s1->as->lower[i]));
1486 	    shape2 = gfc_subtract (gfc_copy_expr (s2->as->upper[i]),
1487 				  gfc_copy_expr (s2->as->lower[i]));
1488 	    compval = gfc_dep_compare_expr (shape1, shape2);
1489 	    gfc_free_expr (shape1);
1490 	    gfc_free_expr (shape2);
1491 	    switch (compval)
1492 	    {
1493 	      case -1:
1494 	      case  1:
1495 	      case -3:
1496 		if (i < s1->as->rank)
1497 		  snprintf (errmsg, err_len, "Shape mismatch in dimension %i of"
1498 			    " argument '%s'", i + 1, s1->name);
1499 		else
1500 		  snprintf (errmsg, err_len, "Shape mismatch in codimension %i "
1501 			    "of argument '%s'", i - s1->as->rank + 1, s1->name);
1502 		return false;
1503 
1504 	      case -2:
1505 		/* FIXME: Implement a warning for this case.
1506 		gfc_warning (0, "Possible shape mismatch in argument %qs",
1507 			    s1->name);*/
1508 		break;
1509 
1510 	      case 0:
1511 		break;
1512 
1513 	      default:
1514 		gfc_internal_error ("check_dummy_characteristics: Unexpected "
1515 				    "result %i of gfc_dep_compare_expr",
1516 				    compval);
1517 		break;
1518 	    }
1519 	  }
1520     }
1521 
1522   return true;
1523 }
1524 
1525 
1526 /* Check if the characteristics of two function results match,
1527    cf. F08:12.3.3.  */
1528 
1529 bool
1530 gfc_check_result_characteristics (gfc_symbol *s1, gfc_symbol *s2,
1531 			      char *errmsg, int err_len)
1532 {
1533   gfc_symbol *r1, *r2;
1534 
1535   if (s1->ts.interface && s1->ts.interface->result)
1536     r1 = s1->ts.interface->result;
1537   else
1538     r1 = s1->result ? s1->result : s1;
1539 
1540   if (s2->ts.interface && s2->ts.interface->result)
1541     r2 = s2->ts.interface->result;
1542   else
1543     r2 = s2->result ? s2->result : s2;
1544 
1545   if (r1->ts.type == BT_UNKNOWN)
1546     return true;
1547 
1548   /* Check type and rank.  */
1549   if (!compare_type_characteristics (r1, r2))
1550     {
1551       snprintf (errmsg, err_len, "Type mismatch in function result (%s/%s)",
1552 		gfc_typename (&r1->ts), gfc_typename (&r2->ts));
1553       return false;
1554     }
1555   if (!compare_rank (r1, r2))
1556     {
1557       snprintf (errmsg, err_len, "Rank mismatch in function result (%i/%i)",
1558 		symbol_rank (r1), symbol_rank (r2));
1559       return false;
1560     }
1561 
1562   /* Check ALLOCATABLE attribute.  */
1563   if (r1->attr.allocatable != r2->attr.allocatable)
1564     {
1565       snprintf (errmsg, err_len, "ALLOCATABLE attribute mismatch in "
1566 		"function result");
1567       return false;
1568     }
1569 
1570   /* Check POINTER attribute.  */
1571   if (r1->attr.pointer != r2->attr.pointer)
1572     {
1573       snprintf (errmsg, err_len, "POINTER attribute mismatch in "
1574 		"function result");
1575       return false;
1576     }
1577 
1578   /* Check CONTIGUOUS attribute.  */
1579   if (r1->attr.contiguous != r2->attr.contiguous)
1580     {
1581       snprintf (errmsg, err_len, "CONTIGUOUS attribute mismatch in "
1582 		"function result");
1583       return false;
1584     }
1585 
1586   /* Check PROCEDURE POINTER attribute.  */
1587   if (r1 != s1 && r1->attr.proc_pointer != r2->attr.proc_pointer)
1588     {
1589       snprintf (errmsg, err_len, "PROCEDURE POINTER mismatch in "
1590 		"function result");
1591       return false;
1592     }
1593 
1594   /* Check string length.  */
1595   if (r1->ts.type == BT_CHARACTER && r1->ts.u.cl && r2->ts.u.cl)
1596     {
1597       if (r1->ts.deferred != r2->ts.deferred)
1598 	{
1599 	  snprintf (errmsg, err_len, "Character length mismatch "
1600 		    "in function result");
1601 	  return false;
1602 	}
1603 
1604       if (r1->ts.u.cl->length && r2->ts.u.cl->length)
1605 	{
1606 	  int compval = gfc_dep_compare_expr (r1->ts.u.cl->length,
1607 					      r2->ts.u.cl->length);
1608 	  switch (compval)
1609 	  {
1610 	    case -1:
1611 	    case  1:
1612 	    case -3:
1613 	      snprintf (errmsg, err_len, "Character length mismatch "
1614 			"in function result");
1615 	      return false;
1616 
1617 	    case -2:
1618 	      /* FIXME: Implement a warning for this case.
1619 	      snprintf (errmsg, err_len, "Possible character length mismatch "
1620 			"in function result");*/
1621 	      break;
1622 
1623 	    case 0:
1624 	      break;
1625 
1626 	    default:
1627 	      gfc_internal_error ("check_result_characteristics (1): Unexpected "
1628 				  "result %i of gfc_dep_compare_expr", compval);
1629 	      break;
1630 	  }
1631 	}
1632     }
1633 
1634   /* Check array shape.  */
1635   if (!r1->attr.allocatable && !r1->attr.pointer && r1->as && r2->as)
1636     {
1637       int i, compval;
1638       gfc_expr *shape1, *shape2;
1639 
1640       if (r1->as->type != r2->as->type)
1641 	{
1642 	  snprintf (errmsg, err_len, "Shape mismatch in function result");
1643 	  return false;
1644 	}
1645 
1646       if (r1->as->type == AS_EXPLICIT)
1647 	for (i = 0; i < r1->as->rank + r1->as->corank; i++)
1648 	  {
1649 	    shape1 = gfc_subtract (gfc_copy_expr (r1->as->upper[i]),
1650 				   gfc_copy_expr (r1->as->lower[i]));
1651 	    shape2 = gfc_subtract (gfc_copy_expr (r2->as->upper[i]),
1652 				   gfc_copy_expr (r2->as->lower[i]));
1653 	    compval = gfc_dep_compare_expr (shape1, shape2);
1654 	    gfc_free_expr (shape1);
1655 	    gfc_free_expr (shape2);
1656 	    switch (compval)
1657 	    {
1658 	      case -1:
1659 	      case  1:
1660 	      case -3:
1661 		snprintf (errmsg, err_len, "Shape mismatch in dimension %i of "
1662 			  "function result", i + 1);
1663 		return false;
1664 
1665 	      case -2:
1666 		/* FIXME: Implement a warning for this case.
1667 		gfc_warning (0, "Possible shape mismatch in return value");*/
1668 		break;
1669 
1670 	      case 0:
1671 		break;
1672 
1673 	      default:
1674 		gfc_internal_error ("check_result_characteristics (2): "
1675 				    "Unexpected result %i of "
1676 				    "gfc_dep_compare_expr", compval);
1677 		break;
1678 	    }
1679 	  }
1680     }
1681 
1682   return true;
1683 }
1684 
1685 
1686 /* 'Compare' two formal interfaces associated with a pair of symbols.
1687    We return true if there exists an actual argument list that
1688    would be ambiguous between the two interfaces, zero otherwise.
1689    'strict_flag' specifies whether all the characteristics are
1690    required to match, which is not the case for ambiguity checks.
1691    'p1' and 'p2' are the PASS arguments of both procedures (if applicable).  */
1692 
1693 bool
1694 gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol *s2, const char *name2,
1695 			int generic_flag, int strict_flag,
1696 			char *errmsg, int err_len,
1697 			const char *p1, const char *p2)
1698 {
1699   gfc_formal_arglist *f1, *f2;
1700 
1701   gcc_assert (name2 != NULL);
1702 
1703   if (s1->attr.function && (s2->attr.subroutine
1704       || (!s2->attr.function && s2->ts.type == BT_UNKNOWN
1705 	  && gfc_get_default_type (name2, s2->ns)->type == BT_UNKNOWN)))
1706     {
1707       if (errmsg != NULL)
1708 	snprintf (errmsg, err_len, "'%s' is not a function", name2);
1709       return false;
1710     }
1711 
1712   if (s1->attr.subroutine && s2->attr.function)
1713     {
1714       if (errmsg != NULL)
1715 	snprintf (errmsg, err_len, "'%s' is not a subroutine", name2);
1716       return false;
1717     }
1718 
1719   /* Do strict checks on all characteristics
1720      (for dummy procedures and procedure pointer assignments).  */
1721   if (!generic_flag && strict_flag)
1722     {
1723       if (s1->attr.function && s2->attr.function)
1724 	{
1725 	  /* If both are functions, check result characteristics.  */
1726 	  if (!gfc_check_result_characteristics (s1, s2, errmsg, err_len)
1727 	      || !gfc_check_result_characteristics (s2, s1, errmsg, err_len))
1728 	    return false;
1729 	}
1730 
1731       if (s1->attr.pure && !s2->attr.pure)
1732 	{
1733 	  snprintf (errmsg, err_len, "Mismatch in PURE attribute");
1734 	  return false;
1735 	}
1736       if (s1->attr.elemental && !s2->attr.elemental)
1737 	{
1738 	  snprintf (errmsg, err_len, "Mismatch in ELEMENTAL attribute");
1739 	  return false;
1740 	}
1741     }
1742 
1743   if (s1->attr.if_source == IFSRC_UNKNOWN
1744       || s2->attr.if_source == IFSRC_UNKNOWN)
1745     return true;
1746 
1747   f1 = gfc_sym_get_dummy_args (s1);
1748   f2 = gfc_sym_get_dummy_args (s2);
1749 
1750   /* Special case: No arguments.  */
1751   if (f1 == NULL && f2 == NULL)
1752     return true;
1753 
1754   if (generic_flag)
1755     {
1756       if (count_types_test (f1, f2, p1, p2)
1757 	  || count_types_test (f2, f1, p2, p1))
1758 	return false;
1759 
1760       /* Special case: alternate returns.  If both f1->sym and f2->sym are
1761 	 NULL, then the leading formal arguments are alternate returns.
1762 	 The previous conditional should catch argument lists with
1763 	 different number of argument.  */
1764       if (f1 && f1->sym == NULL && f2 && f2->sym == NULL)
1765 	return true;
1766 
1767       if (generic_correspondence (f1, f2, p1, p2)
1768 	  || generic_correspondence (f2, f1, p2, p1))
1769 	return false;
1770     }
1771   else
1772     /* Perform the abbreviated correspondence test for operators (the
1773        arguments cannot be optional and are always ordered correctly).
1774        This is also done when comparing interfaces for dummy procedures and in
1775        procedure pointer assignments.  */
1776 
1777     for (; f1 || f2; f1 = f1->next, f2 = f2->next)
1778       {
1779 	/* Check existence.  */
1780 	if (f1 == NULL || f2 == NULL)
1781 	  {
1782 	    if (errmsg != NULL)
1783 	      snprintf (errmsg, err_len, "'%s' has the wrong number of "
1784 			"arguments", name2);
1785 	    return false;
1786 	  }
1787 
1788 	if (strict_flag)
1789 	  {
1790 	    /* Check all characteristics.  */
1791 	    if (!gfc_check_dummy_characteristics (f1->sym, f2->sym, true,
1792 					      errmsg, err_len))
1793 	      return false;
1794 	  }
1795 	else
1796 	  {
1797 	    /* Operators: Only check type and rank of arguments.  */
1798 	    if (!compare_type (f2->sym, f1->sym))
1799 	      {
1800 		if (errmsg != NULL)
1801 		  snprintf (errmsg, err_len, "Type mismatch in argument '%s' "
1802 			    "(%s/%s)", f1->sym->name,
1803 			    gfc_typename (&f1->sym->ts),
1804 			    gfc_typename (&f2->sym->ts));
1805 		return false;
1806 	      }
1807 	    if (!compare_rank (f2->sym, f1->sym))
1808 	      {
1809 		if (errmsg != NULL)
1810 		  snprintf (errmsg, err_len, "Rank mismatch in argument '%s' "
1811 			    "(%i/%i)", f1->sym->name, symbol_rank (f1->sym),
1812 			    symbol_rank (f2->sym));
1813 		return false;
1814 	      }
1815 	    if ((gfc_option.allow_std & GFC_STD_F2008)
1816 		&& (compare_ptr_alloc(f1->sym, f2->sym)
1817 		    || compare_ptr_alloc(f2->sym, f1->sym)))
1818 	      {
1819     		if (errmsg != NULL)
1820 		  snprintf (errmsg, err_len, "Mismatching POINTER/ALLOCATABLE "
1821 			    "attribute in argument '%s' ", f1->sym->name);
1822 		return false;
1823 	      }
1824 	  }
1825       }
1826 
1827   return true;
1828 }
1829 
1830 
1831 /* Given a pointer to an interface pointer, remove duplicate
1832    interfaces and make sure that all symbols are either functions
1833    or subroutines, and all of the same kind.  Returns true if
1834    something goes wrong.  */
1835 
1836 static bool
1837 check_interface0 (gfc_interface *p, const char *interface_name)
1838 {
1839   gfc_interface *psave, *q, *qlast;
1840 
1841   psave = p;
1842   for (; p; p = p->next)
1843     {
1844       /* Make sure all symbols in the interface have been defined as
1845 	 functions or subroutines.  */
1846       if (((!p->sym->attr.function && !p->sym->attr.subroutine)
1847 	   || !p->sym->attr.if_source)
1848 	  && !gfc_fl_struct (p->sym->attr.flavor))
1849 	{
1850 	  const char *guessed
1851 	    = gfc_lookup_function_fuzzy (p->sym->name, p->sym->ns->sym_root);
1852 
1853 	  if (p->sym->attr.external)
1854 	    if (guessed)
1855 	      gfc_error ("Procedure %qs in %s at %L has no explicit interface"
1856 			 "; did you mean %qs?",
1857 			 p->sym->name, interface_name, &p->sym->declared_at,
1858 			 guessed);
1859 	    else
1860 	      gfc_error ("Procedure %qs in %s at %L has no explicit interface",
1861 			 p->sym->name, interface_name, &p->sym->declared_at);
1862 	  else
1863 	    if (guessed)
1864 	      gfc_error ("Procedure %qs in %s at %L is neither function nor "
1865 			 "subroutine; did you mean %qs?", p->sym->name,
1866 			interface_name, &p->sym->declared_at, guessed);
1867 	    else
1868 	      gfc_error ("Procedure %qs in %s at %L is neither function nor "
1869 			 "subroutine", p->sym->name, interface_name,
1870 			&p->sym->declared_at);
1871 	  return true;
1872 	}
1873 
1874       /* Verify that procedures are either all SUBROUTINEs or all FUNCTIONs.  */
1875       if ((psave->sym->attr.function && !p->sym->attr.function
1876 	   && !gfc_fl_struct (p->sym->attr.flavor))
1877 	  || (psave->sym->attr.subroutine && !p->sym->attr.subroutine))
1878 	{
1879 	  if (!gfc_fl_struct (p->sym->attr.flavor))
1880 	    gfc_error ("In %s at %L procedures must be either all SUBROUTINEs"
1881 		       " or all FUNCTIONs", interface_name,
1882 		       &p->sym->declared_at);
1883 	  else if (p->sym->attr.flavor == FL_DERIVED)
1884 	    gfc_error ("In %s at %L procedures must be all FUNCTIONs as the "
1885 		       "generic name is also the name of a derived type",
1886 		       interface_name, &p->sym->declared_at);
1887 	  return true;
1888 	}
1889 
1890       /* F2003, C1207. F2008, C1207.  */
1891       if (p->sym->attr.proc == PROC_INTERNAL
1892 	  && !gfc_notify_std (GFC_STD_F2008, "Internal procedure "
1893 			      "%qs in %s at %L", p->sym->name,
1894 			      interface_name, &p->sym->declared_at))
1895 	return true;
1896     }
1897   p = psave;
1898 
1899   /* Remove duplicate interfaces in this interface list.  */
1900   for (; p; p = p->next)
1901     {
1902       qlast = p;
1903 
1904       for (q = p->next; q;)
1905 	{
1906 	  if (p->sym != q->sym)
1907 	    {
1908 	      qlast = q;
1909 	      q = q->next;
1910 	    }
1911 	  else
1912 	    {
1913 	      /* Duplicate interface.  */
1914 	      qlast->next = q->next;
1915 	      free (q);
1916 	      q = qlast->next;
1917 	    }
1918 	}
1919     }
1920 
1921   return false;
1922 }
1923 
1924 
1925 /* Check lists of interfaces to make sure that no two interfaces are
1926    ambiguous.  Duplicate interfaces (from the same symbol) are OK here.  */
1927 
1928 static bool
1929 check_interface1 (gfc_interface *p, gfc_interface *q0,
1930 		  int generic_flag, const char *interface_name,
1931 		  bool referenced)
1932 {
1933   gfc_interface *q;
1934   for (; p; p = p->next)
1935     for (q = q0; q; q = q->next)
1936       {
1937 	if (p->sym == q->sym)
1938 	  continue;		/* Duplicates OK here.  */
1939 
1940 	if (p->sym->name == q->sym->name && p->sym->module == q->sym->module)
1941 	  continue;
1942 
1943 	if (!gfc_fl_struct (p->sym->attr.flavor)
1944 	    && !gfc_fl_struct (q->sym->attr.flavor)
1945 	    && gfc_compare_interfaces (p->sym, q->sym, q->sym->name,
1946 				       generic_flag, 0, NULL, 0, NULL, NULL))
1947 	  {
1948 	    if (referenced)
1949 	      gfc_error ("Ambiguous interfaces in %s for %qs at %L "
1950 			 "and %qs at %L", interface_name,
1951 			 q->sym->name, &q->sym->declared_at,
1952 			 p->sym->name, &p->sym->declared_at);
1953 	    else if (!p->sym->attr.use_assoc && q->sym->attr.use_assoc)
1954 	      gfc_warning (0, "Ambiguous interfaces in %s for %qs at %L "
1955 			 "and %qs at %L", interface_name,
1956 			 q->sym->name, &q->sym->declared_at,
1957 			 p->sym->name, &p->sym->declared_at);
1958 	    else
1959 	      gfc_warning (0, "Although not referenced, %qs has ambiguous "
1960 			   "interfaces at %L", interface_name, &p->where);
1961 	    return true;
1962 	  }
1963       }
1964   return false;
1965 }
1966 
1967 
1968 /* Check the generic and operator interfaces of symbols to make sure
1969    that none of the interfaces conflict.  The check has to be done
1970    after all of the symbols are actually loaded.  */
1971 
1972 static void
1973 check_sym_interfaces (gfc_symbol *sym)
1974 {
1975   char interface_name[GFC_MAX_SYMBOL_LEN + sizeof("generic interface ''")];
1976   gfc_interface *p;
1977 
1978   if (sym->ns != gfc_current_ns)
1979     return;
1980 
1981   if (sym->generic != NULL)
1982     {
1983       sprintf (interface_name, "generic interface '%s'", sym->name);
1984       if (check_interface0 (sym->generic, interface_name))
1985 	return;
1986 
1987       for (p = sym->generic; p; p = p->next)
1988 	{
1989 	  if (p->sym->attr.mod_proc
1990 	      && !p->sym->attr.module_procedure
1991 	      && (p->sym->attr.if_source != IFSRC_DECL
1992 		  || p->sym->attr.procedure))
1993 	    {
1994 	      gfc_error ("%qs at %L is not a module procedure",
1995 			 p->sym->name, &p->where);
1996 	      return;
1997 	    }
1998 	}
1999 
2000       /* Originally, this test was applied to host interfaces too;
2001 	 this is incorrect since host associated symbols, from any
2002 	 source, cannot be ambiguous with local symbols.  */
2003       check_interface1 (sym->generic, sym->generic, 1, interface_name,
2004 			sym->attr.referenced || !sym->attr.use_assoc);
2005     }
2006 }
2007 
2008 
2009 static void
2010 check_uop_interfaces (gfc_user_op *uop)
2011 {
2012   char interface_name[GFC_MAX_SYMBOL_LEN + sizeof("operator interface ''")];
2013   gfc_user_op *uop2;
2014   gfc_namespace *ns;
2015 
2016   sprintf (interface_name, "operator interface '%s'", uop->name);
2017   if (check_interface0 (uop->op, interface_name))
2018     return;
2019 
2020   for (ns = gfc_current_ns; ns; ns = ns->parent)
2021     {
2022       uop2 = gfc_find_uop (uop->name, ns);
2023       if (uop2 == NULL)
2024 	continue;
2025 
2026       check_interface1 (uop->op, uop2->op, 0,
2027 			interface_name, true);
2028     }
2029 }
2030 
2031 /* Given an intrinsic op, return an equivalent op if one exists,
2032    or INTRINSIC_NONE otherwise.  */
2033 
2034 gfc_intrinsic_op
2035 gfc_equivalent_op (gfc_intrinsic_op op)
2036 {
2037   switch(op)
2038     {
2039     case INTRINSIC_EQ:
2040       return INTRINSIC_EQ_OS;
2041 
2042     case INTRINSIC_EQ_OS:
2043       return INTRINSIC_EQ;
2044 
2045     case INTRINSIC_NE:
2046       return INTRINSIC_NE_OS;
2047 
2048     case INTRINSIC_NE_OS:
2049       return INTRINSIC_NE;
2050 
2051     case INTRINSIC_GT:
2052       return INTRINSIC_GT_OS;
2053 
2054     case INTRINSIC_GT_OS:
2055       return INTRINSIC_GT;
2056 
2057     case INTRINSIC_GE:
2058       return INTRINSIC_GE_OS;
2059 
2060     case INTRINSIC_GE_OS:
2061       return INTRINSIC_GE;
2062 
2063     case INTRINSIC_LT:
2064       return INTRINSIC_LT_OS;
2065 
2066     case INTRINSIC_LT_OS:
2067       return INTRINSIC_LT;
2068 
2069     case INTRINSIC_LE:
2070       return INTRINSIC_LE_OS;
2071 
2072     case INTRINSIC_LE_OS:
2073       return INTRINSIC_LE;
2074 
2075     default:
2076       return INTRINSIC_NONE;
2077     }
2078 }
2079 
2080 /* For the namespace, check generic, user operator and intrinsic
2081    operator interfaces for consistency and to remove duplicate
2082    interfaces.  We traverse the whole namespace, counting on the fact
2083    that most symbols will not have generic or operator interfaces.  */
2084 
2085 void
2086 gfc_check_interfaces (gfc_namespace *ns)
2087 {
2088   gfc_namespace *old_ns, *ns2;
2089   char interface_name[GFC_MAX_SYMBOL_LEN + sizeof("intrinsic '' operator")];
2090   int i;
2091 
2092   old_ns = gfc_current_ns;
2093   gfc_current_ns = ns;
2094 
2095   gfc_traverse_ns (ns, check_sym_interfaces);
2096 
2097   gfc_traverse_user_op (ns, check_uop_interfaces);
2098 
2099   for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
2100     {
2101       if (i == INTRINSIC_USER)
2102 	continue;
2103 
2104       if (i == INTRINSIC_ASSIGN)
2105 	strcpy (interface_name, "intrinsic assignment operator");
2106       else
2107 	sprintf (interface_name, "intrinsic '%s' operator",
2108 		 gfc_op2string ((gfc_intrinsic_op) i));
2109 
2110       if (check_interface0 (ns->op[i], interface_name))
2111 	continue;
2112 
2113       if (ns->op[i])
2114 	gfc_check_operator_interface (ns->op[i]->sym, (gfc_intrinsic_op) i,
2115 				      ns->op[i]->where);
2116 
2117       for (ns2 = ns; ns2; ns2 = ns2->parent)
2118 	{
2119 	  gfc_intrinsic_op other_op;
2120 
2121 	  if (check_interface1 (ns->op[i], ns2->op[i], 0,
2122 				interface_name, true))
2123 	    goto done;
2124 
2125 	  /* i should be gfc_intrinsic_op, but has to be int with this cast
2126 	     here for stupid C++ compatibility rules.  */
2127 	  other_op = gfc_equivalent_op ((gfc_intrinsic_op) i);
2128 	  if (other_op != INTRINSIC_NONE
2129 	    &&  check_interface1 (ns->op[i], ns2->op[other_op],
2130 				  0, interface_name, true))
2131 	    goto done;
2132 	}
2133     }
2134 
2135 done:
2136   gfc_current_ns = old_ns;
2137 }
2138 
2139 
2140 /* Given a symbol of a formal argument list and an expression, if the
2141    formal argument is allocatable, check that the actual argument is
2142    allocatable. Returns true if compatible, zero if not compatible.  */
2143 
2144 static bool
2145 compare_allocatable (gfc_symbol *formal, gfc_expr *actual)
2146 {
2147   if (formal->attr.allocatable
2148       || (formal->ts.type == BT_CLASS && CLASS_DATA (formal)->attr.allocatable))
2149     {
2150       symbol_attribute attr = gfc_expr_attr (actual);
2151       if (actual->ts.type == BT_CLASS && !attr.class_ok)
2152 	return true;
2153       else if (!attr.allocatable)
2154 	return false;
2155     }
2156 
2157   return true;
2158 }
2159 
2160 
2161 /* Given a symbol of a formal argument list and an expression, if the
2162    formal argument is a pointer, see if the actual argument is a
2163    pointer. Returns nonzero if compatible, zero if not compatible.  */
2164 
2165 static int
2166 compare_pointer (gfc_symbol *formal, gfc_expr *actual)
2167 {
2168   symbol_attribute attr;
2169 
2170   if (formal->attr.pointer
2171       || (formal->ts.type == BT_CLASS && CLASS_DATA (formal)
2172 	  && CLASS_DATA (formal)->attr.class_pointer))
2173     {
2174       attr = gfc_expr_attr (actual);
2175 
2176       /* Fortran 2008 allows non-pointer actual arguments.  */
2177       if (!attr.pointer && attr.target && formal->attr.intent == INTENT_IN)
2178 	return 2;
2179 
2180       if (!attr.pointer)
2181 	return 0;
2182     }
2183 
2184   return 1;
2185 }
2186 
2187 
2188 /* Emit clear error messages for rank mismatch.  */
2189 
2190 static void
2191 argument_rank_mismatch (const char *name, locus *where,
2192 			int rank1, int rank2)
2193 {
2194 
2195   /* TS 29113, C407b.  */
2196   if (rank2 == -1)
2197     gfc_error ("The assumed-rank array at %L requires that the dummy argument"
2198 	       " %qs has assumed-rank", where, name);
2199   else if (rank1 == 0)
2200     gfc_error_opt (OPT_Wargument_mismatch, "Rank mismatch in argument %qs "
2201 		   "at %L (scalar and rank-%d)", name, where, rank2);
2202   else if (rank2 == 0)
2203     gfc_error_opt (OPT_Wargument_mismatch, "Rank mismatch in argument %qs "
2204 		   "at %L (rank-%d and scalar)", name, where, rank1);
2205   else
2206     gfc_error_opt (OPT_Wargument_mismatch, "Rank mismatch in argument %qs "
2207 		   "at %L (rank-%d and rank-%d)", name, where, rank1, rank2);
2208 }
2209 
2210 
2211 /* Given a symbol of a formal argument list and an expression, see if
2212    the two are compatible as arguments.  Returns true if
2213    compatible, false if not compatible.  */
2214 
2215 static bool
2216 compare_parameter (gfc_symbol *formal, gfc_expr *actual,
2217 		   int ranks_must_agree, int is_elemental, locus *where)
2218 {
2219   gfc_ref *ref;
2220   bool rank_check, is_pointer;
2221   char err[200];
2222   gfc_component *ppc;
2223 
2224   /* If the formal arg has type BT_VOID, it's to one of the iso_c_binding
2225      procs c_f_pointer or c_f_procpointer, and we need to accept most
2226      pointers the user could give us.  This should allow that.  */
2227   if (formal->ts.type == BT_VOID)
2228     return true;
2229 
2230   if (formal->ts.type == BT_DERIVED
2231       && formal->ts.u.derived && formal->ts.u.derived->ts.is_iso_c
2232       && actual->ts.type == BT_DERIVED
2233       && actual->ts.u.derived && actual->ts.u.derived->ts.is_iso_c)
2234     return true;
2235 
2236   if (formal->ts.type == BT_CLASS && actual->ts.type == BT_DERIVED)
2237     /* Make sure the vtab symbol is present when
2238        the module variables are generated.  */
2239     gfc_find_derived_vtab (actual->ts.u.derived);
2240 
2241   if (actual->ts.type == BT_PROCEDURE)
2242     {
2243       gfc_symbol *act_sym = actual->symtree->n.sym;
2244 
2245       if (formal->attr.flavor != FL_PROCEDURE)
2246 	{
2247 	  if (where)
2248 	    gfc_error ("Invalid procedure argument at %L", &actual->where);
2249 	  return false;
2250 	}
2251 
2252       if (!gfc_compare_interfaces (formal, act_sym, act_sym->name, 0, 1, err,
2253 				   sizeof(err), NULL, NULL))
2254 	{
2255 	  if (where)
2256 	    gfc_error_opt (OPT_Wargument_mismatch,
2257 			   "Interface mismatch in dummy procedure %qs at %L:"
2258 			   " %s", formal->name, &actual->where, err);
2259 	  return false;
2260 	}
2261 
2262       if (formal->attr.function && !act_sym->attr.function)
2263 	{
2264 	  gfc_add_function (&act_sym->attr, act_sym->name,
2265 	  &act_sym->declared_at);
2266 	  if (act_sym->ts.type == BT_UNKNOWN
2267 	      && !gfc_set_default_type (act_sym, 1, act_sym->ns))
2268 	    return false;
2269 	}
2270       else if (formal->attr.subroutine && !act_sym->attr.subroutine)
2271 	gfc_add_subroutine (&act_sym->attr, act_sym->name,
2272 			    &act_sym->declared_at);
2273 
2274       return true;
2275     }
2276 
2277   ppc = gfc_get_proc_ptr_comp (actual);
2278   if (ppc && ppc->ts.interface)
2279     {
2280       if (!gfc_compare_interfaces (formal, ppc->ts.interface, ppc->name, 0, 1,
2281 				   err, sizeof(err), NULL, NULL))
2282 	{
2283 	  if (where)
2284 	    gfc_error_opt (OPT_Wargument_mismatch,
2285 			   "Interface mismatch in dummy procedure %qs at %L:"
2286 			   " %s", formal->name, &actual->where, err);
2287 	  return false;
2288 	}
2289     }
2290 
2291   /* F2008, C1241.  */
2292   if (formal->attr.pointer && formal->attr.contiguous
2293       && !gfc_is_simply_contiguous (actual, true, false))
2294     {
2295       if (where)
2296 	gfc_error ("Actual argument to contiguous pointer dummy %qs at %L "
2297 		   "must be simply contiguous", formal->name, &actual->where);
2298       return false;
2299     }
2300 
2301   symbol_attribute actual_attr = gfc_expr_attr (actual);
2302   if (actual->ts.type == BT_CLASS && !actual_attr.class_ok)
2303     return true;
2304 
2305   if ((actual->expr_type != EXPR_NULL || actual->ts.type != BT_UNKNOWN)
2306       && actual->ts.type != BT_HOLLERITH
2307       && formal->ts.type != BT_ASSUMED
2308       && !(formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
2309       && !gfc_compare_types (&formal->ts, &actual->ts)
2310       && !(formal->ts.type == BT_DERIVED && actual->ts.type == BT_CLASS
2311 	   && gfc_compare_derived_types (formal->ts.u.derived,
2312 					 CLASS_DATA (actual)->ts.u.derived)))
2313     {
2314       if (where)
2315 	gfc_error_opt (OPT_Wargument_mismatch,
2316 		       "Type mismatch in argument %qs at %L; passed %s to %s",
2317 		       formal->name, where, gfc_typename (&actual->ts),
2318 		       gfc_typename (&formal->ts));
2319       return false;
2320     }
2321 
2322   if (actual->ts.type == BT_ASSUMED && formal->ts.type != BT_ASSUMED)
2323     {
2324       if (where)
2325 	gfc_error ("Assumed-type actual argument at %L requires that dummy "
2326 		   "argument %qs is of assumed type", &actual->where,
2327 		   formal->name);
2328       return false;
2329     }
2330 
2331   /* F2008, 12.5.2.5; IR F08/0073.  */
2332   if (formal->ts.type == BT_CLASS && formal->attr.class_ok
2333       && actual->expr_type != EXPR_NULL
2334       && ((CLASS_DATA (formal)->attr.class_pointer
2335 	   && formal->attr.intent != INTENT_IN)
2336           || CLASS_DATA (formal)->attr.allocatable))
2337     {
2338       if (actual->ts.type != BT_CLASS)
2339 	{
2340 	  if (where)
2341 	    gfc_error ("Actual argument to %qs at %L must be polymorphic",
2342 			formal->name, &actual->where);
2343 	  return false;
2344 	}
2345 
2346       if ((!UNLIMITED_POLY (formal) || !UNLIMITED_POLY(actual))
2347 	  && !gfc_compare_derived_types (CLASS_DATA (actual)->ts.u.derived,
2348 					 CLASS_DATA (formal)->ts.u.derived))
2349 	{
2350 	  if (where)
2351 	    gfc_error ("Actual argument to %qs at %L must have the same "
2352 		       "declared type", formal->name, &actual->where);
2353 	  return false;
2354 	}
2355     }
2356 
2357   /* F08: 12.5.2.5 Allocatable and pointer dummy variables.  However, this
2358      is necessary also for F03, so retain error for both.
2359      NOTE: Other type/kind errors pre-empt this error.  Since they are F03
2360      compatible, no attempt has been made to channel to this one.  */
2361   if (UNLIMITED_POLY (formal) && !UNLIMITED_POLY (actual)
2362       && (CLASS_DATA (formal)->attr.allocatable
2363 	  ||CLASS_DATA (formal)->attr.class_pointer))
2364     {
2365       if (where)
2366 	gfc_error ("Actual argument to %qs at %L must be unlimited "
2367 		   "polymorphic since the formal argument is a "
2368 		   "pointer or allocatable unlimited polymorphic "
2369 		   "entity [F2008: 12.5.2.5]", formal->name,
2370 		   &actual->where);
2371       return false;
2372     }
2373 
2374   if (formal->attr.codimension && !gfc_is_coarray (actual))
2375     {
2376       if (where)
2377 	gfc_error ("Actual argument to %qs at %L must be a coarray",
2378 		       formal->name, &actual->where);
2379       return false;
2380     }
2381 
2382   if (formal->attr.codimension && formal->attr.allocatable)
2383     {
2384       gfc_ref *last = NULL;
2385 
2386       for (ref = actual->ref; ref; ref = ref->next)
2387 	if (ref->type == REF_COMPONENT)
2388 	  last = ref;
2389 
2390       /* F2008, 12.5.2.6.  */
2391       if ((last && last->u.c.component->as->corank != formal->as->corank)
2392 	  || (!last
2393 	      && actual->symtree->n.sym->as->corank != formal->as->corank))
2394 	{
2395 	  if (where)
2396 	    gfc_error ("Corank mismatch in argument %qs at %L (%d and %d)",
2397 		   formal->name, &actual->where, formal->as->corank,
2398 		   last ? last->u.c.component->as->corank
2399 			: actual->symtree->n.sym->as->corank);
2400 	  return false;
2401 	}
2402     }
2403 
2404   if (formal->attr.codimension)
2405     {
2406       /* F2008, 12.5.2.8 + Corrig 2 (IR F08/0048).  */
2407       /* F2018, 12.5.2.8.  */
2408       if (formal->attr.dimension
2409 	  && (formal->attr.contiguous || formal->as->type != AS_ASSUMED_SHAPE)
2410 	  && actual_attr.dimension
2411 	  && !gfc_is_simply_contiguous (actual, true, true))
2412 	{
2413 	  if (where)
2414 	    gfc_error ("Actual argument to %qs at %L must be simply "
2415 		       "contiguous or an element of such an array",
2416 		       formal->name, &actual->where);
2417 	  return false;
2418 	}
2419 
2420       /* F2008, C1303 and C1304.  */
2421       if (formal->attr.intent != INTENT_INOUT
2422 	  && (((formal->ts.type == BT_DERIVED || formal->ts.type == BT_CLASS)
2423 	       && formal->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
2424 	       && formal->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
2425 	      || formal->attr.lock_comp))
2426 
2427     	{
2428 	  if (where)
2429 	    gfc_error ("Actual argument to non-INTENT(INOUT) dummy %qs at %L, "
2430 		       "which is LOCK_TYPE or has a LOCK_TYPE component",
2431 		       formal->name, &actual->where);
2432 	  return false;
2433 	}
2434 
2435       /* TS18508, C702/C703.  */
2436       if (formal->attr.intent != INTENT_INOUT
2437 	  && (((formal->ts.type == BT_DERIVED || formal->ts.type == BT_CLASS)
2438 	       && formal->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
2439 	       && formal->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
2440 	      || formal->attr.event_comp))
2441 
2442     	{
2443 	  if (where)
2444 	    gfc_error ("Actual argument to non-INTENT(INOUT) dummy %qs at %L, "
2445 		       "which is EVENT_TYPE or has a EVENT_TYPE component",
2446 		       formal->name, &actual->where);
2447 	  return false;
2448 	}
2449     }
2450 
2451   /* F2008, C1239/C1240.  */
2452   if (actual->expr_type == EXPR_VARIABLE
2453       && (actual->symtree->n.sym->attr.asynchronous
2454          || actual->symtree->n.sym->attr.volatile_)
2455       &&  (formal->attr.asynchronous || formal->attr.volatile_)
2456       && actual->rank && formal->as
2457       && !gfc_is_simply_contiguous (actual, true, false)
2458       && ((formal->as->type != AS_ASSUMED_SHAPE
2459 	   && formal->as->type != AS_ASSUMED_RANK && !formal->attr.pointer)
2460 	  || formal->attr.contiguous))
2461     {
2462       if (where)
2463 	gfc_error ("Dummy argument %qs has to be a pointer, assumed-shape or "
2464 		   "assumed-rank array without CONTIGUOUS attribute - as actual"
2465 		   " argument at %L is not simply contiguous and both are "
2466 		   "ASYNCHRONOUS or VOLATILE", formal->name, &actual->where);
2467       return false;
2468     }
2469 
2470   if (formal->attr.allocatable && !formal->attr.codimension
2471       && actual_attr.codimension)
2472     {
2473       if (formal->attr.intent == INTENT_OUT)
2474 	{
2475 	  if (where)
2476 	    gfc_error ("Passing coarray at %L to allocatable, noncoarray, "
2477 		       "INTENT(OUT) dummy argument %qs", &actual->where,
2478 		       formal->name);
2479 	  return false;
2480 	}
2481       else if (warn_surprising && where && formal->attr.intent != INTENT_IN)
2482 	gfc_warning (OPT_Wsurprising,
2483 		     "Passing coarray at %L to allocatable, noncoarray dummy "
2484 		     "argument %qs, which is invalid if the allocation status"
2485 		     " is modified",  &actual->where, formal->name);
2486     }
2487 
2488   /* If the rank is the same or the formal argument has assumed-rank.  */
2489   if (symbol_rank (formal) == actual->rank || symbol_rank (formal) == -1)
2490     return true;
2491 
2492   rank_check = where != NULL && !is_elemental && formal->as
2493 	       && (formal->as->type == AS_ASSUMED_SHAPE
2494 		   || formal->as->type == AS_DEFERRED)
2495 	       && actual->expr_type != EXPR_NULL;
2496 
2497   /* Skip rank checks for NO_ARG_CHECK.  */
2498   if (formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
2499     return true;
2500 
2501   /* Scalar & coindexed, see: F2008, Section 12.5.2.4.  */
2502   if (rank_check || ranks_must_agree
2503       || (formal->attr.pointer && actual->expr_type != EXPR_NULL)
2504       || (actual->rank != 0 && !(is_elemental || formal->attr.dimension))
2505       || (actual->rank == 0
2506 	  && ((formal->ts.type == BT_CLASS
2507 	       && CLASS_DATA (formal)->as->type == AS_ASSUMED_SHAPE)
2508 	      || (formal->ts.type != BT_CLASS
2509 		   && formal->as->type == AS_ASSUMED_SHAPE))
2510 	  && actual->expr_type != EXPR_NULL)
2511       || (actual->rank == 0 && formal->attr.dimension
2512 	  && gfc_is_coindexed (actual)))
2513     {
2514       if (where)
2515 	argument_rank_mismatch (formal->name, &actual->where,
2516 				symbol_rank (formal), actual->rank);
2517       return false;
2518     }
2519   else if (actual->rank != 0 && (is_elemental || formal->attr.dimension))
2520     return true;
2521 
2522   /* At this point, we are considering a scalar passed to an array.   This
2523      is valid (cf. F95 12.4.1.1, F2003 12.4.1.2, and F2008 12.5.2.4),
2524      - if the actual argument is (a substring of) an element of a
2525        non-assumed-shape/non-pointer/non-polymorphic array; or
2526      - (F2003) if the actual argument is of type character of default/c_char
2527        kind.  */
2528 
2529   is_pointer = actual->expr_type == EXPR_VARIABLE
2530 	       ? actual->symtree->n.sym->attr.pointer : false;
2531 
2532   for (ref = actual->ref; ref; ref = ref->next)
2533     {
2534       if (ref->type == REF_COMPONENT)
2535 	is_pointer = ref->u.c.component->attr.pointer;
2536       else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT
2537 	       && ref->u.ar.dimen > 0
2538 	       && (!ref->next
2539 		   || (ref->next->type == REF_SUBSTRING && !ref->next->next)))
2540         break;
2541     }
2542 
2543   if (actual->ts.type == BT_CLASS && actual->expr_type != EXPR_NULL)
2544     {
2545       if (where)
2546 	gfc_error ("Polymorphic scalar passed to array dummy argument %qs "
2547 		   "at %L", formal->name, &actual->where);
2548       return false;
2549     }
2550 
2551   if (actual->expr_type != EXPR_NULL && ref && actual->ts.type != BT_CHARACTER
2552       && (is_pointer || ref->u.ar.as->type == AS_ASSUMED_SHAPE))
2553     {
2554       if (where)
2555 	gfc_error ("Element of assumed-shaped or pointer "
2556 		   "array passed to array dummy argument %qs at %L",
2557 		   formal->name, &actual->where);
2558       return false;
2559     }
2560 
2561   if (actual->ts.type == BT_CHARACTER && actual->expr_type != EXPR_NULL
2562       && (!ref || is_pointer || ref->u.ar.as->type == AS_ASSUMED_SHAPE))
2563     {
2564       if (formal->ts.kind != 1 && (gfc_option.allow_std & GFC_STD_GNU) == 0)
2565 	{
2566 	  if (where)
2567 	    gfc_error ("Extension: Scalar non-default-kind, non-C_CHAR-kind "
2568 		       "CHARACTER actual argument with array dummy argument "
2569 		       "%qs at %L", formal->name, &actual->where);
2570 	  return false;
2571 	}
2572 
2573       if (where && (gfc_option.allow_std & GFC_STD_F2003) == 0)
2574 	{
2575 	  gfc_error ("Fortran 2003: Scalar CHARACTER actual argument with "
2576 		     "array dummy argument %qs at %L",
2577 		     formal->name, &actual->where);
2578 	  return false;
2579 	}
2580       else
2581 	return ((gfc_option.allow_std & GFC_STD_F2003) != 0);
2582     }
2583 
2584   if (ref == NULL && actual->expr_type != EXPR_NULL)
2585     {
2586       if (where)
2587 	argument_rank_mismatch (formal->name, &actual->where,
2588 				symbol_rank (formal), actual->rank);
2589       return false;
2590     }
2591 
2592   return true;
2593 }
2594 
2595 
2596 /* Returns the storage size of a symbol (formal argument) or
2597    zero if it cannot be determined.  */
2598 
2599 static unsigned long
2600 get_sym_storage_size (gfc_symbol *sym)
2601 {
2602   int i;
2603   unsigned long strlen, elements;
2604 
2605   if (sym->ts.type == BT_CHARACTER)
2606     {
2607       if (sym->ts.u.cl && sym->ts.u.cl->length
2608           && sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
2609 	strlen = mpz_get_ui (sym->ts.u.cl->length->value.integer);
2610       else
2611 	return 0;
2612     }
2613   else
2614     strlen = 1;
2615 
2616   if (symbol_rank (sym) == 0)
2617     return strlen;
2618 
2619   elements = 1;
2620   if (sym->as->type != AS_EXPLICIT)
2621     return 0;
2622   for (i = 0; i < sym->as->rank; i++)
2623     {
2624       if (sym->as->upper[i]->expr_type != EXPR_CONSTANT
2625 	  || sym->as->lower[i]->expr_type != EXPR_CONSTANT)
2626 	return 0;
2627 
2628       elements *= mpz_get_si (sym->as->upper[i]->value.integer)
2629 		  - mpz_get_si (sym->as->lower[i]->value.integer) + 1L;
2630     }
2631 
2632   return strlen*elements;
2633 }
2634 
2635 
2636 /* Returns the storage size of an expression (actual argument) or
2637    zero if it cannot be determined. For an array element, it returns
2638    the remaining size as the element sequence consists of all storage
2639    units of the actual argument up to the end of the array.  */
2640 
2641 static unsigned long
2642 get_expr_storage_size (gfc_expr *e)
2643 {
2644   int i;
2645   long int strlen, elements;
2646   long int substrlen = 0;
2647   bool is_str_storage = false;
2648   gfc_ref *ref;
2649 
2650   if (e == NULL)
2651     return 0;
2652 
2653   if (e->ts.type == BT_CHARACTER)
2654     {
2655       if (e->ts.u.cl && e->ts.u.cl->length
2656           && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
2657 	strlen = mpz_get_si (e->ts.u.cl->length->value.integer);
2658       else if (e->expr_type == EXPR_CONSTANT
2659 	       && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
2660 	strlen = e->value.character.length;
2661       else
2662 	return 0;
2663     }
2664   else
2665     strlen = 1; /* Length per element.  */
2666 
2667   if (e->rank == 0 && !e->ref)
2668     return strlen;
2669 
2670   elements = 1;
2671   if (!e->ref)
2672     {
2673       if (!e->shape)
2674 	return 0;
2675       for (i = 0; i < e->rank; i++)
2676 	elements *= mpz_get_si (e->shape[i]);
2677       return elements*strlen;
2678     }
2679 
2680   for (ref = e->ref; ref; ref = ref->next)
2681     {
2682       if (ref->type == REF_SUBSTRING && ref->u.ss.start
2683 	  && ref->u.ss.start->expr_type == EXPR_CONSTANT)
2684 	{
2685 	  if (is_str_storage)
2686 	    {
2687 	      /* The string length is the substring length.
2688 		 Set now to full string length.  */
2689 	      if (!ref->u.ss.length || !ref->u.ss.length->length
2690 		  || ref->u.ss.length->length->expr_type != EXPR_CONSTANT)
2691 		return 0;
2692 
2693 	      strlen = mpz_get_ui (ref->u.ss.length->length->value.integer);
2694 	    }
2695 	  substrlen = strlen - mpz_get_ui (ref->u.ss.start->value.integer) + 1;
2696 	  continue;
2697 	}
2698 
2699       if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2700 	for (i = 0; i < ref->u.ar.dimen; i++)
2701 	  {
2702 	    long int start, end, stride;
2703 	    stride = 1;
2704 
2705 	    if (ref->u.ar.stride[i])
2706 	      {
2707 		if (ref->u.ar.stride[i]->expr_type == EXPR_CONSTANT)
2708 		  stride = mpz_get_si (ref->u.ar.stride[i]->value.integer);
2709 		else
2710 		  return 0;
2711 	      }
2712 
2713 	    if (ref->u.ar.start[i])
2714 	      {
2715 		if (ref->u.ar.start[i]->expr_type == EXPR_CONSTANT)
2716 		  start = mpz_get_si (ref->u.ar.start[i]->value.integer);
2717 		else
2718 		  return 0;
2719 	      }
2720 	    else if (ref->u.ar.as->lower[i]
2721 		     && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT)
2722 	      start = mpz_get_si (ref->u.ar.as->lower[i]->value.integer);
2723 	    else
2724 	      return 0;
2725 
2726 	    if (ref->u.ar.end[i])
2727 	      {
2728 		if (ref->u.ar.end[i]->expr_type == EXPR_CONSTANT)
2729 		  end = mpz_get_si (ref->u.ar.end[i]->value.integer);
2730 		else
2731 		  return 0;
2732 	      }
2733 	    else if (ref->u.ar.as->upper[i]
2734 		     && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT)
2735 	      end = mpz_get_si (ref->u.ar.as->upper[i]->value.integer);
2736 	    else
2737 	      return 0;
2738 
2739 	    elements *= (end - start)/stride + 1L;
2740 	  }
2741       else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_FULL)
2742 	for (i = 0; i < ref->u.ar.as->rank; i++)
2743 	  {
2744 	    if (ref->u.ar.as->lower[i] && ref->u.ar.as->upper[i]
2745 		&& ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT
2746 		&& ref->u.ar.as->lower[i]->ts.type == BT_INTEGER
2747 		&& ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT
2748 		&& ref->u.ar.as->upper[i]->ts.type == BT_INTEGER)
2749 	      elements *= mpz_get_si (ref->u.ar.as->upper[i]->value.integer)
2750 			  - mpz_get_si (ref->u.ar.as->lower[i]->value.integer)
2751 			  + 1L;
2752 	    else
2753 	      return 0;
2754 	  }
2755       else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT
2756 	       && e->expr_type == EXPR_VARIABLE)
2757 	{
2758 	  if (ref->u.ar.as->type == AS_ASSUMED_SHAPE
2759 	      || e->symtree->n.sym->attr.pointer)
2760 	    {
2761 	      elements = 1;
2762 	      continue;
2763 	    }
2764 
2765 	  /* Determine the number of remaining elements in the element
2766 	     sequence for array element designators.  */
2767 	  is_str_storage = true;
2768 	  for (i = ref->u.ar.dimen - 1; i >= 0; i--)
2769 	    {
2770 	      if (ref->u.ar.start[i] == NULL
2771 		  || ref->u.ar.start[i]->expr_type != EXPR_CONSTANT
2772 		  || ref->u.ar.as->upper[i] == NULL
2773 		  || ref->u.ar.as->lower[i] == NULL
2774 		  || ref->u.ar.as->upper[i]->expr_type != EXPR_CONSTANT
2775 		  || ref->u.ar.as->lower[i]->expr_type != EXPR_CONSTANT)
2776 		return 0;
2777 
2778 	      elements
2779 		   = elements
2780 		     * (mpz_get_si (ref->u.ar.as->upper[i]->value.integer)
2781 			- mpz_get_si (ref->u.ar.as->lower[i]->value.integer)
2782 			+ 1L)
2783 		     - (mpz_get_si (ref->u.ar.start[i]->value.integer)
2784 			- mpz_get_si (ref->u.ar.as->lower[i]->value.integer));
2785 	    }
2786         }
2787       else if (ref->type == REF_COMPONENT && ref->u.c.component->attr.function
2788 	       && ref->u.c.component->attr.proc_pointer
2789 	       && ref->u.c.component->attr.dimension)
2790 	{
2791 	  /* Array-valued procedure-pointer components.  */
2792 	  gfc_array_spec *as = ref->u.c.component->as;
2793 	  for (i = 0; i < as->rank; i++)
2794 	    {
2795 	      if (!as->upper[i] || !as->lower[i]
2796 		  || as->upper[i]->expr_type != EXPR_CONSTANT
2797 		  || as->lower[i]->expr_type != EXPR_CONSTANT)
2798 		return 0;
2799 
2800 	      elements = elements
2801 			 * (mpz_get_si (as->upper[i]->value.integer)
2802 			    - mpz_get_si (as->lower[i]->value.integer) + 1L);
2803 	    }
2804 	}
2805     }
2806 
2807   if (substrlen)
2808     return (is_str_storage) ? substrlen + (elements-1)*strlen
2809 			    : elements*strlen;
2810   else
2811     return elements*strlen;
2812 }
2813 
2814 
2815 /* Given an expression, check whether it is an array section
2816    which has a vector subscript.  */
2817 
2818 bool
2819 gfc_has_vector_subscript (gfc_expr *e)
2820 {
2821   int i;
2822   gfc_ref *ref;
2823 
2824   if (e == NULL || e->rank == 0 || e->expr_type != EXPR_VARIABLE)
2825     return false;
2826 
2827   for (ref = e->ref; ref; ref = ref->next)
2828     if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2829       for (i = 0; i < ref->u.ar.dimen; i++)
2830 	if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
2831 	  return true;
2832 
2833   return false;
2834 }
2835 
2836 
2837 static bool
2838 is_procptr_result (gfc_expr *expr)
2839 {
2840   gfc_component *c = gfc_get_proc_ptr_comp (expr);
2841   if (c)
2842     return (c->ts.interface && (c->ts.interface->attr.proc_pointer == 1));
2843   else
2844     return ((expr->symtree->n.sym->result != expr->symtree->n.sym)
2845 	    && (expr->symtree->n.sym->result->attr.proc_pointer == 1));
2846 }
2847 
2848 
2849 /* Recursively append candidate argument ARG to CANDIDATES.  Store the
2850    number of total candidates in CANDIDATES_LEN.  */
2851 
2852 static void
2853 lookup_arg_fuzzy_find_candidates (gfc_formal_arglist *arg,
2854 				  char **&candidates,
2855 				  size_t &candidates_len)
2856 {
2857   for (gfc_formal_arglist *p = arg; p && p->sym; p = p->next)
2858     vec_push (candidates, candidates_len, p->sym->name);
2859 }
2860 
2861 
2862 /* Lookup argument ARG fuzzily, taking names in ARGUMENTS into account.  */
2863 
2864 static const char*
2865 lookup_arg_fuzzy (const char *arg, gfc_formal_arglist *arguments)
2866 {
2867   char **candidates = NULL;
2868   size_t candidates_len = 0;
2869   lookup_arg_fuzzy_find_candidates (arguments, candidates, candidates_len);
2870   return gfc_closest_fuzzy_match (arg, candidates);
2871 }
2872 
2873 
2874 /* Given formal and actual argument lists, see if they are compatible.
2875    If they are compatible, the actual argument list is sorted to
2876    correspond with the formal list, and elements for missing optional
2877    arguments are inserted. If WHERE pointer is nonnull, then we issue
2878    errors when things don't match instead of just returning the status
2879    code.  */
2880 
2881 static bool
2882 compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
2883 	 	       int ranks_must_agree, int is_elemental,
2884 		       bool in_statement_function, locus *where)
2885 {
2886   gfc_actual_arglist **new_arg, *a, *actual;
2887   gfc_formal_arglist *f;
2888   int i, n, na;
2889   unsigned long actual_size, formal_size;
2890   bool full_array = false;
2891   gfc_array_ref *actual_arr_ref;
2892 
2893   actual = *ap;
2894 
2895   if (actual == NULL && formal == NULL)
2896     return true;
2897 
2898   n = 0;
2899   for (f = formal; f; f = f->next)
2900     n++;
2901 
2902   new_arg = XALLOCAVEC (gfc_actual_arglist *, n);
2903 
2904   for (i = 0; i < n; i++)
2905     new_arg[i] = NULL;
2906 
2907   na = 0;
2908   f = formal;
2909   i = 0;
2910 
2911   for (a = actual; a; a = a->next, f = f->next)
2912     {
2913       if (a->name != NULL && in_statement_function)
2914 	{
2915 	  gfc_error ("Keyword argument %qs at %L is invalid in "
2916 		     "a statement function", a->name, &a->expr->where);
2917 	  return false;
2918 	}
2919 
2920       /* Look for keywords but ignore g77 extensions like %VAL.  */
2921       if (a->name != NULL && a->name[0] != '%')
2922 	{
2923 	  i = 0;
2924 	  for (f = formal; f; f = f->next, i++)
2925 	    {
2926 	      if (f->sym == NULL)
2927 		continue;
2928 	      if (strcmp (f->sym->name, a->name) == 0)
2929 		break;
2930 	    }
2931 
2932 	  if (f == NULL)
2933 	    {
2934 	      if (where)
2935 		{
2936 		  const char *guessed = lookup_arg_fuzzy (a->name, formal);
2937 		  if (guessed)
2938 		    gfc_error ("Keyword argument %qs at %L is not in "
2939 			       "the procedure; did you mean %qs?",
2940 			       a->name, &a->expr->where, guessed);
2941 		  else
2942 		    gfc_error ("Keyword argument %qs at %L is not in "
2943 			       "the procedure", a->name, &a->expr->where);
2944 		}
2945 	      return false;
2946 	    }
2947 
2948 	  if (new_arg[i] != NULL)
2949 	    {
2950 	      if (where)
2951 		gfc_error ("Keyword argument %qs at %L is already associated "
2952 			   "with another actual argument", a->name,
2953 			   &a->expr->where);
2954 	      return false;
2955 	    }
2956 	}
2957 
2958       if (f == NULL)
2959 	{
2960 	  if (where)
2961 	    gfc_error ("More actual than formal arguments in procedure "
2962 		       "call at %L", where);
2963 
2964 	  return false;
2965 	}
2966 
2967       if (f->sym == NULL && a->expr == NULL)
2968 	goto match;
2969 
2970       if (f->sym == NULL)
2971 	{
2972 	  /* These errors have to be issued, otherwise an ICE can occur.
2973 	     See PR 78865.  */
2974 	  if (where)
2975 	    gfc_error_now ("Missing alternate return specifier in subroutine "
2976 			   "call at %L", where);
2977 	  return false;
2978 	}
2979 
2980       if (a->expr == NULL)
2981 	{
2982 	  if (where)
2983 	    gfc_error_now ("Unexpected alternate return specifier in "
2984 			   "subroutine call at %L", where);
2985 	  return false;
2986 	}
2987 
2988       /* Make sure that intrinsic vtables exist for calls to unlimited
2989 	 polymorphic formal arguments.  */
2990       if (UNLIMITED_POLY (f->sym)
2991 	  && a->expr->ts.type != BT_DERIVED
2992 	  && a->expr->ts.type != BT_CLASS)
2993 	gfc_find_vtab (&a->expr->ts);
2994 
2995       if (a->expr->expr_type == EXPR_NULL
2996 	  && ((f->sym->ts.type != BT_CLASS && !f->sym->attr.pointer
2997 	       && (f->sym->attr.allocatable || !f->sym->attr.optional
2998 		   || (gfc_option.allow_std & GFC_STD_F2008) == 0))
2999 	      || (f->sym->ts.type == BT_CLASS
3000 		  && !CLASS_DATA (f->sym)->attr.class_pointer
3001 		  && (CLASS_DATA (f->sym)->attr.allocatable
3002 		      || !f->sym->attr.optional
3003 		      || (gfc_option.allow_std & GFC_STD_F2008) == 0))))
3004 	{
3005 	  if (where
3006 	      && (!f->sym->attr.optional
3007 		  || (f->sym->ts.type != BT_CLASS && f->sym->attr.allocatable)
3008 		  || (f->sym->ts.type == BT_CLASS
3009 			 && CLASS_DATA (f->sym)->attr.allocatable)))
3010 	    gfc_error ("Unexpected NULL() intrinsic at %L to dummy %qs",
3011 		       where, f->sym->name);
3012 	  else if (where)
3013 	    gfc_error ("Fortran 2008: Null pointer at %L to non-pointer "
3014 		       "dummy %qs", where, f->sym->name);
3015 
3016 	  return false;
3017 	}
3018 
3019       if (!compare_parameter (f->sym, a->expr, ranks_must_agree,
3020 			      is_elemental, where))
3021 	return false;
3022 
3023       /* TS 29113, 6.3p2.  */
3024       if (f->sym->ts.type == BT_ASSUMED
3025 	  && (a->expr->ts.type == BT_DERIVED
3026 	      || (a->expr->ts.type == BT_CLASS && CLASS_DATA (a->expr))))
3027 	{
3028 	  gfc_namespace *f2k_derived;
3029 
3030 	  f2k_derived = a->expr->ts.type == BT_DERIVED
3031 			? a->expr->ts.u.derived->f2k_derived
3032 			: CLASS_DATA (a->expr)->ts.u.derived->f2k_derived;
3033 
3034 	  if (f2k_derived
3035 	      && (f2k_derived->finalizers || f2k_derived->tb_sym_root))
3036 	    {
3037 	      gfc_error ("Actual argument at %L to assumed-type dummy is of "
3038 			 "derived type with type-bound or FINAL procedures",
3039 			 &a->expr->where);
3040 	      return false;
3041 	    }
3042 	}
3043 
3044       /* Special case for character arguments.  For allocatable, pointer
3045 	 and assumed-shape dummies, the string length needs to match
3046 	 exactly.  */
3047       if (a->expr->ts.type == BT_CHARACTER
3048 	  && a->expr->ts.u.cl && a->expr->ts.u.cl->length
3049 	  && a->expr->ts.u.cl->length->expr_type == EXPR_CONSTANT
3050 	  && f->sym->ts.type == BT_CHARACTER && f->sym->ts.u.cl
3051 	  && f->sym->ts.u.cl->length
3052 	  && f->sym->ts.u.cl->length->expr_type == EXPR_CONSTANT
3053 	  && (f->sym->attr.pointer || f->sym->attr.allocatable
3054 	      || (f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
3055 	  && (mpz_cmp (a->expr->ts.u.cl->length->value.integer,
3056 		       f->sym->ts.u.cl->length->value.integer) != 0))
3057 	{
3058 	  if (where && (f->sym->attr.pointer || f->sym->attr.allocatable))
3059 	    gfc_warning (OPT_Wargument_mismatch,
3060 			 "Character length mismatch (%ld/%ld) between actual "
3061 			 "argument and pointer or allocatable dummy argument "
3062 			 "%qs at %L",
3063 			 mpz_get_si (a->expr->ts.u.cl->length->value.integer),
3064 			 mpz_get_si (f->sym->ts.u.cl->length->value.integer),
3065 			 f->sym->name, &a->expr->where);
3066 	  else if (where)
3067 	    gfc_warning (OPT_Wargument_mismatch,
3068 			 "Character length mismatch (%ld/%ld) between actual "
3069 			 "argument and assumed-shape dummy argument %qs "
3070 			 "at %L",
3071 			 mpz_get_si (a->expr->ts.u.cl->length->value.integer),
3072 			 mpz_get_si (f->sym->ts.u.cl->length->value.integer),
3073 			 f->sym->name, &a->expr->where);
3074 	  return false;
3075 	}
3076 
3077       if ((f->sym->attr.pointer || f->sym->attr.allocatable)
3078 	  && f->sym->ts.deferred != a->expr->ts.deferred
3079 	  && a->expr->ts.type == BT_CHARACTER)
3080 	{
3081 	  if (where)
3082 	    gfc_error ("Actual argument at %L to allocatable or "
3083 		       "pointer dummy argument %qs must have a deferred "
3084 		       "length type parameter if and only if the dummy has one",
3085 		       &a->expr->where, f->sym->name);
3086 	  return false;
3087 	}
3088 
3089       if (f->sym->ts.type == BT_CLASS)
3090 	goto skip_size_check;
3091 
3092       actual_size = get_expr_storage_size (a->expr);
3093       formal_size = get_sym_storage_size (f->sym);
3094       if (actual_size != 0 && actual_size < formal_size
3095 	  && a->expr->ts.type != BT_PROCEDURE
3096 	  && f->sym->attr.flavor != FL_PROCEDURE)
3097 	{
3098 	  if (a->expr->ts.type == BT_CHARACTER && !f->sym->as && where)
3099 	    gfc_warning (OPT_Wargument_mismatch,
3100 			 "Character length of actual argument shorter "
3101 			 "than of dummy argument %qs (%lu/%lu) at %L",
3102 			 f->sym->name, actual_size, formal_size,
3103 			 &a->expr->where);
3104           else if (where)
3105 	    {
3106 	      /* Emit a warning for -std=legacy and an error otherwise. */
3107 	      if (gfc_option.warn_std == 0)
3108 	        gfc_warning (OPT_Wargument_mismatch,
3109 			     "Actual argument contains too few "
3110 			     "elements for dummy argument %qs (%lu/%lu) "
3111 			     "at %L", f->sym->name, actual_size,
3112 			     formal_size, &a->expr->where);
3113 	      else
3114 	        gfc_error_now ("Actual argument contains too few "
3115 			       "elements for dummy argument %qs (%lu/%lu) "
3116 			       "at %L", f->sym->name, actual_size,
3117 			       formal_size, &a->expr->where);
3118 	    }
3119 	  return false;
3120 	}
3121 
3122      skip_size_check:
3123 
3124       /* Satisfy F03:12.4.1.3 by ensuring that a procedure pointer actual
3125          argument is provided for a procedure pointer formal argument.  */
3126       if (f->sym->attr.proc_pointer
3127 	  && !((a->expr->expr_type == EXPR_VARIABLE
3128 		&& (a->expr->symtree->n.sym->attr.proc_pointer
3129 		    || gfc_is_proc_ptr_comp (a->expr)))
3130 	       || (a->expr->expr_type == EXPR_FUNCTION
3131 		   && is_procptr_result (a->expr))))
3132 	{
3133 	  if (where)
3134 	    gfc_error ("Expected a procedure pointer for argument %qs at %L",
3135 		       f->sym->name, &a->expr->where);
3136 	  return false;
3137 	}
3138 
3139       /* Satisfy F03:12.4.1.3 by ensuring that a procedure actual argument is
3140 	 provided for a procedure formal argument.  */
3141       if (f->sym->attr.flavor == FL_PROCEDURE
3142 	  && !((a->expr->expr_type == EXPR_VARIABLE
3143 		&& (a->expr->symtree->n.sym->attr.flavor == FL_PROCEDURE
3144 		    || a->expr->symtree->n.sym->attr.proc_pointer
3145 		    || gfc_is_proc_ptr_comp (a->expr)))
3146 	       || (a->expr->expr_type == EXPR_FUNCTION
3147 		   && is_procptr_result (a->expr))))
3148 	{
3149 	  if (where)
3150 	    gfc_error ("Expected a procedure for argument %qs at %L",
3151 		       f->sym->name, &a->expr->where);
3152 	  return false;
3153 	}
3154 
3155       if (f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE
3156 	  && a->expr->expr_type == EXPR_VARIABLE
3157 	  && a->expr->symtree->n.sym->as
3158 	  && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SIZE
3159 	  && (a->expr->ref == NULL
3160 	      || (a->expr->ref->type == REF_ARRAY
3161 		  && a->expr->ref->u.ar.type == AR_FULL)))
3162 	{
3163 	  if (where)
3164 	    gfc_error ("Actual argument for %qs cannot be an assumed-size"
3165 		       " array at %L", f->sym->name, where);
3166 	  return false;
3167 	}
3168 
3169       if (a->expr->expr_type != EXPR_NULL
3170 	  && compare_pointer (f->sym, a->expr) == 0)
3171 	{
3172 	  if (where)
3173 	    gfc_error ("Actual argument for %qs must be a pointer at %L",
3174 		       f->sym->name, &a->expr->where);
3175 	  return false;
3176 	}
3177 
3178       if (a->expr->expr_type != EXPR_NULL
3179 	  && (gfc_option.allow_std & GFC_STD_F2008) == 0
3180 	  && compare_pointer (f->sym, a->expr) == 2)
3181 	{
3182 	  if (where)
3183 	    gfc_error ("Fortran 2008: Non-pointer actual argument at %L to "
3184 		       "pointer dummy %qs", &a->expr->where,f->sym->name);
3185 	  return false;
3186 	}
3187 
3188 
3189       /* Fortran 2008, C1242.  */
3190       if (f->sym->attr.pointer && gfc_is_coindexed (a->expr))
3191 	{
3192 	  if (where)
3193 	    gfc_error ("Coindexed actual argument at %L to pointer "
3194 		       "dummy %qs",
3195 		       &a->expr->where, f->sym->name);
3196 	  return false;
3197 	}
3198 
3199       /* Fortran 2008, 12.5.2.5 (no constraint).  */
3200       if (a->expr->expr_type == EXPR_VARIABLE
3201 	  && f->sym->attr.intent != INTENT_IN
3202 	  && f->sym->attr.allocatable
3203 	  && gfc_is_coindexed (a->expr))
3204 	{
3205 	  if (where)
3206 	    gfc_error ("Coindexed actual argument at %L to allocatable "
3207 		       "dummy %qs requires INTENT(IN)",
3208 		       &a->expr->where, f->sym->name);
3209 	  return false;
3210 	}
3211 
3212       /* Fortran 2008, C1237.  */
3213       if (a->expr->expr_type == EXPR_VARIABLE
3214 	  && (f->sym->attr.asynchronous || f->sym->attr.volatile_)
3215 	  && gfc_is_coindexed (a->expr)
3216 	  && (a->expr->symtree->n.sym->attr.volatile_
3217 	      || a->expr->symtree->n.sym->attr.asynchronous))
3218 	{
3219 	  if (where)
3220 	    gfc_error ("Coindexed ASYNCHRONOUS or VOLATILE actual argument at "
3221 		       "%L requires that dummy %qs has neither "
3222 		       "ASYNCHRONOUS nor VOLATILE", &a->expr->where,
3223 		       f->sym->name);
3224 	  return false;
3225 	}
3226 
3227       /* Fortran 2008, 12.5.2.4 (no constraint).  */
3228       if (a->expr->expr_type == EXPR_VARIABLE
3229 	  && f->sym->attr.intent != INTENT_IN && !f->sym->attr.value
3230 	  && gfc_is_coindexed (a->expr)
3231 	  && gfc_has_ultimate_allocatable (a->expr))
3232 	{
3233 	  if (where)
3234 	    gfc_error ("Coindexed actual argument at %L with allocatable "
3235 		       "ultimate component to dummy %qs requires either VALUE "
3236 		       "or INTENT(IN)", &a->expr->where, f->sym->name);
3237 	  return false;
3238 	}
3239 
3240      if (f->sym->ts.type == BT_CLASS
3241 	   && CLASS_DATA (f->sym)->attr.allocatable
3242 	   && gfc_is_class_array_ref (a->expr, &full_array)
3243 	   && !full_array)
3244 	{
3245 	  if (where)
3246 	    gfc_error ("Actual CLASS array argument for %qs must be a full "
3247 		       "array at %L", f->sym->name, &a->expr->where);
3248 	  return false;
3249 	}
3250 
3251 
3252       if (a->expr->expr_type != EXPR_NULL
3253 	  && !compare_allocatable (f->sym, a->expr))
3254 	{
3255 	  if (where)
3256 	    gfc_error ("Actual argument for %qs must be ALLOCATABLE at %L",
3257 		       f->sym->name, &a->expr->where);
3258 	  return false;
3259 	}
3260 
3261       /* Check intent = OUT/INOUT for definable actual argument.  */
3262       if (!in_statement_function
3263 	  && (f->sym->attr.intent == INTENT_OUT
3264 	      || f->sym->attr.intent == INTENT_INOUT))
3265 	{
3266 	  const char* context = (where
3267 				 ? _("actual argument to INTENT = OUT/INOUT")
3268 				 : NULL);
3269 
3270 	  if (((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3271 		&& CLASS_DATA (f->sym)->attr.class_pointer)
3272 	       || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
3273 	      && !gfc_check_vardef_context (a->expr, true, false, false, context))
3274 	    return false;
3275 	  if (!gfc_check_vardef_context (a->expr, false, false, false, context))
3276 	    return false;
3277 	}
3278 
3279       if ((f->sym->attr.intent == INTENT_OUT
3280 	   || f->sym->attr.intent == INTENT_INOUT
3281 	   || f->sym->attr.volatile_
3282 	   || f->sym->attr.asynchronous)
3283 	  && gfc_has_vector_subscript (a->expr))
3284 	{
3285 	  if (where)
3286 	    gfc_error ("Array-section actual argument with vector "
3287 		       "subscripts at %L is incompatible with INTENT(OUT), "
3288 		       "INTENT(INOUT), VOLATILE or ASYNCHRONOUS attribute "
3289 		       "of the dummy argument %qs",
3290 		       &a->expr->where, f->sym->name);
3291 	  return false;
3292 	}
3293 
3294       /* C1232 (R1221) For an actual argument which is an array section or
3295 	 an assumed-shape array, the dummy argument shall be an assumed-
3296 	 shape array, if the dummy argument has the VOLATILE attribute.  */
3297 
3298       if (f->sym->attr.volatile_
3299 	  && a->expr->expr_type == EXPR_VARIABLE
3300 	  && a->expr->symtree->n.sym->as
3301 	  && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SHAPE
3302 	  && !(f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
3303 	{
3304 	  if (where)
3305 	    gfc_error ("Assumed-shape actual argument at %L is "
3306 		       "incompatible with the non-assumed-shape "
3307 		       "dummy argument %qs due to VOLATILE attribute",
3308 		       &a->expr->where,f->sym->name);
3309 	  return false;
3310 	}
3311 
3312       /* Find the last array_ref.  */
3313       actual_arr_ref = NULL;
3314       if (a->expr->ref)
3315 	actual_arr_ref = gfc_find_array_ref (a->expr, true);
3316 
3317       if (f->sym->attr.volatile_
3318 	  && actual_arr_ref && actual_arr_ref->type == AR_SECTION
3319 	  && !(f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
3320 	{
3321 	  if (where)
3322 	    gfc_error ("Array-section actual argument at %L is "
3323 		       "incompatible with the non-assumed-shape "
3324 		       "dummy argument %qs due to VOLATILE attribute",
3325 		       &a->expr->where, f->sym->name);
3326 	  return false;
3327 	}
3328 
3329       /* C1233 (R1221) For an actual argument which is a pointer array, the
3330 	 dummy argument shall be an assumed-shape or pointer array, if the
3331 	 dummy argument has the VOLATILE attribute.  */
3332 
3333       if (f->sym->attr.volatile_
3334 	  && a->expr->expr_type == EXPR_VARIABLE
3335 	  && a->expr->symtree->n.sym->attr.pointer
3336 	  && a->expr->symtree->n.sym->as
3337 	  && !(f->sym->as
3338 	       && (f->sym->as->type == AS_ASSUMED_SHAPE
3339 		   || f->sym->attr.pointer)))
3340 	{
3341 	  if (where)
3342 	    gfc_error ("Pointer-array actual argument at %L requires "
3343 		       "an assumed-shape or pointer-array dummy "
3344 		       "argument %qs due to VOLATILE attribute",
3345 		       &a->expr->where,f->sym->name);
3346 	  return false;
3347 	}
3348 
3349     match:
3350       if (a == actual)
3351 	na = i;
3352 
3353       new_arg[i++] = a;
3354     }
3355 
3356   /* Make sure missing actual arguments are optional.  */
3357   i = 0;
3358   for (f = formal; f; f = f->next, i++)
3359     {
3360       if (new_arg[i] != NULL)
3361 	continue;
3362       if (f->sym == NULL)
3363 	{
3364 	  if (where)
3365 	    gfc_error ("Missing alternate return spec in subroutine call "
3366 		       "at %L", where);
3367 	  return false;
3368 	}
3369       if (!f->sym->attr.optional
3370 	  || (in_statement_function && f->sym->attr.optional))
3371 	{
3372 	  if (where)
3373 	    gfc_error ("Missing actual argument for argument %qs at %L",
3374 		       f->sym->name, where);
3375 	  return false;
3376 	}
3377     }
3378 
3379   /* The argument lists are compatible.  We now relink a new actual
3380      argument list with null arguments in the right places.  The head
3381      of the list remains the head.  */
3382   for (i = 0; i < n; i++)
3383     if (new_arg[i] == NULL)
3384       new_arg[i] = gfc_get_actual_arglist ();
3385 
3386   if (na != 0)
3387     {
3388       std::swap (*new_arg[0], *actual);
3389       std::swap (new_arg[0], new_arg[na]);
3390     }
3391 
3392   for (i = 0; i < n - 1; i++)
3393     new_arg[i]->next = new_arg[i + 1];
3394 
3395   new_arg[i]->next = NULL;
3396 
3397   if (*ap == NULL && n > 0)
3398     *ap = new_arg[0];
3399 
3400   /* Note the types of omitted optional arguments.  */
3401   for (a = *ap, f = formal; a; a = a->next, f = f->next)
3402     if (a->expr == NULL && a->label == NULL)
3403       a->missing_arg_type = f->sym->ts.type;
3404 
3405   return true;
3406 }
3407 
3408 
3409 typedef struct
3410 {
3411   gfc_formal_arglist *f;
3412   gfc_actual_arglist *a;
3413 }
3414 argpair;
3415 
3416 /* qsort comparison function for argument pairs, with the following
3417    order:
3418     - p->a->expr == NULL
3419     - p->a->expr->expr_type != EXPR_VARIABLE
3420     - by gfc_symbol pointer value (larger first).  */
3421 
3422 static int
3423 pair_cmp (const void *p1, const void *p2)
3424 {
3425   const gfc_actual_arglist *a1, *a2;
3426 
3427   /* *p1 and *p2 are elements of the to-be-sorted array.  */
3428   a1 = ((const argpair *) p1)->a;
3429   a2 = ((const argpair *) p2)->a;
3430   if (!a1->expr)
3431     {
3432       if (!a2->expr)
3433 	return 0;
3434       return -1;
3435     }
3436   if (!a2->expr)
3437     return 1;
3438   if (a1->expr->expr_type != EXPR_VARIABLE)
3439     {
3440       if (a2->expr->expr_type != EXPR_VARIABLE)
3441 	return 0;
3442       return -1;
3443     }
3444   if (a2->expr->expr_type != EXPR_VARIABLE)
3445     return 1;
3446   if (a1->expr->symtree->n.sym > a2->expr->symtree->n.sym)
3447     return -1;
3448   return a1->expr->symtree->n.sym < a2->expr->symtree->n.sym;
3449 }
3450 
3451 
3452 /* Given two expressions from some actual arguments, test whether they
3453    refer to the same expression. The analysis is conservative.
3454    Returning false will produce no warning.  */
3455 
3456 static bool
3457 compare_actual_expr (gfc_expr *e1, gfc_expr *e2)
3458 {
3459   const gfc_ref *r1, *r2;
3460 
3461   if (!e1 || !e2
3462       || e1->expr_type != EXPR_VARIABLE
3463       || e2->expr_type != EXPR_VARIABLE
3464       || e1->symtree->n.sym != e2->symtree->n.sym)
3465     return false;
3466 
3467   /* TODO: improve comparison, see expr.c:show_ref().  */
3468   for (r1 = e1->ref, r2 = e2->ref; r1 && r2; r1 = r1->next, r2 = r2->next)
3469     {
3470       if (r1->type != r2->type)
3471 	return false;
3472       switch (r1->type)
3473 	{
3474 	case REF_ARRAY:
3475 	  if (r1->u.ar.type != r2->u.ar.type)
3476 	    return false;
3477 	  /* TODO: At the moment, consider only full arrays;
3478 	     we could do better.  */
3479 	  if (r1->u.ar.type != AR_FULL || r2->u.ar.type != AR_FULL)
3480 	    return false;
3481 	  break;
3482 
3483 	case REF_COMPONENT:
3484 	  if (r1->u.c.component != r2->u.c.component)
3485 	    return false;
3486 	  break;
3487 
3488 	case REF_SUBSTRING:
3489 	  return false;
3490 
3491 	case REF_INQUIRY:
3492 	  if (e1->symtree->n.sym->ts.type == BT_COMPLEX
3493 	      && e1->ts.type == BT_REAL && e2->ts.type == BT_REAL
3494 	      && r1->u.i != r2->u.i)
3495 	    return false;
3496 	  break;
3497 
3498 	default:
3499 	  gfc_internal_error ("compare_actual_expr(): Bad component code");
3500 	}
3501     }
3502   if (!r1 && !r2)
3503     return true;
3504   return false;
3505 }
3506 
3507 
3508 /* Given formal and actual argument lists that correspond to one
3509    another, check that identical actual arguments aren't not
3510    associated with some incompatible INTENTs.  */
3511 
3512 static bool
3513 check_some_aliasing (gfc_formal_arglist *f, gfc_actual_arglist *a)
3514 {
3515   sym_intent f1_intent, f2_intent;
3516   gfc_formal_arglist *f1;
3517   gfc_actual_arglist *a1;
3518   size_t n, i, j;
3519   argpair *p;
3520   bool t = true;
3521 
3522   n = 0;
3523   for (f1 = f, a1 = a;; f1 = f1->next, a1 = a1->next)
3524     {
3525       if (f1 == NULL && a1 == NULL)
3526 	break;
3527       if (f1 == NULL || a1 == NULL)
3528 	gfc_internal_error ("check_some_aliasing(): List mismatch");
3529       n++;
3530     }
3531   if (n == 0)
3532     return t;
3533   p = XALLOCAVEC (argpair, n);
3534 
3535   for (i = 0, f1 = f, a1 = a; i < n; i++, f1 = f1->next, a1 = a1->next)
3536     {
3537       p[i].f = f1;
3538       p[i].a = a1;
3539     }
3540 
3541   qsort (p, n, sizeof (argpair), pair_cmp);
3542 
3543   for (i = 0; i < n; i++)
3544     {
3545       if (!p[i].a->expr
3546 	  || p[i].a->expr->expr_type != EXPR_VARIABLE
3547 	  || p[i].a->expr->ts.type == BT_PROCEDURE)
3548 	continue;
3549       f1_intent = p[i].f->sym->attr.intent;
3550       for (j = i + 1; j < n; j++)
3551 	{
3552 	  /* Expected order after the sort.  */
3553 	  if (!p[j].a->expr || p[j].a->expr->expr_type != EXPR_VARIABLE)
3554 	    gfc_internal_error ("check_some_aliasing(): corrupted data");
3555 
3556 	  /* Are the expression the same?  */
3557 	  if (!compare_actual_expr (p[i].a->expr, p[j].a->expr))
3558 	    break;
3559 	  f2_intent = p[j].f->sym->attr.intent;
3560 	  if ((f1_intent == INTENT_IN && f2_intent == INTENT_OUT)
3561 	      || (f1_intent == INTENT_OUT && f2_intent == INTENT_IN)
3562 	      || (f1_intent == INTENT_OUT && f2_intent == INTENT_OUT))
3563 	    {
3564 	      gfc_warning (0, "Same actual argument associated with INTENT(%s) "
3565 			   "argument %qs and INTENT(%s) argument %qs at %L",
3566 			   gfc_intent_string (f1_intent), p[i].f->sym->name,
3567 			   gfc_intent_string (f2_intent), p[j].f->sym->name,
3568 			   &p[i].a->expr->where);
3569 	      t = false;
3570 	    }
3571 	}
3572     }
3573 
3574   return t;
3575 }
3576 
3577 
3578 /* Given formal and actual argument lists that correspond to one
3579    another, check that they are compatible in the sense that intents
3580    are not mismatched.  */
3581 
3582 static bool
3583 check_intents (gfc_formal_arglist *f, gfc_actual_arglist *a)
3584 {
3585   sym_intent f_intent;
3586 
3587   for (;; f = f->next, a = a->next)
3588     {
3589       gfc_expr *expr;
3590 
3591       if (f == NULL && a == NULL)
3592 	break;
3593       if (f == NULL || a == NULL)
3594 	gfc_internal_error ("check_intents(): List mismatch");
3595 
3596       if (a->expr && a->expr->expr_type == EXPR_FUNCTION
3597 	  && a->expr->value.function.isym
3598 	  && a->expr->value.function.isym->id == GFC_ISYM_CAF_GET)
3599 	expr = a->expr->value.function.actual->expr;
3600       else
3601 	expr = a->expr;
3602 
3603       if (expr == NULL || expr->expr_type != EXPR_VARIABLE)
3604 	continue;
3605 
3606       f_intent = f->sym->attr.intent;
3607 
3608       if (gfc_pure (NULL) && gfc_impure_variable (expr->symtree->n.sym))
3609 	{
3610 	  if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3611 	       && CLASS_DATA (f->sym)->attr.class_pointer)
3612 	      || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
3613 	    {
3614 	      gfc_error ("Procedure argument at %L is local to a PURE "
3615 			 "procedure and has the POINTER attribute",
3616 			 &expr->where);
3617 	      return false;
3618 	    }
3619 	}
3620 
3621        /* Fortran 2008, C1283.  */
3622        if (gfc_pure (NULL) && gfc_is_coindexed (expr))
3623 	{
3624 	  if (f_intent == INTENT_INOUT || f_intent == INTENT_OUT)
3625 	    {
3626 	      gfc_error ("Coindexed actual argument at %L in PURE procedure "
3627 			 "is passed to an INTENT(%s) argument",
3628 			 &expr->where, gfc_intent_string (f_intent));
3629 	      return false;
3630 	    }
3631 
3632 	  if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3633                && CLASS_DATA (f->sym)->attr.class_pointer)
3634               || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
3635 	    {
3636 	      gfc_error ("Coindexed actual argument at %L in PURE procedure "
3637 			 "is passed to a POINTER dummy argument",
3638 			 &expr->where);
3639 	      return false;
3640 	    }
3641 	}
3642 
3643        /* F2008, Section 12.5.2.4.  */
3644        if (expr->ts.type == BT_CLASS && f->sym->ts.type == BT_CLASS
3645 	   && gfc_is_coindexed (expr))
3646 	 {
3647 	   gfc_error ("Coindexed polymorphic actual argument at %L is passed "
3648 		      "polymorphic dummy argument %qs",
3649 			 &expr->where, f->sym->name);
3650 	   return false;
3651 	 }
3652     }
3653 
3654   return true;
3655 }
3656 
3657 
3658 /* Check how a procedure is used against its interface.  If all goes
3659    well, the actual argument list will also end up being properly
3660    sorted.  */
3661 
3662 bool
3663 gfc_procedure_use (gfc_symbol *sym, gfc_actual_arglist **ap, locus *where)
3664 {
3665   gfc_actual_arglist *a;
3666   gfc_formal_arglist *dummy_args;
3667 
3668   /* Warn about calls with an implicit interface.  Special case
3669      for calling a ISO_C_BINDING because c_loc and c_funloc
3670      are pseudo-unknown.  Additionally, warn about procedures not
3671      explicitly declared at all if requested.  */
3672   if (sym->attr.if_source == IFSRC_UNKNOWN && !sym->attr.is_iso_c)
3673     {
3674       bool has_implicit_none_export = false;
3675       if (sym->attr.proc == PROC_UNKNOWN)
3676 	for (gfc_namespace *ns = sym->ns; ns; ns = ns->parent)
3677 	   if (ns->has_implicit_none_export)
3678 	     has_implicit_none_export = true;
3679       if (has_implicit_none_export)
3680 	{
3681 	  const char *guessed
3682 	    = gfc_lookup_function_fuzzy (sym->name, sym->ns->sym_root);
3683 	  if (guessed)
3684 	    gfc_error ("Procedure %qs called at %L is not explicitly declared"
3685 		       "; did you mean %qs?",
3686 		       sym->name, where, guessed);
3687 	  else
3688 	    gfc_error ("Procedure %qs called at %L is not explicitly declared",
3689 		       sym->name, where);
3690 	  return false;
3691 	}
3692       if (warn_implicit_interface)
3693 	gfc_warning (OPT_Wimplicit_interface,
3694 		     "Procedure %qs called with an implicit interface at %L",
3695 		     sym->name, where);
3696       else if (warn_implicit_procedure && sym->attr.proc == PROC_UNKNOWN)
3697 	gfc_warning (OPT_Wimplicit_procedure,
3698 		     "Procedure %qs called at %L is not explicitly declared",
3699 		     sym->name, where);
3700       gfc_find_proc_namespace (sym->ns)->implicit_interface_calls = 1;
3701     }
3702 
3703   if (sym->attr.if_source == IFSRC_UNKNOWN)
3704     {
3705       if (sym->attr.pointer)
3706 	{
3707 	  gfc_error ("The pointer object %qs at %L must have an explicit "
3708 		     "function interface or be declared as array",
3709 		     sym->name, where);
3710 	  return false;
3711 	}
3712 
3713       if (sym->attr.allocatable && !sym->attr.external)
3714 	{
3715 	  gfc_error ("The allocatable object %qs at %L must have an explicit "
3716 		     "function interface or be declared as array",
3717 		     sym->name, where);
3718 	  return false;
3719 	}
3720 
3721       if (sym->attr.allocatable)
3722 	{
3723 	  gfc_error ("Allocatable function %qs at %L must have an explicit "
3724 		     "function interface", sym->name, where);
3725 	  return false;
3726 	}
3727 
3728       for (a = *ap; a; a = a->next)
3729 	{
3730 	  /* Skip g77 keyword extensions like %VAL, %REF, %LOC.  */
3731 	  if (a->name != NULL && a->name[0] != '%')
3732 	    {
3733 	      gfc_error ("Keyword argument requires explicit interface "
3734 			 "for procedure %qs at %L", sym->name, &a->expr->where);
3735 	      break;
3736 	    }
3737 
3738 	  /* TS 29113, 6.2.  */
3739 	  if (a->expr && a->expr->ts.type == BT_ASSUMED
3740 	      && sym->intmod_sym_id != ISOCBINDING_LOC)
3741 	    {
3742 	      gfc_error ("Assumed-type argument %s at %L requires an explicit "
3743 			 "interface", a->expr->symtree->n.sym->name,
3744 			 &a->expr->where);
3745 	      break;
3746 	    }
3747 
3748 	  /* F2008, C1303 and C1304.  */
3749 	  if (a->expr
3750 	      && (a->expr->ts.type == BT_DERIVED || a->expr->ts.type == BT_CLASS)
3751 	      && ((a->expr->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
3752 		   && a->expr->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
3753 		  || gfc_expr_attr (a->expr).lock_comp))
3754 	    {
3755 	      gfc_error ("Actual argument of LOCK_TYPE or with LOCK_TYPE "
3756 			 "component at %L requires an explicit interface for "
3757 			 "procedure %qs", &a->expr->where, sym->name);
3758 	      break;
3759 	    }
3760 
3761 	  if (a->expr
3762 	      && (a->expr->ts.type == BT_DERIVED || a->expr->ts.type == BT_CLASS)
3763 	      && ((a->expr->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
3764 		   && a->expr->ts.u.derived->intmod_sym_id
3765 		      == ISOFORTRAN_EVENT_TYPE)
3766 		  || gfc_expr_attr (a->expr).event_comp))
3767 	    {
3768 	      gfc_error ("Actual argument of EVENT_TYPE or with EVENT_TYPE "
3769 			 "component at %L requires an explicit interface for "
3770 			 "procedure %qs", &a->expr->where, sym->name);
3771 	      break;
3772 	    }
3773 
3774 	  if (a->expr && a->expr->expr_type == EXPR_NULL
3775 	      && a->expr->ts.type == BT_UNKNOWN)
3776 	    {
3777 	      gfc_error ("MOLD argument to NULL required at %L", &a->expr->where);
3778 	      return false;
3779 	    }
3780 
3781 	  /* TS 29113, C407b.  */
3782 	  if (a->expr && a->expr->expr_type == EXPR_VARIABLE
3783 	      && symbol_rank (a->expr->symtree->n.sym) == -1)
3784 	    {
3785 	      gfc_error ("Assumed-rank argument requires an explicit interface "
3786 			 "at %L", &a->expr->where);
3787 	      return false;
3788 	    }
3789 	}
3790 
3791       return true;
3792     }
3793 
3794   dummy_args = gfc_sym_get_dummy_args (sym);
3795 
3796   /* For a statement function, check that types and type parameters of actual
3797      arguments and dummy arguments match.  */
3798   if (!compare_actual_formal (ap, dummy_args, 0, sym->attr.elemental,
3799 			      sym->attr.proc == PROC_ST_FUNCTION, where))
3800     return false;
3801 
3802   if (!check_intents (dummy_args, *ap))
3803     return false;
3804 
3805   if (warn_aliasing)
3806     check_some_aliasing (dummy_args, *ap);
3807 
3808   return true;
3809 }
3810 
3811 
3812 /* Check how a procedure pointer component is used against its interface.
3813    If all goes well, the actual argument list will also end up being properly
3814    sorted. Completely analogous to gfc_procedure_use.  */
3815 
3816 void
3817 gfc_ppc_use (gfc_component *comp, gfc_actual_arglist **ap, locus *where)
3818 {
3819   /* Warn about calls with an implicit interface.  Special case
3820      for calling a ISO_C_BINDING because c_loc and c_funloc
3821      are pseudo-unknown.  */
3822   if (warn_implicit_interface
3823       && comp->attr.if_source == IFSRC_UNKNOWN
3824       && !comp->attr.is_iso_c)
3825     gfc_warning (OPT_Wimplicit_interface,
3826 		 "Procedure pointer component %qs called with an implicit "
3827 		 "interface at %L", comp->name, where);
3828 
3829   if (comp->attr.if_source == IFSRC_UNKNOWN)
3830     {
3831       gfc_actual_arglist *a;
3832       for (a = *ap; a; a = a->next)
3833 	{
3834 	  /* Skip g77 keyword extensions like %VAL, %REF, %LOC.  */
3835 	  if (a->name != NULL && a->name[0] != '%')
3836 	    {
3837 	      gfc_error ("Keyword argument requires explicit interface "
3838 			 "for procedure pointer component %qs at %L",
3839 			 comp->name, &a->expr->where);
3840 	      break;
3841 	    }
3842 	}
3843 
3844       return;
3845     }
3846 
3847   if (!compare_actual_formal (ap, comp->ts.interface->formal, 0,
3848 			      comp->attr.elemental, false, where))
3849     return;
3850 
3851   check_intents (comp->ts.interface->formal, *ap);
3852   if (warn_aliasing)
3853     check_some_aliasing (comp->ts.interface->formal, *ap);
3854 }
3855 
3856 
3857 /* Try if an actual argument list matches the formal list of a symbol,
3858    respecting the symbol's attributes like ELEMENTAL.  This is used for
3859    GENERIC resolution.  */
3860 
3861 bool
3862 gfc_arglist_matches_symbol (gfc_actual_arglist** args, gfc_symbol* sym)
3863 {
3864   gfc_formal_arglist *dummy_args;
3865   bool r;
3866 
3867   if (sym->attr.flavor != FL_PROCEDURE)
3868     return false;
3869 
3870   dummy_args = gfc_sym_get_dummy_args (sym);
3871 
3872   r = !sym->attr.elemental;
3873   if (compare_actual_formal (args, dummy_args, r, !r, false, NULL))
3874     {
3875       check_intents (dummy_args, *args);
3876       if (warn_aliasing)
3877 	check_some_aliasing (dummy_args, *args);
3878       return true;
3879     }
3880 
3881   return false;
3882 }
3883 
3884 
3885 /* Given an interface pointer and an actual argument list, search for
3886    a formal argument list that matches the actual.  If found, returns
3887    a pointer to the symbol of the correct interface.  Returns NULL if
3888    not found.  */
3889 
3890 gfc_symbol *
3891 gfc_search_interface (gfc_interface *intr, int sub_flag,
3892 		      gfc_actual_arglist **ap)
3893 {
3894   gfc_symbol *elem_sym = NULL;
3895   gfc_symbol *null_sym = NULL;
3896   locus null_expr_loc;
3897   gfc_actual_arglist *a;
3898   bool has_null_arg = false;
3899 
3900   for (a = *ap; a; a = a->next)
3901     if (a->expr && a->expr->expr_type == EXPR_NULL
3902 	&& a->expr->ts.type == BT_UNKNOWN)
3903       {
3904 	has_null_arg = true;
3905 	null_expr_loc = a->expr->where;
3906 	break;
3907       }
3908 
3909   for (; intr; intr = intr->next)
3910     {
3911       if (gfc_fl_struct (intr->sym->attr.flavor))
3912 	continue;
3913       if (sub_flag && intr->sym->attr.function)
3914 	continue;
3915       if (!sub_flag && intr->sym->attr.subroutine)
3916 	continue;
3917 
3918       if (gfc_arglist_matches_symbol (ap, intr->sym))
3919 	{
3920 	  if (has_null_arg && null_sym)
3921 	    {
3922 	      gfc_error ("MOLD= required in NULL() argument at %L: Ambiguity "
3923 			 "between specific functions %s and %s",
3924 			 &null_expr_loc, null_sym->name, intr->sym->name);
3925 	      return NULL;
3926 	    }
3927 	  else if (has_null_arg)
3928 	    {
3929 	      null_sym = intr->sym;
3930 	      continue;
3931 	    }
3932 
3933 	  /* Satisfy 12.4.4.1 such that an elemental match has lower
3934 	     weight than a non-elemental match.  */
3935 	  if (intr->sym->attr.elemental)
3936 	    {
3937 	      elem_sym = intr->sym;
3938 	      continue;
3939 	    }
3940 	  return intr->sym;
3941 	}
3942     }
3943 
3944   if (null_sym)
3945     return null_sym;
3946 
3947   return elem_sym ? elem_sym : NULL;
3948 }
3949 
3950 
3951 /* Do a brute force recursive search for a symbol.  */
3952 
3953 static gfc_symtree *
3954 find_symtree0 (gfc_symtree *root, gfc_symbol *sym)
3955 {
3956   gfc_symtree * st;
3957 
3958   if (root->n.sym == sym)
3959     return root;
3960 
3961   st = NULL;
3962   if (root->left)
3963     st = find_symtree0 (root->left, sym);
3964   if (root->right && ! st)
3965     st = find_symtree0 (root->right, sym);
3966   return st;
3967 }
3968 
3969 
3970 /* Find a symtree for a symbol.  */
3971 
3972 gfc_symtree *
3973 gfc_find_sym_in_symtree (gfc_symbol *sym)
3974 {
3975   gfc_symtree *st;
3976   gfc_namespace *ns;
3977 
3978   /* First try to find it by name.  */
3979   gfc_find_sym_tree (sym->name, gfc_current_ns, 1, &st);
3980   if (st && st->n.sym == sym)
3981     return st;
3982 
3983   /* If it's been renamed, resort to a brute-force search.  */
3984   /* TODO: avoid having to do this search.  If the symbol doesn't exist
3985      in the symtree for the current namespace, it should probably be added.  */
3986   for (ns = gfc_current_ns; ns; ns = ns->parent)
3987     {
3988       st = find_symtree0 (ns->sym_root, sym);
3989       if (st)
3990 	return st;
3991     }
3992   gfc_internal_error ("Unable to find symbol %qs", sym->name);
3993   /* Not reached.  */
3994 }
3995 
3996 
3997 /* See if the arglist to an operator-call contains a derived-type argument
3998    with a matching type-bound operator.  If so, return the matching specific
3999    procedure defined as operator-target as well as the base-object to use
4000    (which is the found derived-type argument with operator).  The generic
4001    name, if any, is transmitted to the final expression via 'gname'.  */
4002 
4003 static gfc_typebound_proc*
4004 matching_typebound_op (gfc_expr** tb_base,
4005 		       gfc_actual_arglist* args,
4006 		       gfc_intrinsic_op op, const char* uop,
4007 		       const char ** gname)
4008 {
4009   gfc_actual_arglist* base;
4010 
4011   for (base = args; base; base = base->next)
4012     if (base->expr->ts.type == BT_DERIVED || base->expr->ts.type == BT_CLASS)
4013       {
4014 	gfc_typebound_proc* tb;
4015 	gfc_symbol* derived;
4016 	bool result;
4017 
4018 	while (base->expr->expr_type == EXPR_OP
4019 	       && base->expr->value.op.op == INTRINSIC_PARENTHESES)
4020 	  base->expr = base->expr->value.op.op1;
4021 
4022 	if (base->expr->ts.type == BT_CLASS)
4023 	  {
4024 	    if (!base->expr->ts.u.derived || CLASS_DATA (base->expr) == NULL
4025 		|| !gfc_expr_attr (base->expr).class_ok)
4026 	      continue;
4027 	    derived = CLASS_DATA (base->expr)->ts.u.derived;
4028 	  }
4029 	else
4030 	  derived = base->expr->ts.u.derived;
4031 
4032 	if (op == INTRINSIC_USER)
4033 	  {
4034 	    gfc_symtree* tb_uop;
4035 
4036 	    gcc_assert (uop);
4037 	    tb_uop = gfc_find_typebound_user_op (derived, &result, uop,
4038 						 false, NULL);
4039 
4040 	    if (tb_uop)
4041 	      tb = tb_uop->n.tb;
4042 	    else
4043 	      tb = NULL;
4044 	  }
4045 	else
4046 	  tb = gfc_find_typebound_intrinsic_op (derived, &result, op,
4047 						false, NULL);
4048 
4049 	/* This means we hit a PRIVATE operator which is use-associated and
4050 	   should thus not be seen.  */
4051 	if (!result)
4052 	  tb = NULL;
4053 
4054 	/* Look through the super-type hierarchy for a matching specific
4055 	   binding.  */
4056 	for (; tb; tb = tb->overridden)
4057 	  {
4058 	    gfc_tbp_generic* g;
4059 
4060 	    gcc_assert (tb->is_generic);
4061 	    for (g = tb->u.generic; g; g = g->next)
4062 	      {
4063 		gfc_symbol* target;
4064 		gfc_actual_arglist* argcopy;
4065 		bool matches;
4066 
4067 		gcc_assert (g->specific);
4068 		if (g->specific->error)
4069 		  continue;
4070 
4071 		target = g->specific->u.specific->n.sym;
4072 
4073 		/* Check if this arglist matches the formal.  */
4074 		argcopy = gfc_copy_actual_arglist (args);
4075 		matches = gfc_arglist_matches_symbol (&argcopy, target);
4076 		gfc_free_actual_arglist (argcopy);
4077 
4078 		/* Return if we found a match.  */
4079 		if (matches)
4080 		  {
4081 		    *tb_base = base->expr;
4082 		    *gname = g->specific_st->name;
4083 		    return g->specific;
4084 		  }
4085 	      }
4086 	  }
4087       }
4088 
4089   return NULL;
4090 }
4091 
4092 
4093 /* For the 'actual arglist' of an operator call and a specific typebound
4094    procedure that has been found the target of a type-bound operator, build the
4095    appropriate EXPR_COMPCALL and resolve it.  We take this indirection over
4096    type-bound procedures rather than resolving type-bound operators 'directly'
4097    so that we can reuse the existing logic.  */
4098 
4099 static void
4100 build_compcall_for_operator (gfc_expr* e, gfc_actual_arglist* actual,
4101 			     gfc_expr* base, gfc_typebound_proc* target,
4102 			     const char *gname)
4103 {
4104   e->expr_type = EXPR_COMPCALL;
4105   e->value.compcall.tbp = target;
4106   e->value.compcall.name = gname ? gname : "$op";
4107   e->value.compcall.actual = actual;
4108   e->value.compcall.base_object = base;
4109   e->value.compcall.ignore_pass = 1;
4110   e->value.compcall.assign = 0;
4111   if (e->ts.type == BT_UNKNOWN
4112 	&& target->function)
4113     {
4114       if (target->is_generic)
4115 	e->ts = target->u.generic->specific->u.specific->n.sym->ts;
4116       else
4117 	e->ts = target->u.specific->n.sym->ts;
4118     }
4119 }
4120 
4121 
4122 /* This subroutine is called when an expression is being resolved.
4123    The expression node in question is either a user defined operator
4124    or an intrinsic operator with arguments that aren't compatible
4125    with the operator.  This subroutine builds an actual argument list
4126    corresponding to the operands, then searches for a compatible
4127    interface.  If one is found, the expression node is replaced with
4128    the appropriate function call. We use the 'match' enum to specify
4129    whether a replacement has been made or not, or if an error occurred.  */
4130 
4131 match
4132 gfc_extend_expr (gfc_expr *e)
4133 {
4134   gfc_actual_arglist *actual;
4135   gfc_symbol *sym;
4136   gfc_namespace *ns;
4137   gfc_user_op *uop;
4138   gfc_intrinsic_op i;
4139   const char *gname;
4140   gfc_typebound_proc* tbo;
4141   gfc_expr* tb_base;
4142 
4143   sym = NULL;
4144 
4145   actual = gfc_get_actual_arglist ();
4146   actual->expr = e->value.op.op1;
4147 
4148   gname = NULL;
4149 
4150   if (e->value.op.op2 != NULL)
4151     {
4152       actual->next = gfc_get_actual_arglist ();
4153       actual->next->expr = e->value.op.op2;
4154     }
4155 
4156   i = fold_unary_intrinsic (e->value.op.op);
4157 
4158   /* See if we find a matching type-bound operator.  */
4159   if (i == INTRINSIC_USER)
4160     tbo = matching_typebound_op (&tb_base, actual,
4161 				  i, e->value.op.uop->name, &gname);
4162   else
4163     switch (i)
4164       {
4165 #define CHECK_OS_COMPARISON(comp) \
4166   case INTRINSIC_##comp: \
4167   case INTRINSIC_##comp##_OS: \
4168     tbo = matching_typebound_op (&tb_base, actual, \
4169 				 INTRINSIC_##comp, NULL, &gname); \
4170     if (!tbo) \
4171       tbo = matching_typebound_op (&tb_base, actual, \
4172 				   INTRINSIC_##comp##_OS, NULL, &gname); \
4173     break;
4174 	CHECK_OS_COMPARISON(EQ)
4175 	CHECK_OS_COMPARISON(NE)
4176 	CHECK_OS_COMPARISON(GT)
4177 	CHECK_OS_COMPARISON(GE)
4178 	CHECK_OS_COMPARISON(LT)
4179 	CHECK_OS_COMPARISON(LE)
4180 #undef CHECK_OS_COMPARISON
4181 
4182 	default:
4183 	  tbo = matching_typebound_op (&tb_base, actual, i, NULL, &gname);
4184 	  break;
4185       }
4186 
4187   /* If there is a matching typebound-operator, replace the expression with
4188       a call to it and succeed.  */
4189   if (tbo)
4190     {
4191       gcc_assert (tb_base);
4192       build_compcall_for_operator (e, actual, tb_base, tbo, gname);
4193 
4194       if (!gfc_resolve_expr (e))
4195 	return MATCH_ERROR;
4196       else
4197 	return MATCH_YES;
4198     }
4199 
4200   if (i == INTRINSIC_USER)
4201     {
4202       for (ns = gfc_current_ns; ns; ns = ns->parent)
4203 	{
4204 	  uop = gfc_find_uop (e->value.op.uop->name, ns);
4205 	  if (uop == NULL)
4206 	    continue;
4207 
4208 	  sym = gfc_search_interface (uop->op, 0, &actual);
4209 	  if (sym != NULL)
4210 	    break;
4211 	}
4212     }
4213   else
4214     {
4215       for (ns = gfc_current_ns; ns; ns = ns->parent)
4216 	{
4217 	  /* Due to the distinction between '==' and '.eq.' and friends, one has
4218 	     to check if either is defined.  */
4219 	  switch (i)
4220 	    {
4221 #define CHECK_OS_COMPARISON(comp) \
4222   case INTRINSIC_##comp: \
4223   case INTRINSIC_##comp##_OS: \
4224     sym = gfc_search_interface (ns->op[INTRINSIC_##comp], 0, &actual); \
4225     if (!sym) \
4226       sym = gfc_search_interface (ns->op[INTRINSIC_##comp##_OS], 0, &actual); \
4227     break;
4228 	      CHECK_OS_COMPARISON(EQ)
4229 	      CHECK_OS_COMPARISON(NE)
4230 	      CHECK_OS_COMPARISON(GT)
4231 	      CHECK_OS_COMPARISON(GE)
4232 	      CHECK_OS_COMPARISON(LT)
4233 	      CHECK_OS_COMPARISON(LE)
4234 #undef CHECK_OS_COMPARISON
4235 
4236 	      default:
4237 		sym = gfc_search_interface (ns->op[i], 0, &actual);
4238 	    }
4239 
4240 	  if (sym != NULL)
4241 	    break;
4242 	}
4243     }
4244 
4245   /* TODO: Do an ambiguity-check and error if multiple matching interfaces are
4246      found rather than just taking the first one and not checking further.  */
4247 
4248   if (sym == NULL)
4249     {
4250       /* Don't use gfc_free_actual_arglist().  */
4251       free (actual->next);
4252       free (actual);
4253       return MATCH_NO;
4254     }
4255 
4256   /* Change the expression node to a function call.  */
4257   e->expr_type = EXPR_FUNCTION;
4258   e->symtree = gfc_find_sym_in_symtree (sym);
4259   e->value.function.actual = actual;
4260   e->value.function.esym = NULL;
4261   e->value.function.isym = NULL;
4262   e->value.function.name = NULL;
4263   e->user_operator = 1;
4264 
4265   if (!gfc_resolve_expr (e))
4266     return MATCH_ERROR;
4267 
4268   return MATCH_YES;
4269 }
4270 
4271 
4272 /* Tries to replace an assignment code node with a subroutine call to the
4273    subroutine associated with the assignment operator. Return true if the node
4274    was replaced. On false, no error is generated.  */
4275 
4276 bool
4277 gfc_extend_assign (gfc_code *c, gfc_namespace *ns)
4278 {
4279   gfc_actual_arglist *actual;
4280   gfc_expr *lhs, *rhs, *tb_base;
4281   gfc_symbol *sym = NULL;
4282   const char *gname = NULL;
4283   gfc_typebound_proc* tbo;
4284 
4285   lhs = c->expr1;
4286   rhs = c->expr2;
4287 
4288   /* Don't allow an intrinsic assignment to be replaced.  */
4289   if (lhs->ts.type != BT_DERIVED && lhs->ts.type != BT_CLASS
4290       && (rhs->rank == 0 || rhs->rank == lhs->rank)
4291       && (lhs->ts.type == rhs->ts.type
4292 	  || (gfc_numeric_ts (&lhs->ts) && gfc_numeric_ts (&rhs->ts))))
4293     return false;
4294 
4295   actual = gfc_get_actual_arglist ();
4296   actual->expr = lhs;
4297 
4298   actual->next = gfc_get_actual_arglist ();
4299   actual->next->expr = rhs;
4300 
4301   /* TODO: Ambiguity-check, see above for gfc_extend_expr.  */
4302 
4303   /* See if we find a matching type-bound assignment.  */
4304   tbo = matching_typebound_op (&tb_base, actual, INTRINSIC_ASSIGN,
4305 			       NULL, &gname);
4306 
4307   if (tbo)
4308     {
4309       /* Success: Replace the expression with a type-bound call.  */
4310       gcc_assert (tb_base);
4311       c->expr1 = gfc_get_expr ();
4312       build_compcall_for_operator (c->expr1, actual, tb_base, tbo, gname);
4313       c->expr1->value.compcall.assign = 1;
4314       c->expr1->where = c->loc;
4315       c->expr2 = NULL;
4316       c->op = EXEC_COMPCALL;
4317       return true;
4318     }
4319 
4320   /* See if we find an 'ordinary' (non-typebound) assignment procedure.  */
4321   for (; ns; ns = ns->parent)
4322     {
4323       sym = gfc_search_interface (ns->op[INTRINSIC_ASSIGN], 1, &actual);
4324       if (sym != NULL)
4325 	break;
4326     }
4327 
4328   if (sym)
4329     {
4330       /* Success: Replace the assignment with the call.  */
4331       c->op = EXEC_ASSIGN_CALL;
4332       c->symtree = gfc_find_sym_in_symtree (sym);
4333       c->expr1 = NULL;
4334       c->expr2 = NULL;
4335       c->ext.actual = actual;
4336       return true;
4337     }
4338 
4339   /* Failure: No assignment procedure found.  */
4340   free (actual->next);
4341   free (actual);
4342   return false;
4343 }
4344 
4345 
4346 /* Make sure that the interface just parsed is not already present in
4347    the given interface list.  Ambiguity isn't checked yet since module
4348    procedures can be present without interfaces.  */
4349 
4350 bool
4351 gfc_check_new_interface (gfc_interface *base, gfc_symbol *new_sym, locus loc)
4352 {
4353   gfc_interface *ip;
4354 
4355   for (ip = base; ip; ip = ip->next)
4356     {
4357       if (ip->sym == new_sym)
4358 	{
4359 	  gfc_error ("Entity %qs at %L is already present in the interface",
4360 		     new_sym->name, &loc);
4361 	  return false;
4362 	}
4363     }
4364 
4365   return true;
4366 }
4367 
4368 
4369 /* Add a symbol to the current interface.  */
4370 
4371 bool
4372 gfc_add_interface (gfc_symbol *new_sym)
4373 {
4374   gfc_interface **head, *intr;
4375   gfc_namespace *ns;
4376   gfc_symbol *sym;
4377 
4378   switch (current_interface.type)
4379     {
4380     case INTERFACE_NAMELESS:
4381     case INTERFACE_ABSTRACT:
4382       return true;
4383 
4384     case INTERFACE_INTRINSIC_OP:
4385       for (ns = current_interface.ns; ns; ns = ns->parent)
4386 	switch (current_interface.op)
4387 	  {
4388 	    case INTRINSIC_EQ:
4389 	    case INTRINSIC_EQ_OS:
4390 	      if (!gfc_check_new_interface (ns->op[INTRINSIC_EQ], new_sym,
4391 					    gfc_current_locus)
4392 	          || !gfc_check_new_interface (ns->op[INTRINSIC_EQ_OS],
4393 					       new_sym, gfc_current_locus))
4394 		return false;
4395 	      break;
4396 
4397 	    case INTRINSIC_NE:
4398 	    case INTRINSIC_NE_OS:
4399 	      if (!gfc_check_new_interface (ns->op[INTRINSIC_NE], new_sym,
4400 					    gfc_current_locus)
4401 	          || !gfc_check_new_interface (ns->op[INTRINSIC_NE_OS],
4402 					       new_sym, gfc_current_locus))
4403 		return false;
4404 	      break;
4405 
4406 	    case INTRINSIC_GT:
4407 	    case INTRINSIC_GT_OS:
4408 	      if (!gfc_check_new_interface (ns->op[INTRINSIC_GT],
4409 					    new_sym, gfc_current_locus)
4410 	          || !gfc_check_new_interface (ns->op[INTRINSIC_GT_OS],
4411 					       new_sym, gfc_current_locus))
4412 		return false;
4413 	      break;
4414 
4415 	    case INTRINSIC_GE:
4416 	    case INTRINSIC_GE_OS:
4417 	      if (!gfc_check_new_interface (ns->op[INTRINSIC_GE],
4418 					    new_sym, gfc_current_locus)
4419 	          || !gfc_check_new_interface (ns->op[INTRINSIC_GE_OS],
4420 					       new_sym, gfc_current_locus))
4421 		return false;
4422 	      break;
4423 
4424 	    case INTRINSIC_LT:
4425 	    case INTRINSIC_LT_OS:
4426 	      if (!gfc_check_new_interface (ns->op[INTRINSIC_LT],
4427 					    new_sym, gfc_current_locus)
4428 	          || !gfc_check_new_interface (ns->op[INTRINSIC_LT_OS],
4429 					       new_sym, gfc_current_locus))
4430 		return false;
4431 	      break;
4432 
4433 	    case INTRINSIC_LE:
4434 	    case INTRINSIC_LE_OS:
4435 	      if (!gfc_check_new_interface (ns->op[INTRINSIC_LE],
4436 					    new_sym, gfc_current_locus)
4437 	          || !gfc_check_new_interface (ns->op[INTRINSIC_LE_OS],
4438 					       new_sym, gfc_current_locus))
4439 		return false;
4440 	      break;
4441 
4442 	    default:
4443 	      if (!gfc_check_new_interface (ns->op[current_interface.op],
4444 					    new_sym, gfc_current_locus))
4445 		return false;
4446 	  }
4447 
4448       head = &current_interface.ns->op[current_interface.op];
4449       break;
4450 
4451     case INTERFACE_GENERIC:
4452     case INTERFACE_DTIO:
4453       for (ns = current_interface.ns; ns; ns = ns->parent)
4454 	{
4455 	  gfc_find_symbol (current_interface.sym->name, ns, 0, &sym);
4456 	  if (sym == NULL)
4457 	    continue;
4458 
4459 	  if (!gfc_check_new_interface (sym->generic,
4460 					new_sym, gfc_current_locus))
4461 	    return false;
4462 	}
4463 
4464       head = &current_interface.sym->generic;
4465       break;
4466 
4467     case INTERFACE_USER_OP:
4468       if (!gfc_check_new_interface (current_interface.uop->op,
4469 				    new_sym, gfc_current_locus))
4470 	return false;
4471 
4472       head = &current_interface.uop->op;
4473       break;
4474 
4475     default:
4476       gfc_internal_error ("gfc_add_interface(): Bad interface type");
4477     }
4478 
4479   intr = gfc_get_interface ();
4480   intr->sym = new_sym;
4481   intr->where = gfc_current_locus;
4482 
4483   intr->next = *head;
4484   *head = intr;
4485 
4486   return true;
4487 }
4488 
4489 
4490 gfc_interface *
4491 gfc_current_interface_head (void)
4492 {
4493   switch (current_interface.type)
4494     {
4495       case INTERFACE_INTRINSIC_OP:
4496 	return current_interface.ns->op[current_interface.op];
4497 
4498       case INTERFACE_GENERIC:
4499       case INTERFACE_DTIO:
4500 	return current_interface.sym->generic;
4501 
4502       case INTERFACE_USER_OP:
4503 	return current_interface.uop->op;
4504 
4505       default:
4506 	gcc_unreachable ();
4507     }
4508 }
4509 
4510 
4511 void
4512 gfc_set_current_interface_head (gfc_interface *i)
4513 {
4514   switch (current_interface.type)
4515     {
4516       case INTERFACE_INTRINSIC_OP:
4517 	current_interface.ns->op[current_interface.op] = i;
4518 	break;
4519 
4520       case INTERFACE_GENERIC:
4521       case INTERFACE_DTIO:
4522 	current_interface.sym->generic = i;
4523 	break;
4524 
4525       case INTERFACE_USER_OP:
4526 	current_interface.uop->op = i;
4527 	break;
4528 
4529       default:
4530 	gcc_unreachable ();
4531     }
4532 }
4533 
4534 
4535 /* Gets rid of a formal argument list.  We do not free symbols.
4536    Symbols are freed when a namespace is freed.  */
4537 
4538 void
4539 gfc_free_formal_arglist (gfc_formal_arglist *p)
4540 {
4541   gfc_formal_arglist *q;
4542 
4543   for (; p; p = q)
4544     {
4545       q = p->next;
4546       free (p);
4547     }
4548 }
4549 
4550 
4551 /* Check that it is ok for the type-bound procedure 'proc' to override the
4552    procedure 'old', cf. F08:4.5.7.3.  */
4553 
4554 bool
4555 gfc_check_typebound_override (gfc_symtree* proc, gfc_symtree* old)
4556 {
4557   locus where;
4558   gfc_symbol *proc_target, *old_target;
4559   unsigned proc_pass_arg, old_pass_arg, argpos;
4560   gfc_formal_arglist *proc_formal, *old_formal;
4561   bool check_type;
4562   char err[200];
4563 
4564   /* This procedure should only be called for non-GENERIC proc.  */
4565   gcc_assert (!proc->n.tb->is_generic);
4566 
4567   /* If the overwritten procedure is GENERIC, this is an error.  */
4568   if (old->n.tb->is_generic)
4569     {
4570       gfc_error ("Cannot overwrite GENERIC %qs at %L",
4571 		 old->name, &proc->n.tb->where);
4572       return false;
4573     }
4574 
4575   where = proc->n.tb->where;
4576   proc_target = proc->n.tb->u.specific->n.sym;
4577   old_target = old->n.tb->u.specific->n.sym;
4578 
4579   /* Check that overridden binding is not NON_OVERRIDABLE.  */
4580   if (old->n.tb->non_overridable)
4581     {
4582       gfc_error ("%qs at %L overrides a procedure binding declared"
4583 		 " NON_OVERRIDABLE", proc->name, &where);
4584       return false;
4585     }
4586 
4587   /* It's an error to override a non-DEFERRED procedure with a DEFERRED one.  */
4588   if (!old->n.tb->deferred && proc->n.tb->deferred)
4589     {
4590       gfc_error ("%qs at %L must not be DEFERRED as it overrides a"
4591 		 " non-DEFERRED binding", proc->name, &where);
4592       return false;
4593     }
4594 
4595   /* If the overridden binding is PURE, the overriding must be, too.  */
4596   if (old_target->attr.pure && !proc_target->attr.pure)
4597     {
4598       gfc_error ("%qs at %L overrides a PURE procedure and must also be PURE",
4599 		 proc->name, &where);
4600       return false;
4601     }
4602 
4603   /* If the overridden binding is ELEMENTAL, the overriding must be, too.  If it
4604      is not, the overriding must not be either.  */
4605   if (old_target->attr.elemental && !proc_target->attr.elemental)
4606     {
4607       gfc_error ("%qs at %L overrides an ELEMENTAL procedure and must also be"
4608 		 " ELEMENTAL", proc->name, &where);
4609       return false;
4610     }
4611   if (!old_target->attr.elemental && proc_target->attr.elemental)
4612     {
4613       gfc_error ("%qs at %L overrides a non-ELEMENTAL procedure and must not"
4614 		 " be ELEMENTAL, either", proc->name, &where);
4615       return false;
4616     }
4617 
4618   /* If the overridden binding is a SUBROUTINE, the overriding must also be a
4619      SUBROUTINE.  */
4620   if (old_target->attr.subroutine && !proc_target->attr.subroutine)
4621     {
4622       gfc_error ("%qs at %L overrides a SUBROUTINE and must also be a"
4623 		 " SUBROUTINE", proc->name, &where);
4624       return false;
4625     }
4626 
4627   /* If the overridden binding is a FUNCTION, the overriding must also be a
4628      FUNCTION and have the same characteristics.  */
4629   if (old_target->attr.function)
4630     {
4631       if (!proc_target->attr.function)
4632 	{
4633 	  gfc_error ("%qs at %L overrides a FUNCTION and must also be a"
4634 		     " FUNCTION", proc->name, &where);
4635 	  return false;
4636 	}
4637 
4638       if (!gfc_check_result_characteristics (proc_target, old_target,
4639 					     err, sizeof(err)))
4640 	{
4641 	  gfc_error ("Result mismatch for the overriding procedure "
4642 		     "%qs at %L: %s", proc->name, &where, err);
4643 	  return false;
4644 	}
4645     }
4646 
4647   /* If the overridden binding is PUBLIC, the overriding one must not be
4648      PRIVATE.  */
4649   if (old->n.tb->access == ACCESS_PUBLIC
4650       && proc->n.tb->access == ACCESS_PRIVATE)
4651     {
4652       gfc_error ("%qs at %L overrides a PUBLIC procedure and must not be"
4653 		 " PRIVATE", proc->name, &where);
4654       return false;
4655     }
4656 
4657   /* Compare the formal argument lists of both procedures.  This is also abused
4658      to find the position of the passed-object dummy arguments of both
4659      bindings as at least the overridden one might not yet be resolved and we
4660      need those positions in the check below.  */
4661   proc_pass_arg = old_pass_arg = 0;
4662   if (!proc->n.tb->nopass && !proc->n.tb->pass_arg)
4663     proc_pass_arg = 1;
4664   if (!old->n.tb->nopass && !old->n.tb->pass_arg)
4665     old_pass_arg = 1;
4666   argpos = 1;
4667   proc_formal = gfc_sym_get_dummy_args (proc_target);
4668   old_formal = gfc_sym_get_dummy_args (old_target);
4669   for ( ; proc_formal && old_formal;
4670        proc_formal = proc_formal->next, old_formal = old_formal->next)
4671     {
4672       if (proc->n.tb->pass_arg
4673 	  && !strcmp (proc->n.tb->pass_arg, proc_formal->sym->name))
4674 	proc_pass_arg = argpos;
4675       if (old->n.tb->pass_arg
4676 	  && !strcmp (old->n.tb->pass_arg, old_formal->sym->name))
4677 	old_pass_arg = argpos;
4678 
4679       /* Check that the names correspond.  */
4680       if (strcmp (proc_formal->sym->name, old_formal->sym->name))
4681 	{
4682 	  gfc_error ("Dummy argument %qs of %qs at %L should be named %qs as"
4683 		     " to match the corresponding argument of the overridden"
4684 		     " procedure", proc_formal->sym->name, proc->name, &where,
4685 		     old_formal->sym->name);
4686 	  return false;
4687 	}
4688 
4689       check_type = proc_pass_arg != argpos && old_pass_arg != argpos;
4690       if (!gfc_check_dummy_characteristics (proc_formal->sym, old_formal->sym,
4691 					check_type, err, sizeof(err)))
4692 	{
4693 	  gfc_error_opt (OPT_Wargument_mismatch,
4694 			 "Argument mismatch for the overriding procedure "
4695 			 "%qs at %L: %s", proc->name, &where, err);
4696 	  return false;
4697 	}
4698 
4699       ++argpos;
4700     }
4701   if (proc_formal || old_formal)
4702     {
4703       gfc_error ("%qs at %L must have the same number of formal arguments as"
4704 		 " the overridden procedure", proc->name, &where);
4705       return false;
4706     }
4707 
4708   /* If the overridden binding is NOPASS, the overriding one must also be
4709      NOPASS.  */
4710   if (old->n.tb->nopass && !proc->n.tb->nopass)
4711     {
4712       gfc_error ("%qs at %L overrides a NOPASS binding and must also be"
4713 		 " NOPASS", proc->name, &where);
4714       return false;
4715     }
4716 
4717   /* If the overridden binding is PASS(x), the overriding one must also be
4718      PASS and the passed-object dummy arguments must correspond.  */
4719   if (!old->n.tb->nopass)
4720     {
4721       if (proc->n.tb->nopass)
4722 	{
4723 	  gfc_error ("%qs at %L overrides a binding with PASS and must also be"
4724 		     " PASS", proc->name, &where);
4725 	  return false;
4726 	}
4727 
4728       if (proc_pass_arg != old_pass_arg)
4729 	{
4730 	  gfc_error ("Passed-object dummy argument of %qs at %L must be at"
4731 		     " the same position as the passed-object dummy argument of"
4732 		     " the overridden procedure", proc->name, &where);
4733 	  return false;
4734 	}
4735     }
4736 
4737   return true;
4738 }
4739 
4740 
4741 /* The following three functions check that the formal arguments
4742    of user defined derived type IO procedures are compliant with
4743    the requirements of the standard, see F03:9.5.3.7.2 (F08:9.6.4.8.3).  */
4744 
4745 static void
4746 check_dtio_arg_TKR_intent (gfc_symbol *fsym, bool typebound, bt type,
4747 			   int kind, int rank, sym_intent intent)
4748 {
4749   if (fsym->ts.type != type)
4750     {
4751       gfc_error ("DTIO dummy argument at %L must be of type %s",
4752 		 &fsym->declared_at, gfc_basic_typename (type));
4753       return;
4754     }
4755 
4756   if (fsym->ts.type != BT_CLASS && fsym->ts.type != BT_DERIVED
4757       && fsym->ts.kind != kind)
4758     gfc_error ("DTIO dummy argument at %L must be of KIND = %d",
4759 	       &fsym->declared_at, kind);
4760 
4761   if (!typebound
4762       && rank == 0
4763       && (((type == BT_CLASS) && CLASS_DATA (fsym)->attr.dimension)
4764 	  || ((type != BT_CLASS) && fsym->attr.dimension)))
4765     gfc_error ("DTIO dummy argument at %L must be a scalar",
4766 	       &fsym->declared_at);
4767   else if (rank == 1
4768 	   && (fsym->as == NULL || fsym->as->type != AS_ASSUMED_SHAPE))
4769     gfc_error ("DTIO dummy argument at %L must be an "
4770 	       "ASSUMED SHAPE ARRAY", &fsym->declared_at);
4771 
4772   if (type == BT_CHARACTER && fsym->ts.u.cl->length != NULL)
4773     gfc_error ("DTIO character argument at %L must have assumed length",
4774                &fsym->declared_at);
4775 
4776   if (fsym->attr.intent != intent)
4777     gfc_error ("DTIO dummy argument at %L must have INTENT %s",
4778 	       &fsym->declared_at, gfc_code2string (intents, (int)intent));
4779   return;
4780 }
4781 
4782 
4783 static void
4784 check_dtio_interface1 (gfc_symbol *derived, gfc_symtree *tb_io_st,
4785 		       bool typebound, bool formatted, int code)
4786 {
4787   gfc_symbol *dtio_sub, *generic_proc, *fsym;
4788   gfc_typebound_proc *tb_io_proc, *specific_proc;
4789   gfc_interface *intr;
4790   gfc_formal_arglist *formal;
4791   int arg_num;
4792 
4793   bool read = ((dtio_codes)code == DTIO_RF)
4794 	       || ((dtio_codes)code == DTIO_RUF);
4795   bt type;
4796   sym_intent intent;
4797   int kind;
4798 
4799   dtio_sub = NULL;
4800   if (typebound)
4801     {
4802       /* Typebound DTIO binding.  */
4803       tb_io_proc = tb_io_st->n.tb;
4804       if (tb_io_proc == NULL)
4805 	return;
4806 
4807       gcc_assert (tb_io_proc->is_generic);
4808 
4809       specific_proc = tb_io_proc->u.generic->specific;
4810       if (specific_proc == NULL || specific_proc->is_generic)
4811 	return;
4812 
4813       dtio_sub = specific_proc->u.specific->n.sym;
4814     }
4815   else
4816     {
4817       generic_proc = tb_io_st->n.sym;
4818       if (generic_proc == NULL || generic_proc->generic == NULL)
4819 	return;
4820 
4821       for (intr = tb_io_st->n.sym->generic; intr; intr = intr->next)
4822 	{
4823 	  if (intr->sym && intr->sym->formal && intr->sym->formal->sym
4824 	      && ((intr->sym->formal->sym->ts.type == BT_CLASS
4825 	           && CLASS_DATA (intr->sym->formal->sym)->ts.u.derived
4826 							     == derived)
4827 		  || (intr->sym->formal->sym->ts.type == BT_DERIVED
4828 		      && intr->sym->formal->sym->ts.u.derived == derived)))
4829 	    {
4830 	      dtio_sub = intr->sym;
4831 	      break;
4832 	    }
4833 	  else if (intr->sym && intr->sym->formal && !intr->sym->formal->sym)
4834 	    {
4835 	      gfc_error ("Alternate return at %L is not permitted in a DTIO "
4836 			 "procedure", &intr->sym->declared_at);
4837 	      return;
4838 	    }
4839 	}
4840 
4841       if (dtio_sub == NULL)
4842 	return;
4843     }
4844 
4845   gcc_assert (dtio_sub);
4846   if (!dtio_sub->attr.subroutine)
4847     gfc_error ("DTIO procedure %qs at %L must be a subroutine",
4848 	       dtio_sub->name, &dtio_sub->declared_at);
4849 
4850   arg_num = 0;
4851   for (formal = dtio_sub->formal; formal; formal = formal->next)
4852     arg_num++;
4853 
4854   if (arg_num < (formatted ? 6 : 4))
4855     {
4856       gfc_error ("Too few dummy arguments in DTIO procedure %qs at %L",
4857 		 dtio_sub->name, &dtio_sub->declared_at);
4858       return;
4859     }
4860 
4861   if (arg_num > (formatted ? 6 : 4))
4862     {
4863       gfc_error ("Too many dummy arguments in DTIO procedure %qs at %L",
4864 		 dtio_sub->name, &dtio_sub->declared_at);
4865       return;
4866     }
4867 
4868 
4869   /* Now go through the formal arglist.  */
4870   arg_num = 1;
4871   for (formal = dtio_sub->formal; formal; formal = formal->next, arg_num++)
4872     {
4873       if (!formatted && arg_num == 3)
4874 	arg_num = 5;
4875       fsym = formal->sym;
4876 
4877       if (fsym == NULL)
4878 	{
4879 	  gfc_error ("Alternate return at %L is not permitted in a DTIO "
4880 		     "procedure", &dtio_sub->declared_at);
4881 	  return;
4882 	}
4883 
4884       switch (arg_num)
4885 	{
4886 	case(1):			/* DTV  */
4887 	  type = derived->attr.sequence || derived->attr.is_bind_c ?
4888 		 BT_DERIVED : BT_CLASS;
4889 	  kind = 0;
4890 	  intent = read ? INTENT_INOUT : INTENT_IN;
4891 	  check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
4892 				     0, intent);
4893 	  break;
4894 
4895 	case(2):			/* UNIT  */
4896 	  type = BT_INTEGER;
4897 	  kind = gfc_default_integer_kind;
4898 	  intent = INTENT_IN;
4899 	  check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
4900 				     0, intent);
4901 	  break;
4902 	case(3):			/* IOTYPE  */
4903 	  type = BT_CHARACTER;
4904 	  kind = gfc_default_character_kind;
4905 	  intent = INTENT_IN;
4906 	  check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
4907 				     0, intent);
4908 	  break;
4909 	case(4):			/* VLIST  */
4910 	  type = BT_INTEGER;
4911 	  kind = gfc_default_integer_kind;
4912 	  intent = INTENT_IN;
4913 	  check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
4914 				     1, intent);
4915 	  break;
4916 	case(5):			/* IOSTAT  */
4917 	  type = BT_INTEGER;
4918 	  kind = gfc_default_integer_kind;
4919 	  intent = INTENT_OUT;
4920 	  check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
4921 				     0, intent);
4922 	  break;
4923 	case(6):			/* IOMSG  */
4924 	  type = BT_CHARACTER;
4925 	  kind = gfc_default_character_kind;
4926 	  intent = INTENT_INOUT;
4927 	  check_dtio_arg_TKR_intent (fsym, typebound, type, kind,
4928 				     0, intent);
4929 	  break;
4930 	default:
4931 	  gcc_unreachable ();
4932 	}
4933     }
4934   derived->attr.has_dtio_procs = 1;
4935   return;
4936 }
4937 
4938 void
4939 gfc_check_dtio_interfaces (gfc_symbol *derived)
4940 {
4941   gfc_symtree *tb_io_st;
4942   bool t = false;
4943   int code;
4944   bool formatted;
4945 
4946   if (derived->attr.is_class == 1 || derived->attr.vtype == 1)
4947     return;
4948 
4949   /* Check typebound DTIO bindings.  */
4950   for (code = 0; code < 4; code++)
4951     {
4952       formatted = ((dtio_codes)code == DTIO_RF)
4953 		   || ((dtio_codes)code == DTIO_WF);
4954 
4955       tb_io_st = gfc_find_typebound_proc (derived, &t,
4956 					  gfc_code2string (dtio_procs, code),
4957 					  true, &derived->declared_at);
4958       if (tb_io_st != NULL)
4959 	check_dtio_interface1 (derived, tb_io_st, true, formatted, code);
4960     }
4961 
4962   /* Check generic DTIO interfaces.  */
4963   for (code = 0; code < 4; code++)
4964     {
4965       formatted = ((dtio_codes)code == DTIO_RF)
4966 		   || ((dtio_codes)code == DTIO_WF);
4967 
4968       tb_io_st = gfc_find_symtree (derived->ns->sym_root,
4969 				   gfc_code2string (dtio_procs, code));
4970       if (tb_io_st != NULL)
4971 	check_dtio_interface1 (derived, tb_io_st, false, formatted, code);
4972     }
4973 }
4974 
4975 
4976 gfc_symtree*
4977 gfc_find_typebound_dtio_proc (gfc_symbol *derived, bool write, bool formatted)
4978 {
4979   gfc_symtree *tb_io_st = NULL;
4980   bool t = false;
4981 
4982   if (!derived || !derived->resolved || derived->attr.flavor != FL_DERIVED)
4983     return NULL;
4984 
4985   /* Try to find a typebound DTIO binding.  */
4986   if (formatted == true)
4987     {
4988       if (write == true)
4989         tb_io_st = gfc_find_typebound_proc (derived, &t,
4990 					    gfc_code2string (dtio_procs,
4991 							     DTIO_WF),
4992 					    true,
4993 					    &derived->declared_at);
4994       else
4995         tb_io_st = gfc_find_typebound_proc (derived, &t,
4996 					    gfc_code2string (dtio_procs,
4997 							     DTIO_RF),
4998 					    true,
4999 					    &derived->declared_at);
5000     }
5001   else
5002     {
5003       if (write == true)
5004         tb_io_st = gfc_find_typebound_proc (derived, &t,
5005 					    gfc_code2string (dtio_procs,
5006 							     DTIO_WUF),
5007 					    true,
5008 					    &derived->declared_at);
5009       else
5010         tb_io_st = gfc_find_typebound_proc (derived, &t,
5011 					    gfc_code2string (dtio_procs,
5012 							     DTIO_RUF),
5013 					    true,
5014 					    &derived->declared_at);
5015     }
5016   return tb_io_st;
5017 }
5018 
5019 
5020 gfc_symbol *
5021 gfc_find_specific_dtio_proc (gfc_symbol *derived, bool write, bool formatted)
5022 {
5023   gfc_symtree *tb_io_st = NULL;
5024   gfc_symbol *dtio_sub = NULL;
5025   gfc_symbol *extended;
5026   gfc_typebound_proc *tb_io_proc, *specific_proc;
5027 
5028   tb_io_st = gfc_find_typebound_dtio_proc (derived, write, formatted);
5029 
5030   if (tb_io_st != NULL)
5031     {
5032       const char *genname;
5033       gfc_symtree *st;
5034 
5035       tb_io_proc = tb_io_st->n.tb;
5036       gcc_assert (tb_io_proc != NULL);
5037       gcc_assert (tb_io_proc->is_generic);
5038       gcc_assert (tb_io_proc->u.generic->next == NULL);
5039 
5040       specific_proc = tb_io_proc->u.generic->specific;
5041       gcc_assert (!specific_proc->is_generic);
5042 
5043       /* Go back and make sure that we have the right specific procedure.
5044 	 Here we most likely have a procedure from the parent type, which
5045 	 can be overridden in extensions.  */
5046       genname = tb_io_proc->u.generic->specific_st->name;
5047       st = gfc_find_typebound_proc (derived, NULL, genname,
5048 				    true, &tb_io_proc->where);
5049       if (st)
5050 	dtio_sub = st->n.tb->u.specific->n.sym;
5051       else
5052 	dtio_sub = specific_proc->u.specific->n.sym;
5053 
5054       goto finish;
5055     }
5056 
5057   /* If there is not a typebound binding, look for a generic
5058      DTIO interface.  */
5059   for (extended = derived; extended;
5060        extended = gfc_get_derived_super_type (extended))
5061     {
5062       if (extended == NULL || extended->ns == NULL
5063 	  || extended->attr.flavor == FL_UNKNOWN)
5064 	return NULL;
5065 
5066       if (formatted == true)
5067 	{
5068 	  if (write == true)
5069 	    tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5070 					 gfc_code2string (dtio_procs,
5071 							  DTIO_WF));
5072 	  else
5073 	    tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5074 					 gfc_code2string (dtio_procs,
5075 							  DTIO_RF));
5076 	}
5077       else
5078 	{
5079 	  if (write == true)
5080 	    tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5081 					 gfc_code2string (dtio_procs,
5082 							  DTIO_WUF));
5083 	  else
5084 	    tb_io_st = gfc_find_symtree (extended->ns->sym_root,
5085 					 gfc_code2string (dtio_procs,
5086 							  DTIO_RUF));
5087 	}
5088 
5089       if (tb_io_st != NULL
5090 	  && tb_io_st->n.sym
5091 	  && tb_io_st->n.sym->generic)
5092 	{
5093 	  for (gfc_interface *intr = tb_io_st->n.sym->generic;
5094 	       intr && intr->sym; intr = intr->next)
5095 	    {
5096 	      if (intr->sym->formal)
5097 		{
5098 		  gfc_symbol *fsym = intr->sym->formal->sym;
5099 		  if ((fsym->ts.type == BT_CLASS
5100 		      && CLASS_DATA (fsym)->ts.u.derived == extended)
5101 		      || (fsym->ts.type == BT_DERIVED
5102 			  && fsym->ts.u.derived == extended))
5103 		    {
5104 		      dtio_sub = intr->sym;
5105 		      break;
5106 		    }
5107 		}
5108 	    }
5109 	}
5110     }
5111 
5112 finish:
5113   if (dtio_sub && derived != CLASS_DATA (dtio_sub->formal->sym)->ts.u.derived)
5114     gfc_find_derived_vtab (derived);
5115 
5116   return dtio_sub;
5117 }
5118