2014-10-18 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / gcc / fortran / resolve.c
blob4acebd0a3b9cd74d169f2e7aba4d9adcfd283db5
1 /* Perform type resolution on the various structures.
2 Copyright (C) 2001-2014 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "flags.h"
25 #include "gfortran.h"
26 #include "obstack.h"
27 #include "bitmap.h"
28 #include "arith.h" /* For gfc_compare_expr(). */
29 #include "dependency.h"
30 #include "data.h"
31 #include "target-memory.h" /* for gfc_simplify_transfer */
32 #include "constructor.h"
34 /* Types used in equivalence statements. */
36 typedef enum seq_type
38 SEQ_NONDEFAULT, SEQ_NUMERIC, SEQ_CHARACTER, SEQ_MIXED
40 seq_type;
42 /* Stack to keep track of the nesting of blocks as we move through the
43 code. See resolve_branch() and gfc_resolve_code(). */
45 typedef struct code_stack
47 struct gfc_code *head, *current;
48 struct code_stack *prev;
50 /* This bitmap keeps track of the targets valid for a branch from
51 inside this block except for END {IF|SELECT}s of enclosing
52 blocks. */
53 bitmap reachable_labels;
55 code_stack;
57 static code_stack *cs_base = NULL;
60 /* Nonzero if we're inside a FORALL or DO CONCURRENT block. */
62 static int forall_flag;
63 int gfc_do_concurrent_flag;
65 /* True when we are resolving an expression that is an actual argument to
66 a procedure. */
67 static bool actual_arg = false;
68 /* True when we are resolving an expression that is the first actual argument
69 to a procedure. */
70 static bool first_actual_arg = false;
73 /* Nonzero if we're inside a OpenMP WORKSHARE or PARALLEL WORKSHARE block. */
75 static int omp_workshare_flag;
77 /* Nonzero if we are processing a formal arglist. The corresponding function
78 resets the flag each time that it is read. */
79 static int formal_arg_flag = 0;
81 /* True if we are resolving a specification expression. */
82 static bool specification_expr = false;
84 /* The id of the last entry seen. */
85 static int current_entry_id;
87 /* We use bitmaps to determine if a branch target is valid. */
88 static bitmap_obstack labels_obstack;
90 /* True when simplifying a EXPR_VARIABLE argument to an inquiry function. */
91 static bool inquiry_argument = false;
94 int
95 gfc_is_formal_arg (void)
97 return formal_arg_flag;
100 /* Is the symbol host associated? */
101 static bool
102 is_sym_host_assoc (gfc_symbol *sym, gfc_namespace *ns)
104 for (ns = ns->parent; ns; ns = ns->parent)
106 if (sym->ns == ns)
107 return true;
110 return false;
113 /* Ensure a typespec used is valid; for instance, TYPE(t) is invalid if t is
114 an ABSTRACT derived-type. If where is not NULL, an error message with that
115 locus is printed, optionally using name. */
117 static bool
118 resolve_typespec_used (gfc_typespec* ts, locus* where, const char* name)
120 if (ts->type == BT_DERIVED && ts->u.derived->attr.abstract)
122 if (where)
124 if (name)
125 gfc_error ("'%s' at %L is of the ABSTRACT type '%s'",
126 name, where, ts->u.derived->name);
127 else
128 gfc_error ("ABSTRACT type '%s' used at %L",
129 ts->u.derived->name, where);
132 return false;
135 return true;
139 static bool
140 check_proc_interface (gfc_symbol *ifc, locus *where)
142 /* Several checks for F08:C1216. */
143 if (ifc->attr.procedure)
145 gfc_error ("Interface '%s' at %L is declared "
146 "in a later PROCEDURE statement", ifc->name, where);
147 return false;
149 if (ifc->generic)
151 /* For generic interfaces, check if there is
152 a specific procedure with the same name. */
153 gfc_interface *gen = ifc->generic;
154 while (gen && strcmp (gen->sym->name, ifc->name) != 0)
155 gen = gen->next;
156 if (!gen)
158 gfc_error ("Interface '%s' at %L may not be generic",
159 ifc->name, where);
160 return false;
163 if (ifc->attr.proc == PROC_ST_FUNCTION)
165 gfc_error ("Interface '%s' at %L may not be a statement function",
166 ifc->name, where);
167 return false;
169 if (gfc_is_intrinsic (ifc, 0, ifc->declared_at)
170 || gfc_is_intrinsic (ifc, 1, ifc->declared_at))
171 ifc->attr.intrinsic = 1;
172 if (ifc->attr.intrinsic && !gfc_intrinsic_actual_ok (ifc->name, 0))
174 gfc_error ("Intrinsic procedure '%s' not allowed in "
175 "PROCEDURE statement at %L", ifc->name, where);
176 return false;
178 if (!ifc->attr.if_source && !ifc->attr.intrinsic && ifc->name[0] != '\0')
180 gfc_error ("Interface '%s' at %L must be explicit", ifc->name, where);
181 return false;
183 return true;
187 static void resolve_symbol (gfc_symbol *sym);
190 /* Resolve the interface for a PROCEDURE declaration or procedure pointer. */
192 static bool
193 resolve_procedure_interface (gfc_symbol *sym)
195 gfc_symbol *ifc = sym->ts.interface;
197 if (!ifc)
198 return true;
200 if (ifc == sym)
202 gfc_error ("PROCEDURE '%s' at %L may not be used as its own interface",
203 sym->name, &sym->declared_at);
204 return false;
206 if (!check_proc_interface (ifc, &sym->declared_at))
207 return false;
209 if (ifc->attr.if_source || ifc->attr.intrinsic)
211 /* Resolve interface and copy attributes. */
212 resolve_symbol (ifc);
213 if (ifc->attr.intrinsic)
214 gfc_resolve_intrinsic (ifc, &ifc->declared_at);
216 if (ifc->result)
218 sym->ts = ifc->result->ts;
219 sym->result = sym;
221 else
222 sym->ts = ifc->ts;
223 sym->ts.interface = ifc;
224 sym->attr.function = ifc->attr.function;
225 sym->attr.subroutine = ifc->attr.subroutine;
227 sym->attr.allocatable = ifc->attr.allocatable;
228 sym->attr.pointer = ifc->attr.pointer;
229 sym->attr.pure = ifc->attr.pure;
230 sym->attr.elemental = ifc->attr.elemental;
231 sym->attr.dimension = ifc->attr.dimension;
232 sym->attr.contiguous = ifc->attr.contiguous;
233 sym->attr.recursive = ifc->attr.recursive;
234 sym->attr.always_explicit = ifc->attr.always_explicit;
235 sym->attr.ext_attr |= ifc->attr.ext_attr;
236 sym->attr.is_bind_c = ifc->attr.is_bind_c;
237 sym->attr.class_ok = ifc->attr.class_ok;
238 /* Copy array spec. */
239 sym->as = gfc_copy_array_spec (ifc->as);
240 /* Copy char length. */
241 if (ifc->ts.type == BT_CHARACTER && ifc->ts.u.cl)
243 sym->ts.u.cl = gfc_new_charlen (sym->ns, ifc->ts.u.cl);
244 if (sym->ts.u.cl->length && !sym->ts.u.cl->resolved
245 && !gfc_resolve_expr (sym->ts.u.cl->length))
246 return false;
250 return true;
254 /* Resolve types of formal argument lists. These have to be done early so that
255 the formal argument lists of module procedures can be copied to the
256 containing module before the individual procedures are resolved
257 individually. We also resolve argument lists of procedures in interface
258 blocks because they are self-contained scoping units.
260 Since a dummy argument cannot be a non-dummy procedure, the only
261 resort left for untyped names are the IMPLICIT types. */
263 static void
264 resolve_formal_arglist (gfc_symbol *proc)
266 gfc_formal_arglist *f;
267 gfc_symbol *sym;
268 bool saved_specification_expr;
269 int i;
271 if (proc->result != NULL)
272 sym = proc->result;
273 else
274 sym = proc;
276 if (gfc_elemental (proc)
277 || sym->attr.pointer || sym->attr.allocatable
278 || (sym->as && sym->as->rank != 0))
280 proc->attr.always_explicit = 1;
281 sym->attr.always_explicit = 1;
284 formal_arg_flag = 1;
286 for (f = proc->formal; f; f = f->next)
288 gfc_array_spec *as;
290 sym = f->sym;
292 if (sym == NULL)
294 /* Alternate return placeholder. */
295 if (gfc_elemental (proc))
296 gfc_error ("Alternate return specifier in elemental subroutine "
297 "'%s' at %L is not allowed", proc->name,
298 &proc->declared_at);
299 if (proc->attr.function)
300 gfc_error ("Alternate return specifier in function "
301 "'%s' at %L is not allowed", proc->name,
302 &proc->declared_at);
303 continue;
305 else if (sym->attr.procedure && sym->attr.if_source != IFSRC_DECL
306 && !resolve_procedure_interface (sym))
307 return;
309 if (strcmp (proc->name, sym->name) == 0)
311 gfc_error ("Self-referential argument "
312 "'%s' at %L is not allowed", sym->name,
313 &proc->declared_at);
314 return;
317 if (sym->attr.if_source != IFSRC_UNKNOWN)
318 resolve_formal_arglist (sym);
320 if (sym->attr.subroutine || sym->attr.external)
322 if (sym->attr.flavor == FL_UNKNOWN)
323 gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, &sym->declared_at);
325 else
327 if (sym->ts.type == BT_UNKNOWN && !proc->attr.intrinsic
328 && (!sym->attr.function || sym->result == sym))
329 gfc_set_default_type (sym, 1, sym->ns);
332 as = sym->ts.type == BT_CLASS && sym->attr.class_ok
333 ? CLASS_DATA (sym)->as : sym->as;
335 saved_specification_expr = specification_expr;
336 specification_expr = true;
337 gfc_resolve_array_spec (as, 0);
338 specification_expr = saved_specification_expr;
340 /* We can't tell if an array with dimension (:) is assumed or deferred
341 shape until we know if it has the pointer or allocatable attributes.
343 if (as && as->rank > 0 && as->type == AS_DEFERRED
344 && ((sym->ts.type != BT_CLASS
345 && !(sym->attr.pointer || sym->attr.allocatable))
346 || (sym->ts.type == BT_CLASS
347 && !(CLASS_DATA (sym)->attr.class_pointer
348 || CLASS_DATA (sym)->attr.allocatable)))
349 && sym->attr.flavor != FL_PROCEDURE)
351 as->type = AS_ASSUMED_SHAPE;
352 for (i = 0; i < as->rank; i++)
353 as->lower[i] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
356 if ((as && as->rank > 0 && as->type == AS_ASSUMED_SHAPE)
357 || (as && as->type == AS_ASSUMED_RANK)
358 || sym->attr.pointer || sym->attr.allocatable || sym->attr.target
359 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
360 && (CLASS_DATA (sym)->attr.class_pointer
361 || CLASS_DATA (sym)->attr.allocatable
362 || CLASS_DATA (sym)->attr.target))
363 || sym->attr.optional)
365 proc->attr.always_explicit = 1;
366 if (proc->result)
367 proc->result->attr.always_explicit = 1;
370 /* If the flavor is unknown at this point, it has to be a variable.
371 A procedure specification would have already set the type. */
373 if (sym->attr.flavor == FL_UNKNOWN)
374 gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, &sym->declared_at);
376 if (gfc_pure (proc))
378 if (sym->attr.flavor == FL_PROCEDURE)
380 /* F08:C1279. */
381 if (!gfc_pure (sym))
383 gfc_error ("Dummy procedure '%s' of PURE procedure at %L must "
384 "also be PURE", sym->name, &sym->declared_at);
385 continue;
388 else if (!sym->attr.pointer)
390 if (proc->attr.function && sym->attr.intent != INTENT_IN)
392 if (sym->attr.value)
393 gfc_notify_std (GFC_STD_F2008, "Argument '%s'"
394 " of pure function '%s' at %L with VALUE "
395 "attribute but without INTENT(IN)",
396 sym->name, proc->name, &sym->declared_at);
397 else
398 gfc_error ("Argument '%s' of pure function '%s' at %L must "
399 "be INTENT(IN) or VALUE", sym->name, proc->name,
400 &sym->declared_at);
403 if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN)
405 if (sym->attr.value)
406 gfc_notify_std (GFC_STD_F2008, "Argument '%s'"
407 " of pure subroutine '%s' at %L with VALUE "
408 "attribute but without INTENT", sym->name,
409 proc->name, &sym->declared_at);
410 else
411 gfc_error ("Argument '%s' of pure subroutine '%s' at %L "
412 "must have its INTENT specified or have the "
413 "VALUE attribute", sym->name, proc->name,
414 &sym->declared_at);
419 if (proc->attr.implicit_pure)
421 if (sym->attr.flavor == FL_PROCEDURE)
423 if (!gfc_pure (sym))
424 proc->attr.implicit_pure = 0;
426 else if (!sym->attr.pointer)
428 if (proc->attr.function && sym->attr.intent != INTENT_IN
429 && !sym->value)
430 proc->attr.implicit_pure = 0;
432 if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN
433 && !sym->value)
434 proc->attr.implicit_pure = 0;
438 if (gfc_elemental (proc))
440 /* F08:C1289. */
441 if (sym->attr.codimension
442 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
443 && CLASS_DATA (sym)->attr.codimension))
445 gfc_error ("Coarray dummy argument '%s' at %L to elemental "
446 "procedure", sym->name, &sym->declared_at);
447 continue;
450 if (sym->as || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
451 && CLASS_DATA (sym)->as))
453 gfc_error ("Argument '%s' of elemental procedure at %L must "
454 "be scalar", sym->name, &sym->declared_at);
455 continue;
458 if (sym->attr.allocatable
459 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
460 && CLASS_DATA (sym)->attr.allocatable))
462 gfc_error ("Argument '%s' of elemental procedure at %L cannot "
463 "have the ALLOCATABLE attribute", sym->name,
464 &sym->declared_at);
465 continue;
468 if (sym->attr.pointer
469 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
470 && CLASS_DATA (sym)->attr.class_pointer))
472 gfc_error ("Argument '%s' of elemental procedure at %L cannot "
473 "have the POINTER attribute", sym->name,
474 &sym->declared_at);
475 continue;
478 if (sym->attr.flavor == FL_PROCEDURE)
480 gfc_error ("Dummy procedure '%s' not allowed in elemental "
481 "procedure '%s' at %L", sym->name, proc->name,
482 &sym->declared_at);
483 continue;
486 /* Fortran 2008 Corrigendum 1, C1290a. */
487 if (sym->attr.intent == INTENT_UNKNOWN && !sym->attr.value)
489 gfc_error ("Argument '%s' of elemental procedure '%s' at %L must "
490 "have its INTENT specified or have the VALUE "
491 "attribute", sym->name, proc->name,
492 &sym->declared_at);
493 continue;
497 /* Each dummy shall be specified to be scalar. */
498 if (proc->attr.proc == PROC_ST_FUNCTION)
500 if (sym->as != NULL)
502 gfc_error ("Argument '%s' of statement function at %L must "
503 "be scalar", sym->name, &sym->declared_at);
504 continue;
507 if (sym->ts.type == BT_CHARACTER)
509 gfc_charlen *cl = sym->ts.u.cl;
510 if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
512 gfc_error ("Character-valued argument '%s' of statement "
513 "function at %L must have constant length",
514 sym->name, &sym->declared_at);
515 continue;
520 formal_arg_flag = 0;
524 /* Work function called when searching for symbols that have argument lists
525 associated with them. */
527 static void
528 find_arglists (gfc_symbol *sym)
530 if (sym->attr.if_source == IFSRC_UNKNOWN || sym->ns != gfc_current_ns
531 || sym->attr.flavor == FL_DERIVED || sym->attr.intrinsic)
532 return;
534 resolve_formal_arglist (sym);
538 /* Given a namespace, resolve all formal argument lists within the namespace.
541 static void
542 resolve_formal_arglists (gfc_namespace *ns)
544 if (ns == NULL)
545 return;
547 gfc_traverse_ns (ns, find_arglists);
551 static void
552 resolve_contained_fntype (gfc_symbol *sym, gfc_namespace *ns)
554 bool t;
556 /* If this namespace is not a function or an entry master function,
557 ignore it. */
558 if (! sym || !(sym->attr.function || sym->attr.flavor == FL_VARIABLE)
559 || sym->attr.entry_master)
560 return;
562 /* Try to find out of what the return type is. */
563 if (sym->result->ts.type == BT_UNKNOWN && sym->result->ts.interface == NULL)
565 t = gfc_set_default_type (sym->result, 0, ns);
567 if (!t && !sym->result->attr.untyped)
569 if (sym->result == sym)
570 gfc_error ("Contained function '%s' at %L has no IMPLICIT type",
571 sym->name, &sym->declared_at);
572 else if (!sym->result->attr.proc_pointer)
573 gfc_error ("Result '%s' of contained function '%s' at %L has "
574 "no IMPLICIT type", sym->result->name, sym->name,
575 &sym->result->declared_at);
576 sym->result->attr.untyped = 1;
580 /* Fortran 95 Draft Standard, page 51, Section 5.1.1.5, on the Character
581 type, lists the only ways a character length value of * can be used:
582 dummy arguments of procedures, named constants, and function results
583 in external functions. Internal function results and results of module
584 procedures are not on this list, ergo, not permitted. */
586 if (sym->result->ts.type == BT_CHARACTER)
588 gfc_charlen *cl = sym->result->ts.u.cl;
589 if ((!cl || !cl->length) && !sym->result->ts.deferred)
591 /* See if this is a module-procedure and adapt error message
592 accordingly. */
593 bool module_proc;
594 gcc_assert (ns->parent && ns->parent->proc_name);
595 module_proc = (ns->parent->proc_name->attr.flavor == FL_MODULE);
597 gfc_error ("Character-valued %s '%s' at %L must not be"
598 " assumed length",
599 module_proc ? _("module procedure")
600 : _("internal function"),
601 sym->name, &sym->declared_at);
607 /* Add NEW_ARGS to the formal argument list of PROC, taking care not to
608 introduce duplicates. */
610 static void
611 merge_argument_lists (gfc_symbol *proc, gfc_formal_arglist *new_args)
613 gfc_formal_arglist *f, *new_arglist;
614 gfc_symbol *new_sym;
616 for (; new_args != NULL; new_args = new_args->next)
618 new_sym = new_args->sym;
619 /* See if this arg is already in the formal argument list. */
620 for (f = proc->formal; f; f = f->next)
622 if (new_sym == f->sym)
623 break;
626 if (f)
627 continue;
629 /* Add a new argument. Argument order is not important. */
630 new_arglist = gfc_get_formal_arglist ();
631 new_arglist->sym = new_sym;
632 new_arglist->next = proc->formal;
633 proc->formal = new_arglist;
638 /* Flag the arguments that are not present in all entries. */
640 static void
641 check_argument_lists (gfc_symbol *proc, gfc_formal_arglist *new_args)
643 gfc_formal_arglist *f, *head;
644 head = new_args;
646 for (f = proc->formal; f; f = f->next)
648 if (f->sym == NULL)
649 continue;
651 for (new_args = head; new_args; new_args = new_args->next)
653 if (new_args->sym == f->sym)
654 break;
657 if (new_args)
658 continue;
660 f->sym->attr.not_always_present = 1;
665 /* Resolve alternate entry points. If a symbol has multiple entry points we
666 create a new master symbol for the main routine, and turn the existing
667 symbol into an entry point. */
669 static void
670 resolve_entries (gfc_namespace *ns)
672 gfc_namespace *old_ns;
673 gfc_code *c;
674 gfc_symbol *proc;
675 gfc_entry_list *el;
676 char name[GFC_MAX_SYMBOL_LEN + 1];
677 static int master_count = 0;
679 if (ns->proc_name == NULL)
680 return;
682 /* No need to do anything if this procedure doesn't have alternate entry
683 points. */
684 if (!ns->entries)
685 return;
687 /* We may already have resolved alternate entry points. */
688 if (ns->proc_name->attr.entry_master)
689 return;
691 /* If this isn't a procedure something has gone horribly wrong. */
692 gcc_assert (ns->proc_name->attr.flavor == FL_PROCEDURE);
694 /* Remember the current namespace. */
695 old_ns = gfc_current_ns;
697 gfc_current_ns = ns;
699 /* Add the main entry point to the list of entry points. */
700 el = gfc_get_entry_list ();
701 el->sym = ns->proc_name;
702 el->id = 0;
703 el->next = ns->entries;
704 ns->entries = el;
705 ns->proc_name->attr.entry = 1;
707 /* If it is a module function, it needs to be in the right namespace
708 so that gfc_get_fake_result_decl can gather up the results. The
709 need for this arose in get_proc_name, where these beasts were
710 left in their own namespace, to keep prior references linked to
711 the entry declaration.*/
712 if (ns->proc_name->attr.function
713 && ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
714 el->sym->ns = ns;
716 /* Do the same for entries where the master is not a module
717 procedure. These are retained in the module namespace because
718 of the module procedure declaration. */
719 for (el = el->next; el; el = el->next)
720 if (el->sym->ns->proc_name->attr.flavor == FL_MODULE
721 && el->sym->attr.mod_proc)
722 el->sym->ns = ns;
723 el = ns->entries;
725 /* Add an entry statement for it. */
726 c = gfc_get_code (EXEC_ENTRY);
727 c->ext.entry = el;
728 c->next = ns->code;
729 ns->code = c;
731 /* Create a new symbol for the master function. */
732 /* Give the internal function a unique name (within this file).
733 Also include the function name so the user has some hope of figuring
734 out what is going on. */
735 snprintf (name, GFC_MAX_SYMBOL_LEN, "master.%d.%s",
736 master_count++, ns->proc_name->name);
737 gfc_get_ha_symbol (name, &proc);
738 gcc_assert (proc != NULL);
740 gfc_add_procedure (&proc->attr, PROC_INTERNAL, proc->name, NULL);
741 if (ns->proc_name->attr.subroutine)
742 gfc_add_subroutine (&proc->attr, proc->name, NULL);
743 else
745 gfc_symbol *sym;
746 gfc_typespec *ts, *fts;
747 gfc_array_spec *as, *fas;
748 gfc_add_function (&proc->attr, proc->name, NULL);
749 proc->result = proc;
750 fas = ns->entries->sym->as;
751 fas = fas ? fas : ns->entries->sym->result->as;
752 fts = &ns->entries->sym->result->ts;
753 if (fts->type == BT_UNKNOWN)
754 fts = gfc_get_default_type (ns->entries->sym->result->name, NULL);
755 for (el = ns->entries->next; el; el = el->next)
757 ts = &el->sym->result->ts;
758 as = el->sym->as;
759 as = as ? as : el->sym->result->as;
760 if (ts->type == BT_UNKNOWN)
761 ts = gfc_get_default_type (el->sym->result->name, NULL);
763 if (! gfc_compare_types (ts, fts)
764 || (el->sym->result->attr.dimension
765 != ns->entries->sym->result->attr.dimension)
766 || (el->sym->result->attr.pointer
767 != ns->entries->sym->result->attr.pointer))
768 break;
769 else if (as && fas && ns->entries->sym->result != el->sym->result
770 && gfc_compare_array_spec (as, fas) == 0)
771 gfc_error ("Function %s at %L has entries with mismatched "
772 "array specifications", ns->entries->sym->name,
773 &ns->entries->sym->declared_at);
774 /* The characteristics need to match and thus both need to have
775 the same string length, i.e. both len=*, or both len=4.
776 Having both len=<variable> is also possible, but difficult to
777 check at compile time. */
778 else if (ts->type == BT_CHARACTER && ts->u.cl && fts->u.cl
779 && (((ts->u.cl->length && !fts->u.cl->length)
780 ||(!ts->u.cl->length && fts->u.cl->length))
781 || (ts->u.cl->length
782 && ts->u.cl->length->expr_type
783 != fts->u.cl->length->expr_type)
784 || (ts->u.cl->length
785 && ts->u.cl->length->expr_type == EXPR_CONSTANT
786 && mpz_cmp (ts->u.cl->length->value.integer,
787 fts->u.cl->length->value.integer) != 0)))
788 gfc_notify_std (GFC_STD_GNU, "Function %s at %L with "
789 "entries returning variables of different "
790 "string lengths", ns->entries->sym->name,
791 &ns->entries->sym->declared_at);
794 if (el == NULL)
796 sym = ns->entries->sym->result;
797 /* All result types the same. */
798 proc->ts = *fts;
799 if (sym->attr.dimension)
800 gfc_set_array_spec (proc, gfc_copy_array_spec (sym->as), NULL);
801 if (sym->attr.pointer)
802 gfc_add_pointer (&proc->attr, NULL);
804 else
806 /* Otherwise the result will be passed through a union by
807 reference. */
808 proc->attr.mixed_entry_master = 1;
809 for (el = ns->entries; el; el = el->next)
811 sym = el->sym->result;
812 if (sym->attr.dimension)
814 if (el == ns->entries)
815 gfc_error ("FUNCTION result %s can't be an array in "
816 "FUNCTION %s at %L", sym->name,
817 ns->entries->sym->name, &sym->declared_at);
818 else
819 gfc_error ("ENTRY result %s can't be an array in "
820 "FUNCTION %s at %L", sym->name,
821 ns->entries->sym->name, &sym->declared_at);
823 else if (sym->attr.pointer)
825 if (el == ns->entries)
826 gfc_error ("FUNCTION result %s can't be a POINTER in "
827 "FUNCTION %s at %L", sym->name,
828 ns->entries->sym->name, &sym->declared_at);
829 else
830 gfc_error ("ENTRY result %s can't be a POINTER in "
831 "FUNCTION %s at %L", sym->name,
832 ns->entries->sym->name, &sym->declared_at);
834 else
836 ts = &sym->ts;
837 if (ts->type == BT_UNKNOWN)
838 ts = gfc_get_default_type (sym->name, NULL);
839 switch (ts->type)
841 case BT_INTEGER:
842 if (ts->kind == gfc_default_integer_kind)
843 sym = NULL;
844 break;
845 case BT_REAL:
846 if (ts->kind == gfc_default_real_kind
847 || ts->kind == gfc_default_double_kind)
848 sym = NULL;
849 break;
850 case BT_COMPLEX:
851 if (ts->kind == gfc_default_complex_kind)
852 sym = NULL;
853 break;
854 case BT_LOGICAL:
855 if (ts->kind == gfc_default_logical_kind)
856 sym = NULL;
857 break;
858 case BT_UNKNOWN:
859 /* We will issue error elsewhere. */
860 sym = NULL;
861 break;
862 default:
863 break;
865 if (sym)
867 if (el == ns->entries)
868 gfc_error ("FUNCTION result %s can't be of type %s "
869 "in FUNCTION %s at %L", sym->name,
870 gfc_typename (ts), ns->entries->sym->name,
871 &sym->declared_at);
872 else
873 gfc_error ("ENTRY result %s can't be of type %s "
874 "in FUNCTION %s at %L", sym->name,
875 gfc_typename (ts), ns->entries->sym->name,
876 &sym->declared_at);
882 proc->attr.access = ACCESS_PRIVATE;
883 proc->attr.entry_master = 1;
885 /* Merge all the entry point arguments. */
886 for (el = ns->entries; el; el = el->next)
887 merge_argument_lists (proc, el->sym->formal);
889 /* Check the master formal arguments for any that are not
890 present in all entry points. */
891 for (el = ns->entries; el; el = el->next)
892 check_argument_lists (proc, el->sym->formal);
894 /* Use the master function for the function body. */
895 ns->proc_name = proc;
897 /* Finalize the new symbols. */
898 gfc_commit_symbols ();
900 /* Restore the original namespace. */
901 gfc_current_ns = old_ns;
905 /* Resolve common variables. */
906 static void
907 resolve_common_vars (gfc_symbol *sym, bool named_common)
909 gfc_symbol *csym = sym;
911 for (; csym; csym = csym->common_next)
913 if (csym->value || csym->attr.data)
915 if (!csym->ns->is_block_data)
916 gfc_notify_std (GFC_STD_GNU, "Variable '%s' at %L is in COMMON "
917 "but only in BLOCK DATA initialization is "
918 "allowed", csym->name, &csym->declared_at);
919 else if (!named_common)
920 gfc_notify_std (GFC_STD_GNU, "Initialized variable '%s' at %L is "
921 "in a blank COMMON but initialization is only "
922 "allowed in named common blocks", csym->name,
923 &csym->declared_at);
926 if (UNLIMITED_POLY (csym))
927 gfc_error_now ("'%s' in cannot appear in COMMON at %L "
928 "[F2008:C5100]", csym->name, &csym->declared_at);
930 if (csym->ts.type != BT_DERIVED)
931 continue;
933 if (!(csym->ts.u.derived->attr.sequence
934 || csym->ts.u.derived->attr.is_bind_c))
935 gfc_error_now ("Derived type variable '%s' in COMMON at %L "
936 "has neither the SEQUENCE nor the BIND(C) "
937 "attribute", csym->name, &csym->declared_at);
938 if (csym->ts.u.derived->attr.alloc_comp)
939 gfc_error_now ("Derived type variable '%s' in COMMON at %L "
940 "has an ultimate component that is "
941 "allocatable", csym->name, &csym->declared_at);
942 if (gfc_has_default_initializer (csym->ts.u.derived))
943 gfc_error_now ("Derived type variable '%s' in COMMON at %L "
944 "may not have default initializer", csym->name,
945 &csym->declared_at);
947 if (csym->attr.flavor == FL_UNKNOWN && !csym->attr.proc_pointer)
948 gfc_add_flavor (&csym->attr, FL_VARIABLE, csym->name, &csym->declared_at);
952 /* Resolve common blocks. */
953 static void
954 resolve_common_blocks (gfc_symtree *common_root)
956 gfc_symbol *sym;
957 gfc_gsymbol * gsym;
959 if (common_root == NULL)
960 return;
962 if (common_root->left)
963 resolve_common_blocks (common_root->left);
964 if (common_root->right)
965 resolve_common_blocks (common_root->right);
967 resolve_common_vars (common_root->n.common->head, true);
969 /* The common name is a global name - in Fortran 2003 also if it has a
970 C binding name, since Fortran 2008 only the C binding name is a global
971 identifier. */
972 if (!common_root->n.common->binding_label
973 || gfc_notification_std (GFC_STD_F2008))
975 gsym = gfc_find_gsymbol (gfc_gsym_root,
976 common_root->n.common->name);
978 if (gsym && gfc_notification_std (GFC_STD_F2008)
979 && gsym->type == GSYM_COMMON
980 && ((common_root->n.common->binding_label
981 && (!gsym->binding_label
982 || strcmp (common_root->n.common->binding_label,
983 gsym->binding_label) != 0))
984 || (!common_root->n.common->binding_label
985 && gsym->binding_label)))
987 gfc_error ("In Fortran 2003 COMMON '%s' block at %L is a global "
988 "identifier and must thus have the same binding name "
989 "as the same-named COMMON block at %L: %s vs %s",
990 common_root->n.common->name, &common_root->n.common->where,
991 &gsym->where,
992 common_root->n.common->binding_label
993 ? common_root->n.common->binding_label : "(blank)",
994 gsym->binding_label ? gsym->binding_label : "(blank)");
995 return;
998 if (gsym && gsym->type != GSYM_COMMON
999 && !common_root->n.common->binding_label)
1001 gfc_error ("COMMON block '%s' at %L uses the same global identifier "
1002 "as entity at %L",
1003 common_root->n.common->name, &common_root->n.common->where,
1004 &gsym->where);
1005 return;
1007 if (gsym && gsym->type != GSYM_COMMON)
1009 gfc_error ("Fortran 2008: COMMON block '%s' with binding label at "
1010 "%L sharing the identifier with global non-COMMON-block "
1011 "entity at %L", common_root->n.common->name,
1012 &common_root->n.common->where, &gsym->where);
1013 return;
1015 if (!gsym)
1017 gsym = gfc_get_gsymbol (common_root->n.common->name);
1018 gsym->type = GSYM_COMMON;
1019 gsym->where = common_root->n.common->where;
1020 gsym->defined = 1;
1022 gsym->used = 1;
1025 if (common_root->n.common->binding_label)
1027 gsym = gfc_find_gsymbol (gfc_gsym_root,
1028 common_root->n.common->binding_label);
1029 if (gsym && gsym->type != GSYM_COMMON)
1031 gfc_error ("COMMON block at %L with binding label %s uses the same "
1032 "global identifier as entity at %L",
1033 &common_root->n.common->where,
1034 common_root->n.common->binding_label, &gsym->where);
1035 return;
1037 if (!gsym)
1039 gsym = gfc_get_gsymbol (common_root->n.common->binding_label);
1040 gsym->type = GSYM_COMMON;
1041 gsym->where = common_root->n.common->where;
1042 gsym->defined = 1;
1044 gsym->used = 1;
1047 gfc_find_symbol (common_root->name, gfc_current_ns, 0, &sym);
1048 if (sym == NULL)
1049 return;
1051 if (sym->attr.flavor == FL_PARAMETER)
1052 gfc_error ("COMMON block '%s' at %L is used as PARAMETER at %L",
1053 sym->name, &common_root->n.common->where, &sym->declared_at);
1055 if (sym->attr.external)
1056 gfc_error ("COMMON block '%s' at %L can not have the EXTERNAL attribute",
1057 sym->name, &common_root->n.common->where);
1059 if (sym->attr.intrinsic)
1060 gfc_error ("COMMON block '%s' at %L is also an intrinsic procedure",
1061 sym->name, &common_root->n.common->where);
1062 else if (sym->attr.result
1063 || gfc_is_function_return_value (sym, gfc_current_ns))
1064 gfc_notify_std (GFC_STD_F2003, "COMMON block '%s' at %L "
1065 "that is also a function result", sym->name,
1066 &common_root->n.common->where);
1067 else if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_INTERNAL
1068 && sym->attr.proc != PROC_ST_FUNCTION)
1069 gfc_notify_std (GFC_STD_F2003, "COMMON block '%s' at %L "
1070 "that is also a global procedure", sym->name,
1071 &common_root->n.common->where);
1075 /* Resolve contained function types. Because contained functions can call one
1076 another, they have to be worked out before any of the contained procedures
1077 can be resolved.
1079 The good news is that if a function doesn't already have a type, the only
1080 way it can get one is through an IMPLICIT type or a RESULT variable, because
1081 by definition contained functions are contained namespace they're contained
1082 in, not in a sibling or parent namespace. */
1084 static void
1085 resolve_contained_functions (gfc_namespace *ns)
1087 gfc_namespace *child;
1088 gfc_entry_list *el;
1090 resolve_formal_arglists (ns);
1092 for (child = ns->contained; child; child = child->sibling)
1094 /* Resolve alternate entry points first. */
1095 resolve_entries (child);
1097 /* Then check function return types. */
1098 resolve_contained_fntype (child->proc_name, child);
1099 for (el = child->entries; el; el = el->next)
1100 resolve_contained_fntype (el->sym, child);
1105 static bool resolve_fl_derived0 (gfc_symbol *sym);
1108 /* Resolve all of the elements of a structure constructor and make sure that
1109 the types are correct. The 'init' flag indicates that the given
1110 constructor is an initializer. */
1112 static bool
1113 resolve_structure_cons (gfc_expr *expr, int init)
1115 gfc_constructor *cons;
1116 gfc_component *comp;
1117 bool t;
1118 symbol_attribute a;
1120 t = true;
1122 if (expr->ts.type == BT_DERIVED)
1123 resolve_fl_derived0 (expr->ts.u.derived);
1125 cons = gfc_constructor_first (expr->value.constructor);
1127 /* A constructor may have references if it is the result of substituting a
1128 parameter variable. In this case we just pull out the component we
1129 want. */
1130 if (expr->ref)
1131 comp = expr->ref->u.c.sym->components;
1132 else
1133 comp = expr->ts.u.derived->components;
1135 for (; comp && cons; comp = comp->next, cons = gfc_constructor_next (cons))
1137 int rank;
1139 if (!cons->expr)
1140 continue;
1142 if (!gfc_resolve_expr (cons->expr))
1144 t = false;
1145 continue;
1148 rank = comp->as ? comp->as->rank : 0;
1149 if (cons->expr->expr_type != EXPR_NULL && rank != cons->expr->rank
1150 && (comp->attr.allocatable || cons->expr->rank))
1152 gfc_error ("The rank of the element in the structure "
1153 "constructor at %L does not match that of the "
1154 "component (%d/%d)", &cons->expr->where,
1155 cons->expr->rank, rank);
1156 t = false;
1159 /* If we don't have the right type, try to convert it. */
1161 if (!comp->attr.proc_pointer &&
1162 !gfc_compare_types (&cons->expr->ts, &comp->ts))
1164 if (strcmp (comp->name, "_extends") == 0)
1166 /* Can afford to be brutal with the _extends initializer.
1167 The derived type can get lost because it is PRIVATE
1168 but it is not usage constrained by the standard. */
1169 cons->expr->ts = comp->ts;
1171 else if (comp->attr.pointer && cons->expr->ts.type != BT_UNKNOWN)
1173 gfc_error ("The element in the structure constructor at %L, "
1174 "for pointer component '%s', is %s but should be %s",
1175 &cons->expr->where, comp->name,
1176 gfc_basic_typename (cons->expr->ts.type),
1177 gfc_basic_typename (comp->ts.type));
1178 t = false;
1180 else
1182 bool t2 = gfc_convert_type (cons->expr, &comp->ts, 1);
1183 if (t)
1184 t = t2;
1188 /* For strings, the length of the constructor should be the same as
1189 the one of the structure, ensure this if the lengths are known at
1190 compile time and when we are dealing with PARAMETER or structure
1191 constructors. */
1192 if (cons->expr->ts.type == BT_CHARACTER && comp->ts.u.cl
1193 && comp->ts.u.cl->length
1194 && comp->ts.u.cl->length->expr_type == EXPR_CONSTANT
1195 && cons->expr->ts.u.cl && cons->expr->ts.u.cl->length
1196 && cons->expr->ts.u.cl->length->expr_type == EXPR_CONSTANT
1197 && cons->expr->rank != 0
1198 && mpz_cmp (cons->expr->ts.u.cl->length->value.integer,
1199 comp->ts.u.cl->length->value.integer) != 0)
1201 if (cons->expr->expr_type == EXPR_VARIABLE
1202 && cons->expr->symtree->n.sym->attr.flavor == FL_PARAMETER)
1204 /* Wrap the parameter in an array constructor (EXPR_ARRAY)
1205 to make use of the gfc_resolve_character_array_constructor
1206 machinery. The expression is later simplified away to
1207 an array of string literals. */
1208 gfc_expr *para = cons->expr;
1209 cons->expr = gfc_get_expr ();
1210 cons->expr->ts = para->ts;
1211 cons->expr->where = para->where;
1212 cons->expr->expr_type = EXPR_ARRAY;
1213 cons->expr->rank = para->rank;
1214 cons->expr->shape = gfc_copy_shape (para->shape, para->rank);
1215 gfc_constructor_append_expr (&cons->expr->value.constructor,
1216 para, &cons->expr->where);
1218 if (cons->expr->expr_type == EXPR_ARRAY)
1220 gfc_constructor *p;
1221 p = gfc_constructor_first (cons->expr->value.constructor);
1222 if (cons->expr->ts.u.cl != p->expr->ts.u.cl)
1224 gfc_charlen *cl, *cl2;
1226 cl2 = NULL;
1227 for (cl = gfc_current_ns->cl_list; cl; cl = cl->next)
1229 if (cl == cons->expr->ts.u.cl)
1230 break;
1231 cl2 = cl;
1234 gcc_assert (cl);
1236 if (cl2)
1237 cl2->next = cl->next;
1239 gfc_free_expr (cl->length);
1240 free (cl);
1243 cons->expr->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1244 cons->expr->ts.u.cl->length_from_typespec = true;
1245 cons->expr->ts.u.cl->length = gfc_copy_expr (comp->ts.u.cl->length);
1246 gfc_resolve_character_array_constructor (cons->expr);
1250 if (cons->expr->expr_type == EXPR_NULL
1251 && !(comp->attr.pointer || comp->attr.allocatable
1252 || comp->attr.proc_pointer || comp->ts.f90_type == BT_VOID
1253 || (comp->ts.type == BT_CLASS
1254 && (CLASS_DATA (comp)->attr.class_pointer
1255 || CLASS_DATA (comp)->attr.allocatable))))
1257 t = false;
1258 gfc_error ("The NULL in the structure constructor at %L is "
1259 "being applied to component '%s', which is neither "
1260 "a POINTER nor ALLOCATABLE", &cons->expr->where,
1261 comp->name);
1264 if (comp->attr.proc_pointer && comp->ts.interface)
1266 /* Check procedure pointer interface. */
1267 gfc_symbol *s2 = NULL;
1268 gfc_component *c2;
1269 const char *name;
1270 char err[200];
1272 c2 = gfc_get_proc_ptr_comp (cons->expr);
1273 if (c2)
1275 s2 = c2->ts.interface;
1276 name = c2->name;
1278 else if (cons->expr->expr_type == EXPR_FUNCTION)
1280 s2 = cons->expr->symtree->n.sym->result;
1281 name = cons->expr->symtree->n.sym->result->name;
1283 else if (cons->expr->expr_type != EXPR_NULL)
1285 s2 = cons->expr->symtree->n.sym;
1286 name = cons->expr->symtree->n.sym->name;
1289 if (s2 && !gfc_compare_interfaces (comp->ts.interface, s2, name, 0, 1,
1290 err, sizeof (err), NULL, NULL))
1292 gfc_error ("Interface mismatch for procedure-pointer component "
1293 "'%s' in structure constructor at %L: %s",
1294 comp->name, &cons->expr->where, err);
1295 return false;
1299 if (!comp->attr.pointer || comp->attr.proc_pointer
1300 || cons->expr->expr_type == EXPR_NULL)
1301 continue;
1303 a = gfc_expr_attr (cons->expr);
1305 if (!a.pointer && !a.target)
1307 t = false;
1308 gfc_error ("The element in the structure constructor at %L, "
1309 "for pointer component '%s' should be a POINTER or "
1310 "a TARGET", &cons->expr->where, comp->name);
1313 if (init)
1315 /* F08:C461. Additional checks for pointer initialization. */
1316 if (a.allocatable)
1318 t = false;
1319 gfc_error ("Pointer initialization target at %L "
1320 "must not be ALLOCATABLE ", &cons->expr->where);
1322 if (!a.save)
1324 t = false;
1325 gfc_error ("Pointer initialization target at %L "
1326 "must have the SAVE attribute", &cons->expr->where);
1330 /* F2003, C1272 (3). */
1331 bool impure = cons->expr->expr_type == EXPR_VARIABLE
1332 && (gfc_impure_variable (cons->expr->symtree->n.sym)
1333 || gfc_is_coindexed (cons->expr));
1334 if (impure && gfc_pure (NULL))
1336 t = false;
1337 gfc_error ("Invalid expression in the structure constructor for "
1338 "pointer component '%s' at %L in PURE procedure",
1339 comp->name, &cons->expr->where);
1342 if (impure)
1343 gfc_unset_implicit_pure (NULL);
1346 return t;
1350 /****************** Expression name resolution ******************/
1352 /* Returns 0 if a symbol was not declared with a type or
1353 attribute declaration statement, nonzero otherwise. */
1355 static int
1356 was_declared (gfc_symbol *sym)
1358 symbol_attribute a;
1360 a = sym->attr;
1362 if (!a.implicit_type && sym->ts.type != BT_UNKNOWN)
1363 return 1;
1365 if (a.allocatable || a.dimension || a.dummy || a.external || a.intrinsic
1366 || a.optional || a.pointer || a.save || a.target || a.volatile_
1367 || a.value || a.access != ACCESS_UNKNOWN || a.intent != INTENT_UNKNOWN
1368 || a.asynchronous || a.codimension)
1369 return 1;
1371 return 0;
1375 /* Determine if a symbol is generic or not. */
1377 static int
1378 generic_sym (gfc_symbol *sym)
1380 gfc_symbol *s;
1382 if (sym->attr.generic ||
1383 (sym->attr.intrinsic && gfc_generic_intrinsic (sym->name)))
1384 return 1;
1386 if (was_declared (sym) || sym->ns->parent == NULL)
1387 return 0;
1389 gfc_find_symbol (sym->name, sym->ns->parent, 1, &s);
1391 if (s != NULL)
1393 if (s == sym)
1394 return 0;
1395 else
1396 return generic_sym (s);
1399 return 0;
1403 /* Determine if a symbol is specific or not. */
1405 static int
1406 specific_sym (gfc_symbol *sym)
1408 gfc_symbol *s;
1410 if (sym->attr.if_source == IFSRC_IFBODY
1411 || sym->attr.proc == PROC_MODULE
1412 || sym->attr.proc == PROC_INTERNAL
1413 || sym->attr.proc == PROC_ST_FUNCTION
1414 || (sym->attr.intrinsic && gfc_specific_intrinsic (sym->name))
1415 || sym->attr.external)
1416 return 1;
1418 if (was_declared (sym) || sym->ns->parent == NULL)
1419 return 0;
1421 gfc_find_symbol (sym->name, sym->ns->parent, 1, &s);
1423 return (s == NULL) ? 0 : specific_sym (s);
1427 /* Figure out if the procedure is specific, generic or unknown. */
1429 typedef enum
1430 { PTYPE_GENERIC = 1, PTYPE_SPECIFIC, PTYPE_UNKNOWN }
1431 proc_type;
1433 static proc_type
1434 procedure_kind (gfc_symbol *sym)
1436 if (generic_sym (sym))
1437 return PTYPE_GENERIC;
1439 if (specific_sym (sym))
1440 return PTYPE_SPECIFIC;
1442 return PTYPE_UNKNOWN;
1445 /* Check references to assumed size arrays. The flag need_full_assumed_size
1446 is nonzero when matching actual arguments. */
1448 static int need_full_assumed_size = 0;
1450 static bool
1451 check_assumed_size_reference (gfc_symbol *sym, gfc_expr *e)
1453 if (need_full_assumed_size || !(sym->as && sym->as->type == AS_ASSUMED_SIZE))
1454 return false;
1456 /* FIXME: The comparison "e->ref->u.ar.type == AR_FULL" is wrong.
1457 What should it be? */
1458 if (e->ref && (e->ref->u.ar.end[e->ref->u.ar.as->rank - 1] == NULL)
1459 && (e->ref->u.ar.as->type == AS_ASSUMED_SIZE)
1460 && (e->ref->u.ar.type == AR_FULL))
1462 gfc_error ("The upper bound in the last dimension must "
1463 "appear in the reference to the assumed size "
1464 "array '%s' at %L", sym->name, &e->where);
1465 return true;
1467 return false;
1471 /* Look for bad assumed size array references in argument expressions
1472 of elemental and array valued intrinsic procedures. Since this is
1473 called from procedure resolution functions, it only recurses at
1474 operators. */
1476 static bool
1477 resolve_assumed_size_actual (gfc_expr *e)
1479 if (e == NULL)
1480 return false;
1482 switch (e->expr_type)
1484 case EXPR_VARIABLE:
1485 if (e->symtree && check_assumed_size_reference (e->symtree->n.sym, e))
1486 return true;
1487 break;
1489 case EXPR_OP:
1490 if (resolve_assumed_size_actual (e->value.op.op1)
1491 || resolve_assumed_size_actual (e->value.op.op2))
1492 return true;
1493 break;
1495 default:
1496 break;
1498 return false;
1502 /* Check a generic procedure, passed as an actual argument, to see if
1503 there is a matching specific name. If none, it is an error, and if
1504 more than one, the reference is ambiguous. */
1505 static int
1506 count_specific_procs (gfc_expr *e)
1508 int n;
1509 gfc_interface *p;
1510 gfc_symbol *sym;
1512 n = 0;
1513 sym = e->symtree->n.sym;
1515 for (p = sym->generic; p; p = p->next)
1516 if (strcmp (sym->name, p->sym->name) == 0)
1518 e->symtree = gfc_find_symtree (p->sym->ns->sym_root,
1519 sym->name);
1520 n++;
1523 if (n > 1)
1524 gfc_error ("'%s' at %L is ambiguous", e->symtree->n.sym->name,
1525 &e->where);
1527 if (n == 0)
1528 gfc_error ("GENERIC procedure '%s' is not allowed as an actual "
1529 "argument at %L", sym->name, &e->where);
1531 return n;
1535 /* See if a call to sym could possibly be a not allowed RECURSION because of
1536 a missing RECURSIVE declaration. This means that either sym is the current
1537 context itself, or sym is the parent of a contained procedure calling its
1538 non-RECURSIVE containing procedure.
1539 This also works if sym is an ENTRY. */
1541 static bool
1542 is_illegal_recursion (gfc_symbol* sym, gfc_namespace* context)
1544 gfc_symbol* proc_sym;
1545 gfc_symbol* context_proc;
1546 gfc_namespace* real_context;
1548 if (sym->attr.flavor == FL_PROGRAM
1549 || sym->attr.flavor == FL_DERIVED)
1550 return false;
1552 gcc_assert (sym->attr.flavor == FL_PROCEDURE);
1554 /* If we've got an ENTRY, find real procedure. */
1555 if (sym->attr.entry && sym->ns->entries)
1556 proc_sym = sym->ns->entries->sym;
1557 else
1558 proc_sym = sym;
1560 /* If sym is RECURSIVE, all is well of course. */
1561 if (proc_sym->attr.recursive || gfc_option.flag_recursive)
1562 return false;
1564 /* Find the context procedure's "real" symbol if it has entries.
1565 We look for a procedure symbol, so recurse on the parents if we don't
1566 find one (like in case of a BLOCK construct). */
1567 for (real_context = context; ; real_context = real_context->parent)
1569 /* We should find something, eventually! */
1570 gcc_assert (real_context);
1572 context_proc = (real_context->entries ? real_context->entries->sym
1573 : real_context->proc_name);
1575 /* In some special cases, there may not be a proc_name, like for this
1576 invalid code:
1577 real(bad_kind()) function foo () ...
1578 when checking the call to bad_kind ().
1579 In these cases, we simply return here and assume that the
1580 call is ok. */
1581 if (!context_proc)
1582 return false;
1584 if (context_proc->attr.flavor != FL_LABEL)
1585 break;
1588 /* A call from sym's body to itself is recursion, of course. */
1589 if (context_proc == proc_sym)
1590 return true;
1592 /* The same is true if context is a contained procedure and sym the
1593 containing one. */
1594 if (context_proc->attr.contained)
1596 gfc_symbol* parent_proc;
1598 gcc_assert (context->parent);
1599 parent_proc = (context->parent->entries ? context->parent->entries->sym
1600 : context->parent->proc_name);
1602 if (parent_proc == proc_sym)
1603 return true;
1606 return false;
1610 /* Resolve an intrinsic procedure: Set its function/subroutine attribute,
1611 its typespec and formal argument list. */
1613 bool
1614 gfc_resolve_intrinsic (gfc_symbol *sym, locus *loc)
1616 gfc_intrinsic_sym* isym = NULL;
1617 const char* symstd;
1619 if (sym->formal)
1620 return true;
1622 /* Already resolved. */
1623 if (sym->from_intmod && sym->ts.type != BT_UNKNOWN)
1624 return true;
1626 /* We already know this one is an intrinsic, so we don't call
1627 gfc_is_intrinsic for full checking but rather use gfc_find_function and
1628 gfc_find_subroutine directly to check whether it is a function or
1629 subroutine. */
1631 if (sym->intmod_sym_id && sym->attr.subroutine)
1633 gfc_isym_id id = gfc_isym_id_by_intmod_sym (sym);
1634 isym = gfc_intrinsic_subroutine_by_id (id);
1636 else if (sym->intmod_sym_id)
1638 gfc_isym_id id = gfc_isym_id_by_intmod_sym (sym);
1639 isym = gfc_intrinsic_function_by_id (id);
1641 else if (!sym->attr.subroutine)
1642 isym = gfc_find_function (sym->name);
1644 if (isym && !sym->attr.subroutine)
1646 if (sym->ts.type != BT_UNKNOWN && gfc_option.warn_surprising
1647 && !sym->attr.implicit_type)
1648 gfc_warning ("Type specified for intrinsic function '%s' at %L is"
1649 " ignored", sym->name, &sym->declared_at);
1651 if (!sym->attr.function &&
1652 !gfc_add_function(&sym->attr, sym->name, loc))
1653 return false;
1655 sym->ts = isym->ts;
1657 else if (isym || (isym = gfc_find_subroutine (sym->name)))
1659 if (sym->ts.type != BT_UNKNOWN && !sym->attr.implicit_type)
1661 gfc_error ("Intrinsic subroutine '%s' at %L shall not have a type"
1662 " specifier", sym->name, &sym->declared_at);
1663 return false;
1666 if (!sym->attr.subroutine &&
1667 !gfc_add_subroutine(&sym->attr, sym->name, loc))
1668 return false;
1670 else
1672 gfc_error ("'%s' declared INTRINSIC at %L does not exist", sym->name,
1673 &sym->declared_at);
1674 return false;
1677 gfc_copy_formal_args_intr (sym, isym, NULL);
1679 sym->attr.pure = isym->pure;
1680 sym->attr.elemental = isym->elemental;
1682 /* Check it is actually available in the standard settings. */
1683 if (!gfc_check_intrinsic_standard (isym, &symstd, false, sym->declared_at))
1685 gfc_error ("The intrinsic '%s' declared INTRINSIC at %L is not"
1686 " available in the current standard settings but %s. Use"
1687 " an appropriate -std=* option or enable -fall-intrinsics"
1688 " in order to use it.",
1689 sym->name, &sym->declared_at, symstd);
1690 return false;
1693 return true;
1697 /* Resolve a procedure expression, like passing it to a called procedure or as
1698 RHS for a procedure pointer assignment. */
1700 static bool
1701 resolve_procedure_expression (gfc_expr* expr)
1703 gfc_symbol* sym;
1705 if (expr->expr_type != EXPR_VARIABLE)
1706 return true;
1707 gcc_assert (expr->symtree);
1709 sym = expr->symtree->n.sym;
1711 if (sym->attr.intrinsic)
1712 gfc_resolve_intrinsic (sym, &expr->where);
1714 if (sym->attr.flavor != FL_PROCEDURE
1715 || (sym->attr.function && sym->result == sym))
1716 return true;
1718 /* A non-RECURSIVE procedure that is used as procedure expression within its
1719 own body is in danger of being called recursively. */
1720 if (is_illegal_recursion (sym, gfc_current_ns))
1721 gfc_warning ("Non-RECURSIVE procedure '%s' at %L is possibly calling"
1722 " itself recursively. Declare it RECURSIVE or use"
1723 " -frecursive", sym->name, &expr->where);
1725 return true;
1729 /* Resolve an actual argument list. Most of the time, this is just
1730 resolving the expressions in the list.
1731 The exception is that we sometimes have to decide whether arguments
1732 that look like procedure arguments are really simple variable
1733 references. */
1735 static bool
1736 resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype,
1737 bool no_formal_args)
1739 gfc_symbol *sym;
1740 gfc_symtree *parent_st;
1741 gfc_expr *e;
1742 int save_need_full_assumed_size;
1743 bool return_value = false;
1744 bool actual_arg_sav = actual_arg, first_actual_arg_sav = first_actual_arg;
1746 actual_arg = true;
1747 first_actual_arg = true;
1749 for (; arg; arg = arg->next)
1751 e = arg->expr;
1752 if (e == NULL)
1754 /* Check the label is a valid branching target. */
1755 if (arg->label)
1757 if (arg->label->defined == ST_LABEL_UNKNOWN)
1759 gfc_error ("Label %d referenced at %L is never defined",
1760 arg->label->value, &arg->label->where);
1761 goto cleanup;
1764 first_actual_arg = false;
1765 continue;
1768 if (e->expr_type == EXPR_VARIABLE
1769 && e->symtree->n.sym->attr.generic
1770 && no_formal_args
1771 && count_specific_procs (e) != 1)
1772 goto cleanup;
1774 if (e->ts.type != BT_PROCEDURE)
1776 save_need_full_assumed_size = need_full_assumed_size;
1777 if (e->expr_type != EXPR_VARIABLE)
1778 need_full_assumed_size = 0;
1779 if (!gfc_resolve_expr (e))
1780 goto cleanup;
1781 need_full_assumed_size = save_need_full_assumed_size;
1782 goto argument_list;
1785 /* See if the expression node should really be a variable reference. */
1787 sym = e->symtree->n.sym;
1789 if (sym->attr.flavor == FL_PROCEDURE
1790 || sym->attr.intrinsic
1791 || sym->attr.external)
1793 int actual_ok;
1795 /* If a procedure is not already determined to be something else
1796 check if it is intrinsic. */
1797 if (gfc_is_intrinsic (sym, sym->attr.subroutine, e->where))
1798 sym->attr.intrinsic = 1;
1800 if (sym->attr.proc == PROC_ST_FUNCTION)
1802 gfc_error ("Statement function '%s' at %L is not allowed as an "
1803 "actual argument", sym->name, &e->where);
1806 actual_ok = gfc_intrinsic_actual_ok (sym->name,
1807 sym->attr.subroutine);
1808 if (sym->attr.intrinsic && actual_ok == 0)
1810 gfc_error ("Intrinsic '%s' at %L is not allowed as an "
1811 "actual argument", sym->name, &e->where);
1814 if (sym->attr.contained && !sym->attr.use_assoc
1815 && sym->ns->proc_name->attr.flavor != FL_MODULE)
1817 if (!gfc_notify_std (GFC_STD_F2008, "Internal procedure '%s' is"
1818 " used as actual argument at %L",
1819 sym->name, &e->where))
1820 goto cleanup;
1823 if (sym->attr.elemental && !sym->attr.intrinsic)
1825 gfc_error ("ELEMENTAL non-INTRINSIC procedure '%s' is not "
1826 "allowed as an actual argument at %L", sym->name,
1827 &e->where);
1830 /* Check if a generic interface has a specific procedure
1831 with the same name before emitting an error. */
1832 if (sym->attr.generic && count_specific_procs (e) != 1)
1833 goto cleanup;
1835 /* Just in case a specific was found for the expression. */
1836 sym = e->symtree->n.sym;
1838 /* If the symbol is the function that names the current (or
1839 parent) scope, then we really have a variable reference. */
1841 if (gfc_is_function_return_value (sym, sym->ns))
1842 goto got_variable;
1844 /* If all else fails, see if we have a specific intrinsic. */
1845 if (sym->ts.type == BT_UNKNOWN && sym->attr.intrinsic)
1847 gfc_intrinsic_sym *isym;
1849 isym = gfc_find_function (sym->name);
1850 if (isym == NULL || !isym->specific)
1852 gfc_error ("Unable to find a specific INTRINSIC procedure "
1853 "for the reference '%s' at %L", sym->name,
1854 &e->where);
1855 goto cleanup;
1857 sym->ts = isym->ts;
1858 sym->attr.intrinsic = 1;
1859 sym->attr.function = 1;
1862 if (!gfc_resolve_expr (e))
1863 goto cleanup;
1864 goto argument_list;
1867 /* See if the name is a module procedure in a parent unit. */
1869 if (was_declared (sym) || sym->ns->parent == NULL)
1870 goto got_variable;
1872 if (gfc_find_sym_tree (sym->name, sym->ns->parent, 1, &parent_st))
1874 gfc_error ("Symbol '%s' at %L is ambiguous", sym->name, &e->where);
1875 goto cleanup;
1878 if (parent_st == NULL)
1879 goto got_variable;
1881 sym = parent_st->n.sym;
1882 e->symtree = parent_st; /* Point to the right thing. */
1884 if (sym->attr.flavor == FL_PROCEDURE
1885 || sym->attr.intrinsic
1886 || sym->attr.external)
1888 if (!gfc_resolve_expr (e))
1889 goto cleanup;
1890 goto argument_list;
1893 got_variable:
1894 e->expr_type = EXPR_VARIABLE;
1895 e->ts = sym->ts;
1896 if ((sym->as != NULL && sym->ts.type != BT_CLASS)
1897 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
1898 && CLASS_DATA (sym)->as))
1900 e->rank = sym->ts.type == BT_CLASS
1901 ? CLASS_DATA (sym)->as->rank : sym->as->rank;
1902 e->ref = gfc_get_ref ();
1903 e->ref->type = REF_ARRAY;
1904 e->ref->u.ar.type = AR_FULL;
1905 e->ref->u.ar.as = sym->ts.type == BT_CLASS
1906 ? CLASS_DATA (sym)->as : sym->as;
1909 /* Expressions are assigned a default ts.type of BT_PROCEDURE in
1910 primary.c (match_actual_arg). If above code determines that it
1911 is a variable instead, it needs to be resolved as it was not
1912 done at the beginning of this function. */
1913 save_need_full_assumed_size = need_full_assumed_size;
1914 if (e->expr_type != EXPR_VARIABLE)
1915 need_full_assumed_size = 0;
1916 if (!gfc_resolve_expr (e))
1917 goto cleanup;
1918 need_full_assumed_size = save_need_full_assumed_size;
1920 argument_list:
1921 /* Check argument list functions %VAL, %LOC and %REF. There is
1922 nothing to do for %REF. */
1923 if (arg->name && arg->name[0] == '%')
1925 if (strncmp ("%VAL", arg->name, 4) == 0)
1927 if (e->ts.type == BT_CHARACTER || e->ts.type == BT_DERIVED)
1929 gfc_error ("By-value argument at %L is not of numeric "
1930 "type", &e->where);
1931 goto cleanup;
1934 if (e->rank)
1936 gfc_error ("By-value argument at %L cannot be an array or "
1937 "an array section", &e->where);
1938 goto cleanup;
1941 /* Intrinsics are still PROC_UNKNOWN here. However,
1942 since same file external procedures are not resolvable
1943 in gfortran, it is a good deal easier to leave them to
1944 intrinsic.c. */
1945 if (ptype != PROC_UNKNOWN
1946 && ptype != PROC_DUMMY
1947 && ptype != PROC_EXTERNAL
1948 && ptype != PROC_MODULE)
1950 gfc_error ("By-value argument at %L is not allowed "
1951 "in this context", &e->where);
1952 goto cleanup;
1956 /* Statement functions have already been excluded above. */
1957 else if (strncmp ("%LOC", arg->name, 4) == 0
1958 && e->ts.type == BT_PROCEDURE)
1960 if (e->symtree->n.sym->attr.proc == PROC_INTERNAL)
1962 gfc_error ("Passing internal procedure at %L by location "
1963 "not allowed", &e->where);
1964 goto cleanup;
1969 /* Fortran 2008, C1237. */
1970 if (e->expr_type == EXPR_VARIABLE && gfc_is_coindexed (e)
1971 && gfc_has_ultimate_pointer (e))
1973 gfc_error ("Coindexed actual argument at %L with ultimate pointer "
1974 "component", &e->where);
1975 goto cleanup;
1978 first_actual_arg = false;
1981 return_value = true;
1983 cleanup:
1984 actual_arg = actual_arg_sav;
1985 first_actual_arg = first_actual_arg_sav;
1987 return return_value;
1991 /* Do the checks of the actual argument list that are specific to elemental
1992 procedures. If called with c == NULL, we have a function, otherwise if
1993 expr == NULL, we have a subroutine. */
1995 static bool
1996 resolve_elemental_actual (gfc_expr *expr, gfc_code *c)
1998 gfc_actual_arglist *arg0;
1999 gfc_actual_arglist *arg;
2000 gfc_symbol *esym = NULL;
2001 gfc_intrinsic_sym *isym = NULL;
2002 gfc_expr *e = NULL;
2003 gfc_intrinsic_arg *iformal = NULL;
2004 gfc_formal_arglist *eformal = NULL;
2005 bool formal_optional = false;
2006 bool set_by_optional = false;
2007 int i;
2008 int rank = 0;
2010 /* Is this an elemental procedure? */
2011 if (expr && expr->value.function.actual != NULL)
2013 if (expr->value.function.esym != NULL
2014 && expr->value.function.esym->attr.elemental)
2016 arg0 = expr->value.function.actual;
2017 esym = expr->value.function.esym;
2019 else if (expr->value.function.isym != NULL
2020 && expr->value.function.isym->elemental)
2022 arg0 = expr->value.function.actual;
2023 isym = expr->value.function.isym;
2025 else
2026 return true;
2028 else if (c && c->ext.actual != NULL)
2030 arg0 = c->ext.actual;
2032 if (c->resolved_sym)
2033 esym = c->resolved_sym;
2034 else
2035 esym = c->symtree->n.sym;
2036 gcc_assert (esym);
2038 if (!esym->attr.elemental)
2039 return true;
2041 else
2042 return true;
2044 /* The rank of an elemental is the rank of its array argument(s). */
2045 for (arg = arg0; arg; arg = arg->next)
2047 if (arg->expr != NULL && arg->expr->rank != 0)
2049 rank = arg->expr->rank;
2050 if (arg->expr->expr_type == EXPR_VARIABLE
2051 && arg->expr->symtree->n.sym->attr.optional)
2052 set_by_optional = true;
2054 /* Function specific; set the result rank and shape. */
2055 if (expr)
2057 expr->rank = rank;
2058 if (!expr->shape && arg->expr->shape)
2060 expr->shape = gfc_get_shape (rank);
2061 for (i = 0; i < rank; i++)
2062 mpz_init_set (expr->shape[i], arg->expr->shape[i]);
2065 break;
2069 /* If it is an array, it shall not be supplied as an actual argument
2070 to an elemental procedure unless an array of the same rank is supplied
2071 as an actual argument corresponding to a nonoptional dummy argument of
2072 that elemental procedure(12.4.1.5). */
2073 formal_optional = false;
2074 if (isym)
2075 iformal = isym->formal;
2076 else
2077 eformal = esym->formal;
2079 for (arg = arg0; arg; arg = arg->next)
2081 if (eformal)
2083 if (eformal->sym && eformal->sym->attr.optional)
2084 formal_optional = true;
2085 eformal = eformal->next;
2087 else if (isym && iformal)
2089 if (iformal->optional)
2090 formal_optional = true;
2091 iformal = iformal->next;
2093 else if (isym)
2094 formal_optional = true;
2096 if (pedantic && arg->expr != NULL
2097 && arg->expr->expr_type == EXPR_VARIABLE
2098 && arg->expr->symtree->n.sym->attr.optional
2099 && formal_optional
2100 && arg->expr->rank
2101 && (set_by_optional || arg->expr->rank != rank)
2102 && !(isym && isym->id == GFC_ISYM_CONVERSION))
2104 gfc_warning ("'%s' at %L is an array and OPTIONAL; IF IT IS "
2105 "MISSING, it cannot be the actual argument of an "
2106 "ELEMENTAL procedure unless there is a non-optional "
2107 "argument with the same rank (12.4.1.5)",
2108 arg->expr->symtree->n.sym->name, &arg->expr->where);
2112 for (arg = arg0; arg; arg = arg->next)
2114 if (arg->expr == NULL || arg->expr->rank == 0)
2115 continue;
2117 /* Being elemental, the last upper bound of an assumed size array
2118 argument must be present. */
2119 if (resolve_assumed_size_actual (arg->expr))
2120 return false;
2122 /* Elemental procedure's array actual arguments must conform. */
2123 if (e != NULL)
2125 if (!gfc_check_conformance (arg->expr, e, "elemental procedure"))
2126 return false;
2128 else
2129 e = arg->expr;
2132 /* INTENT(OUT) is only allowed for subroutines; if any actual argument
2133 is an array, the intent inout/out variable needs to be also an array. */
2134 if (rank > 0 && esym && expr == NULL)
2135 for (eformal = esym->formal, arg = arg0; arg && eformal;
2136 arg = arg->next, eformal = eformal->next)
2137 if ((eformal->sym->attr.intent == INTENT_OUT
2138 || eformal->sym->attr.intent == INTENT_INOUT)
2139 && arg->expr && arg->expr->rank == 0)
2141 gfc_error ("Actual argument at %L for INTENT(%s) dummy '%s' of "
2142 "ELEMENTAL subroutine '%s' is a scalar, but another "
2143 "actual argument is an array", &arg->expr->where,
2144 (eformal->sym->attr.intent == INTENT_OUT) ? "OUT"
2145 : "INOUT", eformal->sym->name, esym->name);
2146 return false;
2148 return true;
2152 /* This function does the checking of references to global procedures
2153 as defined in sections 18.1 and 14.1, respectively, of the Fortran
2154 77 and 95 standards. It checks for a gsymbol for the name, making
2155 one if it does not already exist. If it already exists, then the
2156 reference being resolved must correspond to the type of gsymbol.
2157 Otherwise, the new symbol is equipped with the attributes of the
2158 reference. The corresponding code that is called in creating
2159 global entities is parse.c.
2161 In addition, for all but -std=legacy, the gsymbols are used to
2162 check the interfaces of external procedures from the same file.
2163 The namespace of the gsymbol is resolved and then, once this is
2164 done the interface is checked. */
2167 static bool
2168 not_in_recursive (gfc_symbol *sym, gfc_namespace *gsym_ns)
2170 if (!gsym_ns->proc_name->attr.recursive)
2171 return true;
2173 if (sym->ns == gsym_ns)
2174 return false;
2176 if (sym->ns->parent && sym->ns->parent == gsym_ns)
2177 return false;
2179 return true;
2182 static bool
2183 not_entry_self_reference (gfc_symbol *sym, gfc_namespace *gsym_ns)
2185 if (gsym_ns->entries)
2187 gfc_entry_list *entry = gsym_ns->entries;
2189 for (; entry; entry = entry->next)
2191 if (strcmp (sym->name, entry->sym->name) == 0)
2193 if (strcmp (gsym_ns->proc_name->name,
2194 sym->ns->proc_name->name) == 0)
2195 return false;
2197 if (sym->ns->parent
2198 && strcmp (gsym_ns->proc_name->name,
2199 sym->ns->parent->proc_name->name) == 0)
2200 return false;
2204 return true;
2208 /* Check for the requirement of an explicit interface. F08:12.4.2.2. */
2210 bool
2211 gfc_explicit_interface_required (gfc_symbol *sym, char *errmsg, int err_len)
2213 gfc_formal_arglist *arg = gfc_sym_get_dummy_args (sym);
2215 for ( ; arg; arg = arg->next)
2217 if (!arg->sym)
2218 continue;
2220 if (arg->sym->attr.allocatable) /* (2a) */
2222 strncpy (errmsg, _("allocatable argument"), err_len);
2223 return true;
2225 else if (arg->sym->attr.asynchronous)
2227 strncpy (errmsg, _("asynchronous argument"), err_len);
2228 return true;
2230 else if (arg->sym->attr.optional)
2232 strncpy (errmsg, _("optional argument"), err_len);
2233 return true;
2235 else if (arg->sym->attr.pointer)
2237 strncpy (errmsg, _("pointer argument"), err_len);
2238 return true;
2240 else if (arg->sym->attr.target)
2242 strncpy (errmsg, _("target argument"), err_len);
2243 return true;
2245 else if (arg->sym->attr.value)
2247 strncpy (errmsg, _("value argument"), err_len);
2248 return true;
2250 else if (arg->sym->attr.volatile_)
2252 strncpy (errmsg, _("volatile argument"), err_len);
2253 return true;
2255 else if (arg->sym->as && arg->sym->as->type == AS_ASSUMED_SHAPE) /* (2b) */
2257 strncpy (errmsg, _("assumed-shape argument"), err_len);
2258 return true;
2260 else if (arg->sym->as && arg->sym->as->type == AS_ASSUMED_RANK) /* TS 29113, 6.2. */
2262 strncpy (errmsg, _("assumed-rank argument"), err_len);
2263 return true;
2265 else if (arg->sym->attr.codimension) /* (2c) */
2267 strncpy (errmsg, _("coarray argument"), err_len);
2268 return true;
2270 else if (false) /* (2d) TODO: parametrized derived type */
2272 strncpy (errmsg, _("parametrized derived type argument"), err_len);
2273 return true;
2275 else if (arg->sym->ts.type == BT_CLASS) /* (2e) */
2277 strncpy (errmsg, _("polymorphic argument"), err_len);
2278 return true;
2280 else if (arg->sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
2282 strncpy (errmsg, _("NO_ARG_CHECK attribute"), err_len);
2283 return true;
2285 else if (arg->sym->ts.type == BT_ASSUMED)
2287 /* As assumed-type is unlimited polymorphic (cf. above).
2288 See also TS 29113, Note 6.1. */
2289 strncpy (errmsg, _("assumed-type argument"), err_len);
2290 return true;
2294 if (sym->attr.function)
2296 gfc_symbol *res = sym->result ? sym->result : sym;
2298 if (res->attr.dimension) /* (3a) */
2300 strncpy (errmsg, _("array result"), err_len);
2301 return true;
2303 else if (res->attr.pointer || res->attr.allocatable) /* (3b) */
2305 strncpy (errmsg, _("pointer or allocatable result"), err_len);
2306 return true;
2308 else if (res->ts.type == BT_CHARACTER && res->ts.u.cl
2309 && res->ts.u.cl->length
2310 && res->ts.u.cl->length->expr_type != EXPR_CONSTANT) /* (3c) */
2312 strncpy (errmsg, _("result with non-constant character length"), err_len);
2313 return true;
2317 if (sym->attr.elemental && !sym->attr.intrinsic) /* (4) */
2319 strncpy (errmsg, _("elemental procedure"), err_len);
2320 return true;
2322 else if (sym->attr.is_bind_c) /* (5) */
2324 strncpy (errmsg, _("bind(c) procedure"), err_len);
2325 return true;
2328 return false;
2332 static void
2333 resolve_global_procedure (gfc_symbol *sym, locus *where,
2334 gfc_actual_arglist **actual, int sub)
2336 gfc_gsymbol * gsym;
2337 gfc_namespace *ns;
2338 enum gfc_symbol_type type;
2339 char reason[200];
2341 type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
2343 gsym = gfc_get_gsymbol (sym->binding_label ? sym->binding_label : sym->name);
2345 if ((gsym->type != GSYM_UNKNOWN && gsym->type != type))
2346 gfc_global_used (gsym, where);
2348 if ((sym->attr.if_source == IFSRC_UNKNOWN
2349 || sym->attr.if_source == IFSRC_IFBODY)
2350 && gsym->type != GSYM_UNKNOWN
2351 && !gsym->binding_label
2352 && gsym->ns
2353 && gsym->ns->resolved != -1
2354 && gsym->ns->proc_name
2355 && not_in_recursive (sym, gsym->ns)
2356 && not_entry_self_reference (sym, gsym->ns))
2358 gfc_symbol *def_sym;
2360 /* Resolve the gsymbol namespace if needed. */
2361 if (!gsym->ns->resolved)
2363 gfc_dt_list *old_dt_list;
2364 struct gfc_omp_saved_state old_omp_state;
2366 /* Stash away derived types so that the backend_decls do not
2367 get mixed up. */
2368 old_dt_list = gfc_derived_types;
2369 gfc_derived_types = NULL;
2370 /* And stash away openmp state. */
2371 gfc_omp_save_and_clear_state (&old_omp_state);
2373 gfc_resolve (gsym->ns);
2375 /* Store the new derived types with the global namespace. */
2376 if (gfc_derived_types)
2377 gsym->ns->derived_types = gfc_derived_types;
2379 /* Restore the derived types of this namespace. */
2380 gfc_derived_types = old_dt_list;
2381 /* And openmp state. */
2382 gfc_omp_restore_state (&old_omp_state);
2385 /* Make sure that translation for the gsymbol occurs before
2386 the procedure currently being resolved. */
2387 ns = gfc_global_ns_list;
2388 for (; ns && ns != gsym->ns; ns = ns->sibling)
2390 if (ns->sibling == gsym->ns)
2392 ns->sibling = gsym->ns->sibling;
2393 gsym->ns->sibling = gfc_global_ns_list;
2394 gfc_global_ns_list = gsym->ns;
2395 break;
2399 def_sym = gsym->ns->proc_name;
2401 /* This can happen if a binding name has been specified. */
2402 if (gsym->binding_label && gsym->sym_name != def_sym->name)
2403 gfc_find_symbol (gsym->sym_name, gsym->ns, 0, &def_sym);
2405 if (def_sym->attr.entry_master)
2407 gfc_entry_list *entry;
2408 for (entry = gsym->ns->entries; entry; entry = entry->next)
2409 if (strcmp (entry->sym->name, sym->name) == 0)
2411 def_sym = entry->sym;
2412 break;
2416 if (sym->attr.function && !gfc_compare_types (&sym->ts, &def_sym->ts))
2418 gfc_error ("Return type mismatch of function '%s' at %L (%s/%s)",
2419 sym->name, &sym->declared_at, gfc_typename (&sym->ts),
2420 gfc_typename (&def_sym->ts));
2421 goto done;
2424 if (sym->attr.if_source == IFSRC_UNKNOWN
2425 && gfc_explicit_interface_required (def_sym, reason, sizeof(reason)))
2427 gfc_error ("Explicit interface required for '%s' at %L: %s",
2428 sym->name, &sym->declared_at, reason);
2429 goto done;
2432 if (!pedantic && (gfc_option.allow_std & GFC_STD_GNU))
2433 /* Turn erros into warnings with -std=gnu and -std=legacy. */
2434 gfc_errors_to_warnings (1);
2436 if (!gfc_compare_interfaces (sym, def_sym, sym->name, 0, 1,
2437 reason, sizeof(reason), NULL, NULL))
2439 gfc_error ("Interface mismatch in global procedure '%s' at %L: %s ",
2440 sym->name, &sym->declared_at, reason);
2441 goto done;
2444 if (!pedantic
2445 || ((gfc_option.warn_std & GFC_STD_LEGACY)
2446 && !(gfc_option.warn_std & GFC_STD_GNU)))
2447 gfc_errors_to_warnings (1);
2449 if (sym->attr.if_source != IFSRC_IFBODY)
2450 gfc_procedure_use (def_sym, actual, where);
2453 done:
2454 gfc_errors_to_warnings (0);
2456 if (gsym->type == GSYM_UNKNOWN)
2458 gsym->type = type;
2459 gsym->where = *where;
2462 gsym->used = 1;
2466 /************* Function resolution *************/
2468 /* Resolve a function call known to be generic.
2469 Section 14.1.2.4.1. */
2471 static match
2472 resolve_generic_f0 (gfc_expr *expr, gfc_symbol *sym)
2474 gfc_symbol *s;
2476 if (sym->attr.generic)
2478 s = gfc_search_interface (sym->generic, 0, &expr->value.function.actual);
2479 if (s != NULL)
2481 expr->value.function.name = s->name;
2482 expr->value.function.esym = s;
2484 if (s->ts.type != BT_UNKNOWN)
2485 expr->ts = s->ts;
2486 else if (s->result != NULL && s->result->ts.type != BT_UNKNOWN)
2487 expr->ts = s->result->ts;
2489 if (s->as != NULL)
2490 expr->rank = s->as->rank;
2491 else if (s->result != NULL && s->result->as != NULL)
2492 expr->rank = s->result->as->rank;
2494 gfc_set_sym_referenced (expr->value.function.esym);
2496 return MATCH_YES;
2499 /* TODO: Need to search for elemental references in generic
2500 interface. */
2503 if (sym->attr.intrinsic)
2504 return gfc_intrinsic_func_interface (expr, 0);
2506 return MATCH_NO;
2510 static bool
2511 resolve_generic_f (gfc_expr *expr)
2513 gfc_symbol *sym;
2514 match m;
2515 gfc_interface *intr = NULL;
2517 sym = expr->symtree->n.sym;
2519 for (;;)
2521 m = resolve_generic_f0 (expr, sym);
2522 if (m == MATCH_YES)
2523 return true;
2524 else if (m == MATCH_ERROR)
2525 return false;
2527 generic:
2528 if (!intr)
2529 for (intr = sym->generic; intr; intr = intr->next)
2530 if (intr->sym->attr.flavor == FL_DERIVED)
2531 break;
2533 if (sym->ns->parent == NULL)
2534 break;
2535 gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
2537 if (sym == NULL)
2538 break;
2539 if (!generic_sym (sym))
2540 goto generic;
2543 /* Last ditch attempt. See if the reference is to an intrinsic
2544 that possesses a matching interface. 14.1.2.4 */
2545 if (sym && !intr && !gfc_is_intrinsic (sym, 0, expr->where))
2547 gfc_error ("There is no specific function for the generic '%s' "
2548 "at %L", expr->symtree->n.sym->name, &expr->where);
2549 return false;
2552 if (intr)
2554 if (!gfc_convert_to_structure_constructor (expr, intr->sym, NULL,
2555 NULL, false))
2556 return false;
2557 return resolve_structure_cons (expr, 0);
2560 m = gfc_intrinsic_func_interface (expr, 0);
2561 if (m == MATCH_YES)
2562 return true;
2564 if (m == MATCH_NO)
2565 gfc_error ("Generic function '%s' at %L is not consistent with a "
2566 "specific intrinsic interface", expr->symtree->n.sym->name,
2567 &expr->where);
2569 return false;
2573 /* Resolve a function call known to be specific. */
2575 static match
2576 resolve_specific_f0 (gfc_symbol *sym, gfc_expr *expr)
2578 match m;
2580 if (sym->attr.external || sym->attr.if_source == IFSRC_IFBODY)
2582 if (sym->attr.dummy)
2584 sym->attr.proc = PROC_DUMMY;
2585 goto found;
2588 sym->attr.proc = PROC_EXTERNAL;
2589 goto found;
2592 if (sym->attr.proc == PROC_MODULE
2593 || sym->attr.proc == PROC_ST_FUNCTION
2594 || sym->attr.proc == PROC_INTERNAL)
2595 goto found;
2597 if (sym->attr.intrinsic)
2599 m = gfc_intrinsic_func_interface (expr, 1);
2600 if (m == MATCH_YES)
2601 return MATCH_YES;
2602 if (m == MATCH_NO)
2603 gfc_error ("Function '%s' at %L is INTRINSIC but is not compatible "
2604 "with an intrinsic", sym->name, &expr->where);
2606 return MATCH_ERROR;
2609 return MATCH_NO;
2611 found:
2612 gfc_procedure_use (sym, &expr->value.function.actual, &expr->where);
2614 if (sym->result)
2615 expr->ts = sym->result->ts;
2616 else
2617 expr->ts = sym->ts;
2618 expr->value.function.name = sym->name;
2619 expr->value.function.esym = sym;
2620 if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as)
2621 expr->rank = CLASS_DATA (sym)->as->rank;
2622 else if (sym->as != NULL)
2623 expr->rank = sym->as->rank;
2625 return MATCH_YES;
2629 static bool
2630 resolve_specific_f (gfc_expr *expr)
2632 gfc_symbol *sym;
2633 match m;
2635 sym = expr->symtree->n.sym;
2637 for (;;)
2639 m = resolve_specific_f0 (sym, expr);
2640 if (m == MATCH_YES)
2641 return true;
2642 if (m == MATCH_ERROR)
2643 return false;
2645 if (sym->ns->parent == NULL)
2646 break;
2648 gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
2650 if (sym == NULL)
2651 break;
2654 gfc_error ("Unable to resolve the specific function '%s' at %L",
2655 expr->symtree->n.sym->name, &expr->where);
2657 return true;
2661 /* Resolve a procedure call not known to be generic nor specific. */
2663 static bool
2664 resolve_unknown_f (gfc_expr *expr)
2666 gfc_symbol *sym;
2667 gfc_typespec *ts;
2669 sym = expr->symtree->n.sym;
2671 if (sym->attr.dummy)
2673 sym->attr.proc = PROC_DUMMY;
2674 expr->value.function.name = sym->name;
2675 goto set_type;
2678 /* See if we have an intrinsic function reference. */
2680 if (gfc_is_intrinsic (sym, 0, expr->where))
2682 if (gfc_intrinsic_func_interface (expr, 1) == MATCH_YES)
2683 return true;
2684 return false;
2687 /* The reference is to an external name. */
2689 sym->attr.proc = PROC_EXTERNAL;
2690 expr->value.function.name = sym->name;
2691 expr->value.function.esym = expr->symtree->n.sym;
2693 if (sym->as != NULL)
2694 expr->rank = sym->as->rank;
2696 /* Type of the expression is either the type of the symbol or the
2697 default type of the symbol. */
2699 set_type:
2700 gfc_procedure_use (sym, &expr->value.function.actual, &expr->where);
2702 if (sym->ts.type != BT_UNKNOWN)
2703 expr->ts = sym->ts;
2704 else
2706 ts = gfc_get_default_type (sym->name, sym->ns);
2708 if (ts->type == BT_UNKNOWN)
2710 gfc_error ("Function '%s' at %L has no IMPLICIT type",
2711 sym->name, &expr->where);
2712 return false;
2714 else
2715 expr->ts = *ts;
2718 return true;
2722 /* Return true, if the symbol is an external procedure. */
2723 static bool
2724 is_external_proc (gfc_symbol *sym)
2726 if (!sym->attr.dummy && !sym->attr.contained
2727 && !gfc_is_intrinsic (sym, sym->attr.subroutine, sym->declared_at)
2728 && sym->attr.proc != PROC_ST_FUNCTION
2729 && !sym->attr.proc_pointer
2730 && !sym->attr.use_assoc
2731 && sym->name)
2732 return true;
2734 return false;
2738 /* Figure out if a function reference is pure or not. Also set the name
2739 of the function for a potential error message. Return nonzero if the
2740 function is PURE, zero if not. */
2741 static int
2742 pure_stmt_function (gfc_expr *, gfc_symbol *);
2744 static int
2745 pure_function (gfc_expr *e, const char **name)
2747 int pure;
2749 *name = NULL;
2751 if (e->symtree != NULL
2752 && e->symtree->n.sym != NULL
2753 && e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
2754 return pure_stmt_function (e, e->symtree->n.sym);
2756 if (e->value.function.esym)
2758 pure = gfc_pure (e->value.function.esym);
2759 *name = e->value.function.esym->name;
2761 else if (e->value.function.isym)
2763 pure = e->value.function.isym->pure
2764 || e->value.function.isym->elemental;
2765 *name = e->value.function.isym->name;
2767 else
2769 /* Implicit functions are not pure. */
2770 pure = 0;
2771 *name = e->value.function.name;
2774 return pure;
2778 static bool
2779 impure_stmt_fcn (gfc_expr *e, gfc_symbol *sym,
2780 int *f ATTRIBUTE_UNUSED)
2782 const char *name;
2784 /* Don't bother recursing into other statement functions
2785 since they will be checked individually for purity. */
2786 if (e->expr_type != EXPR_FUNCTION
2787 || !e->symtree
2788 || e->symtree->n.sym == sym
2789 || e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
2790 return false;
2792 return pure_function (e, &name) ? false : true;
2796 static int
2797 pure_stmt_function (gfc_expr *e, gfc_symbol *sym)
2799 return gfc_traverse_expr (e, sym, impure_stmt_fcn, 0) ? 0 : 1;
2803 /* Resolve a function call, which means resolving the arguments, then figuring
2804 out which entity the name refers to. */
2806 static bool
2807 resolve_function (gfc_expr *expr)
2809 gfc_actual_arglist *arg;
2810 gfc_symbol *sym;
2811 const char *name;
2812 bool t;
2813 int temp;
2814 procedure_type p = PROC_INTRINSIC;
2815 bool no_formal_args;
2817 sym = NULL;
2818 if (expr->symtree)
2819 sym = expr->symtree->n.sym;
2821 /* If this is a procedure pointer component, it has already been resolved. */
2822 if (gfc_is_proc_ptr_comp (expr))
2823 return true;
2825 if (sym && sym->attr.intrinsic
2826 && !gfc_resolve_intrinsic (sym, &expr->where))
2827 return false;
2829 if (sym && (sym->attr.flavor == FL_VARIABLE || sym->attr.subroutine))
2831 gfc_error ("'%s' at %L is not a function", sym->name, &expr->where);
2832 return false;
2835 /* If this ia a deferred TBP with an abstract interface (which may
2836 of course be referenced), expr->value.function.esym will be set. */
2837 if (sym && sym->attr.abstract && !expr->value.function.esym)
2839 gfc_error ("ABSTRACT INTERFACE '%s' must not be referenced at %L",
2840 sym->name, &expr->where);
2841 return false;
2844 /* Switch off assumed size checking and do this again for certain kinds
2845 of procedure, once the procedure itself is resolved. */
2846 need_full_assumed_size++;
2848 if (expr->symtree && expr->symtree->n.sym)
2849 p = expr->symtree->n.sym->attr.proc;
2851 if (expr->value.function.isym && expr->value.function.isym->inquiry)
2852 inquiry_argument = true;
2853 no_formal_args = sym && is_external_proc (sym)
2854 && gfc_sym_get_dummy_args (sym) == NULL;
2856 if (!resolve_actual_arglist (expr->value.function.actual,
2857 p, no_formal_args))
2859 inquiry_argument = false;
2860 return false;
2863 inquiry_argument = false;
2865 /* Resume assumed_size checking. */
2866 need_full_assumed_size--;
2868 /* If the procedure is external, check for usage. */
2869 if (sym && is_external_proc (sym))
2870 resolve_global_procedure (sym, &expr->where,
2871 &expr->value.function.actual, 0);
2873 if (sym && sym->ts.type == BT_CHARACTER
2874 && sym->ts.u.cl
2875 && sym->ts.u.cl->length == NULL
2876 && !sym->attr.dummy
2877 && !sym->ts.deferred
2878 && expr->value.function.esym == NULL
2879 && !sym->attr.contained)
2881 /* Internal procedures are taken care of in resolve_contained_fntype. */
2882 gfc_error ("Function '%s' is declared CHARACTER(*) and cannot "
2883 "be used at %L since it is not a dummy argument",
2884 sym->name, &expr->where);
2885 return false;
2888 /* See if function is already resolved. */
2890 if (expr->value.function.name != NULL
2891 || expr->value.function.isym != NULL)
2893 if (expr->ts.type == BT_UNKNOWN)
2894 expr->ts = sym->ts;
2895 t = true;
2897 else
2899 /* Apply the rules of section 14.1.2. */
2901 switch (procedure_kind (sym))
2903 case PTYPE_GENERIC:
2904 t = resolve_generic_f (expr);
2905 break;
2907 case PTYPE_SPECIFIC:
2908 t = resolve_specific_f (expr);
2909 break;
2911 case PTYPE_UNKNOWN:
2912 t = resolve_unknown_f (expr);
2913 break;
2915 default:
2916 gfc_internal_error ("resolve_function(): bad function type");
2920 /* If the expression is still a function (it might have simplified),
2921 then we check to see if we are calling an elemental function. */
2923 if (expr->expr_type != EXPR_FUNCTION)
2924 return t;
2926 temp = need_full_assumed_size;
2927 need_full_assumed_size = 0;
2929 if (!resolve_elemental_actual (expr, NULL))
2930 return false;
2932 if (omp_workshare_flag
2933 && expr->value.function.esym
2934 && ! gfc_elemental (expr->value.function.esym))
2936 gfc_error ("User defined non-ELEMENTAL function '%s' at %L not allowed "
2937 "in WORKSHARE construct", expr->value.function.esym->name,
2938 &expr->where);
2939 t = false;
2942 #define GENERIC_ID expr->value.function.isym->id
2943 else if (expr->value.function.actual != NULL
2944 && expr->value.function.isym != NULL
2945 && GENERIC_ID != GFC_ISYM_LBOUND
2946 && GENERIC_ID != GFC_ISYM_LCOBOUND
2947 && GENERIC_ID != GFC_ISYM_UCOBOUND
2948 && GENERIC_ID != GFC_ISYM_LEN
2949 && GENERIC_ID != GFC_ISYM_LOC
2950 && GENERIC_ID != GFC_ISYM_C_LOC
2951 && GENERIC_ID != GFC_ISYM_PRESENT)
2953 /* Array intrinsics must also have the last upper bound of an
2954 assumed size array argument. UBOUND and SIZE have to be
2955 excluded from the check if the second argument is anything
2956 than a constant. */
2958 for (arg = expr->value.function.actual; arg; arg = arg->next)
2960 if ((GENERIC_ID == GFC_ISYM_UBOUND || GENERIC_ID == GFC_ISYM_SIZE)
2961 && arg == expr->value.function.actual
2962 && arg->next != NULL && arg->next->expr)
2964 if (arg->next->expr->expr_type != EXPR_CONSTANT)
2965 break;
2967 if (arg->next->name && strncmp (arg->next->name, "kind", 4) == 0)
2968 break;
2970 if ((int)mpz_get_si (arg->next->expr->value.integer)
2971 < arg->expr->rank)
2972 break;
2975 if (arg->expr != NULL
2976 && arg->expr->rank > 0
2977 && resolve_assumed_size_actual (arg->expr))
2978 return false;
2981 #undef GENERIC_ID
2983 need_full_assumed_size = temp;
2984 name = NULL;
2986 if (!pure_function (expr, &name) && name)
2988 if (forall_flag)
2990 gfc_error ("Reference to non-PURE function '%s' at %L inside a "
2991 "FORALL %s", name, &expr->where,
2992 forall_flag == 2 ? "mask" : "block");
2993 t = false;
2995 else if (gfc_do_concurrent_flag)
2997 gfc_error ("Reference to non-PURE function '%s' at %L inside a "
2998 "DO CONCURRENT %s", name, &expr->where,
2999 gfc_do_concurrent_flag == 2 ? "mask" : "block");
3000 t = false;
3002 else if (gfc_pure (NULL))
3004 gfc_error ("Function reference to '%s' at %L is to a non-PURE "
3005 "procedure within a PURE procedure", name, &expr->where);
3006 t = false;
3009 gfc_unset_implicit_pure (NULL);
3012 /* Functions without the RECURSIVE attribution are not allowed to
3013 * call themselves. */
3014 if (expr->value.function.esym && !expr->value.function.esym->attr.recursive)
3016 gfc_symbol *esym;
3017 esym = expr->value.function.esym;
3019 if (is_illegal_recursion (esym, gfc_current_ns))
3021 if (esym->attr.entry && esym->ns->entries)
3022 gfc_error ("ENTRY '%s' at %L cannot be called recursively, as"
3023 " function '%s' is not RECURSIVE",
3024 esym->name, &expr->where, esym->ns->entries->sym->name);
3025 else
3026 gfc_error ("Function '%s' at %L cannot be called recursively, as it"
3027 " is not RECURSIVE", esym->name, &expr->where);
3029 t = false;
3033 /* Character lengths of use associated functions may contains references to
3034 symbols not referenced from the current program unit otherwise. Make sure
3035 those symbols are marked as referenced. */
3037 if (expr->ts.type == BT_CHARACTER && expr->value.function.esym
3038 && expr->value.function.esym->attr.use_assoc)
3040 gfc_expr_set_symbols_referenced (expr->ts.u.cl->length);
3043 /* Make sure that the expression has a typespec that works. */
3044 if (expr->ts.type == BT_UNKNOWN)
3046 if (expr->symtree->n.sym->result
3047 && expr->symtree->n.sym->result->ts.type != BT_UNKNOWN
3048 && !expr->symtree->n.sym->result->attr.proc_pointer)
3049 expr->ts = expr->symtree->n.sym->result->ts;
3052 return t;
3056 /************* Subroutine resolution *************/
3058 static void
3059 pure_subroutine (gfc_code *c, gfc_symbol *sym)
3061 if (gfc_pure (sym))
3062 return;
3064 if (forall_flag)
3065 gfc_error ("Subroutine call to '%s' in FORALL block at %L is not PURE",
3066 sym->name, &c->loc);
3067 else if (gfc_do_concurrent_flag)
3068 gfc_error ("Subroutine call to '%s' in DO CONCURRENT block at %L is not "
3069 "PURE", sym->name, &c->loc);
3070 else if (gfc_pure (NULL))
3071 gfc_error ("Subroutine call to '%s' at %L is not PURE", sym->name,
3072 &c->loc);
3074 gfc_unset_implicit_pure (NULL);
3078 static match
3079 resolve_generic_s0 (gfc_code *c, gfc_symbol *sym)
3081 gfc_symbol *s;
3083 if (sym->attr.generic)
3085 s = gfc_search_interface (sym->generic, 1, &c->ext.actual);
3086 if (s != NULL)
3088 c->resolved_sym = s;
3089 pure_subroutine (c, s);
3090 return MATCH_YES;
3093 /* TODO: Need to search for elemental references in generic interface. */
3096 if (sym->attr.intrinsic)
3097 return gfc_intrinsic_sub_interface (c, 0);
3099 return MATCH_NO;
3103 static bool
3104 resolve_generic_s (gfc_code *c)
3106 gfc_symbol *sym;
3107 match m;
3109 sym = c->symtree->n.sym;
3111 for (;;)
3113 m = resolve_generic_s0 (c, sym);
3114 if (m == MATCH_YES)
3115 return true;
3116 else if (m == MATCH_ERROR)
3117 return false;
3119 generic:
3120 if (sym->ns->parent == NULL)
3121 break;
3122 gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
3124 if (sym == NULL)
3125 break;
3126 if (!generic_sym (sym))
3127 goto generic;
3130 /* Last ditch attempt. See if the reference is to an intrinsic
3131 that possesses a matching interface. 14.1.2.4 */
3132 sym = c->symtree->n.sym;
3134 if (!gfc_is_intrinsic (sym, 1, c->loc))
3136 gfc_error ("There is no specific subroutine for the generic '%s' at %L",
3137 sym->name, &c->loc);
3138 return false;
3141 m = gfc_intrinsic_sub_interface (c, 0);
3142 if (m == MATCH_YES)
3143 return true;
3144 if (m == MATCH_NO)
3145 gfc_error ("Generic subroutine '%s' at %L is not consistent with an "
3146 "intrinsic subroutine interface", sym->name, &c->loc);
3148 return false;
3152 /* Resolve a subroutine call known to be specific. */
3154 static match
3155 resolve_specific_s0 (gfc_code *c, gfc_symbol *sym)
3157 match m;
3159 if (sym->attr.external || sym->attr.if_source == IFSRC_IFBODY)
3161 if (sym->attr.dummy)
3163 sym->attr.proc = PROC_DUMMY;
3164 goto found;
3167 sym->attr.proc = PROC_EXTERNAL;
3168 goto found;
3171 if (sym->attr.proc == PROC_MODULE || sym->attr.proc == PROC_INTERNAL)
3172 goto found;
3174 if (sym->attr.intrinsic)
3176 m = gfc_intrinsic_sub_interface (c, 1);
3177 if (m == MATCH_YES)
3178 return MATCH_YES;
3179 if (m == MATCH_NO)
3180 gfc_error ("Subroutine '%s' at %L is INTRINSIC but is not compatible "
3181 "with an intrinsic", sym->name, &c->loc);
3183 return MATCH_ERROR;
3186 return MATCH_NO;
3188 found:
3189 gfc_procedure_use (sym, &c->ext.actual, &c->loc);
3191 c->resolved_sym = sym;
3192 pure_subroutine (c, sym);
3194 return MATCH_YES;
3198 static bool
3199 resolve_specific_s (gfc_code *c)
3201 gfc_symbol *sym;
3202 match m;
3204 sym = c->symtree->n.sym;
3206 for (;;)
3208 m = resolve_specific_s0 (c, sym);
3209 if (m == MATCH_YES)
3210 return true;
3211 if (m == MATCH_ERROR)
3212 return false;
3214 if (sym->ns->parent == NULL)
3215 break;
3217 gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
3219 if (sym == NULL)
3220 break;
3223 sym = c->symtree->n.sym;
3224 gfc_error ("Unable to resolve the specific subroutine '%s' at %L",
3225 sym->name, &c->loc);
3227 return false;
3231 /* Resolve a subroutine call not known to be generic nor specific. */
3233 static bool
3234 resolve_unknown_s (gfc_code *c)
3236 gfc_symbol *sym;
3238 sym = c->symtree->n.sym;
3240 if (sym->attr.dummy)
3242 sym->attr.proc = PROC_DUMMY;
3243 goto found;
3246 /* See if we have an intrinsic function reference. */
3248 if (gfc_is_intrinsic (sym, 1, c->loc))
3250 if (gfc_intrinsic_sub_interface (c, 1) == MATCH_YES)
3251 return true;
3252 return false;
3255 /* The reference is to an external name. */
3257 found:
3258 gfc_procedure_use (sym, &c->ext.actual, &c->loc);
3260 c->resolved_sym = sym;
3262 pure_subroutine (c, sym);
3264 return true;
3268 /* Resolve a subroutine call. Although it was tempting to use the same code
3269 for functions, subroutines and functions are stored differently and this
3270 makes things awkward. */
3272 static bool
3273 resolve_call (gfc_code *c)
3275 bool t;
3276 procedure_type ptype = PROC_INTRINSIC;
3277 gfc_symbol *csym, *sym;
3278 bool no_formal_args;
3280 csym = c->symtree ? c->symtree->n.sym : NULL;
3282 if (csym && csym->ts.type != BT_UNKNOWN)
3284 gfc_error ("'%s' at %L has a type, which is not consistent with "
3285 "the CALL at %L", csym->name, &csym->declared_at, &c->loc);
3286 return false;
3289 if (csym && gfc_current_ns->parent && csym->ns != gfc_current_ns)
3291 gfc_symtree *st;
3292 gfc_find_sym_tree (c->symtree->name, gfc_current_ns, 1, &st);
3293 sym = st ? st->n.sym : NULL;
3294 if (sym && csym != sym
3295 && sym->ns == gfc_current_ns
3296 && sym->attr.flavor == FL_PROCEDURE
3297 && sym->attr.contained)
3299 sym->refs++;
3300 if (csym->attr.generic)
3301 c->symtree->n.sym = sym;
3302 else
3303 c->symtree = st;
3304 csym = c->symtree->n.sym;
3308 /* If this ia a deferred TBP, c->expr1 will be set. */
3309 if (!c->expr1 && csym)
3311 if (csym->attr.abstract)
3313 gfc_error ("ABSTRACT INTERFACE '%s' must not be referenced at %L",
3314 csym->name, &c->loc);
3315 return false;
3318 /* Subroutines without the RECURSIVE attribution are not allowed to
3319 call themselves. */
3320 if (is_illegal_recursion (csym, gfc_current_ns))
3322 if (csym->attr.entry && csym->ns->entries)
3323 gfc_error ("ENTRY '%s' at %L cannot be called recursively, "
3324 "as subroutine '%s' is not RECURSIVE",
3325 csym->name, &c->loc, csym->ns->entries->sym->name);
3326 else
3327 gfc_error ("SUBROUTINE '%s' at %L cannot be called recursively, "
3328 "as it is not RECURSIVE", csym->name, &c->loc);
3330 t = false;
3334 /* Switch off assumed size checking and do this again for certain kinds
3335 of procedure, once the procedure itself is resolved. */
3336 need_full_assumed_size++;
3338 if (csym)
3339 ptype = csym->attr.proc;
3341 no_formal_args = csym && is_external_proc (csym)
3342 && gfc_sym_get_dummy_args (csym) == NULL;
3343 if (!resolve_actual_arglist (c->ext.actual, ptype, no_formal_args))
3344 return false;
3346 /* Resume assumed_size checking. */
3347 need_full_assumed_size--;
3349 /* If external, check for usage. */
3350 if (csym && is_external_proc (csym))
3351 resolve_global_procedure (csym, &c->loc, &c->ext.actual, 1);
3353 t = true;
3354 if (c->resolved_sym == NULL)
3356 c->resolved_isym = NULL;
3357 switch (procedure_kind (csym))
3359 case PTYPE_GENERIC:
3360 t = resolve_generic_s (c);
3361 break;
3363 case PTYPE_SPECIFIC:
3364 t = resolve_specific_s (c);
3365 break;
3367 case PTYPE_UNKNOWN:
3368 t = resolve_unknown_s (c);
3369 break;
3371 default:
3372 gfc_internal_error ("resolve_subroutine(): bad function type");
3376 /* Some checks of elemental subroutine actual arguments. */
3377 if (!resolve_elemental_actual (NULL, c))
3378 return false;
3380 return t;
3384 /* Compare the shapes of two arrays that have non-NULL shapes. If both
3385 op1->shape and op2->shape are non-NULL return true if their shapes
3386 match. If both op1->shape and op2->shape are non-NULL return false
3387 if their shapes do not match. If either op1->shape or op2->shape is
3388 NULL, return true. */
3390 static bool
3391 compare_shapes (gfc_expr *op1, gfc_expr *op2)
3393 bool t;
3394 int i;
3396 t = true;
3398 if (op1->shape != NULL && op2->shape != NULL)
3400 for (i = 0; i < op1->rank; i++)
3402 if (mpz_cmp (op1->shape[i], op2->shape[i]) != 0)
3404 gfc_error ("Shapes for operands at %L and %L are not conformable",
3405 &op1->where, &op2->where);
3406 t = false;
3407 break;
3412 return t;
3416 /* Resolve an operator expression node. This can involve replacing the
3417 operation with a user defined function call. */
3419 static bool
3420 resolve_operator (gfc_expr *e)
3422 gfc_expr *op1, *op2;
3423 char msg[200];
3424 bool dual_locus_error;
3425 bool t;
3427 /* Resolve all subnodes-- give them types. */
3429 switch (e->value.op.op)
3431 default:
3432 if (!gfc_resolve_expr (e->value.op.op2))
3433 return false;
3435 /* Fall through... */
3437 case INTRINSIC_NOT:
3438 case INTRINSIC_UPLUS:
3439 case INTRINSIC_UMINUS:
3440 case INTRINSIC_PARENTHESES:
3441 if (!gfc_resolve_expr (e->value.op.op1))
3442 return false;
3443 break;
3446 /* Typecheck the new node. */
3448 op1 = e->value.op.op1;
3449 op2 = e->value.op.op2;
3450 dual_locus_error = false;
3452 if ((op1 && op1->expr_type == EXPR_NULL)
3453 || (op2 && op2->expr_type == EXPR_NULL))
3455 sprintf (msg, _("Invalid context for NULL() pointer at %%L"));
3456 goto bad_op;
3459 switch (e->value.op.op)
3461 case INTRINSIC_UPLUS:
3462 case INTRINSIC_UMINUS:
3463 if (op1->ts.type == BT_INTEGER
3464 || op1->ts.type == BT_REAL
3465 || op1->ts.type == BT_COMPLEX)
3467 e->ts = op1->ts;
3468 break;
3471 sprintf (msg, _("Operand of unary numeric operator '%s' at %%L is %s"),
3472 gfc_op2string (e->value.op.op), gfc_typename (&e->ts));
3473 goto bad_op;
3475 case INTRINSIC_PLUS:
3476 case INTRINSIC_MINUS:
3477 case INTRINSIC_TIMES:
3478 case INTRINSIC_DIVIDE:
3479 case INTRINSIC_POWER:
3480 if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
3482 gfc_type_convert_binary (e, 1);
3483 break;
3486 sprintf (msg,
3487 _("Operands of binary numeric operator '%s' at %%L are %s/%s"),
3488 gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3489 gfc_typename (&op2->ts));
3490 goto bad_op;
3492 case INTRINSIC_CONCAT:
3493 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
3494 && op1->ts.kind == op2->ts.kind)
3496 e->ts.type = BT_CHARACTER;
3497 e->ts.kind = op1->ts.kind;
3498 break;
3501 sprintf (msg,
3502 _("Operands of string concatenation operator at %%L are %s/%s"),
3503 gfc_typename (&op1->ts), gfc_typename (&op2->ts));
3504 goto bad_op;
3506 case INTRINSIC_AND:
3507 case INTRINSIC_OR:
3508 case INTRINSIC_EQV:
3509 case INTRINSIC_NEQV:
3510 if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
3512 e->ts.type = BT_LOGICAL;
3513 e->ts.kind = gfc_kind_max (op1, op2);
3514 if (op1->ts.kind < e->ts.kind)
3515 gfc_convert_type (op1, &e->ts, 2);
3516 else if (op2->ts.kind < e->ts.kind)
3517 gfc_convert_type (op2, &e->ts, 2);
3518 break;
3521 sprintf (msg, _("Operands of logical operator '%s' at %%L are %s/%s"),
3522 gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3523 gfc_typename (&op2->ts));
3525 goto bad_op;
3527 case INTRINSIC_NOT:
3528 if (op1->ts.type == BT_LOGICAL)
3530 e->ts.type = BT_LOGICAL;
3531 e->ts.kind = op1->ts.kind;
3532 break;
3535 sprintf (msg, _("Operand of .not. operator at %%L is %s"),
3536 gfc_typename (&op1->ts));
3537 goto bad_op;
3539 case INTRINSIC_GT:
3540 case INTRINSIC_GT_OS:
3541 case INTRINSIC_GE:
3542 case INTRINSIC_GE_OS:
3543 case INTRINSIC_LT:
3544 case INTRINSIC_LT_OS:
3545 case INTRINSIC_LE:
3546 case INTRINSIC_LE_OS:
3547 if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
3549 strcpy (msg, _("COMPLEX quantities cannot be compared at %L"));
3550 goto bad_op;
3553 /* Fall through... */
3555 case INTRINSIC_EQ:
3556 case INTRINSIC_EQ_OS:
3557 case INTRINSIC_NE:
3558 case INTRINSIC_NE_OS:
3559 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
3560 && op1->ts.kind == op2->ts.kind)
3562 e->ts.type = BT_LOGICAL;
3563 e->ts.kind = gfc_default_logical_kind;
3564 break;
3567 if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
3569 gfc_type_convert_binary (e, 1);
3571 e->ts.type = BT_LOGICAL;
3572 e->ts.kind = gfc_default_logical_kind;
3574 if (gfc_option.warn_compare_reals)
3576 gfc_intrinsic_op op = e->value.op.op;
3578 /* Type conversion has made sure that the types of op1 and op2
3579 agree, so it is only necessary to check the first one. */
3580 if ((op1->ts.type == BT_REAL || op1->ts.type == BT_COMPLEX)
3581 && (op == INTRINSIC_EQ || op == INTRINSIC_EQ_OS
3582 || op == INTRINSIC_NE || op == INTRINSIC_NE_OS))
3584 const char *msg;
3586 if (op == INTRINSIC_EQ || op == INTRINSIC_EQ_OS)
3587 msg = "Equality comparison for %s at %L";
3588 else
3589 msg = "Inequality comparison for %s at %L";
3591 gfc_warning (msg, gfc_typename (&op1->ts), &op1->where);
3595 break;
3598 if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
3599 sprintf (msg,
3600 _("Logicals at %%L must be compared with %s instead of %s"),
3601 (e->value.op.op == INTRINSIC_EQ
3602 || e->value.op.op == INTRINSIC_EQ_OS)
3603 ? ".eqv." : ".neqv.", gfc_op2string (e->value.op.op));
3604 else
3605 sprintf (msg,
3606 _("Operands of comparison operator '%s' at %%L are %s/%s"),
3607 gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3608 gfc_typename (&op2->ts));
3610 goto bad_op;
3612 case INTRINSIC_USER:
3613 if (e->value.op.uop->op == NULL)
3614 sprintf (msg, _("Unknown operator '%s' at %%L"), e->value.op.uop->name);
3615 else if (op2 == NULL)
3616 sprintf (msg, _("Operand of user operator '%s' at %%L is %s"),
3617 e->value.op.uop->name, gfc_typename (&op1->ts));
3618 else
3620 sprintf (msg, _("Operands of user operator '%s' at %%L are %s/%s"),
3621 e->value.op.uop->name, gfc_typename (&op1->ts),
3622 gfc_typename (&op2->ts));
3623 e->value.op.uop->op->sym->attr.referenced = 1;
3626 goto bad_op;
3628 case INTRINSIC_PARENTHESES:
3629 e->ts = op1->ts;
3630 if (e->ts.type == BT_CHARACTER)
3631 e->ts.u.cl = op1->ts.u.cl;
3632 break;
3634 default:
3635 gfc_internal_error ("resolve_operator(): Bad intrinsic");
3638 /* Deal with arrayness of an operand through an operator. */
3640 t = true;
3642 switch (e->value.op.op)
3644 case INTRINSIC_PLUS:
3645 case INTRINSIC_MINUS:
3646 case INTRINSIC_TIMES:
3647 case INTRINSIC_DIVIDE:
3648 case INTRINSIC_POWER:
3649 case INTRINSIC_CONCAT:
3650 case INTRINSIC_AND:
3651 case INTRINSIC_OR:
3652 case INTRINSIC_EQV:
3653 case INTRINSIC_NEQV:
3654 case INTRINSIC_EQ:
3655 case INTRINSIC_EQ_OS:
3656 case INTRINSIC_NE:
3657 case INTRINSIC_NE_OS:
3658 case INTRINSIC_GT:
3659 case INTRINSIC_GT_OS:
3660 case INTRINSIC_GE:
3661 case INTRINSIC_GE_OS:
3662 case INTRINSIC_LT:
3663 case INTRINSIC_LT_OS:
3664 case INTRINSIC_LE:
3665 case INTRINSIC_LE_OS:
3667 if (op1->rank == 0 && op2->rank == 0)
3668 e->rank = 0;
3670 if (op1->rank == 0 && op2->rank != 0)
3672 e->rank = op2->rank;
3674 if (e->shape == NULL)
3675 e->shape = gfc_copy_shape (op2->shape, op2->rank);
3678 if (op1->rank != 0 && op2->rank == 0)
3680 e->rank = op1->rank;
3682 if (e->shape == NULL)
3683 e->shape = gfc_copy_shape (op1->shape, op1->rank);
3686 if (op1->rank != 0 && op2->rank != 0)
3688 if (op1->rank == op2->rank)
3690 e->rank = op1->rank;
3691 if (e->shape == NULL)
3693 t = compare_shapes (op1, op2);
3694 if (!t)
3695 e->shape = NULL;
3696 else
3697 e->shape = gfc_copy_shape (op1->shape, op1->rank);
3700 else
3702 /* Allow higher level expressions to work. */
3703 e->rank = 0;
3705 /* Try user-defined operators, and otherwise throw an error. */
3706 dual_locus_error = true;
3707 sprintf (msg,
3708 _("Inconsistent ranks for operator at %%L and %%L"));
3709 goto bad_op;
3713 break;
3715 case INTRINSIC_PARENTHESES:
3716 case INTRINSIC_NOT:
3717 case INTRINSIC_UPLUS:
3718 case INTRINSIC_UMINUS:
3719 /* Simply copy arrayness attribute */
3720 e->rank = op1->rank;
3722 if (e->shape == NULL)
3723 e->shape = gfc_copy_shape (op1->shape, op1->rank);
3725 break;
3727 default:
3728 break;
3731 /* Attempt to simplify the expression. */
3732 if (t)
3734 t = gfc_simplify_expr (e, 0);
3735 /* Some calls do not succeed in simplification and return false
3736 even though there is no error; e.g. variable references to
3737 PARAMETER arrays. */
3738 if (!gfc_is_constant_expr (e))
3739 t = true;
3741 return t;
3743 bad_op:
3746 match m = gfc_extend_expr (e);
3747 if (m == MATCH_YES)
3748 return true;
3749 if (m == MATCH_ERROR)
3750 return false;
3753 if (dual_locus_error)
3754 gfc_error (msg, &op1->where, &op2->where);
3755 else
3756 gfc_error (msg, &e->where);
3758 return false;
3762 /************** Array resolution subroutines **************/
3764 typedef enum
3765 { CMP_LT, CMP_EQ, CMP_GT, CMP_UNKNOWN }
3766 comparison;
3768 /* Compare two integer expressions. */
3770 static comparison
3771 compare_bound (gfc_expr *a, gfc_expr *b)
3773 int i;
3775 if (a == NULL || a->expr_type != EXPR_CONSTANT
3776 || b == NULL || b->expr_type != EXPR_CONSTANT)
3777 return CMP_UNKNOWN;
3779 /* If either of the types isn't INTEGER, we must have
3780 raised an error earlier. */
3782 if (a->ts.type != BT_INTEGER || b->ts.type != BT_INTEGER)
3783 return CMP_UNKNOWN;
3785 i = mpz_cmp (a->value.integer, b->value.integer);
3787 if (i < 0)
3788 return CMP_LT;
3789 if (i > 0)
3790 return CMP_GT;
3791 return CMP_EQ;
3795 /* Compare an integer expression with an integer. */
3797 static comparison
3798 compare_bound_int (gfc_expr *a, int b)
3800 int i;
3802 if (a == NULL || a->expr_type != EXPR_CONSTANT)
3803 return CMP_UNKNOWN;
3805 if (a->ts.type != BT_INTEGER)
3806 gfc_internal_error ("compare_bound_int(): Bad expression");
3808 i = mpz_cmp_si (a->value.integer, b);
3810 if (i < 0)
3811 return CMP_LT;
3812 if (i > 0)
3813 return CMP_GT;
3814 return CMP_EQ;
3818 /* Compare an integer expression with a mpz_t. */
3820 static comparison
3821 compare_bound_mpz_t (gfc_expr *a, mpz_t b)
3823 int i;
3825 if (a == NULL || a->expr_type != EXPR_CONSTANT)
3826 return CMP_UNKNOWN;
3828 if (a->ts.type != BT_INTEGER)
3829 gfc_internal_error ("compare_bound_int(): Bad expression");
3831 i = mpz_cmp (a->value.integer, b);
3833 if (i < 0)
3834 return CMP_LT;
3835 if (i > 0)
3836 return CMP_GT;
3837 return CMP_EQ;
3841 /* Compute the last value of a sequence given by a triplet.
3842 Return 0 if it wasn't able to compute the last value, or if the
3843 sequence if empty, and 1 otherwise. */
3845 static int
3846 compute_last_value_for_triplet (gfc_expr *start, gfc_expr *end,
3847 gfc_expr *stride, mpz_t last)
3849 mpz_t rem;
3851 if (start == NULL || start->expr_type != EXPR_CONSTANT
3852 || end == NULL || end->expr_type != EXPR_CONSTANT
3853 || (stride != NULL && stride->expr_type != EXPR_CONSTANT))
3854 return 0;
3856 if (start->ts.type != BT_INTEGER || end->ts.type != BT_INTEGER
3857 || (stride != NULL && stride->ts.type != BT_INTEGER))
3858 return 0;
3860 if (stride == NULL || compare_bound_int (stride, 1) == CMP_EQ)
3862 if (compare_bound (start, end) == CMP_GT)
3863 return 0;
3864 mpz_set (last, end->value.integer);
3865 return 1;
3868 if (compare_bound_int (stride, 0) == CMP_GT)
3870 /* Stride is positive */
3871 if (mpz_cmp (start->value.integer, end->value.integer) > 0)
3872 return 0;
3874 else
3876 /* Stride is negative */
3877 if (mpz_cmp (start->value.integer, end->value.integer) < 0)
3878 return 0;
3881 mpz_init (rem);
3882 mpz_sub (rem, end->value.integer, start->value.integer);
3883 mpz_tdiv_r (rem, rem, stride->value.integer);
3884 mpz_sub (last, end->value.integer, rem);
3885 mpz_clear (rem);
3887 return 1;
3891 /* Compare a single dimension of an array reference to the array
3892 specification. */
3894 static bool
3895 check_dimension (int i, gfc_array_ref *ar, gfc_array_spec *as)
3897 mpz_t last_value;
3899 if (ar->dimen_type[i] == DIMEN_STAR)
3901 gcc_assert (ar->stride[i] == NULL);
3902 /* This implies [*] as [*:] and [*:3] are not possible. */
3903 if (ar->start[i] == NULL)
3905 gcc_assert (ar->end[i] == NULL);
3906 return true;
3910 /* Given start, end and stride values, calculate the minimum and
3911 maximum referenced indexes. */
3913 switch (ar->dimen_type[i])
3915 case DIMEN_VECTOR:
3916 case DIMEN_THIS_IMAGE:
3917 break;
3919 case DIMEN_STAR:
3920 case DIMEN_ELEMENT:
3921 if (compare_bound (ar->start[i], as->lower[i]) == CMP_LT)
3923 if (i < as->rank)
3924 gfc_warning ("Array reference at %L is out of bounds "
3925 "(%ld < %ld) in dimension %d", &ar->c_where[i],
3926 mpz_get_si (ar->start[i]->value.integer),
3927 mpz_get_si (as->lower[i]->value.integer), i+1);
3928 else
3929 gfc_warning ("Array reference at %L is out of bounds "
3930 "(%ld < %ld) in codimension %d", &ar->c_where[i],
3931 mpz_get_si (ar->start[i]->value.integer),
3932 mpz_get_si (as->lower[i]->value.integer),
3933 i + 1 - as->rank);
3934 return true;
3936 if (compare_bound (ar->start[i], as->upper[i]) == CMP_GT)
3938 if (i < as->rank)
3939 gfc_warning ("Array reference at %L is out of bounds "
3940 "(%ld > %ld) in dimension %d", &ar->c_where[i],
3941 mpz_get_si (ar->start[i]->value.integer),
3942 mpz_get_si (as->upper[i]->value.integer), i+1);
3943 else
3944 gfc_warning ("Array reference at %L is out of bounds "
3945 "(%ld > %ld) in codimension %d", &ar->c_where[i],
3946 mpz_get_si (ar->start[i]->value.integer),
3947 mpz_get_si (as->upper[i]->value.integer),
3948 i + 1 - as->rank);
3949 return true;
3952 break;
3954 case DIMEN_RANGE:
3956 #define AR_START (ar->start[i] ? ar->start[i] : as->lower[i])
3957 #define AR_END (ar->end[i] ? ar->end[i] : as->upper[i])
3959 comparison comp_start_end = compare_bound (AR_START, AR_END);
3961 /* Check for zero stride, which is not allowed. */
3962 if (compare_bound_int (ar->stride[i], 0) == CMP_EQ)
3964 gfc_error ("Illegal stride of zero at %L", &ar->c_where[i]);
3965 return false;
3968 /* if start == len || (stride > 0 && start < len)
3969 || (stride < 0 && start > len),
3970 then the array section contains at least one element. In this
3971 case, there is an out-of-bounds access if
3972 (start < lower || start > upper). */
3973 if (compare_bound (AR_START, AR_END) == CMP_EQ
3974 || ((compare_bound_int (ar->stride[i], 0) == CMP_GT
3975 || ar->stride[i] == NULL) && comp_start_end == CMP_LT)
3976 || (compare_bound_int (ar->stride[i], 0) == CMP_LT
3977 && comp_start_end == CMP_GT))
3979 if (compare_bound (AR_START, as->lower[i]) == CMP_LT)
3981 gfc_warning ("Lower array reference at %L is out of bounds "
3982 "(%ld < %ld) in dimension %d", &ar->c_where[i],
3983 mpz_get_si (AR_START->value.integer),
3984 mpz_get_si (as->lower[i]->value.integer), i+1);
3985 return true;
3987 if (compare_bound (AR_START, as->upper[i]) == CMP_GT)
3989 gfc_warning ("Lower array reference at %L is out of bounds "
3990 "(%ld > %ld) in dimension %d", &ar->c_where[i],
3991 mpz_get_si (AR_START->value.integer),
3992 mpz_get_si (as->upper[i]->value.integer), i+1);
3993 return true;
3997 /* If we can compute the highest index of the array section,
3998 then it also has to be between lower and upper. */
3999 mpz_init (last_value);
4000 if (compute_last_value_for_triplet (AR_START, AR_END, ar->stride[i],
4001 last_value))
4003 if (compare_bound_mpz_t (as->lower[i], last_value) == CMP_GT)
4005 gfc_warning ("Upper array reference at %L is out of bounds "
4006 "(%ld < %ld) in dimension %d", &ar->c_where[i],
4007 mpz_get_si (last_value),
4008 mpz_get_si (as->lower[i]->value.integer), i+1);
4009 mpz_clear (last_value);
4010 return true;
4012 if (compare_bound_mpz_t (as->upper[i], last_value) == CMP_LT)
4014 gfc_warning ("Upper array reference at %L is out of bounds "
4015 "(%ld > %ld) in dimension %d", &ar->c_where[i],
4016 mpz_get_si (last_value),
4017 mpz_get_si (as->upper[i]->value.integer), i+1);
4018 mpz_clear (last_value);
4019 return true;
4022 mpz_clear (last_value);
4024 #undef AR_START
4025 #undef AR_END
4027 break;
4029 default:
4030 gfc_internal_error ("check_dimension(): Bad array reference");
4033 return true;
4037 /* Compare an array reference with an array specification. */
4039 static bool
4040 compare_spec_to_ref (gfc_array_ref *ar)
4042 gfc_array_spec *as;
4043 int i;
4045 as = ar->as;
4046 i = as->rank - 1;
4047 /* TODO: Full array sections are only allowed as actual parameters. */
4048 if (as->type == AS_ASSUMED_SIZE
4049 && (/*ar->type == AR_FULL
4050 ||*/ (ar->type == AR_SECTION
4051 && ar->dimen_type[i] == DIMEN_RANGE && ar->end[i] == NULL)))
4053 gfc_error ("Rightmost upper bound of assumed size array section "
4054 "not specified at %L", &ar->where);
4055 return false;
4058 if (ar->type == AR_FULL)
4059 return true;
4061 if (as->rank != ar->dimen)
4063 gfc_error ("Rank mismatch in array reference at %L (%d/%d)",
4064 &ar->where, ar->dimen, as->rank);
4065 return false;
4068 /* ar->codimen == 0 is a local array. */
4069 if (as->corank != ar->codimen && ar->codimen != 0)
4071 gfc_error ("Coindex rank mismatch in array reference at %L (%d/%d)",
4072 &ar->where, ar->codimen, as->corank);
4073 return false;
4076 for (i = 0; i < as->rank; i++)
4077 if (!check_dimension (i, ar, as))
4078 return false;
4080 /* Local access has no coarray spec. */
4081 if (ar->codimen != 0)
4082 for (i = as->rank; i < as->rank + as->corank; i++)
4084 if (ar->dimen_type[i] != DIMEN_ELEMENT && !ar->in_allocate
4085 && ar->dimen_type[i] != DIMEN_THIS_IMAGE)
4087 gfc_error ("Coindex of codimension %d must be a scalar at %L",
4088 i + 1 - as->rank, &ar->where);
4089 return false;
4091 if (!check_dimension (i, ar, as))
4092 return false;
4095 return true;
4099 /* Resolve one part of an array index. */
4101 static bool
4102 gfc_resolve_index_1 (gfc_expr *index, int check_scalar,
4103 int force_index_integer_kind)
4105 gfc_typespec ts;
4107 if (index == NULL)
4108 return true;
4110 if (!gfc_resolve_expr (index))
4111 return false;
4113 if (check_scalar && index->rank != 0)
4115 gfc_error ("Array index at %L must be scalar", &index->where);
4116 return false;
4119 if (index->ts.type != BT_INTEGER && index->ts.type != BT_REAL)
4121 gfc_error ("Array index at %L must be of INTEGER type, found %s",
4122 &index->where, gfc_basic_typename (index->ts.type));
4123 return false;
4126 if (index->ts.type == BT_REAL)
4127 if (!gfc_notify_std (GFC_STD_LEGACY, "REAL array index at %L",
4128 &index->where))
4129 return false;
4131 if ((index->ts.kind != gfc_index_integer_kind
4132 && force_index_integer_kind)
4133 || index->ts.type != BT_INTEGER)
4135 gfc_clear_ts (&ts);
4136 ts.type = BT_INTEGER;
4137 ts.kind = gfc_index_integer_kind;
4139 gfc_convert_type_warn (index, &ts, 2, 0);
4142 return true;
4145 /* Resolve one part of an array index. */
4147 bool
4148 gfc_resolve_index (gfc_expr *index, int check_scalar)
4150 return gfc_resolve_index_1 (index, check_scalar, 1);
4153 /* Resolve a dim argument to an intrinsic function. */
4155 bool
4156 gfc_resolve_dim_arg (gfc_expr *dim)
4158 if (dim == NULL)
4159 return true;
4161 if (!gfc_resolve_expr (dim))
4162 return false;
4164 if (dim->rank != 0)
4166 gfc_error ("Argument dim at %L must be scalar", &dim->where);
4167 return false;
4171 if (dim->ts.type != BT_INTEGER)
4173 gfc_error ("Argument dim at %L must be of INTEGER type", &dim->where);
4174 return false;
4177 if (dim->ts.kind != gfc_index_integer_kind)
4179 gfc_typespec ts;
4181 gfc_clear_ts (&ts);
4182 ts.type = BT_INTEGER;
4183 ts.kind = gfc_index_integer_kind;
4185 gfc_convert_type_warn (dim, &ts, 2, 0);
4188 return true;
4191 /* Given an expression that contains array references, update those array
4192 references to point to the right array specifications. While this is
4193 filled in during matching, this information is difficult to save and load
4194 in a module, so we take care of it here.
4196 The idea here is that the original array reference comes from the
4197 base symbol. We traverse the list of reference structures, setting
4198 the stored reference to references. Component references can
4199 provide an additional array specification. */
4201 static void
4202 find_array_spec (gfc_expr *e)
4204 gfc_array_spec *as;
4205 gfc_component *c;
4206 gfc_ref *ref;
4208 if (e->symtree->n.sym->ts.type == BT_CLASS)
4209 as = CLASS_DATA (e->symtree->n.sym)->as;
4210 else
4211 as = e->symtree->n.sym->as;
4213 for (ref = e->ref; ref; ref = ref->next)
4214 switch (ref->type)
4216 case REF_ARRAY:
4217 if (as == NULL)
4218 gfc_internal_error ("find_array_spec(): Missing spec");
4220 ref->u.ar.as = as;
4221 as = NULL;
4222 break;
4224 case REF_COMPONENT:
4225 c = ref->u.c.component;
4226 if (c->attr.dimension)
4228 if (as != NULL)
4229 gfc_internal_error ("find_array_spec(): unused as(1)");
4230 as = c->as;
4233 break;
4235 case REF_SUBSTRING:
4236 break;
4239 if (as != NULL)
4240 gfc_internal_error ("find_array_spec(): unused as(2)");
4244 /* Resolve an array reference. */
4246 static bool
4247 resolve_array_ref (gfc_array_ref *ar)
4249 int i, check_scalar;
4250 gfc_expr *e;
4252 for (i = 0; i < ar->dimen + ar->codimen; i++)
4254 check_scalar = ar->dimen_type[i] == DIMEN_RANGE;
4256 /* Do not force gfc_index_integer_kind for the start. We can
4257 do fine with any integer kind. This avoids temporary arrays
4258 created for indexing with a vector. */
4259 if (!gfc_resolve_index_1 (ar->start[i], check_scalar, 0))
4260 return false;
4261 if (!gfc_resolve_index (ar->end[i], check_scalar))
4262 return false;
4263 if (!gfc_resolve_index (ar->stride[i], check_scalar))
4264 return false;
4266 e = ar->start[i];
4268 if (ar->dimen_type[i] == DIMEN_UNKNOWN)
4269 switch (e->rank)
4271 case 0:
4272 ar->dimen_type[i] = DIMEN_ELEMENT;
4273 break;
4275 case 1:
4276 ar->dimen_type[i] = DIMEN_VECTOR;
4277 if (e->expr_type == EXPR_VARIABLE
4278 && e->symtree->n.sym->ts.type == BT_DERIVED)
4279 ar->start[i] = gfc_get_parentheses (e);
4280 break;
4282 default:
4283 gfc_error ("Array index at %L is an array of rank %d",
4284 &ar->c_where[i], e->rank);
4285 return false;
4288 /* Fill in the upper bound, which may be lower than the
4289 specified one for something like a(2:10:5), which is
4290 identical to a(2:7:5). Only relevant for strides not equal
4291 to one. Don't try a division by zero. */
4292 if (ar->dimen_type[i] == DIMEN_RANGE
4293 && ar->stride[i] != NULL && ar->stride[i]->expr_type == EXPR_CONSTANT
4294 && mpz_cmp_si (ar->stride[i]->value.integer, 1L) != 0
4295 && mpz_cmp_si (ar->stride[i]->value.integer, 0L) != 0)
4297 mpz_t size, end;
4299 if (gfc_ref_dimen_size (ar, i, &size, &end))
4301 if (ar->end[i] == NULL)
4303 ar->end[i] =
4304 gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind,
4305 &ar->where);
4306 mpz_set (ar->end[i]->value.integer, end);
4308 else if (ar->end[i]->ts.type == BT_INTEGER
4309 && ar->end[i]->expr_type == EXPR_CONSTANT)
4311 mpz_set (ar->end[i]->value.integer, end);
4313 else
4314 gcc_unreachable ();
4316 mpz_clear (size);
4317 mpz_clear (end);
4322 if (ar->type == AR_FULL)
4324 if (ar->as->rank == 0)
4325 ar->type = AR_ELEMENT;
4327 /* Make sure array is the same as array(:,:), this way
4328 we don't need to special case all the time. */
4329 ar->dimen = ar->as->rank;
4330 for (i = 0; i < ar->dimen; i++)
4332 ar->dimen_type[i] = DIMEN_RANGE;
4334 gcc_assert (ar->start[i] == NULL);
4335 gcc_assert (ar->end[i] == NULL);
4336 gcc_assert (ar->stride[i] == NULL);
4340 /* If the reference type is unknown, figure out what kind it is. */
4342 if (ar->type == AR_UNKNOWN)
4344 ar->type = AR_ELEMENT;
4345 for (i = 0; i < ar->dimen; i++)
4346 if (ar->dimen_type[i] == DIMEN_RANGE
4347 || ar->dimen_type[i] == DIMEN_VECTOR)
4349 ar->type = AR_SECTION;
4350 break;
4354 if (!ar->as->cray_pointee && !compare_spec_to_ref (ar))
4355 return false;
4357 if (ar->as->corank && ar->codimen == 0)
4359 int n;
4360 ar->codimen = ar->as->corank;
4361 for (n = ar->dimen; n < ar->dimen + ar->codimen; n++)
4362 ar->dimen_type[n] = DIMEN_THIS_IMAGE;
4365 return true;
4369 static bool
4370 resolve_substring (gfc_ref *ref)
4372 int k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
4374 if (ref->u.ss.start != NULL)
4376 if (!gfc_resolve_expr (ref->u.ss.start))
4377 return false;
4379 if (ref->u.ss.start->ts.type != BT_INTEGER)
4381 gfc_error ("Substring start index at %L must be of type INTEGER",
4382 &ref->u.ss.start->where);
4383 return false;
4386 if (ref->u.ss.start->rank != 0)
4388 gfc_error ("Substring start index at %L must be scalar",
4389 &ref->u.ss.start->where);
4390 return false;
4393 if (compare_bound_int (ref->u.ss.start, 1) == CMP_LT
4394 && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
4395 || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
4397 gfc_error ("Substring start index at %L is less than one",
4398 &ref->u.ss.start->where);
4399 return false;
4403 if (ref->u.ss.end != NULL)
4405 if (!gfc_resolve_expr (ref->u.ss.end))
4406 return false;
4408 if (ref->u.ss.end->ts.type != BT_INTEGER)
4410 gfc_error ("Substring end index at %L must be of type INTEGER",
4411 &ref->u.ss.end->where);
4412 return false;
4415 if (ref->u.ss.end->rank != 0)
4417 gfc_error ("Substring end index at %L must be scalar",
4418 &ref->u.ss.end->where);
4419 return false;
4422 if (ref->u.ss.length != NULL
4423 && compare_bound (ref->u.ss.end, ref->u.ss.length->length) == CMP_GT
4424 && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
4425 || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
4427 gfc_error ("Substring end index at %L exceeds the string length",
4428 &ref->u.ss.start->where);
4429 return false;
4432 if (compare_bound_mpz_t (ref->u.ss.end,
4433 gfc_integer_kinds[k].huge) == CMP_GT
4434 && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
4435 || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
4437 gfc_error ("Substring end index at %L is too large",
4438 &ref->u.ss.end->where);
4439 return false;
4443 return true;
4447 /* This function supplies missing substring charlens. */
4449 void
4450 gfc_resolve_substring_charlen (gfc_expr *e)
4452 gfc_ref *char_ref;
4453 gfc_expr *start, *end;
4455 for (char_ref = e->ref; char_ref; char_ref = char_ref->next)
4456 if (char_ref->type == REF_SUBSTRING)
4457 break;
4459 if (!char_ref)
4460 return;
4462 gcc_assert (char_ref->next == NULL);
4464 if (e->ts.u.cl)
4466 if (e->ts.u.cl->length)
4467 gfc_free_expr (e->ts.u.cl->length);
4468 else if (e->expr_type == EXPR_VARIABLE
4469 && e->symtree->n.sym->attr.dummy)
4470 return;
4473 e->ts.type = BT_CHARACTER;
4474 e->ts.kind = gfc_default_character_kind;
4476 if (!e->ts.u.cl)
4477 e->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4479 if (char_ref->u.ss.start)
4480 start = gfc_copy_expr (char_ref->u.ss.start);
4481 else
4482 start = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
4484 if (char_ref->u.ss.end)
4485 end = gfc_copy_expr (char_ref->u.ss.end);
4486 else if (e->expr_type == EXPR_VARIABLE)
4487 end = gfc_copy_expr (e->symtree->n.sym->ts.u.cl->length);
4488 else
4489 end = NULL;
4491 if (!start || !end)
4493 gfc_free_expr (start);
4494 gfc_free_expr (end);
4495 return;
4498 /* Length = (end - start +1). */
4499 e->ts.u.cl->length = gfc_subtract (end, start);
4500 e->ts.u.cl->length = gfc_add (e->ts.u.cl->length,
4501 gfc_get_int_expr (gfc_default_integer_kind,
4502 NULL, 1));
4504 e->ts.u.cl->length->ts.type = BT_INTEGER;
4505 e->ts.u.cl->length->ts.kind = gfc_charlen_int_kind;
4507 /* Make sure that the length is simplified. */
4508 gfc_simplify_expr (e->ts.u.cl->length, 1);
4509 gfc_resolve_expr (e->ts.u.cl->length);
4513 /* Resolve subtype references. */
4515 static bool
4516 resolve_ref (gfc_expr *expr)
4518 int current_part_dimension, n_components, seen_part_dimension;
4519 gfc_ref *ref;
4521 for (ref = expr->ref; ref; ref = ref->next)
4522 if (ref->type == REF_ARRAY && ref->u.ar.as == NULL)
4524 find_array_spec (expr);
4525 break;
4528 for (ref = expr->ref; ref; ref = ref->next)
4529 switch (ref->type)
4531 case REF_ARRAY:
4532 if (!resolve_array_ref (&ref->u.ar))
4533 return false;
4534 break;
4536 case REF_COMPONENT:
4537 break;
4539 case REF_SUBSTRING:
4540 if (!resolve_substring (ref))
4541 return false;
4542 break;
4545 /* Check constraints on part references. */
4547 current_part_dimension = 0;
4548 seen_part_dimension = 0;
4549 n_components = 0;
4551 for (ref = expr->ref; ref; ref = ref->next)
4553 switch (ref->type)
4555 case REF_ARRAY:
4556 switch (ref->u.ar.type)
4558 case AR_FULL:
4559 /* Coarray scalar. */
4560 if (ref->u.ar.as->rank == 0)
4562 current_part_dimension = 0;
4563 break;
4565 /* Fall through. */
4566 case AR_SECTION:
4567 current_part_dimension = 1;
4568 break;
4570 case AR_ELEMENT:
4571 current_part_dimension = 0;
4572 break;
4574 case AR_UNKNOWN:
4575 gfc_internal_error ("resolve_ref(): Bad array reference");
4578 break;
4580 case REF_COMPONENT:
4581 if (current_part_dimension || seen_part_dimension)
4583 /* F03:C614. */
4584 if (ref->u.c.component->attr.pointer
4585 || ref->u.c.component->attr.proc_pointer
4586 || (ref->u.c.component->ts.type == BT_CLASS
4587 && CLASS_DATA (ref->u.c.component)->attr.pointer))
4589 gfc_error ("Component to the right of a part reference "
4590 "with nonzero rank must not have the POINTER "
4591 "attribute at %L", &expr->where);
4592 return false;
4594 else if (ref->u.c.component->attr.allocatable
4595 || (ref->u.c.component->ts.type == BT_CLASS
4596 && CLASS_DATA (ref->u.c.component)->attr.allocatable))
4599 gfc_error ("Component to the right of a part reference "
4600 "with nonzero rank must not have the ALLOCATABLE "
4601 "attribute at %L", &expr->where);
4602 return false;
4606 n_components++;
4607 break;
4609 case REF_SUBSTRING:
4610 break;
4613 if (((ref->type == REF_COMPONENT && n_components > 1)
4614 || ref->next == NULL)
4615 && current_part_dimension
4616 && seen_part_dimension)
4618 gfc_error ("Two or more part references with nonzero rank must "
4619 "not be specified at %L", &expr->where);
4620 return false;
4623 if (ref->type == REF_COMPONENT)
4625 if (current_part_dimension)
4626 seen_part_dimension = 1;
4628 /* reset to make sure */
4629 current_part_dimension = 0;
4633 return true;
4637 /* Given an expression, determine its shape. This is easier than it sounds.
4638 Leaves the shape array NULL if it is not possible to determine the shape. */
4640 static void
4641 expression_shape (gfc_expr *e)
4643 mpz_t array[GFC_MAX_DIMENSIONS];
4644 int i;
4646 if (e->rank <= 0 || e->shape != NULL)
4647 return;
4649 for (i = 0; i < e->rank; i++)
4650 if (!gfc_array_dimen_size (e, i, &array[i]))
4651 goto fail;
4653 e->shape = gfc_get_shape (e->rank);
4655 memcpy (e->shape, array, e->rank * sizeof (mpz_t));
4657 return;
4659 fail:
4660 for (i--; i >= 0; i--)
4661 mpz_clear (array[i]);
4665 /* Given a variable expression node, compute the rank of the expression by
4666 examining the base symbol and any reference structures it may have. */
4668 static void
4669 expression_rank (gfc_expr *e)
4671 gfc_ref *ref;
4672 int i, rank;
4674 /* Just to make sure, because EXPR_COMPCALL's also have an e->ref and that
4675 could lead to serious confusion... */
4676 gcc_assert (e->expr_type != EXPR_COMPCALL);
4678 if (e->ref == NULL)
4680 if (e->expr_type == EXPR_ARRAY)
4681 goto done;
4682 /* Constructors can have a rank different from one via RESHAPE(). */
4684 if (e->symtree == NULL)
4686 e->rank = 0;
4687 goto done;
4690 e->rank = (e->symtree->n.sym->as == NULL)
4691 ? 0 : e->symtree->n.sym->as->rank;
4692 goto done;
4695 rank = 0;
4697 for (ref = e->ref; ref; ref = ref->next)
4699 if (ref->type == REF_COMPONENT && ref->u.c.component->attr.proc_pointer
4700 && ref->u.c.component->attr.function && !ref->next)
4701 rank = ref->u.c.component->as ? ref->u.c.component->as->rank : 0;
4703 if (ref->type != REF_ARRAY)
4704 continue;
4706 if (ref->u.ar.type == AR_FULL)
4708 rank = ref->u.ar.as->rank;
4709 break;
4712 if (ref->u.ar.type == AR_SECTION)
4714 /* Figure out the rank of the section. */
4715 if (rank != 0)
4716 gfc_internal_error ("expression_rank(): Two array specs");
4718 for (i = 0; i < ref->u.ar.dimen; i++)
4719 if (ref->u.ar.dimen_type[i] == DIMEN_RANGE
4720 || ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
4721 rank++;
4723 break;
4727 e->rank = rank;
4729 done:
4730 expression_shape (e);
4734 static void
4735 add_caf_get_intrinsic (gfc_expr *e)
4737 gfc_expr *wrapper, *tmp_expr;
4738 gfc_ref *ref;
4739 int n;
4741 for (ref = e->ref; ref; ref = ref->next)
4742 if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4743 break;
4744 if (ref == NULL)
4745 return;
4747 for (n = ref->u.ar.dimen; n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
4748 if (ref->u.ar.dimen_type[n] != DIMEN_ELEMENT)
4749 return;
4751 tmp_expr = XCNEW (gfc_expr);
4752 *tmp_expr = *e;
4753 wrapper = gfc_build_intrinsic_call (gfc_current_ns, GFC_ISYM_CAF_GET,
4754 "caf_get", tmp_expr->where, 1, tmp_expr);
4755 wrapper->ts = e->ts;
4756 wrapper->rank = e->rank;
4757 if (e->rank)
4758 wrapper->shape = gfc_copy_shape (e->shape, e->rank);
4759 *e = *wrapper;
4760 free (wrapper);
4764 static void
4765 remove_caf_get_intrinsic (gfc_expr *e)
4767 gcc_assert (e->expr_type == EXPR_FUNCTION && e->value.function.isym
4768 && e->value.function.isym->id == GFC_ISYM_CAF_GET);
4769 gfc_expr *e2 = e->value.function.actual->expr;
4770 e->value.function.actual->expr = NULL;
4771 gfc_free_actual_arglist (e->value.function.actual);
4772 gfc_free_shape (&e->shape, e->rank);
4773 *e = *e2;
4774 free (e2);
4778 /* Resolve a variable expression. */
4780 static bool
4781 resolve_variable (gfc_expr *e)
4783 gfc_symbol *sym;
4784 bool t;
4786 t = true;
4788 if (e->symtree == NULL)
4789 return false;
4790 sym = e->symtree->n.sym;
4792 /* Use same check as for TYPE(*) below; this check has to be before TYPE(*)
4793 as ts.type is set to BT_ASSUMED in resolve_symbol. */
4794 if (sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
4796 if (!actual_arg || inquiry_argument)
4798 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute may only "
4799 "be used as actual argument", sym->name, &e->where);
4800 return false;
4803 /* TS 29113, 407b. */
4804 else if (e->ts.type == BT_ASSUMED)
4806 if (!actual_arg)
4808 gfc_error ("Assumed-type variable %s at %L may only be used "
4809 "as actual argument", sym->name, &e->where);
4810 return false;
4812 else if (inquiry_argument && !first_actual_arg)
4814 /* FIXME: It doesn't work reliably as inquiry_argument is not set
4815 for all inquiry functions in resolve_function; the reason is
4816 that the function-name resolution happens too late in that
4817 function. */
4818 gfc_error ("Assumed-type variable %s at %L as actual argument to "
4819 "an inquiry function shall be the first argument",
4820 sym->name, &e->where);
4821 return false;
4824 /* TS 29113, C535b. */
4825 else if ((sym->ts.type == BT_CLASS && sym->attr.class_ok
4826 && CLASS_DATA (sym)->as
4827 && CLASS_DATA (sym)->as->type == AS_ASSUMED_RANK)
4828 || (sym->ts.type != BT_CLASS && sym->as
4829 && sym->as->type == AS_ASSUMED_RANK))
4831 if (!actual_arg)
4833 gfc_error ("Assumed-rank variable %s at %L may only be used as "
4834 "actual argument", sym->name, &e->where);
4835 return false;
4837 else if (inquiry_argument && !first_actual_arg)
4839 /* FIXME: It doesn't work reliably as inquiry_argument is not set
4840 for all inquiry functions in resolve_function; the reason is
4841 that the function-name resolution happens too late in that
4842 function. */
4843 gfc_error ("Assumed-rank variable %s at %L as actual argument "
4844 "to an inquiry function shall be the first argument",
4845 sym->name, &e->where);
4846 return false;
4850 if ((sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK)) && e->ref
4851 && !(e->ref->type == REF_ARRAY && e->ref->u.ar.type == AR_FULL
4852 && e->ref->next == NULL))
4854 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall not have "
4855 "a subobject reference", sym->name, &e->ref->u.ar.where);
4856 return false;
4858 /* TS 29113, 407b. */
4859 else if (e->ts.type == BT_ASSUMED && e->ref
4860 && !(e->ref->type == REF_ARRAY && e->ref->u.ar.type == AR_FULL
4861 && e->ref->next == NULL))
4863 gfc_error ("Assumed-type variable %s at %L shall not have a subobject "
4864 "reference", sym->name, &e->ref->u.ar.where);
4865 return false;
4868 /* TS 29113, C535b. */
4869 if (((sym->ts.type == BT_CLASS && sym->attr.class_ok
4870 && CLASS_DATA (sym)->as
4871 && CLASS_DATA (sym)->as->type == AS_ASSUMED_RANK)
4872 || (sym->ts.type != BT_CLASS && sym->as
4873 && sym->as->type == AS_ASSUMED_RANK))
4874 && e->ref
4875 && !(e->ref->type == REF_ARRAY && e->ref->u.ar.type == AR_FULL
4876 && e->ref->next == NULL))
4878 gfc_error ("Assumed-rank variable %s at %L shall not have a subobject "
4879 "reference", sym->name, &e->ref->u.ar.where);
4880 return false;
4884 /* If this is an associate-name, it may be parsed with an array reference
4885 in error even though the target is scalar. Fail directly in this case.
4886 TODO Understand why class scalar expressions must be excluded. */
4887 if (sym->assoc && !(sym->ts.type == BT_CLASS && e->rank == 0))
4889 if (sym->ts.type == BT_CLASS)
4890 gfc_fix_class_refs (e);
4891 if (!sym->attr.dimension && e->ref && e->ref->type == REF_ARRAY)
4892 return false;
4895 if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.generic)
4896 sym->ts.u.derived = gfc_find_dt_in_generic (sym->ts.u.derived);
4898 /* On the other hand, the parser may not have known this is an array;
4899 in this case, we have to add a FULL reference. */
4900 if (sym->assoc && sym->attr.dimension && !e->ref)
4902 e->ref = gfc_get_ref ();
4903 e->ref->type = REF_ARRAY;
4904 e->ref->u.ar.type = AR_FULL;
4905 e->ref->u.ar.dimen = 0;
4908 if (e->ref && !resolve_ref (e))
4909 return false;
4911 if (sym->attr.flavor == FL_PROCEDURE
4912 && (!sym->attr.function
4913 || (sym->attr.function && sym->result
4914 && sym->result->attr.proc_pointer
4915 && !sym->result->attr.function)))
4917 e->ts.type = BT_PROCEDURE;
4918 goto resolve_procedure;
4921 if (sym->ts.type != BT_UNKNOWN)
4922 gfc_variable_attr (e, &e->ts);
4923 else
4925 /* Must be a simple variable reference. */
4926 if (!gfc_set_default_type (sym, 1, sym->ns))
4927 return false;
4928 e->ts = sym->ts;
4931 if (check_assumed_size_reference (sym, e))
4932 return false;
4934 /* Deal with forward references to entries during gfc_resolve_code, to
4935 satisfy, at least partially, 12.5.2.5. */
4936 if (gfc_current_ns->entries
4937 && current_entry_id == sym->entry_id
4938 && cs_base
4939 && cs_base->current
4940 && cs_base->current->op != EXEC_ENTRY)
4942 gfc_entry_list *entry;
4943 gfc_formal_arglist *formal;
4944 int n;
4945 bool seen, saved_specification_expr;
4947 /* If the symbol is a dummy... */
4948 if (sym->attr.dummy && sym->ns == gfc_current_ns)
4950 entry = gfc_current_ns->entries;
4951 seen = false;
4953 /* ...test if the symbol is a parameter of previous entries. */
4954 for (; entry && entry->id <= current_entry_id; entry = entry->next)
4955 for (formal = entry->sym->formal; formal; formal = formal->next)
4957 if (formal->sym && sym->name == formal->sym->name)
4959 seen = true;
4960 break;
4964 /* If it has not been seen as a dummy, this is an error. */
4965 if (!seen)
4967 if (specification_expr)
4968 gfc_error ("Variable '%s', used in a specification expression"
4969 ", is referenced at %L before the ENTRY statement "
4970 "in which it is a parameter",
4971 sym->name, &cs_base->current->loc);
4972 else
4973 gfc_error ("Variable '%s' is used at %L before the ENTRY "
4974 "statement in which it is a parameter",
4975 sym->name, &cs_base->current->loc);
4976 t = false;
4980 /* Now do the same check on the specification expressions. */
4981 saved_specification_expr = specification_expr;
4982 specification_expr = true;
4983 if (sym->ts.type == BT_CHARACTER
4984 && !gfc_resolve_expr (sym->ts.u.cl->length))
4985 t = false;
4987 if (sym->as)
4988 for (n = 0; n < sym->as->rank; n++)
4990 if (!gfc_resolve_expr (sym->as->lower[n]))
4991 t = false;
4992 if (!gfc_resolve_expr (sym->as->upper[n]))
4993 t = false;
4995 specification_expr = saved_specification_expr;
4997 if (t)
4998 /* Update the symbol's entry level. */
4999 sym->entry_id = current_entry_id + 1;
5002 /* If a symbol has been host_associated mark it. This is used latter,
5003 to identify if aliasing is possible via host association. */
5004 if (sym->attr.flavor == FL_VARIABLE
5005 && gfc_current_ns->parent
5006 && (gfc_current_ns->parent == sym->ns
5007 || (gfc_current_ns->parent->parent
5008 && gfc_current_ns->parent->parent == sym->ns)))
5009 sym->attr.host_assoc = 1;
5011 resolve_procedure:
5012 if (t && !resolve_procedure_expression (e))
5013 t = false;
5015 /* F2008, C617 and C1229. */
5016 if (!inquiry_argument && (e->ts.type == BT_CLASS || e->ts.type == BT_DERIVED)
5017 && gfc_is_coindexed (e))
5019 gfc_ref *ref, *ref2 = NULL;
5021 for (ref = e->ref; ref; ref = ref->next)
5023 if (ref->type == REF_COMPONENT)
5024 ref2 = ref;
5025 if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
5026 break;
5029 for ( ; ref; ref = ref->next)
5030 if (ref->type == REF_COMPONENT)
5031 break;
5033 /* Expression itself is not coindexed object. */
5034 if (ref && e->ts.type == BT_CLASS)
5036 gfc_error ("Polymorphic subobject of coindexed object at %L",
5037 &e->where);
5038 t = false;
5041 /* Expression itself is coindexed object. */
5042 if (ref == NULL)
5044 gfc_component *c;
5045 c = ref2 ? ref2->u.c.component : e->symtree->n.sym->components;
5046 for ( ; c; c = c->next)
5047 if (c->attr.allocatable && c->ts.type == BT_CLASS)
5049 gfc_error ("Coindexed object with polymorphic allocatable "
5050 "subcomponent at %L", &e->where);
5051 t = false;
5052 break;
5057 if (t)
5058 expression_rank (e);
5060 if (t && gfc_option.coarray == GFC_FCOARRAY_LIB && gfc_is_coindexed (e))
5061 add_caf_get_intrinsic (e);
5063 return t;
5067 /* Checks to see that the correct symbol has been host associated.
5068 The only situation where this arises is that in which a twice
5069 contained function is parsed after the host association is made.
5070 Therefore, on detecting this, change the symbol in the expression
5071 and convert the array reference into an actual arglist if the old
5072 symbol is a variable. */
5073 static bool
5074 check_host_association (gfc_expr *e)
5076 gfc_symbol *sym, *old_sym;
5077 gfc_symtree *st;
5078 int n;
5079 gfc_ref *ref;
5080 gfc_actual_arglist *arg, *tail = NULL;
5081 bool retval = e->expr_type == EXPR_FUNCTION;
5083 /* If the expression is the result of substitution in
5084 interface.c(gfc_extend_expr) because there is no way in
5085 which the host association can be wrong. */
5086 if (e->symtree == NULL
5087 || e->symtree->n.sym == NULL
5088 || e->user_operator)
5089 return retval;
5091 old_sym = e->symtree->n.sym;
5093 if (gfc_current_ns->parent
5094 && old_sym->ns != gfc_current_ns)
5096 /* Use the 'USE' name so that renamed module symbols are
5097 correctly handled. */
5098 gfc_find_symbol (e->symtree->name, gfc_current_ns, 1, &sym);
5100 if (sym && old_sym != sym
5101 && sym->ts.type == old_sym->ts.type
5102 && sym->attr.flavor == FL_PROCEDURE
5103 && sym->attr.contained)
5105 /* Clear the shape, since it might not be valid. */
5106 gfc_free_shape (&e->shape, e->rank);
5108 /* Give the expression the right symtree! */
5109 gfc_find_sym_tree (e->symtree->name, NULL, 1, &st);
5110 gcc_assert (st != NULL);
5112 if (old_sym->attr.flavor == FL_PROCEDURE
5113 || e->expr_type == EXPR_FUNCTION)
5115 /* Original was function so point to the new symbol, since
5116 the actual argument list is already attached to the
5117 expression. */
5118 e->value.function.esym = NULL;
5119 e->symtree = st;
5121 else
5123 /* Original was variable so convert array references into
5124 an actual arglist. This does not need any checking now
5125 since resolve_function will take care of it. */
5126 e->value.function.actual = NULL;
5127 e->expr_type = EXPR_FUNCTION;
5128 e->symtree = st;
5130 /* Ambiguity will not arise if the array reference is not
5131 the last reference. */
5132 for (ref = e->ref; ref; ref = ref->next)
5133 if (ref->type == REF_ARRAY && ref->next == NULL)
5134 break;
5136 gcc_assert (ref->type == REF_ARRAY);
5138 /* Grab the start expressions from the array ref and
5139 copy them into actual arguments. */
5140 for (n = 0; n < ref->u.ar.dimen; n++)
5142 arg = gfc_get_actual_arglist ();
5143 arg->expr = gfc_copy_expr (ref->u.ar.start[n]);
5144 if (e->value.function.actual == NULL)
5145 tail = e->value.function.actual = arg;
5146 else
5148 tail->next = arg;
5149 tail = arg;
5153 /* Dump the reference list and set the rank. */
5154 gfc_free_ref_list (e->ref);
5155 e->ref = NULL;
5156 e->rank = sym->as ? sym->as->rank : 0;
5159 gfc_resolve_expr (e);
5160 sym->refs++;
5163 /* This might have changed! */
5164 return e->expr_type == EXPR_FUNCTION;
5168 static void
5169 gfc_resolve_character_operator (gfc_expr *e)
5171 gfc_expr *op1 = e->value.op.op1;
5172 gfc_expr *op2 = e->value.op.op2;
5173 gfc_expr *e1 = NULL;
5174 gfc_expr *e2 = NULL;
5176 gcc_assert (e->value.op.op == INTRINSIC_CONCAT);
5178 if (op1->ts.u.cl && op1->ts.u.cl->length)
5179 e1 = gfc_copy_expr (op1->ts.u.cl->length);
5180 else if (op1->expr_type == EXPR_CONSTANT)
5181 e1 = gfc_get_int_expr (gfc_default_integer_kind, NULL,
5182 op1->value.character.length);
5184 if (op2->ts.u.cl && op2->ts.u.cl->length)
5185 e2 = gfc_copy_expr (op2->ts.u.cl->length);
5186 else if (op2->expr_type == EXPR_CONSTANT)
5187 e2 = gfc_get_int_expr (gfc_default_integer_kind, NULL,
5188 op2->value.character.length);
5190 e->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
5192 if (!e1 || !e2)
5194 gfc_free_expr (e1);
5195 gfc_free_expr (e2);
5197 return;
5200 e->ts.u.cl->length = gfc_add (e1, e2);
5201 e->ts.u.cl->length->ts.type = BT_INTEGER;
5202 e->ts.u.cl->length->ts.kind = gfc_charlen_int_kind;
5203 gfc_simplify_expr (e->ts.u.cl->length, 0);
5204 gfc_resolve_expr (e->ts.u.cl->length);
5206 return;
5210 /* Ensure that an character expression has a charlen and, if possible, a
5211 length expression. */
5213 static void
5214 fixup_charlen (gfc_expr *e)
5216 /* The cases fall through so that changes in expression type and the need
5217 for multiple fixes are picked up. In all circumstances, a charlen should
5218 be available for the middle end to hang a backend_decl on. */
5219 switch (e->expr_type)
5221 case EXPR_OP:
5222 gfc_resolve_character_operator (e);
5224 case EXPR_ARRAY:
5225 if (e->expr_type == EXPR_ARRAY)
5226 gfc_resolve_character_array_constructor (e);
5228 case EXPR_SUBSTRING:
5229 if (!e->ts.u.cl && e->ref)
5230 gfc_resolve_substring_charlen (e);
5232 default:
5233 if (!e->ts.u.cl)
5234 e->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
5236 break;
5241 /* Update an actual argument to include the passed-object for type-bound
5242 procedures at the right position. */
5244 static gfc_actual_arglist*
5245 update_arglist_pass (gfc_actual_arglist* lst, gfc_expr* po, unsigned argpos,
5246 const char *name)
5248 gcc_assert (argpos > 0);
5250 if (argpos == 1)
5252 gfc_actual_arglist* result;
5254 result = gfc_get_actual_arglist ();
5255 result->expr = po;
5256 result->next = lst;
5257 if (name)
5258 result->name = name;
5260 return result;
5263 if (lst)
5264 lst->next = update_arglist_pass (lst->next, po, argpos - 1, name);
5265 else
5266 lst = update_arglist_pass (NULL, po, argpos - 1, name);
5267 return lst;
5271 /* Extract the passed-object from an EXPR_COMPCALL (a copy of it). */
5273 static gfc_expr*
5274 extract_compcall_passed_object (gfc_expr* e)
5276 gfc_expr* po;
5278 gcc_assert (e->expr_type == EXPR_COMPCALL);
5280 if (e->value.compcall.base_object)
5281 po = gfc_copy_expr (e->value.compcall.base_object);
5282 else
5284 po = gfc_get_expr ();
5285 po->expr_type = EXPR_VARIABLE;
5286 po->symtree = e->symtree;
5287 po->ref = gfc_copy_ref (e->ref);
5288 po->where = e->where;
5291 if (!gfc_resolve_expr (po))
5292 return NULL;
5294 return po;
5298 /* Update the arglist of an EXPR_COMPCALL expression to include the
5299 passed-object. */
5301 static bool
5302 update_compcall_arglist (gfc_expr* e)
5304 gfc_expr* po;
5305 gfc_typebound_proc* tbp;
5307 tbp = e->value.compcall.tbp;
5309 if (tbp->error)
5310 return false;
5312 po = extract_compcall_passed_object (e);
5313 if (!po)
5314 return false;
5316 if (tbp->nopass || e->value.compcall.ignore_pass)
5318 gfc_free_expr (po);
5319 return true;
5322 gcc_assert (tbp->pass_arg_num > 0);
5323 e->value.compcall.actual = update_arglist_pass (e->value.compcall.actual, po,
5324 tbp->pass_arg_num,
5325 tbp->pass_arg);
5327 return true;
5331 /* Extract the passed object from a PPC call (a copy of it). */
5333 static gfc_expr*
5334 extract_ppc_passed_object (gfc_expr *e)
5336 gfc_expr *po;
5337 gfc_ref **ref;
5339 po = gfc_get_expr ();
5340 po->expr_type = EXPR_VARIABLE;
5341 po->symtree = e->symtree;
5342 po->ref = gfc_copy_ref (e->ref);
5343 po->where = e->where;
5345 /* Remove PPC reference. */
5346 ref = &po->ref;
5347 while ((*ref)->next)
5348 ref = &(*ref)->next;
5349 gfc_free_ref_list (*ref);
5350 *ref = NULL;
5352 if (!gfc_resolve_expr (po))
5353 return NULL;
5355 return po;
5359 /* Update the actual arglist of a procedure pointer component to include the
5360 passed-object. */
5362 static bool
5363 update_ppc_arglist (gfc_expr* e)
5365 gfc_expr* po;
5366 gfc_component *ppc;
5367 gfc_typebound_proc* tb;
5369 ppc = gfc_get_proc_ptr_comp (e);
5370 if (!ppc)
5371 return false;
5373 tb = ppc->tb;
5375 if (tb->error)
5376 return false;
5377 else if (tb->nopass)
5378 return true;
5380 po = extract_ppc_passed_object (e);
5381 if (!po)
5382 return false;
5384 /* F08:R739. */
5385 if (po->rank != 0)
5387 gfc_error ("Passed-object at %L must be scalar", &e->where);
5388 return false;
5391 /* F08:C611. */
5392 if (po->ts.type == BT_DERIVED && po->ts.u.derived->attr.abstract)
5394 gfc_error ("Base object for procedure-pointer component call at %L is of"
5395 " ABSTRACT type '%s'", &e->where, po->ts.u.derived->name);
5396 return false;
5399 gcc_assert (tb->pass_arg_num > 0);
5400 e->value.compcall.actual = update_arglist_pass (e->value.compcall.actual, po,
5401 tb->pass_arg_num,
5402 tb->pass_arg);
5404 return true;
5408 /* Check that the object a TBP is called on is valid, i.e. it must not be
5409 of ABSTRACT type (as in subobject%abstract_parent%tbp()). */
5411 static bool
5412 check_typebound_baseobject (gfc_expr* e)
5414 gfc_expr* base;
5415 bool return_value = false;
5417 base = extract_compcall_passed_object (e);
5418 if (!base)
5419 return false;
5421 gcc_assert (base->ts.type == BT_DERIVED || base->ts.type == BT_CLASS);
5423 if (base->ts.type == BT_CLASS && !gfc_expr_attr (base).class_ok)
5424 return false;
5426 /* F08:C611. */
5427 if (base->ts.type == BT_DERIVED && base->ts.u.derived->attr.abstract)
5429 gfc_error ("Base object for type-bound procedure call at %L is of"
5430 " ABSTRACT type '%s'", &e->where, base->ts.u.derived->name);
5431 goto cleanup;
5434 /* F08:C1230. If the procedure called is NOPASS,
5435 the base object must be scalar. */
5436 if (e->value.compcall.tbp->nopass && base->rank != 0)
5438 gfc_error ("Base object for NOPASS type-bound procedure call at %L must"
5439 " be scalar", &e->where);
5440 goto cleanup;
5443 return_value = true;
5445 cleanup:
5446 gfc_free_expr (base);
5447 return return_value;
5451 /* Resolve a call to a type-bound procedure, either function or subroutine,
5452 statically from the data in an EXPR_COMPCALL expression. The adapted
5453 arglist and the target-procedure symtree are returned. */
5455 static bool
5456 resolve_typebound_static (gfc_expr* e, gfc_symtree** target,
5457 gfc_actual_arglist** actual)
5459 gcc_assert (e->expr_type == EXPR_COMPCALL);
5460 gcc_assert (!e->value.compcall.tbp->is_generic);
5462 /* Update the actual arglist for PASS. */
5463 if (!update_compcall_arglist (e))
5464 return false;
5466 *actual = e->value.compcall.actual;
5467 *target = e->value.compcall.tbp->u.specific;
5469 gfc_free_ref_list (e->ref);
5470 e->ref = NULL;
5471 e->value.compcall.actual = NULL;
5473 /* If we find a deferred typebound procedure, check for derived types
5474 that an overriding typebound procedure has not been missed. */
5475 if (e->value.compcall.name
5476 && !e->value.compcall.tbp->non_overridable
5477 && e->value.compcall.base_object
5478 && e->value.compcall.base_object->ts.type == BT_DERIVED)
5480 gfc_symtree *st;
5481 gfc_symbol *derived;
5483 /* Use the derived type of the base_object. */
5484 derived = e->value.compcall.base_object->ts.u.derived;
5485 st = NULL;
5487 /* If necessary, go through the inheritance chain. */
5488 while (!st && derived)
5490 /* Look for the typebound procedure 'name'. */
5491 if (derived->f2k_derived && derived->f2k_derived->tb_sym_root)
5492 st = gfc_find_symtree (derived->f2k_derived->tb_sym_root,
5493 e->value.compcall.name);
5494 if (!st)
5495 derived = gfc_get_derived_super_type (derived);
5498 /* Now find the specific name in the derived type namespace. */
5499 if (st && st->n.tb && st->n.tb->u.specific)
5500 gfc_find_sym_tree (st->n.tb->u.specific->name,
5501 derived->ns, 1, &st);
5502 if (st)
5503 *target = st;
5505 return true;
5509 /* Get the ultimate declared type from an expression. In addition,
5510 return the last class/derived type reference and the copy of the
5511 reference list. If check_types is set true, derived types are
5512 identified as well as class references. */
5513 static gfc_symbol*
5514 get_declared_from_expr (gfc_ref **class_ref, gfc_ref **new_ref,
5515 gfc_expr *e, bool check_types)
5517 gfc_symbol *declared;
5518 gfc_ref *ref;
5520 declared = NULL;
5521 if (class_ref)
5522 *class_ref = NULL;
5523 if (new_ref)
5524 *new_ref = gfc_copy_ref (e->ref);
5526 for (ref = e->ref; ref; ref = ref->next)
5528 if (ref->type != REF_COMPONENT)
5529 continue;
5531 if ((ref->u.c.component->ts.type == BT_CLASS
5532 || (check_types && ref->u.c.component->ts.type == BT_DERIVED))
5533 && ref->u.c.component->attr.flavor != FL_PROCEDURE)
5535 declared = ref->u.c.component->ts.u.derived;
5536 if (class_ref)
5537 *class_ref = ref;
5541 if (declared == NULL)
5542 declared = e->symtree->n.sym->ts.u.derived;
5544 return declared;
5548 /* Given an EXPR_COMPCALL calling a GENERIC typebound procedure, figure out
5549 which of the specific bindings (if any) matches the arglist and transform
5550 the expression into a call of that binding. */
5552 static bool
5553 resolve_typebound_generic_call (gfc_expr* e, const char **name)
5555 gfc_typebound_proc* genproc;
5556 const char* genname;
5557 gfc_symtree *st;
5558 gfc_symbol *derived;
5560 gcc_assert (e->expr_type == EXPR_COMPCALL);
5561 genname = e->value.compcall.name;
5562 genproc = e->value.compcall.tbp;
5564 if (!genproc->is_generic)
5565 return true;
5567 /* Try the bindings on this type and in the inheritance hierarchy. */
5568 for (; genproc; genproc = genproc->overridden)
5570 gfc_tbp_generic* g;
5572 gcc_assert (genproc->is_generic);
5573 for (g = genproc->u.generic; g; g = g->next)
5575 gfc_symbol* target;
5576 gfc_actual_arglist* args;
5577 bool matches;
5579 gcc_assert (g->specific);
5581 if (g->specific->error)
5582 continue;
5584 target = g->specific->u.specific->n.sym;
5586 /* Get the right arglist by handling PASS/NOPASS. */
5587 args = gfc_copy_actual_arglist (e->value.compcall.actual);
5588 if (!g->specific->nopass)
5590 gfc_expr* po;
5591 po = extract_compcall_passed_object (e);
5592 if (!po)
5594 gfc_free_actual_arglist (args);
5595 return false;
5598 gcc_assert (g->specific->pass_arg_num > 0);
5599 gcc_assert (!g->specific->error);
5600 args = update_arglist_pass (args, po, g->specific->pass_arg_num,
5601 g->specific->pass_arg);
5603 resolve_actual_arglist (args, target->attr.proc,
5604 is_external_proc (target)
5605 && gfc_sym_get_dummy_args (target) == NULL);
5607 /* Check if this arglist matches the formal. */
5608 matches = gfc_arglist_matches_symbol (&args, target);
5610 /* Clean up and break out of the loop if we've found it. */
5611 gfc_free_actual_arglist (args);
5612 if (matches)
5614 e->value.compcall.tbp = g->specific;
5615 genname = g->specific_st->name;
5616 /* Pass along the name for CLASS methods, where the vtab
5617 procedure pointer component has to be referenced. */
5618 if (name)
5619 *name = genname;
5620 goto success;
5625 /* Nothing matching found! */
5626 gfc_error ("Found no matching specific binding for the call to the GENERIC"
5627 " '%s' at %L", genname, &e->where);
5628 return false;
5630 success:
5631 /* Make sure that we have the right specific instance for the name. */
5632 derived = get_declared_from_expr (NULL, NULL, e, true);
5634 st = gfc_find_typebound_proc (derived, NULL, genname, true, &e->where);
5635 if (st)
5636 e->value.compcall.tbp = st->n.tb;
5638 return true;
5642 /* Resolve a call to a type-bound subroutine. */
5644 static bool
5645 resolve_typebound_call (gfc_code* c, const char **name)
5647 gfc_actual_arglist* newactual;
5648 gfc_symtree* target;
5650 /* Check that's really a SUBROUTINE. */
5651 if (!c->expr1->value.compcall.tbp->subroutine)
5653 gfc_error ("'%s' at %L should be a SUBROUTINE",
5654 c->expr1->value.compcall.name, &c->loc);
5655 return false;
5658 if (!check_typebound_baseobject (c->expr1))
5659 return false;
5661 /* Pass along the name for CLASS methods, where the vtab
5662 procedure pointer component has to be referenced. */
5663 if (name)
5664 *name = c->expr1->value.compcall.name;
5666 if (!resolve_typebound_generic_call (c->expr1, name))
5667 return false;
5669 /* Transform into an ordinary EXEC_CALL for now. */
5671 if (!resolve_typebound_static (c->expr1, &target, &newactual))
5672 return false;
5674 c->ext.actual = newactual;
5675 c->symtree = target;
5676 c->op = (c->expr1->value.compcall.assign ? EXEC_ASSIGN_CALL : EXEC_CALL);
5678 gcc_assert (!c->expr1->ref && !c->expr1->value.compcall.actual);
5680 gfc_free_expr (c->expr1);
5681 c->expr1 = gfc_get_expr ();
5682 c->expr1->expr_type = EXPR_FUNCTION;
5683 c->expr1->symtree = target;
5684 c->expr1->where = c->loc;
5686 return resolve_call (c);
5690 /* Resolve a component-call expression. */
5691 static bool
5692 resolve_compcall (gfc_expr* e, const char **name)
5694 gfc_actual_arglist* newactual;
5695 gfc_symtree* target;
5697 /* Check that's really a FUNCTION. */
5698 if (!e->value.compcall.tbp->function)
5700 gfc_error ("'%s' at %L should be a FUNCTION",
5701 e->value.compcall.name, &e->where);
5702 return false;
5705 /* These must not be assign-calls! */
5706 gcc_assert (!e->value.compcall.assign);
5708 if (!check_typebound_baseobject (e))
5709 return false;
5711 /* Pass along the name for CLASS methods, where the vtab
5712 procedure pointer component has to be referenced. */
5713 if (name)
5714 *name = e->value.compcall.name;
5716 if (!resolve_typebound_generic_call (e, name))
5717 return false;
5718 gcc_assert (!e->value.compcall.tbp->is_generic);
5720 /* Take the rank from the function's symbol. */
5721 if (e->value.compcall.tbp->u.specific->n.sym->as)
5722 e->rank = e->value.compcall.tbp->u.specific->n.sym->as->rank;
5724 /* For now, we simply transform it into an EXPR_FUNCTION call with the same
5725 arglist to the TBP's binding target. */
5727 if (!resolve_typebound_static (e, &target, &newactual))
5728 return false;
5730 e->value.function.actual = newactual;
5731 e->value.function.name = NULL;
5732 e->value.function.esym = target->n.sym;
5733 e->value.function.isym = NULL;
5734 e->symtree = target;
5735 e->ts = target->n.sym->ts;
5736 e->expr_type = EXPR_FUNCTION;
5738 /* Resolution is not necessary if this is a class subroutine; this
5739 function only has to identify the specific proc. Resolution of
5740 the call will be done next in resolve_typebound_call. */
5741 return gfc_resolve_expr (e);
5745 static bool resolve_fl_derived (gfc_symbol *sym);
5748 /* Resolve a typebound function, or 'method'. First separate all
5749 the non-CLASS references by calling resolve_compcall directly. */
5751 static bool
5752 resolve_typebound_function (gfc_expr* e)
5754 gfc_symbol *declared;
5755 gfc_component *c;
5756 gfc_ref *new_ref;
5757 gfc_ref *class_ref;
5758 gfc_symtree *st;
5759 const char *name;
5760 gfc_typespec ts;
5761 gfc_expr *expr;
5762 bool overridable;
5764 st = e->symtree;
5766 /* Deal with typebound operators for CLASS objects. */
5767 expr = e->value.compcall.base_object;
5768 overridable = !e->value.compcall.tbp->non_overridable;
5769 if (expr && expr->ts.type == BT_CLASS && e->value.compcall.name)
5771 /* If the base_object is not a variable, the corresponding actual
5772 argument expression must be stored in e->base_expression so
5773 that the corresponding tree temporary can be used as the base
5774 object in gfc_conv_procedure_call. */
5775 if (expr->expr_type != EXPR_VARIABLE)
5777 gfc_actual_arglist *args;
5779 for (args= e->value.function.actual; args; args = args->next)
5781 if (expr == args->expr)
5782 expr = args->expr;
5786 /* Since the typebound operators are generic, we have to ensure
5787 that any delays in resolution are corrected and that the vtab
5788 is present. */
5789 ts = expr->ts;
5790 declared = ts.u.derived;
5791 c = gfc_find_component (declared, "_vptr", true, true);
5792 if (c->ts.u.derived == NULL)
5793 c->ts.u.derived = gfc_find_derived_vtab (declared);
5795 if (!resolve_compcall (e, &name))
5796 return false;
5798 /* Use the generic name if it is there. */
5799 name = name ? name : e->value.function.esym->name;
5800 e->symtree = expr->symtree;
5801 e->ref = gfc_copy_ref (expr->ref);
5802 get_declared_from_expr (&class_ref, NULL, e, false);
5804 /* Trim away the extraneous references that emerge from nested
5805 use of interface.c (extend_expr). */
5806 if (class_ref && class_ref->next)
5808 gfc_free_ref_list (class_ref->next);
5809 class_ref->next = NULL;
5811 else if (e->ref && !class_ref)
5813 gfc_free_ref_list (e->ref);
5814 e->ref = NULL;
5817 gfc_add_vptr_component (e);
5818 gfc_add_component_ref (e, name);
5819 e->value.function.esym = NULL;
5820 if (expr->expr_type != EXPR_VARIABLE)
5821 e->base_expr = expr;
5822 return true;
5825 if (st == NULL)
5826 return resolve_compcall (e, NULL);
5828 if (!resolve_ref (e))
5829 return false;
5831 /* Get the CLASS declared type. */
5832 declared = get_declared_from_expr (&class_ref, &new_ref, e, true);
5834 if (!resolve_fl_derived (declared))
5835 return false;
5837 /* Weed out cases of the ultimate component being a derived type. */
5838 if ((class_ref && class_ref->u.c.component->ts.type == BT_DERIVED)
5839 || (!class_ref && st->n.sym->ts.type != BT_CLASS))
5841 gfc_free_ref_list (new_ref);
5842 return resolve_compcall (e, NULL);
5845 c = gfc_find_component (declared, "_data", true, true);
5846 declared = c->ts.u.derived;
5848 /* Treat the call as if it is a typebound procedure, in order to roll
5849 out the correct name for the specific function. */
5850 if (!resolve_compcall (e, &name))
5852 gfc_free_ref_list (new_ref);
5853 return false;
5855 ts = e->ts;
5857 if (overridable)
5859 /* Convert the expression to a procedure pointer component call. */
5860 e->value.function.esym = NULL;
5861 e->symtree = st;
5863 if (new_ref)
5864 e->ref = new_ref;
5866 /* '_vptr' points to the vtab, which contains the procedure pointers. */
5867 gfc_add_vptr_component (e);
5868 gfc_add_component_ref (e, name);
5870 /* Recover the typespec for the expression. This is really only
5871 necessary for generic procedures, where the additional call
5872 to gfc_add_component_ref seems to throw the collection of the
5873 correct typespec. */
5874 e->ts = ts;
5876 else if (new_ref)
5877 gfc_free_ref_list (new_ref);
5879 return true;
5882 /* Resolve a typebound subroutine, or 'method'. First separate all
5883 the non-CLASS references by calling resolve_typebound_call
5884 directly. */
5886 static bool
5887 resolve_typebound_subroutine (gfc_code *code)
5889 gfc_symbol *declared;
5890 gfc_component *c;
5891 gfc_ref *new_ref;
5892 gfc_ref *class_ref;
5893 gfc_symtree *st;
5894 const char *name;
5895 gfc_typespec ts;
5896 gfc_expr *expr;
5897 bool overridable;
5899 st = code->expr1->symtree;
5901 /* Deal with typebound operators for CLASS objects. */
5902 expr = code->expr1->value.compcall.base_object;
5903 overridable = !code->expr1->value.compcall.tbp->non_overridable;
5904 if (expr && expr->ts.type == BT_CLASS && code->expr1->value.compcall.name)
5906 /* If the base_object is not a variable, the corresponding actual
5907 argument expression must be stored in e->base_expression so
5908 that the corresponding tree temporary can be used as the base
5909 object in gfc_conv_procedure_call. */
5910 if (expr->expr_type != EXPR_VARIABLE)
5912 gfc_actual_arglist *args;
5914 args= code->expr1->value.function.actual;
5915 for (; args; args = args->next)
5916 if (expr == args->expr)
5917 expr = args->expr;
5920 /* Since the typebound operators are generic, we have to ensure
5921 that any delays in resolution are corrected and that the vtab
5922 is present. */
5923 declared = expr->ts.u.derived;
5924 c = gfc_find_component (declared, "_vptr", true, true);
5925 if (c->ts.u.derived == NULL)
5926 c->ts.u.derived = gfc_find_derived_vtab (declared);
5928 if (!resolve_typebound_call (code, &name))
5929 return false;
5931 /* Use the generic name if it is there. */
5932 name = name ? name : code->expr1->value.function.esym->name;
5933 code->expr1->symtree = expr->symtree;
5934 code->expr1->ref = gfc_copy_ref (expr->ref);
5936 /* Trim away the extraneous references that emerge from nested
5937 use of interface.c (extend_expr). */
5938 get_declared_from_expr (&class_ref, NULL, code->expr1, false);
5939 if (class_ref && class_ref->next)
5941 gfc_free_ref_list (class_ref->next);
5942 class_ref->next = NULL;
5944 else if (code->expr1->ref && !class_ref)
5946 gfc_free_ref_list (code->expr1->ref);
5947 code->expr1->ref = NULL;
5950 /* Now use the procedure in the vtable. */
5951 gfc_add_vptr_component (code->expr1);
5952 gfc_add_component_ref (code->expr1, name);
5953 code->expr1->value.function.esym = NULL;
5954 if (expr->expr_type != EXPR_VARIABLE)
5955 code->expr1->base_expr = expr;
5956 return true;
5959 if (st == NULL)
5960 return resolve_typebound_call (code, NULL);
5962 if (!resolve_ref (code->expr1))
5963 return false;
5965 /* Get the CLASS declared type. */
5966 get_declared_from_expr (&class_ref, &new_ref, code->expr1, true);
5968 /* Weed out cases of the ultimate component being a derived type. */
5969 if ((class_ref && class_ref->u.c.component->ts.type == BT_DERIVED)
5970 || (!class_ref && st->n.sym->ts.type != BT_CLASS))
5972 gfc_free_ref_list (new_ref);
5973 return resolve_typebound_call (code, NULL);
5976 if (!resolve_typebound_call (code, &name))
5978 gfc_free_ref_list (new_ref);
5979 return false;
5981 ts = code->expr1->ts;
5983 if (overridable)
5985 /* Convert the expression to a procedure pointer component call. */
5986 code->expr1->value.function.esym = NULL;
5987 code->expr1->symtree = st;
5989 if (new_ref)
5990 code->expr1->ref = new_ref;
5992 /* '_vptr' points to the vtab, which contains the procedure pointers. */
5993 gfc_add_vptr_component (code->expr1);
5994 gfc_add_component_ref (code->expr1, name);
5996 /* Recover the typespec for the expression. This is really only
5997 necessary for generic procedures, where the additional call
5998 to gfc_add_component_ref seems to throw the collection of the
5999 correct typespec. */
6000 code->expr1->ts = ts;
6002 else if (new_ref)
6003 gfc_free_ref_list (new_ref);
6005 return true;
6009 /* Resolve a CALL to a Procedure Pointer Component (Subroutine). */
6011 static bool
6012 resolve_ppc_call (gfc_code* c)
6014 gfc_component *comp;
6016 comp = gfc_get_proc_ptr_comp (c->expr1);
6017 gcc_assert (comp != NULL);
6019 c->resolved_sym = c->expr1->symtree->n.sym;
6020 c->expr1->expr_type = EXPR_VARIABLE;
6022 if (!comp->attr.subroutine)
6023 gfc_add_subroutine (&comp->attr, comp->name, &c->expr1->where);
6025 if (!resolve_ref (c->expr1))
6026 return false;
6028 if (!update_ppc_arglist (c->expr1))
6029 return false;
6031 c->ext.actual = c->expr1->value.compcall.actual;
6033 if (!resolve_actual_arglist (c->ext.actual, comp->attr.proc,
6034 !(comp->ts.interface
6035 && comp->ts.interface->formal)))
6036 return false;
6038 gfc_ppc_use (comp, &c->expr1->value.compcall.actual, &c->expr1->where);
6040 return true;
6044 /* Resolve a Function Call to a Procedure Pointer Component (Function). */
6046 static bool
6047 resolve_expr_ppc (gfc_expr* e)
6049 gfc_component *comp;
6051 comp = gfc_get_proc_ptr_comp (e);
6052 gcc_assert (comp != NULL);
6054 /* Convert to EXPR_FUNCTION. */
6055 e->expr_type = EXPR_FUNCTION;
6056 e->value.function.isym = NULL;
6057 e->value.function.actual = e->value.compcall.actual;
6058 e->ts = comp->ts;
6059 if (comp->as != NULL)
6060 e->rank = comp->as->rank;
6062 if (!comp->attr.function)
6063 gfc_add_function (&comp->attr, comp->name, &e->where);
6065 if (!resolve_ref (e))
6066 return false;
6068 if (!resolve_actual_arglist (e->value.function.actual, comp->attr.proc,
6069 !(comp->ts.interface
6070 && comp->ts.interface->formal)))
6071 return false;
6073 if (!update_ppc_arglist (e))
6074 return false;
6076 gfc_ppc_use (comp, &e->value.compcall.actual, &e->where);
6078 return true;
6082 static bool
6083 gfc_is_expandable_expr (gfc_expr *e)
6085 gfc_constructor *con;
6087 if (e->expr_type == EXPR_ARRAY)
6089 /* Traverse the constructor looking for variables that are flavor
6090 parameter. Parameters must be expanded since they are fully used at
6091 compile time. */
6092 con = gfc_constructor_first (e->value.constructor);
6093 for (; con; con = gfc_constructor_next (con))
6095 if (con->expr->expr_type == EXPR_VARIABLE
6096 && con->expr->symtree
6097 && (con->expr->symtree->n.sym->attr.flavor == FL_PARAMETER
6098 || con->expr->symtree->n.sym->attr.flavor == FL_VARIABLE))
6099 return true;
6100 if (con->expr->expr_type == EXPR_ARRAY
6101 && gfc_is_expandable_expr (con->expr))
6102 return true;
6106 return false;
6109 /* Resolve an expression. That is, make sure that types of operands agree
6110 with their operators, intrinsic operators are converted to function calls
6111 for overloaded types and unresolved function references are resolved. */
6113 bool
6114 gfc_resolve_expr (gfc_expr *e)
6116 bool t;
6117 bool inquiry_save, actual_arg_save, first_actual_arg_save;
6119 if (e == NULL)
6120 return true;
6122 /* inquiry_argument only applies to variables. */
6123 inquiry_save = inquiry_argument;
6124 actual_arg_save = actual_arg;
6125 first_actual_arg_save = first_actual_arg;
6127 if (e->expr_type != EXPR_VARIABLE)
6129 inquiry_argument = false;
6130 actual_arg = false;
6131 first_actual_arg = false;
6134 switch (e->expr_type)
6136 case EXPR_OP:
6137 t = resolve_operator (e);
6138 break;
6140 case EXPR_FUNCTION:
6141 case EXPR_VARIABLE:
6143 if (check_host_association (e))
6144 t = resolve_function (e);
6145 else
6146 t = resolve_variable (e);
6148 if (e->ts.type == BT_CHARACTER && e->ts.u.cl == NULL && e->ref
6149 && e->ref->type != REF_SUBSTRING)
6150 gfc_resolve_substring_charlen (e);
6152 break;
6154 case EXPR_COMPCALL:
6155 t = resolve_typebound_function (e);
6156 break;
6158 case EXPR_SUBSTRING:
6159 t = resolve_ref (e);
6160 break;
6162 case EXPR_CONSTANT:
6163 case EXPR_NULL:
6164 t = true;
6165 break;
6167 case EXPR_PPC:
6168 t = resolve_expr_ppc (e);
6169 break;
6171 case EXPR_ARRAY:
6172 t = false;
6173 if (!resolve_ref (e))
6174 break;
6176 t = gfc_resolve_array_constructor (e);
6177 /* Also try to expand a constructor. */
6178 if (t)
6180 expression_rank (e);
6181 if (gfc_is_constant_expr (e) || gfc_is_expandable_expr (e))
6182 gfc_expand_constructor (e, false);
6185 /* This provides the opportunity for the length of constructors with
6186 character valued function elements to propagate the string length
6187 to the expression. */
6188 if (t && e->ts.type == BT_CHARACTER)
6190 /* For efficiency, we call gfc_expand_constructor for BT_CHARACTER
6191 here rather then add a duplicate test for it above. */
6192 gfc_expand_constructor (e, false);
6193 t = gfc_resolve_character_array_constructor (e);
6196 break;
6198 case EXPR_STRUCTURE:
6199 t = resolve_ref (e);
6200 if (!t)
6201 break;
6203 t = resolve_structure_cons (e, 0);
6204 if (!t)
6205 break;
6207 t = gfc_simplify_expr (e, 0);
6208 break;
6210 default:
6211 gfc_internal_error ("gfc_resolve_expr(): Bad expression type");
6214 if (e->ts.type == BT_CHARACTER && t && !e->ts.u.cl)
6215 fixup_charlen (e);
6217 inquiry_argument = inquiry_save;
6218 actual_arg = actual_arg_save;
6219 first_actual_arg = first_actual_arg_save;
6221 return t;
6225 /* Resolve an expression from an iterator. They must be scalar and have
6226 INTEGER or (optionally) REAL type. */
6228 static bool
6229 gfc_resolve_iterator_expr (gfc_expr *expr, bool real_ok,
6230 const char *name_msgid)
6232 if (!gfc_resolve_expr (expr))
6233 return false;
6235 if (expr->rank != 0)
6237 gfc_error ("%s at %L must be a scalar", _(name_msgid), &expr->where);
6238 return false;
6241 if (expr->ts.type != BT_INTEGER)
6243 if (expr->ts.type == BT_REAL)
6245 if (real_ok)
6246 return gfc_notify_std (GFC_STD_F95_DEL,
6247 "%s at %L must be integer",
6248 _(name_msgid), &expr->where);
6249 else
6251 gfc_error ("%s at %L must be INTEGER", _(name_msgid),
6252 &expr->where);
6253 return false;
6256 else
6258 gfc_error ("%s at %L must be INTEGER", _(name_msgid), &expr->where);
6259 return false;
6262 return true;
6266 /* Resolve the expressions in an iterator structure. If REAL_OK is
6267 false allow only INTEGER type iterators, otherwise allow REAL types.
6268 Set own_scope to true for ac-implied-do and data-implied-do as those
6269 have a separate scope such that, e.g., a INTENT(IN) doesn't apply. */
6271 bool
6272 gfc_resolve_iterator (gfc_iterator *iter, bool real_ok, bool own_scope)
6274 if (!gfc_resolve_iterator_expr (iter->var, real_ok, "Loop variable"))
6275 return false;
6277 if (!gfc_check_vardef_context (iter->var, false, false, own_scope,
6278 _("iterator variable")))
6279 return false;
6281 if (!gfc_resolve_iterator_expr (iter->start, real_ok,
6282 "Start expression in DO loop"))
6283 return false;
6285 if (!gfc_resolve_iterator_expr (iter->end, real_ok,
6286 "End expression in DO loop"))
6287 return false;
6289 if (!gfc_resolve_iterator_expr (iter->step, real_ok,
6290 "Step expression in DO loop"))
6291 return false;
6293 if (iter->step->expr_type == EXPR_CONSTANT)
6295 if ((iter->step->ts.type == BT_INTEGER
6296 && mpz_cmp_ui (iter->step->value.integer, 0) == 0)
6297 || (iter->step->ts.type == BT_REAL
6298 && mpfr_sgn (iter->step->value.real) == 0))
6300 gfc_error ("Step expression in DO loop at %L cannot be zero",
6301 &iter->step->where);
6302 return false;
6306 /* Convert start, end, and step to the same type as var. */
6307 if (iter->start->ts.kind != iter->var->ts.kind
6308 || iter->start->ts.type != iter->var->ts.type)
6309 gfc_convert_type (iter->start, &iter->var->ts, 2);
6311 if (iter->end->ts.kind != iter->var->ts.kind
6312 || iter->end->ts.type != iter->var->ts.type)
6313 gfc_convert_type (iter->end, &iter->var->ts, 2);
6315 if (iter->step->ts.kind != iter->var->ts.kind
6316 || iter->step->ts.type != iter->var->ts.type)
6317 gfc_convert_type (iter->step, &iter->var->ts, 2);
6319 if (iter->start->expr_type == EXPR_CONSTANT
6320 && iter->end->expr_type == EXPR_CONSTANT
6321 && iter->step->expr_type == EXPR_CONSTANT)
6323 int sgn, cmp;
6324 if (iter->start->ts.type == BT_INTEGER)
6326 sgn = mpz_cmp_ui (iter->step->value.integer, 0);
6327 cmp = mpz_cmp (iter->end->value.integer, iter->start->value.integer);
6329 else
6331 sgn = mpfr_sgn (iter->step->value.real);
6332 cmp = mpfr_cmp (iter->end->value.real, iter->start->value.real);
6334 if (gfc_option.warn_zerotrip &&
6335 ((sgn > 0 && cmp < 0) || (sgn < 0 && cmp > 0)))
6336 gfc_warning ("DO loop at %L will be executed zero times"
6337 " (use -Wno-zerotrip to suppress)",
6338 &iter->step->where);
6341 return true;
6345 /* Traversal function for find_forall_index. f == 2 signals that
6346 that variable itself is not to be checked - only the references. */
6348 static bool
6349 forall_index (gfc_expr *expr, gfc_symbol *sym, int *f)
6351 if (expr->expr_type != EXPR_VARIABLE)
6352 return false;
6354 /* A scalar assignment */
6355 if (!expr->ref || *f == 1)
6357 if (expr->symtree->n.sym == sym)
6358 return true;
6359 else
6360 return false;
6363 if (*f == 2)
6364 *f = 1;
6365 return false;
6369 /* Check whether the FORALL index appears in the expression or not.
6370 Returns true if SYM is found in EXPR. */
6372 bool
6373 find_forall_index (gfc_expr *expr, gfc_symbol *sym, int f)
6375 if (gfc_traverse_expr (expr, sym, forall_index, f))
6376 return true;
6377 else
6378 return false;
6382 /* Resolve a list of FORALL iterators. The FORALL index-name is constrained
6383 to be a scalar INTEGER variable. The subscripts and stride are scalar
6384 INTEGERs, and if stride is a constant it must be nonzero.
6385 Furthermore "A subscript or stride in a forall-triplet-spec shall
6386 not contain a reference to any index-name in the
6387 forall-triplet-spec-list in which it appears." (7.5.4.1) */
6389 static void
6390 resolve_forall_iterators (gfc_forall_iterator *it)
6392 gfc_forall_iterator *iter, *iter2;
6394 for (iter = it; iter; iter = iter->next)
6396 if (gfc_resolve_expr (iter->var)
6397 && (iter->var->ts.type != BT_INTEGER || iter->var->rank != 0))
6398 gfc_error ("FORALL index-name at %L must be a scalar INTEGER",
6399 &iter->var->where);
6401 if (gfc_resolve_expr (iter->start)
6402 && (iter->start->ts.type != BT_INTEGER || iter->start->rank != 0))
6403 gfc_error ("FORALL start expression at %L must be a scalar INTEGER",
6404 &iter->start->where);
6405 if (iter->var->ts.kind != iter->start->ts.kind)
6406 gfc_convert_type (iter->start, &iter->var->ts, 1);
6408 if (gfc_resolve_expr (iter->end)
6409 && (iter->end->ts.type != BT_INTEGER || iter->end->rank != 0))
6410 gfc_error ("FORALL end expression at %L must be a scalar INTEGER",
6411 &iter->end->where);
6412 if (iter->var->ts.kind != iter->end->ts.kind)
6413 gfc_convert_type (iter->end, &iter->var->ts, 1);
6415 if (gfc_resolve_expr (iter->stride))
6417 if (iter->stride->ts.type != BT_INTEGER || iter->stride->rank != 0)
6418 gfc_error ("FORALL stride expression at %L must be a scalar %s",
6419 &iter->stride->where, "INTEGER");
6421 if (iter->stride->expr_type == EXPR_CONSTANT
6422 && mpz_cmp_ui (iter->stride->value.integer, 0) == 0)
6423 gfc_error ("FORALL stride expression at %L cannot be zero",
6424 &iter->stride->where);
6426 if (iter->var->ts.kind != iter->stride->ts.kind)
6427 gfc_convert_type (iter->stride, &iter->var->ts, 1);
6430 for (iter = it; iter; iter = iter->next)
6431 for (iter2 = iter; iter2; iter2 = iter2->next)
6433 if (find_forall_index (iter2->start, iter->var->symtree->n.sym, 0)
6434 || find_forall_index (iter2->end, iter->var->symtree->n.sym, 0)
6435 || find_forall_index (iter2->stride, iter->var->symtree->n.sym, 0))
6436 gfc_error ("FORALL index '%s' may not appear in triplet "
6437 "specification at %L", iter->var->symtree->name,
6438 &iter2->start->where);
6443 /* Given a pointer to a symbol that is a derived type, see if it's
6444 inaccessible, i.e. if it's defined in another module and the components are
6445 PRIVATE. The search is recursive if necessary. Returns zero if no
6446 inaccessible components are found, nonzero otherwise. */
6448 static int
6449 derived_inaccessible (gfc_symbol *sym)
6451 gfc_component *c;
6453 if (sym->attr.use_assoc && sym->attr.private_comp)
6454 return 1;
6456 for (c = sym->components; c; c = c->next)
6458 if (c->ts.type == BT_DERIVED && derived_inaccessible (c->ts.u.derived))
6459 return 1;
6462 return 0;
6466 /* Resolve the argument of a deallocate expression. The expression must be
6467 a pointer or a full array. */
6469 static bool
6470 resolve_deallocate_expr (gfc_expr *e)
6472 symbol_attribute attr;
6473 int allocatable, pointer;
6474 gfc_ref *ref;
6475 gfc_symbol *sym;
6476 gfc_component *c;
6477 bool unlimited;
6479 if (!gfc_resolve_expr (e))
6480 return false;
6482 if (e->expr_type != EXPR_VARIABLE)
6483 goto bad;
6485 sym = e->symtree->n.sym;
6486 unlimited = UNLIMITED_POLY(sym);
6488 if (sym->ts.type == BT_CLASS)
6490 allocatable = CLASS_DATA (sym)->attr.allocatable;
6491 pointer = CLASS_DATA (sym)->attr.class_pointer;
6493 else
6495 allocatable = sym->attr.allocatable;
6496 pointer = sym->attr.pointer;
6498 for (ref = e->ref; ref; ref = ref->next)
6500 switch (ref->type)
6502 case REF_ARRAY:
6503 if (ref->u.ar.type != AR_FULL
6504 && !(ref->u.ar.type == AR_ELEMENT && ref->u.ar.as->rank == 0
6505 && ref->u.ar.codimen && gfc_ref_this_image (ref)))
6506 allocatable = 0;
6507 break;
6509 case REF_COMPONENT:
6510 c = ref->u.c.component;
6511 if (c->ts.type == BT_CLASS)
6513 allocatable = CLASS_DATA (c)->attr.allocatable;
6514 pointer = CLASS_DATA (c)->attr.class_pointer;
6516 else
6518 allocatable = c->attr.allocatable;
6519 pointer = c->attr.pointer;
6521 break;
6523 case REF_SUBSTRING:
6524 allocatable = 0;
6525 break;
6529 attr = gfc_expr_attr (e);
6531 if (allocatable == 0 && attr.pointer == 0 && !unlimited)
6533 bad:
6534 gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",
6535 &e->where);
6536 return false;
6539 /* F2008, C644. */
6540 if (gfc_is_coindexed (e))
6542 gfc_error ("Coindexed allocatable object at %L", &e->where);
6543 return false;
6546 if (pointer
6547 && !gfc_check_vardef_context (e, true, true, false,
6548 _("DEALLOCATE object")))
6549 return false;
6550 if (!gfc_check_vardef_context (e, false, true, false,
6551 _("DEALLOCATE object")))
6552 return false;
6554 return true;
6558 /* Returns true if the expression e contains a reference to the symbol sym. */
6559 static bool
6560 sym_in_expr (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
6562 if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym == sym)
6563 return true;
6565 return false;
6568 bool
6569 gfc_find_sym_in_expr (gfc_symbol *sym, gfc_expr *e)
6571 return gfc_traverse_expr (e, sym, sym_in_expr, 0);
6575 /* Given the expression node e for an allocatable/pointer of derived type to be
6576 allocated, get the expression node to be initialized afterwards (needed for
6577 derived types with default initializers, and derived types with allocatable
6578 components that need nullification.) */
6580 gfc_expr *
6581 gfc_expr_to_initialize (gfc_expr *e)
6583 gfc_expr *result;
6584 gfc_ref *ref;
6585 int i;
6587 result = gfc_copy_expr (e);
6589 /* Change the last array reference from AR_ELEMENT to AR_FULL. */
6590 for (ref = result->ref; ref; ref = ref->next)
6591 if (ref->type == REF_ARRAY && ref->next == NULL)
6593 ref->u.ar.type = AR_FULL;
6595 for (i = 0; i < ref->u.ar.dimen; i++)
6596 ref->u.ar.start[i] = ref->u.ar.end[i] = ref->u.ar.stride[i] = NULL;
6598 break;
6601 gfc_free_shape (&result->shape, result->rank);
6603 /* Recalculate rank, shape, etc. */
6604 gfc_resolve_expr (result);
6605 return result;
6609 /* If the last ref of an expression is an array ref, return a copy of the
6610 expression with that one removed. Otherwise, a copy of the original
6611 expression. This is used for allocate-expressions and pointer assignment
6612 LHS, where there may be an array specification that needs to be stripped
6613 off when using gfc_check_vardef_context. */
6615 static gfc_expr*
6616 remove_last_array_ref (gfc_expr* e)
6618 gfc_expr* e2;
6619 gfc_ref** r;
6621 e2 = gfc_copy_expr (e);
6622 for (r = &e2->ref; *r; r = &(*r)->next)
6623 if ((*r)->type == REF_ARRAY && !(*r)->next)
6625 gfc_free_ref_list (*r);
6626 *r = NULL;
6627 break;
6630 return e2;
6634 /* Used in resolve_allocate_expr to check that a allocation-object and
6635 a source-expr are conformable. This does not catch all possible
6636 cases; in particular a runtime checking is needed. */
6638 static bool
6639 conformable_arrays (gfc_expr *e1, gfc_expr *e2)
6641 gfc_ref *tail;
6642 for (tail = e2->ref; tail && tail->next; tail = tail->next);
6644 /* First compare rank. */
6645 if ((tail && e1->rank != tail->u.ar.as->rank)
6646 || (!tail && e1->rank != e2->rank))
6648 gfc_error ("Source-expr at %L must be scalar or have the "
6649 "same rank as the allocate-object at %L",
6650 &e1->where, &e2->where);
6651 return false;
6654 if (e1->shape)
6656 int i;
6657 mpz_t s;
6659 mpz_init (s);
6661 for (i = 0; i < e1->rank; i++)
6663 if (tail->u.ar.start[i] == NULL)
6664 break;
6666 if (tail->u.ar.end[i])
6668 mpz_set (s, tail->u.ar.end[i]->value.integer);
6669 mpz_sub (s, s, tail->u.ar.start[i]->value.integer);
6670 mpz_add_ui (s, s, 1);
6672 else
6674 mpz_set (s, tail->u.ar.start[i]->value.integer);
6677 if (mpz_cmp (e1->shape[i], s) != 0)
6679 gfc_error ("Source-expr at %L and allocate-object at %L must "
6680 "have the same shape", &e1->where, &e2->where);
6681 mpz_clear (s);
6682 return false;
6686 mpz_clear (s);
6689 return true;
6693 /* Resolve the expression in an ALLOCATE statement, doing the additional
6694 checks to see whether the expression is OK or not. The expression must
6695 have a trailing array reference that gives the size of the array. */
6697 static bool
6698 resolve_allocate_expr (gfc_expr *e, gfc_code *code)
6700 int i, pointer, allocatable, dimension, is_abstract;
6701 int codimension;
6702 bool coindexed;
6703 bool unlimited;
6704 symbol_attribute attr;
6705 gfc_ref *ref, *ref2;
6706 gfc_expr *e2;
6707 gfc_array_ref *ar;
6708 gfc_symbol *sym = NULL;
6709 gfc_alloc *a;
6710 gfc_component *c;
6711 bool t;
6713 /* Mark the utmost array component as being in allocate to allow DIMEN_STAR
6714 checking of coarrays. */
6715 for (ref = e->ref; ref; ref = ref->next)
6716 if (ref->next == NULL)
6717 break;
6719 if (ref && ref->type == REF_ARRAY)
6720 ref->u.ar.in_allocate = true;
6722 if (!gfc_resolve_expr (e))
6723 goto failure;
6725 /* Make sure the expression is allocatable or a pointer. If it is
6726 pointer, the next-to-last reference must be a pointer. */
6728 ref2 = NULL;
6729 if (e->symtree)
6730 sym = e->symtree->n.sym;
6732 /* Check whether ultimate component is abstract and CLASS. */
6733 is_abstract = 0;
6735 /* Is the allocate-object unlimited polymorphic? */
6736 unlimited = UNLIMITED_POLY(e);
6738 if (e->expr_type != EXPR_VARIABLE)
6740 allocatable = 0;
6741 attr = gfc_expr_attr (e);
6742 pointer = attr.pointer;
6743 dimension = attr.dimension;
6744 codimension = attr.codimension;
6746 else
6748 if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
6750 allocatable = CLASS_DATA (sym)->attr.allocatable;
6751 pointer = CLASS_DATA (sym)->attr.class_pointer;
6752 dimension = CLASS_DATA (sym)->attr.dimension;
6753 codimension = CLASS_DATA (sym)->attr.codimension;
6754 is_abstract = CLASS_DATA (sym)->attr.abstract;
6756 else
6758 allocatable = sym->attr.allocatable;
6759 pointer = sym->attr.pointer;
6760 dimension = sym->attr.dimension;
6761 codimension = sym->attr.codimension;
6764 coindexed = false;
6766 for (ref = e->ref; ref; ref2 = ref, ref = ref->next)
6768 switch (ref->type)
6770 case REF_ARRAY:
6771 if (ref->u.ar.codimen > 0)
6773 int n;
6774 for (n = ref->u.ar.dimen;
6775 n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
6776 if (ref->u.ar.dimen_type[n] != DIMEN_THIS_IMAGE)
6778 coindexed = true;
6779 break;
6783 if (ref->next != NULL)
6784 pointer = 0;
6785 break;
6787 case REF_COMPONENT:
6788 /* F2008, C644. */
6789 if (coindexed)
6791 gfc_error ("Coindexed allocatable object at %L",
6792 &e->where);
6793 goto failure;
6796 c = ref->u.c.component;
6797 if (c->ts.type == BT_CLASS)
6799 allocatable = CLASS_DATA (c)->attr.allocatable;
6800 pointer = CLASS_DATA (c)->attr.class_pointer;
6801 dimension = CLASS_DATA (c)->attr.dimension;
6802 codimension = CLASS_DATA (c)->attr.codimension;
6803 is_abstract = CLASS_DATA (c)->attr.abstract;
6805 else
6807 allocatable = c->attr.allocatable;
6808 pointer = c->attr.pointer;
6809 dimension = c->attr.dimension;
6810 codimension = c->attr.codimension;
6811 is_abstract = c->attr.abstract;
6813 break;
6815 case REF_SUBSTRING:
6816 allocatable = 0;
6817 pointer = 0;
6818 break;
6823 /* Check for F08:C628. */
6824 if (allocatable == 0 && pointer == 0 && !unlimited)
6826 gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",
6827 &e->where);
6828 goto failure;
6831 /* Some checks for the SOURCE tag. */
6832 if (code->expr3)
6834 /* Check F03:C631. */
6835 if (!gfc_type_compatible (&e->ts, &code->expr3->ts))
6837 gfc_error ("Type of entity at %L is type incompatible with "
6838 "source-expr at %L", &e->where, &code->expr3->where);
6839 goto failure;
6842 /* Check F03:C632 and restriction following Note 6.18. */
6843 if (code->expr3->rank > 0 && !conformable_arrays (code->expr3, e))
6844 goto failure;
6846 /* Check F03:C633. */
6847 if (code->expr3->ts.kind != e->ts.kind && !unlimited)
6849 gfc_error ("The allocate-object at %L and the source-expr at %L "
6850 "shall have the same kind type parameter",
6851 &e->where, &code->expr3->where);
6852 goto failure;
6855 /* Check F2008, C642. */
6856 if (code->expr3->ts.type == BT_DERIVED
6857 && ((codimension && gfc_expr_attr (code->expr3).lock_comp)
6858 || (code->expr3->ts.u.derived->from_intmod
6859 == INTMOD_ISO_FORTRAN_ENV
6860 && code->expr3->ts.u.derived->intmod_sym_id
6861 == ISOFORTRAN_LOCK_TYPE)))
6863 gfc_error ("The source-expr at %L shall neither be of type "
6864 "LOCK_TYPE nor have a LOCK_TYPE component if "
6865 "allocate-object at %L is a coarray",
6866 &code->expr3->where, &e->where);
6867 goto failure;
6871 /* Check F08:C629. */
6872 if (is_abstract && code->ext.alloc.ts.type == BT_UNKNOWN
6873 && !code->expr3)
6875 gcc_assert (e->ts.type == BT_CLASS);
6876 gfc_error ("Allocating %s of ABSTRACT base type at %L requires a "
6877 "type-spec or source-expr", sym->name, &e->where);
6878 goto failure;
6881 if (code->ext.alloc.ts.type == BT_CHARACTER && !e->ts.deferred)
6883 int cmp = gfc_dep_compare_expr (e->ts.u.cl->length,
6884 code->ext.alloc.ts.u.cl->length);
6885 if (cmp == 1 || cmp == -1 || cmp == -3)
6887 gfc_error ("Allocating %s at %L with type-spec requires the same "
6888 "character-length parameter as in the declaration",
6889 sym->name, &e->where);
6890 goto failure;
6894 /* In the variable definition context checks, gfc_expr_attr is used
6895 on the expression. This is fooled by the array specification
6896 present in e, thus we have to eliminate that one temporarily. */
6897 e2 = remove_last_array_ref (e);
6898 t = true;
6899 if (t && pointer)
6900 t = gfc_check_vardef_context (e2, true, true, false,
6901 _("ALLOCATE object"));
6902 if (t)
6903 t = gfc_check_vardef_context (e2, false, true, false,
6904 _("ALLOCATE object"));
6905 gfc_free_expr (e2);
6906 if (!t)
6907 goto failure;
6909 if (e->ts.type == BT_CLASS && CLASS_DATA (e)->attr.dimension
6910 && !code->expr3 && code->ext.alloc.ts.type == BT_DERIVED)
6912 /* For class arrays, the initialization with SOURCE is done
6913 using _copy and trans_call. It is convenient to exploit that
6914 when the allocated type is different from the declared type but
6915 no SOURCE exists by setting expr3. */
6916 code->expr3 = gfc_default_initializer (&code->ext.alloc.ts);
6918 else if (!code->expr3)
6920 /* Set up default initializer if needed. */
6921 gfc_typespec ts;
6922 gfc_expr *init_e;
6924 if (code->ext.alloc.ts.type == BT_DERIVED)
6925 ts = code->ext.alloc.ts;
6926 else
6927 ts = e->ts;
6929 if (ts.type == BT_CLASS)
6930 ts = ts.u.derived->components->ts;
6932 if (ts.type == BT_DERIVED && (init_e = gfc_default_initializer (&ts)))
6934 gfc_code *init_st = gfc_get_code (EXEC_INIT_ASSIGN);
6935 init_st->loc = code->loc;
6936 init_st->expr1 = gfc_expr_to_initialize (e);
6937 init_st->expr2 = init_e;
6938 init_st->next = code->next;
6939 code->next = init_st;
6942 else if (code->expr3->mold && code->expr3->ts.type == BT_DERIVED)
6944 /* Default initialization via MOLD (non-polymorphic). */
6945 gfc_expr *rhs = gfc_default_initializer (&code->expr3->ts);
6946 gfc_resolve_expr (rhs);
6947 gfc_free_expr (code->expr3);
6948 code->expr3 = rhs;
6951 if (e->ts.type == BT_CLASS && !unlimited && !UNLIMITED_POLY (code->expr3))
6953 /* Make sure the vtab symbol is present when
6954 the module variables are generated. */
6955 gfc_typespec ts = e->ts;
6956 if (code->expr3)
6957 ts = code->expr3->ts;
6958 else if (code->ext.alloc.ts.type == BT_DERIVED)
6959 ts = code->ext.alloc.ts;
6961 gfc_find_derived_vtab (ts.u.derived);
6963 if (dimension)
6964 e = gfc_expr_to_initialize (e);
6966 else if (unlimited && !UNLIMITED_POLY (code->expr3))
6968 /* Again, make sure the vtab symbol is present when
6969 the module variables are generated. */
6970 gfc_typespec *ts = NULL;
6971 if (code->expr3)
6972 ts = &code->expr3->ts;
6973 else
6974 ts = &code->ext.alloc.ts;
6976 gcc_assert (ts);
6978 gfc_find_vtab (ts);
6980 if (dimension)
6981 e = gfc_expr_to_initialize (e);
6984 if (dimension == 0 && codimension == 0)
6985 goto success;
6987 /* Make sure the last reference node is an array specification. */
6989 if (!ref2 || ref2->type != REF_ARRAY || ref2->u.ar.type == AR_FULL
6990 || (dimension && ref2->u.ar.dimen == 0))
6992 gfc_error ("Array specification required in ALLOCATE statement "
6993 "at %L", &e->where);
6994 goto failure;
6997 /* Make sure that the array section reference makes sense in the
6998 context of an ALLOCATE specification. */
7000 ar = &ref2->u.ar;
7002 if (codimension)
7003 for (i = ar->dimen; i < ar->dimen + ar->codimen; i++)
7004 if (ar->dimen_type[i] == DIMEN_THIS_IMAGE)
7006 gfc_error ("Coarray specification required in ALLOCATE statement "
7007 "at %L", &e->where);
7008 goto failure;
7011 for (i = 0; i < ar->dimen; i++)
7013 if (ref2->u.ar.type == AR_ELEMENT)
7014 goto check_symbols;
7016 switch (ar->dimen_type[i])
7018 case DIMEN_ELEMENT:
7019 break;
7021 case DIMEN_RANGE:
7022 if (ar->start[i] != NULL
7023 && ar->end[i] != NULL
7024 && ar->stride[i] == NULL)
7025 break;
7027 /* Fall Through... */
7029 case DIMEN_UNKNOWN:
7030 case DIMEN_VECTOR:
7031 case DIMEN_STAR:
7032 case DIMEN_THIS_IMAGE:
7033 gfc_error ("Bad array specification in ALLOCATE statement at %L",
7034 &e->where);
7035 goto failure;
7038 check_symbols:
7039 for (a = code->ext.alloc.list; a; a = a->next)
7041 sym = a->expr->symtree->n.sym;
7043 /* TODO - check derived type components. */
7044 if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
7045 continue;
7047 if ((ar->start[i] != NULL
7048 && gfc_find_sym_in_expr (sym, ar->start[i]))
7049 || (ar->end[i] != NULL
7050 && gfc_find_sym_in_expr (sym, ar->end[i])))
7052 gfc_error ("'%s' must not appear in the array specification at "
7053 "%L in the same ALLOCATE statement where it is "
7054 "itself allocated", sym->name, &ar->where);
7055 goto failure;
7060 for (i = ar->dimen; i < ar->codimen + ar->dimen; i++)
7062 if (ar->dimen_type[i] == DIMEN_ELEMENT
7063 || ar->dimen_type[i] == DIMEN_RANGE)
7065 if (i == (ar->dimen + ar->codimen - 1))
7067 gfc_error ("Expected '*' in coindex specification in ALLOCATE "
7068 "statement at %L", &e->where);
7069 goto failure;
7071 continue;
7074 if (ar->dimen_type[i] == DIMEN_STAR && i == (ar->dimen + ar->codimen - 1)
7075 && ar->stride[i] == NULL)
7076 break;
7078 gfc_error ("Bad coarray specification in ALLOCATE statement at %L",
7079 &e->where);
7080 goto failure;
7083 success:
7084 return true;
7086 failure:
7087 return false;
7090 static void
7091 resolve_allocate_deallocate (gfc_code *code, const char *fcn)
7093 gfc_expr *stat, *errmsg, *pe, *qe;
7094 gfc_alloc *a, *p, *q;
7096 stat = code->expr1;
7097 errmsg = code->expr2;
7099 /* Check the stat variable. */
7100 if (stat)
7102 gfc_check_vardef_context (stat, false, false, false,
7103 _("STAT variable"));
7105 if ((stat->ts.type != BT_INTEGER
7106 && !(stat->ref && (stat->ref->type == REF_ARRAY
7107 || stat->ref->type == REF_COMPONENT)))
7108 || stat->rank > 0)
7109 gfc_error ("Stat-variable at %L must be a scalar INTEGER "
7110 "variable", &stat->where);
7112 for (p = code->ext.alloc.list; p; p = p->next)
7113 if (p->expr->symtree->n.sym->name == stat->symtree->n.sym->name)
7115 gfc_ref *ref1, *ref2;
7116 bool found = true;
7118 for (ref1 = p->expr->ref, ref2 = stat->ref; ref1 && ref2;
7119 ref1 = ref1->next, ref2 = ref2->next)
7121 if (ref1->type != REF_COMPONENT || ref2->type != REF_COMPONENT)
7122 continue;
7123 if (ref1->u.c.component->name != ref2->u.c.component->name)
7125 found = false;
7126 break;
7130 if (found)
7132 gfc_error ("Stat-variable at %L shall not be %sd within "
7133 "the same %s statement", &stat->where, fcn, fcn);
7134 break;
7139 /* Check the errmsg variable. */
7140 if (errmsg)
7142 if (!stat)
7143 gfc_warning ("ERRMSG at %L is useless without a STAT tag",
7144 &errmsg->where);
7146 gfc_check_vardef_context (errmsg, false, false, false,
7147 _("ERRMSG variable"));
7149 if ((errmsg->ts.type != BT_CHARACTER
7150 && !(errmsg->ref
7151 && (errmsg->ref->type == REF_ARRAY
7152 || errmsg->ref->type == REF_COMPONENT)))
7153 || errmsg->rank > 0 )
7154 gfc_error ("Errmsg-variable at %L must be a scalar CHARACTER "
7155 "variable", &errmsg->where);
7157 for (p = code->ext.alloc.list; p; p = p->next)
7158 if (p->expr->symtree->n.sym->name == errmsg->symtree->n.sym->name)
7160 gfc_ref *ref1, *ref2;
7161 bool found = true;
7163 for (ref1 = p->expr->ref, ref2 = errmsg->ref; ref1 && ref2;
7164 ref1 = ref1->next, ref2 = ref2->next)
7166 if (ref1->type != REF_COMPONENT || ref2->type != REF_COMPONENT)
7167 continue;
7168 if (ref1->u.c.component->name != ref2->u.c.component->name)
7170 found = false;
7171 break;
7175 if (found)
7177 gfc_error ("Errmsg-variable at %L shall not be %sd within "
7178 "the same %s statement", &errmsg->where, fcn, fcn);
7179 break;
7184 /* Check that an allocate-object appears only once in the statement. */
7186 for (p = code->ext.alloc.list; p; p = p->next)
7188 pe = p->expr;
7189 for (q = p->next; q; q = q->next)
7191 qe = q->expr;
7192 if (pe->symtree->n.sym->name == qe->symtree->n.sym->name)
7194 /* This is a potential collision. */
7195 gfc_ref *pr = pe->ref;
7196 gfc_ref *qr = qe->ref;
7198 /* Follow the references until
7199 a) They start to differ, in which case there is no error;
7200 you can deallocate a%b and a%c in a single statement
7201 b) Both of them stop, which is an error
7202 c) One of them stops, which is also an error. */
7203 while (1)
7205 if (pr == NULL && qr == NULL)
7207 gfc_error ("Allocate-object at %L also appears at %L",
7208 &pe->where, &qe->where);
7209 break;
7211 else if (pr != NULL && qr == NULL)
7213 gfc_error ("Allocate-object at %L is subobject of"
7214 " object at %L", &pe->where, &qe->where);
7215 break;
7217 else if (pr == NULL && qr != NULL)
7219 gfc_error ("Allocate-object at %L is subobject of"
7220 " object at %L", &qe->where, &pe->where);
7221 break;
7223 /* Here, pr != NULL && qr != NULL */
7224 gcc_assert(pr->type == qr->type);
7225 if (pr->type == REF_ARRAY)
7227 /* Handle cases like allocate(v(3)%x(3), v(2)%x(3)),
7228 which are legal. */
7229 gcc_assert (qr->type == REF_ARRAY);
7231 if (pr->next && qr->next)
7233 int i;
7234 gfc_array_ref *par = &(pr->u.ar);
7235 gfc_array_ref *qar = &(qr->u.ar);
7237 for (i=0; i<par->dimen; i++)
7239 if ((par->start[i] != NULL
7240 || qar->start[i] != NULL)
7241 && gfc_dep_compare_expr (par->start[i],
7242 qar->start[i]) != 0)
7243 goto break_label;
7247 else
7249 if (pr->u.c.component->name != qr->u.c.component->name)
7250 break;
7253 pr = pr->next;
7254 qr = qr->next;
7256 break_label:
7262 if (strcmp (fcn, "ALLOCATE") == 0)
7264 for (a = code->ext.alloc.list; a; a = a->next)
7265 resolve_allocate_expr (a->expr, code);
7267 else
7269 for (a = code->ext.alloc.list; a; a = a->next)
7270 resolve_deallocate_expr (a->expr);
7275 /************ SELECT CASE resolution subroutines ************/
7277 /* Callback function for our mergesort variant. Determines interval
7278 overlaps for CASEs. Return <0 if op1 < op2, 0 for overlap, >0 for
7279 op1 > op2. Assumes we're not dealing with the default case.
7280 We have op1 = (:L), (K:L) or (K:) and op2 = (:N), (M:N) or (M:).
7281 There are nine situations to check. */
7283 static int
7284 compare_cases (const gfc_case *op1, const gfc_case *op2)
7286 int retval;
7288 if (op1->low == NULL) /* op1 = (:L) */
7290 /* op2 = (:N), so overlap. */
7291 retval = 0;
7292 /* op2 = (M:) or (M:N), L < M */
7293 if (op2->low != NULL
7294 && gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
7295 retval = -1;
7297 else if (op1->high == NULL) /* op1 = (K:) */
7299 /* op2 = (M:), so overlap. */
7300 retval = 0;
7301 /* op2 = (:N) or (M:N), K > N */
7302 if (op2->high != NULL
7303 && gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
7304 retval = 1;
7306 else /* op1 = (K:L) */
7308 if (op2->low == NULL) /* op2 = (:N), K > N */
7309 retval = (gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
7310 ? 1 : 0;
7311 else if (op2->high == NULL) /* op2 = (M:), L < M */
7312 retval = (gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
7313 ? -1 : 0;
7314 else /* op2 = (M:N) */
7316 retval = 0;
7317 /* L < M */
7318 if (gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
7319 retval = -1;
7320 /* K > N */
7321 else if (gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
7322 retval = 1;
7326 return retval;
7330 /* Merge-sort a double linked case list, detecting overlap in the
7331 process. LIST is the head of the double linked case list before it
7332 is sorted. Returns the head of the sorted list if we don't see any
7333 overlap, or NULL otherwise. */
7335 static gfc_case *
7336 check_case_overlap (gfc_case *list)
7338 gfc_case *p, *q, *e, *tail;
7339 int insize, nmerges, psize, qsize, cmp, overlap_seen;
7341 /* If the passed list was empty, return immediately. */
7342 if (!list)
7343 return NULL;
7345 overlap_seen = 0;
7346 insize = 1;
7348 /* Loop unconditionally. The only exit from this loop is a return
7349 statement, when we've finished sorting the case list. */
7350 for (;;)
7352 p = list;
7353 list = NULL;
7354 tail = NULL;
7356 /* Count the number of merges we do in this pass. */
7357 nmerges = 0;
7359 /* Loop while there exists a merge to be done. */
7360 while (p)
7362 int i;
7364 /* Count this merge. */
7365 nmerges++;
7367 /* Cut the list in two pieces by stepping INSIZE places
7368 forward in the list, starting from P. */
7369 psize = 0;
7370 q = p;
7371 for (i = 0; i < insize; i++)
7373 psize++;
7374 q = q->right;
7375 if (!q)
7376 break;
7378 qsize = insize;
7380 /* Now we have two lists. Merge them! */
7381 while (psize > 0 || (qsize > 0 && q != NULL))
7383 /* See from which the next case to merge comes from. */
7384 if (psize == 0)
7386 /* P is empty so the next case must come from Q. */
7387 e = q;
7388 q = q->right;
7389 qsize--;
7391 else if (qsize == 0 || q == NULL)
7393 /* Q is empty. */
7394 e = p;
7395 p = p->right;
7396 psize--;
7398 else
7400 cmp = compare_cases (p, q);
7401 if (cmp < 0)
7403 /* The whole case range for P is less than the
7404 one for Q. */
7405 e = p;
7406 p = p->right;
7407 psize--;
7409 else if (cmp > 0)
7411 /* The whole case range for Q is greater than
7412 the case range for P. */
7413 e = q;
7414 q = q->right;
7415 qsize--;
7417 else
7419 /* The cases overlap, or they are the same
7420 element in the list. Either way, we must
7421 issue an error and get the next case from P. */
7422 /* FIXME: Sort P and Q by line number. */
7423 gfc_error ("CASE label at %L overlaps with CASE "
7424 "label at %L", &p->where, &q->where);
7425 overlap_seen = 1;
7426 e = p;
7427 p = p->right;
7428 psize--;
7432 /* Add the next element to the merged list. */
7433 if (tail)
7434 tail->right = e;
7435 else
7436 list = e;
7437 e->left = tail;
7438 tail = e;
7441 /* P has now stepped INSIZE places along, and so has Q. So
7442 they're the same. */
7443 p = q;
7445 tail->right = NULL;
7447 /* If we have done only one merge or none at all, we've
7448 finished sorting the cases. */
7449 if (nmerges <= 1)
7451 if (!overlap_seen)
7452 return list;
7453 else
7454 return NULL;
7457 /* Otherwise repeat, merging lists twice the size. */
7458 insize *= 2;
7463 /* Check to see if an expression is suitable for use in a CASE statement.
7464 Makes sure that all case expressions are scalar constants of the same
7465 type. Return false if anything is wrong. */
7467 static bool
7468 validate_case_label_expr (gfc_expr *e, gfc_expr *case_expr)
7470 if (e == NULL) return true;
7472 if (e->ts.type != case_expr->ts.type)
7474 gfc_error ("Expression in CASE statement at %L must be of type %s",
7475 &e->where, gfc_basic_typename (case_expr->ts.type));
7476 return false;
7479 /* C805 (R808) For a given case-construct, each case-value shall be of
7480 the same type as case-expr. For character type, length differences
7481 are allowed, but the kind type parameters shall be the same. */
7483 if (case_expr->ts.type == BT_CHARACTER && e->ts.kind != case_expr->ts.kind)
7485 gfc_error ("Expression in CASE statement at %L must be of kind %d",
7486 &e->where, case_expr->ts.kind);
7487 return false;
7490 /* Convert the case value kind to that of case expression kind,
7491 if needed */
7493 if (e->ts.kind != case_expr->ts.kind)
7494 gfc_convert_type_warn (e, &case_expr->ts, 2, 0);
7496 if (e->rank != 0)
7498 gfc_error ("Expression in CASE statement at %L must be scalar",
7499 &e->where);
7500 return false;
7503 return true;
7507 /* Given a completely parsed select statement, we:
7509 - Validate all expressions and code within the SELECT.
7510 - Make sure that the selection expression is not of the wrong type.
7511 - Make sure that no case ranges overlap.
7512 - Eliminate unreachable cases and unreachable code resulting from
7513 removing case labels.
7515 The standard does allow unreachable cases, e.g. CASE (5:3). But
7516 they are a hassle for code generation, and to prevent that, we just
7517 cut them out here. This is not necessary for overlapping cases
7518 because they are illegal and we never even try to generate code.
7520 We have the additional caveat that a SELECT construct could have
7521 been a computed GOTO in the source code. Fortunately we can fairly
7522 easily work around that here: The case_expr for a "real" SELECT CASE
7523 is in code->expr1, but for a computed GOTO it is in code->expr2. All
7524 we have to do is make sure that the case_expr is a scalar integer
7525 expression. */
7527 static void
7528 resolve_select (gfc_code *code, bool select_type)
7530 gfc_code *body;
7531 gfc_expr *case_expr;
7532 gfc_case *cp, *default_case, *tail, *head;
7533 int seen_unreachable;
7534 int seen_logical;
7535 int ncases;
7536 bt type;
7537 bool t;
7539 if (code->expr1 == NULL)
7541 /* This was actually a computed GOTO statement. */
7542 case_expr = code->expr2;
7543 if (case_expr->ts.type != BT_INTEGER|| case_expr->rank != 0)
7544 gfc_error ("Selection expression in computed GOTO statement "
7545 "at %L must be a scalar integer expression",
7546 &case_expr->where);
7548 /* Further checking is not necessary because this SELECT was built
7549 by the compiler, so it should always be OK. Just move the
7550 case_expr from expr2 to expr so that we can handle computed
7551 GOTOs as normal SELECTs from here on. */
7552 code->expr1 = code->expr2;
7553 code->expr2 = NULL;
7554 return;
7557 case_expr = code->expr1;
7558 type = case_expr->ts.type;
7560 /* F08:C830. */
7561 if (type != BT_LOGICAL && type != BT_INTEGER && type != BT_CHARACTER)
7563 gfc_error ("Argument of SELECT statement at %L cannot be %s",
7564 &case_expr->where, gfc_typename (&case_expr->ts));
7566 /* Punt. Going on here just produce more garbage error messages. */
7567 return;
7570 /* F08:R842. */
7571 if (!select_type && case_expr->rank != 0)
7573 gfc_error ("Argument of SELECT statement at %L must be a scalar "
7574 "expression", &case_expr->where);
7576 /* Punt. */
7577 return;
7580 /* Raise a warning if an INTEGER case value exceeds the range of
7581 the case-expr. Later, all expressions will be promoted to the
7582 largest kind of all case-labels. */
7584 if (type == BT_INTEGER)
7585 for (body = code->block; body; body = body->block)
7586 for (cp = body->ext.block.case_list; cp; cp = cp->next)
7588 if (cp->low
7589 && gfc_check_integer_range (cp->low->value.integer,
7590 case_expr->ts.kind) != ARITH_OK)
7591 gfc_warning ("Expression in CASE statement at %L is "
7592 "not in the range of %s", &cp->low->where,
7593 gfc_typename (&case_expr->ts));
7595 if (cp->high
7596 && cp->low != cp->high
7597 && gfc_check_integer_range (cp->high->value.integer,
7598 case_expr->ts.kind) != ARITH_OK)
7599 gfc_warning ("Expression in CASE statement at %L is "
7600 "not in the range of %s", &cp->high->where,
7601 gfc_typename (&case_expr->ts));
7604 /* PR 19168 has a long discussion concerning a mismatch of the kinds
7605 of the SELECT CASE expression and its CASE values. Walk the lists
7606 of case values, and if we find a mismatch, promote case_expr to
7607 the appropriate kind. */
7609 if (type == BT_LOGICAL || type == BT_INTEGER)
7611 for (body = code->block; body; body = body->block)
7613 /* Walk the case label list. */
7614 for (cp = body->ext.block.case_list; cp; cp = cp->next)
7616 /* Intercept the DEFAULT case. It does not have a kind. */
7617 if (cp->low == NULL && cp->high == NULL)
7618 continue;
7620 /* Unreachable case ranges are discarded, so ignore. */
7621 if (cp->low != NULL && cp->high != NULL
7622 && cp->low != cp->high
7623 && gfc_compare_expr (cp->low, cp->high, INTRINSIC_GT) > 0)
7624 continue;
7626 if (cp->low != NULL
7627 && case_expr->ts.kind != gfc_kind_max(case_expr, cp->low))
7628 gfc_convert_type_warn (case_expr, &cp->low->ts, 2, 0);
7630 if (cp->high != NULL
7631 && case_expr->ts.kind != gfc_kind_max(case_expr, cp->high))
7632 gfc_convert_type_warn (case_expr, &cp->high->ts, 2, 0);
7637 /* Assume there is no DEFAULT case. */
7638 default_case = NULL;
7639 head = tail = NULL;
7640 ncases = 0;
7641 seen_logical = 0;
7643 for (body = code->block; body; body = body->block)
7645 /* Assume the CASE list is OK, and all CASE labels can be matched. */
7646 t = true;
7647 seen_unreachable = 0;
7649 /* Walk the case label list, making sure that all case labels
7650 are legal. */
7651 for (cp = body->ext.block.case_list; cp; cp = cp->next)
7653 /* Count the number of cases in the whole construct. */
7654 ncases++;
7656 /* Intercept the DEFAULT case. */
7657 if (cp->low == NULL && cp->high == NULL)
7659 if (default_case != NULL)
7661 gfc_error ("The DEFAULT CASE at %L cannot be followed "
7662 "by a second DEFAULT CASE at %L",
7663 &default_case->where, &cp->where);
7664 t = false;
7665 break;
7667 else
7669 default_case = cp;
7670 continue;
7674 /* Deal with single value cases and case ranges. Errors are
7675 issued from the validation function. */
7676 if (!validate_case_label_expr (cp->low, case_expr)
7677 || !validate_case_label_expr (cp->high, case_expr))
7679 t = false;
7680 break;
7683 if (type == BT_LOGICAL
7684 && ((cp->low == NULL || cp->high == NULL)
7685 || cp->low != cp->high))
7687 gfc_error ("Logical range in CASE statement at %L is not "
7688 "allowed", &cp->low->where);
7689 t = false;
7690 break;
7693 if (type == BT_LOGICAL && cp->low->expr_type == EXPR_CONSTANT)
7695 int value;
7696 value = cp->low->value.logical == 0 ? 2 : 1;
7697 if (value & seen_logical)
7699 gfc_error ("Constant logical value in CASE statement "
7700 "is repeated at %L",
7701 &cp->low->where);
7702 t = false;
7703 break;
7705 seen_logical |= value;
7708 if (cp->low != NULL && cp->high != NULL
7709 && cp->low != cp->high
7710 && gfc_compare_expr (cp->low, cp->high, INTRINSIC_GT) > 0)
7712 if (gfc_option.warn_surprising)
7713 gfc_warning ("Range specification at %L can never "
7714 "be matched", &cp->where);
7716 cp->unreachable = 1;
7717 seen_unreachable = 1;
7719 else
7721 /* If the case range can be matched, it can also overlap with
7722 other cases. To make sure it does not, we put it in a
7723 double linked list here. We sort that with a merge sort
7724 later on to detect any overlapping cases. */
7725 if (!head)
7727 head = tail = cp;
7728 head->right = head->left = NULL;
7730 else
7732 tail->right = cp;
7733 tail->right->left = tail;
7734 tail = tail->right;
7735 tail->right = NULL;
7740 /* It there was a failure in the previous case label, give up
7741 for this case label list. Continue with the next block. */
7742 if (!t)
7743 continue;
7745 /* See if any case labels that are unreachable have been seen.
7746 If so, we eliminate them. This is a bit of a kludge because
7747 the case lists for a single case statement (label) is a
7748 single forward linked lists. */
7749 if (seen_unreachable)
7751 /* Advance until the first case in the list is reachable. */
7752 while (body->ext.block.case_list != NULL
7753 && body->ext.block.case_list->unreachable)
7755 gfc_case *n = body->ext.block.case_list;
7756 body->ext.block.case_list = body->ext.block.case_list->next;
7757 n->next = NULL;
7758 gfc_free_case_list (n);
7761 /* Strip all other unreachable cases. */
7762 if (body->ext.block.case_list)
7764 for (cp = body->ext.block.case_list; cp && cp->next; cp = cp->next)
7766 if (cp->next->unreachable)
7768 gfc_case *n = cp->next;
7769 cp->next = cp->next->next;
7770 n->next = NULL;
7771 gfc_free_case_list (n);
7778 /* See if there were overlapping cases. If the check returns NULL,
7779 there was overlap. In that case we don't do anything. If head
7780 is non-NULL, we prepend the DEFAULT case. The sorted list can
7781 then used during code generation for SELECT CASE constructs with
7782 a case expression of a CHARACTER type. */
7783 if (head)
7785 head = check_case_overlap (head);
7787 /* Prepend the default_case if it is there. */
7788 if (head != NULL && default_case)
7790 default_case->left = NULL;
7791 default_case->right = head;
7792 head->left = default_case;
7796 /* Eliminate dead blocks that may be the result if we've seen
7797 unreachable case labels for a block. */
7798 for (body = code; body && body->block; body = body->block)
7800 if (body->block->ext.block.case_list == NULL)
7802 /* Cut the unreachable block from the code chain. */
7803 gfc_code *c = body->block;
7804 body->block = c->block;
7806 /* Kill the dead block, but not the blocks below it. */
7807 c->block = NULL;
7808 gfc_free_statements (c);
7812 /* More than two cases is legal but insane for logical selects.
7813 Issue a warning for it. */
7814 if (gfc_option.warn_surprising && type == BT_LOGICAL
7815 && ncases > 2)
7816 gfc_warning ("Logical SELECT CASE block at %L has more that two cases",
7817 &code->loc);
7821 /* Check if a derived type is extensible. */
7823 bool
7824 gfc_type_is_extensible (gfc_symbol *sym)
7826 return !(sym->attr.is_bind_c || sym->attr.sequence
7827 || (sym->attr.is_class
7828 && sym->components->ts.u.derived->attr.unlimited_polymorphic));
7832 /* Resolve an associate-name: Resolve target and ensure the type-spec is
7833 correct as well as possibly the array-spec. */
7835 static void
7836 resolve_assoc_var (gfc_symbol* sym, bool resolve_target)
7838 gfc_expr* target;
7840 gcc_assert (sym->assoc);
7841 gcc_assert (sym->attr.flavor == FL_VARIABLE);
7843 /* If this is for SELECT TYPE, the target may not yet be set. In that
7844 case, return. Resolution will be called later manually again when
7845 this is done. */
7846 target = sym->assoc->target;
7847 if (!target)
7848 return;
7849 gcc_assert (!sym->assoc->dangling);
7851 if (resolve_target && !gfc_resolve_expr (target))
7852 return;
7854 /* For variable targets, we get some attributes from the target. */
7855 if (target->expr_type == EXPR_VARIABLE)
7857 gfc_symbol* tsym;
7859 gcc_assert (target->symtree);
7860 tsym = target->symtree->n.sym;
7862 sym->attr.asynchronous = tsym->attr.asynchronous;
7863 sym->attr.volatile_ = tsym->attr.volatile_;
7865 sym->attr.target = tsym->attr.target
7866 || gfc_expr_attr (target).pointer;
7867 if (is_subref_array (target))
7868 sym->attr.subref_array_pointer = 1;
7871 /* Get type if this was not already set. Note that it can be
7872 some other type than the target in case this is a SELECT TYPE
7873 selector! So we must not update when the type is already there. */
7874 if (sym->ts.type == BT_UNKNOWN)
7875 sym->ts = target->ts;
7876 gcc_assert (sym->ts.type != BT_UNKNOWN);
7878 /* See if this is a valid association-to-variable. */
7879 sym->assoc->variable = (target->expr_type == EXPR_VARIABLE
7880 && !gfc_has_vector_subscript (target));
7882 /* Finally resolve if this is an array or not. */
7883 if (sym->attr.dimension && target->rank == 0)
7885 gfc_error ("Associate-name '%s' at %L is used as array",
7886 sym->name, &sym->declared_at);
7887 sym->attr.dimension = 0;
7888 return;
7891 /* We cannot deal with class selectors that need temporaries. */
7892 if (target->ts.type == BT_CLASS
7893 && gfc_ref_needs_temporary_p (target->ref))
7895 gfc_error ("CLASS selector at %L needs a temporary which is not "
7896 "yet implemented", &target->where);
7897 return;
7900 if (target->ts.type != BT_CLASS && target->rank > 0)
7901 sym->attr.dimension = 1;
7902 else if (target->ts.type == BT_CLASS)
7903 gfc_fix_class_refs (target);
7905 /* The associate-name will have a correct type by now. Make absolutely
7906 sure that it has not picked up a dimension attribute. */
7907 if (sym->ts.type == BT_CLASS)
7908 sym->attr.dimension = 0;
7910 if (sym->attr.dimension)
7912 sym->as = gfc_get_array_spec ();
7913 sym->as->rank = target->rank;
7914 sym->as->type = AS_DEFERRED;
7915 sym->as->corank = gfc_get_corank (target);
7918 /* Mark this as an associate variable. */
7919 sym->attr.associate_var = 1;
7921 /* If the target is a good class object, so is the associate variable. */
7922 if (sym->ts.type == BT_CLASS && gfc_expr_attr (target).class_ok)
7923 sym->attr.class_ok = 1;
7927 /* Resolve a SELECT TYPE statement. */
7929 static void
7930 resolve_select_type (gfc_code *code, gfc_namespace *old_ns)
7932 gfc_symbol *selector_type;
7933 gfc_code *body, *new_st, *if_st, *tail;
7934 gfc_code *class_is = NULL, *default_case = NULL;
7935 gfc_case *c;
7936 gfc_symtree *st;
7937 char name[GFC_MAX_SYMBOL_LEN];
7938 gfc_namespace *ns;
7939 int error = 0;
7940 int charlen = 0;
7942 ns = code->ext.block.ns;
7943 gfc_resolve (ns);
7945 /* Check for F03:C813. */
7946 if (code->expr1->ts.type != BT_CLASS
7947 && !(code->expr2 && code->expr2->ts.type == BT_CLASS))
7949 gfc_error ("Selector shall be polymorphic in SELECT TYPE statement "
7950 "at %L", &code->loc);
7951 return;
7954 if (!code->expr1->symtree->n.sym->attr.class_ok)
7955 return;
7957 if (code->expr2)
7959 if (code->expr1->symtree->n.sym->attr.untyped)
7960 code->expr1->symtree->n.sym->ts = code->expr2->ts;
7961 selector_type = CLASS_DATA (code->expr2)->ts.u.derived;
7963 /* F2008: C803 The selector expression must not be coindexed. */
7964 if (gfc_is_coindexed (code->expr2))
7966 gfc_error ("Selector at %L must not be coindexed",
7967 &code->expr2->where);
7968 return;
7972 else
7974 selector_type = CLASS_DATA (code->expr1)->ts.u.derived;
7976 if (gfc_is_coindexed (code->expr1))
7978 gfc_error ("Selector at %L must not be coindexed",
7979 &code->expr1->where);
7980 return;
7984 /* Loop over TYPE IS / CLASS IS cases. */
7985 for (body = code->block; body; body = body->block)
7987 c = body->ext.block.case_list;
7989 /* Check F03:C815. */
7990 if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
7991 && !selector_type->attr.unlimited_polymorphic
7992 && !gfc_type_is_extensible (c->ts.u.derived))
7994 gfc_error ("Derived type '%s' at %L must be extensible",
7995 c->ts.u.derived->name, &c->where);
7996 error++;
7997 continue;
8000 /* Check F03:C816. */
8001 if (c->ts.type != BT_UNKNOWN && !selector_type->attr.unlimited_polymorphic
8002 && ((c->ts.type != BT_DERIVED && c->ts.type != BT_CLASS)
8003 || !gfc_type_is_extension_of (selector_type, c->ts.u.derived)))
8005 if (c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
8006 gfc_error ("Derived type '%s' at %L must be an extension of '%s'",
8007 c->ts.u.derived->name, &c->where, selector_type->name);
8008 else
8009 gfc_error ("Unexpected intrinsic type '%s' at %L",
8010 gfc_basic_typename (c->ts.type), &c->where);
8011 error++;
8012 continue;
8015 /* Check F03:C814. */
8016 if (c->ts.type == BT_CHARACTER && c->ts.u.cl->length != NULL)
8018 gfc_error ("The type-spec at %L shall specify that each length "
8019 "type parameter is assumed", &c->where);
8020 error++;
8021 continue;
8024 /* Intercept the DEFAULT case. */
8025 if (c->ts.type == BT_UNKNOWN)
8027 /* Check F03:C818. */
8028 if (default_case)
8030 gfc_error ("The DEFAULT CASE at %L cannot be followed "
8031 "by a second DEFAULT CASE at %L",
8032 &default_case->ext.block.case_list->where, &c->where);
8033 error++;
8034 continue;
8037 default_case = body;
8041 if (error > 0)
8042 return;
8044 /* Transform SELECT TYPE statement to BLOCK and associate selector to
8045 target if present. If there are any EXIT statements referring to the
8046 SELECT TYPE construct, this is no problem because the gfc_code
8047 reference stays the same and EXIT is equally possible from the BLOCK
8048 it is changed to. */
8049 code->op = EXEC_BLOCK;
8050 if (code->expr2)
8052 gfc_association_list* assoc;
8054 assoc = gfc_get_association_list ();
8055 assoc->st = code->expr1->symtree;
8056 assoc->target = gfc_copy_expr (code->expr2);
8057 assoc->target->where = code->expr2->where;
8058 /* assoc->variable will be set by resolve_assoc_var. */
8060 code->ext.block.assoc = assoc;
8061 code->expr1->symtree->n.sym->assoc = assoc;
8063 resolve_assoc_var (code->expr1->symtree->n.sym, false);
8065 else
8066 code->ext.block.assoc = NULL;
8068 /* Add EXEC_SELECT to switch on type. */
8069 new_st = gfc_get_code (code->op);
8070 new_st->expr1 = code->expr1;
8071 new_st->expr2 = code->expr2;
8072 new_st->block = code->block;
8073 code->expr1 = code->expr2 = NULL;
8074 code->block = NULL;
8075 if (!ns->code)
8076 ns->code = new_st;
8077 else
8078 ns->code->next = new_st;
8079 code = new_st;
8080 code->op = EXEC_SELECT;
8082 gfc_add_vptr_component (code->expr1);
8083 gfc_add_hash_component (code->expr1);
8085 /* Loop over TYPE IS / CLASS IS cases. */
8086 for (body = code->block; body; body = body->block)
8088 c = body->ext.block.case_list;
8090 if (c->ts.type == BT_DERIVED)
8091 c->low = c->high = gfc_get_int_expr (gfc_default_integer_kind, NULL,
8092 c->ts.u.derived->hash_value);
8093 else if (c->ts.type != BT_CLASS && c->ts.type != BT_UNKNOWN)
8095 gfc_symbol *ivtab;
8096 gfc_expr *e;
8098 ivtab = gfc_find_vtab (&c->ts);
8099 gcc_assert (ivtab && CLASS_DATA (ivtab)->initializer);
8100 e = CLASS_DATA (ivtab)->initializer;
8101 c->low = c->high = gfc_copy_expr (e);
8104 else if (c->ts.type == BT_UNKNOWN)
8105 continue;
8107 /* Associate temporary to selector. This should only be done
8108 when this case is actually true, so build a new ASSOCIATE
8109 that does precisely this here (instead of using the
8110 'global' one). */
8112 if (c->ts.type == BT_CLASS)
8113 sprintf (name, "__tmp_class_%s", c->ts.u.derived->name);
8114 else if (c->ts.type == BT_DERIVED)
8115 sprintf (name, "__tmp_type_%s", c->ts.u.derived->name);
8116 else if (c->ts.type == BT_CHARACTER)
8118 if (c->ts.u.cl && c->ts.u.cl->length
8119 && c->ts.u.cl->length->expr_type == EXPR_CONSTANT)
8120 charlen = mpz_get_si (c->ts.u.cl->length->value.integer);
8121 sprintf (name, "__tmp_%s_%d_%d", gfc_basic_typename (c->ts.type),
8122 charlen, c->ts.kind);
8124 else
8125 sprintf (name, "__tmp_%s_%d", gfc_basic_typename (c->ts.type),
8126 c->ts.kind);
8128 st = gfc_find_symtree (ns->sym_root, name);
8129 gcc_assert (st->n.sym->assoc);
8130 st->n.sym->assoc->target = gfc_get_variable_expr (code->expr1->symtree);
8131 st->n.sym->assoc->target->where = code->expr1->where;
8132 if (c->ts.type != BT_CLASS && c->ts.type != BT_UNKNOWN)
8133 gfc_add_data_component (st->n.sym->assoc->target);
8135 new_st = gfc_get_code (EXEC_BLOCK);
8136 new_st->ext.block.ns = gfc_build_block_ns (ns);
8137 new_st->ext.block.ns->code = body->next;
8138 body->next = new_st;
8140 /* Chain in the new list only if it is marked as dangling. Otherwise
8141 there is a CASE label overlap and this is already used. Just ignore,
8142 the error is diagnosed elsewhere. */
8143 if (st->n.sym->assoc->dangling)
8145 new_st->ext.block.assoc = st->n.sym->assoc;
8146 st->n.sym->assoc->dangling = 0;
8149 resolve_assoc_var (st->n.sym, false);
8152 /* Take out CLASS IS cases for separate treatment. */
8153 body = code;
8154 while (body && body->block)
8156 if (body->block->ext.block.case_list->ts.type == BT_CLASS)
8158 /* Add to class_is list. */
8159 if (class_is == NULL)
8161 class_is = body->block;
8162 tail = class_is;
8164 else
8166 for (tail = class_is; tail->block; tail = tail->block) ;
8167 tail->block = body->block;
8168 tail = tail->block;
8170 /* Remove from EXEC_SELECT list. */
8171 body->block = body->block->block;
8172 tail->block = NULL;
8174 else
8175 body = body->block;
8178 if (class_is)
8180 gfc_symbol *vtab;
8182 if (!default_case)
8184 /* Add a default case to hold the CLASS IS cases. */
8185 for (tail = code; tail->block; tail = tail->block) ;
8186 tail->block = gfc_get_code (EXEC_SELECT_TYPE);
8187 tail = tail->block;
8188 tail->ext.block.case_list = gfc_get_case ();
8189 tail->ext.block.case_list->ts.type = BT_UNKNOWN;
8190 tail->next = NULL;
8191 default_case = tail;
8194 /* More than one CLASS IS block? */
8195 if (class_is->block)
8197 gfc_code **c1,*c2;
8198 bool swapped;
8199 /* Sort CLASS IS blocks by extension level. */
8202 swapped = false;
8203 for (c1 = &class_is; (*c1) && (*c1)->block; c1 = &((*c1)->block))
8205 c2 = (*c1)->block;
8206 /* F03:C817 (check for doubles). */
8207 if ((*c1)->ext.block.case_list->ts.u.derived->hash_value
8208 == c2->ext.block.case_list->ts.u.derived->hash_value)
8210 gfc_error ("Double CLASS IS block in SELECT TYPE "
8211 "statement at %L",
8212 &c2->ext.block.case_list->where);
8213 return;
8215 if ((*c1)->ext.block.case_list->ts.u.derived->attr.extension
8216 < c2->ext.block.case_list->ts.u.derived->attr.extension)
8218 /* Swap. */
8219 (*c1)->block = c2->block;
8220 c2->block = *c1;
8221 *c1 = c2;
8222 swapped = true;
8226 while (swapped);
8229 /* Generate IF chain. */
8230 if_st = gfc_get_code (EXEC_IF);
8231 new_st = if_st;
8232 for (body = class_is; body; body = body->block)
8234 new_st->block = gfc_get_code (EXEC_IF);
8235 new_st = new_st->block;
8236 /* Set up IF condition: Call _gfortran_is_extension_of. */
8237 new_st->expr1 = gfc_get_expr ();
8238 new_st->expr1->expr_type = EXPR_FUNCTION;
8239 new_st->expr1->ts.type = BT_LOGICAL;
8240 new_st->expr1->ts.kind = 4;
8241 new_st->expr1->value.function.name = gfc_get_string (PREFIX ("is_extension_of"));
8242 new_st->expr1->value.function.isym = XCNEW (gfc_intrinsic_sym);
8243 new_st->expr1->value.function.isym->id = GFC_ISYM_EXTENDS_TYPE_OF;
8244 /* Set up arguments. */
8245 new_st->expr1->value.function.actual = gfc_get_actual_arglist ();
8246 new_st->expr1->value.function.actual->expr = gfc_get_variable_expr (code->expr1->symtree);
8247 new_st->expr1->value.function.actual->expr->where = code->loc;
8248 gfc_add_vptr_component (new_st->expr1->value.function.actual->expr);
8249 vtab = gfc_find_derived_vtab (body->ext.block.case_list->ts.u.derived);
8250 st = gfc_find_symtree (vtab->ns->sym_root, vtab->name);
8251 new_st->expr1->value.function.actual->next = gfc_get_actual_arglist ();
8252 new_st->expr1->value.function.actual->next->expr = gfc_get_variable_expr (st);
8253 new_st->next = body->next;
8255 if (default_case->next)
8257 new_st->block = gfc_get_code (EXEC_IF);
8258 new_st = new_st->block;
8259 new_st->next = default_case->next;
8262 /* Replace CLASS DEFAULT code by the IF chain. */
8263 default_case->next = if_st;
8266 /* Resolve the internal code. This can not be done earlier because
8267 it requires that the sym->assoc of selectors is set already. */
8268 gfc_current_ns = ns;
8269 gfc_resolve_blocks (code->block, gfc_current_ns);
8270 gfc_current_ns = old_ns;
8272 resolve_select (code, true);
8276 /* Resolve a transfer statement. This is making sure that:
8277 -- a derived type being transferred has only non-pointer components
8278 -- a derived type being transferred doesn't have private components, unless
8279 it's being transferred from the module where the type was defined
8280 -- we're not trying to transfer a whole assumed size array. */
8282 static void
8283 resolve_transfer (gfc_code *code)
8285 gfc_typespec *ts;
8286 gfc_symbol *sym;
8287 gfc_ref *ref;
8288 gfc_expr *exp;
8290 exp = code->expr1;
8292 while (exp != NULL && exp->expr_type == EXPR_OP
8293 && exp->value.op.op == INTRINSIC_PARENTHESES)
8294 exp = exp->value.op.op1;
8296 if (exp && exp->expr_type == EXPR_NULL
8297 && code->ext.dt)
8299 gfc_error ("Invalid context for NULL () intrinsic at %L",
8300 &exp->where);
8301 return;
8304 if (exp == NULL || (exp->expr_type != EXPR_VARIABLE
8305 && exp->expr_type != EXPR_FUNCTION))
8306 return;
8308 /* If we are reading, the variable will be changed. Note that
8309 code->ext.dt may be NULL if the TRANSFER is related to
8310 an INQUIRE statement -- but in this case, we are not reading, either. */
8311 if (code->ext.dt && code->ext.dt->dt_io_kind->value.iokind == M_READ
8312 && !gfc_check_vardef_context (exp, false, false, false,
8313 _("item in READ")))
8314 return;
8316 sym = exp->symtree->n.sym;
8317 ts = &sym->ts;
8319 /* Go to actual component transferred. */
8320 for (ref = exp->ref; ref; ref = ref->next)
8321 if (ref->type == REF_COMPONENT)
8322 ts = &ref->u.c.component->ts;
8324 if (ts->type == BT_CLASS)
8326 /* FIXME: Test for defined input/output. */
8327 gfc_error ("Data transfer element at %L cannot be polymorphic unless "
8328 "it is processed by a defined input/output procedure",
8329 &code->loc);
8330 return;
8333 if (ts->type == BT_DERIVED)
8335 /* Check that transferred derived type doesn't contain POINTER
8336 components. */
8337 if (ts->u.derived->attr.pointer_comp)
8339 gfc_error ("Data transfer element at %L cannot have POINTER "
8340 "components unless it is processed by a defined "
8341 "input/output procedure", &code->loc);
8342 return;
8345 /* F08:C935. */
8346 if (ts->u.derived->attr.proc_pointer_comp)
8348 gfc_error ("Data transfer element at %L cannot have "
8349 "procedure pointer components", &code->loc);
8350 return;
8353 if (ts->u.derived->attr.alloc_comp)
8355 gfc_error ("Data transfer element at %L cannot have ALLOCATABLE "
8356 "components unless it is processed by a defined "
8357 "input/output procedure", &code->loc);
8358 return;
8361 /* C_PTR and C_FUNPTR have private components which means they can not
8362 be printed. However, if -std=gnu and not -pedantic, allow
8363 the component to be printed to help debugging. */
8364 if (ts->u.derived->ts.f90_type == BT_VOID)
8366 if (!gfc_notify_std (GFC_STD_GNU, "Data transfer element at %L "
8367 "cannot have PRIVATE components", &code->loc))
8368 return;
8370 else if (derived_inaccessible (ts->u.derived))
8372 gfc_error ("Data transfer element at %L cannot have "
8373 "PRIVATE components",&code->loc);
8374 return;
8378 if (sym->as != NULL && sym->as->type == AS_ASSUMED_SIZE && exp->ref
8379 && exp->ref->type == REF_ARRAY && exp->ref->u.ar.type == AR_FULL)
8381 gfc_error ("Data transfer element at %L cannot be a full reference to "
8382 "an assumed-size array", &code->loc);
8383 return;
8388 /*********** Toplevel code resolution subroutines ***********/
8390 /* Find the set of labels that are reachable from this block. We also
8391 record the last statement in each block. */
8393 static void
8394 find_reachable_labels (gfc_code *block)
8396 gfc_code *c;
8398 if (!block)
8399 return;
8401 cs_base->reachable_labels = bitmap_obstack_alloc (&labels_obstack);
8403 /* Collect labels in this block. We don't keep those corresponding
8404 to END {IF|SELECT}, these are checked in resolve_branch by going
8405 up through the code_stack. */
8406 for (c = block; c; c = c->next)
8408 if (c->here && c->op != EXEC_END_NESTED_BLOCK)
8409 bitmap_set_bit (cs_base->reachable_labels, c->here->value);
8412 /* Merge with labels from parent block. */
8413 if (cs_base->prev)
8415 gcc_assert (cs_base->prev->reachable_labels);
8416 bitmap_ior_into (cs_base->reachable_labels,
8417 cs_base->prev->reachable_labels);
8422 static void
8423 resolve_lock_unlock (gfc_code *code)
8425 if (code->expr1->expr_type == EXPR_FUNCTION
8426 && code->expr1->value.function.isym
8427 && code->expr1->value.function.isym->id == GFC_ISYM_CAF_GET)
8428 remove_caf_get_intrinsic (code->expr1);
8430 if (code->expr1->ts.type != BT_DERIVED
8431 || code->expr1->expr_type != EXPR_VARIABLE
8432 || code->expr1->ts.u.derived->from_intmod != INTMOD_ISO_FORTRAN_ENV
8433 || code->expr1->ts.u.derived->intmod_sym_id != ISOFORTRAN_LOCK_TYPE
8434 || code->expr1->rank != 0
8435 || (!gfc_is_coarray (code->expr1) && !gfc_is_coindexed (code->expr1)))
8436 gfc_error ("Lock variable at %L must be a scalar of type LOCK_TYPE",
8437 &code->expr1->where);
8439 /* Check STAT. */
8440 if (code->expr2
8441 && (code->expr2->ts.type != BT_INTEGER || code->expr2->rank != 0
8442 || code->expr2->expr_type != EXPR_VARIABLE))
8443 gfc_error ("STAT= argument at %L must be a scalar INTEGER variable",
8444 &code->expr2->where);
8446 if (code->expr2
8447 && !gfc_check_vardef_context (code->expr2, false, false, false,
8448 _("STAT variable")))
8449 return;
8451 /* Check ERRMSG. */
8452 if (code->expr3
8453 && (code->expr3->ts.type != BT_CHARACTER || code->expr3->rank != 0
8454 || code->expr3->expr_type != EXPR_VARIABLE))
8455 gfc_error ("ERRMSG= argument at %L must be a scalar CHARACTER variable",
8456 &code->expr3->where);
8458 if (code->expr3
8459 && !gfc_check_vardef_context (code->expr3, false, false, false,
8460 _("ERRMSG variable")))
8461 return;
8463 /* Check ACQUIRED_LOCK. */
8464 if (code->expr4
8465 && (code->expr4->ts.type != BT_LOGICAL || code->expr4->rank != 0
8466 || code->expr4->expr_type != EXPR_VARIABLE))
8467 gfc_error ("ACQUIRED_LOCK= argument at %L must be a scalar LOGICAL "
8468 "variable", &code->expr4->where);
8470 if (code->expr4
8471 && !gfc_check_vardef_context (code->expr4, false, false, false,
8472 _("ACQUIRED_LOCK variable")))
8473 return;
8477 static void
8478 resolve_critical (gfc_code *code)
8480 gfc_symtree *symtree;
8481 gfc_symbol *lock_type;
8482 char name[GFC_MAX_SYMBOL_LEN];
8483 static int serial = 0;
8485 if (gfc_option.coarray != GFC_FCOARRAY_LIB)
8486 return;
8488 symtree = gfc_find_symtree (gfc_current_ns->sym_root,
8489 GFC_PREFIX ("lock_type"));
8490 if (symtree)
8491 lock_type = symtree->n.sym;
8492 else
8494 if (gfc_get_sym_tree (GFC_PREFIX ("lock_type"), gfc_current_ns, &symtree,
8495 false) != 0)
8496 gcc_unreachable ();
8497 lock_type = symtree->n.sym;
8498 lock_type->attr.flavor = FL_DERIVED;
8499 lock_type->attr.zero_comp = 1;
8500 lock_type->from_intmod = INTMOD_ISO_FORTRAN_ENV;
8501 lock_type->intmod_sym_id = ISOFORTRAN_LOCK_TYPE;
8504 sprintf(name, GFC_PREFIX ("lock_var") "%d",serial++);
8505 if (gfc_get_sym_tree (name, gfc_current_ns, &symtree, false) != 0)
8506 gcc_unreachable ();
8508 code->resolved_sym = symtree->n.sym;
8509 symtree->n.sym->attr.flavor = FL_VARIABLE;
8510 symtree->n.sym->attr.referenced = 1;
8511 symtree->n.sym->attr.artificial = 1;
8512 symtree->n.sym->attr.codimension = 1;
8513 symtree->n.sym->ts.type = BT_DERIVED;
8514 symtree->n.sym->ts.u.derived = lock_type;
8515 symtree->n.sym->as = gfc_get_array_spec ();
8516 symtree->n.sym->as->corank = 1;
8517 symtree->n.sym->as->type = AS_EXPLICIT;
8518 symtree->n.sym->as->cotype = AS_EXPLICIT;
8519 symtree->n.sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind,
8520 NULL, 1);
8524 static void
8525 resolve_sync (gfc_code *code)
8527 /* Check imageset. The * case matches expr1 == NULL. */
8528 if (code->expr1)
8530 if (code->expr1->ts.type != BT_INTEGER || code->expr1->rank > 1)
8531 gfc_error ("Imageset argument at %L must be a scalar or rank-1 "
8532 "INTEGER expression", &code->expr1->where);
8533 if (code->expr1->expr_type == EXPR_CONSTANT && code->expr1->rank == 0
8534 && mpz_cmp_si (code->expr1->value.integer, 1) < 0)
8535 gfc_error ("Imageset argument at %L must between 1 and num_images()",
8536 &code->expr1->where);
8537 else if (code->expr1->expr_type == EXPR_ARRAY
8538 && gfc_simplify_expr (code->expr1, 0))
8540 gfc_constructor *cons;
8541 cons = gfc_constructor_first (code->expr1->value.constructor);
8542 for (; cons; cons = gfc_constructor_next (cons))
8543 if (cons->expr->expr_type == EXPR_CONSTANT
8544 && mpz_cmp_si (cons->expr->value.integer, 1) < 0)
8545 gfc_error ("Imageset argument at %L must between 1 and "
8546 "num_images()", &cons->expr->where);
8550 /* Check STAT. */
8551 if (code->expr2
8552 && (code->expr2->ts.type != BT_INTEGER || code->expr2->rank != 0
8553 || code->expr2->expr_type != EXPR_VARIABLE))
8554 gfc_error ("STAT= argument at %L must be a scalar INTEGER variable",
8555 &code->expr2->where);
8557 /* Check ERRMSG. */
8558 if (code->expr3
8559 && (code->expr3->ts.type != BT_CHARACTER || code->expr3->rank != 0
8560 || code->expr3->expr_type != EXPR_VARIABLE))
8561 gfc_error ("ERRMSG= argument at %L must be a scalar CHARACTER variable",
8562 &code->expr3->where);
8566 /* Given a branch to a label, see if the branch is conforming.
8567 The code node describes where the branch is located. */
8569 static void
8570 resolve_branch (gfc_st_label *label, gfc_code *code)
8572 code_stack *stack;
8574 if (label == NULL)
8575 return;
8577 /* Step one: is this a valid branching target? */
8579 if (label->defined == ST_LABEL_UNKNOWN)
8581 gfc_error ("Label %d referenced at %L is never defined", label->value,
8582 &label->where);
8583 return;
8586 if (label->defined != ST_LABEL_TARGET && label->defined != ST_LABEL_DO_TARGET)
8588 gfc_error ("Statement at %L is not a valid branch target statement "
8589 "for the branch statement at %L", &label->where, &code->loc);
8590 return;
8593 /* Step two: make sure this branch is not a branch to itself ;-) */
8595 if (code->here == label)
8597 gfc_warning ("Branch at %L may result in an infinite loop", &code->loc);
8598 return;
8601 /* Step three: See if the label is in the same block as the
8602 branching statement. The hard work has been done by setting up
8603 the bitmap reachable_labels. */
8605 if (bitmap_bit_p (cs_base->reachable_labels, label->value))
8607 /* Check now whether there is a CRITICAL construct; if so, check
8608 whether the label is still visible outside of the CRITICAL block,
8609 which is invalid. */
8610 for (stack = cs_base; stack; stack = stack->prev)
8612 if (stack->current->op == EXEC_CRITICAL
8613 && bitmap_bit_p (stack->reachable_labels, label->value))
8614 gfc_error ("GOTO statement at %L leaves CRITICAL construct for "
8615 "label at %L", &code->loc, &label->where);
8616 else if (stack->current->op == EXEC_DO_CONCURRENT
8617 && bitmap_bit_p (stack->reachable_labels, label->value))
8618 gfc_error ("GOTO statement at %L leaves DO CONCURRENT construct "
8619 "for label at %L", &code->loc, &label->where);
8622 return;
8625 /* Step four: If we haven't found the label in the bitmap, it may
8626 still be the label of the END of the enclosing block, in which
8627 case we find it by going up the code_stack. */
8629 for (stack = cs_base; stack; stack = stack->prev)
8631 if (stack->current->next && stack->current->next->here == label)
8632 break;
8633 if (stack->current->op == EXEC_CRITICAL)
8635 /* Note: A label at END CRITICAL does not leave the CRITICAL
8636 construct as END CRITICAL is still part of it. */
8637 gfc_error ("GOTO statement at %L leaves CRITICAL construct for label"
8638 " at %L", &code->loc, &label->where);
8639 return;
8641 else if (stack->current->op == EXEC_DO_CONCURRENT)
8643 gfc_error ("GOTO statement at %L leaves DO CONCURRENT construct for "
8644 "label at %L", &code->loc, &label->where);
8645 return;
8649 if (stack)
8651 gcc_assert (stack->current->next->op == EXEC_END_NESTED_BLOCK);
8652 return;
8655 /* The label is not in an enclosing block, so illegal. This was
8656 allowed in Fortran 66, so we allow it as extension. No
8657 further checks are necessary in this case. */
8658 gfc_notify_std (GFC_STD_LEGACY, "Label at %L is not in the same block "
8659 "as the GOTO statement at %L", &label->where,
8660 &code->loc);
8661 return;
8665 /* Check whether EXPR1 has the same shape as EXPR2. */
8667 static bool
8668 resolve_where_shape (gfc_expr *expr1, gfc_expr *expr2)
8670 mpz_t shape[GFC_MAX_DIMENSIONS];
8671 mpz_t shape2[GFC_MAX_DIMENSIONS];
8672 bool result = false;
8673 int i;
8675 /* Compare the rank. */
8676 if (expr1->rank != expr2->rank)
8677 return result;
8679 /* Compare the size of each dimension. */
8680 for (i=0; i<expr1->rank; i++)
8682 if (!gfc_array_dimen_size (expr1, i, &shape[i]))
8683 goto ignore;
8685 if (!gfc_array_dimen_size (expr2, i, &shape2[i]))
8686 goto ignore;
8688 if (mpz_cmp (shape[i], shape2[i]))
8689 goto over;
8692 /* When either of the two expression is an assumed size array, we
8693 ignore the comparison of dimension sizes. */
8694 ignore:
8695 result = true;
8697 over:
8698 gfc_clear_shape (shape, i);
8699 gfc_clear_shape (shape2, i);
8700 return result;
8704 /* Check whether a WHERE assignment target or a WHERE mask expression
8705 has the same shape as the outmost WHERE mask expression. */
8707 static void
8708 resolve_where (gfc_code *code, gfc_expr *mask)
8710 gfc_code *cblock;
8711 gfc_code *cnext;
8712 gfc_expr *e = NULL;
8714 cblock = code->block;
8716 /* Store the first WHERE mask-expr of the WHERE statement or construct.
8717 In case of nested WHERE, only the outmost one is stored. */
8718 if (mask == NULL) /* outmost WHERE */
8719 e = cblock->expr1;
8720 else /* inner WHERE */
8721 e = mask;
8723 while (cblock)
8725 if (cblock->expr1)
8727 /* Check if the mask-expr has a consistent shape with the
8728 outmost WHERE mask-expr. */
8729 if (!resolve_where_shape (cblock->expr1, e))
8730 gfc_error ("WHERE mask at %L has inconsistent shape",
8731 &cblock->expr1->where);
8734 /* the assignment statement of a WHERE statement, or the first
8735 statement in where-body-construct of a WHERE construct */
8736 cnext = cblock->next;
8737 while (cnext)
8739 switch (cnext->op)
8741 /* WHERE assignment statement */
8742 case EXEC_ASSIGN:
8744 /* Check shape consistent for WHERE assignment target. */
8745 if (e && !resolve_where_shape (cnext->expr1, e))
8746 gfc_error ("WHERE assignment target at %L has "
8747 "inconsistent shape", &cnext->expr1->where);
8748 break;
8751 case EXEC_ASSIGN_CALL:
8752 resolve_call (cnext);
8753 if (!cnext->resolved_sym->attr.elemental)
8754 gfc_error("Non-ELEMENTAL user-defined assignment in WHERE at %L",
8755 &cnext->ext.actual->expr->where);
8756 break;
8758 /* WHERE or WHERE construct is part of a where-body-construct */
8759 case EXEC_WHERE:
8760 resolve_where (cnext, e);
8761 break;
8763 default:
8764 gfc_error ("Unsupported statement inside WHERE at %L",
8765 &cnext->loc);
8767 /* the next statement within the same where-body-construct */
8768 cnext = cnext->next;
8770 /* the next masked-elsewhere-stmt, elsewhere-stmt, or end-where-stmt */
8771 cblock = cblock->block;
8776 /* Resolve assignment in FORALL construct.
8777 NVAR is the number of FORALL index variables, and VAR_EXPR records the
8778 FORALL index variables. */
8780 static void
8781 gfc_resolve_assign_in_forall (gfc_code *code, int nvar, gfc_expr **var_expr)
8783 int n;
8785 for (n = 0; n < nvar; n++)
8787 gfc_symbol *forall_index;
8789 forall_index = var_expr[n]->symtree->n.sym;
8791 /* Check whether the assignment target is one of the FORALL index
8792 variable. */
8793 if ((code->expr1->expr_type == EXPR_VARIABLE)
8794 && (code->expr1->symtree->n.sym == forall_index))
8795 gfc_error ("Assignment to a FORALL index variable at %L",
8796 &code->expr1->where);
8797 else
8799 /* If one of the FORALL index variables doesn't appear in the
8800 assignment variable, then there could be a many-to-one
8801 assignment. Emit a warning rather than an error because the
8802 mask could be resolving this problem. */
8803 if (!find_forall_index (code->expr1, forall_index, 0))
8804 gfc_warning ("The FORALL with index '%s' is not used on the "
8805 "left side of the assignment at %L and so might "
8806 "cause multiple assignment to this object",
8807 var_expr[n]->symtree->name, &code->expr1->where);
8813 /* Resolve WHERE statement in FORALL construct. */
8815 static void
8816 gfc_resolve_where_code_in_forall (gfc_code *code, int nvar,
8817 gfc_expr **var_expr)
8819 gfc_code *cblock;
8820 gfc_code *cnext;
8822 cblock = code->block;
8823 while (cblock)
8825 /* the assignment statement of a WHERE statement, or the first
8826 statement in where-body-construct of a WHERE construct */
8827 cnext = cblock->next;
8828 while (cnext)
8830 switch (cnext->op)
8832 /* WHERE assignment statement */
8833 case EXEC_ASSIGN:
8834 gfc_resolve_assign_in_forall (cnext, nvar, var_expr);
8835 break;
8837 /* WHERE operator assignment statement */
8838 case EXEC_ASSIGN_CALL:
8839 resolve_call (cnext);
8840 if (!cnext->resolved_sym->attr.elemental)
8841 gfc_error("Non-ELEMENTAL user-defined assignment in WHERE at %L",
8842 &cnext->ext.actual->expr->where);
8843 break;
8845 /* WHERE or WHERE construct is part of a where-body-construct */
8846 case EXEC_WHERE:
8847 gfc_resolve_where_code_in_forall (cnext, nvar, var_expr);
8848 break;
8850 default:
8851 gfc_error ("Unsupported statement inside WHERE at %L",
8852 &cnext->loc);
8854 /* the next statement within the same where-body-construct */
8855 cnext = cnext->next;
8857 /* the next masked-elsewhere-stmt, elsewhere-stmt, or end-where-stmt */
8858 cblock = cblock->block;
8863 /* Traverse the FORALL body to check whether the following errors exist:
8864 1. For assignment, check if a many-to-one assignment happens.
8865 2. For WHERE statement, check the WHERE body to see if there is any
8866 many-to-one assignment. */
8868 static void
8869 gfc_resolve_forall_body (gfc_code *code, int nvar, gfc_expr **var_expr)
8871 gfc_code *c;
8873 c = code->block->next;
8874 while (c)
8876 switch (c->op)
8878 case EXEC_ASSIGN:
8879 case EXEC_POINTER_ASSIGN:
8880 gfc_resolve_assign_in_forall (c, nvar, var_expr);
8881 break;
8883 case EXEC_ASSIGN_CALL:
8884 resolve_call (c);
8885 break;
8887 /* Because the gfc_resolve_blocks() will handle the nested FORALL,
8888 there is no need to handle it here. */
8889 case EXEC_FORALL:
8890 break;
8891 case EXEC_WHERE:
8892 gfc_resolve_where_code_in_forall(c, nvar, var_expr);
8893 break;
8894 default:
8895 break;
8897 /* The next statement in the FORALL body. */
8898 c = c->next;
8903 /* Counts the number of iterators needed inside a forall construct, including
8904 nested forall constructs. This is used to allocate the needed memory
8905 in gfc_resolve_forall. */
8907 static int
8908 gfc_count_forall_iterators (gfc_code *code)
8910 int max_iters, sub_iters, current_iters;
8911 gfc_forall_iterator *fa;
8913 gcc_assert(code->op == EXEC_FORALL);
8914 max_iters = 0;
8915 current_iters = 0;
8917 for (fa = code->ext.forall_iterator; fa; fa = fa->next)
8918 current_iters ++;
8920 code = code->block->next;
8922 while (code)
8924 if (code->op == EXEC_FORALL)
8926 sub_iters = gfc_count_forall_iterators (code);
8927 if (sub_iters > max_iters)
8928 max_iters = sub_iters;
8930 code = code->next;
8933 return current_iters + max_iters;
8937 /* Given a FORALL construct, first resolve the FORALL iterator, then call
8938 gfc_resolve_forall_body to resolve the FORALL body. */
8940 static void
8941 gfc_resolve_forall (gfc_code *code, gfc_namespace *ns, int forall_save)
8943 static gfc_expr **var_expr;
8944 static int total_var = 0;
8945 static int nvar = 0;
8946 int old_nvar, tmp;
8947 gfc_forall_iterator *fa;
8948 int i;
8950 old_nvar = nvar;
8952 /* Start to resolve a FORALL construct */
8953 if (forall_save == 0)
8955 /* Count the total number of FORALL index in the nested FORALL
8956 construct in order to allocate the VAR_EXPR with proper size. */
8957 total_var = gfc_count_forall_iterators (code);
8959 /* Allocate VAR_EXPR with NUMBER_OF_FORALL_INDEX elements. */
8960 var_expr = XCNEWVEC (gfc_expr *, total_var);
8963 /* The information about FORALL iterator, including FORALL index start, end
8964 and stride. The FORALL index can not appear in start, end or stride. */
8965 for (fa = code->ext.forall_iterator; fa; fa = fa->next)
8967 /* Check if any outer FORALL index name is the same as the current
8968 one. */
8969 for (i = 0; i < nvar; i++)
8971 if (fa->var->symtree->n.sym == var_expr[i]->symtree->n.sym)
8973 gfc_error ("An outer FORALL construct already has an index "
8974 "with this name %L", &fa->var->where);
8978 /* Record the current FORALL index. */
8979 var_expr[nvar] = gfc_copy_expr (fa->var);
8981 nvar++;
8983 /* No memory leak. */
8984 gcc_assert (nvar <= total_var);
8987 /* Resolve the FORALL body. */
8988 gfc_resolve_forall_body (code, nvar, var_expr);
8990 /* May call gfc_resolve_forall to resolve the inner FORALL loop. */
8991 gfc_resolve_blocks (code->block, ns);
8993 tmp = nvar;
8994 nvar = old_nvar;
8995 /* Free only the VAR_EXPRs allocated in this frame. */
8996 for (i = nvar; i < tmp; i++)
8997 gfc_free_expr (var_expr[i]);
8999 if (nvar == 0)
9001 /* We are in the outermost FORALL construct. */
9002 gcc_assert (forall_save == 0);
9004 /* VAR_EXPR is not needed any more. */
9005 free (var_expr);
9006 total_var = 0;
9011 /* Resolve a BLOCK construct statement. */
9013 static void
9014 resolve_block_construct (gfc_code* code)
9016 /* Resolve the BLOCK's namespace. */
9017 gfc_resolve (code->ext.block.ns);
9019 /* For an ASSOCIATE block, the associations (and their targets) are already
9020 resolved during resolve_symbol. */
9024 /* Resolve lists of blocks found in IF, SELECT CASE, WHERE, FORALL, GOTO and
9025 DO code nodes. */
9027 void
9028 gfc_resolve_blocks (gfc_code *b, gfc_namespace *ns)
9030 bool t;
9032 for (; b; b = b->block)
9034 t = gfc_resolve_expr (b->expr1);
9035 if (!gfc_resolve_expr (b->expr2))
9036 t = false;
9038 switch (b->op)
9040 case EXEC_IF:
9041 if (t && b->expr1 != NULL
9042 && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank != 0))
9043 gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
9044 &b->expr1->where);
9045 break;
9047 case EXEC_WHERE:
9048 if (t
9049 && b->expr1 != NULL
9050 && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank == 0))
9051 gfc_error ("WHERE/ELSEWHERE clause at %L requires a LOGICAL array",
9052 &b->expr1->where);
9053 break;
9055 case EXEC_GOTO:
9056 resolve_branch (b->label1, b);
9057 break;
9059 case EXEC_BLOCK:
9060 resolve_block_construct (b);
9061 break;
9063 case EXEC_SELECT:
9064 case EXEC_SELECT_TYPE:
9065 case EXEC_FORALL:
9066 case EXEC_DO:
9067 case EXEC_DO_WHILE:
9068 case EXEC_DO_CONCURRENT:
9069 case EXEC_CRITICAL:
9070 case EXEC_READ:
9071 case EXEC_WRITE:
9072 case EXEC_IOLENGTH:
9073 case EXEC_WAIT:
9074 break;
9076 case EXEC_OMP_ATOMIC:
9077 case EXEC_OMP_CRITICAL:
9078 case EXEC_OMP_DISTRIBUTE:
9079 case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
9080 case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
9081 case EXEC_OMP_DISTRIBUTE_SIMD:
9082 case EXEC_OMP_DO:
9083 case EXEC_OMP_DO_SIMD:
9084 case EXEC_OMP_MASTER:
9085 case EXEC_OMP_ORDERED:
9086 case EXEC_OMP_PARALLEL:
9087 case EXEC_OMP_PARALLEL_DO:
9088 case EXEC_OMP_PARALLEL_DO_SIMD:
9089 case EXEC_OMP_PARALLEL_SECTIONS:
9090 case EXEC_OMP_PARALLEL_WORKSHARE:
9091 case EXEC_OMP_SECTIONS:
9092 case EXEC_OMP_SIMD:
9093 case EXEC_OMP_SINGLE:
9094 case EXEC_OMP_TARGET:
9095 case EXEC_OMP_TARGET_DATA:
9096 case EXEC_OMP_TARGET_TEAMS:
9097 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
9098 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
9099 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
9100 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
9101 case EXEC_OMP_TARGET_UPDATE:
9102 case EXEC_OMP_TASK:
9103 case EXEC_OMP_TASKGROUP:
9104 case EXEC_OMP_TASKWAIT:
9105 case EXEC_OMP_TASKYIELD:
9106 case EXEC_OMP_TEAMS:
9107 case EXEC_OMP_TEAMS_DISTRIBUTE:
9108 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
9109 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
9110 case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
9111 case EXEC_OMP_WORKSHARE:
9112 break;
9114 default:
9115 gfc_internal_error ("gfc_resolve_blocks(): Bad block type");
9118 gfc_resolve_code (b->next, ns);
9123 /* Does everything to resolve an ordinary assignment. Returns true
9124 if this is an interface assignment. */
9125 static bool
9126 resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns)
9128 bool rval = false;
9129 gfc_expr *lhs;
9130 gfc_expr *rhs;
9131 int llen = 0;
9132 int rlen = 0;
9133 int n;
9134 gfc_ref *ref;
9135 symbol_attribute attr;
9137 if (gfc_extend_assign (code, ns))
9139 gfc_expr** rhsptr;
9141 if (code->op == EXEC_ASSIGN_CALL)
9143 lhs = code->ext.actual->expr;
9144 rhsptr = &code->ext.actual->next->expr;
9146 else
9148 gfc_actual_arglist* args;
9149 gfc_typebound_proc* tbp;
9151 gcc_assert (code->op == EXEC_COMPCALL);
9153 args = code->expr1->value.compcall.actual;
9154 lhs = args->expr;
9155 rhsptr = &args->next->expr;
9157 tbp = code->expr1->value.compcall.tbp;
9158 gcc_assert (!tbp->is_generic);
9161 /* Make a temporary rhs when there is a default initializer
9162 and rhs is the same symbol as the lhs. */
9163 if ((*rhsptr)->expr_type == EXPR_VARIABLE
9164 && (*rhsptr)->symtree->n.sym->ts.type == BT_DERIVED
9165 && gfc_has_default_initializer ((*rhsptr)->symtree->n.sym->ts.u.derived)
9166 && (lhs->symtree->n.sym == (*rhsptr)->symtree->n.sym))
9167 *rhsptr = gfc_get_parentheses (*rhsptr);
9169 return true;
9172 lhs = code->expr1;
9173 rhs = code->expr2;
9175 if (rhs->is_boz
9176 && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L outside "
9177 "a DATA statement and outside INT/REAL/DBLE/CMPLX",
9178 &code->loc))
9179 return false;
9181 /* Handle the case of a BOZ literal on the RHS. */
9182 if (rhs->is_boz && lhs->ts.type != BT_INTEGER)
9184 int rc;
9185 if (gfc_option.warn_surprising)
9186 gfc_warning ("BOZ literal at %L is bitwise transferred "
9187 "non-integer symbol '%s'", &code->loc,
9188 lhs->symtree->n.sym->name);
9190 if (!gfc_convert_boz (rhs, &lhs->ts))
9191 return false;
9192 if ((rc = gfc_range_check (rhs)) != ARITH_OK)
9194 if (rc == ARITH_UNDERFLOW)
9195 gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
9196 ". This check can be disabled with the option "
9197 "-fno-range-check", &rhs->where);
9198 else if (rc == ARITH_OVERFLOW)
9199 gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
9200 ". This check can be disabled with the option "
9201 "-fno-range-check", &rhs->where);
9202 else if (rc == ARITH_NAN)
9203 gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
9204 ". This check can be disabled with the option "
9205 "-fno-range-check", &rhs->where);
9206 return false;
9210 if (lhs->ts.type == BT_CHARACTER
9211 && gfc_option.warn_character_truncation)
9213 if (lhs->ts.u.cl != NULL
9214 && lhs->ts.u.cl->length != NULL
9215 && lhs->ts.u.cl->length->expr_type == EXPR_CONSTANT)
9216 llen = mpz_get_si (lhs->ts.u.cl->length->value.integer);
9218 if (rhs->expr_type == EXPR_CONSTANT)
9219 rlen = rhs->value.character.length;
9221 else if (rhs->ts.u.cl != NULL
9222 && rhs->ts.u.cl->length != NULL
9223 && rhs->ts.u.cl->length->expr_type == EXPR_CONSTANT)
9224 rlen = mpz_get_si (rhs->ts.u.cl->length->value.integer);
9226 if (rlen && llen && rlen > llen)
9227 gfc_warning_now ("CHARACTER expression will be truncated "
9228 "in assignment (%d/%d) at %L",
9229 llen, rlen, &code->loc);
9232 /* Ensure that a vector index expression for the lvalue is evaluated
9233 to a temporary if the lvalue symbol is referenced in it. */
9234 if (lhs->rank)
9236 for (ref = lhs->ref; ref; ref= ref->next)
9237 if (ref->type == REF_ARRAY)
9239 for (n = 0; n < ref->u.ar.dimen; n++)
9240 if (ref->u.ar.dimen_type[n] == DIMEN_VECTOR
9241 && gfc_find_sym_in_expr (lhs->symtree->n.sym,
9242 ref->u.ar.start[n]))
9243 ref->u.ar.start[n]
9244 = gfc_get_parentheses (ref->u.ar.start[n]);
9248 if (gfc_pure (NULL))
9250 if (lhs->ts.type == BT_DERIVED
9251 && lhs->expr_type == EXPR_VARIABLE
9252 && lhs->ts.u.derived->attr.pointer_comp
9253 && rhs->expr_type == EXPR_VARIABLE
9254 && (gfc_impure_variable (rhs->symtree->n.sym)
9255 || gfc_is_coindexed (rhs)))
9257 /* F2008, C1283. */
9258 if (gfc_is_coindexed (rhs))
9259 gfc_error ("Coindexed expression at %L is assigned to "
9260 "a derived type variable with a POINTER "
9261 "component in a PURE procedure",
9262 &rhs->where);
9263 else
9264 gfc_error ("The impure variable at %L is assigned to "
9265 "a derived type variable with a POINTER "
9266 "component in a PURE procedure (12.6)",
9267 &rhs->where);
9268 return rval;
9271 /* Fortran 2008, C1283. */
9272 if (gfc_is_coindexed (lhs))
9274 gfc_error ("Assignment to coindexed variable at %L in a PURE "
9275 "procedure", &rhs->where);
9276 return rval;
9280 if (gfc_implicit_pure (NULL))
9282 if (lhs->expr_type == EXPR_VARIABLE
9283 && lhs->symtree->n.sym != gfc_current_ns->proc_name
9284 && lhs->symtree->n.sym->ns != gfc_current_ns)
9285 gfc_unset_implicit_pure (NULL);
9287 if (lhs->ts.type == BT_DERIVED
9288 && lhs->expr_type == EXPR_VARIABLE
9289 && lhs->ts.u.derived->attr.pointer_comp
9290 && rhs->expr_type == EXPR_VARIABLE
9291 && (gfc_impure_variable (rhs->symtree->n.sym)
9292 || gfc_is_coindexed (rhs)))
9293 gfc_unset_implicit_pure (NULL);
9295 /* Fortran 2008, C1283. */
9296 if (gfc_is_coindexed (lhs))
9297 gfc_unset_implicit_pure (NULL);
9300 /* F2008, 7.2.1.2. */
9301 attr = gfc_expr_attr (lhs);
9302 if (lhs->ts.type == BT_CLASS && attr.allocatable)
9304 if (attr.codimension)
9306 gfc_error ("Assignment to polymorphic coarray at %L is not "
9307 "permitted", &lhs->where);
9308 return false;
9310 if (!gfc_notify_std (GFC_STD_F2008, "Assignment to an allocatable "
9311 "polymorphic variable at %L", &lhs->where))
9312 return false;
9313 if (!gfc_option.flag_realloc_lhs)
9315 gfc_error ("Assignment to an allocatable polymorphic variable at %L "
9316 "requires -frealloc-lhs", &lhs->where);
9317 return false;
9319 /* See PR 43366. */
9320 gfc_error ("Assignment to an allocatable polymorphic variable at %L "
9321 "is not yet supported", &lhs->where);
9322 return false;
9324 else if (lhs->ts.type == BT_CLASS)
9326 gfc_error ("Nonallocatable variable must not be polymorphic in intrinsic "
9327 "assignment at %L - check that there is a matching specific "
9328 "subroutine for '=' operator", &lhs->where);
9329 return false;
9332 bool lhs_coindexed = gfc_is_coindexed (lhs);
9334 /* F2008, Section 7.2.1.2. */
9335 if (lhs_coindexed && gfc_has_ultimate_allocatable (lhs))
9337 gfc_error ("Coindexed variable must not have an allocatable ultimate "
9338 "component in assignment at %L", &lhs->where);
9339 return false;
9342 gfc_check_assign (lhs, rhs, 1);
9344 /* Assign the 'data' of a class object to a derived type. */
9345 if (lhs->ts.type == BT_DERIVED
9346 && rhs->ts.type == BT_CLASS)
9347 gfc_add_data_component (rhs);
9349 /* Insert a GFC_ISYM_CAF_SEND intrinsic, when the LHS is a coindexed variable.
9350 Additionally, insert this code when the RHS is a CAF as we then use the
9351 GFC_ISYM_CAF_SEND intrinsic just to avoid a temporary; but do not do so if
9352 the LHS is (re)allocatable or has a vector subscript. If the LHS is a
9353 noncoindexed array and the RHS is a coindexed scalar, use the normal code
9354 path. */
9355 if (gfc_option.coarray == GFC_FCOARRAY_LIB
9356 && (lhs_coindexed
9357 || (code->expr2->expr_type == EXPR_FUNCTION
9358 && code->expr2->value.function.isym
9359 && code->expr2->value.function.isym->id == GFC_ISYM_CAF_GET
9360 && (code->expr1->rank == 0 || code->expr2->rank != 0)
9361 && !gfc_expr_attr (rhs).allocatable
9362 && !gfc_has_vector_subscript (rhs))))
9364 if (code->expr2->expr_type == EXPR_FUNCTION
9365 && code->expr2->value.function.isym
9366 && code->expr2->value.function.isym->id == GFC_ISYM_CAF_GET)
9367 remove_caf_get_intrinsic (code->expr2);
9368 code->op = EXEC_CALL;
9369 gfc_get_sym_tree (GFC_PREFIX ("caf_send"), ns, &code->symtree, true);
9370 code->resolved_sym = code->symtree->n.sym;
9371 code->resolved_sym->attr.flavor = FL_PROCEDURE;
9372 code->resolved_sym->attr.intrinsic = 1;
9373 code->resolved_sym->attr.subroutine = 1;
9374 code->resolved_isym = gfc_intrinsic_subroutine_by_id (GFC_ISYM_CAF_SEND);
9375 gfc_commit_symbol (code->resolved_sym);
9376 code->ext.actual = gfc_get_actual_arglist ();
9377 code->ext.actual->expr = lhs;
9378 code->ext.actual->next = gfc_get_actual_arglist ();
9379 code->ext.actual->next->expr = rhs;
9380 code->expr1 = NULL;
9381 code->expr2 = NULL;
9384 return false;
9388 /* Add a component reference onto an expression. */
9390 static void
9391 add_comp_ref (gfc_expr *e, gfc_component *c)
9393 gfc_ref **ref;
9394 ref = &(e->ref);
9395 while (*ref)
9396 ref = &((*ref)->next);
9397 *ref = gfc_get_ref ();
9398 (*ref)->type = REF_COMPONENT;
9399 (*ref)->u.c.sym = e->ts.u.derived;
9400 (*ref)->u.c.component = c;
9401 e->ts = c->ts;
9403 /* Add a full array ref, as necessary. */
9404 if (c->as)
9406 gfc_add_full_array_ref (e, c->as);
9407 e->rank = c->as->rank;
9412 /* Build an assignment. Keep the argument 'op' for future use, so that
9413 pointer assignments can be made. */
9415 static gfc_code *
9416 build_assignment (gfc_exec_op op, gfc_expr *expr1, gfc_expr *expr2,
9417 gfc_component *comp1, gfc_component *comp2, locus loc)
9419 gfc_code *this_code;
9421 this_code = gfc_get_code (op);
9422 this_code->next = NULL;
9423 this_code->expr1 = gfc_copy_expr (expr1);
9424 this_code->expr2 = gfc_copy_expr (expr2);
9425 this_code->loc = loc;
9426 if (comp1 && comp2)
9428 add_comp_ref (this_code->expr1, comp1);
9429 add_comp_ref (this_code->expr2, comp2);
9432 return this_code;
9436 /* Makes a temporary variable expression based on the characteristics of
9437 a given variable expression. */
9439 static gfc_expr*
9440 get_temp_from_expr (gfc_expr *e, gfc_namespace *ns)
9442 static int serial = 0;
9443 char name[GFC_MAX_SYMBOL_LEN];
9444 gfc_symtree *tmp;
9445 gfc_array_spec *as;
9446 gfc_array_ref *aref;
9447 gfc_ref *ref;
9449 sprintf (name, GFC_PREFIX("DA%d"), serial++);
9450 gfc_get_sym_tree (name, ns, &tmp, false);
9451 gfc_add_type (tmp->n.sym, &e->ts, NULL);
9453 as = NULL;
9454 ref = NULL;
9455 aref = NULL;
9457 /* This function could be expanded to support other expression type
9458 but this is not needed here. */
9459 gcc_assert (e->expr_type == EXPR_VARIABLE);
9461 /* Obtain the arrayspec for the temporary. */
9462 if (e->rank)
9464 aref = gfc_find_array_ref (e);
9465 if (e->expr_type == EXPR_VARIABLE
9466 && e->symtree->n.sym->as == aref->as)
9467 as = aref->as;
9468 else
9470 for (ref = e->ref; ref; ref = ref->next)
9471 if (ref->type == REF_COMPONENT
9472 && ref->u.c.component->as == aref->as)
9474 as = aref->as;
9475 break;
9480 /* Add the attributes and the arrayspec to the temporary. */
9481 tmp->n.sym->attr = gfc_expr_attr (e);
9482 tmp->n.sym->attr.function = 0;
9483 tmp->n.sym->attr.result = 0;
9484 tmp->n.sym->attr.flavor = FL_VARIABLE;
9486 if (as)
9488 tmp->n.sym->as = gfc_copy_array_spec (as);
9489 if (!ref)
9490 ref = e->ref;
9491 if (as->type == AS_DEFERRED)
9492 tmp->n.sym->attr.allocatable = 1;
9494 else
9495 tmp->n.sym->attr.dimension = 0;
9497 gfc_set_sym_referenced (tmp->n.sym);
9498 gfc_commit_symbol (tmp->n.sym);
9499 e = gfc_lval_expr_from_sym (tmp->n.sym);
9501 /* Should the lhs be a section, use its array ref for the
9502 temporary expression. */
9503 if (aref && aref->type != AR_FULL)
9505 gfc_free_ref_list (e->ref);
9506 e->ref = gfc_copy_ref (ref);
9508 return e;
9512 /* Add one line of code to the code chain, making sure that 'head' and
9513 'tail' are appropriately updated. */
9515 static void
9516 add_code_to_chain (gfc_code **this_code, gfc_code **head, gfc_code **tail)
9518 gcc_assert (this_code);
9519 if (*head == NULL)
9520 *head = *tail = *this_code;
9521 else
9522 *tail = gfc_append_code (*tail, *this_code);
9523 *this_code = NULL;
9527 /* Counts the potential number of part array references that would
9528 result from resolution of typebound defined assignments. */
9530 static int
9531 nonscalar_typebound_assign (gfc_symbol *derived, int depth)
9533 gfc_component *c;
9534 int c_depth = 0, t_depth;
9536 for (c= derived->components; c; c = c->next)
9538 if ((c->ts.type != BT_DERIVED
9539 || c->attr.pointer
9540 || c->attr.allocatable
9541 || c->attr.proc_pointer_comp
9542 || c->attr.class_pointer
9543 || c->attr.proc_pointer)
9544 && !c->attr.defined_assign_comp)
9545 continue;
9547 if (c->as && c_depth == 0)
9548 c_depth = 1;
9550 if (c->ts.u.derived->attr.defined_assign_comp)
9551 t_depth = nonscalar_typebound_assign (c->ts.u.derived,
9552 c->as ? 1 : 0);
9553 else
9554 t_depth = 0;
9556 c_depth = t_depth > c_depth ? t_depth : c_depth;
9558 return depth + c_depth;
9562 /* Implement 7.2.1.3 of the F08 standard:
9563 "An intrinsic assignment where the variable is of derived type is
9564 performed as if each component of the variable were assigned from the
9565 corresponding component of expr using pointer assignment (7.2.2) for
9566 each pointer component, defined assignment for each nonpointer
9567 nonallocatable component of a type that has a type-bound defined
9568 assignment consistent with the component, intrinsic assignment for
9569 each other nonpointer nonallocatable component, ..."
9571 The pointer assignments are taken care of by the intrinsic
9572 assignment of the structure itself. This function recursively adds
9573 defined assignments where required. The recursion is accomplished
9574 by calling gfc_resolve_code.
9576 When the lhs in a defined assignment has intent INOUT, we need a
9577 temporary for the lhs. In pseudo-code:
9579 ! Only call function lhs once.
9580 if (lhs is not a constant or an variable)
9581 temp_x = expr2
9582 expr2 => temp_x
9583 ! Do the intrinsic assignment
9584 expr1 = expr2
9585 ! Now do the defined assignments
9586 do over components with typebound defined assignment [%cmp]
9587 #if one component's assignment procedure is INOUT
9588 t1 = expr1
9589 #if expr2 non-variable
9590 temp_x = expr2
9591 expr2 => temp_x
9592 # endif
9593 expr1 = expr2
9594 # for each cmp
9595 t1%cmp {defined=} expr2%cmp
9596 expr1%cmp = t1%cmp
9597 #else
9598 expr1 = expr2
9600 # for each cmp
9601 expr1%cmp {defined=} expr2%cmp
9602 #endif
9605 /* The temporary assignments have to be put on top of the additional
9606 code to avoid the result being changed by the intrinsic assignment.
9608 static int component_assignment_level = 0;
9609 static gfc_code *tmp_head = NULL, *tmp_tail = NULL;
9611 static void
9612 generate_component_assignments (gfc_code **code, gfc_namespace *ns)
9614 gfc_component *comp1, *comp2;
9615 gfc_code *this_code = NULL, *head = NULL, *tail = NULL;
9616 gfc_expr *t1;
9617 int error_count, depth;
9619 gfc_get_errors (NULL, &error_count);
9621 /* Filter out continuing processing after an error. */
9622 if (error_count
9623 || (*code)->expr1->ts.type != BT_DERIVED
9624 || (*code)->expr2->ts.type != BT_DERIVED)
9625 return;
9627 /* TODO: Handle more than one part array reference in assignments. */
9628 depth = nonscalar_typebound_assign ((*code)->expr1->ts.u.derived,
9629 (*code)->expr1->rank ? 1 : 0);
9630 if (depth > 1)
9632 gfc_warning ("TODO: type-bound defined assignment(s) at %L not "
9633 "done because multiple part array references would "
9634 "occur in intermediate expressions.", &(*code)->loc);
9635 return;
9638 component_assignment_level++;
9640 /* Create a temporary so that functions get called only once. */
9641 if ((*code)->expr2->expr_type != EXPR_VARIABLE
9642 && (*code)->expr2->expr_type != EXPR_CONSTANT)
9644 gfc_expr *tmp_expr;
9646 /* Assign the rhs to the temporary. */
9647 tmp_expr = get_temp_from_expr ((*code)->expr1, ns);
9648 this_code = build_assignment (EXEC_ASSIGN,
9649 tmp_expr, (*code)->expr2,
9650 NULL, NULL, (*code)->loc);
9651 /* Add the code and substitute the rhs expression. */
9652 add_code_to_chain (&this_code, &tmp_head, &tmp_tail);
9653 gfc_free_expr ((*code)->expr2);
9654 (*code)->expr2 = tmp_expr;
9657 /* Do the intrinsic assignment. This is not needed if the lhs is one
9658 of the temporaries generated here, since the intrinsic assignment
9659 to the final result already does this. */
9660 if ((*code)->expr1->symtree->n.sym->name[2] != '@')
9662 this_code = build_assignment (EXEC_ASSIGN,
9663 (*code)->expr1, (*code)->expr2,
9664 NULL, NULL, (*code)->loc);
9665 add_code_to_chain (&this_code, &head, &tail);
9668 comp1 = (*code)->expr1->ts.u.derived->components;
9669 comp2 = (*code)->expr2->ts.u.derived->components;
9671 t1 = NULL;
9672 for (; comp1; comp1 = comp1->next, comp2 = comp2->next)
9674 bool inout = false;
9676 /* The intrinsic assignment does the right thing for pointers
9677 of all kinds and allocatable components. */
9678 if (comp1->ts.type != BT_DERIVED
9679 || comp1->attr.pointer
9680 || comp1->attr.allocatable
9681 || comp1->attr.proc_pointer_comp
9682 || comp1->attr.class_pointer
9683 || comp1->attr.proc_pointer)
9684 continue;
9686 /* Make an assigment for this component. */
9687 this_code = build_assignment (EXEC_ASSIGN,
9688 (*code)->expr1, (*code)->expr2,
9689 comp1, comp2, (*code)->loc);
9691 /* Convert the assignment if there is a defined assignment for
9692 this type. Otherwise, using the call from gfc_resolve_code,
9693 recurse into its components. */
9694 gfc_resolve_code (this_code, ns);
9696 if (this_code->op == EXEC_ASSIGN_CALL)
9698 gfc_formal_arglist *dummy_args;
9699 gfc_symbol *rsym;
9700 /* Check that there is a typebound defined assignment. If not,
9701 then this must be a module defined assignment. We cannot
9702 use the defined_assign_comp attribute here because it must
9703 be this derived type that has the defined assignment and not
9704 a parent type. */
9705 if (!(comp1->ts.u.derived->f2k_derived
9706 && comp1->ts.u.derived->f2k_derived
9707 ->tb_op[INTRINSIC_ASSIGN]))
9709 gfc_free_statements (this_code);
9710 this_code = NULL;
9711 continue;
9714 /* If the first argument of the subroutine has intent INOUT
9715 a temporary must be generated and used instead. */
9716 rsym = this_code->resolved_sym;
9717 dummy_args = gfc_sym_get_dummy_args (rsym);
9718 if (dummy_args
9719 && dummy_args->sym->attr.intent == INTENT_INOUT)
9721 gfc_code *temp_code;
9722 inout = true;
9724 /* Build the temporary required for the assignment and put
9725 it at the head of the generated code. */
9726 if (!t1)
9728 t1 = get_temp_from_expr ((*code)->expr1, ns);
9729 temp_code = build_assignment (EXEC_ASSIGN,
9730 t1, (*code)->expr1,
9731 NULL, NULL, (*code)->loc);
9733 /* For allocatable LHS, check whether it is allocated. Note
9734 that allocatable components with defined assignment are
9735 not yet support. See PR 57696. */
9736 if ((*code)->expr1->symtree->n.sym->attr.allocatable)
9738 gfc_code *block;
9739 gfc_expr *e =
9740 gfc_lval_expr_from_sym ((*code)->expr1->symtree->n.sym);
9741 block = gfc_get_code (EXEC_IF);
9742 block->block = gfc_get_code (EXEC_IF);
9743 block->block->expr1
9744 = gfc_build_intrinsic_call (ns,
9745 GFC_ISYM_ALLOCATED, "allocated",
9746 (*code)->loc, 1, e);
9747 block->block->next = temp_code;
9748 temp_code = block;
9750 add_code_to_chain (&temp_code, &tmp_head, &tmp_tail);
9753 /* Replace the first actual arg with the component of the
9754 temporary. */
9755 gfc_free_expr (this_code->ext.actual->expr);
9756 this_code->ext.actual->expr = gfc_copy_expr (t1);
9757 add_comp_ref (this_code->ext.actual->expr, comp1);
9759 /* If the LHS variable is allocatable and wasn't allocated and
9760 the temporary is allocatable, pointer assign the address of
9761 the freshly allocated LHS to the temporary. */
9762 if ((*code)->expr1->symtree->n.sym->attr.allocatable
9763 && gfc_expr_attr ((*code)->expr1).allocatable)
9765 gfc_code *block;
9766 gfc_expr *cond;
9768 cond = gfc_get_expr ();
9769 cond->ts.type = BT_LOGICAL;
9770 cond->ts.kind = gfc_default_logical_kind;
9771 cond->expr_type = EXPR_OP;
9772 cond->where = (*code)->loc;
9773 cond->value.op.op = INTRINSIC_NOT;
9774 cond->value.op.op1 = gfc_build_intrinsic_call (ns,
9775 GFC_ISYM_ALLOCATED, "allocated",
9776 (*code)->loc, 1, gfc_copy_expr (t1));
9777 block = gfc_get_code (EXEC_IF);
9778 block->block = gfc_get_code (EXEC_IF);
9779 block->block->expr1 = cond;
9780 block->block->next = build_assignment (EXEC_POINTER_ASSIGN,
9781 t1, (*code)->expr1,
9782 NULL, NULL, (*code)->loc);
9783 add_code_to_chain (&block, &head, &tail);
9787 else if (this_code->op == EXEC_ASSIGN && !this_code->next)
9789 /* Don't add intrinsic assignments since they are already
9790 effected by the intrinsic assignment of the structure. */
9791 gfc_free_statements (this_code);
9792 this_code = NULL;
9793 continue;
9796 add_code_to_chain (&this_code, &head, &tail);
9798 if (t1 && inout)
9800 /* Transfer the value to the final result. */
9801 this_code = build_assignment (EXEC_ASSIGN,
9802 (*code)->expr1, t1,
9803 comp1, comp2, (*code)->loc);
9804 add_code_to_chain (&this_code, &head, &tail);
9808 /* Put the temporary assignments at the top of the generated code. */
9809 if (tmp_head && component_assignment_level == 1)
9811 gfc_append_code (tmp_head, head);
9812 head = tmp_head;
9813 tmp_head = tmp_tail = NULL;
9816 // If we did a pointer assignment - thus, we need to ensure that the LHS is
9817 // not accidentally deallocated. Hence, nullify t1.
9818 if (t1 && (*code)->expr1->symtree->n.sym->attr.allocatable
9819 && gfc_expr_attr ((*code)->expr1).allocatable)
9821 gfc_code *block;
9822 gfc_expr *cond;
9823 gfc_expr *e;
9825 e = gfc_lval_expr_from_sym ((*code)->expr1->symtree->n.sym);
9826 cond = gfc_build_intrinsic_call (ns, GFC_ISYM_ASSOCIATED, "associated",
9827 (*code)->loc, 2, gfc_copy_expr (t1), e);
9828 block = gfc_get_code (EXEC_IF);
9829 block->block = gfc_get_code (EXEC_IF);
9830 block->block->expr1 = cond;
9831 block->block->next = build_assignment (EXEC_POINTER_ASSIGN,
9832 t1, gfc_get_null_expr (&(*code)->loc),
9833 NULL, NULL, (*code)->loc);
9834 gfc_append_code (tail, block);
9835 tail = block;
9838 /* Now attach the remaining code chain to the input code. Step on
9839 to the end of the new code since resolution is complete. */
9840 gcc_assert ((*code)->op == EXEC_ASSIGN);
9841 tail->next = (*code)->next;
9842 /* Overwrite 'code' because this would place the intrinsic assignment
9843 before the temporary for the lhs is created. */
9844 gfc_free_expr ((*code)->expr1);
9845 gfc_free_expr ((*code)->expr2);
9846 **code = *head;
9847 if (head != tail)
9848 free (head);
9849 *code = tail;
9851 component_assignment_level--;
9855 /* Given a block of code, recursively resolve everything pointed to by this
9856 code block. */
9858 void
9859 gfc_resolve_code (gfc_code *code, gfc_namespace *ns)
9861 int omp_workshare_save;
9862 int forall_save, do_concurrent_save;
9863 code_stack frame;
9864 bool t;
9866 frame.prev = cs_base;
9867 frame.head = code;
9868 cs_base = &frame;
9870 find_reachable_labels (code);
9872 for (; code; code = code->next)
9874 frame.current = code;
9875 forall_save = forall_flag;
9876 do_concurrent_save = gfc_do_concurrent_flag;
9878 if (code->op == EXEC_FORALL)
9880 forall_flag = 1;
9881 gfc_resolve_forall (code, ns, forall_save);
9882 forall_flag = 2;
9884 else if (code->block)
9886 omp_workshare_save = -1;
9887 switch (code->op)
9889 case EXEC_OMP_PARALLEL_WORKSHARE:
9890 omp_workshare_save = omp_workshare_flag;
9891 omp_workshare_flag = 1;
9892 gfc_resolve_omp_parallel_blocks (code, ns);
9893 break;
9894 case EXEC_OMP_PARALLEL:
9895 case EXEC_OMP_PARALLEL_DO:
9896 case EXEC_OMP_PARALLEL_DO_SIMD:
9897 case EXEC_OMP_PARALLEL_SECTIONS:
9898 case EXEC_OMP_TARGET_TEAMS:
9899 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
9900 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
9901 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
9902 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
9903 case EXEC_OMP_TASK:
9904 case EXEC_OMP_TEAMS:
9905 case EXEC_OMP_TEAMS_DISTRIBUTE:
9906 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
9907 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
9908 case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
9909 omp_workshare_save = omp_workshare_flag;
9910 omp_workshare_flag = 0;
9911 gfc_resolve_omp_parallel_blocks (code, ns);
9912 break;
9913 case EXEC_OMP_DISTRIBUTE:
9914 case EXEC_OMP_DISTRIBUTE_SIMD:
9915 case EXEC_OMP_DO:
9916 case EXEC_OMP_DO_SIMD:
9917 case EXEC_OMP_SIMD:
9918 gfc_resolve_omp_do_blocks (code, ns);
9919 break;
9920 case EXEC_SELECT_TYPE:
9921 /* Blocks are handled in resolve_select_type because we have
9922 to transform the SELECT TYPE into ASSOCIATE first. */
9923 break;
9924 case EXEC_DO_CONCURRENT:
9925 gfc_do_concurrent_flag = 1;
9926 gfc_resolve_blocks (code->block, ns);
9927 gfc_do_concurrent_flag = 2;
9928 break;
9929 case EXEC_OMP_WORKSHARE:
9930 omp_workshare_save = omp_workshare_flag;
9931 omp_workshare_flag = 1;
9932 /* FALL THROUGH */
9933 default:
9934 gfc_resolve_blocks (code->block, ns);
9935 break;
9938 if (omp_workshare_save != -1)
9939 omp_workshare_flag = omp_workshare_save;
9942 t = true;
9943 if (code->op != EXEC_COMPCALL && code->op != EXEC_CALL_PPC)
9944 t = gfc_resolve_expr (code->expr1);
9945 forall_flag = forall_save;
9946 gfc_do_concurrent_flag = do_concurrent_save;
9948 if (!gfc_resolve_expr (code->expr2))
9949 t = false;
9951 if (code->op == EXEC_ALLOCATE
9952 && !gfc_resolve_expr (code->expr3))
9953 t = false;
9955 switch (code->op)
9957 case EXEC_NOP:
9958 case EXEC_END_BLOCK:
9959 case EXEC_END_NESTED_BLOCK:
9960 case EXEC_CYCLE:
9961 case EXEC_PAUSE:
9962 case EXEC_STOP:
9963 case EXEC_ERROR_STOP:
9964 case EXEC_EXIT:
9965 case EXEC_CONTINUE:
9966 case EXEC_DT_END:
9967 case EXEC_ASSIGN_CALL:
9968 break;
9970 case EXEC_CRITICAL:
9971 resolve_critical (code);
9972 break;
9974 case EXEC_SYNC_ALL:
9975 case EXEC_SYNC_IMAGES:
9976 case EXEC_SYNC_MEMORY:
9977 resolve_sync (code);
9978 break;
9980 case EXEC_LOCK:
9981 case EXEC_UNLOCK:
9982 resolve_lock_unlock (code);
9983 break;
9985 case EXEC_ENTRY:
9986 /* Keep track of which entry we are up to. */
9987 current_entry_id = code->ext.entry->id;
9988 break;
9990 case EXEC_WHERE:
9991 resolve_where (code, NULL);
9992 break;
9994 case EXEC_GOTO:
9995 if (code->expr1 != NULL)
9997 if (code->expr1->ts.type != BT_INTEGER)
9998 gfc_error ("ASSIGNED GOTO statement at %L requires an "
9999 "INTEGER variable", &code->expr1->where);
10000 else if (code->expr1->symtree->n.sym->attr.assign != 1)
10001 gfc_error ("Variable '%s' has not been assigned a target "
10002 "label at %L", code->expr1->symtree->n.sym->name,
10003 &code->expr1->where);
10005 else
10006 resolve_branch (code->label1, code);
10007 break;
10009 case EXEC_RETURN:
10010 if (code->expr1 != NULL
10011 && (code->expr1->ts.type != BT_INTEGER || code->expr1->rank))
10012 gfc_error ("Alternate RETURN statement at %L requires a SCALAR-"
10013 "INTEGER return specifier", &code->expr1->where);
10014 break;
10016 case EXEC_INIT_ASSIGN:
10017 case EXEC_END_PROCEDURE:
10018 break;
10020 case EXEC_ASSIGN:
10021 if (!t)
10022 break;
10024 /* Remove a GFC_ISYM_CAF_GET inserted for a coindexed variable on
10025 the LHS. */
10026 if (code->expr1->expr_type == EXPR_FUNCTION
10027 && code->expr1->value.function.isym
10028 && code->expr1->value.function.isym->id == GFC_ISYM_CAF_GET)
10029 remove_caf_get_intrinsic (code->expr1);
10031 if (!gfc_check_vardef_context (code->expr1, false, false, false,
10032 _("assignment")))
10033 break;
10035 if (resolve_ordinary_assign (code, ns))
10037 if (code->op == EXEC_COMPCALL)
10038 goto compcall;
10039 else
10040 goto call;
10043 /* F03 7.4.1.3 for non-allocatable, non-pointer components. */
10044 if (code->op != EXEC_CALL && code->expr1->ts.type == BT_DERIVED
10045 && code->expr1->ts.u.derived->attr.defined_assign_comp)
10046 generate_component_assignments (&code, ns);
10048 break;
10050 case EXEC_LABEL_ASSIGN:
10051 if (code->label1->defined == ST_LABEL_UNKNOWN)
10052 gfc_error ("Label %d referenced at %L is never defined",
10053 code->label1->value, &code->label1->where);
10054 if (t
10055 && (code->expr1->expr_type != EXPR_VARIABLE
10056 || code->expr1->symtree->n.sym->ts.type != BT_INTEGER
10057 || code->expr1->symtree->n.sym->ts.kind
10058 != gfc_default_integer_kind
10059 || code->expr1->symtree->n.sym->as != NULL))
10060 gfc_error ("ASSIGN statement at %L requires a scalar "
10061 "default INTEGER variable", &code->expr1->where);
10062 break;
10064 case EXEC_POINTER_ASSIGN:
10066 gfc_expr* e;
10068 if (!t)
10069 break;
10071 /* This is both a variable definition and pointer assignment
10072 context, so check both of them. For rank remapping, a final
10073 array ref may be present on the LHS and fool gfc_expr_attr
10074 used in gfc_check_vardef_context. Remove it. */
10075 e = remove_last_array_ref (code->expr1);
10076 t = gfc_check_vardef_context (e, true, false, false,
10077 _("pointer assignment"));
10078 if (t)
10079 t = gfc_check_vardef_context (e, false, false, false,
10080 _("pointer assignment"));
10081 gfc_free_expr (e);
10082 if (!t)
10083 break;
10085 gfc_check_pointer_assign (code->expr1, code->expr2);
10086 break;
10089 case EXEC_ARITHMETIC_IF:
10090 if (t
10091 && code->expr1->ts.type != BT_INTEGER
10092 && code->expr1->ts.type != BT_REAL)
10093 gfc_error ("Arithmetic IF statement at %L requires a numeric "
10094 "expression", &code->expr1->where);
10096 resolve_branch (code->label1, code);
10097 resolve_branch (code->label2, code);
10098 resolve_branch (code->label3, code);
10099 break;
10101 case EXEC_IF:
10102 if (t && code->expr1 != NULL
10103 && (code->expr1->ts.type != BT_LOGICAL
10104 || code->expr1->rank != 0))
10105 gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
10106 &code->expr1->where);
10107 break;
10109 case EXEC_CALL:
10110 call:
10111 resolve_call (code);
10112 break;
10114 case EXEC_COMPCALL:
10115 compcall:
10116 resolve_typebound_subroutine (code);
10117 break;
10119 case EXEC_CALL_PPC:
10120 resolve_ppc_call (code);
10121 break;
10123 case EXEC_SELECT:
10124 /* Select is complicated. Also, a SELECT construct could be
10125 a transformed computed GOTO. */
10126 resolve_select (code, false);
10127 break;
10129 case EXEC_SELECT_TYPE:
10130 resolve_select_type (code, ns);
10131 break;
10133 case EXEC_BLOCK:
10134 resolve_block_construct (code);
10135 break;
10137 case EXEC_DO:
10138 if (code->ext.iterator != NULL)
10140 gfc_iterator *iter = code->ext.iterator;
10141 if (gfc_resolve_iterator (iter, true, false))
10142 gfc_resolve_do_iterator (code, iter->var->symtree->n.sym);
10144 break;
10146 case EXEC_DO_WHILE:
10147 if (code->expr1 == NULL)
10148 gfc_internal_error ("gfc_resolve_code(): No expression on "
10149 "DO WHILE");
10150 if (t
10151 && (code->expr1->rank != 0
10152 || code->expr1->ts.type != BT_LOGICAL))
10153 gfc_error ("Exit condition of DO WHILE loop at %L must be "
10154 "a scalar LOGICAL expression", &code->expr1->where);
10155 break;
10157 case EXEC_ALLOCATE:
10158 if (t)
10159 resolve_allocate_deallocate (code, "ALLOCATE");
10161 break;
10163 case EXEC_DEALLOCATE:
10164 if (t)
10165 resolve_allocate_deallocate (code, "DEALLOCATE");
10167 break;
10169 case EXEC_OPEN:
10170 if (!gfc_resolve_open (code->ext.open))
10171 break;
10173 resolve_branch (code->ext.open->err, code);
10174 break;
10176 case EXEC_CLOSE:
10177 if (!gfc_resolve_close (code->ext.close))
10178 break;
10180 resolve_branch (code->ext.close->err, code);
10181 break;
10183 case EXEC_BACKSPACE:
10184 case EXEC_ENDFILE:
10185 case EXEC_REWIND:
10186 case EXEC_FLUSH:
10187 if (!gfc_resolve_filepos (code->ext.filepos))
10188 break;
10190 resolve_branch (code->ext.filepos->err, code);
10191 break;
10193 case EXEC_INQUIRE:
10194 if (!gfc_resolve_inquire (code->ext.inquire))
10195 break;
10197 resolve_branch (code->ext.inquire->err, code);
10198 break;
10200 case EXEC_IOLENGTH:
10201 gcc_assert (code->ext.inquire != NULL);
10202 if (!gfc_resolve_inquire (code->ext.inquire))
10203 break;
10205 resolve_branch (code->ext.inquire->err, code);
10206 break;
10208 case EXEC_WAIT:
10209 if (!gfc_resolve_wait (code->ext.wait))
10210 break;
10212 resolve_branch (code->ext.wait->err, code);
10213 resolve_branch (code->ext.wait->end, code);
10214 resolve_branch (code->ext.wait->eor, code);
10215 break;
10217 case EXEC_READ:
10218 case EXEC_WRITE:
10219 if (!gfc_resolve_dt (code->ext.dt, &code->loc))
10220 break;
10222 resolve_branch (code->ext.dt->err, code);
10223 resolve_branch (code->ext.dt->end, code);
10224 resolve_branch (code->ext.dt->eor, code);
10225 break;
10227 case EXEC_TRANSFER:
10228 resolve_transfer (code);
10229 break;
10231 case EXEC_DO_CONCURRENT:
10232 case EXEC_FORALL:
10233 resolve_forall_iterators (code->ext.forall_iterator);
10235 if (code->expr1 != NULL
10236 && (code->expr1->ts.type != BT_LOGICAL || code->expr1->rank))
10237 gfc_error ("FORALL mask clause at %L requires a scalar LOGICAL "
10238 "expression", &code->expr1->where);
10239 break;
10241 case EXEC_OMP_ATOMIC:
10242 case EXEC_OMP_BARRIER:
10243 case EXEC_OMP_CANCEL:
10244 case EXEC_OMP_CANCELLATION_POINT:
10245 case EXEC_OMP_CRITICAL:
10246 case EXEC_OMP_FLUSH:
10247 case EXEC_OMP_DISTRIBUTE:
10248 case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
10249 case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
10250 case EXEC_OMP_DISTRIBUTE_SIMD:
10251 case EXEC_OMP_DO:
10252 case EXEC_OMP_DO_SIMD:
10253 case EXEC_OMP_MASTER:
10254 case EXEC_OMP_ORDERED:
10255 case EXEC_OMP_SECTIONS:
10256 case EXEC_OMP_SIMD:
10257 case EXEC_OMP_SINGLE:
10258 case EXEC_OMP_TARGET:
10259 case EXEC_OMP_TARGET_DATA:
10260 case EXEC_OMP_TARGET_TEAMS:
10261 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
10262 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
10263 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
10264 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
10265 case EXEC_OMP_TARGET_UPDATE:
10266 case EXEC_OMP_TASK:
10267 case EXEC_OMP_TASKGROUP:
10268 case EXEC_OMP_TASKWAIT:
10269 case EXEC_OMP_TASKYIELD:
10270 case EXEC_OMP_TEAMS:
10271 case EXEC_OMP_TEAMS_DISTRIBUTE:
10272 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
10273 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
10274 case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
10275 case EXEC_OMP_WORKSHARE:
10276 gfc_resolve_omp_directive (code, ns);
10277 break;
10279 case EXEC_OMP_PARALLEL:
10280 case EXEC_OMP_PARALLEL_DO:
10281 case EXEC_OMP_PARALLEL_DO_SIMD:
10282 case EXEC_OMP_PARALLEL_SECTIONS:
10283 case EXEC_OMP_PARALLEL_WORKSHARE:
10284 omp_workshare_save = omp_workshare_flag;
10285 omp_workshare_flag = 0;
10286 gfc_resolve_omp_directive (code, ns);
10287 omp_workshare_flag = omp_workshare_save;
10288 break;
10290 default:
10291 gfc_internal_error ("gfc_resolve_code(): Bad statement code");
10295 cs_base = frame.prev;
10299 /* Resolve initial values and make sure they are compatible with
10300 the variable. */
10302 static void
10303 resolve_values (gfc_symbol *sym)
10305 bool t;
10307 if (sym->value == NULL)
10308 return;
10310 if (sym->value->expr_type == EXPR_STRUCTURE)
10311 t= resolve_structure_cons (sym->value, 1);
10312 else
10313 t = gfc_resolve_expr (sym->value);
10315 if (!t)
10316 return;
10318 gfc_check_assign_symbol (sym, NULL, sym->value);
10322 /* Verify any BIND(C) derived types in the namespace so we can report errors
10323 for them once, rather than for each variable declared of that type. */
10325 static void
10326 resolve_bind_c_derived_types (gfc_symbol *derived_sym)
10328 if (derived_sym != NULL && derived_sym->attr.flavor == FL_DERIVED
10329 && derived_sym->attr.is_bind_c == 1)
10330 verify_bind_c_derived_type (derived_sym);
10332 return;
10336 /* Verify that any binding labels used in a given namespace do not collide
10337 with the names or binding labels of any global symbols. Multiple INTERFACE
10338 for the same procedure are permitted. */
10340 static void
10341 gfc_verify_binding_labels (gfc_symbol *sym)
10343 gfc_gsymbol *gsym;
10344 const char *module;
10346 if (!sym || !sym->attr.is_bind_c || sym->attr.is_iso_c
10347 || sym->attr.flavor == FL_DERIVED || !sym->binding_label)
10348 return;
10350 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->binding_label);
10352 if (sym->module)
10353 module = sym->module;
10354 else if (sym->ns && sym->ns->proc_name
10355 && sym->ns->proc_name->attr.flavor == FL_MODULE)
10356 module = sym->ns->proc_name->name;
10357 else if (sym->ns && sym->ns->parent
10358 && sym->ns && sym->ns->parent->proc_name
10359 && sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
10360 module = sym->ns->parent->proc_name->name;
10361 else
10362 module = NULL;
10364 if (!gsym
10365 || (!gsym->defined
10366 && (gsym->type == GSYM_FUNCTION || gsym->type == GSYM_SUBROUTINE)))
10368 if (!gsym)
10369 gsym = gfc_get_gsymbol (sym->binding_label);
10370 gsym->where = sym->declared_at;
10371 gsym->sym_name = sym->name;
10372 gsym->binding_label = sym->binding_label;
10373 gsym->ns = sym->ns;
10374 gsym->mod_name = module;
10375 if (sym->attr.function)
10376 gsym->type = GSYM_FUNCTION;
10377 else if (sym->attr.subroutine)
10378 gsym->type = GSYM_SUBROUTINE;
10379 /* Mark as variable/procedure as defined, unless its an INTERFACE. */
10380 gsym->defined = sym->attr.if_source != IFSRC_IFBODY;
10381 return;
10384 if (sym->attr.flavor == FL_VARIABLE && gsym->type != GSYM_UNKNOWN)
10386 gfc_error ("Variable %s with binding label %s at %L uses the same global "
10387 "identifier as entity at %L", sym->name,
10388 sym->binding_label, &sym->declared_at, &gsym->where);
10389 /* Clear the binding label to prevent checking multiple times. */
10390 sym->binding_label = NULL;
10393 else if (sym->attr.flavor == FL_VARIABLE
10394 && (strcmp (module, gsym->mod_name) != 0
10395 || strcmp (sym->name, gsym->sym_name) != 0))
10397 /* This can only happen if the variable is defined in a module - if it
10398 isn't the same module, reject it. */
10399 gfc_error ("Variable %s from module %s with binding label %s at %L uses "
10400 "the same global identifier as entity at %L from module %s",
10401 sym->name, module, sym->binding_label,
10402 &sym->declared_at, &gsym->where, gsym->mod_name);
10403 sym->binding_label = NULL;
10405 else if ((sym->attr.function || sym->attr.subroutine)
10406 && ((gsym->type != GSYM_SUBROUTINE && gsym->type != GSYM_FUNCTION)
10407 || (gsym->defined && sym->attr.if_source != IFSRC_IFBODY))
10408 && sym != gsym->ns->proc_name
10409 && (module != gsym->mod_name
10410 || strcmp (gsym->sym_name, sym->name) != 0
10411 || (module && strcmp (module, gsym->mod_name) != 0)))
10413 /* Print an error if the procedure is defined multiple times; we have to
10414 exclude references to the same procedure via module association or
10415 multiple checks for the same procedure. */
10416 gfc_error ("Procedure %s with binding label %s at %L uses the same "
10417 "global identifier as entity at %L", sym->name,
10418 sym->binding_label, &sym->declared_at, &gsym->where);
10419 sym->binding_label = NULL;
10424 /* Resolve an index expression. */
10426 static bool
10427 resolve_index_expr (gfc_expr *e)
10429 if (!gfc_resolve_expr (e))
10430 return false;
10432 if (!gfc_simplify_expr (e, 0))
10433 return false;
10435 if (!gfc_specification_expr (e))
10436 return false;
10438 return true;
10442 /* Resolve a charlen structure. */
10444 static bool
10445 resolve_charlen (gfc_charlen *cl)
10447 int i, k;
10448 bool saved_specification_expr;
10450 if (cl->resolved)
10451 return true;
10453 cl->resolved = 1;
10454 saved_specification_expr = specification_expr;
10455 specification_expr = true;
10457 if (cl->length_from_typespec)
10459 if (!gfc_resolve_expr (cl->length))
10461 specification_expr = saved_specification_expr;
10462 return false;
10465 if (!gfc_simplify_expr (cl->length, 0))
10467 specification_expr = saved_specification_expr;
10468 return false;
10471 else
10474 if (!resolve_index_expr (cl->length))
10476 specification_expr = saved_specification_expr;
10477 return false;
10481 /* "If the character length parameter value evaluates to a negative
10482 value, the length of character entities declared is zero." */
10483 if (cl->length && !gfc_extract_int (cl->length, &i) && i < 0)
10485 if (gfc_option.warn_surprising)
10486 gfc_warning_now ("CHARACTER variable at %L has negative length %d,"
10487 " the length has been set to zero",
10488 &cl->length->where, i);
10489 gfc_replace_expr (cl->length,
10490 gfc_get_int_expr (gfc_default_integer_kind, NULL, 0));
10493 /* Check that the character length is not too large. */
10494 k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
10495 if (cl->length && cl->length->expr_type == EXPR_CONSTANT
10496 && cl->length->ts.type == BT_INTEGER
10497 && mpz_cmp (cl->length->value.integer, gfc_integer_kinds[k].huge) > 0)
10499 gfc_error ("String length at %L is too large", &cl->length->where);
10500 specification_expr = saved_specification_expr;
10501 return false;
10504 specification_expr = saved_specification_expr;
10505 return true;
10509 /* Test for non-constant shape arrays. */
10511 static bool
10512 is_non_constant_shape_array (gfc_symbol *sym)
10514 gfc_expr *e;
10515 int i;
10516 bool not_constant;
10518 not_constant = false;
10519 if (sym->as != NULL)
10521 /* Unfortunately, !gfc_is_compile_time_shape hits a legal case that
10522 has not been simplified; parameter array references. Do the
10523 simplification now. */
10524 for (i = 0; i < sym->as->rank + sym->as->corank; i++)
10526 e = sym->as->lower[i];
10527 if (e && (!resolve_index_expr(e)
10528 || !gfc_is_constant_expr (e)))
10529 not_constant = true;
10530 e = sym->as->upper[i];
10531 if (e && (!resolve_index_expr(e)
10532 || !gfc_is_constant_expr (e)))
10533 not_constant = true;
10536 return not_constant;
10539 /* Given a symbol and an initialization expression, add code to initialize
10540 the symbol to the function entry. */
10541 static void
10542 build_init_assign (gfc_symbol *sym, gfc_expr *init)
10544 gfc_expr *lval;
10545 gfc_code *init_st;
10546 gfc_namespace *ns = sym->ns;
10548 /* Search for the function namespace if this is a contained
10549 function without an explicit result. */
10550 if (sym->attr.function && sym == sym->result
10551 && sym->name != sym->ns->proc_name->name)
10553 ns = ns->contained;
10554 for (;ns; ns = ns->sibling)
10555 if (strcmp (ns->proc_name->name, sym->name) == 0)
10556 break;
10559 if (ns == NULL)
10561 gfc_free_expr (init);
10562 return;
10565 /* Build an l-value expression for the result. */
10566 lval = gfc_lval_expr_from_sym (sym);
10568 /* Add the code at scope entry. */
10569 init_st = gfc_get_code (EXEC_INIT_ASSIGN);
10570 init_st->next = ns->code;
10571 ns->code = init_st;
10573 /* Assign the default initializer to the l-value. */
10574 init_st->loc = sym->declared_at;
10575 init_st->expr1 = lval;
10576 init_st->expr2 = init;
10579 /* Assign the default initializer to a derived type variable or result. */
10581 static void
10582 apply_default_init (gfc_symbol *sym)
10584 gfc_expr *init = NULL;
10586 if (sym->attr.flavor != FL_VARIABLE && !sym->attr.function)
10587 return;
10589 if (sym->ts.type == BT_DERIVED && sym->ts.u.derived)
10590 init = gfc_default_initializer (&sym->ts);
10592 if (init == NULL && sym->ts.type != BT_CLASS)
10593 return;
10595 build_init_assign (sym, init);
10596 sym->attr.referenced = 1;
10599 /* Build an initializer for a local integer, real, complex, logical, or
10600 character variable, based on the command line flags finit-local-zero,
10601 finit-integer=, finit-real=, finit-logical=, and finit-runtime. Returns
10602 null if the symbol should not have a default initialization. */
10603 static gfc_expr *
10604 build_default_init_expr (gfc_symbol *sym)
10606 int char_len;
10607 gfc_expr *init_expr;
10608 int i;
10610 /* These symbols should never have a default initialization. */
10611 if (sym->attr.allocatable
10612 || sym->attr.external
10613 || sym->attr.dummy
10614 || sym->attr.pointer
10615 || sym->attr.in_equivalence
10616 || sym->attr.in_common
10617 || sym->attr.data
10618 || sym->module
10619 || sym->attr.cray_pointee
10620 || sym->attr.cray_pointer
10621 || sym->assoc)
10622 return NULL;
10624 /* Now we'll try to build an initializer expression. */
10625 init_expr = gfc_get_constant_expr (sym->ts.type, sym->ts.kind,
10626 &sym->declared_at);
10628 /* We will only initialize integers, reals, complex, logicals, and
10629 characters, and only if the corresponding command-line flags
10630 were set. Otherwise, we free init_expr and return null. */
10631 switch (sym->ts.type)
10633 case BT_INTEGER:
10634 if (gfc_option.flag_init_integer != GFC_INIT_INTEGER_OFF)
10635 mpz_set_si (init_expr->value.integer,
10636 gfc_option.flag_init_integer_value);
10637 else
10639 gfc_free_expr (init_expr);
10640 init_expr = NULL;
10642 break;
10644 case BT_REAL:
10645 switch (gfc_option.flag_init_real)
10647 case GFC_INIT_REAL_SNAN:
10648 init_expr->is_snan = 1;
10649 /* Fall through. */
10650 case GFC_INIT_REAL_NAN:
10651 mpfr_set_nan (init_expr->value.real);
10652 break;
10654 case GFC_INIT_REAL_INF:
10655 mpfr_set_inf (init_expr->value.real, 1);
10656 break;
10658 case GFC_INIT_REAL_NEG_INF:
10659 mpfr_set_inf (init_expr->value.real, -1);
10660 break;
10662 case GFC_INIT_REAL_ZERO:
10663 mpfr_set_ui (init_expr->value.real, 0.0, GFC_RND_MODE);
10664 break;
10666 default:
10667 gfc_free_expr (init_expr);
10668 init_expr = NULL;
10669 break;
10671 break;
10673 case BT_COMPLEX:
10674 switch (gfc_option.flag_init_real)
10676 case GFC_INIT_REAL_SNAN:
10677 init_expr->is_snan = 1;
10678 /* Fall through. */
10679 case GFC_INIT_REAL_NAN:
10680 mpfr_set_nan (mpc_realref (init_expr->value.complex));
10681 mpfr_set_nan (mpc_imagref (init_expr->value.complex));
10682 break;
10684 case GFC_INIT_REAL_INF:
10685 mpfr_set_inf (mpc_realref (init_expr->value.complex), 1);
10686 mpfr_set_inf (mpc_imagref (init_expr->value.complex), 1);
10687 break;
10689 case GFC_INIT_REAL_NEG_INF:
10690 mpfr_set_inf (mpc_realref (init_expr->value.complex), -1);
10691 mpfr_set_inf (mpc_imagref (init_expr->value.complex), -1);
10692 break;
10694 case GFC_INIT_REAL_ZERO:
10695 mpc_set_ui (init_expr->value.complex, 0, GFC_MPC_RND_MODE);
10696 break;
10698 default:
10699 gfc_free_expr (init_expr);
10700 init_expr = NULL;
10701 break;
10703 break;
10705 case BT_LOGICAL:
10706 if (gfc_option.flag_init_logical == GFC_INIT_LOGICAL_FALSE)
10707 init_expr->value.logical = 0;
10708 else if (gfc_option.flag_init_logical == GFC_INIT_LOGICAL_TRUE)
10709 init_expr->value.logical = 1;
10710 else
10712 gfc_free_expr (init_expr);
10713 init_expr = NULL;
10715 break;
10717 case BT_CHARACTER:
10718 /* For characters, the length must be constant in order to
10719 create a default initializer. */
10720 if (gfc_option.flag_init_character == GFC_INIT_CHARACTER_ON
10721 && sym->ts.u.cl->length
10722 && sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
10724 char_len = mpz_get_si (sym->ts.u.cl->length->value.integer);
10725 init_expr->value.character.length = char_len;
10726 init_expr->value.character.string = gfc_get_wide_string (char_len+1);
10727 for (i = 0; i < char_len; i++)
10728 init_expr->value.character.string[i]
10729 = (unsigned char) gfc_option.flag_init_character_value;
10731 else
10733 gfc_free_expr (init_expr);
10734 init_expr = NULL;
10736 if (!init_expr && gfc_option.flag_init_character == GFC_INIT_CHARACTER_ON
10737 && sym->ts.u.cl->length && gfc_option.flag_max_stack_var_size != 0)
10739 gfc_actual_arglist *arg;
10740 init_expr = gfc_get_expr ();
10741 init_expr->where = sym->declared_at;
10742 init_expr->ts = sym->ts;
10743 init_expr->expr_type = EXPR_FUNCTION;
10744 init_expr->value.function.isym =
10745 gfc_intrinsic_function_by_id (GFC_ISYM_REPEAT);
10746 init_expr->value.function.name = "repeat";
10747 arg = gfc_get_actual_arglist ();
10748 arg->expr = gfc_get_character_expr (sym->ts.kind, &sym->declared_at,
10749 NULL, 1);
10750 arg->expr->value.character.string[0]
10751 = gfc_option.flag_init_character_value;
10752 arg->next = gfc_get_actual_arglist ();
10753 arg->next->expr = gfc_copy_expr (sym->ts.u.cl->length);
10754 init_expr->value.function.actual = arg;
10756 break;
10758 default:
10759 gfc_free_expr (init_expr);
10760 init_expr = NULL;
10762 return init_expr;
10765 /* Add an initialization expression to a local variable. */
10766 static void
10767 apply_default_init_local (gfc_symbol *sym)
10769 gfc_expr *init = NULL;
10771 /* The symbol should be a variable or a function return value. */
10772 if ((sym->attr.flavor != FL_VARIABLE && !sym->attr.function)
10773 || (sym->attr.function && sym->result != sym))
10774 return;
10776 /* Try to build the initializer expression. If we can't initialize
10777 this symbol, then init will be NULL. */
10778 init = build_default_init_expr (sym);
10779 if (init == NULL)
10780 return;
10782 /* For saved variables, we don't want to add an initializer at function
10783 entry, so we just add a static initializer. Note that automatic variables
10784 are stack allocated even with -fno-automatic; we have also to exclude
10785 result variable, which are also nonstatic. */
10786 if (sym->attr.save || sym->ns->save_all
10787 || (gfc_option.flag_max_stack_var_size == 0 && !sym->attr.result
10788 && !sym->ns->proc_name->attr.recursive
10789 && (!sym->attr.dimension || !is_non_constant_shape_array (sym))))
10791 /* Don't clobber an existing initializer! */
10792 gcc_assert (sym->value == NULL);
10793 sym->value = init;
10794 return;
10797 build_init_assign (sym, init);
10801 /* Resolution of common features of flavors variable and procedure. */
10803 static bool
10804 resolve_fl_var_and_proc (gfc_symbol *sym, int mp_flag)
10806 gfc_array_spec *as;
10808 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
10809 as = CLASS_DATA (sym)->as;
10810 else
10811 as = sym->as;
10813 /* Constraints on deferred shape variable. */
10814 if (as == NULL || as->type != AS_DEFERRED)
10816 bool pointer, allocatable, dimension;
10818 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
10820 pointer = CLASS_DATA (sym)->attr.class_pointer;
10821 allocatable = CLASS_DATA (sym)->attr.allocatable;
10822 dimension = CLASS_DATA (sym)->attr.dimension;
10824 else
10826 pointer = sym->attr.pointer && !sym->attr.select_type_temporary;
10827 allocatable = sym->attr.allocatable;
10828 dimension = sym->attr.dimension;
10831 if (allocatable)
10833 if (dimension && as->type != AS_ASSUMED_RANK)
10835 gfc_error ("Allocatable array '%s' at %L must have a deferred "
10836 "shape or assumed rank", sym->name, &sym->declared_at);
10837 return false;
10839 else if (!gfc_notify_std (GFC_STD_F2003, "Scalar object "
10840 "'%s' at %L may not be ALLOCATABLE",
10841 sym->name, &sym->declared_at))
10842 return false;
10845 if (pointer && dimension && as->type != AS_ASSUMED_RANK)
10847 gfc_error ("Array pointer '%s' at %L must have a deferred shape or "
10848 "assumed rank", sym->name, &sym->declared_at);
10849 return false;
10852 else
10854 if (!mp_flag && !sym->attr.allocatable && !sym->attr.pointer
10855 && sym->ts.type != BT_CLASS && !sym->assoc)
10857 gfc_error ("Array '%s' at %L cannot have a deferred shape",
10858 sym->name, &sym->declared_at);
10859 return false;
10863 /* Constraints on polymorphic variables. */
10864 if (sym->ts.type == BT_CLASS && !(sym->result && sym->result != sym))
10866 /* F03:C502. */
10867 if (sym->attr.class_ok
10868 && !sym->attr.select_type_temporary
10869 && !UNLIMITED_POLY (sym)
10870 && !gfc_type_is_extensible (CLASS_DATA (sym)->ts.u.derived))
10872 gfc_error ("Type '%s' of CLASS variable '%s' at %L is not extensible",
10873 CLASS_DATA (sym)->ts.u.derived->name, sym->name,
10874 &sym->declared_at);
10875 return false;
10878 /* F03:C509. */
10879 /* Assume that use associated symbols were checked in the module ns.
10880 Class-variables that are associate-names are also something special
10881 and excepted from the test. */
10882 if (!sym->attr.class_ok && !sym->attr.use_assoc && !sym->assoc)
10884 gfc_error ("CLASS variable '%s' at %L must be dummy, allocatable "
10885 "or pointer", sym->name, &sym->declared_at);
10886 return false;
10890 return true;
10894 /* Additional checks for symbols with flavor variable and derived
10895 type. To be called from resolve_fl_variable. */
10897 static bool
10898 resolve_fl_variable_derived (gfc_symbol *sym, int no_init_flag)
10900 gcc_assert (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS);
10902 /* Check to see if a derived type is blocked from being host
10903 associated by the presence of another class I symbol in the same
10904 namespace. 14.6.1.3 of the standard and the discussion on
10905 comp.lang.fortran. */
10906 if (sym->ns != sym->ts.u.derived->ns
10907 && sym->ns->proc_name->attr.if_source != IFSRC_IFBODY)
10909 gfc_symbol *s;
10910 gfc_find_symbol (sym->ts.u.derived->name, sym->ns, 0, &s);
10911 if (s && s->attr.generic)
10912 s = gfc_find_dt_in_generic (s);
10913 if (s && s->attr.flavor != FL_DERIVED)
10915 gfc_error ("The type '%s' cannot be host associated at %L "
10916 "because it is blocked by an incompatible object "
10917 "of the same name declared at %L",
10918 sym->ts.u.derived->name, &sym->declared_at,
10919 &s->declared_at);
10920 return false;
10924 /* 4th constraint in section 11.3: "If an object of a type for which
10925 component-initialization is specified (R429) appears in the
10926 specification-part of a module and does not have the ALLOCATABLE
10927 or POINTER attribute, the object shall have the SAVE attribute."
10929 The check for initializers is performed with
10930 gfc_has_default_initializer because gfc_default_initializer generates
10931 a hidden default for allocatable components. */
10932 if (!(sym->value || no_init_flag) && sym->ns->proc_name
10933 && sym->ns->proc_name->attr.flavor == FL_MODULE
10934 && !sym->ns->save_all && !sym->attr.save
10935 && !sym->attr.pointer && !sym->attr.allocatable
10936 && gfc_has_default_initializer (sym->ts.u.derived)
10937 && !gfc_notify_std (GFC_STD_F2008, "Implied SAVE for module variable "
10938 "'%s' at %L, needed due to the default "
10939 "initialization", sym->name, &sym->declared_at))
10940 return false;
10942 /* Assign default initializer. */
10943 if (!(sym->value || sym->attr.pointer || sym->attr.allocatable)
10944 && (!no_init_flag || sym->attr.intent == INTENT_OUT))
10946 sym->value = gfc_default_initializer (&sym->ts);
10949 return true;
10953 /* Resolve symbols with flavor variable. */
10955 static bool
10956 resolve_fl_variable (gfc_symbol *sym, int mp_flag)
10958 int no_init_flag, automatic_flag;
10959 gfc_expr *e;
10960 const char *auto_save_msg;
10961 bool saved_specification_expr;
10963 auto_save_msg = "Automatic object '%s' at %L cannot have the "
10964 "SAVE attribute";
10966 if (!resolve_fl_var_and_proc (sym, mp_flag))
10967 return false;
10969 /* Set this flag to check that variables are parameters of all entries.
10970 This check is effected by the call to gfc_resolve_expr through
10971 is_non_constant_shape_array. */
10972 saved_specification_expr = specification_expr;
10973 specification_expr = true;
10975 if (sym->ns->proc_name
10976 && (sym->ns->proc_name->attr.flavor == FL_MODULE
10977 || sym->ns->proc_name->attr.is_main_program)
10978 && !sym->attr.use_assoc
10979 && !sym->attr.allocatable
10980 && !sym->attr.pointer
10981 && is_non_constant_shape_array (sym))
10983 /* The shape of a main program or module array needs to be
10984 constant. */
10985 gfc_error ("The module or main program array '%s' at %L must "
10986 "have constant shape", sym->name, &sym->declared_at);
10987 specification_expr = saved_specification_expr;
10988 return false;
10991 /* Constraints on deferred type parameter. */
10992 if (sym->ts.deferred
10993 && !(sym->attr.pointer
10994 || sym->attr.allocatable
10995 || sym->attr.omp_udr_artificial_var))
10997 gfc_error ("Entity '%s' at %L has a deferred type parameter and "
10998 "requires either the pointer or allocatable attribute",
10999 sym->name, &sym->declared_at);
11000 specification_expr = saved_specification_expr;
11001 return false;
11004 if (sym->ts.type == BT_CHARACTER)
11006 /* Make sure that character string variables with assumed length are
11007 dummy arguments. */
11008 e = sym->ts.u.cl->length;
11009 if (e == NULL && !sym->attr.dummy && !sym->attr.result
11010 && !sym->ts.deferred && !sym->attr.select_type_temporary
11011 && !sym->attr.omp_udr_artificial_var)
11013 gfc_error ("Entity with assumed character length at %L must be a "
11014 "dummy argument or a PARAMETER", &sym->declared_at);
11015 specification_expr = saved_specification_expr;
11016 return false;
11019 if (e && sym->attr.save == SAVE_EXPLICIT && !gfc_is_constant_expr (e))
11021 gfc_error (auto_save_msg, sym->name, &sym->declared_at);
11022 specification_expr = saved_specification_expr;
11023 return false;
11026 if (!gfc_is_constant_expr (e)
11027 && !(e->expr_type == EXPR_VARIABLE
11028 && e->symtree->n.sym->attr.flavor == FL_PARAMETER))
11030 if (!sym->attr.use_assoc && sym->ns->proc_name
11031 && (sym->ns->proc_name->attr.flavor == FL_MODULE
11032 || sym->ns->proc_name->attr.is_main_program))
11034 gfc_error ("'%s' at %L must have constant character length "
11035 "in this context", sym->name, &sym->declared_at);
11036 specification_expr = saved_specification_expr;
11037 return false;
11039 if (sym->attr.in_common)
11041 gfc_error ("COMMON variable '%s' at %L must have constant "
11042 "character length", sym->name, &sym->declared_at);
11043 specification_expr = saved_specification_expr;
11044 return false;
11049 if (sym->value == NULL && sym->attr.referenced)
11050 apply_default_init_local (sym); /* Try to apply a default initialization. */
11052 /* Determine if the symbol may not have an initializer. */
11053 no_init_flag = automatic_flag = 0;
11054 if (sym->attr.allocatable || sym->attr.external || sym->attr.dummy
11055 || sym->attr.intrinsic || sym->attr.result)
11056 no_init_flag = 1;
11057 else if ((sym->attr.dimension || sym->attr.codimension) && !sym->attr.pointer
11058 && is_non_constant_shape_array (sym))
11060 no_init_flag = automatic_flag = 1;
11062 /* Also, they must not have the SAVE attribute.
11063 SAVE_IMPLICIT is checked below. */
11064 if (sym->as && sym->attr.codimension)
11066 int corank = sym->as->corank;
11067 sym->as->corank = 0;
11068 no_init_flag = automatic_flag = is_non_constant_shape_array (sym);
11069 sym->as->corank = corank;
11071 if (automatic_flag && sym->attr.save == SAVE_EXPLICIT)
11073 gfc_error (auto_save_msg, sym->name, &sym->declared_at);
11074 specification_expr = saved_specification_expr;
11075 return false;
11079 /* Ensure that any initializer is simplified. */
11080 if (sym->value)
11081 gfc_simplify_expr (sym->value, 1);
11083 /* Reject illegal initializers. */
11084 if (!sym->mark && sym->value)
11086 if (sym->attr.allocatable || (sym->ts.type == BT_CLASS
11087 && CLASS_DATA (sym)->attr.allocatable))
11088 gfc_error ("Allocatable '%s' at %L cannot have an initializer",
11089 sym->name, &sym->declared_at);
11090 else if (sym->attr.external)
11091 gfc_error ("External '%s' at %L cannot have an initializer",
11092 sym->name, &sym->declared_at);
11093 else if (sym->attr.dummy
11094 && !(sym->ts.type == BT_DERIVED && sym->attr.intent == INTENT_OUT))
11095 gfc_error ("Dummy '%s' at %L cannot have an initializer",
11096 sym->name, &sym->declared_at);
11097 else if (sym->attr.intrinsic)
11098 gfc_error ("Intrinsic '%s' at %L cannot have an initializer",
11099 sym->name, &sym->declared_at);
11100 else if (sym->attr.result)
11101 gfc_error ("Function result '%s' at %L cannot have an initializer",
11102 sym->name, &sym->declared_at);
11103 else if (automatic_flag)
11104 gfc_error ("Automatic array '%s' at %L cannot have an initializer",
11105 sym->name, &sym->declared_at);
11106 else
11107 goto no_init_error;
11108 specification_expr = saved_specification_expr;
11109 return false;
11112 no_init_error:
11113 if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
11115 bool res = resolve_fl_variable_derived (sym, no_init_flag);
11116 specification_expr = saved_specification_expr;
11117 return res;
11120 specification_expr = saved_specification_expr;
11121 return true;
11125 /* Resolve a procedure. */
11127 static bool
11128 resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
11130 gfc_formal_arglist *arg;
11132 if (sym->attr.function
11133 && !resolve_fl_var_and_proc (sym, mp_flag))
11134 return false;
11136 if (sym->ts.type == BT_CHARACTER)
11138 gfc_charlen *cl = sym->ts.u.cl;
11140 if (cl && cl->length && gfc_is_constant_expr (cl->length)
11141 && !resolve_charlen (cl))
11142 return false;
11144 if ((!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
11145 && sym->attr.proc == PROC_ST_FUNCTION)
11147 gfc_error ("Character-valued statement function '%s' at %L must "
11148 "have constant length", sym->name, &sym->declared_at);
11149 return false;
11153 /* Ensure that derived type for are not of a private type. Internal
11154 module procedures are excluded by 2.2.3.3 - i.e., they are not
11155 externally accessible and can access all the objects accessible in
11156 the host. */
11157 if (!(sym->ns->parent
11158 && sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
11159 && gfc_check_symbol_access (sym))
11161 gfc_interface *iface;
11163 for (arg = gfc_sym_get_dummy_args (sym); arg; arg = arg->next)
11165 if (arg->sym
11166 && arg->sym->ts.type == BT_DERIVED
11167 && !arg->sym->ts.u.derived->attr.use_assoc
11168 && !gfc_check_symbol_access (arg->sym->ts.u.derived)
11169 && !gfc_notify_std (GFC_STD_F2003, "'%s' is of a PRIVATE type "
11170 "and cannot be a dummy argument"
11171 " of '%s', which is PUBLIC at %L",
11172 arg->sym->name, sym->name,
11173 &sym->declared_at))
11175 /* Stop this message from recurring. */
11176 arg->sym->ts.u.derived->attr.access = ACCESS_PUBLIC;
11177 return false;
11181 /* PUBLIC interfaces may expose PRIVATE procedures that take types
11182 PRIVATE to the containing module. */
11183 for (iface = sym->generic; iface; iface = iface->next)
11185 for (arg = gfc_sym_get_dummy_args (iface->sym); arg; arg = arg->next)
11187 if (arg->sym
11188 && arg->sym->ts.type == BT_DERIVED
11189 && !arg->sym->ts.u.derived->attr.use_assoc
11190 && !gfc_check_symbol_access (arg->sym->ts.u.derived)
11191 && !gfc_notify_std (GFC_STD_F2003, "Procedure '%s' in "
11192 "PUBLIC interface '%s' at %L "
11193 "takes dummy arguments of '%s' which "
11194 "is PRIVATE", iface->sym->name,
11195 sym->name, &iface->sym->declared_at,
11196 gfc_typename(&arg->sym->ts)))
11198 /* Stop this message from recurring. */
11199 arg->sym->ts.u.derived->attr.access = ACCESS_PUBLIC;
11200 return false;
11206 if (sym->attr.function && sym->value && sym->attr.proc != PROC_ST_FUNCTION
11207 && !sym->attr.proc_pointer)
11209 gfc_error ("Function '%s' at %L cannot have an initializer",
11210 sym->name, &sym->declared_at);
11211 return false;
11214 /* An external symbol may not have an initializer because it is taken to be
11215 a procedure. Exception: Procedure Pointers. */
11216 if (sym->attr.external && sym->value && !sym->attr.proc_pointer)
11218 gfc_error ("External object '%s' at %L may not have an initializer",
11219 sym->name, &sym->declared_at);
11220 return false;
11223 /* An elemental function is required to return a scalar 12.7.1 */
11224 if (sym->attr.elemental && sym->attr.function && sym->as)
11226 gfc_error ("ELEMENTAL function '%s' at %L must have a scalar "
11227 "result", sym->name, &sym->declared_at);
11228 /* Reset so that the error only occurs once. */
11229 sym->attr.elemental = 0;
11230 return false;
11233 if (sym->attr.proc == PROC_ST_FUNCTION
11234 && (sym->attr.allocatable || sym->attr.pointer))
11236 gfc_error ("Statement function '%s' at %L may not have pointer or "
11237 "allocatable attribute", sym->name, &sym->declared_at);
11238 return false;
11241 /* 5.1.1.5 of the Standard: A function name declared with an asterisk
11242 char-len-param shall not be array-valued, pointer-valued, recursive
11243 or pure. ....snip... A character value of * may only be used in the
11244 following ways: (i) Dummy arg of procedure - dummy associates with
11245 actual length; (ii) To declare a named constant; or (iii) External
11246 function - but length must be declared in calling scoping unit. */
11247 if (sym->attr.function
11248 && sym->ts.type == BT_CHARACTER && !sym->ts.deferred
11249 && sym->ts.u.cl && sym->ts.u.cl->length == NULL)
11251 if ((sym->as && sym->as->rank) || (sym->attr.pointer)
11252 || (sym->attr.recursive) || (sym->attr.pure))
11254 if (sym->as && sym->as->rank)
11255 gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
11256 "array-valued", sym->name, &sym->declared_at);
11258 if (sym->attr.pointer)
11259 gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
11260 "pointer-valued", sym->name, &sym->declared_at);
11262 if (sym->attr.pure)
11263 gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
11264 "pure", sym->name, &sym->declared_at);
11266 if (sym->attr.recursive)
11267 gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
11268 "recursive", sym->name, &sym->declared_at);
11270 return false;
11273 /* Appendix B.2 of the standard. Contained functions give an
11274 error anyway. Deferred character length is an F2003 feature.
11275 Don't warn on intrinsic conversion functions, which start
11276 with two underscores. */
11277 if (!sym->attr.contained && !sym->ts.deferred
11278 && (sym->name[0] != '_' || sym->name[1] != '_'))
11279 gfc_notify_std (GFC_STD_F95_OBS,
11280 "CHARACTER(*) function '%s' at %L",
11281 sym->name, &sym->declared_at);
11284 /* F2008, C1218. */
11285 if (sym->attr.elemental)
11287 if (sym->attr.proc_pointer)
11289 gfc_error ("Procedure pointer '%s' at %L shall not be elemental",
11290 sym->name, &sym->declared_at);
11291 return false;
11293 if (sym->attr.dummy)
11295 gfc_error ("Dummy procedure '%s' at %L shall not be elemental",
11296 sym->name, &sym->declared_at);
11297 return false;
11301 if (sym->attr.is_bind_c && sym->attr.is_c_interop != 1)
11303 gfc_formal_arglist *curr_arg;
11304 int has_non_interop_arg = 0;
11306 if (!verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
11307 sym->common_block))
11309 /* Clear these to prevent looking at them again if there was an
11310 error. */
11311 sym->attr.is_bind_c = 0;
11312 sym->attr.is_c_interop = 0;
11313 sym->ts.is_c_interop = 0;
11315 else
11317 /* So far, no errors have been found. */
11318 sym->attr.is_c_interop = 1;
11319 sym->ts.is_c_interop = 1;
11322 curr_arg = gfc_sym_get_dummy_args (sym);
11323 while (curr_arg != NULL)
11325 /* Skip implicitly typed dummy args here. */
11326 if (curr_arg->sym->attr.implicit_type == 0)
11327 if (!gfc_verify_c_interop_param (curr_arg->sym))
11328 /* If something is found to fail, record the fact so we
11329 can mark the symbol for the procedure as not being
11330 BIND(C) to try and prevent multiple errors being
11331 reported. */
11332 has_non_interop_arg = 1;
11334 curr_arg = curr_arg->next;
11337 /* See if any of the arguments were not interoperable and if so, clear
11338 the procedure symbol to prevent duplicate error messages. */
11339 if (has_non_interop_arg != 0)
11341 sym->attr.is_c_interop = 0;
11342 sym->ts.is_c_interop = 0;
11343 sym->attr.is_bind_c = 0;
11347 if (!sym->attr.proc_pointer)
11349 if (sym->attr.save == SAVE_EXPLICIT)
11351 gfc_error ("PROCEDURE attribute conflicts with SAVE attribute "
11352 "in '%s' at %L", sym->name, &sym->declared_at);
11353 return false;
11355 if (sym->attr.intent)
11357 gfc_error ("PROCEDURE attribute conflicts with INTENT attribute "
11358 "in '%s' at %L", sym->name, &sym->declared_at);
11359 return false;
11361 if (sym->attr.subroutine && sym->attr.result)
11363 gfc_error ("PROCEDURE attribute conflicts with RESULT attribute "
11364 "in '%s' at %L", sym->name, &sym->declared_at);
11365 return false;
11367 if (sym->attr.external && sym->attr.function
11368 && ((sym->attr.if_source == IFSRC_DECL && !sym->attr.procedure)
11369 || sym->attr.contained))
11371 gfc_error ("EXTERNAL attribute conflicts with FUNCTION attribute "
11372 "in '%s' at %L", sym->name, &sym->declared_at);
11373 return false;
11375 if (strcmp ("ppr@", sym->name) == 0)
11377 gfc_error ("Procedure pointer result '%s' at %L "
11378 "is missing the pointer attribute",
11379 sym->ns->proc_name->name, &sym->declared_at);
11380 return false;
11384 return true;
11388 /* Resolve a list of finalizer procedures. That is, after they have hopefully
11389 been defined and we now know their defined arguments, check that they fulfill
11390 the requirements of the standard for procedures used as finalizers. */
11392 static bool
11393 gfc_resolve_finalizers (gfc_symbol* derived, bool *finalizable)
11395 gfc_finalizer* list;
11396 gfc_finalizer** prev_link; /* For removing wrong entries from the list. */
11397 bool result = true;
11398 bool seen_scalar = false;
11399 gfc_symbol *vtab;
11400 gfc_component *c;
11401 gfc_symbol *parent = gfc_get_derived_super_type (derived);
11403 if (parent)
11404 gfc_resolve_finalizers (parent, finalizable);
11406 /* Return early when not finalizable. Additionally, ensure that derived-type
11407 components have a their finalizables resolved. */
11408 if (!derived->f2k_derived || !derived->f2k_derived->finalizers)
11410 bool has_final = false;
11411 for (c = derived->components; c; c = c->next)
11412 if (c->ts.type == BT_DERIVED
11413 && !c->attr.pointer && !c->attr.proc_pointer && !c->attr.allocatable)
11415 bool has_final2 = false;
11416 if (!gfc_resolve_finalizers (c->ts.u.derived, &has_final))
11417 return false; /* Error. */
11418 has_final = has_final || has_final2;
11420 if (!has_final)
11422 if (finalizable)
11423 *finalizable = false;
11424 return true;
11428 /* Walk over the list of finalizer-procedures, check them, and if any one
11429 does not fit in with the standard's definition, print an error and remove
11430 it from the list. */
11431 prev_link = &derived->f2k_derived->finalizers;
11432 for (list = derived->f2k_derived->finalizers; list; list = *prev_link)
11434 gfc_formal_arglist *dummy_args;
11435 gfc_symbol* arg;
11436 gfc_finalizer* i;
11437 int my_rank;
11439 /* Skip this finalizer if we already resolved it. */
11440 if (list->proc_tree)
11442 prev_link = &(list->next);
11443 continue;
11446 /* Check this exists and is a SUBROUTINE. */
11447 if (!list->proc_sym->attr.subroutine)
11449 gfc_error ("FINAL procedure '%s' at %L is not a SUBROUTINE",
11450 list->proc_sym->name, &list->where);
11451 goto error;
11454 /* We should have exactly one argument. */
11455 dummy_args = gfc_sym_get_dummy_args (list->proc_sym);
11456 if (!dummy_args || dummy_args->next)
11458 gfc_error ("FINAL procedure at %L must have exactly one argument",
11459 &list->where);
11460 goto error;
11462 arg = dummy_args->sym;
11464 /* This argument must be of our type. */
11465 if (arg->ts.type != BT_DERIVED || arg->ts.u.derived != derived)
11467 gfc_error ("Argument of FINAL procedure at %L must be of type '%s'",
11468 &arg->declared_at, derived->name);
11469 goto error;
11472 /* It must neither be a pointer nor allocatable nor optional. */
11473 if (arg->attr.pointer)
11475 gfc_error ("Argument of FINAL procedure at %L must not be a POINTER",
11476 &arg->declared_at);
11477 goto error;
11479 if (arg->attr.allocatable)
11481 gfc_error ("Argument of FINAL procedure at %L must not be"
11482 " ALLOCATABLE", &arg->declared_at);
11483 goto error;
11485 if (arg->attr.optional)
11487 gfc_error ("Argument of FINAL procedure at %L must not be OPTIONAL",
11488 &arg->declared_at);
11489 goto error;
11492 /* It must not be INTENT(OUT). */
11493 if (arg->attr.intent == INTENT_OUT)
11495 gfc_error ("Argument of FINAL procedure at %L must not be"
11496 " INTENT(OUT)", &arg->declared_at);
11497 goto error;
11500 /* Warn if the procedure is non-scalar and not assumed shape. */
11501 if (gfc_option.warn_surprising && arg->as && arg->as->rank != 0
11502 && arg->as->type != AS_ASSUMED_SHAPE)
11503 gfc_warning ("Non-scalar FINAL procedure at %L should have assumed"
11504 " shape argument", &arg->declared_at);
11506 /* Check that it does not match in kind and rank with a FINAL procedure
11507 defined earlier. To really loop over the *earlier* declarations,
11508 we need to walk the tail of the list as new ones were pushed at the
11509 front. */
11510 /* TODO: Handle kind parameters once they are implemented. */
11511 my_rank = (arg->as ? arg->as->rank : 0);
11512 for (i = list->next; i; i = i->next)
11514 gfc_formal_arglist *dummy_args;
11516 /* Argument list might be empty; that is an error signalled earlier,
11517 but we nevertheless continued resolving. */
11518 dummy_args = gfc_sym_get_dummy_args (i->proc_sym);
11519 if (dummy_args)
11521 gfc_symbol* i_arg = dummy_args->sym;
11522 const int i_rank = (i_arg->as ? i_arg->as->rank : 0);
11523 if (i_rank == my_rank)
11525 gfc_error ("FINAL procedure '%s' declared at %L has the same"
11526 " rank (%d) as '%s'",
11527 list->proc_sym->name, &list->where, my_rank,
11528 i->proc_sym->name);
11529 goto error;
11534 /* Is this the/a scalar finalizer procedure? */
11535 if (!arg->as || arg->as->rank == 0)
11536 seen_scalar = true;
11538 /* Find the symtree for this procedure. */
11539 gcc_assert (!list->proc_tree);
11540 list->proc_tree = gfc_find_sym_in_symtree (list->proc_sym);
11542 prev_link = &list->next;
11543 continue;
11545 /* Remove wrong nodes immediately from the list so we don't risk any
11546 troubles in the future when they might fail later expectations. */
11547 error:
11548 i = list;
11549 *prev_link = list->next;
11550 gfc_free_finalizer (i);
11551 result = false;
11554 if (result == false)
11555 return false;
11557 /* Warn if we haven't seen a scalar finalizer procedure (but we know there
11558 were nodes in the list, must have been for arrays. It is surely a good
11559 idea to have a scalar version there if there's something to finalize. */
11560 if (gfc_option.warn_surprising && result && !seen_scalar)
11561 gfc_warning ("Only array FINAL procedures declared for derived type '%s'"
11562 " defined at %L, suggest also scalar one",
11563 derived->name, &derived->declared_at);
11565 vtab = gfc_find_derived_vtab (derived);
11566 c = vtab->ts.u.derived->components->next->next->next->next->next;
11567 gfc_set_sym_referenced (c->initializer->symtree->n.sym);
11569 if (finalizable)
11570 *finalizable = true;
11572 return true;
11576 /* Check if two GENERIC targets are ambiguous and emit an error is they are. */
11578 static bool
11579 check_generic_tbp_ambiguity (gfc_tbp_generic* t1, gfc_tbp_generic* t2,
11580 const char* generic_name, locus where)
11582 gfc_symbol *sym1, *sym2;
11583 const char *pass1, *pass2;
11584 gfc_formal_arglist *dummy_args;
11586 gcc_assert (t1->specific && t2->specific);
11587 gcc_assert (!t1->specific->is_generic);
11588 gcc_assert (!t2->specific->is_generic);
11589 gcc_assert (t1->is_operator == t2->is_operator);
11591 sym1 = t1->specific->u.specific->n.sym;
11592 sym2 = t2->specific->u.specific->n.sym;
11594 if (sym1 == sym2)
11595 return true;
11597 /* Both must be SUBROUTINEs or both must be FUNCTIONs. */
11598 if (sym1->attr.subroutine != sym2->attr.subroutine
11599 || sym1->attr.function != sym2->attr.function)
11601 gfc_error ("'%s' and '%s' can't be mixed FUNCTION/SUBROUTINE for"
11602 " GENERIC '%s' at %L",
11603 sym1->name, sym2->name, generic_name, &where);
11604 return false;
11607 /* Determine PASS arguments. */
11608 if (t1->specific->nopass)
11609 pass1 = NULL;
11610 else if (t1->specific->pass_arg)
11611 pass1 = t1->specific->pass_arg;
11612 else
11614 dummy_args = gfc_sym_get_dummy_args (t1->specific->u.specific->n.sym);
11615 if (dummy_args)
11616 pass1 = dummy_args->sym->name;
11617 else
11618 pass1 = NULL;
11620 if (t2->specific->nopass)
11621 pass2 = NULL;
11622 else if (t2->specific->pass_arg)
11623 pass2 = t2->specific->pass_arg;
11624 else
11626 dummy_args = gfc_sym_get_dummy_args (t2->specific->u.specific->n.sym);
11627 if (dummy_args)
11628 pass2 = dummy_args->sym->name;
11629 else
11630 pass2 = NULL;
11633 /* Compare the interfaces. */
11634 if (gfc_compare_interfaces (sym1, sym2, sym2->name, !t1->is_operator, 0,
11635 NULL, 0, pass1, pass2))
11637 gfc_error ("'%s' and '%s' for GENERIC '%s' at %L are ambiguous",
11638 sym1->name, sym2->name, generic_name, &where);
11639 return false;
11642 return true;
11646 /* Worker function for resolving a generic procedure binding; this is used to
11647 resolve GENERIC as well as user and intrinsic OPERATOR typebound procedures.
11649 The difference between those cases is finding possible inherited bindings
11650 that are overridden, as one has to look for them in tb_sym_root,
11651 tb_uop_root or tb_op, respectively. Thus the caller must already find
11652 the super-type and set p->overridden correctly. */
11654 static bool
11655 resolve_tb_generic_targets (gfc_symbol* super_type,
11656 gfc_typebound_proc* p, const char* name)
11658 gfc_tbp_generic* target;
11659 gfc_symtree* first_target;
11660 gfc_symtree* inherited;
11662 gcc_assert (p && p->is_generic);
11664 /* Try to find the specific bindings for the symtrees in our target-list. */
11665 gcc_assert (p->u.generic);
11666 for (target = p->u.generic; target; target = target->next)
11667 if (!target->specific)
11669 gfc_typebound_proc* overridden_tbp;
11670 gfc_tbp_generic* g;
11671 const char* target_name;
11673 target_name = target->specific_st->name;
11675 /* Defined for this type directly. */
11676 if (target->specific_st->n.tb && !target->specific_st->n.tb->error)
11678 target->specific = target->specific_st->n.tb;
11679 goto specific_found;
11682 /* Look for an inherited specific binding. */
11683 if (super_type)
11685 inherited = gfc_find_typebound_proc (super_type, NULL, target_name,
11686 true, NULL);
11688 if (inherited)
11690 gcc_assert (inherited->n.tb);
11691 target->specific = inherited->n.tb;
11692 goto specific_found;
11696 gfc_error ("Undefined specific binding '%s' as target of GENERIC '%s'"
11697 " at %L", target_name, name, &p->where);
11698 return false;
11700 /* Once we've found the specific binding, check it is not ambiguous with
11701 other specifics already found or inherited for the same GENERIC. */
11702 specific_found:
11703 gcc_assert (target->specific);
11705 /* This must really be a specific binding! */
11706 if (target->specific->is_generic)
11708 gfc_error ("GENERIC '%s' at %L must target a specific binding,"
11709 " '%s' is GENERIC, too", name, &p->where, target_name);
11710 return false;
11713 /* Check those already resolved on this type directly. */
11714 for (g = p->u.generic; g; g = g->next)
11715 if (g != target && g->specific
11716 && !check_generic_tbp_ambiguity (target, g, name, p->where))
11717 return false;
11719 /* Check for ambiguity with inherited specific targets. */
11720 for (overridden_tbp = p->overridden; overridden_tbp;
11721 overridden_tbp = overridden_tbp->overridden)
11722 if (overridden_tbp->is_generic)
11724 for (g = overridden_tbp->u.generic; g; g = g->next)
11726 gcc_assert (g->specific);
11727 if (!check_generic_tbp_ambiguity (target, g, name, p->where))
11728 return false;
11733 /* If we attempt to "overwrite" a specific binding, this is an error. */
11734 if (p->overridden && !p->overridden->is_generic)
11736 gfc_error ("GENERIC '%s' at %L can't overwrite specific binding with"
11737 " the same name", name, &p->where);
11738 return false;
11741 /* Take the SUBROUTINE/FUNCTION attributes of the first specific target, as
11742 all must have the same attributes here. */
11743 first_target = p->u.generic->specific->u.specific;
11744 gcc_assert (first_target);
11745 p->subroutine = first_target->n.sym->attr.subroutine;
11746 p->function = first_target->n.sym->attr.function;
11748 return true;
11752 /* Resolve a GENERIC procedure binding for a derived type. */
11754 static bool
11755 resolve_typebound_generic (gfc_symbol* derived, gfc_symtree* st)
11757 gfc_symbol* super_type;
11759 /* Find the overridden binding if any. */
11760 st->n.tb->overridden = NULL;
11761 super_type = gfc_get_derived_super_type (derived);
11762 if (super_type)
11764 gfc_symtree* overridden;
11765 overridden = gfc_find_typebound_proc (super_type, NULL, st->name,
11766 true, NULL);
11768 if (overridden && overridden->n.tb)
11769 st->n.tb->overridden = overridden->n.tb;
11772 /* Resolve using worker function. */
11773 return resolve_tb_generic_targets (super_type, st->n.tb, st->name);
11777 /* Retrieve the target-procedure of an operator binding and do some checks in
11778 common for intrinsic and user-defined type-bound operators. */
11780 static gfc_symbol*
11781 get_checked_tb_operator_target (gfc_tbp_generic* target, locus where)
11783 gfc_symbol* target_proc;
11785 gcc_assert (target->specific && !target->specific->is_generic);
11786 target_proc = target->specific->u.specific->n.sym;
11787 gcc_assert (target_proc);
11789 /* F08:C468. All operator bindings must have a passed-object dummy argument. */
11790 if (target->specific->nopass)
11792 gfc_error ("Type-bound operator at %L can't be NOPASS", &where);
11793 return NULL;
11796 return target_proc;
11800 /* Resolve a type-bound intrinsic operator. */
11802 static bool
11803 resolve_typebound_intrinsic_op (gfc_symbol* derived, gfc_intrinsic_op op,
11804 gfc_typebound_proc* p)
11806 gfc_symbol* super_type;
11807 gfc_tbp_generic* target;
11809 /* If there's already an error here, do nothing (but don't fail again). */
11810 if (p->error)
11811 return true;
11813 /* Operators should always be GENERIC bindings. */
11814 gcc_assert (p->is_generic);
11816 /* Look for an overridden binding. */
11817 super_type = gfc_get_derived_super_type (derived);
11818 if (super_type && super_type->f2k_derived)
11819 p->overridden = gfc_find_typebound_intrinsic_op (super_type, NULL,
11820 op, true, NULL);
11821 else
11822 p->overridden = NULL;
11824 /* Resolve general GENERIC properties using worker function. */
11825 if (!resolve_tb_generic_targets (super_type, p, gfc_op2string(op)))
11826 goto error;
11828 /* Check the targets to be procedures of correct interface. */
11829 for (target = p->u.generic; target; target = target->next)
11831 gfc_symbol* target_proc;
11833 target_proc = get_checked_tb_operator_target (target, p->where);
11834 if (!target_proc)
11835 goto error;
11837 if (!gfc_check_operator_interface (target_proc, op, p->where))
11838 goto error;
11840 /* Add target to non-typebound operator list. */
11841 if (!target->specific->deferred && !derived->attr.use_assoc
11842 && p->access != ACCESS_PRIVATE && derived->ns == gfc_current_ns)
11844 gfc_interface *head, *intr;
11845 if (!gfc_check_new_interface (derived->ns->op[op], target_proc, p->where))
11846 return false;
11847 head = derived->ns->op[op];
11848 intr = gfc_get_interface ();
11849 intr->sym = target_proc;
11850 intr->where = p->where;
11851 intr->next = head;
11852 derived->ns->op[op] = intr;
11856 return true;
11858 error:
11859 p->error = 1;
11860 return false;
11864 /* Resolve a type-bound user operator (tree-walker callback). */
11866 static gfc_symbol* resolve_bindings_derived;
11867 static bool resolve_bindings_result;
11869 static bool check_uop_procedure (gfc_symbol* sym, locus where);
11871 static void
11872 resolve_typebound_user_op (gfc_symtree* stree)
11874 gfc_symbol* super_type;
11875 gfc_tbp_generic* target;
11877 gcc_assert (stree && stree->n.tb);
11879 if (stree->n.tb->error)
11880 return;
11882 /* Operators should always be GENERIC bindings. */
11883 gcc_assert (stree->n.tb->is_generic);
11885 /* Find overridden procedure, if any. */
11886 super_type = gfc_get_derived_super_type (resolve_bindings_derived);
11887 if (super_type && super_type->f2k_derived)
11889 gfc_symtree* overridden;
11890 overridden = gfc_find_typebound_user_op (super_type, NULL,
11891 stree->name, true, NULL);
11893 if (overridden && overridden->n.tb)
11894 stree->n.tb->overridden = overridden->n.tb;
11896 else
11897 stree->n.tb->overridden = NULL;
11899 /* Resolve basically using worker function. */
11900 if (!resolve_tb_generic_targets (super_type, stree->n.tb, stree->name))
11901 goto error;
11903 /* Check the targets to be functions of correct interface. */
11904 for (target = stree->n.tb->u.generic; target; target = target->next)
11906 gfc_symbol* target_proc;
11908 target_proc = get_checked_tb_operator_target (target, stree->n.tb->where);
11909 if (!target_proc)
11910 goto error;
11912 if (!check_uop_procedure (target_proc, stree->n.tb->where))
11913 goto error;
11916 return;
11918 error:
11919 resolve_bindings_result = false;
11920 stree->n.tb->error = 1;
11924 /* Resolve the type-bound procedures for a derived type. */
11926 static void
11927 resolve_typebound_procedure (gfc_symtree* stree)
11929 gfc_symbol* proc;
11930 locus where;
11931 gfc_symbol* me_arg;
11932 gfc_symbol* super_type;
11933 gfc_component* comp;
11935 gcc_assert (stree);
11937 /* Undefined specific symbol from GENERIC target definition. */
11938 if (!stree->n.tb)
11939 return;
11941 if (stree->n.tb->error)
11942 return;
11944 /* If this is a GENERIC binding, use that routine. */
11945 if (stree->n.tb->is_generic)
11947 if (!resolve_typebound_generic (resolve_bindings_derived, stree))
11948 goto error;
11949 return;
11952 /* Get the target-procedure to check it. */
11953 gcc_assert (!stree->n.tb->is_generic);
11954 gcc_assert (stree->n.tb->u.specific);
11955 proc = stree->n.tb->u.specific->n.sym;
11956 where = stree->n.tb->where;
11958 /* Default access should already be resolved from the parser. */
11959 gcc_assert (stree->n.tb->access != ACCESS_UNKNOWN);
11961 if (stree->n.tb->deferred)
11963 if (!check_proc_interface (proc, &where))
11964 goto error;
11966 else
11968 /* Check for F08:C465. */
11969 if ((!proc->attr.subroutine && !proc->attr.function)
11970 || (proc->attr.proc != PROC_MODULE
11971 && proc->attr.if_source != IFSRC_IFBODY)
11972 || proc->attr.abstract)
11974 gfc_error ("'%s' must be a module procedure or an external procedure with"
11975 " an explicit interface at %L", proc->name, &where);
11976 goto error;
11980 stree->n.tb->subroutine = proc->attr.subroutine;
11981 stree->n.tb->function = proc->attr.function;
11983 /* Find the super-type of the current derived type. We could do this once and
11984 store in a global if speed is needed, but as long as not I believe this is
11985 more readable and clearer. */
11986 super_type = gfc_get_derived_super_type (resolve_bindings_derived);
11988 /* If PASS, resolve and check arguments if not already resolved / loaded
11989 from a .mod file. */
11990 if (!stree->n.tb->nopass && stree->n.tb->pass_arg_num == 0)
11992 gfc_formal_arglist *dummy_args;
11994 dummy_args = gfc_sym_get_dummy_args (proc);
11995 if (stree->n.tb->pass_arg)
11997 gfc_formal_arglist *i;
11999 /* If an explicit passing argument name is given, walk the arg-list
12000 and look for it. */
12002 me_arg = NULL;
12003 stree->n.tb->pass_arg_num = 1;
12004 for (i = dummy_args; i; i = i->next)
12006 if (!strcmp (i->sym->name, stree->n.tb->pass_arg))
12008 me_arg = i->sym;
12009 break;
12011 ++stree->n.tb->pass_arg_num;
12014 if (!me_arg)
12016 gfc_error ("Procedure '%s' with PASS(%s) at %L has no"
12017 " argument '%s'",
12018 proc->name, stree->n.tb->pass_arg, &where,
12019 stree->n.tb->pass_arg);
12020 goto error;
12023 else
12025 /* Otherwise, take the first one; there should in fact be at least
12026 one. */
12027 stree->n.tb->pass_arg_num = 1;
12028 if (!dummy_args)
12030 gfc_error ("Procedure '%s' with PASS at %L must have at"
12031 " least one argument", proc->name, &where);
12032 goto error;
12034 me_arg = dummy_args->sym;
12037 /* Now check that the argument-type matches and the passed-object
12038 dummy argument is generally fine. */
12040 gcc_assert (me_arg);
12042 if (me_arg->ts.type != BT_CLASS)
12044 gfc_error ("Non-polymorphic passed-object dummy argument of '%s'"
12045 " at %L", proc->name, &where);
12046 goto error;
12049 if (CLASS_DATA (me_arg)->ts.u.derived
12050 != resolve_bindings_derived)
12052 gfc_error ("Argument '%s' of '%s' with PASS(%s) at %L must be of"
12053 " the derived-type '%s'", me_arg->name, proc->name,
12054 me_arg->name, &where, resolve_bindings_derived->name);
12055 goto error;
12058 gcc_assert (me_arg->ts.type == BT_CLASS);
12059 if (CLASS_DATA (me_arg)->as && CLASS_DATA (me_arg)->as->rank != 0)
12061 gfc_error ("Passed-object dummy argument of '%s' at %L must be"
12062 " scalar", proc->name, &where);
12063 goto error;
12065 if (CLASS_DATA (me_arg)->attr.allocatable)
12067 gfc_error ("Passed-object dummy argument of '%s' at %L must not"
12068 " be ALLOCATABLE", proc->name, &where);
12069 goto error;
12071 if (CLASS_DATA (me_arg)->attr.class_pointer)
12073 gfc_error ("Passed-object dummy argument of '%s' at %L must not"
12074 " be POINTER", proc->name, &where);
12075 goto error;
12079 /* If we are extending some type, check that we don't override a procedure
12080 flagged NON_OVERRIDABLE. */
12081 stree->n.tb->overridden = NULL;
12082 if (super_type)
12084 gfc_symtree* overridden;
12085 overridden = gfc_find_typebound_proc (super_type, NULL,
12086 stree->name, true, NULL);
12088 if (overridden)
12090 if (overridden->n.tb)
12091 stree->n.tb->overridden = overridden->n.tb;
12093 if (!gfc_check_typebound_override (stree, overridden))
12094 goto error;
12098 /* See if there's a name collision with a component directly in this type. */
12099 for (comp = resolve_bindings_derived->components; comp; comp = comp->next)
12100 if (!strcmp (comp->name, stree->name))
12102 gfc_error ("Procedure '%s' at %L has the same name as a component of"
12103 " '%s'",
12104 stree->name, &where, resolve_bindings_derived->name);
12105 goto error;
12108 /* Try to find a name collision with an inherited component. */
12109 if (super_type && gfc_find_component (super_type, stree->name, true, true))
12111 gfc_error ("Procedure '%s' at %L has the same name as an inherited"
12112 " component of '%s'",
12113 stree->name, &where, resolve_bindings_derived->name);
12114 goto error;
12117 stree->n.tb->error = 0;
12118 return;
12120 error:
12121 resolve_bindings_result = false;
12122 stree->n.tb->error = 1;
12126 static bool
12127 resolve_typebound_procedures (gfc_symbol* derived)
12129 int op;
12130 gfc_symbol* super_type;
12132 if (!derived->f2k_derived || !derived->f2k_derived->tb_sym_root)
12133 return true;
12135 super_type = gfc_get_derived_super_type (derived);
12136 if (super_type)
12137 resolve_symbol (super_type);
12139 resolve_bindings_derived = derived;
12140 resolve_bindings_result = true;
12142 if (derived->f2k_derived->tb_sym_root)
12143 gfc_traverse_symtree (derived->f2k_derived->tb_sym_root,
12144 &resolve_typebound_procedure);
12146 if (derived->f2k_derived->tb_uop_root)
12147 gfc_traverse_symtree (derived->f2k_derived->tb_uop_root,
12148 &resolve_typebound_user_op);
12150 for (op = 0; op != GFC_INTRINSIC_OPS; ++op)
12152 gfc_typebound_proc* p = derived->f2k_derived->tb_op[op];
12153 if (p && !resolve_typebound_intrinsic_op (derived,
12154 (gfc_intrinsic_op)op, p))
12155 resolve_bindings_result = false;
12158 return resolve_bindings_result;
12162 /* Add a derived type to the dt_list. The dt_list is used in trans-types.c
12163 to give all identical derived types the same backend_decl. */
12164 static void
12165 add_dt_to_dt_list (gfc_symbol *derived)
12167 gfc_dt_list *dt_list;
12169 for (dt_list = gfc_derived_types; dt_list; dt_list = dt_list->next)
12170 if (derived == dt_list->derived)
12171 return;
12173 dt_list = gfc_get_dt_list ();
12174 dt_list->next = gfc_derived_types;
12175 dt_list->derived = derived;
12176 gfc_derived_types = dt_list;
12180 /* Ensure that a derived-type is really not abstract, meaning that every
12181 inherited DEFERRED binding is overridden by a non-DEFERRED one. */
12183 static bool
12184 ensure_not_abstract_walker (gfc_symbol* sub, gfc_symtree* st)
12186 if (!st)
12187 return true;
12189 if (!ensure_not_abstract_walker (sub, st->left))
12190 return false;
12191 if (!ensure_not_abstract_walker (sub, st->right))
12192 return false;
12194 if (st->n.tb && st->n.tb->deferred)
12196 gfc_symtree* overriding;
12197 overriding = gfc_find_typebound_proc (sub, NULL, st->name, true, NULL);
12198 if (!overriding)
12199 return false;
12200 gcc_assert (overriding->n.tb);
12201 if (overriding->n.tb->deferred)
12203 gfc_error ("Derived-type '%s' declared at %L must be ABSTRACT because"
12204 " '%s' is DEFERRED and not overridden",
12205 sub->name, &sub->declared_at, st->name);
12206 return false;
12210 return true;
12213 static bool
12214 ensure_not_abstract (gfc_symbol* sub, gfc_symbol* ancestor)
12216 /* The algorithm used here is to recursively travel up the ancestry of sub
12217 and for each ancestor-type, check all bindings. If any of them is
12218 DEFERRED, look it up starting from sub and see if the found (overriding)
12219 binding is not DEFERRED.
12220 This is not the most efficient way to do this, but it should be ok and is
12221 clearer than something sophisticated. */
12223 gcc_assert (ancestor && !sub->attr.abstract);
12225 if (!ancestor->attr.abstract)
12226 return true;
12228 /* Walk bindings of this ancestor. */
12229 if (ancestor->f2k_derived)
12231 bool t;
12232 t = ensure_not_abstract_walker (sub, ancestor->f2k_derived->tb_sym_root);
12233 if (!t)
12234 return false;
12237 /* Find next ancestor type and recurse on it. */
12238 ancestor = gfc_get_derived_super_type (ancestor);
12239 if (ancestor)
12240 return ensure_not_abstract (sub, ancestor);
12242 return true;
12246 /* This check for typebound defined assignments is done recursively
12247 since the order in which derived types are resolved is not always in
12248 order of the declarations. */
12250 static void
12251 check_defined_assignments (gfc_symbol *derived)
12253 gfc_component *c;
12255 for (c = derived->components; c; c = c->next)
12257 if (c->ts.type != BT_DERIVED
12258 || c->attr.pointer
12259 || c->attr.allocatable
12260 || c->attr.proc_pointer_comp
12261 || c->attr.class_pointer
12262 || c->attr.proc_pointer)
12263 continue;
12265 if (c->ts.u.derived->attr.defined_assign_comp
12266 || (c->ts.u.derived->f2k_derived
12267 && c->ts.u.derived->f2k_derived->tb_op[INTRINSIC_ASSIGN]))
12269 derived->attr.defined_assign_comp = 1;
12270 return;
12273 check_defined_assignments (c->ts.u.derived);
12274 if (c->ts.u.derived->attr.defined_assign_comp)
12276 derived->attr.defined_assign_comp = 1;
12277 return;
12283 /* Resolve the components of a derived type. This does not have to wait until
12284 resolution stage, but can be done as soon as the dt declaration has been
12285 parsed. */
12287 static bool
12288 resolve_fl_derived0 (gfc_symbol *sym)
12290 gfc_symbol* super_type;
12291 gfc_component *c;
12293 if (sym->attr.unlimited_polymorphic)
12294 return true;
12296 super_type = gfc_get_derived_super_type (sym);
12298 /* F2008, C432. */
12299 if (super_type && sym->attr.coarray_comp && !super_type->attr.coarray_comp)
12301 gfc_error ("As extending type '%s' at %L has a coarray component, "
12302 "parent type '%s' shall also have one", sym->name,
12303 &sym->declared_at, super_type->name);
12304 return false;
12307 /* Ensure the extended type gets resolved before we do. */
12308 if (super_type && !resolve_fl_derived0 (super_type))
12309 return false;
12311 /* An ABSTRACT type must be extensible. */
12312 if (sym->attr.abstract && !gfc_type_is_extensible (sym))
12314 gfc_error ("Non-extensible derived-type '%s' at %L must not be ABSTRACT",
12315 sym->name, &sym->declared_at);
12316 return false;
12319 c = (sym->attr.is_class) ? sym->components->ts.u.derived->components
12320 : sym->components;
12322 for ( ; c != NULL; c = c->next)
12324 if (c->attr.artificial)
12325 continue;
12327 /* F2008, C442. */
12328 if ((!sym->attr.is_class || c != sym->components)
12329 && c->attr.codimension
12330 && (!c->attr.allocatable || (c->as && c->as->type != AS_DEFERRED)))
12332 gfc_error ("Coarray component '%s' at %L must be allocatable with "
12333 "deferred shape", c->name, &c->loc);
12334 return false;
12337 /* F2008, C443. */
12338 if (c->attr.codimension && c->ts.type == BT_DERIVED
12339 && c->ts.u.derived->ts.is_iso_c)
12341 gfc_error ("Component '%s' at %L of TYPE(C_PTR) or TYPE(C_FUNPTR) "
12342 "shall not be a coarray", c->name, &c->loc);
12343 return false;
12346 /* F2008, C444. */
12347 if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.coarray_comp
12348 && (c->attr.codimension || c->attr.pointer || c->attr.dimension
12349 || c->attr.allocatable))
12351 gfc_error ("Component '%s' at %L with coarray component "
12352 "shall be a nonpointer, nonallocatable scalar",
12353 c->name, &c->loc);
12354 return false;
12357 /* F2008, C448. */
12358 if (c->attr.contiguous && (!c->attr.dimension || !c->attr.pointer))
12360 gfc_error ("Component '%s' at %L has the CONTIGUOUS attribute but "
12361 "is not an array pointer", c->name, &c->loc);
12362 return false;
12365 if (c->attr.proc_pointer && c->ts.interface)
12367 gfc_symbol *ifc = c->ts.interface;
12369 if (!sym->attr.vtype
12370 && !check_proc_interface (ifc, &c->loc))
12371 return false;
12373 if (ifc->attr.if_source || ifc->attr.intrinsic)
12375 /* Resolve interface and copy attributes. */
12376 if (ifc->formal && !ifc->formal_ns)
12377 resolve_symbol (ifc);
12378 if (ifc->attr.intrinsic)
12379 gfc_resolve_intrinsic (ifc, &ifc->declared_at);
12381 if (ifc->result)
12383 c->ts = ifc->result->ts;
12384 c->attr.allocatable = ifc->result->attr.allocatable;
12385 c->attr.pointer = ifc->result->attr.pointer;
12386 c->attr.dimension = ifc->result->attr.dimension;
12387 c->as = gfc_copy_array_spec (ifc->result->as);
12388 c->attr.class_ok = ifc->result->attr.class_ok;
12390 else
12392 c->ts = ifc->ts;
12393 c->attr.allocatable = ifc->attr.allocatable;
12394 c->attr.pointer = ifc->attr.pointer;
12395 c->attr.dimension = ifc->attr.dimension;
12396 c->as = gfc_copy_array_spec (ifc->as);
12397 c->attr.class_ok = ifc->attr.class_ok;
12399 c->ts.interface = ifc;
12400 c->attr.function = ifc->attr.function;
12401 c->attr.subroutine = ifc->attr.subroutine;
12403 c->attr.pure = ifc->attr.pure;
12404 c->attr.elemental = ifc->attr.elemental;
12405 c->attr.recursive = ifc->attr.recursive;
12406 c->attr.always_explicit = ifc->attr.always_explicit;
12407 c->attr.ext_attr |= ifc->attr.ext_attr;
12408 /* Copy char length. */
12409 if (ifc->ts.type == BT_CHARACTER && ifc->ts.u.cl)
12411 gfc_charlen *cl = gfc_new_charlen (sym->ns, ifc->ts.u.cl);
12412 if (cl->length && !cl->resolved
12413 && !gfc_resolve_expr (cl->length))
12414 return false;
12415 c->ts.u.cl = cl;
12419 else if (c->attr.proc_pointer && c->ts.type == BT_UNKNOWN)
12421 /* Since PPCs are not implicitly typed, a PPC without an explicit
12422 interface must be a subroutine. */
12423 gfc_add_subroutine (&c->attr, c->name, &c->loc);
12426 /* Procedure pointer components: Check PASS arg. */
12427 if (c->attr.proc_pointer && !c->tb->nopass && c->tb->pass_arg_num == 0
12428 && !sym->attr.vtype)
12430 gfc_symbol* me_arg;
12432 if (c->tb->pass_arg)
12434 gfc_formal_arglist* i;
12436 /* If an explicit passing argument name is given, walk the arg-list
12437 and look for it. */
12439 me_arg = NULL;
12440 c->tb->pass_arg_num = 1;
12441 for (i = c->ts.interface->formal; i; i = i->next)
12443 if (!strcmp (i->sym->name, c->tb->pass_arg))
12445 me_arg = i->sym;
12446 break;
12448 c->tb->pass_arg_num++;
12451 if (!me_arg)
12453 gfc_error ("Procedure pointer component '%s' with PASS(%s) "
12454 "at %L has no argument '%s'", c->name,
12455 c->tb->pass_arg, &c->loc, c->tb->pass_arg);
12456 c->tb->error = 1;
12457 return false;
12460 else
12462 /* Otherwise, take the first one; there should in fact be at least
12463 one. */
12464 c->tb->pass_arg_num = 1;
12465 if (!c->ts.interface->formal)
12467 gfc_error ("Procedure pointer component '%s' with PASS at %L "
12468 "must have at least one argument",
12469 c->name, &c->loc);
12470 c->tb->error = 1;
12471 return false;
12473 me_arg = c->ts.interface->formal->sym;
12476 /* Now check that the argument-type matches. */
12477 gcc_assert (me_arg);
12478 if ((me_arg->ts.type != BT_DERIVED && me_arg->ts.type != BT_CLASS)
12479 || (me_arg->ts.type == BT_DERIVED && me_arg->ts.u.derived != sym)
12480 || (me_arg->ts.type == BT_CLASS
12481 && CLASS_DATA (me_arg)->ts.u.derived != sym))
12483 gfc_error ("Argument '%s' of '%s' with PASS(%s) at %L must be of"
12484 " the derived type '%s'", me_arg->name, c->name,
12485 me_arg->name, &c->loc, sym->name);
12486 c->tb->error = 1;
12487 return false;
12490 /* Check for C453. */
12491 if (me_arg->attr.dimension)
12493 gfc_error ("Argument '%s' of '%s' with PASS(%s) at %L "
12494 "must be scalar", me_arg->name, c->name, me_arg->name,
12495 &c->loc);
12496 c->tb->error = 1;
12497 return false;
12500 if (me_arg->attr.pointer)
12502 gfc_error ("Argument '%s' of '%s' with PASS(%s) at %L "
12503 "may not have the POINTER attribute", me_arg->name,
12504 c->name, me_arg->name, &c->loc);
12505 c->tb->error = 1;
12506 return false;
12509 if (me_arg->attr.allocatable)
12511 gfc_error ("Argument '%s' of '%s' with PASS(%s) at %L "
12512 "may not be ALLOCATABLE", me_arg->name, c->name,
12513 me_arg->name, &c->loc);
12514 c->tb->error = 1;
12515 return false;
12518 if (gfc_type_is_extensible (sym) && me_arg->ts.type != BT_CLASS)
12519 gfc_error ("Non-polymorphic passed-object dummy argument of '%s'"
12520 " at %L", c->name, &c->loc);
12524 /* Check type-spec if this is not the parent-type component. */
12525 if (((sym->attr.is_class
12526 && (!sym->components->ts.u.derived->attr.extension
12527 || c != sym->components->ts.u.derived->components))
12528 || (!sym->attr.is_class
12529 && (!sym->attr.extension || c != sym->components)))
12530 && !sym->attr.vtype
12531 && !resolve_typespec_used (&c->ts, &c->loc, c->name))
12532 return false;
12534 /* If this type is an extension, set the accessibility of the parent
12535 component. */
12536 if (super_type
12537 && ((sym->attr.is_class
12538 && c == sym->components->ts.u.derived->components)
12539 || (!sym->attr.is_class && c == sym->components))
12540 && strcmp (super_type->name, c->name) == 0)
12541 c->attr.access = super_type->attr.access;
12543 /* If this type is an extension, see if this component has the same name
12544 as an inherited type-bound procedure. */
12545 if (super_type && !sym->attr.is_class
12546 && gfc_find_typebound_proc (super_type, NULL, c->name, true, NULL))
12548 gfc_error ("Component '%s' of '%s' at %L has the same name as an"
12549 " inherited type-bound procedure",
12550 c->name, sym->name, &c->loc);
12551 return false;
12554 if (c->ts.type == BT_CHARACTER && !c->attr.proc_pointer
12555 && !c->ts.deferred)
12557 if (c->ts.u.cl->length == NULL
12558 || (!resolve_charlen(c->ts.u.cl))
12559 || !gfc_is_constant_expr (c->ts.u.cl->length))
12561 gfc_error ("Character length of component '%s' needs to "
12562 "be a constant specification expression at %L",
12563 c->name,
12564 c->ts.u.cl->length ? &c->ts.u.cl->length->where : &c->loc);
12565 return false;
12569 if (c->ts.type == BT_CHARACTER && c->ts.deferred
12570 && !c->attr.pointer && !c->attr.allocatable)
12572 gfc_error ("Character component '%s' of '%s' at %L with deferred "
12573 "length must be a POINTER or ALLOCATABLE",
12574 c->name, sym->name, &c->loc);
12575 return false;
12578 /* Add the hidden deferred length field. */
12579 if (c->ts.type == BT_CHARACTER && c->ts.deferred && !c->attr.function
12580 && !sym->attr.is_class)
12582 char name[GFC_MAX_SYMBOL_LEN+9];
12583 gfc_component *strlen;
12584 sprintf (name, "_%s_length", c->name);
12585 strlen = gfc_find_component (sym, name, true, true);
12586 if (strlen == NULL)
12588 if (!gfc_add_component (sym, name, &strlen))
12589 return false;
12590 strlen->ts.type = BT_INTEGER;
12591 strlen->ts.kind = gfc_charlen_int_kind;
12592 strlen->attr.access = ACCESS_PRIVATE;
12593 strlen->attr.deferred_parameter = 1;
12597 if (c->ts.type == BT_DERIVED
12598 && sym->component_access != ACCESS_PRIVATE
12599 && gfc_check_symbol_access (sym)
12600 && !is_sym_host_assoc (c->ts.u.derived, sym->ns)
12601 && !c->ts.u.derived->attr.use_assoc
12602 && !gfc_check_symbol_access (c->ts.u.derived)
12603 && !gfc_notify_std (GFC_STD_F2003, "the component '%s' is a "
12604 "PRIVATE type and cannot be a component of "
12605 "'%s', which is PUBLIC at %L", c->name,
12606 sym->name, &sym->declared_at))
12607 return false;
12609 if ((sym->attr.sequence || sym->attr.is_bind_c) && c->ts.type == BT_CLASS)
12611 gfc_error ("Polymorphic component %s at %L in SEQUENCE or BIND(C) "
12612 "type %s", c->name, &c->loc, sym->name);
12613 return false;
12616 if (sym->attr.sequence)
12618 if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.sequence == 0)
12620 gfc_error ("Component %s of SEQUENCE type declared at %L does "
12621 "not have the SEQUENCE attribute",
12622 c->ts.u.derived->name, &sym->declared_at);
12623 return false;
12627 if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.generic)
12628 c->ts.u.derived = gfc_find_dt_in_generic (c->ts.u.derived);
12629 else if (c->ts.type == BT_CLASS && c->attr.class_ok
12630 && CLASS_DATA (c)->ts.u.derived->attr.generic)
12631 CLASS_DATA (c)->ts.u.derived
12632 = gfc_find_dt_in_generic (CLASS_DATA (c)->ts.u.derived);
12634 if (!sym->attr.is_class && c->ts.type == BT_DERIVED && !sym->attr.vtype
12635 && c->attr.pointer && c->ts.u.derived->components == NULL
12636 && !c->ts.u.derived->attr.zero_comp)
12638 gfc_error ("The pointer component '%s' of '%s' at %L is a type "
12639 "that has not been declared", c->name, sym->name,
12640 &c->loc);
12641 return false;
12644 if (c->ts.type == BT_CLASS && c->attr.class_ok
12645 && CLASS_DATA (c)->attr.class_pointer
12646 && CLASS_DATA (c)->ts.u.derived->components == NULL
12647 && !CLASS_DATA (c)->ts.u.derived->attr.zero_comp
12648 && !UNLIMITED_POLY (c))
12650 gfc_error ("The pointer component '%s' of '%s' at %L is a type "
12651 "that has not been declared", c->name, sym->name,
12652 &c->loc);
12653 return false;
12656 /* C437. */
12657 if (c->ts.type == BT_CLASS && c->attr.flavor != FL_PROCEDURE
12658 && (!c->attr.class_ok
12659 || !(CLASS_DATA (c)->attr.class_pointer
12660 || CLASS_DATA (c)->attr.allocatable)))
12662 gfc_error ("Component '%s' with CLASS at %L must be allocatable "
12663 "or pointer", c->name, &c->loc);
12664 /* Prevent a recurrence of the error. */
12665 c->ts.type = BT_UNKNOWN;
12666 return false;
12669 /* Ensure that all the derived type components are put on the
12670 derived type list; even in formal namespaces, where derived type
12671 pointer components might not have been declared. */
12672 if (c->ts.type == BT_DERIVED
12673 && c->ts.u.derived
12674 && c->ts.u.derived->components
12675 && c->attr.pointer
12676 && sym != c->ts.u.derived)
12677 add_dt_to_dt_list (c->ts.u.derived);
12679 if (!gfc_resolve_array_spec (c->as,
12680 !(c->attr.pointer || c->attr.proc_pointer
12681 || c->attr.allocatable)))
12682 return false;
12684 if (c->initializer && !sym->attr.vtype
12685 && !gfc_check_assign_symbol (sym, c, c->initializer))
12686 return false;
12689 check_defined_assignments (sym);
12691 if (!sym->attr.defined_assign_comp && super_type)
12692 sym->attr.defined_assign_comp
12693 = super_type->attr.defined_assign_comp;
12695 /* If this is a non-ABSTRACT type extending an ABSTRACT one, ensure that
12696 all DEFERRED bindings are overridden. */
12697 if (super_type && super_type->attr.abstract && !sym->attr.abstract
12698 && !sym->attr.is_class
12699 && !ensure_not_abstract (sym, super_type))
12700 return false;
12702 /* Add derived type to the derived type list. */
12703 add_dt_to_dt_list (sym);
12705 return true;
12709 /* The following procedure does the full resolution of a derived type,
12710 including resolution of all type-bound procedures (if present). In contrast
12711 to 'resolve_fl_derived0' this can only be done after the module has been
12712 parsed completely. */
12714 static bool
12715 resolve_fl_derived (gfc_symbol *sym)
12717 gfc_symbol *gen_dt = NULL;
12719 if (sym->attr.unlimited_polymorphic)
12720 return true;
12722 if (!sym->attr.is_class)
12723 gfc_find_symbol (sym->name, sym->ns, 0, &gen_dt);
12724 if (gen_dt && gen_dt->generic && gen_dt->generic->next
12725 && (!gen_dt->generic->sym->attr.use_assoc
12726 || gen_dt->generic->sym->module != gen_dt->generic->next->sym->module)
12727 && !gfc_notify_std (GFC_STD_F2003, "Generic name '%s' of function "
12728 "'%s' at %L being the same name as derived "
12729 "type at %L", sym->name,
12730 gen_dt->generic->sym == sym
12731 ? gen_dt->generic->next->sym->name
12732 : gen_dt->generic->sym->name,
12733 gen_dt->generic->sym == sym
12734 ? &gen_dt->generic->next->sym->declared_at
12735 : &gen_dt->generic->sym->declared_at,
12736 &sym->declared_at))
12737 return false;
12739 /* Resolve the finalizer procedures. */
12740 if (!gfc_resolve_finalizers (sym, NULL))
12741 return false;
12743 if (sym->attr.is_class && sym->ts.u.derived == NULL)
12745 /* Fix up incomplete CLASS symbols. */
12746 gfc_component *data = gfc_find_component (sym, "_data", true, true);
12747 gfc_component *vptr = gfc_find_component (sym, "_vptr", true, true);
12749 /* Nothing more to do for unlimited polymorphic entities. */
12750 if (data->ts.u.derived->attr.unlimited_polymorphic)
12751 return true;
12752 else if (vptr->ts.u.derived == NULL)
12754 gfc_symbol *vtab = gfc_find_derived_vtab (data->ts.u.derived);
12755 gcc_assert (vtab);
12756 vptr->ts.u.derived = vtab->ts.u.derived;
12760 if (!resolve_fl_derived0 (sym))
12761 return false;
12763 /* Resolve the type-bound procedures. */
12764 if (!resolve_typebound_procedures (sym))
12765 return false;
12767 return true;
12771 static bool
12772 resolve_fl_namelist (gfc_symbol *sym)
12774 gfc_namelist *nl;
12775 gfc_symbol *nlsym;
12777 for (nl = sym->namelist; nl; nl = nl->next)
12779 /* Check again, the check in match only works if NAMELIST comes
12780 after the decl. */
12781 if (nl->sym->as && nl->sym->as->type == AS_ASSUMED_SIZE)
12783 gfc_error ("Assumed size array '%s' in namelist '%s' at %L is not "
12784 "allowed", nl->sym->name, sym->name, &sym->declared_at);
12785 return false;
12788 if (nl->sym->as && nl->sym->as->type == AS_ASSUMED_SHAPE
12789 && !gfc_notify_std (GFC_STD_F2003, "NAMELIST array object '%s' "
12790 "with assumed shape in namelist '%s' at %L",
12791 nl->sym->name, sym->name, &sym->declared_at))
12792 return false;
12794 if (is_non_constant_shape_array (nl->sym)
12795 && !gfc_notify_std (GFC_STD_F2003, "NAMELIST array object '%s' "
12796 "with nonconstant shape in namelist '%s' at %L",
12797 nl->sym->name, sym->name, &sym->declared_at))
12798 return false;
12800 if (nl->sym->ts.type == BT_CHARACTER
12801 && (nl->sym->ts.u.cl->length == NULL
12802 || !gfc_is_constant_expr (nl->sym->ts.u.cl->length))
12803 && !gfc_notify_std (GFC_STD_F2003, "NAMELIST object '%s' with "
12804 "nonconstant character length in "
12805 "namelist '%s' at %L", nl->sym->name,
12806 sym->name, &sym->declared_at))
12807 return false;
12809 /* FIXME: Once UDDTIO is implemented, the following can be
12810 removed. */
12811 if (nl->sym->ts.type == BT_CLASS)
12813 gfc_error ("NAMELIST object '%s' in namelist '%s' at %L is "
12814 "polymorphic and requires a defined input/output "
12815 "procedure", nl->sym->name, sym->name, &sym->declared_at);
12816 return false;
12819 if (nl->sym->ts.type == BT_DERIVED
12820 && (nl->sym->ts.u.derived->attr.alloc_comp
12821 || nl->sym->ts.u.derived->attr.pointer_comp))
12823 if (!gfc_notify_std (GFC_STD_F2003, "NAMELIST object '%s' in "
12824 "namelist '%s' at %L with ALLOCATABLE "
12825 "or POINTER components", nl->sym->name,
12826 sym->name, &sym->declared_at))
12827 return false;
12829 /* FIXME: Once UDDTIO is implemented, the following can be
12830 removed. */
12831 gfc_error ("NAMELIST object '%s' in namelist '%s' at %L has "
12832 "ALLOCATABLE or POINTER components and thus requires "
12833 "a defined input/output procedure", nl->sym->name,
12834 sym->name, &sym->declared_at);
12835 return false;
12839 /* Reject PRIVATE objects in a PUBLIC namelist. */
12840 if (gfc_check_symbol_access (sym))
12842 for (nl = sym->namelist; nl; nl = nl->next)
12844 if (!nl->sym->attr.use_assoc
12845 && !is_sym_host_assoc (nl->sym, sym->ns)
12846 && !gfc_check_symbol_access (nl->sym))
12848 gfc_error ("NAMELIST object '%s' was declared PRIVATE and "
12849 "cannot be member of PUBLIC namelist '%s' at %L",
12850 nl->sym->name, sym->name, &sym->declared_at);
12851 return false;
12854 /* Types with private components that came here by USE-association. */
12855 if (nl->sym->ts.type == BT_DERIVED
12856 && derived_inaccessible (nl->sym->ts.u.derived))
12858 gfc_error ("NAMELIST object '%s' has use-associated PRIVATE "
12859 "components and cannot be member of namelist '%s' at %L",
12860 nl->sym->name, sym->name, &sym->declared_at);
12861 return false;
12864 /* Types with private components that are defined in the same module. */
12865 if (nl->sym->ts.type == BT_DERIVED
12866 && !is_sym_host_assoc (nl->sym->ts.u.derived, sym->ns)
12867 && nl->sym->ts.u.derived->attr.private_comp)
12869 gfc_error ("NAMELIST object '%s' has PRIVATE components and "
12870 "cannot be a member of PUBLIC namelist '%s' at %L",
12871 nl->sym->name, sym->name, &sym->declared_at);
12872 return false;
12878 /* 14.1.2 A module or internal procedure represent local entities
12879 of the same type as a namelist member and so are not allowed. */
12880 for (nl = sym->namelist; nl; nl = nl->next)
12882 if (nl->sym->ts.kind != 0 && nl->sym->attr.flavor == FL_VARIABLE)
12883 continue;
12885 if (nl->sym->attr.function && nl->sym == nl->sym->result)
12886 if ((nl->sym == sym->ns->proc_name)
12888 (sym->ns->parent && nl->sym == sym->ns->parent->proc_name))
12889 continue;
12891 nlsym = NULL;
12892 if (nl->sym->name)
12893 gfc_find_symbol (nl->sym->name, sym->ns, 1, &nlsym);
12894 if (nlsym && nlsym->attr.flavor == FL_PROCEDURE)
12896 gfc_error ("PROCEDURE attribute conflicts with NAMELIST "
12897 "attribute in '%s' at %L", nlsym->name,
12898 &sym->declared_at);
12899 return false;
12903 return true;
12907 static bool
12908 resolve_fl_parameter (gfc_symbol *sym)
12910 /* A parameter array's shape needs to be constant. */
12911 if (sym->as != NULL
12912 && (sym->as->type == AS_DEFERRED
12913 || is_non_constant_shape_array (sym)))
12915 gfc_error ("Parameter array '%s' at %L cannot be automatic "
12916 "or of deferred shape", sym->name, &sym->declared_at);
12917 return false;
12920 /* Make sure a parameter that has been implicitly typed still
12921 matches the implicit type, since PARAMETER statements can precede
12922 IMPLICIT statements. */
12923 if (sym->attr.implicit_type
12924 && !gfc_compare_types (&sym->ts, gfc_get_default_type (sym->name,
12925 sym->ns)))
12927 gfc_error ("Implicitly typed PARAMETER '%s' at %L doesn't match a "
12928 "later IMPLICIT type", sym->name, &sym->declared_at);
12929 return false;
12932 /* Make sure the types of derived parameters are consistent. This
12933 type checking is deferred until resolution because the type may
12934 refer to a derived type from the host. */
12935 if (sym->ts.type == BT_DERIVED
12936 && !gfc_compare_types (&sym->ts, &sym->value->ts))
12938 gfc_error ("Incompatible derived type in PARAMETER at %L",
12939 &sym->value->where);
12940 return false;
12942 return true;
12946 /* Do anything necessary to resolve a symbol. Right now, we just
12947 assume that an otherwise unknown symbol is a variable. This sort
12948 of thing commonly happens for symbols in module. */
12950 static void
12951 resolve_symbol (gfc_symbol *sym)
12953 int check_constant, mp_flag;
12954 gfc_symtree *symtree;
12955 gfc_symtree *this_symtree;
12956 gfc_namespace *ns;
12957 gfc_component *c;
12958 symbol_attribute class_attr;
12959 gfc_array_spec *as;
12960 bool saved_specification_expr;
12962 if (sym->resolved)
12963 return;
12964 sym->resolved = 1;
12966 if (sym->attr.artificial)
12967 return;
12969 if (sym->attr.unlimited_polymorphic)
12970 return;
12972 if (sym->attr.flavor == FL_UNKNOWN
12973 || (sym->attr.flavor == FL_PROCEDURE && !sym->attr.intrinsic
12974 && !sym->attr.generic && !sym->attr.external
12975 && sym->attr.if_source == IFSRC_UNKNOWN
12976 && sym->ts.type == BT_UNKNOWN))
12979 /* If we find that a flavorless symbol is an interface in one of the
12980 parent namespaces, find its symtree in this namespace, free the
12981 symbol and set the symtree to point to the interface symbol. */
12982 for (ns = gfc_current_ns->parent; ns; ns = ns->parent)
12984 symtree = gfc_find_symtree (ns->sym_root, sym->name);
12985 if (symtree && (symtree->n.sym->generic ||
12986 (symtree->n.sym->attr.flavor == FL_PROCEDURE
12987 && sym->ns->construct_entities)))
12989 this_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
12990 sym->name);
12991 gfc_release_symbol (sym);
12992 symtree->n.sym->refs++;
12993 this_symtree->n.sym = symtree->n.sym;
12994 return;
12998 /* Otherwise give it a flavor according to such attributes as
12999 it has. */
13000 if (sym->attr.flavor == FL_UNKNOWN && sym->attr.external == 0
13001 && sym->attr.intrinsic == 0)
13002 sym->attr.flavor = FL_VARIABLE;
13003 else if (sym->attr.flavor == FL_UNKNOWN)
13005 sym->attr.flavor = FL_PROCEDURE;
13006 if (sym->attr.dimension)
13007 sym->attr.function = 1;
13011 if (sym->attr.external && sym->ts.type != BT_UNKNOWN && !sym->attr.function)
13012 gfc_add_function (&sym->attr, sym->name, &sym->declared_at);
13014 if (sym->attr.procedure && sym->attr.if_source != IFSRC_DECL
13015 && !resolve_procedure_interface (sym))
13016 return;
13018 if (sym->attr.is_protected && !sym->attr.proc_pointer
13019 && (sym->attr.procedure || sym->attr.external))
13021 if (sym->attr.external)
13022 gfc_error ("PROTECTED attribute conflicts with EXTERNAL attribute "
13023 "at %L", &sym->declared_at);
13024 else
13025 gfc_error ("PROCEDURE attribute conflicts with PROTECTED attribute "
13026 "at %L", &sym->declared_at);
13028 return;
13031 if (sym->attr.flavor == FL_DERIVED && !resolve_fl_derived (sym))
13032 return;
13034 /* Symbols that are module procedures with results (functions) have
13035 the types and array specification copied for type checking in
13036 procedures that call them, as well as for saving to a module
13037 file. These symbols can't stand the scrutiny that their results
13038 can. */
13039 mp_flag = (sym->result != NULL && sym->result != sym);
13041 /* Make sure that the intrinsic is consistent with its internal
13042 representation. This needs to be done before assigning a default
13043 type to avoid spurious warnings. */
13044 if (sym->attr.flavor != FL_MODULE && sym->attr.intrinsic
13045 && !gfc_resolve_intrinsic (sym, &sym->declared_at))
13046 return;
13048 /* Resolve associate names. */
13049 if (sym->assoc)
13050 resolve_assoc_var (sym, true);
13052 /* Assign default type to symbols that need one and don't have one. */
13053 if (sym->ts.type == BT_UNKNOWN)
13055 if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER)
13057 gfc_set_default_type (sym, 1, NULL);
13060 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.external
13061 && !sym->attr.function && !sym->attr.subroutine
13062 && gfc_get_default_type (sym->name, sym->ns)->type == BT_UNKNOWN)
13063 gfc_add_subroutine (&sym->attr, sym->name, &sym->declared_at);
13065 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.function)
13067 /* The specific case of an external procedure should emit an error
13068 in the case that there is no implicit type. */
13069 if (!mp_flag)
13070 gfc_set_default_type (sym, sym->attr.external, NULL);
13071 else
13073 /* Result may be in another namespace. */
13074 resolve_symbol (sym->result);
13076 if (!sym->result->attr.proc_pointer)
13078 sym->ts = sym->result->ts;
13079 sym->as = gfc_copy_array_spec (sym->result->as);
13080 sym->attr.dimension = sym->result->attr.dimension;
13081 sym->attr.pointer = sym->result->attr.pointer;
13082 sym->attr.allocatable = sym->result->attr.allocatable;
13083 sym->attr.contiguous = sym->result->attr.contiguous;
13088 else if (mp_flag && sym->attr.flavor == FL_PROCEDURE && sym->attr.function)
13090 bool saved_specification_expr = specification_expr;
13091 specification_expr = true;
13092 gfc_resolve_array_spec (sym->result->as, false);
13093 specification_expr = saved_specification_expr;
13096 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
13098 as = CLASS_DATA (sym)->as;
13099 class_attr = CLASS_DATA (sym)->attr;
13100 class_attr.pointer = class_attr.class_pointer;
13102 else
13104 class_attr = sym->attr;
13105 as = sym->as;
13108 /* F2008, C530. */
13109 if (sym->attr.contiguous
13110 && (!class_attr.dimension
13111 || (as->type != AS_ASSUMED_SHAPE && as->type != AS_ASSUMED_RANK
13112 && !class_attr.pointer)))
13114 gfc_error ("'%s' at %L has the CONTIGUOUS attribute but is not an "
13115 "array pointer or an assumed-shape or assumed-rank array",
13116 sym->name, &sym->declared_at);
13117 return;
13120 /* Assumed size arrays and assumed shape arrays must be dummy
13121 arguments. Array-spec's of implied-shape should have been resolved to
13122 AS_EXPLICIT already. */
13124 if (as)
13126 gcc_assert (as->type != AS_IMPLIED_SHAPE);
13127 if (((as->type == AS_ASSUMED_SIZE && !as->cp_was_assumed)
13128 || as->type == AS_ASSUMED_SHAPE)
13129 && !sym->attr.dummy && !sym->attr.select_type_temporary)
13131 if (as->type == AS_ASSUMED_SIZE)
13132 gfc_error ("Assumed size array at %L must be a dummy argument",
13133 &sym->declared_at);
13134 else
13135 gfc_error ("Assumed shape array at %L must be a dummy argument",
13136 &sym->declared_at);
13137 return;
13139 /* TS 29113, C535a. */
13140 if (as->type == AS_ASSUMED_RANK && !sym->attr.dummy
13141 && !sym->attr.select_type_temporary)
13143 gfc_error ("Assumed-rank array at %L must be a dummy argument",
13144 &sym->declared_at);
13145 return;
13147 if (as->type == AS_ASSUMED_RANK
13148 && (sym->attr.codimension || sym->attr.value))
13150 gfc_error ("Assumed-rank array at %L may not have the VALUE or "
13151 "CODIMENSION attribute", &sym->declared_at);
13152 return;
13156 /* Make sure symbols with known intent or optional are really dummy
13157 variable. Because of ENTRY statement, this has to be deferred
13158 until resolution time. */
13160 if (!sym->attr.dummy
13161 && (sym->attr.optional || sym->attr.intent != INTENT_UNKNOWN))
13163 gfc_error ("Symbol at %L is not a DUMMY variable", &sym->declared_at);
13164 return;
13167 if (sym->attr.value && !sym->attr.dummy)
13169 gfc_error ("'%s' at %L cannot have the VALUE attribute because "
13170 "it is not a dummy argument", sym->name, &sym->declared_at);
13171 return;
13174 if (sym->attr.value && sym->ts.type == BT_CHARACTER)
13176 gfc_charlen *cl = sym->ts.u.cl;
13177 if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
13179 gfc_error ("Character dummy variable '%s' at %L with VALUE "
13180 "attribute must have constant length",
13181 sym->name, &sym->declared_at);
13182 return;
13185 if (sym->ts.is_c_interop
13186 && mpz_cmp_si (cl->length->value.integer, 1) != 0)
13188 gfc_error ("C interoperable character dummy variable '%s' at %L "
13189 "with VALUE attribute must have length one",
13190 sym->name, &sym->declared_at);
13191 return;
13195 if (sym->ts.type == BT_DERIVED && !sym->attr.is_iso_c
13196 && sym->ts.u.derived->attr.generic)
13198 sym->ts.u.derived = gfc_find_dt_in_generic (sym->ts.u.derived);
13199 if (!sym->ts.u.derived)
13201 gfc_error ("The derived type '%s' at %L is of type '%s', "
13202 "which has not been defined", sym->name,
13203 &sym->declared_at, sym->ts.u.derived->name);
13204 sym->ts.type = BT_UNKNOWN;
13205 return;
13209 /* Use the same constraints as TYPE(*), except for the type check
13210 and that only scalars and assumed-size arrays are permitted. */
13211 if (sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
13213 if (!sym->attr.dummy)
13215 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall be "
13216 "a dummy argument", sym->name, &sym->declared_at);
13217 return;
13220 if (sym->ts.type != BT_ASSUMED && sym->ts.type != BT_INTEGER
13221 && sym->ts.type != BT_REAL && sym->ts.type != BT_LOGICAL
13222 && sym->ts.type != BT_COMPLEX)
13224 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall be "
13225 "of type TYPE(*) or of an numeric intrinsic type",
13226 sym->name, &sym->declared_at);
13227 return;
13230 if (sym->attr.allocatable || sym->attr.codimension
13231 || sym->attr.pointer || sym->attr.value)
13233 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute may not "
13234 "have the ALLOCATABLE, CODIMENSION, POINTER or VALUE "
13235 "attribute", sym->name, &sym->declared_at);
13236 return;
13239 if (sym->attr.intent == INTENT_OUT)
13241 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute may not "
13242 "have the INTENT(OUT) attribute",
13243 sym->name, &sym->declared_at);
13244 return;
13246 if (sym->attr.dimension && sym->as->type != AS_ASSUMED_SIZE)
13248 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall "
13249 "either be a scalar or an assumed-size array",
13250 sym->name, &sym->declared_at);
13251 return;
13254 /* Set the type to TYPE(*) and add a dimension(*) to ensure
13255 NO_ARG_CHECK is correctly handled in trans*.c, e.g. with
13256 packing. */
13257 sym->ts.type = BT_ASSUMED;
13258 sym->as = gfc_get_array_spec ();
13259 sym->as->type = AS_ASSUMED_SIZE;
13260 sym->as->rank = 1;
13261 sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
13263 else if (sym->ts.type == BT_ASSUMED)
13265 /* TS 29113, C407a. */
13266 if (!sym->attr.dummy)
13268 gfc_error ("Assumed type of variable %s at %L is only permitted "
13269 "for dummy variables", sym->name, &sym->declared_at);
13270 return;
13272 if (sym->attr.allocatable || sym->attr.codimension
13273 || sym->attr.pointer || sym->attr.value)
13275 gfc_error ("Assumed-type variable %s at %L may not have the "
13276 "ALLOCATABLE, CODIMENSION, POINTER or VALUE attribute",
13277 sym->name, &sym->declared_at);
13278 return;
13280 if (sym->attr.intent == INTENT_OUT)
13282 gfc_error ("Assumed-type variable %s at %L may not have the "
13283 "INTENT(OUT) attribute",
13284 sym->name, &sym->declared_at);
13285 return;
13287 if (sym->attr.dimension && sym->as->type == AS_EXPLICIT)
13289 gfc_error ("Assumed-type variable %s at %L shall not be an "
13290 "explicit-shape array", sym->name, &sym->declared_at);
13291 return;
13295 /* If the symbol is marked as bind(c), verify it's type and kind. Do not
13296 do this for something that was implicitly typed because that is handled
13297 in gfc_set_default_type. Handle dummy arguments and procedure
13298 definitions separately. Also, anything that is use associated is not
13299 handled here but instead is handled in the module it is declared in.
13300 Finally, derived type definitions are allowed to be BIND(C) since that
13301 only implies that they're interoperable, and they are checked fully for
13302 interoperability when a variable is declared of that type. */
13303 if (sym->attr.is_bind_c && sym->attr.implicit_type == 0 &&
13304 sym->attr.use_assoc == 0 && sym->attr.dummy == 0 &&
13305 sym->attr.flavor != FL_PROCEDURE && sym->attr.flavor != FL_DERIVED)
13307 bool t = true;
13309 /* First, make sure the variable is declared at the
13310 module-level scope (J3/04-007, Section 15.3). */
13311 if (sym->ns->proc_name->attr.flavor != FL_MODULE &&
13312 sym->attr.in_common == 0)
13314 gfc_error ("Variable '%s' at %L cannot be BIND(C) because it "
13315 "is neither a COMMON block nor declared at the "
13316 "module level scope", sym->name, &(sym->declared_at));
13317 t = false;
13319 else if (sym->common_head != NULL)
13321 t = verify_com_block_vars_c_interop (sym->common_head);
13323 else
13325 /* If type() declaration, we need to verify that the components
13326 of the given type are all C interoperable, etc. */
13327 if (sym->ts.type == BT_DERIVED &&
13328 sym->ts.u.derived->attr.is_c_interop != 1)
13330 /* Make sure the user marked the derived type as BIND(C). If
13331 not, call the verify routine. This could print an error
13332 for the derived type more than once if multiple variables
13333 of that type are declared. */
13334 if (sym->ts.u.derived->attr.is_bind_c != 1)
13335 verify_bind_c_derived_type (sym->ts.u.derived);
13336 t = false;
13339 /* Verify the variable itself as C interoperable if it
13340 is BIND(C). It is not possible for this to succeed if
13341 the verify_bind_c_derived_type failed, so don't have to handle
13342 any error returned by verify_bind_c_derived_type. */
13343 t = verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
13344 sym->common_block);
13347 if (!t)
13349 /* clear the is_bind_c flag to prevent reporting errors more than
13350 once if something failed. */
13351 sym->attr.is_bind_c = 0;
13352 return;
13356 /* If a derived type symbol has reached this point, without its
13357 type being declared, we have an error. Notice that most
13358 conditions that produce undefined derived types have already
13359 been dealt with. However, the likes of:
13360 implicit type(t) (t) ..... call foo (t) will get us here if
13361 the type is not declared in the scope of the implicit
13362 statement. Change the type to BT_UNKNOWN, both because it is so
13363 and to prevent an ICE. */
13364 if (sym->ts.type == BT_DERIVED && !sym->attr.is_iso_c
13365 && sym->ts.u.derived->components == NULL
13366 && !sym->ts.u.derived->attr.zero_comp)
13368 gfc_error ("The derived type '%s' at %L is of type '%s', "
13369 "which has not been defined", sym->name,
13370 &sym->declared_at, sym->ts.u.derived->name);
13371 sym->ts.type = BT_UNKNOWN;
13372 return;
13375 /* Make sure that the derived type has been resolved and that the
13376 derived type is visible in the symbol's namespace, if it is a
13377 module function and is not PRIVATE. */
13378 if (sym->ts.type == BT_DERIVED
13379 && sym->ts.u.derived->attr.use_assoc
13380 && sym->ns->proc_name
13381 && sym->ns->proc_name->attr.flavor == FL_MODULE
13382 && !resolve_fl_derived (sym->ts.u.derived))
13383 return;
13385 /* Unless the derived-type declaration is use associated, Fortran 95
13386 does not allow public entries of private derived types.
13387 See 4.4.1 (F95) and 4.5.1.1 (F2003); and related interpretation
13388 161 in 95-006r3. */
13389 if (sym->ts.type == BT_DERIVED
13390 && sym->ns->proc_name && sym->ns->proc_name->attr.flavor == FL_MODULE
13391 && !sym->ts.u.derived->attr.use_assoc
13392 && gfc_check_symbol_access (sym)
13393 && !gfc_check_symbol_access (sym->ts.u.derived)
13394 && !gfc_notify_std (GFC_STD_F2003, "PUBLIC %s '%s' at %L of PRIVATE "
13395 "derived type '%s'",
13396 (sym->attr.flavor == FL_PARAMETER)
13397 ? "parameter" : "variable",
13398 sym->name, &sym->declared_at,
13399 sym->ts.u.derived->name))
13400 return;
13402 /* F2008, C1302. */
13403 if (sym->ts.type == BT_DERIVED
13404 && ((sym->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
13405 && sym->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
13406 || sym->ts.u.derived->attr.lock_comp)
13407 && !sym->attr.codimension && !sym->ts.u.derived->attr.coarray_comp)
13409 gfc_error ("Variable %s at %L of type LOCK_TYPE or with subcomponent of "
13410 "type LOCK_TYPE must be a coarray", sym->name,
13411 &sym->declared_at);
13412 return;
13415 /* An assumed-size array with INTENT(OUT) shall not be of a type for which
13416 default initialization is defined (5.1.2.4.4). */
13417 if (sym->ts.type == BT_DERIVED
13418 && sym->attr.dummy
13419 && sym->attr.intent == INTENT_OUT
13420 && sym->as
13421 && sym->as->type == AS_ASSUMED_SIZE)
13423 for (c = sym->ts.u.derived->components; c; c = c->next)
13425 if (c->initializer)
13427 gfc_error ("The INTENT(OUT) dummy argument '%s' at %L is "
13428 "ASSUMED SIZE and so cannot have a default initializer",
13429 sym->name, &sym->declared_at);
13430 return;
13435 /* F2008, C542. */
13436 if (sym->ts.type == BT_DERIVED && sym->attr.dummy
13437 && sym->attr.intent == INTENT_OUT && sym->attr.lock_comp)
13439 gfc_error ("Dummy argument '%s' at %L of LOCK_TYPE shall not be "
13440 "INTENT(OUT)", sym->name, &sym->declared_at);
13441 return;
13444 /* F2008, C525. */
13445 if ((((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.coarray_comp)
13446 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
13447 && CLASS_DATA (sym)->attr.coarray_comp))
13448 || class_attr.codimension)
13449 && (sym->attr.result || sym->result == sym))
13451 gfc_error ("Function result '%s' at %L shall not be a coarray or have "
13452 "a coarray component", sym->name, &sym->declared_at);
13453 return;
13456 /* F2008, C524. */
13457 if (sym->attr.codimension && sym->ts.type == BT_DERIVED
13458 && sym->ts.u.derived->ts.is_iso_c)
13460 gfc_error ("Variable '%s' at %L of TYPE(C_PTR) or TYPE(C_FUNPTR) "
13461 "shall not be a coarray", sym->name, &sym->declared_at);
13462 return;
13465 /* F2008, C525. */
13466 if (((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.coarray_comp)
13467 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
13468 && CLASS_DATA (sym)->attr.coarray_comp))
13469 && (class_attr.codimension || class_attr.pointer || class_attr.dimension
13470 || class_attr.allocatable))
13472 gfc_error ("Variable '%s' at %L with coarray component shall be a "
13473 "nonpointer, nonallocatable scalar, which is not a coarray",
13474 sym->name, &sym->declared_at);
13475 return;
13478 /* F2008, C526. The function-result case was handled above. */
13479 if (class_attr.codimension
13480 && !(class_attr.allocatable || sym->attr.dummy || sym->attr.save
13481 || sym->attr.select_type_temporary
13482 || sym->ns->save_all
13483 || sym->ns->proc_name->attr.flavor == FL_MODULE
13484 || sym->ns->proc_name->attr.is_main_program
13485 || sym->attr.function || sym->attr.result || sym->attr.use_assoc))
13487 gfc_error ("Variable '%s' at %L is a coarray and is not ALLOCATABLE, SAVE "
13488 "nor a dummy argument", sym->name, &sym->declared_at);
13489 return;
13491 /* F2008, C528. */
13492 else if (class_attr.codimension && !sym->attr.select_type_temporary
13493 && !class_attr.allocatable && as && as->cotype == AS_DEFERRED)
13495 gfc_error ("Coarray variable '%s' at %L shall not have codimensions with "
13496 "deferred shape", sym->name, &sym->declared_at);
13497 return;
13499 else if (class_attr.codimension && class_attr.allocatable && as
13500 && (as->cotype != AS_DEFERRED || as->type != AS_DEFERRED))
13502 gfc_error ("Allocatable coarray variable '%s' at %L must have "
13503 "deferred shape", sym->name, &sym->declared_at);
13504 return;
13507 /* F2008, C541. */
13508 if ((((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.coarray_comp)
13509 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
13510 && CLASS_DATA (sym)->attr.coarray_comp))
13511 || (class_attr.codimension && class_attr.allocatable))
13512 && sym->attr.dummy && sym->attr.intent == INTENT_OUT)
13514 gfc_error ("Variable '%s' at %L is INTENT(OUT) and can thus not be an "
13515 "allocatable coarray or have coarray components",
13516 sym->name, &sym->declared_at);
13517 return;
13520 if (class_attr.codimension && sym->attr.dummy
13521 && sym->ns->proc_name && sym->ns->proc_name->attr.is_bind_c)
13523 gfc_error ("Coarray dummy variable '%s' at %L not allowed in BIND(C) "
13524 "procedure '%s'", sym->name, &sym->declared_at,
13525 sym->ns->proc_name->name);
13526 return;
13529 if (sym->ts.type == BT_LOGICAL
13530 && ((sym->attr.function && sym->attr.is_bind_c && sym->result == sym)
13531 || ((sym->attr.dummy || sym->attr.result) && sym->ns->proc_name
13532 && sym->ns->proc_name->attr.is_bind_c)))
13534 int i;
13535 for (i = 0; gfc_logical_kinds[i].kind; i++)
13536 if (gfc_logical_kinds[i].kind == sym->ts.kind)
13537 break;
13538 if (!gfc_logical_kinds[i].c_bool && sym->attr.dummy
13539 && !gfc_notify_std (GFC_STD_GNU, "LOGICAL dummy argument '%s' at "
13540 "%L with non-C_Bool kind in BIND(C) procedure "
13541 "'%s'", sym->name, &sym->declared_at,
13542 sym->ns->proc_name->name))
13543 return;
13544 else if (!gfc_logical_kinds[i].c_bool
13545 && !gfc_notify_std (GFC_STD_GNU, "LOGICAL result variable "
13546 "'%s' at %L with non-C_Bool kind in "
13547 "BIND(C) procedure '%s'", sym->name,
13548 &sym->declared_at,
13549 sym->attr.function ? sym->name
13550 : sym->ns->proc_name->name))
13551 return;
13554 switch (sym->attr.flavor)
13556 case FL_VARIABLE:
13557 if (!resolve_fl_variable (sym, mp_flag))
13558 return;
13559 break;
13561 case FL_PROCEDURE:
13562 if (!resolve_fl_procedure (sym, mp_flag))
13563 return;
13564 break;
13566 case FL_NAMELIST:
13567 if (!resolve_fl_namelist (sym))
13568 return;
13569 break;
13571 case FL_PARAMETER:
13572 if (!resolve_fl_parameter (sym))
13573 return;
13574 break;
13576 default:
13577 break;
13580 /* Resolve array specifier. Check as well some constraints
13581 on COMMON blocks. */
13583 check_constant = sym->attr.in_common && !sym->attr.pointer;
13585 /* Set the formal_arg_flag so that check_conflict will not throw
13586 an error for host associated variables in the specification
13587 expression for an array_valued function. */
13588 if (sym->attr.function && sym->as)
13589 formal_arg_flag = 1;
13591 saved_specification_expr = specification_expr;
13592 specification_expr = true;
13593 gfc_resolve_array_spec (sym->as, check_constant);
13594 specification_expr = saved_specification_expr;
13596 formal_arg_flag = 0;
13598 /* Resolve formal namespaces. */
13599 if (sym->formal_ns && sym->formal_ns != gfc_current_ns
13600 && !sym->attr.contained && !sym->attr.intrinsic)
13601 gfc_resolve (sym->formal_ns);
13603 /* Make sure the formal namespace is present. */
13604 if (sym->formal && !sym->formal_ns)
13606 gfc_formal_arglist *formal = sym->formal;
13607 while (formal && !formal->sym)
13608 formal = formal->next;
13610 if (formal)
13612 sym->formal_ns = formal->sym->ns;
13613 if (sym->ns != formal->sym->ns)
13614 sym->formal_ns->refs++;
13618 /* Check threadprivate restrictions. */
13619 if (sym->attr.threadprivate && !sym->attr.save && !sym->ns->save_all
13620 && (!sym->attr.in_common
13621 && sym->module == NULL
13622 && (sym->ns->proc_name == NULL
13623 || sym->ns->proc_name->attr.flavor != FL_MODULE)))
13624 gfc_error ("Threadprivate at %L isn't SAVEd", &sym->declared_at);
13626 /* Check omp declare target restrictions. */
13627 if (sym->attr.omp_declare_target
13628 && sym->attr.flavor == FL_VARIABLE
13629 && !sym->attr.save
13630 && !sym->ns->save_all
13631 && (!sym->attr.in_common
13632 && sym->module == NULL
13633 && (sym->ns->proc_name == NULL
13634 || sym->ns->proc_name->attr.flavor != FL_MODULE)))
13635 gfc_error ("!$OMP DECLARE TARGET variable '%s' at %L isn't SAVEd",
13636 sym->name, &sym->declared_at);
13638 /* If we have come this far we can apply default-initializers, as
13639 described in 14.7.5, to those variables that have not already
13640 been assigned one. */
13641 if (sym->ts.type == BT_DERIVED
13642 && !sym->value
13643 && !sym->attr.allocatable
13644 && !sym->attr.alloc_comp)
13646 symbol_attribute *a = &sym->attr;
13648 if ((!a->save && !a->dummy && !a->pointer
13649 && !a->in_common && !a->use_assoc
13650 && (a->referenced || a->result)
13651 && !(a->function && sym != sym->result))
13652 || (a->dummy && a->intent == INTENT_OUT && !a->pointer))
13653 apply_default_init (sym);
13656 if (sym->ts.type == BT_CLASS && sym->ns == gfc_current_ns
13657 && sym->attr.dummy && sym->attr.intent == INTENT_OUT
13658 && !CLASS_DATA (sym)->attr.class_pointer
13659 && !CLASS_DATA (sym)->attr.allocatable)
13660 apply_default_init (sym);
13662 /* If this symbol has a type-spec, check it. */
13663 if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER
13664 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.function))
13665 if (!resolve_typespec_used (&sym->ts, &sym->declared_at, sym->name))
13666 return;
13670 /************* Resolve DATA statements *************/
13672 static struct
13674 gfc_data_value *vnode;
13675 mpz_t left;
13677 values;
13680 /* Advance the values structure to point to the next value in the data list. */
13682 static bool
13683 next_data_value (void)
13685 while (mpz_cmp_ui (values.left, 0) == 0)
13688 if (values.vnode->next == NULL)
13689 return false;
13691 values.vnode = values.vnode->next;
13692 mpz_set (values.left, values.vnode->repeat);
13695 return true;
13699 static bool
13700 check_data_variable (gfc_data_variable *var, locus *where)
13702 gfc_expr *e;
13703 mpz_t size;
13704 mpz_t offset;
13705 bool t;
13706 ar_type mark = AR_UNKNOWN;
13707 int i;
13708 mpz_t section_index[GFC_MAX_DIMENSIONS];
13709 gfc_ref *ref;
13710 gfc_array_ref *ar;
13711 gfc_symbol *sym;
13712 int has_pointer;
13714 if (!gfc_resolve_expr (var->expr))
13715 return false;
13717 ar = NULL;
13718 mpz_init_set_si (offset, 0);
13719 e = var->expr;
13721 if (e->expr_type != EXPR_VARIABLE)
13722 gfc_internal_error ("check_data_variable(): Bad expression");
13724 sym = e->symtree->n.sym;
13726 if (sym->ns->is_block_data && !sym->attr.in_common)
13728 gfc_error ("BLOCK DATA element '%s' at %L must be in COMMON",
13729 sym->name, &sym->declared_at);
13732 if (e->ref == NULL && sym->as)
13734 gfc_error ("DATA array '%s' at %L must be specified in a previous"
13735 " declaration", sym->name, where);
13736 return false;
13739 has_pointer = sym->attr.pointer;
13741 if (gfc_is_coindexed (e))
13743 gfc_error ("DATA element '%s' at %L cannot have a coindex", sym->name,
13744 where);
13745 return false;
13748 for (ref = e->ref; ref; ref = ref->next)
13750 if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
13751 has_pointer = 1;
13753 if (has_pointer
13754 && ref->type == REF_ARRAY
13755 && ref->u.ar.type != AR_FULL)
13757 gfc_error ("DATA element '%s' at %L is a pointer and so must "
13758 "be a full array", sym->name, where);
13759 return false;
13763 if (e->rank == 0 || has_pointer)
13765 mpz_init_set_ui (size, 1);
13766 ref = NULL;
13768 else
13770 ref = e->ref;
13772 /* Find the array section reference. */
13773 for (ref = e->ref; ref; ref = ref->next)
13775 if (ref->type != REF_ARRAY)
13776 continue;
13777 if (ref->u.ar.type == AR_ELEMENT)
13778 continue;
13779 break;
13781 gcc_assert (ref);
13783 /* Set marks according to the reference pattern. */
13784 switch (ref->u.ar.type)
13786 case AR_FULL:
13787 mark = AR_FULL;
13788 break;
13790 case AR_SECTION:
13791 ar = &ref->u.ar;
13792 /* Get the start position of array section. */
13793 gfc_get_section_index (ar, section_index, &offset);
13794 mark = AR_SECTION;
13795 break;
13797 default:
13798 gcc_unreachable ();
13801 if (!gfc_array_size (e, &size))
13803 gfc_error ("Nonconstant array section at %L in DATA statement",
13804 &e->where);
13805 mpz_clear (offset);
13806 return false;
13810 t = true;
13812 while (mpz_cmp_ui (size, 0) > 0)
13814 if (!next_data_value ())
13816 gfc_error ("DATA statement at %L has more variables than values",
13817 where);
13818 t = false;
13819 break;
13822 t = gfc_check_assign (var->expr, values.vnode->expr, 0);
13823 if (!t)
13824 break;
13826 /* If we have more than one element left in the repeat count,
13827 and we have more than one element left in the target variable,
13828 then create a range assignment. */
13829 /* FIXME: Only done for full arrays for now, since array sections
13830 seem tricky. */
13831 if (mark == AR_FULL && ref && ref->next == NULL
13832 && mpz_cmp_ui (values.left, 1) > 0 && mpz_cmp_ui (size, 1) > 0)
13834 mpz_t range;
13836 if (mpz_cmp (size, values.left) >= 0)
13838 mpz_init_set (range, values.left);
13839 mpz_sub (size, size, values.left);
13840 mpz_set_ui (values.left, 0);
13842 else
13844 mpz_init_set (range, size);
13845 mpz_sub (values.left, values.left, size);
13846 mpz_set_ui (size, 0);
13849 t = gfc_assign_data_value (var->expr, values.vnode->expr,
13850 offset, &range);
13852 mpz_add (offset, offset, range);
13853 mpz_clear (range);
13855 if (!t)
13856 break;
13859 /* Assign initial value to symbol. */
13860 else
13862 mpz_sub_ui (values.left, values.left, 1);
13863 mpz_sub_ui (size, size, 1);
13865 t = gfc_assign_data_value (var->expr, values.vnode->expr,
13866 offset, NULL);
13867 if (!t)
13868 break;
13870 if (mark == AR_FULL)
13871 mpz_add_ui (offset, offset, 1);
13873 /* Modify the array section indexes and recalculate the offset
13874 for next element. */
13875 else if (mark == AR_SECTION)
13876 gfc_advance_section (section_index, ar, &offset);
13880 if (mark == AR_SECTION)
13882 for (i = 0; i < ar->dimen; i++)
13883 mpz_clear (section_index[i]);
13886 mpz_clear (size);
13887 mpz_clear (offset);
13889 return t;
13893 static bool traverse_data_var (gfc_data_variable *, locus *);
13895 /* Iterate over a list of elements in a DATA statement. */
13897 static bool
13898 traverse_data_list (gfc_data_variable *var, locus *where)
13900 mpz_t trip;
13901 iterator_stack frame;
13902 gfc_expr *e, *start, *end, *step;
13903 bool retval = true;
13905 mpz_init (frame.value);
13906 mpz_init (trip);
13908 start = gfc_copy_expr (var->iter.start);
13909 end = gfc_copy_expr (var->iter.end);
13910 step = gfc_copy_expr (var->iter.step);
13912 if (!gfc_simplify_expr (start, 1)
13913 || start->expr_type != EXPR_CONSTANT)
13915 gfc_error ("start of implied-do loop at %L could not be "
13916 "simplified to a constant value", &start->where);
13917 retval = false;
13918 goto cleanup;
13920 if (!gfc_simplify_expr (end, 1)
13921 || end->expr_type != EXPR_CONSTANT)
13923 gfc_error ("end of implied-do loop at %L could not be "
13924 "simplified to a constant value", &start->where);
13925 retval = false;
13926 goto cleanup;
13928 if (!gfc_simplify_expr (step, 1)
13929 || step->expr_type != EXPR_CONSTANT)
13931 gfc_error ("step of implied-do loop at %L could not be "
13932 "simplified to a constant value", &start->where);
13933 retval = false;
13934 goto cleanup;
13937 mpz_set (trip, end->value.integer);
13938 mpz_sub (trip, trip, start->value.integer);
13939 mpz_add (trip, trip, step->value.integer);
13941 mpz_div (trip, trip, step->value.integer);
13943 mpz_set (frame.value, start->value.integer);
13945 frame.prev = iter_stack;
13946 frame.variable = var->iter.var->symtree;
13947 iter_stack = &frame;
13949 while (mpz_cmp_ui (trip, 0) > 0)
13951 if (!traverse_data_var (var->list, where))
13953 retval = false;
13954 goto cleanup;
13957 e = gfc_copy_expr (var->expr);
13958 if (!gfc_simplify_expr (e, 1))
13960 gfc_free_expr (e);
13961 retval = false;
13962 goto cleanup;
13965 mpz_add (frame.value, frame.value, step->value.integer);
13967 mpz_sub_ui (trip, trip, 1);
13970 cleanup:
13971 mpz_clear (frame.value);
13972 mpz_clear (trip);
13974 gfc_free_expr (start);
13975 gfc_free_expr (end);
13976 gfc_free_expr (step);
13978 iter_stack = frame.prev;
13979 return retval;
13983 /* Type resolve variables in the variable list of a DATA statement. */
13985 static bool
13986 traverse_data_var (gfc_data_variable *var, locus *where)
13988 bool t;
13990 for (; var; var = var->next)
13992 if (var->expr == NULL)
13993 t = traverse_data_list (var, where);
13994 else
13995 t = check_data_variable (var, where);
13997 if (!t)
13998 return false;
14001 return true;
14005 /* Resolve the expressions and iterators associated with a data statement.
14006 This is separate from the assignment checking because data lists should
14007 only be resolved once. */
14009 static bool
14010 resolve_data_variables (gfc_data_variable *d)
14012 for (; d; d = d->next)
14014 if (d->list == NULL)
14016 if (!gfc_resolve_expr (d->expr))
14017 return false;
14019 else
14021 if (!gfc_resolve_iterator (&d->iter, false, true))
14022 return false;
14024 if (!resolve_data_variables (d->list))
14025 return false;
14029 return true;
14033 /* Resolve a single DATA statement. We implement this by storing a pointer to
14034 the value list into static variables, and then recursively traversing the
14035 variables list, expanding iterators and such. */
14037 static void
14038 resolve_data (gfc_data *d)
14041 if (!resolve_data_variables (d->var))
14042 return;
14044 values.vnode = d->value;
14045 if (d->value == NULL)
14046 mpz_set_ui (values.left, 0);
14047 else
14048 mpz_set (values.left, d->value->repeat);
14050 if (!traverse_data_var (d->var, &d->where))
14051 return;
14053 /* At this point, we better not have any values left. */
14055 if (next_data_value ())
14056 gfc_error ("DATA statement at %L has more values than variables",
14057 &d->where);
14061 /* 12.6 Constraint: In a pure subprogram any variable which is in common or
14062 accessed by host or use association, is a dummy argument to a pure function,
14063 is a dummy argument with INTENT (IN) to a pure subroutine, or an object that
14064 is storage associated with any such variable, shall not be used in the
14065 following contexts: (clients of this function). */
14067 /* Determines if a variable is not 'pure', i.e., not assignable within a pure
14068 procedure. Returns zero if assignment is OK, nonzero if there is a
14069 problem. */
14071 gfc_impure_variable (gfc_symbol *sym)
14073 gfc_symbol *proc;
14074 gfc_namespace *ns;
14076 if (sym->attr.use_assoc || sym->attr.in_common)
14077 return 1;
14079 /* Check if the symbol's ns is inside the pure procedure. */
14080 for (ns = gfc_current_ns; ns; ns = ns->parent)
14082 if (ns == sym->ns)
14083 break;
14084 if (ns->proc_name->attr.flavor == FL_PROCEDURE && !sym->attr.function)
14085 return 1;
14088 proc = sym->ns->proc_name;
14089 if (sym->attr.dummy
14090 && ((proc->attr.subroutine && sym->attr.intent == INTENT_IN)
14091 || proc->attr.function))
14092 return 1;
14094 /* TODO: Sort out what can be storage associated, if anything, and include
14095 it here. In principle equivalences should be scanned but it does not
14096 seem to be possible to storage associate an impure variable this way. */
14097 return 0;
14101 /* Test whether a symbol is pure or not. For a NULL pointer, checks if the
14102 current namespace is inside a pure procedure. */
14105 gfc_pure (gfc_symbol *sym)
14107 symbol_attribute attr;
14108 gfc_namespace *ns;
14110 if (sym == NULL)
14112 /* Check if the current namespace or one of its parents
14113 belongs to a pure procedure. */
14114 for (ns = gfc_current_ns; ns; ns = ns->parent)
14116 sym = ns->proc_name;
14117 if (sym == NULL)
14118 return 0;
14119 attr = sym->attr;
14120 if (attr.flavor == FL_PROCEDURE && attr.pure)
14121 return 1;
14123 return 0;
14126 attr = sym->attr;
14128 return attr.flavor == FL_PROCEDURE && attr.pure;
14132 /* Test whether a symbol is implicitly pure or not. For a NULL pointer,
14133 checks if the current namespace is implicitly pure. Note that this
14134 function returns false for a PURE procedure. */
14137 gfc_implicit_pure (gfc_symbol *sym)
14139 gfc_namespace *ns;
14141 if (sym == NULL)
14143 /* Check if the current procedure is implicit_pure. Walk up
14144 the procedure list until we find a procedure. */
14145 for (ns = gfc_current_ns; ns; ns = ns->parent)
14147 sym = ns->proc_name;
14148 if (sym == NULL)
14149 return 0;
14151 if (sym->attr.flavor == FL_PROCEDURE)
14152 break;
14156 return sym->attr.flavor == FL_PROCEDURE && sym->attr.implicit_pure
14157 && !sym->attr.pure;
14161 void
14162 gfc_unset_implicit_pure (gfc_symbol *sym)
14164 gfc_namespace *ns;
14166 if (sym == NULL)
14168 /* Check if the current procedure is implicit_pure. Walk up
14169 the procedure list until we find a procedure. */
14170 for (ns = gfc_current_ns; ns; ns = ns->parent)
14172 sym = ns->proc_name;
14173 if (sym == NULL)
14174 return;
14176 if (sym->attr.flavor == FL_PROCEDURE)
14177 break;
14181 if (sym->attr.flavor == FL_PROCEDURE)
14182 sym->attr.implicit_pure = 0;
14183 else
14184 sym->attr.pure = 0;
14188 /* Test whether the current procedure is elemental or not. */
14191 gfc_elemental (gfc_symbol *sym)
14193 symbol_attribute attr;
14195 if (sym == NULL)
14196 sym = gfc_current_ns->proc_name;
14197 if (sym == NULL)
14198 return 0;
14199 attr = sym->attr;
14201 return attr.flavor == FL_PROCEDURE && attr.elemental;
14205 /* Warn about unused labels. */
14207 static void
14208 warn_unused_fortran_label (gfc_st_label *label)
14210 if (label == NULL)
14211 return;
14213 warn_unused_fortran_label (label->left);
14215 if (label->defined == ST_LABEL_UNKNOWN)
14216 return;
14218 switch (label->referenced)
14220 case ST_LABEL_UNKNOWN:
14221 gfc_warning ("Label %d at %L defined but not used", label->value,
14222 &label->where);
14223 break;
14225 case ST_LABEL_BAD_TARGET:
14226 gfc_warning ("Label %d at %L defined but cannot be used",
14227 label->value, &label->where);
14228 break;
14230 default:
14231 break;
14234 warn_unused_fortran_label (label->right);
14238 /* Returns the sequence type of a symbol or sequence. */
14240 static seq_type
14241 sequence_type (gfc_typespec ts)
14243 seq_type result;
14244 gfc_component *c;
14246 switch (ts.type)
14248 case BT_DERIVED:
14250 if (ts.u.derived->components == NULL)
14251 return SEQ_NONDEFAULT;
14253 result = sequence_type (ts.u.derived->components->ts);
14254 for (c = ts.u.derived->components->next; c; c = c->next)
14255 if (sequence_type (c->ts) != result)
14256 return SEQ_MIXED;
14258 return result;
14260 case BT_CHARACTER:
14261 if (ts.kind != gfc_default_character_kind)
14262 return SEQ_NONDEFAULT;
14264 return SEQ_CHARACTER;
14266 case BT_INTEGER:
14267 if (ts.kind != gfc_default_integer_kind)
14268 return SEQ_NONDEFAULT;
14270 return SEQ_NUMERIC;
14272 case BT_REAL:
14273 if (!(ts.kind == gfc_default_real_kind
14274 || ts.kind == gfc_default_double_kind))
14275 return SEQ_NONDEFAULT;
14277 return SEQ_NUMERIC;
14279 case BT_COMPLEX:
14280 if (ts.kind != gfc_default_complex_kind)
14281 return SEQ_NONDEFAULT;
14283 return SEQ_NUMERIC;
14285 case BT_LOGICAL:
14286 if (ts.kind != gfc_default_logical_kind)
14287 return SEQ_NONDEFAULT;
14289 return SEQ_NUMERIC;
14291 default:
14292 return SEQ_NONDEFAULT;
14297 /* Resolve derived type EQUIVALENCE object. */
14299 static bool
14300 resolve_equivalence_derived (gfc_symbol *derived, gfc_symbol *sym, gfc_expr *e)
14302 gfc_component *c = derived->components;
14304 if (!derived)
14305 return true;
14307 /* Shall not be an object of nonsequence derived type. */
14308 if (!derived->attr.sequence)
14310 gfc_error ("Derived type variable '%s' at %L must have SEQUENCE "
14311 "attribute to be an EQUIVALENCE object", sym->name,
14312 &e->where);
14313 return false;
14316 /* Shall not have allocatable components. */
14317 if (derived->attr.alloc_comp)
14319 gfc_error ("Derived type variable '%s' at %L cannot have ALLOCATABLE "
14320 "components to be an EQUIVALENCE object",sym->name,
14321 &e->where);
14322 return false;
14325 if (sym->attr.in_common && gfc_has_default_initializer (sym->ts.u.derived))
14327 gfc_error ("Derived type variable '%s' at %L with default "
14328 "initialization cannot be in EQUIVALENCE with a variable "
14329 "in COMMON", sym->name, &e->where);
14330 return false;
14333 for (; c ; c = c->next)
14335 if (c->ts.type == BT_DERIVED
14336 && (!resolve_equivalence_derived(c->ts.u.derived, sym, e)))
14337 return false;
14339 /* Shall not be an object of sequence derived type containing a pointer
14340 in the structure. */
14341 if (c->attr.pointer)
14343 gfc_error ("Derived type variable '%s' at %L with pointer "
14344 "component(s) cannot be an EQUIVALENCE object",
14345 sym->name, &e->where);
14346 return false;
14349 return true;
14353 /* Resolve equivalence object.
14354 An EQUIVALENCE object shall not be a dummy argument, a pointer, a target,
14355 an allocatable array, an object of nonsequence derived type, an object of
14356 sequence derived type containing a pointer at any level of component
14357 selection, an automatic object, a function name, an entry name, a result
14358 name, a named constant, a structure component, or a subobject of any of
14359 the preceding objects. A substring shall not have length zero. A
14360 derived type shall not have components with default initialization nor
14361 shall two objects of an equivalence group be initialized.
14362 Either all or none of the objects shall have an protected attribute.
14363 The simple constraints are done in symbol.c(check_conflict) and the rest
14364 are implemented here. */
14366 static void
14367 resolve_equivalence (gfc_equiv *eq)
14369 gfc_symbol *sym;
14370 gfc_symbol *first_sym;
14371 gfc_expr *e;
14372 gfc_ref *r;
14373 locus *last_where = NULL;
14374 seq_type eq_type, last_eq_type;
14375 gfc_typespec *last_ts;
14376 int object, cnt_protected;
14377 const char *msg;
14379 last_ts = &eq->expr->symtree->n.sym->ts;
14381 first_sym = eq->expr->symtree->n.sym;
14383 cnt_protected = 0;
14385 for (object = 1; eq; eq = eq->eq, object++)
14387 e = eq->expr;
14389 e->ts = e->symtree->n.sym->ts;
14390 /* match_varspec might not know yet if it is seeing
14391 array reference or substring reference, as it doesn't
14392 know the types. */
14393 if (e->ref && e->ref->type == REF_ARRAY)
14395 gfc_ref *ref = e->ref;
14396 sym = e->symtree->n.sym;
14398 if (sym->attr.dimension)
14400 ref->u.ar.as = sym->as;
14401 ref = ref->next;
14404 /* For substrings, convert REF_ARRAY into REF_SUBSTRING. */
14405 if (e->ts.type == BT_CHARACTER
14406 && ref
14407 && ref->type == REF_ARRAY
14408 && ref->u.ar.dimen == 1
14409 && ref->u.ar.dimen_type[0] == DIMEN_RANGE
14410 && ref->u.ar.stride[0] == NULL)
14412 gfc_expr *start = ref->u.ar.start[0];
14413 gfc_expr *end = ref->u.ar.end[0];
14414 void *mem = NULL;
14416 /* Optimize away the (:) reference. */
14417 if (start == NULL && end == NULL)
14419 if (e->ref == ref)
14420 e->ref = ref->next;
14421 else
14422 e->ref->next = ref->next;
14423 mem = ref;
14425 else
14427 ref->type = REF_SUBSTRING;
14428 if (start == NULL)
14429 start = gfc_get_int_expr (gfc_default_integer_kind,
14430 NULL, 1);
14431 ref->u.ss.start = start;
14432 if (end == NULL && e->ts.u.cl)
14433 end = gfc_copy_expr (e->ts.u.cl->length);
14434 ref->u.ss.end = end;
14435 ref->u.ss.length = e->ts.u.cl;
14436 e->ts.u.cl = NULL;
14438 ref = ref->next;
14439 free (mem);
14442 /* Any further ref is an error. */
14443 if (ref)
14445 gcc_assert (ref->type == REF_ARRAY);
14446 gfc_error ("Syntax error in EQUIVALENCE statement at %L",
14447 &ref->u.ar.where);
14448 continue;
14452 if (!gfc_resolve_expr (e))
14453 continue;
14455 sym = e->symtree->n.sym;
14457 if (sym->attr.is_protected)
14458 cnt_protected++;
14459 if (cnt_protected > 0 && cnt_protected != object)
14461 gfc_error ("Either all or none of the objects in the "
14462 "EQUIVALENCE set at %L shall have the "
14463 "PROTECTED attribute",
14464 &e->where);
14465 break;
14468 /* Shall not equivalence common block variables in a PURE procedure. */
14469 if (sym->ns->proc_name
14470 && sym->ns->proc_name->attr.pure
14471 && sym->attr.in_common)
14473 gfc_error ("Common block member '%s' at %L cannot be an EQUIVALENCE "
14474 "object in the pure procedure '%s'",
14475 sym->name, &e->where, sym->ns->proc_name->name);
14476 break;
14479 /* Shall not be a named constant. */
14480 if (e->expr_type == EXPR_CONSTANT)
14482 gfc_error ("Named constant '%s' at %L cannot be an EQUIVALENCE "
14483 "object", sym->name, &e->where);
14484 continue;
14487 if (e->ts.type == BT_DERIVED
14488 && !resolve_equivalence_derived (e->ts.u.derived, sym, e))
14489 continue;
14491 /* Check that the types correspond correctly:
14492 Note 5.28:
14493 A numeric sequence structure may be equivalenced to another sequence
14494 structure, an object of default integer type, default real type, double
14495 precision real type, default logical type such that components of the
14496 structure ultimately only become associated to objects of the same
14497 kind. A character sequence structure may be equivalenced to an object
14498 of default character kind or another character sequence structure.
14499 Other objects may be equivalenced only to objects of the same type and
14500 kind parameters. */
14502 /* Identical types are unconditionally OK. */
14503 if (object == 1 || gfc_compare_types (last_ts, &sym->ts))
14504 goto identical_types;
14506 last_eq_type = sequence_type (*last_ts);
14507 eq_type = sequence_type (sym->ts);
14509 /* Since the pair of objects is not of the same type, mixed or
14510 non-default sequences can be rejected. */
14512 msg = "Sequence %s with mixed components in EQUIVALENCE "
14513 "statement at %L with different type objects";
14514 if ((object ==2
14515 && last_eq_type == SEQ_MIXED
14516 && !gfc_notify_std (GFC_STD_GNU, msg, first_sym->name, last_where))
14517 || (eq_type == SEQ_MIXED
14518 && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where)))
14519 continue;
14521 msg = "Non-default type object or sequence %s in EQUIVALENCE "
14522 "statement at %L with objects of different type";
14523 if ((object ==2
14524 && last_eq_type == SEQ_NONDEFAULT
14525 && !gfc_notify_std (GFC_STD_GNU, msg, first_sym->name, last_where))
14526 || (eq_type == SEQ_NONDEFAULT
14527 && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where)))
14528 continue;
14530 msg ="Non-CHARACTER object '%s' in default CHARACTER "
14531 "EQUIVALENCE statement at %L";
14532 if (last_eq_type == SEQ_CHARACTER
14533 && eq_type != SEQ_CHARACTER
14534 && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where))
14535 continue;
14537 msg ="Non-NUMERIC object '%s' in default NUMERIC "
14538 "EQUIVALENCE statement at %L";
14539 if (last_eq_type == SEQ_NUMERIC
14540 && eq_type != SEQ_NUMERIC
14541 && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where))
14542 continue;
14544 identical_types:
14545 last_ts =&sym->ts;
14546 last_where = &e->where;
14548 if (!e->ref)
14549 continue;
14551 /* Shall not be an automatic array. */
14552 if (e->ref->type == REF_ARRAY
14553 && !gfc_resolve_array_spec (e->ref->u.ar.as, 1))
14555 gfc_error ("Array '%s' at %L with non-constant bounds cannot be "
14556 "an EQUIVALENCE object", sym->name, &e->where);
14557 continue;
14560 r = e->ref;
14561 while (r)
14563 /* Shall not be a structure component. */
14564 if (r->type == REF_COMPONENT)
14566 gfc_error ("Structure component '%s' at %L cannot be an "
14567 "EQUIVALENCE object",
14568 r->u.c.component->name, &e->where);
14569 break;
14572 /* A substring shall not have length zero. */
14573 if (r->type == REF_SUBSTRING)
14575 if (compare_bound (r->u.ss.start, r->u.ss.end) == CMP_GT)
14577 gfc_error ("Substring at %L has length zero",
14578 &r->u.ss.start->where);
14579 break;
14582 r = r->next;
14588 /* Resolve function and ENTRY types, issue diagnostics if needed. */
14590 static void
14591 resolve_fntype (gfc_namespace *ns)
14593 gfc_entry_list *el;
14594 gfc_symbol *sym;
14596 if (ns->proc_name == NULL || !ns->proc_name->attr.function)
14597 return;
14599 /* If there are any entries, ns->proc_name is the entry master
14600 synthetic symbol and ns->entries->sym actual FUNCTION symbol. */
14601 if (ns->entries)
14602 sym = ns->entries->sym;
14603 else
14604 sym = ns->proc_name;
14605 if (sym->result == sym
14606 && sym->ts.type == BT_UNKNOWN
14607 && !gfc_set_default_type (sym, 0, NULL)
14608 && !sym->attr.untyped)
14610 gfc_error ("Function '%s' at %L has no IMPLICIT type",
14611 sym->name, &sym->declared_at);
14612 sym->attr.untyped = 1;
14615 if (sym->ts.type == BT_DERIVED && !sym->ts.u.derived->attr.use_assoc
14616 && !sym->attr.contained
14617 && !gfc_check_symbol_access (sym->ts.u.derived)
14618 && gfc_check_symbol_access (sym))
14620 gfc_notify_std (GFC_STD_F2003, "PUBLIC function '%s' at "
14621 "%L of PRIVATE type '%s'", sym->name,
14622 &sym->declared_at, sym->ts.u.derived->name);
14625 if (ns->entries)
14626 for (el = ns->entries->next; el; el = el->next)
14628 if (el->sym->result == el->sym
14629 && el->sym->ts.type == BT_UNKNOWN
14630 && !gfc_set_default_type (el->sym, 0, NULL)
14631 && !el->sym->attr.untyped)
14633 gfc_error ("ENTRY '%s' at %L has no IMPLICIT type",
14634 el->sym->name, &el->sym->declared_at);
14635 el->sym->attr.untyped = 1;
14641 /* 12.3.2.1.1 Defined operators. */
14643 static bool
14644 check_uop_procedure (gfc_symbol *sym, locus where)
14646 gfc_formal_arglist *formal;
14648 if (!sym->attr.function)
14650 gfc_error ("User operator procedure '%s' at %L must be a FUNCTION",
14651 sym->name, &where);
14652 return false;
14655 if (sym->ts.type == BT_CHARACTER
14656 && !(sym->ts.u.cl && sym->ts.u.cl->length)
14657 && !(sym->result && sym->result->ts.u.cl
14658 && sym->result->ts.u.cl->length))
14660 gfc_error ("User operator procedure '%s' at %L cannot be assumed "
14661 "character length", sym->name, &where);
14662 return false;
14665 formal = gfc_sym_get_dummy_args (sym);
14666 if (!formal || !formal->sym)
14668 gfc_error ("User operator procedure '%s' at %L must have at least "
14669 "one argument", sym->name, &where);
14670 return false;
14673 if (formal->sym->attr.intent != INTENT_IN)
14675 gfc_error ("First argument of operator interface at %L must be "
14676 "INTENT(IN)", &where);
14677 return false;
14680 if (formal->sym->attr.optional)
14682 gfc_error ("First argument of operator interface at %L cannot be "
14683 "optional", &where);
14684 return false;
14687 formal = formal->next;
14688 if (!formal || !formal->sym)
14689 return true;
14691 if (formal->sym->attr.intent != INTENT_IN)
14693 gfc_error ("Second argument of operator interface at %L must be "
14694 "INTENT(IN)", &where);
14695 return false;
14698 if (formal->sym->attr.optional)
14700 gfc_error ("Second argument of operator interface at %L cannot be "
14701 "optional", &where);
14702 return false;
14705 if (formal->next)
14707 gfc_error ("Operator interface at %L must have, at most, two "
14708 "arguments", &where);
14709 return false;
14712 return true;
14715 static void
14716 gfc_resolve_uops (gfc_symtree *symtree)
14718 gfc_interface *itr;
14720 if (symtree == NULL)
14721 return;
14723 gfc_resolve_uops (symtree->left);
14724 gfc_resolve_uops (symtree->right);
14726 for (itr = symtree->n.uop->op; itr; itr = itr->next)
14727 check_uop_procedure (itr->sym, itr->sym->declared_at);
14731 /* Examine all of the expressions associated with a program unit,
14732 assign types to all intermediate expressions, make sure that all
14733 assignments are to compatible types and figure out which names
14734 refer to which functions or subroutines. It doesn't check code
14735 block, which is handled by gfc_resolve_code. */
14737 static void
14738 resolve_types (gfc_namespace *ns)
14740 gfc_namespace *n;
14741 gfc_charlen *cl;
14742 gfc_data *d;
14743 gfc_equiv *eq;
14744 gfc_namespace* old_ns = gfc_current_ns;
14746 /* Check that all IMPLICIT types are ok. */
14747 if (!ns->seen_implicit_none)
14749 unsigned letter;
14750 for (letter = 0; letter != GFC_LETTERS; ++letter)
14751 if (ns->set_flag[letter]
14752 && !resolve_typespec_used (&ns->default_type[letter],
14753 &ns->implicit_loc[letter], NULL))
14754 return;
14757 gfc_current_ns = ns;
14759 resolve_entries (ns);
14761 resolve_common_vars (ns->blank_common.head, false);
14762 resolve_common_blocks (ns->common_root);
14764 resolve_contained_functions (ns);
14766 if (ns->proc_name && ns->proc_name->attr.flavor == FL_PROCEDURE
14767 && ns->proc_name->attr.if_source == IFSRC_IFBODY)
14768 resolve_formal_arglist (ns->proc_name);
14770 gfc_traverse_ns (ns, resolve_bind_c_derived_types);
14772 for (cl = ns->cl_list; cl; cl = cl->next)
14773 resolve_charlen (cl);
14775 gfc_traverse_ns (ns, resolve_symbol);
14777 resolve_fntype (ns);
14779 for (n = ns->contained; n; n = n->sibling)
14781 if (gfc_pure (ns->proc_name) && !gfc_pure (n->proc_name))
14782 gfc_error ("Contained procedure '%s' at %L of a PURE procedure must "
14783 "also be PURE", n->proc_name->name,
14784 &n->proc_name->declared_at);
14786 resolve_types (n);
14789 forall_flag = 0;
14790 gfc_do_concurrent_flag = 0;
14791 gfc_check_interfaces (ns);
14793 gfc_traverse_ns (ns, resolve_values);
14795 if (ns->save_all)
14796 gfc_save_all (ns);
14798 iter_stack = NULL;
14799 for (d = ns->data; d; d = d->next)
14800 resolve_data (d);
14802 iter_stack = NULL;
14803 gfc_traverse_ns (ns, gfc_formalize_init_value);
14805 gfc_traverse_ns (ns, gfc_verify_binding_labels);
14807 for (eq = ns->equiv; eq; eq = eq->next)
14808 resolve_equivalence (eq);
14810 /* Warn about unused labels. */
14811 if (warn_unused_label)
14812 warn_unused_fortran_label (ns->st_labels);
14814 gfc_resolve_uops (ns->uop_root);
14816 gfc_resolve_omp_declare_simd (ns);
14818 gfc_resolve_omp_udrs (ns->omp_udr_root);
14820 gfc_current_ns = old_ns;
14824 /* Call gfc_resolve_code recursively. */
14826 static void
14827 resolve_codes (gfc_namespace *ns)
14829 gfc_namespace *n;
14830 bitmap_obstack old_obstack;
14832 if (ns->resolved == 1)
14833 return;
14835 for (n = ns->contained; n; n = n->sibling)
14836 resolve_codes (n);
14838 gfc_current_ns = ns;
14840 /* Don't clear 'cs_base' if this is the namespace of a BLOCK construct. */
14841 if (!(ns->proc_name && ns->proc_name->attr.flavor == FL_LABEL))
14842 cs_base = NULL;
14844 /* Set to an out of range value. */
14845 current_entry_id = -1;
14847 old_obstack = labels_obstack;
14848 bitmap_obstack_initialize (&labels_obstack);
14850 gfc_resolve_code (ns->code, ns);
14852 bitmap_obstack_release (&labels_obstack);
14853 labels_obstack = old_obstack;
14857 /* This function is called after a complete program unit has been compiled.
14858 Its purpose is to examine all of the expressions associated with a program
14859 unit, assign types to all intermediate expressions, make sure that all
14860 assignments are to compatible types and figure out which names refer to
14861 which functions or subroutines. */
14863 void
14864 gfc_resolve (gfc_namespace *ns)
14866 gfc_namespace *old_ns;
14867 code_stack *old_cs_base;
14869 if (ns->resolved)
14870 return;
14872 ns->resolved = -1;
14873 old_ns = gfc_current_ns;
14874 old_cs_base = cs_base;
14876 resolve_types (ns);
14877 component_assignment_level = 0;
14878 resolve_codes (ns);
14880 gfc_current_ns = old_ns;
14881 cs_base = old_cs_base;
14882 ns->resolved = 1;
14884 gfc_run_passes (ns);