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