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