re PR fortran/58099 ([F03] over-zealous procedure-pointer error checking)
[platform/upstream/gcc.git] / gcc / fortran / interface.c
1 /* Deal with interfaces.
2    Copyright (C) 2000-2013 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 "gfortran.h"
70 #include "match.h"
71 #include "arith.h"
72
73 /* The current_interface structure holds information about the
74    interface currently being parsed.  This structure is saved and
75    restored during recursive interfaces.  */
76
77 gfc_interface_info current_interface;
78
79
80 /* Free a singly linked list of gfc_interface structures.  */
81
82 void
83 gfc_free_interface (gfc_interface *intr)
84 {
85   gfc_interface *next;
86
87   for (; intr; intr = next)
88     {
89       next = intr->next;
90       free (intr);
91     }
92 }
93
94
95 /* Change the operators unary plus and minus into binary plus and
96    minus respectively, leaving the rest unchanged.  */
97
98 static gfc_intrinsic_op
99 fold_unary_intrinsic (gfc_intrinsic_op op)
100 {
101   switch (op)
102     {
103     case INTRINSIC_UPLUS:
104       op = INTRINSIC_PLUS;
105       break;
106     case INTRINSIC_UMINUS:
107       op = INTRINSIC_MINUS;
108       break;
109     default:
110       break;
111     }
112
113   return op;
114 }
115
116
117 /* Match a generic specification.  Depending on which type of
118    interface is found, the 'name' or 'op' pointers may be set.
119    This subroutine doesn't return MATCH_NO.  */
120
121 match
122 gfc_match_generic_spec (interface_type *type,
123                         char *name,
124                         gfc_intrinsic_op *op)
125 {
126   char buffer[GFC_MAX_SYMBOL_LEN + 1];
127   match m;
128   gfc_intrinsic_op i;
129
130   if (gfc_match (" assignment ( = )") == MATCH_YES)
131     {
132       *type = INTERFACE_INTRINSIC_OP;
133       *op = INTRINSIC_ASSIGN;
134       return MATCH_YES;
135     }
136
137   if (gfc_match (" operator ( %o )", &i) == MATCH_YES)
138     {                           /* Operator i/f */
139       *type = INTERFACE_INTRINSIC_OP;
140       *op = fold_unary_intrinsic (i);
141       return MATCH_YES;
142     }
143
144   *op = INTRINSIC_NONE;
145   if (gfc_match (" operator ( ") == MATCH_YES)
146     {
147       m = gfc_match_defined_op_name (buffer, 1);
148       if (m == MATCH_NO)
149         goto syntax;
150       if (m != MATCH_YES)
151         return MATCH_ERROR;
152
153       m = gfc_match_char (')');
154       if (m == MATCH_NO)
155         goto syntax;
156       if (m != MATCH_YES)
157         return MATCH_ERROR;
158
159       strcpy (name, buffer);
160       *type = INTERFACE_USER_OP;
161       return MATCH_YES;
162     }
163
164   if (gfc_match_name (buffer) == MATCH_YES)
165     {
166       strcpy (name, buffer);
167       *type = INTERFACE_GENERIC;
168       return MATCH_YES;
169     }
170
171   *type = INTERFACE_NAMELESS;
172   return MATCH_YES;
173
174 syntax:
175   gfc_error ("Syntax error in generic specification at %C");
176   return MATCH_ERROR;
177 }
178
179
180 /* Match one of the five F95 forms of an interface statement.  The
181    matcher for the abstract interface follows.  */
182
183 match
184 gfc_match_interface (void)
185 {
186   char name[GFC_MAX_SYMBOL_LEN + 1];
187   interface_type type;
188   gfc_symbol *sym;
189   gfc_intrinsic_op op;
190   match m;
191
192   m = gfc_match_space ();
193
194   if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
195     return MATCH_ERROR;
196
197   /* If we're not looking at the end of the statement now, or if this
198      is not a nameless interface but we did not see a space, punt.  */
199   if (gfc_match_eos () != MATCH_YES
200       || (type != INTERFACE_NAMELESS && m != MATCH_YES))
201     {
202       gfc_error ("Syntax error: Trailing garbage in INTERFACE statement "
203                  "at %C");
204       return MATCH_ERROR;
205     }
206
207   current_interface.type = type;
208
209   switch (type)
210     {
211     case INTERFACE_GENERIC:
212       if (gfc_get_symbol (name, NULL, &sym))
213         return MATCH_ERROR;
214
215       if (!sym->attr.generic
216           && !gfc_add_generic (&sym->attr, sym->name, NULL))
217         return MATCH_ERROR;
218
219       if (sym->attr.dummy)
220         {
221           gfc_error ("Dummy procedure '%s' at %C cannot have a "
222                      "generic interface", sym->name);
223           return MATCH_ERROR;
224         }
225
226       current_interface.sym = gfc_new_block = sym;
227       break;
228
229     case INTERFACE_USER_OP:
230       current_interface.uop = gfc_get_uop (name);
231       break;
232
233     case INTERFACE_INTRINSIC_OP:
234       current_interface.op = op;
235       break;
236
237     case INTERFACE_NAMELESS:
238     case INTERFACE_ABSTRACT:
239       break;
240     }
241
242   return MATCH_YES;
243 }
244
245
246
247 /* Match a F2003 abstract interface.  */
248
249 match
250 gfc_match_abstract_interface (void)
251 {
252   match m;
253
254   if (!gfc_notify_std (GFC_STD_F2003, "ABSTRACT INTERFACE at %C"))
255     return MATCH_ERROR;
256
257   m = gfc_match_eos ();
258
259   if (m != MATCH_YES)
260     {
261       gfc_error ("Syntax error in ABSTRACT INTERFACE statement at %C");
262       return MATCH_ERROR;
263     }
264
265   current_interface.type = INTERFACE_ABSTRACT;
266
267   return m;
268 }
269
270
271 /* Match the different sort of generic-specs that can be present after
272    the END INTERFACE itself.  */
273
274 match
275 gfc_match_end_interface (void)
276 {
277   char name[GFC_MAX_SYMBOL_LEN + 1];
278   interface_type type;
279   gfc_intrinsic_op op;
280   match m;
281
282   m = gfc_match_space ();
283
284   if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
285     return MATCH_ERROR;
286
287   /* If we're not looking at the end of the statement now, or if this
288      is not a nameless interface but we did not see a space, punt.  */
289   if (gfc_match_eos () != MATCH_YES
290       || (type != INTERFACE_NAMELESS && m != MATCH_YES))
291     {
292       gfc_error ("Syntax error: Trailing garbage in END INTERFACE "
293                  "statement at %C");
294       return MATCH_ERROR;
295     }
296
297   m = MATCH_YES;
298
299   switch (current_interface.type)
300     {
301     case INTERFACE_NAMELESS:
302     case INTERFACE_ABSTRACT:
303       if (type != INTERFACE_NAMELESS)
304         {
305           gfc_error ("Expected a nameless interface at %C");
306           m = MATCH_ERROR;
307         }
308
309       break;
310
311     case INTERFACE_INTRINSIC_OP:
312       if (type != current_interface.type || op != current_interface.op)
313         {
314
315           if (current_interface.op == INTRINSIC_ASSIGN)
316             {
317               m = MATCH_ERROR;
318               gfc_error ("Expected 'END INTERFACE ASSIGNMENT (=)' at %C");
319             }
320           else
321             {
322               const char *s1, *s2;
323               s1 = gfc_op2string (current_interface.op);
324               s2 = gfc_op2string (op);
325
326               /* The following if-statements are used to enforce C1202
327                  from F2003.  */
328               if ((strcmp(s1, "==") == 0 && strcmp (s2, ".eq.") == 0)
329                   || (strcmp(s1, ".eq.") == 0 && strcmp (s2, "==") == 0))
330                 break;
331               if ((strcmp(s1, "/=") == 0 && strcmp (s2, ".ne.") == 0)
332                   || (strcmp(s1, ".ne.") == 0 && strcmp (s2, "/=") == 0))
333                 break;
334               if ((strcmp(s1, "<=") == 0 && strcmp (s2, ".le.") == 0)
335                   || (strcmp(s1, ".le.") == 0 && strcmp (s2, "<=") == 0))
336                 break;
337               if ((strcmp(s1, "<") == 0 && strcmp (s2, ".lt.") == 0)
338                   || (strcmp(s1, ".lt.") == 0 && strcmp (s2, "<") == 0))
339                 break;
340               if ((strcmp(s1, ">=") == 0 && strcmp (s2, ".ge.") == 0)
341                   || (strcmp(s1, ".ge.") == 0 && strcmp (s2, ">=") == 0))
342                 break;
343               if ((strcmp(s1, ">") == 0 && strcmp (s2, ".gt.") == 0)
344                   || (strcmp(s1, ".gt.") == 0 && strcmp (s2, ">") == 0))
345                 break;
346
347               m = MATCH_ERROR;
348               gfc_error ("Expecting 'END INTERFACE OPERATOR (%s)' at %C, "
349                          "but got %s", s1, s2);
350             }
351
352         }
353
354       break;
355
356     case INTERFACE_USER_OP:
357       /* Comparing the symbol node names is OK because only use-associated
358          symbols can be renamed.  */
359       if (type != current_interface.type
360           || strcmp (current_interface.uop->name, name) != 0)
361         {
362           gfc_error ("Expecting 'END INTERFACE OPERATOR (.%s.)' at %C",
363                      current_interface.uop->name);
364           m = MATCH_ERROR;
365         }
366
367       break;
368
369     case INTERFACE_GENERIC:
370       if (type != current_interface.type
371           || strcmp (current_interface.sym->name, name) != 0)
372         {
373           gfc_error ("Expecting 'END INTERFACE %s' at %C",
374                      current_interface.sym->name);
375           m = MATCH_ERROR;
376         }
377
378       break;
379     }
380
381   return m;
382 }
383
384
385 /* Compare two derived types using the criteria in 4.4.2 of the standard,
386    recursing through gfc_compare_types for the components.  */
387
388 int
389 gfc_compare_derived_types (gfc_symbol *derived1, gfc_symbol *derived2)
390 {
391   gfc_component *dt1, *dt2;
392
393   if (derived1 == derived2)
394     return 1;
395
396   gcc_assert (derived1 && derived2);
397
398   /* Special case for comparing derived types across namespaces.  If the
399      true names and module names are the same and the module name is
400      nonnull, then they are equal.  */
401   if (strcmp (derived1->name, derived2->name) == 0
402       && derived1->module != NULL && derived2->module != NULL
403       && strcmp (derived1->module, derived2->module) == 0)
404     return 1;
405
406   /* Compare type via the rules of the standard.  Both types must have
407      the SEQUENCE or BIND(C) attribute to be equal.  */
408
409   if (strcmp (derived1->name, derived2->name))
410     return 0;
411
412   if (derived1->component_access == ACCESS_PRIVATE
413       || derived2->component_access == ACCESS_PRIVATE)
414     return 0;
415
416   if (!(derived1->attr.sequence && derived2->attr.sequence)
417       && !(derived1->attr.is_bind_c && derived2->attr.is_bind_c))
418     return 0;
419
420   dt1 = derived1->components;
421   dt2 = derived2->components;
422
423   /* Since subtypes of SEQUENCE types must be SEQUENCE types as well, a
424      simple test can speed things up.  Otherwise, lots of things have to
425      match.  */
426   for (;;)
427     {
428       if (strcmp (dt1->name, dt2->name) != 0)
429         return 0;
430
431       if (dt1->attr.access != dt2->attr.access)
432         return 0;
433
434       if (dt1->attr.pointer != dt2->attr.pointer)
435         return 0;
436
437       if (dt1->attr.dimension != dt2->attr.dimension)
438         return 0;
439
440      if (dt1->attr.allocatable != dt2->attr.allocatable)
441         return 0;
442
443       if (dt1->attr.dimension && gfc_compare_array_spec (dt1->as, dt2->as) == 0)
444         return 0;
445
446       /* Make sure that link lists do not put this function into an
447          endless recursive loop!  */
448       if (!(dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived)
449             && !(dt2->ts.type == BT_DERIVED && derived2 == dt2->ts.u.derived)
450             && gfc_compare_types (&dt1->ts, &dt2->ts) == 0)
451         return 0;
452
453       else if ((dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived)
454                 && !(dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived))
455         return 0;
456
457       else if (!(dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived)
458                 && (dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived))
459         return 0;
460
461       dt1 = dt1->next;
462       dt2 = dt2->next;
463
464       if (dt1 == NULL && dt2 == NULL)
465         break;
466       if (dt1 == NULL || dt2 == NULL)
467         return 0;
468     }
469
470   return 1;
471 }
472
473
474 /* Compare two typespecs, recursively if necessary.  */
475
476 int
477 gfc_compare_types (gfc_typespec *ts1, gfc_typespec *ts2)
478 {
479   /* See if one of the typespecs is a BT_VOID, which is what is being used
480      to allow the funcs like c_f_pointer to accept any pointer type.
481      TODO: Possibly should narrow this to just the one typespec coming in
482      that is for the formal arg, but oh well.  */
483   if (ts1->type == BT_VOID || ts2->type == BT_VOID)
484     return 1;
485
486   if (ts1->type == BT_CLASS
487       && ts1->u.derived->components->ts.u.derived->attr.unlimited_polymorphic)
488     return 1;
489
490   /* F2003: C717  */
491   if (ts2->type == BT_CLASS && ts1->type == BT_DERIVED
492       && ts2->u.derived->components->ts.u.derived->attr.unlimited_polymorphic
493       && (ts1->u.derived->attr.sequence || ts1->u.derived->attr.is_bind_c))
494     return 1;
495
496   if (ts1->type != ts2->type
497       && ((ts1->type != BT_DERIVED && ts1->type != BT_CLASS)
498           || (ts2->type != BT_DERIVED && ts2->type != BT_CLASS)))
499     return 0;
500   if (ts1->type != BT_DERIVED && ts1->type != BT_CLASS)
501     return (ts1->kind == ts2->kind);
502
503   /* Compare derived types.  */
504   if (gfc_type_compatible (ts1, ts2))
505     return 1;
506
507   return gfc_compare_derived_types (ts1->u.derived ,ts2->u.derived);
508 }
509
510
511 static int
512 compare_type (gfc_symbol *s1, gfc_symbol *s2)
513 {
514   if (s2->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
515     return 1;
516
517   /* TYPE and CLASS of the same declared type are type compatible,
518      but have different characteristics.  */
519   if ((s1->ts.type == BT_CLASS && s2->ts.type == BT_DERIVED)
520       || (s1->ts.type == BT_DERIVED && s2->ts.type == BT_CLASS))
521     return 0;
522
523   return gfc_compare_types (&s1->ts, &s2->ts) || s2->ts.type == BT_ASSUMED;
524 }
525
526
527 static int
528 compare_rank (gfc_symbol *s1, gfc_symbol *s2)
529 {
530   gfc_array_spec *as1, *as2;
531   int r1, r2;
532
533   if (s2->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
534     return 1;
535
536   as1 = (s1->ts.type == BT_CLASS) ? CLASS_DATA (s1)->as : s1->as;
537   as2 = (s2->ts.type == BT_CLASS) ? CLASS_DATA (s2)->as : s2->as;
538
539   r1 = as1 ? as1->rank : 0;
540   r2 = as2 ? as2->rank : 0;
541
542   if (r1 != r2 && (!as2 || as2->type != AS_ASSUMED_RANK))
543     return 0;                   /* Ranks differ.  */
544
545   return 1;
546 }
547
548
549 /* Given two symbols that are formal arguments, compare their ranks
550    and types.  Returns nonzero if they have the same rank and type,
551    zero otherwise.  */
552
553 static int
554 compare_type_rank (gfc_symbol *s1, gfc_symbol *s2)
555 {
556   return compare_type (s1, s2) && compare_rank (s1, s2);
557 }
558
559
560 /* Given two symbols that are formal arguments, compare their types
561    and rank and their formal interfaces if they are both dummy
562    procedures.  Returns nonzero if the same, zero if different.  */
563
564 static int
565 compare_type_rank_if (gfc_symbol *s1, gfc_symbol *s2)
566 {
567   if (s1 == NULL || s2 == NULL)
568     return s1 == s2 ? 1 : 0;
569
570   if (s1 == s2)
571     return 1;
572
573   if (s1->attr.flavor != FL_PROCEDURE && s2->attr.flavor != FL_PROCEDURE)
574     return compare_type_rank (s1, s2);
575
576   if (s1->attr.flavor != FL_PROCEDURE || s2->attr.flavor != FL_PROCEDURE)
577     return 0;
578
579   /* At this point, both symbols are procedures.  It can happen that
580      external procedures are compared, where one is identified by usage
581      to be a function or subroutine but the other is not.  Check TKR
582      nonetheless for these cases.  */
583   if (s1->attr.function == 0 && s1->attr.subroutine == 0)
584     return s1->attr.external == 1 ? compare_type_rank (s1, s2) : 0;
585
586   if (s2->attr.function == 0 && s2->attr.subroutine == 0)
587     return s2->attr.external == 1 ? compare_type_rank (s1, s2) : 0;
588
589   /* Now the type of procedure has been identified.  */
590   if (s1->attr.function != s2->attr.function
591       || s1->attr.subroutine != s2->attr.subroutine)
592     return 0;
593
594   if (s1->attr.function && compare_type_rank (s1, s2) == 0)
595     return 0;
596
597   /* Originally, gfortran recursed here to check the interfaces of passed
598      procedures.  This is explicitly not required by the standard.  */
599   return 1;
600 }
601
602
603 /* Given a formal argument list and a keyword name, search the list
604    for that keyword.  Returns the correct symbol node if found, NULL
605    if not found.  */
606
607 static gfc_symbol *
608 find_keyword_arg (const char *name, gfc_formal_arglist *f)
609 {
610   for (; f; f = f->next)
611     if (strcmp (f->sym->name, name) == 0)
612       return f->sym;
613
614   return NULL;
615 }
616
617
618 /******** Interface checking subroutines **********/
619
620
621 /* Given an operator interface and the operator, make sure that all
622    interfaces for that operator are legal.  */
623
624 bool
625 gfc_check_operator_interface (gfc_symbol *sym, gfc_intrinsic_op op,
626                               locus opwhere)
627 {
628   gfc_formal_arglist *formal;
629   sym_intent i1, i2;
630   bt t1, t2;
631   int args, r1, r2, k1, k2;
632
633   gcc_assert (sym);
634
635   args = 0;
636   t1 = t2 = BT_UNKNOWN;
637   i1 = i2 = INTENT_UNKNOWN;
638   r1 = r2 = -1;
639   k1 = k2 = -1;
640
641   for (formal = gfc_sym_get_dummy_args (sym); formal; formal = formal->next)
642     {
643       gfc_symbol *fsym = formal->sym;
644       if (fsym == NULL)
645         {
646           gfc_error ("Alternate return cannot appear in operator "
647                      "interface at %L", &sym->declared_at);
648           return false;
649         }
650       if (args == 0)
651         {
652           t1 = fsym->ts.type;
653           i1 = fsym->attr.intent;
654           r1 = (fsym->as != NULL) ? fsym->as->rank : 0;
655           k1 = fsym->ts.kind;
656         }
657       if (args == 1)
658         {
659           t2 = fsym->ts.type;
660           i2 = fsym->attr.intent;
661           r2 = (fsym->as != NULL) ? fsym->as->rank : 0;
662           k2 = fsym->ts.kind;
663         }
664       args++;
665     }
666
667   /* Only +, - and .not. can be unary operators.
668      .not. cannot be a binary operator.  */
669   if (args == 0 || args > 2 || (args == 1 && op != INTRINSIC_PLUS
670                                 && op != INTRINSIC_MINUS
671                                 && op != INTRINSIC_NOT)
672       || (args == 2 && op == INTRINSIC_NOT))
673     {
674       if (op == INTRINSIC_ASSIGN)
675         gfc_error ("Assignment operator interface at %L must have "
676                    "two arguments", &sym->declared_at);
677       else
678         gfc_error ("Operator interface at %L has the wrong number of arguments",
679                    &sym->declared_at);
680       return false;
681     }
682
683   /* Check that intrinsics are mapped to functions, except
684      INTRINSIC_ASSIGN which should map to a subroutine.  */
685   if (op == INTRINSIC_ASSIGN)
686     {
687       gfc_formal_arglist *dummy_args;
688
689       if (!sym->attr.subroutine)
690         {
691           gfc_error ("Assignment operator interface at %L must be "
692                      "a SUBROUTINE", &sym->declared_at);
693           return false;
694         }
695
696       /* Allowed are (per F2003, 12.3.2.1.2 Defined assignments):
697          - First argument an array with different rank than second,
698          - First argument is a scalar and second an array,
699          - Types and kinds do not conform, or
700          - First argument is of derived type.  */
701       dummy_args = gfc_sym_get_dummy_args (sym);
702       if (dummy_args->sym->ts.type != BT_DERIVED
703           && dummy_args->sym->ts.type != BT_CLASS
704           && (r2 == 0 || r1 == r2)
705           && (dummy_args->sym->ts.type == dummy_args->next->sym->ts.type
706               || (gfc_numeric_ts (&dummy_args->sym->ts)
707                   && gfc_numeric_ts (&dummy_args->next->sym->ts))))
708         {
709           gfc_error ("Assignment operator interface at %L must not redefine "
710                      "an INTRINSIC type assignment", &sym->declared_at);
711           return false;
712         }
713     }
714   else
715     {
716       if (!sym->attr.function)
717         {
718           gfc_error ("Intrinsic operator interface at %L must be a FUNCTION",
719                      &sym->declared_at);
720           return false;
721         }
722     }
723
724   /* Check intents on operator interfaces.  */
725   if (op == INTRINSIC_ASSIGN)
726     {
727       if (i1 != INTENT_OUT && i1 != INTENT_INOUT)
728         {
729           gfc_error ("First argument of defined assignment at %L must be "
730                      "INTENT(OUT) or INTENT(INOUT)", &sym->declared_at);
731           return false;
732         }
733
734       if (i2 != INTENT_IN)
735         {
736           gfc_error ("Second argument of defined assignment at %L must be "
737                      "INTENT(IN)", &sym->declared_at);
738           return false;
739         }
740     }
741   else
742     {
743       if (i1 != INTENT_IN)
744         {
745           gfc_error ("First argument of operator interface at %L must be "
746                      "INTENT(IN)", &sym->declared_at);
747           return false;
748         }
749
750       if (args == 2 && i2 != INTENT_IN)
751         {
752           gfc_error ("Second argument of operator interface at %L must be "
753                      "INTENT(IN)", &sym->declared_at);
754           return false;
755         }
756     }
757
758   /* From now on, all we have to do is check that the operator definition
759      doesn't conflict with an intrinsic operator. The rules for this
760      game are defined in 7.1.2 and 7.1.3 of both F95 and F2003 standards,
761      as well as 12.3.2.1.1 of Fortran 2003:
762
763      "If the operator is an intrinsic-operator (R310), the number of
764      function arguments shall be consistent with the intrinsic uses of
765      that operator, and the types, kind type parameters, or ranks of the
766      dummy arguments shall differ from those required for the intrinsic
767      operation (7.1.2)."  */
768
769 #define IS_NUMERIC_TYPE(t) \
770   ((t) == BT_INTEGER || (t) == BT_REAL || (t) == BT_COMPLEX)
771
772   /* Unary ops are easy, do them first.  */
773   if (op == INTRINSIC_NOT)
774     {
775       if (t1 == BT_LOGICAL)
776         goto bad_repl;
777       else
778         return true;
779     }
780
781   if (args == 1 && (op == INTRINSIC_PLUS || op == INTRINSIC_MINUS))
782     {
783       if (IS_NUMERIC_TYPE (t1))
784         goto bad_repl;
785       else
786         return true;
787     }
788
789   /* Character intrinsic operators have same character kind, thus
790      operator definitions with operands of different character kinds
791      are always safe.  */
792   if (t1 == BT_CHARACTER && t2 == BT_CHARACTER && k1 != k2)
793     return true;
794
795   /* Intrinsic operators always perform on arguments of same rank,
796      so different ranks is also always safe.  (rank == 0) is an exception
797      to that, because all intrinsic operators are elemental.  */
798   if (r1 != r2 && r1 != 0 && r2 != 0)
799     return true;
800
801   switch (op)
802   {
803     case INTRINSIC_EQ:
804     case INTRINSIC_EQ_OS:
805     case INTRINSIC_NE:
806     case INTRINSIC_NE_OS:
807       if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
808         goto bad_repl;
809       /* Fall through.  */
810
811     case INTRINSIC_PLUS:
812     case INTRINSIC_MINUS:
813     case INTRINSIC_TIMES:
814     case INTRINSIC_DIVIDE:
815     case INTRINSIC_POWER:
816       if (IS_NUMERIC_TYPE (t1) && IS_NUMERIC_TYPE (t2))
817         goto bad_repl;
818       break;
819
820     case INTRINSIC_GT:
821     case INTRINSIC_GT_OS:
822     case INTRINSIC_GE:
823     case INTRINSIC_GE_OS:
824     case INTRINSIC_LT:
825     case INTRINSIC_LT_OS:
826     case INTRINSIC_LE:
827     case INTRINSIC_LE_OS:
828       if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
829         goto bad_repl;
830       if ((t1 == BT_INTEGER || t1 == BT_REAL)
831           && (t2 == BT_INTEGER || t2 == BT_REAL))
832         goto bad_repl;
833       break;
834
835     case INTRINSIC_CONCAT:
836       if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
837         goto bad_repl;
838       break;
839
840     case INTRINSIC_AND:
841     case INTRINSIC_OR:
842     case INTRINSIC_EQV:
843     case INTRINSIC_NEQV:
844       if (t1 == BT_LOGICAL && t2 == BT_LOGICAL)
845         goto bad_repl;
846       break;
847
848     default:
849       break;
850   }
851
852   return true;
853
854 #undef IS_NUMERIC_TYPE
855
856 bad_repl:
857   gfc_error ("Operator interface at %L conflicts with intrinsic interface",
858              &opwhere);
859   return false;
860 }
861
862
863 /* Given a pair of formal argument lists, we see if the two lists can
864    be distinguished by counting the number of nonoptional arguments of
865    a given type/rank in f1 and seeing if there are less then that
866    number of those arguments in f2 (including optional arguments).
867    Since this test is asymmetric, it has to be called twice to make it
868    symmetric. Returns nonzero if the argument lists are incompatible
869    by this test. This subroutine implements rule 1 of section F03:16.2.3.
870    'p1' and 'p2' are the PASS arguments of both procedures (if applicable).  */
871
872 static int
873 count_types_test (gfc_formal_arglist *f1, gfc_formal_arglist *f2,
874                   const char *p1, const char *p2)
875 {
876   int rc, ac1, ac2, i, j, k, n1;
877   gfc_formal_arglist *f;
878
879   typedef struct
880   {
881     int flag;
882     gfc_symbol *sym;
883   }
884   arginfo;
885
886   arginfo *arg;
887
888   n1 = 0;
889
890   for (f = f1; f; f = f->next)
891     n1++;
892
893   /* Build an array of integers that gives the same integer to
894      arguments of the same type/rank.  */
895   arg = XCNEWVEC (arginfo, n1);
896
897   f = f1;
898   for (i = 0; i < n1; i++, f = f->next)
899     {
900       arg[i].flag = -1;
901       arg[i].sym = f->sym;
902     }
903
904   k = 0;
905
906   for (i = 0; i < n1; i++)
907     {
908       if (arg[i].flag != -1)
909         continue;
910
911       if (arg[i].sym && (arg[i].sym->attr.optional
912                          || (p1 && strcmp (arg[i].sym->name, p1) == 0)))
913         continue;               /* Skip OPTIONAL and PASS arguments.  */
914
915       arg[i].flag = k;
916
917       /* Find other non-optional, non-pass arguments of the same type/rank.  */
918       for (j = i + 1; j < n1; j++)
919         if ((arg[j].sym == NULL
920              || !(arg[j].sym->attr.optional
921                   || (p1 && strcmp (arg[j].sym->name, p1) == 0)))
922             && (compare_type_rank_if (arg[i].sym, arg[j].sym)
923                 || compare_type_rank_if (arg[j].sym, arg[i].sym)))
924           arg[j].flag = k;
925
926       k++;
927     }
928
929   /* Now loop over each distinct type found in f1.  */
930   k = 0;
931   rc = 0;
932
933   for (i = 0; i < n1; i++)
934     {
935       if (arg[i].flag != k)
936         continue;
937
938       ac1 = 1;
939       for (j = i + 1; j < n1; j++)
940         if (arg[j].flag == k)
941           ac1++;
942
943       /* Count the number of non-pass arguments in f2 with that type,
944          including those that are optional.  */
945       ac2 = 0;
946
947       for (f = f2; f; f = f->next)
948         if ((!p2 || strcmp (f->sym->name, p2) != 0)
949             && (compare_type_rank_if (arg[i].sym, f->sym)
950                 || compare_type_rank_if (f->sym, arg[i].sym)))
951           ac2++;
952
953       if (ac1 > ac2)
954         {
955           rc = 1;
956           break;
957         }
958
959       k++;
960     }
961
962   free (arg);
963
964   return rc;
965 }
966
967
968 /* Perform the correspondence test in rule (3) of F08:C1215.
969    Returns zero if no argument is found that satisfies this rule,
970    nonzero otherwise. 'p1' and 'p2' are the PASS arguments of both procedures
971    (if applicable).
972
973    This test is also not symmetric in f1 and f2 and must be called
974    twice.  This test finds problems caused by sorting the actual
975    argument list with keywords.  For example:
976
977    INTERFACE FOO
978      SUBROUTINE F1(A, B)
979        INTEGER :: A ; REAL :: B
980      END SUBROUTINE F1
981
982      SUBROUTINE F2(B, A)
983        INTEGER :: A ; REAL :: B
984      END SUBROUTINE F1
985    END INTERFACE FOO
986
987    At this point, 'CALL FOO(A=1, B=1.0)' is ambiguous.  */
988
989 static int
990 generic_correspondence (gfc_formal_arglist *f1, gfc_formal_arglist *f2,
991                         const char *p1, const char *p2)
992 {
993   gfc_formal_arglist *f2_save, *g;
994   gfc_symbol *sym;
995
996   f2_save = f2;
997
998   while (f1)
999     {
1000       if (f1->sym->attr.optional)
1001         goto next;
1002
1003       if (p1 && strcmp (f1->sym->name, p1) == 0)
1004         f1 = f1->next;
1005       if (f2 && p2 && strcmp (f2->sym->name, p2) == 0)
1006         f2 = f2->next;
1007
1008       if (f2 != NULL && (compare_type_rank (f1->sym, f2->sym)
1009                          || compare_type_rank (f2->sym, f1->sym))
1010           && !((gfc_option.allow_std & GFC_STD_F2008)
1011                && ((f1->sym->attr.allocatable && f2->sym->attr.pointer)
1012                    || (f2->sym->attr.allocatable && f1->sym->attr.pointer))))
1013         goto next;
1014
1015       /* Now search for a disambiguating keyword argument starting at
1016          the current non-match.  */
1017       for (g = f1; g; g = g->next)
1018         {
1019           if (g->sym->attr.optional || (p1 && strcmp (g->sym->name, p1) == 0))
1020             continue;
1021
1022           sym = find_keyword_arg (g->sym->name, f2_save);
1023           if (sym == NULL || !compare_type_rank (g->sym, sym)
1024               || ((gfc_option.allow_std & GFC_STD_F2008)
1025                   && ((sym->attr.allocatable && g->sym->attr.pointer)
1026                       || (sym->attr.pointer && g->sym->attr.allocatable))))
1027             return 1;
1028         }
1029
1030     next:
1031       if (f1 != NULL)
1032         f1 = f1->next;
1033       if (f2 != NULL)
1034         f2 = f2->next;
1035     }
1036
1037   return 0;
1038 }
1039
1040
1041 static int
1042 symbol_rank (gfc_symbol *sym)
1043 {
1044   gfc_array_spec *as;
1045   as = (sym->ts.type == BT_CLASS) ? CLASS_DATA (sym)->as : sym->as;
1046   return as ? as->rank : 0;
1047 }
1048
1049
1050 /* Check if the characteristics of two dummy arguments match,
1051    cf. F08:12.3.2.  */
1052
1053 static bool
1054 check_dummy_characteristics (gfc_symbol *s1, gfc_symbol *s2,
1055                              bool type_must_agree, char *errmsg, int err_len)
1056 {
1057   if (s1 == NULL || s2 == NULL)
1058     return s1 == s2 ? true : false;
1059
1060   /* Check type and rank.  */
1061   if (type_must_agree)
1062     {
1063       if (!compare_type (s1, s2) || !compare_type (s2, s1))
1064         {
1065           snprintf (errmsg, err_len, "Type mismatch in argument '%s' (%s/%s)",
1066                     s1->name, gfc_typename (&s1->ts), gfc_typename (&s2->ts));
1067           return false;
1068         }
1069       if (!compare_rank (s1, s2))
1070         {
1071           snprintf (errmsg, err_len, "Rank mismatch in argument '%s' (%i/%i)",
1072                     s1->name, symbol_rank (s1), symbol_rank (s2));
1073           return false;
1074         }
1075     }
1076
1077   /* Check INTENT.  */
1078   if (s1->attr.intent != s2->attr.intent)
1079     {
1080       snprintf (errmsg, err_len, "INTENT mismatch in argument '%s'",
1081                 s1->name);
1082       return false;
1083     }
1084
1085   /* Check OPTIONAL attribute.  */
1086   if (s1->attr.optional != s2->attr.optional)
1087     {
1088       snprintf (errmsg, err_len, "OPTIONAL mismatch in argument '%s'",
1089                 s1->name);
1090       return false;
1091     }
1092
1093   /* Check ALLOCATABLE attribute.  */
1094   if (s1->attr.allocatable != s2->attr.allocatable)
1095     {
1096       snprintf (errmsg, err_len, "ALLOCATABLE mismatch in argument '%s'",
1097                 s1->name);
1098       return false;
1099     }
1100
1101   /* Check POINTER attribute.  */
1102   if (s1->attr.pointer != s2->attr.pointer)
1103     {
1104       snprintf (errmsg, err_len, "POINTER mismatch in argument '%s'",
1105                 s1->name);
1106       return false;
1107     }
1108
1109   /* Check TARGET attribute.  */
1110   if (s1->attr.target != s2->attr.target)
1111     {
1112       snprintf (errmsg, err_len, "TARGET mismatch in argument '%s'",
1113                 s1->name);
1114       return false;
1115     }
1116
1117   /* FIXME: Do more comprehensive testing of attributes, like e.g.
1118             ASYNCHRONOUS, CONTIGUOUS, VALUE, VOLATILE, etc.  */
1119
1120   /* Check interface of dummy procedures.  */
1121   if (s1->attr.flavor == FL_PROCEDURE)
1122     {
1123       char err[200];
1124       if (!gfc_compare_interfaces (s1, s2, s2->name, 0, 1, err, sizeof(err),
1125                                    NULL, NULL))
1126         {
1127           snprintf (errmsg, err_len, "Interface mismatch in dummy procedure "
1128                     "'%s': %s", s1->name, err);
1129           return false;
1130         }
1131     }
1132
1133   /* Check string length.  */
1134   if (s1->ts.type == BT_CHARACTER
1135       && s1->ts.u.cl && s1->ts.u.cl->length
1136       && s2->ts.u.cl && s2->ts.u.cl->length)
1137     {
1138       int compval = gfc_dep_compare_expr (s1->ts.u.cl->length,
1139                                           s2->ts.u.cl->length);
1140       switch (compval)
1141       {
1142         case -1:
1143         case  1:
1144         case -3:
1145           snprintf (errmsg, err_len, "Character length mismatch "
1146                     "in argument '%s'", s1->name);
1147           return false;
1148
1149         case -2:
1150           /* FIXME: Implement a warning for this case.
1151           gfc_warning ("Possible character length mismatch in argument '%s'",
1152                        s1->name);*/
1153           break;
1154
1155         case 0:
1156           break;
1157
1158         default:
1159           gfc_internal_error ("check_dummy_characteristics: Unexpected result "
1160                               "%i of gfc_dep_compare_expr", compval);
1161           break;
1162       }
1163     }
1164
1165   /* Check array shape.  */
1166   if (s1->as && s2->as)
1167     {
1168       int i, compval;
1169       gfc_expr *shape1, *shape2;
1170
1171       if (s1->as->type != s2->as->type)
1172         {
1173           snprintf (errmsg, err_len, "Shape mismatch in argument '%s'",
1174                     s1->name);
1175           return false;
1176         }
1177
1178       if (s1->as->type == AS_EXPLICIT)
1179         for (i = 0; i < s1->as->rank + s1->as->corank; i++)
1180           {
1181             shape1 = gfc_subtract (gfc_copy_expr (s1->as->upper[i]),
1182                                   gfc_copy_expr (s1->as->lower[i]));
1183             shape2 = gfc_subtract (gfc_copy_expr (s2->as->upper[i]),
1184                                   gfc_copy_expr (s2->as->lower[i]));
1185             compval = gfc_dep_compare_expr (shape1, shape2);
1186             gfc_free_expr (shape1);
1187             gfc_free_expr (shape2);
1188             switch (compval)
1189             {
1190               case -1:
1191               case  1:
1192               case -3:
1193                 snprintf (errmsg, err_len, "Shape mismatch in dimension %i of "
1194                           "argument '%s'", i + 1, s1->name);
1195                 return false;
1196
1197               case -2:
1198                 /* FIXME: Implement a warning for this case.
1199                 gfc_warning ("Possible shape mismatch in argument '%s'",
1200                             s1->name);*/
1201                 break;
1202
1203               case 0:
1204                 break;
1205
1206               default:
1207                 gfc_internal_error ("check_dummy_characteristics: Unexpected "
1208                                     "result %i of gfc_dep_compare_expr",
1209                                     compval);
1210                 break;
1211             }
1212           }
1213     }
1214
1215   return true;
1216 }
1217
1218
1219 /* Check if the characteristics of two function results match,
1220    cf. F08:12.3.3.  */
1221
1222 static bool
1223 check_result_characteristics (gfc_symbol *s1, gfc_symbol *s2,
1224                               char *errmsg, int err_len)
1225 {
1226   gfc_symbol *r1, *r2;
1227
1228   if (s1->ts.interface && s1->ts.interface->result)
1229     r1 = s1->ts.interface->result;
1230   else
1231     r1 = s1->result ? s1->result : s1;
1232
1233   if (s2->ts.interface && s2->ts.interface->result)
1234     r2 = s2->ts.interface->result;
1235   else
1236     r2 = s2->result ? s2->result : s2;
1237
1238   if (r1->ts.type == BT_UNKNOWN)
1239     return true;
1240
1241   /* Check type and rank.  */
1242   if (!compare_type (r1, r2))
1243     {
1244       snprintf (errmsg, err_len, "Type mismatch in function result (%s/%s)",
1245                 gfc_typename (&r1->ts), gfc_typename (&r2->ts));
1246       return false;
1247     }
1248   if (!compare_rank (r1, r2))
1249     {
1250       snprintf (errmsg, err_len, "Rank mismatch in function result (%i/%i)",
1251                 symbol_rank (r1), symbol_rank (r2));
1252       return false;
1253     }
1254
1255   /* Check ALLOCATABLE attribute.  */
1256   if (r1->attr.allocatable != r2->attr.allocatable)
1257     {
1258       snprintf (errmsg, err_len, "ALLOCATABLE attribute mismatch in "
1259                 "function result");
1260       return false;
1261     }
1262
1263   /* Check POINTER attribute.  */
1264   if (r1->attr.pointer != r2->attr.pointer)
1265     {
1266       snprintf (errmsg, err_len, "POINTER attribute mismatch in "
1267                 "function result");
1268       return false;
1269     }
1270
1271   /* Check CONTIGUOUS attribute.  */
1272   if (r1->attr.contiguous != r2->attr.contiguous)
1273     {
1274       snprintf (errmsg, err_len, "CONTIGUOUS attribute mismatch in "
1275                 "function result");
1276       return false;
1277     }
1278
1279   /* Check PROCEDURE POINTER attribute.  */
1280   if (r1 != s1 && r1->attr.proc_pointer != r2->attr.proc_pointer)
1281     {
1282       snprintf (errmsg, err_len, "PROCEDURE POINTER mismatch in "
1283                 "function result");
1284       return false;
1285     }
1286
1287   /* Check string length.  */
1288   if (r1->ts.type == BT_CHARACTER && r1->ts.u.cl && r2->ts.u.cl)
1289     {
1290       if (r1->ts.deferred != r2->ts.deferred)
1291         {
1292           snprintf (errmsg, err_len, "Character length mismatch "
1293                     "in function result");
1294           return false;
1295         }
1296
1297       if (r1->ts.u.cl->length && r2->ts.u.cl->length)
1298         {
1299           int compval = gfc_dep_compare_expr (r1->ts.u.cl->length,
1300                                               r2->ts.u.cl->length);
1301           switch (compval)
1302           {
1303             case -1:
1304             case  1:
1305             case -3:
1306               snprintf (errmsg, err_len, "Character length mismatch "
1307                         "in function result");
1308               return false;
1309
1310             case -2:
1311               /* FIXME: Implement a warning for this case.
1312               snprintf (errmsg, err_len, "Possible character length mismatch "
1313                         "in function result");*/
1314               break;
1315
1316             case 0:
1317               break;
1318
1319             default:
1320               gfc_internal_error ("check_result_characteristics (1): Unexpected "
1321                                   "result %i of gfc_dep_compare_expr", compval);
1322               break;
1323           }
1324         }
1325     }
1326
1327   /* Check array shape.  */
1328   if (!r1->attr.allocatable && !r1->attr.pointer && r1->as && r2->as)
1329     {
1330       int i, compval;
1331       gfc_expr *shape1, *shape2;
1332
1333       if (r1->as->type != r2->as->type)
1334         {
1335           snprintf (errmsg, err_len, "Shape mismatch in function result");
1336           return false;
1337         }
1338
1339       if (r1->as->type == AS_EXPLICIT)
1340         for (i = 0; i < r1->as->rank + r1->as->corank; i++)
1341           {
1342             shape1 = gfc_subtract (gfc_copy_expr (r1->as->upper[i]),
1343                                    gfc_copy_expr (r1->as->lower[i]));
1344             shape2 = gfc_subtract (gfc_copy_expr (r2->as->upper[i]),
1345                                    gfc_copy_expr (r2->as->lower[i]));
1346             compval = gfc_dep_compare_expr (shape1, shape2);
1347             gfc_free_expr (shape1);
1348             gfc_free_expr (shape2);
1349             switch (compval)
1350             {
1351               case -1:
1352               case  1:
1353               case -3:
1354                 snprintf (errmsg, err_len, "Shape mismatch in dimension %i of "
1355                           "function result", i + 1);
1356                 return false;
1357
1358               case -2:
1359                 /* FIXME: Implement a warning for this case.
1360                 gfc_warning ("Possible shape mismatch in return value");*/
1361                 break;
1362
1363               case 0:
1364                 break;
1365
1366               default:
1367                 gfc_internal_error ("check_result_characteristics (2): "
1368                                     "Unexpected result %i of "
1369                                     "gfc_dep_compare_expr", compval);
1370                 break;
1371             }
1372           }
1373     }
1374
1375   return true;
1376 }
1377
1378
1379 /* 'Compare' two formal interfaces associated with a pair of symbols.
1380    We return nonzero if there exists an actual argument list that
1381    would be ambiguous between the two interfaces, zero otherwise.
1382    'strict_flag' specifies whether all the characteristics are
1383    required to match, which is not the case for ambiguity checks.
1384    'p1' and 'p2' are the PASS arguments of both procedures (if applicable).  */
1385
1386 int
1387 gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol *s2, const char *name2,
1388                         int generic_flag, int strict_flag,
1389                         char *errmsg, int err_len,
1390                         const char *p1, const char *p2)
1391 {
1392   gfc_formal_arglist *f1, *f2;
1393
1394   gcc_assert (name2 != NULL);
1395
1396   if (s1->attr.function && (s2->attr.subroutine
1397       || (!s2->attr.function && s2->ts.type == BT_UNKNOWN
1398           && gfc_get_default_type (name2, s2->ns)->type == BT_UNKNOWN)))
1399     {
1400       if (errmsg != NULL)
1401         snprintf (errmsg, err_len, "'%s' is not a function", name2);
1402       return 0;
1403     }
1404
1405   if (s1->attr.subroutine && s2->attr.function)
1406     {
1407       if (errmsg != NULL)
1408         snprintf (errmsg, err_len, "'%s' is not a subroutine", name2);
1409       return 0;
1410     }
1411
1412   /* Do strict checks on all characteristics
1413      (for dummy procedures and procedure pointer assignments).  */
1414   if (!generic_flag && strict_flag)
1415     {
1416       if (s1->attr.function && s2->attr.function)
1417         {
1418           /* If both are functions, check result characteristics.  */
1419           if (!check_result_characteristics (s1, s2, errmsg, err_len)
1420               || !check_result_characteristics (s2, s1, errmsg, err_len))
1421             return 0;
1422         }
1423
1424       if (s1->attr.pure && !s2->attr.pure)
1425         {
1426           snprintf (errmsg, err_len, "Mismatch in PURE attribute");
1427           return 0;
1428         }
1429       if (s1->attr.elemental && !s2->attr.elemental)
1430         {
1431           snprintf (errmsg, err_len, "Mismatch in ELEMENTAL attribute");
1432           return 0;
1433         }
1434     }
1435
1436   if (s1->attr.if_source == IFSRC_UNKNOWN
1437       || s2->attr.if_source == IFSRC_UNKNOWN)
1438     return 1;
1439
1440   f1 = gfc_sym_get_dummy_args (s1);
1441   f2 = gfc_sym_get_dummy_args (s2);
1442
1443   if (f1 == NULL && f2 == NULL)
1444     return 1;                   /* Special case: No arguments.  */
1445
1446   if (generic_flag)
1447     {
1448       if (count_types_test (f1, f2, p1, p2)
1449           || count_types_test (f2, f1, p2, p1))
1450         return 0;
1451       if (generic_correspondence (f1, f2, p1, p2)
1452           || generic_correspondence (f2, f1, p2, p1))
1453         return 0;
1454     }
1455   else
1456     /* Perform the abbreviated correspondence test for operators (the
1457        arguments cannot be optional and are always ordered correctly).
1458        This is also done when comparing interfaces for dummy procedures and in
1459        procedure pointer assignments.  */
1460
1461     for (;;)
1462       {
1463         /* Check existence.  */
1464         if (f1 == NULL && f2 == NULL)
1465           break;
1466         if (f1 == NULL || f2 == NULL)
1467           {
1468             if (errmsg != NULL)
1469               snprintf (errmsg, err_len, "'%s' has the wrong number of "
1470                         "arguments", name2);
1471             return 0;
1472           }
1473
1474         if (UNLIMITED_POLY (f1->sym))
1475           goto next;
1476
1477         if (strict_flag)
1478           {
1479             /* Check all characteristics.  */
1480             if (!check_dummy_characteristics (f1->sym, f2->sym, true, 
1481                                               errmsg, err_len))
1482               return 0;
1483           }
1484         else
1485           {
1486             /* Only check type and rank.  */
1487             if (!compare_type (f2->sym, f1->sym))
1488               {
1489                 if (errmsg != NULL)
1490                   snprintf (errmsg, err_len, "Type mismatch in argument '%s' "
1491                             "(%s/%s)", f1->sym->name,
1492                             gfc_typename (&f1->sym->ts),
1493                             gfc_typename (&f2->sym->ts));
1494                 return 0;
1495               }
1496             if (!compare_rank (f2->sym, f1->sym))
1497               {
1498                 if (errmsg != NULL)
1499                   snprintf (errmsg, err_len, "Rank mismatch in argument '%s' "
1500                             "(%i/%i)", f1->sym->name, symbol_rank (f1->sym),
1501                             symbol_rank (f2->sym));
1502                 return 0;
1503               }
1504           }
1505 next:
1506         f1 = f1->next;
1507         f2 = f2->next;
1508       }
1509
1510   return 1;
1511 }
1512
1513
1514 /* Given a pointer to an interface pointer, remove duplicate
1515    interfaces and make sure that all symbols are either functions
1516    or subroutines, and all of the same kind.  Returns nonzero if
1517    something goes wrong.  */
1518
1519 static int
1520 check_interface0 (gfc_interface *p, const char *interface_name)
1521 {
1522   gfc_interface *psave, *q, *qlast;
1523
1524   psave = p;
1525   for (; p; p = p->next)
1526     {
1527       /* Make sure all symbols in the interface have been defined as
1528          functions or subroutines.  */
1529       if (((!p->sym->attr.function && !p->sym->attr.subroutine)
1530            || !p->sym->attr.if_source)
1531           && p->sym->attr.flavor != FL_DERIVED)
1532         {
1533           if (p->sym->attr.external)
1534             gfc_error ("Procedure '%s' in %s at %L has no explicit interface",
1535                        p->sym->name, interface_name, &p->sym->declared_at);
1536           else
1537             gfc_error ("Procedure '%s' in %s at %L is neither function nor "
1538                        "subroutine", p->sym->name, interface_name,
1539                       &p->sym->declared_at);
1540           return 1;
1541         }
1542
1543       /* Verify that procedures are either all SUBROUTINEs or all FUNCTIONs.  */
1544       if ((psave->sym->attr.function && !p->sym->attr.function
1545            && p->sym->attr.flavor != FL_DERIVED)
1546           || (psave->sym->attr.subroutine && !p->sym->attr.subroutine))
1547         {
1548           if (p->sym->attr.flavor != FL_DERIVED)
1549             gfc_error ("In %s at %L procedures must be either all SUBROUTINEs"
1550                        " or all FUNCTIONs", interface_name,
1551                        &p->sym->declared_at);
1552           else
1553             gfc_error ("In %s at %L procedures must be all FUNCTIONs as the "
1554                        "generic name is also the name of a derived type",
1555                        interface_name, &p->sym->declared_at);
1556           return 1;
1557         }
1558
1559       /* F2003, C1207. F2008, C1207.  */
1560       if (p->sym->attr.proc == PROC_INTERNAL
1561           && !gfc_notify_std (GFC_STD_F2008, "Internal procedure "
1562                               "'%s' in %s at %L", p->sym->name, 
1563                               interface_name, &p->sym->declared_at))
1564         return 1;
1565     }
1566   p = psave;
1567
1568   /* Remove duplicate interfaces in this interface list.  */
1569   for (; p; p = p->next)
1570     {
1571       qlast = p;
1572
1573       for (q = p->next; q;)
1574         {
1575           if (p->sym != q->sym)
1576             {
1577               qlast = q;
1578               q = q->next;
1579             }
1580           else
1581             {
1582               /* Duplicate interface.  */
1583               qlast->next = q->next;
1584               free (q);
1585               q = qlast->next;
1586             }
1587         }
1588     }
1589
1590   return 0;
1591 }
1592
1593
1594 /* Check lists of interfaces to make sure that no two interfaces are
1595    ambiguous.  Duplicate interfaces (from the same symbol) are OK here.  */
1596
1597 static int
1598 check_interface1 (gfc_interface *p, gfc_interface *q0,
1599                   int generic_flag, const char *interface_name,
1600                   bool referenced)
1601 {
1602   gfc_interface *q;
1603   for (; p; p = p->next)
1604     for (q = q0; q; q = q->next)
1605       {
1606         if (p->sym == q->sym)
1607           continue;             /* Duplicates OK here.  */
1608
1609         if (p->sym->name == q->sym->name && p->sym->module == q->sym->module)
1610           continue;
1611
1612         if (p->sym->attr.flavor != FL_DERIVED
1613             && q->sym->attr.flavor != FL_DERIVED
1614             && gfc_compare_interfaces (p->sym, q->sym, q->sym->name,
1615                                        generic_flag, 0, NULL, 0, NULL, NULL))
1616           {
1617             if (referenced)
1618               gfc_error ("Ambiguous interfaces '%s' and '%s' in %s at %L",
1619                          p->sym->name, q->sym->name, interface_name,
1620                          &p->where);
1621             else if (!p->sym->attr.use_assoc && q->sym->attr.use_assoc)
1622               gfc_warning ("Ambiguous interfaces '%s' and '%s' in %s at %L",
1623                            p->sym->name, q->sym->name, interface_name,
1624                            &p->where);
1625             else
1626               gfc_warning ("Although not referenced, '%s' has ambiguous "
1627                            "interfaces at %L", interface_name, &p->where);
1628             return 1;
1629           }
1630       }
1631   return 0;
1632 }
1633
1634
1635 /* Check the generic and operator interfaces of symbols to make sure
1636    that none of the interfaces conflict.  The check has to be done
1637    after all of the symbols are actually loaded.  */
1638
1639 static void
1640 check_sym_interfaces (gfc_symbol *sym)
1641 {
1642   char interface_name[100];
1643   gfc_interface *p;
1644
1645   if (sym->ns != gfc_current_ns)
1646     return;
1647
1648   if (sym->generic != NULL)
1649     {
1650       sprintf (interface_name, "generic interface '%s'", sym->name);
1651       if (check_interface0 (sym->generic, interface_name))
1652         return;
1653
1654       for (p = sym->generic; p; p = p->next)
1655         {
1656           if (p->sym->attr.mod_proc
1657               && (p->sym->attr.if_source != IFSRC_DECL
1658                   || p->sym->attr.procedure))
1659             {
1660               gfc_error ("'%s' at %L is not a module procedure",
1661                          p->sym->name, &p->where);
1662               return;
1663             }
1664         }
1665
1666       /* Originally, this test was applied to host interfaces too;
1667          this is incorrect since host associated symbols, from any
1668          source, cannot be ambiguous with local symbols.  */
1669       check_interface1 (sym->generic, sym->generic, 1, interface_name,
1670                         sym->attr.referenced || !sym->attr.use_assoc);
1671     }
1672 }
1673
1674
1675 static void
1676 check_uop_interfaces (gfc_user_op *uop)
1677 {
1678   char interface_name[100];
1679   gfc_user_op *uop2;
1680   gfc_namespace *ns;
1681
1682   sprintf (interface_name, "operator interface '%s'", uop->name);
1683   if (check_interface0 (uop->op, interface_name))
1684     return;
1685
1686   for (ns = gfc_current_ns; ns; ns = ns->parent)
1687     {
1688       uop2 = gfc_find_uop (uop->name, ns);
1689       if (uop2 == NULL)
1690         continue;
1691
1692       check_interface1 (uop->op, uop2->op, 0,
1693                         interface_name, true);
1694     }
1695 }
1696
1697 /* Given an intrinsic op, return an equivalent op if one exists,
1698    or INTRINSIC_NONE otherwise.  */
1699
1700 gfc_intrinsic_op
1701 gfc_equivalent_op (gfc_intrinsic_op op)
1702 {
1703   switch(op)
1704     {
1705     case INTRINSIC_EQ:
1706       return INTRINSIC_EQ_OS;
1707
1708     case INTRINSIC_EQ_OS:
1709       return INTRINSIC_EQ;
1710
1711     case INTRINSIC_NE:
1712       return INTRINSIC_NE_OS;
1713
1714     case INTRINSIC_NE_OS:
1715       return INTRINSIC_NE;
1716
1717     case INTRINSIC_GT:
1718       return INTRINSIC_GT_OS;
1719
1720     case INTRINSIC_GT_OS:
1721       return INTRINSIC_GT;
1722
1723     case INTRINSIC_GE:
1724       return INTRINSIC_GE_OS;
1725
1726     case INTRINSIC_GE_OS:
1727       return INTRINSIC_GE;
1728
1729     case INTRINSIC_LT:
1730       return INTRINSIC_LT_OS;
1731
1732     case INTRINSIC_LT_OS:
1733       return INTRINSIC_LT;
1734
1735     case INTRINSIC_LE:
1736       return INTRINSIC_LE_OS;
1737
1738     case INTRINSIC_LE_OS:
1739       return INTRINSIC_LE;
1740
1741     default:
1742       return INTRINSIC_NONE;
1743     }
1744 }
1745
1746 /* For the namespace, check generic, user operator and intrinsic
1747    operator interfaces for consistency and to remove duplicate
1748    interfaces.  We traverse the whole namespace, counting on the fact
1749    that most symbols will not have generic or operator interfaces.  */
1750
1751 void
1752 gfc_check_interfaces (gfc_namespace *ns)
1753 {
1754   gfc_namespace *old_ns, *ns2;
1755   char interface_name[100];
1756   int i;
1757
1758   old_ns = gfc_current_ns;
1759   gfc_current_ns = ns;
1760
1761   gfc_traverse_ns (ns, check_sym_interfaces);
1762
1763   gfc_traverse_user_op (ns, check_uop_interfaces);
1764
1765   for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
1766     {
1767       if (i == INTRINSIC_USER)
1768         continue;
1769
1770       if (i == INTRINSIC_ASSIGN)
1771         strcpy (interface_name, "intrinsic assignment operator");
1772       else
1773         sprintf (interface_name, "intrinsic '%s' operator",
1774                  gfc_op2string ((gfc_intrinsic_op) i));
1775
1776       if (check_interface0 (ns->op[i], interface_name))
1777         continue;
1778
1779       if (ns->op[i])
1780         gfc_check_operator_interface (ns->op[i]->sym, (gfc_intrinsic_op) i,
1781                                       ns->op[i]->where);
1782
1783       for (ns2 = ns; ns2; ns2 = ns2->parent)
1784         {
1785           gfc_intrinsic_op other_op;
1786
1787           if (check_interface1 (ns->op[i], ns2->op[i], 0,
1788                                 interface_name, true))
1789             goto done;
1790
1791           /* i should be gfc_intrinsic_op, but has to be int with this cast
1792              here for stupid C++ compatibility rules.  */
1793           other_op = gfc_equivalent_op ((gfc_intrinsic_op) i);
1794           if (other_op != INTRINSIC_NONE
1795             &&  check_interface1 (ns->op[i], ns2->op[other_op],
1796                                   0, interface_name, true))
1797             goto done;
1798         }
1799     }
1800
1801 done:
1802   gfc_current_ns = old_ns;
1803 }
1804
1805
1806 /* Given a symbol of a formal argument list and an expression, if the
1807    formal argument is allocatable, check that the actual argument is
1808    allocatable. Returns nonzero if compatible, zero if not compatible.  */
1809
1810 static int
1811 compare_allocatable (gfc_symbol *formal, gfc_expr *actual)
1812 {
1813   symbol_attribute attr;
1814
1815   if (formal->attr.allocatable
1816       || (formal->ts.type == BT_CLASS && CLASS_DATA (formal)->attr.allocatable))
1817     {
1818       attr = gfc_expr_attr (actual);
1819       if (!attr.allocatable)
1820         return 0;
1821     }
1822
1823   return 1;
1824 }
1825
1826
1827 /* Given a symbol of a formal argument list and an expression, if the
1828    formal argument is a pointer, see if the actual argument is a
1829    pointer. Returns nonzero if compatible, zero if not compatible.  */
1830
1831 static int
1832 compare_pointer (gfc_symbol *formal, gfc_expr *actual)
1833 {
1834   symbol_attribute attr;
1835
1836   if (formal->attr.pointer
1837       || (formal->ts.type == BT_CLASS && CLASS_DATA (formal)
1838           && CLASS_DATA (formal)->attr.class_pointer))
1839     {
1840       attr = gfc_expr_attr (actual);
1841
1842       /* Fortran 2008 allows non-pointer actual arguments.  */
1843       if (!attr.pointer && attr.target && formal->attr.intent == INTENT_IN)
1844         return 2;
1845
1846       if (!attr.pointer)
1847         return 0;
1848     }
1849
1850   return 1;
1851 }
1852
1853
1854 /* Emit clear error messages for rank mismatch.  */
1855
1856 static void
1857 argument_rank_mismatch (const char *name, locus *where,
1858                         int rank1, int rank2)
1859 {
1860
1861   /* TS 29113, C407b.  */
1862   if (rank2 == -1)
1863     {
1864       gfc_error ("The assumed-rank array at %L requires that the dummy argument"
1865                  " '%s' has assumed-rank", where, name);
1866     }
1867   else if (rank1 == 0)
1868     {
1869       gfc_error ("Rank mismatch in argument '%s' at %L "
1870                  "(scalar and rank-%d)", name, where, rank2);
1871     }
1872   else if (rank2 == 0)
1873     {
1874       gfc_error ("Rank mismatch in argument '%s' at %L "
1875                  "(rank-%d and scalar)", name, where, rank1);
1876     }
1877   else
1878     {
1879       gfc_error ("Rank mismatch in argument '%s' at %L "
1880                  "(rank-%d and rank-%d)", name, where, rank1, rank2);
1881     }
1882 }
1883
1884
1885 /* Given a symbol of a formal argument list and an expression, see if
1886    the two are compatible as arguments.  Returns nonzero if
1887    compatible, zero if not compatible.  */
1888
1889 static int
1890 compare_parameter (gfc_symbol *formal, gfc_expr *actual,
1891                    int ranks_must_agree, int is_elemental, locus *where)
1892 {
1893   gfc_ref *ref;
1894   bool rank_check, is_pointer;
1895
1896   /* If the formal arg has type BT_VOID, it's to one of the iso_c_binding
1897      procs c_f_pointer or c_f_procpointer, and we need to accept most
1898      pointers the user could give us.  This should allow that.  */
1899   if (formal->ts.type == BT_VOID)
1900     return 1;
1901
1902   if (formal->ts.type == BT_DERIVED
1903       && formal->ts.u.derived && formal->ts.u.derived->ts.is_iso_c
1904       && actual->ts.type == BT_DERIVED
1905       && actual->ts.u.derived && actual->ts.u.derived->ts.is_iso_c)
1906     return 1;
1907
1908   if (formal->ts.type == BT_CLASS && actual->ts.type == BT_DERIVED)
1909     /* Make sure the vtab symbol is present when
1910        the module variables are generated.  */
1911     gfc_find_derived_vtab (actual->ts.u.derived);
1912
1913   if (actual->ts.type == BT_PROCEDURE)
1914     {
1915       char err[200];
1916       gfc_symbol *act_sym = actual->symtree->n.sym;
1917
1918       if (formal->attr.flavor != FL_PROCEDURE)
1919         {
1920           if (where)
1921             gfc_error ("Invalid procedure argument at %L", &actual->where);
1922           return 0;
1923         }
1924
1925       if (!gfc_compare_interfaces (formal, act_sym, act_sym->name, 0, 1, err,
1926                                    sizeof(err), NULL, NULL))
1927         {
1928           if (where)
1929             gfc_error ("Interface mismatch in dummy procedure '%s' at %L: %s",
1930                        formal->name, &actual->where, err);
1931           return 0;
1932         }
1933
1934       if (formal->attr.function && !act_sym->attr.function)
1935         {
1936           gfc_add_function (&act_sym->attr, act_sym->name,
1937           &act_sym->declared_at);
1938           if (act_sym->ts.type == BT_UNKNOWN
1939               && !gfc_set_default_type (act_sym, 1, act_sym->ns))
1940             return 0;
1941         }
1942       else if (formal->attr.subroutine && !act_sym->attr.subroutine)
1943         gfc_add_subroutine (&act_sym->attr, act_sym->name,
1944                             &act_sym->declared_at);
1945
1946       return 1;
1947     }
1948
1949   /* F2008, C1241.  */
1950   if (formal->attr.pointer && formal->attr.contiguous
1951       && !gfc_is_simply_contiguous (actual, true))
1952     {
1953       if (where)
1954         gfc_error ("Actual argument to contiguous pointer dummy '%s' at %L "
1955                    "must be simply contiguous", formal->name, &actual->where);
1956       return 0;
1957     }
1958
1959   if ((actual->expr_type != EXPR_NULL || actual->ts.type != BT_UNKNOWN)
1960       && actual->ts.type != BT_HOLLERITH
1961       && formal->ts.type != BT_ASSUMED
1962       && !(formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
1963       && !gfc_compare_types (&formal->ts, &actual->ts)
1964       && !(formal->ts.type == BT_DERIVED && actual->ts.type == BT_CLASS
1965            && gfc_compare_derived_types (formal->ts.u.derived,
1966                                          CLASS_DATA (actual)->ts.u.derived)))
1967     {
1968       if (where)
1969         gfc_error ("Type mismatch in argument '%s' at %L; passed %s to %s",
1970                    formal->name, &actual->where, gfc_typename (&actual->ts),
1971                    gfc_typename (&formal->ts));
1972       return 0;
1973     }
1974
1975   /* F2008, 12.5.2.5; IR F08/0073.  */
1976   if (formal->ts.type == BT_CLASS && formal->attr.class_ok
1977       && actual->expr_type != EXPR_NULL
1978       && ((CLASS_DATA (formal)->attr.class_pointer
1979            && !formal->attr.intent == INTENT_IN)
1980           || CLASS_DATA (formal)->attr.allocatable))
1981     {
1982       if (actual->ts.type != BT_CLASS)
1983         {
1984           if (where)
1985             gfc_error ("Actual argument to '%s' at %L must be polymorphic",
1986                         formal->name, &actual->where);
1987           return 0;
1988         }
1989
1990       if (!gfc_expr_attr (actual).class_ok)
1991         return 0;
1992
1993       if (!gfc_compare_derived_types (CLASS_DATA (actual)->ts.u.derived,
1994                                       CLASS_DATA (formal)->ts.u.derived))
1995         {
1996           if (where)
1997             gfc_error ("Actual argument to '%s' at %L must have the same "
1998                        "declared type", formal->name, &actual->where);
1999           return 0;
2000         }
2001     }
2002
2003   /* F08: 12.5.2.5 Allocatable and pointer dummy variables.  However, this
2004      is necessary also for F03, so retain error for both.
2005      NOTE: Other type/kind errors pre-empt this error.  Since they are F03
2006      compatible, no attempt has been made to channel to this one.  */
2007   if (UNLIMITED_POLY (formal) && !UNLIMITED_POLY (actual)
2008       && (CLASS_DATA (formal)->attr.allocatable
2009           ||CLASS_DATA (formal)->attr.class_pointer))
2010     {
2011       if (where)
2012         gfc_error ("Actual argument to '%s' at %L must be unlimited "
2013                    "polymorphic since the formal argument is a "
2014                    "pointer or allocatable unlimited polymorphic "
2015                    "entity [F2008: 12.5.2.5]", formal->name,
2016                    &actual->where);
2017       return 0;
2018     }
2019
2020   if (formal->attr.codimension && !gfc_is_coarray (actual))
2021     {
2022       if (where)
2023         gfc_error ("Actual argument to '%s' at %L must be a coarray",
2024                        formal->name, &actual->where);
2025       return 0;
2026     }
2027
2028   if (formal->attr.codimension && formal->attr.allocatable)
2029     {
2030       gfc_ref *last = NULL;
2031
2032       for (ref = actual->ref; ref; ref = ref->next)
2033         if (ref->type == REF_COMPONENT)
2034           last = ref;
2035
2036       /* F2008, 12.5.2.6.  */
2037       if ((last && last->u.c.component->as->corank != formal->as->corank)
2038           || (!last
2039               && actual->symtree->n.sym->as->corank != formal->as->corank))
2040         {
2041           if (where)
2042             gfc_error ("Corank mismatch in argument '%s' at %L (%d and %d)",
2043                    formal->name, &actual->where, formal->as->corank,
2044                    last ? last->u.c.component->as->corank
2045                         : actual->symtree->n.sym->as->corank);
2046           return 0;
2047         }
2048     }
2049
2050   if (formal->attr.codimension)
2051     {
2052       /* F2008, 12.5.2.8.  */
2053       if (formal->attr.dimension
2054           && (formal->attr.contiguous || formal->as->type != AS_ASSUMED_SHAPE)
2055           && gfc_expr_attr (actual).dimension
2056           && !gfc_is_simply_contiguous (actual, true))
2057         {
2058           if (where)
2059             gfc_error ("Actual argument to '%s' at %L must be simply "
2060                        "contiguous", formal->name, &actual->where);
2061           return 0;
2062         }
2063
2064       /* F2008, C1303 and C1304.  */
2065       if (formal->attr.intent != INTENT_INOUT
2066           && (((formal->ts.type == BT_DERIVED || formal->ts.type == BT_CLASS)
2067                && formal->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
2068                && formal->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
2069               || formal->attr.lock_comp))
2070
2071         {
2072           if (where)
2073             gfc_error ("Actual argument to non-INTENT(INOUT) dummy '%s' at %L, "
2074                        "which is LOCK_TYPE or has a LOCK_TYPE component",
2075                        formal->name, &actual->where);
2076           return 0;
2077         }
2078     }
2079
2080   /* F2008, C1239/C1240.  */
2081   if (actual->expr_type == EXPR_VARIABLE
2082       && (actual->symtree->n.sym->attr.asynchronous
2083          || actual->symtree->n.sym->attr.volatile_)
2084       &&  (formal->attr.asynchronous || formal->attr.volatile_)
2085       && actual->rank && !gfc_is_simply_contiguous (actual, true)
2086       && ((formal->as->type != AS_ASSUMED_SHAPE
2087            && formal->as->type != AS_ASSUMED_RANK && !formal->attr.pointer)
2088           || formal->attr.contiguous))
2089     {
2090       if (where)
2091         gfc_error ("Dummy argument '%s' has to be a pointer, assumed-shape or "
2092                    "assumed-rank array without CONTIGUOUS attribute - as actual"
2093                    " argument at %L is not simply contiguous and both are "
2094                    "ASYNCHRONOUS or VOLATILE", formal->name, &actual->where);
2095       return 0;
2096     }
2097
2098   if (formal->attr.allocatable && !formal->attr.codimension
2099       && gfc_expr_attr (actual).codimension)
2100     {
2101       if (formal->attr.intent == INTENT_OUT)
2102         {
2103           if (where)
2104             gfc_error ("Passing coarray at %L to allocatable, noncoarray, "
2105                        "INTENT(OUT) dummy argument '%s'", &actual->where,
2106                        formal->name);
2107             return 0;
2108         }
2109       else if (gfc_option.warn_surprising && where
2110                && formal->attr.intent != INTENT_IN)
2111         gfc_warning ("Passing coarray at %L to allocatable, noncoarray dummy "
2112                      "argument '%s', which is invalid if the allocation status"
2113                      " is modified",  &actual->where, formal->name);
2114     }
2115
2116   /* If the rank is the same or the formal argument has assumed-rank.  */
2117   if (symbol_rank (formal) == actual->rank || symbol_rank (formal) == -1)
2118     return 1;
2119
2120   if (actual->ts.type == BT_CLASS && CLASS_DATA (actual)->as
2121         && CLASS_DATA (actual)->as->rank == symbol_rank (formal))
2122     return 1;
2123
2124   rank_check = where != NULL && !is_elemental && formal->as
2125                && (formal->as->type == AS_ASSUMED_SHAPE
2126                    || formal->as->type == AS_DEFERRED)
2127                && actual->expr_type != EXPR_NULL;
2128
2129   /* Skip rank checks for NO_ARG_CHECK.  */
2130   if (formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
2131     return 1;
2132
2133   /* Scalar & coindexed, see: F2008, Section 12.5.2.4.  */
2134   if (rank_check || ranks_must_agree
2135       || (formal->attr.pointer && actual->expr_type != EXPR_NULL)
2136       || (actual->rank != 0 && !(is_elemental || formal->attr.dimension))
2137       || (actual->rank == 0
2138           && ((formal->ts.type == BT_CLASS
2139                && CLASS_DATA (formal)->as->type == AS_ASSUMED_SHAPE)
2140               || (formal->ts.type != BT_CLASS
2141                    && formal->as->type == AS_ASSUMED_SHAPE))
2142           && actual->expr_type != EXPR_NULL)
2143       || (actual->rank == 0 && formal->attr.dimension
2144           && gfc_is_coindexed (actual)))
2145     {
2146       if (where)
2147         argument_rank_mismatch (formal->name, &actual->where,
2148                                 symbol_rank (formal), actual->rank);
2149       return 0;
2150     }
2151   else if (actual->rank != 0 && (is_elemental || formal->attr.dimension))
2152     return 1;
2153
2154   /* At this point, we are considering a scalar passed to an array.   This
2155      is valid (cf. F95 12.4.1.1, F2003 12.4.1.2, and F2008 12.5.2.4),
2156      - if the actual argument is (a substring of) an element of a
2157        non-assumed-shape/non-pointer/non-polymorphic array; or
2158      - (F2003) if the actual argument is of type character of default/c_char
2159        kind.  */
2160
2161   is_pointer = actual->expr_type == EXPR_VARIABLE
2162                ? actual->symtree->n.sym->attr.pointer : false;
2163
2164   for (ref = actual->ref; ref; ref = ref->next)
2165     {
2166       if (ref->type == REF_COMPONENT)
2167         is_pointer = ref->u.c.component->attr.pointer;
2168       else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT
2169                && ref->u.ar.dimen > 0
2170                && (!ref->next
2171                    || (ref->next->type == REF_SUBSTRING && !ref->next->next)))
2172         break;
2173     }
2174
2175   if (actual->ts.type == BT_CLASS && actual->expr_type != EXPR_NULL)
2176     {
2177       if (where)
2178         gfc_error ("Polymorphic scalar passed to array dummy argument '%s' "
2179                    "at %L", formal->name, &actual->where);
2180       return 0;
2181     }
2182
2183   if (actual->expr_type != EXPR_NULL && ref && actual->ts.type != BT_CHARACTER
2184       && (is_pointer || ref->u.ar.as->type == AS_ASSUMED_SHAPE))
2185     {
2186       if (where)
2187         gfc_error ("Element of assumed-shaped or pointer "
2188                    "array passed to array dummy argument '%s' at %L",
2189                    formal->name, &actual->where);
2190       return 0;
2191     }
2192
2193   if (actual->ts.type == BT_CHARACTER && actual->expr_type != EXPR_NULL
2194       && (!ref || is_pointer || ref->u.ar.as->type == AS_ASSUMED_SHAPE))
2195     {
2196       if (formal->ts.kind != 1 && (gfc_option.allow_std & GFC_STD_GNU) == 0)
2197         {
2198           if (where)
2199             gfc_error ("Extension: Scalar non-default-kind, non-C_CHAR-kind "
2200                        "CHARACTER actual argument with array dummy argument "
2201                        "'%s' at %L", formal->name, &actual->where);
2202           return 0;
2203         }
2204
2205       if (where && (gfc_option.allow_std & GFC_STD_F2003) == 0)
2206         {
2207           gfc_error ("Fortran 2003: Scalar CHARACTER actual argument with "
2208                      "array dummy argument '%s' at %L",
2209                      formal->name, &actual->where);
2210           return 0;
2211         }
2212       else if ((gfc_option.allow_std & GFC_STD_F2003) == 0)
2213         return 0;
2214       else
2215         return 1;
2216     }
2217
2218   if (ref == NULL && actual->expr_type != EXPR_NULL)
2219     {
2220       if (where)
2221         argument_rank_mismatch (formal->name, &actual->where,
2222                                 symbol_rank (formal), actual->rank);
2223       return 0;
2224     }
2225
2226   return 1;
2227 }
2228
2229
2230 /* Returns the storage size of a symbol (formal argument) or
2231    zero if it cannot be determined.  */
2232
2233 static unsigned long
2234 get_sym_storage_size (gfc_symbol *sym)
2235 {
2236   int i;
2237   unsigned long strlen, elements;
2238
2239   if (sym->ts.type == BT_CHARACTER)
2240     {
2241       if (sym->ts.u.cl && sym->ts.u.cl->length
2242           && sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
2243         strlen = mpz_get_ui (sym->ts.u.cl->length->value.integer);
2244       else
2245         return 0;
2246     }
2247   else
2248     strlen = 1;
2249
2250   if (symbol_rank (sym) == 0)
2251     return strlen;
2252
2253   elements = 1;
2254   if (sym->as->type != AS_EXPLICIT)
2255     return 0;
2256   for (i = 0; i < sym->as->rank; i++)
2257     {
2258       if (sym->as->upper[i]->expr_type != EXPR_CONSTANT
2259           || sym->as->lower[i]->expr_type != EXPR_CONSTANT)
2260         return 0;
2261
2262       elements *= mpz_get_si (sym->as->upper[i]->value.integer)
2263                   - mpz_get_si (sym->as->lower[i]->value.integer) + 1L;
2264     }
2265
2266   return strlen*elements;
2267 }
2268
2269
2270 /* Returns the storage size of an expression (actual argument) or
2271    zero if it cannot be determined. For an array element, it returns
2272    the remaining size as the element sequence consists of all storage
2273    units of the actual argument up to the end of the array.  */
2274
2275 static unsigned long
2276 get_expr_storage_size (gfc_expr *e)
2277 {
2278   int i;
2279   long int strlen, elements;
2280   long int substrlen = 0;
2281   bool is_str_storage = false;
2282   gfc_ref *ref;
2283
2284   if (e == NULL)
2285     return 0;
2286
2287   if (e->ts.type == BT_CHARACTER)
2288     {
2289       if (e->ts.u.cl && e->ts.u.cl->length
2290           && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
2291         strlen = mpz_get_si (e->ts.u.cl->length->value.integer);
2292       else if (e->expr_type == EXPR_CONSTANT
2293                && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
2294         strlen = e->value.character.length;
2295       else
2296         return 0;
2297     }
2298   else
2299     strlen = 1; /* Length per element.  */
2300
2301   if (e->rank == 0 && !e->ref)
2302     return strlen;
2303
2304   elements = 1;
2305   if (!e->ref)
2306     {
2307       if (!e->shape)
2308         return 0;
2309       for (i = 0; i < e->rank; i++)
2310         elements *= mpz_get_si (e->shape[i]);
2311       return elements*strlen;
2312     }
2313
2314   for (ref = e->ref; ref; ref = ref->next)
2315     {
2316       if (ref->type == REF_SUBSTRING && ref->u.ss.start
2317           && ref->u.ss.start->expr_type == EXPR_CONSTANT)
2318         {
2319           if (is_str_storage)
2320             {
2321               /* The string length is the substring length.
2322                  Set now to full string length.  */
2323               if (!ref->u.ss.length || !ref->u.ss.length->length
2324                   || ref->u.ss.length->length->expr_type != EXPR_CONSTANT)
2325                 return 0;
2326
2327               strlen = mpz_get_ui (ref->u.ss.length->length->value.integer);
2328             }
2329           substrlen = strlen - mpz_get_ui (ref->u.ss.start->value.integer) + 1;
2330           continue;
2331         }
2332
2333       if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2334         for (i = 0; i < ref->u.ar.dimen; i++)
2335           {
2336             long int start, end, stride;
2337             stride = 1;
2338
2339             if (ref->u.ar.stride[i])
2340               {
2341                 if (ref->u.ar.stride[i]->expr_type == EXPR_CONSTANT)
2342                   stride = mpz_get_si (ref->u.ar.stride[i]->value.integer);
2343                 else
2344                   return 0;
2345               }
2346
2347             if (ref->u.ar.start[i])
2348               {
2349                 if (ref->u.ar.start[i]->expr_type == EXPR_CONSTANT)
2350                   start = mpz_get_si (ref->u.ar.start[i]->value.integer);
2351                 else
2352                   return 0;
2353               }
2354             else if (ref->u.ar.as->lower[i]
2355                      && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT)
2356               start = mpz_get_si (ref->u.ar.as->lower[i]->value.integer);
2357             else
2358               return 0;
2359
2360             if (ref->u.ar.end[i])
2361               {
2362                 if (ref->u.ar.end[i]->expr_type == EXPR_CONSTANT)
2363                   end = mpz_get_si (ref->u.ar.end[i]->value.integer);
2364                 else
2365                   return 0;
2366               }
2367             else if (ref->u.ar.as->upper[i]
2368                      && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT)
2369               end = mpz_get_si (ref->u.ar.as->upper[i]->value.integer);
2370             else
2371               return 0;
2372
2373             elements *= (end - start)/stride + 1L;
2374           }
2375       else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_FULL)
2376         for (i = 0; i < ref->u.ar.as->rank; i++)
2377           {
2378             if (ref->u.ar.as->lower[i] && ref->u.ar.as->upper[i]
2379                 && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT
2380                 && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT)
2381               elements *= mpz_get_si (ref->u.ar.as->upper[i]->value.integer)
2382                           - mpz_get_si (ref->u.ar.as->lower[i]->value.integer)
2383                           + 1L;
2384             else
2385               return 0;
2386           }
2387       else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT
2388                && e->expr_type == EXPR_VARIABLE)
2389         {
2390           if (ref->u.ar.as->type == AS_ASSUMED_SHAPE
2391               || e->symtree->n.sym->attr.pointer)
2392             {
2393               elements = 1;
2394               continue;
2395             }
2396
2397           /* Determine the number of remaining elements in the element
2398              sequence for array element designators.  */
2399           is_str_storage = true;
2400           for (i = ref->u.ar.dimen - 1; i >= 0; i--)
2401             {
2402               if (ref->u.ar.start[i] == NULL
2403                   || ref->u.ar.start[i]->expr_type != EXPR_CONSTANT
2404                   || ref->u.ar.as->upper[i] == NULL
2405                   || ref->u.ar.as->lower[i] == NULL
2406                   || ref->u.ar.as->upper[i]->expr_type != EXPR_CONSTANT
2407                   || ref->u.ar.as->lower[i]->expr_type != EXPR_CONSTANT)
2408                 return 0;
2409
2410               elements
2411                    = elements
2412                      * (mpz_get_si (ref->u.ar.as->upper[i]->value.integer)
2413                         - mpz_get_si (ref->u.ar.as->lower[i]->value.integer)
2414                         + 1L)
2415                      - (mpz_get_si (ref->u.ar.start[i]->value.integer)
2416                         - mpz_get_si (ref->u.ar.as->lower[i]->value.integer));
2417             }
2418         }
2419     }
2420
2421   if (substrlen)
2422     return (is_str_storage) ? substrlen + (elements-1)*strlen
2423                             : elements*strlen;
2424   else
2425     return elements*strlen;
2426 }
2427
2428
2429 /* Given an expression, check whether it is an array section
2430    which has a vector subscript. If it has, one is returned,
2431    otherwise zero.  */
2432
2433 int
2434 gfc_has_vector_subscript (gfc_expr *e)
2435 {
2436   int i;
2437   gfc_ref *ref;
2438
2439   if (e == NULL || e->rank == 0 || e->expr_type != EXPR_VARIABLE)
2440     return 0;
2441
2442   for (ref = e->ref; ref; ref = ref->next)
2443     if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2444       for (i = 0; i < ref->u.ar.dimen; i++)
2445         if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
2446           return 1;
2447
2448   return 0;
2449 }
2450
2451
2452 /* Given formal and actual argument lists, see if they are compatible.
2453    If they are compatible, the actual argument list is sorted to
2454    correspond with the formal list, and elements for missing optional
2455    arguments are inserted. If WHERE pointer is nonnull, then we issue
2456    errors when things don't match instead of just returning the status
2457    code.  */
2458
2459 static int
2460 compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
2461                        int ranks_must_agree, int is_elemental, locus *where)
2462 {
2463   gfc_actual_arglist **new_arg, *a, *actual, temp;
2464   gfc_formal_arglist *f;
2465   int i, n, na;
2466   unsigned long actual_size, formal_size;
2467   bool full_array = false;
2468
2469   actual = *ap;
2470
2471   if (actual == NULL && formal == NULL)
2472     return 1;
2473
2474   n = 0;
2475   for (f = formal; f; f = f->next)
2476     n++;
2477
2478   new_arg = XALLOCAVEC (gfc_actual_arglist *, n);
2479
2480   for (i = 0; i < n; i++)
2481     new_arg[i] = NULL;
2482
2483   na = 0;
2484   f = formal;
2485   i = 0;
2486
2487   for (a = actual; a; a = a->next, f = f->next)
2488     {
2489       /* Look for keywords but ignore g77 extensions like %VAL.  */
2490       if (a->name != NULL && a->name[0] != '%')
2491         {
2492           i = 0;
2493           for (f = formal; f; f = f->next, i++)
2494             {
2495               if (f->sym == NULL)
2496                 continue;
2497               if (strcmp (f->sym->name, a->name) == 0)
2498                 break;
2499             }
2500
2501           if (f == NULL)
2502             {
2503               if (where)
2504                 gfc_error ("Keyword argument '%s' at %L is not in "
2505                            "the procedure", a->name, &a->expr->where);
2506               return 0;
2507             }
2508
2509           if (new_arg[i] != NULL)
2510             {
2511               if (where)
2512                 gfc_error ("Keyword argument '%s' at %L is already associated "
2513                            "with another actual argument", a->name,
2514                            &a->expr->where);
2515               return 0;
2516             }
2517         }
2518
2519       if (f == NULL)
2520         {
2521           if (where)
2522             gfc_error ("More actual than formal arguments in procedure "
2523                        "call at %L", where);
2524
2525           return 0;
2526         }
2527
2528       if (f->sym == NULL && a->expr == NULL)
2529         goto match;
2530
2531       if (f->sym == NULL)
2532         {
2533           if (where)
2534             gfc_error ("Missing alternate return spec in subroutine call "
2535                        "at %L", where);
2536           return 0;
2537         }
2538
2539       if (a->expr == NULL)
2540         {
2541           if (where)
2542             gfc_error ("Unexpected alternate return spec in subroutine "
2543                        "call at %L", where);
2544           return 0;
2545         }
2546
2547       /* Make sure that intrinsic vtables exist for calls to unlimited
2548          polymorphic formal arguments.  */
2549       if (UNLIMITED_POLY (f->sym)
2550           && a->expr->ts.type != BT_DERIVED
2551           && a->expr->ts.type != BT_CLASS)
2552         gfc_find_intrinsic_vtab (&a->expr->ts);
2553
2554       if (a->expr->expr_type == EXPR_NULL
2555           && ((f->sym->ts.type != BT_CLASS && !f->sym->attr.pointer
2556                && (f->sym->attr.allocatable || !f->sym->attr.optional
2557                    || (gfc_option.allow_std & GFC_STD_F2008) == 0))
2558               || (f->sym->ts.type == BT_CLASS
2559                   && !CLASS_DATA (f->sym)->attr.class_pointer
2560                   && (CLASS_DATA (f->sym)->attr.allocatable
2561                       || !f->sym->attr.optional
2562                       || (gfc_option.allow_std & GFC_STD_F2008) == 0))))
2563         {
2564           if (where
2565               && (!f->sym->attr.optional
2566                   || (f->sym->ts.type != BT_CLASS && f->sym->attr.allocatable)
2567                   || (f->sym->ts.type == BT_CLASS
2568                          && CLASS_DATA (f->sym)->attr.allocatable)))
2569             gfc_error ("Unexpected NULL() intrinsic at %L to dummy '%s'",
2570                        where, f->sym->name);
2571           else if (where)
2572             gfc_error ("Fortran 2008: Null pointer at %L to non-pointer "
2573                        "dummy '%s'", where, f->sym->name);
2574
2575           return 0;
2576         }
2577
2578       if (!compare_parameter (f->sym, a->expr, ranks_must_agree,
2579                               is_elemental, where))
2580         return 0;
2581
2582       /* TS 29113, 6.3p2.  */
2583       if (f->sym->ts.type == BT_ASSUMED
2584           && (a->expr->ts.type == BT_DERIVED
2585               || (a->expr->ts.type == BT_CLASS && CLASS_DATA (a->expr))))
2586         {
2587           gfc_namespace *f2k_derived;
2588
2589           f2k_derived = a->expr->ts.type == BT_DERIVED
2590                         ? a->expr->ts.u.derived->f2k_derived
2591                         : CLASS_DATA (a->expr)->ts.u.derived->f2k_derived;
2592
2593           if (f2k_derived
2594               && (f2k_derived->finalizers || f2k_derived->tb_sym_root))
2595             {
2596               gfc_error ("Actual argument at %L to assumed-type dummy is of "
2597                          "derived type with type-bound or FINAL procedures",
2598                          &a->expr->where);
2599               return false;
2600             }
2601         }
2602
2603       /* Special case for character arguments.  For allocatable, pointer
2604          and assumed-shape dummies, the string length needs to match
2605          exactly.  */
2606       if (a->expr->ts.type == BT_CHARACTER
2607            && a->expr->ts.u.cl && a->expr->ts.u.cl->length
2608            && a->expr->ts.u.cl->length->expr_type == EXPR_CONSTANT
2609            && f->sym->ts.u.cl && f->sym->ts.u.cl && f->sym->ts.u.cl->length
2610            && f->sym->ts.u.cl->length->expr_type == EXPR_CONSTANT
2611            && (f->sym->attr.pointer || f->sym->attr.allocatable
2612                || (f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
2613            && (mpz_cmp (a->expr->ts.u.cl->length->value.integer,
2614                         f->sym->ts.u.cl->length->value.integer) != 0))
2615          {
2616            if (where && (f->sym->attr.pointer || f->sym->attr.allocatable))
2617              gfc_warning ("Character length mismatch (%ld/%ld) between actual "
2618                           "argument and pointer or allocatable dummy argument "
2619                           "'%s' at %L",
2620                           mpz_get_si (a->expr->ts.u.cl->length->value.integer),
2621                           mpz_get_si (f->sym->ts.u.cl->length->value.integer),
2622                           f->sym->name, &a->expr->where);
2623            else if (where)
2624              gfc_warning ("Character length mismatch (%ld/%ld) between actual "
2625                           "argument and assumed-shape dummy argument '%s' "
2626                           "at %L",
2627                           mpz_get_si (a->expr->ts.u.cl->length->value.integer),
2628                           mpz_get_si (f->sym->ts.u.cl->length->value.integer),
2629                           f->sym->name, &a->expr->where);
2630            return 0;
2631          }
2632
2633       if ((f->sym->attr.pointer || f->sym->attr.allocatable)
2634             && f->sym->ts.deferred != a->expr->ts.deferred
2635             && a->expr->ts.type == BT_CHARACTER)
2636         {
2637           if (where)
2638             gfc_error ("Actual argument at %L to allocatable or "
2639                        "pointer dummy argument '%s' must have a deferred "
2640                        "length type parameter if and only if the dummy has one",
2641                        &a->expr->where, f->sym->name);
2642           return 0;
2643         }
2644
2645       if (f->sym->ts.type == BT_CLASS)
2646         goto skip_size_check;
2647
2648       actual_size = get_expr_storage_size (a->expr);
2649       formal_size = get_sym_storage_size (f->sym);
2650       if (actual_size != 0 && actual_size < formal_size
2651           && a->expr->ts.type != BT_PROCEDURE
2652           && f->sym->attr.flavor != FL_PROCEDURE)
2653         {
2654           if (a->expr->ts.type == BT_CHARACTER && !f->sym->as && where)
2655             gfc_warning ("Character length of actual argument shorter "
2656                          "than of dummy argument '%s' (%lu/%lu) at %L",
2657                          f->sym->name, actual_size, formal_size,
2658                          &a->expr->where);
2659           else if (where)
2660             gfc_warning ("Actual argument contains too few "
2661                          "elements for dummy argument '%s' (%lu/%lu) at %L",
2662                          f->sym->name, actual_size, formal_size,
2663                          &a->expr->where);
2664           return  0;
2665         }
2666
2667      skip_size_check:
2668
2669       /* Satisfy F03:12.4.1.3 by ensuring that a procedure pointer actual
2670          argument is provided for a procedure pointer formal argument.  */
2671       if (f->sym->attr.proc_pointer
2672           && !((a->expr->expr_type == EXPR_VARIABLE
2673                 && a->expr->symtree->n.sym->attr.proc_pointer)
2674                || (a->expr->expr_type == EXPR_FUNCTION
2675                    && a->expr->symtree->n.sym->result->attr.proc_pointer)
2676                || gfc_is_proc_ptr_comp (a->expr)))
2677         {
2678           if (where)
2679             gfc_error ("Expected a procedure pointer for argument '%s' at %L",
2680                        f->sym->name, &a->expr->where);
2681           return 0;
2682         }
2683
2684       /* Satisfy F03:12.4.1.3 by ensuring that a procedure actual argument is
2685          provided for a procedure formal argument.  */
2686       if (f->sym->attr.flavor == FL_PROCEDURE
2687           && gfc_expr_attr (a->expr).flavor != FL_PROCEDURE)
2688         {
2689           if (where)
2690             gfc_error ("Expected a procedure for argument '%s' at %L",
2691                        f->sym->name, &a->expr->where);
2692           return 0;
2693         }
2694
2695       if (f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE
2696           && a->expr->expr_type == EXPR_VARIABLE
2697           && a->expr->symtree->n.sym->as
2698           && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SIZE
2699           && (a->expr->ref == NULL
2700               || (a->expr->ref->type == REF_ARRAY
2701                   && a->expr->ref->u.ar.type == AR_FULL)))
2702         {
2703           if (where)
2704             gfc_error ("Actual argument for '%s' cannot be an assumed-size"
2705                        " array at %L", f->sym->name, where);
2706           return 0;
2707         }
2708
2709       if (a->expr->expr_type != EXPR_NULL
2710           && compare_pointer (f->sym, a->expr) == 0)
2711         {
2712           if (where)
2713             gfc_error ("Actual argument for '%s' must be a pointer at %L",
2714                        f->sym->name, &a->expr->where);
2715           return 0;
2716         }
2717
2718       if (a->expr->expr_type != EXPR_NULL
2719           && (gfc_option.allow_std & GFC_STD_F2008) == 0
2720           && compare_pointer (f->sym, a->expr) == 2)
2721         {
2722           if (where)
2723             gfc_error ("Fortran 2008: Non-pointer actual argument at %L to "
2724                        "pointer dummy '%s'", &a->expr->where,f->sym->name);
2725           return 0;
2726         }
2727
2728
2729       /* Fortran 2008, C1242.  */
2730       if (f->sym->attr.pointer && gfc_is_coindexed (a->expr))
2731         {
2732           if (where)
2733             gfc_error ("Coindexed actual argument at %L to pointer "
2734                        "dummy '%s'",
2735                        &a->expr->where, f->sym->name);
2736           return 0;
2737         }
2738
2739       /* Fortran 2008, 12.5.2.5 (no constraint).  */
2740       if (a->expr->expr_type == EXPR_VARIABLE
2741           && f->sym->attr.intent != INTENT_IN
2742           && f->sym->attr.allocatable
2743           && gfc_is_coindexed (a->expr))
2744         {
2745           if (where)
2746             gfc_error ("Coindexed actual argument at %L to allocatable "
2747                        "dummy '%s' requires INTENT(IN)",
2748                        &a->expr->where, f->sym->name);
2749           return 0;
2750         }
2751
2752       /* Fortran 2008, C1237.  */
2753       if (a->expr->expr_type == EXPR_VARIABLE
2754           && (f->sym->attr.asynchronous || f->sym->attr.volatile_)
2755           && gfc_is_coindexed (a->expr)
2756           && (a->expr->symtree->n.sym->attr.volatile_
2757               || a->expr->symtree->n.sym->attr.asynchronous))
2758         {
2759           if (where)
2760             gfc_error ("Coindexed ASYNCHRONOUS or VOLATILE actual argument at "
2761                        "%L requires that dummy '%s' has neither "
2762                        "ASYNCHRONOUS nor VOLATILE", &a->expr->where,
2763                        f->sym->name);
2764           return 0;
2765         }
2766
2767       /* Fortran 2008, 12.5.2.4 (no constraint).  */
2768       if (a->expr->expr_type == EXPR_VARIABLE
2769           && f->sym->attr.intent != INTENT_IN && !f->sym->attr.value
2770           && gfc_is_coindexed (a->expr)
2771           && gfc_has_ultimate_allocatable (a->expr))
2772         {
2773           if (where)
2774             gfc_error ("Coindexed actual argument at %L with allocatable "
2775                        "ultimate component to dummy '%s' requires either VALUE "
2776                        "or INTENT(IN)", &a->expr->where, f->sym->name);
2777           return 0;
2778         }
2779
2780      if (f->sym->ts.type == BT_CLASS
2781            && CLASS_DATA (f->sym)->attr.allocatable
2782            && gfc_is_class_array_ref (a->expr, &full_array)
2783            && !full_array)
2784         {
2785           if (where)
2786             gfc_error ("Actual CLASS array argument for '%s' must be a full "
2787                        "array at %L", f->sym->name, &a->expr->where);
2788           return 0;
2789         }
2790
2791
2792       if (a->expr->expr_type != EXPR_NULL
2793           && compare_allocatable (f->sym, a->expr) == 0)
2794         {
2795           if (where)
2796             gfc_error ("Actual argument for '%s' must be ALLOCATABLE at %L",
2797                        f->sym->name, &a->expr->where);
2798           return 0;
2799         }
2800
2801       /* Check intent = OUT/INOUT for definable actual argument.  */
2802       if ((f->sym->attr.intent == INTENT_OUT
2803           || f->sym->attr.intent == INTENT_INOUT))
2804         {
2805           const char* context = (where
2806                                  ? _("actual argument to INTENT = OUT/INOUT")
2807                                  : NULL);
2808
2809           if (((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
2810                 && CLASS_DATA (f->sym)->attr.class_pointer)
2811                || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
2812               && !gfc_check_vardef_context (a->expr, true, false, false, context))
2813             return 0;
2814           if (!gfc_check_vardef_context (a->expr, false, false, false, context))
2815             return 0;
2816         }
2817
2818       if ((f->sym->attr.intent == INTENT_OUT
2819            || f->sym->attr.intent == INTENT_INOUT
2820            || f->sym->attr.volatile_
2821            || f->sym->attr.asynchronous)
2822           && gfc_has_vector_subscript (a->expr))
2823         {
2824           if (where)
2825             gfc_error ("Array-section actual argument with vector "
2826                        "subscripts at %L is incompatible with INTENT(OUT), "
2827                        "INTENT(INOUT), VOLATILE or ASYNCHRONOUS attribute "
2828                        "of the dummy argument '%s'",
2829                        &a->expr->where, f->sym->name);
2830           return 0;
2831         }
2832
2833       /* C1232 (R1221) For an actual argument which is an array section or
2834          an assumed-shape array, the dummy argument shall be an assumed-
2835          shape array, if the dummy argument has the VOLATILE attribute.  */
2836
2837       if (f->sym->attr.volatile_
2838           && a->expr->symtree->n.sym->as
2839           && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SHAPE
2840           && !(f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
2841         {
2842           if (where)
2843             gfc_error ("Assumed-shape actual argument at %L is "
2844                        "incompatible with the non-assumed-shape "
2845                        "dummy argument '%s' due to VOLATILE attribute",
2846                        &a->expr->where,f->sym->name);
2847           return 0;
2848         }
2849
2850       if (f->sym->attr.volatile_
2851           && a->expr->ref && a->expr->ref->u.ar.type == AR_SECTION
2852           && !(f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
2853         {
2854           if (where)
2855             gfc_error ("Array-section actual argument at %L is "
2856                        "incompatible with the non-assumed-shape "
2857                        "dummy argument '%s' due to VOLATILE attribute",
2858                        &a->expr->where,f->sym->name);
2859           return 0;
2860         }
2861
2862       /* C1233 (R1221) For an actual argument which is a pointer array, the
2863          dummy argument shall be an assumed-shape or pointer array, if the
2864          dummy argument has the VOLATILE attribute.  */
2865
2866       if (f->sym->attr.volatile_
2867           && a->expr->symtree->n.sym->attr.pointer
2868           && a->expr->symtree->n.sym->as
2869           && !(f->sym->as
2870                && (f->sym->as->type == AS_ASSUMED_SHAPE
2871                    || f->sym->attr.pointer)))
2872         {
2873           if (where)
2874             gfc_error ("Pointer-array actual argument at %L requires "
2875                        "an assumed-shape or pointer-array dummy "
2876                        "argument '%s' due to VOLATILE attribute",
2877                        &a->expr->where,f->sym->name);
2878           return 0;
2879         }
2880
2881     match:
2882       if (a == actual)
2883         na = i;
2884
2885       new_arg[i++] = a;
2886     }
2887
2888   /* Make sure missing actual arguments are optional.  */
2889   i = 0;
2890   for (f = formal; f; f = f->next, i++)
2891     {
2892       if (new_arg[i] != NULL)
2893         continue;
2894       if (f->sym == NULL)
2895         {
2896           if (where)
2897             gfc_error ("Missing alternate return spec in subroutine call "
2898                        "at %L", where);
2899           return 0;
2900         }
2901       if (!f->sym->attr.optional)
2902         {
2903           if (where)
2904             gfc_error ("Missing actual argument for argument '%s' at %L",
2905                        f->sym->name, where);
2906           return 0;
2907         }
2908     }
2909
2910   /* The argument lists are compatible.  We now relink a new actual
2911      argument list with null arguments in the right places.  The head
2912      of the list remains the head.  */
2913   for (i = 0; i < n; i++)
2914     if (new_arg[i] == NULL)
2915       new_arg[i] = gfc_get_actual_arglist ();
2916
2917   if (na != 0)
2918     {
2919       temp = *new_arg[0];
2920       *new_arg[0] = *actual;
2921       *actual = temp;
2922
2923       a = new_arg[0];
2924       new_arg[0] = new_arg[na];
2925       new_arg[na] = a;
2926     }
2927
2928   for (i = 0; i < n - 1; i++)
2929     new_arg[i]->next = new_arg[i + 1];
2930
2931   new_arg[i]->next = NULL;
2932
2933   if (*ap == NULL && n > 0)
2934     *ap = new_arg[0];
2935
2936   /* Note the types of omitted optional arguments.  */
2937   for (a = *ap, f = formal; a; a = a->next, f = f->next)
2938     if (a->expr == NULL && a->label == NULL)
2939       a->missing_arg_type = f->sym->ts.type;
2940
2941   return 1;
2942 }
2943
2944
2945 typedef struct
2946 {
2947   gfc_formal_arglist *f;
2948   gfc_actual_arglist *a;
2949 }
2950 argpair;
2951
2952 /* qsort comparison function for argument pairs, with the following
2953    order:
2954     - p->a->expr == NULL
2955     - p->a->expr->expr_type != EXPR_VARIABLE
2956     - growing p->a->expr->symbol.  */
2957
2958 static int
2959 pair_cmp (const void *p1, const void *p2)
2960 {
2961   const gfc_actual_arglist *a1, *a2;
2962
2963   /* *p1 and *p2 are elements of the to-be-sorted array.  */
2964   a1 = ((const argpair *) p1)->a;
2965   a2 = ((const argpair *) p2)->a;
2966   if (!a1->expr)
2967     {
2968       if (!a2->expr)
2969         return 0;
2970       return -1;
2971     }
2972   if (!a2->expr)
2973     return 1;
2974   if (a1->expr->expr_type != EXPR_VARIABLE)
2975     {
2976       if (a2->expr->expr_type != EXPR_VARIABLE)
2977         return 0;
2978       return -1;
2979     }
2980   if (a2->expr->expr_type != EXPR_VARIABLE)
2981     return 1;
2982   return a1->expr->symtree->n.sym < a2->expr->symtree->n.sym;
2983 }
2984
2985
2986 /* Given two expressions from some actual arguments, test whether they
2987    refer to the same expression. The analysis is conservative.
2988    Returning false will produce no warning.  */
2989
2990 static bool
2991 compare_actual_expr (gfc_expr *e1, gfc_expr *e2)
2992 {
2993   const gfc_ref *r1, *r2;
2994
2995   if (!e1 || !e2
2996       || e1->expr_type != EXPR_VARIABLE
2997       || e2->expr_type != EXPR_VARIABLE
2998       || e1->symtree->n.sym != e2->symtree->n.sym)
2999     return false;
3000
3001   /* TODO: improve comparison, see expr.c:show_ref().  */
3002   for (r1 = e1->ref, r2 = e2->ref; r1 && r2; r1 = r1->next, r2 = r2->next)
3003     {
3004       if (r1->type != r2->type)
3005         return false;
3006       switch (r1->type)
3007         {
3008         case REF_ARRAY:
3009           if (r1->u.ar.type != r2->u.ar.type)
3010             return false;
3011           /* TODO: At the moment, consider only full arrays;
3012              we could do better.  */
3013           if (r1->u.ar.type != AR_FULL || r2->u.ar.type != AR_FULL)
3014             return false;
3015           break;
3016
3017         case REF_COMPONENT:
3018           if (r1->u.c.component != r2->u.c.component)
3019             return false;
3020           break;
3021
3022         case REF_SUBSTRING:
3023           return false;
3024
3025         default:
3026           gfc_internal_error ("compare_actual_expr(): Bad component code");
3027         }
3028     }
3029   if (!r1 && !r2)
3030     return true;
3031   return false;
3032 }
3033
3034
3035 /* Given formal and actual argument lists that correspond to one
3036    another, check that identical actual arguments aren't not
3037    associated with some incompatible INTENTs.  */
3038
3039 static bool
3040 check_some_aliasing (gfc_formal_arglist *f, gfc_actual_arglist *a)
3041 {
3042   sym_intent f1_intent, f2_intent;
3043   gfc_formal_arglist *f1;
3044   gfc_actual_arglist *a1;
3045   size_t n, i, j;
3046   argpair *p;
3047   bool t = true;
3048
3049   n = 0;
3050   for (f1 = f, a1 = a;; f1 = f1->next, a1 = a1->next)
3051     {
3052       if (f1 == NULL && a1 == NULL)
3053         break;
3054       if (f1 == NULL || a1 == NULL)
3055         gfc_internal_error ("check_some_aliasing(): List mismatch");
3056       n++;
3057     }
3058   if (n == 0)
3059     return t;
3060   p = XALLOCAVEC (argpair, n);
3061
3062   for (i = 0, f1 = f, a1 = a; i < n; i++, f1 = f1->next, a1 = a1->next)
3063     {
3064       p[i].f = f1;
3065       p[i].a = a1;
3066     }
3067
3068   qsort (p, n, sizeof (argpair), pair_cmp);
3069
3070   for (i = 0; i < n; i++)
3071     {
3072       if (!p[i].a->expr
3073           || p[i].a->expr->expr_type != EXPR_VARIABLE
3074           || p[i].a->expr->ts.type == BT_PROCEDURE)
3075         continue;
3076       f1_intent = p[i].f->sym->attr.intent;
3077       for (j = i + 1; j < n; j++)
3078         {
3079           /* Expected order after the sort.  */
3080           if (!p[j].a->expr || p[j].a->expr->expr_type != EXPR_VARIABLE)
3081             gfc_internal_error ("check_some_aliasing(): corrupted data");
3082
3083           /* Are the expression the same?  */
3084           if (!compare_actual_expr (p[i].a->expr, p[j].a->expr))
3085             break;
3086           f2_intent = p[j].f->sym->attr.intent;
3087           if ((f1_intent == INTENT_IN && f2_intent == INTENT_OUT)
3088               || (f1_intent == INTENT_OUT && f2_intent == INTENT_IN)
3089               || (f1_intent == INTENT_OUT && f2_intent == INTENT_OUT))
3090             {
3091               gfc_warning ("Same actual argument associated with INTENT(%s) "
3092                            "argument '%s' and INTENT(%s) argument '%s' at %L",
3093                            gfc_intent_string (f1_intent), p[i].f->sym->name,
3094                            gfc_intent_string (f2_intent), p[j].f->sym->name,
3095                            &p[i].a->expr->where);
3096               t = false;
3097             }
3098         }
3099     }
3100
3101   return t;
3102 }
3103
3104
3105 /* Given formal and actual argument lists that correspond to one
3106    another, check that they are compatible in the sense that intents
3107    are not mismatched.  */
3108
3109 static bool
3110 check_intents (gfc_formal_arglist *f, gfc_actual_arglist *a)
3111 {
3112   sym_intent f_intent;
3113
3114   for (;; f = f->next, a = a->next)
3115     {
3116       if (f == NULL && a == NULL)
3117         break;
3118       if (f == NULL || a == NULL)
3119         gfc_internal_error ("check_intents(): List mismatch");
3120
3121       if (a->expr == NULL || a->expr->expr_type != EXPR_VARIABLE)
3122         continue;
3123
3124       f_intent = f->sym->attr.intent;
3125
3126       if (gfc_pure (NULL) && gfc_impure_variable (a->expr->symtree->n.sym))
3127         {
3128           if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3129                && CLASS_DATA (f->sym)->attr.class_pointer)
3130               || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
3131             {
3132               gfc_error ("Procedure argument at %L is local to a PURE "
3133                          "procedure and has the POINTER attribute",
3134                          &a->expr->where);
3135               return false;
3136             }
3137         }
3138
3139        /* Fortran 2008, C1283.  */
3140        if (gfc_pure (NULL) && gfc_is_coindexed (a->expr))
3141         {
3142           if (f_intent == INTENT_INOUT || f_intent == INTENT_OUT)
3143             {
3144               gfc_error ("Coindexed actual argument at %L in PURE procedure "
3145                          "is passed to an INTENT(%s) argument",
3146                          &a->expr->where, gfc_intent_string (f_intent));
3147               return false;
3148             }
3149
3150           if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3151                && CLASS_DATA (f->sym)->attr.class_pointer)
3152               || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
3153             {
3154               gfc_error ("Coindexed actual argument at %L in PURE procedure "
3155                          "is passed to a POINTER dummy argument",
3156                          &a->expr->where);
3157               return false;
3158             }
3159         }
3160
3161        /* F2008, Section 12.5.2.4.  */
3162        if (a->expr->ts.type == BT_CLASS && f->sym->ts.type == BT_CLASS
3163            && gfc_is_coindexed (a->expr))
3164          {
3165            gfc_error ("Coindexed polymorphic actual argument at %L is passed "
3166                       "polymorphic dummy argument '%s'",
3167                          &a->expr->where, f->sym->name);
3168            return false;
3169          }
3170     }
3171
3172   return true;
3173 }
3174
3175
3176 /* Check how a procedure is used against its interface.  If all goes
3177    well, the actual argument list will also end up being properly
3178    sorted.  */
3179
3180 bool
3181 gfc_procedure_use (gfc_symbol *sym, gfc_actual_arglist **ap, locus *where)
3182 {
3183   gfc_formal_arglist *dummy_args;
3184
3185   /* Warn about calls with an implicit interface.  Special case
3186      for calling a ISO_C_BINDING because c_loc and c_funloc
3187      are pseudo-unknown.  Additionally, warn about procedures not
3188      explicitly declared at all if requested.  */
3189   if (sym->attr.if_source == IFSRC_UNKNOWN && ! sym->attr.is_iso_c)
3190     {
3191       if (gfc_option.warn_implicit_interface)
3192         gfc_warning ("Procedure '%s' called with an implicit interface at %L",
3193                      sym->name, where);
3194       else if (gfc_option.warn_implicit_procedure
3195                && sym->attr.proc == PROC_UNKNOWN)
3196         gfc_warning ("Procedure '%s' called at %L is not explicitly declared",
3197                      sym->name, where);
3198     }
3199
3200   if (sym->attr.if_source == IFSRC_UNKNOWN)
3201     {
3202       gfc_actual_arglist *a;
3203
3204       if (sym->attr.pointer)
3205         {
3206           gfc_error("The pointer object '%s' at %L must have an explicit "
3207                     "function interface or be declared as array",
3208                     sym->name, where);
3209           return false;
3210         }
3211
3212       if (sym->attr.allocatable && !sym->attr.external)
3213         {
3214           gfc_error("The allocatable object '%s' at %L must have an explicit "
3215                     "function interface or be declared as array",
3216                     sym->name, where);
3217           return false;
3218         }
3219
3220       if (sym->attr.allocatable)
3221         {
3222           gfc_error("Allocatable function '%s' at %L must have an explicit "
3223                     "function interface", sym->name, where);
3224           return false;
3225         }
3226
3227       for (a = *ap; a; a = a->next)
3228         {
3229           /* Skip g77 keyword extensions like %VAL, %REF, %LOC.  */
3230           if (a->name != NULL && a->name[0] != '%')
3231             {
3232               gfc_error("Keyword argument requires explicit interface "
3233                         "for procedure '%s' at %L", sym->name, &a->expr->where);
3234               break;
3235             }
3236
3237           /* TS 29113, 6.2.  */
3238           if (a->expr && a->expr->ts.type == BT_ASSUMED
3239               && sym->intmod_sym_id != ISOCBINDING_LOC)
3240             {
3241               gfc_error ("Assumed-type argument %s at %L requires an explicit "
3242                          "interface", a->expr->symtree->n.sym->name,
3243                          &a->expr->where);
3244               break;
3245             }
3246
3247           /* F2008, C1303 and C1304.  */
3248           if (a->expr
3249               && (a->expr->ts.type == BT_DERIVED || a->expr->ts.type == BT_CLASS)
3250               && ((a->expr->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
3251                    && a->expr->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
3252                   || gfc_expr_attr (a->expr).lock_comp))
3253             {
3254               gfc_error("Actual argument of LOCK_TYPE or with LOCK_TYPE "
3255                         "component at %L requires an explicit interface for "
3256                         "procedure '%s'", &a->expr->where, sym->name);
3257               break;
3258             }
3259
3260           if (a->expr && a->expr->expr_type == EXPR_NULL
3261               && a->expr->ts.type == BT_UNKNOWN)
3262             {
3263               gfc_error ("MOLD argument to NULL required at %L", &a->expr->where);
3264               return false;
3265             }
3266
3267           /* TS 29113, C407b.  */
3268           if (a->expr && a->expr->expr_type == EXPR_VARIABLE
3269               && symbol_rank (a->expr->symtree->n.sym) == -1)
3270             {
3271               gfc_error ("Assumed-rank argument requires an explicit interface "
3272                          "at %L", &a->expr->where);
3273               return false;
3274             }
3275         }
3276
3277       return true;
3278     }
3279
3280   dummy_args = gfc_sym_get_dummy_args (sym);
3281
3282   if (!compare_actual_formal (ap, dummy_args, 0, sym->attr.elemental, where))
3283     return false;
3284
3285   if (!check_intents (dummy_args, *ap))
3286     return false;
3287
3288   if (gfc_option.warn_aliasing)
3289     check_some_aliasing (dummy_args, *ap);
3290
3291   return true;
3292 }
3293
3294
3295 /* Check how a procedure pointer component is used against its interface.
3296    If all goes well, the actual argument list will also end up being properly
3297    sorted. Completely analogous to gfc_procedure_use.  */
3298
3299 void
3300 gfc_ppc_use (gfc_component *comp, gfc_actual_arglist **ap, locus *where)
3301 {
3302   /* Warn about calls with an implicit interface.  Special case
3303      for calling a ISO_C_BINDING because c_loc and c_funloc
3304      are pseudo-unknown.  */
3305   if (gfc_option.warn_implicit_interface
3306       && comp->attr.if_source == IFSRC_UNKNOWN
3307       && !comp->attr.is_iso_c)
3308     gfc_warning ("Procedure pointer component '%s' called with an implicit "
3309                  "interface at %L", comp->name, where);
3310
3311   if (comp->attr.if_source == IFSRC_UNKNOWN)
3312     {
3313       gfc_actual_arglist *a;
3314       for (a = *ap; a; a = a->next)
3315         {
3316           /* Skip g77 keyword extensions like %VAL, %REF, %LOC.  */
3317           if (a->name != NULL && a->name[0] != '%')
3318             {
3319               gfc_error("Keyword argument requires explicit interface "
3320                         "for procedure pointer component '%s' at %L",
3321                         comp->name, &a->expr->where);
3322               break;
3323             }
3324         }
3325
3326       return;
3327     }
3328
3329   if (!compare_actual_formal (ap, comp->ts.interface->formal, 0,
3330                               comp->attr.elemental, where))
3331     return;
3332
3333   check_intents (comp->ts.interface->formal, *ap);
3334   if (gfc_option.warn_aliasing)
3335     check_some_aliasing (comp->ts.interface->formal, *ap);
3336 }
3337
3338
3339 /* Try if an actual argument list matches the formal list of a symbol,
3340    respecting the symbol's attributes like ELEMENTAL.  This is used for
3341    GENERIC resolution.  */
3342
3343 bool
3344 gfc_arglist_matches_symbol (gfc_actual_arglist** args, gfc_symbol* sym)
3345 {
3346   gfc_formal_arglist *dummy_args;
3347   bool r;
3348
3349   gcc_assert (sym->attr.flavor == FL_PROCEDURE);
3350
3351   dummy_args = gfc_sym_get_dummy_args (sym);
3352
3353   r = !sym->attr.elemental;
3354   if (compare_actual_formal (args, dummy_args, r, !r, NULL))
3355     {
3356       check_intents (dummy_args, *args);
3357       if (gfc_option.warn_aliasing)
3358         check_some_aliasing (dummy_args, *args);
3359       return true;
3360     }
3361
3362   return false;
3363 }
3364
3365
3366 /* Given an interface pointer and an actual argument list, search for
3367    a formal argument list that matches the actual.  If found, returns
3368    a pointer to the symbol of the correct interface.  Returns NULL if
3369    not found.  */
3370
3371 gfc_symbol *
3372 gfc_search_interface (gfc_interface *intr, int sub_flag,
3373                       gfc_actual_arglist **ap)
3374 {
3375   gfc_symbol *elem_sym = NULL;
3376   gfc_symbol *null_sym = NULL;
3377   locus null_expr_loc;
3378   gfc_actual_arglist *a;
3379   bool has_null_arg = false;
3380
3381   for (a = *ap; a; a = a->next)
3382     if (a->expr && a->expr->expr_type == EXPR_NULL
3383         && a->expr->ts.type == BT_UNKNOWN)
3384       {
3385         has_null_arg = true;
3386         null_expr_loc = a->expr->where;
3387         break;
3388       }
3389
3390   for (; intr; intr = intr->next)
3391     {
3392       if (intr->sym->attr.flavor == FL_DERIVED)
3393         continue;
3394       if (sub_flag && intr->sym->attr.function)
3395         continue;
3396       if (!sub_flag && intr->sym->attr.subroutine)
3397         continue;
3398
3399       if (gfc_arglist_matches_symbol (ap, intr->sym))
3400         {
3401           if (has_null_arg && null_sym)
3402             {
3403               gfc_error ("MOLD= required in NULL() argument at %L: Ambiguity "
3404                          "between specific functions %s and %s",
3405                          &null_expr_loc, null_sym->name, intr->sym->name);
3406               return NULL;
3407             }
3408           else if (has_null_arg)
3409             {
3410               null_sym = intr->sym;
3411               continue;
3412             }
3413
3414           /* Satisfy 12.4.4.1 such that an elemental match has lower
3415              weight than a non-elemental match.  */
3416           if (intr->sym->attr.elemental)
3417             {
3418               elem_sym = intr->sym;
3419               continue;
3420             }
3421           return intr->sym;
3422         }
3423     }
3424
3425   if (null_sym)
3426     return null_sym;
3427
3428   return elem_sym ? elem_sym : NULL;
3429 }
3430
3431
3432 /* Do a brute force recursive search for a symbol.  */
3433
3434 static gfc_symtree *
3435 find_symtree0 (gfc_symtree *root, gfc_symbol *sym)
3436 {
3437   gfc_symtree * st;
3438
3439   if (root->n.sym == sym)
3440     return root;
3441
3442   st = NULL;
3443   if (root->left)
3444     st = find_symtree0 (root->left, sym);
3445   if (root->right && ! st)
3446     st = find_symtree0 (root->right, sym);
3447   return st;
3448 }
3449
3450
3451 /* Find a symtree for a symbol.  */
3452
3453 gfc_symtree *
3454 gfc_find_sym_in_symtree (gfc_symbol *sym)
3455 {
3456   gfc_symtree *st;
3457   gfc_namespace *ns;
3458
3459   /* First try to find it by name.  */
3460   gfc_find_sym_tree (sym->name, gfc_current_ns, 1, &st);
3461   if (st && st->n.sym == sym)
3462     return st;
3463
3464   /* If it's been renamed, resort to a brute-force search.  */
3465   /* TODO: avoid having to do this search.  If the symbol doesn't exist
3466      in the symtree for the current namespace, it should probably be added.  */
3467   for (ns = gfc_current_ns; ns; ns = ns->parent)
3468     {
3469       st = find_symtree0 (ns->sym_root, sym);
3470       if (st)
3471         return st;
3472     }
3473   gfc_internal_error ("Unable to find symbol %s", sym->name);
3474   /* Not reached.  */
3475 }
3476
3477
3478 /* See if the arglist to an operator-call contains a derived-type argument
3479    with a matching type-bound operator.  If so, return the matching specific
3480    procedure defined as operator-target as well as the base-object to use
3481    (which is the found derived-type argument with operator).  The generic
3482    name, if any, is transmitted to the final expression via 'gname'.  */
3483
3484 static gfc_typebound_proc*
3485 matching_typebound_op (gfc_expr** tb_base,
3486                        gfc_actual_arglist* args,
3487                        gfc_intrinsic_op op, const char* uop,
3488                        const char ** gname)
3489 {
3490   gfc_actual_arglist* base;
3491
3492   for (base = args; base; base = base->next)
3493     if (base->expr->ts.type == BT_DERIVED || base->expr->ts.type == BT_CLASS)
3494       {
3495         gfc_typebound_proc* tb;
3496         gfc_symbol* derived;
3497         bool result;
3498
3499         while (base->expr->expr_type == EXPR_OP
3500                && base->expr->value.op.op == INTRINSIC_PARENTHESES)
3501           base->expr = base->expr->value.op.op1;
3502
3503         if (base->expr->ts.type == BT_CLASS)
3504           {
3505             if (CLASS_DATA (base->expr) == NULL
3506                 || !gfc_expr_attr (base->expr).class_ok)
3507               continue;
3508             derived = CLASS_DATA (base->expr)->ts.u.derived;
3509           }
3510         else
3511           derived = base->expr->ts.u.derived;
3512
3513         if (op == INTRINSIC_USER)
3514           {
3515             gfc_symtree* tb_uop;
3516
3517             gcc_assert (uop);
3518             tb_uop = gfc_find_typebound_user_op (derived, &result, uop,
3519                                                  false, NULL);
3520
3521             if (tb_uop)
3522               tb = tb_uop->n.tb;
3523             else
3524               tb = NULL;
3525           }
3526         else
3527           tb = gfc_find_typebound_intrinsic_op (derived, &result, op,
3528                                                 false, NULL);
3529
3530         /* This means we hit a PRIVATE operator which is use-associated and
3531            should thus not be seen.  */
3532         if (!result)
3533           tb = NULL;
3534
3535         /* Look through the super-type hierarchy for a matching specific
3536            binding.  */
3537         for (; tb; tb = tb->overridden)
3538           {
3539             gfc_tbp_generic* g;
3540
3541             gcc_assert (tb->is_generic);
3542             for (g = tb->u.generic; g; g = g->next)
3543               {
3544                 gfc_symbol* target;
3545                 gfc_actual_arglist* argcopy;
3546                 bool matches;
3547
3548                 gcc_assert (g->specific);
3549                 if (g->specific->error)
3550                   continue;
3551
3552                 target = g->specific->u.specific->n.sym;
3553
3554                 /* Check if this arglist matches the formal.  */
3555                 argcopy = gfc_copy_actual_arglist (args);
3556                 matches = gfc_arglist_matches_symbol (&argcopy, target);
3557                 gfc_free_actual_arglist (argcopy);
3558
3559                 /* Return if we found a match.  */
3560                 if (matches)
3561                   {
3562                     *tb_base = base->expr;
3563                     *gname = g->specific_st->name;
3564                     return g->specific;
3565                   }
3566               }
3567           }
3568       }
3569
3570   return NULL;
3571 }
3572
3573
3574 /* For the 'actual arglist' of an operator call and a specific typebound
3575    procedure that has been found the target of a type-bound operator, build the
3576    appropriate EXPR_COMPCALL and resolve it.  We take this indirection over
3577    type-bound procedures rather than resolving type-bound operators 'directly'
3578    so that we can reuse the existing logic.  */
3579
3580 static void
3581 build_compcall_for_operator (gfc_expr* e, gfc_actual_arglist* actual,
3582                              gfc_expr* base, gfc_typebound_proc* target,
3583                              const char *gname)
3584 {
3585   e->expr_type = EXPR_COMPCALL;
3586   e->value.compcall.tbp = target;
3587   e->value.compcall.name = gname ? gname : "$op";
3588   e->value.compcall.actual = actual;
3589   e->value.compcall.base_object = base;
3590   e->value.compcall.ignore_pass = 1;
3591   e->value.compcall.assign = 0;
3592   if (e->ts.type == BT_UNKNOWN
3593         && target->function)
3594     {
3595       if (target->is_generic)
3596         e->ts = target->u.generic->specific->u.specific->n.sym->ts;
3597       else
3598         e->ts = target->u.specific->n.sym->ts;
3599     }
3600 }
3601
3602
3603 /* This subroutine is called when an expression is being resolved.
3604    The expression node in question is either a user defined operator
3605    or an intrinsic operator with arguments that aren't compatible
3606    with the operator.  This subroutine builds an actual argument list
3607    corresponding to the operands, then searches for a compatible
3608    interface.  If one is found, the expression node is replaced with
3609    the appropriate function call. We use the 'match' enum to specify
3610    whether a replacement has been made or not, or if an error occurred.  */
3611
3612 match
3613 gfc_extend_expr (gfc_expr *e)
3614 {
3615   gfc_actual_arglist *actual;
3616   gfc_symbol *sym;
3617   gfc_namespace *ns;
3618   gfc_user_op *uop;
3619   gfc_intrinsic_op i;
3620   const char *gname;
3621
3622   sym = NULL;
3623
3624   actual = gfc_get_actual_arglist ();
3625   actual->expr = e->value.op.op1;
3626
3627   gname = NULL;
3628
3629   if (e->value.op.op2 != NULL)
3630     {
3631       actual->next = gfc_get_actual_arglist ();
3632       actual->next->expr = e->value.op.op2;
3633     }
3634
3635   i = fold_unary_intrinsic (e->value.op.op);
3636
3637   if (i == INTRINSIC_USER)
3638     {
3639       for (ns = gfc_current_ns; ns; ns = ns->parent)
3640         {
3641           uop = gfc_find_uop (e->value.op.uop->name, ns);
3642           if (uop == NULL)
3643             continue;
3644
3645           sym = gfc_search_interface (uop->op, 0, &actual);
3646           if (sym != NULL)
3647             break;
3648         }
3649     }
3650   else
3651     {
3652       for (ns = gfc_current_ns; ns; ns = ns->parent)
3653         {
3654           /* Due to the distinction between '==' and '.eq.' and friends, one has
3655              to check if either is defined.  */
3656           switch (i)
3657             {
3658 #define CHECK_OS_COMPARISON(comp) \
3659   case INTRINSIC_##comp: \
3660   case INTRINSIC_##comp##_OS: \
3661     sym = gfc_search_interface (ns->op[INTRINSIC_##comp], 0, &actual); \
3662     if (!sym) \
3663       sym = gfc_search_interface (ns->op[INTRINSIC_##comp##_OS], 0, &actual); \
3664     break;
3665               CHECK_OS_COMPARISON(EQ)
3666               CHECK_OS_COMPARISON(NE)
3667               CHECK_OS_COMPARISON(GT)
3668               CHECK_OS_COMPARISON(GE)
3669               CHECK_OS_COMPARISON(LT)
3670               CHECK_OS_COMPARISON(LE)
3671 #undef CHECK_OS_COMPARISON
3672
3673               default:
3674                 sym = gfc_search_interface (ns->op[i], 0, &actual);
3675             }
3676
3677           if (sym != NULL)
3678             break;
3679         }
3680     }
3681
3682   /* TODO: Do an ambiguity-check and error if multiple matching interfaces are
3683      found rather than just taking the first one and not checking further.  */
3684
3685   if (sym == NULL)
3686     {
3687       gfc_typebound_proc* tbo;
3688       gfc_expr* tb_base;
3689
3690       /* See if we find a matching type-bound operator.  */
3691       if (i == INTRINSIC_USER)
3692         tbo = matching_typebound_op (&tb_base, actual,
3693                                      i, e->value.op.uop->name, &gname);
3694       else
3695         switch (i)
3696           {
3697 #define CHECK_OS_COMPARISON(comp) \
3698   case INTRINSIC_##comp: \
3699   case INTRINSIC_##comp##_OS: \
3700     tbo = matching_typebound_op (&tb_base, actual, \
3701                                  INTRINSIC_##comp, NULL, &gname); \
3702     if (!tbo) \
3703       tbo = matching_typebound_op (&tb_base, actual, \
3704                                    INTRINSIC_##comp##_OS, NULL, &gname); \
3705     break;
3706             CHECK_OS_COMPARISON(EQ)
3707             CHECK_OS_COMPARISON(NE)
3708             CHECK_OS_COMPARISON(GT)
3709             CHECK_OS_COMPARISON(GE)
3710             CHECK_OS_COMPARISON(LT)
3711             CHECK_OS_COMPARISON(LE)
3712 #undef CHECK_OS_COMPARISON
3713
3714             default:
3715               tbo = matching_typebound_op (&tb_base, actual, i, NULL, &gname);
3716               break;
3717           }
3718
3719       /* If there is a matching typebound-operator, replace the expression with
3720          a call to it and succeed.  */
3721       if (tbo)
3722         {
3723           bool result;
3724
3725           gcc_assert (tb_base);
3726           build_compcall_for_operator (e, actual, tb_base, tbo, gname);
3727
3728           result = gfc_resolve_expr (e);
3729           if (!result)
3730             return MATCH_ERROR;
3731
3732           return MATCH_YES;
3733         }
3734
3735       /* Don't use gfc_free_actual_arglist().  */
3736       free (actual->next);
3737       free (actual);
3738
3739       return MATCH_NO;
3740     }
3741
3742   /* Change the expression node to a function call.  */
3743   e->expr_type = EXPR_FUNCTION;
3744   e->symtree = gfc_find_sym_in_symtree (sym);
3745   e->value.function.actual = actual;
3746   e->value.function.esym = NULL;
3747   e->value.function.isym = NULL;
3748   e->value.function.name = NULL;
3749   e->user_operator = 1;
3750
3751   if (!gfc_resolve_expr (e))
3752     return MATCH_ERROR;
3753
3754   return MATCH_YES;
3755 }
3756
3757
3758 /* Tries to replace an assignment code node with a subroutine call to the
3759    subroutine associated with the assignment operator. Return true if the node
3760    was replaced. On false, no error is generated.  */
3761
3762 bool
3763 gfc_extend_assign (gfc_code *c, gfc_namespace *ns)
3764 {
3765   gfc_actual_arglist *actual;
3766   gfc_expr *lhs, *rhs, *tb_base;
3767   gfc_symbol *sym = NULL;
3768   const char *gname = NULL;
3769   gfc_typebound_proc* tbo;
3770
3771   lhs = c->expr1;
3772   rhs = c->expr2;
3773
3774   /* Don't allow an intrinsic assignment to be replaced.  */
3775   if (lhs->ts.type != BT_DERIVED && lhs->ts.type != BT_CLASS
3776       && (rhs->rank == 0 || rhs->rank == lhs->rank)
3777       && (lhs->ts.type == rhs->ts.type
3778           || (gfc_numeric_ts (&lhs->ts) && gfc_numeric_ts (&rhs->ts))))
3779     return false;
3780
3781   actual = gfc_get_actual_arglist ();
3782   actual->expr = lhs;
3783
3784   actual->next = gfc_get_actual_arglist ();
3785   actual->next->expr = rhs;
3786
3787   /* TODO: Ambiguity-check, see above for gfc_extend_expr.  */
3788
3789   /* See if we find a matching type-bound assignment.  */
3790   tbo = matching_typebound_op (&tb_base, actual, INTRINSIC_ASSIGN,
3791                                NULL, &gname);
3792
3793   if (tbo)
3794     {
3795       /* Success: Replace the expression with a type-bound call.  */
3796       gcc_assert (tb_base);
3797       c->expr1 = gfc_get_expr ();
3798       build_compcall_for_operator (c->expr1, actual, tb_base, tbo, gname);
3799       c->expr1->value.compcall.assign = 1;
3800       c->expr1->where = c->loc;
3801       c->expr2 = NULL;
3802       c->op = EXEC_COMPCALL;
3803       return true;
3804     }
3805
3806   /* See if we find an 'ordinary' (non-typebound) assignment procedure.  */
3807   for (; ns; ns = ns->parent)
3808     {
3809       sym = gfc_search_interface (ns->op[INTRINSIC_ASSIGN], 1, &actual);
3810       if (sym != NULL)
3811         break;
3812     }
3813
3814   if (sym)
3815     {
3816       /* Success: Replace the assignment with the call.  */
3817       c->op = EXEC_ASSIGN_CALL;
3818       c->symtree = gfc_find_sym_in_symtree (sym);
3819       c->expr1 = NULL;
3820       c->expr2 = NULL;
3821       c->ext.actual = actual;
3822       return true;
3823     }
3824
3825   /* Failure: No assignment procedure found.  */
3826   free (actual->next);
3827   free (actual);
3828   return false;
3829 }
3830
3831
3832 /* Make sure that the interface just parsed is not already present in
3833    the given interface list.  Ambiguity isn't checked yet since module
3834    procedures can be present without interfaces.  */
3835
3836 bool
3837 gfc_check_new_interface (gfc_interface *base, gfc_symbol *new_sym, locus loc)
3838 {
3839   gfc_interface *ip;
3840
3841   for (ip = base; ip; ip = ip->next)
3842     {
3843       if (ip->sym == new_sym)
3844         {
3845           gfc_error ("Entity '%s' at %L is already present in the interface",
3846                      new_sym->name, &loc);
3847           return false;
3848         }
3849     }
3850
3851   return true;
3852 }
3853
3854
3855 /* Add a symbol to the current interface.  */
3856
3857 bool
3858 gfc_add_interface (gfc_symbol *new_sym)
3859 {
3860   gfc_interface **head, *intr;
3861   gfc_namespace *ns;
3862   gfc_symbol *sym;
3863
3864   switch (current_interface.type)
3865     {
3866     case INTERFACE_NAMELESS:
3867     case INTERFACE_ABSTRACT:
3868       return true;
3869
3870     case INTERFACE_INTRINSIC_OP:
3871       for (ns = current_interface.ns; ns; ns = ns->parent)
3872         switch (current_interface.op)
3873           {
3874             case INTRINSIC_EQ:
3875             case INTRINSIC_EQ_OS:
3876               if (!gfc_check_new_interface (ns->op[INTRINSIC_EQ], new_sym, 
3877                                             gfc_current_locus)
3878                   || !gfc_check_new_interface (ns->op[INTRINSIC_EQ_OS], 
3879                                                new_sym, gfc_current_locus))
3880                 return false;
3881               break;
3882
3883             case INTRINSIC_NE:
3884             case INTRINSIC_NE_OS:
3885               if (!gfc_check_new_interface (ns->op[INTRINSIC_NE], new_sym, 
3886                                             gfc_current_locus)
3887                   || !gfc_check_new_interface (ns->op[INTRINSIC_NE_OS], 
3888                                                new_sym, gfc_current_locus))
3889                 return false;
3890               break;
3891
3892             case INTRINSIC_GT:
3893             case INTRINSIC_GT_OS:
3894               if (!gfc_check_new_interface (ns->op[INTRINSIC_GT], 
3895                                             new_sym, gfc_current_locus)
3896                   || !gfc_check_new_interface (ns->op[INTRINSIC_GT_OS], 
3897                                                new_sym, gfc_current_locus))
3898                 return false;
3899               break;
3900
3901             case INTRINSIC_GE:
3902             case INTRINSIC_GE_OS:
3903               if (!gfc_check_new_interface (ns->op[INTRINSIC_GE], 
3904                                             new_sym, gfc_current_locus)
3905                   || !gfc_check_new_interface (ns->op[INTRINSIC_GE_OS], 
3906                                                new_sym, gfc_current_locus))
3907                 return false;
3908               break;
3909
3910             case INTRINSIC_LT:
3911             case INTRINSIC_LT_OS:
3912               if (!gfc_check_new_interface (ns->op[INTRINSIC_LT], 
3913                                             new_sym, gfc_current_locus)
3914                   || !gfc_check_new_interface (ns->op[INTRINSIC_LT_OS], 
3915                                                new_sym, gfc_current_locus))
3916                 return false;
3917               break;
3918
3919             case INTRINSIC_LE:
3920             case INTRINSIC_LE_OS:
3921               if (!gfc_check_new_interface (ns->op[INTRINSIC_LE], 
3922                                             new_sym, gfc_current_locus)
3923                   || !gfc_check_new_interface (ns->op[INTRINSIC_LE_OS], 
3924                                                new_sym, gfc_current_locus))
3925                 return false;
3926               break;
3927
3928             default:
3929               if (!gfc_check_new_interface (ns->op[current_interface.op], 
3930                                             new_sym, gfc_current_locus))
3931                 return false;
3932           }
3933
3934       head = &current_interface.ns->op[current_interface.op];
3935       break;
3936
3937     case INTERFACE_GENERIC:
3938       for (ns = current_interface.ns; ns; ns = ns->parent)
3939         {
3940           gfc_find_symbol (current_interface.sym->name, ns, 0, &sym);
3941           if (sym == NULL)
3942             continue;
3943
3944           if (!gfc_check_new_interface (sym->generic, 
3945                                         new_sym, gfc_current_locus))
3946             return false;
3947         }
3948
3949       head = &current_interface.sym->generic;
3950       break;
3951
3952     case INTERFACE_USER_OP:
3953       if (!gfc_check_new_interface (current_interface.uop->op, 
3954                                     new_sym, gfc_current_locus))
3955         return false;
3956
3957       head = &current_interface.uop->op;
3958       break;
3959
3960     default:
3961       gfc_internal_error ("gfc_add_interface(): Bad interface type");
3962     }
3963
3964   intr = gfc_get_interface ();
3965   intr->sym = new_sym;
3966   intr->where = gfc_current_locus;
3967
3968   intr->next = *head;
3969   *head = intr;
3970
3971   return true;
3972 }
3973
3974
3975 gfc_interface *
3976 gfc_current_interface_head (void)
3977 {
3978   switch (current_interface.type)
3979     {
3980       case INTERFACE_INTRINSIC_OP:
3981         return current_interface.ns->op[current_interface.op];
3982         break;
3983
3984       case INTERFACE_GENERIC:
3985         return current_interface.sym->generic;
3986         break;
3987
3988       case INTERFACE_USER_OP:
3989         return current_interface.uop->op;
3990         break;
3991
3992       default:
3993         gcc_unreachable ();
3994     }
3995 }
3996
3997
3998 void
3999 gfc_set_current_interface_head (gfc_interface *i)
4000 {
4001   switch (current_interface.type)
4002     {
4003       case INTERFACE_INTRINSIC_OP:
4004         current_interface.ns->op[current_interface.op] = i;
4005         break;
4006
4007       case INTERFACE_GENERIC:
4008         current_interface.sym->generic = i;
4009         break;
4010
4011       case INTERFACE_USER_OP:
4012         current_interface.uop->op = i;
4013         break;
4014
4015       default:
4016         gcc_unreachable ();
4017     }
4018 }
4019
4020
4021 /* Gets rid of a formal argument list.  We do not free symbols.
4022    Symbols are freed when a namespace is freed.  */
4023
4024 void
4025 gfc_free_formal_arglist (gfc_formal_arglist *p)
4026 {
4027   gfc_formal_arglist *q;
4028
4029   for (; p; p = q)
4030     {
4031       q = p->next;
4032       free (p);
4033     }
4034 }
4035
4036
4037 /* Check that it is ok for the type-bound procedure 'proc' to override the
4038    procedure 'old', cf. F08:4.5.7.3.  */
4039
4040 bool
4041 gfc_check_typebound_override (gfc_symtree* proc, gfc_symtree* old)
4042 {
4043   locus where;
4044   gfc_symbol *proc_target, *old_target;
4045   unsigned proc_pass_arg, old_pass_arg, argpos;
4046   gfc_formal_arglist *proc_formal, *old_formal;
4047   bool check_type;
4048   char err[200];
4049
4050   /* This procedure should only be called for non-GENERIC proc.  */
4051   gcc_assert (!proc->n.tb->is_generic);
4052
4053   /* If the overwritten procedure is GENERIC, this is an error.  */
4054   if (old->n.tb->is_generic)
4055     {
4056       gfc_error ("Can't overwrite GENERIC '%s' at %L",
4057                  old->name, &proc->n.tb->where);
4058       return false;
4059     }
4060
4061   where = proc->n.tb->where;
4062   proc_target = proc->n.tb->u.specific->n.sym;
4063   old_target = old->n.tb->u.specific->n.sym;
4064
4065   /* Check that overridden binding is not NON_OVERRIDABLE.  */
4066   if (old->n.tb->non_overridable)
4067     {
4068       gfc_error ("'%s' at %L overrides a procedure binding declared"
4069                  " NON_OVERRIDABLE", proc->name, &where);
4070       return false;
4071     }
4072
4073   /* It's an error to override a non-DEFERRED procedure with a DEFERRED one.  */
4074   if (!old->n.tb->deferred && proc->n.tb->deferred)
4075     {
4076       gfc_error ("'%s' at %L must not be DEFERRED as it overrides a"
4077                  " non-DEFERRED binding", proc->name, &where);
4078       return false;
4079     }
4080
4081   /* If the overridden binding is PURE, the overriding must be, too.  */
4082   if (old_target->attr.pure && !proc_target->attr.pure)
4083     {
4084       gfc_error ("'%s' at %L overrides a PURE procedure and must also be PURE",
4085                  proc->name, &where);
4086       return false;
4087     }
4088
4089   /* If the overridden binding is ELEMENTAL, the overriding must be, too.  If it
4090      is not, the overriding must not be either.  */
4091   if (old_target->attr.elemental && !proc_target->attr.elemental)
4092     {
4093       gfc_error ("'%s' at %L overrides an ELEMENTAL procedure and must also be"
4094                  " ELEMENTAL", proc->name, &where);
4095       return false;
4096     }
4097   if (!old_target->attr.elemental && proc_target->attr.elemental)
4098     {
4099       gfc_error ("'%s' at %L overrides a non-ELEMENTAL procedure and must not"
4100                  " be ELEMENTAL, either", proc->name, &where);
4101       return false;
4102     }
4103
4104   /* If the overridden binding is a SUBROUTINE, the overriding must also be a
4105      SUBROUTINE.  */
4106   if (old_target->attr.subroutine && !proc_target->attr.subroutine)
4107     {
4108       gfc_error ("'%s' at %L overrides a SUBROUTINE and must also be a"
4109                  " SUBROUTINE", proc->name, &where);
4110       return false;
4111     }
4112
4113   /* If the overridden binding is a FUNCTION, the overriding must also be a
4114      FUNCTION and have the same characteristics.  */
4115   if (old_target->attr.function)
4116     {
4117       if (!proc_target->attr.function)
4118         {
4119           gfc_error ("'%s' at %L overrides a FUNCTION and must also be a"
4120                      " FUNCTION", proc->name, &where);
4121           return false;
4122         }
4123
4124       if (!check_result_characteristics (proc_target, old_target, err, 
4125                                          sizeof(err)))
4126         {
4127           gfc_error ("Result mismatch for the overriding procedure "
4128                      "'%s' at %L: %s", proc->name, &where, err);
4129           return false;
4130         }
4131     }
4132
4133   /* If the overridden binding is PUBLIC, the overriding one must not be
4134      PRIVATE.  */
4135   if (old->n.tb->access == ACCESS_PUBLIC
4136       && proc->n.tb->access == ACCESS_PRIVATE)
4137     {
4138       gfc_error ("'%s' at %L overrides a PUBLIC procedure and must not be"
4139                  " PRIVATE", proc->name, &where);
4140       return false;
4141     }
4142
4143   /* Compare the formal argument lists of both procedures.  This is also abused
4144      to find the position of the passed-object dummy arguments of both
4145      bindings as at least the overridden one might not yet be resolved and we
4146      need those positions in the check below.  */
4147   proc_pass_arg = old_pass_arg = 0;
4148   if (!proc->n.tb->nopass && !proc->n.tb->pass_arg)
4149     proc_pass_arg = 1;
4150   if (!old->n.tb->nopass && !old->n.tb->pass_arg)
4151     old_pass_arg = 1;
4152   argpos = 1;
4153   proc_formal = gfc_sym_get_dummy_args (proc_target);
4154   old_formal = gfc_sym_get_dummy_args (old_target);
4155   for ( ; proc_formal && old_formal;
4156        proc_formal = proc_formal->next, old_formal = old_formal->next)
4157     {
4158       if (proc->n.tb->pass_arg
4159           && !strcmp (proc->n.tb->pass_arg, proc_formal->sym->name))
4160         proc_pass_arg = argpos;
4161       if (old->n.tb->pass_arg
4162           && !strcmp (old->n.tb->pass_arg, old_formal->sym->name))
4163         old_pass_arg = argpos;
4164
4165       /* Check that the names correspond.  */
4166       if (strcmp (proc_formal->sym->name, old_formal->sym->name))
4167         {
4168           gfc_error ("Dummy argument '%s' of '%s' at %L should be named '%s' as"
4169                      " to match the corresponding argument of the overridden"
4170                      " procedure", proc_formal->sym->name, proc->name, &where,
4171                      old_formal->sym->name);
4172           return false;
4173         }
4174
4175       check_type = proc_pass_arg != argpos && old_pass_arg != argpos;
4176       if (!check_dummy_characteristics (proc_formal->sym, old_formal->sym, 
4177                                         check_type, err, sizeof(err)))
4178         {
4179           gfc_error ("Argument mismatch for the overriding procedure "
4180                      "'%s' at %L: %s", proc->name, &where, err);
4181           return false;
4182         }
4183
4184       ++argpos;
4185     }
4186   if (proc_formal || old_formal)
4187     {
4188       gfc_error ("'%s' at %L must have the same number of formal arguments as"
4189                  " the overridden procedure", proc->name, &where);
4190       return false;
4191     }
4192
4193   /* If the overridden binding is NOPASS, the overriding one must also be
4194      NOPASS.  */
4195   if (old->n.tb->nopass && !proc->n.tb->nopass)
4196     {
4197       gfc_error ("'%s' at %L overrides a NOPASS binding and must also be"
4198                  " NOPASS", proc->name, &where);
4199       return false;
4200     }
4201
4202   /* If the overridden binding is PASS(x), the overriding one must also be
4203      PASS and the passed-object dummy arguments must correspond.  */
4204   if (!old->n.tb->nopass)
4205     {
4206       if (proc->n.tb->nopass)
4207         {
4208           gfc_error ("'%s' at %L overrides a binding with PASS and must also be"
4209                      " PASS", proc->name, &where);
4210           return false;
4211         }
4212
4213       if (proc_pass_arg != old_pass_arg)
4214         {
4215           gfc_error ("Passed-object dummy argument of '%s' at %L must be at"
4216                      " the same position as the passed-object dummy argument of"
4217                      " the overridden procedure", proc->name, &where);
4218           return false;
4219         }
4220     }
4221
4222   return true;
4223 }