2017-10-02 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / gcc / fortran / resolve.c
blob698cf6de2fdc4a8392fc73ddde80b60126b80658
1 /* Perform type resolution on the various structures.
2 Copyright (C) 2001-2017 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 "options.h"
25 #include "bitmap.h"
26 #include "gfortran.h"
27 #include "arith.h" /* For gfc_compare_expr(). */
28 #include "dependency.h"
29 #include "data.h"
30 #include "target-memory.h" /* for gfc_simplify_transfer */
31 #include "constructor.h"
33 /* Types used in equivalence statements. */
35 enum seq_type
37 SEQ_NONDEFAULT, SEQ_NUMERIC, SEQ_CHARACTER, SEQ_MIXED
40 /* Stack to keep track of the nesting of blocks as we move through the
41 code. See resolve_branch() and gfc_resolve_code(). */
43 typedef struct code_stack
45 struct gfc_code *head, *current;
46 struct code_stack *prev;
48 /* This bitmap keeps track of the targets valid for a branch from
49 inside this block except for END {IF|SELECT}s of enclosing
50 blocks. */
51 bitmap reachable_labels;
53 code_stack;
55 static code_stack *cs_base = NULL;
58 /* Nonzero if we're inside a FORALL or DO CONCURRENT block. */
60 static int forall_flag;
61 int gfc_do_concurrent_flag;
63 /* True when we are resolving an expression that is an actual argument to
64 a procedure. */
65 static bool actual_arg = false;
66 /* True when we are resolving an expression that is the first actual argument
67 to a procedure. */
68 static bool first_actual_arg = false;
71 /* Nonzero if we're inside a OpenMP WORKSHARE or PARALLEL WORKSHARE block. */
73 static int omp_workshare_flag;
75 /* True if we are processing a formal arglist. The corresponding function
76 resets the flag each time that it is read. */
77 static bool formal_arg_flag = false;
79 /* True if we are resolving a specification expression. */
80 static bool specification_expr = false;
82 /* The id of the last entry seen. */
83 static int current_entry_id;
85 /* We use bitmaps to determine if a branch target is valid. */
86 static bitmap_obstack labels_obstack;
88 /* True when simplifying a EXPR_VARIABLE argument to an inquiry function. */
89 static bool inquiry_argument = false;
92 bool
93 gfc_is_formal_arg (void)
95 return formal_arg_flag;
98 /* Is the symbol host associated? */
99 static bool
100 is_sym_host_assoc (gfc_symbol *sym, gfc_namespace *ns)
102 for (ns = ns->parent; ns; ns = ns->parent)
104 if (sym->ns == ns)
105 return true;
108 return false;
111 /* Ensure a typespec used is valid; for instance, TYPE(t) is invalid if t is
112 an ABSTRACT derived-type. If where is not NULL, an error message with that
113 locus is printed, optionally using name. */
115 static bool
116 resolve_typespec_used (gfc_typespec* ts, locus* where, const char* name)
118 if (ts->type == BT_DERIVED && ts->u.derived->attr.abstract)
120 if (where)
122 if (name)
123 gfc_error ("%qs at %L is of the ABSTRACT type %qs",
124 name, where, ts->u.derived->name);
125 else
126 gfc_error ("ABSTRACT type %qs used at %L",
127 ts->u.derived->name, where);
130 return false;
133 return true;
137 static bool
138 check_proc_interface (gfc_symbol *ifc, locus *where)
140 /* Several checks for F08:C1216. */
141 if (ifc->attr.procedure)
143 gfc_error ("Interface %qs at %L is declared "
144 "in a later PROCEDURE statement", ifc->name, where);
145 return false;
147 if (ifc->generic)
149 /* For generic interfaces, check if there is
150 a specific procedure with the same name. */
151 gfc_interface *gen = ifc->generic;
152 while (gen && strcmp (gen->sym->name, ifc->name) != 0)
153 gen = gen->next;
154 if (!gen)
156 gfc_error ("Interface %qs at %L may not be generic",
157 ifc->name, where);
158 return false;
161 if (ifc->attr.proc == PROC_ST_FUNCTION)
163 gfc_error ("Interface %qs at %L may not be a statement function",
164 ifc->name, where);
165 return false;
167 if (gfc_is_intrinsic (ifc, 0, ifc->declared_at)
168 || gfc_is_intrinsic (ifc, 1, ifc->declared_at))
169 ifc->attr.intrinsic = 1;
170 if (ifc->attr.intrinsic && !gfc_intrinsic_actual_ok (ifc->name, 0))
172 gfc_error ("Intrinsic procedure %qs not allowed in "
173 "PROCEDURE statement at %L", ifc->name, where);
174 return false;
176 if (!ifc->attr.if_source && !ifc->attr.intrinsic && ifc->name[0] != '\0')
178 gfc_error ("Interface %qs at %L must be explicit", ifc->name, where);
179 return false;
181 return true;
185 static void resolve_symbol (gfc_symbol *sym);
188 /* Resolve the interface for a PROCEDURE declaration or procedure pointer. */
190 static bool
191 resolve_procedure_interface (gfc_symbol *sym)
193 gfc_symbol *ifc = sym->ts.interface;
195 if (!ifc)
196 return true;
198 if (ifc == sym)
200 gfc_error ("PROCEDURE %qs at %L may not be used as its own interface",
201 sym->name, &sym->declared_at);
202 return false;
204 if (!check_proc_interface (ifc, &sym->declared_at))
205 return false;
207 if (ifc->attr.if_source || ifc->attr.intrinsic)
209 /* Resolve interface and copy attributes. */
210 resolve_symbol (ifc);
211 if (ifc->attr.intrinsic)
212 gfc_resolve_intrinsic (ifc, &ifc->declared_at);
214 if (ifc->result)
216 sym->ts = ifc->result->ts;
217 sym->attr.allocatable = ifc->result->attr.allocatable;
218 sym->attr.pointer = ifc->result->attr.pointer;
219 sym->attr.dimension = ifc->result->attr.dimension;
220 sym->attr.class_ok = ifc->result->attr.class_ok;
221 sym->as = gfc_copy_array_spec (ifc->result->as);
222 sym->result = sym;
224 else
226 sym->ts = ifc->ts;
227 sym->attr.allocatable = ifc->attr.allocatable;
228 sym->attr.pointer = ifc->attr.pointer;
229 sym->attr.dimension = ifc->attr.dimension;
230 sym->attr.class_ok = ifc->attr.class_ok;
231 sym->as = gfc_copy_array_spec (ifc->as);
233 sym->ts.interface = ifc;
234 sym->attr.function = ifc->attr.function;
235 sym->attr.subroutine = ifc->attr.subroutine;
237 sym->attr.pure = ifc->attr.pure;
238 sym->attr.elemental = ifc->attr.elemental;
239 sym->attr.contiguous = ifc->attr.contiguous;
240 sym->attr.recursive = ifc->attr.recursive;
241 sym->attr.always_explicit = ifc->attr.always_explicit;
242 sym->attr.ext_attr |= ifc->attr.ext_attr;
243 sym->attr.is_bind_c = ifc->attr.is_bind_c;
244 /* Copy char length. */
245 if (ifc->ts.type == BT_CHARACTER && ifc->ts.u.cl)
247 sym->ts.u.cl = gfc_new_charlen (sym->ns, ifc->ts.u.cl);
248 if (sym->ts.u.cl->length && !sym->ts.u.cl->resolved
249 && !gfc_resolve_expr (sym->ts.u.cl->length))
250 return false;
254 return true;
258 /* Resolve types of formal argument lists. These have to be done early so that
259 the formal argument lists of module procedures can be copied to the
260 containing module before the individual procedures are resolved
261 individually. We also resolve argument lists of procedures in interface
262 blocks because they are self-contained scoping units.
264 Since a dummy argument cannot be a non-dummy procedure, the only
265 resort left for untyped names are the IMPLICIT types. */
267 static void
268 resolve_formal_arglist (gfc_symbol *proc)
270 gfc_formal_arglist *f;
271 gfc_symbol *sym;
272 bool saved_specification_expr;
273 int i;
275 if (proc->result != NULL)
276 sym = proc->result;
277 else
278 sym = proc;
280 if (gfc_elemental (proc)
281 || sym->attr.pointer || sym->attr.allocatable
282 || (sym->as && sym->as->rank != 0))
284 proc->attr.always_explicit = 1;
285 sym->attr.always_explicit = 1;
288 formal_arg_flag = true;
290 for (f = proc->formal; f; f = f->next)
292 gfc_array_spec *as;
294 sym = f->sym;
296 if (sym == NULL)
298 /* Alternate return placeholder. */
299 if (gfc_elemental (proc))
300 gfc_error ("Alternate return specifier in elemental subroutine "
301 "%qs at %L is not allowed", proc->name,
302 &proc->declared_at);
303 if (proc->attr.function)
304 gfc_error ("Alternate return specifier in function "
305 "%qs at %L is not allowed", proc->name,
306 &proc->declared_at);
307 continue;
309 else if (sym->attr.procedure && sym->attr.if_source != IFSRC_DECL
310 && !resolve_procedure_interface (sym))
311 return;
313 if (strcmp (proc->name, sym->name) == 0)
315 gfc_error ("Self-referential argument "
316 "%qs at %L is not allowed", sym->name,
317 &proc->declared_at);
318 return;
321 if (sym->attr.if_source != IFSRC_UNKNOWN)
322 resolve_formal_arglist (sym);
324 if (sym->attr.subroutine || sym->attr.external)
326 if (sym->attr.flavor == FL_UNKNOWN)
327 gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, &sym->declared_at);
329 else
331 if (sym->ts.type == BT_UNKNOWN && !proc->attr.intrinsic
332 && (!sym->attr.function || sym->result == sym))
333 gfc_set_default_type (sym, 1, sym->ns);
336 as = sym->ts.type == BT_CLASS && sym->attr.class_ok
337 ? CLASS_DATA (sym)->as : sym->as;
339 saved_specification_expr = specification_expr;
340 specification_expr = true;
341 gfc_resolve_array_spec (as, 0);
342 specification_expr = saved_specification_expr;
344 /* We can't tell if an array with dimension (:) is assumed or deferred
345 shape until we know if it has the pointer or allocatable attributes.
347 if (as && as->rank > 0 && as->type == AS_DEFERRED
348 && ((sym->ts.type != BT_CLASS
349 && !(sym->attr.pointer || sym->attr.allocatable))
350 || (sym->ts.type == BT_CLASS
351 && !(CLASS_DATA (sym)->attr.class_pointer
352 || CLASS_DATA (sym)->attr.allocatable)))
353 && sym->attr.flavor != FL_PROCEDURE)
355 as->type = AS_ASSUMED_SHAPE;
356 for (i = 0; i < as->rank; i++)
357 as->lower[i] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
360 if ((as && as->rank > 0 && as->type == AS_ASSUMED_SHAPE)
361 || (as && as->type == AS_ASSUMED_RANK)
362 || sym->attr.pointer || sym->attr.allocatable || sym->attr.target
363 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
364 && (CLASS_DATA (sym)->attr.class_pointer
365 || CLASS_DATA (sym)->attr.allocatable
366 || CLASS_DATA (sym)->attr.target))
367 || sym->attr.optional)
369 proc->attr.always_explicit = 1;
370 if (proc->result)
371 proc->result->attr.always_explicit = 1;
374 /* If the flavor is unknown at this point, it has to be a variable.
375 A procedure specification would have already set the type. */
377 if (sym->attr.flavor == FL_UNKNOWN)
378 gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, &sym->declared_at);
380 if (gfc_pure (proc))
382 if (sym->attr.flavor == FL_PROCEDURE)
384 /* F08:C1279. */
385 if (!gfc_pure (sym))
387 gfc_error ("Dummy procedure %qs of PURE procedure at %L must "
388 "also be PURE", sym->name, &sym->declared_at);
389 continue;
392 else if (!sym->attr.pointer)
394 if (proc->attr.function && sym->attr.intent != INTENT_IN)
396 if (sym->attr.value)
397 gfc_notify_std (GFC_STD_F2008, "Argument %qs"
398 " of pure function %qs at %L with VALUE "
399 "attribute but without INTENT(IN)",
400 sym->name, proc->name, &sym->declared_at);
401 else
402 gfc_error ("Argument %qs of pure function %qs at %L must "
403 "be INTENT(IN) or VALUE", sym->name, proc->name,
404 &sym->declared_at);
407 if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN)
409 if (sym->attr.value)
410 gfc_notify_std (GFC_STD_F2008, "Argument %qs"
411 " of pure subroutine %qs at %L with VALUE "
412 "attribute but without INTENT", sym->name,
413 proc->name, &sym->declared_at);
414 else
415 gfc_error ("Argument %qs of pure subroutine %qs at %L "
416 "must have its INTENT specified or have the "
417 "VALUE attribute", sym->name, proc->name,
418 &sym->declared_at);
422 /* F08:C1278a. */
423 if (sym->ts.type == BT_CLASS && sym->attr.intent == INTENT_OUT)
425 gfc_error ("INTENT(OUT) argument %qs of pure procedure %qs at %L"
426 " may not be polymorphic", sym->name, proc->name,
427 &sym->declared_at);
428 continue;
432 if (proc->attr.implicit_pure)
434 if (sym->attr.flavor == FL_PROCEDURE)
436 if (!gfc_pure (sym))
437 proc->attr.implicit_pure = 0;
439 else if (!sym->attr.pointer)
441 if (proc->attr.function && sym->attr.intent != INTENT_IN
442 && !sym->value)
443 proc->attr.implicit_pure = 0;
445 if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN
446 && !sym->value)
447 proc->attr.implicit_pure = 0;
451 if (gfc_elemental (proc))
453 /* F08:C1289. */
454 if (sym->attr.codimension
455 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
456 && CLASS_DATA (sym)->attr.codimension))
458 gfc_error ("Coarray dummy argument %qs at %L to elemental "
459 "procedure", sym->name, &sym->declared_at);
460 continue;
463 if (sym->as || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
464 && CLASS_DATA (sym)->as))
466 gfc_error ("Argument %qs of elemental procedure at %L must "
467 "be scalar", sym->name, &sym->declared_at);
468 continue;
471 if (sym->attr.allocatable
472 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
473 && CLASS_DATA (sym)->attr.allocatable))
475 gfc_error ("Argument %qs of elemental procedure at %L cannot "
476 "have the ALLOCATABLE attribute", sym->name,
477 &sym->declared_at);
478 continue;
481 if (sym->attr.pointer
482 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
483 && CLASS_DATA (sym)->attr.class_pointer))
485 gfc_error ("Argument %qs of elemental procedure at %L cannot "
486 "have the POINTER attribute", sym->name,
487 &sym->declared_at);
488 continue;
491 if (sym->attr.flavor == FL_PROCEDURE)
493 gfc_error ("Dummy procedure %qs not allowed in elemental "
494 "procedure %qs at %L", sym->name, proc->name,
495 &sym->declared_at);
496 continue;
499 /* Fortran 2008 Corrigendum 1, C1290a. */
500 if (sym->attr.intent == INTENT_UNKNOWN && !sym->attr.value)
502 gfc_error ("Argument %qs of elemental procedure %qs at %L must "
503 "have its INTENT specified or have the VALUE "
504 "attribute", sym->name, proc->name,
505 &sym->declared_at);
506 continue;
510 /* Each dummy shall be specified to be scalar. */
511 if (proc->attr.proc == PROC_ST_FUNCTION)
513 if (sym->as != NULL)
515 gfc_error ("Argument %qs of statement function at %L must "
516 "be scalar", sym->name, &sym->declared_at);
517 continue;
520 if (sym->ts.type == BT_CHARACTER)
522 gfc_charlen *cl = sym->ts.u.cl;
523 if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
525 gfc_error ("Character-valued argument %qs of statement "
526 "function at %L must have constant length",
527 sym->name, &sym->declared_at);
528 continue;
533 formal_arg_flag = false;
537 /* Work function called when searching for symbols that have argument lists
538 associated with them. */
540 static void
541 find_arglists (gfc_symbol *sym)
543 if (sym->attr.if_source == IFSRC_UNKNOWN || sym->ns != gfc_current_ns
544 || gfc_fl_struct (sym->attr.flavor) || sym->attr.intrinsic)
545 return;
547 resolve_formal_arglist (sym);
551 /* Given a namespace, resolve all formal argument lists within the namespace.
554 static void
555 resolve_formal_arglists (gfc_namespace *ns)
557 if (ns == NULL)
558 return;
560 gfc_traverse_ns (ns, find_arglists);
564 static void
565 resolve_contained_fntype (gfc_symbol *sym, gfc_namespace *ns)
567 bool t;
569 if (sym && sym->attr.flavor == FL_PROCEDURE
570 && sym->ns->parent
571 && sym->ns->parent->proc_name
572 && sym->ns->parent->proc_name->attr.flavor == FL_PROCEDURE
573 && !strcmp (sym->name, sym->ns->parent->proc_name->name))
574 gfc_error ("Contained procedure %qs at %L has the same name as its "
575 "encompassing procedure", sym->name, &sym->declared_at);
577 /* If this namespace is not a function or an entry master function,
578 ignore it. */
579 if (! sym || !(sym->attr.function || sym->attr.flavor == FL_VARIABLE)
580 || sym->attr.entry_master)
581 return;
583 /* Try to find out of what the return type is. */
584 if (sym->result->ts.type == BT_UNKNOWN && sym->result->ts.interface == NULL)
586 t = gfc_set_default_type (sym->result, 0, ns);
588 if (!t && !sym->result->attr.untyped)
590 if (sym->result == sym)
591 gfc_error ("Contained function %qs at %L has no IMPLICIT type",
592 sym->name, &sym->declared_at);
593 else if (!sym->result->attr.proc_pointer)
594 gfc_error ("Result %qs of contained function %qs at %L has "
595 "no IMPLICIT type", sym->result->name, sym->name,
596 &sym->result->declared_at);
597 sym->result->attr.untyped = 1;
601 /* Fortran 95 Draft Standard, page 51, Section 5.1.1.5, on the Character
602 type, lists the only ways a character length value of * can be used:
603 dummy arguments of procedures, named constants, and function results
604 in external functions. Internal function results and results of module
605 procedures are not on this list, ergo, not permitted. */
607 if (sym->result->ts.type == BT_CHARACTER)
609 gfc_charlen *cl = sym->result->ts.u.cl;
610 if ((!cl || !cl->length) && !sym->result->ts.deferred)
612 /* See if this is a module-procedure and adapt error message
613 accordingly. */
614 bool module_proc;
615 gcc_assert (ns->parent && ns->parent->proc_name);
616 module_proc = (ns->parent->proc_name->attr.flavor == FL_MODULE);
618 gfc_error (module_proc
619 ? G_("Character-valued module procedure %qs at %L"
620 " must not be assumed length")
621 : G_("Character-valued internal function %qs at %L"
622 " must not be assumed length"),
623 sym->name, &sym->declared_at);
629 /* Add NEW_ARGS to the formal argument list of PROC, taking care not to
630 introduce duplicates. */
632 static void
633 merge_argument_lists (gfc_symbol *proc, gfc_formal_arglist *new_args)
635 gfc_formal_arglist *f, *new_arglist;
636 gfc_symbol *new_sym;
638 for (; new_args != NULL; new_args = new_args->next)
640 new_sym = new_args->sym;
641 /* See if this arg is already in the formal argument list. */
642 for (f = proc->formal; f; f = f->next)
644 if (new_sym == f->sym)
645 break;
648 if (f)
649 continue;
651 /* Add a new argument. Argument order is not important. */
652 new_arglist = gfc_get_formal_arglist ();
653 new_arglist->sym = new_sym;
654 new_arglist->next = proc->formal;
655 proc->formal = new_arglist;
660 /* Flag the arguments that are not present in all entries. */
662 static void
663 check_argument_lists (gfc_symbol *proc, gfc_formal_arglist *new_args)
665 gfc_formal_arglist *f, *head;
666 head = new_args;
668 for (f = proc->formal; f; f = f->next)
670 if (f->sym == NULL)
671 continue;
673 for (new_args = head; new_args; new_args = new_args->next)
675 if (new_args->sym == f->sym)
676 break;
679 if (new_args)
680 continue;
682 f->sym->attr.not_always_present = 1;
687 /* Resolve alternate entry points. If a symbol has multiple entry points we
688 create a new master symbol for the main routine, and turn the existing
689 symbol into an entry point. */
691 static void
692 resolve_entries (gfc_namespace *ns)
694 gfc_namespace *old_ns;
695 gfc_code *c;
696 gfc_symbol *proc;
697 gfc_entry_list *el;
698 char name[GFC_MAX_SYMBOL_LEN + 1];
699 static int master_count = 0;
701 if (ns->proc_name == NULL)
702 return;
704 /* No need to do anything if this procedure doesn't have alternate entry
705 points. */
706 if (!ns->entries)
707 return;
709 /* We may already have resolved alternate entry points. */
710 if (ns->proc_name->attr.entry_master)
711 return;
713 /* If this isn't a procedure something has gone horribly wrong. */
714 gcc_assert (ns->proc_name->attr.flavor == FL_PROCEDURE);
716 /* Remember the current namespace. */
717 old_ns = gfc_current_ns;
719 gfc_current_ns = ns;
721 /* Add the main entry point to the list of entry points. */
722 el = gfc_get_entry_list ();
723 el->sym = ns->proc_name;
724 el->id = 0;
725 el->next = ns->entries;
726 ns->entries = el;
727 ns->proc_name->attr.entry = 1;
729 /* If it is a module function, it needs to be in the right namespace
730 so that gfc_get_fake_result_decl can gather up the results. The
731 need for this arose in get_proc_name, where these beasts were
732 left in their own namespace, to keep prior references linked to
733 the entry declaration.*/
734 if (ns->proc_name->attr.function
735 && ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
736 el->sym->ns = ns;
738 /* Do the same for entries where the master is not a module
739 procedure. These are retained in the module namespace because
740 of the module procedure declaration. */
741 for (el = el->next; el; el = el->next)
742 if (el->sym->ns->proc_name->attr.flavor == FL_MODULE
743 && el->sym->attr.mod_proc)
744 el->sym->ns = ns;
745 el = ns->entries;
747 /* Add an entry statement for it. */
748 c = gfc_get_code (EXEC_ENTRY);
749 c->ext.entry = el;
750 c->next = ns->code;
751 ns->code = c;
753 /* Create a new symbol for the master function. */
754 /* Give the internal function a unique name (within this file).
755 Also include the function name so the user has some hope of figuring
756 out what is going on. */
757 snprintf (name, GFC_MAX_SYMBOL_LEN, "master.%d.%s",
758 master_count++, ns->proc_name->name);
759 gfc_get_ha_symbol (name, &proc);
760 gcc_assert (proc != NULL);
762 gfc_add_procedure (&proc->attr, PROC_INTERNAL, proc->name, NULL);
763 if (ns->proc_name->attr.subroutine)
764 gfc_add_subroutine (&proc->attr, proc->name, NULL);
765 else
767 gfc_symbol *sym;
768 gfc_typespec *ts, *fts;
769 gfc_array_spec *as, *fas;
770 gfc_add_function (&proc->attr, proc->name, NULL);
771 proc->result = proc;
772 fas = ns->entries->sym->as;
773 fas = fas ? fas : ns->entries->sym->result->as;
774 fts = &ns->entries->sym->result->ts;
775 if (fts->type == BT_UNKNOWN)
776 fts = gfc_get_default_type (ns->entries->sym->result->name, NULL);
777 for (el = ns->entries->next; el; el = el->next)
779 ts = &el->sym->result->ts;
780 as = el->sym->as;
781 as = as ? as : el->sym->result->as;
782 if (ts->type == BT_UNKNOWN)
783 ts = gfc_get_default_type (el->sym->result->name, NULL);
785 if (! gfc_compare_types (ts, fts)
786 || (el->sym->result->attr.dimension
787 != ns->entries->sym->result->attr.dimension)
788 || (el->sym->result->attr.pointer
789 != ns->entries->sym->result->attr.pointer))
790 break;
791 else if (as && fas && ns->entries->sym->result != el->sym->result
792 && gfc_compare_array_spec (as, fas) == 0)
793 gfc_error ("Function %s at %L has entries with mismatched "
794 "array specifications", ns->entries->sym->name,
795 &ns->entries->sym->declared_at);
796 /* The characteristics need to match and thus both need to have
797 the same string length, i.e. both len=*, or both len=4.
798 Having both len=<variable> is also possible, but difficult to
799 check at compile time. */
800 else if (ts->type == BT_CHARACTER && ts->u.cl && fts->u.cl
801 && (((ts->u.cl->length && !fts->u.cl->length)
802 ||(!ts->u.cl->length && fts->u.cl->length))
803 || (ts->u.cl->length
804 && ts->u.cl->length->expr_type
805 != fts->u.cl->length->expr_type)
806 || (ts->u.cl->length
807 && ts->u.cl->length->expr_type == EXPR_CONSTANT
808 && mpz_cmp (ts->u.cl->length->value.integer,
809 fts->u.cl->length->value.integer) != 0)))
810 gfc_notify_std (GFC_STD_GNU, "Function %s at %L with "
811 "entries returning variables of different "
812 "string lengths", ns->entries->sym->name,
813 &ns->entries->sym->declared_at);
816 if (el == NULL)
818 sym = ns->entries->sym->result;
819 /* All result types the same. */
820 proc->ts = *fts;
821 if (sym->attr.dimension)
822 gfc_set_array_spec (proc, gfc_copy_array_spec (sym->as), NULL);
823 if (sym->attr.pointer)
824 gfc_add_pointer (&proc->attr, NULL);
826 else
828 /* Otherwise the result will be passed through a union by
829 reference. */
830 proc->attr.mixed_entry_master = 1;
831 for (el = ns->entries; el; el = el->next)
833 sym = el->sym->result;
834 if (sym->attr.dimension)
836 if (el == ns->entries)
837 gfc_error ("FUNCTION result %s can't be an array in "
838 "FUNCTION %s at %L", sym->name,
839 ns->entries->sym->name, &sym->declared_at);
840 else
841 gfc_error ("ENTRY result %s can't be an array in "
842 "FUNCTION %s at %L", sym->name,
843 ns->entries->sym->name, &sym->declared_at);
845 else if (sym->attr.pointer)
847 if (el == ns->entries)
848 gfc_error ("FUNCTION result %s can't be a POINTER in "
849 "FUNCTION %s at %L", sym->name,
850 ns->entries->sym->name, &sym->declared_at);
851 else
852 gfc_error ("ENTRY result %s can't be a POINTER in "
853 "FUNCTION %s at %L", sym->name,
854 ns->entries->sym->name, &sym->declared_at);
856 else
858 ts = &sym->ts;
859 if (ts->type == BT_UNKNOWN)
860 ts = gfc_get_default_type (sym->name, NULL);
861 switch (ts->type)
863 case BT_INTEGER:
864 if (ts->kind == gfc_default_integer_kind)
865 sym = NULL;
866 break;
867 case BT_REAL:
868 if (ts->kind == gfc_default_real_kind
869 || ts->kind == gfc_default_double_kind)
870 sym = NULL;
871 break;
872 case BT_COMPLEX:
873 if (ts->kind == gfc_default_complex_kind)
874 sym = NULL;
875 break;
876 case BT_LOGICAL:
877 if (ts->kind == gfc_default_logical_kind)
878 sym = NULL;
879 break;
880 case BT_UNKNOWN:
881 /* We will issue error elsewhere. */
882 sym = NULL;
883 break;
884 default:
885 break;
887 if (sym)
889 if (el == ns->entries)
890 gfc_error ("FUNCTION result %s can't be of type %s "
891 "in FUNCTION %s at %L", sym->name,
892 gfc_typename (ts), ns->entries->sym->name,
893 &sym->declared_at);
894 else
895 gfc_error ("ENTRY result %s can't be of type %s "
896 "in FUNCTION %s at %L", sym->name,
897 gfc_typename (ts), ns->entries->sym->name,
898 &sym->declared_at);
904 proc->attr.access = ACCESS_PRIVATE;
905 proc->attr.entry_master = 1;
907 /* Merge all the entry point arguments. */
908 for (el = ns->entries; el; el = el->next)
909 merge_argument_lists (proc, el->sym->formal);
911 /* Check the master formal arguments for any that are not
912 present in all entry points. */
913 for (el = ns->entries; el; el = el->next)
914 check_argument_lists (proc, el->sym->formal);
916 /* Use the master function for the function body. */
917 ns->proc_name = proc;
919 /* Finalize the new symbols. */
920 gfc_commit_symbols ();
922 /* Restore the original namespace. */
923 gfc_current_ns = old_ns;
927 /* Resolve common variables. */
928 static void
929 resolve_common_vars (gfc_common_head *common_block, bool named_common)
931 gfc_symbol *csym = common_block->head;
933 for (; csym; csym = csym->common_next)
935 /* gfc_add_in_common may have been called before, but the reported errors
936 have been ignored to continue parsing.
937 We do the checks again here. */
938 if (!csym->attr.use_assoc)
939 gfc_add_in_common (&csym->attr, csym->name, &common_block->where);
941 if (csym->value || csym->attr.data)
943 if (!csym->ns->is_block_data)
944 gfc_notify_std (GFC_STD_GNU, "Variable %qs at %L is in COMMON "
945 "but only in BLOCK DATA initialization is "
946 "allowed", csym->name, &csym->declared_at);
947 else if (!named_common)
948 gfc_notify_std (GFC_STD_GNU, "Initialized variable %qs at %L is "
949 "in a blank COMMON but initialization is only "
950 "allowed in named common blocks", csym->name,
951 &csym->declared_at);
954 if (UNLIMITED_POLY (csym))
955 gfc_error_now ("%qs in cannot appear in COMMON at %L "
956 "[F2008:C5100]", csym->name, &csym->declared_at);
958 if (csym->ts.type != BT_DERIVED)
959 continue;
961 if (!(csym->ts.u.derived->attr.sequence
962 || csym->ts.u.derived->attr.is_bind_c))
963 gfc_error_now ("Derived type variable %qs in COMMON at %L "
964 "has neither the SEQUENCE nor the BIND(C) "
965 "attribute", csym->name, &csym->declared_at);
966 if (csym->ts.u.derived->attr.alloc_comp)
967 gfc_error_now ("Derived type variable %qs in COMMON at %L "
968 "has an ultimate component that is "
969 "allocatable", csym->name, &csym->declared_at);
970 if (gfc_has_default_initializer (csym->ts.u.derived))
971 gfc_error_now ("Derived type variable %qs in COMMON at %L "
972 "may not have default initializer", csym->name,
973 &csym->declared_at);
975 if (csym->attr.flavor == FL_UNKNOWN && !csym->attr.proc_pointer)
976 gfc_add_flavor (&csym->attr, FL_VARIABLE, csym->name, &csym->declared_at);
980 /* Resolve common blocks. */
981 static void
982 resolve_common_blocks (gfc_symtree *common_root)
984 gfc_symbol *sym;
985 gfc_gsymbol * gsym;
987 if (common_root == NULL)
988 return;
990 if (common_root->left)
991 resolve_common_blocks (common_root->left);
992 if (common_root->right)
993 resolve_common_blocks (common_root->right);
995 resolve_common_vars (common_root->n.common, true);
997 /* The common name is a global name - in Fortran 2003 also if it has a
998 C binding name, since Fortran 2008 only the C binding name is a global
999 identifier. */
1000 if (!common_root->n.common->binding_label
1001 || gfc_notification_std (GFC_STD_F2008))
1003 gsym = gfc_find_gsymbol (gfc_gsym_root,
1004 common_root->n.common->name);
1006 if (gsym && gfc_notification_std (GFC_STD_F2008)
1007 && gsym->type == GSYM_COMMON
1008 && ((common_root->n.common->binding_label
1009 && (!gsym->binding_label
1010 || strcmp (common_root->n.common->binding_label,
1011 gsym->binding_label) != 0))
1012 || (!common_root->n.common->binding_label
1013 && gsym->binding_label)))
1015 gfc_error ("In Fortran 2003 COMMON %qs block at %L is a global "
1016 "identifier and must thus have the same binding name "
1017 "as the same-named COMMON block at %L: %s vs %s",
1018 common_root->n.common->name, &common_root->n.common->where,
1019 &gsym->where,
1020 common_root->n.common->binding_label
1021 ? common_root->n.common->binding_label : "(blank)",
1022 gsym->binding_label ? gsym->binding_label : "(blank)");
1023 return;
1026 if (gsym && gsym->type != GSYM_COMMON
1027 && !common_root->n.common->binding_label)
1029 gfc_error ("COMMON block %qs at %L uses the same global identifier "
1030 "as entity at %L",
1031 common_root->n.common->name, &common_root->n.common->where,
1032 &gsym->where);
1033 return;
1035 if (gsym && gsym->type != GSYM_COMMON)
1037 gfc_error ("Fortran 2008: COMMON block %qs with binding label at "
1038 "%L sharing the identifier with global non-COMMON-block "
1039 "entity at %L", common_root->n.common->name,
1040 &common_root->n.common->where, &gsym->where);
1041 return;
1043 if (!gsym)
1045 gsym = gfc_get_gsymbol (common_root->n.common->name);
1046 gsym->type = GSYM_COMMON;
1047 gsym->where = common_root->n.common->where;
1048 gsym->defined = 1;
1050 gsym->used = 1;
1053 if (common_root->n.common->binding_label)
1055 gsym = gfc_find_gsymbol (gfc_gsym_root,
1056 common_root->n.common->binding_label);
1057 if (gsym && gsym->type != GSYM_COMMON)
1059 gfc_error ("COMMON block at %L with binding label %s uses the same "
1060 "global identifier as entity at %L",
1061 &common_root->n.common->where,
1062 common_root->n.common->binding_label, &gsym->where);
1063 return;
1065 if (!gsym)
1067 gsym = gfc_get_gsymbol (common_root->n.common->binding_label);
1068 gsym->type = GSYM_COMMON;
1069 gsym->where = common_root->n.common->where;
1070 gsym->defined = 1;
1072 gsym->used = 1;
1075 gfc_find_symbol (common_root->name, gfc_current_ns, 0, &sym);
1076 if (sym == NULL)
1077 return;
1079 if (sym->attr.flavor == FL_PARAMETER)
1080 gfc_error ("COMMON block %qs at %L is used as PARAMETER at %L",
1081 sym->name, &common_root->n.common->where, &sym->declared_at);
1083 if (sym->attr.external)
1084 gfc_error ("COMMON block %qs at %L can not have the EXTERNAL attribute",
1085 sym->name, &common_root->n.common->where);
1087 if (sym->attr.intrinsic)
1088 gfc_error ("COMMON block %qs at %L is also an intrinsic procedure",
1089 sym->name, &common_root->n.common->where);
1090 else if (sym->attr.result
1091 || gfc_is_function_return_value (sym, gfc_current_ns))
1092 gfc_notify_std (GFC_STD_F2003, "COMMON block %qs at %L "
1093 "that is also a function result", sym->name,
1094 &common_root->n.common->where);
1095 else if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_INTERNAL
1096 && sym->attr.proc != PROC_ST_FUNCTION)
1097 gfc_notify_std (GFC_STD_F2003, "COMMON block %qs at %L "
1098 "that is also a global procedure", sym->name,
1099 &common_root->n.common->where);
1103 /* Resolve contained function types. Because contained functions can call one
1104 another, they have to be worked out before any of the contained procedures
1105 can be resolved.
1107 The good news is that if a function doesn't already have a type, the only
1108 way it can get one is through an IMPLICIT type or a RESULT variable, because
1109 by definition contained functions are contained namespace they're contained
1110 in, not in a sibling or parent namespace. */
1112 static void
1113 resolve_contained_functions (gfc_namespace *ns)
1115 gfc_namespace *child;
1116 gfc_entry_list *el;
1118 resolve_formal_arglists (ns);
1120 for (child = ns->contained; child; child = child->sibling)
1122 /* Resolve alternate entry points first. */
1123 resolve_entries (child);
1125 /* Then check function return types. */
1126 resolve_contained_fntype (child->proc_name, child);
1127 for (el = child->entries; el; el = el->next)
1128 resolve_contained_fntype (el->sym, child);
1134 /* A Parameterized Derived Type constructor must contain values for
1135 the PDT KIND parameters or they must have a default initializer.
1136 Go through the constructor picking out the KIND expressions,
1137 storing them in 'param_list' and then call gfc_get_pdt_instance
1138 to obtain the PDT instance. */
1140 static gfc_actual_arglist *param_list, *param_tail, *param;
1142 static bool
1143 get_pdt_spec_expr (gfc_component *c, gfc_expr *expr)
1145 param = gfc_get_actual_arglist ();
1146 if (!param_list)
1147 param_list = param_tail = param;
1148 else
1150 param_tail->next = param;
1151 param_tail = param_tail->next;
1154 param_tail->name = c->name;
1155 if (expr)
1156 param_tail->expr = gfc_copy_expr (expr);
1157 else if (c->initializer)
1158 param_tail->expr = gfc_copy_expr (c->initializer);
1159 else
1161 param_tail->spec_type = SPEC_ASSUMED;
1162 if (c->attr.pdt_kind)
1164 gfc_error ("The KIND parameter in the PDT constructor "
1165 "at %C has no value");
1166 return false;
1170 return true;
1173 static bool
1174 get_pdt_constructor (gfc_expr *expr, gfc_constructor **constr,
1175 gfc_symbol *derived)
1177 gfc_constructor *cons;
1178 gfc_component *comp;
1179 bool t = true;
1181 if (expr && expr->expr_type == EXPR_STRUCTURE)
1182 cons = gfc_constructor_first (expr->value.constructor);
1183 else if (constr)
1184 cons = *constr;
1185 gcc_assert (cons);
1187 comp = derived->components;
1189 for (; comp && cons; comp = comp->next, cons = gfc_constructor_next (cons))
1191 if (cons->expr->expr_type == EXPR_STRUCTURE
1192 && comp->ts.type == BT_DERIVED)
1194 t = get_pdt_constructor (cons->expr, NULL, comp->ts.u.derived);
1195 if (!t)
1196 return t;
1198 else if (comp->ts.type == BT_DERIVED)
1200 t = get_pdt_constructor (NULL, &cons, comp->ts.u.derived);
1201 if (!t)
1202 return t;
1204 else if ((comp->attr.pdt_kind || comp->attr.pdt_len)
1205 && derived->attr.pdt_template)
1207 t = get_pdt_spec_expr (comp, cons->expr);
1208 if (!t)
1209 return t;
1212 return t;
1216 static bool resolve_fl_derived0 (gfc_symbol *sym);
1217 static bool resolve_fl_struct (gfc_symbol *sym);
1220 /* Resolve all of the elements of a structure constructor and make sure that
1221 the types are correct. The 'init' flag indicates that the given
1222 constructor is an initializer. */
1224 static bool
1225 resolve_structure_cons (gfc_expr *expr, int init)
1227 gfc_constructor *cons;
1228 gfc_component *comp;
1229 bool t;
1230 symbol_attribute a;
1232 t = true;
1234 if (expr->ts.type == BT_DERIVED || expr->ts.type == BT_UNION)
1236 if (expr->ts.u.derived->attr.flavor == FL_DERIVED)
1237 resolve_fl_derived0 (expr->ts.u.derived);
1238 else
1239 resolve_fl_struct (expr->ts.u.derived);
1241 /* If this is a Parameterized Derived Type template, find the
1242 instance corresponding to the PDT kind parameters. */
1243 if (expr->ts.u.derived->attr.pdt_template)
1245 param_list = NULL;
1246 t = get_pdt_constructor (expr, NULL, expr->ts.u.derived);
1247 if (!t)
1248 return t;
1249 gfc_get_pdt_instance (param_list, &expr->ts.u.derived, NULL);
1251 expr->param_list = gfc_copy_actual_arglist (param_list);
1253 if (param_list)
1254 gfc_free_actual_arglist (param_list);
1256 if (!expr->ts.u.derived->attr.pdt_type)
1257 return false;
1261 cons = gfc_constructor_first (expr->value.constructor);
1263 /* A constructor may have references if it is the result of substituting a
1264 parameter variable. In this case we just pull out the component we
1265 want. */
1266 if (expr->ref)
1267 comp = expr->ref->u.c.sym->components;
1268 else
1269 comp = expr->ts.u.derived->components;
1271 for (; comp && cons; comp = comp->next, cons = gfc_constructor_next (cons))
1273 int rank;
1275 if (!cons->expr)
1276 continue;
1278 /* Unions use an EXPR_NULL contrived expression to tell the translation
1279 phase to generate an initializer of the appropriate length.
1280 Ignore it here. */
1281 if (cons->expr->ts.type == BT_UNION && cons->expr->expr_type == EXPR_NULL)
1282 continue;
1284 if (!gfc_resolve_expr (cons->expr))
1286 t = false;
1287 continue;
1290 rank = comp->as ? comp->as->rank : 0;
1291 if (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->as)
1292 rank = CLASS_DATA (comp)->as->rank;
1294 if (cons->expr->expr_type != EXPR_NULL && rank != cons->expr->rank
1295 && (comp->attr.allocatable || cons->expr->rank))
1297 gfc_error ("The rank of the element in the structure "
1298 "constructor at %L does not match that of the "
1299 "component (%d/%d)", &cons->expr->where,
1300 cons->expr->rank, rank);
1301 t = false;
1304 /* If we don't have the right type, try to convert it. */
1306 if (!comp->attr.proc_pointer &&
1307 !gfc_compare_types (&cons->expr->ts, &comp->ts))
1309 if (strcmp (comp->name, "_extends") == 0)
1311 /* Can afford to be brutal with the _extends initializer.
1312 The derived type can get lost because it is PRIVATE
1313 but it is not usage constrained by the standard. */
1314 cons->expr->ts = comp->ts;
1316 else if (comp->attr.pointer && cons->expr->ts.type != BT_UNKNOWN)
1318 gfc_error ("The element in the structure constructor at %L, "
1319 "for pointer component %qs, is %s but should be %s",
1320 &cons->expr->where, comp->name,
1321 gfc_basic_typename (cons->expr->ts.type),
1322 gfc_basic_typename (comp->ts.type));
1323 t = false;
1325 else
1327 bool t2 = gfc_convert_type (cons->expr, &comp->ts, 1);
1328 if (t)
1329 t = t2;
1333 /* For strings, the length of the constructor should be the same as
1334 the one of the structure, ensure this if the lengths are known at
1335 compile time and when we are dealing with PARAMETER or structure
1336 constructors. */
1337 if (cons->expr->ts.type == BT_CHARACTER && comp->ts.u.cl
1338 && comp->ts.u.cl->length
1339 && comp->ts.u.cl->length->expr_type == EXPR_CONSTANT
1340 && cons->expr->ts.u.cl && cons->expr->ts.u.cl->length
1341 && cons->expr->ts.u.cl->length->expr_type == EXPR_CONSTANT
1342 && cons->expr->rank != 0
1343 && mpz_cmp (cons->expr->ts.u.cl->length->value.integer,
1344 comp->ts.u.cl->length->value.integer) != 0)
1346 if (cons->expr->expr_type == EXPR_VARIABLE
1347 && cons->expr->symtree->n.sym->attr.flavor == FL_PARAMETER)
1349 /* Wrap the parameter in an array constructor (EXPR_ARRAY)
1350 to make use of the gfc_resolve_character_array_constructor
1351 machinery. The expression is later simplified away to
1352 an array of string literals. */
1353 gfc_expr *para = cons->expr;
1354 cons->expr = gfc_get_expr ();
1355 cons->expr->ts = para->ts;
1356 cons->expr->where = para->where;
1357 cons->expr->expr_type = EXPR_ARRAY;
1358 cons->expr->rank = para->rank;
1359 cons->expr->shape = gfc_copy_shape (para->shape, para->rank);
1360 gfc_constructor_append_expr (&cons->expr->value.constructor,
1361 para, &cons->expr->where);
1364 if (cons->expr->expr_type == EXPR_ARRAY)
1366 /* Rely on the cleanup of the namespace to deal correctly with
1367 the old charlen. (There was a block here that attempted to
1368 remove the charlen but broke the chain in so doing.) */
1369 cons->expr->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1370 cons->expr->ts.u.cl->length_from_typespec = true;
1371 cons->expr->ts.u.cl->length = gfc_copy_expr (comp->ts.u.cl->length);
1372 gfc_resolve_character_array_constructor (cons->expr);
1376 if (cons->expr->expr_type == EXPR_NULL
1377 && !(comp->attr.pointer || comp->attr.allocatable
1378 || comp->attr.proc_pointer || comp->ts.f90_type == BT_VOID
1379 || (comp->ts.type == BT_CLASS
1380 && (CLASS_DATA (comp)->attr.class_pointer
1381 || CLASS_DATA (comp)->attr.allocatable))))
1383 t = false;
1384 gfc_error ("The NULL in the structure constructor at %L is "
1385 "being applied to component %qs, which is neither "
1386 "a POINTER nor ALLOCATABLE", &cons->expr->where,
1387 comp->name);
1390 if (comp->attr.proc_pointer && comp->ts.interface)
1392 /* Check procedure pointer interface. */
1393 gfc_symbol *s2 = NULL;
1394 gfc_component *c2;
1395 const char *name;
1396 char err[200];
1398 c2 = gfc_get_proc_ptr_comp (cons->expr);
1399 if (c2)
1401 s2 = c2->ts.interface;
1402 name = c2->name;
1404 else if (cons->expr->expr_type == EXPR_FUNCTION)
1406 s2 = cons->expr->symtree->n.sym->result;
1407 name = cons->expr->symtree->n.sym->result->name;
1409 else if (cons->expr->expr_type != EXPR_NULL)
1411 s2 = cons->expr->symtree->n.sym;
1412 name = cons->expr->symtree->n.sym->name;
1415 if (s2 && !gfc_compare_interfaces (comp->ts.interface, s2, name, 0, 1,
1416 err, sizeof (err), NULL, NULL))
1418 gfc_error_opt (OPT_Wargument_mismatch,
1419 "Interface mismatch for procedure-pointer "
1420 "component %qs in structure constructor at %L:"
1421 " %s", comp->name, &cons->expr->where, err);
1422 return false;
1426 if (!comp->attr.pointer || comp->attr.proc_pointer
1427 || cons->expr->expr_type == EXPR_NULL)
1428 continue;
1430 a = gfc_expr_attr (cons->expr);
1432 if (!a.pointer && !a.target)
1434 t = false;
1435 gfc_error ("The element in the structure constructor at %L, "
1436 "for pointer component %qs should be a POINTER or "
1437 "a TARGET", &cons->expr->where, comp->name);
1440 if (init)
1442 /* F08:C461. Additional checks for pointer initialization. */
1443 if (a.allocatable)
1445 t = false;
1446 gfc_error ("Pointer initialization target at %L "
1447 "must not be ALLOCATABLE", &cons->expr->where);
1449 if (!a.save)
1451 t = false;
1452 gfc_error ("Pointer initialization target at %L "
1453 "must have the SAVE attribute", &cons->expr->where);
1457 /* F2003, C1272 (3). */
1458 bool impure = cons->expr->expr_type == EXPR_VARIABLE
1459 && (gfc_impure_variable (cons->expr->symtree->n.sym)
1460 || gfc_is_coindexed (cons->expr));
1461 if (impure && gfc_pure (NULL))
1463 t = false;
1464 gfc_error ("Invalid expression in the structure constructor for "
1465 "pointer component %qs at %L in PURE procedure",
1466 comp->name, &cons->expr->where);
1469 if (impure)
1470 gfc_unset_implicit_pure (NULL);
1473 return t;
1477 /****************** Expression name resolution ******************/
1479 /* Returns 0 if a symbol was not declared with a type or
1480 attribute declaration statement, nonzero otherwise. */
1482 static int
1483 was_declared (gfc_symbol *sym)
1485 symbol_attribute a;
1487 a = sym->attr;
1489 if (!a.implicit_type && sym->ts.type != BT_UNKNOWN)
1490 return 1;
1492 if (a.allocatable || a.dimension || a.dummy || a.external || a.intrinsic
1493 || a.optional || a.pointer || a.save || a.target || a.volatile_
1494 || a.value || a.access != ACCESS_UNKNOWN || a.intent != INTENT_UNKNOWN
1495 || a.asynchronous || a.codimension)
1496 return 1;
1498 return 0;
1502 /* Determine if a symbol is generic or not. */
1504 static int
1505 generic_sym (gfc_symbol *sym)
1507 gfc_symbol *s;
1509 if (sym->attr.generic ||
1510 (sym->attr.intrinsic && gfc_generic_intrinsic (sym->name)))
1511 return 1;
1513 if (was_declared (sym) || sym->ns->parent == NULL)
1514 return 0;
1516 gfc_find_symbol (sym->name, sym->ns->parent, 1, &s);
1518 if (s != NULL)
1520 if (s == sym)
1521 return 0;
1522 else
1523 return generic_sym (s);
1526 return 0;
1530 /* Determine if a symbol is specific or not. */
1532 static int
1533 specific_sym (gfc_symbol *sym)
1535 gfc_symbol *s;
1537 if (sym->attr.if_source == IFSRC_IFBODY
1538 || sym->attr.proc == PROC_MODULE
1539 || sym->attr.proc == PROC_INTERNAL
1540 || sym->attr.proc == PROC_ST_FUNCTION
1541 || (sym->attr.intrinsic && gfc_specific_intrinsic (sym->name))
1542 || sym->attr.external)
1543 return 1;
1545 if (was_declared (sym) || sym->ns->parent == NULL)
1546 return 0;
1548 gfc_find_symbol (sym->name, sym->ns->parent, 1, &s);
1550 return (s == NULL) ? 0 : specific_sym (s);
1554 /* Figure out if the procedure is specific, generic or unknown. */
1556 enum proc_type
1557 { PTYPE_GENERIC = 1, PTYPE_SPECIFIC, PTYPE_UNKNOWN };
1559 static proc_type
1560 procedure_kind (gfc_symbol *sym)
1562 if (generic_sym (sym))
1563 return PTYPE_GENERIC;
1565 if (specific_sym (sym))
1566 return PTYPE_SPECIFIC;
1568 return PTYPE_UNKNOWN;
1571 /* Check references to assumed size arrays. The flag need_full_assumed_size
1572 is nonzero when matching actual arguments. */
1574 static int need_full_assumed_size = 0;
1576 static bool
1577 check_assumed_size_reference (gfc_symbol *sym, gfc_expr *e)
1579 if (need_full_assumed_size || !(sym->as && sym->as->type == AS_ASSUMED_SIZE))
1580 return false;
1582 /* FIXME: The comparison "e->ref->u.ar.type == AR_FULL" is wrong.
1583 What should it be? */
1584 if (e->ref && (e->ref->u.ar.end[e->ref->u.ar.as->rank - 1] == NULL)
1585 && (e->ref->u.ar.as->type == AS_ASSUMED_SIZE)
1586 && (e->ref->u.ar.type == AR_FULL))
1588 gfc_error ("The upper bound in the last dimension must "
1589 "appear in the reference to the assumed size "
1590 "array %qs at %L", sym->name, &e->where);
1591 return true;
1593 return false;
1597 /* Look for bad assumed size array references in argument expressions
1598 of elemental and array valued intrinsic procedures. Since this is
1599 called from procedure resolution functions, it only recurses at
1600 operators. */
1602 static bool
1603 resolve_assumed_size_actual (gfc_expr *e)
1605 if (e == NULL)
1606 return false;
1608 switch (e->expr_type)
1610 case EXPR_VARIABLE:
1611 if (e->symtree && check_assumed_size_reference (e->symtree->n.sym, e))
1612 return true;
1613 break;
1615 case EXPR_OP:
1616 if (resolve_assumed_size_actual (e->value.op.op1)
1617 || resolve_assumed_size_actual (e->value.op.op2))
1618 return true;
1619 break;
1621 default:
1622 break;
1624 return false;
1628 /* Check a generic procedure, passed as an actual argument, to see if
1629 there is a matching specific name. If none, it is an error, and if
1630 more than one, the reference is ambiguous. */
1631 static int
1632 count_specific_procs (gfc_expr *e)
1634 int n;
1635 gfc_interface *p;
1636 gfc_symbol *sym;
1638 n = 0;
1639 sym = e->symtree->n.sym;
1641 for (p = sym->generic; p; p = p->next)
1642 if (strcmp (sym->name, p->sym->name) == 0)
1644 e->symtree = gfc_find_symtree (p->sym->ns->sym_root,
1645 sym->name);
1646 n++;
1649 if (n > 1)
1650 gfc_error ("%qs at %L is ambiguous", e->symtree->n.sym->name,
1651 &e->where);
1653 if (n == 0)
1654 gfc_error ("GENERIC procedure %qs is not allowed as an actual "
1655 "argument at %L", sym->name, &e->where);
1657 return n;
1661 /* See if a call to sym could possibly be a not allowed RECURSION because of
1662 a missing RECURSIVE declaration. This means that either sym is the current
1663 context itself, or sym is the parent of a contained procedure calling its
1664 non-RECURSIVE containing procedure.
1665 This also works if sym is an ENTRY. */
1667 static bool
1668 is_illegal_recursion (gfc_symbol* sym, gfc_namespace* context)
1670 gfc_symbol* proc_sym;
1671 gfc_symbol* context_proc;
1672 gfc_namespace* real_context;
1674 if (sym->attr.flavor == FL_PROGRAM
1675 || gfc_fl_struct (sym->attr.flavor))
1676 return false;
1678 gcc_assert (sym->attr.flavor == FL_PROCEDURE);
1680 /* If we've got an ENTRY, find real procedure. */
1681 if (sym->attr.entry && sym->ns->entries)
1682 proc_sym = sym->ns->entries->sym;
1683 else
1684 proc_sym = sym;
1686 /* If sym is RECURSIVE, all is well of course. */
1687 if (proc_sym->attr.recursive || flag_recursive)
1688 return false;
1690 /* Find the context procedure's "real" symbol if it has entries.
1691 We look for a procedure symbol, so recurse on the parents if we don't
1692 find one (like in case of a BLOCK construct). */
1693 for (real_context = context; ; real_context = real_context->parent)
1695 /* We should find something, eventually! */
1696 gcc_assert (real_context);
1698 context_proc = (real_context->entries ? real_context->entries->sym
1699 : real_context->proc_name);
1701 /* In some special cases, there may not be a proc_name, like for this
1702 invalid code:
1703 real(bad_kind()) function foo () ...
1704 when checking the call to bad_kind ().
1705 In these cases, we simply return here and assume that the
1706 call is ok. */
1707 if (!context_proc)
1708 return false;
1710 if (context_proc->attr.flavor != FL_LABEL)
1711 break;
1714 /* A call from sym's body to itself is recursion, of course. */
1715 if (context_proc == proc_sym)
1716 return true;
1718 /* The same is true if context is a contained procedure and sym the
1719 containing one. */
1720 if (context_proc->attr.contained)
1722 gfc_symbol* parent_proc;
1724 gcc_assert (context->parent);
1725 parent_proc = (context->parent->entries ? context->parent->entries->sym
1726 : context->parent->proc_name);
1728 if (parent_proc == proc_sym)
1729 return true;
1732 return false;
1736 /* Resolve an intrinsic procedure: Set its function/subroutine attribute,
1737 its typespec and formal argument list. */
1739 bool
1740 gfc_resolve_intrinsic (gfc_symbol *sym, locus *loc)
1742 gfc_intrinsic_sym* isym = NULL;
1743 const char* symstd;
1745 if (sym->formal)
1746 return true;
1748 /* Already resolved. */
1749 if (sym->from_intmod && sym->ts.type != BT_UNKNOWN)
1750 return true;
1752 /* We already know this one is an intrinsic, so we don't call
1753 gfc_is_intrinsic for full checking but rather use gfc_find_function and
1754 gfc_find_subroutine directly to check whether it is a function or
1755 subroutine. */
1757 if (sym->intmod_sym_id && sym->attr.subroutine)
1759 gfc_isym_id id = gfc_isym_id_by_intmod_sym (sym);
1760 isym = gfc_intrinsic_subroutine_by_id (id);
1762 else if (sym->intmod_sym_id)
1764 gfc_isym_id id = gfc_isym_id_by_intmod_sym (sym);
1765 isym = gfc_intrinsic_function_by_id (id);
1767 else if (!sym->attr.subroutine)
1768 isym = gfc_find_function (sym->name);
1770 if (isym && !sym->attr.subroutine)
1772 if (sym->ts.type != BT_UNKNOWN && warn_surprising
1773 && !sym->attr.implicit_type)
1774 gfc_warning (OPT_Wsurprising,
1775 "Type specified for intrinsic function %qs at %L is"
1776 " ignored", sym->name, &sym->declared_at);
1778 if (!sym->attr.function &&
1779 !gfc_add_function(&sym->attr, sym->name, loc))
1780 return false;
1782 sym->ts = isym->ts;
1784 else if (isym || (isym = gfc_find_subroutine (sym->name)))
1786 if (sym->ts.type != BT_UNKNOWN && !sym->attr.implicit_type)
1788 gfc_error ("Intrinsic subroutine %qs at %L shall not have a type"
1789 " specifier", sym->name, &sym->declared_at);
1790 return false;
1793 if (!sym->attr.subroutine &&
1794 !gfc_add_subroutine(&sym->attr, sym->name, loc))
1795 return false;
1797 else
1799 gfc_error ("%qs declared INTRINSIC at %L does not exist", sym->name,
1800 &sym->declared_at);
1801 return false;
1804 gfc_copy_formal_args_intr (sym, isym, NULL);
1806 sym->attr.pure = isym->pure;
1807 sym->attr.elemental = isym->elemental;
1809 /* Check it is actually available in the standard settings. */
1810 if (!gfc_check_intrinsic_standard (isym, &symstd, false, sym->declared_at))
1812 gfc_error ("The intrinsic %qs declared INTRINSIC at %L is not "
1813 "available in the current standard settings but %s. Use "
1814 "an appropriate %<-std=*%> option or enable "
1815 "%<-fall-intrinsics%> in order to use it.",
1816 sym->name, &sym->declared_at, symstd);
1817 return false;
1820 return true;
1824 /* Resolve a procedure expression, like passing it to a called procedure or as
1825 RHS for a procedure pointer assignment. */
1827 static bool
1828 resolve_procedure_expression (gfc_expr* expr)
1830 gfc_symbol* sym;
1832 if (expr->expr_type != EXPR_VARIABLE)
1833 return true;
1834 gcc_assert (expr->symtree);
1836 sym = expr->symtree->n.sym;
1838 if (sym->attr.intrinsic)
1839 gfc_resolve_intrinsic (sym, &expr->where);
1841 if (sym->attr.flavor != FL_PROCEDURE
1842 || (sym->attr.function && sym->result == sym))
1843 return true;
1845 /* A non-RECURSIVE procedure that is used as procedure expression within its
1846 own body is in danger of being called recursively. */
1847 if (is_illegal_recursion (sym, gfc_current_ns))
1848 gfc_warning (0, "Non-RECURSIVE procedure %qs at %L is possibly calling"
1849 " itself recursively. Declare it RECURSIVE or use"
1850 " %<-frecursive%>", sym->name, &expr->where);
1852 return true;
1856 /* Resolve an actual argument list. Most of the time, this is just
1857 resolving the expressions in the list.
1858 The exception is that we sometimes have to decide whether arguments
1859 that look like procedure arguments are really simple variable
1860 references. */
1862 static bool
1863 resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype,
1864 bool no_formal_args)
1866 gfc_symbol *sym;
1867 gfc_symtree *parent_st;
1868 gfc_expr *e;
1869 gfc_component *comp;
1870 int save_need_full_assumed_size;
1871 bool return_value = false;
1872 bool actual_arg_sav = actual_arg, first_actual_arg_sav = first_actual_arg;
1874 actual_arg = true;
1875 first_actual_arg = true;
1877 for (; arg; arg = arg->next)
1879 e = arg->expr;
1880 if (e == NULL)
1882 /* Check the label is a valid branching target. */
1883 if (arg->label)
1885 if (arg->label->defined == ST_LABEL_UNKNOWN)
1887 gfc_error ("Label %d referenced at %L is never defined",
1888 arg->label->value, &arg->label->where);
1889 goto cleanup;
1892 first_actual_arg = false;
1893 continue;
1896 if (e->expr_type == EXPR_VARIABLE
1897 && e->symtree->n.sym->attr.generic
1898 && no_formal_args
1899 && count_specific_procs (e) != 1)
1900 goto cleanup;
1902 if (e->ts.type != BT_PROCEDURE)
1904 save_need_full_assumed_size = need_full_assumed_size;
1905 if (e->expr_type != EXPR_VARIABLE)
1906 need_full_assumed_size = 0;
1907 if (!gfc_resolve_expr (e))
1908 goto cleanup;
1909 need_full_assumed_size = save_need_full_assumed_size;
1910 goto argument_list;
1913 /* See if the expression node should really be a variable reference. */
1915 sym = e->symtree->n.sym;
1917 if (sym->attr.flavor == FL_PROCEDURE
1918 || sym->attr.intrinsic
1919 || sym->attr.external)
1921 int actual_ok;
1923 /* If a procedure is not already determined to be something else
1924 check if it is intrinsic. */
1925 if (gfc_is_intrinsic (sym, sym->attr.subroutine, e->where))
1926 sym->attr.intrinsic = 1;
1928 if (sym->attr.proc == PROC_ST_FUNCTION)
1930 gfc_error ("Statement function %qs at %L is not allowed as an "
1931 "actual argument", sym->name, &e->where);
1934 actual_ok = gfc_intrinsic_actual_ok (sym->name,
1935 sym->attr.subroutine);
1936 if (sym->attr.intrinsic && actual_ok == 0)
1938 gfc_error ("Intrinsic %qs at %L is not allowed as an "
1939 "actual argument", sym->name, &e->where);
1942 if (sym->attr.contained && !sym->attr.use_assoc
1943 && sym->ns->proc_name->attr.flavor != FL_MODULE)
1945 if (!gfc_notify_std (GFC_STD_F2008, "Internal procedure %qs is"
1946 " used as actual argument at %L",
1947 sym->name, &e->where))
1948 goto cleanup;
1951 if (sym->attr.elemental && !sym->attr.intrinsic)
1953 gfc_error ("ELEMENTAL non-INTRINSIC procedure %qs is not "
1954 "allowed as an actual argument at %L", sym->name,
1955 &e->where);
1958 /* Check if a generic interface has a specific procedure
1959 with the same name before emitting an error. */
1960 if (sym->attr.generic && count_specific_procs (e) != 1)
1961 goto cleanup;
1963 /* Just in case a specific was found for the expression. */
1964 sym = e->symtree->n.sym;
1966 /* If the symbol is the function that names the current (or
1967 parent) scope, then we really have a variable reference. */
1969 if (gfc_is_function_return_value (sym, sym->ns))
1970 goto got_variable;
1972 /* If all else fails, see if we have a specific intrinsic. */
1973 if (sym->ts.type == BT_UNKNOWN && sym->attr.intrinsic)
1975 gfc_intrinsic_sym *isym;
1977 isym = gfc_find_function (sym->name);
1978 if (isym == NULL || !isym->specific)
1980 gfc_error ("Unable to find a specific INTRINSIC procedure "
1981 "for the reference %qs at %L", sym->name,
1982 &e->where);
1983 goto cleanup;
1985 sym->ts = isym->ts;
1986 sym->attr.intrinsic = 1;
1987 sym->attr.function = 1;
1990 if (!gfc_resolve_expr (e))
1991 goto cleanup;
1992 goto argument_list;
1995 /* See if the name is a module procedure in a parent unit. */
1997 if (was_declared (sym) || sym->ns->parent == NULL)
1998 goto got_variable;
2000 if (gfc_find_sym_tree (sym->name, sym->ns->parent, 1, &parent_st))
2002 gfc_error ("Symbol %qs at %L is ambiguous", sym->name, &e->where);
2003 goto cleanup;
2006 if (parent_st == NULL)
2007 goto got_variable;
2009 sym = parent_st->n.sym;
2010 e->symtree = parent_st; /* Point to the right thing. */
2012 if (sym->attr.flavor == FL_PROCEDURE
2013 || sym->attr.intrinsic
2014 || sym->attr.external)
2016 if (!gfc_resolve_expr (e))
2017 goto cleanup;
2018 goto argument_list;
2021 got_variable:
2022 e->expr_type = EXPR_VARIABLE;
2023 e->ts = sym->ts;
2024 if ((sym->as != NULL && sym->ts.type != BT_CLASS)
2025 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
2026 && CLASS_DATA (sym)->as))
2028 e->rank = sym->ts.type == BT_CLASS
2029 ? CLASS_DATA (sym)->as->rank : sym->as->rank;
2030 e->ref = gfc_get_ref ();
2031 e->ref->type = REF_ARRAY;
2032 e->ref->u.ar.type = AR_FULL;
2033 e->ref->u.ar.as = sym->ts.type == BT_CLASS
2034 ? CLASS_DATA (sym)->as : sym->as;
2037 /* Expressions are assigned a default ts.type of BT_PROCEDURE in
2038 primary.c (match_actual_arg). If above code determines that it
2039 is a variable instead, it needs to be resolved as it was not
2040 done at the beginning of this function. */
2041 save_need_full_assumed_size = need_full_assumed_size;
2042 if (e->expr_type != EXPR_VARIABLE)
2043 need_full_assumed_size = 0;
2044 if (!gfc_resolve_expr (e))
2045 goto cleanup;
2046 need_full_assumed_size = save_need_full_assumed_size;
2048 argument_list:
2049 /* Check argument list functions %VAL, %LOC and %REF. There is
2050 nothing to do for %REF. */
2051 if (arg->name && arg->name[0] == '%')
2053 if (strncmp ("%VAL", arg->name, 4) == 0)
2055 if (e->ts.type == BT_CHARACTER || e->ts.type == BT_DERIVED)
2057 gfc_error ("By-value argument at %L is not of numeric "
2058 "type", &e->where);
2059 goto cleanup;
2062 if (e->rank)
2064 gfc_error ("By-value argument at %L cannot be an array or "
2065 "an array section", &e->where);
2066 goto cleanup;
2069 /* Intrinsics are still PROC_UNKNOWN here. However,
2070 since same file external procedures are not resolvable
2071 in gfortran, it is a good deal easier to leave them to
2072 intrinsic.c. */
2073 if (ptype != PROC_UNKNOWN
2074 && ptype != PROC_DUMMY
2075 && ptype != PROC_EXTERNAL
2076 && ptype != PROC_MODULE)
2078 gfc_error ("By-value argument at %L is not allowed "
2079 "in this context", &e->where);
2080 goto cleanup;
2084 /* Statement functions have already been excluded above. */
2085 else if (strncmp ("%LOC", arg->name, 4) == 0
2086 && e->ts.type == BT_PROCEDURE)
2088 if (e->symtree->n.sym->attr.proc == PROC_INTERNAL)
2090 gfc_error ("Passing internal procedure at %L by location "
2091 "not allowed", &e->where);
2092 goto cleanup;
2097 comp = gfc_get_proc_ptr_comp(e);
2098 if (e->expr_type == EXPR_VARIABLE
2099 && comp && comp->attr.elemental)
2101 gfc_error ("ELEMENTAL procedure pointer component %qs is not "
2102 "allowed as an actual argument at %L", comp->name,
2103 &e->where);
2106 /* Fortran 2008, C1237. */
2107 if (e->expr_type == EXPR_VARIABLE && gfc_is_coindexed (e)
2108 && gfc_has_ultimate_pointer (e))
2110 gfc_error ("Coindexed actual argument at %L with ultimate pointer "
2111 "component", &e->where);
2112 goto cleanup;
2115 first_actual_arg = false;
2118 return_value = true;
2120 cleanup:
2121 actual_arg = actual_arg_sav;
2122 first_actual_arg = first_actual_arg_sav;
2124 return return_value;
2128 /* Do the checks of the actual argument list that are specific to elemental
2129 procedures. If called with c == NULL, we have a function, otherwise if
2130 expr == NULL, we have a subroutine. */
2132 static bool
2133 resolve_elemental_actual (gfc_expr *expr, gfc_code *c)
2135 gfc_actual_arglist *arg0;
2136 gfc_actual_arglist *arg;
2137 gfc_symbol *esym = NULL;
2138 gfc_intrinsic_sym *isym = NULL;
2139 gfc_expr *e = NULL;
2140 gfc_intrinsic_arg *iformal = NULL;
2141 gfc_formal_arglist *eformal = NULL;
2142 bool formal_optional = false;
2143 bool set_by_optional = false;
2144 int i;
2145 int rank = 0;
2147 /* Is this an elemental procedure? */
2148 if (expr && expr->value.function.actual != NULL)
2150 if (expr->value.function.esym != NULL
2151 && expr->value.function.esym->attr.elemental)
2153 arg0 = expr->value.function.actual;
2154 esym = expr->value.function.esym;
2156 else if (expr->value.function.isym != NULL
2157 && expr->value.function.isym->elemental)
2159 arg0 = expr->value.function.actual;
2160 isym = expr->value.function.isym;
2162 else
2163 return true;
2165 else if (c && c->ext.actual != NULL)
2167 arg0 = c->ext.actual;
2169 if (c->resolved_sym)
2170 esym = c->resolved_sym;
2171 else
2172 esym = c->symtree->n.sym;
2173 gcc_assert (esym);
2175 if (!esym->attr.elemental)
2176 return true;
2178 else
2179 return true;
2181 /* The rank of an elemental is the rank of its array argument(s). */
2182 for (arg = arg0; arg; arg = arg->next)
2184 if (arg->expr != NULL && arg->expr->rank != 0)
2186 rank = arg->expr->rank;
2187 if (arg->expr->expr_type == EXPR_VARIABLE
2188 && arg->expr->symtree->n.sym->attr.optional)
2189 set_by_optional = true;
2191 /* Function specific; set the result rank and shape. */
2192 if (expr)
2194 expr->rank = rank;
2195 if (!expr->shape && arg->expr->shape)
2197 expr->shape = gfc_get_shape (rank);
2198 for (i = 0; i < rank; i++)
2199 mpz_init_set (expr->shape[i], arg->expr->shape[i]);
2202 break;
2206 /* If it is an array, it shall not be supplied as an actual argument
2207 to an elemental procedure unless an array of the same rank is supplied
2208 as an actual argument corresponding to a nonoptional dummy argument of
2209 that elemental procedure(12.4.1.5). */
2210 formal_optional = false;
2211 if (isym)
2212 iformal = isym->formal;
2213 else
2214 eformal = esym->formal;
2216 for (arg = arg0; arg; arg = arg->next)
2218 if (eformal)
2220 if (eformal->sym && eformal->sym->attr.optional)
2221 formal_optional = true;
2222 eformal = eformal->next;
2224 else if (isym && iformal)
2226 if (iformal->optional)
2227 formal_optional = true;
2228 iformal = iformal->next;
2230 else if (isym)
2231 formal_optional = true;
2233 if (pedantic && arg->expr != NULL
2234 && arg->expr->expr_type == EXPR_VARIABLE
2235 && arg->expr->symtree->n.sym->attr.optional
2236 && formal_optional
2237 && arg->expr->rank
2238 && (set_by_optional || arg->expr->rank != rank)
2239 && !(isym && isym->id == GFC_ISYM_CONVERSION))
2241 gfc_warning (OPT_Wpedantic,
2242 "%qs at %L is an array and OPTIONAL; IF IT IS "
2243 "MISSING, it cannot be the actual argument of an "
2244 "ELEMENTAL procedure unless there is a non-optional "
2245 "argument with the same rank (12.4.1.5)",
2246 arg->expr->symtree->n.sym->name, &arg->expr->where);
2250 for (arg = arg0; arg; arg = arg->next)
2252 if (arg->expr == NULL || arg->expr->rank == 0)
2253 continue;
2255 /* Being elemental, the last upper bound of an assumed size array
2256 argument must be present. */
2257 if (resolve_assumed_size_actual (arg->expr))
2258 return false;
2260 /* Elemental procedure's array actual arguments must conform. */
2261 if (e != NULL)
2263 if (!gfc_check_conformance (arg->expr, e, "elemental procedure"))
2264 return false;
2266 else
2267 e = arg->expr;
2270 /* INTENT(OUT) is only allowed for subroutines; if any actual argument
2271 is an array, the intent inout/out variable needs to be also an array. */
2272 if (rank > 0 && esym && expr == NULL)
2273 for (eformal = esym->formal, arg = arg0; arg && eformal;
2274 arg = arg->next, eformal = eformal->next)
2275 if ((eformal->sym->attr.intent == INTENT_OUT
2276 || eformal->sym->attr.intent == INTENT_INOUT)
2277 && arg->expr && arg->expr->rank == 0)
2279 gfc_error ("Actual argument at %L for INTENT(%s) dummy %qs of "
2280 "ELEMENTAL subroutine %qs is a scalar, but another "
2281 "actual argument is an array", &arg->expr->where,
2282 (eformal->sym->attr.intent == INTENT_OUT) ? "OUT"
2283 : "INOUT", eformal->sym->name, esym->name);
2284 return false;
2286 return true;
2290 /* This function does the checking of references to global procedures
2291 as defined in sections 18.1 and 14.1, respectively, of the Fortran
2292 77 and 95 standards. It checks for a gsymbol for the name, making
2293 one if it does not already exist. If it already exists, then the
2294 reference being resolved must correspond to the type of gsymbol.
2295 Otherwise, the new symbol is equipped with the attributes of the
2296 reference. The corresponding code that is called in creating
2297 global entities is parse.c.
2299 In addition, for all but -std=legacy, the gsymbols are used to
2300 check the interfaces of external procedures from the same file.
2301 The namespace of the gsymbol is resolved and then, once this is
2302 done the interface is checked. */
2305 static bool
2306 not_in_recursive (gfc_symbol *sym, gfc_namespace *gsym_ns)
2308 if (!gsym_ns->proc_name->attr.recursive)
2309 return true;
2311 if (sym->ns == gsym_ns)
2312 return false;
2314 if (sym->ns->parent && sym->ns->parent == gsym_ns)
2315 return false;
2317 return true;
2320 static bool
2321 not_entry_self_reference (gfc_symbol *sym, gfc_namespace *gsym_ns)
2323 if (gsym_ns->entries)
2325 gfc_entry_list *entry = gsym_ns->entries;
2327 for (; entry; entry = entry->next)
2329 if (strcmp (sym->name, entry->sym->name) == 0)
2331 if (strcmp (gsym_ns->proc_name->name,
2332 sym->ns->proc_name->name) == 0)
2333 return false;
2335 if (sym->ns->parent
2336 && strcmp (gsym_ns->proc_name->name,
2337 sym->ns->parent->proc_name->name) == 0)
2338 return false;
2342 return true;
2346 /* Check for the requirement of an explicit interface. F08:12.4.2.2. */
2348 bool
2349 gfc_explicit_interface_required (gfc_symbol *sym, char *errmsg, int err_len)
2351 gfc_formal_arglist *arg = gfc_sym_get_dummy_args (sym);
2353 for ( ; arg; arg = arg->next)
2355 if (!arg->sym)
2356 continue;
2358 if (arg->sym->attr.allocatable) /* (2a) */
2360 strncpy (errmsg, _("allocatable argument"), err_len);
2361 return true;
2363 else if (arg->sym->attr.asynchronous)
2365 strncpy (errmsg, _("asynchronous argument"), err_len);
2366 return true;
2368 else if (arg->sym->attr.optional)
2370 strncpy (errmsg, _("optional argument"), err_len);
2371 return true;
2373 else if (arg->sym->attr.pointer)
2375 strncpy (errmsg, _("pointer argument"), err_len);
2376 return true;
2378 else if (arg->sym->attr.target)
2380 strncpy (errmsg, _("target argument"), err_len);
2381 return true;
2383 else if (arg->sym->attr.value)
2385 strncpy (errmsg, _("value argument"), err_len);
2386 return true;
2388 else if (arg->sym->attr.volatile_)
2390 strncpy (errmsg, _("volatile argument"), err_len);
2391 return true;
2393 else if (arg->sym->as && arg->sym->as->type == AS_ASSUMED_SHAPE) /* (2b) */
2395 strncpy (errmsg, _("assumed-shape argument"), err_len);
2396 return true;
2398 else if (arg->sym->as && arg->sym->as->type == AS_ASSUMED_RANK) /* TS 29113, 6.2. */
2400 strncpy (errmsg, _("assumed-rank argument"), err_len);
2401 return true;
2403 else if (arg->sym->attr.codimension) /* (2c) */
2405 strncpy (errmsg, _("coarray argument"), err_len);
2406 return true;
2408 else if (false) /* (2d) TODO: parametrized derived type */
2410 strncpy (errmsg, _("parametrized derived type argument"), err_len);
2411 return true;
2413 else if (arg->sym->ts.type == BT_CLASS) /* (2e) */
2415 strncpy (errmsg, _("polymorphic argument"), err_len);
2416 return true;
2418 else if (arg->sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
2420 strncpy (errmsg, _("NO_ARG_CHECK attribute"), err_len);
2421 return true;
2423 else if (arg->sym->ts.type == BT_ASSUMED)
2425 /* As assumed-type is unlimited polymorphic (cf. above).
2426 See also TS 29113, Note 6.1. */
2427 strncpy (errmsg, _("assumed-type argument"), err_len);
2428 return true;
2432 if (sym->attr.function)
2434 gfc_symbol *res = sym->result ? sym->result : sym;
2436 if (res->attr.dimension) /* (3a) */
2438 strncpy (errmsg, _("array result"), err_len);
2439 return true;
2441 else if (res->attr.pointer || res->attr.allocatable) /* (3b) */
2443 strncpy (errmsg, _("pointer or allocatable result"), err_len);
2444 return true;
2446 else if (res->ts.type == BT_CHARACTER && res->ts.u.cl
2447 && res->ts.u.cl->length
2448 && res->ts.u.cl->length->expr_type != EXPR_CONSTANT) /* (3c) */
2450 strncpy (errmsg, _("result with non-constant character length"), err_len);
2451 return true;
2455 if (sym->attr.elemental && !sym->attr.intrinsic) /* (4) */
2457 strncpy (errmsg, _("elemental procedure"), err_len);
2458 return true;
2460 else if (sym->attr.is_bind_c) /* (5) */
2462 strncpy (errmsg, _("bind(c) procedure"), err_len);
2463 return true;
2466 return false;
2470 static void
2471 resolve_global_procedure (gfc_symbol *sym, locus *where,
2472 gfc_actual_arglist **actual, int sub)
2474 gfc_gsymbol * gsym;
2475 gfc_namespace *ns;
2476 enum gfc_symbol_type type;
2477 char reason[200];
2479 type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
2481 gsym = gfc_get_gsymbol (sym->binding_label ? sym->binding_label : sym->name);
2483 if ((gsym->type != GSYM_UNKNOWN && gsym->type != type))
2484 gfc_global_used (gsym, where);
2486 if ((sym->attr.if_source == IFSRC_UNKNOWN
2487 || sym->attr.if_source == IFSRC_IFBODY)
2488 && gsym->type != GSYM_UNKNOWN
2489 && !gsym->binding_label
2490 && gsym->ns
2491 && gsym->ns->resolved != -1
2492 && gsym->ns->proc_name
2493 && not_in_recursive (sym, gsym->ns)
2494 && not_entry_self_reference (sym, gsym->ns))
2496 gfc_symbol *def_sym;
2498 /* Resolve the gsymbol namespace if needed. */
2499 if (!gsym->ns->resolved)
2501 gfc_dt_list *old_dt_list;
2503 /* Stash away derived types so that the backend_decls do not
2504 get mixed up. */
2505 old_dt_list = gfc_derived_types;
2506 gfc_derived_types = NULL;
2508 gfc_resolve (gsym->ns);
2510 /* Store the new derived types with the global namespace. */
2511 if (gfc_derived_types)
2512 gsym->ns->derived_types = gfc_derived_types;
2514 /* Restore the derived types of this namespace. */
2515 gfc_derived_types = old_dt_list;
2518 /* Make sure that translation for the gsymbol occurs before
2519 the procedure currently being resolved. */
2520 ns = gfc_global_ns_list;
2521 for (; ns && ns != gsym->ns; ns = ns->sibling)
2523 if (ns->sibling == gsym->ns)
2525 ns->sibling = gsym->ns->sibling;
2526 gsym->ns->sibling = gfc_global_ns_list;
2527 gfc_global_ns_list = gsym->ns;
2528 break;
2532 def_sym = gsym->ns->proc_name;
2534 /* This can happen if a binding name has been specified. */
2535 if (gsym->binding_label && gsym->sym_name != def_sym->name)
2536 gfc_find_symbol (gsym->sym_name, gsym->ns, 0, &def_sym);
2538 if (def_sym->attr.entry_master)
2540 gfc_entry_list *entry;
2541 for (entry = gsym->ns->entries; entry; entry = entry->next)
2542 if (strcmp (entry->sym->name, sym->name) == 0)
2544 def_sym = entry->sym;
2545 break;
2549 if (sym->attr.function && !gfc_compare_types (&sym->ts, &def_sym->ts))
2551 gfc_error ("Return type mismatch of function %qs at %L (%s/%s)",
2552 sym->name, &sym->declared_at, gfc_typename (&sym->ts),
2553 gfc_typename (&def_sym->ts));
2554 goto done;
2557 if (sym->attr.if_source == IFSRC_UNKNOWN
2558 && gfc_explicit_interface_required (def_sym, reason, sizeof(reason)))
2560 gfc_error ("Explicit interface required for %qs at %L: %s",
2561 sym->name, &sym->declared_at, reason);
2562 goto done;
2565 if (!pedantic && (gfc_option.allow_std & GFC_STD_GNU))
2566 /* Turn erros into warnings with -std=gnu and -std=legacy. */
2567 gfc_errors_to_warnings (true);
2569 if (!gfc_compare_interfaces (sym, def_sym, sym->name, 0, 1,
2570 reason, sizeof(reason), NULL, NULL))
2572 gfc_error_opt (OPT_Wargument_mismatch,
2573 "Interface mismatch in global procedure %qs at %L:"
2574 " %s", sym->name, &sym->declared_at, reason);
2575 goto done;
2578 if (!pedantic
2579 || ((gfc_option.warn_std & GFC_STD_LEGACY)
2580 && !(gfc_option.warn_std & GFC_STD_GNU)))
2581 gfc_errors_to_warnings (true);
2583 if (sym->attr.if_source != IFSRC_IFBODY)
2584 gfc_procedure_use (def_sym, actual, where);
2587 done:
2588 gfc_errors_to_warnings (false);
2590 if (gsym->type == GSYM_UNKNOWN)
2592 gsym->type = type;
2593 gsym->where = *where;
2596 gsym->used = 1;
2600 /************* Function resolution *************/
2602 /* Resolve a function call known to be generic.
2603 Section 14.1.2.4.1. */
2605 static match
2606 resolve_generic_f0 (gfc_expr *expr, gfc_symbol *sym)
2608 gfc_symbol *s;
2610 if (sym->attr.generic)
2612 s = gfc_search_interface (sym->generic, 0, &expr->value.function.actual);
2613 if (s != NULL)
2615 expr->value.function.name = s->name;
2616 expr->value.function.esym = s;
2618 if (s->ts.type != BT_UNKNOWN)
2619 expr->ts = s->ts;
2620 else if (s->result != NULL && s->result->ts.type != BT_UNKNOWN)
2621 expr->ts = s->result->ts;
2623 if (s->as != NULL)
2624 expr->rank = s->as->rank;
2625 else if (s->result != NULL && s->result->as != NULL)
2626 expr->rank = s->result->as->rank;
2628 gfc_set_sym_referenced (expr->value.function.esym);
2630 return MATCH_YES;
2633 /* TODO: Need to search for elemental references in generic
2634 interface. */
2637 if (sym->attr.intrinsic)
2638 return gfc_intrinsic_func_interface (expr, 0);
2640 return MATCH_NO;
2644 static bool
2645 resolve_generic_f (gfc_expr *expr)
2647 gfc_symbol *sym;
2648 match m;
2649 gfc_interface *intr = NULL;
2651 sym = expr->symtree->n.sym;
2653 for (;;)
2655 m = resolve_generic_f0 (expr, sym);
2656 if (m == MATCH_YES)
2657 return true;
2658 else if (m == MATCH_ERROR)
2659 return false;
2661 generic:
2662 if (!intr)
2663 for (intr = sym->generic; intr; intr = intr->next)
2664 if (gfc_fl_struct (intr->sym->attr.flavor))
2665 break;
2667 if (sym->ns->parent == NULL)
2668 break;
2669 gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
2671 if (sym == NULL)
2672 break;
2673 if (!generic_sym (sym))
2674 goto generic;
2677 /* Last ditch attempt. See if the reference is to an intrinsic
2678 that possesses a matching interface. 14.1.2.4 */
2679 if (sym && !intr && !gfc_is_intrinsic (sym, 0, expr->where))
2681 if (gfc_init_expr_flag)
2682 gfc_error ("Function %qs in initialization expression at %L "
2683 "must be an intrinsic function",
2684 expr->symtree->n.sym->name, &expr->where);
2685 else
2686 gfc_error ("There is no specific function for the generic %qs "
2687 "at %L", expr->symtree->n.sym->name, &expr->where);
2688 return false;
2691 if (intr)
2693 if (!gfc_convert_to_structure_constructor (expr, intr->sym, NULL,
2694 NULL, false))
2695 return false;
2696 return resolve_structure_cons (expr, 0);
2699 m = gfc_intrinsic_func_interface (expr, 0);
2700 if (m == MATCH_YES)
2701 return true;
2703 if (m == MATCH_NO)
2704 gfc_error ("Generic function %qs at %L is not consistent with a "
2705 "specific intrinsic interface", expr->symtree->n.sym->name,
2706 &expr->where);
2708 return false;
2712 /* Resolve a function call known to be specific. */
2714 static match
2715 resolve_specific_f0 (gfc_symbol *sym, gfc_expr *expr)
2717 match m;
2719 if (sym->attr.external || sym->attr.if_source == IFSRC_IFBODY)
2721 if (sym->attr.dummy)
2723 sym->attr.proc = PROC_DUMMY;
2724 goto found;
2727 sym->attr.proc = PROC_EXTERNAL;
2728 goto found;
2731 if (sym->attr.proc == PROC_MODULE
2732 || sym->attr.proc == PROC_ST_FUNCTION
2733 || sym->attr.proc == PROC_INTERNAL)
2734 goto found;
2736 if (sym->attr.intrinsic)
2738 m = gfc_intrinsic_func_interface (expr, 1);
2739 if (m == MATCH_YES)
2740 return MATCH_YES;
2741 if (m == MATCH_NO)
2742 gfc_error ("Function %qs at %L is INTRINSIC but is not compatible "
2743 "with an intrinsic", sym->name, &expr->where);
2745 return MATCH_ERROR;
2748 return MATCH_NO;
2750 found:
2751 gfc_procedure_use (sym, &expr->value.function.actual, &expr->where);
2753 if (sym->result)
2754 expr->ts = sym->result->ts;
2755 else
2756 expr->ts = sym->ts;
2757 expr->value.function.name = sym->name;
2758 expr->value.function.esym = sym;
2759 /* Prevent crash when sym->ts.u.derived->components is not set due to previous
2760 error(s). */
2761 if (sym->ts.type == BT_CLASS && !CLASS_DATA (sym))
2762 return MATCH_ERROR;
2763 if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as)
2764 expr->rank = CLASS_DATA (sym)->as->rank;
2765 else if (sym->as != NULL)
2766 expr->rank = sym->as->rank;
2768 return MATCH_YES;
2772 static bool
2773 resolve_specific_f (gfc_expr *expr)
2775 gfc_symbol *sym;
2776 match m;
2778 sym = expr->symtree->n.sym;
2780 for (;;)
2782 m = resolve_specific_f0 (sym, expr);
2783 if (m == MATCH_YES)
2784 return true;
2785 if (m == MATCH_ERROR)
2786 return false;
2788 if (sym->ns->parent == NULL)
2789 break;
2791 gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
2793 if (sym == NULL)
2794 break;
2797 gfc_error ("Unable to resolve the specific function %qs at %L",
2798 expr->symtree->n.sym->name, &expr->where);
2800 return true;
2804 /* Resolve a procedure call not known to be generic nor specific. */
2806 static bool
2807 resolve_unknown_f (gfc_expr *expr)
2809 gfc_symbol *sym;
2810 gfc_typespec *ts;
2812 sym = expr->symtree->n.sym;
2814 if (sym->attr.dummy)
2816 sym->attr.proc = PROC_DUMMY;
2817 expr->value.function.name = sym->name;
2818 goto set_type;
2821 /* See if we have an intrinsic function reference. */
2823 if (gfc_is_intrinsic (sym, 0, expr->where))
2825 if (gfc_intrinsic_func_interface (expr, 1) == MATCH_YES)
2826 return true;
2827 return false;
2830 /* The reference is to an external name. */
2832 sym->attr.proc = PROC_EXTERNAL;
2833 expr->value.function.name = sym->name;
2834 expr->value.function.esym = expr->symtree->n.sym;
2836 if (sym->as != NULL)
2837 expr->rank = sym->as->rank;
2839 /* Type of the expression is either the type of the symbol or the
2840 default type of the symbol. */
2842 set_type:
2843 gfc_procedure_use (sym, &expr->value.function.actual, &expr->where);
2845 if (sym->ts.type != BT_UNKNOWN)
2846 expr->ts = sym->ts;
2847 else
2849 ts = gfc_get_default_type (sym->name, sym->ns);
2851 if (ts->type == BT_UNKNOWN)
2853 gfc_error ("Function %qs at %L has no IMPLICIT type",
2854 sym->name, &expr->where);
2855 return false;
2857 else
2858 expr->ts = *ts;
2861 return true;
2865 /* Return true, if the symbol is an external procedure. */
2866 static bool
2867 is_external_proc (gfc_symbol *sym)
2869 if (!sym->attr.dummy && !sym->attr.contained
2870 && !gfc_is_intrinsic (sym, sym->attr.subroutine, sym->declared_at)
2871 && sym->attr.proc != PROC_ST_FUNCTION
2872 && !sym->attr.proc_pointer
2873 && !sym->attr.use_assoc
2874 && sym->name)
2875 return true;
2877 return false;
2881 /* Figure out if a function reference is pure or not. Also set the name
2882 of the function for a potential error message. Return nonzero if the
2883 function is PURE, zero if not. */
2884 static int
2885 pure_stmt_function (gfc_expr *, gfc_symbol *);
2887 static int
2888 pure_function (gfc_expr *e, const char **name)
2890 int pure;
2891 gfc_component *comp;
2893 *name = NULL;
2895 if (e->symtree != NULL
2896 && e->symtree->n.sym != NULL
2897 && e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
2898 return pure_stmt_function (e, e->symtree->n.sym);
2900 comp = gfc_get_proc_ptr_comp (e);
2901 if (comp)
2903 pure = gfc_pure (comp->ts.interface);
2904 *name = comp->name;
2906 else if (e->value.function.esym)
2908 pure = gfc_pure (e->value.function.esym);
2909 *name = e->value.function.esym->name;
2911 else if (e->value.function.isym)
2913 pure = e->value.function.isym->pure
2914 || e->value.function.isym->elemental;
2915 *name = e->value.function.isym->name;
2917 else
2919 /* Implicit functions are not pure. */
2920 pure = 0;
2921 *name = e->value.function.name;
2924 return pure;
2928 static bool
2929 impure_stmt_fcn (gfc_expr *e, gfc_symbol *sym,
2930 int *f ATTRIBUTE_UNUSED)
2932 const char *name;
2934 /* Don't bother recursing into other statement functions
2935 since they will be checked individually for purity. */
2936 if (e->expr_type != EXPR_FUNCTION
2937 || !e->symtree
2938 || e->symtree->n.sym == sym
2939 || e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
2940 return false;
2942 return pure_function (e, &name) ? false : true;
2946 static int
2947 pure_stmt_function (gfc_expr *e, gfc_symbol *sym)
2949 return gfc_traverse_expr (e, sym, impure_stmt_fcn, 0) ? 0 : 1;
2953 /* Check if an impure function is allowed in the current context. */
2955 static bool check_pure_function (gfc_expr *e)
2957 const char *name = NULL;
2958 if (!pure_function (e, &name) && name)
2960 if (forall_flag)
2962 gfc_error ("Reference to impure function %qs at %L inside a "
2963 "FORALL %s", name, &e->where,
2964 forall_flag == 2 ? "mask" : "block");
2965 return false;
2967 else if (gfc_do_concurrent_flag)
2969 gfc_error ("Reference to impure function %qs at %L inside a "
2970 "DO CONCURRENT %s", name, &e->where,
2971 gfc_do_concurrent_flag == 2 ? "mask" : "block");
2972 return false;
2974 else if (gfc_pure (NULL))
2976 gfc_error ("Reference to impure function %qs at %L "
2977 "within a PURE procedure", name, &e->where);
2978 return false;
2980 gfc_unset_implicit_pure (NULL);
2982 return true;
2986 /* Update current procedure's array_outer_dependency flag, considering
2987 a call to procedure SYM. */
2989 static void
2990 update_current_proc_array_outer_dependency (gfc_symbol *sym)
2992 /* Check to see if this is a sibling function that has not yet
2993 been resolved. */
2994 gfc_namespace *sibling = gfc_current_ns->sibling;
2995 for (; sibling; sibling = sibling->sibling)
2997 if (sibling->proc_name == sym)
2999 gfc_resolve (sibling);
3000 break;
3004 /* If SYM has references to outer arrays, so has the procedure calling
3005 SYM. If SYM is a procedure pointer, we can assume the worst. */
3006 if (sym->attr.array_outer_dependency
3007 || sym->attr.proc_pointer)
3008 gfc_current_ns->proc_name->attr.array_outer_dependency = 1;
3012 /* Resolve a function call, which means resolving the arguments, then figuring
3013 out which entity the name refers to. */
3015 static bool
3016 resolve_function (gfc_expr *expr)
3018 gfc_actual_arglist *arg;
3019 gfc_symbol *sym;
3020 bool t;
3021 int temp;
3022 procedure_type p = PROC_INTRINSIC;
3023 bool no_formal_args;
3025 sym = NULL;
3026 if (expr->symtree)
3027 sym = expr->symtree->n.sym;
3029 /* If this is a procedure pointer component, it has already been resolved. */
3030 if (gfc_is_proc_ptr_comp (expr))
3031 return true;
3033 /* Avoid re-resolving the arguments of caf_get, which can lead to inserting
3034 another caf_get. */
3035 if (sym && sym->attr.intrinsic
3036 && (sym->intmod_sym_id == GFC_ISYM_CAF_GET
3037 || sym->intmod_sym_id == GFC_ISYM_CAF_SEND))
3038 return true;
3040 if (sym && sym->attr.intrinsic
3041 && !gfc_resolve_intrinsic (sym, &expr->where))
3042 return false;
3044 if (sym && (sym->attr.flavor == FL_VARIABLE || sym->attr.subroutine))
3046 gfc_error ("%qs at %L is not a function", sym->name, &expr->where);
3047 return false;
3050 /* If this ia a deferred TBP with an abstract interface (which may
3051 of course be referenced), expr->value.function.esym will be set. */
3052 if (sym && sym->attr.abstract && !expr->value.function.esym)
3054 gfc_error ("ABSTRACT INTERFACE %qs must not be referenced at %L",
3055 sym->name, &expr->where);
3056 return false;
3059 /* Switch off assumed size checking and do this again for certain kinds
3060 of procedure, once the procedure itself is resolved. */
3061 need_full_assumed_size++;
3063 if (expr->symtree && expr->symtree->n.sym)
3064 p = expr->symtree->n.sym->attr.proc;
3066 if (expr->value.function.isym && expr->value.function.isym->inquiry)
3067 inquiry_argument = true;
3068 no_formal_args = sym && is_external_proc (sym)
3069 && gfc_sym_get_dummy_args (sym) == NULL;
3071 if (!resolve_actual_arglist (expr->value.function.actual,
3072 p, no_formal_args))
3074 inquiry_argument = false;
3075 return false;
3078 inquiry_argument = false;
3080 /* Resume assumed_size checking. */
3081 need_full_assumed_size--;
3083 /* If the procedure is external, check for usage. */
3084 if (sym && is_external_proc (sym))
3085 resolve_global_procedure (sym, &expr->where,
3086 &expr->value.function.actual, 0);
3088 if (sym && sym->ts.type == BT_CHARACTER
3089 && sym->ts.u.cl
3090 && sym->ts.u.cl->length == NULL
3091 && !sym->attr.dummy
3092 && !sym->ts.deferred
3093 && expr->value.function.esym == NULL
3094 && !sym->attr.contained)
3096 /* Internal procedures are taken care of in resolve_contained_fntype. */
3097 gfc_error ("Function %qs is declared CHARACTER(*) and cannot "
3098 "be used at %L since it is not a dummy argument",
3099 sym->name, &expr->where);
3100 return false;
3103 /* See if function is already resolved. */
3105 if (expr->value.function.name != NULL
3106 || expr->value.function.isym != NULL)
3108 if (expr->ts.type == BT_UNKNOWN)
3109 expr->ts = sym->ts;
3110 t = true;
3112 else
3114 /* Apply the rules of section 14.1.2. */
3116 switch (procedure_kind (sym))
3118 case PTYPE_GENERIC:
3119 t = resolve_generic_f (expr);
3120 break;
3122 case PTYPE_SPECIFIC:
3123 t = resolve_specific_f (expr);
3124 break;
3126 case PTYPE_UNKNOWN:
3127 t = resolve_unknown_f (expr);
3128 break;
3130 default:
3131 gfc_internal_error ("resolve_function(): bad function type");
3135 /* If the expression is still a function (it might have simplified),
3136 then we check to see if we are calling an elemental function. */
3138 if (expr->expr_type != EXPR_FUNCTION)
3139 return t;
3141 temp = need_full_assumed_size;
3142 need_full_assumed_size = 0;
3144 if (!resolve_elemental_actual (expr, NULL))
3145 return false;
3147 if (omp_workshare_flag
3148 && expr->value.function.esym
3149 && ! gfc_elemental (expr->value.function.esym))
3151 gfc_error ("User defined non-ELEMENTAL function %qs at %L not allowed "
3152 "in WORKSHARE construct", expr->value.function.esym->name,
3153 &expr->where);
3154 t = false;
3157 #define GENERIC_ID expr->value.function.isym->id
3158 else if (expr->value.function.actual != NULL
3159 && expr->value.function.isym != NULL
3160 && GENERIC_ID != GFC_ISYM_LBOUND
3161 && GENERIC_ID != GFC_ISYM_LCOBOUND
3162 && GENERIC_ID != GFC_ISYM_UCOBOUND
3163 && GENERIC_ID != GFC_ISYM_LEN
3164 && GENERIC_ID != GFC_ISYM_LOC
3165 && GENERIC_ID != GFC_ISYM_C_LOC
3166 && GENERIC_ID != GFC_ISYM_PRESENT)
3168 /* Array intrinsics must also have the last upper bound of an
3169 assumed size array argument. UBOUND and SIZE have to be
3170 excluded from the check if the second argument is anything
3171 than a constant. */
3173 for (arg = expr->value.function.actual; arg; arg = arg->next)
3175 if ((GENERIC_ID == GFC_ISYM_UBOUND || GENERIC_ID == GFC_ISYM_SIZE)
3176 && arg == expr->value.function.actual
3177 && arg->next != NULL && arg->next->expr)
3179 if (arg->next->expr->expr_type != EXPR_CONSTANT)
3180 break;
3182 if (arg->next->name && strncmp (arg->next->name, "kind", 4) == 0)
3183 break;
3185 if ((int)mpz_get_si (arg->next->expr->value.integer)
3186 < arg->expr->rank)
3187 break;
3190 if (arg->expr != NULL
3191 && arg->expr->rank > 0
3192 && resolve_assumed_size_actual (arg->expr))
3193 return false;
3196 #undef GENERIC_ID
3198 need_full_assumed_size = temp;
3200 if (!check_pure_function(expr))
3201 t = false;
3203 /* Functions without the RECURSIVE attribution are not allowed to
3204 * call themselves. */
3205 if (expr->value.function.esym && !expr->value.function.esym->attr.recursive)
3207 gfc_symbol *esym;
3208 esym = expr->value.function.esym;
3210 if (is_illegal_recursion (esym, gfc_current_ns))
3212 if (esym->attr.entry && esym->ns->entries)
3213 gfc_error ("ENTRY %qs at %L cannot be called recursively, as"
3214 " function %qs is not RECURSIVE",
3215 esym->name, &expr->where, esym->ns->entries->sym->name);
3216 else
3217 gfc_error ("Function %qs at %L cannot be called recursively, as it"
3218 " is not RECURSIVE", esym->name, &expr->where);
3220 t = false;
3224 /* Character lengths of use associated functions may contains references to
3225 symbols not referenced from the current program unit otherwise. Make sure
3226 those symbols are marked as referenced. */
3228 if (expr->ts.type == BT_CHARACTER && expr->value.function.esym
3229 && expr->value.function.esym->attr.use_assoc)
3231 gfc_expr_set_symbols_referenced (expr->ts.u.cl->length);
3234 /* Make sure that the expression has a typespec that works. */
3235 if (expr->ts.type == BT_UNKNOWN)
3237 if (expr->symtree->n.sym->result
3238 && expr->symtree->n.sym->result->ts.type != BT_UNKNOWN
3239 && !expr->symtree->n.sym->result->attr.proc_pointer)
3240 expr->ts = expr->symtree->n.sym->result->ts;
3243 if (!expr->ref && !expr->value.function.isym)
3245 if (expr->value.function.esym)
3246 update_current_proc_array_outer_dependency (expr->value.function.esym);
3247 else
3248 update_current_proc_array_outer_dependency (sym);
3250 else if (expr->ref)
3251 /* typebound procedure: Assume the worst. */
3252 gfc_current_ns->proc_name->attr.array_outer_dependency = 1;
3254 return t;
3258 /************* Subroutine resolution *************/
3260 static bool
3261 pure_subroutine (gfc_symbol *sym, const char *name, locus *loc)
3263 if (gfc_pure (sym))
3264 return true;
3266 if (forall_flag)
3268 gfc_error ("Subroutine call to %qs in FORALL block at %L is not PURE",
3269 name, loc);
3270 return false;
3272 else if (gfc_do_concurrent_flag)
3274 gfc_error ("Subroutine call to %qs in DO CONCURRENT block at %L is not "
3275 "PURE", name, loc);
3276 return false;
3278 else if (gfc_pure (NULL))
3280 gfc_error ("Subroutine call to %qs at %L is not PURE", name, loc);
3281 return false;
3284 gfc_unset_implicit_pure (NULL);
3285 return true;
3289 static match
3290 resolve_generic_s0 (gfc_code *c, gfc_symbol *sym)
3292 gfc_symbol *s;
3294 if (sym->attr.generic)
3296 s = gfc_search_interface (sym->generic, 1, &c->ext.actual);
3297 if (s != NULL)
3299 c->resolved_sym = s;
3300 if (!pure_subroutine (s, s->name, &c->loc))
3301 return MATCH_ERROR;
3302 return MATCH_YES;
3305 /* TODO: Need to search for elemental references in generic interface. */
3308 if (sym->attr.intrinsic)
3309 return gfc_intrinsic_sub_interface (c, 0);
3311 return MATCH_NO;
3315 static bool
3316 resolve_generic_s (gfc_code *c)
3318 gfc_symbol *sym;
3319 match m;
3321 sym = c->symtree->n.sym;
3323 for (;;)
3325 m = resolve_generic_s0 (c, sym);
3326 if (m == MATCH_YES)
3327 return true;
3328 else if (m == MATCH_ERROR)
3329 return false;
3331 generic:
3332 if (sym->ns->parent == NULL)
3333 break;
3334 gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
3336 if (sym == NULL)
3337 break;
3338 if (!generic_sym (sym))
3339 goto generic;
3342 /* Last ditch attempt. See if the reference is to an intrinsic
3343 that possesses a matching interface. 14.1.2.4 */
3344 sym = c->symtree->n.sym;
3346 if (!gfc_is_intrinsic (sym, 1, c->loc))
3348 gfc_error ("There is no specific subroutine for the generic %qs at %L",
3349 sym->name, &c->loc);
3350 return false;
3353 m = gfc_intrinsic_sub_interface (c, 0);
3354 if (m == MATCH_YES)
3355 return true;
3356 if (m == MATCH_NO)
3357 gfc_error ("Generic subroutine %qs at %L is not consistent with an "
3358 "intrinsic subroutine interface", sym->name, &c->loc);
3360 return false;
3364 /* Resolve a subroutine call known to be specific. */
3366 static match
3367 resolve_specific_s0 (gfc_code *c, gfc_symbol *sym)
3369 match m;
3371 if (sym->attr.external || sym->attr.if_source == IFSRC_IFBODY)
3373 if (sym->attr.dummy)
3375 sym->attr.proc = PROC_DUMMY;
3376 goto found;
3379 sym->attr.proc = PROC_EXTERNAL;
3380 goto found;
3383 if (sym->attr.proc == PROC_MODULE || sym->attr.proc == PROC_INTERNAL)
3384 goto found;
3386 if (sym->attr.intrinsic)
3388 m = gfc_intrinsic_sub_interface (c, 1);
3389 if (m == MATCH_YES)
3390 return MATCH_YES;
3391 if (m == MATCH_NO)
3392 gfc_error ("Subroutine %qs at %L is INTRINSIC but is not compatible "
3393 "with an intrinsic", sym->name, &c->loc);
3395 return MATCH_ERROR;
3398 return MATCH_NO;
3400 found:
3401 gfc_procedure_use (sym, &c->ext.actual, &c->loc);
3403 c->resolved_sym = sym;
3404 if (!pure_subroutine (sym, sym->name, &c->loc))
3405 return MATCH_ERROR;
3407 return MATCH_YES;
3411 static bool
3412 resolve_specific_s (gfc_code *c)
3414 gfc_symbol *sym;
3415 match m;
3417 sym = c->symtree->n.sym;
3419 for (;;)
3421 m = resolve_specific_s0 (c, sym);
3422 if (m == MATCH_YES)
3423 return true;
3424 if (m == MATCH_ERROR)
3425 return false;
3427 if (sym->ns->parent == NULL)
3428 break;
3430 gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
3432 if (sym == NULL)
3433 break;
3436 sym = c->symtree->n.sym;
3437 gfc_error ("Unable to resolve the specific subroutine %qs at %L",
3438 sym->name, &c->loc);
3440 return false;
3444 /* Resolve a subroutine call not known to be generic nor specific. */
3446 static bool
3447 resolve_unknown_s (gfc_code *c)
3449 gfc_symbol *sym;
3451 sym = c->symtree->n.sym;
3453 if (sym->attr.dummy)
3455 sym->attr.proc = PROC_DUMMY;
3456 goto found;
3459 /* See if we have an intrinsic function reference. */
3461 if (gfc_is_intrinsic (sym, 1, c->loc))
3463 if (gfc_intrinsic_sub_interface (c, 1) == MATCH_YES)
3464 return true;
3465 return false;
3468 /* The reference is to an external name. */
3470 found:
3471 gfc_procedure_use (sym, &c->ext.actual, &c->loc);
3473 c->resolved_sym = sym;
3475 return pure_subroutine (sym, sym->name, &c->loc);
3479 /* Resolve a subroutine call. Although it was tempting to use the same code
3480 for functions, subroutines and functions are stored differently and this
3481 makes things awkward. */
3483 static bool
3484 resolve_call (gfc_code *c)
3486 bool t;
3487 procedure_type ptype = PROC_INTRINSIC;
3488 gfc_symbol *csym, *sym;
3489 bool no_formal_args;
3491 csym = c->symtree ? c->symtree->n.sym : NULL;
3493 if (csym && csym->ts.type != BT_UNKNOWN)
3495 gfc_error ("%qs at %L has a type, which is not consistent with "
3496 "the CALL at %L", csym->name, &csym->declared_at, &c->loc);
3497 return false;
3500 if (csym && gfc_current_ns->parent && csym->ns != gfc_current_ns)
3502 gfc_symtree *st;
3503 gfc_find_sym_tree (c->symtree->name, gfc_current_ns, 1, &st);
3504 sym = st ? st->n.sym : NULL;
3505 if (sym && csym != sym
3506 && sym->ns == gfc_current_ns
3507 && sym->attr.flavor == FL_PROCEDURE
3508 && sym->attr.contained)
3510 sym->refs++;
3511 if (csym->attr.generic)
3512 c->symtree->n.sym = sym;
3513 else
3514 c->symtree = st;
3515 csym = c->symtree->n.sym;
3519 /* If this ia a deferred TBP, c->expr1 will be set. */
3520 if (!c->expr1 && csym)
3522 if (csym->attr.abstract)
3524 gfc_error ("ABSTRACT INTERFACE %qs must not be referenced at %L",
3525 csym->name, &c->loc);
3526 return false;
3529 /* Subroutines without the RECURSIVE attribution are not allowed to
3530 call themselves. */
3531 if (is_illegal_recursion (csym, gfc_current_ns))
3533 if (csym->attr.entry && csym->ns->entries)
3534 gfc_error ("ENTRY %qs at %L cannot be called recursively, "
3535 "as subroutine %qs is not RECURSIVE",
3536 csym->name, &c->loc, csym->ns->entries->sym->name);
3537 else
3538 gfc_error ("SUBROUTINE %qs at %L cannot be called recursively, "
3539 "as it is not RECURSIVE", csym->name, &c->loc);
3541 t = false;
3545 /* Switch off assumed size checking and do this again for certain kinds
3546 of procedure, once the procedure itself is resolved. */
3547 need_full_assumed_size++;
3549 if (csym)
3550 ptype = csym->attr.proc;
3552 no_formal_args = csym && is_external_proc (csym)
3553 && gfc_sym_get_dummy_args (csym) == NULL;
3554 if (!resolve_actual_arglist (c->ext.actual, ptype, no_formal_args))
3555 return false;
3557 /* Resume assumed_size checking. */
3558 need_full_assumed_size--;
3560 /* If external, check for usage. */
3561 if (csym && is_external_proc (csym))
3562 resolve_global_procedure (csym, &c->loc, &c->ext.actual, 1);
3564 t = true;
3565 if (c->resolved_sym == NULL)
3567 c->resolved_isym = NULL;
3568 switch (procedure_kind (csym))
3570 case PTYPE_GENERIC:
3571 t = resolve_generic_s (c);
3572 break;
3574 case PTYPE_SPECIFIC:
3575 t = resolve_specific_s (c);
3576 break;
3578 case PTYPE_UNKNOWN:
3579 t = resolve_unknown_s (c);
3580 break;
3582 default:
3583 gfc_internal_error ("resolve_subroutine(): bad function type");
3587 /* Some checks of elemental subroutine actual arguments. */
3588 if (!resolve_elemental_actual (NULL, c))
3589 return false;
3591 if (!c->expr1)
3592 update_current_proc_array_outer_dependency (csym);
3593 else
3594 /* Typebound procedure: Assume the worst. */
3595 gfc_current_ns->proc_name->attr.array_outer_dependency = 1;
3597 return t;
3601 /* Compare the shapes of two arrays that have non-NULL shapes. If both
3602 op1->shape and op2->shape are non-NULL return true if their shapes
3603 match. If both op1->shape and op2->shape are non-NULL return false
3604 if their shapes do not match. If either op1->shape or op2->shape is
3605 NULL, return true. */
3607 static bool
3608 compare_shapes (gfc_expr *op1, gfc_expr *op2)
3610 bool t;
3611 int i;
3613 t = true;
3615 if (op1->shape != NULL && op2->shape != NULL)
3617 for (i = 0; i < op1->rank; i++)
3619 if (mpz_cmp (op1->shape[i], op2->shape[i]) != 0)
3621 gfc_error ("Shapes for operands at %L and %L are not conformable",
3622 &op1->where, &op2->where);
3623 t = false;
3624 break;
3629 return t;
3632 /* Convert a logical operator to the corresponding bitwise intrinsic call.
3633 For example A .AND. B becomes IAND(A, B). */
3634 static gfc_expr *
3635 logical_to_bitwise (gfc_expr *e)
3637 gfc_expr *tmp, *op1, *op2;
3638 gfc_isym_id isym;
3639 gfc_actual_arglist *args = NULL;
3641 gcc_assert (e->expr_type == EXPR_OP);
3643 isym = GFC_ISYM_NONE;
3644 op1 = e->value.op.op1;
3645 op2 = e->value.op.op2;
3647 switch (e->value.op.op)
3649 case INTRINSIC_NOT:
3650 isym = GFC_ISYM_NOT;
3651 break;
3652 case INTRINSIC_AND:
3653 isym = GFC_ISYM_IAND;
3654 break;
3655 case INTRINSIC_OR:
3656 isym = GFC_ISYM_IOR;
3657 break;
3658 case INTRINSIC_NEQV:
3659 isym = GFC_ISYM_IEOR;
3660 break;
3661 case INTRINSIC_EQV:
3662 /* "Bitwise eqv" is just the complement of NEQV === IEOR.
3663 Change the old expression to NEQV, which will get replaced by IEOR,
3664 and wrap it in NOT. */
3665 tmp = gfc_copy_expr (e);
3666 tmp->value.op.op = INTRINSIC_NEQV;
3667 tmp = logical_to_bitwise (tmp);
3668 isym = GFC_ISYM_NOT;
3669 op1 = tmp;
3670 op2 = NULL;
3671 break;
3672 default:
3673 gfc_internal_error ("logical_to_bitwise(): Bad intrinsic");
3676 /* Inherit the original operation's operands as arguments. */
3677 args = gfc_get_actual_arglist ();
3678 args->expr = op1;
3679 if (op2)
3681 args->next = gfc_get_actual_arglist ();
3682 args->next->expr = op2;
3685 /* Convert the expression to a function call. */
3686 e->expr_type = EXPR_FUNCTION;
3687 e->value.function.actual = args;
3688 e->value.function.isym = gfc_intrinsic_function_by_id (isym);
3689 e->value.function.name = e->value.function.isym->name;
3690 e->value.function.esym = NULL;
3692 /* Make up a pre-resolved function call symtree if we need to. */
3693 if (!e->symtree || !e->symtree->n.sym)
3695 gfc_symbol *sym;
3696 gfc_get_ha_sym_tree (e->value.function.isym->name, &e->symtree);
3697 sym = e->symtree->n.sym;
3698 sym->result = sym;
3699 sym->attr.flavor = FL_PROCEDURE;
3700 sym->attr.function = 1;
3701 sym->attr.elemental = 1;
3702 sym->attr.pure = 1;
3703 sym->attr.referenced = 1;
3704 gfc_intrinsic_symbol (sym);
3705 gfc_commit_symbol (sym);
3708 args->name = e->value.function.isym->formal->name;
3709 if (e->value.function.isym->formal->next)
3710 args->next->name = e->value.function.isym->formal->next->name;
3712 return e;
3715 /* Resolve an operator expression node. This can involve replacing the
3716 operation with a user defined function call. */
3718 static bool
3719 resolve_operator (gfc_expr *e)
3721 gfc_expr *op1, *op2;
3722 char msg[200];
3723 bool dual_locus_error;
3724 bool t;
3726 /* Resolve all subnodes-- give them types. */
3728 switch (e->value.op.op)
3730 default:
3731 if (!gfc_resolve_expr (e->value.op.op2))
3732 return false;
3734 /* Fall through. */
3736 case INTRINSIC_NOT:
3737 case INTRINSIC_UPLUS:
3738 case INTRINSIC_UMINUS:
3739 case INTRINSIC_PARENTHESES:
3740 if (!gfc_resolve_expr (e->value.op.op1))
3741 return false;
3742 break;
3745 /* Typecheck the new node. */
3747 op1 = e->value.op.op1;
3748 op2 = e->value.op.op2;
3749 dual_locus_error = false;
3751 if ((op1 && op1->expr_type == EXPR_NULL)
3752 || (op2 && op2->expr_type == EXPR_NULL))
3754 sprintf (msg, _("Invalid context for NULL() pointer at %%L"));
3755 goto bad_op;
3758 switch (e->value.op.op)
3760 case INTRINSIC_UPLUS:
3761 case INTRINSIC_UMINUS:
3762 if (op1->ts.type == BT_INTEGER
3763 || op1->ts.type == BT_REAL
3764 || op1->ts.type == BT_COMPLEX)
3766 e->ts = op1->ts;
3767 break;
3770 sprintf (msg, _("Operand of unary numeric operator %%<%s%%> at %%L is %s"),
3771 gfc_op2string (e->value.op.op), gfc_typename (&e->ts));
3772 goto bad_op;
3774 case INTRINSIC_PLUS:
3775 case INTRINSIC_MINUS:
3776 case INTRINSIC_TIMES:
3777 case INTRINSIC_DIVIDE:
3778 case INTRINSIC_POWER:
3779 if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
3781 gfc_type_convert_binary (e, 1);
3782 break;
3785 sprintf (msg,
3786 _("Operands of binary numeric operator %%<%s%%> at %%L are %s/%s"),
3787 gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3788 gfc_typename (&op2->ts));
3789 goto bad_op;
3791 case INTRINSIC_CONCAT:
3792 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
3793 && op1->ts.kind == op2->ts.kind)
3795 e->ts.type = BT_CHARACTER;
3796 e->ts.kind = op1->ts.kind;
3797 break;
3800 sprintf (msg,
3801 _("Operands of string concatenation operator at %%L are %s/%s"),
3802 gfc_typename (&op1->ts), gfc_typename (&op2->ts));
3803 goto bad_op;
3805 case INTRINSIC_AND:
3806 case INTRINSIC_OR:
3807 case INTRINSIC_EQV:
3808 case INTRINSIC_NEQV:
3809 if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
3811 e->ts.type = BT_LOGICAL;
3812 e->ts.kind = gfc_kind_max (op1, op2);
3813 if (op1->ts.kind < e->ts.kind)
3814 gfc_convert_type (op1, &e->ts, 2);
3815 else if (op2->ts.kind < e->ts.kind)
3816 gfc_convert_type (op2, &e->ts, 2);
3817 break;
3820 /* Logical ops on integers become bitwise ops with -fdec. */
3821 else if (flag_dec
3822 && (op1->ts.type == BT_INTEGER || op2->ts.type == BT_INTEGER))
3824 e->ts.type = BT_INTEGER;
3825 e->ts.kind = gfc_kind_max (op1, op2);
3826 if (op1->ts.type != e->ts.type || op1->ts.kind != e->ts.kind)
3827 gfc_convert_type (op1, &e->ts, 1);
3828 if (op2->ts.type != e->ts.type || op2->ts.kind != e->ts.kind)
3829 gfc_convert_type (op2, &e->ts, 1);
3830 e = logical_to_bitwise (e);
3831 return resolve_function (e);
3834 sprintf (msg, _("Operands of logical operator %%<%s%%> at %%L are %s/%s"),
3835 gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3836 gfc_typename (&op2->ts));
3838 goto bad_op;
3840 case INTRINSIC_NOT:
3841 /* Logical ops on integers become bitwise ops with -fdec. */
3842 if (flag_dec && op1->ts.type == BT_INTEGER)
3844 e->ts.type = BT_INTEGER;
3845 e->ts.kind = op1->ts.kind;
3846 e = logical_to_bitwise (e);
3847 return resolve_function (e);
3850 if (op1->ts.type == BT_LOGICAL)
3852 e->ts.type = BT_LOGICAL;
3853 e->ts.kind = op1->ts.kind;
3854 break;
3857 sprintf (msg, _("Operand of .not. operator at %%L is %s"),
3858 gfc_typename (&op1->ts));
3859 goto bad_op;
3861 case INTRINSIC_GT:
3862 case INTRINSIC_GT_OS:
3863 case INTRINSIC_GE:
3864 case INTRINSIC_GE_OS:
3865 case INTRINSIC_LT:
3866 case INTRINSIC_LT_OS:
3867 case INTRINSIC_LE:
3868 case INTRINSIC_LE_OS:
3869 if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
3871 strcpy (msg, _("COMPLEX quantities cannot be compared at %L"));
3872 goto bad_op;
3875 /* Fall through. */
3877 case INTRINSIC_EQ:
3878 case INTRINSIC_EQ_OS:
3879 case INTRINSIC_NE:
3880 case INTRINSIC_NE_OS:
3881 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
3882 && op1->ts.kind == op2->ts.kind)
3884 e->ts.type = BT_LOGICAL;
3885 e->ts.kind = gfc_default_logical_kind;
3886 break;
3889 if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
3891 gfc_type_convert_binary (e, 1);
3893 e->ts.type = BT_LOGICAL;
3894 e->ts.kind = gfc_default_logical_kind;
3896 if (warn_compare_reals)
3898 gfc_intrinsic_op op = e->value.op.op;
3900 /* Type conversion has made sure that the types of op1 and op2
3901 agree, so it is only necessary to check the first one. */
3902 if ((op1->ts.type == BT_REAL || op1->ts.type == BT_COMPLEX)
3903 && (op == INTRINSIC_EQ || op == INTRINSIC_EQ_OS
3904 || op == INTRINSIC_NE || op == INTRINSIC_NE_OS))
3906 const char *msg;
3908 if (op == INTRINSIC_EQ || op == INTRINSIC_EQ_OS)
3909 msg = "Equality comparison for %s at %L";
3910 else
3911 msg = "Inequality comparison for %s at %L";
3913 gfc_warning (OPT_Wcompare_reals, msg,
3914 gfc_typename (&op1->ts), &op1->where);
3918 break;
3921 if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
3922 sprintf (msg,
3923 _("Logicals at %%L must be compared with %s instead of %s"),
3924 (e->value.op.op == INTRINSIC_EQ
3925 || e->value.op.op == INTRINSIC_EQ_OS)
3926 ? ".eqv." : ".neqv.", gfc_op2string (e->value.op.op));
3927 else
3928 sprintf (msg,
3929 _("Operands of comparison operator %%<%s%%> at %%L are %s/%s"),
3930 gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3931 gfc_typename (&op2->ts));
3933 goto bad_op;
3935 case INTRINSIC_USER:
3936 if (e->value.op.uop->op == NULL)
3937 sprintf (msg, _("Unknown operator %%<%s%%> at %%L"),
3938 e->value.op.uop->name);
3939 else if (op2 == NULL)
3940 sprintf (msg, _("Operand of user operator %%<%s%%> at %%L is %s"),
3941 e->value.op.uop->name, gfc_typename (&op1->ts));
3942 else
3944 sprintf (msg, _("Operands of user operator %%<%s%%> at %%L are %s/%s"),
3945 e->value.op.uop->name, gfc_typename (&op1->ts),
3946 gfc_typename (&op2->ts));
3947 e->value.op.uop->op->sym->attr.referenced = 1;
3950 goto bad_op;
3952 case INTRINSIC_PARENTHESES:
3953 e->ts = op1->ts;
3954 if (e->ts.type == BT_CHARACTER)
3955 e->ts.u.cl = op1->ts.u.cl;
3956 break;
3958 default:
3959 gfc_internal_error ("resolve_operator(): Bad intrinsic");
3962 /* Deal with arrayness of an operand through an operator. */
3964 t = true;
3966 switch (e->value.op.op)
3968 case INTRINSIC_PLUS:
3969 case INTRINSIC_MINUS:
3970 case INTRINSIC_TIMES:
3971 case INTRINSIC_DIVIDE:
3972 case INTRINSIC_POWER:
3973 case INTRINSIC_CONCAT:
3974 case INTRINSIC_AND:
3975 case INTRINSIC_OR:
3976 case INTRINSIC_EQV:
3977 case INTRINSIC_NEQV:
3978 case INTRINSIC_EQ:
3979 case INTRINSIC_EQ_OS:
3980 case INTRINSIC_NE:
3981 case INTRINSIC_NE_OS:
3982 case INTRINSIC_GT:
3983 case INTRINSIC_GT_OS:
3984 case INTRINSIC_GE:
3985 case INTRINSIC_GE_OS:
3986 case INTRINSIC_LT:
3987 case INTRINSIC_LT_OS:
3988 case INTRINSIC_LE:
3989 case INTRINSIC_LE_OS:
3991 if (op1->rank == 0 && op2->rank == 0)
3992 e->rank = 0;
3994 if (op1->rank == 0 && op2->rank != 0)
3996 e->rank = op2->rank;
3998 if (e->shape == NULL)
3999 e->shape = gfc_copy_shape (op2->shape, op2->rank);
4002 if (op1->rank != 0 && op2->rank == 0)
4004 e->rank = op1->rank;
4006 if (e->shape == NULL)
4007 e->shape = gfc_copy_shape (op1->shape, op1->rank);
4010 if (op1->rank != 0 && op2->rank != 0)
4012 if (op1->rank == op2->rank)
4014 e->rank = op1->rank;
4015 if (e->shape == NULL)
4017 t = compare_shapes (op1, op2);
4018 if (!t)
4019 e->shape = NULL;
4020 else
4021 e->shape = gfc_copy_shape (op1->shape, op1->rank);
4024 else
4026 /* Allow higher level expressions to work. */
4027 e->rank = 0;
4029 /* Try user-defined operators, and otherwise throw an error. */
4030 dual_locus_error = true;
4031 sprintf (msg,
4032 _("Inconsistent ranks for operator at %%L and %%L"));
4033 goto bad_op;
4037 break;
4039 case INTRINSIC_PARENTHESES:
4040 case INTRINSIC_NOT:
4041 case INTRINSIC_UPLUS:
4042 case INTRINSIC_UMINUS:
4043 /* Simply copy arrayness attribute */
4044 e->rank = op1->rank;
4046 if (e->shape == NULL)
4047 e->shape = gfc_copy_shape (op1->shape, op1->rank);
4049 break;
4051 default:
4052 break;
4055 /* Attempt to simplify the expression. */
4056 if (t)
4058 t = gfc_simplify_expr (e, 0);
4059 /* Some calls do not succeed in simplification and return false
4060 even though there is no error; e.g. variable references to
4061 PARAMETER arrays. */
4062 if (!gfc_is_constant_expr (e))
4063 t = true;
4065 return t;
4067 bad_op:
4070 match m = gfc_extend_expr (e);
4071 if (m == MATCH_YES)
4072 return true;
4073 if (m == MATCH_ERROR)
4074 return false;
4077 if (dual_locus_error)
4078 gfc_error (msg, &op1->where, &op2->where);
4079 else
4080 gfc_error (msg, &e->where);
4082 return false;
4086 /************** Array resolution subroutines **************/
4088 enum compare_result
4089 { CMP_LT, CMP_EQ, CMP_GT, CMP_UNKNOWN };
4091 /* Compare two integer expressions. */
4093 static compare_result
4094 compare_bound (gfc_expr *a, gfc_expr *b)
4096 int i;
4098 if (a == NULL || a->expr_type != EXPR_CONSTANT
4099 || b == NULL || b->expr_type != EXPR_CONSTANT)
4100 return CMP_UNKNOWN;
4102 /* If either of the types isn't INTEGER, we must have
4103 raised an error earlier. */
4105 if (a->ts.type != BT_INTEGER || b->ts.type != BT_INTEGER)
4106 return CMP_UNKNOWN;
4108 i = mpz_cmp (a->value.integer, b->value.integer);
4110 if (i < 0)
4111 return CMP_LT;
4112 if (i > 0)
4113 return CMP_GT;
4114 return CMP_EQ;
4118 /* Compare an integer expression with an integer. */
4120 static compare_result
4121 compare_bound_int (gfc_expr *a, int b)
4123 int i;
4125 if (a == NULL || a->expr_type != EXPR_CONSTANT)
4126 return CMP_UNKNOWN;
4128 if (a->ts.type != BT_INTEGER)
4129 gfc_internal_error ("compare_bound_int(): Bad expression");
4131 i = mpz_cmp_si (a->value.integer, b);
4133 if (i < 0)
4134 return CMP_LT;
4135 if (i > 0)
4136 return CMP_GT;
4137 return CMP_EQ;
4141 /* Compare an integer expression with a mpz_t. */
4143 static compare_result
4144 compare_bound_mpz_t (gfc_expr *a, mpz_t b)
4146 int i;
4148 if (a == NULL || a->expr_type != EXPR_CONSTANT)
4149 return CMP_UNKNOWN;
4151 if (a->ts.type != BT_INTEGER)
4152 gfc_internal_error ("compare_bound_int(): Bad expression");
4154 i = mpz_cmp (a->value.integer, b);
4156 if (i < 0)
4157 return CMP_LT;
4158 if (i > 0)
4159 return CMP_GT;
4160 return CMP_EQ;
4164 /* Compute the last value of a sequence given by a triplet.
4165 Return 0 if it wasn't able to compute the last value, or if the
4166 sequence if empty, and 1 otherwise. */
4168 static int
4169 compute_last_value_for_triplet (gfc_expr *start, gfc_expr *end,
4170 gfc_expr *stride, mpz_t last)
4172 mpz_t rem;
4174 if (start == NULL || start->expr_type != EXPR_CONSTANT
4175 || end == NULL || end->expr_type != EXPR_CONSTANT
4176 || (stride != NULL && stride->expr_type != EXPR_CONSTANT))
4177 return 0;
4179 if (start->ts.type != BT_INTEGER || end->ts.type != BT_INTEGER
4180 || (stride != NULL && stride->ts.type != BT_INTEGER))
4181 return 0;
4183 if (stride == NULL || compare_bound_int (stride, 1) == CMP_EQ)
4185 if (compare_bound (start, end) == CMP_GT)
4186 return 0;
4187 mpz_set (last, end->value.integer);
4188 return 1;
4191 if (compare_bound_int (stride, 0) == CMP_GT)
4193 /* Stride is positive */
4194 if (mpz_cmp (start->value.integer, end->value.integer) > 0)
4195 return 0;
4197 else
4199 /* Stride is negative */
4200 if (mpz_cmp (start->value.integer, end->value.integer) < 0)
4201 return 0;
4204 mpz_init (rem);
4205 mpz_sub (rem, end->value.integer, start->value.integer);
4206 mpz_tdiv_r (rem, rem, stride->value.integer);
4207 mpz_sub (last, end->value.integer, rem);
4208 mpz_clear (rem);
4210 return 1;
4214 /* Compare a single dimension of an array reference to the array
4215 specification. */
4217 static bool
4218 check_dimension (int i, gfc_array_ref *ar, gfc_array_spec *as)
4220 mpz_t last_value;
4222 if (ar->dimen_type[i] == DIMEN_STAR)
4224 gcc_assert (ar->stride[i] == NULL);
4225 /* This implies [*] as [*:] and [*:3] are not possible. */
4226 if (ar->start[i] == NULL)
4228 gcc_assert (ar->end[i] == NULL);
4229 return true;
4233 /* Given start, end and stride values, calculate the minimum and
4234 maximum referenced indexes. */
4236 switch (ar->dimen_type[i])
4238 case DIMEN_VECTOR:
4239 case DIMEN_THIS_IMAGE:
4240 break;
4242 case DIMEN_STAR:
4243 case DIMEN_ELEMENT:
4244 if (compare_bound (ar->start[i], as->lower[i]) == CMP_LT)
4246 if (i < as->rank)
4247 gfc_warning (0, "Array reference at %L is out of bounds "
4248 "(%ld < %ld) in dimension %d", &ar->c_where[i],
4249 mpz_get_si (ar->start[i]->value.integer),
4250 mpz_get_si (as->lower[i]->value.integer), i+1);
4251 else
4252 gfc_warning (0, "Array reference at %L is out of bounds "
4253 "(%ld < %ld) in codimension %d", &ar->c_where[i],
4254 mpz_get_si (ar->start[i]->value.integer),
4255 mpz_get_si (as->lower[i]->value.integer),
4256 i + 1 - as->rank);
4257 return true;
4259 if (compare_bound (ar->start[i], as->upper[i]) == CMP_GT)
4261 if (i < as->rank)
4262 gfc_warning (0, "Array reference at %L is out of bounds "
4263 "(%ld > %ld) in dimension %d", &ar->c_where[i],
4264 mpz_get_si (ar->start[i]->value.integer),
4265 mpz_get_si (as->upper[i]->value.integer), i+1);
4266 else
4267 gfc_warning (0, "Array reference at %L is out of bounds "
4268 "(%ld > %ld) in codimension %d", &ar->c_where[i],
4269 mpz_get_si (ar->start[i]->value.integer),
4270 mpz_get_si (as->upper[i]->value.integer),
4271 i + 1 - as->rank);
4272 return true;
4275 break;
4277 case DIMEN_RANGE:
4279 #define AR_START (ar->start[i] ? ar->start[i] : as->lower[i])
4280 #define AR_END (ar->end[i] ? ar->end[i] : as->upper[i])
4282 compare_result comp_start_end = compare_bound (AR_START, AR_END);
4284 /* Check for zero stride, which is not allowed. */
4285 if (compare_bound_int (ar->stride[i], 0) == CMP_EQ)
4287 gfc_error ("Illegal stride of zero at %L", &ar->c_where[i]);
4288 return false;
4291 /* if start == len || (stride > 0 && start < len)
4292 || (stride < 0 && start > len),
4293 then the array section contains at least one element. In this
4294 case, there is an out-of-bounds access if
4295 (start < lower || start > upper). */
4296 if (compare_bound (AR_START, AR_END) == CMP_EQ
4297 || ((compare_bound_int (ar->stride[i], 0) == CMP_GT
4298 || ar->stride[i] == NULL) && comp_start_end == CMP_LT)
4299 || (compare_bound_int (ar->stride[i], 0) == CMP_LT
4300 && comp_start_end == CMP_GT))
4302 if (compare_bound (AR_START, as->lower[i]) == CMP_LT)
4304 gfc_warning (0, "Lower array reference at %L is out of bounds "
4305 "(%ld < %ld) in dimension %d", &ar->c_where[i],
4306 mpz_get_si (AR_START->value.integer),
4307 mpz_get_si (as->lower[i]->value.integer), i+1);
4308 return true;
4310 if (compare_bound (AR_START, as->upper[i]) == CMP_GT)
4312 gfc_warning (0, "Lower array reference at %L is out of bounds "
4313 "(%ld > %ld) in dimension %d", &ar->c_where[i],
4314 mpz_get_si (AR_START->value.integer),
4315 mpz_get_si (as->upper[i]->value.integer), i+1);
4316 return true;
4320 /* If we can compute the highest index of the array section,
4321 then it also has to be between lower and upper. */
4322 mpz_init (last_value);
4323 if (compute_last_value_for_triplet (AR_START, AR_END, ar->stride[i],
4324 last_value))
4326 if (compare_bound_mpz_t (as->lower[i], last_value) == CMP_GT)
4328 gfc_warning (0, "Upper array reference at %L is out of bounds "
4329 "(%ld < %ld) in dimension %d", &ar->c_where[i],
4330 mpz_get_si (last_value),
4331 mpz_get_si (as->lower[i]->value.integer), i+1);
4332 mpz_clear (last_value);
4333 return true;
4335 if (compare_bound_mpz_t (as->upper[i], last_value) == CMP_LT)
4337 gfc_warning (0, "Upper array reference at %L is out of bounds "
4338 "(%ld > %ld) in dimension %d", &ar->c_where[i],
4339 mpz_get_si (last_value),
4340 mpz_get_si (as->upper[i]->value.integer), i+1);
4341 mpz_clear (last_value);
4342 return true;
4345 mpz_clear (last_value);
4347 #undef AR_START
4348 #undef AR_END
4350 break;
4352 default:
4353 gfc_internal_error ("check_dimension(): Bad array reference");
4356 return true;
4360 /* Compare an array reference with an array specification. */
4362 static bool
4363 compare_spec_to_ref (gfc_array_ref *ar)
4365 gfc_array_spec *as;
4366 int i;
4368 as = ar->as;
4369 i = as->rank - 1;
4370 /* TODO: Full array sections are only allowed as actual parameters. */
4371 if (as->type == AS_ASSUMED_SIZE
4372 && (/*ar->type == AR_FULL
4373 ||*/ (ar->type == AR_SECTION
4374 && ar->dimen_type[i] == DIMEN_RANGE && ar->end[i] == NULL)))
4376 gfc_error ("Rightmost upper bound of assumed size array section "
4377 "not specified at %L", &ar->where);
4378 return false;
4381 if (ar->type == AR_FULL)
4382 return true;
4384 if (as->rank != ar->dimen)
4386 gfc_error ("Rank mismatch in array reference at %L (%d/%d)",
4387 &ar->where, ar->dimen, as->rank);
4388 return false;
4391 /* ar->codimen == 0 is a local array. */
4392 if (as->corank != ar->codimen && ar->codimen != 0)
4394 gfc_error ("Coindex rank mismatch in array reference at %L (%d/%d)",
4395 &ar->where, ar->codimen, as->corank);
4396 return false;
4399 for (i = 0; i < as->rank; i++)
4400 if (!check_dimension (i, ar, as))
4401 return false;
4403 /* Local access has no coarray spec. */
4404 if (ar->codimen != 0)
4405 for (i = as->rank; i < as->rank + as->corank; i++)
4407 if (ar->dimen_type[i] != DIMEN_ELEMENT && !ar->in_allocate
4408 && ar->dimen_type[i] != DIMEN_THIS_IMAGE)
4410 gfc_error ("Coindex of codimension %d must be a scalar at %L",
4411 i + 1 - as->rank, &ar->where);
4412 return false;
4414 if (!check_dimension (i, ar, as))
4415 return false;
4418 return true;
4422 /* Resolve one part of an array index. */
4424 static bool
4425 gfc_resolve_index_1 (gfc_expr *index, int check_scalar,
4426 int force_index_integer_kind)
4428 gfc_typespec ts;
4430 if (index == NULL)
4431 return true;
4433 if (!gfc_resolve_expr (index))
4434 return false;
4436 if (check_scalar && index->rank != 0)
4438 gfc_error ("Array index at %L must be scalar", &index->where);
4439 return false;
4442 if (index->ts.type != BT_INTEGER && index->ts.type != BT_REAL)
4444 gfc_error ("Array index at %L must be of INTEGER type, found %s",
4445 &index->where, gfc_basic_typename (index->ts.type));
4446 return false;
4449 if (index->ts.type == BT_REAL)
4450 if (!gfc_notify_std (GFC_STD_LEGACY, "REAL array index at %L",
4451 &index->where))
4452 return false;
4454 if ((index->ts.kind != gfc_index_integer_kind
4455 && force_index_integer_kind)
4456 || index->ts.type != BT_INTEGER)
4458 gfc_clear_ts (&ts);
4459 ts.type = BT_INTEGER;
4460 ts.kind = gfc_index_integer_kind;
4462 gfc_convert_type_warn (index, &ts, 2, 0);
4465 return true;
4468 /* Resolve one part of an array index. */
4470 bool
4471 gfc_resolve_index (gfc_expr *index, int check_scalar)
4473 return gfc_resolve_index_1 (index, check_scalar, 1);
4476 /* Resolve a dim argument to an intrinsic function. */
4478 bool
4479 gfc_resolve_dim_arg (gfc_expr *dim)
4481 if (dim == NULL)
4482 return true;
4484 if (!gfc_resolve_expr (dim))
4485 return false;
4487 if (dim->rank != 0)
4489 gfc_error ("Argument dim at %L must be scalar", &dim->where);
4490 return false;
4494 if (dim->ts.type != BT_INTEGER)
4496 gfc_error ("Argument dim at %L must be of INTEGER type", &dim->where);
4497 return false;
4500 if (dim->ts.kind != gfc_index_integer_kind)
4502 gfc_typespec ts;
4504 gfc_clear_ts (&ts);
4505 ts.type = BT_INTEGER;
4506 ts.kind = gfc_index_integer_kind;
4508 gfc_convert_type_warn (dim, &ts, 2, 0);
4511 return true;
4514 /* Given an expression that contains array references, update those array
4515 references to point to the right array specifications. While this is
4516 filled in during matching, this information is difficult to save and load
4517 in a module, so we take care of it here.
4519 The idea here is that the original array reference comes from the
4520 base symbol. We traverse the list of reference structures, setting
4521 the stored reference to references. Component references can
4522 provide an additional array specification. */
4524 static void
4525 find_array_spec (gfc_expr *e)
4527 gfc_array_spec *as;
4528 gfc_component *c;
4529 gfc_ref *ref;
4531 if (e->symtree->n.sym->ts.type == BT_CLASS)
4532 as = CLASS_DATA (e->symtree->n.sym)->as;
4533 else
4534 as = e->symtree->n.sym->as;
4536 for (ref = e->ref; ref; ref = ref->next)
4537 switch (ref->type)
4539 case REF_ARRAY:
4540 if (as == NULL)
4541 gfc_internal_error ("find_array_spec(): Missing spec");
4543 ref->u.ar.as = as;
4544 as = NULL;
4545 break;
4547 case REF_COMPONENT:
4548 c = ref->u.c.component;
4549 if (c->attr.dimension)
4551 if (as != NULL)
4552 gfc_internal_error ("find_array_spec(): unused as(1)");
4553 as = c->as;
4556 break;
4558 case REF_SUBSTRING:
4559 break;
4562 if (as != NULL)
4563 gfc_internal_error ("find_array_spec(): unused as(2)");
4567 /* Resolve an array reference. */
4569 static bool
4570 resolve_array_ref (gfc_array_ref *ar)
4572 int i, check_scalar;
4573 gfc_expr *e;
4575 for (i = 0; i < ar->dimen + ar->codimen; i++)
4577 check_scalar = ar->dimen_type[i] == DIMEN_RANGE;
4579 /* Do not force gfc_index_integer_kind for the start. We can
4580 do fine with any integer kind. This avoids temporary arrays
4581 created for indexing with a vector. */
4582 if (!gfc_resolve_index_1 (ar->start[i], check_scalar, 0))
4583 return false;
4584 if (!gfc_resolve_index (ar->end[i], check_scalar))
4585 return false;
4586 if (!gfc_resolve_index (ar->stride[i], check_scalar))
4587 return false;
4589 e = ar->start[i];
4591 if (ar->dimen_type[i] == DIMEN_UNKNOWN)
4592 switch (e->rank)
4594 case 0:
4595 ar->dimen_type[i] = DIMEN_ELEMENT;
4596 break;
4598 case 1:
4599 ar->dimen_type[i] = DIMEN_VECTOR;
4600 if (e->expr_type == EXPR_VARIABLE
4601 && e->symtree->n.sym->ts.type == BT_DERIVED)
4602 ar->start[i] = gfc_get_parentheses (e);
4603 break;
4605 default:
4606 gfc_error ("Array index at %L is an array of rank %d",
4607 &ar->c_where[i], e->rank);
4608 return false;
4611 /* Fill in the upper bound, which may be lower than the
4612 specified one for something like a(2:10:5), which is
4613 identical to a(2:7:5). Only relevant for strides not equal
4614 to one. Don't try a division by zero. */
4615 if (ar->dimen_type[i] == DIMEN_RANGE
4616 && ar->stride[i] != NULL && ar->stride[i]->expr_type == EXPR_CONSTANT
4617 && mpz_cmp_si (ar->stride[i]->value.integer, 1L) != 0
4618 && mpz_cmp_si (ar->stride[i]->value.integer, 0L) != 0)
4620 mpz_t size, end;
4622 if (gfc_ref_dimen_size (ar, i, &size, &end))
4624 if (ar->end[i] == NULL)
4626 ar->end[i] =
4627 gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind,
4628 &ar->where);
4629 mpz_set (ar->end[i]->value.integer, end);
4631 else if (ar->end[i]->ts.type == BT_INTEGER
4632 && ar->end[i]->expr_type == EXPR_CONSTANT)
4634 mpz_set (ar->end[i]->value.integer, end);
4636 else
4637 gcc_unreachable ();
4639 mpz_clear (size);
4640 mpz_clear (end);
4645 if (ar->type == AR_FULL)
4647 if (ar->as->rank == 0)
4648 ar->type = AR_ELEMENT;
4650 /* Make sure array is the same as array(:,:), this way
4651 we don't need to special case all the time. */
4652 ar->dimen = ar->as->rank;
4653 for (i = 0; i < ar->dimen; i++)
4655 ar->dimen_type[i] = DIMEN_RANGE;
4657 gcc_assert (ar->start[i] == NULL);
4658 gcc_assert (ar->end[i] == NULL);
4659 gcc_assert (ar->stride[i] == NULL);
4663 /* If the reference type is unknown, figure out what kind it is. */
4665 if (ar->type == AR_UNKNOWN)
4667 ar->type = AR_ELEMENT;
4668 for (i = 0; i < ar->dimen; i++)
4669 if (ar->dimen_type[i] == DIMEN_RANGE
4670 || ar->dimen_type[i] == DIMEN_VECTOR)
4672 ar->type = AR_SECTION;
4673 break;
4677 if (!ar->as->cray_pointee && !compare_spec_to_ref (ar))
4678 return false;
4680 if (ar->as->corank && ar->codimen == 0)
4682 int n;
4683 ar->codimen = ar->as->corank;
4684 for (n = ar->dimen; n < ar->dimen + ar->codimen; n++)
4685 ar->dimen_type[n] = DIMEN_THIS_IMAGE;
4688 return true;
4692 static bool
4693 resolve_substring (gfc_ref *ref)
4695 int k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
4697 if (ref->u.ss.start != NULL)
4699 if (!gfc_resolve_expr (ref->u.ss.start))
4700 return false;
4702 if (ref->u.ss.start->ts.type != BT_INTEGER)
4704 gfc_error ("Substring start index at %L must be of type INTEGER",
4705 &ref->u.ss.start->where);
4706 return false;
4709 if (ref->u.ss.start->rank != 0)
4711 gfc_error ("Substring start index at %L must be scalar",
4712 &ref->u.ss.start->where);
4713 return false;
4716 if (compare_bound_int (ref->u.ss.start, 1) == CMP_LT
4717 && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
4718 || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
4720 gfc_error ("Substring start index at %L is less than one",
4721 &ref->u.ss.start->where);
4722 return false;
4726 if (ref->u.ss.end != NULL)
4728 if (!gfc_resolve_expr (ref->u.ss.end))
4729 return false;
4731 if (ref->u.ss.end->ts.type != BT_INTEGER)
4733 gfc_error ("Substring end index at %L must be of type INTEGER",
4734 &ref->u.ss.end->where);
4735 return false;
4738 if (ref->u.ss.end->rank != 0)
4740 gfc_error ("Substring end index at %L must be scalar",
4741 &ref->u.ss.end->where);
4742 return false;
4745 if (ref->u.ss.length != NULL
4746 && compare_bound (ref->u.ss.end, ref->u.ss.length->length) == CMP_GT
4747 && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
4748 || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
4750 gfc_error ("Substring end index at %L exceeds the string length",
4751 &ref->u.ss.start->where);
4752 return false;
4755 if (compare_bound_mpz_t (ref->u.ss.end,
4756 gfc_integer_kinds[k].huge) == CMP_GT
4757 && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
4758 || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
4760 gfc_error ("Substring end index at %L is too large",
4761 &ref->u.ss.end->where);
4762 return false;
4766 return true;
4770 /* This function supplies missing substring charlens. */
4772 void
4773 gfc_resolve_substring_charlen (gfc_expr *e)
4775 gfc_ref *char_ref;
4776 gfc_expr *start, *end;
4777 gfc_typespec *ts = NULL;
4779 for (char_ref = e->ref; char_ref; char_ref = char_ref->next)
4781 if (char_ref->type == REF_SUBSTRING)
4782 break;
4783 if (char_ref->type == REF_COMPONENT)
4784 ts = &char_ref->u.c.component->ts;
4787 if (!char_ref)
4788 return;
4790 gcc_assert (char_ref->next == NULL);
4792 if (e->ts.u.cl)
4794 if (e->ts.u.cl->length)
4795 gfc_free_expr (e->ts.u.cl->length);
4796 else if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym->attr.dummy)
4797 return;
4800 e->ts.type = BT_CHARACTER;
4801 e->ts.kind = gfc_default_character_kind;
4803 if (!e->ts.u.cl)
4804 e->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4806 if (char_ref->u.ss.start)
4807 start = gfc_copy_expr (char_ref->u.ss.start);
4808 else
4809 start = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
4811 if (char_ref->u.ss.end)
4812 end = gfc_copy_expr (char_ref->u.ss.end);
4813 else if (e->expr_type == EXPR_VARIABLE)
4815 if (!ts)
4816 ts = &e->symtree->n.sym->ts;
4817 end = gfc_copy_expr (ts->u.cl->length);
4819 else
4820 end = NULL;
4822 if (!start || !end)
4824 gfc_free_expr (start);
4825 gfc_free_expr (end);
4826 return;
4829 /* Length = (end - start + 1). */
4830 e->ts.u.cl->length = gfc_subtract (end, start);
4831 e->ts.u.cl->length = gfc_add (e->ts.u.cl->length,
4832 gfc_get_int_expr (gfc_default_integer_kind,
4833 NULL, 1));
4835 /* F2008, 6.4.1: Both the starting point and the ending point shall
4836 be within the range 1, 2, ..., n unless the starting point exceeds
4837 the ending point, in which case the substring has length zero. */
4839 if (mpz_cmp_si (e->ts.u.cl->length->value.integer, 0) < 0)
4840 mpz_set_si (e->ts.u.cl->length->value.integer, 0);
4842 e->ts.u.cl->length->ts.type = BT_INTEGER;
4843 e->ts.u.cl->length->ts.kind = gfc_charlen_int_kind;
4845 /* Make sure that the length is simplified. */
4846 gfc_simplify_expr (e->ts.u.cl->length, 1);
4847 gfc_resolve_expr (e->ts.u.cl->length);
4851 /* Resolve subtype references. */
4853 static bool
4854 resolve_ref (gfc_expr *expr)
4856 int current_part_dimension, n_components, seen_part_dimension;
4857 gfc_ref *ref;
4859 for (ref = expr->ref; ref; ref = ref->next)
4860 if (ref->type == REF_ARRAY && ref->u.ar.as == NULL)
4862 find_array_spec (expr);
4863 break;
4866 for (ref = expr->ref; ref; ref = ref->next)
4867 switch (ref->type)
4869 case REF_ARRAY:
4870 if (!resolve_array_ref (&ref->u.ar))
4871 return false;
4872 break;
4874 case REF_COMPONENT:
4875 break;
4877 case REF_SUBSTRING:
4878 if (!resolve_substring (ref))
4879 return false;
4880 break;
4883 /* Check constraints on part references. */
4885 current_part_dimension = 0;
4886 seen_part_dimension = 0;
4887 n_components = 0;
4889 for (ref = expr->ref; ref; ref = ref->next)
4891 switch (ref->type)
4893 case REF_ARRAY:
4894 switch (ref->u.ar.type)
4896 case AR_FULL:
4897 /* Coarray scalar. */
4898 if (ref->u.ar.as->rank == 0)
4900 current_part_dimension = 0;
4901 break;
4903 /* Fall through. */
4904 case AR_SECTION:
4905 current_part_dimension = 1;
4906 break;
4908 case AR_ELEMENT:
4909 current_part_dimension = 0;
4910 break;
4912 case AR_UNKNOWN:
4913 gfc_internal_error ("resolve_ref(): Bad array reference");
4916 break;
4918 case REF_COMPONENT:
4919 if (current_part_dimension || seen_part_dimension)
4921 /* F03:C614. */
4922 if (ref->u.c.component->attr.pointer
4923 || ref->u.c.component->attr.proc_pointer
4924 || (ref->u.c.component->ts.type == BT_CLASS
4925 && CLASS_DATA (ref->u.c.component)->attr.pointer))
4927 gfc_error ("Component to the right of a part reference "
4928 "with nonzero rank must not have the POINTER "
4929 "attribute at %L", &expr->where);
4930 return false;
4932 else if (ref->u.c.component->attr.allocatable
4933 || (ref->u.c.component->ts.type == BT_CLASS
4934 && CLASS_DATA (ref->u.c.component)->attr.allocatable))
4937 gfc_error ("Component to the right of a part reference "
4938 "with nonzero rank must not have the ALLOCATABLE "
4939 "attribute at %L", &expr->where);
4940 return false;
4944 n_components++;
4945 break;
4947 case REF_SUBSTRING:
4948 break;
4951 if (((ref->type == REF_COMPONENT && n_components > 1)
4952 || ref->next == NULL)
4953 && current_part_dimension
4954 && seen_part_dimension)
4956 gfc_error ("Two or more part references with nonzero rank must "
4957 "not be specified at %L", &expr->where);
4958 return false;
4961 if (ref->type == REF_COMPONENT)
4963 if (current_part_dimension)
4964 seen_part_dimension = 1;
4966 /* reset to make sure */
4967 current_part_dimension = 0;
4971 return true;
4975 /* Given an expression, determine its shape. This is easier than it sounds.
4976 Leaves the shape array NULL if it is not possible to determine the shape. */
4978 static void
4979 expression_shape (gfc_expr *e)
4981 mpz_t array[GFC_MAX_DIMENSIONS];
4982 int i;
4984 if (e->rank <= 0 || e->shape != NULL)
4985 return;
4987 for (i = 0; i < e->rank; i++)
4988 if (!gfc_array_dimen_size (e, i, &array[i]))
4989 goto fail;
4991 e->shape = gfc_get_shape (e->rank);
4993 memcpy (e->shape, array, e->rank * sizeof (mpz_t));
4995 return;
4997 fail:
4998 for (i--; i >= 0; i--)
4999 mpz_clear (array[i]);
5003 /* Given a variable expression node, compute the rank of the expression by
5004 examining the base symbol and any reference structures it may have. */
5006 void
5007 expression_rank (gfc_expr *e)
5009 gfc_ref *ref;
5010 int i, rank;
5012 /* Just to make sure, because EXPR_COMPCALL's also have an e->ref and that
5013 could lead to serious confusion... */
5014 gcc_assert (e->expr_type != EXPR_COMPCALL);
5016 if (e->ref == NULL)
5018 if (e->expr_type == EXPR_ARRAY)
5019 goto done;
5020 /* Constructors can have a rank different from one via RESHAPE(). */
5022 if (e->symtree == NULL)
5024 e->rank = 0;
5025 goto done;
5028 e->rank = (e->symtree->n.sym->as == NULL)
5029 ? 0 : e->symtree->n.sym->as->rank;
5030 goto done;
5033 rank = 0;
5035 for (ref = e->ref; ref; ref = ref->next)
5037 if (ref->type == REF_COMPONENT && ref->u.c.component->attr.proc_pointer
5038 && ref->u.c.component->attr.function && !ref->next)
5039 rank = ref->u.c.component->as ? ref->u.c.component->as->rank : 0;
5041 if (ref->type != REF_ARRAY)
5042 continue;
5044 if (ref->u.ar.type == AR_FULL)
5046 rank = ref->u.ar.as->rank;
5047 break;
5050 if (ref->u.ar.type == AR_SECTION)
5052 /* Figure out the rank of the section. */
5053 if (rank != 0)
5054 gfc_internal_error ("expression_rank(): Two array specs");
5056 for (i = 0; i < ref->u.ar.dimen; i++)
5057 if (ref->u.ar.dimen_type[i] == DIMEN_RANGE
5058 || ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
5059 rank++;
5061 break;
5065 e->rank = rank;
5067 done:
5068 expression_shape (e);
5072 static void
5073 add_caf_get_intrinsic (gfc_expr *e)
5075 gfc_expr *wrapper, *tmp_expr;
5076 gfc_ref *ref;
5077 int n;
5079 for (ref = e->ref; ref; ref = ref->next)
5080 if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
5081 break;
5082 if (ref == NULL)
5083 return;
5085 for (n = ref->u.ar.dimen; n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
5086 if (ref->u.ar.dimen_type[n] != DIMEN_ELEMENT)
5087 return;
5089 tmp_expr = XCNEW (gfc_expr);
5090 *tmp_expr = *e;
5091 wrapper = gfc_build_intrinsic_call (gfc_current_ns, GFC_ISYM_CAF_GET,
5092 "caf_get", tmp_expr->where, 1, tmp_expr);
5093 wrapper->ts = e->ts;
5094 wrapper->rank = e->rank;
5095 if (e->rank)
5096 wrapper->shape = gfc_copy_shape (e->shape, e->rank);
5097 *e = *wrapper;
5098 free (wrapper);
5102 static void
5103 remove_caf_get_intrinsic (gfc_expr *e)
5105 gcc_assert (e->expr_type == EXPR_FUNCTION && e->value.function.isym
5106 && e->value.function.isym->id == GFC_ISYM_CAF_GET);
5107 gfc_expr *e2 = e->value.function.actual->expr;
5108 e->value.function.actual->expr = NULL;
5109 gfc_free_actual_arglist (e->value.function.actual);
5110 gfc_free_shape (&e->shape, e->rank);
5111 *e = *e2;
5112 free (e2);
5116 /* Resolve a variable expression. */
5118 static bool
5119 resolve_variable (gfc_expr *e)
5121 gfc_symbol *sym;
5122 bool t;
5124 t = true;
5126 if (e->symtree == NULL)
5127 return false;
5128 sym = e->symtree->n.sym;
5130 /* Use same check as for TYPE(*) below; this check has to be before TYPE(*)
5131 as ts.type is set to BT_ASSUMED in resolve_symbol. */
5132 if (sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
5134 if (!actual_arg || inquiry_argument)
5136 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute may only "
5137 "be used as actual argument", sym->name, &e->where);
5138 return false;
5141 /* TS 29113, 407b. */
5142 else if (e->ts.type == BT_ASSUMED)
5144 if (!actual_arg)
5146 gfc_error ("Assumed-type variable %s at %L may only be used "
5147 "as actual argument", sym->name, &e->where);
5148 return false;
5150 else if (inquiry_argument && !first_actual_arg)
5152 /* FIXME: It doesn't work reliably as inquiry_argument is not set
5153 for all inquiry functions in resolve_function; the reason is
5154 that the function-name resolution happens too late in that
5155 function. */
5156 gfc_error ("Assumed-type variable %s at %L as actual argument to "
5157 "an inquiry function shall be the first argument",
5158 sym->name, &e->where);
5159 return false;
5162 /* TS 29113, C535b. */
5163 else if ((sym->ts.type == BT_CLASS && sym->attr.class_ok
5164 && CLASS_DATA (sym)->as
5165 && CLASS_DATA (sym)->as->type == AS_ASSUMED_RANK)
5166 || (sym->ts.type != BT_CLASS && sym->as
5167 && sym->as->type == AS_ASSUMED_RANK))
5169 if (!actual_arg)
5171 gfc_error ("Assumed-rank variable %s at %L may only be used as "
5172 "actual argument", sym->name, &e->where);
5173 return false;
5175 else if (inquiry_argument && !first_actual_arg)
5177 /* FIXME: It doesn't work reliably as inquiry_argument is not set
5178 for all inquiry functions in resolve_function; the reason is
5179 that the function-name resolution happens too late in that
5180 function. */
5181 gfc_error ("Assumed-rank variable %s at %L as actual argument "
5182 "to an inquiry function shall be the first argument",
5183 sym->name, &e->where);
5184 return false;
5188 if ((sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK)) && e->ref
5189 && !(e->ref->type == REF_ARRAY && e->ref->u.ar.type == AR_FULL
5190 && e->ref->next == NULL))
5192 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall not have "
5193 "a subobject reference", sym->name, &e->ref->u.ar.where);
5194 return false;
5196 /* TS 29113, 407b. */
5197 else if (e->ts.type == BT_ASSUMED && e->ref
5198 && !(e->ref->type == REF_ARRAY && e->ref->u.ar.type == AR_FULL
5199 && e->ref->next == NULL))
5201 gfc_error ("Assumed-type variable %s at %L shall not have a subobject "
5202 "reference", sym->name, &e->ref->u.ar.where);
5203 return false;
5206 /* TS 29113, C535b. */
5207 if (((sym->ts.type == BT_CLASS && sym->attr.class_ok
5208 && CLASS_DATA (sym)->as
5209 && CLASS_DATA (sym)->as->type == AS_ASSUMED_RANK)
5210 || (sym->ts.type != BT_CLASS && sym->as
5211 && sym->as->type == AS_ASSUMED_RANK))
5212 && e->ref
5213 && !(e->ref->type == REF_ARRAY && e->ref->u.ar.type == AR_FULL
5214 && e->ref->next == NULL))
5216 gfc_error ("Assumed-rank variable %s at %L shall not have a subobject "
5217 "reference", sym->name, &e->ref->u.ar.where);
5218 return false;
5221 /* For variables that are used in an associate (target => object) where
5222 the object's basetype is array valued while the target is scalar,
5223 the ts' type of the component refs is still array valued, which
5224 can't be translated that way. */
5225 if (sym->assoc && e->rank == 0 && e->ref && sym->ts.type == BT_CLASS
5226 && sym->assoc->target->ts.type == BT_CLASS
5227 && CLASS_DATA (sym->assoc->target)->as)
5229 gfc_ref *ref = e->ref;
5230 while (ref)
5232 switch (ref->type)
5234 case REF_COMPONENT:
5235 ref->u.c.sym = sym->ts.u.derived;
5236 /* Stop the loop. */
5237 ref = NULL;
5238 break;
5239 default:
5240 ref = ref->next;
5241 break;
5246 /* If this is an associate-name, it may be parsed with an array reference
5247 in error even though the target is scalar. Fail directly in this case.
5248 TODO Understand why class scalar expressions must be excluded. */
5249 if (sym->assoc && !(sym->ts.type == BT_CLASS && e->rank == 0))
5251 if (sym->ts.type == BT_CLASS)
5252 gfc_fix_class_refs (e);
5253 if (!sym->attr.dimension && e->ref && e->ref->type == REF_ARRAY)
5254 return false;
5257 if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.generic)
5258 sym->ts.u.derived = gfc_find_dt_in_generic (sym->ts.u.derived);
5260 /* On the other hand, the parser may not have known this is an array;
5261 in this case, we have to add a FULL reference. */
5262 if (sym->assoc && sym->attr.dimension && !e->ref)
5264 e->ref = gfc_get_ref ();
5265 e->ref->type = REF_ARRAY;
5266 e->ref->u.ar.type = AR_FULL;
5267 e->ref->u.ar.dimen = 0;
5270 /* Like above, but for class types, where the checking whether an array
5271 ref is present is more complicated. Furthermore make sure not to add
5272 the full array ref to _vptr or _len refs. */
5273 if (sym->assoc && sym->ts.type == BT_CLASS
5274 && CLASS_DATA (sym)->attr.dimension
5275 && (e->ts.type != BT_DERIVED || !e->ts.u.derived->attr.vtype))
5277 gfc_ref *ref, *newref;
5279 newref = gfc_get_ref ();
5280 newref->type = REF_ARRAY;
5281 newref->u.ar.type = AR_FULL;
5282 newref->u.ar.dimen = 0;
5283 /* Because this is an associate var and the first ref either is a ref to
5284 the _data component or not, no traversal of the ref chain is
5285 needed. The array ref needs to be inserted after the _data ref,
5286 or when that is not present, which may happend for polymorphic
5287 types, then at the first position. */
5288 ref = e->ref;
5289 if (!ref)
5290 e->ref = newref;
5291 else if (ref->type == REF_COMPONENT
5292 && strcmp ("_data", ref->u.c.component->name) == 0)
5294 if (!ref->next || ref->next->type != REF_ARRAY)
5296 newref->next = ref->next;
5297 ref->next = newref;
5299 else
5300 /* Array ref present already. */
5301 gfc_free_ref_list (newref);
5303 else if (ref->type == REF_ARRAY)
5304 /* Array ref present already. */
5305 gfc_free_ref_list (newref);
5306 else
5308 newref->next = ref;
5309 e->ref = newref;
5313 if (e->ref && !resolve_ref (e))
5314 return false;
5316 if (sym->attr.flavor == FL_PROCEDURE
5317 && (!sym->attr.function
5318 || (sym->attr.function && sym->result
5319 && sym->result->attr.proc_pointer
5320 && !sym->result->attr.function)))
5322 e->ts.type = BT_PROCEDURE;
5323 goto resolve_procedure;
5326 if (sym->ts.type != BT_UNKNOWN)
5327 gfc_variable_attr (e, &e->ts);
5328 else if (sym->attr.flavor == FL_PROCEDURE
5329 && sym->attr.function && sym->result
5330 && sym->result->ts.type != BT_UNKNOWN
5331 && sym->result->attr.proc_pointer)
5332 e->ts = sym->result->ts;
5333 else
5335 /* Must be a simple variable reference. */
5336 if (!gfc_set_default_type (sym, 1, sym->ns))
5337 return false;
5338 e->ts = sym->ts;
5341 if (check_assumed_size_reference (sym, e))
5342 return false;
5344 /* Deal with forward references to entries during gfc_resolve_code, to
5345 satisfy, at least partially, 12.5.2.5. */
5346 if (gfc_current_ns->entries
5347 && current_entry_id == sym->entry_id
5348 && cs_base
5349 && cs_base->current
5350 && cs_base->current->op != EXEC_ENTRY)
5352 gfc_entry_list *entry;
5353 gfc_formal_arglist *formal;
5354 int n;
5355 bool seen, saved_specification_expr;
5357 /* If the symbol is a dummy... */
5358 if (sym->attr.dummy && sym->ns == gfc_current_ns)
5360 entry = gfc_current_ns->entries;
5361 seen = false;
5363 /* ...test if the symbol is a parameter of previous entries. */
5364 for (; entry && entry->id <= current_entry_id; entry = entry->next)
5365 for (formal = entry->sym->formal; formal; formal = formal->next)
5367 if (formal->sym && sym->name == formal->sym->name)
5369 seen = true;
5370 break;
5374 /* If it has not been seen as a dummy, this is an error. */
5375 if (!seen)
5377 if (specification_expr)
5378 gfc_error ("Variable %qs, used in a specification expression"
5379 ", is referenced at %L before the ENTRY statement "
5380 "in which it is a parameter",
5381 sym->name, &cs_base->current->loc);
5382 else
5383 gfc_error ("Variable %qs is used at %L before the ENTRY "
5384 "statement in which it is a parameter",
5385 sym->name, &cs_base->current->loc);
5386 t = false;
5390 /* Now do the same check on the specification expressions. */
5391 saved_specification_expr = specification_expr;
5392 specification_expr = true;
5393 if (sym->ts.type == BT_CHARACTER
5394 && !gfc_resolve_expr (sym->ts.u.cl->length))
5395 t = false;
5397 if (sym->as)
5398 for (n = 0; n < sym->as->rank; n++)
5400 if (!gfc_resolve_expr (sym->as->lower[n]))
5401 t = false;
5402 if (!gfc_resolve_expr (sym->as->upper[n]))
5403 t = false;
5405 specification_expr = saved_specification_expr;
5407 if (t)
5408 /* Update the symbol's entry level. */
5409 sym->entry_id = current_entry_id + 1;
5412 /* If a symbol has been host_associated mark it. This is used latter,
5413 to identify if aliasing is possible via host association. */
5414 if (sym->attr.flavor == FL_VARIABLE
5415 && gfc_current_ns->parent
5416 && (gfc_current_ns->parent == sym->ns
5417 || (gfc_current_ns->parent->parent
5418 && gfc_current_ns->parent->parent == sym->ns)))
5419 sym->attr.host_assoc = 1;
5421 if (gfc_current_ns->proc_name
5422 && sym->attr.dimension
5423 && (sym->ns != gfc_current_ns
5424 || sym->attr.use_assoc
5425 || sym->attr.in_common))
5426 gfc_current_ns->proc_name->attr.array_outer_dependency = 1;
5428 resolve_procedure:
5429 if (t && !resolve_procedure_expression (e))
5430 t = false;
5432 /* F2008, C617 and C1229. */
5433 if (!inquiry_argument && (e->ts.type == BT_CLASS || e->ts.type == BT_DERIVED)
5434 && gfc_is_coindexed (e))
5436 gfc_ref *ref, *ref2 = NULL;
5438 for (ref = e->ref; ref; ref = ref->next)
5440 if (ref->type == REF_COMPONENT)
5441 ref2 = ref;
5442 if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
5443 break;
5446 for ( ; ref; ref = ref->next)
5447 if (ref->type == REF_COMPONENT)
5448 break;
5450 /* Expression itself is not coindexed object. */
5451 if (ref && e->ts.type == BT_CLASS)
5453 gfc_error ("Polymorphic subobject of coindexed object at %L",
5454 &e->where);
5455 t = false;
5458 /* Expression itself is coindexed object. */
5459 if (ref == NULL)
5461 gfc_component *c;
5462 c = ref2 ? ref2->u.c.component : e->symtree->n.sym->components;
5463 for ( ; c; c = c->next)
5464 if (c->attr.allocatable && c->ts.type == BT_CLASS)
5466 gfc_error ("Coindexed object with polymorphic allocatable "
5467 "subcomponent at %L", &e->where);
5468 t = false;
5469 break;
5474 if (t)
5475 expression_rank (e);
5477 if (t && flag_coarray == GFC_FCOARRAY_LIB && gfc_is_coindexed (e))
5478 add_caf_get_intrinsic (e);
5480 return t;
5484 /* Checks to see that the correct symbol has been host associated.
5485 The only situation where this arises is that in which a twice
5486 contained function is parsed after the host association is made.
5487 Therefore, on detecting this, change the symbol in the expression
5488 and convert the array reference into an actual arglist if the old
5489 symbol is a variable. */
5490 static bool
5491 check_host_association (gfc_expr *e)
5493 gfc_symbol *sym, *old_sym;
5494 gfc_symtree *st;
5495 int n;
5496 gfc_ref *ref;
5497 gfc_actual_arglist *arg, *tail = NULL;
5498 bool retval = e->expr_type == EXPR_FUNCTION;
5500 /* If the expression is the result of substitution in
5501 interface.c(gfc_extend_expr) because there is no way in
5502 which the host association can be wrong. */
5503 if (e->symtree == NULL
5504 || e->symtree->n.sym == NULL
5505 || e->user_operator)
5506 return retval;
5508 old_sym = e->symtree->n.sym;
5510 if (gfc_current_ns->parent
5511 && old_sym->ns != gfc_current_ns)
5513 /* Use the 'USE' name so that renamed module symbols are
5514 correctly handled. */
5515 gfc_find_symbol (e->symtree->name, gfc_current_ns, 1, &sym);
5517 if (sym && old_sym != sym
5518 && sym->ts.type == old_sym->ts.type
5519 && sym->attr.flavor == FL_PROCEDURE
5520 && sym->attr.contained)
5522 /* Clear the shape, since it might not be valid. */
5523 gfc_free_shape (&e->shape, e->rank);
5525 /* Give the expression the right symtree! */
5526 gfc_find_sym_tree (e->symtree->name, NULL, 1, &st);
5527 gcc_assert (st != NULL);
5529 if (old_sym->attr.flavor == FL_PROCEDURE
5530 || e->expr_type == EXPR_FUNCTION)
5532 /* Original was function so point to the new symbol, since
5533 the actual argument list is already attached to the
5534 expression. */
5535 e->value.function.esym = NULL;
5536 e->symtree = st;
5538 else
5540 /* Original was variable so convert array references into
5541 an actual arglist. This does not need any checking now
5542 since resolve_function will take care of it. */
5543 e->value.function.actual = NULL;
5544 e->expr_type = EXPR_FUNCTION;
5545 e->symtree = st;
5547 /* Ambiguity will not arise if the array reference is not
5548 the last reference. */
5549 for (ref = e->ref; ref; ref = ref->next)
5550 if (ref->type == REF_ARRAY && ref->next == NULL)
5551 break;
5553 gcc_assert (ref->type == REF_ARRAY);
5555 /* Grab the start expressions from the array ref and
5556 copy them into actual arguments. */
5557 for (n = 0; n < ref->u.ar.dimen; n++)
5559 arg = gfc_get_actual_arglist ();
5560 arg->expr = gfc_copy_expr (ref->u.ar.start[n]);
5561 if (e->value.function.actual == NULL)
5562 tail = e->value.function.actual = arg;
5563 else
5565 tail->next = arg;
5566 tail = arg;
5570 /* Dump the reference list and set the rank. */
5571 gfc_free_ref_list (e->ref);
5572 e->ref = NULL;
5573 e->rank = sym->as ? sym->as->rank : 0;
5576 gfc_resolve_expr (e);
5577 sym->refs++;
5580 /* This might have changed! */
5581 return e->expr_type == EXPR_FUNCTION;
5585 static void
5586 gfc_resolve_character_operator (gfc_expr *e)
5588 gfc_expr *op1 = e->value.op.op1;
5589 gfc_expr *op2 = e->value.op.op2;
5590 gfc_expr *e1 = NULL;
5591 gfc_expr *e2 = NULL;
5593 gcc_assert (e->value.op.op == INTRINSIC_CONCAT);
5595 if (op1->ts.u.cl && op1->ts.u.cl->length)
5596 e1 = gfc_copy_expr (op1->ts.u.cl->length);
5597 else if (op1->expr_type == EXPR_CONSTANT)
5598 e1 = gfc_get_int_expr (gfc_default_integer_kind, NULL,
5599 op1->value.character.length);
5601 if (op2->ts.u.cl && op2->ts.u.cl->length)
5602 e2 = gfc_copy_expr (op2->ts.u.cl->length);
5603 else if (op2->expr_type == EXPR_CONSTANT)
5604 e2 = gfc_get_int_expr (gfc_default_integer_kind, NULL,
5605 op2->value.character.length);
5607 e->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
5609 if (!e1 || !e2)
5611 gfc_free_expr (e1);
5612 gfc_free_expr (e2);
5614 return;
5617 e->ts.u.cl->length = gfc_add (e1, e2);
5618 e->ts.u.cl->length->ts.type = BT_INTEGER;
5619 e->ts.u.cl->length->ts.kind = gfc_charlen_int_kind;
5620 gfc_simplify_expr (e->ts.u.cl->length, 0);
5621 gfc_resolve_expr (e->ts.u.cl->length);
5623 return;
5627 /* Ensure that an character expression has a charlen and, if possible, a
5628 length expression. */
5630 static void
5631 fixup_charlen (gfc_expr *e)
5633 /* The cases fall through so that changes in expression type and the need
5634 for multiple fixes are picked up. In all circumstances, a charlen should
5635 be available for the middle end to hang a backend_decl on. */
5636 switch (e->expr_type)
5638 case EXPR_OP:
5639 gfc_resolve_character_operator (e);
5640 /* FALLTHRU */
5642 case EXPR_ARRAY:
5643 if (e->expr_type == EXPR_ARRAY)
5644 gfc_resolve_character_array_constructor (e);
5645 /* FALLTHRU */
5647 case EXPR_SUBSTRING:
5648 if (!e->ts.u.cl && e->ref)
5649 gfc_resolve_substring_charlen (e);
5650 /* FALLTHRU */
5652 default:
5653 if (!e->ts.u.cl)
5654 e->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
5656 break;
5661 /* Update an actual argument to include the passed-object for type-bound
5662 procedures at the right position. */
5664 static gfc_actual_arglist*
5665 update_arglist_pass (gfc_actual_arglist* lst, gfc_expr* po, unsigned argpos,
5666 const char *name)
5668 gcc_assert (argpos > 0);
5670 if (argpos == 1)
5672 gfc_actual_arglist* result;
5674 result = gfc_get_actual_arglist ();
5675 result->expr = po;
5676 result->next = lst;
5677 if (name)
5678 result->name = name;
5680 return result;
5683 if (lst)
5684 lst->next = update_arglist_pass (lst->next, po, argpos - 1, name);
5685 else
5686 lst = update_arglist_pass (NULL, po, argpos - 1, name);
5687 return lst;
5691 /* Extract the passed-object from an EXPR_COMPCALL (a copy of it). */
5693 static gfc_expr*
5694 extract_compcall_passed_object (gfc_expr* e)
5696 gfc_expr* po;
5698 gcc_assert (e->expr_type == EXPR_COMPCALL);
5700 if (e->value.compcall.base_object)
5701 po = gfc_copy_expr (e->value.compcall.base_object);
5702 else
5704 po = gfc_get_expr ();
5705 po->expr_type = EXPR_VARIABLE;
5706 po->symtree = e->symtree;
5707 po->ref = gfc_copy_ref (e->ref);
5708 po->where = e->where;
5711 if (!gfc_resolve_expr (po))
5712 return NULL;
5714 return po;
5718 /* Update the arglist of an EXPR_COMPCALL expression to include the
5719 passed-object. */
5721 static bool
5722 update_compcall_arglist (gfc_expr* e)
5724 gfc_expr* po;
5725 gfc_typebound_proc* tbp;
5727 tbp = e->value.compcall.tbp;
5729 if (tbp->error)
5730 return false;
5732 po = extract_compcall_passed_object (e);
5733 if (!po)
5734 return false;
5736 if (tbp->nopass || e->value.compcall.ignore_pass)
5738 gfc_free_expr (po);
5739 return true;
5742 gcc_assert (tbp->pass_arg_num > 0);
5743 e->value.compcall.actual = update_arglist_pass (e->value.compcall.actual, po,
5744 tbp->pass_arg_num,
5745 tbp->pass_arg);
5747 return true;
5751 /* Extract the passed object from a PPC call (a copy of it). */
5753 static gfc_expr*
5754 extract_ppc_passed_object (gfc_expr *e)
5756 gfc_expr *po;
5757 gfc_ref **ref;
5759 po = gfc_get_expr ();
5760 po->expr_type = EXPR_VARIABLE;
5761 po->symtree = e->symtree;
5762 po->ref = gfc_copy_ref (e->ref);
5763 po->where = e->where;
5765 /* Remove PPC reference. */
5766 ref = &po->ref;
5767 while ((*ref)->next)
5768 ref = &(*ref)->next;
5769 gfc_free_ref_list (*ref);
5770 *ref = NULL;
5772 if (!gfc_resolve_expr (po))
5773 return NULL;
5775 return po;
5779 /* Update the actual arglist of a procedure pointer component to include the
5780 passed-object. */
5782 static bool
5783 update_ppc_arglist (gfc_expr* e)
5785 gfc_expr* po;
5786 gfc_component *ppc;
5787 gfc_typebound_proc* tb;
5789 ppc = gfc_get_proc_ptr_comp (e);
5790 if (!ppc)
5791 return false;
5793 tb = ppc->tb;
5795 if (tb->error)
5796 return false;
5797 else if (tb->nopass)
5798 return true;
5800 po = extract_ppc_passed_object (e);
5801 if (!po)
5802 return false;
5804 /* F08:R739. */
5805 if (po->rank != 0)
5807 gfc_error ("Passed-object at %L must be scalar", &e->where);
5808 return false;
5811 /* F08:C611. */
5812 if (po->ts.type == BT_DERIVED && po->ts.u.derived->attr.abstract)
5814 gfc_error ("Base object for procedure-pointer component call at %L is of"
5815 " ABSTRACT type %qs", &e->where, po->ts.u.derived->name);
5816 return false;
5819 gcc_assert (tb->pass_arg_num > 0);
5820 e->value.compcall.actual = update_arglist_pass (e->value.compcall.actual, po,
5821 tb->pass_arg_num,
5822 tb->pass_arg);
5824 return true;
5828 /* Check that the object a TBP is called on is valid, i.e. it must not be
5829 of ABSTRACT type (as in subobject%abstract_parent%tbp()). */
5831 static bool
5832 check_typebound_baseobject (gfc_expr* e)
5834 gfc_expr* base;
5835 bool return_value = false;
5837 base = extract_compcall_passed_object (e);
5838 if (!base)
5839 return false;
5841 gcc_assert (base->ts.type == BT_DERIVED || base->ts.type == BT_CLASS);
5843 if (base->ts.type == BT_CLASS && !gfc_expr_attr (base).class_ok)
5844 return false;
5846 /* F08:C611. */
5847 if (base->ts.type == BT_DERIVED && base->ts.u.derived->attr.abstract)
5849 gfc_error ("Base object for type-bound procedure call at %L is of"
5850 " ABSTRACT type %qs", &e->where, base->ts.u.derived->name);
5851 goto cleanup;
5854 /* F08:C1230. If the procedure called is NOPASS,
5855 the base object must be scalar. */
5856 if (e->value.compcall.tbp->nopass && base->rank != 0)
5858 gfc_error ("Base object for NOPASS type-bound procedure call at %L must"
5859 " be scalar", &e->where);
5860 goto cleanup;
5863 return_value = true;
5865 cleanup:
5866 gfc_free_expr (base);
5867 return return_value;
5871 /* Resolve a call to a type-bound procedure, either function or subroutine,
5872 statically from the data in an EXPR_COMPCALL expression. The adapted
5873 arglist and the target-procedure symtree are returned. */
5875 static bool
5876 resolve_typebound_static (gfc_expr* e, gfc_symtree** target,
5877 gfc_actual_arglist** actual)
5879 gcc_assert (e->expr_type == EXPR_COMPCALL);
5880 gcc_assert (!e->value.compcall.tbp->is_generic);
5882 /* Update the actual arglist for PASS. */
5883 if (!update_compcall_arglist (e))
5884 return false;
5886 *actual = e->value.compcall.actual;
5887 *target = e->value.compcall.tbp->u.specific;
5889 gfc_free_ref_list (e->ref);
5890 e->ref = NULL;
5891 e->value.compcall.actual = NULL;
5893 /* If we find a deferred typebound procedure, check for derived types
5894 that an overriding typebound procedure has not been missed. */
5895 if (e->value.compcall.name
5896 && !e->value.compcall.tbp->non_overridable
5897 && e->value.compcall.base_object
5898 && e->value.compcall.base_object->ts.type == BT_DERIVED)
5900 gfc_symtree *st;
5901 gfc_symbol *derived;
5903 /* Use the derived type of the base_object. */
5904 derived = e->value.compcall.base_object->ts.u.derived;
5905 st = NULL;
5907 /* If necessary, go through the inheritance chain. */
5908 while (!st && derived)
5910 /* Look for the typebound procedure 'name'. */
5911 if (derived->f2k_derived && derived->f2k_derived->tb_sym_root)
5912 st = gfc_find_symtree (derived->f2k_derived->tb_sym_root,
5913 e->value.compcall.name);
5914 if (!st)
5915 derived = gfc_get_derived_super_type (derived);
5918 /* Now find the specific name in the derived type namespace. */
5919 if (st && st->n.tb && st->n.tb->u.specific)
5920 gfc_find_sym_tree (st->n.tb->u.specific->name,
5921 derived->ns, 1, &st);
5922 if (st)
5923 *target = st;
5925 return true;
5929 /* Get the ultimate declared type from an expression. In addition,
5930 return the last class/derived type reference and the copy of the
5931 reference list. If check_types is set true, derived types are
5932 identified as well as class references. */
5933 static gfc_symbol*
5934 get_declared_from_expr (gfc_ref **class_ref, gfc_ref **new_ref,
5935 gfc_expr *e, bool check_types)
5937 gfc_symbol *declared;
5938 gfc_ref *ref;
5940 declared = NULL;
5941 if (class_ref)
5942 *class_ref = NULL;
5943 if (new_ref)
5944 *new_ref = gfc_copy_ref (e->ref);
5946 for (ref = e->ref; ref; ref = ref->next)
5948 if (ref->type != REF_COMPONENT)
5949 continue;
5951 if ((ref->u.c.component->ts.type == BT_CLASS
5952 || (check_types && gfc_bt_struct (ref->u.c.component->ts.type)))
5953 && ref->u.c.component->attr.flavor != FL_PROCEDURE)
5955 declared = ref->u.c.component->ts.u.derived;
5956 if (class_ref)
5957 *class_ref = ref;
5961 if (declared == NULL)
5962 declared = e->symtree->n.sym->ts.u.derived;
5964 return declared;
5968 /* Given an EXPR_COMPCALL calling a GENERIC typebound procedure, figure out
5969 which of the specific bindings (if any) matches the arglist and transform
5970 the expression into a call of that binding. */
5972 static bool
5973 resolve_typebound_generic_call (gfc_expr* e, const char **name)
5975 gfc_typebound_proc* genproc;
5976 const char* genname;
5977 gfc_symtree *st;
5978 gfc_symbol *derived;
5980 gcc_assert (e->expr_type == EXPR_COMPCALL);
5981 genname = e->value.compcall.name;
5982 genproc = e->value.compcall.tbp;
5984 if (!genproc->is_generic)
5985 return true;
5987 /* Try the bindings on this type and in the inheritance hierarchy. */
5988 for (; genproc; genproc = genproc->overridden)
5990 gfc_tbp_generic* g;
5992 gcc_assert (genproc->is_generic);
5993 for (g = genproc->u.generic; g; g = g->next)
5995 gfc_symbol* target;
5996 gfc_actual_arglist* args;
5997 bool matches;
5999 gcc_assert (g->specific);
6001 if (g->specific->error)
6002 continue;
6004 target = g->specific->u.specific->n.sym;
6006 /* Get the right arglist by handling PASS/NOPASS. */
6007 args = gfc_copy_actual_arglist (e->value.compcall.actual);
6008 if (!g->specific->nopass)
6010 gfc_expr* po;
6011 po = extract_compcall_passed_object (e);
6012 if (!po)
6014 gfc_free_actual_arglist (args);
6015 return false;
6018 gcc_assert (g->specific->pass_arg_num > 0);
6019 gcc_assert (!g->specific->error);
6020 args = update_arglist_pass (args, po, g->specific->pass_arg_num,
6021 g->specific->pass_arg);
6023 resolve_actual_arglist (args, target->attr.proc,
6024 is_external_proc (target)
6025 && gfc_sym_get_dummy_args (target) == NULL);
6027 /* Check if this arglist matches the formal. */
6028 matches = gfc_arglist_matches_symbol (&args, target);
6030 /* Clean up and break out of the loop if we've found it. */
6031 gfc_free_actual_arglist (args);
6032 if (matches)
6034 e->value.compcall.tbp = g->specific;
6035 genname = g->specific_st->name;
6036 /* Pass along the name for CLASS methods, where the vtab
6037 procedure pointer component has to be referenced. */
6038 if (name)
6039 *name = genname;
6040 goto success;
6045 /* Nothing matching found! */
6046 gfc_error ("Found no matching specific binding for the call to the GENERIC"
6047 " %qs at %L", genname, &e->where);
6048 return false;
6050 success:
6051 /* Make sure that we have the right specific instance for the name. */
6052 derived = get_declared_from_expr (NULL, NULL, e, true);
6054 st = gfc_find_typebound_proc (derived, NULL, genname, true, &e->where);
6055 if (st)
6056 e->value.compcall.tbp = st->n.tb;
6058 return true;
6062 /* Resolve a call to a type-bound subroutine. */
6064 static bool
6065 resolve_typebound_call (gfc_code* c, const char **name, bool *overridable)
6067 gfc_actual_arglist* newactual;
6068 gfc_symtree* target;
6070 /* Check that's really a SUBROUTINE. */
6071 if (!c->expr1->value.compcall.tbp->subroutine)
6073 gfc_error ("%qs at %L should be a SUBROUTINE",
6074 c->expr1->value.compcall.name, &c->loc);
6075 return false;
6078 if (!check_typebound_baseobject (c->expr1))
6079 return false;
6081 /* Pass along the name for CLASS methods, where the vtab
6082 procedure pointer component has to be referenced. */
6083 if (name)
6084 *name = c->expr1->value.compcall.name;
6086 if (!resolve_typebound_generic_call (c->expr1, name))
6087 return false;
6089 /* Pass along the NON_OVERRIDABLE attribute of the specific TBP. */
6090 if (overridable)
6091 *overridable = !c->expr1->value.compcall.tbp->non_overridable;
6093 /* Transform into an ordinary EXEC_CALL for now. */
6095 if (!resolve_typebound_static (c->expr1, &target, &newactual))
6096 return false;
6098 c->ext.actual = newactual;
6099 c->symtree = target;
6100 c->op = (c->expr1->value.compcall.assign ? EXEC_ASSIGN_CALL : EXEC_CALL);
6102 gcc_assert (!c->expr1->ref && !c->expr1->value.compcall.actual);
6104 gfc_free_expr (c->expr1);
6105 c->expr1 = gfc_get_expr ();
6106 c->expr1->expr_type = EXPR_FUNCTION;
6107 c->expr1->symtree = target;
6108 c->expr1->where = c->loc;
6110 return resolve_call (c);
6114 /* Resolve a component-call expression. */
6115 static bool
6116 resolve_compcall (gfc_expr* e, const char **name)
6118 gfc_actual_arglist* newactual;
6119 gfc_symtree* target;
6121 /* Check that's really a FUNCTION. */
6122 if (!e->value.compcall.tbp->function)
6124 gfc_error ("%qs at %L should be a FUNCTION",
6125 e->value.compcall.name, &e->where);
6126 return false;
6129 /* These must not be assign-calls! */
6130 gcc_assert (!e->value.compcall.assign);
6132 if (!check_typebound_baseobject (e))
6133 return false;
6135 /* Pass along the name for CLASS methods, where the vtab
6136 procedure pointer component has to be referenced. */
6137 if (name)
6138 *name = e->value.compcall.name;
6140 if (!resolve_typebound_generic_call (e, name))
6141 return false;
6142 gcc_assert (!e->value.compcall.tbp->is_generic);
6144 /* Take the rank from the function's symbol. */
6145 if (e->value.compcall.tbp->u.specific->n.sym->as)
6146 e->rank = e->value.compcall.tbp->u.specific->n.sym->as->rank;
6148 /* For now, we simply transform it into an EXPR_FUNCTION call with the same
6149 arglist to the TBP's binding target. */
6151 if (!resolve_typebound_static (e, &target, &newactual))
6152 return false;
6154 e->value.function.actual = newactual;
6155 e->value.function.name = NULL;
6156 e->value.function.esym = target->n.sym;
6157 e->value.function.isym = NULL;
6158 e->symtree = target;
6159 e->ts = target->n.sym->ts;
6160 e->expr_type = EXPR_FUNCTION;
6162 /* Resolution is not necessary if this is a class subroutine; this
6163 function only has to identify the specific proc. Resolution of
6164 the call will be done next in resolve_typebound_call. */
6165 return gfc_resolve_expr (e);
6169 static bool resolve_fl_derived (gfc_symbol *sym);
6172 /* Resolve a typebound function, or 'method'. First separate all
6173 the non-CLASS references by calling resolve_compcall directly. */
6175 static bool
6176 resolve_typebound_function (gfc_expr* e)
6178 gfc_symbol *declared;
6179 gfc_component *c;
6180 gfc_ref *new_ref;
6181 gfc_ref *class_ref;
6182 gfc_symtree *st;
6183 const char *name;
6184 gfc_typespec ts;
6185 gfc_expr *expr;
6186 bool overridable;
6188 st = e->symtree;
6190 /* Deal with typebound operators for CLASS objects. */
6191 expr = e->value.compcall.base_object;
6192 overridable = !e->value.compcall.tbp->non_overridable;
6193 if (expr && expr->ts.type == BT_CLASS && e->value.compcall.name)
6195 /* If the base_object is not a variable, the corresponding actual
6196 argument expression must be stored in e->base_expression so
6197 that the corresponding tree temporary can be used as the base
6198 object in gfc_conv_procedure_call. */
6199 if (expr->expr_type != EXPR_VARIABLE)
6201 gfc_actual_arglist *args;
6203 for (args= e->value.function.actual; args; args = args->next)
6205 if (expr == args->expr)
6206 expr = args->expr;
6210 /* Since the typebound operators are generic, we have to ensure
6211 that any delays in resolution are corrected and that the vtab
6212 is present. */
6213 ts = expr->ts;
6214 declared = ts.u.derived;
6215 c = gfc_find_component (declared, "_vptr", true, true, NULL);
6216 if (c->ts.u.derived == NULL)
6217 c->ts.u.derived = gfc_find_derived_vtab (declared);
6219 if (!resolve_compcall (e, &name))
6220 return false;
6222 /* Use the generic name if it is there. */
6223 name = name ? name : e->value.function.esym->name;
6224 e->symtree = expr->symtree;
6225 e->ref = gfc_copy_ref (expr->ref);
6226 get_declared_from_expr (&class_ref, NULL, e, false);
6228 /* Trim away the extraneous references that emerge from nested
6229 use of interface.c (extend_expr). */
6230 if (class_ref && class_ref->next)
6232 gfc_free_ref_list (class_ref->next);
6233 class_ref->next = NULL;
6235 else if (e->ref && !class_ref && expr->ts.type != BT_CLASS)
6237 gfc_free_ref_list (e->ref);
6238 e->ref = NULL;
6241 gfc_add_vptr_component (e);
6242 gfc_add_component_ref (e, name);
6243 e->value.function.esym = NULL;
6244 if (expr->expr_type != EXPR_VARIABLE)
6245 e->base_expr = expr;
6246 return true;
6249 if (st == NULL)
6250 return resolve_compcall (e, NULL);
6252 if (!resolve_ref (e))
6253 return false;
6255 /* Get the CLASS declared type. */
6256 declared = get_declared_from_expr (&class_ref, &new_ref, e, true);
6258 if (!resolve_fl_derived (declared))
6259 return false;
6261 /* Weed out cases of the ultimate component being a derived type. */
6262 if ((class_ref && gfc_bt_struct (class_ref->u.c.component->ts.type))
6263 || (!class_ref && st->n.sym->ts.type != BT_CLASS))
6265 gfc_free_ref_list (new_ref);
6266 return resolve_compcall (e, NULL);
6269 c = gfc_find_component (declared, "_data", true, true, NULL);
6270 declared = c->ts.u.derived;
6272 /* Treat the call as if it is a typebound procedure, in order to roll
6273 out the correct name for the specific function. */
6274 if (!resolve_compcall (e, &name))
6276 gfc_free_ref_list (new_ref);
6277 return false;
6279 ts = e->ts;
6281 if (overridable)
6283 /* Convert the expression to a procedure pointer component call. */
6284 e->value.function.esym = NULL;
6285 e->symtree = st;
6287 if (new_ref)
6288 e->ref = new_ref;
6290 /* '_vptr' points to the vtab, which contains the procedure pointers. */
6291 gfc_add_vptr_component (e);
6292 gfc_add_component_ref (e, name);
6294 /* Recover the typespec for the expression. This is really only
6295 necessary for generic procedures, where the additional call
6296 to gfc_add_component_ref seems to throw the collection of the
6297 correct typespec. */
6298 e->ts = ts;
6300 else if (new_ref)
6301 gfc_free_ref_list (new_ref);
6303 return true;
6306 /* Resolve a typebound subroutine, or 'method'. First separate all
6307 the non-CLASS references by calling resolve_typebound_call
6308 directly. */
6310 static bool
6311 resolve_typebound_subroutine (gfc_code *code)
6313 gfc_symbol *declared;
6314 gfc_component *c;
6315 gfc_ref *new_ref;
6316 gfc_ref *class_ref;
6317 gfc_symtree *st;
6318 const char *name;
6319 gfc_typespec ts;
6320 gfc_expr *expr;
6321 bool overridable;
6323 st = code->expr1->symtree;
6325 /* Deal with typebound operators for CLASS objects. */
6326 expr = code->expr1->value.compcall.base_object;
6327 overridable = !code->expr1->value.compcall.tbp->non_overridable;
6328 if (expr && expr->ts.type == BT_CLASS && code->expr1->value.compcall.name)
6330 /* If the base_object is not a variable, the corresponding actual
6331 argument expression must be stored in e->base_expression so
6332 that the corresponding tree temporary can be used as the base
6333 object in gfc_conv_procedure_call. */
6334 if (expr->expr_type != EXPR_VARIABLE)
6336 gfc_actual_arglist *args;
6338 args= code->expr1->value.function.actual;
6339 for (; args; args = args->next)
6340 if (expr == args->expr)
6341 expr = args->expr;
6344 /* Since the typebound operators are generic, we have to ensure
6345 that any delays in resolution are corrected and that the vtab
6346 is present. */
6347 declared = expr->ts.u.derived;
6348 c = gfc_find_component (declared, "_vptr", true, true, NULL);
6349 if (c->ts.u.derived == NULL)
6350 c->ts.u.derived = gfc_find_derived_vtab (declared);
6352 if (!resolve_typebound_call (code, &name, NULL))
6353 return false;
6355 /* Use the generic name if it is there. */
6356 name = name ? name : code->expr1->value.function.esym->name;
6357 code->expr1->symtree = expr->symtree;
6358 code->expr1->ref = gfc_copy_ref (expr->ref);
6360 /* Trim away the extraneous references that emerge from nested
6361 use of interface.c (extend_expr). */
6362 get_declared_from_expr (&class_ref, NULL, code->expr1, false);
6363 if (class_ref && class_ref->next)
6365 gfc_free_ref_list (class_ref->next);
6366 class_ref->next = NULL;
6368 else if (code->expr1->ref && !class_ref)
6370 gfc_free_ref_list (code->expr1->ref);
6371 code->expr1->ref = NULL;
6374 /* Now use the procedure in the vtable. */
6375 gfc_add_vptr_component (code->expr1);
6376 gfc_add_component_ref (code->expr1, name);
6377 code->expr1->value.function.esym = NULL;
6378 if (expr->expr_type != EXPR_VARIABLE)
6379 code->expr1->base_expr = expr;
6380 return true;
6383 if (st == NULL)
6384 return resolve_typebound_call (code, NULL, NULL);
6386 if (!resolve_ref (code->expr1))
6387 return false;
6389 /* Get the CLASS declared type. */
6390 get_declared_from_expr (&class_ref, &new_ref, code->expr1, true);
6392 /* Weed out cases of the ultimate component being a derived type. */
6393 if ((class_ref && gfc_bt_struct (class_ref->u.c.component->ts.type))
6394 || (!class_ref && st->n.sym->ts.type != BT_CLASS))
6396 gfc_free_ref_list (new_ref);
6397 return resolve_typebound_call (code, NULL, NULL);
6400 if (!resolve_typebound_call (code, &name, &overridable))
6402 gfc_free_ref_list (new_ref);
6403 return false;
6405 ts = code->expr1->ts;
6407 if (overridable)
6409 /* Convert the expression to a procedure pointer component call. */
6410 code->expr1->value.function.esym = NULL;
6411 code->expr1->symtree = st;
6413 if (new_ref)
6414 code->expr1->ref = new_ref;
6416 /* '_vptr' points to the vtab, which contains the procedure pointers. */
6417 gfc_add_vptr_component (code->expr1);
6418 gfc_add_component_ref (code->expr1, name);
6420 /* Recover the typespec for the expression. This is really only
6421 necessary for generic procedures, where the additional call
6422 to gfc_add_component_ref seems to throw the collection of the
6423 correct typespec. */
6424 code->expr1->ts = ts;
6426 else if (new_ref)
6427 gfc_free_ref_list (new_ref);
6429 return true;
6433 /* Resolve a CALL to a Procedure Pointer Component (Subroutine). */
6435 static bool
6436 resolve_ppc_call (gfc_code* c)
6438 gfc_component *comp;
6440 comp = gfc_get_proc_ptr_comp (c->expr1);
6441 gcc_assert (comp != NULL);
6443 c->resolved_sym = c->expr1->symtree->n.sym;
6444 c->expr1->expr_type = EXPR_VARIABLE;
6446 if (!comp->attr.subroutine)
6447 gfc_add_subroutine (&comp->attr, comp->name, &c->expr1->where);
6449 if (!resolve_ref (c->expr1))
6450 return false;
6452 if (!update_ppc_arglist (c->expr1))
6453 return false;
6455 c->ext.actual = c->expr1->value.compcall.actual;
6457 if (!resolve_actual_arglist (c->ext.actual, comp->attr.proc,
6458 !(comp->ts.interface
6459 && comp->ts.interface->formal)))
6460 return false;
6462 if (!pure_subroutine (comp->ts.interface, comp->name, &c->expr1->where))
6463 return false;
6465 gfc_ppc_use (comp, &c->expr1->value.compcall.actual, &c->expr1->where);
6467 return true;
6471 /* Resolve a Function Call to a Procedure Pointer Component (Function). */
6473 static bool
6474 resolve_expr_ppc (gfc_expr* e)
6476 gfc_component *comp;
6478 comp = gfc_get_proc_ptr_comp (e);
6479 gcc_assert (comp != NULL);
6481 /* Convert to EXPR_FUNCTION. */
6482 e->expr_type = EXPR_FUNCTION;
6483 e->value.function.isym = NULL;
6484 e->value.function.actual = e->value.compcall.actual;
6485 e->ts = comp->ts;
6486 if (comp->as != NULL)
6487 e->rank = comp->as->rank;
6489 if (!comp->attr.function)
6490 gfc_add_function (&comp->attr, comp->name, &e->where);
6492 if (!resolve_ref (e))
6493 return false;
6495 if (!resolve_actual_arglist (e->value.function.actual, comp->attr.proc,
6496 !(comp->ts.interface
6497 && comp->ts.interface->formal)))
6498 return false;
6500 if (!update_ppc_arglist (e))
6501 return false;
6503 if (!check_pure_function(e))
6504 return false;
6506 gfc_ppc_use (comp, &e->value.compcall.actual, &e->where);
6508 return true;
6512 static bool
6513 gfc_is_expandable_expr (gfc_expr *e)
6515 gfc_constructor *con;
6517 if (e->expr_type == EXPR_ARRAY)
6519 /* Traverse the constructor looking for variables that are flavor
6520 parameter. Parameters must be expanded since they are fully used at
6521 compile time. */
6522 con = gfc_constructor_first (e->value.constructor);
6523 for (; con; con = gfc_constructor_next (con))
6525 if (con->expr->expr_type == EXPR_VARIABLE
6526 && con->expr->symtree
6527 && (con->expr->symtree->n.sym->attr.flavor == FL_PARAMETER
6528 || con->expr->symtree->n.sym->attr.flavor == FL_VARIABLE))
6529 return true;
6530 if (con->expr->expr_type == EXPR_ARRAY
6531 && gfc_is_expandable_expr (con->expr))
6532 return true;
6536 return false;
6540 /* Sometimes variables in specification expressions of the result
6541 of module procedures in submodules wind up not being the 'real'
6542 dummy. Find this, if possible, in the namespace of the first
6543 formal argument. */
6545 static void
6546 fixup_unique_dummy (gfc_expr *e)
6548 gfc_symtree *st = NULL;
6549 gfc_symbol *s = NULL;
6551 if (e->symtree->n.sym->ns->proc_name
6552 && e->symtree->n.sym->ns->proc_name->formal)
6553 s = e->symtree->n.sym->ns->proc_name->formal->sym;
6555 if (s != NULL)
6556 st = gfc_find_symtree (s->ns->sym_root, e->symtree->n.sym->name);
6558 if (st != NULL
6559 && st->n.sym != NULL
6560 && st->n.sym->attr.dummy)
6561 e->symtree = st;
6564 /* Resolve an expression. That is, make sure that types of operands agree
6565 with their operators, intrinsic operators are converted to function calls
6566 for overloaded types and unresolved function references are resolved. */
6568 bool
6569 gfc_resolve_expr (gfc_expr *e)
6571 bool t;
6572 bool inquiry_save, actual_arg_save, first_actual_arg_save;
6574 if (e == NULL)
6575 return true;
6577 /* inquiry_argument only applies to variables. */
6578 inquiry_save = inquiry_argument;
6579 actual_arg_save = actual_arg;
6580 first_actual_arg_save = first_actual_arg;
6582 if (e->expr_type != EXPR_VARIABLE)
6584 inquiry_argument = false;
6585 actual_arg = false;
6586 first_actual_arg = false;
6588 else if (e->symtree != NULL
6589 && *e->symtree->name == '@'
6590 && e->symtree->n.sym->attr.dummy)
6592 /* Deal with submodule specification expressions that are not
6593 found to be referenced in module.c(read_cleanup). */
6594 fixup_unique_dummy (e);
6597 switch (e->expr_type)
6599 case EXPR_OP:
6600 t = resolve_operator (e);
6601 break;
6603 case EXPR_FUNCTION:
6604 case EXPR_VARIABLE:
6606 if (check_host_association (e))
6607 t = resolve_function (e);
6608 else
6609 t = resolve_variable (e);
6611 if (e->ts.type == BT_CHARACTER && e->ts.u.cl == NULL && e->ref
6612 && e->ref->type != REF_SUBSTRING)
6613 gfc_resolve_substring_charlen (e);
6615 break;
6617 case EXPR_COMPCALL:
6618 t = resolve_typebound_function (e);
6619 break;
6621 case EXPR_SUBSTRING:
6622 t = resolve_ref (e);
6623 break;
6625 case EXPR_CONSTANT:
6626 case EXPR_NULL:
6627 t = true;
6628 break;
6630 case EXPR_PPC:
6631 t = resolve_expr_ppc (e);
6632 break;
6634 case EXPR_ARRAY:
6635 t = false;
6636 if (!resolve_ref (e))
6637 break;
6639 t = gfc_resolve_array_constructor (e);
6640 /* Also try to expand a constructor. */
6641 if (t)
6643 expression_rank (e);
6644 if (gfc_is_constant_expr (e) || gfc_is_expandable_expr (e))
6645 gfc_expand_constructor (e, false);
6648 /* This provides the opportunity for the length of constructors with
6649 character valued function elements to propagate the string length
6650 to the expression. */
6651 if (t && e->ts.type == BT_CHARACTER)
6653 /* For efficiency, we call gfc_expand_constructor for BT_CHARACTER
6654 here rather then add a duplicate test for it above. */
6655 gfc_expand_constructor (e, false);
6656 t = gfc_resolve_character_array_constructor (e);
6659 break;
6661 case EXPR_STRUCTURE:
6662 t = resolve_ref (e);
6663 if (!t)
6664 break;
6666 t = resolve_structure_cons (e, 0);
6667 if (!t)
6668 break;
6670 t = gfc_simplify_expr (e, 0);
6671 break;
6673 default:
6674 gfc_internal_error ("gfc_resolve_expr(): Bad expression type");
6677 if (e->ts.type == BT_CHARACTER && t && !e->ts.u.cl)
6678 fixup_charlen (e);
6680 inquiry_argument = inquiry_save;
6681 actual_arg = actual_arg_save;
6682 first_actual_arg = first_actual_arg_save;
6684 return t;
6688 /* Resolve an expression from an iterator. They must be scalar and have
6689 INTEGER or (optionally) REAL type. */
6691 static bool
6692 gfc_resolve_iterator_expr (gfc_expr *expr, bool real_ok,
6693 const char *name_msgid)
6695 if (!gfc_resolve_expr (expr))
6696 return false;
6698 if (expr->rank != 0)
6700 gfc_error ("%s at %L must be a scalar", _(name_msgid), &expr->where);
6701 return false;
6704 if (expr->ts.type != BT_INTEGER)
6706 if (expr->ts.type == BT_REAL)
6708 if (real_ok)
6709 return gfc_notify_std (GFC_STD_F95_DEL,
6710 "%s at %L must be integer",
6711 _(name_msgid), &expr->where);
6712 else
6714 gfc_error ("%s at %L must be INTEGER", _(name_msgid),
6715 &expr->where);
6716 return false;
6719 else
6721 gfc_error ("%s at %L must be INTEGER", _(name_msgid), &expr->where);
6722 return false;
6725 return true;
6729 /* Resolve the expressions in an iterator structure. If REAL_OK is
6730 false allow only INTEGER type iterators, otherwise allow REAL types.
6731 Set own_scope to true for ac-implied-do and data-implied-do as those
6732 have a separate scope such that, e.g., a INTENT(IN) doesn't apply. */
6734 bool
6735 gfc_resolve_iterator (gfc_iterator *iter, bool real_ok, bool own_scope)
6737 if (!gfc_resolve_iterator_expr (iter->var, real_ok, "Loop variable"))
6738 return false;
6740 if (!gfc_check_vardef_context (iter->var, false, false, own_scope,
6741 _("iterator variable")))
6742 return false;
6744 if (!gfc_resolve_iterator_expr (iter->start, real_ok,
6745 "Start expression in DO loop"))
6746 return false;
6748 if (!gfc_resolve_iterator_expr (iter->end, real_ok,
6749 "End expression in DO loop"))
6750 return false;
6752 if (!gfc_resolve_iterator_expr (iter->step, real_ok,
6753 "Step expression in DO loop"))
6754 return false;
6756 if (iter->step->expr_type == EXPR_CONSTANT)
6758 if ((iter->step->ts.type == BT_INTEGER
6759 && mpz_cmp_ui (iter->step->value.integer, 0) == 0)
6760 || (iter->step->ts.type == BT_REAL
6761 && mpfr_sgn (iter->step->value.real) == 0))
6763 gfc_error ("Step expression in DO loop at %L cannot be zero",
6764 &iter->step->where);
6765 return false;
6769 /* Convert start, end, and step to the same type as var. */
6770 if (iter->start->ts.kind != iter->var->ts.kind
6771 || iter->start->ts.type != iter->var->ts.type)
6772 gfc_convert_type (iter->start, &iter->var->ts, 1);
6774 if (iter->end->ts.kind != iter->var->ts.kind
6775 || iter->end->ts.type != iter->var->ts.type)
6776 gfc_convert_type (iter->end, &iter->var->ts, 1);
6778 if (iter->step->ts.kind != iter->var->ts.kind
6779 || iter->step->ts.type != iter->var->ts.type)
6780 gfc_convert_type (iter->step, &iter->var->ts, 1);
6782 if (iter->start->expr_type == EXPR_CONSTANT
6783 && iter->end->expr_type == EXPR_CONSTANT
6784 && iter->step->expr_type == EXPR_CONSTANT)
6786 int sgn, cmp;
6787 if (iter->start->ts.type == BT_INTEGER)
6789 sgn = mpz_cmp_ui (iter->step->value.integer, 0);
6790 cmp = mpz_cmp (iter->end->value.integer, iter->start->value.integer);
6792 else
6794 sgn = mpfr_sgn (iter->step->value.real);
6795 cmp = mpfr_cmp (iter->end->value.real, iter->start->value.real);
6797 if (warn_zerotrip && ((sgn > 0 && cmp < 0) || (sgn < 0 && cmp > 0)))
6798 gfc_warning (OPT_Wzerotrip,
6799 "DO loop at %L will be executed zero times",
6800 &iter->step->where);
6803 if (iter->end->expr_type == EXPR_CONSTANT
6804 && iter->end->ts.type == BT_INTEGER
6805 && iter->step->expr_type == EXPR_CONSTANT
6806 && iter->step->ts.type == BT_INTEGER
6807 && (mpz_cmp_si (iter->step->value.integer, -1L) == 0
6808 || mpz_cmp_si (iter->step->value.integer, 1L) == 0))
6810 bool is_step_positive = mpz_cmp_ui (iter->step->value.integer, 1) == 0;
6811 int k = gfc_validate_kind (BT_INTEGER, iter->end->ts.kind, false);
6813 if (is_step_positive
6814 && mpz_cmp (iter->end->value.integer, gfc_integer_kinds[k].huge) == 0)
6815 gfc_warning (OPT_Wundefined_do_loop,
6816 "DO loop at %L is undefined as it overflows",
6817 &iter->step->where);
6818 else if (!is_step_positive
6819 && mpz_cmp (iter->end->value.integer,
6820 gfc_integer_kinds[k].min_int) == 0)
6821 gfc_warning (OPT_Wundefined_do_loop,
6822 "DO loop at %L is undefined as it underflows",
6823 &iter->step->where);
6826 return true;
6830 /* Traversal function for find_forall_index. f == 2 signals that
6831 that variable itself is not to be checked - only the references. */
6833 static bool
6834 forall_index (gfc_expr *expr, gfc_symbol *sym, int *f)
6836 if (expr->expr_type != EXPR_VARIABLE)
6837 return false;
6839 /* A scalar assignment */
6840 if (!expr->ref || *f == 1)
6842 if (expr->symtree->n.sym == sym)
6843 return true;
6844 else
6845 return false;
6848 if (*f == 2)
6849 *f = 1;
6850 return false;
6854 /* Check whether the FORALL index appears in the expression or not.
6855 Returns true if SYM is found in EXPR. */
6857 bool
6858 find_forall_index (gfc_expr *expr, gfc_symbol *sym, int f)
6860 if (gfc_traverse_expr (expr, sym, forall_index, f))
6861 return true;
6862 else
6863 return false;
6867 /* Resolve a list of FORALL iterators. The FORALL index-name is constrained
6868 to be a scalar INTEGER variable. The subscripts and stride are scalar
6869 INTEGERs, and if stride is a constant it must be nonzero.
6870 Furthermore "A subscript or stride in a forall-triplet-spec shall
6871 not contain a reference to any index-name in the
6872 forall-triplet-spec-list in which it appears." (7.5.4.1) */
6874 static void
6875 resolve_forall_iterators (gfc_forall_iterator *it)
6877 gfc_forall_iterator *iter, *iter2;
6879 for (iter = it; iter; iter = iter->next)
6881 if (gfc_resolve_expr (iter->var)
6882 && (iter->var->ts.type != BT_INTEGER || iter->var->rank != 0))
6883 gfc_error ("FORALL index-name at %L must be a scalar INTEGER",
6884 &iter->var->where);
6886 if (gfc_resolve_expr (iter->start)
6887 && (iter->start->ts.type != BT_INTEGER || iter->start->rank != 0))
6888 gfc_error ("FORALL start expression at %L must be a scalar INTEGER",
6889 &iter->start->where);
6890 if (iter->var->ts.kind != iter->start->ts.kind)
6891 gfc_convert_type (iter->start, &iter->var->ts, 1);
6893 if (gfc_resolve_expr (iter->end)
6894 && (iter->end->ts.type != BT_INTEGER || iter->end->rank != 0))
6895 gfc_error ("FORALL end expression at %L must be a scalar INTEGER",
6896 &iter->end->where);
6897 if (iter->var->ts.kind != iter->end->ts.kind)
6898 gfc_convert_type (iter->end, &iter->var->ts, 1);
6900 if (gfc_resolve_expr (iter->stride))
6902 if (iter->stride->ts.type != BT_INTEGER || iter->stride->rank != 0)
6903 gfc_error ("FORALL stride expression at %L must be a scalar %s",
6904 &iter->stride->where, "INTEGER");
6906 if (iter->stride->expr_type == EXPR_CONSTANT
6907 && mpz_cmp_ui (iter->stride->value.integer, 0) == 0)
6908 gfc_error ("FORALL stride expression at %L cannot be zero",
6909 &iter->stride->where);
6911 if (iter->var->ts.kind != iter->stride->ts.kind)
6912 gfc_convert_type (iter->stride, &iter->var->ts, 1);
6915 for (iter = it; iter; iter = iter->next)
6916 for (iter2 = iter; iter2; iter2 = iter2->next)
6918 if (find_forall_index (iter2->start, iter->var->symtree->n.sym, 0)
6919 || find_forall_index (iter2->end, iter->var->symtree->n.sym, 0)
6920 || find_forall_index (iter2->stride, iter->var->symtree->n.sym, 0))
6921 gfc_error ("FORALL index %qs may not appear in triplet "
6922 "specification at %L", iter->var->symtree->name,
6923 &iter2->start->where);
6928 /* Given a pointer to a symbol that is a derived type, see if it's
6929 inaccessible, i.e. if it's defined in another module and the components are
6930 PRIVATE. The search is recursive if necessary. Returns zero if no
6931 inaccessible components are found, nonzero otherwise. */
6933 static int
6934 derived_inaccessible (gfc_symbol *sym)
6936 gfc_component *c;
6938 if (sym->attr.use_assoc && sym->attr.private_comp)
6939 return 1;
6941 for (c = sym->components; c; c = c->next)
6943 /* Prevent an infinite loop through this function. */
6944 if (c->ts.type == BT_DERIVED && c->attr.pointer
6945 && sym == c->ts.u.derived)
6946 continue;
6948 if (c->ts.type == BT_DERIVED && derived_inaccessible (c->ts.u.derived))
6949 return 1;
6952 return 0;
6956 /* Resolve the argument of a deallocate expression. The expression must be
6957 a pointer or a full array. */
6959 static bool
6960 resolve_deallocate_expr (gfc_expr *e)
6962 symbol_attribute attr;
6963 int allocatable, pointer;
6964 gfc_ref *ref;
6965 gfc_symbol *sym;
6966 gfc_component *c;
6967 bool unlimited;
6969 if (!gfc_resolve_expr (e))
6970 return false;
6972 if (e->expr_type != EXPR_VARIABLE)
6973 goto bad;
6975 sym = e->symtree->n.sym;
6976 unlimited = UNLIMITED_POLY(sym);
6978 if (sym->ts.type == BT_CLASS)
6980 allocatable = CLASS_DATA (sym)->attr.allocatable;
6981 pointer = CLASS_DATA (sym)->attr.class_pointer;
6983 else
6985 allocatable = sym->attr.allocatable;
6986 pointer = sym->attr.pointer;
6988 for (ref = e->ref; ref; ref = ref->next)
6990 switch (ref->type)
6992 case REF_ARRAY:
6993 if (ref->u.ar.type != AR_FULL
6994 && !(ref->u.ar.type == AR_ELEMENT && ref->u.ar.as->rank == 0
6995 && ref->u.ar.codimen && gfc_ref_this_image (ref)))
6996 allocatable = 0;
6997 break;
6999 case REF_COMPONENT:
7000 c = ref->u.c.component;
7001 if (c->ts.type == BT_CLASS)
7003 allocatable = CLASS_DATA (c)->attr.allocatable;
7004 pointer = CLASS_DATA (c)->attr.class_pointer;
7006 else
7008 allocatable = c->attr.allocatable;
7009 pointer = c->attr.pointer;
7011 break;
7013 case REF_SUBSTRING:
7014 allocatable = 0;
7015 break;
7019 attr = gfc_expr_attr (e);
7021 if (allocatable == 0 && attr.pointer == 0 && !unlimited)
7023 bad:
7024 gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",
7025 &e->where);
7026 return false;
7029 /* F2008, C644. */
7030 if (gfc_is_coindexed (e))
7032 gfc_error ("Coindexed allocatable object at %L", &e->where);
7033 return false;
7036 if (pointer
7037 && !gfc_check_vardef_context (e, true, true, false,
7038 _("DEALLOCATE object")))
7039 return false;
7040 if (!gfc_check_vardef_context (e, false, true, false,
7041 _("DEALLOCATE object")))
7042 return false;
7044 return true;
7048 /* Returns true if the expression e contains a reference to the symbol sym. */
7049 static bool
7050 sym_in_expr (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
7052 if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym == sym)
7053 return true;
7055 return false;
7058 bool
7059 gfc_find_sym_in_expr (gfc_symbol *sym, gfc_expr *e)
7061 return gfc_traverse_expr (e, sym, sym_in_expr, 0);
7065 /* Given the expression node e for an allocatable/pointer of derived type to be
7066 allocated, get the expression node to be initialized afterwards (needed for
7067 derived types with default initializers, and derived types with allocatable
7068 components that need nullification.) */
7070 gfc_expr *
7071 gfc_expr_to_initialize (gfc_expr *e)
7073 gfc_expr *result;
7074 gfc_ref *ref;
7075 int i;
7077 result = gfc_copy_expr (e);
7079 /* Change the last array reference from AR_ELEMENT to AR_FULL. */
7080 for (ref = result->ref; ref; ref = ref->next)
7081 if (ref->type == REF_ARRAY && ref->next == NULL)
7083 ref->u.ar.type = AR_FULL;
7085 for (i = 0; i < ref->u.ar.dimen; i++)
7086 ref->u.ar.start[i] = ref->u.ar.end[i] = ref->u.ar.stride[i] = NULL;
7088 break;
7091 gfc_free_shape (&result->shape, result->rank);
7093 /* Recalculate rank, shape, etc. */
7094 gfc_resolve_expr (result);
7095 return result;
7099 /* If the last ref of an expression is an array ref, return a copy of the
7100 expression with that one removed. Otherwise, a copy of the original
7101 expression. This is used for allocate-expressions and pointer assignment
7102 LHS, where there may be an array specification that needs to be stripped
7103 off when using gfc_check_vardef_context. */
7105 static gfc_expr*
7106 remove_last_array_ref (gfc_expr* e)
7108 gfc_expr* e2;
7109 gfc_ref** r;
7111 e2 = gfc_copy_expr (e);
7112 for (r = &e2->ref; *r; r = &(*r)->next)
7113 if ((*r)->type == REF_ARRAY && !(*r)->next)
7115 gfc_free_ref_list (*r);
7116 *r = NULL;
7117 break;
7120 return e2;
7124 /* Used in resolve_allocate_expr to check that a allocation-object and
7125 a source-expr are conformable. This does not catch all possible
7126 cases; in particular a runtime checking is needed. */
7128 static bool
7129 conformable_arrays (gfc_expr *e1, gfc_expr *e2)
7131 gfc_ref *tail;
7132 for (tail = e2->ref; tail && tail->next; tail = tail->next);
7134 /* First compare rank. */
7135 if ((tail && e1->rank != tail->u.ar.as->rank)
7136 || (!tail && e1->rank != e2->rank))
7138 gfc_error ("Source-expr at %L must be scalar or have the "
7139 "same rank as the allocate-object at %L",
7140 &e1->where, &e2->where);
7141 return false;
7144 if (e1->shape)
7146 int i;
7147 mpz_t s;
7149 mpz_init (s);
7151 for (i = 0; i < e1->rank; i++)
7153 if (tail->u.ar.start[i] == NULL)
7154 break;
7156 if (tail->u.ar.end[i])
7158 mpz_set (s, tail->u.ar.end[i]->value.integer);
7159 mpz_sub (s, s, tail->u.ar.start[i]->value.integer);
7160 mpz_add_ui (s, s, 1);
7162 else
7164 mpz_set (s, tail->u.ar.start[i]->value.integer);
7167 if (mpz_cmp (e1->shape[i], s) != 0)
7169 gfc_error ("Source-expr at %L and allocate-object at %L must "
7170 "have the same shape", &e1->where, &e2->where);
7171 mpz_clear (s);
7172 return false;
7176 mpz_clear (s);
7179 return true;
7183 /* Resolve the expression in an ALLOCATE statement, doing the additional
7184 checks to see whether the expression is OK or not. The expression must
7185 have a trailing array reference that gives the size of the array. */
7187 static bool
7188 resolve_allocate_expr (gfc_expr *e, gfc_code *code, bool *array_alloc_wo_spec)
7190 int i, pointer, allocatable, dimension, is_abstract;
7191 int codimension;
7192 bool coindexed;
7193 bool unlimited;
7194 symbol_attribute attr;
7195 gfc_ref *ref, *ref2;
7196 gfc_expr *e2;
7197 gfc_array_ref *ar;
7198 gfc_symbol *sym = NULL;
7199 gfc_alloc *a;
7200 gfc_component *c;
7201 bool t;
7203 /* Mark the utmost array component as being in allocate to allow DIMEN_STAR
7204 checking of coarrays. */
7205 for (ref = e->ref; ref; ref = ref->next)
7206 if (ref->next == NULL)
7207 break;
7209 if (ref && ref->type == REF_ARRAY)
7210 ref->u.ar.in_allocate = true;
7212 if (!gfc_resolve_expr (e))
7213 goto failure;
7215 /* Make sure the expression is allocatable or a pointer. If it is
7216 pointer, the next-to-last reference must be a pointer. */
7218 ref2 = NULL;
7219 if (e->symtree)
7220 sym = e->symtree->n.sym;
7222 /* Check whether ultimate component is abstract and CLASS. */
7223 is_abstract = 0;
7225 /* Is the allocate-object unlimited polymorphic? */
7226 unlimited = UNLIMITED_POLY(e);
7228 if (e->expr_type != EXPR_VARIABLE)
7230 allocatable = 0;
7231 attr = gfc_expr_attr (e);
7232 pointer = attr.pointer;
7233 dimension = attr.dimension;
7234 codimension = attr.codimension;
7236 else
7238 if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
7240 allocatable = CLASS_DATA (sym)->attr.allocatable;
7241 pointer = CLASS_DATA (sym)->attr.class_pointer;
7242 dimension = CLASS_DATA (sym)->attr.dimension;
7243 codimension = CLASS_DATA (sym)->attr.codimension;
7244 is_abstract = CLASS_DATA (sym)->attr.abstract;
7246 else
7248 allocatable = sym->attr.allocatable;
7249 pointer = sym->attr.pointer;
7250 dimension = sym->attr.dimension;
7251 codimension = sym->attr.codimension;
7254 coindexed = false;
7256 for (ref = e->ref; ref; ref2 = ref, ref = ref->next)
7258 switch (ref->type)
7260 case REF_ARRAY:
7261 if (ref->u.ar.codimen > 0)
7263 int n;
7264 for (n = ref->u.ar.dimen;
7265 n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
7266 if (ref->u.ar.dimen_type[n] != DIMEN_THIS_IMAGE)
7268 coindexed = true;
7269 break;
7273 if (ref->next != NULL)
7274 pointer = 0;
7275 break;
7277 case REF_COMPONENT:
7278 /* F2008, C644. */
7279 if (coindexed)
7281 gfc_error ("Coindexed allocatable object at %L",
7282 &e->where);
7283 goto failure;
7286 c = ref->u.c.component;
7287 if (c->ts.type == BT_CLASS)
7289 allocatable = CLASS_DATA (c)->attr.allocatable;
7290 pointer = CLASS_DATA (c)->attr.class_pointer;
7291 dimension = CLASS_DATA (c)->attr.dimension;
7292 codimension = CLASS_DATA (c)->attr.codimension;
7293 is_abstract = CLASS_DATA (c)->attr.abstract;
7295 else
7297 allocatable = c->attr.allocatable;
7298 pointer = c->attr.pointer;
7299 dimension = c->attr.dimension;
7300 codimension = c->attr.codimension;
7301 is_abstract = c->attr.abstract;
7303 break;
7305 case REF_SUBSTRING:
7306 allocatable = 0;
7307 pointer = 0;
7308 break;
7313 /* Check for F08:C628. */
7314 if (allocatable == 0 && pointer == 0 && !unlimited)
7316 gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",
7317 &e->where);
7318 goto failure;
7321 /* Some checks for the SOURCE tag. */
7322 if (code->expr3)
7324 /* Check F03:C631. */
7325 if (!gfc_type_compatible (&e->ts, &code->expr3->ts))
7327 gfc_error ("Type of entity at %L is type incompatible with "
7328 "source-expr at %L", &e->where, &code->expr3->where);
7329 goto failure;
7332 /* Check F03:C632 and restriction following Note 6.18. */
7333 if (code->expr3->rank > 0 && !conformable_arrays (code->expr3, e))
7334 goto failure;
7336 /* Check F03:C633. */
7337 if (code->expr3->ts.kind != e->ts.kind && !unlimited)
7339 gfc_error ("The allocate-object at %L and the source-expr at %L "
7340 "shall have the same kind type parameter",
7341 &e->where, &code->expr3->where);
7342 goto failure;
7345 /* Check F2008, C642. */
7346 if (code->expr3->ts.type == BT_DERIVED
7347 && ((codimension && gfc_expr_attr (code->expr3).lock_comp)
7348 || (code->expr3->ts.u.derived->from_intmod
7349 == INTMOD_ISO_FORTRAN_ENV
7350 && code->expr3->ts.u.derived->intmod_sym_id
7351 == ISOFORTRAN_LOCK_TYPE)))
7353 gfc_error ("The source-expr at %L shall neither be of type "
7354 "LOCK_TYPE nor have a LOCK_TYPE component if "
7355 "allocate-object at %L is a coarray",
7356 &code->expr3->where, &e->where);
7357 goto failure;
7360 /* Check TS18508, C702/C703. */
7361 if (code->expr3->ts.type == BT_DERIVED
7362 && ((codimension && gfc_expr_attr (code->expr3).event_comp)
7363 || (code->expr3->ts.u.derived->from_intmod
7364 == INTMOD_ISO_FORTRAN_ENV
7365 && code->expr3->ts.u.derived->intmod_sym_id
7366 == ISOFORTRAN_EVENT_TYPE)))
7368 gfc_error ("The source-expr at %L shall neither be of type "
7369 "EVENT_TYPE nor have a EVENT_TYPE component if "
7370 "allocate-object at %L is a coarray",
7371 &code->expr3->where, &e->where);
7372 goto failure;
7376 /* Check F08:C629. */
7377 if (is_abstract && code->ext.alloc.ts.type == BT_UNKNOWN
7378 && !code->expr3)
7380 gcc_assert (e->ts.type == BT_CLASS);
7381 gfc_error ("Allocating %s of ABSTRACT base type at %L requires a "
7382 "type-spec or source-expr", sym->name, &e->where);
7383 goto failure;
7386 /* Check F08:C632. */
7387 if (code->ext.alloc.ts.type == BT_CHARACTER && !e->ts.deferred
7388 && !UNLIMITED_POLY (e))
7390 int cmp = gfc_dep_compare_expr (e->ts.u.cl->length,
7391 code->ext.alloc.ts.u.cl->length);
7392 if (cmp == 1 || cmp == -1 || cmp == -3)
7394 gfc_error ("Allocating %s at %L with type-spec requires the same "
7395 "character-length parameter as in the declaration",
7396 sym->name, &e->where);
7397 goto failure;
7401 /* In the variable definition context checks, gfc_expr_attr is used
7402 on the expression. This is fooled by the array specification
7403 present in e, thus we have to eliminate that one temporarily. */
7404 e2 = remove_last_array_ref (e);
7405 t = true;
7406 if (t && pointer)
7407 t = gfc_check_vardef_context (e2, true, true, false,
7408 _("ALLOCATE object"));
7409 if (t)
7410 t = gfc_check_vardef_context (e2, false, true, false,
7411 _("ALLOCATE object"));
7412 gfc_free_expr (e2);
7413 if (!t)
7414 goto failure;
7416 if (e->ts.type == BT_CLASS && CLASS_DATA (e)->attr.dimension
7417 && !code->expr3 && code->ext.alloc.ts.type == BT_DERIVED)
7419 /* For class arrays, the initialization with SOURCE is done
7420 using _copy and trans_call. It is convenient to exploit that
7421 when the allocated type is different from the declared type but
7422 no SOURCE exists by setting expr3. */
7423 code->expr3 = gfc_default_initializer (&code->ext.alloc.ts);
7425 else if (flag_coarray != GFC_FCOARRAY_LIB && e->ts.type == BT_DERIVED
7426 && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
7427 && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
7429 /* We have to zero initialize the integer variable. */
7430 code->expr3 = gfc_get_int_expr (gfc_default_integer_kind, &e->where, 0);
7433 if (e->ts.type == BT_CLASS && !unlimited && !UNLIMITED_POLY (code->expr3))
7435 /* Make sure the vtab symbol is present when
7436 the module variables are generated. */
7437 gfc_typespec ts = e->ts;
7438 if (code->expr3)
7439 ts = code->expr3->ts;
7440 else if (code->ext.alloc.ts.type == BT_DERIVED)
7441 ts = code->ext.alloc.ts;
7443 /* Finding the vtab also publishes the type's symbol. Therefore this
7444 statement is necessary. */
7445 gfc_find_derived_vtab (ts.u.derived);
7447 else if (unlimited && !UNLIMITED_POLY (code->expr3))
7449 /* Again, make sure the vtab symbol is present when
7450 the module variables are generated. */
7451 gfc_typespec *ts = NULL;
7452 if (code->expr3)
7453 ts = &code->expr3->ts;
7454 else
7455 ts = &code->ext.alloc.ts;
7457 gcc_assert (ts);
7459 /* Finding the vtab also publishes the type's symbol. Therefore this
7460 statement is necessary. */
7461 gfc_find_vtab (ts);
7464 if (dimension == 0 && codimension == 0)
7465 goto success;
7467 /* Make sure the last reference node is an array specification. */
7469 if (!ref2 || ref2->type != REF_ARRAY || ref2->u.ar.type == AR_FULL
7470 || (dimension && ref2->u.ar.dimen == 0))
7472 /* F08:C633. */
7473 if (code->expr3)
7475 if (!gfc_notify_std (GFC_STD_F2008, "Array specification required "
7476 "in ALLOCATE statement at %L", &e->where))
7477 goto failure;
7478 if (code->expr3->rank != 0)
7479 *array_alloc_wo_spec = true;
7480 else
7482 gfc_error ("Array specification or array-valued SOURCE= "
7483 "expression required in ALLOCATE statement at %L",
7484 &e->where);
7485 goto failure;
7488 else
7490 gfc_error ("Array specification required in ALLOCATE statement "
7491 "at %L", &e->where);
7492 goto failure;
7496 /* Make sure that the array section reference makes sense in the
7497 context of an ALLOCATE specification. */
7499 ar = &ref2->u.ar;
7501 if (codimension)
7502 for (i = ar->dimen; i < ar->dimen + ar->codimen; i++)
7503 if (ar->dimen_type[i] == DIMEN_THIS_IMAGE)
7505 gfc_error ("Coarray specification required in ALLOCATE statement "
7506 "at %L", &e->where);
7507 goto failure;
7510 for (i = 0; i < ar->dimen; i++)
7512 if (ar->type == AR_ELEMENT || ar->type == AR_FULL)
7513 goto check_symbols;
7515 switch (ar->dimen_type[i])
7517 case DIMEN_ELEMENT:
7518 break;
7520 case DIMEN_RANGE:
7521 if (ar->start[i] != NULL
7522 && ar->end[i] != NULL
7523 && ar->stride[i] == NULL)
7524 break;
7526 /* Fall through. */
7528 case DIMEN_UNKNOWN:
7529 case DIMEN_VECTOR:
7530 case DIMEN_STAR:
7531 case DIMEN_THIS_IMAGE:
7532 gfc_error ("Bad array specification in ALLOCATE statement at %L",
7533 &e->where);
7534 goto failure;
7537 check_symbols:
7538 for (a = code->ext.alloc.list; a; a = a->next)
7540 sym = a->expr->symtree->n.sym;
7542 /* TODO - check derived type components. */
7543 if (gfc_bt_struct (sym->ts.type) || sym->ts.type == BT_CLASS)
7544 continue;
7546 if ((ar->start[i] != NULL
7547 && gfc_find_sym_in_expr (sym, ar->start[i]))
7548 || (ar->end[i] != NULL
7549 && gfc_find_sym_in_expr (sym, ar->end[i])))
7551 gfc_error ("%qs must not appear in the array specification at "
7552 "%L in the same ALLOCATE statement where it is "
7553 "itself allocated", sym->name, &ar->where);
7554 goto failure;
7559 for (i = ar->dimen; i < ar->codimen + ar->dimen; i++)
7561 if (ar->dimen_type[i] == DIMEN_ELEMENT
7562 || ar->dimen_type[i] == DIMEN_RANGE)
7564 if (i == (ar->dimen + ar->codimen - 1))
7566 gfc_error ("Expected '*' in coindex specification in ALLOCATE "
7567 "statement at %L", &e->where);
7568 goto failure;
7570 continue;
7573 if (ar->dimen_type[i] == DIMEN_STAR && i == (ar->dimen + ar->codimen - 1)
7574 && ar->stride[i] == NULL)
7575 break;
7577 gfc_error ("Bad coarray specification in ALLOCATE statement at %L",
7578 &e->where);
7579 goto failure;
7582 success:
7583 return true;
7585 failure:
7586 return false;
7590 static void
7591 resolve_allocate_deallocate (gfc_code *code, const char *fcn)
7593 gfc_expr *stat, *errmsg, *pe, *qe;
7594 gfc_alloc *a, *p, *q;
7596 stat = code->expr1;
7597 errmsg = code->expr2;
7599 /* Check the stat variable. */
7600 if (stat)
7602 gfc_check_vardef_context (stat, false, false, false,
7603 _("STAT variable"));
7605 if ((stat->ts.type != BT_INTEGER
7606 && !(stat->ref && (stat->ref->type == REF_ARRAY
7607 || stat->ref->type == REF_COMPONENT)))
7608 || stat->rank > 0)
7609 gfc_error ("Stat-variable at %L must be a scalar INTEGER "
7610 "variable", &stat->where);
7612 for (p = code->ext.alloc.list; p; p = p->next)
7613 if (p->expr->symtree->n.sym->name == stat->symtree->n.sym->name)
7615 gfc_ref *ref1, *ref2;
7616 bool found = true;
7618 for (ref1 = p->expr->ref, ref2 = stat->ref; ref1 && ref2;
7619 ref1 = ref1->next, ref2 = ref2->next)
7621 if (ref1->type != REF_COMPONENT || ref2->type != REF_COMPONENT)
7622 continue;
7623 if (ref1->u.c.component->name != ref2->u.c.component->name)
7625 found = false;
7626 break;
7630 if (found)
7632 gfc_error ("Stat-variable at %L shall not be %sd within "
7633 "the same %s statement", &stat->where, fcn, fcn);
7634 break;
7639 /* Check the errmsg variable. */
7640 if (errmsg)
7642 if (!stat)
7643 gfc_warning (0, "ERRMSG at %L is useless without a STAT tag",
7644 &errmsg->where);
7646 gfc_check_vardef_context (errmsg, false, false, false,
7647 _("ERRMSG variable"));
7649 if ((errmsg->ts.type != BT_CHARACTER
7650 && !(errmsg->ref
7651 && (errmsg->ref->type == REF_ARRAY
7652 || errmsg->ref->type == REF_COMPONENT)))
7653 || errmsg->rank > 0 )
7654 gfc_error ("Errmsg-variable at %L must be a scalar CHARACTER "
7655 "variable", &errmsg->where);
7657 for (p = code->ext.alloc.list; p; p = p->next)
7658 if (p->expr->symtree->n.sym->name == errmsg->symtree->n.sym->name)
7660 gfc_ref *ref1, *ref2;
7661 bool found = true;
7663 for (ref1 = p->expr->ref, ref2 = errmsg->ref; ref1 && ref2;
7664 ref1 = ref1->next, ref2 = ref2->next)
7666 if (ref1->type != REF_COMPONENT || ref2->type != REF_COMPONENT)
7667 continue;
7668 if (ref1->u.c.component->name != ref2->u.c.component->name)
7670 found = false;
7671 break;
7675 if (found)
7677 gfc_error ("Errmsg-variable at %L shall not be %sd within "
7678 "the same %s statement", &errmsg->where, fcn, fcn);
7679 break;
7684 /* Check that an allocate-object appears only once in the statement. */
7686 for (p = code->ext.alloc.list; p; p = p->next)
7688 pe = p->expr;
7689 for (q = p->next; q; q = q->next)
7691 qe = q->expr;
7692 if (pe->symtree->n.sym->name == qe->symtree->n.sym->name)
7694 /* This is a potential collision. */
7695 gfc_ref *pr = pe->ref;
7696 gfc_ref *qr = qe->ref;
7698 /* Follow the references until
7699 a) They start to differ, in which case there is no error;
7700 you can deallocate a%b and a%c in a single statement
7701 b) Both of them stop, which is an error
7702 c) One of them stops, which is also an error. */
7703 while (1)
7705 if (pr == NULL && qr == NULL)
7707 gfc_error ("Allocate-object at %L also appears at %L",
7708 &pe->where, &qe->where);
7709 break;
7711 else if (pr != NULL && qr == NULL)
7713 gfc_error ("Allocate-object at %L is subobject of"
7714 " object at %L", &pe->where, &qe->where);
7715 break;
7717 else if (pr == NULL && qr != NULL)
7719 gfc_error ("Allocate-object at %L is subobject of"
7720 " object at %L", &qe->where, &pe->where);
7721 break;
7723 /* Here, pr != NULL && qr != NULL */
7724 gcc_assert(pr->type == qr->type);
7725 if (pr->type == REF_ARRAY)
7727 /* Handle cases like allocate(v(3)%x(3), v(2)%x(3)),
7728 which are legal. */
7729 gcc_assert (qr->type == REF_ARRAY);
7731 if (pr->next && qr->next)
7733 int i;
7734 gfc_array_ref *par = &(pr->u.ar);
7735 gfc_array_ref *qar = &(qr->u.ar);
7737 for (i=0; i<par->dimen; i++)
7739 if ((par->start[i] != NULL
7740 || qar->start[i] != NULL)
7741 && gfc_dep_compare_expr (par->start[i],
7742 qar->start[i]) != 0)
7743 goto break_label;
7747 else
7749 if (pr->u.c.component->name != qr->u.c.component->name)
7750 break;
7753 pr = pr->next;
7754 qr = qr->next;
7756 break_label:
7762 if (strcmp (fcn, "ALLOCATE") == 0)
7764 bool arr_alloc_wo_spec = false;
7766 /* Resolving the expr3 in the loop over all objects to allocate would
7767 execute loop invariant code for each loop item. Therefore do it just
7768 once here. */
7769 if (code->expr3 && code->expr3->mold
7770 && code->expr3->ts.type == BT_DERIVED)
7772 /* Default initialization via MOLD (non-polymorphic). */
7773 gfc_expr *rhs = gfc_default_initializer (&code->expr3->ts);
7774 if (rhs != NULL)
7776 gfc_resolve_expr (rhs);
7777 gfc_free_expr (code->expr3);
7778 code->expr3 = rhs;
7781 for (a = code->ext.alloc.list; a; a = a->next)
7782 resolve_allocate_expr (a->expr, code, &arr_alloc_wo_spec);
7784 if (arr_alloc_wo_spec && code->expr3)
7786 /* Mark the allocate to have to take the array specification
7787 from the expr3. */
7788 code->ext.alloc.arr_spec_from_expr3 = 1;
7791 else
7793 for (a = code->ext.alloc.list; a; a = a->next)
7794 resolve_deallocate_expr (a->expr);
7799 /************ SELECT CASE resolution subroutines ************/
7801 /* Callback function for our mergesort variant. Determines interval
7802 overlaps for CASEs. Return <0 if op1 < op2, 0 for overlap, >0 for
7803 op1 > op2. Assumes we're not dealing with the default case.
7804 We have op1 = (:L), (K:L) or (K:) and op2 = (:N), (M:N) or (M:).
7805 There are nine situations to check. */
7807 static int
7808 compare_cases (const gfc_case *op1, const gfc_case *op2)
7810 int retval;
7812 if (op1->low == NULL) /* op1 = (:L) */
7814 /* op2 = (:N), so overlap. */
7815 retval = 0;
7816 /* op2 = (M:) or (M:N), L < M */
7817 if (op2->low != NULL
7818 && gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
7819 retval = -1;
7821 else if (op1->high == NULL) /* op1 = (K:) */
7823 /* op2 = (M:), so overlap. */
7824 retval = 0;
7825 /* op2 = (:N) or (M:N), K > N */
7826 if (op2->high != NULL
7827 && gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
7828 retval = 1;
7830 else /* op1 = (K:L) */
7832 if (op2->low == NULL) /* op2 = (:N), K > N */
7833 retval = (gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
7834 ? 1 : 0;
7835 else if (op2->high == NULL) /* op2 = (M:), L < M */
7836 retval = (gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
7837 ? -1 : 0;
7838 else /* op2 = (M:N) */
7840 retval = 0;
7841 /* L < M */
7842 if (gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
7843 retval = -1;
7844 /* K > N */
7845 else if (gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
7846 retval = 1;
7850 return retval;
7854 /* Merge-sort a double linked case list, detecting overlap in the
7855 process. LIST is the head of the double linked case list before it
7856 is sorted. Returns the head of the sorted list if we don't see any
7857 overlap, or NULL otherwise. */
7859 static gfc_case *
7860 check_case_overlap (gfc_case *list)
7862 gfc_case *p, *q, *e, *tail;
7863 int insize, nmerges, psize, qsize, cmp, overlap_seen;
7865 /* If the passed list was empty, return immediately. */
7866 if (!list)
7867 return NULL;
7869 overlap_seen = 0;
7870 insize = 1;
7872 /* Loop unconditionally. The only exit from this loop is a return
7873 statement, when we've finished sorting the case list. */
7874 for (;;)
7876 p = list;
7877 list = NULL;
7878 tail = NULL;
7880 /* Count the number of merges we do in this pass. */
7881 nmerges = 0;
7883 /* Loop while there exists a merge to be done. */
7884 while (p)
7886 int i;
7888 /* Count this merge. */
7889 nmerges++;
7891 /* Cut the list in two pieces by stepping INSIZE places
7892 forward in the list, starting from P. */
7893 psize = 0;
7894 q = p;
7895 for (i = 0; i < insize; i++)
7897 psize++;
7898 q = q->right;
7899 if (!q)
7900 break;
7902 qsize = insize;
7904 /* Now we have two lists. Merge them! */
7905 while (psize > 0 || (qsize > 0 && q != NULL))
7907 /* See from which the next case to merge comes from. */
7908 if (psize == 0)
7910 /* P is empty so the next case must come from Q. */
7911 e = q;
7912 q = q->right;
7913 qsize--;
7915 else if (qsize == 0 || q == NULL)
7917 /* Q is empty. */
7918 e = p;
7919 p = p->right;
7920 psize--;
7922 else
7924 cmp = compare_cases (p, q);
7925 if (cmp < 0)
7927 /* The whole case range for P is less than the
7928 one for Q. */
7929 e = p;
7930 p = p->right;
7931 psize--;
7933 else if (cmp > 0)
7935 /* The whole case range for Q is greater than
7936 the case range for P. */
7937 e = q;
7938 q = q->right;
7939 qsize--;
7941 else
7943 /* The cases overlap, or they are the same
7944 element in the list. Either way, we must
7945 issue an error and get the next case from P. */
7946 /* FIXME: Sort P and Q by line number. */
7947 gfc_error ("CASE label at %L overlaps with CASE "
7948 "label at %L", &p->where, &q->where);
7949 overlap_seen = 1;
7950 e = p;
7951 p = p->right;
7952 psize--;
7956 /* Add the next element to the merged list. */
7957 if (tail)
7958 tail->right = e;
7959 else
7960 list = e;
7961 e->left = tail;
7962 tail = e;
7965 /* P has now stepped INSIZE places along, and so has Q. So
7966 they're the same. */
7967 p = q;
7969 tail->right = NULL;
7971 /* If we have done only one merge or none at all, we've
7972 finished sorting the cases. */
7973 if (nmerges <= 1)
7975 if (!overlap_seen)
7976 return list;
7977 else
7978 return NULL;
7981 /* Otherwise repeat, merging lists twice the size. */
7982 insize *= 2;
7987 /* Check to see if an expression is suitable for use in a CASE statement.
7988 Makes sure that all case expressions are scalar constants of the same
7989 type. Return false if anything is wrong. */
7991 static bool
7992 validate_case_label_expr (gfc_expr *e, gfc_expr *case_expr)
7994 if (e == NULL) return true;
7996 if (e->ts.type != case_expr->ts.type)
7998 gfc_error ("Expression in CASE statement at %L must be of type %s",
7999 &e->where, gfc_basic_typename (case_expr->ts.type));
8000 return false;
8003 /* C805 (R808) For a given case-construct, each case-value shall be of
8004 the same type as case-expr. For character type, length differences
8005 are allowed, but the kind type parameters shall be the same. */
8007 if (case_expr->ts.type == BT_CHARACTER && e->ts.kind != case_expr->ts.kind)
8009 gfc_error ("Expression in CASE statement at %L must be of kind %d",
8010 &e->where, case_expr->ts.kind);
8011 return false;
8014 /* Convert the case value kind to that of case expression kind,
8015 if needed */
8017 if (e->ts.kind != case_expr->ts.kind)
8018 gfc_convert_type_warn (e, &case_expr->ts, 2, 0);
8020 if (e->rank != 0)
8022 gfc_error ("Expression in CASE statement at %L must be scalar",
8023 &e->where);
8024 return false;
8027 return true;
8031 /* Given a completely parsed select statement, we:
8033 - Validate all expressions and code within the SELECT.
8034 - Make sure that the selection expression is not of the wrong type.
8035 - Make sure that no case ranges overlap.
8036 - Eliminate unreachable cases and unreachable code resulting from
8037 removing case labels.
8039 The standard does allow unreachable cases, e.g. CASE (5:3). But
8040 they are a hassle for code generation, and to prevent that, we just
8041 cut them out here. This is not necessary for overlapping cases
8042 because they are illegal and we never even try to generate code.
8044 We have the additional caveat that a SELECT construct could have
8045 been a computed GOTO in the source code. Fortunately we can fairly
8046 easily work around that here: The case_expr for a "real" SELECT CASE
8047 is in code->expr1, but for a computed GOTO it is in code->expr2. All
8048 we have to do is make sure that the case_expr is a scalar integer
8049 expression. */
8051 static void
8052 resolve_select (gfc_code *code, bool select_type)
8054 gfc_code *body;
8055 gfc_expr *case_expr;
8056 gfc_case *cp, *default_case, *tail, *head;
8057 int seen_unreachable;
8058 int seen_logical;
8059 int ncases;
8060 bt type;
8061 bool t;
8063 if (code->expr1 == NULL)
8065 /* This was actually a computed GOTO statement. */
8066 case_expr = code->expr2;
8067 if (case_expr->ts.type != BT_INTEGER|| case_expr->rank != 0)
8068 gfc_error ("Selection expression in computed GOTO statement "
8069 "at %L must be a scalar integer expression",
8070 &case_expr->where);
8072 /* Further checking is not necessary because this SELECT was built
8073 by the compiler, so it should always be OK. Just move the
8074 case_expr from expr2 to expr so that we can handle computed
8075 GOTOs as normal SELECTs from here on. */
8076 code->expr1 = code->expr2;
8077 code->expr2 = NULL;
8078 return;
8081 case_expr = code->expr1;
8082 type = case_expr->ts.type;
8084 /* F08:C830. */
8085 if (type != BT_LOGICAL && type != BT_INTEGER && type != BT_CHARACTER)
8087 gfc_error ("Argument of SELECT statement at %L cannot be %s",
8088 &case_expr->where, gfc_typename (&case_expr->ts));
8090 /* Punt. Going on here just produce more garbage error messages. */
8091 return;
8094 /* F08:R842. */
8095 if (!select_type && case_expr->rank != 0)
8097 gfc_error ("Argument of SELECT statement at %L must be a scalar "
8098 "expression", &case_expr->where);
8100 /* Punt. */
8101 return;
8104 /* Raise a warning if an INTEGER case value exceeds the range of
8105 the case-expr. Later, all expressions will be promoted to the
8106 largest kind of all case-labels. */
8108 if (type == BT_INTEGER)
8109 for (body = code->block; body; body = body->block)
8110 for (cp = body->ext.block.case_list; cp; cp = cp->next)
8112 if (cp->low
8113 && gfc_check_integer_range (cp->low->value.integer,
8114 case_expr->ts.kind) != ARITH_OK)
8115 gfc_warning (0, "Expression in CASE statement at %L is "
8116 "not in the range of %s", &cp->low->where,
8117 gfc_typename (&case_expr->ts));
8119 if (cp->high
8120 && cp->low != cp->high
8121 && gfc_check_integer_range (cp->high->value.integer,
8122 case_expr->ts.kind) != ARITH_OK)
8123 gfc_warning (0, "Expression in CASE statement at %L is "
8124 "not in the range of %s", &cp->high->where,
8125 gfc_typename (&case_expr->ts));
8128 /* PR 19168 has a long discussion concerning a mismatch of the kinds
8129 of the SELECT CASE expression and its CASE values. Walk the lists
8130 of case values, and if we find a mismatch, promote case_expr to
8131 the appropriate kind. */
8133 if (type == BT_LOGICAL || type == BT_INTEGER)
8135 for (body = code->block; body; body = body->block)
8137 /* Walk the case label list. */
8138 for (cp = body->ext.block.case_list; cp; cp = cp->next)
8140 /* Intercept the DEFAULT case. It does not have a kind. */
8141 if (cp->low == NULL && cp->high == NULL)
8142 continue;
8144 /* Unreachable case ranges are discarded, so ignore. */
8145 if (cp->low != NULL && cp->high != NULL
8146 && cp->low != cp->high
8147 && gfc_compare_expr (cp->low, cp->high, INTRINSIC_GT) > 0)
8148 continue;
8150 if (cp->low != NULL
8151 && case_expr->ts.kind != gfc_kind_max(case_expr, cp->low))
8152 gfc_convert_type_warn (case_expr, &cp->low->ts, 2, 0);
8154 if (cp->high != NULL
8155 && case_expr->ts.kind != gfc_kind_max(case_expr, cp->high))
8156 gfc_convert_type_warn (case_expr, &cp->high->ts, 2, 0);
8161 /* Assume there is no DEFAULT case. */
8162 default_case = NULL;
8163 head = tail = NULL;
8164 ncases = 0;
8165 seen_logical = 0;
8167 for (body = code->block; body; body = body->block)
8169 /* Assume the CASE list is OK, and all CASE labels can be matched. */
8170 t = true;
8171 seen_unreachable = 0;
8173 /* Walk the case label list, making sure that all case labels
8174 are legal. */
8175 for (cp = body->ext.block.case_list; cp; cp = cp->next)
8177 /* Count the number of cases in the whole construct. */
8178 ncases++;
8180 /* Intercept the DEFAULT case. */
8181 if (cp->low == NULL && cp->high == NULL)
8183 if (default_case != NULL)
8185 gfc_error ("The DEFAULT CASE at %L cannot be followed "
8186 "by a second DEFAULT CASE at %L",
8187 &default_case->where, &cp->where);
8188 t = false;
8189 break;
8191 else
8193 default_case = cp;
8194 continue;
8198 /* Deal with single value cases and case ranges. Errors are
8199 issued from the validation function. */
8200 if (!validate_case_label_expr (cp->low, case_expr)
8201 || !validate_case_label_expr (cp->high, case_expr))
8203 t = false;
8204 break;
8207 if (type == BT_LOGICAL
8208 && ((cp->low == NULL || cp->high == NULL)
8209 || cp->low != cp->high))
8211 gfc_error ("Logical range in CASE statement at %L is not "
8212 "allowed", &cp->low->where);
8213 t = false;
8214 break;
8217 if (type == BT_LOGICAL && cp->low->expr_type == EXPR_CONSTANT)
8219 int value;
8220 value = cp->low->value.logical == 0 ? 2 : 1;
8221 if (value & seen_logical)
8223 gfc_error ("Constant logical value in CASE statement "
8224 "is repeated at %L",
8225 &cp->low->where);
8226 t = false;
8227 break;
8229 seen_logical |= value;
8232 if (cp->low != NULL && cp->high != NULL
8233 && cp->low != cp->high
8234 && gfc_compare_expr (cp->low, cp->high, INTRINSIC_GT) > 0)
8236 if (warn_surprising)
8237 gfc_warning (OPT_Wsurprising,
8238 "Range specification at %L can never be matched",
8239 &cp->where);
8241 cp->unreachable = 1;
8242 seen_unreachable = 1;
8244 else
8246 /* If the case range can be matched, it can also overlap with
8247 other cases. To make sure it does not, we put it in a
8248 double linked list here. We sort that with a merge sort
8249 later on to detect any overlapping cases. */
8250 if (!head)
8252 head = tail = cp;
8253 head->right = head->left = NULL;
8255 else
8257 tail->right = cp;
8258 tail->right->left = tail;
8259 tail = tail->right;
8260 tail->right = NULL;
8265 /* It there was a failure in the previous case label, give up
8266 for this case label list. Continue with the next block. */
8267 if (!t)
8268 continue;
8270 /* See if any case labels that are unreachable have been seen.
8271 If so, we eliminate them. This is a bit of a kludge because
8272 the case lists for a single case statement (label) is a
8273 single forward linked lists. */
8274 if (seen_unreachable)
8276 /* Advance until the first case in the list is reachable. */
8277 while (body->ext.block.case_list != NULL
8278 && body->ext.block.case_list->unreachable)
8280 gfc_case *n = body->ext.block.case_list;
8281 body->ext.block.case_list = body->ext.block.case_list->next;
8282 n->next = NULL;
8283 gfc_free_case_list (n);
8286 /* Strip all other unreachable cases. */
8287 if (body->ext.block.case_list)
8289 for (cp = body->ext.block.case_list; cp && cp->next; cp = cp->next)
8291 if (cp->next->unreachable)
8293 gfc_case *n = cp->next;
8294 cp->next = cp->next->next;
8295 n->next = NULL;
8296 gfc_free_case_list (n);
8303 /* See if there were overlapping cases. If the check returns NULL,
8304 there was overlap. In that case we don't do anything. If head
8305 is non-NULL, we prepend the DEFAULT case. The sorted list can
8306 then used during code generation for SELECT CASE constructs with
8307 a case expression of a CHARACTER type. */
8308 if (head)
8310 head = check_case_overlap (head);
8312 /* Prepend the default_case if it is there. */
8313 if (head != NULL && default_case)
8315 default_case->left = NULL;
8316 default_case->right = head;
8317 head->left = default_case;
8321 /* Eliminate dead blocks that may be the result if we've seen
8322 unreachable case labels for a block. */
8323 for (body = code; body && body->block; body = body->block)
8325 if (body->block->ext.block.case_list == NULL)
8327 /* Cut the unreachable block from the code chain. */
8328 gfc_code *c = body->block;
8329 body->block = c->block;
8331 /* Kill the dead block, but not the blocks below it. */
8332 c->block = NULL;
8333 gfc_free_statements (c);
8337 /* More than two cases is legal but insane for logical selects.
8338 Issue a warning for it. */
8339 if (warn_surprising && type == BT_LOGICAL && ncases > 2)
8340 gfc_warning (OPT_Wsurprising,
8341 "Logical SELECT CASE block at %L has more that two cases",
8342 &code->loc);
8346 /* Check if a derived type is extensible. */
8348 bool
8349 gfc_type_is_extensible (gfc_symbol *sym)
8351 return !(sym->attr.is_bind_c || sym->attr.sequence
8352 || (sym->attr.is_class
8353 && sym->components->ts.u.derived->attr.unlimited_polymorphic));
8357 static void
8358 resolve_types (gfc_namespace *ns);
8360 /* Resolve an associate-name: Resolve target and ensure the type-spec is
8361 correct as well as possibly the array-spec. */
8363 static void
8364 resolve_assoc_var (gfc_symbol* sym, bool resolve_target)
8366 gfc_expr* target;
8368 gcc_assert (sym->assoc);
8369 gcc_assert (sym->attr.flavor == FL_VARIABLE);
8371 /* If this is for SELECT TYPE, the target may not yet be set. In that
8372 case, return. Resolution will be called later manually again when
8373 this is done. */
8374 target = sym->assoc->target;
8375 if (!target)
8376 return;
8377 gcc_assert (!sym->assoc->dangling);
8379 if (resolve_target && !gfc_resolve_expr (target))
8380 return;
8382 /* For variable targets, we get some attributes from the target. */
8383 if (target->expr_type == EXPR_VARIABLE)
8385 gfc_symbol* tsym;
8387 gcc_assert (target->symtree);
8388 tsym = target->symtree->n.sym;
8390 sym->attr.asynchronous = tsym->attr.asynchronous;
8391 sym->attr.volatile_ = tsym->attr.volatile_;
8393 sym->attr.target = tsym->attr.target
8394 || gfc_expr_attr (target).pointer;
8395 if (is_subref_array (target))
8396 sym->attr.subref_array_pointer = 1;
8399 if (target->expr_type == EXPR_NULL)
8401 gfc_error ("Selector at %L cannot be NULL()", &target->where);
8402 return;
8404 else if (target->ts.type == BT_UNKNOWN)
8406 gfc_error ("Selector at %L has no type", &target->where);
8407 return;
8410 /* Get type if this was not already set. Note that it can be
8411 some other type than the target in case this is a SELECT TYPE
8412 selector! So we must not update when the type is already there. */
8413 if (sym->ts.type == BT_UNKNOWN)
8414 sym->ts = target->ts;
8416 gcc_assert (sym->ts.type != BT_UNKNOWN);
8418 /* See if this is a valid association-to-variable. */
8419 sym->assoc->variable = (target->expr_type == EXPR_VARIABLE
8420 && !gfc_has_vector_subscript (target));
8422 /* Finally resolve if this is an array or not. */
8423 if (sym->attr.dimension && target->rank == 0)
8425 /* primary.c makes the assumption that a reference to an associate
8426 name followed by a left parenthesis is an array reference. */
8427 if (sym->ts.type != BT_CHARACTER)
8428 gfc_error ("Associate-name %qs at %L is used as array",
8429 sym->name, &sym->declared_at);
8430 sym->attr.dimension = 0;
8431 return;
8435 /* We cannot deal with class selectors that need temporaries. */
8436 if (target->ts.type == BT_CLASS
8437 && gfc_ref_needs_temporary_p (target->ref))
8439 gfc_error ("CLASS selector at %L needs a temporary which is not "
8440 "yet implemented", &target->where);
8441 return;
8444 if (target->ts.type == BT_CLASS)
8445 gfc_fix_class_refs (target);
8447 if (target->rank != 0)
8449 gfc_array_spec *as;
8450 /* The rank may be incorrectly guessed at parsing, therefore make sure
8451 it is corrected now. */
8452 if (sym->ts.type != BT_CLASS && (!sym->as || sym->assoc->rankguessed))
8454 if (!sym->as)
8455 sym->as = gfc_get_array_spec ();
8456 as = sym->as;
8457 as->rank = target->rank;
8458 as->type = AS_DEFERRED;
8459 as->corank = gfc_get_corank (target);
8460 sym->attr.dimension = 1;
8461 if (as->corank != 0)
8462 sym->attr.codimension = 1;
8465 else
8467 /* target's rank is 0, but the type of the sym is still array valued,
8468 which has to be corrected. */
8469 if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as)
8471 gfc_array_spec *as;
8472 symbol_attribute attr;
8473 /* The associated variable's type is still the array type
8474 correct this now. */
8475 gfc_typespec *ts = &target->ts;
8476 gfc_ref *ref;
8477 gfc_component *c;
8478 for (ref = target->ref; ref != NULL; ref = ref->next)
8480 switch (ref->type)
8482 case REF_COMPONENT:
8483 ts = &ref->u.c.component->ts;
8484 break;
8485 case REF_ARRAY:
8486 if (ts->type == BT_CLASS)
8487 ts = &ts->u.derived->components->ts;
8488 break;
8489 default:
8490 break;
8493 /* Create a scalar instance of the current class type. Because the
8494 rank of a class array goes into its name, the type has to be
8495 rebuild. The alternative of (re-)setting just the attributes
8496 and as in the current type, destroys the type also in other
8497 places. */
8498 as = NULL;
8499 sym->ts = *ts;
8500 sym->ts.type = BT_CLASS;
8501 attr = CLASS_DATA (sym)->attr;
8502 attr.class_ok = 0;
8503 attr.associate_var = 1;
8504 attr.dimension = attr.codimension = 0;
8505 attr.class_pointer = 1;
8506 if (!gfc_build_class_symbol (&sym->ts, &attr, &as))
8507 gcc_unreachable ();
8508 /* Make sure the _vptr is set. */
8509 c = gfc_find_component (sym->ts.u.derived, "_vptr", true, true, NULL);
8510 if (c->ts.u.derived == NULL)
8511 c->ts.u.derived = gfc_find_derived_vtab (sym->ts.u.derived);
8512 CLASS_DATA (sym)->attr.pointer = 1;
8513 CLASS_DATA (sym)->attr.class_pointer = 1;
8514 gfc_set_sym_referenced (sym->ts.u.derived);
8515 gfc_commit_symbol (sym->ts.u.derived);
8516 /* _vptr now has the _vtab in it, change it to the _vtype. */
8517 if (c->ts.u.derived->attr.vtab)
8518 c->ts.u.derived = c->ts.u.derived->ts.u.derived;
8519 c->ts.u.derived->ns->types_resolved = 0;
8520 resolve_types (c->ts.u.derived->ns);
8524 /* Mark this as an associate variable. */
8525 sym->attr.associate_var = 1;
8527 /* Fix up the type-spec for CHARACTER types. */
8528 if (sym->ts.type == BT_CHARACTER && !sym->attr.select_type_temporary)
8530 if (!sym->ts.u.cl)
8531 sym->ts.u.cl = target->ts.u.cl;
8533 if (!sym->ts.u.cl->length)
8534 sym->ts.u.cl->length
8535 = gfc_get_int_expr (gfc_default_integer_kind,
8536 NULL, target->value.character.length);
8539 /* If the target is a good class object, so is the associate variable. */
8540 if (sym->ts.type == BT_CLASS && gfc_expr_attr (target).class_ok)
8541 sym->attr.class_ok = 1;
8545 /* Ensure that SELECT TYPE expressions have the correct rank and a full
8546 array reference, where necessary. The symbols are artificial and so
8547 the dimension attribute and arrayspec can also be set. In addition,
8548 sometimes the expr1 arrives as BT_DERIVED, when the symbol is BT_CLASS.
8549 This is corrected here as well.*/
8551 static void
8552 fixup_array_ref (gfc_expr **expr1, gfc_expr *expr2,
8553 int rank, gfc_ref *ref)
8555 gfc_ref *nref = (*expr1)->ref;
8556 gfc_symbol *sym1 = (*expr1)->symtree->n.sym;
8557 gfc_symbol *sym2 = expr2 ? expr2->symtree->n.sym : NULL;
8558 (*expr1)->rank = rank;
8559 if (sym1->ts.type == BT_CLASS)
8561 if ((*expr1)->ts.type != BT_CLASS)
8562 (*expr1)->ts = sym1->ts;
8564 CLASS_DATA (sym1)->attr.dimension = 1;
8565 if (CLASS_DATA (sym1)->as == NULL && sym2)
8566 CLASS_DATA (sym1)->as
8567 = gfc_copy_array_spec (CLASS_DATA (sym2)->as);
8569 else
8571 sym1->attr.dimension = 1;
8572 if (sym1->as == NULL && sym2)
8573 sym1->as = gfc_copy_array_spec (sym2->as);
8576 for (; nref; nref = nref->next)
8577 if (nref->next == NULL)
8578 break;
8580 if (ref && nref && nref->type != REF_ARRAY)
8581 nref->next = gfc_copy_ref (ref);
8582 else if (ref && !nref)
8583 (*expr1)->ref = gfc_copy_ref (ref);
8587 static gfc_expr *
8588 build_loc_call (gfc_expr *sym_expr)
8590 gfc_expr *loc_call;
8591 loc_call = gfc_get_expr ();
8592 loc_call->expr_type = EXPR_FUNCTION;
8593 gfc_get_sym_tree ("loc", gfc_current_ns, &loc_call->symtree, false);
8594 loc_call->symtree->n.sym->attr.flavor = FL_PROCEDURE;
8595 loc_call->symtree->n.sym->attr.intrinsic = 1;
8596 loc_call->symtree->n.sym->result = loc_call->symtree->n.sym;
8597 gfc_commit_symbol (loc_call->symtree->n.sym);
8598 loc_call->ts.type = BT_INTEGER;
8599 loc_call->ts.kind = gfc_index_integer_kind;
8600 loc_call->value.function.isym = gfc_intrinsic_function_by_id (GFC_ISYM_LOC);
8601 loc_call->value.function.actual = gfc_get_actual_arglist ();
8602 loc_call->value.function.actual->expr = sym_expr;
8603 loc_call->where = sym_expr->where;
8604 return loc_call;
8607 /* Resolve a SELECT TYPE statement. */
8609 static void
8610 resolve_select_type (gfc_code *code, gfc_namespace *old_ns)
8612 gfc_symbol *selector_type;
8613 gfc_code *body, *new_st, *if_st, *tail;
8614 gfc_code *class_is = NULL, *default_case = NULL;
8615 gfc_case *c;
8616 gfc_symtree *st;
8617 char name[GFC_MAX_SYMBOL_LEN];
8618 gfc_namespace *ns;
8619 int error = 0;
8620 int charlen = 0;
8621 int rank = 0;
8622 gfc_ref* ref = NULL;
8623 gfc_expr *selector_expr = NULL;
8625 ns = code->ext.block.ns;
8626 gfc_resolve (ns);
8628 /* Check for F03:C813. */
8629 if (code->expr1->ts.type != BT_CLASS
8630 && !(code->expr2 && code->expr2->ts.type == BT_CLASS))
8632 gfc_error ("Selector shall be polymorphic in SELECT TYPE statement "
8633 "at %L", &code->loc);
8634 return;
8637 if (!code->expr1->symtree->n.sym->attr.class_ok)
8638 return;
8640 if (code->expr2)
8642 if (code->expr1->symtree->n.sym->attr.untyped)
8643 code->expr1->symtree->n.sym->ts = code->expr2->ts;
8644 selector_type = CLASS_DATA (code->expr2)->ts.u.derived;
8646 /* F2008: C803 The selector expression must not be coindexed. */
8647 if (gfc_is_coindexed (code->expr2))
8649 gfc_error ("Selector at %L must not be coindexed",
8650 &code->expr2->where);
8651 return;
8655 else
8657 selector_type = CLASS_DATA (code->expr1)->ts.u.derived;
8659 if (gfc_is_coindexed (code->expr1))
8661 gfc_error ("Selector at %L must not be coindexed",
8662 &code->expr1->where);
8663 return;
8667 /* Loop over TYPE IS / CLASS IS cases. */
8668 for (body = code->block; body; body = body->block)
8670 c = body->ext.block.case_list;
8672 if (!error)
8674 /* Check for repeated cases. */
8675 for (tail = code->block; tail; tail = tail->block)
8677 gfc_case *d = tail->ext.block.case_list;
8678 if (tail == body)
8679 break;
8681 if (c->ts.type == d->ts.type
8682 && ((c->ts.type == BT_DERIVED
8683 && c->ts.u.derived && d->ts.u.derived
8684 && !strcmp (c->ts.u.derived->name,
8685 d->ts.u.derived->name))
8686 || c->ts.type == BT_UNKNOWN
8687 || (!(c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
8688 && c->ts.kind == d->ts.kind)))
8690 gfc_error ("TYPE IS at %L overlaps with TYPE IS at %L",
8691 &c->where, &d->where);
8692 return;
8697 /* Check F03:C815. */
8698 if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
8699 && !selector_type->attr.unlimited_polymorphic
8700 && !gfc_type_is_extensible (c->ts.u.derived))
8702 gfc_error ("Derived type %qs at %L must be extensible",
8703 c->ts.u.derived->name, &c->where);
8704 error++;
8705 continue;
8708 /* Check F03:C816. */
8709 if (c->ts.type != BT_UNKNOWN && !selector_type->attr.unlimited_polymorphic
8710 && ((c->ts.type != BT_DERIVED && c->ts.type != BT_CLASS)
8711 || !gfc_type_is_extension_of (selector_type, c->ts.u.derived)))
8713 if (c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
8714 gfc_error ("Derived type %qs at %L must be an extension of %qs",
8715 c->ts.u.derived->name, &c->where, selector_type->name);
8716 else
8717 gfc_error ("Unexpected intrinsic type %qs at %L",
8718 gfc_basic_typename (c->ts.type), &c->where);
8719 error++;
8720 continue;
8723 /* Check F03:C814. */
8724 if (c->ts.type == BT_CHARACTER
8725 && (c->ts.u.cl->length != NULL || c->ts.deferred))
8727 gfc_error ("The type-spec at %L shall specify that each length "
8728 "type parameter is assumed", &c->where);
8729 error++;
8730 continue;
8733 /* Intercept the DEFAULT case. */
8734 if (c->ts.type == BT_UNKNOWN)
8736 /* Check F03:C818. */
8737 if (default_case)
8739 gfc_error ("The DEFAULT CASE at %L cannot be followed "
8740 "by a second DEFAULT CASE at %L",
8741 &default_case->ext.block.case_list->where, &c->where);
8742 error++;
8743 continue;
8746 default_case = body;
8750 if (error > 0)
8751 return;
8753 /* Transform SELECT TYPE statement to BLOCK and associate selector to
8754 target if present. If there are any EXIT statements referring to the
8755 SELECT TYPE construct, this is no problem because the gfc_code
8756 reference stays the same and EXIT is equally possible from the BLOCK
8757 it is changed to. */
8758 code->op = EXEC_BLOCK;
8759 if (code->expr2)
8761 gfc_association_list* assoc;
8763 assoc = gfc_get_association_list ();
8764 assoc->st = code->expr1->symtree;
8765 assoc->target = gfc_copy_expr (code->expr2);
8766 assoc->target->where = code->expr2->where;
8767 /* assoc->variable will be set by resolve_assoc_var. */
8769 code->ext.block.assoc = assoc;
8770 code->expr1->symtree->n.sym->assoc = assoc;
8772 resolve_assoc_var (code->expr1->symtree->n.sym, false);
8774 else
8775 code->ext.block.assoc = NULL;
8777 /* Ensure that the selector rank and arrayspec are available to
8778 correct expressions in which they might be missing. */
8779 if (code->expr2 && code->expr2->rank)
8781 rank = code->expr2->rank;
8782 for (ref = code->expr2->ref; ref; ref = ref->next)
8783 if (ref->next == NULL)
8784 break;
8785 if (ref && ref->type == REF_ARRAY)
8786 ref = gfc_copy_ref (ref);
8788 /* Fixup expr1 if necessary. */
8789 if (rank)
8790 fixup_array_ref (&code->expr1, code->expr2, rank, ref);
8792 else if (code->expr1->rank)
8794 rank = code->expr1->rank;
8795 for (ref = code->expr1->ref; ref; ref = ref->next)
8796 if (ref->next == NULL)
8797 break;
8798 if (ref && ref->type == REF_ARRAY)
8799 ref = gfc_copy_ref (ref);
8802 /* Add EXEC_SELECT to switch on type. */
8803 new_st = gfc_get_code (code->op);
8804 new_st->expr1 = code->expr1;
8805 new_st->expr2 = code->expr2;
8806 new_st->block = code->block;
8807 code->expr1 = code->expr2 = NULL;
8808 code->block = NULL;
8809 if (!ns->code)
8810 ns->code = new_st;
8811 else
8812 ns->code->next = new_st;
8813 code = new_st;
8814 code->op = EXEC_SELECT_TYPE;
8816 /* Use the intrinsic LOC function to generate an integer expression
8817 for the vtable of the selector. Note that the rank of the selector
8818 expression has to be set to zero. */
8819 gfc_add_vptr_component (code->expr1);
8820 code->expr1->rank = 0;
8821 code->expr1 = build_loc_call (code->expr1);
8822 selector_expr = code->expr1->value.function.actual->expr;
8824 /* Loop over TYPE IS / CLASS IS cases. */
8825 for (body = code->block; body; body = body->block)
8827 gfc_symbol *vtab;
8828 gfc_expr *e;
8829 c = body->ext.block.case_list;
8831 /* Generate an index integer expression for address of the
8832 TYPE/CLASS vtable and store it in c->low. The hash expression
8833 is stored in c->high and is used to resolve intrinsic cases. */
8834 if (c->ts.type != BT_UNKNOWN)
8836 if (c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
8838 vtab = gfc_find_derived_vtab (c->ts.u.derived);
8839 gcc_assert (vtab);
8840 c->high = gfc_get_int_expr (gfc_default_integer_kind, NULL,
8841 c->ts.u.derived->hash_value);
8843 else
8845 vtab = gfc_find_vtab (&c->ts);
8846 gcc_assert (vtab && CLASS_DATA (vtab)->initializer);
8847 e = CLASS_DATA (vtab)->initializer;
8848 c->high = gfc_copy_expr (e);
8851 e = gfc_lval_expr_from_sym (vtab);
8852 c->low = build_loc_call (e);
8854 else
8855 continue;
8857 /* Associate temporary to selector. This should only be done
8858 when this case is actually true, so build a new ASSOCIATE
8859 that does precisely this here (instead of using the
8860 'global' one). */
8862 if (c->ts.type == BT_CLASS)
8863 sprintf (name, "__tmp_class_%s", c->ts.u.derived->name);
8864 else if (c->ts.type == BT_DERIVED)
8865 sprintf (name, "__tmp_type_%s", c->ts.u.derived->name);
8866 else if (c->ts.type == BT_CHARACTER)
8868 if (c->ts.u.cl && c->ts.u.cl->length
8869 && c->ts.u.cl->length->expr_type == EXPR_CONSTANT)
8870 charlen = mpz_get_si (c->ts.u.cl->length->value.integer);
8871 sprintf (name, "__tmp_%s_%d_%d", gfc_basic_typename (c->ts.type),
8872 charlen, c->ts.kind);
8874 else
8875 sprintf (name, "__tmp_%s_%d", gfc_basic_typename (c->ts.type),
8876 c->ts.kind);
8878 st = gfc_find_symtree (ns->sym_root, name);
8879 gcc_assert (st->n.sym->assoc);
8880 st->n.sym->assoc->target = gfc_get_variable_expr (selector_expr->symtree);
8881 st->n.sym->assoc->target->where = selector_expr->where;
8882 if (c->ts.type != BT_CLASS && c->ts.type != BT_UNKNOWN)
8884 gfc_add_data_component (st->n.sym->assoc->target);
8885 /* Fixup the target expression if necessary. */
8886 if (rank)
8887 fixup_array_ref (&st->n.sym->assoc->target, NULL, rank, ref);
8890 new_st = gfc_get_code (EXEC_BLOCK);
8891 new_st->ext.block.ns = gfc_build_block_ns (ns);
8892 new_st->ext.block.ns->code = body->next;
8893 body->next = new_st;
8895 /* Chain in the new list only if it is marked as dangling. Otherwise
8896 there is a CASE label overlap and this is already used. Just ignore,
8897 the error is diagnosed elsewhere. */
8898 if (st->n.sym->assoc->dangling)
8900 new_st->ext.block.assoc = st->n.sym->assoc;
8901 st->n.sym->assoc->dangling = 0;
8904 resolve_assoc_var (st->n.sym, false);
8907 /* Take out CLASS IS cases for separate treatment. */
8908 body = code;
8909 while (body && body->block)
8911 if (body->block->ext.block.case_list->ts.type == BT_CLASS)
8913 /* Add to class_is list. */
8914 if (class_is == NULL)
8916 class_is = body->block;
8917 tail = class_is;
8919 else
8921 for (tail = class_is; tail->block; tail = tail->block) ;
8922 tail->block = body->block;
8923 tail = tail->block;
8925 /* Remove from EXEC_SELECT list. */
8926 body->block = body->block->block;
8927 tail->block = NULL;
8929 else
8930 body = body->block;
8933 if (class_is)
8935 gfc_symbol *vtab;
8937 if (!default_case)
8939 /* Add a default case to hold the CLASS IS cases. */
8940 for (tail = code; tail->block; tail = tail->block) ;
8941 tail->block = gfc_get_code (EXEC_SELECT_TYPE);
8942 tail = tail->block;
8943 tail->ext.block.case_list = gfc_get_case ();
8944 tail->ext.block.case_list->ts.type = BT_UNKNOWN;
8945 tail->next = NULL;
8946 default_case = tail;
8949 /* More than one CLASS IS block? */
8950 if (class_is->block)
8952 gfc_code **c1,*c2;
8953 bool swapped;
8954 /* Sort CLASS IS blocks by extension level. */
8957 swapped = false;
8958 for (c1 = &class_is; (*c1) && (*c1)->block; c1 = &((*c1)->block))
8960 c2 = (*c1)->block;
8961 /* F03:C817 (check for doubles). */
8962 if ((*c1)->ext.block.case_list->ts.u.derived->hash_value
8963 == c2->ext.block.case_list->ts.u.derived->hash_value)
8965 gfc_error ("Double CLASS IS block in SELECT TYPE "
8966 "statement at %L",
8967 &c2->ext.block.case_list->where);
8968 return;
8970 if ((*c1)->ext.block.case_list->ts.u.derived->attr.extension
8971 < c2->ext.block.case_list->ts.u.derived->attr.extension)
8973 /* Swap. */
8974 (*c1)->block = c2->block;
8975 c2->block = *c1;
8976 *c1 = c2;
8977 swapped = true;
8981 while (swapped);
8984 /* Generate IF chain. */
8985 if_st = gfc_get_code (EXEC_IF);
8986 new_st = if_st;
8987 for (body = class_is; body; body = body->block)
8989 new_st->block = gfc_get_code (EXEC_IF);
8990 new_st = new_st->block;
8991 /* Set up IF condition: Call _gfortran_is_extension_of. */
8992 new_st->expr1 = gfc_get_expr ();
8993 new_st->expr1->expr_type = EXPR_FUNCTION;
8994 new_st->expr1->ts.type = BT_LOGICAL;
8995 new_st->expr1->ts.kind = 4;
8996 new_st->expr1->value.function.name = gfc_get_string (PREFIX ("is_extension_of"));
8997 new_st->expr1->value.function.isym = XCNEW (gfc_intrinsic_sym);
8998 new_st->expr1->value.function.isym->id = GFC_ISYM_EXTENDS_TYPE_OF;
8999 /* Set up arguments. */
9000 new_st->expr1->value.function.actual = gfc_get_actual_arglist ();
9001 new_st->expr1->value.function.actual->expr = gfc_get_variable_expr (selector_expr->symtree);
9002 new_st->expr1->value.function.actual->expr->where = code->loc;
9003 new_st->expr1->where = code->loc;
9004 gfc_add_vptr_component (new_st->expr1->value.function.actual->expr);
9005 vtab = gfc_find_derived_vtab (body->ext.block.case_list->ts.u.derived);
9006 st = gfc_find_symtree (vtab->ns->sym_root, vtab->name);
9007 new_st->expr1->value.function.actual->next = gfc_get_actual_arglist ();
9008 new_st->expr1->value.function.actual->next->expr = gfc_get_variable_expr (st);
9009 new_st->expr1->value.function.actual->next->expr->where = code->loc;
9010 new_st->next = body->next;
9012 if (default_case->next)
9014 new_st->block = gfc_get_code (EXEC_IF);
9015 new_st = new_st->block;
9016 new_st->next = default_case->next;
9019 /* Replace CLASS DEFAULT code by the IF chain. */
9020 default_case->next = if_st;
9023 /* Resolve the internal code. This can not be done earlier because
9024 it requires that the sym->assoc of selectors is set already. */
9025 gfc_current_ns = ns;
9026 gfc_resolve_blocks (code->block, gfc_current_ns);
9027 gfc_current_ns = old_ns;
9029 if (ref)
9030 free (ref);
9034 /* Resolve a transfer statement. This is making sure that:
9035 -- a derived type being transferred has only non-pointer components
9036 -- a derived type being transferred doesn't have private components, unless
9037 it's being transferred from the module where the type was defined
9038 -- we're not trying to transfer a whole assumed size array. */
9040 static void
9041 resolve_transfer (gfc_code *code)
9043 gfc_typespec *ts;
9044 gfc_symbol *sym, *derived;
9045 gfc_ref *ref;
9046 gfc_expr *exp;
9047 bool write = false;
9048 bool formatted = false;
9049 gfc_dt *dt = code->ext.dt;
9050 gfc_symbol *dtio_sub = NULL;
9052 exp = code->expr1;
9054 while (exp != NULL && exp->expr_type == EXPR_OP
9055 && exp->value.op.op == INTRINSIC_PARENTHESES)
9056 exp = exp->value.op.op1;
9058 if (exp && exp->expr_type == EXPR_NULL
9059 && code->ext.dt)
9061 gfc_error ("Invalid context for NULL () intrinsic at %L",
9062 &exp->where);
9063 return;
9066 if (exp == NULL || (exp->expr_type != EXPR_VARIABLE
9067 && exp->expr_type != EXPR_FUNCTION
9068 && exp->expr_type != EXPR_STRUCTURE))
9069 return;
9071 /* If we are reading, the variable will be changed. Note that
9072 code->ext.dt may be NULL if the TRANSFER is related to
9073 an INQUIRE statement -- but in this case, we are not reading, either. */
9074 if (dt && dt->dt_io_kind->value.iokind == M_READ
9075 && !gfc_check_vardef_context (exp, false, false, false,
9076 _("item in READ")))
9077 return;
9079 ts = exp->expr_type == EXPR_STRUCTURE ? &exp->ts : &exp->symtree->n.sym->ts;
9081 /* Go to actual component transferred. */
9082 for (ref = exp->ref; ref; ref = ref->next)
9083 if (ref->type == REF_COMPONENT)
9084 ts = &ref->u.c.component->ts;
9086 if (dt && dt->dt_io_kind->value.iokind != M_INQUIRE
9087 && (ts->type == BT_DERIVED || ts->type == BT_CLASS))
9089 if (ts->type == BT_DERIVED)
9090 derived = ts->u.derived;
9091 else
9092 derived = ts->u.derived->components->ts.u.derived;
9094 if (dt->format_expr)
9096 char *fmt;
9097 fmt = gfc_widechar_to_char (dt->format_expr->value.character.string,
9098 -1);
9099 if (strtok (fmt, "DT") != NULL)
9100 formatted = true;
9102 else if (dt->format_label == &format_asterisk)
9104 /* List directed io must call the formatted DTIO procedure. */
9105 formatted = true;
9108 write = dt->dt_io_kind->value.iokind == M_WRITE
9109 || dt->dt_io_kind->value.iokind == M_PRINT;
9110 dtio_sub = gfc_find_specific_dtio_proc (derived, write, formatted);
9112 if (dtio_sub != NULL && exp->expr_type == EXPR_VARIABLE)
9114 dt->udtio = exp;
9115 sym = exp->symtree->n.sym->ns->proc_name;
9116 /* Check to see if this is a nested DTIO call, with the
9117 dummy as the io-list object. */
9118 if (sym && sym == dtio_sub && sym->formal
9119 && sym->formal->sym == exp->symtree->n.sym
9120 && exp->ref == NULL)
9122 if (!sym->attr.recursive)
9124 gfc_error ("DTIO %s procedure at %L must be recursive",
9125 sym->name, &sym->declared_at);
9126 return;
9132 if (ts->type == BT_CLASS && dtio_sub == NULL)
9134 gfc_error ("Data transfer element at %L cannot be polymorphic unless "
9135 "it is processed by a defined input/output procedure",
9136 &code->loc);
9137 return;
9140 if (ts->type == BT_DERIVED)
9142 /* Check that transferred derived type doesn't contain POINTER
9143 components unless it is processed by a defined input/output
9144 procedure". */
9145 if (ts->u.derived->attr.pointer_comp && dtio_sub == NULL)
9147 gfc_error ("Data transfer element at %L cannot have POINTER "
9148 "components unless it is processed by a defined "
9149 "input/output procedure", &code->loc);
9150 return;
9153 /* F08:C935. */
9154 if (ts->u.derived->attr.proc_pointer_comp)
9156 gfc_error ("Data transfer element at %L cannot have "
9157 "procedure pointer components", &code->loc);
9158 return;
9161 if (ts->u.derived->attr.alloc_comp && dtio_sub == NULL)
9163 gfc_error ("Data transfer element at %L cannot have ALLOCATABLE "
9164 "components unless it is processed by a defined "
9165 "input/output procedure", &code->loc);
9166 return;
9169 /* C_PTR and C_FUNPTR have private components which means they can not
9170 be printed. However, if -std=gnu and not -pedantic, allow
9171 the component to be printed to help debugging. */
9172 if (ts->u.derived->ts.f90_type == BT_VOID)
9174 if (!gfc_notify_std (GFC_STD_GNU, "Data transfer element at %L "
9175 "cannot have PRIVATE components", &code->loc))
9176 return;
9178 else if (derived_inaccessible (ts->u.derived) && dtio_sub == NULL)
9180 gfc_error ("Data transfer element at %L cannot have "
9181 "PRIVATE components unless it is processed by "
9182 "a defined input/output procedure", &code->loc);
9183 return;
9187 if (exp->expr_type == EXPR_STRUCTURE)
9188 return;
9190 sym = exp->symtree->n.sym;
9192 if (sym->as != NULL && sym->as->type == AS_ASSUMED_SIZE && exp->ref
9193 && exp->ref->type == REF_ARRAY && exp->ref->u.ar.type == AR_FULL)
9195 gfc_error ("Data transfer element at %L cannot be a full reference to "
9196 "an assumed-size array", &code->loc);
9197 return;
9202 /*********** Toplevel code resolution subroutines ***********/
9204 /* Find the set of labels that are reachable from this block. We also
9205 record the last statement in each block. */
9207 static void
9208 find_reachable_labels (gfc_code *block)
9210 gfc_code *c;
9212 if (!block)
9213 return;
9215 cs_base->reachable_labels = bitmap_alloc (&labels_obstack);
9217 /* Collect labels in this block. We don't keep those corresponding
9218 to END {IF|SELECT}, these are checked in resolve_branch by going
9219 up through the code_stack. */
9220 for (c = block; c; c = c->next)
9222 if (c->here && c->op != EXEC_END_NESTED_BLOCK)
9223 bitmap_set_bit (cs_base->reachable_labels, c->here->value);
9226 /* Merge with labels from parent block. */
9227 if (cs_base->prev)
9229 gcc_assert (cs_base->prev->reachable_labels);
9230 bitmap_ior_into (cs_base->reachable_labels,
9231 cs_base->prev->reachable_labels);
9236 static void
9237 resolve_lock_unlock_event (gfc_code *code)
9239 if (code->expr1->expr_type == EXPR_FUNCTION
9240 && code->expr1->value.function.isym
9241 && code->expr1->value.function.isym->id == GFC_ISYM_CAF_GET)
9242 remove_caf_get_intrinsic (code->expr1);
9244 if ((code->op == EXEC_LOCK || code->op == EXEC_UNLOCK)
9245 && (code->expr1->ts.type != BT_DERIVED
9246 || code->expr1->expr_type != EXPR_VARIABLE
9247 || code->expr1->ts.u.derived->from_intmod != INTMOD_ISO_FORTRAN_ENV
9248 || code->expr1->ts.u.derived->intmod_sym_id != ISOFORTRAN_LOCK_TYPE
9249 || code->expr1->rank != 0
9250 || (!gfc_is_coarray (code->expr1) &&
9251 !gfc_is_coindexed (code->expr1))))
9252 gfc_error ("Lock variable at %L must be a scalar of type LOCK_TYPE",
9253 &code->expr1->where);
9254 else if ((code->op == EXEC_EVENT_POST || code->op == EXEC_EVENT_WAIT)
9255 && (code->expr1->ts.type != BT_DERIVED
9256 || code->expr1->expr_type != EXPR_VARIABLE
9257 || code->expr1->ts.u.derived->from_intmod
9258 != INTMOD_ISO_FORTRAN_ENV
9259 || code->expr1->ts.u.derived->intmod_sym_id
9260 != ISOFORTRAN_EVENT_TYPE
9261 || code->expr1->rank != 0))
9262 gfc_error ("Event variable at %L must be a scalar of type EVENT_TYPE",
9263 &code->expr1->where);
9264 else if (code->op == EXEC_EVENT_POST && !gfc_is_coarray (code->expr1)
9265 && !gfc_is_coindexed (code->expr1))
9266 gfc_error ("Event variable argument at %L must be a coarray or coindexed",
9267 &code->expr1->where);
9268 else if (code->op == EXEC_EVENT_WAIT && !gfc_is_coarray (code->expr1))
9269 gfc_error ("Event variable argument at %L must be a coarray but not "
9270 "coindexed", &code->expr1->where);
9272 /* Check STAT. */
9273 if (code->expr2
9274 && (code->expr2->ts.type != BT_INTEGER || code->expr2->rank != 0
9275 || code->expr2->expr_type != EXPR_VARIABLE))
9276 gfc_error ("STAT= argument at %L must be a scalar INTEGER variable",
9277 &code->expr2->where);
9279 if (code->expr2
9280 && !gfc_check_vardef_context (code->expr2, false, false, false,
9281 _("STAT variable")))
9282 return;
9284 /* Check ERRMSG. */
9285 if (code->expr3
9286 && (code->expr3->ts.type != BT_CHARACTER || code->expr3->rank != 0
9287 || code->expr3->expr_type != EXPR_VARIABLE))
9288 gfc_error ("ERRMSG= argument at %L must be a scalar CHARACTER variable",
9289 &code->expr3->where);
9291 if (code->expr3
9292 && !gfc_check_vardef_context (code->expr3, false, false, false,
9293 _("ERRMSG variable")))
9294 return;
9296 /* Check for LOCK the ACQUIRED_LOCK. */
9297 if (code->op != EXEC_EVENT_WAIT && code->expr4
9298 && (code->expr4->ts.type != BT_LOGICAL || code->expr4->rank != 0
9299 || code->expr4->expr_type != EXPR_VARIABLE))
9300 gfc_error ("ACQUIRED_LOCK= argument at %L must be a scalar LOGICAL "
9301 "variable", &code->expr4->where);
9303 if (code->op != EXEC_EVENT_WAIT && code->expr4
9304 && !gfc_check_vardef_context (code->expr4, false, false, false,
9305 _("ACQUIRED_LOCK variable")))
9306 return;
9308 /* Check for EVENT WAIT the UNTIL_COUNT. */
9309 if (code->op == EXEC_EVENT_WAIT && code->expr4)
9311 if (!gfc_resolve_expr (code->expr4) || code->expr4->ts.type != BT_INTEGER
9312 || code->expr4->rank != 0)
9313 gfc_error ("UNTIL_COUNT= argument at %L must be a scalar INTEGER "
9314 "expression", &code->expr4->where);
9319 static void
9320 resolve_critical (gfc_code *code)
9322 gfc_symtree *symtree;
9323 gfc_symbol *lock_type;
9324 char name[GFC_MAX_SYMBOL_LEN];
9325 static int serial = 0;
9327 if (flag_coarray != GFC_FCOARRAY_LIB)
9328 return;
9330 symtree = gfc_find_symtree (gfc_current_ns->sym_root,
9331 GFC_PREFIX ("lock_type"));
9332 if (symtree)
9333 lock_type = symtree->n.sym;
9334 else
9336 if (gfc_get_sym_tree (GFC_PREFIX ("lock_type"), gfc_current_ns, &symtree,
9337 false) != 0)
9338 gcc_unreachable ();
9339 lock_type = symtree->n.sym;
9340 lock_type->attr.flavor = FL_DERIVED;
9341 lock_type->attr.zero_comp = 1;
9342 lock_type->from_intmod = INTMOD_ISO_FORTRAN_ENV;
9343 lock_type->intmod_sym_id = ISOFORTRAN_LOCK_TYPE;
9346 sprintf(name, GFC_PREFIX ("lock_var") "%d",serial++);
9347 if (gfc_get_sym_tree (name, gfc_current_ns, &symtree, false) != 0)
9348 gcc_unreachable ();
9350 code->resolved_sym = symtree->n.sym;
9351 symtree->n.sym->attr.flavor = FL_VARIABLE;
9352 symtree->n.sym->attr.referenced = 1;
9353 symtree->n.sym->attr.artificial = 1;
9354 symtree->n.sym->attr.codimension = 1;
9355 symtree->n.sym->ts.type = BT_DERIVED;
9356 symtree->n.sym->ts.u.derived = lock_type;
9357 symtree->n.sym->as = gfc_get_array_spec ();
9358 symtree->n.sym->as->corank = 1;
9359 symtree->n.sym->as->type = AS_EXPLICIT;
9360 symtree->n.sym->as->cotype = AS_EXPLICIT;
9361 symtree->n.sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind,
9362 NULL, 1);
9363 gfc_commit_symbols();
9367 static void
9368 resolve_sync (gfc_code *code)
9370 /* Check imageset. The * case matches expr1 == NULL. */
9371 if (code->expr1)
9373 if (code->expr1->ts.type != BT_INTEGER || code->expr1->rank > 1)
9374 gfc_error ("Imageset argument at %L must be a scalar or rank-1 "
9375 "INTEGER expression", &code->expr1->where);
9376 if (code->expr1->expr_type == EXPR_CONSTANT && code->expr1->rank == 0
9377 && mpz_cmp_si (code->expr1->value.integer, 1) < 0)
9378 gfc_error ("Imageset argument at %L must between 1 and num_images()",
9379 &code->expr1->where);
9380 else if (code->expr1->expr_type == EXPR_ARRAY
9381 && gfc_simplify_expr (code->expr1, 0))
9383 gfc_constructor *cons;
9384 cons = gfc_constructor_first (code->expr1->value.constructor);
9385 for (; cons; cons = gfc_constructor_next (cons))
9386 if (cons->expr->expr_type == EXPR_CONSTANT
9387 && mpz_cmp_si (cons->expr->value.integer, 1) < 0)
9388 gfc_error ("Imageset argument at %L must between 1 and "
9389 "num_images()", &cons->expr->where);
9393 /* Check STAT. */
9394 if (code->expr2
9395 && (code->expr2->ts.type != BT_INTEGER || code->expr2->rank != 0
9396 || code->expr2->expr_type != EXPR_VARIABLE))
9397 gfc_error ("STAT= argument at %L must be a scalar INTEGER variable",
9398 &code->expr2->where);
9400 /* Check ERRMSG. */
9401 if (code->expr3
9402 && (code->expr3->ts.type != BT_CHARACTER || code->expr3->rank != 0
9403 || code->expr3->expr_type != EXPR_VARIABLE))
9404 gfc_error ("ERRMSG= argument at %L must be a scalar CHARACTER variable",
9405 &code->expr3->where);
9409 /* Given a branch to a label, see if the branch is conforming.
9410 The code node describes where the branch is located. */
9412 static void
9413 resolve_branch (gfc_st_label *label, gfc_code *code)
9415 code_stack *stack;
9417 if (label == NULL)
9418 return;
9420 /* Step one: is this a valid branching target? */
9422 if (label->defined == ST_LABEL_UNKNOWN)
9424 gfc_error ("Label %d referenced at %L is never defined", label->value,
9425 &code->loc);
9426 return;
9429 if (label->defined != ST_LABEL_TARGET && label->defined != ST_LABEL_DO_TARGET)
9431 gfc_error ("Statement at %L is not a valid branch target statement "
9432 "for the branch statement at %L", &label->where, &code->loc);
9433 return;
9436 /* Step two: make sure this branch is not a branch to itself ;-) */
9438 if (code->here == label)
9440 gfc_warning (0,
9441 "Branch at %L may result in an infinite loop", &code->loc);
9442 return;
9445 /* Step three: See if the label is in the same block as the
9446 branching statement. The hard work has been done by setting up
9447 the bitmap reachable_labels. */
9449 if (bitmap_bit_p (cs_base->reachable_labels, label->value))
9451 /* Check now whether there is a CRITICAL construct; if so, check
9452 whether the label is still visible outside of the CRITICAL block,
9453 which is invalid. */
9454 for (stack = cs_base; stack; stack = stack->prev)
9456 if (stack->current->op == EXEC_CRITICAL
9457 && bitmap_bit_p (stack->reachable_labels, label->value))
9458 gfc_error ("GOTO statement at %L leaves CRITICAL construct for "
9459 "label at %L", &code->loc, &label->where);
9460 else if (stack->current->op == EXEC_DO_CONCURRENT
9461 && bitmap_bit_p (stack->reachable_labels, label->value))
9462 gfc_error ("GOTO statement at %L leaves DO CONCURRENT construct "
9463 "for label at %L", &code->loc, &label->where);
9466 return;
9469 /* Step four: If we haven't found the label in the bitmap, it may
9470 still be the label of the END of the enclosing block, in which
9471 case we find it by going up the code_stack. */
9473 for (stack = cs_base; stack; stack = stack->prev)
9475 if (stack->current->next && stack->current->next->here == label)
9476 break;
9477 if (stack->current->op == EXEC_CRITICAL)
9479 /* Note: A label at END CRITICAL does not leave the CRITICAL
9480 construct as END CRITICAL is still part of it. */
9481 gfc_error ("GOTO statement at %L leaves CRITICAL construct for label"
9482 " at %L", &code->loc, &label->where);
9483 return;
9485 else if (stack->current->op == EXEC_DO_CONCURRENT)
9487 gfc_error ("GOTO statement at %L leaves DO CONCURRENT construct for "
9488 "label at %L", &code->loc, &label->where);
9489 return;
9493 if (stack)
9495 gcc_assert (stack->current->next->op == EXEC_END_NESTED_BLOCK);
9496 return;
9499 /* The label is not in an enclosing block, so illegal. This was
9500 allowed in Fortran 66, so we allow it as extension. No
9501 further checks are necessary in this case. */
9502 gfc_notify_std (GFC_STD_LEGACY, "Label at %L is not in the same block "
9503 "as the GOTO statement at %L", &label->where,
9504 &code->loc);
9505 return;
9509 /* Check whether EXPR1 has the same shape as EXPR2. */
9511 static bool
9512 resolve_where_shape (gfc_expr *expr1, gfc_expr *expr2)
9514 mpz_t shape[GFC_MAX_DIMENSIONS];
9515 mpz_t shape2[GFC_MAX_DIMENSIONS];
9516 bool result = false;
9517 int i;
9519 /* Compare the rank. */
9520 if (expr1->rank != expr2->rank)
9521 return result;
9523 /* Compare the size of each dimension. */
9524 for (i=0; i<expr1->rank; i++)
9526 if (!gfc_array_dimen_size (expr1, i, &shape[i]))
9527 goto ignore;
9529 if (!gfc_array_dimen_size (expr2, i, &shape2[i]))
9530 goto ignore;
9532 if (mpz_cmp (shape[i], shape2[i]))
9533 goto over;
9536 /* When either of the two expression is an assumed size array, we
9537 ignore the comparison of dimension sizes. */
9538 ignore:
9539 result = true;
9541 over:
9542 gfc_clear_shape (shape, i);
9543 gfc_clear_shape (shape2, i);
9544 return result;
9548 /* Check whether a WHERE assignment target or a WHERE mask expression
9549 has the same shape as the outmost WHERE mask expression. */
9551 static void
9552 resolve_where (gfc_code *code, gfc_expr *mask)
9554 gfc_code *cblock;
9555 gfc_code *cnext;
9556 gfc_expr *e = NULL;
9558 cblock = code->block;
9560 /* Store the first WHERE mask-expr of the WHERE statement or construct.
9561 In case of nested WHERE, only the outmost one is stored. */
9562 if (mask == NULL) /* outmost WHERE */
9563 e = cblock->expr1;
9564 else /* inner WHERE */
9565 e = mask;
9567 while (cblock)
9569 if (cblock->expr1)
9571 /* Check if the mask-expr has a consistent shape with the
9572 outmost WHERE mask-expr. */
9573 if (!resolve_where_shape (cblock->expr1, e))
9574 gfc_error ("WHERE mask at %L has inconsistent shape",
9575 &cblock->expr1->where);
9578 /* the assignment statement of a WHERE statement, or the first
9579 statement in where-body-construct of a WHERE construct */
9580 cnext = cblock->next;
9581 while (cnext)
9583 switch (cnext->op)
9585 /* WHERE assignment statement */
9586 case EXEC_ASSIGN:
9588 /* Check shape consistent for WHERE assignment target. */
9589 if (e && !resolve_where_shape (cnext->expr1, e))
9590 gfc_error ("WHERE assignment target at %L has "
9591 "inconsistent shape", &cnext->expr1->where);
9592 break;
9595 case EXEC_ASSIGN_CALL:
9596 resolve_call (cnext);
9597 if (!cnext->resolved_sym->attr.elemental)
9598 gfc_error("Non-ELEMENTAL user-defined assignment in WHERE at %L",
9599 &cnext->ext.actual->expr->where);
9600 break;
9602 /* WHERE or WHERE construct is part of a where-body-construct */
9603 case EXEC_WHERE:
9604 resolve_where (cnext, e);
9605 break;
9607 default:
9608 gfc_error ("Unsupported statement inside WHERE at %L",
9609 &cnext->loc);
9611 /* the next statement within the same where-body-construct */
9612 cnext = cnext->next;
9614 /* the next masked-elsewhere-stmt, elsewhere-stmt, or end-where-stmt */
9615 cblock = cblock->block;
9620 /* Resolve assignment in FORALL construct.
9621 NVAR is the number of FORALL index variables, and VAR_EXPR records the
9622 FORALL index variables. */
9624 static void
9625 gfc_resolve_assign_in_forall (gfc_code *code, int nvar, gfc_expr **var_expr)
9627 int n;
9629 for (n = 0; n < nvar; n++)
9631 gfc_symbol *forall_index;
9633 forall_index = var_expr[n]->symtree->n.sym;
9635 /* Check whether the assignment target is one of the FORALL index
9636 variable. */
9637 if ((code->expr1->expr_type == EXPR_VARIABLE)
9638 && (code->expr1->symtree->n.sym == forall_index))
9639 gfc_error ("Assignment to a FORALL index variable at %L",
9640 &code->expr1->where);
9641 else
9643 /* If one of the FORALL index variables doesn't appear in the
9644 assignment variable, then there could be a many-to-one
9645 assignment. Emit a warning rather than an error because the
9646 mask could be resolving this problem. */
9647 if (!find_forall_index (code->expr1, forall_index, 0))
9648 gfc_warning (0, "The FORALL with index %qs is not used on the "
9649 "left side of the assignment at %L and so might "
9650 "cause multiple assignment to this object",
9651 var_expr[n]->symtree->name, &code->expr1->where);
9657 /* Resolve WHERE statement in FORALL construct. */
9659 static void
9660 gfc_resolve_where_code_in_forall (gfc_code *code, int nvar,
9661 gfc_expr **var_expr)
9663 gfc_code *cblock;
9664 gfc_code *cnext;
9666 cblock = code->block;
9667 while (cblock)
9669 /* the assignment statement of a WHERE statement, or the first
9670 statement in where-body-construct of a WHERE construct */
9671 cnext = cblock->next;
9672 while (cnext)
9674 switch (cnext->op)
9676 /* WHERE assignment statement */
9677 case EXEC_ASSIGN:
9678 gfc_resolve_assign_in_forall (cnext, nvar, var_expr);
9679 break;
9681 /* WHERE operator assignment statement */
9682 case EXEC_ASSIGN_CALL:
9683 resolve_call (cnext);
9684 if (!cnext->resolved_sym->attr.elemental)
9685 gfc_error("Non-ELEMENTAL user-defined assignment in WHERE at %L",
9686 &cnext->ext.actual->expr->where);
9687 break;
9689 /* WHERE or WHERE construct is part of a where-body-construct */
9690 case EXEC_WHERE:
9691 gfc_resolve_where_code_in_forall (cnext, nvar, var_expr);
9692 break;
9694 default:
9695 gfc_error ("Unsupported statement inside WHERE at %L",
9696 &cnext->loc);
9698 /* the next statement within the same where-body-construct */
9699 cnext = cnext->next;
9701 /* the next masked-elsewhere-stmt, elsewhere-stmt, or end-where-stmt */
9702 cblock = cblock->block;
9707 /* Traverse the FORALL body to check whether the following errors exist:
9708 1. For assignment, check if a many-to-one assignment happens.
9709 2. For WHERE statement, check the WHERE body to see if there is any
9710 many-to-one assignment. */
9712 static void
9713 gfc_resolve_forall_body (gfc_code *code, int nvar, gfc_expr **var_expr)
9715 gfc_code *c;
9717 c = code->block->next;
9718 while (c)
9720 switch (c->op)
9722 case EXEC_ASSIGN:
9723 case EXEC_POINTER_ASSIGN:
9724 gfc_resolve_assign_in_forall (c, nvar, var_expr);
9725 break;
9727 case EXEC_ASSIGN_CALL:
9728 resolve_call (c);
9729 break;
9731 /* Because the gfc_resolve_blocks() will handle the nested FORALL,
9732 there is no need to handle it here. */
9733 case EXEC_FORALL:
9734 break;
9735 case EXEC_WHERE:
9736 gfc_resolve_where_code_in_forall(c, nvar, var_expr);
9737 break;
9738 default:
9739 break;
9741 /* The next statement in the FORALL body. */
9742 c = c->next;
9747 /* Counts the number of iterators needed inside a forall construct, including
9748 nested forall constructs. This is used to allocate the needed memory
9749 in gfc_resolve_forall. */
9751 static int
9752 gfc_count_forall_iterators (gfc_code *code)
9754 int max_iters, sub_iters, current_iters;
9755 gfc_forall_iterator *fa;
9757 gcc_assert(code->op == EXEC_FORALL);
9758 max_iters = 0;
9759 current_iters = 0;
9761 for (fa = code->ext.forall_iterator; fa; fa = fa->next)
9762 current_iters ++;
9764 code = code->block->next;
9766 while (code)
9768 if (code->op == EXEC_FORALL)
9770 sub_iters = gfc_count_forall_iterators (code);
9771 if (sub_iters > max_iters)
9772 max_iters = sub_iters;
9774 code = code->next;
9777 return current_iters + max_iters;
9781 /* Given a FORALL construct, first resolve the FORALL iterator, then call
9782 gfc_resolve_forall_body to resolve the FORALL body. */
9784 static void
9785 gfc_resolve_forall (gfc_code *code, gfc_namespace *ns, int forall_save)
9787 static gfc_expr **var_expr;
9788 static int total_var = 0;
9789 static int nvar = 0;
9790 int i, old_nvar, tmp;
9791 gfc_forall_iterator *fa;
9793 old_nvar = nvar;
9795 /* Start to resolve a FORALL construct */
9796 if (forall_save == 0)
9798 /* Count the total number of FORALL indices in the nested FORALL
9799 construct in order to allocate the VAR_EXPR with proper size. */
9800 total_var = gfc_count_forall_iterators (code);
9802 /* Allocate VAR_EXPR with NUMBER_OF_FORALL_INDEX elements. */
9803 var_expr = XCNEWVEC (gfc_expr *, total_var);
9806 /* The information about FORALL iterator, including FORALL indices start, end
9807 and stride. An outer FORALL indice cannot appear in start, end or stride. */
9808 for (fa = code->ext.forall_iterator; fa; fa = fa->next)
9810 /* Fortran 20008: C738 (R753). */
9811 if (fa->var->ref && fa->var->ref->type == REF_ARRAY)
9813 gfc_error ("FORALL index-name at %L must be a scalar variable "
9814 "of type integer", &fa->var->where);
9815 continue;
9818 /* Check if any outer FORALL index name is the same as the current
9819 one. */
9820 for (i = 0; i < nvar; i++)
9822 if (fa->var->symtree->n.sym == var_expr[i]->symtree->n.sym)
9823 gfc_error ("An outer FORALL construct already has an index "
9824 "with this name %L", &fa->var->where);
9827 /* Record the current FORALL index. */
9828 var_expr[nvar] = gfc_copy_expr (fa->var);
9830 nvar++;
9832 /* No memory leak. */
9833 gcc_assert (nvar <= total_var);
9836 /* Resolve the FORALL body. */
9837 gfc_resolve_forall_body (code, nvar, var_expr);
9839 /* May call gfc_resolve_forall to resolve the inner FORALL loop. */
9840 gfc_resolve_blocks (code->block, ns);
9842 tmp = nvar;
9843 nvar = old_nvar;
9844 /* Free only the VAR_EXPRs allocated in this frame. */
9845 for (i = nvar; i < tmp; i++)
9846 gfc_free_expr (var_expr[i]);
9848 if (nvar == 0)
9850 /* We are in the outermost FORALL construct. */
9851 gcc_assert (forall_save == 0);
9853 /* VAR_EXPR is not needed any more. */
9854 free (var_expr);
9855 total_var = 0;
9860 /* Resolve a BLOCK construct statement. */
9862 static void
9863 resolve_block_construct (gfc_code* code)
9865 /* Resolve the BLOCK's namespace. */
9866 gfc_resolve (code->ext.block.ns);
9868 /* For an ASSOCIATE block, the associations (and their targets) are already
9869 resolved during resolve_symbol. */
9873 /* Resolve lists of blocks found in IF, SELECT CASE, WHERE, FORALL, GOTO and
9874 DO code nodes. */
9876 void
9877 gfc_resolve_blocks (gfc_code *b, gfc_namespace *ns)
9879 bool t;
9881 for (; b; b = b->block)
9883 t = gfc_resolve_expr (b->expr1);
9884 if (!gfc_resolve_expr (b->expr2))
9885 t = false;
9887 switch (b->op)
9889 case EXEC_IF:
9890 if (t && b->expr1 != NULL
9891 && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank != 0))
9892 gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
9893 &b->expr1->where);
9894 break;
9896 case EXEC_WHERE:
9897 if (t
9898 && b->expr1 != NULL
9899 && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank == 0))
9900 gfc_error ("WHERE/ELSEWHERE clause at %L requires a LOGICAL array",
9901 &b->expr1->where);
9902 break;
9904 case EXEC_GOTO:
9905 resolve_branch (b->label1, b);
9906 break;
9908 case EXEC_BLOCK:
9909 resolve_block_construct (b);
9910 break;
9912 case EXEC_SELECT:
9913 case EXEC_SELECT_TYPE:
9914 case EXEC_FORALL:
9915 case EXEC_DO:
9916 case EXEC_DO_WHILE:
9917 case EXEC_DO_CONCURRENT:
9918 case EXEC_CRITICAL:
9919 case EXEC_READ:
9920 case EXEC_WRITE:
9921 case EXEC_IOLENGTH:
9922 case EXEC_WAIT:
9923 break;
9925 case EXEC_OMP_ATOMIC:
9926 case EXEC_OACC_ATOMIC:
9928 gfc_omp_atomic_op aop
9929 = (gfc_omp_atomic_op) (b->ext.omp_atomic & GFC_OMP_ATOMIC_MASK);
9931 /* Verify this before calling gfc_resolve_code, which might
9932 change it. */
9933 gcc_assert (b->next && b->next->op == EXEC_ASSIGN);
9934 gcc_assert (((aop != GFC_OMP_ATOMIC_CAPTURE)
9935 && b->next->next == NULL)
9936 || ((aop == GFC_OMP_ATOMIC_CAPTURE)
9937 && b->next->next != NULL
9938 && b->next->next->op == EXEC_ASSIGN
9939 && b->next->next->next == NULL));
9941 break;
9943 case EXEC_OACC_PARALLEL_LOOP:
9944 case EXEC_OACC_PARALLEL:
9945 case EXEC_OACC_KERNELS_LOOP:
9946 case EXEC_OACC_KERNELS:
9947 case EXEC_OACC_DATA:
9948 case EXEC_OACC_HOST_DATA:
9949 case EXEC_OACC_LOOP:
9950 case EXEC_OACC_UPDATE:
9951 case EXEC_OACC_WAIT:
9952 case EXEC_OACC_CACHE:
9953 case EXEC_OACC_ENTER_DATA:
9954 case EXEC_OACC_EXIT_DATA:
9955 case EXEC_OACC_ROUTINE:
9956 case EXEC_OMP_CRITICAL:
9957 case EXEC_OMP_DISTRIBUTE:
9958 case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
9959 case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
9960 case EXEC_OMP_DISTRIBUTE_SIMD:
9961 case EXEC_OMP_DO:
9962 case EXEC_OMP_DO_SIMD:
9963 case EXEC_OMP_MASTER:
9964 case EXEC_OMP_ORDERED:
9965 case EXEC_OMP_PARALLEL:
9966 case EXEC_OMP_PARALLEL_DO:
9967 case EXEC_OMP_PARALLEL_DO_SIMD:
9968 case EXEC_OMP_PARALLEL_SECTIONS:
9969 case EXEC_OMP_PARALLEL_WORKSHARE:
9970 case EXEC_OMP_SECTIONS:
9971 case EXEC_OMP_SIMD:
9972 case EXEC_OMP_SINGLE:
9973 case EXEC_OMP_TARGET:
9974 case EXEC_OMP_TARGET_DATA:
9975 case EXEC_OMP_TARGET_ENTER_DATA:
9976 case EXEC_OMP_TARGET_EXIT_DATA:
9977 case EXEC_OMP_TARGET_PARALLEL:
9978 case EXEC_OMP_TARGET_PARALLEL_DO:
9979 case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
9980 case EXEC_OMP_TARGET_SIMD:
9981 case EXEC_OMP_TARGET_TEAMS:
9982 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
9983 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
9984 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
9985 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
9986 case EXEC_OMP_TARGET_UPDATE:
9987 case EXEC_OMP_TASK:
9988 case EXEC_OMP_TASKGROUP:
9989 case EXEC_OMP_TASKLOOP:
9990 case EXEC_OMP_TASKLOOP_SIMD:
9991 case EXEC_OMP_TASKWAIT:
9992 case EXEC_OMP_TASKYIELD:
9993 case EXEC_OMP_TEAMS:
9994 case EXEC_OMP_TEAMS_DISTRIBUTE:
9995 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
9996 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
9997 case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
9998 case EXEC_OMP_WORKSHARE:
9999 break;
10001 default:
10002 gfc_internal_error ("gfc_resolve_blocks(): Bad block type");
10005 gfc_resolve_code (b->next, ns);
10010 /* Does everything to resolve an ordinary assignment. Returns true
10011 if this is an interface assignment. */
10012 static bool
10013 resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns)
10015 bool rval = false;
10016 gfc_expr *lhs;
10017 gfc_expr *rhs;
10018 int llen = 0;
10019 int rlen = 0;
10020 int n;
10021 gfc_ref *ref;
10022 symbol_attribute attr;
10024 if (gfc_extend_assign (code, ns))
10026 gfc_expr** rhsptr;
10028 if (code->op == EXEC_ASSIGN_CALL)
10030 lhs = code->ext.actual->expr;
10031 rhsptr = &code->ext.actual->next->expr;
10033 else
10035 gfc_actual_arglist* args;
10036 gfc_typebound_proc* tbp;
10038 gcc_assert (code->op == EXEC_COMPCALL);
10040 args = code->expr1->value.compcall.actual;
10041 lhs = args->expr;
10042 rhsptr = &args->next->expr;
10044 tbp = code->expr1->value.compcall.tbp;
10045 gcc_assert (!tbp->is_generic);
10048 /* Make a temporary rhs when there is a default initializer
10049 and rhs is the same symbol as the lhs. */
10050 if ((*rhsptr)->expr_type == EXPR_VARIABLE
10051 && (*rhsptr)->symtree->n.sym->ts.type == BT_DERIVED
10052 && gfc_has_default_initializer ((*rhsptr)->symtree->n.sym->ts.u.derived)
10053 && (lhs->symtree->n.sym == (*rhsptr)->symtree->n.sym))
10054 *rhsptr = gfc_get_parentheses (*rhsptr);
10056 return true;
10059 lhs = code->expr1;
10060 rhs = code->expr2;
10062 if (rhs->is_boz
10063 && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L outside "
10064 "a DATA statement and outside INT/REAL/DBLE/CMPLX",
10065 &code->loc))
10066 return false;
10068 /* Handle the case of a BOZ literal on the RHS. */
10069 if (rhs->is_boz && lhs->ts.type != BT_INTEGER)
10071 int rc;
10072 if (warn_surprising)
10073 gfc_warning (OPT_Wsurprising,
10074 "BOZ literal at %L is bitwise transferred "
10075 "non-integer symbol %qs", &code->loc,
10076 lhs->symtree->n.sym->name);
10078 if (!gfc_convert_boz (rhs, &lhs->ts))
10079 return false;
10080 if ((rc = gfc_range_check (rhs)) != ARITH_OK)
10082 if (rc == ARITH_UNDERFLOW)
10083 gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
10084 ". This check can be disabled with the option "
10085 "%<-fno-range-check%>", &rhs->where);
10086 else if (rc == ARITH_OVERFLOW)
10087 gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
10088 ". This check can be disabled with the option "
10089 "%<-fno-range-check%>", &rhs->where);
10090 else if (rc == ARITH_NAN)
10091 gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
10092 ". This check can be disabled with the option "
10093 "%<-fno-range-check%>", &rhs->where);
10094 return false;
10098 if (lhs->ts.type == BT_CHARACTER
10099 && warn_character_truncation)
10101 if (lhs->ts.u.cl != NULL
10102 && lhs->ts.u.cl->length != NULL
10103 && lhs->ts.u.cl->length->expr_type == EXPR_CONSTANT)
10104 llen = mpz_get_si (lhs->ts.u.cl->length->value.integer);
10106 if (rhs->expr_type == EXPR_CONSTANT)
10107 rlen = rhs->value.character.length;
10109 else if (rhs->ts.u.cl != NULL
10110 && rhs->ts.u.cl->length != NULL
10111 && rhs->ts.u.cl->length->expr_type == EXPR_CONSTANT)
10112 rlen = mpz_get_si (rhs->ts.u.cl->length->value.integer);
10114 if (rlen && llen && rlen > llen)
10115 gfc_warning_now (OPT_Wcharacter_truncation,
10116 "CHARACTER expression will be truncated "
10117 "in assignment (%d/%d) at %L",
10118 llen, rlen, &code->loc);
10121 /* Ensure that a vector index expression for the lvalue is evaluated
10122 to a temporary if the lvalue symbol is referenced in it. */
10123 if (lhs->rank)
10125 for (ref = lhs->ref; ref; ref= ref->next)
10126 if (ref->type == REF_ARRAY)
10128 for (n = 0; n < ref->u.ar.dimen; n++)
10129 if (ref->u.ar.dimen_type[n] == DIMEN_VECTOR
10130 && gfc_find_sym_in_expr (lhs->symtree->n.sym,
10131 ref->u.ar.start[n]))
10132 ref->u.ar.start[n]
10133 = gfc_get_parentheses (ref->u.ar.start[n]);
10137 if (gfc_pure (NULL))
10139 if (lhs->ts.type == BT_DERIVED
10140 && lhs->expr_type == EXPR_VARIABLE
10141 && lhs->ts.u.derived->attr.pointer_comp
10142 && rhs->expr_type == EXPR_VARIABLE
10143 && (gfc_impure_variable (rhs->symtree->n.sym)
10144 || gfc_is_coindexed (rhs)))
10146 /* F2008, C1283. */
10147 if (gfc_is_coindexed (rhs))
10148 gfc_error ("Coindexed expression at %L is assigned to "
10149 "a derived type variable with a POINTER "
10150 "component in a PURE procedure",
10151 &rhs->where);
10152 else
10153 gfc_error ("The impure variable at %L is assigned to "
10154 "a derived type variable with a POINTER "
10155 "component in a PURE procedure (12.6)",
10156 &rhs->where);
10157 return rval;
10160 /* Fortran 2008, C1283. */
10161 if (gfc_is_coindexed (lhs))
10163 gfc_error ("Assignment to coindexed variable at %L in a PURE "
10164 "procedure", &rhs->where);
10165 return rval;
10169 if (gfc_implicit_pure (NULL))
10171 if (lhs->expr_type == EXPR_VARIABLE
10172 && lhs->symtree->n.sym != gfc_current_ns->proc_name
10173 && lhs->symtree->n.sym->ns != gfc_current_ns)
10174 gfc_unset_implicit_pure (NULL);
10176 if (lhs->ts.type == BT_DERIVED
10177 && lhs->expr_type == EXPR_VARIABLE
10178 && lhs->ts.u.derived->attr.pointer_comp
10179 && rhs->expr_type == EXPR_VARIABLE
10180 && (gfc_impure_variable (rhs->symtree->n.sym)
10181 || gfc_is_coindexed (rhs)))
10182 gfc_unset_implicit_pure (NULL);
10184 /* Fortran 2008, C1283. */
10185 if (gfc_is_coindexed (lhs))
10186 gfc_unset_implicit_pure (NULL);
10189 /* F2008, 7.2.1.2. */
10190 attr = gfc_expr_attr (lhs);
10191 if (lhs->ts.type == BT_CLASS && attr.allocatable)
10193 if (attr.codimension)
10195 gfc_error ("Assignment to polymorphic coarray at %L is not "
10196 "permitted", &lhs->where);
10197 return false;
10199 if (!gfc_notify_std (GFC_STD_F2008, "Assignment to an allocatable "
10200 "polymorphic variable at %L", &lhs->where))
10201 return false;
10202 if (!flag_realloc_lhs)
10204 gfc_error ("Assignment to an allocatable polymorphic variable at %L "
10205 "requires %<-frealloc-lhs%>", &lhs->where);
10206 return false;
10209 else if (lhs->ts.type == BT_CLASS)
10211 gfc_error ("Nonallocatable variable must not be polymorphic in intrinsic "
10212 "assignment at %L - check that there is a matching specific "
10213 "subroutine for '=' operator", &lhs->where);
10214 return false;
10217 bool lhs_coindexed = gfc_is_coindexed (lhs);
10219 /* F2008, Section 7.2.1.2. */
10220 if (lhs_coindexed && gfc_has_ultimate_allocatable (lhs))
10222 gfc_error ("Coindexed variable must not have an allocatable ultimate "
10223 "component in assignment at %L", &lhs->where);
10224 return false;
10227 /* Assign the 'data' of a class object to a derived type. */
10228 if (lhs->ts.type == BT_DERIVED
10229 && rhs->ts.type == BT_CLASS)
10230 gfc_add_data_component (rhs);
10232 bool caf_convert_to_send = flag_coarray == GFC_FCOARRAY_LIB
10233 && (lhs_coindexed
10234 || (code->expr2->expr_type == EXPR_FUNCTION
10235 && code->expr2->value.function.isym
10236 && code->expr2->value.function.isym->id == GFC_ISYM_CAF_GET
10237 && (code->expr1->rank == 0 || code->expr2->rank != 0)
10238 && !gfc_expr_attr (rhs).allocatable
10239 && !gfc_has_vector_subscript (rhs)));
10241 gfc_check_assign (lhs, rhs, 1, !caf_convert_to_send);
10243 /* Insert a GFC_ISYM_CAF_SEND intrinsic, when the LHS is a coindexed variable.
10244 Additionally, insert this code when the RHS is a CAF as we then use the
10245 GFC_ISYM_CAF_SEND intrinsic just to avoid a temporary; but do not do so if
10246 the LHS is (re)allocatable or has a vector subscript. If the LHS is a
10247 noncoindexed array and the RHS is a coindexed scalar, use the normal code
10248 path. */
10249 if (caf_convert_to_send)
10251 if (code->expr2->expr_type == EXPR_FUNCTION
10252 && code->expr2->value.function.isym
10253 && code->expr2->value.function.isym->id == GFC_ISYM_CAF_GET)
10254 remove_caf_get_intrinsic (code->expr2);
10255 code->op = EXEC_CALL;
10256 gfc_get_sym_tree (GFC_PREFIX ("caf_send"), ns, &code->symtree, true);
10257 code->resolved_sym = code->symtree->n.sym;
10258 code->resolved_sym->attr.flavor = FL_PROCEDURE;
10259 code->resolved_sym->attr.intrinsic = 1;
10260 code->resolved_sym->attr.subroutine = 1;
10261 code->resolved_isym = gfc_intrinsic_subroutine_by_id (GFC_ISYM_CAF_SEND);
10262 gfc_commit_symbol (code->resolved_sym);
10263 code->ext.actual = gfc_get_actual_arglist ();
10264 code->ext.actual->expr = lhs;
10265 code->ext.actual->next = gfc_get_actual_arglist ();
10266 code->ext.actual->next->expr = rhs;
10267 code->expr1 = NULL;
10268 code->expr2 = NULL;
10271 return false;
10275 /* Add a component reference onto an expression. */
10277 static void
10278 add_comp_ref (gfc_expr *e, gfc_component *c)
10280 gfc_ref **ref;
10281 ref = &(e->ref);
10282 while (*ref)
10283 ref = &((*ref)->next);
10284 *ref = gfc_get_ref ();
10285 (*ref)->type = REF_COMPONENT;
10286 (*ref)->u.c.sym = e->ts.u.derived;
10287 (*ref)->u.c.component = c;
10288 e->ts = c->ts;
10290 /* Add a full array ref, as necessary. */
10291 if (c->as)
10293 gfc_add_full_array_ref (e, c->as);
10294 e->rank = c->as->rank;
10299 /* Build an assignment. Keep the argument 'op' for future use, so that
10300 pointer assignments can be made. */
10302 static gfc_code *
10303 build_assignment (gfc_exec_op op, gfc_expr *expr1, gfc_expr *expr2,
10304 gfc_component *comp1, gfc_component *comp2, locus loc)
10306 gfc_code *this_code;
10308 this_code = gfc_get_code (op);
10309 this_code->next = NULL;
10310 this_code->expr1 = gfc_copy_expr (expr1);
10311 this_code->expr2 = gfc_copy_expr (expr2);
10312 this_code->loc = loc;
10313 if (comp1 && comp2)
10315 add_comp_ref (this_code->expr1, comp1);
10316 add_comp_ref (this_code->expr2, comp2);
10319 return this_code;
10323 /* Makes a temporary variable expression based on the characteristics of
10324 a given variable expression. */
10326 static gfc_expr*
10327 get_temp_from_expr (gfc_expr *e, gfc_namespace *ns)
10329 static int serial = 0;
10330 char name[GFC_MAX_SYMBOL_LEN];
10331 gfc_symtree *tmp;
10332 gfc_array_spec *as;
10333 gfc_array_ref *aref;
10334 gfc_ref *ref;
10336 sprintf (name, GFC_PREFIX("DA%d"), serial++);
10337 gfc_get_sym_tree (name, ns, &tmp, false);
10338 gfc_add_type (tmp->n.sym, &e->ts, NULL);
10340 as = NULL;
10341 ref = NULL;
10342 aref = NULL;
10344 /* Obtain the arrayspec for the temporary. */
10345 if (e->rank && e->expr_type != EXPR_ARRAY
10346 && e->expr_type != EXPR_FUNCTION
10347 && e->expr_type != EXPR_OP)
10349 aref = gfc_find_array_ref (e);
10350 if (e->expr_type == EXPR_VARIABLE
10351 && e->symtree->n.sym->as == aref->as)
10352 as = aref->as;
10353 else
10355 for (ref = e->ref; ref; ref = ref->next)
10356 if (ref->type == REF_COMPONENT
10357 && ref->u.c.component->as == aref->as)
10359 as = aref->as;
10360 break;
10365 /* Add the attributes and the arrayspec to the temporary. */
10366 tmp->n.sym->attr = gfc_expr_attr (e);
10367 tmp->n.sym->attr.function = 0;
10368 tmp->n.sym->attr.result = 0;
10369 tmp->n.sym->attr.flavor = FL_VARIABLE;
10371 if (as)
10373 tmp->n.sym->as = gfc_copy_array_spec (as);
10374 if (!ref)
10375 ref = e->ref;
10376 if (as->type == AS_DEFERRED)
10377 tmp->n.sym->attr.allocatable = 1;
10379 else if (e->rank && (e->expr_type == EXPR_ARRAY
10380 || e->expr_type == EXPR_FUNCTION
10381 || e->expr_type == EXPR_OP))
10383 tmp->n.sym->as = gfc_get_array_spec ();
10384 tmp->n.sym->as->type = AS_DEFERRED;
10385 tmp->n.sym->as->rank = e->rank;
10386 tmp->n.sym->attr.allocatable = 1;
10387 tmp->n.sym->attr.dimension = 1;
10389 else
10390 tmp->n.sym->attr.dimension = 0;
10392 gfc_set_sym_referenced (tmp->n.sym);
10393 gfc_commit_symbol (tmp->n.sym);
10394 e = gfc_lval_expr_from_sym (tmp->n.sym);
10396 /* Should the lhs be a section, use its array ref for the
10397 temporary expression. */
10398 if (aref && aref->type != AR_FULL)
10400 gfc_free_ref_list (e->ref);
10401 e->ref = gfc_copy_ref (ref);
10403 return e;
10407 /* Add one line of code to the code chain, making sure that 'head' and
10408 'tail' are appropriately updated. */
10410 static void
10411 add_code_to_chain (gfc_code **this_code, gfc_code **head, gfc_code **tail)
10413 gcc_assert (this_code);
10414 if (*head == NULL)
10415 *head = *tail = *this_code;
10416 else
10417 *tail = gfc_append_code (*tail, *this_code);
10418 *this_code = NULL;
10422 /* Counts the potential number of part array references that would
10423 result from resolution of typebound defined assignments. */
10425 static int
10426 nonscalar_typebound_assign (gfc_symbol *derived, int depth)
10428 gfc_component *c;
10429 int c_depth = 0, t_depth;
10431 for (c= derived->components; c; c = c->next)
10433 if ((!gfc_bt_struct (c->ts.type)
10434 || c->attr.pointer
10435 || c->attr.allocatable
10436 || c->attr.proc_pointer_comp
10437 || c->attr.class_pointer
10438 || c->attr.proc_pointer)
10439 && !c->attr.defined_assign_comp)
10440 continue;
10442 if (c->as && c_depth == 0)
10443 c_depth = 1;
10445 if (c->ts.u.derived->attr.defined_assign_comp)
10446 t_depth = nonscalar_typebound_assign (c->ts.u.derived,
10447 c->as ? 1 : 0);
10448 else
10449 t_depth = 0;
10451 c_depth = t_depth > c_depth ? t_depth : c_depth;
10453 return depth + c_depth;
10457 /* Implement 7.2.1.3 of the F08 standard:
10458 "An intrinsic assignment where the variable is of derived type is
10459 performed as if each component of the variable were assigned from the
10460 corresponding component of expr using pointer assignment (7.2.2) for
10461 each pointer component, defined assignment for each nonpointer
10462 nonallocatable component of a type that has a type-bound defined
10463 assignment consistent with the component, intrinsic assignment for
10464 each other nonpointer nonallocatable component, ..."
10466 The pointer assignments are taken care of by the intrinsic
10467 assignment of the structure itself. This function recursively adds
10468 defined assignments where required. The recursion is accomplished
10469 by calling gfc_resolve_code.
10471 When the lhs in a defined assignment has intent INOUT, we need a
10472 temporary for the lhs. In pseudo-code:
10474 ! Only call function lhs once.
10475 if (lhs is not a constant or an variable)
10476 temp_x = expr2
10477 expr2 => temp_x
10478 ! Do the intrinsic assignment
10479 expr1 = expr2
10480 ! Now do the defined assignments
10481 do over components with typebound defined assignment [%cmp]
10482 #if one component's assignment procedure is INOUT
10483 t1 = expr1
10484 #if expr2 non-variable
10485 temp_x = expr2
10486 expr2 => temp_x
10487 # endif
10488 expr1 = expr2
10489 # for each cmp
10490 t1%cmp {defined=} expr2%cmp
10491 expr1%cmp = t1%cmp
10492 #else
10493 expr1 = expr2
10495 # for each cmp
10496 expr1%cmp {defined=} expr2%cmp
10497 #endif
10500 /* The temporary assignments have to be put on top of the additional
10501 code to avoid the result being changed by the intrinsic assignment.
10503 static int component_assignment_level = 0;
10504 static gfc_code *tmp_head = NULL, *tmp_tail = NULL;
10506 static void
10507 generate_component_assignments (gfc_code **code, gfc_namespace *ns)
10509 gfc_component *comp1, *comp2;
10510 gfc_code *this_code = NULL, *head = NULL, *tail = NULL;
10511 gfc_expr *t1;
10512 int error_count, depth;
10514 gfc_get_errors (NULL, &error_count);
10516 /* Filter out continuing processing after an error. */
10517 if (error_count
10518 || (*code)->expr1->ts.type != BT_DERIVED
10519 || (*code)->expr2->ts.type != BT_DERIVED)
10520 return;
10522 /* TODO: Handle more than one part array reference in assignments. */
10523 depth = nonscalar_typebound_assign ((*code)->expr1->ts.u.derived,
10524 (*code)->expr1->rank ? 1 : 0);
10525 if (depth > 1)
10527 gfc_warning (0, "TODO: type-bound defined assignment(s) at %L not "
10528 "done because multiple part array references would "
10529 "occur in intermediate expressions.", &(*code)->loc);
10530 return;
10533 component_assignment_level++;
10535 /* Create a temporary so that functions get called only once. */
10536 if ((*code)->expr2->expr_type != EXPR_VARIABLE
10537 && (*code)->expr2->expr_type != EXPR_CONSTANT)
10539 gfc_expr *tmp_expr;
10541 /* Assign the rhs to the temporary. */
10542 tmp_expr = get_temp_from_expr ((*code)->expr1, ns);
10543 this_code = build_assignment (EXEC_ASSIGN,
10544 tmp_expr, (*code)->expr2,
10545 NULL, NULL, (*code)->loc);
10546 /* Add the code and substitute the rhs expression. */
10547 add_code_to_chain (&this_code, &tmp_head, &tmp_tail);
10548 gfc_free_expr ((*code)->expr2);
10549 (*code)->expr2 = tmp_expr;
10552 /* Do the intrinsic assignment. This is not needed if the lhs is one
10553 of the temporaries generated here, since the intrinsic assignment
10554 to the final result already does this. */
10555 if ((*code)->expr1->symtree->n.sym->name[2] != '@')
10557 this_code = build_assignment (EXEC_ASSIGN,
10558 (*code)->expr1, (*code)->expr2,
10559 NULL, NULL, (*code)->loc);
10560 add_code_to_chain (&this_code, &head, &tail);
10563 comp1 = (*code)->expr1->ts.u.derived->components;
10564 comp2 = (*code)->expr2->ts.u.derived->components;
10566 t1 = NULL;
10567 for (; comp1; comp1 = comp1->next, comp2 = comp2->next)
10569 bool inout = false;
10571 /* The intrinsic assignment does the right thing for pointers
10572 of all kinds and allocatable components. */
10573 if (!gfc_bt_struct (comp1->ts.type)
10574 || comp1->attr.pointer
10575 || comp1->attr.allocatable
10576 || comp1->attr.proc_pointer_comp
10577 || comp1->attr.class_pointer
10578 || comp1->attr.proc_pointer)
10579 continue;
10581 /* Make an assigment for this component. */
10582 this_code = build_assignment (EXEC_ASSIGN,
10583 (*code)->expr1, (*code)->expr2,
10584 comp1, comp2, (*code)->loc);
10586 /* Convert the assignment if there is a defined assignment for
10587 this type. Otherwise, using the call from gfc_resolve_code,
10588 recurse into its components. */
10589 gfc_resolve_code (this_code, ns);
10591 if (this_code->op == EXEC_ASSIGN_CALL)
10593 gfc_formal_arglist *dummy_args;
10594 gfc_symbol *rsym;
10595 /* Check that there is a typebound defined assignment. If not,
10596 then this must be a module defined assignment. We cannot
10597 use the defined_assign_comp attribute here because it must
10598 be this derived type that has the defined assignment and not
10599 a parent type. */
10600 if (!(comp1->ts.u.derived->f2k_derived
10601 && comp1->ts.u.derived->f2k_derived
10602 ->tb_op[INTRINSIC_ASSIGN]))
10604 gfc_free_statements (this_code);
10605 this_code = NULL;
10606 continue;
10609 /* If the first argument of the subroutine has intent INOUT
10610 a temporary must be generated and used instead. */
10611 rsym = this_code->resolved_sym;
10612 dummy_args = gfc_sym_get_dummy_args (rsym);
10613 if (dummy_args
10614 && dummy_args->sym->attr.intent == INTENT_INOUT)
10616 gfc_code *temp_code;
10617 inout = true;
10619 /* Build the temporary required for the assignment and put
10620 it at the head of the generated code. */
10621 if (!t1)
10623 t1 = get_temp_from_expr ((*code)->expr1, ns);
10624 temp_code = build_assignment (EXEC_ASSIGN,
10625 t1, (*code)->expr1,
10626 NULL, NULL, (*code)->loc);
10628 /* For allocatable LHS, check whether it is allocated. Note
10629 that allocatable components with defined assignment are
10630 not yet support. See PR 57696. */
10631 if ((*code)->expr1->symtree->n.sym->attr.allocatable)
10633 gfc_code *block;
10634 gfc_expr *e =
10635 gfc_lval_expr_from_sym ((*code)->expr1->symtree->n.sym);
10636 block = gfc_get_code (EXEC_IF);
10637 block->block = gfc_get_code (EXEC_IF);
10638 block->block->expr1
10639 = gfc_build_intrinsic_call (ns,
10640 GFC_ISYM_ALLOCATED, "allocated",
10641 (*code)->loc, 1, e);
10642 block->block->next = temp_code;
10643 temp_code = block;
10645 add_code_to_chain (&temp_code, &tmp_head, &tmp_tail);
10648 /* Replace the first actual arg with the component of the
10649 temporary. */
10650 gfc_free_expr (this_code->ext.actual->expr);
10651 this_code->ext.actual->expr = gfc_copy_expr (t1);
10652 add_comp_ref (this_code->ext.actual->expr, comp1);
10654 /* If the LHS variable is allocatable and wasn't allocated and
10655 the temporary is allocatable, pointer assign the address of
10656 the freshly allocated LHS to the temporary. */
10657 if ((*code)->expr1->symtree->n.sym->attr.allocatable
10658 && gfc_expr_attr ((*code)->expr1).allocatable)
10660 gfc_code *block;
10661 gfc_expr *cond;
10663 cond = gfc_get_expr ();
10664 cond->ts.type = BT_LOGICAL;
10665 cond->ts.kind = gfc_default_logical_kind;
10666 cond->expr_type = EXPR_OP;
10667 cond->where = (*code)->loc;
10668 cond->value.op.op = INTRINSIC_NOT;
10669 cond->value.op.op1 = gfc_build_intrinsic_call (ns,
10670 GFC_ISYM_ALLOCATED, "allocated",
10671 (*code)->loc, 1, gfc_copy_expr (t1));
10672 block = gfc_get_code (EXEC_IF);
10673 block->block = gfc_get_code (EXEC_IF);
10674 block->block->expr1 = cond;
10675 block->block->next = build_assignment (EXEC_POINTER_ASSIGN,
10676 t1, (*code)->expr1,
10677 NULL, NULL, (*code)->loc);
10678 add_code_to_chain (&block, &head, &tail);
10682 else if (this_code->op == EXEC_ASSIGN && !this_code->next)
10684 /* Don't add intrinsic assignments since they are already
10685 effected by the intrinsic assignment of the structure. */
10686 gfc_free_statements (this_code);
10687 this_code = NULL;
10688 continue;
10691 add_code_to_chain (&this_code, &head, &tail);
10693 if (t1 && inout)
10695 /* Transfer the value to the final result. */
10696 this_code = build_assignment (EXEC_ASSIGN,
10697 (*code)->expr1, t1,
10698 comp1, comp2, (*code)->loc);
10699 add_code_to_chain (&this_code, &head, &tail);
10703 /* Put the temporary assignments at the top of the generated code. */
10704 if (tmp_head && component_assignment_level == 1)
10706 gfc_append_code (tmp_head, head);
10707 head = tmp_head;
10708 tmp_head = tmp_tail = NULL;
10711 // If we did a pointer assignment - thus, we need to ensure that the LHS is
10712 // not accidentally deallocated. Hence, nullify t1.
10713 if (t1 && (*code)->expr1->symtree->n.sym->attr.allocatable
10714 && gfc_expr_attr ((*code)->expr1).allocatable)
10716 gfc_code *block;
10717 gfc_expr *cond;
10718 gfc_expr *e;
10720 e = gfc_lval_expr_from_sym ((*code)->expr1->symtree->n.sym);
10721 cond = gfc_build_intrinsic_call (ns, GFC_ISYM_ASSOCIATED, "associated",
10722 (*code)->loc, 2, gfc_copy_expr (t1), e);
10723 block = gfc_get_code (EXEC_IF);
10724 block->block = gfc_get_code (EXEC_IF);
10725 block->block->expr1 = cond;
10726 block->block->next = build_assignment (EXEC_POINTER_ASSIGN,
10727 t1, gfc_get_null_expr (&(*code)->loc),
10728 NULL, NULL, (*code)->loc);
10729 gfc_append_code (tail, block);
10730 tail = block;
10733 /* Now attach the remaining code chain to the input code. Step on
10734 to the end of the new code since resolution is complete. */
10735 gcc_assert ((*code)->op == EXEC_ASSIGN);
10736 tail->next = (*code)->next;
10737 /* Overwrite 'code' because this would place the intrinsic assignment
10738 before the temporary for the lhs is created. */
10739 gfc_free_expr ((*code)->expr1);
10740 gfc_free_expr ((*code)->expr2);
10741 **code = *head;
10742 if (head != tail)
10743 free (head);
10744 *code = tail;
10746 component_assignment_level--;
10750 /* F2008: Pointer function assignments are of the form:
10751 ptr_fcn (args) = expr
10752 This function breaks these assignments into two statements:
10753 temporary_pointer => ptr_fcn(args)
10754 temporary_pointer = expr */
10756 static bool
10757 resolve_ptr_fcn_assign (gfc_code **code, gfc_namespace *ns)
10759 gfc_expr *tmp_ptr_expr;
10760 gfc_code *this_code;
10761 gfc_component *comp;
10762 gfc_symbol *s;
10764 if ((*code)->expr1->expr_type != EXPR_FUNCTION)
10765 return false;
10767 /* Even if standard does not support this feature, continue to build
10768 the two statements to avoid upsetting frontend_passes.c. */
10769 gfc_notify_std (GFC_STD_F2008, "Pointer procedure assignment at "
10770 "%L", &(*code)->loc);
10772 comp = gfc_get_proc_ptr_comp ((*code)->expr1);
10774 if (comp)
10775 s = comp->ts.interface;
10776 else
10777 s = (*code)->expr1->symtree->n.sym;
10779 if (s == NULL || !s->result->attr.pointer)
10781 gfc_error ("The function result on the lhs of the assignment at "
10782 "%L must have the pointer attribute.",
10783 &(*code)->expr1->where);
10784 (*code)->op = EXEC_NOP;
10785 return false;
10788 tmp_ptr_expr = get_temp_from_expr ((*code)->expr2, ns);
10790 /* get_temp_from_expression is set up for ordinary assignments. To that
10791 end, where array bounds are not known, arrays are made allocatable.
10792 Change the temporary to a pointer here. */
10793 tmp_ptr_expr->symtree->n.sym->attr.pointer = 1;
10794 tmp_ptr_expr->symtree->n.sym->attr.allocatable = 0;
10795 tmp_ptr_expr->where = (*code)->loc;
10797 this_code = build_assignment (EXEC_ASSIGN,
10798 tmp_ptr_expr, (*code)->expr2,
10799 NULL, NULL, (*code)->loc);
10800 this_code->next = (*code)->next;
10801 (*code)->next = this_code;
10802 (*code)->op = EXEC_POINTER_ASSIGN;
10803 (*code)->expr2 = (*code)->expr1;
10804 (*code)->expr1 = tmp_ptr_expr;
10806 return true;
10810 /* Deferred character length assignments from an operator expression
10811 require a temporary because the character length of the lhs can
10812 change in the course of the assignment. */
10814 static bool
10815 deferred_op_assign (gfc_code **code, gfc_namespace *ns)
10817 gfc_expr *tmp_expr;
10818 gfc_code *this_code;
10820 if (!((*code)->expr1->ts.type == BT_CHARACTER
10821 && (*code)->expr1->ts.deferred && (*code)->expr1->rank
10822 && (*code)->expr2->expr_type == EXPR_OP))
10823 return false;
10825 if (!gfc_check_dependency ((*code)->expr1, (*code)->expr2, 1))
10826 return false;
10828 tmp_expr = get_temp_from_expr ((*code)->expr1, ns);
10829 tmp_expr->where = (*code)->loc;
10831 /* A new charlen is required to ensure that the variable string
10832 length is different to that of the original lhs. */
10833 tmp_expr->ts.u.cl = gfc_get_charlen();
10834 tmp_expr->symtree->n.sym->ts.u.cl = tmp_expr->ts.u.cl;
10835 tmp_expr->ts.u.cl->next = (*code)->expr2->ts.u.cl->next;
10836 (*code)->expr2->ts.u.cl->next = tmp_expr->ts.u.cl;
10838 tmp_expr->symtree->n.sym->ts.deferred = 1;
10840 this_code = build_assignment (EXEC_ASSIGN,
10841 (*code)->expr1,
10842 gfc_copy_expr (tmp_expr),
10843 NULL, NULL, (*code)->loc);
10845 (*code)->expr1 = tmp_expr;
10847 this_code->next = (*code)->next;
10848 (*code)->next = this_code;
10850 return true;
10854 /* Given a block of code, recursively resolve everything pointed to by this
10855 code block. */
10857 void
10858 gfc_resolve_code (gfc_code *code, gfc_namespace *ns)
10860 int omp_workshare_save;
10861 int forall_save, do_concurrent_save;
10862 code_stack frame;
10863 bool t;
10865 frame.prev = cs_base;
10866 frame.head = code;
10867 cs_base = &frame;
10869 find_reachable_labels (code);
10871 for (; code; code = code->next)
10873 frame.current = code;
10874 forall_save = forall_flag;
10875 do_concurrent_save = gfc_do_concurrent_flag;
10877 if (code->op == EXEC_FORALL)
10879 forall_flag = 1;
10880 gfc_resolve_forall (code, ns, forall_save);
10881 forall_flag = 2;
10883 else if (code->block)
10885 omp_workshare_save = -1;
10886 switch (code->op)
10888 case EXEC_OACC_PARALLEL_LOOP:
10889 case EXEC_OACC_PARALLEL:
10890 case EXEC_OACC_KERNELS_LOOP:
10891 case EXEC_OACC_KERNELS:
10892 case EXEC_OACC_DATA:
10893 case EXEC_OACC_HOST_DATA:
10894 case EXEC_OACC_LOOP:
10895 gfc_resolve_oacc_blocks (code, ns);
10896 break;
10897 case EXEC_OMP_PARALLEL_WORKSHARE:
10898 omp_workshare_save = omp_workshare_flag;
10899 omp_workshare_flag = 1;
10900 gfc_resolve_omp_parallel_blocks (code, ns);
10901 break;
10902 case EXEC_OMP_PARALLEL:
10903 case EXEC_OMP_PARALLEL_DO:
10904 case EXEC_OMP_PARALLEL_DO_SIMD:
10905 case EXEC_OMP_PARALLEL_SECTIONS:
10906 case EXEC_OMP_TARGET_PARALLEL:
10907 case EXEC_OMP_TARGET_PARALLEL_DO:
10908 case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
10909 case EXEC_OMP_TARGET_TEAMS:
10910 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
10911 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
10912 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
10913 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
10914 case EXEC_OMP_TASK:
10915 case EXEC_OMP_TEAMS:
10916 case EXEC_OMP_TEAMS_DISTRIBUTE:
10917 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
10918 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
10919 case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
10920 omp_workshare_save = omp_workshare_flag;
10921 omp_workshare_flag = 0;
10922 gfc_resolve_omp_parallel_blocks (code, ns);
10923 break;
10924 case EXEC_OMP_DISTRIBUTE:
10925 case EXEC_OMP_DISTRIBUTE_SIMD:
10926 case EXEC_OMP_DO:
10927 case EXEC_OMP_DO_SIMD:
10928 case EXEC_OMP_SIMD:
10929 case EXEC_OMP_TARGET_SIMD:
10930 case EXEC_OMP_TASKLOOP:
10931 case EXEC_OMP_TASKLOOP_SIMD:
10932 gfc_resolve_omp_do_blocks (code, ns);
10933 break;
10934 case EXEC_SELECT_TYPE:
10935 /* Blocks are handled in resolve_select_type because we have
10936 to transform the SELECT TYPE into ASSOCIATE first. */
10937 break;
10938 case EXEC_DO_CONCURRENT:
10939 gfc_do_concurrent_flag = 1;
10940 gfc_resolve_blocks (code->block, ns);
10941 gfc_do_concurrent_flag = 2;
10942 break;
10943 case EXEC_OMP_WORKSHARE:
10944 omp_workshare_save = omp_workshare_flag;
10945 omp_workshare_flag = 1;
10946 /* FALL THROUGH */
10947 default:
10948 gfc_resolve_blocks (code->block, ns);
10949 break;
10952 if (omp_workshare_save != -1)
10953 omp_workshare_flag = omp_workshare_save;
10955 start:
10956 t = true;
10957 if (code->op != EXEC_COMPCALL && code->op != EXEC_CALL_PPC)
10958 t = gfc_resolve_expr (code->expr1);
10959 forall_flag = forall_save;
10960 gfc_do_concurrent_flag = do_concurrent_save;
10962 if (!gfc_resolve_expr (code->expr2))
10963 t = false;
10965 if (code->op == EXEC_ALLOCATE
10966 && !gfc_resolve_expr (code->expr3))
10967 t = false;
10969 switch (code->op)
10971 case EXEC_NOP:
10972 case EXEC_END_BLOCK:
10973 case EXEC_END_NESTED_BLOCK:
10974 case EXEC_CYCLE:
10975 case EXEC_PAUSE:
10976 case EXEC_STOP:
10977 case EXEC_ERROR_STOP:
10978 case EXEC_EXIT:
10979 case EXEC_CONTINUE:
10980 case EXEC_DT_END:
10981 case EXEC_ASSIGN_CALL:
10982 break;
10984 case EXEC_CRITICAL:
10985 resolve_critical (code);
10986 break;
10988 case EXEC_SYNC_ALL:
10989 case EXEC_SYNC_IMAGES:
10990 case EXEC_SYNC_MEMORY:
10991 resolve_sync (code);
10992 break;
10994 case EXEC_LOCK:
10995 case EXEC_UNLOCK:
10996 case EXEC_EVENT_POST:
10997 case EXEC_EVENT_WAIT:
10998 resolve_lock_unlock_event (code);
10999 break;
11001 case EXEC_FAIL_IMAGE:
11002 break;
11004 case EXEC_ENTRY:
11005 /* Keep track of which entry we are up to. */
11006 current_entry_id = code->ext.entry->id;
11007 break;
11009 case EXEC_WHERE:
11010 resolve_where (code, NULL);
11011 break;
11013 case EXEC_GOTO:
11014 if (code->expr1 != NULL)
11016 if (code->expr1->ts.type != BT_INTEGER)
11017 gfc_error ("ASSIGNED GOTO statement at %L requires an "
11018 "INTEGER variable", &code->expr1->where);
11019 else if (code->expr1->symtree->n.sym->attr.assign != 1)
11020 gfc_error ("Variable %qs has not been assigned a target "
11021 "label at %L", code->expr1->symtree->n.sym->name,
11022 &code->expr1->where);
11024 else
11025 resolve_branch (code->label1, code);
11026 break;
11028 case EXEC_RETURN:
11029 if (code->expr1 != NULL
11030 && (code->expr1->ts.type != BT_INTEGER || code->expr1->rank))
11031 gfc_error ("Alternate RETURN statement at %L requires a SCALAR-"
11032 "INTEGER return specifier", &code->expr1->where);
11033 break;
11035 case EXEC_INIT_ASSIGN:
11036 case EXEC_END_PROCEDURE:
11037 break;
11039 case EXEC_ASSIGN:
11040 if (!t)
11041 break;
11043 /* Remove a GFC_ISYM_CAF_GET inserted for a coindexed variable on
11044 the LHS. */
11045 if (code->expr1->expr_type == EXPR_FUNCTION
11046 && code->expr1->value.function.isym
11047 && code->expr1->value.function.isym->id == GFC_ISYM_CAF_GET)
11048 remove_caf_get_intrinsic (code->expr1);
11050 /* If this is a pointer function in an lvalue variable context,
11051 the new code will have to be resolved afresh. This is also the
11052 case with an error, where the code is transformed into NOP to
11053 prevent ICEs downstream. */
11054 if (resolve_ptr_fcn_assign (&code, ns)
11055 || code->op == EXEC_NOP)
11056 goto start;
11058 if (!gfc_check_vardef_context (code->expr1, false, false, false,
11059 _("assignment")))
11060 break;
11062 if (resolve_ordinary_assign (code, ns))
11064 if (code->op == EXEC_COMPCALL)
11065 goto compcall;
11066 else
11067 goto call;
11070 /* Check for dependencies in deferred character length array
11071 assignments and generate a temporary, if necessary. */
11072 if (code->op == EXEC_ASSIGN && deferred_op_assign (&code, ns))
11073 break;
11075 /* F03 7.4.1.3 for non-allocatable, non-pointer components. */
11076 if (code->op != EXEC_CALL && code->expr1->ts.type == BT_DERIVED
11077 && code->expr1->ts.u.derived
11078 && code->expr1->ts.u.derived->attr.defined_assign_comp)
11079 generate_component_assignments (&code, ns);
11081 break;
11083 case EXEC_LABEL_ASSIGN:
11084 if (code->label1->defined == ST_LABEL_UNKNOWN)
11085 gfc_error ("Label %d referenced at %L is never defined",
11086 code->label1->value, &code->label1->where);
11087 if (t
11088 && (code->expr1->expr_type != EXPR_VARIABLE
11089 || code->expr1->symtree->n.sym->ts.type != BT_INTEGER
11090 || code->expr1->symtree->n.sym->ts.kind
11091 != gfc_default_integer_kind
11092 || code->expr1->symtree->n.sym->as != NULL))
11093 gfc_error ("ASSIGN statement at %L requires a scalar "
11094 "default INTEGER variable", &code->expr1->where);
11095 break;
11097 case EXEC_POINTER_ASSIGN:
11099 gfc_expr* e;
11101 if (!t)
11102 break;
11104 /* This is both a variable definition and pointer assignment
11105 context, so check both of them. For rank remapping, a final
11106 array ref may be present on the LHS and fool gfc_expr_attr
11107 used in gfc_check_vardef_context. Remove it. */
11108 e = remove_last_array_ref (code->expr1);
11109 t = gfc_check_vardef_context (e, true, false, false,
11110 _("pointer assignment"));
11111 if (t)
11112 t = gfc_check_vardef_context (e, false, false, false,
11113 _("pointer assignment"));
11114 gfc_free_expr (e);
11115 if (!t)
11116 break;
11118 gfc_check_pointer_assign (code->expr1, code->expr2);
11120 /* Assigning a class object always is a regular assign. */
11121 if (code->expr2->ts.type == BT_CLASS
11122 && code->expr1->ts.type == BT_CLASS
11123 && !CLASS_DATA (code->expr2)->attr.dimension
11124 && !(gfc_expr_attr (code->expr1).proc_pointer
11125 && code->expr2->expr_type == EXPR_VARIABLE
11126 && code->expr2->symtree->n.sym->attr.flavor
11127 == FL_PROCEDURE))
11128 code->op = EXEC_ASSIGN;
11129 break;
11132 case EXEC_ARITHMETIC_IF:
11134 gfc_expr *e = code->expr1;
11136 gfc_resolve_expr (e);
11137 if (e->expr_type == EXPR_NULL)
11138 gfc_error ("Invalid NULL at %L", &e->where);
11140 if (t && (e->rank > 0
11141 || !(e->ts.type == BT_REAL || e->ts.type == BT_INTEGER)))
11142 gfc_error ("Arithmetic IF statement at %L requires a scalar "
11143 "REAL or INTEGER expression", &e->where);
11145 resolve_branch (code->label1, code);
11146 resolve_branch (code->label2, code);
11147 resolve_branch (code->label3, code);
11149 break;
11151 case EXEC_IF:
11152 if (t && code->expr1 != NULL
11153 && (code->expr1->ts.type != BT_LOGICAL
11154 || code->expr1->rank != 0))
11155 gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
11156 &code->expr1->where);
11157 break;
11159 case EXEC_CALL:
11160 call:
11161 resolve_call (code);
11162 break;
11164 case EXEC_COMPCALL:
11165 compcall:
11166 resolve_typebound_subroutine (code);
11167 break;
11169 case EXEC_CALL_PPC:
11170 resolve_ppc_call (code);
11171 break;
11173 case EXEC_SELECT:
11174 /* Select is complicated. Also, a SELECT construct could be
11175 a transformed computed GOTO. */
11176 resolve_select (code, false);
11177 break;
11179 case EXEC_SELECT_TYPE:
11180 resolve_select_type (code, ns);
11181 break;
11183 case EXEC_BLOCK:
11184 resolve_block_construct (code);
11185 break;
11187 case EXEC_DO:
11188 if (code->ext.iterator != NULL)
11190 gfc_iterator *iter = code->ext.iterator;
11191 if (gfc_resolve_iterator (iter, true, false))
11192 gfc_resolve_do_iterator (code, iter->var->symtree->n.sym);
11194 break;
11196 case EXEC_DO_WHILE:
11197 if (code->expr1 == NULL)
11198 gfc_internal_error ("gfc_resolve_code(): No expression on "
11199 "DO WHILE");
11200 if (t
11201 && (code->expr1->rank != 0
11202 || code->expr1->ts.type != BT_LOGICAL))
11203 gfc_error ("Exit condition of DO WHILE loop at %L must be "
11204 "a scalar LOGICAL expression", &code->expr1->where);
11205 break;
11207 case EXEC_ALLOCATE:
11208 if (t)
11209 resolve_allocate_deallocate (code, "ALLOCATE");
11211 break;
11213 case EXEC_DEALLOCATE:
11214 if (t)
11215 resolve_allocate_deallocate (code, "DEALLOCATE");
11217 break;
11219 case EXEC_OPEN:
11220 if (!gfc_resolve_open (code->ext.open))
11221 break;
11223 resolve_branch (code->ext.open->err, code);
11224 break;
11226 case EXEC_CLOSE:
11227 if (!gfc_resolve_close (code->ext.close))
11228 break;
11230 resolve_branch (code->ext.close->err, code);
11231 break;
11233 case EXEC_BACKSPACE:
11234 case EXEC_ENDFILE:
11235 case EXEC_REWIND:
11236 case EXEC_FLUSH:
11237 if (!gfc_resolve_filepos (code->ext.filepos))
11238 break;
11240 resolve_branch (code->ext.filepos->err, code);
11241 break;
11243 case EXEC_INQUIRE:
11244 if (!gfc_resolve_inquire (code->ext.inquire))
11245 break;
11247 resolve_branch (code->ext.inquire->err, code);
11248 break;
11250 case EXEC_IOLENGTH:
11251 gcc_assert (code->ext.inquire != NULL);
11252 if (!gfc_resolve_inquire (code->ext.inquire))
11253 break;
11255 resolve_branch (code->ext.inquire->err, code);
11256 break;
11258 case EXEC_WAIT:
11259 if (!gfc_resolve_wait (code->ext.wait))
11260 break;
11262 resolve_branch (code->ext.wait->err, code);
11263 resolve_branch (code->ext.wait->end, code);
11264 resolve_branch (code->ext.wait->eor, code);
11265 break;
11267 case EXEC_READ:
11268 case EXEC_WRITE:
11269 if (!gfc_resolve_dt (code->ext.dt, &code->loc))
11270 break;
11272 resolve_branch (code->ext.dt->err, code);
11273 resolve_branch (code->ext.dt->end, code);
11274 resolve_branch (code->ext.dt->eor, code);
11275 break;
11277 case EXEC_TRANSFER:
11278 resolve_transfer (code);
11279 break;
11281 case EXEC_DO_CONCURRENT:
11282 case EXEC_FORALL:
11283 resolve_forall_iterators (code->ext.forall_iterator);
11285 if (code->expr1 != NULL
11286 && (code->expr1->ts.type != BT_LOGICAL || code->expr1->rank))
11287 gfc_error ("FORALL mask clause at %L requires a scalar LOGICAL "
11288 "expression", &code->expr1->where);
11289 break;
11291 case EXEC_OACC_PARALLEL_LOOP:
11292 case EXEC_OACC_PARALLEL:
11293 case EXEC_OACC_KERNELS_LOOP:
11294 case EXEC_OACC_KERNELS:
11295 case EXEC_OACC_DATA:
11296 case EXEC_OACC_HOST_DATA:
11297 case EXEC_OACC_LOOP:
11298 case EXEC_OACC_UPDATE:
11299 case EXEC_OACC_WAIT:
11300 case EXEC_OACC_CACHE:
11301 case EXEC_OACC_ENTER_DATA:
11302 case EXEC_OACC_EXIT_DATA:
11303 case EXEC_OACC_ATOMIC:
11304 case EXEC_OACC_DECLARE:
11305 gfc_resolve_oacc_directive (code, ns);
11306 break;
11308 case EXEC_OMP_ATOMIC:
11309 case EXEC_OMP_BARRIER:
11310 case EXEC_OMP_CANCEL:
11311 case EXEC_OMP_CANCELLATION_POINT:
11312 case EXEC_OMP_CRITICAL:
11313 case EXEC_OMP_FLUSH:
11314 case EXEC_OMP_DISTRIBUTE:
11315 case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
11316 case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
11317 case EXEC_OMP_DISTRIBUTE_SIMD:
11318 case EXEC_OMP_DO:
11319 case EXEC_OMP_DO_SIMD:
11320 case EXEC_OMP_MASTER:
11321 case EXEC_OMP_ORDERED:
11322 case EXEC_OMP_SECTIONS:
11323 case EXEC_OMP_SIMD:
11324 case EXEC_OMP_SINGLE:
11325 case EXEC_OMP_TARGET:
11326 case EXEC_OMP_TARGET_DATA:
11327 case EXEC_OMP_TARGET_ENTER_DATA:
11328 case EXEC_OMP_TARGET_EXIT_DATA:
11329 case EXEC_OMP_TARGET_PARALLEL:
11330 case EXEC_OMP_TARGET_PARALLEL_DO:
11331 case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
11332 case EXEC_OMP_TARGET_SIMD:
11333 case EXEC_OMP_TARGET_TEAMS:
11334 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
11335 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
11336 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
11337 case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
11338 case EXEC_OMP_TARGET_UPDATE:
11339 case EXEC_OMP_TASK:
11340 case EXEC_OMP_TASKGROUP:
11341 case EXEC_OMP_TASKLOOP:
11342 case EXEC_OMP_TASKLOOP_SIMD:
11343 case EXEC_OMP_TASKWAIT:
11344 case EXEC_OMP_TASKYIELD:
11345 case EXEC_OMP_TEAMS:
11346 case EXEC_OMP_TEAMS_DISTRIBUTE:
11347 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
11348 case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
11349 case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
11350 case EXEC_OMP_WORKSHARE:
11351 gfc_resolve_omp_directive (code, ns);
11352 break;
11354 case EXEC_OMP_PARALLEL:
11355 case EXEC_OMP_PARALLEL_DO:
11356 case EXEC_OMP_PARALLEL_DO_SIMD:
11357 case EXEC_OMP_PARALLEL_SECTIONS:
11358 case EXEC_OMP_PARALLEL_WORKSHARE:
11359 omp_workshare_save = omp_workshare_flag;
11360 omp_workshare_flag = 0;
11361 gfc_resolve_omp_directive (code, ns);
11362 omp_workshare_flag = omp_workshare_save;
11363 break;
11365 default:
11366 gfc_internal_error ("gfc_resolve_code(): Bad statement code");
11370 cs_base = frame.prev;
11374 /* Resolve initial values and make sure they are compatible with
11375 the variable. */
11377 static void
11378 resolve_values (gfc_symbol *sym)
11380 bool t;
11382 if (sym->value == NULL)
11383 return;
11385 if (sym->value->expr_type == EXPR_STRUCTURE)
11386 t= resolve_structure_cons (sym->value, 1);
11387 else
11388 t = gfc_resolve_expr (sym->value);
11390 if (!t)
11391 return;
11393 gfc_check_assign_symbol (sym, NULL, sym->value);
11397 /* Verify any BIND(C) derived types in the namespace so we can report errors
11398 for them once, rather than for each variable declared of that type. */
11400 static void
11401 resolve_bind_c_derived_types (gfc_symbol *derived_sym)
11403 if (derived_sym != NULL && derived_sym->attr.flavor == FL_DERIVED
11404 && derived_sym->attr.is_bind_c == 1)
11405 verify_bind_c_derived_type (derived_sym);
11407 return;
11411 /* Check the interfaces of DTIO procedures associated with derived
11412 type 'sym'. These procedures can either have typebound bindings or
11413 can appear in DTIO generic interfaces. */
11415 static void
11416 gfc_verify_DTIO_procedures (gfc_symbol *sym)
11418 if (!sym || sym->attr.flavor != FL_DERIVED)
11419 return;
11421 gfc_check_dtio_interfaces (sym);
11423 return;
11426 /* Verify that any binding labels used in a given namespace do not collide
11427 with the names or binding labels of any global symbols. Multiple INTERFACE
11428 for the same procedure are permitted. */
11430 static void
11431 gfc_verify_binding_labels (gfc_symbol *sym)
11433 gfc_gsymbol *gsym;
11434 const char *module;
11436 if (!sym || !sym->attr.is_bind_c || sym->attr.is_iso_c
11437 || sym->attr.flavor == FL_DERIVED || !sym->binding_label)
11438 return;
11440 gsym = gfc_find_gsymbol (gfc_gsym_root, sym->binding_label);
11442 if (sym->module)
11443 module = sym->module;
11444 else if (sym->ns && sym->ns->proc_name
11445 && sym->ns->proc_name->attr.flavor == FL_MODULE)
11446 module = sym->ns->proc_name->name;
11447 else if (sym->ns && sym->ns->parent
11448 && sym->ns && sym->ns->parent->proc_name
11449 && sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
11450 module = sym->ns->parent->proc_name->name;
11451 else
11452 module = NULL;
11454 if (!gsym
11455 || (!gsym->defined
11456 && (gsym->type == GSYM_FUNCTION || gsym->type == GSYM_SUBROUTINE)))
11458 if (!gsym)
11459 gsym = gfc_get_gsymbol (sym->binding_label);
11460 gsym->where = sym->declared_at;
11461 gsym->sym_name = sym->name;
11462 gsym->binding_label = sym->binding_label;
11463 gsym->ns = sym->ns;
11464 gsym->mod_name = module;
11465 if (sym->attr.function)
11466 gsym->type = GSYM_FUNCTION;
11467 else if (sym->attr.subroutine)
11468 gsym->type = GSYM_SUBROUTINE;
11469 /* Mark as variable/procedure as defined, unless its an INTERFACE. */
11470 gsym->defined = sym->attr.if_source != IFSRC_IFBODY;
11471 return;
11474 if (sym->attr.flavor == FL_VARIABLE && gsym->type != GSYM_UNKNOWN)
11476 gfc_error ("Variable %s with binding label %s at %L uses the same global "
11477 "identifier as entity at %L", sym->name,
11478 sym->binding_label, &sym->declared_at, &gsym->where);
11479 /* Clear the binding label to prevent checking multiple times. */
11480 sym->binding_label = NULL;
11483 else if (sym->attr.flavor == FL_VARIABLE && module
11484 && (strcmp (module, gsym->mod_name) != 0
11485 || strcmp (sym->name, gsym->sym_name) != 0))
11487 /* This can only happen if the variable is defined in a module - if it
11488 isn't the same module, reject it. */
11489 gfc_error ("Variable %s from module %s with binding label %s at %L uses "
11490 "the same global identifier as entity at %L from module %s",
11491 sym->name, module, sym->binding_label,
11492 &sym->declared_at, &gsym->where, gsym->mod_name);
11493 sym->binding_label = NULL;
11495 else if ((sym->attr.function || sym->attr.subroutine)
11496 && ((gsym->type != GSYM_SUBROUTINE && gsym->type != GSYM_FUNCTION)
11497 || (gsym->defined && sym->attr.if_source != IFSRC_IFBODY))
11498 && sym != gsym->ns->proc_name
11499 && (module != gsym->mod_name
11500 || strcmp (gsym->sym_name, sym->name) != 0
11501 || (module && strcmp (module, gsym->mod_name) != 0)))
11503 /* Print an error if the procedure is defined multiple times; we have to
11504 exclude references to the same procedure via module association or
11505 multiple checks for the same procedure. */
11506 gfc_error ("Procedure %s with binding label %s at %L uses the same "
11507 "global identifier as entity at %L", sym->name,
11508 sym->binding_label, &sym->declared_at, &gsym->where);
11509 sym->binding_label = NULL;
11514 /* Resolve an index expression. */
11516 static bool
11517 resolve_index_expr (gfc_expr *e)
11519 if (!gfc_resolve_expr (e))
11520 return false;
11522 if (!gfc_simplify_expr (e, 0))
11523 return false;
11525 if (!gfc_specification_expr (e))
11526 return false;
11528 return true;
11532 /* Resolve a charlen structure. */
11534 static bool
11535 resolve_charlen (gfc_charlen *cl)
11537 int i, k;
11538 bool saved_specification_expr;
11540 if (cl->resolved)
11541 return true;
11543 cl->resolved = 1;
11544 saved_specification_expr = specification_expr;
11545 specification_expr = true;
11547 if (cl->length_from_typespec)
11549 if (!gfc_resolve_expr (cl->length))
11551 specification_expr = saved_specification_expr;
11552 return false;
11555 if (!gfc_simplify_expr (cl->length, 0))
11557 specification_expr = saved_specification_expr;
11558 return false;
11561 else
11564 if (!resolve_index_expr (cl->length))
11566 specification_expr = saved_specification_expr;
11567 return false;
11571 /* F2008, 4.4.3.2: If the character length parameter value evaluates to
11572 a negative value, the length of character entities declared is zero. */
11573 if (cl->length && !gfc_extract_int (cl->length, &i) && i < 0)
11574 gfc_replace_expr (cl->length,
11575 gfc_get_int_expr (gfc_default_integer_kind, NULL, 0));
11577 /* Check that the character length is not too large. */
11578 k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
11579 if (cl->length && cl->length->expr_type == EXPR_CONSTANT
11580 && cl->length->ts.type == BT_INTEGER
11581 && mpz_cmp (cl->length->value.integer, gfc_integer_kinds[k].huge) > 0)
11583 gfc_error ("String length at %L is too large", &cl->length->where);
11584 specification_expr = saved_specification_expr;
11585 return false;
11588 specification_expr = saved_specification_expr;
11589 return true;
11593 /* Test for non-constant shape arrays. */
11595 static bool
11596 is_non_constant_shape_array (gfc_symbol *sym)
11598 gfc_expr *e;
11599 int i;
11600 bool not_constant;
11602 not_constant = false;
11603 if (sym->as != NULL)
11605 /* Unfortunately, !gfc_is_compile_time_shape hits a legal case that
11606 has not been simplified; parameter array references. Do the
11607 simplification now. */
11608 for (i = 0; i < sym->as->rank + sym->as->corank; i++)
11610 e = sym->as->lower[i];
11611 if (e && (!resolve_index_expr(e)
11612 || !gfc_is_constant_expr (e)))
11613 not_constant = true;
11614 e = sym->as->upper[i];
11615 if (e && (!resolve_index_expr(e)
11616 || !gfc_is_constant_expr (e)))
11617 not_constant = true;
11620 return not_constant;
11623 /* Given a symbol and an initialization expression, add code to initialize
11624 the symbol to the function entry. */
11625 static void
11626 build_init_assign (gfc_symbol *sym, gfc_expr *init)
11628 gfc_expr *lval;
11629 gfc_code *init_st;
11630 gfc_namespace *ns = sym->ns;
11632 /* Search for the function namespace if this is a contained
11633 function without an explicit result. */
11634 if (sym->attr.function && sym == sym->result
11635 && sym->name != sym->ns->proc_name->name)
11637 ns = ns->contained;
11638 for (;ns; ns = ns->sibling)
11639 if (strcmp (ns->proc_name->name, sym->name) == 0)
11640 break;
11643 if (ns == NULL)
11645 gfc_free_expr (init);
11646 return;
11649 /* Build an l-value expression for the result. */
11650 lval = gfc_lval_expr_from_sym (sym);
11652 /* Add the code at scope entry. */
11653 init_st = gfc_get_code (EXEC_INIT_ASSIGN);
11654 init_st->next = ns->code;
11655 ns->code = init_st;
11657 /* Assign the default initializer to the l-value. */
11658 init_st->loc = sym->declared_at;
11659 init_st->expr1 = lval;
11660 init_st->expr2 = init;
11664 /* Whether or not we can generate a default initializer for a symbol. */
11666 static bool
11667 can_generate_init (gfc_symbol *sym)
11669 symbol_attribute *a;
11670 if (!sym)
11671 return false;
11672 a = &sym->attr;
11674 /* These symbols should never have a default initialization. */
11675 return !(
11676 a->allocatable
11677 || a->external
11678 || a->pointer
11679 || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
11680 && (CLASS_DATA (sym)->attr.class_pointer
11681 || CLASS_DATA (sym)->attr.proc_pointer))
11682 || a->in_equivalence
11683 || a->in_common
11684 || a->data
11685 || sym->module
11686 || a->cray_pointee
11687 || a->cray_pointer
11688 || sym->assoc
11689 || (!a->referenced && !a->result)
11690 || (a->dummy && a->intent != INTENT_OUT)
11691 || (a->function && sym != sym->result)
11696 /* Assign the default initializer to a derived type variable or result. */
11698 static void
11699 apply_default_init (gfc_symbol *sym)
11701 gfc_expr *init = NULL;
11703 if (sym->attr.flavor != FL_VARIABLE && !sym->attr.function)
11704 return;
11706 if (sym->ts.type == BT_DERIVED && sym->ts.u.derived)
11707 init = gfc_generate_initializer (&sym->ts, can_generate_init (sym));
11709 if (init == NULL && sym->ts.type != BT_CLASS)
11710 return;
11712 build_init_assign (sym, init);
11713 sym->attr.referenced = 1;
11717 /* Build an initializer for a local. Returns null if the symbol should not have
11718 a default initialization. */
11720 static gfc_expr *
11721 build_default_init_expr (gfc_symbol *sym)
11723 /* These symbols should never have a default initialization. */
11724 if (sym->attr.allocatable
11725 || sym->attr.external
11726 || sym->attr.dummy
11727 || sym->attr.pointer
11728 || sym->attr.in_equivalence
11729 || sym->attr.in_common
11730 || sym->attr.data
11731 || sym->module
11732 || sym->attr.cray_pointee
11733 || sym->attr.cray_pointer
11734 || sym->assoc)
11735 return NULL;
11737 /* Get the appropriate init expression. */
11738 return gfc_build_default_init_expr (&sym->ts, &sym->declared_at);
11741 /* Add an initialization expression to a local variable. */
11742 static void
11743 apply_default_init_local (gfc_symbol *sym)
11745 gfc_expr *init = NULL;
11747 /* The symbol should be a variable or a function return value. */
11748 if ((sym->attr.flavor != FL_VARIABLE && !sym->attr.function)
11749 || (sym->attr.function && sym->result != sym))
11750 return;
11752 /* Try to build the initializer expression. If we can't initialize
11753 this symbol, then init will be NULL. */
11754 init = build_default_init_expr (sym);
11755 if (init == NULL)
11756 return;
11758 /* For saved variables, we don't want to add an initializer at function
11759 entry, so we just add a static initializer. Note that automatic variables
11760 are stack allocated even with -fno-automatic; we have also to exclude
11761 result variable, which are also nonstatic. */
11762 if (!sym->attr.automatic
11763 && (sym->attr.save || sym->ns->save_all
11764 || (flag_max_stack_var_size == 0 && !sym->attr.result
11765 && (sym->ns->proc_name && !sym->ns->proc_name->attr.recursive)
11766 && (!sym->attr.dimension || !is_non_constant_shape_array (sym)))))
11768 /* Don't clobber an existing initializer! */
11769 gcc_assert (sym->value == NULL);
11770 sym->value = init;
11771 return;
11774 build_init_assign (sym, init);
11778 /* Resolution of common features of flavors variable and procedure. */
11780 static bool
11781 resolve_fl_var_and_proc (gfc_symbol *sym, int mp_flag)
11783 gfc_array_spec *as;
11785 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
11786 as = CLASS_DATA (sym)->as;
11787 else
11788 as = sym->as;
11790 /* Constraints on deferred shape variable. */
11791 if (as == NULL || as->type != AS_DEFERRED)
11793 bool pointer, allocatable, dimension;
11795 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
11797 pointer = CLASS_DATA (sym)->attr.class_pointer;
11798 allocatable = CLASS_DATA (sym)->attr.allocatable;
11799 dimension = CLASS_DATA (sym)->attr.dimension;
11801 else
11803 pointer = sym->attr.pointer && !sym->attr.select_type_temporary;
11804 allocatable = sym->attr.allocatable;
11805 dimension = sym->attr.dimension;
11808 if (allocatable)
11810 if (dimension && as->type != AS_ASSUMED_RANK)
11812 gfc_error ("Allocatable array %qs at %L must have a deferred "
11813 "shape or assumed rank", sym->name, &sym->declared_at);
11814 return false;
11816 else if (!gfc_notify_std (GFC_STD_F2003, "Scalar object "
11817 "%qs at %L may not be ALLOCATABLE",
11818 sym->name, &sym->declared_at))
11819 return false;
11822 if (pointer && dimension && as->type != AS_ASSUMED_RANK)
11824 gfc_error ("Array pointer %qs at %L must have a deferred shape or "
11825 "assumed rank", sym->name, &sym->declared_at);
11826 return false;
11829 else
11831 if (!mp_flag && !sym->attr.allocatable && !sym->attr.pointer
11832 && sym->ts.type != BT_CLASS && !sym->assoc)
11834 gfc_error ("Array %qs at %L cannot have a deferred shape",
11835 sym->name, &sym->declared_at);
11836 return false;
11840 /* Constraints on polymorphic variables. */
11841 if (sym->ts.type == BT_CLASS && !(sym->result && sym->result != sym))
11843 /* F03:C502. */
11844 if (sym->attr.class_ok
11845 && !sym->attr.select_type_temporary
11846 && !UNLIMITED_POLY (sym)
11847 && !gfc_type_is_extensible (CLASS_DATA (sym)->ts.u.derived))
11849 gfc_error ("Type %qs of CLASS variable %qs at %L is not extensible",
11850 CLASS_DATA (sym)->ts.u.derived->name, sym->name,
11851 &sym->declared_at);
11852 return false;
11855 /* F03:C509. */
11856 /* Assume that use associated symbols were checked in the module ns.
11857 Class-variables that are associate-names are also something special
11858 and excepted from the test. */
11859 if (!sym->attr.class_ok && !sym->attr.use_assoc && !sym->assoc)
11861 gfc_error ("CLASS variable %qs at %L must be dummy, allocatable "
11862 "or pointer", sym->name, &sym->declared_at);
11863 return false;
11867 return true;
11871 /* Additional checks for symbols with flavor variable and derived
11872 type. To be called from resolve_fl_variable. */
11874 static bool
11875 resolve_fl_variable_derived (gfc_symbol *sym, int no_init_flag)
11877 gcc_assert (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS);
11879 /* Check to see if a derived type is blocked from being host
11880 associated by the presence of another class I symbol in the same
11881 namespace. 14.6.1.3 of the standard and the discussion on
11882 comp.lang.fortran. */
11883 if (sym->ns != sym->ts.u.derived->ns
11884 && sym->ns->proc_name->attr.if_source != IFSRC_IFBODY)
11886 gfc_symbol *s;
11887 gfc_find_symbol (sym->ts.u.derived->name, sym->ns, 0, &s);
11888 if (s && s->attr.generic)
11889 s = gfc_find_dt_in_generic (s);
11890 if (s && !gfc_fl_struct (s->attr.flavor))
11892 gfc_error ("The type %qs cannot be host associated at %L "
11893 "because it is blocked by an incompatible object "
11894 "of the same name declared at %L",
11895 sym->ts.u.derived->name, &sym->declared_at,
11896 &s->declared_at);
11897 return false;
11901 /* 4th constraint in section 11.3: "If an object of a type for which
11902 component-initialization is specified (R429) appears in the
11903 specification-part of a module and does not have the ALLOCATABLE
11904 or POINTER attribute, the object shall have the SAVE attribute."
11906 The check for initializers is performed with
11907 gfc_has_default_initializer because gfc_default_initializer generates
11908 a hidden default for allocatable components. */
11909 if (!(sym->value || no_init_flag) && sym->ns->proc_name
11910 && sym->ns->proc_name->attr.flavor == FL_MODULE
11911 && !(sym->ns->save_all && !sym->attr.automatic) && !sym->attr.save
11912 && !sym->attr.pointer && !sym->attr.allocatable
11913 && gfc_has_default_initializer (sym->ts.u.derived)
11914 && !gfc_notify_std (GFC_STD_F2008, "Implied SAVE for module variable "
11915 "%qs at %L, needed due to the default "
11916 "initialization", sym->name, &sym->declared_at))
11917 return false;
11919 /* Assign default initializer. */
11920 if (!(sym->value || sym->attr.pointer || sym->attr.allocatable)
11921 && (!no_init_flag || sym->attr.intent == INTENT_OUT))
11922 sym->value = gfc_generate_initializer (&sym->ts, can_generate_init (sym));
11924 return true;
11928 /* F2008, C402 (R401): A colon shall not be used as a type-param-value
11929 except in the declaration of an entity or component that has the POINTER
11930 or ALLOCATABLE attribute. */
11932 static bool
11933 deferred_requirements (gfc_symbol *sym)
11935 if (sym->ts.deferred
11936 && !(sym->attr.pointer
11937 || sym->attr.allocatable
11938 || sym->attr.associate_var
11939 || sym->attr.omp_udr_artificial_var))
11941 gfc_error ("Entity %qs at %L has a deferred type parameter and "
11942 "requires either the POINTER or ALLOCATABLE attribute",
11943 sym->name, &sym->declared_at);
11944 return false;
11946 return true;
11950 /* Resolve symbols with flavor variable. */
11952 static bool
11953 resolve_fl_variable (gfc_symbol *sym, int mp_flag)
11955 int no_init_flag, automatic_flag;
11956 gfc_expr *e;
11957 const char *auto_save_msg;
11958 bool saved_specification_expr;
11960 auto_save_msg = "Automatic object %qs at %L cannot have the "
11961 "SAVE attribute";
11963 if (!resolve_fl_var_and_proc (sym, mp_flag))
11964 return false;
11966 /* Set this flag to check that variables are parameters of all entries.
11967 This check is effected by the call to gfc_resolve_expr through
11968 is_non_constant_shape_array. */
11969 saved_specification_expr = specification_expr;
11970 specification_expr = true;
11972 if (sym->ns->proc_name
11973 && (sym->ns->proc_name->attr.flavor == FL_MODULE
11974 || sym->ns->proc_name->attr.is_main_program)
11975 && !sym->attr.use_assoc
11976 && !sym->attr.allocatable
11977 && !sym->attr.pointer
11978 && is_non_constant_shape_array (sym))
11980 /* F08:C541. The shape of an array defined in a main program or module
11981 * needs to be constant. */
11982 gfc_error ("The module or main program array %qs at %L must "
11983 "have constant shape", sym->name, &sym->declared_at);
11984 specification_expr = saved_specification_expr;
11985 return false;
11988 /* Constraints on deferred type parameter. */
11989 if (!deferred_requirements (sym))
11990 return false;
11992 if (sym->ts.type == BT_CHARACTER && !sym->attr.associate_var)
11994 /* Make sure that character string variables with assumed length are
11995 dummy arguments. */
11996 e = sym->ts.u.cl->length;
11997 if (e == NULL && !sym->attr.dummy && !sym->attr.result
11998 && !sym->ts.deferred && !sym->attr.select_type_temporary
11999 && !sym->attr.omp_udr_artificial_var)
12001 gfc_error ("Entity with assumed character length at %L must be a "
12002 "dummy argument or a PARAMETER", &sym->declared_at);
12003 specification_expr = saved_specification_expr;
12004 return false;
12007 if (e && sym->attr.save == SAVE_EXPLICIT && !gfc_is_constant_expr (e))
12009 gfc_error (auto_save_msg, sym->name, &sym->declared_at);
12010 specification_expr = saved_specification_expr;
12011 return false;
12014 if (!gfc_is_constant_expr (e)
12015 && !(e->expr_type == EXPR_VARIABLE
12016 && e->symtree->n.sym->attr.flavor == FL_PARAMETER))
12018 if (!sym->attr.use_assoc && sym->ns->proc_name
12019 && (sym->ns->proc_name->attr.flavor == FL_MODULE
12020 || sym->ns->proc_name->attr.is_main_program))
12022 gfc_error ("%qs at %L must have constant character length "
12023 "in this context", sym->name, &sym->declared_at);
12024 specification_expr = saved_specification_expr;
12025 return false;
12027 if (sym->attr.in_common)
12029 gfc_error ("COMMON variable %qs at %L must have constant "
12030 "character length", sym->name, &sym->declared_at);
12031 specification_expr = saved_specification_expr;
12032 return false;
12037 if (sym->value == NULL && sym->attr.referenced)
12038 apply_default_init_local (sym); /* Try to apply a default initialization. */
12040 /* Determine if the symbol may not have an initializer. */
12041 no_init_flag = automatic_flag = 0;
12042 if (sym->attr.allocatable || sym->attr.external || sym->attr.dummy
12043 || sym->attr.intrinsic || sym->attr.result)
12044 no_init_flag = 1;
12045 else if ((sym->attr.dimension || sym->attr.codimension) && !sym->attr.pointer
12046 && is_non_constant_shape_array (sym))
12048 no_init_flag = automatic_flag = 1;
12050 /* Also, they must not have the SAVE attribute.
12051 SAVE_IMPLICIT is checked below. */
12052 if (sym->as && sym->attr.codimension)
12054 int corank = sym->as->corank;
12055 sym->as->corank = 0;
12056 no_init_flag = automatic_flag = is_non_constant_shape_array (sym);
12057 sym->as->corank = corank;
12059 if (automatic_flag && sym->attr.save == SAVE_EXPLICIT)
12061 gfc_error (auto_save_msg, sym->name, &sym->declared_at);
12062 specification_expr = saved_specification_expr;
12063 return false;
12067 /* Ensure that any initializer is simplified. */
12068 if (sym->value)
12069 gfc_simplify_expr (sym->value, 1);
12071 /* Reject illegal initializers. */
12072 if (!sym->mark && sym->value)
12074 if (sym->attr.allocatable || (sym->ts.type == BT_CLASS
12075 && CLASS_DATA (sym)->attr.allocatable))
12076 gfc_error ("Allocatable %qs at %L cannot have an initializer",
12077 sym->name, &sym->declared_at);
12078 else if (sym->attr.external)
12079 gfc_error ("External %qs at %L cannot have an initializer",
12080 sym->name, &sym->declared_at);
12081 else if (sym->attr.dummy
12082 && !(sym->ts.type == BT_DERIVED && sym->attr.intent == INTENT_OUT))
12083 gfc_error ("Dummy %qs at %L cannot have an initializer",
12084 sym->name, &sym->declared_at);
12085 else if (sym->attr.intrinsic)
12086 gfc_error ("Intrinsic %qs at %L cannot have an initializer",
12087 sym->name, &sym->declared_at);
12088 else if (sym->attr.result)
12089 gfc_error ("Function result %qs at %L cannot have an initializer",
12090 sym->name, &sym->declared_at);
12091 else if (automatic_flag)
12092 gfc_error ("Automatic array %qs at %L cannot have an initializer",
12093 sym->name, &sym->declared_at);
12094 else
12095 goto no_init_error;
12096 specification_expr = saved_specification_expr;
12097 return false;
12100 no_init_error:
12101 if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
12103 bool res = resolve_fl_variable_derived (sym, no_init_flag);
12104 specification_expr = saved_specification_expr;
12105 return res;
12108 specification_expr = saved_specification_expr;
12109 return true;
12113 /* Compare the dummy characteristics of a module procedure interface
12114 declaration with the corresponding declaration in a submodule. */
12115 static gfc_formal_arglist *new_formal;
12116 static char errmsg[200];
12118 static void
12119 compare_fsyms (gfc_symbol *sym)
12121 gfc_symbol *fsym;
12123 if (sym == NULL || new_formal == NULL)
12124 return;
12126 fsym = new_formal->sym;
12128 if (sym == fsym)
12129 return;
12131 if (strcmp (sym->name, fsym->name) == 0)
12133 if (!gfc_check_dummy_characteristics (fsym, sym, true, errmsg, 200))
12134 gfc_error ("%s at %L", errmsg, &fsym->declared_at);
12139 /* Resolve a procedure. */
12141 static bool
12142 resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
12144 gfc_formal_arglist *arg;
12146 if (sym->attr.function
12147 && !resolve_fl_var_and_proc (sym, mp_flag))
12148 return false;
12150 if (sym->ts.type == BT_CHARACTER)
12152 gfc_charlen *cl = sym->ts.u.cl;
12154 if (cl && cl->length && gfc_is_constant_expr (cl->length)
12155 && !resolve_charlen (cl))
12156 return false;
12158 if ((!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
12159 && sym->attr.proc == PROC_ST_FUNCTION)
12161 gfc_error ("Character-valued statement function %qs at %L must "
12162 "have constant length", sym->name, &sym->declared_at);
12163 return false;
12167 /* Ensure that derived type for are not of a private type. Internal
12168 module procedures are excluded by 2.2.3.3 - i.e., they are not
12169 externally accessible and can access all the objects accessible in
12170 the host. */
12171 if (!(sym->ns->parent
12172 && sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
12173 && gfc_check_symbol_access (sym))
12175 gfc_interface *iface;
12177 for (arg = gfc_sym_get_dummy_args (sym); arg; arg = arg->next)
12179 if (arg->sym
12180 && arg->sym->ts.type == BT_DERIVED
12181 && !arg->sym->ts.u.derived->attr.use_assoc
12182 && !gfc_check_symbol_access (arg->sym->ts.u.derived)
12183 && !gfc_notify_std (GFC_STD_F2003, "%qs is of a PRIVATE type "
12184 "and cannot be a dummy argument"
12185 " of %qs, which is PUBLIC at %L",
12186 arg->sym->name, sym->name,
12187 &sym->declared_at))
12189 /* Stop this message from recurring. */
12190 arg->sym->ts.u.derived->attr.access = ACCESS_PUBLIC;
12191 return false;
12195 /* PUBLIC interfaces may expose PRIVATE procedures that take types
12196 PRIVATE to the containing module. */
12197 for (iface = sym->generic; iface; iface = iface->next)
12199 for (arg = gfc_sym_get_dummy_args (iface->sym); arg; arg = arg->next)
12201 if (arg->sym
12202 && arg->sym->ts.type == BT_DERIVED
12203 && !arg->sym->ts.u.derived->attr.use_assoc
12204 && !gfc_check_symbol_access (arg->sym->ts.u.derived)
12205 && !gfc_notify_std (GFC_STD_F2003, "Procedure %qs in "
12206 "PUBLIC interface %qs at %L "
12207 "takes dummy arguments of %qs which "
12208 "is PRIVATE", iface->sym->name,
12209 sym->name, &iface->sym->declared_at,
12210 gfc_typename(&arg->sym->ts)))
12212 /* Stop this message from recurring. */
12213 arg->sym->ts.u.derived->attr.access = ACCESS_PUBLIC;
12214 return false;
12220 if (sym->attr.function && sym->value && sym->attr.proc != PROC_ST_FUNCTION
12221 && !sym->attr.proc_pointer)
12223 gfc_error ("Function %qs at %L cannot have an initializer",
12224 sym->name, &sym->declared_at);
12225 return false;
12228 /* An external symbol may not have an initializer because it is taken to be
12229 a procedure. Exception: Procedure Pointers. */
12230 if (sym->attr.external && sym->value && !sym->attr.proc_pointer)
12232 gfc_error ("External object %qs at %L may not have an initializer",
12233 sym->name, &sym->declared_at);
12234 return false;
12237 /* An elemental function is required to return a scalar 12.7.1 */
12238 if (sym->attr.elemental && sym->attr.function && sym->as)
12240 gfc_error ("ELEMENTAL function %qs at %L must have a scalar "
12241 "result", sym->name, &sym->declared_at);
12242 /* Reset so that the error only occurs once. */
12243 sym->attr.elemental = 0;
12244 return false;
12247 if (sym->attr.proc == PROC_ST_FUNCTION
12248 && (sym->attr.allocatable || sym->attr.pointer))
12250 gfc_error ("Statement function %qs at %L may not have pointer or "
12251 "allocatable attribute", sym->name, &sym->declared_at);
12252 return false;
12255 /* 5.1.1.5 of the Standard: A function name declared with an asterisk
12256 char-len-param shall not be array-valued, pointer-valued, recursive
12257 or pure. ....snip... A character value of * may only be used in the
12258 following ways: (i) Dummy arg of procedure - dummy associates with
12259 actual length; (ii) To declare a named constant; or (iii) External
12260 function - but length must be declared in calling scoping unit. */
12261 if (sym->attr.function
12262 && sym->ts.type == BT_CHARACTER && !sym->ts.deferred
12263 && sym->ts.u.cl && sym->ts.u.cl->length == NULL)
12265 if ((sym->as && sym->as->rank) || (sym->attr.pointer)
12266 || (sym->attr.recursive) || (sym->attr.pure))
12268 if (sym->as && sym->as->rank)
12269 gfc_error ("CHARACTER(*) function %qs at %L cannot be "
12270 "array-valued", sym->name, &sym->declared_at);
12272 if (sym->attr.pointer)
12273 gfc_error ("CHARACTER(*) function %qs at %L cannot be "
12274 "pointer-valued", sym->name, &sym->declared_at);
12276 if (sym->attr.pure)
12277 gfc_error ("CHARACTER(*) function %qs at %L cannot be "
12278 "pure", sym->name, &sym->declared_at);
12280 if (sym->attr.recursive)
12281 gfc_error ("CHARACTER(*) function %qs at %L cannot be "
12282 "recursive", sym->name, &sym->declared_at);
12284 return false;
12287 /* Appendix B.2 of the standard. Contained functions give an
12288 error anyway. Deferred character length is an F2003 feature.
12289 Don't warn on intrinsic conversion functions, which start
12290 with two underscores. */
12291 if (!sym->attr.contained && !sym->ts.deferred
12292 && (sym->name[0] != '_' || sym->name[1] != '_'))
12293 gfc_notify_std (GFC_STD_F95_OBS,
12294 "CHARACTER(*) function %qs at %L",
12295 sym->name, &sym->declared_at);
12298 /* F2008, C1218. */
12299 if (sym->attr.elemental)
12301 if (sym->attr.proc_pointer)
12303 gfc_error ("Procedure pointer %qs at %L shall not be elemental",
12304 sym->name, &sym->declared_at);
12305 return false;
12307 if (sym->attr.dummy)
12309 gfc_error ("Dummy procedure %qs at %L shall not be elemental",
12310 sym->name, &sym->declared_at);
12311 return false;
12315 if (sym->attr.is_bind_c && sym->attr.is_c_interop != 1)
12317 gfc_formal_arglist *curr_arg;
12318 int has_non_interop_arg = 0;
12320 if (!verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
12321 sym->common_block))
12323 /* Clear these to prevent looking at them again if there was an
12324 error. */
12325 sym->attr.is_bind_c = 0;
12326 sym->attr.is_c_interop = 0;
12327 sym->ts.is_c_interop = 0;
12329 else
12331 /* So far, no errors have been found. */
12332 sym->attr.is_c_interop = 1;
12333 sym->ts.is_c_interop = 1;
12336 curr_arg = gfc_sym_get_dummy_args (sym);
12337 while (curr_arg != NULL)
12339 /* Skip implicitly typed dummy args here. */
12340 if (curr_arg->sym->attr.implicit_type == 0)
12341 if (!gfc_verify_c_interop_param (curr_arg->sym))
12342 /* If something is found to fail, record the fact so we
12343 can mark the symbol for the procedure as not being
12344 BIND(C) to try and prevent multiple errors being
12345 reported. */
12346 has_non_interop_arg = 1;
12348 curr_arg = curr_arg->next;
12351 /* See if any of the arguments were not interoperable and if so, clear
12352 the procedure symbol to prevent duplicate error messages. */
12353 if (has_non_interop_arg != 0)
12355 sym->attr.is_c_interop = 0;
12356 sym->ts.is_c_interop = 0;
12357 sym->attr.is_bind_c = 0;
12361 if (!sym->attr.proc_pointer)
12363 if (sym->attr.save == SAVE_EXPLICIT)
12365 gfc_error ("PROCEDURE attribute conflicts with SAVE attribute "
12366 "in %qs at %L", sym->name, &sym->declared_at);
12367 return false;
12369 if (sym->attr.intent)
12371 gfc_error ("PROCEDURE attribute conflicts with INTENT attribute "
12372 "in %qs at %L", sym->name, &sym->declared_at);
12373 return false;
12375 if (sym->attr.subroutine && sym->attr.result)
12377 gfc_error ("PROCEDURE attribute conflicts with RESULT attribute "
12378 "in %qs at %L", sym->name, &sym->declared_at);
12379 return false;
12381 if (sym->attr.external && sym->attr.function && !sym->attr.module_procedure
12382 && ((sym->attr.if_source == IFSRC_DECL && !sym->attr.procedure)
12383 || sym->attr.contained))
12385 gfc_error ("EXTERNAL attribute conflicts with FUNCTION attribute "
12386 "in %qs at %L", sym->name, &sym->declared_at);
12387 return false;
12389 if (strcmp ("ppr@", sym->name) == 0)
12391 gfc_error ("Procedure pointer result %qs at %L "
12392 "is missing the pointer attribute",
12393 sym->ns->proc_name->name, &sym->declared_at);
12394 return false;
12398 /* Assume that a procedure whose body is not known has references
12399 to external arrays. */
12400 if (sym->attr.if_source != IFSRC_DECL)
12401 sym->attr.array_outer_dependency = 1;
12403 /* Compare the characteristics of a module procedure with the
12404 interface declaration. Ideally this would be done with
12405 gfc_compare_interfaces but, at present, the formal interface
12406 cannot be copied to the ts.interface. */
12407 if (sym->attr.module_procedure
12408 && sym->attr.if_source == IFSRC_DECL)
12410 gfc_symbol *iface;
12411 char name[2*GFC_MAX_SYMBOL_LEN + 1];
12412 char *module_name;
12413 char *submodule_name;
12414 strcpy (name, sym->ns->proc_name->name);
12415 module_name = strtok (name, ".");
12416 submodule_name = strtok (NULL, ".");
12418 iface = sym->tlink;
12419 sym->tlink = NULL;
12421 /* Make sure that the result uses the correct charlen for deferred
12422 length results. */
12423 if (iface && sym->result
12424 && iface->ts.type == BT_CHARACTER
12425 && iface->ts.deferred)
12426 sym->result->ts.u.cl = iface->ts.u.cl;
12428 if (iface == NULL)
12429 goto check_formal;
12431 /* Check the procedure characteristics. */
12432 if (sym->attr.elemental != iface->attr.elemental)
12434 gfc_error ("Mismatch in ELEMENTAL attribute between MODULE "
12435 "PROCEDURE at %L and its interface in %s",
12436 &sym->declared_at, module_name);
12437 return false;
12440 if (sym->attr.pure != iface->attr.pure)
12442 gfc_error ("Mismatch in PURE attribute between MODULE "
12443 "PROCEDURE at %L and its interface in %s",
12444 &sym->declared_at, module_name);
12445 return false;
12448 if (sym->attr.recursive != iface->attr.recursive)
12450 gfc_error ("Mismatch in RECURSIVE attribute between MODULE "
12451 "PROCEDURE at %L and its interface in %s",
12452 &sym->declared_at, module_name);
12453 return false;
12456 /* Check the result characteristics. */
12457 if (!gfc_check_result_characteristics (sym, iface, errmsg, 200))
12459 gfc_error ("%s between the MODULE PROCEDURE declaration "
12460 "in MODULE %qs and the declaration at %L in "
12461 "(SUB)MODULE %qs",
12462 errmsg, module_name, &sym->declared_at,
12463 submodule_name ? submodule_name : module_name);
12464 return false;
12467 check_formal:
12468 /* Check the characteristics of the formal arguments. */
12469 if (sym->formal && sym->formal_ns)
12471 for (arg = sym->formal; arg && arg->sym; arg = arg->next)
12473 new_formal = arg;
12474 gfc_traverse_ns (sym->formal_ns, compare_fsyms);
12478 return true;
12482 /* Resolve a list of finalizer procedures. That is, after they have hopefully
12483 been defined and we now know their defined arguments, check that they fulfill
12484 the requirements of the standard for procedures used as finalizers. */
12486 static bool
12487 gfc_resolve_finalizers (gfc_symbol* derived, bool *finalizable)
12489 gfc_finalizer* list;
12490 gfc_finalizer** prev_link; /* For removing wrong entries from the list. */
12491 bool result = true;
12492 bool seen_scalar = false;
12493 gfc_symbol *vtab;
12494 gfc_component *c;
12495 gfc_symbol *parent = gfc_get_derived_super_type (derived);
12497 if (parent)
12498 gfc_resolve_finalizers (parent, finalizable);
12500 /* Ensure that derived-type components have a their finalizers resolved. */
12501 bool has_final = derived->f2k_derived && derived->f2k_derived->finalizers;
12502 for (c = derived->components; c; c = c->next)
12503 if (c->ts.type == BT_DERIVED
12504 && !c->attr.pointer && !c->attr.proc_pointer && !c->attr.allocatable)
12506 bool has_final2 = false;
12507 if (!gfc_resolve_finalizers (c->ts.u.derived, &has_final2))
12508 return false; /* Error. */
12509 has_final = has_final || has_final2;
12511 /* Return early if not finalizable. */
12512 if (!has_final)
12514 if (finalizable)
12515 *finalizable = false;
12516 return true;
12519 /* Walk over the list of finalizer-procedures, check them, and if any one
12520 does not fit in with the standard's definition, print an error and remove
12521 it from the list. */
12522 prev_link = &derived->f2k_derived->finalizers;
12523 for (list = derived->f2k_derived->finalizers; list; list = *prev_link)
12525 gfc_formal_arglist *dummy_args;
12526 gfc_symbol* arg;
12527 gfc_finalizer* i;
12528 int my_rank;
12530 /* Skip this finalizer if we already resolved it. */
12531 if (list->proc_tree)
12533 if (list->proc_tree->n.sym->formal->sym->as == NULL
12534 || list->proc_tree->n.sym->formal->sym->as->rank == 0)
12535 seen_scalar = true;
12536 prev_link = &(list->next);
12537 continue;
12540 /* Check this exists and is a SUBROUTINE. */
12541 if (!list->proc_sym->attr.subroutine)
12543 gfc_error ("FINAL procedure %qs at %L is not a SUBROUTINE",
12544 list->proc_sym->name, &list->where);
12545 goto error;
12548 /* We should have exactly one argument. */
12549 dummy_args = gfc_sym_get_dummy_args (list->proc_sym);
12550 if (!dummy_args || dummy_args->next)
12552 gfc_error ("FINAL procedure at %L must have exactly one argument",
12553 &list->where);
12554 goto error;
12556 arg = dummy_args->sym;
12558 /* This argument must be of our type. */
12559 if (arg->ts.type != BT_DERIVED || arg->ts.u.derived != derived)
12561 gfc_error ("Argument of FINAL procedure at %L must be of type %qs",
12562 &arg->declared_at, derived->name);
12563 goto error;
12566 /* It must neither be a pointer nor allocatable nor optional. */
12567 if (arg->attr.pointer)
12569 gfc_error ("Argument of FINAL procedure at %L must not be a POINTER",
12570 &arg->declared_at);
12571 goto error;
12573 if (arg->attr.allocatable)
12575 gfc_error ("Argument of FINAL procedure at %L must not be"
12576 " ALLOCATABLE", &arg->declared_at);
12577 goto error;
12579 if (arg->attr.optional)
12581 gfc_error ("Argument of FINAL procedure at %L must not be OPTIONAL",
12582 &arg->declared_at);
12583 goto error;
12586 /* It must not be INTENT(OUT). */
12587 if (arg->attr.intent == INTENT_OUT)
12589 gfc_error ("Argument of FINAL procedure at %L must not be"
12590 " INTENT(OUT)", &arg->declared_at);
12591 goto error;
12594 /* Warn if the procedure is non-scalar and not assumed shape. */
12595 if (warn_surprising && arg->as && arg->as->rank != 0
12596 && arg->as->type != AS_ASSUMED_SHAPE)
12597 gfc_warning (OPT_Wsurprising,
12598 "Non-scalar FINAL procedure at %L should have assumed"
12599 " shape argument", &arg->declared_at);
12601 /* Check that it does not match in kind and rank with a FINAL procedure
12602 defined earlier. To really loop over the *earlier* declarations,
12603 we need to walk the tail of the list as new ones were pushed at the
12604 front. */
12605 /* TODO: Handle kind parameters once they are implemented. */
12606 my_rank = (arg->as ? arg->as->rank : 0);
12607 for (i = list->next; i; i = i->next)
12609 gfc_formal_arglist *dummy_args;
12611 /* Argument list might be empty; that is an error signalled earlier,
12612 but we nevertheless continued resolving. */
12613 dummy_args = gfc_sym_get_dummy_args (i->proc_sym);
12614 if (dummy_args)
12616 gfc_symbol* i_arg = dummy_args->sym;
12617 const int i_rank = (i_arg->as ? i_arg->as->rank : 0);
12618 if (i_rank == my_rank)
12620 gfc_error ("FINAL procedure %qs declared at %L has the same"
12621 " rank (%d) as %qs",
12622 list->proc_sym->name, &list->where, my_rank,
12623 i->proc_sym->name);
12624 goto error;
12629 /* Is this the/a scalar finalizer procedure? */
12630 if (my_rank == 0)
12631 seen_scalar = true;
12633 /* Find the symtree for this procedure. */
12634 gcc_assert (!list->proc_tree);
12635 list->proc_tree = gfc_find_sym_in_symtree (list->proc_sym);
12637 prev_link = &list->next;
12638 continue;
12640 /* Remove wrong nodes immediately from the list so we don't risk any
12641 troubles in the future when they might fail later expectations. */
12642 error:
12643 i = list;
12644 *prev_link = list->next;
12645 gfc_free_finalizer (i);
12646 result = false;
12649 if (result == false)
12650 return false;
12652 /* Warn if we haven't seen a scalar finalizer procedure (but we know there
12653 were nodes in the list, must have been for arrays. It is surely a good
12654 idea to have a scalar version there if there's something to finalize. */
12655 if (warn_surprising && derived->f2k_derived->finalizers && !seen_scalar)
12656 gfc_warning (OPT_Wsurprising,
12657 "Only array FINAL procedures declared for derived type %qs"
12658 " defined at %L, suggest also scalar one",
12659 derived->name, &derived->declared_at);
12661 vtab = gfc_find_derived_vtab (derived);
12662 c = vtab->ts.u.derived->components->next->next->next->next->next;
12663 gfc_set_sym_referenced (c->initializer->symtree->n.sym);
12665 if (finalizable)
12666 *finalizable = true;
12668 return true;
12672 /* Check if two GENERIC targets are ambiguous and emit an error is they are. */
12674 static bool
12675 check_generic_tbp_ambiguity (gfc_tbp_generic* t1, gfc_tbp_generic* t2,
12676 const char* generic_name, locus where)
12678 gfc_symbol *sym1, *sym2;
12679 const char *pass1, *pass2;
12680 gfc_formal_arglist *dummy_args;
12682 gcc_assert (t1->specific && t2->specific);
12683 gcc_assert (!t1->specific->is_generic);
12684 gcc_assert (!t2->specific->is_generic);
12685 gcc_assert (t1->is_operator == t2->is_operator);
12687 sym1 = t1->specific->u.specific->n.sym;
12688 sym2 = t2->specific->u.specific->n.sym;
12690 if (sym1 == sym2)
12691 return true;
12693 /* Both must be SUBROUTINEs or both must be FUNCTIONs. */
12694 if (sym1->attr.subroutine != sym2->attr.subroutine
12695 || sym1->attr.function != sym2->attr.function)
12697 gfc_error ("%qs and %qs can't be mixed FUNCTION/SUBROUTINE for"
12698 " GENERIC %qs at %L",
12699 sym1->name, sym2->name, generic_name, &where);
12700 return false;
12703 /* Determine PASS arguments. */
12704 if (t1->specific->nopass)
12705 pass1 = NULL;
12706 else if (t1->specific->pass_arg)
12707 pass1 = t1->specific->pass_arg;
12708 else
12710 dummy_args = gfc_sym_get_dummy_args (t1->specific->u.specific->n.sym);
12711 if (dummy_args)
12712 pass1 = dummy_args->sym->name;
12713 else
12714 pass1 = NULL;
12716 if (t2->specific->nopass)
12717 pass2 = NULL;
12718 else if (t2->specific->pass_arg)
12719 pass2 = t2->specific->pass_arg;
12720 else
12722 dummy_args = gfc_sym_get_dummy_args (t2->specific->u.specific->n.sym);
12723 if (dummy_args)
12724 pass2 = dummy_args->sym->name;
12725 else
12726 pass2 = NULL;
12729 /* Compare the interfaces. */
12730 if (gfc_compare_interfaces (sym1, sym2, sym2->name, !t1->is_operator, 0,
12731 NULL, 0, pass1, pass2))
12733 gfc_error ("%qs and %qs for GENERIC %qs at %L are ambiguous",
12734 sym1->name, sym2->name, generic_name, &where);
12735 return false;
12738 return true;
12742 /* Worker function for resolving a generic procedure binding; this is used to
12743 resolve GENERIC as well as user and intrinsic OPERATOR typebound procedures.
12745 The difference between those cases is finding possible inherited bindings
12746 that are overridden, as one has to look for them in tb_sym_root,
12747 tb_uop_root or tb_op, respectively. Thus the caller must already find
12748 the super-type and set p->overridden correctly. */
12750 static bool
12751 resolve_tb_generic_targets (gfc_symbol* super_type,
12752 gfc_typebound_proc* p, const char* name)
12754 gfc_tbp_generic* target;
12755 gfc_symtree* first_target;
12756 gfc_symtree* inherited;
12758 gcc_assert (p && p->is_generic);
12760 /* Try to find the specific bindings for the symtrees in our target-list. */
12761 gcc_assert (p->u.generic);
12762 for (target = p->u.generic; target; target = target->next)
12763 if (!target->specific)
12765 gfc_typebound_proc* overridden_tbp;
12766 gfc_tbp_generic* g;
12767 const char* target_name;
12769 target_name = target->specific_st->name;
12771 /* Defined for this type directly. */
12772 if (target->specific_st->n.tb && !target->specific_st->n.tb->error)
12774 target->specific = target->specific_st->n.tb;
12775 goto specific_found;
12778 /* Look for an inherited specific binding. */
12779 if (super_type)
12781 inherited = gfc_find_typebound_proc (super_type, NULL, target_name,
12782 true, NULL);
12784 if (inherited)
12786 gcc_assert (inherited->n.tb);
12787 target->specific = inherited->n.tb;
12788 goto specific_found;
12792 gfc_error ("Undefined specific binding %qs as target of GENERIC %qs"
12793 " at %L", target_name, name, &p->where);
12794 return false;
12796 /* Once we've found the specific binding, check it is not ambiguous with
12797 other specifics already found or inherited for the same GENERIC. */
12798 specific_found:
12799 gcc_assert (target->specific);
12801 /* This must really be a specific binding! */
12802 if (target->specific->is_generic)
12804 gfc_error ("GENERIC %qs at %L must target a specific binding,"
12805 " %qs is GENERIC, too", name, &p->where, target_name);
12806 return false;
12809 /* Check those already resolved on this type directly. */
12810 for (g = p->u.generic; g; g = g->next)
12811 if (g != target && g->specific
12812 && !check_generic_tbp_ambiguity (target, g, name, p->where))
12813 return false;
12815 /* Check for ambiguity with inherited specific targets. */
12816 for (overridden_tbp = p->overridden; overridden_tbp;
12817 overridden_tbp = overridden_tbp->overridden)
12818 if (overridden_tbp->is_generic)
12820 for (g = overridden_tbp->u.generic; g; g = g->next)
12822 gcc_assert (g->specific);
12823 if (!check_generic_tbp_ambiguity (target, g, name, p->where))
12824 return false;
12829 /* If we attempt to "overwrite" a specific binding, this is an error. */
12830 if (p->overridden && !p->overridden->is_generic)
12832 gfc_error ("GENERIC %qs at %L can't overwrite specific binding with"
12833 " the same name", name, &p->where);
12834 return false;
12837 /* Take the SUBROUTINE/FUNCTION attributes of the first specific target, as
12838 all must have the same attributes here. */
12839 first_target = p->u.generic->specific->u.specific;
12840 gcc_assert (first_target);
12841 p->subroutine = first_target->n.sym->attr.subroutine;
12842 p->function = first_target->n.sym->attr.function;
12844 return true;
12848 /* Resolve a GENERIC procedure binding for a derived type. */
12850 static bool
12851 resolve_typebound_generic (gfc_symbol* derived, gfc_symtree* st)
12853 gfc_symbol* super_type;
12855 /* Find the overridden binding if any. */
12856 st->n.tb->overridden = NULL;
12857 super_type = gfc_get_derived_super_type (derived);
12858 if (super_type)
12860 gfc_symtree* overridden;
12861 overridden = gfc_find_typebound_proc (super_type, NULL, st->name,
12862 true, NULL);
12864 if (overridden && overridden->n.tb)
12865 st->n.tb->overridden = overridden->n.tb;
12868 /* Resolve using worker function. */
12869 return resolve_tb_generic_targets (super_type, st->n.tb, st->name);
12873 /* Retrieve the target-procedure of an operator binding and do some checks in
12874 common for intrinsic and user-defined type-bound operators. */
12876 static gfc_symbol*
12877 get_checked_tb_operator_target (gfc_tbp_generic* target, locus where)
12879 gfc_symbol* target_proc;
12881 gcc_assert (target->specific && !target->specific->is_generic);
12882 target_proc = target->specific->u.specific->n.sym;
12883 gcc_assert (target_proc);
12885 /* F08:C468. All operator bindings must have a passed-object dummy argument. */
12886 if (target->specific->nopass)
12888 gfc_error ("Type-bound operator at %L can't be NOPASS", &where);
12889 return NULL;
12892 return target_proc;
12896 /* Resolve a type-bound intrinsic operator. */
12898 static bool
12899 resolve_typebound_intrinsic_op (gfc_symbol* derived, gfc_intrinsic_op op,
12900 gfc_typebound_proc* p)
12902 gfc_symbol* super_type;
12903 gfc_tbp_generic* target;
12905 /* If there's already an error here, do nothing (but don't fail again). */
12906 if (p->error)
12907 return true;
12909 /* Operators should always be GENERIC bindings. */
12910 gcc_assert (p->is_generic);
12912 /* Look for an overridden binding. */
12913 super_type = gfc_get_derived_super_type (derived);
12914 if (super_type && super_type->f2k_derived)
12915 p->overridden = gfc_find_typebound_intrinsic_op (super_type, NULL,
12916 op, true, NULL);
12917 else
12918 p->overridden = NULL;
12920 /* Resolve general GENERIC properties using worker function. */
12921 if (!resolve_tb_generic_targets (super_type, p, gfc_op2string(op)))
12922 goto error;
12924 /* Check the targets to be procedures of correct interface. */
12925 for (target = p->u.generic; target; target = target->next)
12927 gfc_symbol* target_proc;
12929 target_proc = get_checked_tb_operator_target (target, p->where);
12930 if (!target_proc)
12931 goto error;
12933 if (!gfc_check_operator_interface (target_proc, op, p->where))
12934 goto error;
12936 /* Add target to non-typebound operator list. */
12937 if (!target->specific->deferred && !derived->attr.use_assoc
12938 && p->access != ACCESS_PRIVATE && derived->ns == gfc_current_ns)
12940 gfc_interface *head, *intr;
12942 /* Preempt 'gfc_check_new_interface' for submodules, where the
12943 mechanism for handling module procedures winds up resolving
12944 operator interfaces twice and would otherwise cause an error. */
12945 for (intr = derived->ns->op[op]; intr; intr = intr->next)
12946 if (intr->sym == target_proc
12947 && target_proc->attr.used_in_submodule)
12948 return true;
12950 if (!gfc_check_new_interface (derived->ns->op[op],
12951 target_proc, p->where))
12952 return false;
12953 head = derived->ns->op[op];
12954 intr = gfc_get_interface ();
12955 intr->sym = target_proc;
12956 intr->where = p->where;
12957 intr->next = head;
12958 derived->ns->op[op] = intr;
12962 return true;
12964 error:
12965 p->error = 1;
12966 return false;
12970 /* Resolve a type-bound user operator (tree-walker callback). */
12972 static gfc_symbol* resolve_bindings_derived;
12973 static bool resolve_bindings_result;
12975 static bool check_uop_procedure (gfc_symbol* sym, locus where);
12977 static void
12978 resolve_typebound_user_op (gfc_symtree* stree)
12980 gfc_symbol* super_type;
12981 gfc_tbp_generic* target;
12983 gcc_assert (stree && stree->n.tb);
12985 if (stree->n.tb->error)
12986 return;
12988 /* Operators should always be GENERIC bindings. */
12989 gcc_assert (stree->n.tb->is_generic);
12991 /* Find overridden procedure, if any. */
12992 super_type = gfc_get_derived_super_type (resolve_bindings_derived);
12993 if (super_type && super_type->f2k_derived)
12995 gfc_symtree* overridden;
12996 overridden = gfc_find_typebound_user_op (super_type, NULL,
12997 stree->name, true, NULL);
12999 if (overridden && overridden->n.tb)
13000 stree->n.tb->overridden = overridden->n.tb;
13002 else
13003 stree->n.tb->overridden = NULL;
13005 /* Resolve basically using worker function. */
13006 if (!resolve_tb_generic_targets (super_type, stree->n.tb, stree->name))
13007 goto error;
13009 /* Check the targets to be functions of correct interface. */
13010 for (target = stree->n.tb->u.generic; target; target = target->next)
13012 gfc_symbol* target_proc;
13014 target_proc = get_checked_tb_operator_target (target, stree->n.tb->where);
13015 if (!target_proc)
13016 goto error;
13018 if (!check_uop_procedure (target_proc, stree->n.tb->where))
13019 goto error;
13022 return;
13024 error:
13025 resolve_bindings_result = false;
13026 stree->n.tb->error = 1;
13030 /* Resolve the type-bound procedures for a derived type. */
13032 static void
13033 resolve_typebound_procedure (gfc_symtree* stree)
13035 gfc_symbol* proc;
13036 locus where;
13037 gfc_symbol* me_arg;
13038 gfc_symbol* super_type;
13039 gfc_component* comp;
13041 gcc_assert (stree);
13043 /* Undefined specific symbol from GENERIC target definition. */
13044 if (!stree->n.tb)
13045 return;
13047 if (stree->n.tb->error)
13048 return;
13050 /* If this is a GENERIC binding, use that routine. */
13051 if (stree->n.tb->is_generic)
13053 if (!resolve_typebound_generic (resolve_bindings_derived, stree))
13054 goto error;
13055 return;
13058 /* Get the target-procedure to check it. */
13059 gcc_assert (!stree->n.tb->is_generic);
13060 gcc_assert (stree->n.tb->u.specific);
13061 proc = stree->n.tb->u.specific->n.sym;
13062 where = stree->n.tb->where;
13064 /* Default access should already be resolved from the parser. */
13065 gcc_assert (stree->n.tb->access != ACCESS_UNKNOWN);
13067 if (stree->n.tb->deferred)
13069 if (!check_proc_interface (proc, &where))
13070 goto error;
13072 else
13074 /* Check for F08:C465. */
13075 if ((!proc->attr.subroutine && !proc->attr.function)
13076 || (proc->attr.proc != PROC_MODULE
13077 && proc->attr.if_source != IFSRC_IFBODY)
13078 || proc->attr.abstract)
13080 gfc_error ("%qs must be a module procedure or an external procedure with"
13081 " an explicit interface at %L", proc->name, &where);
13082 goto error;
13086 stree->n.tb->subroutine = proc->attr.subroutine;
13087 stree->n.tb->function = proc->attr.function;
13089 /* Find the super-type of the current derived type. We could do this once and
13090 store in a global if speed is needed, but as long as not I believe this is
13091 more readable and clearer. */
13092 super_type = gfc_get_derived_super_type (resolve_bindings_derived);
13094 /* If PASS, resolve and check arguments if not already resolved / loaded
13095 from a .mod file. */
13096 if (!stree->n.tb->nopass && stree->n.tb->pass_arg_num == 0)
13098 gfc_formal_arglist *dummy_args;
13100 dummy_args = gfc_sym_get_dummy_args (proc);
13101 if (stree->n.tb->pass_arg)
13103 gfc_formal_arglist *i;
13105 /* If an explicit passing argument name is given, walk the arg-list
13106 and look for it. */
13108 me_arg = NULL;
13109 stree->n.tb->pass_arg_num = 1;
13110 for (i = dummy_args; i; i = i->next)
13112 if (!strcmp (i->sym->name, stree->n.tb->pass_arg))
13114 me_arg = i->sym;
13115 break;
13117 ++stree->n.tb->pass_arg_num;
13120 if (!me_arg)
13122 gfc_error ("Procedure %qs with PASS(%s) at %L has no"
13123 " argument %qs",
13124 proc->name, stree->n.tb->pass_arg, &where,
13125 stree->n.tb->pass_arg);
13126 goto error;
13129 else
13131 /* Otherwise, take the first one; there should in fact be at least
13132 one. */
13133 stree->n.tb->pass_arg_num = 1;
13134 if (!dummy_args)
13136 gfc_error ("Procedure %qs with PASS at %L must have at"
13137 " least one argument", proc->name, &where);
13138 goto error;
13140 me_arg = dummy_args->sym;
13143 /* Now check that the argument-type matches and the passed-object
13144 dummy argument is generally fine. */
13146 gcc_assert (me_arg);
13148 if (me_arg->ts.type != BT_CLASS)
13150 gfc_error ("Non-polymorphic passed-object dummy argument of %qs"
13151 " at %L", proc->name, &where);
13152 goto error;
13155 if (CLASS_DATA (me_arg)->ts.u.derived
13156 != resolve_bindings_derived)
13158 gfc_error ("Argument %qs of %qs with PASS(%s) at %L must be of"
13159 " the derived-type %qs", me_arg->name, proc->name,
13160 me_arg->name, &where, resolve_bindings_derived->name);
13161 goto error;
13164 gcc_assert (me_arg->ts.type == BT_CLASS);
13165 if (CLASS_DATA (me_arg)->as && CLASS_DATA (me_arg)->as->rank != 0)
13167 gfc_error ("Passed-object dummy argument of %qs at %L must be"
13168 " scalar", proc->name, &where);
13169 goto error;
13171 if (CLASS_DATA (me_arg)->attr.allocatable)
13173 gfc_error ("Passed-object dummy argument of %qs at %L must not"
13174 " be ALLOCATABLE", proc->name, &where);
13175 goto error;
13177 if (CLASS_DATA (me_arg)->attr.class_pointer)
13179 gfc_error ("Passed-object dummy argument of %qs at %L must not"
13180 " be POINTER", proc->name, &where);
13181 goto error;
13185 /* If we are extending some type, check that we don't override a procedure
13186 flagged NON_OVERRIDABLE. */
13187 stree->n.tb->overridden = NULL;
13188 if (super_type)
13190 gfc_symtree* overridden;
13191 overridden = gfc_find_typebound_proc (super_type, NULL,
13192 stree->name, true, NULL);
13194 if (overridden)
13196 if (overridden->n.tb)
13197 stree->n.tb->overridden = overridden->n.tb;
13199 if (!gfc_check_typebound_override (stree, overridden))
13200 goto error;
13204 /* See if there's a name collision with a component directly in this type. */
13205 for (comp = resolve_bindings_derived->components; comp; comp = comp->next)
13206 if (!strcmp (comp->name, stree->name))
13208 gfc_error ("Procedure %qs at %L has the same name as a component of"
13209 " %qs",
13210 stree->name, &where, resolve_bindings_derived->name);
13211 goto error;
13214 /* Try to find a name collision with an inherited component. */
13215 if (super_type && gfc_find_component (super_type, stree->name, true, true,
13216 NULL))
13218 gfc_error ("Procedure %qs at %L has the same name as an inherited"
13219 " component of %qs",
13220 stree->name, &where, resolve_bindings_derived->name);
13221 goto error;
13224 stree->n.tb->error = 0;
13225 return;
13227 error:
13228 resolve_bindings_result = false;
13229 stree->n.tb->error = 1;
13233 static bool
13234 resolve_typebound_procedures (gfc_symbol* derived)
13236 int op;
13237 gfc_symbol* super_type;
13239 if (!derived->f2k_derived || !derived->f2k_derived->tb_sym_root)
13240 return true;
13242 super_type = gfc_get_derived_super_type (derived);
13243 if (super_type)
13244 resolve_symbol (super_type);
13246 resolve_bindings_derived = derived;
13247 resolve_bindings_result = true;
13249 if (derived->f2k_derived->tb_sym_root)
13250 gfc_traverse_symtree (derived->f2k_derived->tb_sym_root,
13251 &resolve_typebound_procedure);
13253 if (derived->f2k_derived->tb_uop_root)
13254 gfc_traverse_symtree (derived->f2k_derived->tb_uop_root,
13255 &resolve_typebound_user_op);
13257 for (op = 0; op != GFC_INTRINSIC_OPS; ++op)
13259 gfc_typebound_proc* p = derived->f2k_derived->tb_op[op];
13260 if (p && !resolve_typebound_intrinsic_op (derived,
13261 (gfc_intrinsic_op)op, p))
13262 resolve_bindings_result = false;
13265 return resolve_bindings_result;
13269 /* Add a derived type to the dt_list. The dt_list is used in trans-types.c
13270 to give all identical derived types the same backend_decl. */
13271 static void
13272 add_dt_to_dt_list (gfc_symbol *derived)
13274 gfc_dt_list *dt_list;
13276 for (dt_list = gfc_derived_types; dt_list; dt_list = dt_list->next)
13277 if (derived == dt_list->derived)
13278 return;
13280 dt_list = gfc_get_dt_list ();
13281 dt_list->next = gfc_derived_types;
13282 dt_list->derived = derived;
13283 gfc_derived_types = dt_list;
13287 /* Ensure that a derived-type is really not abstract, meaning that every
13288 inherited DEFERRED binding is overridden by a non-DEFERRED one. */
13290 static bool
13291 ensure_not_abstract_walker (gfc_symbol* sub, gfc_symtree* st)
13293 if (!st)
13294 return true;
13296 if (!ensure_not_abstract_walker (sub, st->left))
13297 return false;
13298 if (!ensure_not_abstract_walker (sub, st->right))
13299 return false;
13301 if (st->n.tb && st->n.tb->deferred)
13303 gfc_symtree* overriding;
13304 overriding = gfc_find_typebound_proc (sub, NULL, st->name, true, NULL);
13305 if (!overriding)
13306 return false;
13307 gcc_assert (overriding->n.tb);
13308 if (overriding->n.tb->deferred)
13310 gfc_error ("Derived-type %qs declared at %L must be ABSTRACT because"
13311 " %qs is DEFERRED and not overridden",
13312 sub->name, &sub->declared_at, st->name);
13313 return false;
13317 return true;
13320 static bool
13321 ensure_not_abstract (gfc_symbol* sub, gfc_symbol* ancestor)
13323 /* The algorithm used here is to recursively travel up the ancestry of sub
13324 and for each ancestor-type, check all bindings. If any of them is
13325 DEFERRED, look it up starting from sub and see if the found (overriding)
13326 binding is not DEFERRED.
13327 This is not the most efficient way to do this, but it should be ok and is
13328 clearer than something sophisticated. */
13330 gcc_assert (ancestor && !sub->attr.abstract);
13332 if (!ancestor->attr.abstract)
13333 return true;
13335 /* Walk bindings of this ancestor. */
13336 if (ancestor->f2k_derived)
13338 bool t;
13339 t = ensure_not_abstract_walker (sub, ancestor->f2k_derived->tb_sym_root);
13340 if (!t)
13341 return false;
13344 /* Find next ancestor type and recurse on it. */
13345 ancestor = gfc_get_derived_super_type (ancestor);
13346 if (ancestor)
13347 return ensure_not_abstract (sub, ancestor);
13349 return true;
13353 /* This check for typebound defined assignments is done recursively
13354 since the order in which derived types are resolved is not always in
13355 order of the declarations. */
13357 static void
13358 check_defined_assignments (gfc_symbol *derived)
13360 gfc_component *c;
13362 for (c = derived->components; c; c = c->next)
13364 if (!gfc_bt_struct (c->ts.type)
13365 || c->attr.pointer
13366 || c->attr.allocatable
13367 || c->attr.proc_pointer_comp
13368 || c->attr.class_pointer
13369 || c->attr.proc_pointer)
13370 continue;
13372 if (c->ts.u.derived->attr.defined_assign_comp
13373 || (c->ts.u.derived->f2k_derived
13374 && c->ts.u.derived->f2k_derived->tb_op[INTRINSIC_ASSIGN]))
13376 derived->attr.defined_assign_comp = 1;
13377 return;
13380 check_defined_assignments (c->ts.u.derived);
13381 if (c->ts.u.derived->attr.defined_assign_comp)
13383 derived->attr.defined_assign_comp = 1;
13384 return;
13390 /* Resolve a single component of a derived type or structure. */
13392 static bool
13393 resolve_component (gfc_component *c, gfc_symbol *sym)
13395 gfc_symbol *super_type;
13397 if (c->attr.artificial)
13398 return true;
13400 /* F2008, C442. */
13401 if ((!sym->attr.is_class || c != sym->components)
13402 && c->attr.codimension
13403 && (!c->attr.allocatable || (c->as && c->as->type != AS_DEFERRED)))
13405 gfc_error ("Coarray component %qs at %L must be allocatable with "
13406 "deferred shape", c->name, &c->loc);
13407 return false;
13410 /* F2008, C443. */
13411 if (c->attr.codimension && c->ts.type == BT_DERIVED
13412 && c->ts.u.derived->ts.is_iso_c)
13414 gfc_error ("Component %qs at %L of TYPE(C_PTR) or TYPE(C_FUNPTR) "
13415 "shall not be a coarray", c->name, &c->loc);
13416 return false;
13419 /* F2008, C444. */
13420 if (gfc_bt_struct (c->ts.type) && c->ts.u.derived->attr.coarray_comp
13421 && (c->attr.codimension || c->attr.pointer || c->attr.dimension
13422 || c->attr.allocatable))
13424 gfc_error ("Component %qs at %L with coarray component "
13425 "shall be a nonpointer, nonallocatable scalar",
13426 c->name, &c->loc);
13427 return false;
13430 /* F2008, C448. */
13431 if (c->attr.contiguous && (!c->attr.dimension || !c->attr.pointer))
13433 gfc_error ("Component %qs at %L has the CONTIGUOUS attribute but "
13434 "is not an array pointer", c->name, &c->loc);
13435 return false;
13438 if (c->attr.proc_pointer && c->ts.interface)
13440 gfc_symbol *ifc = c->ts.interface;
13442 if (!sym->attr.vtype && !check_proc_interface (ifc, &c->loc))
13444 c->tb->error = 1;
13445 return false;
13448 if (ifc->attr.if_source || ifc->attr.intrinsic)
13450 /* Resolve interface and copy attributes. */
13451 if (ifc->formal && !ifc->formal_ns)
13452 resolve_symbol (ifc);
13453 if (ifc->attr.intrinsic)
13454 gfc_resolve_intrinsic (ifc, &ifc->declared_at);
13456 if (ifc->result)
13458 c->ts = ifc->result->ts;
13459 c->attr.allocatable = ifc->result->attr.allocatable;
13460 c->attr.pointer = ifc->result->attr.pointer;
13461 c->attr.dimension = ifc->result->attr.dimension;
13462 c->as = gfc_copy_array_spec (ifc->result->as);
13463 c->attr.class_ok = ifc->result->attr.class_ok;
13465 else
13467 c->ts = ifc->ts;
13468 c->attr.allocatable = ifc->attr.allocatable;
13469 c->attr.pointer = ifc->attr.pointer;
13470 c->attr.dimension = ifc->attr.dimension;
13471 c->as = gfc_copy_array_spec (ifc->as);
13472 c->attr.class_ok = ifc->attr.class_ok;
13474 c->ts.interface = ifc;
13475 c->attr.function = ifc->attr.function;
13476 c->attr.subroutine = ifc->attr.subroutine;
13478 c->attr.pure = ifc->attr.pure;
13479 c->attr.elemental = ifc->attr.elemental;
13480 c->attr.recursive = ifc->attr.recursive;
13481 c->attr.always_explicit = ifc->attr.always_explicit;
13482 c->attr.ext_attr |= ifc->attr.ext_attr;
13483 /* Copy char length. */
13484 if (ifc->ts.type == BT_CHARACTER && ifc->ts.u.cl)
13486 gfc_charlen *cl = gfc_new_charlen (sym->ns, ifc->ts.u.cl);
13487 if (cl->length && !cl->resolved
13488 && !gfc_resolve_expr (cl->length))
13490 c->tb->error = 1;
13491 return false;
13493 c->ts.u.cl = cl;
13497 else if (c->attr.proc_pointer && c->ts.type == BT_UNKNOWN)
13499 /* Since PPCs are not implicitly typed, a PPC without an explicit
13500 interface must be a subroutine. */
13501 gfc_add_subroutine (&c->attr, c->name, &c->loc);
13504 /* Procedure pointer components: Check PASS arg. */
13505 if (c->attr.proc_pointer && !c->tb->nopass && c->tb->pass_arg_num == 0
13506 && !sym->attr.vtype)
13508 gfc_symbol* me_arg;
13510 if (c->tb->pass_arg)
13512 gfc_formal_arglist* i;
13514 /* If an explicit passing argument name is given, walk the arg-list
13515 and look for it. */
13517 me_arg = NULL;
13518 c->tb->pass_arg_num = 1;
13519 for (i = c->ts.interface->formal; i; i = i->next)
13521 if (!strcmp (i->sym->name, c->tb->pass_arg))
13523 me_arg = i->sym;
13524 break;
13526 c->tb->pass_arg_num++;
13529 if (!me_arg)
13531 gfc_error ("Procedure pointer component %qs with PASS(%s) "
13532 "at %L has no argument %qs", c->name,
13533 c->tb->pass_arg, &c->loc, c->tb->pass_arg);
13534 c->tb->error = 1;
13535 return false;
13538 else
13540 /* Otherwise, take the first one; there should in fact be at least
13541 one. */
13542 c->tb->pass_arg_num = 1;
13543 if (!c->ts.interface->formal)
13545 gfc_error ("Procedure pointer component %qs with PASS at %L "
13546 "must have at least one argument",
13547 c->name, &c->loc);
13548 c->tb->error = 1;
13549 return false;
13551 me_arg = c->ts.interface->formal->sym;
13554 /* Now check that the argument-type matches. */
13555 gcc_assert (me_arg);
13556 if ((me_arg->ts.type != BT_DERIVED && me_arg->ts.type != BT_CLASS)
13557 || (me_arg->ts.type == BT_DERIVED && me_arg->ts.u.derived != sym)
13558 || (me_arg->ts.type == BT_CLASS
13559 && CLASS_DATA (me_arg)->ts.u.derived != sym))
13561 gfc_error ("Argument %qs of %qs with PASS(%s) at %L must be of"
13562 " the derived type %qs", me_arg->name, c->name,
13563 me_arg->name, &c->loc, sym->name);
13564 c->tb->error = 1;
13565 return false;
13568 /* Check for C453. */
13569 if (me_arg->attr.dimension)
13571 gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
13572 "must be scalar", me_arg->name, c->name, me_arg->name,
13573 &c->loc);
13574 c->tb->error = 1;
13575 return false;
13578 if (me_arg->attr.pointer)
13580 gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
13581 "may not have the POINTER attribute", me_arg->name,
13582 c->name, me_arg->name, &c->loc);
13583 c->tb->error = 1;
13584 return false;
13587 if (me_arg->attr.allocatable)
13589 gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
13590 "may not be ALLOCATABLE", me_arg->name, c->name,
13591 me_arg->name, &c->loc);
13592 c->tb->error = 1;
13593 return false;
13596 if (gfc_type_is_extensible (sym) && me_arg->ts.type != BT_CLASS)
13598 gfc_error ("Non-polymorphic passed-object dummy argument of %qs"
13599 " at %L", c->name, &c->loc);
13600 return false;
13605 /* Check type-spec if this is not the parent-type component. */
13606 if (((sym->attr.is_class
13607 && (!sym->components->ts.u.derived->attr.extension
13608 || c != sym->components->ts.u.derived->components))
13609 || (!sym->attr.is_class
13610 && (!sym->attr.extension || c != sym->components)))
13611 && !sym->attr.vtype
13612 && !resolve_typespec_used (&c->ts, &c->loc, c->name))
13613 return false;
13615 super_type = gfc_get_derived_super_type (sym);
13617 /* If this type is an extension, set the accessibility of the parent
13618 component. */
13619 if (super_type
13620 && ((sym->attr.is_class
13621 && c == sym->components->ts.u.derived->components)
13622 || (!sym->attr.is_class && c == sym->components))
13623 && strcmp (super_type->name, c->name) == 0)
13624 c->attr.access = super_type->attr.access;
13626 /* If this type is an extension, see if this component has the same name
13627 as an inherited type-bound procedure. */
13628 if (super_type && !sym->attr.is_class
13629 && gfc_find_typebound_proc (super_type, NULL, c->name, true, NULL))
13631 gfc_error ("Component %qs of %qs at %L has the same name as an"
13632 " inherited type-bound procedure",
13633 c->name, sym->name, &c->loc);
13634 return false;
13637 if (c->ts.type == BT_CHARACTER && !c->attr.proc_pointer
13638 && !c->ts.deferred)
13640 if (c->ts.u.cl->length == NULL
13641 || (!resolve_charlen(c->ts.u.cl))
13642 || !gfc_is_constant_expr (c->ts.u.cl->length))
13644 gfc_error ("Character length of component %qs needs to "
13645 "be a constant specification expression at %L",
13646 c->name,
13647 c->ts.u.cl->length ? &c->ts.u.cl->length->where : &c->loc);
13648 return false;
13652 if (c->ts.type == BT_CHARACTER && c->ts.deferred
13653 && !c->attr.pointer && !c->attr.allocatable)
13655 gfc_error ("Character component %qs of %qs at %L with deferred "
13656 "length must be a POINTER or ALLOCATABLE",
13657 c->name, sym->name, &c->loc);
13658 return false;
13661 /* Add the hidden deferred length field. */
13662 if (c->ts.type == BT_CHARACTER
13663 && (c->ts.deferred || c->attr.pdt_string)
13664 && !c->attr.function
13665 && !sym->attr.is_class)
13667 char name[GFC_MAX_SYMBOL_LEN+9];
13668 gfc_component *strlen;
13669 sprintf (name, "_%s_length", c->name);
13670 strlen = gfc_find_component (sym, name, true, true, NULL);
13671 if (strlen == NULL)
13673 if (!gfc_add_component (sym, name, &strlen))
13674 return false;
13675 strlen->ts.type = BT_INTEGER;
13676 strlen->ts.kind = gfc_charlen_int_kind;
13677 strlen->attr.access = ACCESS_PRIVATE;
13678 strlen->attr.artificial = 1;
13682 if (c->ts.type == BT_DERIVED
13683 && sym->component_access != ACCESS_PRIVATE
13684 && gfc_check_symbol_access (sym)
13685 && !is_sym_host_assoc (c->ts.u.derived, sym->ns)
13686 && !c->ts.u.derived->attr.use_assoc
13687 && !gfc_check_symbol_access (c->ts.u.derived)
13688 && !gfc_notify_std (GFC_STD_F2003, "the component %qs is a "
13689 "PRIVATE type and cannot be a component of "
13690 "%qs, which is PUBLIC at %L", c->name,
13691 sym->name, &sym->declared_at))
13692 return false;
13694 if ((sym->attr.sequence || sym->attr.is_bind_c) && c->ts.type == BT_CLASS)
13696 gfc_error ("Polymorphic component %s at %L in SEQUENCE or BIND(C) "
13697 "type %s", c->name, &c->loc, sym->name);
13698 return false;
13701 if (sym->attr.sequence)
13703 if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.sequence == 0)
13705 gfc_error ("Component %s of SEQUENCE type declared at %L does "
13706 "not have the SEQUENCE attribute",
13707 c->ts.u.derived->name, &sym->declared_at);
13708 return false;
13712 if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.generic)
13713 c->ts.u.derived = gfc_find_dt_in_generic (c->ts.u.derived);
13714 else if (c->ts.type == BT_CLASS && c->attr.class_ok
13715 && CLASS_DATA (c)->ts.u.derived->attr.generic)
13716 CLASS_DATA (c)->ts.u.derived
13717 = gfc_find_dt_in_generic (CLASS_DATA (c)->ts.u.derived);
13719 if (!sym->attr.is_class && c->ts.type == BT_DERIVED && !sym->attr.vtype
13720 && c->attr.pointer && c->ts.u.derived->components == NULL
13721 && !c->ts.u.derived->attr.zero_comp)
13723 gfc_error ("The pointer component %qs of %qs at %L is a type "
13724 "that has not been declared", c->name, sym->name,
13725 &c->loc);
13726 return false;
13729 if (c->ts.type == BT_CLASS && c->attr.class_ok
13730 && CLASS_DATA (c)->attr.class_pointer
13731 && CLASS_DATA (c)->ts.u.derived->components == NULL
13732 && !CLASS_DATA (c)->ts.u.derived->attr.zero_comp
13733 && !UNLIMITED_POLY (c))
13735 gfc_error ("The pointer component %qs of %qs at %L is a type "
13736 "that has not been declared", c->name, sym->name,
13737 &c->loc);
13738 return false;
13741 /* If an allocatable component derived type is of the same type as
13742 the enclosing derived type, we need a vtable generating so that
13743 the __deallocate procedure is created. */
13744 if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
13745 && c->ts.u.derived == sym && c->attr.allocatable == 1)
13746 gfc_find_vtab (&c->ts);
13748 /* Ensure that all the derived type components are put on the
13749 derived type list; even in formal namespaces, where derived type
13750 pointer components might not have been declared. */
13751 if (c->ts.type == BT_DERIVED
13752 && c->ts.u.derived
13753 && c->ts.u.derived->components
13754 && c->attr.pointer
13755 && sym != c->ts.u.derived)
13756 add_dt_to_dt_list (c->ts.u.derived);
13758 if (!gfc_resolve_array_spec (c->as,
13759 !(c->attr.pointer || c->attr.proc_pointer
13760 || c->attr.allocatable)))
13761 return false;
13763 if (c->initializer && !sym->attr.vtype
13764 && !c->attr.pdt_kind && !c->attr.pdt_len
13765 && !gfc_check_assign_symbol (sym, c, c->initializer))
13766 return false;
13768 return true;
13772 /* Be nice about the locus for a structure expression - show the locus of the
13773 first non-null sub-expression if we can. */
13775 static locus *
13776 cons_where (gfc_expr *struct_expr)
13778 gfc_constructor *cons;
13780 gcc_assert (struct_expr && struct_expr->expr_type == EXPR_STRUCTURE);
13782 cons = gfc_constructor_first (struct_expr->value.constructor);
13783 for (; cons; cons = gfc_constructor_next (cons))
13785 if (cons->expr && cons->expr->expr_type != EXPR_NULL)
13786 return &cons->expr->where;
13789 return &struct_expr->where;
13792 /* Resolve the components of a structure type. Much less work than derived
13793 types. */
13795 static bool
13796 resolve_fl_struct (gfc_symbol *sym)
13798 gfc_component *c;
13799 gfc_expr *init = NULL;
13800 bool success;
13802 /* Make sure UNIONs do not have overlapping initializers. */
13803 if (sym->attr.flavor == FL_UNION)
13805 for (c = sym->components; c; c = c->next)
13807 if (init && c->initializer)
13809 gfc_error ("Conflicting initializers in union at %L and %L",
13810 cons_where (init), cons_where (c->initializer));
13811 gfc_free_expr (c->initializer);
13812 c->initializer = NULL;
13814 if (init == NULL)
13815 init = c->initializer;
13819 success = true;
13820 for (c = sym->components; c; c = c->next)
13821 if (!resolve_component (c, sym))
13822 success = false;
13824 if (!success)
13825 return false;
13827 if (sym->components)
13828 add_dt_to_dt_list (sym);
13830 return true;
13834 /* Resolve the components of a derived type. This does not have to wait until
13835 resolution stage, but can be done as soon as the dt declaration has been
13836 parsed. */
13838 static bool
13839 resolve_fl_derived0 (gfc_symbol *sym)
13841 gfc_symbol* super_type;
13842 gfc_component *c;
13843 bool success;
13845 if (sym->attr.unlimited_polymorphic)
13846 return true;
13848 super_type = gfc_get_derived_super_type (sym);
13850 /* F2008, C432. */
13851 if (super_type && sym->attr.coarray_comp && !super_type->attr.coarray_comp)
13853 gfc_error ("As extending type %qs at %L has a coarray component, "
13854 "parent type %qs shall also have one", sym->name,
13855 &sym->declared_at, super_type->name);
13856 return false;
13859 /* Ensure the extended type gets resolved before we do. */
13860 if (super_type && !resolve_fl_derived0 (super_type))
13861 return false;
13863 /* An ABSTRACT type must be extensible. */
13864 if (sym->attr.abstract && !gfc_type_is_extensible (sym))
13866 gfc_error ("Non-extensible derived-type %qs at %L must not be ABSTRACT",
13867 sym->name, &sym->declared_at);
13868 return false;
13871 c = (sym->attr.is_class) ? sym->components->ts.u.derived->components
13872 : sym->components;
13874 success = true;
13875 for ( ; c != NULL; c = c->next)
13876 if (!resolve_component (c, sym))
13877 success = false;
13879 if (!success)
13880 return false;
13882 check_defined_assignments (sym);
13884 if (!sym->attr.defined_assign_comp && super_type)
13885 sym->attr.defined_assign_comp
13886 = super_type->attr.defined_assign_comp;
13888 /* If this is a non-ABSTRACT type extending an ABSTRACT one, ensure that
13889 all DEFERRED bindings are overridden. */
13890 if (super_type && super_type->attr.abstract && !sym->attr.abstract
13891 && !sym->attr.is_class
13892 && !ensure_not_abstract (sym, super_type))
13893 return false;
13895 /* Add derived type to the derived type list. */
13896 add_dt_to_dt_list (sym);
13898 return true;
13902 /* The following procedure does the full resolution of a derived type,
13903 including resolution of all type-bound procedures (if present). In contrast
13904 to 'resolve_fl_derived0' this can only be done after the module has been
13905 parsed completely. */
13907 static bool
13908 resolve_fl_derived (gfc_symbol *sym)
13910 gfc_symbol *gen_dt = NULL;
13912 if (sym->attr.unlimited_polymorphic)
13913 return true;
13915 if (!sym->attr.is_class)
13916 gfc_find_symbol (sym->name, sym->ns, 0, &gen_dt);
13917 if (gen_dt && gen_dt->generic && gen_dt->generic->next
13918 && (!gen_dt->generic->sym->attr.use_assoc
13919 || gen_dt->generic->sym->module != gen_dt->generic->next->sym->module)
13920 && !gfc_notify_std (GFC_STD_F2003, "Generic name %qs of function "
13921 "%qs at %L being the same name as derived "
13922 "type at %L", sym->name,
13923 gen_dt->generic->sym == sym
13924 ? gen_dt->generic->next->sym->name
13925 : gen_dt->generic->sym->name,
13926 gen_dt->generic->sym == sym
13927 ? &gen_dt->generic->next->sym->declared_at
13928 : &gen_dt->generic->sym->declared_at,
13929 &sym->declared_at))
13930 return false;
13932 /* Resolve the finalizer procedures. */
13933 if (!gfc_resolve_finalizers (sym, NULL))
13934 return false;
13936 if (sym->attr.is_class && sym->ts.u.derived == NULL)
13938 /* Fix up incomplete CLASS symbols. */
13939 gfc_component *data = gfc_find_component (sym, "_data", true, true, NULL);
13940 gfc_component *vptr = gfc_find_component (sym, "_vptr", true, true, NULL);
13942 /* Nothing more to do for unlimited polymorphic entities. */
13943 if (data->ts.u.derived->attr.unlimited_polymorphic)
13944 return true;
13945 else if (vptr->ts.u.derived == NULL)
13947 gfc_symbol *vtab = gfc_find_derived_vtab (data->ts.u.derived);
13948 gcc_assert (vtab);
13949 vptr->ts.u.derived = vtab->ts.u.derived;
13950 if (!resolve_fl_derived0 (vptr->ts.u.derived))
13951 return false;
13955 if (!resolve_fl_derived0 (sym))
13956 return false;
13958 /* Resolve the type-bound procedures. */
13959 if (!resolve_typebound_procedures (sym))
13960 return false;
13962 return true;
13966 static bool
13967 resolve_fl_namelist (gfc_symbol *sym)
13969 gfc_namelist *nl;
13970 gfc_symbol *nlsym;
13972 for (nl = sym->namelist; nl; nl = nl->next)
13974 /* Check again, the check in match only works if NAMELIST comes
13975 after the decl. */
13976 if (nl->sym->as && nl->sym->as->type == AS_ASSUMED_SIZE)
13978 gfc_error ("Assumed size array %qs in namelist %qs at %L is not "
13979 "allowed", nl->sym->name, sym->name, &sym->declared_at);
13980 return false;
13983 if (nl->sym->as && nl->sym->as->type == AS_ASSUMED_SHAPE
13984 && !gfc_notify_std (GFC_STD_F2003, "NAMELIST array object %qs "
13985 "with assumed shape in namelist %qs at %L",
13986 nl->sym->name, sym->name, &sym->declared_at))
13987 return false;
13989 if (is_non_constant_shape_array (nl->sym)
13990 && !gfc_notify_std (GFC_STD_F2003, "NAMELIST array object %qs "
13991 "with nonconstant shape in namelist %qs at %L",
13992 nl->sym->name, sym->name, &sym->declared_at))
13993 return false;
13995 if (nl->sym->ts.type == BT_CHARACTER
13996 && (nl->sym->ts.u.cl->length == NULL
13997 || !gfc_is_constant_expr (nl->sym->ts.u.cl->length))
13998 && !gfc_notify_std (GFC_STD_F2003, "NAMELIST object %qs with "
13999 "nonconstant character length in "
14000 "namelist %qs at %L", nl->sym->name,
14001 sym->name, &sym->declared_at))
14002 return false;
14006 /* Reject PRIVATE objects in a PUBLIC namelist. */
14007 if (gfc_check_symbol_access (sym))
14009 for (nl = sym->namelist; nl; nl = nl->next)
14011 if (!nl->sym->attr.use_assoc
14012 && !is_sym_host_assoc (nl->sym, sym->ns)
14013 && !gfc_check_symbol_access (nl->sym))
14015 gfc_error ("NAMELIST object %qs was declared PRIVATE and "
14016 "cannot be member of PUBLIC namelist %qs at %L",
14017 nl->sym->name, sym->name, &sym->declared_at);
14018 return false;
14021 if (nl->sym->ts.type == BT_DERIVED
14022 && (nl->sym->ts.u.derived->attr.alloc_comp
14023 || nl->sym->ts.u.derived->attr.pointer_comp))
14025 if (!gfc_notify_std (GFC_STD_F2003, "NAMELIST object %qs in "
14026 "namelist %qs at %L with ALLOCATABLE "
14027 "or POINTER components", nl->sym->name,
14028 sym->name, &sym->declared_at))
14029 return false;
14030 return true;
14033 /* Types with private components that came here by USE-association. */
14034 if (nl->sym->ts.type == BT_DERIVED
14035 && derived_inaccessible (nl->sym->ts.u.derived))
14037 gfc_error ("NAMELIST object %qs has use-associated PRIVATE "
14038 "components and cannot be member of namelist %qs at %L",
14039 nl->sym->name, sym->name, &sym->declared_at);
14040 return false;
14043 /* Types with private components that are defined in the same module. */
14044 if (nl->sym->ts.type == BT_DERIVED
14045 && !is_sym_host_assoc (nl->sym->ts.u.derived, sym->ns)
14046 && nl->sym->ts.u.derived->attr.private_comp)
14048 gfc_error ("NAMELIST object %qs has PRIVATE components and "
14049 "cannot be a member of PUBLIC namelist %qs at %L",
14050 nl->sym->name, sym->name, &sym->declared_at);
14051 return false;
14057 /* 14.1.2 A module or internal procedure represent local entities
14058 of the same type as a namelist member and so are not allowed. */
14059 for (nl = sym->namelist; nl; nl = nl->next)
14061 if (nl->sym->ts.kind != 0 && nl->sym->attr.flavor == FL_VARIABLE)
14062 continue;
14064 if (nl->sym->attr.function && nl->sym == nl->sym->result)
14065 if ((nl->sym == sym->ns->proc_name)
14067 (sym->ns->parent && nl->sym == sym->ns->parent->proc_name))
14068 continue;
14070 nlsym = NULL;
14071 if (nl->sym->name)
14072 gfc_find_symbol (nl->sym->name, sym->ns, 1, &nlsym);
14073 if (nlsym && nlsym->attr.flavor == FL_PROCEDURE)
14075 gfc_error ("PROCEDURE attribute conflicts with NAMELIST "
14076 "attribute in %qs at %L", nlsym->name,
14077 &sym->declared_at);
14078 return false;
14082 return true;
14086 static bool
14087 resolve_fl_parameter (gfc_symbol *sym)
14089 /* A parameter array's shape needs to be constant. */
14090 if (sym->as != NULL
14091 && (sym->as->type == AS_DEFERRED
14092 || is_non_constant_shape_array (sym)))
14094 gfc_error ("Parameter array %qs at %L cannot be automatic "
14095 "or of deferred shape", sym->name, &sym->declared_at);
14096 return false;
14099 /* Constraints on deferred type parameter. */
14100 if (!deferred_requirements (sym))
14101 return false;
14103 /* Make sure a parameter that has been implicitly typed still
14104 matches the implicit type, since PARAMETER statements can precede
14105 IMPLICIT statements. */
14106 if (sym->attr.implicit_type
14107 && !gfc_compare_types (&sym->ts, gfc_get_default_type (sym->name,
14108 sym->ns)))
14110 gfc_error ("Implicitly typed PARAMETER %qs at %L doesn't match a "
14111 "later IMPLICIT type", sym->name, &sym->declared_at);
14112 return false;
14115 /* Make sure the types of derived parameters are consistent. This
14116 type checking is deferred until resolution because the type may
14117 refer to a derived type from the host. */
14118 if (sym->ts.type == BT_DERIVED
14119 && !gfc_compare_types (&sym->ts, &sym->value->ts))
14121 gfc_error ("Incompatible derived type in PARAMETER at %L",
14122 &sym->value->where);
14123 return false;
14126 /* F03:C509,C514. */
14127 if (sym->ts.type == BT_CLASS)
14129 gfc_error ("CLASS variable %qs at %L cannot have the PARAMETER attribute",
14130 sym->name, &sym->declared_at);
14131 return false;
14134 return true;
14138 /* Called by resolve_symbol to chack PDTs. */
14140 static void
14141 resolve_pdt (gfc_symbol* sym)
14143 gfc_symbol *derived = NULL;
14144 gfc_actual_arglist *param;
14145 gfc_component *c;
14146 bool const_len_exprs = true;
14147 bool assumed_len_exprs = false;
14149 if (sym->ts.type == BT_DERIVED)
14150 derived = sym->ts.u.derived;
14151 else if (sym->ts.type == BT_CLASS)
14152 derived = CLASS_DATA (sym)->ts.u.derived;
14153 else
14154 gcc_unreachable ();
14156 gcc_assert (derived->attr.pdt_type);
14158 for (param = sym->param_list; param; param = param->next)
14160 c = gfc_find_component (derived, param->name, false, true, NULL);
14161 gcc_assert (c);
14162 if (c->attr.pdt_kind)
14163 continue;
14165 if (param->expr && !gfc_is_constant_expr (param->expr)
14166 && c->attr.pdt_len)
14167 const_len_exprs = false;
14168 else if (param->spec_type == SPEC_ASSUMED)
14169 assumed_len_exprs = true;
14172 if (!const_len_exprs
14173 && (sym->ns->proc_name->attr.is_main_program
14174 || sym->ns->proc_name->attr.flavor == FL_MODULE
14175 || sym->attr.save != SAVE_NONE))
14176 gfc_error ("The AUTOMATIC object %qs at %L must not have the "
14177 "SAVE attribute or be a variable declared in the "
14178 "main program, a module or a submodule(F08/C513)",
14179 sym->name, &sym->declared_at);
14181 if (assumed_len_exprs && !(sym->attr.dummy
14182 || sym->attr.select_type_temporary || sym->attr.associate_var))
14183 gfc_error ("The object %qs at %L with ASSUMED type parameters "
14184 "must be a dummy or a SELECT TYPE selector(F08/4.2)",
14185 sym->name, &sym->declared_at);
14189 /* Do anything necessary to resolve a symbol. Right now, we just
14190 assume that an otherwise unknown symbol is a variable. This sort
14191 of thing commonly happens for symbols in module. */
14193 static void
14194 resolve_symbol (gfc_symbol *sym)
14196 int check_constant, mp_flag;
14197 gfc_symtree *symtree;
14198 gfc_symtree *this_symtree;
14199 gfc_namespace *ns;
14200 gfc_component *c;
14201 symbol_attribute class_attr;
14202 gfc_array_spec *as;
14203 bool saved_specification_expr;
14205 if (sym->resolved)
14206 return;
14207 sym->resolved = 1;
14209 /* No symbol will ever have union type; only components can be unions.
14210 Union type declaration symbols have type BT_UNKNOWN but flavor FL_UNION
14211 (just like derived type declaration symbols have flavor FL_DERIVED). */
14212 gcc_assert (sym->ts.type != BT_UNION);
14214 /* Coarrayed polymorphic objects with allocatable or pointer components are
14215 yet unsupported for -fcoarray=lib. */
14216 if (flag_coarray == GFC_FCOARRAY_LIB && sym->ts.type == BT_CLASS
14217 && sym->ts.u.derived && CLASS_DATA (sym)
14218 && CLASS_DATA (sym)->attr.codimension
14219 && (CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp
14220 || CLASS_DATA (sym)->ts.u.derived->attr.pointer_comp))
14222 gfc_error ("Sorry, allocatable/pointer components in polymorphic (CLASS) "
14223 "type coarrays at %L are unsupported", &sym->declared_at);
14224 return;
14227 if (sym->attr.artificial)
14228 return;
14230 if (sym->attr.unlimited_polymorphic)
14231 return;
14233 if (sym->attr.flavor == FL_UNKNOWN
14234 || (sym->attr.flavor == FL_PROCEDURE && !sym->attr.intrinsic
14235 && !sym->attr.generic && !sym->attr.external
14236 && sym->attr.if_source == IFSRC_UNKNOWN
14237 && sym->ts.type == BT_UNKNOWN))
14240 /* If we find that a flavorless symbol is an interface in one of the
14241 parent namespaces, find its symtree in this namespace, free the
14242 symbol and set the symtree to point to the interface symbol. */
14243 for (ns = gfc_current_ns->parent; ns; ns = ns->parent)
14245 symtree = gfc_find_symtree (ns->sym_root, sym->name);
14246 if (symtree && (symtree->n.sym->generic ||
14247 (symtree->n.sym->attr.flavor == FL_PROCEDURE
14248 && sym->ns->construct_entities)))
14250 this_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
14251 sym->name);
14252 if (this_symtree->n.sym == sym)
14254 symtree->n.sym->refs++;
14255 gfc_release_symbol (sym);
14256 this_symtree->n.sym = symtree->n.sym;
14257 return;
14262 /* Otherwise give it a flavor according to such attributes as
14263 it has. */
14264 if (sym->attr.flavor == FL_UNKNOWN && sym->attr.external == 0
14265 && sym->attr.intrinsic == 0)
14266 sym->attr.flavor = FL_VARIABLE;
14267 else if (sym->attr.flavor == FL_UNKNOWN)
14269 sym->attr.flavor = FL_PROCEDURE;
14270 if (sym->attr.dimension)
14271 sym->attr.function = 1;
14275 if (sym->attr.external && sym->ts.type != BT_UNKNOWN && !sym->attr.function)
14276 gfc_add_function (&sym->attr, sym->name, &sym->declared_at);
14278 if (sym->attr.procedure && sym->attr.if_source != IFSRC_DECL
14279 && !resolve_procedure_interface (sym))
14280 return;
14282 if (sym->attr.is_protected && !sym->attr.proc_pointer
14283 && (sym->attr.procedure || sym->attr.external))
14285 if (sym->attr.external)
14286 gfc_error ("PROTECTED attribute conflicts with EXTERNAL attribute "
14287 "at %L", &sym->declared_at);
14288 else
14289 gfc_error ("PROCEDURE attribute conflicts with PROTECTED attribute "
14290 "at %L", &sym->declared_at);
14292 return;
14295 if (sym->attr.flavor == FL_DERIVED && !resolve_fl_derived (sym))
14296 return;
14298 else if ((sym->attr.flavor == FL_STRUCT || sym->attr.flavor == FL_UNION)
14299 && !resolve_fl_struct (sym))
14300 return;
14302 /* Symbols that are module procedures with results (functions) have
14303 the types and array specification copied for type checking in
14304 procedures that call them, as well as for saving to a module
14305 file. These symbols can't stand the scrutiny that their results
14306 can. */
14307 mp_flag = (sym->result != NULL && sym->result != sym);
14309 /* Make sure that the intrinsic is consistent with its internal
14310 representation. This needs to be done before assigning a default
14311 type to avoid spurious warnings. */
14312 if (sym->attr.flavor != FL_MODULE && sym->attr.intrinsic
14313 && !gfc_resolve_intrinsic (sym, &sym->declared_at))
14314 return;
14316 /* Resolve associate names. */
14317 if (sym->assoc)
14318 resolve_assoc_var (sym, true);
14320 /* Assign default type to symbols that need one and don't have one. */
14321 if (sym->ts.type == BT_UNKNOWN)
14323 if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER)
14325 gfc_set_default_type (sym, 1, NULL);
14328 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.external
14329 && !sym->attr.function && !sym->attr.subroutine
14330 && gfc_get_default_type (sym->name, sym->ns)->type == BT_UNKNOWN)
14331 gfc_add_subroutine (&sym->attr, sym->name, &sym->declared_at);
14333 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.function)
14335 /* The specific case of an external procedure should emit an error
14336 in the case that there is no implicit type. */
14337 if (!mp_flag)
14339 if (!sym->attr.mixed_entry_master)
14340 gfc_set_default_type (sym, sym->attr.external, NULL);
14342 else
14344 /* Result may be in another namespace. */
14345 resolve_symbol (sym->result);
14347 if (!sym->result->attr.proc_pointer)
14349 sym->ts = sym->result->ts;
14350 sym->as = gfc_copy_array_spec (sym->result->as);
14351 sym->attr.dimension = sym->result->attr.dimension;
14352 sym->attr.pointer = sym->result->attr.pointer;
14353 sym->attr.allocatable = sym->result->attr.allocatable;
14354 sym->attr.contiguous = sym->result->attr.contiguous;
14359 else if (mp_flag && sym->attr.flavor == FL_PROCEDURE && sym->attr.function)
14361 bool saved_specification_expr = specification_expr;
14362 specification_expr = true;
14363 gfc_resolve_array_spec (sym->result->as, false);
14364 specification_expr = saved_specification_expr;
14367 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
14369 as = CLASS_DATA (sym)->as;
14370 class_attr = CLASS_DATA (sym)->attr;
14371 class_attr.pointer = class_attr.class_pointer;
14373 else
14375 class_attr = sym->attr;
14376 as = sym->as;
14379 /* F2008, C530. */
14380 if (sym->attr.contiguous
14381 && (!class_attr.dimension
14382 || (as->type != AS_ASSUMED_SHAPE && as->type != AS_ASSUMED_RANK
14383 && !class_attr.pointer)))
14385 gfc_error ("%qs at %L has the CONTIGUOUS attribute but is not an "
14386 "array pointer or an assumed-shape or assumed-rank array",
14387 sym->name, &sym->declared_at);
14388 return;
14391 /* Assumed size arrays and assumed shape arrays must be dummy
14392 arguments. Array-spec's of implied-shape should have been resolved to
14393 AS_EXPLICIT already. */
14395 if (as)
14397 gcc_assert (as->type != AS_IMPLIED_SHAPE);
14398 if (((as->type == AS_ASSUMED_SIZE && !as->cp_was_assumed)
14399 || as->type == AS_ASSUMED_SHAPE)
14400 && !sym->attr.dummy && !sym->attr.select_type_temporary)
14402 if (as->type == AS_ASSUMED_SIZE)
14403 gfc_error ("Assumed size array at %L must be a dummy argument",
14404 &sym->declared_at);
14405 else
14406 gfc_error ("Assumed shape array at %L must be a dummy argument",
14407 &sym->declared_at);
14408 return;
14410 /* TS 29113, C535a. */
14411 if (as->type == AS_ASSUMED_RANK && !sym->attr.dummy
14412 && !sym->attr.select_type_temporary)
14414 gfc_error ("Assumed-rank array at %L must be a dummy argument",
14415 &sym->declared_at);
14416 return;
14418 if (as->type == AS_ASSUMED_RANK
14419 && (sym->attr.codimension || sym->attr.value))
14421 gfc_error ("Assumed-rank array at %L may not have the VALUE or "
14422 "CODIMENSION attribute", &sym->declared_at);
14423 return;
14427 /* Make sure symbols with known intent or optional are really dummy
14428 variable. Because of ENTRY statement, this has to be deferred
14429 until resolution time. */
14431 if (!sym->attr.dummy
14432 && (sym->attr.optional || sym->attr.intent != INTENT_UNKNOWN))
14434 gfc_error ("Symbol at %L is not a DUMMY variable", &sym->declared_at);
14435 return;
14438 if (sym->attr.value && !sym->attr.dummy)
14440 gfc_error ("%qs at %L cannot have the VALUE attribute because "
14441 "it is not a dummy argument", sym->name, &sym->declared_at);
14442 return;
14445 if (sym->attr.value && sym->ts.type == BT_CHARACTER)
14447 gfc_charlen *cl = sym->ts.u.cl;
14448 if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
14450 gfc_error ("Character dummy variable %qs at %L with VALUE "
14451 "attribute must have constant length",
14452 sym->name, &sym->declared_at);
14453 return;
14456 if (sym->ts.is_c_interop
14457 && mpz_cmp_si (cl->length->value.integer, 1) != 0)
14459 gfc_error ("C interoperable character dummy variable %qs at %L "
14460 "with VALUE attribute must have length one",
14461 sym->name, &sym->declared_at);
14462 return;
14466 if (sym->ts.type == BT_DERIVED && !sym->attr.is_iso_c
14467 && sym->ts.u.derived->attr.generic)
14469 sym->ts.u.derived = gfc_find_dt_in_generic (sym->ts.u.derived);
14470 if (!sym->ts.u.derived)
14472 gfc_error ("The derived type %qs at %L is of type %qs, "
14473 "which has not been defined", sym->name,
14474 &sym->declared_at, sym->ts.u.derived->name);
14475 sym->ts.type = BT_UNKNOWN;
14476 return;
14480 /* Use the same constraints as TYPE(*), except for the type check
14481 and that only scalars and assumed-size arrays are permitted. */
14482 if (sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
14484 if (!sym->attr.dummy)
14486 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall be "
14487 "a dummy argument", sym->name, &sym->declared_at);
14488 return;
14491 if (sym->ts.type != BT_ASSUMED && sym->ts.type != BT_INTEGER
14492 && sym->ts.type != BT_REAL && sym->ts.type != BT_LOGICAL
14493 && sym->ts.type != BT_COMPLEX)
14495 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall be "
14496 "of type TYPE(*) or of an numeric intrinsic type",
14497 sym->name, &sym->declared_at);
14498 return;
14501 if (sym->attr.allocatable || sym->attr.codimension
14502 || sym->attr.pointer || sym->attr.value)
14504 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute may not "
14505 "have the ALLOCATABLE, CODIMENSION, POINTER or VALUE "
14506 "attribute", sym->name, &sym->declared_at);
14507 return;
14510 if (sym->attr.intent == INTENT_OUT)
14512 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute may not "
14513 "have the INTENT(OUT) attribute",
14514 sym->name, &sym->declared_at);
14515 return;
14517 if (sym->attr.dimension && sym->as->type != AS_ASSUMED_SIZE)
14519 gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall "
14520 "either be a scalar or an assumed-size array",
14521 sym->name, &sym->declared_at);
14522 return;
14525 /* Set the type to TYPE(*) and add a dimension(*) to ensure
14526 NO_ARG_CHECK is correctly handled in trans*.c, e.g. with
14527 packing. */
14528 sym->ts.type = BT_ASSUMED;
14529 sym->as = gfc_get_array_spec ();
14530 sym->as->type = AS_ASSUMED_SIZE;
14531 sym->as->rank = 1;
14532 sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
14534 else if (sym->ts.type == BT_ASSUMED)
14536 /* TS 29113, C407a. */
14537 if (!sym->attr.dummy)
14539 gfc_error ("Assumed type of variable %s at %L is only permitted "
14540 "for dummy variables", sym->name, &sym->declared_at);
14541 return;
14543 if (sym->attr.allocatable || sym->attr.codimension
14544 || sym->attr.pointer || sym->attr.value)
14546 gfc_error ("Assumed-type variable %s at %L may not have the "
14547 "ALLOCATABLE, CODIMENSION, POINTER or VALUE attribute",
14548 sym->name, &sym->declared_at);
14549 return;
14551 if (sym->attr.intent == INTENT_OUT)
14553 gfc_error ("Assumed-type variable %s at %L may not have the "
14554 "INTENT(OUT) attribute",
14555 sym->name, &sym->declared_at);
14556 return;
14558 if (sym->attr.dimension && sym->as->type == AS_EXPLICIT)
14560 gfc_error ("Assumed-type variable %s at %L shall not be an "
14561 "explicit-shape array", sym->name, &sym->declared_at);
14562 return;
14566 /* If the symbol is marked as bind(c), that it is declared at module level
14567 scope and verify its type and kind. Do not do the latter for symbols
14568 that are implicitly typed because that is handled in
14569 gfc_set_default_type. Handle dummy arguments and procedure definitions
14570 separately. Also, anything that is use associated is not handled here
14571 but instead is handled in the module it is declared in. Finally, derived
14572 type definitions are allowed to be BIND(C) since that only implies that
14573 they're interoperable, and they are checked fully for interoperability
14574 when a variable is declared of that type. */
14575 if (sym->attr.is_bind_c && sym->attr.use_assoc == 0
14576 && sym->attr.dummy == 0 && sym->attr.flavor != FL_PROCEDURE
14577 && sym->attr.flavor != FL_DERIVED)
14579 bool t = true;
14581 /* First, make sure the variable is declared at the
14582 module-level scope (J3/04-007, Section 15.3). */
14583 if (sym->ns->proc_name->attr.flavor != FL_MODULE &&
14584 sym->attr.in_common == 0)
14586 gfc_error ("Variable %qs at %L cannot be BIND(C) because it "
14587 "is neither a COMMON block nor declared at the "
14588 "module level scope", sym->name, &(sym->declared_at));
14589 t = false;
14591 else if (sym->common_head != NULL && sym->attr.implicit_type == 0)
14593 t = verify_com_block_vars_c_interop (sym->common_head);
14595 else if (sym->attr.implicit_type == 0)
14597 /* If type() declaration, we need to verify that the components
14598 of the given type are all C interoperable, etc. */
14599 if (sym->ts.type == BT_DERIVED &&
14600 sym->ts.u.derived->attr.is_c_interop != 1)
14602 /* Make sure the user marked the derived type as BIND(C). If
14603 not, call the verify routine. This could print an error
14604 for the derived type more than once if multiple variables
14605 of that type are declared. */
14606 if (sym->ts.u.derived->attr.is_bind_c != 1)
14607 verify_bind_c_derived_type (sym->ts.u.derived);
14608 t = false;
14611 /* Verify the variable itself as C interoperable if it
14612 is BIND(C). It is not possible for this to succeed if
14613 the verify_bind_c_derived_type failed, so don't have to handle
14614 any error returned by verify_bind_c_derived_type. */
14615 t = verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
14616 sym->common_block);
14619 if (!t)
14621 /* clear the is_bind_c flag to prevent reporting errors more than
14622 once if something failed. */
14623 sym->attr.is_bind_c = 0;
14624 return;
14628 /* If a derived type symbol has reached this point, without its
14629 type being declared, we have an error. Notice that most
14630 conditions that produce undefined derived types have already
14631 been dealt with. However, the likes of:
14632 implicit type(t) (t) ..... call foo (t) will get us here if
14633 the type is not declared in the scope of the implicit
14634 statement. Change the type to BT_UNKNOWN, both because it is so
14635 and to prevent an ICE. */
14636 if (sym->ts.type == BT_DERIVED && !sym->attr.is_iso_c
14637 && sym->ts.u.derived->components == NULL
14638 && !sym->ts.u.derived->attr.zero_comp)
14640 gfc_error ("The derived type %qs at %L is of type %qs, "
14641 "which has not been defined", sym->name,
14642 &sym->declared_at, sym->ts.u.derived->name);
14643 sym->ts.type = BT_UNKNOWN;
14644 return;
14647 /* Make sure that the derived type has been resolved and that the
14648 derived type is visible in the symbol's namespace, if it is a
14649 module function and is not PRIVATE. */
14650 if (sym->ts.type == BT_DERIVED
14651 && sym->ts.u.derived->attr.use_assoc
14652 && sym->ns->proc_name
14653 && sym->ns->proc_name->attr.flavor == FL_MODULE
14654 && !resolve_fl_derived (sym->ts.u.derived))
14655 return;
14657 /* Unless the derived-type declaration is use associated, Fortran 95
14658 does not allow public entries of private derived types.
14659 See 4.4.1 (F95) and 4.5.1.1 (F2003); and related interpretation
14660 161 in 95-006r3. */
14661 if (sym->ts.type == BT_DERIVED
14662 && sym->ns->proc_name && sym->ns->proc_name->attr.flavor == FL_MODULE
14663 && !sym->ts.u.derived->attr.use_assoc
14664 && gfc_check_symbol_access (sym)
14665 && !gfc_check_symbol_access (sym->ts.u.derived)
14666 && !gfc_notify_std (GFC_STD_F2003, "PUBLIC %s %qs at %L of PRIVATE "
14667 "derived type %qs",
14668 (sym->attr.flavor == FL_PARAMETER)
14669 ? "parameter" : "variable",
14670 sym->name, &sym->declared_at,
14671 sym->ts.u.derived->name))
14672 return;
14674 /* F2008, C1302. */
14675 if (sym->ts.type == BT_DERIVED
14676 && ((sym->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
14677 && sym->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
14678 || sym->ts.u.derived->attr.lock_comp)
14679 && !sym->attr.codimension && !sym->ts.u.derived->attr.coarray_comp)
14681 gfc_error ("Variable %s at %L of type LOCK_TYPE or with subcomponent of "
14682 "type LOCK_TYPE must be a coarray", sym->name,
14683 &sym->declared_at);
14684 return;
14687 /* TS18508, C702/C703. */
14688 if (sym->ts.type == BT_DERIVED
14689 && ((sym->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
14690 && sym->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
14691 || sym->ts.u.derived->attr.event_comp)
14692 && !sym->attr.codimension && !sym->ts.u.derived->attr.coarray_comp)
14694 gfc_error ("Variable %s at %L of type EVENT_TYPE or with subcomponent of "
14695 "type EVENT_TYPE must be a coarray", sym->name,
14696 &sym->declared_at);
14697 return;
14700 /* An assumed-size array with INTENT(OUT) shall not be of a type for which
14701 default initialization is defined (5.1.2.4.4). */
14702 if (sym->ts.type == BT_DERIVED
14703 && sym->attr.dummy
14704 && sym->attr.intent == INTENT_OUT
14705 && sym->as
14706 && sym->as->type == AS_ASSUMED_SIZE)
14708 for (c = sym->ts.u.derived->components; c; c = c->next)
14710 if (c->initializer)
14712 gfc_error ("The INTENT(OUT) dummy argument %qs at %L is "
14713 "ASSUMED SIZE and so cannot have a default initializer",
14714 sym->name, &sym->declared_at);
14715 return;
14720 /* F2008, C542. */
14721 if (sym->ts.type == BT_DERIVED && sym->attr.dummy
14722 && sym->attr.intent == INTENT_OUT && sym->attr.lock_comp)
14724 gfc_error ("Dummy argument %qs at %L of LOCK_TYPE shall not be "
14725 "INTENT(OUT)", sym->name, &sym->declared_at);
14726 return;
14729 /* TS18508. */
14730 if (sym->ts.type == BT_DERIVED && sym->attr.dummy
14731 && sym->attr.intent == INTENT_OUT && sym->attr.event_comp)
14733 gfc_error ("Dummy argument %qs at %L of EVENT_TYPE shall not be "
14734 "INTENT(OUT)", sym->name, &sym->declared_at);
14735 return;
14738 /* F2008, C525. */
14739 if ((((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.coarray_comp)
14740 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
14741 && CLASS_DATA (sym)->attr.coarray_comp))
14742 || class_attr.codimension)
14743 && (sym->attr.result || sym->result == sym))
14745 gfc_error ("Function result %qs at %L shall not be a coarray or have "
14746 "a coarray component", sym->name, &sym->declared_at);
14747 return;
14750 /* F2008, C524. */
14751 if (sym->attr.codimension && sym->ts.type == BT_DERIVED
14752 && sym->ts.u.derived->ts.is_iso_c)
14754 gfc_error ("Variable %qs at %L of TYPE(C_PTR) or TYPE(C_FUNPTR) "
14755 "shall not be a coarray", sym->name, &sym->declared_at);
14756 return;
14759 /* F2008, C525. */
14760 if (((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.coarray_comp)
14761 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
14762 && CLASS_DATA (sym)->attr.coarray_comp))
14763 && (class_attr.codimension || class_attr.pointer || class_attr.dimension
14764 || class_attr.allocatable))
14766 gfc_error ("Variable %qs at %L with coarray component shall be a "
14767 "nonpointer, nonallocatable scalar, which is not a coarray",
14768 sym->name, &sym->declared_at);
14769 return;
14772 /* F2008, C526. The function-result case was handled above. */
14773 if (class_attr.codimension
14774 && !(class_attr.allocatable || sym->attr.dummy || sym->attr.save
14775 || sym->attr.select_type_temporary
14776 || sym->attr.associate_var
14777 || (sym->ns->save_all && !sym->attr.automatic)
14778 || sym->ns->proc_name->attr.flavor == FL_MODULE
14779 || sym->ns->proc_name->attr.is_main_program
14780 || sym->attr.function || sym->attr.result || sym->attr.use_assoc))
14782 gfc_error ("Variable %qs at %L is a coarray and is not ALLOCATABLE, SAVE "
14783 "nor a dummy argument", sym->name, &sym->declared_at);
14784 return;
14786 /* F2008, C528. */
14787 else if (class_attr.codimension && !sym->attr.select_type_temporary
14788 && !class_attr.allocatable && as && as->cotype == AS_DEFERRED)
14790 gfc_error ("Coarray variable %qs at %L shall not have codimensions with "
14791 "deferred shape", sym->name, &sym->declared_at);
14792 return;
14794 else if (class_attr.codimension && class_attr.allocatable && as
14795 && (as->cotype != AS_DEFERRED || as->type != AS_DEFERRED))
14797 gfc_error ("Allocatable coarray variable %qs at %L must have "
14798 "deferred shape", sym->name, &sym->declared_at);
14799 return;
14802 /* F2008, C541. */
14803 if ((((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.coarray_comp)
14804 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
14805 && CLASS_DATA (sym)->attr.coarray_comp))
14806 || (class_attr.codimension && class_attr.allocatable))
14807 && sym->attr.dummy && sym->attr.intent == INTENT_OUT)
14809 gfc_error ("Variable %qs at %L is INTENT(OUT) and can thus not be an "
14810 "allocatable coarray or have coarray components",
14811 sym->name, &sym->declared_at);
14812 return;
14815 if (class_attr.codimension && sym->attr.dummy
14816 && sym->ns->proc_name && sym->ns->proc_name->attr.is_bind_c)
14818 gfc_error ("Coarray dummy variable %qs at %L not allowed in BIND(C) "
14819 "procedure %qs", sym->name, &sym->declared_at,
14820 sym->ns->proc_name->name);
14821 return;
14824 if (sym->ts.type == BT_LOGICAL
14825 && ((sym->attr.function && sym->attr.is_bind_c && sym->result == sym)
14826 || ((sym->attr.dummy || sym->attr.result) && sym->ns->proc_name
14827 && sym->ns->proc_name->attr.is_bind_c)))
14829 int i;
14830 for (i = 0; gfc_logical_kinds[i].kind; i++)
14831 if (gfc_logical_kinds[i].kind == sym->ts.kind)
14832 break;
14833 if (!gfc_logical_kinds[i].c_bool && sym->attr.dummy
14834 && !gfc_notify_std (GFC_STD_GNU, "LOGICAL dummy argument %qs at "
14835 "%L with non-C_Bool kind in BIND(C) procedure "
14836 "%qs", sym->name, &sym->declared_at,
14837 sym->ns->proc_name->name))
14838 return;
14839 else if (!gfc_logical_kinds[i].c_bool
14840 && !gfc_notify_std (GFC_STD_GNU, "LOGICAL result variable "
14841 "%qs at %L with non-C_Bool kind in "
14842 "BIND(C) procedure %qs", sym->name,
14843 &sym->declared_at,
14844 sym->attr.function ? sym->name
14845 : sym->ns->proc_name->name))
14846 return;
14849 switch (sym->attr.flavor)
14851 case FL_VARIABLE:
14852 if (!resolve_fl_variable (sym, mp_flag))
14853 return;
14854 break;
14856 case FL_PROCEDURE:
14857 if (sym->formal && !sym->formal_ns)
14859 /* Check that none of the arguments are a namelist. */
14860 gfc_formal_arglist *formal = sym->formal;
14862 for (; formal; formal = formal->next)
14863 if (formal->sym && formal->sym->attr.flavor == FL_NAMELIST)
14865 gfc_error ("Namelist %qs can not be an argument to "
14866 "subroutine or function at %L",
14867 formal->sym->name, &sym->declared_at);
14868 return;
14872 if (!resolve_fl_procedure (sym, mp_flag))
14873 return;
14874 break;
14876 case FL_NAMELIST:
14877 if (!resolve_fl_namelist (sym))
14878 return;
14879 break;
14881 case FL_PARAMETER:
14882 if (!resolve_fl_parameter (sym))
14883 return;
14884 break;
14886 default:
14887 break;
14890 /* Resolve array specifier. Check as well some constraints
14891 on COMMON blocks. */
14893 check_constant = sym->attr.in_common && !sym->attr.pointer;
14895 /* Set the formal_arg_flag so that check_conflict will not throw
14896 an error for host associated variables in the specification
14897 expression for an array_valued function. */
14898 if (sym->attr.function && sym->as)
14899 formal_arg_flag = true;
14901 saved_specification_expr = specification_expr;
14902 specification_expr = true;
14903 gfc_resolve_array_spec (sym->as, check_constant);
14904 specification_expr = saved_specification_expr;
14906 formal_arg_flag = false;
14908 /* Resolve formal namespaces. */
14909 if (sym->formal_ns && sym->formal_ns != gfc_current_ns
14910 && !sym->attr.contained && !sym->attr.intrinsic)
14911 gfc_resolve (sym->formal_ns);
14913 /* Make sure the formal namespace is present. */
14914 if (sym->formal && !sym->formal_ns)
14916 gfc_formal_arglist *formal = sym->formal;
14917 while (formal && !formal->sym)
14918 formal = formal->next;
14920 if (formal)
14922 sym->formal_ns = formal->sym->ns;
14923 if (sym->ns != formal->sym->ns)
14924 sym->formal_ns->refs++;
14928 /* Check threadprivate restrictions. */
14929 if (sym->attr.threadprivate && !sym->attr.save
14930 && !(sym->ns->save_all && !sym->attr.automatic)
14931 && (!sym->attr.in_common
14932 && sym->module == NULL
14933 && (sym->ns->proc_name == NULL
14934 || sym->ns->proc_name->attr.flavor != FL_MODULE)))
14935 gfc_error ("Threadprivate at %L isn't SAVEd", &sym->declared_at);
14937 /* Check omp declare target restrictions. */
14938 if (sym->attr.omp_declare_target
14939 && sym->attr.flavor == FL_VARIABLE
14940 && !sym->attr.save
14941 && !(sym->ns->save_all && !sym->attr.automatic)
14942 && (!sym->attr.in_common
14943 && sym->module == NULL
14944 && (sym->ns->proc_name == NULL
14945 || sym->ns->proc_name->attr.flavor != FL_MODULE)))
14946 gfc_error ("!$OMP DECLARE TARGET variable %qs at %L isn't SAVEd",
14947 sym->name, &sym->declared_at);
14949 /* If we have come this far we can apply default-initializers, as
14950 described in 14.7.5, to those variables that have not already
14951 been assigned one. */
14952 if (sym->ts.type == BT_DERIVED
14953 && !sym->value
14954 && !sym->attr.allocatable
14955 && !sym->attr.alloc_comp)
14957 symbol_attribute *a = &sym->attr;
14959 if ((!a->save && !a->dummy && !a->pointer
14960 && !a->in_common && !a->use_assoc
14961 && !a->result && !a->function)
14962 || (a->dummy && a->intent == INTENT_OUT && !a->pointer))
14963 apply_default_init (sym);
14964 else if (a->function && sym->result && a->access != ACCESS_PRIVATE
14965 && (sym->ts.u.derived->attr.alloc_comp
14966 || sym->ts.u.derived->attr.pointer_comp))
14967 /* Mark the result symbol to be referenced, when it has allocatable
14968 components. */
14969 sym->result->attr.referenced = 1;
14972 if (sym->ts.type == BT_CLASS && sym->ns == gfc_current_ns
14973 && sym->attr.dummy && sym->attr.intent == INTENT_OUT
14974 && !CLASS_DATA (sym)->attr.class_pointer
14975 && !CLASS_DATA (sym)->attr.allocatable)
14976 apply_default_init (sym);
14978 /* If this symbol has a type-spec, check it. */
14979 if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER
14980 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.function))
14981 if (!resolve_typespec_used (&sym->ts, &sym->declared_at, sym->name))
14982 return;
14984 if (sym->param_list)
14985 resolve_pdt (sym);
14989 /************* Resolve DATA statements *************/
14991 static struct
14993 gfc_data_value *vnode;
14994 mpz_t left;
14996 values;
14999 /* Advance the values structure to point to the next value in the data list. */
15001 static bool
15002 next_data_value (void)
15004 while (mpz_cmp_ui (values.left, 0) == 0)
15007 if (values.vnode->next == NULL)
15008 return false;
15010 values.vnode = values.vnode->next;
15011 mpz_set (values.left, values.vnode->repeat);
15014 return true;
15018 static bool
15019 check_data_variable (gfc_data_variable *var, locus *where)
15021 gfc_expr *e;
15022 mpz_t size;
15023 mpz_t offset;
15024 bool t;
15025 ar_type mark = AR_UNKNOWN;
15026 int i;
15027 mpz_t section_index[GFC_MAX_DIMENSIONS];
15028 gfc_ref *ref;
15029 gfc_array_ref *ar;
15030 gfc_symbol *sym;
15031 int has_pointer;
15033 if (!gfc_resolve_expr (var->expr))
15034 return false;
15036 ar = NULL;
15037 mpz_init_set_si (offset, 0);
15038 e = var->expr;
15040 if (e->expr_type == EXPR_FUNCTION && e->value.function.isym
15041 && e->value.function.isym->id == GFC_ISYM_CAF_GET)
15042 e = e->value.function.actual->expr;
15044 if (e->expr_type != EXPR_VARIABLE)
15045 gfc_internal_error ("check_data_variable(): Bad expression");
15047 sym = e->symtree->n.sym;
15049 if (sym->ns->is_block_data && !sym->attr.in_common)
15051 gfc_error ("BLOCK DATA element %qs at %L must be in COMMON",
15052 sym->name, &sym->declared_at);
15055 if (e->ref == NULL && sym->as)
15057 gfc_error ("DATA array %qs at %L must be specified in a previous"
15058 " declaration", sym->name, where);
15059 return false;
15062 has_pointer = sym->attr.pointer;
15064 if (gfc_is_coindexed (e))
15066 gfc_error ("DATA element %qs at %L cannot have a coindex", sym->name,
15067 where);
15068 return false;
15071 for (ref = e->ref; ref; ref = ref->next)
15073 if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
15074 has_pointer = 1;
15076 if (has_pointer
15077 && ref->type == REF_ARRAY
15078 && ref->u.ar.type != AR_FULL)
15080 gfc_error ("DATA element %qs at %L is a pointer and so must "
15081 "be a full array", sym->name, where);
15082 return false;
15086 if (e->rank == 0 || has_pointer)
15088 mpz_init_set_ui (size, 1);
15089 ref = NULL;
15091 else
15093 ref = e->ref;
15095 /* Find the array section reference. */
15096 for (ref = e->ref; ref; ref = ref->next)
15098 if (ref->type != REF_ARRAY)
15099 continue;
15100 if (ref->u.ar.type == AR_ELEMENT)
15101 continue;
15102 break;
15104 gcc_assert (ref);
15106 /* Set marks according to the reference pattern. */
15107 switch (ref->u.ar.type)
15109 case AR_FULL:
15110 mark = AR_FULL;
15111 break;
15113 case AR_SECTION:
15114 ar = &ref->u.ar;
15115 /* Get the start position of array section. */
15116 gfc_get_section_index (ar, section_index, &offset);
15117 mark = AR_SECTION;
15118 break;
15120 default:
15121 gcc_unreachable ();
15124 if (!gfc_array_size (e, &size))
15126 gfc_error ("Nonconstant array section at %L in DATA statement",
15127 &e->where);
15128 mpz_clear (offset);
15129 return false;
15133 t = true;
15135 while (mpz_cmp_ui (size, 0) > 0)
15137 if (!next_data_value ())
15139 gfc_error ("DATA statement at %L has more variables than values",
15140 where);
15141 t = false;
15142 break;
15145 t = gfc_check_assign (var->expr, values.vnode->expr, 0);
15146 if (!t)
15147 break;
15149 /* If we have more than one element left in the repeat count,
15150 and we have more than one element left in the target variable,
15151 then create a range assignment. */
15152 /* FIXME: Only done for full arrays for now, since array sections
15153 seem tricky. */
15154 if (mark == AR_FULL && ref && ref->next == NULL
15155 && mpz_cmp_ui (values.left, 1) > 0 && mpz_cmp_ui (size, 1) > 0)
15157 mpz_t range;
15159 if (mpz_cmp (size, values.left) >= 0)
15161 mpz_init_set (range, values.left);
15162 mpz_sub (size, size, values.left);
15163 mpz_set_ui (values.left, 0);
15165 else
15167 mpz_init_set (range, size);
15168 mpz_sub (values.left, values.left, size);
15169 mpz_set_ui (size, 0);
15172 t = gfc_assign_data_value (var->expr, values.vnode->expr,
15173 offset, &range);
15175 mpz_add (offset, offset, range);
15176 mpz_clear (range);
15178 if (!t)
15179 break;
15182 /* Assign initial value to symbol. */
15183 else
15185 mpz_sub_ui (values.left, values.left, 1);
15186 mpz_sub_ui (size, size, 1);
15188 t = gfc_assign_data_value (var->expr, values.vnode->expr,
15189 offset, NULL);
15190 if (!t)
15191 break;
15193 if (mark == AR_FULL)
15194 mpz_add_ui (offset, offset, 1);
15196 /* Modify the array section indexes and recalculate the offset
15197 for next element. */
15198 else if (mark == AR_SECTION)
15199 gfc_advance_section (section_index, ar, &offset);
15203 if (mark == AR_SECTION)
15205 for (i = 0; i < ar->dimen; i++)
15206 mpz_clear (section_index[i]);
15209 mpz_clear (size);
15210 mpz_clear (offset);
15212 return t;
15216 static bool traverse_data_var (gfc_data_variable *, locus *);
15218 /* Iterate over a list of elements in a DATA statement. */
15220 static bool
15221 traverse_data_list (gfc_data_variable *var, locus *where)
15223 mpz_t trip;
15224 iterator_stack frame;
15225 gfc_expr *e, *start, *end, *step;
15226 bool retval = true;
15228 mpz_init (frame.value);
15229 mpz_init (trip);
15231 start = gfc_copy_expr (var->iter.start);
15232 end = gfc_copy_expr (var->iter.end);
15233 step = gfc_copy_expr (var->iter.step);
15235 if (!gfc_simplify_expr (start, 1)
15236 || start->expr_type != EXPR_CONSTANT)
15238 gfc_error ("start of implied-do loop at %L could not be "
15239 "simplified to a constant value", &start->where);
15240 retval = false;
15241 goto cleanup;
15243 if (!gfc_simplify_expr (end, 1)
15244 || end->expr_type != EXPR_CONSTANT)
15246 gfc_error ("end of implied-do loop at %L could not be "
15247 "simplified to a constant value", &start->where);
15248 retval = false;
15249 goto cleanup;
15251 if (!gfc_simplify_expr (step, 1)
15252 || step->expr_type != EXPR_CONSTANT)
15254 gfc_error ("step of implied-do loop at %L could not be "
15255 "simplified to a constant value", &start->where);
15256 retval = false;
15257 goto cleanup;
15260 mpz_set (trip, end->value.integer);
15261 mpz_sub (trip, trip, start->value.integer);
15262 mpz_add (trip, trip, step->value.integer);
15264 mpz_div (trip, trip, step->value.integer);
15266 mpz_set (frame.value, start->value.integer);
15268 frame.prev = iter_stack;
15269 frame.variable = var->iter.var->symtree;
15270 iter_stack = &frame;
15272 while (mpz_cmp_ui (trip, 0) > 0)
15274 if (!traverse_data_var (var->list, where))
15276 retval = false;
15277 goto cleanup;
15280 e = gfc_copy_expr (var->expr);
15281 if (!gfc_simplify_expr (e, 1))
15283 gfc_free_expr (e);
15284 retval = false;
15285 goto cleanup;
15288 mpz_add (frame.value, frame.value, step->value.integer);
15290 mpz_sub_ui (trip, trip, 1);
15293 cleanup:
15294 mpz_clear (frame.value);
15295 mpz_clear (trip);
15297 gfc_free_expr (start);
15298 gfc_free_expr (end);
15299 gfc_free_expr (step);
15301 iter_stack = frame.prev;
15302 return retval;
15306 /* Type resolve variables in the variable list of a DATA statement. */
15308 static bool
15309 traverse_data_var (gfc_data_variable *var, locus *where)
15311 bool t;
15313 for (; var; var = var->next)
15315 if (var->expr == NULL)
15316 t = traverse_data_list (var, where);
15317 else
15318 t = check_data_variable (var, where);
15320 if (!t)
15321 return false;
15324 return true;
15328 /* Resolve the expressions and iterators associated with a data statement.
15329 This is separate from the assignment checking because data lists should
15330 only be resolved once. */
15332 static bool
15333 resolve_data_variables (gfc_data_variable *d)
15335 for (; d; d = d->next)
15337 if (d->list == NULL)
15339 if (!gfc_resolve_expr (d->expr))
15340 return false;
15342 else
15344 if (!gfc_resolve_iterator (&d->iter, false, true))
15345 return false;
15347 if (!resolve_data_variables (d->list))
15348 return false;
15352 return true;
15356 /* Resolve a single DATA statement. We implement this by storing a pointer to
15357 the value list into static variables, and then recursively traversing the
15358 variables list, expanding iterators and such. */
15360 static void
15361 resolve_data (gfc_data *d)
15364 if (!resolve_data_variables (d->var))
15365 return;
15367 values.vnode = d->value;
15368 if (d->value == NULL)
15369 mpz_set_ui (values.left, 0);
15370 else
15371 mpz_set (values.left, d->value->repeat);
15373 if (!traverse_data_var (d->var, &d->where))
15374 return;
15376 /* At this point, we better not have any values left. */
15378 if (next_data_value ())
15379 gfc_error ("DATA statement at %L has more values than variables",
15380 &d->where);
15384 /* 12.6 Constraint: In a pure subprogram any variable which is in common or
15385 accessed by host or use association, is a dummy argument to a pure function,
15386 is a dummy argument with INTENT (IN) to a pure subroutine, or an object that
15387 is storage associated with any such variable, shall not be used in the
15388 following contexts: (clients of this function). */
15390 /* Determines if a variable is not 'pure', i.e., not assignable within a pure
15391 procedure. Returns zero if assignment is OK, nonzero if there is a
15392 problem. */
15394 gfc_impure_variable (gfc_symbol *sym)
15396 gfc_symbol *proc;
15397 gfc_namespace *ns;
15399 if (sym->attr.use_assoc || sym->attr.in_common)
15400 return 1;
15402 /* Check if the symbol's ns is inside the pure procedure. */
15403 for (ns = gfc_current_ns; ns; ns = ns->parent)
15405 if (ns == sym->ns)
15406 break;
15407 if (ns->proc_name->attr.flavor == FL_PROCEDURE && !sym->attr.function)
15408 return 1;
15411 proc = sym->ns->proc_name;
15412 if (sym->attr.dummy
15413 && ((proc->attr.subroutine && sym->attr.intent == INTENT_IN)
15414 || proc->attr.function))
15415 return 1;
15417 /* TODO: Sort out what can be storage associated, if anything, and include
15418 it here. In principle equivalences should be scanned but it does not
15419 seem to be possible to storage associate an impure variable this way. */
15420 return 0;
15424 /* Test whether a symbol is pure or not. For a NULL pointer, checks if the
15425 current namespace is inside a pure procedure. */
15428 gfc_pure (gfc_symbol *sym)
15430 symbol_attribute attr;
15431 gfc_namespace *ns;
15433 if (sym == NULL)
15435 /* Check if the current namespace or one of its parents
15436 belongs to a pure procedure. */
15437 for (ns = gfc_current_ns; ns; ns = ns->parent)
15439 sym = ns->proc_name;
15440 if (sym == NULL)
15441 return 0;
15442 attr = sym->attr;
15443 if (attr.flavor == FL_PROCEDURE && attr.pure)
15444 return 1;
15446 return 0;
15449 attr = sym->attr;
15451 return attr.flavor == FL_PROCEDURE && attr.pure;
15455 /* Test whether a symbol is implicitly pure or not. For a NULL pointer,
15456 checks if the current namespace is implicitly pure. Note that this
15457 function returns false for a PURE procedure. */
15460 gfc_implicit_pure (gfc_symbol *sym)
15462 gfc_namespace *ns;
15464 if (sym == NULL)
15466 /* Check if the current procedure is implicit_pure. Walk up
15467 the procedure list until we find a procedure. */
15468 for (ns = gfc_current_ns; ns; ns = ns->parent)
15470 sym = ns->proc_name;
15471 if (sym == NULL)
15472 return 0;
15474 if (sym->attr.flavor == FL_PROCEDURE)
15475 break;
15479 return sym->attr.flavor == FL_PROCEDURE && sym->attr.implicit_pure
15480 && !sym->attr.pure;
15484 void
15485 gfc_unset_implicit_pure (gfc_symbol *sym)
15487 gfc_namespace *ns;
15489 if (sym == NULL)
15491 /* Check if the current procedure is implicit_pure. Walk up
15492 the procedure list until we find a procedure. */
15493 for (ns = gfc_current_ns; ns; ns = ns->parent)
15495 sym = ns->proc_name;
15496 if (sym == NULL)
15497 return;
15499 if (sym->attr.flavor == FL_PROCEDURE)
15500 break;
15504 if (sym->attr.flavor == FL_PROCEDURE)
15505 sym->attr.implicit_pure = 0;
15506 else
15507 sym->attr.pure = 0;
15511 /* Test whether the current procedure is elemental or not. */
15514 gfc_elemental (gfc_symbol *sym)
15516 symbol_attribute attr;
15518 if (sym == NULL)
15519 sym = gfc_current_ns->proc_name;
15520 if (sym == NULL)
15521 return 0;
15522 attr = sym->attr;
15524 return attr.flavor == FL_PROCEDURE && attr.elemental;
15528 /* Warn about unused labels. */
15530 static void
15531 warn_unused_fortran_label (gfc_st_label *label)
15533 if (label == NULL)
15534 return;
15536 warn_unused_fortran_label (label->left);
15538 if (label->defined == ST_LABEL_UNKNOWN)
15539 return;
15541 switch (label->referenced)
15543 case ST_LABEL_UNKNOWN:
15544 gfc_warning (OPT_Wunused_label, "Label %d at %L defined but not used",
15545 label->value, &label->where);
15546 break;
15548 case ST_LABEL_BAD_TARGET:
15549 gfc_warning (OPT_Wunused_label,
15550 "Label %d at %L defined but cannot be used",
15551 label->value, &label->where);
15552 break;
15554 default:
15555 break;
15558 warn_unused_fortran_label (label->right);
15562 /* Returns the sequence type of a symbol or sequence. */
15564 static seq_type
15565 sequence_type (gfc_typespec ts)
15567 seq_type result;
15568 gfc_component *c;
15570 switch (ts.type)
15572 case BT_DERIVED:
15574 if (ts.u.derived->components == NULL)
15575 return SEQ_NONDEFAULT;
15577 result = sequence_type (ts.u.derived->components->ts);
15578 for (c = ts.u.derived->components->next; c; c = c->next)
15579 if (sequence_type (c->ts) != result)
15580 return SEQ_MIXED;
15582 return result;
15584 case BT_CHARACTER:
15585 if (ts.kind != gfc_default_character_kind)
15586 return SEQ_NONDEFAULT;
15588 return SEQ_CHARACTER;
15590 case BT_INTEGER:
15591 if (ts.kind != gfc_default_integer_kind)
15592 return SEQ_NONDEFAULT;
15594 return SEQ_NUMERIC;
15596 case BT_REAL:
15597 if (!(ts.kind == gfc_default_real_kind
15598 || ts.kind == gfc_default_double_kind))
15599 return SEQ_NONDEFAULT;
15601 return SEQ_NUMERIC;
15603 case BT_COMPLEX:
15604 if (ts.kind != gfc_default_complex_kind)
15605 return SEQ_NONDEFAULT;
15607 return SEQ_NUMERIC;
15609 case BT_LOGICAL:
15610 if (ts.kind != gfc_default_logical_kind)
15611 return SEQ_NONDEFAULT;
15613 return SEQ_NUMERIC;
15615 default:
15616 return SEQ_NONDEFAULT;
15621 /* Resolve derived type EQUIVALENCE object. */
15623 static bool
15624 resolve_equivalence_derived (gfc_symbol *derived, gfc_symbol *sym, gfc_expr *e)
15626 gfc_component *c = derived->components;
15628 if (!derived)
15629 return true;
15631 /* Shall not be an object of nonsequence derived type. */
15632 if (!derived->attr.sequence)
15634 gfc_error ("Derived type variable %qs at %L must have SEQUENCE "
15635 "attribute to be an EQUIVALENCE object", sym->name,
15636 &e->where);
15637 return false;
15640 /* Shall not have allocatable components. */
15641 if (derived->attr.alloc_comp)
15643 gfc_error ("Derived type variable %qs at %L cannot have ALLOCATABLE "
15644 "components to be an EQUIVALENCE object",sym->name,
15645 &e->where);
15646 return false;
15649 if (sym->attr.in_common && gfc_has_default_initializer (sym->ts.u.derived))
15651 gfc_error ("Derived type variable %qs at %L with default "
15652 "initialization cannot be in EQUIVALENCE with a variable "
15653 "in COMMON", sym->name, &e->where);
15654 return false;
15657 for (; c ; c = c->next)
15659 if (gfc_bt_struct (c->ts.type)
15660 && (!resolve_equivalence_derived(c->ts.u.derived, sym, e)))
15661 return false;
15663 /* Shall not be an object of sequence derived type containing a pointer
15664 in the structure. */
15665 if (c->attr.pointer)
15667 gfc_error ("Derived type variable %qs at %L with pointer "
15668 "component(s) cannot be an EQUIVALENCE object",
15669 sym->name, &e->where);
15670 return false;
15673 return true;
15677 /* Resolve equivalence object.
15678 An EQUIVALENCE object shall not be a dummy argument, a pointer, a target,
15679 an allocatable array, an object of nonsequence derived type, an object of
15680 sequence derived type containing a pointer at any level of component
15681 selection, an automatic object, a function name, an entry name, a result
15682 name, a named constant, a structure component, or a subobject of any of
15683 the preceding objects. A substring shall not have length zero. A
15684 derived type shall not have components with default initialization nor
15685 shall two objects of an equivalence group be initialized.
15686 Either all or none of the objects shall have an protected attribute.
15687 The simple constraints are done in symbol.c(check_conflict) and the rest
15688 are implemented here. */
15690 static void
15691 resolve_equivalence (gfc_equiv *eq)
15693 gfc_symbol *sym;
15694 gfc_symbol *first_sym;
15695 gfc_expr *e;
15696 gfc_ref *r;
15697 locus *last_where = NULL;
15698 seq_type eq_type, last_eq_type;
15699 gfc_typespec *last_ts;
15700 int object, cnt_protected;
15701 const char *msg;
15703 last_ts = &eq->expr->symtree->n.sym->ts;
15705 first_sym = eq->expr->symtree->n.sym;
15707 cnt_protected = 0;
15709 for (object = 1; eq; eq = eq->eq, object++)
15711 e = eq->expr;
15713 e->ts = e->symtree->n.sym->ts;
15714 /* match_varspec might not know yet if it is seeing
15715 array reference or substring reference, as it doesn't
15716 know the types. */
15717 if (e->ref && e->ref->type == REF_ARRAY)
15719 gfc_ref *ref = e->ref;
15720 sym = e->symtree->n.sym;
15722 if (sym->attr.dimension)
15724 ref->u.ar.as = sym->as;
15725 ref = ref->next;
15728 /* For substrings, convert REF_ARRAY into REF_SUBSTRING. */
15729 if (e->ts.type == BT_CHARACTER
15730 && ref
15731 && ref->type == REF_ARRAY
15732 && ref->u.ar.dimen == 1
15733 && ref->u.ar.dimen_type[0] == DIMEN_RANGE
15734 && ref->u.ar.stride[0] == NULL)
15736 gfc_expr *start = ref->u.ar.start[0];
15737 gfc_expr *end = ref->u.ar.end[0];
15738 void *mem = NULL;
15740 /* Optimize away the (:) reference. */
15741 if (start == NULL && end == NULL)
15743 if (e->ref == ref)
15744 e->ref = ref->next;
15745 else
15746 e->ref->next = ref->next;
15747 mem = ref;
15749 else
15751 ref->type = REF_SUBSTRING;
15752 if (start == NULL)
15753 start = gfc_get_int_expr (gfc_default_integer_kind,
15754 NULL, 1);
15755 ref->u.ss.start = start;
15756 if (end == NULL && e->ts.u.cl)
15757 end = gfc_copy_expr (e->ts.u.cl->length);
15758 ref->u.ss.end = end;
15759 ref->u.ss.length = e->ts.u.cl;
15760 e->ts.u.cl = NULL;
15762 ref = ref->next;
15763 free (mem);
15766 /* Any further ref is an error. */
15767 if (ref)
15769 gcc_assert (ref->type == REF_ARRAY);
15770 gfc_error ("Syntax error in EQUIVALENCE statement at %L",
15771 &ref->u.ar.where);
15772 continue;
15776 if (!gfc_resolve_expr (e))
15777 continue;
15779 sym = e->symtree->n.sym;
15781 if (sym->attr.is_protected)
15782 cnt_protected++;
15783 if (cnt_protected > 0 && cnt_protected != object)
15785 gfc_error ("Either all or none of the objects in the "
15786 "EQUIVALENCE set at %L shall have the "
15787 "PROTECTED attribute",
15788 &e->where);
15789 break;
15792 /* Shall not equivalence common block variables in a PURE procedure. */
15793 if (sym->ns->proc_name
15794 && sym->ns->proc_name->attr.pure
15795 && sym->attr.in_common)
15797 gfc_error ("Common block member %qs at %L cannot be an EQUIVALENCE "
15798 "object in the pure procedure %qs",
15799 sym->name, &e->where, sym->ns->proc_name->name);
15800 break;
15803 /* Shall not be a named constant. */
15804 if (e->expr_type == EXPR_CONSTANT)
15806 gfc_error ("Named constant %qs at %L cannot be an EQUIVALENCE "
15807 "object", sym->name, &e->where);
15808 continue;
15811 if (e->ts.type == BT_DERIVED
15812 && !resolve_equivalence_derived (e->ts.u.derived, sym, e))
15813 continue;
15815 /* Check that the types correspond correctly:
15816 Note 5.28:
15817 A numeric sequence structure may be equivalenced to another sequence
15818 structure, an object of default integer type, default real type, double
15819 precision real type, default logical type such that components of the
15820 structure ultimately only become associated to objects of the same
15821 kind. A character sequence structure may be equivalenced to an object
15822 of default character kind or another character sequence structure.
15823 Other objects may be equivalenced only to objects of the same type and
15824 kind parameters. */
15826 /* Identical types are unconditionally OK. */
15827 if (object == 1 || gfc_compare_types (last_ts, &sym->ts))
15828 goto identical_types;
15830 last_eq_type = sequence_type (*last_ts);
15831 eq_type = sequence_type (sym->ts);
15833 /* Since the pair of objects is not of the same type, mixed or
15834 non-default sequences can be rejected. */
15836 msg = "Sequence %s with mixed components in EQUIVALENCE "
15837 "statement at %L with different type objects";
15838 if ((object ==2
15839 && last_eq_type == SEQ_MIXED
15840 && !gfc_notify_std (GFC_STD_GNU, msg, first_sym->name, last_where))
15841 || (eq_type == SEQ_MIXED
15842 && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where)))
15843 continue;
15845 msg = "Non-default type object or sequence %s in EQUIVALENCE "
15846 "statement at %L with objects of different type";
15847 if ((object ==2
15848 && last_eq_type == SEQ_NONDEFAULT
15849 && !gfc_notify_std (GFC_STD_GNU, msg, first_sym->name, last_where))
15850 || (eq_type == SEQ_NONDEFAULT
15851 && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where)))
15852 continue;
15854 msg ="Non-CHARACTER object %qs in default CHARACTER "
15855 "EQUIVALENCE statement at %L";
15856 if (last_eq_type == SEQ_CHARACTER
15857 && eq_type != SEQ_CHARACTER
15858 && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where))
15859 continue;
15861 msg ="Non-NUMERIC object %qs in default NUMERIC "
15862 "EQUIVALENCE statement at %L";
15863 if (last_eq_type == SEQ_NUMERIC
15864 && eq_type != SEQ_NUMERIC
15865 && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where))
15866 continue;
15868 identical_types:
15869 last_ts =&sym->ts;
15870 last_where = &e->where;
15872 if (!e->ref)
15873 continue;
15875 /* Shall not be an automatic array. */
15876 if (e->ref->type == REF_ARRAY
15877 && !gfc_resolve_array_spec (e->ref->u.ar.as, 1))
15879 gfc_error ("Array %qs at %L with non-constant bounds cannot be "
15880 "an EQUIVALENCE object", sym->name, &e->where);
15881 continue;
15884 r = e->ref;
15885 while (r)
15887 /* Shall not be a structure component. */
15888 if (r->type == REF_COMPONENT)
15890 gfc_error ("Structure component %qs at %L cannot be an "
15891 "EQUIVALENCE object",
15892 r->u.c.component->name, &e->where);
15893 break;
15896 /* A substring shall not have length zero. */
15897 if (r->type == REF_SUBSTRING)
15899 if (compare_bound (r->u.ss.start, r->u.ss.end) == CMP_GT)
15901 gfc_error ("Substring at %L has length zero",
15902 &r->u.ss.start->where);
15903 break;
15906 r = r->next;
15912 /* Function called by resolve_fntype to flag other symbol used in the
15913 length type parameter specification of function resuls. */
15915 static bool
15916 flag_fn_result_spec (gfc_expr *expr,
15917 gfc_symbol *sym ATTRIBUTE_UNUSED,
15918 int *f ATTRIBUTE_UNUSED)
15920 gfc_namespace *ns;
15921 gfc_symbol *s;
15923 if (expr->expr_type == EXPR_VARIABLE)
15925 s = expr->symtree->n.sym;
15926 for (ns = s->ns; ns; ns = ns->parent)
15927 if (!ns->parent)
15928 break;
15930 if (!s->fn_result_spec
15931 && s->attr.flavor == FL_PARAMETER)
15933 /* Function contained in a module.... */
15934 if (ns->proc_name && ns->proc_name->attr.flavor == FL_MODULE)
15936 gfc_symtree *st;
15937 s->fn_result_spec = 1;
15938 /* Make sure that this symbol is translated as a module
15939 variable. */
15940 st = gfc_get_unique_symtree (ns);
15941 st->n.sym = s;
15942 s->refs++;
15944 /* ... which is use associated and called. */
15945 else if (s->attr.use_assoc || s->attr.used_in_submodule
15947 /* External function matched with an interface. */
15948 (s->ns->proc_name
15949 && ((s->ns == ns
15950 && s->ns->proc_name->attr.if_source == IFSRC_DECL)
15951 || s->ns->proc_name->attr.if_source == IFSRC_IFBODY)
15952 && s->ns->proc_name->attr.function))
15953 s->fn_result_spec = 1;
15956 return false;
15960 /* Resolve function and ENTRY types, issue diagnostics if needed. */
15962 static void
15963 resolve_fntype (gfc_namespace *ns)
15965 gfc_entry_list *el;
15966 gfc_symbol *sym;
15968 if (ns->proc_name == NULL || !ns->proc_name->attr.function)
15969 return;
15971 /* If there are any entries, ns->proc_name is the entry master
15972 synthetic symbol and ns->entries->sym actual FUNCTION symbol. */
15973 if (ns->entries)
15974 sym = ns->entries->sym;
15975 else
15976 sym = ns->proc_name;
15977 if (sym->result == sym
15978 && sym->ts.type == BT_UNKNOWN
15979 && !gfc_set_default_type (sym, 0, NULL)
15980 && !sym->attr.untyped)
15982 gfc_error ("Function %qs at %L has no IMPLICIT type",
15983 sym->name, &sym->declared_at);
15984 sym->attr.untyped = 1;
15987 if (sym->ts.type == BT_DERIVED && !sym->ts.u.derived->attr.use_assoc
15988 && !sym->attr.contained
15989 && !gfc_check_symbol_access (sym->ts.u.derived)
15990 && gfc_check_symbol_access (sym))
15992 gfc_notify_std (GFC_STD_F2003, "PUBLIC function %qs at "
15993 "%L of PRIVATE type %qs", sym->name,
15994 &sym->declared_at, sym->ts.u.derived->name);
15997 if (ns->entries)
15998 for (el = ns->entries->next; el; el = el->next)
16000 if (el->sym->result == el->sym
16001 && el->sym->ts.type == BT_UNKNOWN
16002 && !gfc_set_default_type (el->sym, 0, NULL)
16003 && !el->sym->attr.untyped)
16005 gfc_error ("ENTRY %qs at %L has no IMPLICIT type",
16006 el->sym->name, &el->sym->declared_at);
16007 el->sym->attr.untyped = 1;
16011 if (sym->ts.type == BT_CHARACTER)
16012 gfc_traverse_expr (sym->ts.u.cl->length, NULL, flag_fn_result_spec, 0);
16016 /* 12.3.2.1.1 Defined operators. */
16018 static bool
16019 check_uop_procedure (gfc_symbol *sym, locus where)
16021 gfc_formal_arglist *formal;
16023 if (!sym->attr.function)
16025 gfc_error ("User operator procedure %qs at %L must be a FUNCTION",
16026 sym->name, &where);
16027 return false;
16030 if (sym->ts.type == BT_CHARACTER
16031 && !((sym->ts.u.cl && sym->ts.u.cl->length) || sym->ts.deferred)
16032 && !(sym->result && ((sym->result->ts.u.cl
16033 && sym->result->ts.u.cl->length) || sym->result->ts.deferred)))
16035 gfc_error ("User operator procedure %qs at %L cannot be assumed "
16036 "character length", sym->name, &where);
16037 return false;
16040 formal = gfc_sym_get_dummy_args (sym);
16041 if (!formal || !formal->sym)
16043 gfc_error ("User operator procedure %qs at %L must have at least "
16044 "one argument", sym->name, &where);
16045 return false;
16048 if (formal->sym->attr.intent != INTENT_IN)
16050 gfc_error ("First argument of operator interface at %L must be "
16051 "INTENT(IN)", &where);
16052 return false;
16055 if (formal->sym->attr.optional)
16057 gfc_error ("First argument of operator interface at %L cannot be "
16058 "optional", &where);
16059 return false;
16062 formal = formal->next;
16063 if (!formal || !formal->sym)
16064 return true;
16066 if (formal->sym->attr.intent != INTENT_IN)
16068 gfc_error ("Second argument of operator interface at %L must be "
16069 "INTENT(IN)", &where);
16070 return false;
16073 if (formal->sym->attr.optional)
16075 gfc_error ("Second argument of operator interface at %L cannot be "
16076 "optional", &where);
16077 return false;
16080 if (formal->next)
16082 gfc_error ("Operator interface at %L must have, at most, two "
16083 "arguments", &where);
16084 return false;
16087 return true;
16090 static void
16091 gfc_resolve_uops (gfc_symtree *symtree)
16093 gfc_interface *itr;
16095 if (symtree == NULL)
16096 return;
16098 gfc_resolve_uops (symtree->left);
16099 gfc_resolve_uops (symtree->right);
16101 for (itr = symtree->n.uop->op; itr; itr = itr->next)
16102 check_uop_procedure (itr->sym, itr->sym->declared_at);
16106 /* Examine all of the expressions associated with a program unit,
16107 assign types to all intermediate expressions, make sure that all
16108 assignments are to compatible types and figure out which names
16109 refer to which functions or subroutines. It doesn't check code
16110 block, which is handled by gfc_resolve_code. */
16112 static void
16113 resolve_types (gfc_namespace *ns)
16115 gfc_namespace *n;
16116 gfc_charlen *cl;
16117 gfc_data *d;
16118 gfc_equiv *eq;
16119 gfc_namespace* old_ns = gfc_current_ns;
16121 if (ns->types_resolved)
16122 return;
16124 /* Check that all IMPLICIT types are ok. */
16125 if (!ns->seen_implicit_none)
16127 unsigned letter;
16128 for (letter = 0; letter != GFC_LETTERS; ++letter)
16129 if (ns->set_flag[letter]
16130 && !resolve_typespec_used (&ns->default_type[letter],
16131 &ns->implicit_loc[letter], NULL))
16132 return;
16135 gfc_current_ns = ns;
16137 resolve_entries (ns);
16139 resolve_common_vars (&ns->blank_common, false);
16140 resolve_common_blocks (ns->common_root);
16142 resolve_contained_functions (ns);
16144 if (ns->proc_name && ns->proc_name->attr.flavor == FL_PROCEDURE
16145 && ns->proc_name->attr.if_source == IFSRC_IFBODY)
16146 resolve_formal_arglist (ns->proc_name);
16148 gfc_traverse_ns (ns, resolve_bind_c_derived_types);
16150 for (cl = ns->cl_list; cl; cl = cl->next)
16151 resolve_charlen (cl);
16153 gfc_traverse_ns (ns, resolve_symbol);
16155 resolve_fntype (ns);
16157 for (n = ns->contained; n; n = n->sibling)
16159 if (gfc_pure (ns->proc_name) && !gfc_pure (n->proc_name))
16160 gfc_error ("Contained procedure %qs at %L of a PURE procedure must "
16161 "also be PURE", n->proc_name->name,
16162 &n->proc_name->declared_at);
16164 resolve_types (n);
16167 forall_flag = 0;
16168 gfc_do_concurrent_flag = 0;
16169 gfc_check_interfaces (ns);
16171 gfc_traverse_ns (ns, resolve_values);
16173 if (ns->save_all)
16174 gfc_save_all (ns);
16176 iter_stack = NULL;
16177 for (d = ns->data; d; d = d->next)
16178 resolve_data (d);
16180 iter_stack = NULL;
16181 gfc_traverse_ns (ns, gfc_formalize_init_value);
16183 gfc_traverse_ns (ns, gfc_verify_binding_labels);
16185 for (eq = ns->equiv; eq; eq = eq->next)
16186 resolve_equivalence (eq);
16188 /* Warn about unused labels. */
16189 if (warn_unused_label)
16190 warn_unused_fortran_label (ns->st_labels);
16192 gfc_resolve_uops (ns->uop_root);
16194 gfc_traverse_ns (ns, gfc_verify_DTIO_procedures);
16196 gfc_resolve_omp_declare_simd (ns);
16198 gfc_resolve_omp_udrs (ns->omp_udr_root);
16200 ns->types_resolved = 1;
16202 gfc_current_ns = old_ns;
16206 /* Call gfc_resolve_code recursively. */
16208 static void
16209 resolve_codes (gfc_namespace *ns)
16211 gfc_namespace *n;
16212 bitmap_obstack old_obstack;
16214 if (ns->resolved == 1)
16215 return;
16217 for (n = ns->contained; n; n = n->sibling)
16218 resolve_codes (n);
16220 gfc_current_ns = ns;
16222 /* Don't clear 'cs_base' if this is the namespace of a BLOCK construct. */
16223 if (!(ns->proc_name && ns->proc_name->attr.flavor == FL_LABEL))
16224 cs_base = NULL;
16226 /* Set to an out of range value. */
16227 current_entry_id = -1;
16229 old_obstack = labels_obstack;
16230 bitmap_obstack_initialize (&labels_obstack);
16232 gfc_resolve_oacc_declare (ns);
16233 gfc_resolve_code (ns->code, ns);
16235 bitmap_obstack_release (&labels_obstack);
16236 labels_obstack = old_obstack;
16240 /* This function is called after a complete program unit has been compiled.
16241 Its purpose is to examine all of the expressions associated with a program
16242 unit, assign types to all intermediate expressions, make sure that all
16243 assignments are to compatible types and figure out which names refer to
16244 which functions or subroutines. */
16246 void
16247 gfc_resolve (gfc_namespace *ns)
16249 gfc_namespace *old_ns;
16250 code_stack *old_cs_base;
16251 struct gfc_omp_saved_state old_omp_state;
16253 if (ns->resolved)
16254 return;
16256 ns->resolved = -1;
16257 old_ns = gfc_current_ns;
16258 old_cs_base = cs_base;
16260 /* As gfc_resolve can be called during resolution of an OpenMP construct
16261 body, we should clear any state associated to it, so that say NS's
16262 DO loops are not interpreted as OpenMP loops. */
16263 if (!ns->construct_entities)
16264 gfc_omp_save_and_clear_state (&old_omp_state);
16266 resolve_types (ns);
16267 component_assignment_level = 0;
16268 resolve_codes (ns);
16270 gfc_current_ns = old_ns;
16271 cs_base = old_cs_base;
16272 ns->resolved = 1;
16274 gfc_run_passes (ns);
16276 if (!ns->construct_entities)
16277 gfc_omp_restore_state (&old_omp_state);