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