]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/interface.c
Daily bump.
[thirdparty/gcc.git] / gcc / fortran / interface.c
CommitLineData
6de9cd9a 1/* Deal with interfaces.
5624e564 2 Copyright (C) 2000-2015 Free Software Foundation, Inc.
6de9cd9a
DN
3 Contributed by Andy Vaught
4
9fc4d79b 5This file is part of GCC.
6de9cd9a 6
9fc4d79b
TS
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
d234d788 9Software Foundation; either version 3, or (at your option) any later
9fc4d79b 10version.
6de9cd9a 11
9fc4d79b
TS
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.
6de9cd9a
DN
16
17You should have received a copy of the GNU General Public License
d234d788
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
6de9cd9a
DN
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
6892757c 43 has an explicit interface. Each explicit interface has its own
6de9cd9a
DN
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"
d22e4895 67#include "system.h"
953bee7c 68#include "coretypes.h"
73e42eef 69#include "flags.h"
6de9cd9a
DN
70#include "gfortran.h"
71#include "match.h"
97f26732 72#include "arith.h"
6de9cd9a 73
6de9cd9a
DN
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
b251af97 84gfc_free_interface (gfc_interface *intr)
6de9cd9a
DN
85{
86 gfc_interface *next;
87
88 for (; intr; intr = next)
89 {
90 next = intr->next;
cede9502 91 free (intr);
6de9cd9a
DN
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
e8d4f3fc 100fold_unary_intrinsic (gfc_intrinsic_op op)
6de9cd9a 101{
a1ee985f 102 switch (op)
6de9cd9a
DN
103 {
104 case INTRINSIC_UPLUS:
a1ee985f 105 op = INTRINSIC_PLUS;
6de9cd9a
DN
106 break;
107 case INTRINSIC_UMINUS:
a1ee985f 108 op = INTRINSIC_MINUS;
6de9cd9a
DN
109 break;
110 default:
111 break;
112 }
113
a1ee985f 114 return op;
6de9cd9a
DN
115}
116
117
118/* Match a generic specification. Depending on which type of
a1ee985f 119 interface is found, the 'name' or 'op' pointers may be set.
6de9cd9a
DN
120 This subroutine doesn't return MATCH_NO. */
121
122match
b251af97 123gfc_match_generic_spec (interface_type *type,
6de9cd9a 124 char *name,
a1ee985f 125 gfc_intrinsic_op *op)
6de9cd9a
DN
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;
a1ee985f 134 *op = INTRINSIC_ASSIGN;
6de9cd9a
DN
135 return MATCH_YES;
136 }
137
138 if (gfc_match (" operator ( %o )", &i) == MATCH_YES)
139 { /* Operator i/f */
140 *type = INTERFACE_INTRINSIC_OP;
e8d4f3fc 141 *op = fold_unary_intrinsic (i);
6de9cd9a
DN
142 return MATCH_YES;
143 }
144
e8d4f3fc 145 *op = INTRINSIC_NONE;
6de9cd9a
DN
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
9e1d712c
TB
181/* Match one of the five F95 forms of an interface statement. The
182 matcher for the abstract interface follows. */
6de9cd9a
DN
183
184match
185gfc_match_interface (void)
186{
187 char name[GFC_MAX_SYMBOL_LEN + 1];
188 interface_type type;
189 gfc_symbol *sym;
a1ee985f 190 gfc_intrinsic_op op;
6de9cd9a
DN
191 match m;
192
193 m = gfc_match_space ();
194
a1ee985f 195 if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
6de9cd9a
DN
196 return MATCH_ERROR;
197
6de9cd9a
DN
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
b251af97 201 || (type != INTERFACE_NAMELESS && m != MATCH_YES))
6de9cd9a 202 {
b251af97
SK
203 gfc_error ("Syntax error: Trailing garbage in INTERFACE statement "
204 "at %C");
6de9cd9a
DN
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
8b704316 216 if (!sym->attr.generic
524af0d6 217 && !gfc_add_generic (&sym->attr, sym->name, NULL))
6de9cd9a
DN
218 return MATCH_ERROR;
219
e5d7f6f7
FXC
220 if (sym->attr.dummy)
221 {
c4100eae 222 gfc_error ("Dummy procedure %qs at %C cannot have a "
e5d7f6f7
FXC
223 "generic interface", sym->name);
224 return MATCH_ERROR;
225 }
226
6de9cd9a
DN
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:
a1ee985f 235 current_interface.op = op;
6de9cd9a
DN
236 break;
237
238 case INTERFACE_NAMELESS:
9e1d712c 239 case INTERFACE_ABSTRACT:
6de9cd9a
DN
240 break;
241 }
242
243 return MATCH_YES;
244}
245
246
9e1d712c
TB
247
248/* Match a F2003 abstract interface. */
249
250match
251gfc_match_abstract_interface (void)
252{
253 match m;
254
524af0d6 255 if (!gfc_notify_std (GFC_STD_F2003, "ABSTRACT INTERFACE at %C"))
9e1d712c
TB
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
6de9cd9a
DN
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;
a1ee985f 280 gfc_intrinsic_op op;
6de9cd9a
DN
281 match m;
282
283 m = gfc_match_space ();
284
a1ee985f 285 if (gfc_match_generic_spec (&type, name, &op) == MATCH_ERROR)
6de9cd9a
DN
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
b251af97 291 || (type != INTERFACE_NAMELESS && m != MATCH_YES))
6de9cd9a 292 {
b251af97
SK
293 gfc_error ("Syntax error: Trailing garbage in END INTERFACE "
294 "statement at %C");
6de9cd9a
DN
295 return MATCH_ERROR;
296 }
297
298 m = MATCH_YES;
299
300 switch (current_interface.type)
301 {
302 case INTERFACE_NAMELESS:
9e1d712c
TB
303 case INTERFACE_ABSTRACT:
304 if (type != INTERFACE_NAMELESS)
6de9cd9a
DN
305 {
306 gfc_error ("Expected a nameless interface at %C");
307 m = MATCH_ERROR;
308 }
309
310 break;
311
312 case INTERFACE_INTRINSIC_OP:
a1ee985f 313 if (type != current_interface.type || op != current_interface.op)
6de9cd9a
DN
314 {
315
316 if (current_interface.op == INTRINSIC_ASSIGN)
c6d6e62f
SK
317 {
318 m = MATCH_ERROR;
a4d9b221 319 gfc_error ("Expected %<END INTERFACE ASSIGNMENT (=)%> at %C");
c6d6e62f 320 }
6de9cd9a 321 else
c6d6e62f 322 {
915acec4 323 const char *s1, *s2;
c6d6e62f
SK
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. */
524af0d6
JB
329 if ((strcmp(s1, "==") == 0 && strcmp (s2, ".eq.") == 0)
330 || (strcmp(s1, ".eq.") == 0 && strcmp (s2, "==") == 0))
c6d6e62f 331 break;
524af0d6
JB
332 if ((strcmp(s1, "/=") == 0 && strcmp (s2, ".ne.") == 0)
333 || (strcmp(s1, ".ne.") == 0 && strcmp (s2, "/=") == 0))
c6d6e62f 334 break;
524af0d6
JB
335 if ((strcmp(s1, "<=") == 0 && strcmp (s2, ".le.") == 0)
336 || (strcmp(s1, ".le.") == 0 && strcmp (s2, "<=") == 0))
c6d6e62f 337 break;
524af0d6
JB
338 if ((strcmp(s1, "<") == 0 && strcmp (s2, ".lt.") == 0)
339 || (strcmp(s1, ".lt.") == 0 && strcmp (s2, "<") == 0))
c6d6e62f 340 break;
524af0d6
JB
341 if ((strcmp(s1, ">=") == 0 && strcmp (s2, ".ge.") == 0)
342 || (strcmp(s1, ".ge.") == 0 && strcmp (s2, ">=") == 0))
c6d6e62f 343 break;
524af0d6
JB
344 if ((strcmp(s1, ">") == 0 && strcmp (s2, ".gt.") == 0)
345 || (strcmp(s1, ".gt.") == 0 && strcmp (s2, ">") == 0))
c6d6e62f
SK
346 break;
347
348 m = MATCH_ERROR;
a4d9b221 349 gfc_error ("Expecting %<END INTERFACE OPERATOR (%s)%> at %C, "
c6d6e62f
SK
350 "but got %s", s1, s2);
351 }
8b704316 352
6de9cd9a
DN
353 }
354
355 break;
356
357 case INTERFACE_USER_OP:
358 /* Comparing the symbol node names is OK because only use-associated
b251af97 359 symbols can be renamed. */
6de9cd9a 360 if (type != current_interface.type
9b46f94f 361 || strcmp (current_interface.uop->name, name) != 0)
6de9cd9a 362 {
a4d9b221 363 gfc_error ("Expecting %<END INTERFACE OPERATOR (.%s.)%> at %C",
55898b2c 364 current_interface.uop->name);
6de9cd9a
DN
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 {
a4d9b221 374 gfc_error ("Expecting %<END INTERFACE %s%> at %C",
6de9cd9a
DN
375 current_interface.sym->name);
376 m = MATCH_ERROR;
377 }
378
379 break;
380 }
381
382 return m;
383}
384
385
e0e85e06
PT
386/* Compare two derived types using the criteria in 4.4.2 of the standard,
387 recursing through gfc_compare_types for the components. */
6de9cd9a
DN
388
389int
b251af97 390gfc_compare_derived_types (gfc_symbol *derived1, gfc_symbol *derived2)
6de9cd9a
DN
391{
392 gfc_component *dt1, *dt2;
393
cf2b3c22
TB
394 if (derived1 == derived2)
395 return 1;
396
c6423ef3
TB
397 gcc_assert (derived1 && derived2);
398
6de9cd9a
DN
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. */
c6423ef3 402 if (strcmp (derived1->name, derived2->name) == 0
b251af97
SK
403 && derived1->module != NULL && derived2->module != NULL
404 && strcmp (derived1->module, derived2->module) == 0)
6de9cd9a
DN
405 return 1;
406
407 /* Compare type via the rules of the standard. Both types must have
a9e88ec6 408 the SEQUENCE or BIND(C) attribute to be equal. */
6de9cd9a 409
e0e85e06 410 if (strcmp (derived1->name, derived2->name))
6de9cd9a
DN
411 return 0;
412
e0e85e06 413 if (derived1->component_access == ACCESS_PRIVATE
b251af97 414 || derived2->component_access == ACCESS_PRIVATE)
e0e85e06 415 return 0;
6de9cd9a 416
a9e88ec6
TB
417 if (!(derived1->attr.sequence && derived2->attr.sequence)
418 && !(derived1->attr.is_bind_c && derived2->attr.is_bind_c))
6de9cd9a
DN
419 return 0;
420
e0e85e06
PT
421 dt1 = derived1->components;
422 dt2 = derived2->components;
423
6de9cd9a
DN
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
d4b7d0f0 432 if (dt1->attr.access != dt2->attr.access)
2eae3dc7
TB
433 return 0;
434
d4b7d0f0 435 if (dt1->attr.pointer != dt2->attr.pointer)
6de9cd9a
DN
436 return 0;
437
d4b7d0f0 438 if (dt1->attr.dimension != dt2->attr.dimension)
6de9cd9a
DN
439 return 0;
440
d4b7d0f0 441 if (dt1->attr.allocatable != dt2->attr.allocatable)
5046aff5
PT
442 return 0;
443
d4b7d0f0 444 if (dt1->attr.dimension && gfc_compare_array_spec (dt1->as, dt2->as) == 0)
6de9cd9a
DN
445 return 0;
446
8b704316 447 /* Make sure that link lists do not put this function into an
6669dbdf 448 endless recursive loop! */
bc21d315 449 if (!(dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived)
efb63364 450 && !(dt2->ts.type == BT_DERIVED && derived2 == dt2->ts.u.derived)
63287e10
PT
451 && gfc_compare_types (&dt1->ts, &dt2->ts) == 0)
452 return 0;
453
bc21d315
JW
454 else if ((dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived)
455 && !(dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived))
6669dbdf
PT
456 return 0;
457
bc21d315
JW
458 else if (!(dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived)
459 && (dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived))
6de9cd9a
DN
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
b251af97 474
e0e85e06
PT
475/* Compare two typespecs, recursively if necessary. */
476
477int
b251af97 478gfc_compare_types (gfc_typespec *ts1, gfc_typespec *ts2)
e0e85e06 479{
a8b3b0b6
CR
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;
8b704316
PT
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
cf2b3c22
TB
497 if (ts1->type != ts2->type
498 && ((ts1->type != BT_DERIVED && ts1->type != BT_CLASS)
499 || (ts2->type != BT_DERIVED && ts2->type != BT_CLASS)))
e0e85e06 500 return 0;
cf2b3c22 501 if (ts1->type != BT_DERIVED && ts1->type != BT_CLASS)
e0e85e06
PT
502 return (ts1->kind == ts2->kind);
503
504 /* Compare derived types. */
cf2b3c22 505 if (gfc_type_compatible (ts1, ts2))
e0e85e06
PT
506 return 1;
507
bc21d315 508 return gfc_compare_derived_types (ts1->u.derived ,ts2->u.derived);
e0e85e06
PT
509}
510
6de9cd9a 511
e7333b69
JW
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
60de1c7d
TB
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
e7333b69
JW
524 return gfc_compare_types (&s1->ts, &s2->ts) || s2->ts.type == BT_ASSUMED;
525}
526
6de9cd9a
DN
527
528static int
e7333b69 529compare_rank (gfc_symbol *s1, gfc_symbol *s2)
6de9cd9a 530{
aa6590cf 531 gfc_array_spec *as1, *as2;
6de9cd9a
DN
532 int r1, r2;
533
e7333b69 534 if (s2->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
e7ac6a7c
TB
535 return 1;
536
aa6590cf
JW
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;
6de9cd9a 542
e7333b69 543 if (r1 != r2 && (!as2 || as2->type != AS_ASSUMED_RANK))
66e4ab31 544 return 0; /* Ranks differ. */
6de9cd9a 545
e7333b69
JW
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);
6de9cd9a
DN
558}
559
560
6de9cd9a
DN
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
b251af97 566compare_type_rank_if (gfc_symbol *s1, gfc_symbol *s2)
6de9cd9a 567{
26f2ca2b
PT
568 if (s1 == NULL || s2 == NULL)
569 return s1 == s2 ? 1 : 0;
6de9cd9a 570
489ec4e3
PT
571 if (s1 == s2)
572 return 1;
573
6de9cd9a
DN
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
489ec4e3
PT
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;
6de9cd9a 589
489ec4e3 590 /* Now the type of procedure has been identified. */
6de9cd9a
DN
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
993ef28f
PT
598 /* Originally, gfortran recursed here to check the interfaces of passed
599 procedures. This is explicitly not required by the standard. */
600 return 1;
6de9cd9a
DN
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 *
b251af97 609find_keyword_arg (const char *name, gfc_formal_arglist *f)
6de9cd9a 610{
6de9cd9a
DN
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
94747289
DK
625bool
626gfc_check_operator_interface (gfc_symbol *sym, gfc_intrinsic_op op,
627 locus opwhere)
6de9cd9a
DN
628{
629 gfc_formal_arglist *formal;
630 sym_intent i1, i2;
6de9cd9a 631 bt t1, t2;
27189292 632 int args, r1, r2, k1, k2;
6de9cd9a 633
94747289 634 gcc_assert (sym);
6de9cd9a
DN
635
636 args = 0;
637 t1 = t2 = BT_UNKNOWN;
638 i1 = i2 = INTENT_UNKNOWN;
27189292
FXC
639 r1 = r2 = -1;
640 k1 = k2 = -1;
6de9cd9a 641
4cbc9039 642 for (formal = gfc_sym_get_dummy_args (sym); formal; formal = formal->next)
6de9cd9a 643 {
94747289
DK
644 gfc_symbol *fsym = formal->sym;
645 if (fsym == NULL)
8c086c9c
PT
646 {
647 gfc_error ("Alternate return cannot appear in operator "
94747289
DK
648 "interface at %L", &sym->declared_at);
649 return false;
8c086c9c 650 }
6de9cd9a
DN
651 if (args == 0)
652 {
94747289
DK
653 t1 = fsym->ts.type;
654 i1 = fsym->attr.intent;
655 r1 = (fsym->as != NULL) ? fsym->as->rank : 0;
656 k1 = fsym->ts.kind;
6de9cd9a
DN
657 }
658 if (args == 1)
659 {
94747289
DK
660 t2 = fsym->ts.type;
661 i2 = fsym->attr.intent;
662 r2 = (fsym->as != NULL) ? fsym->as->rank : 0;
663 k2 = fsym->ts.kind;
6de9cd9a
DN
664 }
665 args++;
666 }
667
27189292
FXC
668 /* Only +, - and .not. can be unary operators.
669 .not. cannot be a binary operator. */
a1ee985f
KG
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))
27189292 674 {
efb63364
TB
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);
94747289 681 return false;
27189292
FXC
682 }
683
684 /* Check that intrinsics are mapped to functions, except
685 INTRINSIC_ASSIGN which should map to a subroutine. */
a1ee985f 686 if (op == INTRINSIC_ASSIGN)
6de9cd9a 687 {
4cbc9039
JW
688 gfc_formal_arglist *dummy_args;
689
6de9cd9a
DN
690 if (!sym->attr.subroutine)
691 {
b251af97 692 gfc_error ("Assignment operator interface at %L must be "
94747289
DK
693 "a SUBROUTINE", &sym->declared_at);
694 return false;
6de9cd9a 695 }
e19bb186
TB
696
697 /* Allowed are (per F2003, 12.3.2.1.2 Defined assignments):
94747289 698 - First argument an array with different rank than second,
315d905f
TB
699 - First argument is a scalar and second an array,
700 - Types and kinds do not conform, or
94747289 701 - First argument is of derived type. */
4cbc9039
JW
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
315d905f 705 && (r2 == 0 || r1 == r2)
4cbc9039
JW
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))))
8c086c9c 709 {
b251af97 710 gfc_error ("Assignment operator interface at %L must not redefine "
94747289
DK
711 "an INTRINSIC type assignment", &sym->declared_at);
712 return false;
8c086c9c 713 }
6de9cd9a
DN
714 }
715 else
716 {
717 if (!sym->attr.function)
718 {
719 gfc_error ("Intrinsic operator interface at %L must be a FUNCTION",
94747289
DK
720 &sym->declared_at);
721 return false;
6de9cd9a
DN
722 }
723 }
724
27189292 725 /* Check intents on operator interfaces. */
a1ee985f 726 if (op == INTRINSIC_ASSIGN)
6de9cd9a 727 {
27189292 728 if (i1 != INTENT_OUT && i1 != INTENT_INOUT)
94747289
DK
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 }
27189292
FXC
734
735 if (i2 != INTENT_IN)
94747289
DK
736 {
737 gfc_error ("Second argument of defined assignment at %L must be "
738 "INTENT(IN)", &sym->declared_at);
739 return false;
740 }
27189292
FXC
741 }
742 else
743 {
744 if (i1 != INTENT_IN)
94747289
DK
745 {
746 gfc_error ("First argument of operator interface at %L must be "
747 "INTENT(IN)", &sym->declared_at);
748 return false;
749 }
27189292
FXC
750
751 if (args == 2 && i2 != INTENT_IN)
94747289
DK
752 {
753 gfc_error ("Second argument of operator interface at %L must be "
754 "INTENT(IN)", &sym->declared_at);
755 return false;
756 }
27189292
FXC
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. */
a1ee985f 774 if (op == INTRINSIC_NOT)
27189292
FXC
775 {
776 if (t1 == BT_LOGICAL)
6de9cd9a 777 goto bad_repl;
27189292 778 else
94747289 779 return true;
27189292 780 }
6de9cd9a 781
a1ee985f 782 if (args == 1 && (op == INTRINSIC_PLUS || op == INTRINSIC_MINUS))
27189292
FXC
783 {
784 if (IS_NUMERIC_TYPE (t1))
6de9cd9a 785 goto bad_repl;
27189292 786 else
94747289 787 return true;
27189292 788 }
6de9cd9a 789
27189292
FXC
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)
94747289 794 return true;
6de9cd9a 795
27189292
FXC
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)
94747289 800 return true;
6de9cd9a 801
a1ee985f 802 switch (op)
27189292 803 {
6de9cd9a 804 case INTRINSIC_EQ:
3bed9dd0 805 case INTRINSIC_EQ_OS:
6de9cd9a 806 case INTRINSIC_NE:
3bed9dd0 807 case INTRINSIC_NE_OS:
27189292 808 if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
6de9cd9a 809 goto bad_repl;
27189292 810 /* Fall through. */
6de9cd9a 811
27189292
FXC
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;
6de9cd9a
DN
819 break;
820
6de9cd9a 821 case INTRINSIC_GT:
3bed9dd0 822 case INTRINSIC_GT_OS:
27189292 823 case INTRINSIC_GE:
3bed9dd0 824 case INTRINSIC_GE_OS:
27189292 825 case INTRINSIC_LT:
3bed9dd0 826 case INTRINSIC_LT_OS:
27189292 827 case INTRINSIC_LE:
3bed9dd0 828 case INTRINSIC_LE_OS:
27189292
FXC
829 if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
830 goto bad_repl;
6de9cd9a
DN
831 if ((t1 == BT_INTEGER || t1 == BT_REAL)
832 && (t2 == BT_INTEGER || t2 == BT_REAL))
833 goto bad_repl;
27189292 834 break;
6de9cd9a 835
27189292
FXC
836 case INTRINSIC_CONCAT:
837 if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
838 goto bad_repl;
6de9cd9a
DN
839 break;
840
6de9cd9a 841 case INTRINSIC_AND:
27189292 842 case INTRINSIC_OR:
6de9cd9a
DN
843 case INTRINSIC_EQV:
844 case INTRINSIC_NEQV:
6de9cd9a
DN
845 if (t1 == BT_LOGICAL && t2 == BT_LOGICAL)
846 goto bad_repl;
847 break;
848
6de9cd9a 849 default:
27189292
FXC
850 break;
851 }
6de9cd9a 852
94747289 853 return true;
6de9cd9a 854
27189292
FXC
855#undef IS_NUMERIC_TYPE
856
6de9cd9a
DN
857bad_repl:
858 gfc_error ("Operator interface at %L conflicts with intrinsic interface",
94747289
DK
859 &opwhere);
860 return false;
6de9cd9a
DN
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
6f3ab30d
JW
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). */
6de9cd9a
DN
872
873static int
6f3ab30d
JW
874count_types_test (gfc_formal_arglist *f1, gfc_formal_arglist *f2,
875 const char *p1, const char *p2)
6de9cd9a
DN
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. */
ece3f663 896 arg = XCNEWVEC (arginfo, n1);
6de9cd9a
DN
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
6f3ab30d
JW
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. */
6de9cd9a
DN
915
916 arg[i].flag = k;
917
6f3ab30d 918 /* Find other non-optional, non-pass arguments of the same type/rank. */
6de9cd9a 919 for (j = i + 1; j < n1; j++)
6f3ab30d
JW
920 if ((arg[j].sym == NULL
921 || !(arg[j].sym->attr.optional
922 || (p1 && strcmp (arg[j].sym->name, p1) == 0)))
2b603773
JW
923 && (compare_type_rank_if (arg[i].sym, arg[j].sym)
924 || compare_type_rank_if (arg[j].sym, arg[i].sym)))
6de9cd9a
DN
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
6f3ab30d
JW
944 /* Count the number of non-pass arguments in f2 with that type,
945 including those that are optional. */
6de9cd9a
DN
946 ac2 = 0;
947
948 for (f = f2; f; f = f->next)
6f3ab30d
JW
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)))
6de9cd9a
DN
952 ac2++;
953
954 if (ac1 > ac2)
955 {
956 rc = 1;
957 break;
958 }
959
960 k++;
961 }
962
cede9502 963 free (arg);
6de9cd9a
DN
964
965 return rc;
966}
967
968
e9355cc3
JW
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
6f3ab30d 972 (if applicable).
6de9cd9a
DN
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
e9355cc3
JW
979 SUBROUTINE F1(A, B)
980 INTEGER :: A ; REAL :: B
981 END SUBROUTINE F1
6de9cd9a 982
e9355cc3
JW
983 SUBROUTINE F2(B, A)
984 INTEGER :: A ; REAL :: B
985 END SUBROUTINE F1
6de9cd9a
DN
986 END INTERFACE FOO
987
988 At this point, 'CALL FOO(A=1, B=1.0)' is ambiguous. */
989
990static int
6f3ab30d
JW
991generic_correspondence (gfc_formal_arglist *f1, gfc_formal_arglist *f2,
992 const char *p1, const char *p2)
6de9cd9a 993{
6de9cd9a
DN
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
6f3ab30d
JW
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
2b603773 1009 if (f2 != NULL && (compare_type_rank (f1->sym, f2->sym)
e9355cc3
JW
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))))
6de9cd9a
DN
1014 goto next;
1015
1016 /* Now search for a disambiguating keyword argument starting at
b251af97 1017 the current non-match. */
6de9cd9a
DN
1018 for (g = f1; g; g = g->next)
1019 {
6f3ab30d 1020 if (g->sym->attr.optional || (p1 && strcmp (g->sym->name, p1) == 0))
6de9cd9a
DN
1021 continue;
1022
1023 sym = find_keyword_arg (g->sym->name, f2_save);
e9355cc3
JW
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))))
6de9cd9a
DN
1028 return 1;
1029 }
1030
1031 next:
6f3ab30d
JW
1032 if (f1 != NULL)
1033 f1 = f1->next;
6de9cd9a
DN
1034 if (f2 != NULL)
1035 f2 = f2->next;
1036 }
1037
1038 return 0;
1039}
1040
1041
e7333b69
JW
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
9795c594
JW
1051/* Check if the characteristics of two dummy arguments match,
1052 cf. F08:12.3.2. */
1053
524af0d6 1054static bool
9795c594
JW
1055check_dummy_characteristics (gfc_symbol *s1, gfc_symbol *s2,
1056 bool type_must_agree, char *errmsg, int err_len)
1057{
9362a03b 1058 if (s1 == NULL || s2 == NULL)
524af0d6 1059 return s1 == s2 ? true : false;
9362a03b 1060
9795c594 1061 /* Check type and rank. */
e7333b69 1062 if (type_must_agree)
9795c594 1063 {
e7333b69
JW
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 }
9795c594
JW
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);
524af0d6 1083 return false;
9795c594
JW
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);
524af0d6 1091 return false;
9795c594
JW
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);
524af0d6 1099 return false;
9795c594
JW
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);
524af0d6 1107 return false;
9795c594
JW
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);
524af0d6 1115 return false;
9795c594
JW
1116 }
1117
688974a3
JW
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 }
9795c594 1149
f2f8171f
JW
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);
524af0d6 1159 return false;
f2f8171f
JW
1160 }
1161 }
1162
9795c594
JW
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);
524af0d6 1177 return false;
9795c594
JW
1178
1179 case -2:
1180 /* FIXME: Implement a warning for this case.
48749dbc 1181 gfc_warning ("Possible character length mismatch in argument %qs",
9795c594
JW
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 {
97f26732
JW
1198 int i, compval;
1199 gfc_expr *shape1, *shape2;
1200
9795c594
JW
1201 if (s1->as->type != s2->as->type)
1202 {
1203 snprintf (errmsg, err_len, "Shape mismatch in argument '%s'",
1204 s1->name);
524af0d6 1205 return false;
9795c594 1206 }
97f26732 1207
b25affbd
TB
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
97f26732 1215 if (s1->as->type == AS_EXPLICIT)
47da0bf6 1216 for (i = 0; i < s1->as->rank + MAX (0, s1->as->corank-1); i++)
97f26732
JW
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:
b25affbd
TB
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);
524af0d6 1236 return false;
97f26732
JW
1237
1238 case -2:
1239 /* FIXME: Implement a warning for this case.
a4d9b221 1240 gfc_warning ("Possible shape mismatch in argument %qs",
97f26732
JW
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 }
9795c594 1254 }
8b704316 1255
524af0d6 1256 return true;
9795c594
JW
1257}
1258
1259
edc802c7
JW
1260/* Check if the characteristics of two function results match,
1261 cf. F08:12.3.3. */
1262
524af0d6 1263static bool
edc802c7
JW
1264check_result_characteristics (gfc_symbol *s1, gfc_symbol *s2,
1265 char *errmsg, int err_len)
1266{
1267 gfc_symbol *r1, *r2;
1268
82b541a1
JW
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;
edc802c7
JW
1278
1279 if (r1->ts.type == BT_UNKNOWN)
524af0d6 1280 return true;
edc802c7
JW
1281
1282 /* Check type and rank. */
e7333b69 1283 if (!compare_type (r1, r2))
edc802c7 1284 {
e7333b69
JW
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));
524af0d6 1293 return false;
edc802c7
JW
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");
524af0d6 1301 return false;
edc802c7
JW
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");
524af0d6 1309 return false;
edc802c7
JW
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");
524af0d6 1317 return false;
edc802c7
JW
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");
524af0d6 1325 return false;
edc802c7
JW
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");
524af0d6 1335 return false;
edc802c7
JW
1336 }
1337
96486998 1338 if (r1->ts.u.cl->length && r2->ts.u.cl->length)
edc802c7
JW
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");
524af0d6 1349 return false;
edc802c7
JW
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");
524af0d6 1377 return false;
edc802c7
JW
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);
524af0d6 1397 return false;
edc802c7
JW
1398
1399 case -2:
1400 /* FIXME: Implement a warning for this case.
1401 gfc_warning ("Possible shape mismatch in return value");*/
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
524af0d6 1416 return true;
edc802c7
JW
1417}
1418
1419
6de9cd9a
DN
1420/* 'Compare' two formal interfaces associated with a pair of symbols.
1421 We return nonzero if there exists an actual argument list that
8ad15a0a 1422 would be ambiguous between the two interfaces, zero otherwise.
58c1ae36 1423 'strict_flag' specifies whether all the characteristics are
6f3ab30d
JW
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). */
6de9cd9a 1426
e157f736 1427int
889dc035 1428gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol *s2, const char *name2,
58c1ae36 1429 int generic_flag, int strict_flag,
6f3ab30d
JW
1430 char *errmsg, int err_len,
1431 const char *p1, const char *p2)
6de9cd9a
DN
1432{
1433 gfc_formal_arglist *f1, *f2;
1434
0175478d
JD
1435 gcc_assert (name2 != NULL);
1436
9b63f282
JW
1437 if (s1->attr.function && (s2->attr.subroutine
1438 || (!s2->attr.function && s2->ts.type == BT_UNKNOWN
889dc035 1439 && gfc_get_default_type (name2, s2->ns)->type == BT_UNKNOWN)))
8ad15a0a
JW
1440 {
1441 if (errmsg != NULL)
889dc035 1442 snprintf (errmsg, err_len, "'%s' is not a function", name2);
8ad15a0a
JW
1443 return 0;
1444 }
1445
1446 if (s1->attr.subroutine && s2->attr.function)
1447 {
1448 if (errmsg != NULL)
889dc035 1449 snprintf (errmsg, err_len, "'%s' is not a subroutine", name2);
8ad15a0a
JW
1450 return 0;
1451 }
3afadac3 1452
58c1ae36
JW
1453 /* Do strict checks on all characteristics
1454 (for dummy procedures and procedure pointer assignments). */
1455 if (!generic_flag && strict_flag)
6cc309c9 1456 {
58c1ae36 1457 if (s1->attr.function && s2->attr.function)
8ad15a0a 1458 {
edc802c7 1459 /* If both are functions, check result characteristics. */
1f46d137
JW
1460 if (!check_result_characteristics (s1, s2, errmsg, err_len)
1461 || !check_result_characteristics (s2, s1, errmsg, err_len))
edc802c7 1462 return 0;
58c1ae36
JW
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");
8ad15a0a
JW
1473 return 0;
1474 }
6cc309c9 1475 }
26033479 1476
8ad15a0a
JW
1477 if (s1->attr.if_source == IFSRC_UNKNOWN
1478 || s2->attr.if_source == IFSRC_UNKNOWN)
26033479 1479 return 1;
26033479 1480
4cbc9039
JW
1481 f1 = gfc_sym_get_dummy_args (s1);
1482 f2 = gfc_sym_get_dummy_args (s2);
26033479 1483
c73b6478 1484 if (f1 == NULL && f2 == NULL)
8ad15a0a 1485 return 1; /* Special case: No arguments. */
6cc309c9 1486
c73b6478 1487 if (generic_flag)
6cc309c9 1488 {
6f3ab30d
JW
1489 if (count_types_test (f1, f2, p1, p2)
1490 || count_types_test (f2, f1, p2, p1))
e26f5548 1491 return 0;
6f3ab30d
JW
1492 if (generic_correspondence (f1, f2, p1, p2)
1493 || generic_correspondence (f2, f1, p2, p1))
6cc309c9 1494 return 0;
6cc309c9 1495 }
c73b6478 1496 else
8ad15a0a
JW
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 "
889dc035 1511 "arguments", name2);
8ad15a0a
JW
1512 return 0;
1513 }
1514
8b704316
PT
1515 if (UNLIMITED_POLY (f1->sym))
1516 goto next;
1517
58c1ae36 1518 if (strict_flag)
8ad15a0a 1519 {
9795c594 1520 /* Check all characteristics. */
524af0d6
JB
1521 if (!check_dummy_characteristics (f1->sym, f2->sym, true,
1522 errmsg, err_len))
9795c594
JW
1523 return 0;
1524 }
e7333b69 1525 else
9795c594
JW
1526 {
1527 /* Only check type and rank. */
e7333b69
JW
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 }
8ad15a0a 1545 }
8b704316 1546next:
8ad15a0a
JW
1547 f1 = f1->next;
1548 f2 = f2->next;
1549 }
1550
6cc309c9
JD
1551 return 1;
1552}
1553
1554
6de9cd9a 1555/* Given a pointer to an interface pointer, remove duplicate
284d58f1
DF
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. */
6de9cd9a
DN
1559
1560static int
b251af97 1561check_interface0 (gfc_interface *p, const char *interface_name)
6de9cd9a
DN
1562{
1563 gfc_interface *psave, *q, *qlast;
1564
1565 psave = p;
6de9cd9a 1566 for (; p; p = p->next)
284d58f1
DF
1567 {
1568 /* Make sure all symbols in the interface have been defined as
1569 functions or subroutines. */
c3f34952
TB
1570 if (((!p->sym->attr.function && !p->sym->attr.subroutine)
1571 || !p->sym->attr.if_source)
1572 && p->sym->attr.flavor != FL_DERIVED)
284d58f1
DF
1573 {
1574 if (p->sym->attr.external)
c4100eae 1575 gfc_error ("Procedure %qs in %s at %L has no explicit interface",
284d58f1
DF
1576 p->sym->name, interface_name, &p->sym->declared_at);
1577 else
c4100eae 1578 gfc_error ("Procedure %qs in %s at %L is neither function nor "
284d58f1
DF
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. */
c3f34952
TB
1585 if ((psave->sym->attr.function && !p->sym->attr.function
1586 && p->sym->attr.flavor != FL_DERIVED)
284d58f1
DF
1587 || (psave->sym->attr.subroutine && !p->sym->attr.subroutine))
1588 {
c3f34952
TB
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);
284d58f1
DF
1597 return 1;
1598 }
a300121e 1599
d2c5dbf2 1600 /* F2003, C1207. F2008, C1207. */
a300121e 1601 if (p->sym->attr.proc == PROC_INTERNAL
524af0d6 1602 && !gfc_notify_std (GFC_STD_F2008, "Internal procedure "
a4d9b221 1603 "%qs in %s at %L", p->sym->name,
524af0d6 1604 interface_name, &p->sym->declared_at))
a300121e 1605 return 1;
284d58f1 1606 }
6de9cd9a
DN
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;
6de9cd9a
DN
1620 }
1621 else
1622 {
66e4ab31 1623 /* Duplicate interface. */
6de9cd9a 1624 qlast->next = q->next;
cede9502 1625 free (q);
6de9cd9a
DN
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
66e4ab31 1636 ambiguous. Duplicate interfaces (from the same symbol) are OK here. */
6de9cd9a
DN
1637
1638static int
b251af97 1639check_interface1 (gfc_interface *p, gfc_interface *q0,
993ef28f 1640 int generic_flag, const char *interface_name,
26f2ca2b 1641 bool referenced)
6de9cd9a 1642{
b251af97 1643 gfc_interface *q;
6de9cd9a 1644 for (; p; p = p->next)
991f3b12 1645 for (q = q0; q; q = q->next)
6de9cd9a
DN
1646 {
1647 if (p->sym == q->sym)
66e4ab31 1648 continue; /* Duplicates OK here. */
6de9cd9a 1649
312ae8f4 1650 if (p->sym->name == q->sym->name && p->sym->module == q->sym->module)
6de9cd9a
DN
1651 continue;
1652
c3f34952
TB
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,
6f3ab30d 1656 generic_flag, 0, NULL, 0, NULL, NULL))
6de9cd9a 1657 {
993ef28f 1658 if (referenced)
c4100eae 1659 gfc_error ("Ambiguous interfaces %qs and %qs in %s at %L",
ae7c61de
JW
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)
48749dbc 1663 gfc_warning ("Ambiguous interfaces %qs and %qs in %s at %L",
993ef28f
PT
1664 p->sym->name, q->sym->name, interface_name,
1665 &p->where);
ae7c61de 1666 else
48749dbc 1667 gfc_warning ("Although not referenced, %qs has ambiguous "
ae7c61de 1668 "interfaces at %L", interface_name, &p->where);
6de9cd9a
DN
1669 return 1;
1670 }
1671 }
6de9cd9a
DN
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
b251af97 1681check_sym_interfaces (gfc_symbol *sym)
6de9cd9a
DN
1682{
1683 char interface_name[100];
71f77fd7 1684 gfc_interface *p;
6de9cd9a
DN
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
71f77fd7
PT
1695 for (p = sym->generic; p; p = p->next)
1696 {
abf86978
TB
1697 if (p->sym->attr.mod_proc
1698 && (p->sym->attr.if_source != IFSRC_DECL
1699 || p->sym->attr.procedure))
71f77fd7 1700 {
c4100eae 1701 gfc_error ("%qs at %L is not a module procedure",
e9f63ace 1702 p->sym->name, &p->where);
71f77fd7
PT
1703 return;
1704 }
1705 }
1706
4c256e34 1707 /* Originally, this test was applied to host interfaces too;
993ef28f
PT
1708 this is incorrect since host associated symbols, from any
1709 source, cannot be ambiguous with local symbols. */
ae7c61de
JW
1710 check_interface1 (sym->generic, sym->generic, 1, interface_name,
1711 sym->attr.referenced || !sym->attr.use_assoc);
6de9cd9a
DN
1712 }
1713}
1714
1715
1716static void
b251af97 1717check_uop_interfaces (gfc_user_op *uop)
6de9cd9a
DN
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);
a1ee985f 1724 if (check_interface0 (uop->op, interface_name))
6de9cd9a
DN
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
a1ee985f 1733 check_interface1 (uop->op, uop2->op, 0,
26f2ca2b 1734 interface_name, true);
6de9cd9a
DN
1735 }
1736}
1737
fb03a37e
TK
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}
6de9cd9a
DN
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
b251af97 1793gfc_check_interfaces (gfc_namespace *ns)
6de9cd9a
DN
1794{
1795 gfc_namespace *old_ns, *ns2;
1796 char interface_name[100];
09639a83 1797 int i;
6de9cd9a
DN
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",
09639a83 1815 gfc_op2string ((gfc_intrinsic_op) i));
6de9cd9a 1816
a1ee985f 1817 if (check_interface0 (ns->op[i], interface_name))
6de9cd9a
DN
1818 continue;
1819
94747289
DK
1820 if (ns->op[i])
1821 gfc_check_operator_interface (ns->op[i]->sym, (gfc_intrinsic_op) i,
1822 ns->op[i]->where);
6de9cd9a 1823
3bed9dd0
DF
1824 for (ns2 = ns; ns2; ns2 = ns2->parent)
1825 {
fb03a37e 1826 gfc_intrinsic_op other_op;
8b704316 1827
a1ee985f 1828 if (check_interface1 (ns->op[i], ns2->op[i], 0,
3bed9dd0
DF
1829 interface_name, true))
1830 goto done;
1831
fb03a37e
TK
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;
3bed9dd0 1839 }
6de9cd9a
DN
1840 }
1841
3bed9dd0 1842done:
6de9cd9a
DN
1843 gfc_current_ns = old_ns;
1844}
1845
1846
aa08038d
EE
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
b251af97 1852compare_allocatable (gfc_symbol *formal, gfc_expr *actual)
aa08038d
EE
1853{
1854 symbol_attribute attr;
1855
5ac13b8e
JW
1856 if (formal->attr.allocatable
1857 || (formal->ts.type == BT_CLASS && CLASS_DATA (formal)->attr.allocatable))
aa08038d
EE
1858 {
1859 attr = gfc_expr_attr (actual);
1860 if (!attr.allocatable)
1861 return 0;
1862 }
1863
1864 return 1;
1865}
1866
1867
6de9cd9a
DN
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
b251af97 1873compare_pointer (gfc_symbol *formal, gfc_expr *actual)
6de9cd9a
DN
1874{
1875 symbol_attribute attr;
1876
f18075ff
TB
1877 if (formal->attr.pointer
1878 || (formal->ts.type == BT_CLASS && CLASS_DATA (formal)
1879 && CLASS_DATA (formal)->attr.class_pointer))
6de9cd9a
DN
1880 {
1881 attr = gfc_expr_attr (actual);
7d54ef80
TB
1882
1883 /* Fortran 2008 allows non-pointer actual arguments. */
1884 if (!attr.pointer && attr.target && formal->attr.intent == INTENT_IN)
1885 return 2;
1886
6de9cd9a
DN
1887 if (!attr.pointer)
1888 return 0;
1889 }
1890
1891 return 1;
1892}
1893
1894
a516520c
PT
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{
c62c6622
TB
1901
1902 /* TS 29113, C407b. */
1903 if (rank2 == -1)
1904 {
1905 gfc_error ("The assumed-rank array at %L requires that the dummy argument"
c4100eae 1906 " %qs has assumed-rank", where, name);
c62c6622
TB
1907 }
1908 else if (rank1 == 0)
a516520c 1909 {
c4100eae 1910 gfc_error ("Rank mismatch in argument %qs at %L "
a516520c
PT
1911 "(scalar and rank-%d)", name, where, rank2);
1912 }
1913 else if (rank2 == 0)
1914 {
c4100eae 1915 gfc_error ("Rank mismatch in argument %qs at %L "
a516520c
PT
1916 "(rank-%d and scalar)", name, where, rank1);
1917 }
1918 else
8b704316 1919 {
c4100eae 1920 gfc_error ("Rank mismatch in argument %qs at %L "
a516520c
PT
1921 "(rank-%d and rank-%d)", name, where, rank1, rank2);
1922 }
1923}
1924
1925
6de9cd9a
DN
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
b251af97 1931compare_parameter (gfc_symbol *formal, gfc_expr *actual,
5ad6345e 1932 int ranks_must_agree, int is_elemental, locus *where)
6de9cd9a
DN
1933{
1934 gfc_ref *ref;
975b975b 1935 bool rank_check, is_pointer;
5c0ba546
JW
1936 char err[200];
1937 gfc_component *ppc;
6de9cd9a 1938
a8b3b0b6
CR
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
bc21d315 1946 && formal->ts.u.derived && formal->ts.u.derived->ts.is_iso_c
a8b3b0b6 1947 && actual->ts.type == BT_DERIVED
bc21d315 1948 && actual->ts.u.derived && actual->ts.u.derived->ts.is_iso_c)
a8b3b0b6
CR
1949 return 1;
1950
7d58b9e7 1951 if (formal->ts.type == BT_CLASS && actual->ts.type == BT_DERIVED)
e10f52d0
JW
1952 /* Make sure the vtab symbol is present when
1953 the module variables are generated. */
7d58b9e7 1954 gfc_find_derived_vtab (actual->ts.u.derived);
e10f52d0 1955
6de9cd9a
DN
1956 if (actual->ts.type == BT_PROCEDURE)
1957 {
9b63f282 1958 gfc_symbol *act_sym = actual->symtree->n.sym;
6de9cd9a 1959
8ad15a0a
JW
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 }
6de9cd9a 1966
889dc035 1967 if (!gfc_compare_interfaces (formal, act_sym, act_sym->name, 0, 1, err,
6f3ab30d 1968 sizeof(err), NULL, NULL))
8ad15a0a
JW
1969 {
1970 if (where)
c4100eae 1971 gfc_error ("Interface mismatch in dummy procedure %qs at %L: %s",
8ad15a0a
JW
1972 formal->name, &actual->where, err);
1973 return 0;
1974 }
5ad6345e 1975
9b63f282 1976 if (formal->attr.function && !act_sym->attr.function)
03bd096b
JW
1977 {
1978 gfc_add_function (&act_sym->attr, act_sym->name,
1979 &act_sym->declared_at);
1980 if (act_sym->ts.type == BT_UNKNOWN
524af0d6 1981 && !gfc_set_default_type (act_sym, 1, act_sym->ns))
03bd096b
JW
1982 return 0;
1983 }
1984 else if (formal->attr.subroutine && !act_sym->attr.subroutine)
9b63f282
JW
1985 gfc_add_subroutine (&act_sym->attr, act_sym->name,
1986 &act_sym->declared_at);
1987
5ad6345e 1988 return 1;
6de9cd9a
DN
1989 }
1990
5c0ba546
JW
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
fe4e525c
TB
2004 /* F2008, C1241. */
2005 if (formal->attr.pointer && formal->attr.contiguous
2006 && !gfc_is_simply_contiguous (actual, true))
2007 {
2008 if (where)
c4100eae 2009 gfc_error ("Actual argument to contiguous pointer dummy %qs at %L "
62732c30 2010 "must be simply contiguous", formal->name, &actual->where);
fe4e525c
TB
2011 return 0;
2012 }
2013
90aeadcb 2014 if ((actual->expr_type != EXPR_NULL || actual->ts.type != BT_UNKNOWN)
df161b69 2015 && actual->ts.type != BT_HOLLERITH
45a69325 2016 && formal->ts.type != BT_ASSUMED
e7ac6a7c 2017 && !(formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
c49ea23d
PT
2018 && !gfc_compare_types (&formal->ts, &actual->ts)
2019 && !(formal->ts.type == BT_DERIVED && actual->ts.type == BT_CLASS
8b704316 2020 && gfc_compare_derived_types (formal->ts.u.derived,
c49ea23d 2021 CLASS_DATA (actual)->ts.u.derived)))
5ad6345e 2022 {
d68e117b 2023 if (where)
c4100eae 2024 gfc_error ("Type mismatch in argument %qs at %L; passed %s to %s",
d68e117b
TB
2025 formal->name, &actual->where, gfc_typename (&actual->ts),
2026 gfc_typename (&formal->ts));
5ad6345e
TB
2027 return 0;
2028 }
f18075ff 2029
3d54e576
TB
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 "
c4100eae 2034 "argument %qs is of assumed type", &actual->where,
3d54e576
TB
2035 formal->name);
2036 return 0;
2037 }
2038
f18075ff 2039 /* F2008, 12.5.2.5; IR F08/0073. */
67b1d004
JW
2040 if (formal->ts.type == BT_CLASS && formal->attr.class_ok
2041 && actual->expr_type != EXPR_NULL
f18075ff 2042 && ((CLASS_DATA (formal)->attr.class_pointer
86eb9e2f 2043 && formal->attr.intent != INTENT_IN)
5ac13b8e
JW
2044 || CLASS_DATA (formal)->attr.allocatable))
2045 {
2046 if (actual->ts.type != BT_CLASS)
2047 {
2048 if (where)
c4100eae 2049 gfc_error ("Actual argument to %qs at %L must be polymorphic",
5ac13b8e
JW
2050 formal->name, &actual->where);
2051 return 0;
2052 }
67b1d004
JW
2053
2054 if (!gfc_expr_attr (actual).class_ok)
2055 return 0;
2056
a8267f8d
TB
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))
5ac13b8e
JW
2060 {
2061 if (where)
c4100eae 2062 gfc_error ("Actual argument to %qs at %L must have the same "
5ac13b8e
JW
2063 "declared type", formal->name, &actual->where);
2064 return 0;
2065 }
2066 }
6de9cd9a 2067
8b704316
PT
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)
c4100eae 2077 gfc_error ("Actual argument to %qs at %L must be unlimited "
8b704316
PT
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
394d3a2e 2085 if (formal->attr.codimension && !gfc_is_coarray (actual))
d3a9eea2 2086 {
394d3a2e 2087 if (where)
c4100eae 2088 gfc_error ("Actual argument to %qs at %L must be a coarray",
d3a9eea2 2089 formal->name, &actual->where);
394d3a2e
TB
2090 return 0;
2091 }
d3a9eea2 2092
394d3a2e
TB
2093 if (formal->attr.codimension && formal->attr.allocatable)
2094 {
2095 gfc_ref *last = NULL;
a3935ffc 2096
d3a9eea2 2097 for (ref = actual->ref; ref; ref = ref->next)
394d3a2e
TB
2098 if (ref->type == REF_COMPONENT)
2099 last = ref;
d3a9eea2 2100
d3a9eea2 2101 /* F2008, 12.5.2.6. */
394d3a2e
TB
2102 if ((last && last->u.c.component->as->corank != formal->as->corank)
2103 || (!last
2104 && actual->symtree->n.sym->as->corank != formal->as->corank))
d3a9eea2
TB
2105 {
2106 if (where)
c4100eae 2107 gfc_error ("Corank mismatch in argument %qs at %L (%d and %d)",
d3a9eea2
TB
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 }
394d3a2e 2113 }
fe4e525c 2114
394d3a2e
TB
2115 if (formal->attr.codimension)
2116 {
fe4e525c
TB
2117 /* F2008, 12.5.2.8. */
2118 if (formal->attr.dimension
2119 && (formal->attr.contiguous || formal->as->type != AS_ASSUMED_SHAPE)
e6242bc7 2120 && gfc_expr_attr (actual).dimension
fe4e525c
TB
2121 && !gfc_is_simply_contiguous (actual, true))
2122 {
2123 if (where)
c4100eae 2124 gfc_error ("Actual argument to %qs at %L must be simply "
fe4e525c
TB
2125 "contiguous", formal->name, &actual->where);
2126 return 0;
2127 }
fea54935
TB
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)
c4100eae 2138 gfc_error ("Actual argument to non-INTENT(INOUT) dummy %qs at %L, "
fea54935
TB
2139 "which is LOCK_TYPE or has a LOCK_TYPE component",
2140 formal->name, &actual->where);
2141 return 0;
2142 }
394d3a2e 2143 }
fe4e525c
TB
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_)
627b82f2 2150 && actual->rank && formal->as && !gfc_is_simply_contiguous (actual, true)
f188272d
TB
2151 && ((formal->as->type != AS_ASSUMED_SHAPE
2152 && formal->as->type != AS_ASSUMED_RANK && !formal->attr.pointer)
fe4e525c
TB
2153 || formal->attr.contiguous))
2154 {
2155 if (where)
c4100eae 2156 gfc_error ("Dummy argument %qs has to be a pointer, assumed-shape or "
f188272d
TB
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);
fe4e525c 2160 return 0;
d3a9eea2
TB
2161 }
2162
427180d2
TB
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, "
c4100eae 2170 "INTENT(OUT) dummy argument %qs", &actual->where,
427180d2
TB
2171 formal->name);
2172 return 0;
2173 }
73e42eef 2174 else if (warn_surprising && where && formal->attr.intent != INTENT_IN)
48749dbc
MLI
2175 gfc_warning (OPT_Wsurprising,
2176 "Passing coarray at %L to allocatable, noncoarray dummy "
2177 "argument %qs, which is invalid if the allocation status"
427180d2
TB
2178 " is modified", &actual->where, formal->name);
2179 }
2180
c62c6622
TB
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)
6de9cd9a
DN
2183 return 1;
2184
5ad6345e
TB
2185 rank_check = where != NULL && !is_elemental && formal->as
2186 && (formal->as->type == AS_ASSUMED_SHAPE
d8a8dab3
TB
2187 || formal->as->type == AS_DEFERRED)
2188 && actual->expr_type != EXPR_NULL;
6de9cd9a 2189
e7ac6a7c
TB
2190 /* Skip rank checks for NO_ARG_CHECK. */
2191 if (formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
2192 return 1;
2193
d3a9eea2 2194 /* Scalar & coindexed, see: F2008, Section 12.5.2.4. */
d8a8dab3
TB
2195 if (rank_check || ranks_must_agree
2196 || (formal->attr.pointer && actual->expr_type != EXPR_NULL)
5ad6345e 2197 || (actual->rank != 0 && !(is_elemental || formal->attr.dimension))
c49ea23d
PT
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))
08857b61 2203 && actual->expr_type != EXPR_NULL)
d3a9eea2
TB
2204 || (actual->rank == 0 && formal->attr.dimension
2205 && gfc_is_coindexed (actual)))
5ad6345e
TB
2206 {
2207 if (where)
a516520c
PT
2208 argument_rank_mismatch (formal->name, &actual->where,
2209 symbol_rank (formal), actual->rank);
6de9cd9a 2210 return 0;
5ad6345e
TB
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
975b975b 2216 is valid (cf. F95 12.4.1.1, F2003 12.4.1.2, and F2008 12.5.2.4),
5ad6345e 2217 - if the actual argument is (a substring of) an element of a
975b975b
TB
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;
6de9cd9a
DN
2224
2225 for (ref = actual->ref; ref; ref = ref->next)
975b975b
TB
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
8b704316 2231 && (!ref->next
975b975b
TB
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)
c4100eae 2239 gfc_error ("Polymorphic scalar passed to array dummy argument %qs "
975b975b
TB
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 "
c4100eae 2249 "array passed to array dummy argument %qs at %L",
975b975b
TB
2250 formal->name, &actual->where);
2251 return 0;
2252 }
6de9cd9a 2253
975b975b
TB
2254 if (actual->ts.type == BT_CHARACTER && actual->expr_type != EXPR_NULL
2255 && (!ref || is_pointer || ref->u.ar.as->type == AS_ASSUMED_SHAPE))
5ad6345e 2256 {
975b975b
TB
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 "
c4100eae 2262 "%qs at %L", formal->name, &actual->where);
975b975b
TB
2263 return 0;
2264 }
2265
5ad6345e
TB
2266 if (where && (gfc_option.allow_std & GFC_STD_F2003) == 0)
2267 {
2268 gfc_error ("Fortran 2003: Scalar CHARACTER actual argument with "
c4100eae 2269 "array dummy argument %qs at %L",
5ad6345e
TB
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 }
975b975b
TB
2278
2279 if (ref == NULL && actual->expr_type != EXPR_NULL)
5ad6345e
TB
2280 {
2281 if (where)
a516520c
PT
2282 argument_rank_mismatch (formal->name, &actual->where,
2283 symbol_rank (formal), actual->rank);
5ad6345e
TB
2284 return 0;
2285 }
2286
6de9cd9a
DN
2287 return 1;
2288}
2289
2290
2d5b90b2
TB
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 {
bc21d315
JW
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);
2d5b90b2
TB
2305 else
2306 return 0;
2307 }
2308 else
8b704316 2309 strlen = 1;
2d5b90b2
TB
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 {
efb63364 2319 if (sym->as->upper[i]->expr_type != EXPR_CONSTANT
2d5b90b2
TB
2320 || sym->as->lower[i]->expr_type != EXPR_CONSTANT)
2321 return 0;
2322
c13af44b
SK
2323 elements *= mpz_get_si (sym->as->upper[i]->value.integer)
2324 - mpz_get_si (sym->as->lower[i]->value.integer) + 1L;
2d5b90b2
TB
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
1207ac67 2333 the remaining size as the element sequence consists of all storage
2d5b90b2
TB
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;
6da0839a 2341 long int substrlen = 0;
a0710c29 2342 bool is_str_storage = false;
2d5b90b2
TB
2343 gfc_ref *ref;
2344
2345 if (e == NULL)
2346 return 0;
8b704316 2347
2d5b90b2
TB
2348 if (e->ts.type == BT_CHARACTER)
2349 {
bc21d315
JW
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);
2d5b90b2 2353 else if (e->expr_type == EXPR_CONSTANT
bc21d315 2354 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
2d5b90b2
TB
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 {
6da0839a
TB
2377 if (ref->type == REF_SUBSTRING && ref->u.ss.start
2378 && ref->u.ss.start->expr_type == EXPR_CONSTANT)
2379 {
a0710c29
TB
2380 if (is_str_storage)
2381 {
2382 /* The string length is the substring length.
2383 Set now to full string length. */
e323640f 2384 if (!ref->u.ss.length || !ref->u.ss.length->length
a0710c29
TB
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;
6da0839a
TB
2391 continue;
2392 }
2393
efb63364 2394 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2d5b90b2
TB
2395 for (i = 0; i < ref->u.ar.dimen; i++)
2396 {
2397 long int start, end, stride;
2398 stride = 1;
37639728 2399
2d5b90b2
TB
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 }
37639728
TB
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;
2d5b90b2
TB
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 }
c6423ef3 2436 else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_FULL)
2d5b90b2
TB
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)
da9ad923
TB
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)
2d5b90b2
TB
2444 + 1L;
2445 else
2446 return 0;
2447 }
6da0839a 2448 else if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT
a0710c29
TB
2449 && e->expr_type == EXPR_VARIABLE)
2450 {
93302a24 2451 if (ref->u.ar.as->type == AS_ASSUMED_SHAPE
a0710c29
TB
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 }
3436db75
JW
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 }
2d5b90b2
TB
2498 }
2499
6da0839a 2500 if (substrlen)
a0710c29
TB
2501 return (is_str_storage) ? substrlen + (elements-1)*strlen
2502 : elements*strlen;
2503 else
2504 return elements*strlen;
2d5b90b2
TB
2505}
2506
2507
59be8071
TB
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
03af1e4c
DK
2512int
2513gfc_has_vector_subscript (gfc_expr *e)
59be8071
TB
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
4294c093
JW
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
6de9cd9a
DN
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
f0ac18b7
DK
2550static int
2551compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
2552 int ranks_must_agree, int is_elemental, locus *where)
6de9cd9a 2553{
7b901ac4 2554 gfc_actual_arglist **new_arg, *a, *actual, temp;
6de9cd9a
DN
2555 gfc_formal_arglist *f;
2556 int i, n, na;
2d5b90b2 2557 unsigned long actual_size, formal_size;
c49ea23d 2558 bool full_array = false;
6de9cd9a
DN
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
1145e690 2569 new_arg = XALLOCAVEC (gfc_actual_arglist *, n);
6de9cd9a
DN
2570
2571 for (i = 0; i < n; i++)
7b901ac4 2572 new_arg[i] = NULL;
6de9cd9a
DN
2573
2574 na = 0;
2575 f = formal;
2576 i = 0;
2577
2578 for (a = actual; a; a = a->next, f = f->next)
2579 {
7fcafa71
PT
2580 /* Look for keywords but ignore g77 extensions like %VAL. */
2581 if (a->name != NULL && a->name[0] != '%')
6de9cd9a
DN
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)
c4100eae 2595 gfc_error ("Keyword argument %qs at %L is not in "
b251af97 2596 "the procedure", a->name, &a->expr->where);
6de9cd9a
DN
2597 return 0;
2598 }
2599
7b901ac4 2600 if (new_arg[i] != NULL)
6de9cd9a
DN
2601 {
2602 if (where)
c4100eae 2603 gfc_error ("Keyword argument %qs at %L is already associated "
b251af97
SK
2604 "with another actual argument", a->name,
2605 &a->expr->where);
6de9cd9a
DN
2606 return 0;
2607 }
2608 }
2609
2610 if (f == NULL)
2611 {
2612 if (where)
b251af97
SK
2613 gfc_error ("More actual than formal arguments in procedure "
2614 "call at %L", where);
6de9cd9a
DN
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)
b251af97
SK
2625 gfc_error ("Missing alternate return spec in subroutine call "
2626 "at %L", where);
6de9cd9a
DN
2627 return 0;
2628 }
2629
2630 if (a->expr == NULL)
2631 {
2632 if (where)
b251af97
SK
2633 gfc_error ("Unexpected alternate return spec in subroutine "
2634 "call at %L", where);
6de9cd9a
DN
2635 return 0;
2636 }
08857b61 2637
8b704316
PT
2638 /* Make sure that intrinsic vtables exist for calls to unlimited
2639 polymorphic formal arguments. */
524af0d6 2640 if (UNLIMITED_POLY (f->sym)
8b704316
PT
2641 && a->expr->ts.type != BT_DERIVED
2642 && a->expr->ts.type != BT_CLASS)
7289d1c9 2643 gfc_find_vtab (&a->expr->ts);
8b704316 2644
99091b70
TB
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))))
08857b61 2654 {
99091b70
TB
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)))
c4100eae 2660 gfc_error ("Unexpected NULL() intrinsic at %L to dummy %qs",
08857b61
TB
2661 where, f->sym->name);
2662 else if (where)
2663 gfc_error ("Fortran 2008: Null pointer at %L to non-pointer "
c4100eae 2664 "dummy %qs", where, f->sym->name);
08857b61
TB
2665
2666 return 0;
2667 }
8b704316 2668
5ad6345e
TB
2669 if (!compare_parameter (f->sym, a->expr, ranks_must_agree,
2670 is_elemental, where))
2671 return 0;
6de9cd9a 2672
45a69325
TB
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);
524af0d6 2690 return false;
45a69325
TB
2691 }
2692 }
2693
a0710c29
TB
2694 /* Special case for character arguments. For allocatable, pointer
2695 and assumed-shape dummies, the string length needs to match
2696 exactly. */
2d5b90b2 2697 if (a->expr->ts.type == BT_CHARACTER
bc21d315
JW
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
a0710c29
TB
2702 && (f->sym->attr.pointer || f->sym->attr.allocatable
2703 || (f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
bc21d315
JW
2704 && (mpz_cmp (a->expr->ts.u.cl->length->value.integer,
2705 f->sym->ts.u.cl->length->value.integer) != 0))
a0324f7b 2706 {
a0710c29
TB
2707 if (where && (f->sym->attr.pointer || f->sym->attr.allocatable))
2708 gfc_warning ("Character length mismatch (%ld/%ld) between actual "
2709 "argument and pointer or allocatable dummy argument "
48749dbc 2710 "%qs at %L",
bc21d315
JW
2711 mpz_get_si (a->expr->ts.u.cl->length->value.integer),
2712 mpz_get_si (f->sym->ts.u.cl->length->value.integer),
a0710c29
TB
2713 f->sym->name, &a->expr->where);
2714 else if (where)
2715 gfc_warning ("Character length mismatch (%ld/%ld) between actual "
48749dbc 2716 "argument and assumed-shape dummy argument %qs "
a0710c29 2717 "at %L",
bc21d315
JW
2718 mpz_get_si (a->expr->ts.u.cl->length->value.integer),
2719 mpz_get_si (f->sym->ts.u.cl->length->value.integer),
a0710c29
TB
2720 f->sym->name, &a->expr->where);
2721 return 0;
a0324f7b
TB
2722 }
2723
8d51f26f
PT
2724 if ((f->sym->attr.pointer || f->sym->attr.allocatable)
2725 && f->sym->ts.deferred != a->expr->ts.deferred
2726 && a->expr->ts.type == BT_CHARACTER)
2727 {
2728 if (where)
0c133211 2729 gfc_error ("Actual argument at %L to allocatable or "
c4100eae 2730 "pointer dummy argument %qs must have a deferred "
8d51f26f
PT
2731 "length type parameter if and only if the dummy has one",
2732 &a->expr->where, f->sym->name);
2733 return 0;
2734 }
2735
c49ea23d
PT
2736 if (f->sym->ts.type == BT_CLASS)
2737 goto skip_size_check;
2738
37639728
TB
2739 actual_size = get_expr_storage_size (a->expr);
2740 formal_size = get_sym_storage_size (f->sym);
93302a24
JW
2741 if (actual_size != 0 && actual_size < formal_size
2742 && a->expr->ts.type != BT_PROCEDURE
2743 && f->sym->attr.flavor != FL_PROCEDURE)
2d5b90b2
TB
2744 {
2745 if (a->expr->ts.type == BT_CHARACTER && !f->sym->as && where)
2746 gfc_warning ("Character length of actual argument shorter "
48749dbc 2747 "than of dummy argument %qs (%lu/%lu) at %L",
8d51f26f
PT
2748 f->sym->name, actual_size, formal_size,
2749 &a->expr->where);
2d5b90b2
TB
2750 else if (where)
2751 gfc_warning ("Actual argument contains too few "
48749dbc 2752 "elements for dummy argument %qs (%lu/%lu) at %L",
8d51f26f
PT
2753 f->sym->name, actual_size, formal_size,
2754 &a->expr->where);
2d5b90b2
TB
2755 return 0;
2756 }
2757
c49ea23d
PT
2758 skip_size_check:
2759
e9355cc3
JW
2760 /* Satisfy F03:12.4.1.3 by ensuring that a procedure pointer actual
2761 argument is provided for a procedure pointer formal argument. */
8fb74da4 2762 if (f->sym->attr.proc_pointer
a7c0b11d 2763 && !((a->expr->expr_type == EXPR_VARIABLE
4294c093
JW
2764 && (a->expr->symtree->n.sym->attr.proc_pointer
2765 || gfc_is_proc_ptr_comp (a->expr)))
a7c0b11d 2766 || (a->expr->expr_type == EXPR_FUNCTION
4294c093 2767 && is_procptr_result (a->expr))))
8fb74da4
JW
2768 {
2769 if (where)
c4100eae 2770 gfc_error ("Expected a procedure pointer for argument %qs at %L",
8fb74da4
JW
2771 f->sym->name, &a->expr->where);
2772 return 0;
2773 }
2774
e9355cc3 2775 /* Satisfy F03:12.4.1.3 by ensuring that a procedure actual argument is
699fa7aa 2776 provided for a procedure formal argument. */
e9355cc3 2777 if (f->sym->attr.flavor == FL_PROCEDURE
4294c093
JW
2778 && !((a->expr->expr_type == EXPR_VARIABLE
2779 && (a->expr->symtree->n.sym->attr.flavor == FL_PROCEDURE
2780 || a->expr->symtree->n.sym->attr.proc_pointer
2781 || gfc_is_proc_ptr_comp (a->expr)))
2782 || (a->expr->expr_type == EXPR_FUNCTION
2783 && is_procptr_result (a->expr))))
699fa7aa 2784 {
9914f8cf 2785 if (where)
c4100eae 2786 gfc_error ("Expected a procedure for argument %qs at %L",
9914f8cf
PT
2787 f->sym->name, &a->expr->where);
2788 return 0;
699fa7aa
PT
2789 }
2790
b251af97 2791 if (f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE
bf9d2177
JJ
2792 && a->expr->expr_type == EXPR_VARIABLE
2793 && a->expr->symtree->n.sym->as
2794 && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SIZE
2795 && (a->expr->ref == NULL
2796 || (a->expr->ref->type == REF_ARRAY
2797 && a->expr->ref->u.ar.type == AR_FULL)))
2798 {
2799 if (where)
c4100eae 2800 gfc_error ("Actual argument for %qs cannot be an assumed-size"
bf9d2177
JJ
2801 " array at %L", f->sym->name, where);
2802 return 0;
2803 }
2804
1600fe22
TS
2805 if (a->expr->expr_type != EXPR_NULL
2806 && compare_pointer (f->sym, a->expr) == 0)
6de9cd9a
DN
2807 {
2808 if (where)
c4100eae 2809 gfc_error ("Actual argument for %qs must be a pointer at %L",
6de9cd9a
DN
2810 f->sym->name, &a->expr->where);
2811 return 0;
2812 }
2813
7d54ef80
TB
2814 if (a->expr->expr_type != EXPR_NULL
2815 && (gfc_option.allow_std & GFC_STD_F2008) == 0
2816 && compare_pointer (f->sym, a->expr) == 2)
2817 {
2818 if (where)
2819 gfc_error ("Fortran 2008: Non-pointer actual argument at %L to "
c4100eae 2820 "pointer dummy %qs", &a->expr->where,f->sym->name);
7d54ef80
TB
2821 return 0;
2822 }
8b704316 2823
7d54ef80 2824
d3a9eea2
TB
2825 /* Fortran 2008, C1242. */
2826 if (f->sym->attr.pointer && gfc_is_coindexed (a->expr))
2827 {
2828 if (where)
2829 gfc_error ("Coindexed actual argument at %L to pointer "
c4100eae 2830 "dummy %qs",
d3a9eea2
TB
2831 &a->expr->where, f->sym->name);
2832 return 0;
2833 }
2834
2835 /* Fortran 2008, 12.5.2.5 (no constraint). */
2836 if (a->expr->expr_type == EXPR_VARIABLE
2837 && f->sym->attr.intent != INTENT_IN
2838 && f->sym->attr.allocatable
2839 && gfc_is_coindexed (a->expr))
2840 {
2841 if (where)
2842 gfc_error ("Coindexed actual argument at %L to allocatable "
c4100eae 2843 "dummy %qs requires INTENT(IN)",
d3a9eea2
TB
2844 &a->expr->where, f->sym->name);
2845 return 0;
2846 }
2847
2848 /* Fortran 2008, C1237. */
2849 if (a->expr->expr_type == EXPR_VARIABLE
2850 && (f->sym->attr.asynchronous || f->sym->attr.volatile_)
2851 && gfc_is_coindexed (a->expr)
2852 && (a->expr->symtree->n.sym->attr.volatile_
2853 || a->expr->symtree->n.sym->attr.asynchronous))
2854 {
2855 if (where)
2856 gfc_error ("Coindexed ASYNCHRONOUS or VOLATILE actual argument at "
c4100eae 2857 "%L requires that dummy %qs has neither "
d3a9eea2
TB
2858 "ASYNCHRONOUS nor VOLATILE", &a->expr->where,
2859 f->sym->name);
2860 return 0;
2861 }
2862
2863 /* Fortran 2008, 12.5.2.4 (no constraint). */
2864 if (a->expr->expr_type == EXPR_VARIABLE
2865 && f->sym->attr.intent != INTENT_IN && !f->sym->attr.value
2866 && gfc_is_coindexed (a->expr)
2867 && gfc_has_ultimate_allocatable (a->expr))
2868 {
2869 if (where)
2870 gfc_error ("Coindexed actual argument at %L with allocatable "
c4100eae 2871 "ultimate component to dummy %qs requires either VALUE "
d3a9eea2
TB
2872 "or INTENT(IN)", &a->expr->where, f->sym->name);
2873 return 0;
2874 }
2875
c49ea23d
PT
2876 if (f->sym->ts.type == BT_CLASS
2877 && CLASS_DATA (f->sym)->attr.allocatable
2878 && gfc_is_class_array_ref (a->expr, &full_array)
2879 && !full_array)
2880 {
2881 if (where)
c4100eae 2882 gfc_error ("Actual CLASS array argument for %qs must be a full "
c49ea23d
PT
2883 "array at %L", f->sym->name, &a->expr->where);
2884 return 0;
2885 }
2886
2887
aa08038d
EE
2888 if (a->expr->expr_type != EXPR_NULL
2889 && compare_allocatable (f->sym, a->expr) == 0)
2890 {
2891 if (where)
c4100eae 2892 gfc_error ("Actual argument for %qs must be ALLOCATABLE at %L",
aa08038d
EE
2893 f->sym->name, &a->expr->where);
2894 return 0;
2895 }
2896
a920e94a 2897 /* Check intent = OUT/INOUT for definable actual argument. */
8c91ab34
DK
2898 if ((f->sym->attr.intent == INTENT_OUT
2899 || f->sym->attr.intent == INTENT_INOUT))
a920e94a 2900 {
8c91ab34
DK
2901 const char* context = (where
2902 ? _("actual argument to INTENT = OUT/INOUT")
2903 : NULL);
a920e94a 2904
bcb4ad36
TB
2905 if (((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
2906 && CLASS_DATA (f->sym)->attr.class_pointer)
2907 || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
524af0d6 2908 && !gfc_check_vardef_context (a->expr, true, false, false, context))
8c91ab34 2909 return 0;
524af0d6 2910 if (!gfc_check_vardef_context (a->expr, false, false, false, context))
8c91ab34 2911 return 0;
ee7e677f
TB
2912 }
2913
59be8071
TB
2914 if ((f->sym->attr.intent == INTENT_OUT
2915 || f->sym->attr.intent == INTENT_INOUT
84efddb2
DF
2916 || f->sym->attr.volatile_
2917 || f->sym->attr.asynchronous)
03af1e4c 2918 && gfc_has_vector_subscript (a->expr))
59be8071
TB
2919 {
2920 if (where)
84efddb2
DF
2921 gfc_error ("Array-section actual argument with vector "
2922 "subscripts at %L is incompatible with INTENT(OUT), "
2923 "INTENT(INOUT), VOLATILE or ASYNCHRONOUS attribute "
c4100eae 2924 "of the dummy argument %qs",
59be8071
TB
2925 &a->expr->where, f->sym->name);
2926 return 0;
2927 }
2928
9bce3c1c
TB
2929 /* C1232 (R1221) For an actual argument which is an array section or
2930 an assumed-shape array, the dummy argument shall be an assumed-
2931 shape array, if the dummy argument has the VOLATILE attribute. */
2932
2933 if (f->sym->attr.volatile_
2934 && a->expr->symtree->n.sym->as
2935 && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SHAPE
2936 && !(f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
2937 {
2938 if (where)
2939 gfc_error ("Assumed-shape actual argument at %L is "
2940 "incompatible with the non-assumed-shape "
c4100eae 2941 "dummy argument %qs due to VOLATILE attribute",
9bce3c1c
TB
2942 &a->expr->where,f->sym->name);
2943 return 0;
2944 }
2945
2946 if (f->sym->attr.volatile_
2947 && a->expr->ref && a->expr->ref->u.ar.type == AR_SECTION
2948 && !(f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
2949 {
2950 if (where)
2951 gfc_error ("Array-section actual argument at %L is "
2952 "incompatible with the non-assumed-shape "
c4100eae 2953 "dummy argument %qs due to VOLATILE attribute",
9bce3c1c
TB
2954 &a->expr->where,f->sym->name);
2955 return 0;
2956 }
2957
2958 /* C1233 (R1221) For an actual argument which is a pointer array, the
2959 dummy argument shall be an assumed-shape or pointer array, if the
2960 dummy argument has the VOLATILE attribute. */
2961
2962 if (f->sym->attr.volatile_
2963 && a->expr->symtree->n.sym->attr.pointer
2964 && a->expr->symtree->n.sym->as
2965 && !(f->sym->as
2966 && (f->sym->as->type == AS_ASSUMED_SHAPE
2967 || f->sym->attr.pointer)))
2968 {
2969 if (where)
2970 gfc_error ("Pointer-array actual argument at %L requires "
2971 "an assumed-shape or pointer-array dummy "
c4100eae 2972 "argument %qs due to VOLATILE attribute",
9bce3c1c
TB
2973 &a->expr->where,f->sym->name);
2974 return 0;
2975 }
2976
6de9cd9a
DN
2977 match:
2978 if (a == actual)
2979 na = i;
2980
7b901ac4 2981 new_arg[i++] = a;
6de9cd9a
DN
2982 }
2983
2984 /* Make sure missing actual arguments are optional. */
2985 i = 0;
2986 for (f = formal; f; f = f->next, i++)
2987 {
7b901ac4 2988 if (new_arg[i] != NULL)
6de9cd9a 2989 continue;
3ab7b3de
BM
2990 if (f->sym == NULL)
2991 {
2992 if (where)
b251af97
SK
2993 gfc_error ("Missing alternate return spec in subroutine call "
2994 "at %L", where);
3ab7b3de
BM
2995 return 0;
2996 }
6de9cd9a
DN
2997 if (!f->sym->attr.optional)
2998 {
2999 if (where)
c4100eae 3000 gfc_error ("Missing actual argument for argument %qs at %L",
6de9cd9a
DN
3001 f->sym->name, where);
3002 return 0;
3003 }
3004 }
3005
3006 /* The argument lists are compatible. We now relink a new actual
3007 argument list with null arguments in the right places. The head
3008 of the list remains the head. */
3009 for (i = 0; i < n; i++)
7b901ac4
KG
3010 if (new_arg[i] == NULL)
3011 new_arg[i] = gfc_get_actual_arglist ();
6de9cd9a
DN
3012
3013 if (na != 0)
3014 {
7b901ac4
KG
3015 temp = *new_arg[0];
3016 *new_arg[0] = *actual;
6de9cd9a
DN
3017 *actual = temp;
3018
7b901ac4
KG
3019 a = new_arg[0];
3020 new_arg[0] = new_arg[na];
3021 new_arg[na] = a;
6de9cd9a
DN
3022 }
3023
3024 for (i = 0; i < n - 1; i++)
7b901ac4 3025 new_arg[i]->next = new_arg[i + 1];
6de9cd9a 3026
7b901ac4 3027 new_arg[i]->next = NULL;
6de9cd9a
DN
3028
3029 if (*ap == NULL && n > 0)
7b901ac4 3030 *ap = new_arg[0];
6de9cd9a 3031
1600fe22 3032 /* Note the types of omitted optional arguments. */
b5ca4fd2 3033 for (a = *ap, f = formal; a; a = a->next, f = f->next)
1600fe22
TS
3034 if (a->expr == NULL && a->label == NULL)
3035 a->missing_arg_type = f->sym->ts.type;
3036
6de9cd9a
DN
3037 return 1;
3038}
3039
3040
3041typedef struct
3042{
3043 gfc_formal_arglist *f;
3044 gfc_actual_arglist *a;
3045}
3046argpair;
3047
3048/* qsort comparison function for argument pairs, with the following
3049 order:
3050 - p->a->expr == NULL
3051 - p->a->expr->expr_type != EXPR_VARIABLE
f7b529fa 3052 - growing p->a->expr->symbol. */
6de9cd9a
DN
3053
3054static int
3055pair_cmp (const void *p1, const void *p2)
3056{
3057 const gfc_actual_arglist *a1, *a2;
3058
3059 /* *p1 and *p2 are elements of the to-be-sorted array. */
3060 a1 = ((const argpair *) p1)->a;
3061 a2 = ((const argpair *) p2)->a;
3062 if (!a1->expr)
3063 {
3064 if (!a2->expr)
3065 return 0;
3066 return -1;
3067 }
3068 if (!a2->expr)
3069 return 1;
3070 if (a1->expr->expr_type != EXPR_VARIABLE)
3071 {
3072 if (a2->expr->expr_type != EXPR_VARIABLE)
3073 return 0;
3074 return -1;
3075 }
3076 if (a2->expr->expr_type != EXPR_VARIABLE)
3077 return 1;
3078 return a1->expr->symtree->n.sym < a2->expr->symtree->n.sym;
3079}
3080
3081
3082/* Given two expressions from some actual arguments, test whether they
3083 refer to the same expression. The analysis is conservative.
524af0d6 3084 Returning false will produce no warning. */
6de9cd9a 3085
524af0d6 3086static bool
b251af97 3087compare_actual_expr (gfc_expr *e1, gfc_expr *e2)
6de9cd9a
DN
3088{
3089 const gfc_ref *r1, *r2;
3090
3091 if (!e1 || !e2
3092 || e1->expr_type != EXPR_VARIABLE
3093 || e2->expr_type != EXPR_VARIABLE
3094 || e1->symtree->n.sym != e2->symtree->n.sym)
524af0d6 3095 return false;
6de9cd9a
DN
3096
3097 /* TODO: improve comparison, see expr.c:show_ref(). */
3098 for (r1 = e1->ref, r2 = e2->ref; r1 && r2; r1 = r1->next, r2 = r2->next)
3099 {
3100 if (r1->type != r2->type)
524af0d6 3101 return false;
6de9cd9a
DN
3102 switch (r1->type)
3103 {
3104 case REF_ARRAY:
3105 if (r1->u.ar.type != r2->u.ar.type)
524af0d6 3106 return false;
6de9cd9a
DN
3107 /* TODO: At the moment, consider only full arrays;
3108 we could do better. */
3109 if (r1->u.ar.type != AR_FULL || r2->u.ar.type != AR_FULL)
524af0d6 3110 return false;
6de9cd9a
DN
3111 break;
3112
3113 case REF_COMPONENT:
3114 if (r1->u.c.component != r2->u.c.component)
524af0d6 3115 return false;
6de9cd9a
DN
3116 break;
3117
3118 case REF_SUBSTRING:
524af0d6 3119 return false;
6de9cd9a
DN
3120
3121 default:
3122 gfc_internal_error ("compare_actual_expr(): Bad component code");
3123 }
3124 }
3125 if (!r1 && !r2)
524af0d6
JB
3126 return true;
3127 return false;
6de9cd9a
DN
3128}
3129
b251af97 3130
6de9cd9a
DN
3131/* Given formal and actual argument lists that correspond to one
3132 another, check that identical actual arguments aren't not
3133 associated with some incompatible INTENTs. */
3134
524af0d6 3135static bool
b251af97 3136check_some_aliasing (gfc_formal_arglist *f, gfc_actual_arglist *a)
6de9cd9a
DN
3137{
3138 sym_intent f1_intent, f2_intent;
3139 gfc_formal_arglist *f1;
3140 gfc_actual_arglist *a1;
3141 size_t n, i, j;
3142 argpair *p;
524af0d6 3143 bool t = true;
6de9cd9a
DN
3144
3145 n = 0;
3146 for (f1 = f, a1 = a;; f1 = f1->next, a1 = a1->next)
3147 {
3148 if (f1 == NULL && a1 == NULL)
3149 break;
3150 if (f1 == NULL || a1 == NULL)
3151 gfc_internal_error ("check_some_aliasing(): List mismatch");
3152 n++;
3153 }
3154 if (n == 0)
3155 return t;
1145e690 3156 p = XALLOCAVEC (argpair, n);
6de9cd9a
DN
3157
3158 for (i = 0, f1 = f, a1 = a; i < n; i++, f1 = f1->next, a1 = a1->next)
3159 {
3160 p[i].f = f1;
3161 p[i].a = a1;
3162 }
3163
3164 qsort (p, n, sizeof (argpair), pair_cmp);
3165
3166 for (i = 0; i < n; i++)
3167 {
3168 if (!p[i].a->expr
3169 || p[i].a->expr->expr_type != EXPR_VARIABLE
3170 || p[i].a->expr->ts.type == BT_PROCEDURE)
3171 continue;
3172 f1_intent = p[i].f->sym->attr.intent;
3173 for (j = i + 1; j < n; j++)
3174 {
3175 /* Expected order after the sort. */
3176 if (!p[j].a->expr || p[j].a->expr->expr_type != EXPR_VARIABLE)
3177 gfc_internal_error ("check_some_aliasing(): corrupted data");
3178
3179 /* Are the expression the same? */
524af0d6 3180 if (!compare_actual_expr (p[i].a->expr, p[j].a->expr))
6de9cd9a
DN
3181 break;
3182 f2_intent = p[j].f->sym->attr.intent;
3183 if ((f1_intent == INTENT_IN && f2_intent == INTENT_OUT)
9f1930be
TB
3184 || (f1_intent == INTENT_OUT && f2_intent == INTENT_IN)
3185 || (f1_intent == INTENT_OUT && f2_intent == INTENT_OUT))
6de9cd9a
DN
3186 {
3187 gfc_warning ("Same actual argument associated with INTENT(%s) "
48749dbc 3188 "argument %qs and INTENT(%s) argument %qs at %L",
6de9cd9a
DN
3189 gfc_intent_string (f1_intent), p[i].f->sym->name,
3190 gfc_intent_string (f2_intent), p[j].f->sym->name,
3191 &p[i].a->expr->where);
524af0d6 3192 t = false;
6de9cd9a
DN
3193 }
3194 }
3195 }
3196
3197 return t;
3198}
3199
3200
3201/* Given formal and actual argument lists that correspond to one
3202 another, check that they are compatible in the sense that intents
3203 are not mismatched. */
3204
524af0d6 3205static bool
b251af97 3206check_intents (gfc_formal_arglist *f, gfc_actual_arglist *a)
6de9cd9a 3207{
f17facac 3208 sym_intent f_intent;
6de9cd9a
DN
3209
3210 for (;; f = f->next, a = a->next)
3211 {
99c39534
TB
3212 gfc_expr *expr;
3213
6de9cd9a
DN
3214 if (f == NULL && a == NULL)
3215 break;
3216 if (f == NULL || a == NULL)
3217 gfc_internal_error ("check_intents(): List mismatch");
3218
99c39534
TB
3219 if (a->expr && a->expr->expr_type == EXPR_FUNCTION
3220 && a->expr->value.function.isym
3221 && a->expr->value.function.isym->id == GFC_ISYM_CAF_GET)
3222 expr = a->expr->value.function.actual->expr;
3223 else
3224 expr = a->expr;
3225
3226 if (expr == NULL || expr->expr_type != EXPR_VARIABLE)
6de9cd9a
DN
3227 continue;
3228
6de9cd9a
DN
3229 f_intent = f->sym->attr.intent;
3230
99c39534 3231 if (gfc_pure (NULL) && gfc_impure_variable (expr->symtree->n.sym))
6de9cd9a 3232 {
bcb4ad36
TB
3233 if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3234 && CLASS_DATA (f->sym)->attr.class_pointer)
3235 || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
6de9cd9a 3236 {
b251af97
SK
3237 gfc_error ("Procedure argument at %L is local to a PURE "
3238 "procedure and has the POINTER attribute",
99c39534 3239 &expr->where);
524af0d6 3240 return false;
6de9cd9a
DN
3241 }
3242 }
d3a9eea2
TB
3243
3244 /* Fortran 2008, C1283. */
99c39534 3245 if (gfc_pure (NULL) && gfc_is_coindexed (expr))
d3a9eea2
TB
3246 {
3247 if (f_intent == INTENT_INOUT || f_intent == INTENT_OUT)
3248 {
3249 gfc_error ("Coindexed actual argument at %L in PURE procedure "
3250 "is passed to an INTENT(%s) argument",
99c39534 3251 &expr->where, gfc_intent_string (f_intent));
524af0d6 3252 return false;
d3a9eea2
TB
3253 }
3254
bcb4ad36
TB
3255 if ((f->sym->ts.type == BT_CLASS && f->sym->attr.class_ok
3256 && CLASS_DATA (f->sym)->attr.class_pointer)
3257 || (f->sym->ts.type != BT_CLASS && f->sym->attr.pointer))
d3a9eea2
TB
3258 {
3259 gfc_error ("Coindexed actual argument at %L in PURE procedure "
3260 "is passed to a POINTER dummy argument",
99c39534 3261 &expr->where);
524af0d6 3262 return false;
d3a9eea2
TB
3263 }
3264 }
3265
3266 /* F2008, Section 12.5.2.4. */
99c39534
TB
3267 if (expr->ts.type == BT_CLASS && f->sym->ts.type == BT_CLASS
3268 && gfc_is_coindexed (expr))
d3a9eea2
TB
3269 {
3270 gfc_error ("Coindexed polymorphic actual argument at %L is passed "
c4100eae 3271 "polymorphic dummy argument %qs",
99c39534 3272 &expr->where, f->sym->name);
524af0d6 3273 return false;
d3a9eea2 3274 }
6de9cd9a
DN
3275 }
3276
524af0d6 3277 return true;
6de9cd9a
DN
3278}
3279
3280
3281/* Check how a procedure is used against its interface. If all goes
3282 well, the actual argument list will also end up being properly
3283 sorted. */
3284
524af0d6 3285bool
b251af97 3286gfc_procedure_use (gfc_symbol *sym, gfc_actual_arglist **ap, locus *where)
6de9cd9a 3287{
4cbc9039
JW
3288 gfc_formal_arglist *dummy_args;
3289
a9c5fe7e 3290 /* Warn about calls with an implicit interface. Special case
6bd2c800 3291 for calling a ISO_C_BINDING because c_loc and c_funloc
ca071303
FXC
3292 are pseudo-unknown. Additionally, warn about procedures not
3293 explicitly declared at all if requested. */
8b7a967e 3294 if (sym->attr.if_source == IFSRC_UNKNOWN && !sym->attr.is_iso_c)
ca071303 3295 {
8b7a967e
TB
3296 if (sym->ns->has_implicit_none_export && sym->attr.proc == PROC_UNKNOWN)
3297 {
c4100eae 3298 gfc_error ("Procedure %qs called at %L is not explicitly declared",
8b7a967e
TB
3299 sym->name, where);
3300 return false;
3301 }
73e42eef 3302 if (warn_implicit_interface)
48749dbc
MLI
3303 gfc_warning (OPT_Wimplicit_interface,
3304 "Procedure %qs called with an implicit interface at %L",
ca071303 3305 sym->name, where);
73e42eef 3306 else if (warn_implicit_procedure && sym->attr.proc == PROC_UNKNOWN)
48749dbc
MLI
3307 gfc_warning (OPT_Wimplicit_procedure,
3308 "Procedure %qs called at %L is not explicitly declared",
ca071303
FXC
3309 sym->name, where);
3310 }
6de9cd9a 3311
e6895430 3312 if (sym->attr.if_source == IFSRC_UNKNOWN)
ac05557c
DF
3313 {
3314 gfc_actual_arglist *a;
86d7449c
TB
3315
3316 if (sym->attr.pointer)
3317 {
c4100eae
MLI
3318 gfc_error ("The pointer object %qs at %L must have an explicit "
3319 "function interface or be declared as array",
3320 sym->name, where);
524af0d6 3321 return false;
86d7449c
TB
3322 }
3323
3324 if (sym->attr.allocatable && !sym->attr.external)
3325 {
c4100eae
MLI
3326 gfc_error ("The allocatable object %qs at %L must have an explicit "
3327 "function interface or be declared as array",
3328 sym->name, where);
524af0d6 3329 return false;
86d7449c
TB
3330 }
3331
3332 if (sym->attr.allocatable)
3333 {
c4100eae
MLI
3334 gfc_error ("Allocatable function %qs at %L must have an explicit "
3335 "function interface", sym->name, where);
524af0d6 3336 return false;
86d7449c
TB
3337 }
3338
ac05557c
DF
3339 for (a = *ap; a; a = a->next)
3340 {
3341 /* Skip g77 keyword extensions like %VAL, %REF, %LOC. */
3342 if (a->name != NULL && a->name[0] != '%')
3343 {
c4100eae
MLI
3344 gfc_error ("Keyword argument requires explicit interface "
3345 "for procedure %qs at %L", sym->name, &a->expr->where);
ac05557c
DF
3346 break;
3347 }
fea54935 3348
45a69325
TB
3349 /* TS 29113, 6.2. */
3350 if (a->expr && a->expr->ts.type == BT_ASSUMED
3351 && sym->intmod_sym_id != ISOCBINDING_LOC)
3352 {
3353 gfc_error ("Assumed-type argument %s at %L requires an explicit "
3354 "interface", a->expr->symtree->n.sym->name,
3355 &a->expr->where);
3356 break;
3357 }
3358
fea54935
TB
3359 /* F2008, C1303 and C1304. */
3360 if (a->expr
3361 && (a->expr->ts.type == BT_DERIVED || a->expr->ts.type == BT_CLASS)
3362 && ((a->expr->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
3363 && a->expr->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
3364 || gfc_expr_attr (a->expr).lock_comp))
3365 {
c4100eae
MLI
3366 gfc_error ("Actual argument of LOCK_TYPE or with LOCK_TYPE "
3367 "component at %L requires an explicit interface for "
3368 "procedure %qs", &a->expr->where, sym->name);
fea54935
TB
3369 break;
3370 }
ea8ad3e5
TB
3371
3372 if (a->expr && a->expr->expr_type == EXPR_NULL
3373 && a->expr->ts.type == BT_UNKNOWN)
3374 {
3375 gfc_error ("MOLD argument to NULL required at %L", &a->expr->where);
524af0d6 3376 return false;
ea8ad3e5 3377 }
c62c6622
TB
3378
3379 /* TS 29113, C407b. */
3380 if (a->expr && a->expr->expr_type == EXPR_VARIABLE
3381 && symbol_rank (a->expr->symtree->n.sym) == -1)
3382 {
3383 gfc_error ("Assumed-rank argument requires an explicit interface "
3384 "at %L", &a->expr->where);
524af0d6 3385 return false;
c62c6622 3386 }
ac05557c
DF
3387 }
3388
524af0d6 3389 return true;
ac05557c
DF
3390 }
3391
4cbc9039
JW
3392 dummy_args = gfc_sym_get_dummy_args (sym);
3393
3394 if (!compare_actual_formal (ap, dummy_args, 0, sym->attr.elemental, where))
524af0d6 3395 return false;
f8552cd4 3396
524af0d6
JB
3397 if (!check_intents (dummy_args, *ap))
3398 return false;
6de9cd9a 3399
73e42eef 3400 if (warn_aliasing)
4cbc9039 3401 check_some_aliasing (dummy_args, *ap);
f8552cd4 3402
524af0d6 3403 return true;
6de9cd9a
DN
3404}
3405
3406
7e196f89
JW
3407/* Check how a procedure pointer component is used against its interface.
3408 If all goes well, the actual argument list will also end up being properly
3409 sorted. Completely analogous to gfc_procedure_use. */
3410
3411void
3412gfc_ppc_use (gfc_component *comp, gfc_actual_arglist **ap, locus *where)
3413{
7e196f89 3414 /* Warn about calls with an implicit interface. Special case
6bd2c800 3415 for calling a ISO_C_BINDING because c_loc and c_funloc
7e196f89 3416 are pseudo-unknown. */
73e42eef 3417 if (warn_implicit_interface
7e196f89
JW
3418 && comp->attr.if_source == IFSRC_UNKNOWN
3419 && !comp->attr.is_iso_c)
48749dbc
MLI
3420 gfc_warning (OPT_Wimplicit_interface,
3421 "Procedure pointer component %qs called with an implicit "
7e196f89
JW
3422 "interface at %L", comp->name, where);
3423
3424 if (comp->attr.if_source == IFSRC_UNKNOWN)
3425 {
3426 gfc_actual_arglist *a;
3427 for (a = *ap; a; a = a->next)
3428 {
3429 /* Skip g77 keyword extensions like %VAL, %REF, %LOC. */
3430 if (a->name != NULL && a->name[0] != '%')
3431 {
c4100eae
MLI
3432 gfc_error ("Keyword argument requires explicit interface "
3433 "for procedure pointer component %qs at %L",
3434 comp->name, &a->expr->where);
7e196f89
JW
3435 break;
3436 }
3437 }
3438
3439 return;
3440 }
3441
4cbc9039
JW
3442 if (!compare_actual_formal (ap, comp->ts.interface->formal, 0,
3443 comp->attr.elemental, where))
7e196f89
JW
3444 return;
3445
4cbc9039 3446 check_intents (comp->ts.interface->formal, *ap);
73e42eef 3447 if (warn_aliasing)
4cbc9039 3448 check_some_aliasing (comp->ts.interface->formal, *ap);
7e196f89
JW
3449}
3450
3451
f0ac18b7
DK
3452/* Try if an actual argument list matches the formal list of a symbol,
3453 respecting the symbol's attributes like ELEMENTAL. This is used for
3454 GENERIC resolution. */
3455
3456bool
3457gfc_arglist_matches_symbol (gfc_actual_arglist** args, gfc_symbol* sym)
3458{
4cbc9039 3459 gfc_formal_arglist *dummy_args;
f0ac18b7
DK
3460 bool r;
3461
3462 gcc_assert (sym->attr.flavor == FL_PROCEDURE);
3463
4cbc9039
JW
3464 dummy_args = gfc_sym_get_dummy_args (sym);
3465
f0ac18b7 3466 r = !sym->attr.elemental;
4cbc9039 3467 if (compare_actual_formal (args, dummy_args, r, !r, NULL))
f0ac18b7 3468 {
4cbc9039 3469 check_intents (dummy_args, *args);
73e42eef 3470 if (warn_aliasing)
4cbc9039 3471 check_some_aliasing (dummy_args, *args);
f0ac18b7
DK
3472 return true;
3473 }
3474
3475 return false;
3476}
3477
3478
6de9cd9a
DN
3479/* Given an interface pointer and an actual argument list, search for
3480 a formal argument list that matches the actual. If found, returns
3481 a pointer to the symbol of the correct interface. Returns NULL if
3482 not found. */
3483
3484gfc_symbol *
b251af97
SK
3485gfc_search_interface (gfc_interface *intr, int sub_flag,
3486 gfc_actual_arglist **ap)
6de9cd9a 3487{
22a0a780 3488 gfc_symbol *elem_sym = NULL;
ea8ad3e5
TB
3489 gfc_symbol *null_sym = NULL;
3490 locus null_expr_loc;
3491 gfc_actual_arglist *a;
3492 bool has_null_arg = false;
3493
3494 for (a = *ap; a; a = a->next)
3495 if (a->expr && a->expr->expr_type == EXPR_NULL
3496 && a->expr->ts.type == BT_UNKNOWN)
3497 {
3498 has_null_arg = true;
3499 null_expr_loc = a->expr->where;
3500 break;
8b704316 3501 }
ea8ad3e5 3502
6de9cd9a
DN
3503 for (; intr; intr = intr->next)
3504 {
c3f34952
TB
3505 if (intr->sym->attr.flavor == FL_DERIVED)
3506 continue;
6de9cd9a
DN
3507 if (sub_flag && intr->sym->attr.function)
3508 continue;
3509 if (!sub_flag && intr->sym->attr.subroutine)
3510 continue;
3511
f0ac18b7 3512 if (gfc_arglist_matches_symbol (ap, intr->sym))
22a0a780 3513 {
ea8ad3e5
TB
3514 if (has_null_arg && null_sym)
3515 {
3516 gfc_error ("MOLD= required in NULL() argument at %L: Ambiguity "
3517 "between specific functions %s and %s",
3518 &null_expr_loc, null_sym->name, intr->sym->name);
3519 return NULL;
3520 }
3521 else if (has_null_arg)
3522 {
3523 null_sym = intr->sym;
3524 continue;
3525 }
3526
22a0a780 3527 /* Satisfy 12.4.4.1 such that an elemental match has lower
8b704316 3528 weight than a non-elemental match. */
22a0a780
PT
3529 if (intr->sym->attr.elemental)
3530 {
3531 elem_sym = intr->sym;
3532 continue;
3533 }
3534 return intr->sym;
3535 }
6de9cd9a
DN
3536 }
3537
ea8ad3e5
TB
3538 if (null_sym)
3539 return null_sym;
3540
22a0a780 3541 return elem_sym ? elem_sym : NULL;
6de9cd9a
DN
3542}
3543
3544
3545/* Do a brute force recursive search for a symbol. */
3546
3547static gfc_symtree *
b251af97 3548find_symtree0 (gfc_symtree *root, gfc_symbol *sym)
6de9cd9a
DN
3549{
3550 gfc_symtree * st;
3551
3552 if (root->n.sym == sym)
3553 return root;
3554
3555 st = NULL;
3556 if (root->left)
3557 st = find_symtree0 (root->left, sym);
3558 if (root->right && ! st)
3559 st = find_symtree0 (root->right, sym);
3560 return st;
3561}
3562
3563
3564/* Find a symtree for a symbol. */
3565
f6fad28e
DK
3566gfc_symtree *
3567gfc_find_sym_in_symtree (gfc_symbol *sym)
6de9cd9a
DN
3568{
3569 gfc_symtree *st;
3570 gfc_namespace *ns;
3571
3572 /* First try to find it by name. */
3573 gfc_find_sym_tree (sym->name, gfc_current_ns, 1, &st);
3574 if (st && st->n.sym == sym)
3575 return st;
3576
66e4ab31 3577 /* If it's been renamed, resort to a brute-force search. */
6de9cd9a
DN
3578 /* TODO: avoid having to do this search. If the symbol doesn't exist
3579 in the symtree for the current namespace, it should probably be added. */
3580 for (ns = gfc_current_ns; ns; ns = ns->parent)
3581 {
3582 st = find_symtree0 (ns->sym_root, sym);
3583 if (st)
b251af97 3584 return st;
6de9cd9a 3585 }
17d5d49f 3586 gfc_internal_error ("Unable to find symbol %qs", sym->name);
66e4ab31 3587 /* Not reached. */
6de9cd9a
DN
3588}
3589
3590
4a44a72d
DK
3591/* See if the arglist to an operator-call contains a derived-type argument
3592 with a matching type-bound operator. If so, return the matching specific
3593 procedure defined as operator-target as well as the base-object to use
974df0f8
PT
3594 (which is the found derived-type argument with operator). The generic
3595 name, if any, is transmitted to the final expression via 'gname'. */
4a44a72d
DK
3596
3597static gfc_typebound_proc*
3598matching_typebound_op (gfc_expr** tb_base,
3599 gfc_actual_arglist* args,
974df0f8
PT
3600 gfc_intrinsic_op op, const char* uop,
3601 const char ** gname)
4a44a72d
DK
3602{
3603 gfc_actual_arglist* base;
3604
3605 for (base = args; base; base = base->next)
4b7dd692 3606 if (base->expr->ts.type == BT_DERIVED || base->expr->ts.type == BT_CLASS)
4a44a72d
DK
3607 {
3608 gfc_typebound_proc* tb;
3609 gfc_symbol* derived;
524af0d6 3610 bool result;
4a44a72d 3611
efd2e969
PT
3612 while (base->expr->expr_type == EXPR_OP
3613 && base->expr->value.op.op == INTRINSIC_PARENTHESES)
3614 base->expr = base->expr->value.op.op1;
3615
4b7dd692 3616 if (base->expr->ts.type == BT_CLASS)
528622fd 3617 {
0a59e583
JW
3618 if (CLASS_DATA (base->expr) == NULL
3619 || !gfc_expr_attr (base->expr).class_ok)
528622fd
JW
3620 continue;
3621 derived = CLASS_DATA (base->expr)->ts.u.derived;
3622 }
4b7dd692
JW
3623 else
3624 derived = base->expr->ts.u.derived;
4a44a72d
DK
3625
3626 if (op == INTRINSIC_USER)
3627 {
3628 gfc_symtree* tb_uop;
3629
3630 gcc_assert (uop);
3631 tb_uop = gfc_find_typebound_user_op (derived, &result, uop,
3632 false, NULL);
3633
3634 if (tb_uop)
3635 tb = tb_uop->n.tb;
3636 else
3637 tb = NULL;
3638 }
3639 else
3640 tb = gfc_find_typebound_intrinsic_op (derived, &result, op,
3641 false, NULL);
3642
3643 /* This means we hit a PRIVATE operator which is use-associated and
3644 should thus not be seen. */
524af0d6 3645 if (!result)
4a44a72d
DK
3646 tb = NULL;
3647
3648 /* Look through the super-type hierarchy for a matching specific
3649 binding. */
3650 for (; tb; tb = tb->overridden)
3651 {
3652 gfc_tbp_generic* g;
3653
3654 gcc_assert (tb->is_generic);
3655 for (g = tb->u.generic; g; g = g->next)
3656 {
3657 gfc_symbol* target;
3658 gfc_actual_arglist* argcopy;
3659 bool matches;
3660
3661 gcc_assert (g->specific);
3662 if (g->specific->error)
3663 continue;
3664
3665 target = g->specific->u.specific->n.sym;
3666
3667 /* Check if this arglist matches the formal. */
3668 argcopy = gfc_copy_actual_arglist (args);
3669 matches = gfc_arglist_matches_symbol (&argcopy, target);
3670 gfc_free_actual_arglist (argcopy);
3671
3672 /* Return if we found a match. */
3673 if (matches)
3674 {
3675 *tb_base = base->expr;
974df0f8 3676 *gname = g->specific_st->name;
4a44a72d
DK
3677 return g->specific;
3678 }
3679 }
3680 }
3681 }
3682
3683 return NULL;
3684}
3685
3686
3687/* For the 'actual arglist' of an operator call and a specific typebound
3688 procedure that has been found the target of a type-bound operator, build the
3689 appropriate EXPR_COMPCALL and resolve it. We take this indirection over
3690 type-bound procedures rather than resolving type-bound operators 'directly'
3691 so that we can reuse the existing logic. */
3692
3693static void
3694build_compcall_for_operator (gfc_expr* e, gfc_actual_arglist* actual,
974df0f8
PT
3695 gfc_expr* base, gfc_typebound_proc* target,
3696 const char *gname)
4a44a72d
DK
3697{
3698 e->expr_type = EXPR_COMPCALL;
3699 e->value.compcall.tbp = target;
974df0f8 3700 e->value.compcall.name = gname ? gname : "$op";
4a44a72d
DK
3701 e->value.compcall.actual = actual;
3702 e->value.compcall.base_object = base;
3703 e->value.compcall.ignore_pass = 1;
3704 e->value.compcall.assign = 0;
94fae14b
PT
3705 if (e->ts.type == BT_UNKNOWN
3706 && target->function)
3707 {
3708 if (target->is_generic)
3709 e->ts = target->u.generic->specific->u.specific->n.sym->ts;
3710 else
3711 e->ts = target->u.specific->n.sym->ts;
3712 }
4a44a72d
DK
3713}
3714
3715
6de9cd9a
DN
3716/* This subroutine is called when an expression is being resolved.
3717 The expression node in question is either a user defined operator
1f2959f0 3718 or an intrinsic operator with arguments that aren't compatible
6de9cd9a
DN
3719 with the operator. This subroutine builds an actual argument list
3720 corresponding to the operands, then searches for a compatible
3721 interface. If one is found, the expression node is replaced with
eaee02a5
JW
3722 the appropriate function call. We use the 'match' enum to specify
3723 whether a replacement has been made or not, or if an error occurred. */
6de9cd9a 3724
eaee02a5
JW
3725match
3726gfc_extend_expr (gfc_expr *e)
6de9cd9a
DN
3727{
3728 gfc_actual_arglist *actual;
3729 gfc_symbol *sym;
3730 gfc_namespace *ns;
3731 gfc_user_op *uop;
3732 gfc_intrinsic_op i;
974df0f8 3733 const char *gname;
517d78be
JW
3734 gfc_typebound_proc* tbo;
3735 gfc_expr* tb_base;
6de9cd9a
DN
3736
3737 sym = NULL;
3738
3739 actual = gfc_get_actual_arglist ();
58b03ab2 3740 actual->expr = e->value.op.op1;
6de9cd9a 3741
974df0f8 3742 gname = NULL;
4a44a72d 3743
58b03ab2 3744 if (e->value.op.op2 != NULL)
6de9cd9a
DN
3745 {
3746 actual->next = gfc_get_actual_arglist ();
58b03ab2 3747 actual->next->expr = e->value.op.op2;
6de9cd9a
DN
3748 }
3749
e8d4f3fc 3750 i = fold_unary_intrinsic (e->value.op.op);
6de9cd9a 3751
517d78be
JW
3752 /* See if we find a matching type-bound operator. */
3753 if (i == INTRINSIC_USER)
3754 tbo = matching_typebound_op (&tb_base, actual,
3755 i, e->value.op.uop->name, &gname);
3756 else
3757 switch (i)
3758 {
3759#define CHECK_OS_COMPARISON(comp) \
3760 case INTRINSIC_##comp: \
3761 case INTRINSIC_##comp##_OS: \
3762 tbo = matching_typebound_op (&tb_base, actual, \
3763 INTRINSIC_##comp, NULL, &gname); \
3764 if (!tbo) \
3765 tbo = matching_typebound_op (&tb_base, actual, \
3766 INTRINSIC_##comp##_OS, NULL, &gname); \
3767 break;
3768 CHECK_OS_COMPARISON(EQ)
3769 CHECK_OS_COMPARISON(NE)
3770 CHECK_OS_COMPARISON(GT)
3771 CHECK_OS_COMPARISON(GE)
3772 CHECK_OS_COMPARISON(LT)
3773 CHECK_OS_COMPARISON(LE)
3774#undef CHECK_OS_COMPARISON
3775
3776 default:
3777 tbo = matching_typebound_op (&tb_base, actual, i, NULL, &gname);
3778 break;
3779 }
3780
3781 /* If there is a matching typebound-operator, replace the expression with
3782 a call to it and succeed. */
3783 if (tbo)
3784 {
3785 gcc_assert (tb_base);
3786 build_compcall_for_operator (e, actual, tb_base, tbo, gname);
3787
3788 if (!gfc_resolve_expr (e))
3789 return MATCH_ERROR;
3790 else
3791 return MATCH_YES;
3792 }
3793
6de9cd9a
DN
3794 if (i == INTRINSIC_USER)
3795 {
3796 for (ns = gfc_current_ns; ns; ns = ns->parent)
3797 {
58b03ab2 3798 uop = gfc_find_uop (e->value.op.uop->name, ns);
6de9cd9a
DN
3799 if (uop == NULL)
3800 continue;
3801
a1ee985f 3802 sym = gfc_search_interface (uop->op, 0, &actual);
6de9cd9a
DN
3803 if (sym != NULL)
3804 break;
3805 }
3806 }
3807 else
3808 {
3809 for (ns = gfc_current_ns; ns; ns = ns->parent)
3810 {
3bed9dd0
DF
3811 /* Due to the distinction between '==' and '.eq.' and friends, one has
3812 to check if either is defined. */
3813 switch (i)
3814 {
4a44a72d
DK
3815#define CHECK_OS_COMPARISON(comp) \
3816 case INTRINSIC_##comp: \
3817 case INTRINSIC_##comp##_OS: \
3818 sym = gfc_search_interface (ns->op[INTRINSIC_##comp], 0, &actual); \
3819 if (!sym) \
3820 sym = gfc_search_interface (ns->op[INTRINSIC_##comp##_OS], 0, &actual); \
3821 break;
3822 CHECK_OS_COMPARISON(EQ)
3823 CHECK_OS_COMPARISON(NE)
3824 CHECK_OS_COMPARISON(GT)
3825 CHECK_OS_COMPARISON(GE)
3826 CHECK_OS_COMPARISON(LT)
3827 CHECK_OS_COMPARISON(LE)
3828#undef CHECK_OS_COMPARISON
3bed9dd0
DF
3829
3830 default:
a1ee985f 3831 sym = gfc_search_interface (ns->op[i], 0, &actual);
3bed9dd0
DF
3832 }
3833
6de9cd9a
DN
3834 if (sym != NULL)
3835 break;
3836 }
3837 }
3838
4a44a72d
DK
3839 /* TODO: Do an ambiguity-check and error if multiple matching interfaces are
3840 found rather than just taking the first one and not checking further. */
3841
6de9cd9a
DN
3842 if (sym == NULL)
3843 {
66e4ab31 3844 /* Don't use gfc_free_actual_arglist(). */
04695783 3845 free (actual->next);
cede9502 3846 free (actual);
eaee02a5 3847 return MATCH_NO;
6de9cd9a
DN
3848 }
3849
3850 /* Change the expression node to a function call. */
3851 e->expr_type = EXPR_FUNCTION;
f6fad28e 3852 e->symtree = gfc_find_sym_in_symtree (sym);
6de9cd9a 3853 e->value.function.actual = actual;
58b03ab2
TS
3854 e->value.function.esym = NULL;
3855 e->value.function.isym = NULL;
cf013e9f 3856 e->value.function.name = NULL;
a1ab6660 3857 e->user_operator = 1;
6de9cd9a 3858
524af0d6 3859 if (!gfc_resolve_expr (e))
eaee02a5 3860 return MATCH_ERROR;
6de9cd9a 3861
eaee02a5 3862 return MATCH_YES;
6de9cd9a
DN
3863}
3864
3865
4f7395ff
JW
3866/* Tries to replace an assignment code node with a subroutine call to the
3867 subroutine associated with the assignment operator. Return true if the node
3868 was replaced. On false, no error is generated. */
6de9cd9a 3869
524af0d6 3870bool
b251af97 3871gfc_extend_assign (gfc_code *c, gfc_namespace *ns)
6de9cd9a
DN
3872{
3873 gfc_actual_arglist *actual;
4f7395ff
JW
3874 gfc_expr *lhs, *rhs, *tb_base;
3875 gfc_symbol *sym = NULL;
3876 const char *gname = NULL;
3877 gfc_typebound_proc* tbo;
6de9cd9a 3878
a513927a 3879 lhs = c->expr1;
6de9cd9a
DN
3880 rhs = c->expr2;
3881
3882 /* Don't allow an intrinsic assignment to be replaced. */
4b7dd692 3883 if (lhs->ts.type != BT_DERIVED && lhs->ts.type != BT_CLASS
e19bb186 3884 && (rhs->rank == 0 || rhs->rank == lhs->rank)
6de9cd9a 3885 && (lhs->ts.type == rhs->ts.type
b251af97 3886 || (gfc_numeric_ts (&lhs->ts) && gfc_numeric_ts (&rhs->ts))))
524af0d6 3887 return false;
6de9cd9a
DN
3888
3889 actual = gfc_get_actual_arglist ();
3890 actual->expr = lhs;
3891
3892 actual->next = gfc_get_actual_arglist ();
3893 actual->next->expr = rhs;
3894
4f7395ff
JW
3895 /* TODO: Ambiguity-check, see above for gfc_extend_expr. */
3896
3897 /* See if we find a matching type-bound assignment. */
3898 tbo = matching_typebound_op (&tb_base, actual, INTRINSIC_ASSIGN,
3899 NULL, &gname);
3900
3901 if (tbo)
3902 {
3903 /* Success: Replace the expression with a type-bound call. */
3904 gcc_assert (tb_base);
3905 c->expr1 = gfc_get_expr ();
3906 build_compcall_for_operator (c->expr1, actual, tb_base, tbo, gname);
3907 c->expr1->value.compcall.assign = 1;
3908 c->expr1->where = c->loc;
3909 c->expr2 = NULL;
3910 c->op = EXEC_COMPCALL;
3911 return true;
3912 }
6de9cd9a 3913
4f7395ff 3914 /* See if we find an 'ordinary' (non-typebound) assignment procedure. */
6de9cd9a
DN
3915 for (; ns; ns = ns->parent)
3916 {
a1ee985f 3917 sym = gfc_search_interface (ns->op[INTRINSIC_ASSIGN], 1, &actual);
6de9cd9a
DN
3918 if (sym != NULL)
3919 break;
3920 }
3921
4f7395ff 3922 if (sym)
6de9cd9a 3923 {
4f7395ff
JW
3924 /* Success: Replace the assignment with the call. */
3925 c->op = EXEC_ASSIGN_CALL;
3926 c->symtree = gfc_find_sym_in_symtree (sym);
3927 c->expr1 = NULL;
3928 c->expr2 = NULL;
3929 c->ext.actual = actual;
3930 return true;
6de9cd9a
DN
3931 }
3932
4f7395ff
JW
3933 /* Failure: No assignment procedure found. */
3934 free (actual->next);
3935 free (actual);
3936 return false;
6de9cd9a
DN
3937}
3938
3939
3940/* Make sure that the interface just parsed is not already present in
3941 the given interface list. Ambiguity isn't checked yet since module
3942 procedures can be present without interfaces. */
3943
524af0d6 3944bool
362aa474 3945gfc_check_new_interface (gfc_interface *base, gfc_symbol *new_sym, locus loc)
6de9cd9a
DN
3946{
3947 gfc_interface *ip;
3948
3949 for (ip = base; ip; ip = ip->next)
3950 {
7b901ac4 3951 if (ip->sym == new_sym)
6de9cd9a 3952 {
c4100eae 3953 gfc_error ("Entity %qs at %L is already present in the interface",
362aa474 3954 new_sym->name, &loc);
524af0d6 3955 return false;
6de9cd9a
DN
3956 }
3957 }
3958
524af0d6 3959 return true;
6de9cd9a
DN
3960}
3961
3962
3963/* Add a symbol to the current interface. */
3964
524af0d6 3965bool
7b901ac4 3966gfc_add_interface (gfc_symbol *new_sym)
6de9cd9a
DN
3967{
3968 gfc_interface **head, *intr;
3969 gfc_namespace *ns;
3970 gfc_symbol *sym;
3971
3972 switch (current_interface.type)
3973 {
3974 case INTERFACE_NAMELESS:
9e1d712c 3975 case INTERFACE_ABSTRACT:
524af0d6 3976 return true;
6de9cd9a
DN
3977
3978 case INTERFACE_INTRINSIC_OP:
3979 for (ns = current_interface.ns; ns; ns = ns->parent)
3bed9dd0
DF
3980 switch (current_interface.op)
3981 {
3982 case INTRINSIC_EQ:
3983 case INTRINSIC_EQ_OS:
524af0d6
JB
3984 if (!gfc_check_new_interface (ns->op[INTRINSIC_EQ], new_sym,
3985 gfc_current_locus)
3986 || !gfc_check_new_interface (ns->op[INTRINSIC_EQ_OS],
3987 new_sym, gfc_current_locus))
3988 return false;
3bed9dd0
DF
3989 break;
3990
3991 case INTRINSIC_NE:
3992 case INTRINSIC_NE_OS:
524af0d6
JB
3993 if (!gfc_check_new_interface (ns->op[INTRINSIC_NE], new_sym,
3994 gfc_current_locus)
3995 || !gfc_check_new_interface (ns->op[INTRINSIC_NE_OS],
3996 new_sym, gfc_current_locus))
3997 return false;
3bed9dd0
DF
3998 break;
3999
4000 case INTRINSIC_GT:
4001 case INTRINSIC_GT_OS:
524af0d6
JB
4002 if (!gfc_check_new_interface (ns->op[INTRINSIC_GT],
4003 new_sym, gfc_current_locus)
4004 || !gfc_check_new_interface (ns->op[INTRINSIC_GT_OS],
4005 new_sym, gfc_current_locus))
4006 return false;
3bed9dd0
DF
4007 break;
4008
4009 case INTRINSIC_GE:
4010 case INTRINSIC_GE_OS:
524af0d6
JB
4011 if (!gfc_check_new_interface (ns->op[INTRINSIC_GE],
4012 new_sym, gfc_current_locus)
4013 || !gfc_check_new_interface (ns->op[INTRINSIC_GE_OS],
4014 new_sym, gfc_current_locus))
4015 return false;
3bed9dd0
DF
4016 break;
4017
4018 case INTRINSIC_LT:
4019 case INTRINSIC_LT_OS:
524af0d6
JB
4020 if (!gfc_check_new_interface (ns->op[INTRINSIC_LT],
4021 new_sym, gfc_current_locus)
4022 || !gfc_check_new_interface (ns->op[INTRINSIC_LT_OS],
4023 new_sym, gfc_current_locus))
4024 return false;
3bed9dd0
DF
4025 break;
4026
4027 case INTRINSIC_LE:
4028 case INTRINSIC_LE_OS:
524af0d6
JB
4029 if (!gfc_check_new_interface (ns->op[INTRINSIC_LE],
4030 new_sym, gfc_current_locus)
4031 || !gfc_check_new_interface (ns->op[INTRINSIC_LE_OS],
4032 new_sym, gfc_current_locus))
4033 return false;
3bed9dd0
DF
4034 break;
4035
4036 default:
524af0d6
JB
4037 if (!gfc_check_new_interface (ns->op[current_interface.op],
4038 new_sym, gfc_current_locus))
4039 return false;
3bed9dd0 4040 }
6de9cd9a 4041
a1ee985f 4042 head = &current_interface.ns->op[current_interface.op];
6de9cd9a
DN
4043 break;
4044
4045 case INTERFACE_GENERIC:
4046 for (ns = current_interface.ns; ns; ns = ns->parent)
4047 {
4048 gfc_find_symbol (current_interface.sym->name, ns, 0, &sym);
4049 if (sym == NULL)
4050 continue;
4051
524af0d6
JB
4052 if (!gfc_check_new_interface (sym->generic,
4053 new_sym, gfc_current_locus))
4054 return false;
6de9cd9a
DN
4055 }
4056
4057 head = &current_interface.sym->generic;
4058 break;
4059
4060 case INTERFACE_USER_OP:
524af0d6
JB
4061 if (!gfc_check_new_interface (current_interface.uop->op,
4062 new_sym, gfc_current_locus))
4063 return false;
6de9cd9a 4064
a1ee985f 4065 head = &current_interface.uop->op;
6de9cd9a
DN
4066 break;
4067
4068 default:
4069 gfc_internal_error ("gfc_add_interface(): Bad interface type");
4070 }
4071
4072 intr = gfc_get_interface ();
7b901ac4 4073 intr->sym = new_sym;
63645982 4074 intr->where = gfc_current_locus;
6de9cd9a
DN
4075
4076 intr->next = *head;
4077 *head = intr;
4078
524af0d6 4079 return true;
6de9cd9a
DN
4080}
4081
4082
2b77e908
FXC
4083gfc_interface *
4084gfc_current_interface_head (void)
4085{
4086 switch (current_interface.type)
4087 {
4088 case INTERFACE_INTRINSIC_OP:
a1ee985f 4089 return current_interface.ns->op[current_interface.op];
2b77e908
FXC
4090 break;
4091
4092 case INTERFACE_GENERIC:
4093 return current_interface.sym->generic;
4094 break;
4095
4096 case INTERFACE_USER_OP:
a1ee985f 4097 return current_interface.uop->op;
2b77e908
FXC
4098 break;
4099
4100 default:
4101 gcc_unreachable ();
4102 }
4103}
4104
4105
4106void
4107gfc_set_current_interface_head (gfc_interface *i)
4108{
4109 switch (current_interface.type)
4110 {
4111 case INTERFACE_INTRINSIC_OP:
a1ee985f 4112 current_interface.ns->op[current_interface.op] = i;
2b77e908
FXC
4113 break;
4114
4115 case INTERFACE_GENERIC:
4116 current_interface.sym->generic = i;
4117 break;
4118
4119 case INTERFACE_USER_OP:
a1ee985f 4120 current_interface.uop->op = i;
2b77e908
FXC
4121 break;
4122
4123 default:
4124 gcc_unreachable ();
4125 }
4126}
4127
4128
6de9cd9a
DN
4129/* Gets rid of a formal argument list. We do not free symbols.
4130 Symbols are freed when a namespace is freed. */
4131
4132void
b251af97 4133gfc_free_formal_arglist (gfc_formal_arglist *p)
6de9cd9a
DN
4134{
4135 gfc_formal_arglist *q;
4136
4137 for (; p; p = q)
4138 {
4139 q = p->next;
cede9502 4140 free (p);
6de9cd9a
DN
4141 }
4142}
99fc1b90
JW
4143
4144
9795c594
JW
4145/* Check that it is ok for the type-bound procedure 'proc' to override the
4146 procedure 'old', cf. F08:4.5.7.3. */
99fc1b90 4147
524af0d6 4148bool
99fc1b90
JW
4149gfc_check_typebound_override (gfc_symtree* proc, gfc_symtree* old)
4150{
4151 locus where;
edc802c7 4152 gfc_symbol *proc_target, *old_target;
99fc1b90 4153 unsigned proc_pass_arg, old_pass_arg, argpos;
9795c594
JW
4154 gfc_formal_arglist *proc_formal, *old_formal;
4155 bool check_type;
4156 char err[200];
99fc1b90
JW
4157
4158 /* This procedure should only be called for non-GENERIC proc. */
4159 gcc_assert (!proc->n.tb->is_generic);
4160
4161 /* If the overwritten procedure is GENERIC, this is an error. */
4162 if (old->n.tb->is_generic)
4163 {
c4100eae 4164 gfc_error ("Can't overwrite GENERIC %qs at %L",
99fc1b90 4165 old->name, &proc->n.tb->where);
524af0d6 4166 return false;
99fc1b90
JW
4167 }
4168
4169 where = proc->n.tb->where;
4170 proc_target = proc->n.tb->u.specific->n.sym;
4171 old_target = old->n.tb->u.specific->n.sym;
4172
4173 /* Check that overridden binding is not NON_OVERRIDABLE. */
4174 if (old->n.tb->non_overridable)
4175 {
c4100eae 4176 gfc_error ("%qs at %L overrides a procedure binding declared"
99fc1b90 4177 " NON_OVERRIDABLE", proc->name, &where);
524af0d6 4178 return false;
99fc1b90
JW
4179 }
4180
4181 /* It's an error to override a non-DEFERRED procedure with a DEFERRED one. */
4182 if (!old->n.tb->deferred && proc->n.tb->deferred)
4183 {
c4100eae 4184 gfc_error ("%qs at %L must not be DEFERRED as it overrides a"
99fc1b90 4185 " non-DEFERRED binding", proc->name, &where);
524af0d6 4186 return false;
99fc1b90
JW
4187 }
4188
4189 /* If the overridden binding is PURE, the overriding must be, too. */
4190 if (old_target->attr.pure && !proc_target->attr.pure)
4191 {
c4100eae 4192 gfc_error ("%qs at %L overrides a PURE procedure and must also be PURE",
99fc1b90 4193 proc->name, &where);
524af0d6 4194 return false;
99fc1b90
JW
4195 }
4196
4197 /* If the overridden binding is ELEMENTAL, the overriding must be, too. If it
4198 is not, the overriding must not be either. */
4199 if (old_target->attr.elemental && !proc_target->attr.elemental)
4200 {
c4100eae 4201 gfc_error ("%qs at %L overrides an ELEMENTAL procedure and must also be"
99fc1b90 4202 " ELEMENTAL", proc->name, &where);
524af0d6 4203 return false;
99fc1b90
JW
4204 }
4205 if (!old_target->attr.elemental && proc_target->attr.elemental)
4206 {
c4100eae 4207 gfc_error ("%qs at %L overrides a non-ELEMENTAL procedure and must not"
99fc1b90 4208 " be ELEMENTAL, either", proc->name, &where);
524af0d6 4209 return false;
99fc1b90
JW
4210 }
4211
4212 /* If the overridden binding is a SUBROUTINE, the overriding must also be a
4213 SUBROUTINE. */
4214 if (old_target->attr.subroutine && !proc_target->attr.subroutine)
4215 {
c4100eae 4216 gfc_error ("%qs at %L overrides a SUBROUTINE and must also be a"
99fc1b90 4217 " SUBROUTINE", proc->name, &where);
524af0d6 4218 return false;
99fc1b90
JW
4219 }
4220
4221 /* If the overridden binding is a FUNCTION, the overriding must also be a
4222 FUNCTION and have the same characteristics. */
4223 if (old_target->attr.function)
4224 {
4225 if (!proc_target->attr.function)
4226 {
c4100eae 4227 gfc_error ("%qs at %L overrides a FUNCTION and must also be a"
99fc1b90 4228 " FUNCTION", proc->name, &where);
524af0d6 4229 return false;
99fc1b90 4230 }
8b704316 4231
524af0d6
JB
4232 if (!check_result_characteristics (proc_target, old_target, err,
4233 sizeof(err)))
2240d1cf 4234 {
edc802c7 4235 gfc_error ("Result mismatch for the overriding procedure "
c4100eae 4236 "%qs at %L: %s", proc->name, &where, err);
524af0d6 4237 return false;
2240d1cf 4238 }
99fc1b90
JW
4239 }
4240
4241 /* If the overridden binding is PUBLIC, the overriding one must not be
4242 PRIVATE. */
4243 if (old->n.tb->access == ACCESS_PUBLIC
4244 && proc->n.tb->access == ACCESS_PRIVATE)
4245 {
c4100eae 4246 gfc_error ("%qs at %L overrides a PUBLIC procedure and must not be"
99fc1b90 4247 " PRIVATE", proc->name, &where);
524af0d6 4248 return false;
99fc1b90
JW
4249 }
4250
4251 /* Compare the formal argument lists of both procedures. This is also abused
4252 to find the position of the passed-object dummy arguments of both
4253 bindings as at least the overridden one might not yet be resolved and we
4254 need those positions in the check below. */
4255 proc_pass_arg = old_pass_arg = 0;
4256 if (!proc->n.tb->nopass && !proc->n.tb->pass_arg)
4257 proc_pass_arg = 1;
4258 if (!old->n.tb->nopass && !old->n.tb->pass_arg)
4259 old_pass_arg = 1;
4260 argpos = 1;
4cbc9039
JW
4261 proc_formal = gfc_sym_get_dummy_args (proc_target);
4262 old_formal = gfc_sym_get_dummy_args (old_target);
4263 for ( ; proc_formal && old_formal;
99fc1b90
JW
4264 proc_formal = proc_formal->next, old_formal = old_formal->next)
4265 {
4266 if (proc->n.tb->pass_arg
4267 && !strcmp (proc->n.tb->pass_arg, proc_formal->sym->name))
4268 proc_pass_arg = argpos;
4269 if (old->n.tb->pass_arg
4270 && !strcmp (old->n.tb->pass_arg, old_formal->sym->name))
4271 old_pass_arg = argpos;
4272
4273 /* Check that the names correspond. */
4274 if (strcmp (proc_formal->sym->name, old_formal->sym->name))
4275 {
c4100eae 4276 gfc_error ("Dummy argument %qs of %qs at %L should be named %qs as"
99fc1b90
JW
4277 " to match the corresponding argument of the overridden"
4278 " procedure", proc_formal->sym->name, proc->name, &where,
4279 old_formal->sym->name);
524af0d6 4280 return false;
99fc1b90
JW
4281 }
4282
9795c594 4283 check_type = proc_pass_arg != argpos && old_pass_arg != argpos;
524af0d6
JB
4284 if (!check_dummy_characteristics (proc_formal->sym, old_formal->sym,
4285 check_type, err, sizeof(err)))
99fc1b90 4286 {
9795c594 4287 gfc_error ("Argument mismatch for the overriding procedure "
c4100eae 4288 "%qs at %L: %s", proc->name, &where, err);
524af0d6 4289 return false;
99fc1b90
JW
4290 }
4291
4292 ++argpos;
4293 }
4294 if (proc_formal || old_formal)
4295 {
c4100eae 4296 gfc_error ("%qs at %L must have the same number of formal arguments as"
99fc1b90 4297 " the overridden procedure", proc->name, &where);
524af0d6 4298 return false;
99fc1b90
JW
4299 }
4300
4301 /* If the overridden binding is NOPASS, the overriding one must also be
4302 NOPASS. */
4303 if (old->n.tb->nopass && !proc->n.tb->nopass)
4304 {
c4100eae 4305 gfc_error ("%qs at %L overrides a NOPASS binding and must also be"
99fc1b90 4306 " NOPASS", proc->name, &where);
524af0d6 4307 return false;
99fc1b90
JW
4308 }
4309
4310 /* If the overridden binding is PASS(x), the overriding one must also be
4311 PASS and the passed-object dummy arguments must correspond. */
4312 if (!old->n.tb->nopass)
4313 {
4314 if (proc->n.tb->nopass)
4315 {
c4100eae 4316 gfc_error ("%qs at %L overrides a binding with PASS and must also be"
99fc1b90 4317 " PASS", proc->name, &where);
524af0d6 4318 return false;
99fc1b90
JW
4319 }
4320
4321 if (proc_pass_arg != old_pass_arg)
4322 {
c4100eae 4323 gfc_error ("Passed-object dummy argument of %qs at %L must be at"
99fc1b90
JW
4324 " the same position as the passed-object dummy argument of"
4325 " the overridden procedure", proc->name, &where);
524af0d6 4326 return false;
99fc1b90
JW
4327 }
4328 }
4329
524af0d6 4330 return true;
99fc1b90 4331}