re PR fortran/88008 (ICE in check_typebound_baseobject, at fortran/resolve.c:6058)
[platform/upstream/gcc.git] / gcc / fortran / resolve.c
1 /* Perform type resolution on the various structures.
2    Copyright (C) 2001-2019 Free Software Foundation, Inc.
3    Contributed by Andy Vaught
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20
21 #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"
32
33 /* Types used in equivalence statements.  */
34
35 enum seq_type
36 {
37   SEQ_NONDEFAULT, SEQ_NUMERIC, SEQ_CHARACTER, SEQ_MIXED
38 };
39
40 /* Stack to keep track of the nesting of blocks as we move through the
41    code.  See resolve_branch() and gfc_resolve_code().  */
42
43 typedef struct code_stack
44 {
45   struct gfc_code *head, *current;
46   struct code_stack *prev;
47
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;
52 }
53 code_stack;
54
55 static code_stack *cs_base = NULL;
56
57
58 /* Nonzero if we're inside a FORALL or DO CONCURRENT block.  */
59
60 static int forall_flag;
61 int gfc_do_concurrent_flag;
62
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;
69
70
71 /* Nonzero if we're inside a OpenMP WORKSHARE or PARALLEL WORKSHARE block.  */
72
73 static int omp_workshare_flag;
74
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;
78
79 /* True if we are resolving a specification expression.  */
80 static bool specification_expr = false;
81
82 /* The id of the last entry seen.  */
83 static int current_entry_id;
84
85 /* We use bitmaps to determine if a branch target is valid.  */
86 static bitmap_obstack labels_obstack;
87
88 /* True when simplifying a EXPR_VARIABLE argument to an inquiry function.  */
89 static bool inquiry_argument = false;
90
91
92 bool
93 gfc_is_formal_arg (void)
94 {
95   return formal_arg_flag;
96 }
97
98 /* Is the symbol host associated?  */
99 static bool
100 is_sym_host_assoc (gfc_symbol *sym, gfc_namespace *ns)
101 {
102   for (ns = ns->parent; ns; ns = ns->parent)
103     {
104       if (sym->ns == ns)
105         return true;
106     }
107
108   return false;
109 }
110
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.  */
114
115 static bool
116 resolve_typespec_used (gfc_typespec* ts, locus* where, const char* name)
117 {
118   if (ts->type == BT_DERIVED && ts->u.derived->attr.abstract)
119     {
120       if (where)
121         {
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);
128         }
129
130       return false;
131     }
132
133   return true;
134 }
135
136
137 static bool
138 check_proc_interface (gfc_symbol *ifc, locus *where)
139 {
140   /* Several checks for F08:C1216.  */
141   if (ifc->attr.procedure)
142     {
143       gfc_error ("Interface %qs at %L is declared "
144                  "in a later PROCEDURE statement", ifc->name, where);
145       return false;
146     }
147   if (ifc->generic)
148     {
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)
155         {
156           gfc_error ("Interface %qs at %L may not be generic",
157                      ifc->name, where);
158           return false;
159         }
160     }
161   if (ifc->attr.proc == PROC_ST_FUNCTION)
162     {
163       gfc_error ("Interface %qs at %L may not be a statement function",
164                  ifc->name, where);
165       return false;
166     }
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))
171     {
172       gfc_error ("Intrinsic procedure %qs not allowed in "
173                  "PROCEDURE statement at %L", ifc->name, where);
174       return false;
175     }
176   if (!ifc->attr.if_source && !ifc->attr.intrinsic && ifc->name[0] != '\0')
177     {
178       gfc_error ("Interface %qs at %L must be explicit", ifc->name, where);
179       return false;
180     }
181   return true;
182 }
183
184
185 static void resolve_symbol (gfc_symbol *sym);
186
187
188 /* Resolve the interface for a PROCEDURE declaration or procedure pointer.  */
189
190 static bool
191 resolve_procedure_interface (gfc_symbol *sym)
192 {
193   gfc_symbol *ifc = sym->ts.interface;
194
195   if (!ifc)
196     return true;
197
198   if (ifc == sym)
199     {
200       gfc_error ("PROCEDURE %qs at %L may not be used as its own interface",
201                  sym->name, &sym->declared_at);
202       return false;
203     }
204   if (!check_proc_interface (ifc, &sym->declared_at))
205     return false;
206
207   if (ifc->attr.if_source || ifc->attr.intrinsic)
208     {
209       /* Resolve interface and copy attributes.  */
210       resolve_symbol (ifc);
211       if (ifc->attr.intrinsic)
212         gfc_resolve_intrinsic (ifc, &ifc->declared_at);
213
214       if (ifc->result)
215         {
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;
223         }
224       else
225         {
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);
232         }
233       sym->ts.interface = ifc;
234       sym->attr.function = ifc->attr.function;
235       sym->attr.subroutine = ifc->attr.subroutine;
236
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)
246         {
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;
251         }
252     }
253
254   return true;
255 }
256
257
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.
263
264    Since a dummy argument cannot be a non-dummy procedure, the only
265    resort left for untyped names are the IMPLICIT types.  */
266
267 static void
268 resolve_formal_arglist (gfc_symbol *proc)
269 {
270   gfc_formal_arglist *f;
271   gfc_symbol *sym;
272   bool saved_specification_expr;
273   int i;
274
275   if (proc->result != NULL)
276     sym = proc->result;
277   else
278     sym = proc;
279
280   if (gfc_elemental (proc)
281       || sym->attr.pointer || sym->attr.allocatable
282       || (sym->as && sym->as->rank != 0))
283     {
284       proc->attr.always_explicit = 1;
285       sym->attr.always_explicit = 1;
286     }
287
288   formal_arg_flag = true;
289
290   for (f = proc->formal; f; f = f->next)
291     {
292       gfc_array_spec *as;
293
294       sym = f->sym;
295
296       if (sym == NULL)
297         {
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;
308         }
309       else if (sym->attr.procedure && sym->attr.if_source != IFSRC_DECL
310                && !resolve_procedure_interface (sym))
311         return;
312
313       if (strcmp (proc->name, sym->name) == 0)
314         {
315           gfc_error ("Self-referential argument "
316                      "%qs at %L is not allowed", sym->name,
317                      &proc->declared_at);
318           return;
319         }
320
321       if (sym->attr.if_source != IFSRC_UNKNOWN)
322         resolve_formal_arglist (sym);
323
324       if (sym->attr.subroutine || sym->attr.external)
325         {
326           if (sym->attr.flavor == FL_UNKNOWN)
327             gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, &sym->declared_at);
328         }
329       else
330         {
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);
334         }
335
336       as = sym->ts.type == BT_CLASS && sym->attr.class_ok
337            ? CLASS_DATA (sym)->as : sym->as;
338
339       saved_specification_expr = specification_expr;
340       specification_expr = true;
341       gfc_resolve_array_spec (as, 0);
342       specification_expr = saved_specification_expr;
343
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.
346       */
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)
354         {
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);
358         }
359
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)
368         {
369           proc->attr.always_explicit = 1;
370           if (proc->result)
371             proc->result->attr.always_explicit = 1;
372         }
373
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.  */
376
377       if (sym->attr.flavor == FL_UNKNOWN)
378         gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, &sym->declared_at);
379
380       if (gfc_pure (proc))
381         {
382           if (sym->attr.flavor == FL_PROCEDURE)
383             {
384               /* F08:C1279.  */
385               if (!gfc_pure (sym))
386                 {
387                   gfc_error ("Dummy procedure %qs of PURE procedure at %L must "
388                             "also be PURE", sym->name, &sym->declared_at);
389                   continue;
390                 }
391             }
392           else if (!sym->attr.pointer)
393             {
394               if (proc->attr.function && sym->attr.intent != INTENT_IN)
395                 {
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);
405                 }
406
407               if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN)
408                 {
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);
419                 }
420             }
421
422           /* F08:C1278a.  */
423           if (sym->ts.type == BT_CLASS && sym->attr.intent == INTENT_OUT)
424             {
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;
429             }
430         }
431
432       if (proc->attr.implicit_pure)
433         {
434           if (sym->attr.flavor == FL_PROCEDURE)
435             {
436               if (!gfc_pure (sym))
437                 proc->attr.implicit_pure = 0;
438             }
439           else if (!sym->attr.pointer)
440             {
441               if (proc->attr.function && sym->attr.intent != INTENT_IN
442                   && !sym->value)
443                 proc->attr.implicit_pure = 0;
444
445               if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN
446                   && !sym->value)
447                 proc->attr.implicit_pure = 0;
448             }
449         }
450
451       if (gfc_elemental (proc))
452         {
453           /* F08:C1289.  */
454           if (sym->attr.codimension
455               || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
456                   && CLASS_DATA (sym)->attr.codimension))
457             {
458               gfc_error ("Coarray dummy argument %qs at %L to elemental "
459                          "procedure", sym->name, &sym->declared_at);
460               continue;
461             }
462
463           if (sym->as || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
464                           && CLASS_DATA (sym)->as))
465             {
466               gfc_error ("Argument %qs of elemental procedure at %L must "
467                          "be scalar", sym->name, &sym->declared_at);
468               continue;
469             }
470
471           if (sym->attr.allocatable
472               || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
473                   && CLASS_DATA (sym)->attr.allocatable))
474             {
475               gfc_error ("Argument %qs of elemental procedure at %L cannot "
476                          "have the ALLOCATABLE attribute", sym->name,
477                          &sym->declared_at);
478               continue;
479             }
480
481           if (sym->attr.pointer
482               || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
483                   && CLASS_DATA (sym)->attr.class_pointer))
484             {
485               gfc_error ("Argument %qs of elemental procedure at %L cannot "
486                          "have the POINTER attribute", sym->name,
487                          &sym->declared_at);
488               continue;
489             }
490
491           if (sym->attr.flavor == FL_PROCEDURE)
492             {
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;
497             }
498
499           /* Fortran 2008 Corrigendum 1, C1290a.  */
500           if (sym->attr.intent == INTENT_UNKNOWN && !sym->attr.value)
501             {
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;
507             }
508         }
509
510       /* Each dummy shall be specified to be scalar.  */
511       if (proc->attr.proc == PROC_ST_FUNCTION)
512         {
513           if (sym->as != NULL)
514             {
515               /* F03:C1263 (R1238) The function-name and each dummy-arg-name
516                  shall be specified, explicitly or implicitly, to be scalar.  */
517               gfc_error ("Argument '%s' of statement function '%s' at %L "
518                          "must be scalar", sym->name, proc->name,
519                          &proc->declared_at);
520               continue;
521             }
522
523           if (sym->ts.type == BT_CHARACTER)
524             {
525               gfc_charlen *cl = sym->ts.u.cl;
526               if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
527                 {
528                   gfc_error ("Character-valued argument %qs of statement "
529                              "function at %L must have constant length",
530                              sym->name, &sym->declared_at);
531                   continue;
532                 }
533             }
534         }
535     }
536   formal_arg_flag = false;
537 }
538
539
540 /* Work function called when searching for symbols that have argument lists
541    associated with them.  */
542
543 static void
544 find_arglists (gfc_symbol *sym)
545 {
546   if (sym->attr.if_source == IFSRC_UNKNOWN || sym->ns != gfc_current_ns
547       || gfc_fl_struct (sym->attr.flavor) || sym->attr.intrinsic)
548     return;
549
550   resolve_formal_arglist (sym);
551 }
552
553
554 /* Given a namespace, resolve all formal argument lists within the namespace.
555  */
556
557 static void
558 resolve_formal_arglists (gfc_namespace *ns)
559 {
560   if (ns == NULL)
561     return;
562
563   gfc_traverse_ns (ns, find_arglists);
564 }
565
566
567 static void
568 resolve_contained_fntype (gfc_symbol *sym, gfc_namespace *ns)
569 {
570   bool t;
571
572   if (sym && sym->attr.flavor == FL_PROCEDURE
573       && sym->ns->parent
574       && sym->ns->parent->proc_name
575       && sym->ns->parent->proc_name->attr.flavor == FL_PROCEDURE
576       && !strcmp (sym->name, sym->ns->parent->proc_name->name))
577     gfc_error ("Contained procedure %qs at %L has the same name as its "
578                "encompassing procedure", sym->name, &sym->declared_at);
579
580   /* If this namespace is not a function or an entry master function,
581      ignore it.  */
582   if (! sym || !(sym->attr.function || sym->attr.flavor == FL_VARIABLE)
583       || sym->attr.entry_master)
584     return;
585
586   /* Try to find out of what the return type is.  */
587   if (sym->result->ts.type == BT_UNKNOWN && sym->result->ts.interface == NULL)
588     {
589       t = gfc_set_default_type (sym->result, 0, ns);
590
591       if (!t && !sym->result->attr.untyped)
592         {
593           if (sym->result == sym)
594             gfc_error ("Contained function %qs at %L has no IMPLICIT type",
595                        sym->name, &sym->declared_at);
596           else if (!sym->result->attr.proc_pointer)
597             gfc_error ("Result %qs of contained function %qs at %L has "
598                        "no IMPLICIT type", sym->result->name, sym->name,
599                        &sym->result->declared_at);
600           sym->result->attr.untyped = 1;
601         }
602     }
603
604   /* Fortran 2008 Draft Standard, page 535, C418, on type-param-value
605      type, lists the only ways a character length value of * can be used:
606      dummy arguments of procedures, named constants, function results and
607      in allocate statements if the allocate_object is an assumed length dummy
608      in external functions.  Internal function results and results of module
609      procedures are not on this list, ergo, not permitted.  */
610
611   if (sym->result->ts.type == BT_CHARACTER)
612     {
613       gfc_charlen *cl = sym->result->ts.u.cl;
614       if ((!cl || !cl->length) && !sym->result->ts.deferred)
615         {
616           /* See if this is a module-procedure and adapt error message
617              accordingly.  */
618           bool module_proc;
619           gcc_assert (ns->parent && ns->parent->proc_name);
620           module_proc = (ns->parent->proc_name->attr.flavor == FL_MODULE);
621
622           gfc_error (module_proc
623                      ? G_("Character-valued module procedure %qs at %L"
624                           " must not be assumed length")
625                      : G_("Character-valued internal function %qs at %L"
626                           " must not be assumed length"),
627                      sym->name, &sym->declared_at);
628         }
629     }
630 }
631
632
633 /* Add NEW_ARGS to the formal argument list of PROC, taking care not to
634    introduce duplicates.  */
635
636 static void
637 merge_argument_lists (gfc_symbol *proc, gfc_formal_arglist *new_args)
638 {
639   gfc_formal_arglist *f, *new_arglist;
640   gfc_symbol *new_sym;
641
642   for (; new_args != NULL; new_args = new_args->next)
643     {
644       new_sym = new_args->sym;
645       /* See if this arg is already in the formal argument list.  */
646       for (f = proc->formal; f; f = f->next)
647         {
648           if (new_sym == f->sym)
649             break;
650         }
651
652       if (f)
653         continue;
654
655       /* Add a new argument.  Argument order is not important.  */
656       new_arglist = gfc_get_formal_arglist ();
657       new_arglist->sym = new_sym;
658       new_arglist->next = proc->formal;
659       proc->formal  = new_arglist;
660     }
661 }
662
663
664 /* Flag the arguments that are not present in all entries.  */
665
666 static void
667 check_argument_lists (gfc_symbol *proc, gfc_formal_arglist *new_args)
668 {
669   gfc_formal_arglist *f, *head;
670   head = new_args;
671
672   for (f = proc->formal; f; f = f->next)
673     {
674       if (f->sym == NULL)
675         continue;
676
677       for (new_args = head; new_args; new_args = new_args->next)
678         {
679           if (new_args->sym == f->sym)
680             break;
681         }
682
683       if (new_args)
684         continue;
685
686       f->sym->attr.not_always_present = 1;
687     }
688 }
689
690
691 /* Resolve alternate entry points.  If a symbol has multiple entry points we
692    create a new master symbol for the main routine, and turn the existing
693    symbol into an entry point.  */
694
695 static void
696 resolve_entries (gfc_namespace *ns)
697 {
698   gfc_namespace *old_ns;
699   gfc_code *c;
700   gfc_symbol *proc;
701   gfc_entry_list *el;
702   char name[GFC_MAX_SYMBOL_LEN + 1];
703   static int master_count = 0;
704
705   if (ns->proc_name == NULL)
706     return;
707
708   /* No need to do anything if this procedure doesn't have alternate entry
709      points.  */
710   if (!ns->entries)
711     return;
712
713   /* We may already have resolved alternate entry points.  */
714   if (ns->proc_name->attr.entry_master)
715     return;
716
717   /* If this isn't a procedure something has gone horribly wrong.  */
718   gcc_assert (ns->proc_name->attr.flavor == FL_PROCEDURE);
719
720   /* Remember the current namespace.  */
721   old_ns = gfc_current_ns;
722
723   gfc_current_ns = ns;
724
725   /* Add the main entry point to the list of entry points.  */
726   el = gfc_get_entry_list ();
727   el->sym = ns->proc_name;
728   el->id = 0;
729   el->next = ns->entries;
730   ns->entries = el;
731   ns->proc_name->attr.entry = 1;
732
733   /* If it is a module function, it needs to be in the right namespace
734      so that gfc_get_fake_result_decl can gather up the results. The
735      need for this arose in get_proc_name, where these beasts were
736      left in their own namespace, to keep prior references linked to
737      the entry declaration.*/
738   if (ns->proc_name->attr.function
739       && ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
740     el->sym->ns = ns;
741
742   /* Do the same for entries where the master is not a module
743      procedure.  These are retained in the module namespace because
744      of the module procedure declaration.  */
745   for (el = el->next; el; el = el->next)
746     if (el->sym->ns->proc_name->attr.flavor == FL_MODULE
747           && el->sym->attr.mod_proc)
748       el->sym->ns = ns;
749   el = ns->entries;
750
751   /* Add an entry statement for it.  */
752   c = gfc_get_code (EXEC_ENTRY);
753   c->ext.entry = el;
754   c->next = ns->code;
755   ns->code = c;
756
757   /* Create a new symbol for the master function.  */
758   /* Give the internal function a unique name (within this file).
759      Also include the function name so the user has some hope of figuring
760      out what is going on.  */
761   snprintf (name, GFC_MAX_SYMBOL_LEN, "master.%d.%s",
762             master_count++, ns->proc_name->name);
763   gfc_get_ha_symbol (name, &proc);
764   gcc_assert (proc != NULL);
765
766   gfc_add_procedure (&proc->attr, PROC_INTERNAL, proc->name, NULL);
767   if (ns->proc_name->attr.subroutine)
768     gfc_add_subroutine (&proc->attr, proc->name, NULL);
769   else
770     {
771       gfc_symbol *sym;
772       gfc_typespec *ts, *fts;
773       gfc_array_spec *as, *fas;
774       gfc_add_function (&proc->attr, proc->name, NULL);
775       proc->result = proc;
776       fas = ns->entries->sym->as;
777       fas = fas ? fas : ns->entries->sym->result->as;
778       fts = &ns->entries->sym->result->ts;
779       if (fts->type == BT_UNKNOWN)
780         fts = gfc_get_default_type (ns->entries->sym->result->name, NULL);
781       for (el = ns->entries->next; el; el = el->next)
782         {
783           ts = &el->sym->result->ts;
784           as = el->sym->as;
785           as = as ? as : el->sym->result->as;
786           if (ts->type == BT_UNKNOWN)
787             ts = gfc_get_default_type (el->sym->result->name, NULL);
788
789           if (! gfc_compare_types (ts, fts)
790               || (el->sym->result->attr.dimension
791                   != ns->entries->sym->result->attr.dimension)
792               || (el->sym->result->attr.pointer
793                   != ns->entries->sym->result->attr.pointer))
794             break;
795           else if (as && fas && ns->entries->sym->result != el->sym->result
796                       && gfc_compare_array_spec (as, fas) == 0)
797             gfc_error ("Function %s at %L has entries with mismatched "
798                        "array specifications", ns->entries->sym->name,
799                        &ns->entries->sym->declared_at);
800           /* The characteristics need to match and thus both need to have
801              the same string length, i.e. both len=*, or both len=4.
802              Having both len=<variable> is also possible, but difficult to
803              check at compile time.  */
804           else if (ts->type == BT_CHARACTER && ts->u.cl && fts->u.cl
805                    && (((ts->u.cl->length && !fts->u.cl->length)
806                         ||(!ts->u.cl->length && fts->u.cl->length))
807                        || (ts->u.cl->length
808                            && ts->u.cl->length->expr_type
809                               != fts->u.cl->length->expr_type)
810                        || (ts->u.cl->length
811                            && ts->u.cl->length->expr_type == EXPR_CONSTANT
812                            && mpz_cmp (ts->u.cl->length->value.integer,
813                                        fts->u.cl->length->value.integer) != 0)))
814             gfc_notify_std (GFC_STD_GNU, "Function %s at %L with "
815                             "entries returning variables of different "
816                             "string lengths", ns->entries->sym->name,
817                             &ns->entries->sym->declared_at);
818         }
819
820       if (el == NULL)
821         {
822           sym = ns->entries->sym->result;
823           /* All result types the same.  */
824           proc->ts = *fts;
825           if (sym->attr.dimension)
826             gfc_set_array_spec (proc, gfc_copy_array_spec (sym->as), NULL);
827           if (sym->attr.pointer)
828             gfc_add_pointer (&proc->attr, NULL);
829         }
830       else
831         {
832           /* Otherwise the result will be passed through a union by
833              reference.  */
834           proc->attr.mixed_entry_master = 1;
835           for (el = ns->entries; el; el = el->next)
836             {
837               sym = el->sym->result;
838               if (sym->attr.dimension)
839                 {
840                   if (el == ns->entries)
841                     gfc_error ("FUNCTION result %s cannot be an array in "
842                                "FUNCTION %s at %L", sym->name,
843                                ns->entries->sym->name, &sym->declared_at);
844                   else
845                     gfc_error ("ENTRY result %s cannot be an array in "
846                                "FUNCTION %s at %L", sym->name,
847                                ns->entries->sym->name, &sym->declared_at);
848                 }
849               else if (sym->attr.pointer)
850                 {
851                   if (el == ns->entries)
852                     gfc_error ("FUNCTION result %s cannot be a POINTER in "
853                                "FUNCTION %s at %L", sym->name,
854                                ns->entries->sym->name, &sym->declared_at);
855                   else
856                     gfc_error ("ENTRY result %s cannot be a POINTER in "
857                                "FUNCTION %s at %L", sym->name,
858                                ns->entries->sym->name, &sym->declared_at);
859                 }
860               else
861                 {
862                   ts = &sym->ts;
863                   if (ts->type == BT_UNKNOWN)
864                     ts = gfc_get_default_type (sym->name, NULL);
865                   switch (ts->type)
866                     {
867                     case BT_INTEGER:
868                       if (ts->kind == gfc_default_integer_kind)
869                         sym = NULL;
870                       break;
871                     case BT_REAL:
872                       if (ts->kind == gfc_default_real_kind
873                           || ts->kind == gfc_default_double_kind)
874                         sym = NULL;
875                       break;
876                     case BT_COMPLEX:
877                       if (ts->kind == gfc_default_complex_kind)
878                         sym = NULL;
879                       break;
880                     case BT_LOGICAL:
881                       if (ts->kind == gfc_default_logical_kind)
882                         sym = NULL;
883                       break;
884                     case BT_UNKNOWN:
885                       /* We will issue error elsewhere.  */
886                       sym = NULL;
887                       break;
888                     default:
889                       break;
890                     }
891                   if (sym)
892                     {
893                       if (el == ns->entries)
894                         gfc_error ("FUNCTION result %s cannot be of type %s "
895                                    "in FUNCTION %s at %L", sym->name,
896                                    gfc_typename (ts), ns->entries->sym->name,
897                                    &sym->declared_at);
898                       else
899                         gfc_error ("ENTRY result %s cannot be of type %s "
900                                    "in FUNCTION %s at %L", sym->name,
901                                    gfc_typename (ts), ns->entries->sym->name,
902                                    &sym->declared_at);
903                     }
904                 }
905             }
906         }
907     }
908   proc->attr.access = ACCESS_PRIVATE;
909   proc->attr.entry_master = 1;
910
911   /* Merge all the entry point arguments.  */
912   for (el = ns->entries; el; el = el->next)
913     merge_argument_lists (proc, el->sym->formal);
914
915   /* Check the master formal arguments for any that are not
916      present in all entry points.  */
917   for (el = ns->entries; el; el = el->next)
918     check_argument_lists (proc, el->sym->formal);
919
920   /* Use the master function for the function body.  */
921   ns->proc_name = proc;
922
923   /* Finalize the new symbols.  */
924   gfc_commit_symbols ();
925
926   /* Restore the original namespace.  */
927   gfc_current_ns = old_ns;
928 }
929
930
931 /* Resolve common variables.  */
932 static void
933 resolve_common_vars (gfc_common_head *common_block, bool named_common)
934 {
935   gfc_symbol *csym = common_block->head;
936
937   for (; csym; csym = csym->common_next)
938     {
939       /* gfc_add_in_common may have been called before, but the reported errors
940          have been ignored to continue parsing.
941          We do the checks again here.  */
942       if (!csym->attr.use_assoc)
943         {
944           gfc_add_in_common (&csym->attr, csym->name, &common_block->where);
945           gfc_notify_std (GFC_STD_F2018_OBS, "COMMON block at %L",
946                           &common_block->where);
947         }
948
949       if (csym->value || csym->attr.data)
950         {
951           if (!csym->ns->is_block_data)
952             gfc_notify_std (GFC_STD_GNU, "Variable %qs at %L is in COMMON "
953                             "but only in BLOCK DATA initialization is "
954                             "allowed", csym->name, &csym->declared_at);
955           else if (!named_common)
956             gfc_notify_std (GFC_STD_GNU, "Initialized variable %qs at %L is "
957                             "in a blank COMMON but initialization is only "
958                             "allowed in named common blocks", csym->name,
959                             &csym->declared_at);
960         }
961
962       if (UNLIMITED_POLY (csym))
963         gfc_error_now ("%qs in cannot appear in COMMON at %L "
964                        "[F2008:C5100]", csym->name, &csym->declared_at);
965
966       if (csym->ts.type != BT_DERIVED)
967         continue;
968
969       if (!(csym->ts.u.derived->attr.sequence
970             || csym->ts.u.derived->attr.is_bind_c))
971         gfc_error_now ("Derived type variable %qs in COMMON at %L "
972                        "has neither the SEQUENCE nor the BIND(C) "
973                        "attribute", csym->name, &csym->declared_at);
974       if (csym->ts.u.derived->attr.alloc_comp)
975         gfc_error_now ("Derived type variable %qs in COMMON at %L "
976                        "has an ultimate component that is "
977                        "allocatable", csym->name, &csym->declared_at);
978       if (gfc_has_default_initializer (csym->ts.u.derived))
979         gfc_error_now ("Derived type variable %qs in COMMON at %L "
980                        "may not have default initializer", csym->name,
981                        &csym->declared_at);
982
983       if (csym->attr.flavor == FL_UNKNOWN && !csym->attr.proc_pointer)
984         gfc_add_flavor (&csym->attr, FL_VARIABLE, csym->name, &csym->declared_at);
985     }
986 }
987
988 /* Resolve common blocks.  */
989 static void
990 resolve_common_blocks (gfc_symtree *common_root)
991 {
992   gfc_symbol *sym;
993   gfc_gsymbol * gsym;
994
995   if (common_root == NULL)
996     return;
997
998   if (common_root->left)
999     resolve_common_blocks (common_root->left);
1000   if (common_root->right)
1001     resolve_common_blocks (common_root->right);
1002
1003   resolve_common_vars (common_root->n.common, true);
1004
1005   /* The common name is a global name - in Fortran 2003 also if it has a
1006      C binding name, since Fortran 2008 only the C binding name is a global
1007      identifier.  */
1008   if (!common_root->n.common->binding_label
1009       || gfc_notification_std (GFC_STD_F2008))
1010     {
1011       gsym = gfc_find_gsymbol (gfc_gsym_root,
1012                                common_root->n.common->name);
1013
1014       if (gsym && gfc_notification_std (GFC_STD_F2008)
1015           && gsym->type == GSYM_COMMON
1016           && ((common_root->n.common->binding_label
1017                && (!gsym->binding_label
1018                    || strcmp (common_root->n.common->binding_label,
1019                               gsym->binding_label) != 0))
1020               || (!common_root->n.common->binding_label
1021                   && gsym->binding_label)))
1022         {
1023           gfc_error ("In Fortran 2003 COMMON %qs block at %L is a global "
1024                      "identifier and must thus have the same binding name "
1025                      "as the same-named COMMON block at %L: %s vs %s",
1026                      common_root->n.common->name, &common_root->n.common->where,
1027                      &gsym->where,
1028                      common_root->n.common->binding_label
1029                      ? common_root->n.common->binding_label : "(blank)",
1030                      gsym->binding_label ? gsym->binding_label : "(blank)");
1031           return;
1032         }
1033
1034       if (gsym && gsym->type != GSYM_COMMON
1035           && !common_root->n.common->binding_label)
1036         {
1037           gfc_error ("COMMON block %qs at %L uses the same global identifier "
1038                      "as entity at %L",
1039                      common_root->n.common->name, &common_root->n.common->where,
1040                      &gsym->where);
1041           return;
1042         }
1043       if (gsym && gsym->type != GSYM_COMMON)
1044         {
1045           gfc_error ("Fortran 2008: COMMON block %qs with binding label at "
1046                      "%L sharing the identifier with global non-COMMON-block "
1047                      "entity at %L", common_root->n.common->name,
1048                      &common_root->n.common->where, &gsym->where);
1049           return;
1050         }
1051       if (!gsym)
1052         {
1053           gsym = gfc_get_gsymbol (common_root->n.common->name, false);
1054           gsym->type = GSYM_COMMON;
1055           gsym->where = common_root->n.common->where;
1056           gsym->defined = 1;
1057         }
1058       gsym->used = 1;
1059     }
1060
1061   if (common_root->n.common->binding_label)
1062     {
1063       gsym = gfc_find_gsymbol (gfc_gsym_root,
1064                                common_root->n.common->binding_label);
1065       if (gsym && gsym->type != GSYM_COMMON)
1066         {
1067           gfc_error ("COMMON block at %L with binding label %qs uses the same "
1068                      "global identifier as entity at %L",
1069                      &common_root->n.common->where,
1070                      common_root->n.common->binding_label, &gsym->where);
1071           return;
1072         }
1073       if (!gsym)
1074         {
1075           gsym = gfc_get_gsymbol (common_root->n.common->binding_label, true);
1076           gsym->type = GSYM_COMMON;
1077           gsym->where = common_root->n.common->where;
1078           gsym->defined = 1;
1079         }
1080       gsym->used = 1;
1081     }
1082
1083   gfc_find_symbol (common_root->name, gfc_current_ns, 0, &sym);
1084   if (sym == NULL)
1085     return;
1086
1087   if (sym->attr.flavor == FL_PARAMETER)
1088     gfc_error ("COMMON block %qs at %L is used as PARAMETER at %L",
1089                sym->name, &common_root->n.common->where, &sym->declared_at);
1090
1091   if (sym->attr.external)
1092     gfc_error ("COMMON block %qs at %L cannot have the EXTERNAL attribute",
1093                sym->name, &common_root->n.common->where);
1094
1095   if (sym->attr.intrinsic)
1096     gfc_error ("COMMON block %qs at %L is also an intrinsic procedure",
1097                sym->name, &common_root->n.common->where);
1098   else if (sym->attr.result
1099            || gfc_is_function_return_value (sym, gfc_current_ns))
1100     gfc_notify_std (GFC_STD_F2003, "COMMON block %qs at %L "
1101                     "that is also a function result", sym->name,
1102                     &common_root->n.common->where);
1103   else if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_INTERNAL
1104            && sym->attr.proc != PROC_ST_FUNCTION)
1105     gfc_notify_std (GFC_STD_F2003, "COMMON block %qs at %L "
1106                     "that is also a global procedure", sym->name,
1107                     &common_root->n.common->where);
1108 }
1109
1110
1111 /* Resolve contained function types.  Because contained functions can call one
1112    another, they have to be worked out before any of the contained procedures
1113    can be resolved.
1114
1115    The good news is that if a function doesn't already have a type, the only
1116    way it can get one is through an IMPLICIT type or a RESULT variable, because
1117    by definition contained functions are contained namespace they're contained
1118    in, not in a sibling or parent namespace.  */
1119
1120 static void
1121 resolve_contained_functions (gfc_namespace *ns)
1122 {
1123   gfc_namespace *child;
1124   gfc_entry_list *el;
1125
1126   resolve_formal_arglists (ns);
1127
1128   for (child = ns->contained; child; child = child->sibling)
1129     {
1130       /* Resolve alternate entry points first.  */
1131       resolve_entries (child);
1132
1133       /* Then check function return types.  */
1134       resolve_contained_fntype (child->proc_name, child);
1135       for (el = child->entries; el; el = el->next)
1136         resolve_contained_fntype (el->sym, child);
1137     }
1138 }
1139
1140
1141
1142 /* A Parameterized Derived Type constructor must contain values for
1143    the PDT KIND parameters or they must have a default initializer.
1144    Go through the constructor picking out the KIND expressions,
1145    storing them in 'param_list' and then call gfc_get_pdt_instance
1146    to obtain the PDT instance.  */
1147
1148 static gfc_actual_arglist *param_list, *param_tail, *param;
1149
1150 static bool
1151 get_pdt_spec_expr (gfc_component *c, gfc_expr *expr)
1152 {
1153   param = gfc_get_actual_arglist ();
1154   if (!param_list)
1155     param_list = param_tail = param;
1156   else
1157     {
1158       param_tail->next = param;
1159       param_tail = param_tail->next;
1160     }
1161
1162   param_tail->name = c->name;
1163   if (expr)
1164     param_tail->expr = gfc_copy_expr (expr);
1165   else if (c->initializer)
1166     param_tail->expr = gfc_copy_expr (c->initializer);
1167   else
1168     {
1169       param_tail->spec_type = SPEC_ASSUMED;
1170       if (c->attr.pdt_kind)
1171         {
1172           gfc_error ("The KIND parameter %qs in the PDT constructor "
1173                      "at %C has no value", param->name);
1174           return false;
1175         }
1176     }
1177
1178   return true;
1179 }
1180
1181 static bool
1182 get_pdt_constructor (gfc_expr *expr, gfc_constructor **constr,
1183                      gfc_symbol *derived)
1184 {
1185   gfc_constructor *cons = NULL;
1186   gfc_component *comp;
1187   bool t = true;
1188
1189   if (expr && expr->expr_type == EXPR_STRUCTURE)
1190     cons = gfc_constructor_first (expr->value.constructor);
1191   else if (constr)
1192     cons = *constr;
1193   gcc_assert (cons);
1194
1195   comp = derived->components;
1196
1197   for (; comp && cons; comp = comp->next, cons = gfc_constructor_next (cons))
1198     {
1199       if (cons->expr
1200           && cons->expr->expr_type == EXPR_STRUCTURE
1201           && comp->ts.type == BT_DERIVED)
1202         {
1203           t = get_pdt_constructor (cons->expr, NULL, comp->ts.u.derived);
1204           if (!t)
1205             return t;
1206         }
1207       else if (comp->ts.type == BT_DERIVED)
1208         {
1209           t = get_pdt_constructor (NULL, &cons, comp->ts.u.derived);
1210           if (!t)
1211             return t;
1212         }
1213      else if ((comp->attr.pdt_kind || comp->attr.pdt_len)
1214                && derived->attr.pdt_template)
1215         {
1216           t = get_pdt_spec_expr (comp, cons->expr);
1217           if (!t)
1218             return t;
1219         }
1220     }
1221   return t;
1222 }
1223
1224
1225 static bool resolve_fl_derived0 (gfc_symbol *sym);
1226 static bool resolve_fl_struct (gfc_symbol *sym);
1227
1228
1229 /* Resolve all of the elements of a structure constructor and make sure that
1230    the types are correct. The 'init' flag indicates that the given
1231    constructor is an initializer.  */
1232
1233 static bool
1234 resolve_structure_cons (gfc_expr *expr, int init)
1235 {
1236   gfc_constructor *cons;
1237   gfc_component *comp;
1238   bool t;
1239   symbol_attribute a;
1240
1241   t = true;
1242
1243   if (expr->ts.type == BT_DERIVED || expr->ts.type == BT_UNION)
1244     {
1245       if (expr->ts.u.derived->attr.flavor == FL_DERIVED)
1246         resolve_fl_derived0 (expr->ts.u.derived);
1247       else
1248         resolve_fl_struct (expr->ts.u.derived);
1249
1250       /* If this is a Parameterized Derived Type template, find the
1251          instance corresponding to the PDT kind parameters.  */
1252       if (expr->ts.u.derived->attr.pdt_template)
1253         {
1254           param_list = NULL;
1255           t = get_pdt_constructor (expr, NULL, expr->ts.u.derived);
1256           if (!t)
1257             return t;
1258           gfc_get_pdt_instance (param_list, &expr->ts.u.derived, NULL);
1259
1260           expr->param_list = gfc_copy_actual_arglist (param_list);
1261
1262           if (param_list)
1263             gfc_free_actual_arglist (param_list);
1264
1265           if (!expr->ts.u.derived->attr.pdt_type)
1266             return false;
1267         }
1268     }
1269
1270   cons = gfc_constructor_first (expr->value.constructor);
1271
1272   /* A constructor may have references if it is the result of substituting a
1273      parameter variable.  In this case we just pull out the component we
1274      want.  */
1275   if (expr->ref)
1276     comp = expr->ref->u.c.sym->components;
1277   else
1278     comp = expr->ts.u.derived->components;
1279
1280   for (; comp && cons; comp = comp->next, cons = gfc_constructor_next (cons))
1281     {
1282       int rank;
1283
1284       if (!cons->expr)
1285         continue;
1286
1287       /* Unions use an EXPR_NULL contrived expression to tell the translation
1288          phase to generate an initializer of the appropriate length.
1289          Ignore it here.  */
1290       if (cons->expr->ts.type == BT_UNION && cons->expr->expr_type == EXPR_NULL)
1291         continue;
1292
1293       if (!gfc_resolve_expr (cons->expr))
1294         {
1295           t = false;
1296           continue;
1297         }
1298
1299       rank = comp->as ? comp->as->rank : 0;
1300       if (comp->ts.type == BT_CLASS
1301           && !comp->ts.u.derived->attr.unlimited_polymorphic
1302           && CLASS_DATA (comp)->as)
1303         rank = CLASS_DATA (comp)->as->rank;
1304
1305       if (cons->expr->expr_type != EXPR_NULL && rank != cons->expr->rank
1306           && (comp->attr.allocatable || cons->expr->rank))
1307         {
1308           gfc_error ("The rank of the element in the structure "
1309                      "constructor at %L does not match that of the "
1310                      "component (%d/%d)", &cons->expr->where,
1311                      cons->expr->rank, rank);
1312           t = false;
1313         }
1314
1315       /* If we don't have the right type, try to convert it.  */
1316
1317       if (!comp->attr.proc_pointer &&
1318           !gfc_compare_types (&cons->expr->ts, &comp->ts))
1319         {
1320           if (strcmp (comp->name, "_extends") == 0)
1321             {
1322               /* Can afford to be brutal with the _extends initializer.
1323                  The derived type can get lost because it is PRIVATE
1324                  but it is not usage constrained by the standard.  */
1325               cons->expr->ts = comp->ts;
1326             }
1327           else if (comp->attr.pointer && cons->expr->ts.type != BT_UNKNOWN)
1328             {
1329               gfc_error ("The element in the structure constructor at %L, "
1330                          "for pointer component %qs, is %s but should be %s",
1331                          &cons->expr->where, comp->name,
1332                          gfc_basic_typename (cons->expr->ts.type),
1333                          gfc_basic_typename (comp->ts.type));
1334               t = false;
1335             }
1336           else
1337             {
1338               bool t2 = gfc_convert_type (cons->expr, &comp->ts, 1);
1339               if (t)
1340                 t = t2;
1341             }
1342         }
1343
1344       /* For strings, the length of the constructor should be the same as
1345          the one of the structure, ensure this if the lengths are known at
1346          compile time and when we are dealing with PARAMETER or structure
1347          constructors.  */
1348       if (cons->expr->ts.type == BT_CHARACTER && comp->ts.u.cl
1349           && comp->ts.u.cl->length
1350           && comp->ts.u.cl->length->expr_type == EXPR_CONSTANT
1351           && cons->expr->ts.u.cl && cons->expr->ts.u.cl->length
1352           && cons->expr->ts.u.cl->length->expr_type == EXPR_CONSTANT
1353           && cons->expr->rank != 0
1354           && mpz_cmp (cons->expr->ts.u.cl->length->value.integer,
1355                       comp->ts.u.cl->length->value.integer) != 0)
1356         {
1357           if (cons->expr->expr_type == EXPR_VARIABLE
1358               && cons->expr->symtree->n.sym->attr.flavor == FL_PARAMETER)
1359             {
1360               /* Wrap the parameter in an array constructor (EXPR_ARRAY)
1361                  to make use of the gfc_resolve_character_array_constructor
1362                  machinery.  The expression is later simplified away to
1363                  an array of string literals.  */
1364               gfc_expr *para = cons->expr;
1365               cons->expr = gfc_get_expr ();
1366               cons->expr->ts = para->ts;
1367               cons->expr->where = para->where;
1368               cons->expr->expr_type = EXPR_ARRAY;
1369               cons->expr->rank = para->rank;
1370               cons->expr->shape = gfc_copy_shape (para->shape, para->rank);
1371               gfc_constructor_append_expr (&cons->expr->value.constructor,
1372                                            para, &cons->expr->where);
1373             }
1374
1375           if (cons->expr->expr_type == EXPR_ARRAY)
1376             {
1377               /* Rely on the cleanup of the namespace to deal correctly with
1378                  the old charlen.  (There was a block here that attempted to
1379                  remove the charlen but broke the chain in so doing.)  */
1380               cons->expr->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1381               cons->expr->ts.u.cl->length_from_typespec = true;
1382               cons->expr->ts.u.cl->length = gfc_copy_expr (comp->ts.u.cl->length);
1383               gfc_resolve_character_array_constructor (cons->expr);
1384             }
1385         }
1386
1387       if (cons->expr->expr_type == EXPR_NULL
1388           && !(comp->attr.pointer || comp->attr.allocatable
1389                || comp->attr.proc_pointer || comp->ts.f90_type == BT_VOID
1390                || (comp->ts.type == BT_CLASS
1391                    && (CLASS_DATA (comp)->attr.class_pointer
1392                        || CLASS_DATA (comp)->attr.allocatable))))
1393         {
1394           t = false;
1395           gfc_error ("The NULL in the structure constructor at %L is "
1396                      "being applied to component %qs, which is neither "
1397                      "a POINTER nor ALLOCATABLE", &cons->expr->where,
1398                      comp->name);
1399         }
1400
1401       if (comp->attr.proc_pointer && comp->ts.interface)
1402         {
1403           /* Check procedure pointer interface.  */
1404           gfc_symbol *s2 = NULL;
1405           gfc_component *c2;
1406           const char *name;
1407           char err[200];
1408
1409           c2 = gfc_get_proc_ptr_comp (cons->expr);
1410           if (c2)
1411             {
1412               s2 = c2->ts.interface;
1413               name = c2->name;
1414             }
1415           else if (cons->expr->expr_type == EXPR_FUNCTION)
1416             {
1417               s2 = cons->expr->symtree->n.sym->result;
1418               name = cons->expr->symtree->n.sym->result->name;
1419             }
1420           else if (cons->expr->expr_type != EXPR_NULL)
1421             {
1422               s2 = cons->expr->symtree->n.sym;
1423               name = cons->expr->symtree->n.sym->name;
1424             }
1425
1426           if (s2 && !gfc_compare_interfaces (comp->ts.interface, s2, name, 0, 1,
1427                                              err, sizeof (err), NULL, NULL))
1428             {
1429               gfc_error_opt (OPT_Wargument_mismatch,
1430                              "Interface mismatch for procedure-pointer "
1431                              "component %qs in structure constructor at %L:"
1432                              " %s", comp->name, &cons->expr->where, err);
1433               return false;
1434             }
1435         }
1436
1437       if (!comp->attr.pointer || comp->attr.proc_pointer
1438           || cons->expr->expr_type == EXPR_NULL)
1439         continue;
1440
1441       a = gfc_expr_attr (cons->expr);
1442
1443       if (!a.pointer && !a.target)
1444         {
1445           t = false;
1446           gfc_error ("The element in the structure constructor at %L, "
1447                      "for pointer component %qs should be a POINTER or "
1448                      "a TARGET", &cons->expr->where, comp->name);
1449         }
1450
1451       if (init)
1452         {
1453           /* F08:C461. Additional checks for pointer initialization.  */
1454           if (a.allocatable)
1455             {
1456               t = false;
1457               gfc_error ("Pointer initialization target at %L "
1458                          "must not be ALLOCATABLE", &cons->expr->where);
1459             }
1460           if (!a.save)
1461             {
1462               t = false;
1463               gfc_error ("Pointer initialization target at %L "
1464                          "must have the SAVE attribute", &cons->expr->where);
1465             }
1466         }
1467
1468       /* F2003, C1272 (3).  */
1469       bool impure = cons->expr->expr_type == EXPR_VARIABLE
1470                     && (gfc_impure_variable (cons->expr->symtree->n.sym)
1471                         || gfc_is_coindexed (cons->expr));
1472       if (impure && gfc_pure (NULL))
1473         {
1474           t = false;
1475           gfc_error ("Invalid expression in the structure constructor for "
1476                      "pointer component %qs at %L in PURE procedure",
1477                      comp->name, &cons->expr->where);
1478         }
1479
1480       if (impure)
1481         gfc_unset_implicit_pure (NULL);
1482     }
1483
1484   return t;
1485 }
1486
1487
1488 /****************** Expression name resolution ******************/
1489
1490 /* Returns 0 if a symbol was not declared with a type or
1491    attribute declaration statement, nonzero otherwise.  */
1492
1493 static int
1494 was_declared (gfc_symbol *sym)
1495 {
1496   symbol_attribute a;
1497
1498   a = sym->attr;
1499
1500   if (!a.implicit_type && sym->ts.type != BT_UNKNOWN)
1501     return 1;
1502
1503   if (a.allocatable || a.dimension || a.dummy || a.external || a.intrinsic
1504       || a.optional || a.pointer || a.save || a.target || a.volatile_
1505       || a.value || a.access != ACCESS_UNKNOWN || a.intent != INTENT_UNKNOWN
1506       || a.asynchronous || a.codimension)
1507     return 1;
1508
1509   return 0;
1510 }
1511
1512
1513 /* Determine if a symbol is generic or not.  */
1514
1515 static int
1516 generic_sym (gfc_symbol *sym)
1517 {
1518   gfc_symbol *s;
1519
1520   if (sym->attr.generic ||
1521       (sym->attr.intrinsic && gfc_generic_intrinsic (sym->name)))
1522     return 1;
1523
1524   if (was_declared (sym) || sym->ns->parent == NULL)
1525     return 0;
1526
1527   gfc_find_symbol (sym->name, sym->ns->parent, 1, &s);
1528
1529   if (s != NULL)
1530     {
1531       if (s == sym)
1532         return 0;
1533       else
1534         return generic_sym (s);
1535     }
1536
1537   return 0;
1538 }
1539
1540
1541 /* Determine if a symbol is specific or not.  */
1542
1543 static int
1544 specific_sym (gfc_symbol *sym)
1545 {
1546   gfc_symbol *s;
1547
1548   if (sym->attr.if_source == IFSRC_IFBODY
1549       || sym->attr.proc == PROC_MODULE
1550       || sym->attr.proc == PROC_INTERNAL
1551       || sym->attr.proc == PROC_ST_FUNCTION
1552       || (sym->attr.intrinsic && gfc_specific_intrinsic (sym->name))
1553       || sym->attr.external)
1554     return 1;
1555
1556   if (was_declared (sym) || sym->ns->parent == NULL)
1557     return 0;
1558
1559   gfc_find_symbol (sym->name, sym->ns->parent, 1, &s);
1560
1561   return (s == NULL) ? 0 : specific_sym (s);
1562 }
1563
1564
1565 /* Figure out if the procedure is specific, generic or unknown.  */
1566
1567 enum proc_type
1568 { PTYPE_GENERIC = 1, PTYPE_SPECIFIC, PTYPE_UNKNOWN };
1569
1570 static proc_type
1571 procedure_kind (gfc_symbol *sym)
1572 {
1573   if (generic_sym (sym))
1574     return PTYPE_GENERIC;
1575
1576   if (specific_sym (sym))
1577     return PTYPE_SPECIFIC;
1578
1579   return PTYPE_UNKNOWN;
1580 }
1581
1582 /* Check references to assumed size arrays.  The flag need_full_assumed_size
1583    is nonzero when matching actual arguments.  */
1584
1585 static int need_full_assumed_size = 0;
1586
1587 static bool
1588 check_assumed_size_reference (gfc_symbol *sym, gfc_expr *e)
1589 {
1590   if (need_full_assumed_size || !(sym->as && sym->as->type == AS_ASSUMED_SIZE))
1591       return false;
1592
1593   /* FIXME: The comparison "e->ref->u.ar.type == AR_FULL" is wrong.
1594      What should it be?  */
1595   if (e->ref && (e->ref->u.ar.end[e->ref->u.ar.as->rank - 1] == NULL)
1596           && (e->ref->u.ar.as->type == AS_ASSUMED_SIZE)
1597                && (e->ref->u.ar.type == AR_FULL))
1598     {
1599       gfc_error ("The upper bound in the last dimension must "
1600                  "appear in the reference to the assumed size "
1601                  "array %qs at %L", sym->name, &e->where);
1602       return true;
1603     }
1604   return false;
1605 }
1606
1607
1608 /* Look for bad assumed size array references in argument expressions
1609   of elemental and array valued intrinsic procedures.  Since this is
1610   called from procedure resolution functions, it only recurses at
1611   operators.  */
1612
1613 static bool
1614 resolve_assumed_size_actual (gfc_expr *e)
1615 {
1616   if (e == NULL)
1617    return false;
1618
1619   switch (e->expr_type)
1620     {
1621     case EXPR_VARIABLE:
1622       if (e->symtree && check_assumed_size_reference (e->symtree->n.sym, e))
1623         return true;
1624       break;
1625
1626     case EXPR_OP:
1627       if (resolve_assumed_size_actual (e->value.op.op1)
1628           || resolve_assumed_size_actual (e->value.op.op2))
1629         return true;
1630       break;
1631
1632     default:
1633       break;
1634     }
1635   return false;
1636 }
1637
1638
1639 /* Check a generic procedure, passed as an actual argument, to see if
1640    there is a matching specific name.  If none, it is an error, and if
1641    more than one, the reference is ambiguous.  */
1642 static int
1643 count_specific_procs (gfc_expr *e)
1644 {
1645   int n;
1646   gfc_interface *p;
1647   gfc_symbol *sym;
1648
1649   n = 0;
1650   sym = e->symtree->n.sym;
1651
1652   for (p = sym->generic; p; p = p->next)
1653     if (strcmp (sym->name, p->sym->name) == 0)
1654       {
1655         e->symtree = gfc_find_symtree (p->sym->ns->sym_root,
1656                                        sym->name);
1657         n++;
1658       }
1659
1660   if (n > 1)
1661     gfc_error ("%qs at %L is ambiguous", e->symtree->n.sym->name,
1662                &e->where);
1663
1664   if (n == 0)
1665     gfc_error ("GENERIC procedure %qs is not allowed as an actual "
1666                "argument at %L", sym->name, &e->where);
1667
1668   return n;
1669 }
1670
1671
1672 /* See if a call to sym could possibly be a not allowed RECURSION because of
1673    a missing RECURSIVE declaration.  This means that either sym is the current
1674    context itself, or sym is the parent of a contained procedure calling its
1675    non-RECURSIVE containing procedure.
1676    This also works if sym is an ENTRY.  */
1677
1678 static bool
1679 is_illegal_recursion (gfc_symbol* sym, gfc_namespace* context)
1680 {
1681   gfc_symbol* proc_sym;
1682   gfc_symbol* context_proc;
1683   gfc_namespace* real_context;
1684
1685   if (sym->attr.flavor == FL_PROGRAM
1686       || gfc_fl_struct (sym->attr.flavor))
1687     return false;
1688
1689   /* If we've got an ENTRY, find real procedure.  */
1690   if (sym->attr.entry && sym->ns->entries)
1691     proc_sym = sym->ns->entries->sym;
1692   else
1693     proc_sym = sym;
1694
1695   /* If sym is RECURSIVE, all is well of course.  */
1696   if (proc_sym->attr.recursive || flag_recursive)
1697     return false;
1698
1699   /* Find the context procedure's "real" symbol if it has entries.
1700      We look for a procedure symbol, so recurse on the parents if we don't
1701      find one (like in case of a BLOCK construct).  */
1702   for (real_context = context; ; real_context = real_context->parent)
1703     {
1704       /* We should find something, eventually!  */
1705       gcc_assert (real_context);
1706
1707       context_proc = (real_context->entries ? real_context->entries->sym
1708                                             : real_context->proc_name);
1709
1710       /* In some special cases, there may not be a proc_name, like for this
1711          invalid code:
1712          real(bad_kind()) function foo () ...
1713          when checking the call to bad_kind ().
1714          In these cases, we simply return here and assume that the
1715          call is ok.  */
1716       if (!context_proc)
1717         return false;
1718
1719       if (context_proc->attr.flavor != FL_LABEL)
1720         break;
1721     }
1722
1723   /* A call from sym's body to itself is recursion, of course.  */
1724   if (context_proc == proc_sym)
1725     return true;
1726
1727   /* The same is true if context is a contained procedure and sym the
1728      containing one.  */
1729   if (context_proc->attr.contained)
1730     {
1731       gfc_symbol* parent_proc;
1732
1733       gcc_assert (context->parent);
1734       parent_proc = (context->parent->entries ? context->parent->entries->sym
1735                                               : context->parent->proc_name);
1736
1737       if (parent_proc == proc_sym)
1738         return true;
1739     }
1740
1741   return false;
1742 }
1743
1744
1745 /* Resolve an intrinsic procedure: Set its function/subroutine attribute,
1746    its typespec and formal argument list.  */
1747
1748 bool
1749 gfc_resolve_intrinsic (gfc_symbol *sym, locus *loc)
1750 {
1751   gfc_intrinsic_sym* isym = NULL;
1752   const char* symstd;
1753
1754   if (sym->formal)
1755     return true;
1756
1757   /* Already resolved.  */
1758   if (sym->from_intmod && sym->ts.type != BT_UNKNOWN)
1759     return true;
1760
1761   /* We already know this one is an intrinsic, so we don't call
1762      gfc_is_intrinsic for full checking but rather use gfc_find_function and
1763      gfc_find_subroutine directly to check whether it is a function or
1764      subroutine.  */
1765
1766   if (sym->intmod_sym_id && sym->attr.subroutine)
1767     {
1768       gfc_isym_id id = gfc_isym_id_by_intmod_sym (sym);
1769       isym = gfc_intrinsic_subroutine_by_id (id);
1770     }
1771   else if (sym->intmod_sym_id)
1772     {
1773       gfc_isym_id id = gfc_isym_id_by_intmod_sym (sym);
1774       isym = gfc_intrinsic_function_by_id (id);
1775     }
1776   else if (!sym->attr.subroutine)
1777     isym = gfc_find_function (sym->name);
1778
1779   if (isym && !sym->attr.subroutine)
1780     {
1781       if (sym->ts.type != BT_UNKNOWN && warn_surprising
1782           && !sym->attr.implicit_type)
1783         gfc_warning (OPT_Wsurprising,
1784                      "Type specified for intrinsic function %qs at %L is"
1785                       " ignored", sym->name, &sym->declared_at);
1786
1787       if (!sym->attr.function &&
1788           !gfc_add_function(&sym->attr, sym->name, loc))
1789         return false;
1790
1791       sym->ts = isym->ts;
1792     }
1793   else if (isym || (isym = gfc_find_subroutine (sym->name)))
1794     {
1795       if (sym->ts.type != BT_UNKNOWN && !sym->attr.implicit_type)
1796         {
1797           gfc_error ("Intrinsic subroutine %qs at %L shall not have a type"
1798                       " specifier", sym->name, &sym->declared_at);
1799           return false;
1800         }
1801
1802       if (!sym->attr.subroutine &&
1803           !gfc_add_subroutine(&sym->attr, sym->name, loc))
1804         return false;
1805     }
1806   else
1807     {
1808       gfc_error ("%qs declared INTRINSIC at %L does not exist", sym->name,
1809                  &sym->declared_at);
1810       return false;
1811     }
1812
1813   gfc_copy_formal_args_intr (sym, isym, NULL);
1814
1815   sym->attr.pure = isym->pure;
1816   sym->attr.elemental = isym->elemental;
1817
1818   /* Check it is actually available in the standard settings.  */
1819   if (!gfc_check_intrinsic_standard (isym, &symstd, false, sym->declared_at))
1820     {
1821       gfc_error ("The intrinsic %qs declared INTRINSIC at %L is not "
1822                  "available in the current standard settings but %s. Use "
1823                  "an appropriate %<-std=*%> option or enable "
1824                  "%<-fall-intrinsics%> in order to use it.",
1825                  sym->name, &sym->declared_at, symstd);
1826       return false;
1827     }
1828
1829   return true;
1830 }
1831
1832
1833 /* Resolve a procedure expression, like passing it to a called procedure or as
1834    RHS for a procedure pointer assignment.  */
1835
1836 static bool
1837 resolve_procedure_expression (gfc_expr* expr)
1838 {
1839   gfc_symbol* sym;
1840
1841   if (expr->expr_type != EXPR_VARIABLE)
1842     return true;
1843   gcc_assert (expr->symtree);
1844
1845   sym = expr->symtree->n.sym;
1846
1847   if (sym->attr.intrinsic)
1848     gfc_resolve_intrinsic (sym, &expr->where);
1849
1850   if (sym->attr.flavor != FL_PROCEDURE
1851       || (sym->attr.function && sym->result == sym))
1852     return true;
1853
1854   /* A non-RECURSIVE procedure that is used as procedure expression within its
1855      own body is in danger of being called recursively.  */
1856   if (is_illegal_recursion (sym, gfc_current_ns))
1857     gfc_warning (0, "Non-RECURSIVE procedure %qs at %L is possibly calling"
1858                  " itself recursively.  Declare it RECURSIVE or use"
1859                  " %<-frecursive%>", sym->name, &expr->where);
1860
1861   return true;
1862 }
1863
1864
1865 /* Resolve an actual argument list.  Most of the time, this is just
1866    resolving the expressions in the list.
1867    The exception is that we sometimes have to decide whether arguments
1868    that look like procedure arguments are really simple variable
1869    references.  */
1870
1871 static bool
1872 resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype,
1873                         bool no_formal_args)
1874 {
1875   gfc_symbol *sym;
1876   gfc_symtree *parent_st;
1877   gfc_expr *e;
1878   gfc_component *comp;
1879   int save_need_full_assumed_size;
1880   bool return_value = false;
1881   bool actual_arg_sav = actual_arg, first_actual_arg_sav = first_actual_arg;
1882
1883   actual_arg = true;
1884   first_actual_arg = true;
1885
1886   for (; arg; arg = arg->next)
1887     {
1888       e = arg->expr;
1889       if (e == NULL)
1890         {
1891           /* Check the label is a valid branching target.  */
1892           if (arg->label)
1893             {
1894               if (arg->label->defined == ST_LABEL_UNKNOWN)
1895                 {
1896                   gfc_error ("Label %d referenced at %L is never defined",
1897                              arg->label->value, &arg->label->where);
1898                   goto cleanup;
1899                 }
1900             }
1901           first_actual_arg = false;
1902           continue;
1903         }
1904
1905       if (e->expr_type == EXPR_VARIABLE
1906             && e->symtree->n.sym->attr.generic
1907             && no_formal_args
1908             && count_specific_procs (e) != 1)
1909         goto cleanup;
1910
1911       if (e->ts.type != BT_PROCEDURE)
1912         {
1913           save_need_full_assumed_size = need_full_assumed_size;
1914           if (e->expr_type != EXPR_VARIABLE)
1915             need_full_assumed_size = 0;
1916           if (!gfc_resolve_expr (e))
1917             goto cleanup;
1918           need_full_assumed_size = save_need_full_assumed_size;
1919           goto argument_list;
1920         }
1921
1922       /* See if the expression node should really be a variable reference.  */
1923
1924       sym = e->symtree->n.sym;
1925
1926       if (sym->attr.flavor == FL_PROCEDURE
1927           || sym->attr.intrinsic
1928           || sym->attr.external)
1929         {
1930           int actual_ok;
1931
1932           /* If a procedure is not already determined to be something else
1933              check if it is intrinsic.  */
1934           if (gfc_is_intrinsic (sym, sym->attr.subroutine, e->where))
1935             sym->attr.intrinsic = 1;
1936
1937           if (sym->attr.proc == PROC_ST_FUNCTION)
1938             {
1939               gfc_error ("Statement function %qs at %L is not allowed as an "
1940                          "actual argument", sym->name, &e->where);
1941             }
1942
1943           actual_ok = gfc_intrinsic_actual_ok (sym->name,
1944                                                sym->attr.subroutine);
1945           if (sym->attr.intrinsic && actual_ok == 0)
1946             {
1947               gfc_error ("Intrinsic %qs at %L is not allowed as an "
1948                          "actual argument", sym->name, &e->where);
1949             }
1950
1951           if (sym->attr.contained && !sym->attr.use_assoc
1952               && sym->ns->proc_name->attr.flavor != FL_MODULE)
1953             {
1954               if (!gfc_notify_std (GFC_STD_F2008, "Internal procedure %qs is"
1955                                    " used as actual argument at %L",
1956                                    sym->name, &e->where))
1957                 goto cleanup;
1958             }
1959
1960           if (sym->attr.elemental && !sym->attr.intrinsic)
1961             {
1962               gfc_error ("ELEMENTAL non-INTRINSIC procedure %qs is not "
1963                          "allowed as an actual argument at %L", sym->name,
1964                          &e->where);
1965             }
1966
1967           /* Check if a generic interface has a specific procedure
1968             with the same name before emitting an error.  */
1969           if (sym->attr.generic && count_specific_procs (e) != 1)
1970             goto cleanup;
1971
1972           /* Just in case a specific was found for the expression.  */
1973           sym = e->symtree->n.sym;
1974
1975           /* If the symbol is the function that names the current (or
1976              parent) scope, then we really have a variable reference.  */
1977
1978           if (gfc_is_function_return_value (sym, sym->ns))
1979             goto got_variable;
1980
1981           /* If all else fails, see if we have a specific intrinsic.  */
1982           if (sym->ts.type == BT_UNKNOWN && sym->attr.intrinsic)
1983             {
1984               gfc_intrinsic_sym *isym;
1985
1986               isym = gfc_find_function (sym->name);
1987               if (isym == NULL || !isym->specific)
1988                 {
1989                   gfc_error ("Unable to find a specific INTRINSIC procedure "
1990                              "for the reference %qs at %L", sym->name,
1991                              &e->where);
1992                   goto cleanup;
1993                 }
1994               sym->ts = isym->ts;
1995               sym->attr.intrinsic = 1;
1996               sym->attr.function = 1;
1997             }
1998
1999           if (!gfc_resolve_expr (e))
2000             goto cleanup;
2001           goto argument_list;
2002         }
2003
2004       /* See if the name is a module procedure in a parent unit.  */
2005
2006       if (was_declared (sym) || sym->ns->parent == NULL)
2007         goto got_variable;
2008
2009       if (gfc_find_sym_tree (sym->name, sym->ns->parent, 1, &parent_st))
2010         {
2011           gfc_error ("Symbol %qs at %L is ambiguous", sym->name, &e->where);
2012           goto cleanup;
2013         }
2014
2015       if (parent_st == NULL)
2016         goto got_variable;
2017
2018       sym = parent_st->n.sym;
2019       e->symtree = parent_st;           /* Point to the right thing.  */
2020
2021       if (sym->attr.flavor == FL_PROCEDURE
2022           || sym->attr.intrinsic
2023           || sym->attr.external)
2024         {
2025           if (!gfc_resolve_expr (e))
2026             goto cleanup;
2027           goto argument_list;
2028         }
2029
2030     got_variable:
2031       e->expr_type = EXPR_VARIABLE;
2032       e->ts = sym->ts;
2033       if ((sym->as != NULL && sym->ts.type != BT_CLASS)
2034           || (sym->ts.type == BT_CLASS && sym->attr.class_ok
2035               && CLASS_DATA (sym)->as))
2036         {
2037           e->rank = sym->ts.type == BT_CLASS
2038                     ? CLASS_DATA (sym)->as->rank : sym->as->rank;
2039           e->ref = gfc_get_ref ();
2040           e->ref->type = REF_ARRAY;
2041           e->ref->u.ar.type = AR_FULL;
2042           e->ref->u.ar.as = sym->ts.type == BT_CLASS
2043                             ? CLASS_DATA (sym)->as : sym->as;
2044         }
2045
2046       /* Expressions are assigned a default ts.type of BT_PROCEDURE in
2047          primary.c (match_actual_arg). If above code determines that it
2048          is a  variable instead, it needs to be resolved as it was not
2049          done at the beginning of this function.  */
2050       save_need_full_assumed_size = need_full_assumed_size;
2051       if (e->expr_type != EXPR_VARIABLE)
2052         need_full_assumed_size = 0;
2053       if (!gfc_resolve_expr (e))
2054         goto cleanup;
2055       need_full_assumed_size = save_need_full_assumed_size;
2056
2057     argument_list:
2058       /* Check argument list functions %VAL, %LOC and %REF.  There is
2059          nothing to do for %REF.  */
2060       if (arg->name && arg->name[0] == '%')
2061         {
2062           if (strcmp ("%VAL", arg->name) == 0)
2063             {
2064               if (e->ts.type == BT_CHARACTER || e->ts.type == BT_DERIVED)
2065                 {
2066                   gfc_error ("By-value argument at %L is not of numeric "
2067                              "type", &e->where);
2068                   goto cleanup;
2069                 }
2070
2071               if (e->rank)
2072                 {
2073                   gfc_error ("By-value argument at %L cannot be an array or "
2074                              "an array section", &e->where);
2075                   goto cleanup;
2076                 }
2077
2078               /* Intrinsics are still PROC_UNKNOWN here.  However,
2079                  since same file external procedures are not resolvable
2080                  in gfortran, it is a good deal easier to leave them to
2081                  intrinsic.c.  */
2082               if (ptype != PROC_UNKNOWN
2083                   && ptype != PROC_DUMMY
2084                   && ptype != PROC_EXTERNAL
2085                   && ptype != PROC_MODULE)
2086                 {
2087                   gfc_error ("By-value argument at %L is not allowed "
2088                              "in this context", &e->where);
2089                   goto cleanup;
2090                 }
2091             }
2092
2093           /* Statement functions have already been excluded above.  */
2094           else if (strcmp ("%LOC", arg->name) == 0
2095                    && e->ts.type == BT_PROCEDURE)
2096             {
2097               if (e->symtree->n.sym->attr.proc == PROC_INTERNAL)
2098                 {
2099                   gfc_error ("Passing internal procedure at %L by location "
2100                              "not allowed", &e->where);
2101                   goto cleanup;
2102                 }
2103             }
2104         }
2105
2106       comp = gfc_get_proc_ptr_comp(e);
2107       if (e->expr_type == EXPR_VARIABLE
2108           && comp && comp->attr.elemental)
2109         {
2110             gfc_error ("ELEMENTAL procedure pointer component %qs is not "
2111                        "allowed as an actual argument at %L", comp->name,
2112                        &e->where);
2113         }
2114
2115       /* Fortran 2008, C1237.  */
2116       if (e->expr_type == EXPR_VARIABLE && gfc_is_coindexed (e)
2117           && gfc_has_ultimate_pointer (e))
2118         {
2119           gfc_error ("Coindexed actual argument at %L with ultimate pointer "
2120                      "component", &e->where);
2121           goto cleanup;
2122         }
2123
2124       first_actual_arg = false;
2125     }
2126
2127   return_value = true;
2128
2129 cleanup:
2130   actual_arg = actual_arg_sav;
2131   first_actual_arg = first_actual_arg_sav;
2132
2133   return return_value;
2134 }
2135
2136
2137 /* Do the checks of the actual argument list that are specific to elemental
2138    procedures.  If called with c == NULL, we have a function, otherwise if
2139    expr == NULL, we have a subroutine.  */
2140
2141 static bool
2142 resolve_elemental_actual (gfc_expr *expr, gfc_code *c)
2143 {
2144   gfc_actual_arglist *arg0;
2145   gfc_actual_arglist *arg;
2146   gfc_symbol *esym = NULL;
2147   gfc_intrinsic_sym *isym = NULL;
2148   gfc_expr *e = NULL;
2149   gfc_intrinsic_arg *iformal = NULL;
2150   gfc_formal_arglist *eformal = NULL;
2151   bool formal_optional = false;
2152   bool set_by_optional = false;
2153   int i;
2154   int rank = 0;
2155
2156   /* Is this an elemental procedure?  */
2157   if (expr && expr->value.function.actual != NULL)
2158     {
2159       if (expr->value.function.esym != NULL
2160           && expr->value.function.esym->attr.elemental)
2161         {
2162           arg0 = expr->value.function.actual;
2163           esym = expr->value.function.esym;
2164         }
2165       else if (expr->value.function.isym != NULL
2166                && expr->value.function.isym->elemental)
2167         {
2168           arg0 = expr->value.function.actual;
2169           isym = expr->value.function.isym;
2170         }
2171       else
2172         return true;
2173     }
2174   else if (c && c->ext.actual != NULL)
2175     {
2176       arg0 = c->ext.actual;
2177
2178       if (c->resolved_sym)
2179         esym = c->resolved_sym;
2180       else
2181         esym = c->symtree->n.sym;
2182       gcc_assert (esym);
2183
2184       if (!esym->attr.elemental)
2185         return true;
2186     }
2187   else
2188     return true;
2189
2190   /* The rank of an elemental is the rank of its array argument(s).  */
2191   for (arg = arg0; arg; arg = arg->next)
2192     {
2193       if (arg->expr != NULL && arg->expr->rank != 0)
2194         {
2195           rank = arg->expr->rank;
2196           if (arg->expr->expr_type == EXPR_VARIABLE
2197               && arg->expr->symtree->n.sym->attr.optional)
2198             set_by_optional = true;
2199
2200           /* Function specific; set the result rank and shape.  */
2201           if (expr)
2202             {
2203               expr->rank = rank;
2204               if (!expr->shape && arg->expr->shape)
2205                 {
2206                   expr->shape = gfc_get_shape (rank);
2207                   for (i = 0; i < rank; i++)
2208                     mpz_init_set (expr->shape[i], arg->expr->shape[i]);
2209                 }
2210             }
2211           break;
2212         }
2213     }
2214
2215   /* If it is an array, it shall not be supplied as an actual argument
2216      to an elemental procedure unless an array of the same rank is supplied
2217      as an actual argument corresponding to a nonoptional dummy argument of
2218      that elemental procedure(12.4.1.5).  */
2219   formal_optional = false;
2220   if (isym)
2221     iformal = isym->formal;
2222   else
2223     eformal = esym->formal;
2224
2225   for (arg = arg0; arg; arg = arg->next)
2226     {
2227       if (eformal)
2228         {
2229           if (eformal->sym && eformal->sym->attr.optional)
2230             formal_optional = true;
2231           eformal = eformal->next;
2232         }
2233       else if (isym && iformal)
2234         {
2235           if (iformal->optional)
2236             formal_optional = true;
2237           iformal = iformal->next;
2238         }
2239       else if (isym)
2240         formal_optional = true;
2241
2242       if (pedantic && arg->expr != NULL
2243           && arg->expr->expr_type == EXPR_VARIABLE
2244           && arg->expr->symtree->n.sym->attr.optional
2245           && formal_optional
2246           && arg->expr->rank
2247           && (set_by_optional || arg->expr->rank != rank)
2248           && !(isym && isym->id == GFC_ISYM_CONVERSION))
2249         {
2250           gfc_warning (OPT_Wpedantic,
2251                        "%qs at %L is an array and OPTIONAL; IF IT IS "
2252                        "MISSING, it cannot be the actual argument of an "
2253                        "ELEMENTAL procedure unless there is a non-optional "
2254                        "argument with the same rank (12.4.1.5)",
2255                        arg->expr->symtree->n.sym->name, &arg->expr->where);
2256         }
2257     }
2258
2259   for (arg = arg0; arg; arg = arg->next)
2260     {
2261       if (arg->expr == NULL || arg->expr->rank == 0)
2262         continue;
2263
2264       /* Being elemental, the last upper bound of an assumed size array
2265          argument must be present.  */
2266       if (resolve_assumed_size_actual (arg->expr))
2267         return false;
2268
2269       /* Elemental procedure's array actual arguments must conform.  */
2270       if (e != NULL)
2271         {
2272           if (!gfc_check_conformance (arg->expr, e, "elemental procedure"))
2273             return false;
2274         }
2275       else
2276         e = arg->expr;
2277     }
2278
2279   /* INTENT(OUT) is only allowed for subroutines; if any actual argument
2280      is an array, the intent inout/out variable needs to be also an array.  */
2281   if (rank > 0 && esym && expr == NULL)
2282     for (eformal = esym->formal, arg = arg0; arg && eformal;
2283          arg = arg->next, eformal = eformal->next)
2284       if ((eformal->sym->attr.intent == INTENT_OUT
2285            || eformal->sym->attr.intent == INTENT_INOUT)
2286           && arg->expr && arg->expr->rank == 0)
2287         {
2288           gfc_error ("Actual argument at %L for INTENT(%s) dummy %qs of "
2289                      "ELEMENTAL subroutine %qs is a scalar, but another "
2290                      "actual argument is an array", &arg->expr->where,
2291                      (eformal->sym->attr.intent == INTENT_OUT) ? "OUT"
2292                      : "INOUT", eformal->sym->name, esym->name);
2293           return false;
2294         }
2295   return true;
2296 }
2297
2298
2299 /* This function does the checking of references to global procedures
2300    as defined in sections 18.1 and 14.1, respectively, of the Fortran
2301    77 and 95 standards.  It checks for a gsymbol for the name, making
2302    one if it does not already exist.  If it already exists, then the
2303    reference being resolved must correspond to the type of gsymbol.
2304    Otherwise, the new symbol is equipped with the attributes of the
2305    reference.  The corresponding code that is called in creating
2306    global entities is parse.c.
2307
2308    In addition, for all but -std=legacy, the gsymbols are used to
2309    check the interfaces of external procedures from the same file.
2310    The namespace of the gsymbol is resolved and then, once this is
2311    done the interface is checked.  */
2312
2313
2314 static bool
2315 not_in_recursive (gfc_symbol *sym, gfc_namespace *gsym_ns)
2316 {
2317   if (!gsym_ns->proc_name->attr.recursive)
2318     return true;
2319
2320   if (sym->ns == gsym_ns)
2321     return false;
2322
2323   if (sym->ns->parent && sym->ns->parent == gsym_ns)
2324     return false;
2325
2326   return true;
2327 }
2328
2329 static bool
2330 not_entry_self_reference  (gfc_symbol *sym, gfc_namespace *gsym_ns)
2331 {
2332   if (gsym_ns->entries)
2333     {
2334       gfc_entry_list *entry = gsym_ns->entries;
2335
2336       for (; entry; entry = entry->next)
2337         {
2338           if (strcmp (sym->name, entry->sym->name) == 0)
2339             {
2340               if (strcmp (gsym_ns->proc_name->name,
2341                           sym->ns->proc_name->name) == 0)
2342                 return false;
2343
2344               if (sym->ns->parent
2345                   && strcmp (gsym_ns->proc_name->name,
2346                              sym->ns->parent->proc_name->name) == 0)
2347                 return false;
2348             }
2349         }
2350     }
2351   return true;
2352 }
2353
2354
2355 /* Check for the requirement of an explicit interface. F08:12.4.2.2.  */
2356
2357 bool
2358 gfc_explicit_interface_required (gfc_symbol *sym, char *errmsg, int err_len)
2359 {
2360   gfc_formal_arglist *arg = gfc_sym_get_dummy_args (sym);
2361
2362   for ( ; arg; arg = arg->next)
2363     {
2364       if (!arg->sym)
2365         continue;
2366
2367       if (arg->sym->attr.allocatable)  /* (2a)  */
2368         {
2369           strncpy (errmsg, _("allocatable argument"), err_len);
2370           return true;
2371         }
2372       else if (arg->sym->attr.asynchronous)
2373         {
2374           strncpy (errmsg, _("asynchronous argument"), err_len);
2375           return true;
2376         }
2377       else if (arg->sym->attr.optional)
2378         {
2379           strncpy (errmsg, _("optional argument"), err_len);
2380           return true;
2381         }
2382       else if (arg->sym->attr.pointer)
2383         {
2384           strncpy (errmsg, _("pointer argument"), err_len);
2385           return true;
2386         }
2387       else if (arg->sym->attr.target)
2388         {
2389           strncpy (errmsg, _("target argument"), err_len);
2390           return true;
2391         }
2392       else if (arg->sym->attr.value)
2393         {
2394           strncpy (errmsg, _("value argument"), err_len);
2395           return true;
2396         }
2397       else if (arg->sym->attr.volatile_)
2398         {
2399           strncpy (errmsg, _("volatile argument"), err_len);
2400           return true;
2401         }
2402       else if (arg->sym->as && arg->sym->as->type == AS_ASSUMED_SHAPE)  /* (2b)  */
2403         {
2404           strncpy (errmsg, _("assumed-shape argument"), err_len);
2405           return true;
2406         }
2407       else if (arg->sym->as && arg->sym->as->type == AS_ASSUMED_RANK)  /* TS 29113, 6.2.  */
2408         {
2409           strncpy (errmsg, _("assumed-rank argument"), err_len);
2410           return true;
2411         }
2412       else if (arg->sym->attr.codimension)  /* (2c)  */
2413         {
2414           strncpy (errmsg, _("coarray argument"), err_len);
2415           return true;
2416         }
2417       else if (false)  /* (2d) TODO: parametrized derived type  */
2418         {
2419           strncpy (errmsg, _("parametrized derived type argument"), err_len);
2420           return true;
2421         }
2422       else if (arg->sym->ts.type == BT_CLASS)  /* (2e)  */
2423         {
2424           strncpy (errmsg, _("polymorphic argument"), err_len);
2425           return true;
2426         }
2427       else if (arg->sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
2428         {
2429           strncpy (errmsg, _("NO_ARG_CHECK attribute"), err_len);
2430           return true;
2431         }
2432       else if (arg->sym->ts.type == BT_ASSUMED)
2433         {
2434           /* As assumed-type is unlimited polymorphic (cf. above).
2435              See also TS 29113, Note 6.1.  */
2436           strncpy (errmsg, _("assumed-type argument"), err_len);
2437           return true;
2438         }
2439     }
2440
2441   if (sym->attr.function)
2442     {
2443       gfc_symbol *res = sym->result ? sym->result : sym;
2444
2445       if (res->attr.dimension)  /* (3a)  */
2446         {
2447           strncpy (errmsg, _("array result"), err_len);
2448           return true;
2449         }
2450       else if (res->attr.pointer || res->attr.allocatable)  /* (3b)  */
2451         {
2452           strncpy (errmsg, _("pointer or allocatable result"), err_len);
2453           return true;
2454         }
2455       else if (res->ts.type == BT_CHARACTER && res->ts.u.cl
2456                && res->ts.u.cl->length
2457                && res->ts.u.cl->length->expr_type != EXPR_CONSTANT)  /* (3c)  */
2458         {
2459           strncpy (errmsg, _("result with non-constant character length"), err_len);
2460           return true;
2461         }
2462     }
2463
2464   if (sym->attr.elemental && !sym->attr.intrinsic)  /* (4)  */
2465     {
2466       strncpy (errmsg, _("elemental procedure"), err_len);
2467       return true;
2468     }
2469   else if (sym->attr.is_bind_c)  /* (5)  */
2470     {
2471       strncpy (errmsg, _("bind(c) procedure"), err_len);
2472       return true;
2473     }
2474
2475   return false;
2476 }
2477
2478
2479 static void
2480 resolve_global_procedure (gfc_symbol *sym, locus *where,
2481                           gfc_actual_arglist **actual, int sub)
2482 {
2483   gfc_gsymbol * gsym;
2484   gfc_namespace *ns;
2485   enum gfc_symbol_type type;
2486   char reason[200];
2487
2488   type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
2489
2490   gsym = gfc_get_gsymbol (sym->binding_label ? sym->binding_label : sym->name,
2491                           sym->binding_label != NULL);
2492
2493   if ((gsym->type != GSYM_UNKNOWN && gsym->type != type))
2494     gfc_global_used (gsym, where);
2495
2496   if ((sym->attr.if_source == IFSRC_UNKNOWN
2497        || sym->attr.if_source == IFSRC_IFBODY)
2498       && gsym->type != GSYM_UNKNOWN
2499       && !gsym->binding_label
2500       && gsym->ns
2501       && gsym->ns->resolved != -1
2502       && gsym->ns->proc_name
2503       && not_in_recursive (sym, gsym->ns)
2504       && not_entry_self_reference (sym, gsym->ns))
2505     {
2506       gfc_symbol *def_sym;
2507
2508       /* Resolve the gsymbol namespace if needed.  */
2509       if (!gsym->ns->resolved)
2510         {
2511           gfc_symbol *old_dt_list;
2512
2513           /* Stash away derived types so that the backend_decls do not
2514              get mixed up.  */
2515           old_dt_list = gfc_derived_types;
2516           gfc_derived_types = NULL;
2517
2518           gfc_resolve (gsym->ns);
2519
2520           /* Store the new derived types with the global namespace.  */
2521           if (gfc_derived_types)
2522             gsym->ns->derived_types = gfc_derived_types;
2523
2524           /* Restore the derived types of this namespace.  */
2525           gfc_derived_types = old_dt_list;
2526         }
2527
2528       /* Make sure that translation for the gsymbol occurs before
2529          the procedure currently being resolved.  */
2530       ns = gfc_global_ns_list;
2531       for (; ns && ns != gsym->ns; ns = ns->sibling)
2532         {
2533           if (ns->sibling == gsym->ns)
2534             {
2535               ns->sibling = gsym->ns->sibling;
2536               gsym->ns->sibling = gfc_global_ns_list;
2537               gfc_global_ns_list = gsym->ns;
2538               break;
2539             }
2540         }
2541
2542       def_sym = gsym->ns->proc_name;
2543
2544       /* This can happen if a binding name has been specified.  */
2545       if (gsym->binding_label && gsym->sym_name != def_sym->name)
2546         gfc_find_symbol (gsym->sym_name, gsym->ns, 0, &def_sym);
2547
2548       if (def_sym->attr.entry_master)
2549         {
2550           gfc_entry_list *entry;
2551           for (entry = gsym->ns->entries; entry; entry = entry->next)
2552             if (strcmp (entry->sym->name, sym->name) == 0)
2553               {
2554                 def_sym = entry->sym;
2555                 break;
2556               }
2557         }
2558
2559       if (sym->attr.function && !gfc_compare_types (&sym->ts, &def_sym->ts))
2560         {
2561           gfc_error ("Return type mismatch of function %qs at %L (%s/%s)",
2562                      sym->name, &sym->declared_at, gfc_typename (&sym->ts),
2563                      gfc_typename (&def_sym->ts));
2564           goto done;
2565         }
2566
2567       if (sym->attr.if_source == IFSRC_UNKNOWN
2568           && gfc_explicit_interface_required (def_sym, reason, sizeof(reason)))
2569         {
2570           gfc_error ("Explicit interface required for %qs at %L: %s",
2571                      sym->name, &sym->declared_at, reason);
2572           goto done;
2573         }
2574
2575       if (!pedantic && (gfc_option.allow_std & GFC_STD_GNU))
2576         /* Turn erros into warnings with -std=gnu and -std=legacy.  */
2577         gfc_errors_to_warnings (true);
2578
2579       if (!gfc_compare_interfaces (sym, def_sym, sym->name, 0, 1,
2580                                    reason, sizeof(reason), NULL, NULL))
2581         {
2582           gfc_error_opt (OPT_Wargument_mismatch,
2583                          "Interface mismatch in global procedure %qs at %L:"
2584                          " %s", sym->name, &sym->declared_at, reason);
2585           goto done;
2586         }
2587
2588       if (!pedantic
2589           || ((gfc_option.warn_std & GFC_STD_LEGACY)
2590               && !(gfc_option.warn_std & GFC_STD_GNU)))
2591         gfc_errors_to_warnings (true);
2592
2593       if (sym->attr.if_source != IFSRC_IFBODY)
2594         gfc_procedure_use (def_sym, actual, where);
2595     }
2596
2597 done:
2598   gfc_errors_to_warnings (false);
2599
2600   if (gsym->type == GSYM_UNKNOWN)
2601     {
2602       gsym->type = type;
2603       gsym->where = *where;
2604     }
2605
2606   gsym->used = 1;
2607 }
2608
2609
2610 /************* Function resolution *************/
2611
2612 /* Resolve a function call known to be generic.
2613    Section 14.1.2.4.1.  */
2614
2615 static match
2616 resolve_generic_f0 (gfc_expr *expr, gfc_symbol *sym)
2617 {
2618   gfc_symbol *s;
2619
2620   if (sym->attr.generic)
2621     {
2622       s = gfc_search_interface (sym->generic, 0, &expr->value.function.actual);
2623       if (s != NULL)
2624         {
2625           expr->value.function.name = s->name;
2626           expr->value.function.esym = s;
2627
2628           if (s->ts.type != BT_UNKNOWN)
2629             expr->ts = s->ts;
2630           else if (s->result != NULL && s->result->ts.type != BT_UNKNOWN)
2631             expr->ts = s->result->ts;
2632
2633           if (s->as != NULL)
2634             expr->rank = s->as->rank;
2635           else if (s->result != NULL && s->result->as != NULL)
2636             expr->rank = s->result->as->rank;
2637
2638           gfc_set_sym_referenced (expr->value.function.esym);
2639
2640           return MATCH_YES;
2641         }
2642
2643       /* TODO: Need to search for elemental references in generic
2644          interface.  */
2645     }
2646
2647   if (sym->attr.intrinsic)
2648     return gfc_intrinsic_func_interface (expr, 0);
2649
2650   return MATCH_NO;
2651 }
2652
2653
2654 static bool
2655 resolve_generic_f (gfc_expr *expr)
2656 {
2657   gfc_symbol *sym;
2658   match m;
2659   gfc_interface *intr = NULL;
2660
2661   sym = expr->symtree->n.sym;
2662
2663   for (;;)
2664     {
2665       m = resolve_generic_f0 (expr, sym);
2666       if (m == MATCH_YES)
2667         return true;
2668       else if (m == MATCH_ERROR)
2669         return false;
2670
2671 generic:
2672       if (!intr)
2673         for (intr = sym->generic; intr; intr = intr->next)
2674           if (gfc_fl_struct (intr->sym->attr.flavor))
2675             break;
2676
2677       if (sym->ns->parent == NULL)
2678         break;
2679       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
2680
2681       if (sym == NULL)
2682         break;
2683       if (!generic_sym (sym))
2684         goto generic;
2685     }
2686
2687   /* Last ditch attempt.  See if the reference is to an intrinsic
2688      that possesses a matching interface.  14.1.2.4  */
2689   if (sym  && !intr && !gfc_is_intrinsic (sym, 0, expr->where))
2690     {
2691       if (gfc_init_expr_flag)
2692         gfc_error ("Function %qs in initialization expression at %L "
2693                    "must be an intrinsic function",
2694                    expr->symtree->n.sym->name, &expr->where);
2695       else
2696         gfc_error ("There is no specific function for the generic %qs "
2697                    "at %L", expr->symtree->n.sym->name, &expr->where);
2698       return false;
2699     }
2700
2701   if (intr)
2702     {
2703       if (!gfc_convert_to_structure_constructor (expr, intr->sym, NULL,
2704                                                  NULL, false))
2705         return false;
2706       if (!gfc_use_derived (expr->ts.u.derived))
2707         return false;
2708       return resolve_structure_cons (expr, 0);
2709     }
2710
2711   m = gfc_intrinsic_func_interface (expr, 0);
2712   if (m == MATCH_YES)
2713     return true;
2714
2715   if (m == MATCH_NO)
2716     gfc_error ("Generic function %qs at %L is not consistent with a "
2717                "specific intrinsic interface", expr->symtree->n.sym->name,
2718                &expr->where);
2719
2720   return false;
2721 }
2722
2723
2724 /* Resolve a function call known to be specific.  */
2725
2726 static match
2727 resolve_specific_f0 (gfc_symbol *sym, gfc_expr *expr)
2728 {
2729   match m;
2730
2731   if (sym->attr.external || sym->attr.if_source == IFSRC_IFBODY)
2732     {
2733       if (sym->attr.dummy)
2734         {
2735           sym->attr.proc = PROC_DUMMY;
2736           goto found;
2737         }
2738
2739       sym->attr.proc = PROC_EXTERNAL;
2740       goto found;
2741     }
2742
2743   if (sym->attr.proc == PROC_MODULE
2744       || sym->attr.proc == PROC_ST_FUNCTION
2745       || sym->attr.proc == PROC_INTERNAL)
2746     goto found;
2747
2748   if (sym->attr.intrinsic)
2749     {
2750       m = gfc_intrinsic_func_interface (expr, 1);
2751       if (m == MATCH_YES)
2752         return MATCH_YES;
2753       if (m == MATCH_NO)
2754         gfc_error ("Function %qs at %L is INTRINSIC but is not compatible "
2755                    "with an intrinsic", sym->name, &expr->where);
2756
2757       return MATCH_ERROR;
2758     }
2759
2760   return MATCH_NO;
2761
2762 found:
2763   gfc_procedure_use (sym, &expr->value.function.actual, &expr->where);
2764
2765   if (sym->result)
2766     expr->ts = sym->result->ts;
2767   else
2768     expr->ts = sym->ts;
2769   expr->value.function.name = sym->name;
2770   expr->value.function.esym = sym;
2771   /* Prevent crash when sym->ts.u.derived->components is not set due to previous
2772      error(s).  */
2773   if (sym->ts.type == BT_CLASS && !CLASS_DATA (sym))
2774     return MATCH_ERROR;
2775   if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as)
2776     expr->rank = CLASS_DATA (sym)->as->rank;
2777   else if (sym->as != NULL)
2778     expr->rank = sym->as->rank;
2779
2780   return MATCH_YES;
2781 }
2782
2783
2784 static bool
2785 resolve_specific_f (gfc_expr *expr)
2786 {
2787   gfc_symbol *sym;
2788   match m;
2789
2790   sym = expr->symtree->n.sym;
2791
2792   for (;;)
2793     {
2794       m = resolve_specific_f0 (sym, expr);
2795       if (m == MATCH_YES)
2796         return true;
2797       if (m == MATCH_ERROR)
2798         return false;
2799
2800       if (sym->ns->parent == NULL)
2801         break;
2802
2803       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
2804
2805       if (sym == NULL)
2806         break;
2807     }
2808
2809   gfc_error ("Unable to resolve the specific function %qs at %L",
2810              expr->symtree->n.sym->name, &expr->where);
2811
2812   return true;
2813 }
2814
2815 /* Recursively append candidate SYM to CANDIDATES.  Store the number of
2816    candidates in CANDIDATES_LEN.  */
2817
2818 static void
2819 lookup_function_fuzzy_find_candidates (gfc_symtree *sym,
2820                                        char **&candidates,
2821                                        size_t &candidates_len)
2822 {
2823   gfc_symtree *p;
2824
2825   if (sym == NULL)
2826     return;
2827   if ((sym->n.sym->ts.type != BT_UNKNOWN || sym->n.sym->attr.external)
2828       && sym->n.sym->attr.flavor == FL_PROCEDURE)
2829     vec_push (candidates, candidates_len, sym->name);
2830
2831   p = sym->left;
2832   if (p)
2833     lookup_function_fuzzy_find_candidates (p, candidates, candidates_len);
2834
2835   p = sym->right;
2836   if (p)
2837     lookup_function_fuzzy_find_candidates (p, candidates, candidates_len);
2838 }
2839
2840
2841 /* Lookup function FN fuzzily, taking names in SYMROOT into account.  */
2842
2843 const char*
2844 gfc_lookup_function_fuzzy (const char *fn, gfc_symtree *symroot)
2845 {
2846   char **candidates = NULL;
2847   size_t candidates_len = 0;
2848   lookup_function_fuzzy_find_candidates (symroot, candidates, candidates_len);
2849   return gfc_closest_fuzzy_match (fn, candidates);
2850 }
2851
2852
2853 /* Resolve a procedure call not known to be generic nor specific.  */
2854
2855 static bool
2856 resolve_unknown_f (gfc_expr *expr)
2857 {
2858   gfc_symbol *sym;
2859   gfc_typespec *ts;
2860
2861   sym = expr->symtree->n.sym;
2862
2863   if (sym->attr.dummy)
2864     {
2865       sym->attr.proc = PROC_DUMMY;
2866       expr->value.function.name = sym->name;
2867       goto set_type;
2868     }
2869
2870   /* See if we have an intrinsic function reference.  */
2871
2872   if (gfc_is_intrinsic (sym, 0, expr->where))
2873     {
2874       if (gfc_intrinsic_func_interface (expr, 1) == MATCH_YES)
2875         return true;
2876       return false;
2877     }
2878
2879   /* The reference is to an external name.  */
2880
2881   sym->attr.proc = PROC_EXTERNAL;
2882   expr->value.function.name = sym->name;
2883   expr->value.function.esym = expr->symtree->n.sym;
2884
2885   if (sym->as != NULL)
2886     expr->rank = sym->as->rank;
2887
2888   /* Type of the expression is either the type of the symbol or the
2889      default type of the symbol.  */
2890
2891 set_type:
2892   gfc_procedure_use (sym, &expr->value.function.actual, &expr->where);
2893
2894   if (sym->ts.type != BT_UNKNOWN)
2895     expr->ts = sym->ts;
2896   else
2897     {
2898       ts = gfc_get_default_type (sym->name, sym->ns);
2899
2900       if (ts->type == BT_UNKNOWN)
2901         {
2902           const char *guessed
2903             = gfc_lookup_function_fuzzy (sym->name, sym->ns->sym_root);
2904           if (guessed)
2905             gfc_error ("Function %qs at %L has no IMPLICIT type"
2906                        "; did you mean %qs?",
2907                        sym->name, &expr->where, guessed);
2908           else
2909             gfc_error ("Function %qs at %L has no IMPLICIT type",
2910                        sym->name, &expr->where);
2911           return false;
2912         }
2913       else
2914         expr->ts = *ts;
2915     }
2916
2917   return true;
2918 }
2919
2920
2921 /* Return true, if the symbol is an external procedure.  */
2922 static bool
2923 is_external_proc (gfc_symbol *sym)
2924 {
2925   if (!sym->attr.dummy && !sym->attr.contained
2926         && !gfc_is_intrinsic (sym, sym->attr.subroutine, sym->declared_at)
2927         && sym->attr.proc != PROC_ST_FUNCTION
2928         && !sym->attr.proc_pointer
2929         && !sym->attr.use_assoc
2930         && sym->name)
2931     return true;
2932
2933   return false;
2934 }
2935
2936
2937 /* Figure out if a function reference is pure or not.  Also set the name
2938    of the function for a potential error message.  Return nonzero if the
2939    function is PURE, zero if not.  */
2940 static int
2941 pure_stmt_function (gfc_expr *, gfc_symbol *);
2942
2943 int
2944 gfc_pure_function (gfc_expr *e, const char **name)
2945 {
2946   int pure;
2947   gfc_component *comp;
2948
2949   *name = NULL;
2950
2951   if (e->symtree != NULL
2952         && e->symtree->n.sym != NULL
2953         && e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
2954     return pure_stmt_function (e, e->symtree->n.sym);
2955
2956   comp = gfc_get_proc_ptr_comp (e);
2957   if (comp)
2958     {
2959       pure = gfc_pure (comp->ts.interface);
2960       *name = comp->name;
2961     }
2962   else if (e->value.function.esym)
2963     {
2964       pure = gfc_pure (e->value.function.esym);
2965       *name = e->value.function.esym->name;
2966     }
2967   else if (e->value.function.isym)
2968     {
2969       pure = e->value.function.isym->pure
2970              || e->value.function.isym->elemental;
2971       *name = e->value.function.isym->name;
2972     }
2973   else
2974     {
2975       /* Implicit functions are not pure.  */
2976       pure = 0;
2977       *name = e->value.function.name;
2978     }
2979
2980   return pure;
2981 }
2982
2983
2984 /* Check if the expression is a reference to an implicitly pure function.  */
2985
2986 int
2987 gfc_implicit_pure_function (gfc_expr *e)
2988 {
2989   gfc_component *comp = gfc_get_proc_ptr_comp (e);
2990   if (comp)
2991     return gfc_implicit_pure (comp->ts.interface);
2992   else if (e->value.function.esym)
2993     return gfc_implicit_pure (e->value.function.esym);
2994   else
2995     return 0;
2996 }
2997
2998
2999 static bool
3000 impure_stmt_fcn (gfc_expr *e, gfc_symbol *sym,
3001                  int *f ATTRIBUTE_UNUSED)
3002 {
3003   const char *name;
3004
3005   /* Don't bother recursing into other statement functions
3006      since they will be checked individually for purity.  */
3007   if (e->expr_type != EXPR_FUNCTION
3008         || !e->symtree
3009         || e->symtree->n.sym == sym
3010         || e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
3011     return false;
3012
3013   return gfc_pure_function (e, &name) ? false : true;
3014 }
3015
3016
3017 static int
3018 pure_stmt_function (gfc_expr *e, gfc_symbol *sym)
3019 {
3020   return gfc_traverse_expr (e, sym, impure_stmt_fcn, 0) ? 0 : 1;
3021 }
3022
3023
3024 /* Check if an impure function is allowed in the current context. */
3025
3026 static bool check_pure_function (gfc_expr *e)
3027 {
3028   const char *name = NULL;
3029   if (!gfc_pure_function (e, &name) && name)
3030     {
3031       if (forall_flag)
3032         {
3033           gfc_error ("Reference to impure function %qs at %L inside a "
3034                      "FORALL %s", name, &e->where,
3035                      forall_flag == 2 ? "mask" : "block");
3036           return false;
3037         }
3038       else if (gfc_do_concurrent_flag)
3039         {
3040           gfc_error ("Reference to impure function %qs at %L inside a "
3041                      "DO CONCURRENT %s", name, &e->where,
3042                      gfc_do_concurrent_flag == 2 ? "mask" : "block");
3043           return false;
3044         }
3045       else if (gfc_pure (NULL))
3046         {
3047           gfc_error ("Reference to impure function %qs at %L "
3048                      "within a PURE procedure", name, &e->where);
3049           return false;
3050         }
3051       if (!gfc_implicit_pure_function (e))
3052         gfc_unset_implicit_pure (NULL);
3053     }
3054   return true;
3055 }
3056
3057
3058 /* Update current procedure's array_outer_dependency flag, considering
3059    a call to procedure SYM.  */
3060
3061 static void
3062 update_current_proc_array_outer_dependency (gfc_symbol *sym)
3063 {
3064   /* Check to see if this is a sibling function that has not yet
3065      been resolved.  */
3066   gfc_namespace *sibling = gfc_current_ns->sibling;
3067   for (; sibling; sibling = sibling->sibling)
3068     {
3069       if (sibling->proc_name == sym)
3070         {
3071           gfc_resolve (sibling);
3072           break;
3073         }
3074     }
3075
3076   /* If SYM has references to outer arrays, so has the procedure calling
3077      SYM.  If SYM is a procedure pointer, we can assume the worst.  */
3078   if ((sym->attr.array_outer_dependency || sym->attr.proc_pointer)
3079       && gfc_current_ns->proc_name)
3080     gfc_current_ns->proc_name->attr.array_outer_dependency = 1;
3081 }
3082
3083
3084 /* Resolve a function call, which means resolving the arguments, then figuring
3085    out which entity the name refers to.  */
3086
3087 static bool
3088 resolve_function (gfc_expr *expr)
3089 {
3090   gfc_actual_arglist *arg;
3091   gfc_symbol *sym;
3092   bool t;
3093   int temp;
3094   procedure_type p = PROC_INTRINSIC;
3095   bool no_formal_args;
3096
3097   sym = NULL;
3098   if (expr->symtree)
3099     sym = expr->symtree->n.sym;
3100
3101   /* If this is a procedure pointer component, it has already been resolved.  */
3102   if (gfc_is_proc_ptr_comp (expr))
3103     return true;
3104
3105   /* Avoid re-resolving the arguments of caf_get, which can lead to inserting
3106      another caf_get.  */
3107   if (sym && sym->attr.intrinsic
3108       && (sym->intmod_sym_id == GFC_ISYM_CAF_GET
3109           || sym->intmod_sym_id == GFC_ISYM_CAF_SEND))
3110     return true;
3111
3112   if (sym && sym->attr.intrinsic
3113       && !gfc_resolve_intrinsic (sym, &expr->where))
3114     return false;
3115
3116   if (sym && (sym->attr.flavor == FL_VARIABLE || sym->attr.subroutine))
3117     {
3118       gfc_error ("%qs at %L is not a function", sym->name, &expr->where);
3119       return false;
3120     }
3121
3122   /* If this is a deferred TBP with an abstract interface (which may
3123      of course be referenced), expr->value.function.esym will be set.  */
3124   if (sym && sym->attr.abstract && !expr->value.function.esym)
3125     {
3126       gfc_error ("ABSTRACT INTERFACE %qs must not be referenced at %L",
3127                  sym->name, &expr->where);
3128       return false;
3129     }
3130
3131   /* If this is a deferred TBP with an abstract interface, its result
3132      cannot be an assumed length character (F2003: C418).  */
3133   if (sym && sym->attr.abstract && sym->attr.function
3134       && sym->result->ts.u.cl
3135       && sym->result->ts.u.cl->length == NULL
3136       && !sym->result->ts.deferred)
3137     {
3138       gfc_error ("ABSTRACT INTERFACE %qs at %L must not have an assumed "
3139                  "character length result (F2008: C418)", sym->name,
3140                  &sym->declared_at);
3141       return false;
3142     }
3143
3144   /* Switch off assumed size checking and do this again for certain kinds
3145      of procedure, once the procedure itself is resolved.  */
3146   need_full_assumed_size++;
3147
3148   if (expr->symtree && expr->symtree->n.sym)
3149     p = expr->symtree->n.sym->attr.proc;
3150
3151   if (expr->value.function.isym && expr->value.function.isym->inquiry)
3152     inquiry_argument = true;
3153   no_formal_args = sym && is_external_proc (sym)
3154                        && gfc_sym_get_dummy_args (sym) == NULL;
3155
3156   if (!resolve_actual_arglist (expr->value.function.actual,
3157                                p, no_formal_args))
3158     {
3159       inquiry_argument = false;
3160       return false;
3161     }
3162
3163   inquiry_argument = false;
3164
3165   /* Resume assumed_size checking.  */
3166   need_full_assumed_size--;
3167
3168   /* If the procedure is external, check for usage.  */
3169   if (sym && is_external_proc (sym))
3170     resolve_global_procedure (sym, &expr->where,
3171                               &expr->value.function.actual, 0);
3172
3173   if (sym && sym->ts.type == BT_CHARACTER
3174       && sym->ts.u.cl
3175       && sym->ts.u.cl->length == NULL
3176       && !sym->attr.dummy
3177       && !sym->ts.deferred
3178       && expr->value.function.esym == NULL
3179       && !sym->attr.contained)
3180     {
3181       /* Internal procedures are taken care of in resolve_contained_fntype.  */
3182       gfc_error ("Function %qs is declared CHARACTER(*) and cannot "
3183                  "be used at %L since it is not a dummy argument",
3184                  sym->name, &expr->where);
3185       return false;
3186     }
3187
3188   /* See if function is already resolved.  */
3189
3190   if (expr->value.function.name != NULL
3191       || expr->value.function.isym != NULL)
3192     {
3193       if (expr->ts.type == BT_UNKNOWN)
3194         expr->ts = sym->ts;
3195       t = true;
3196     }
3197   else
3198     {
3199       /* Apply the rules of section 14.1.2.  */
3200
3201       switch (procedure_kind (sym))
3202         {
3203         case PTYPE_GENERIC:
3204           t = resolve_generic_f (expr);
3205           break;
3206
3207         case PTYPE_SPECIFIC:
3208           t = resolve_specific_f (expr);
3209           break;
3210
3211         case PTYPE_UNKNOWN:
3212           t = resolve_unknown_f (expr);
3213           break;
3214
3215         default:
3216           gfc_internal_error ("resolve_function(): bad function type");
3217         }
3218     }
3219
3220   /* If the expression is still a function (it might have simplified),
3221      then we check to see if we are calling an elemental function.  */
3222
3223   if (expr->expr_type != EXPR_FUNCTION)
3224     return t;
3225
3226   temp = need_full_assumed_size;
3227   need_full_assumed_size = 0;
3228
3229   if (!resolve_elemental_actual (expr, NULL))
3230     return false;
3231
3232   if (omp_workshare_flag
3233       && expr->value.function.esym
3234       && ! gfc_elemental (expr->value.function.esym))
3235     {
3236       gfc_error ("User defined non-ELEMENTAL function %qs at %L not allowed "
3237                  "in WORKSHARE construct", expr->value.function.esym->name,
3238                  &expr->where);
3239       t = false;
3240     }
3241
3242 #define GENERIC_ID expr->value.function.isym->id
3243   else if (expr->value.function.actual != NULL
3244            && expr->value.function.isym != NULL
3245            && GENERIC_ID != GFC_ISYM_LBOUND
3246            && GENERIC_ID != GFC_ISYM_LCOBOUND
3247            && GENERIC_ID != GFC_ISYM_UCOBOUND
3248            && GENERIC_ID != GFC_ISYM_LEN
3249            && GENERIC_ID != GFC_ISYM_LOC
3250            && GENERIC_ID != GFC_ISYM_C_LOC
3251            && GENERIC_ID != GFC_ISYM_PRESENT)
3252     {
3253       /* Array intrinsics must also have the last upper bound of an
3254          assumed size array argument.  UBOUND and SIZE have to be
3255          excluded from the check if the second argument is anything
3256          than a constant.  */
3257
3258       for (arg = expr->value.function.actual; arg; arg = arg->next)
3259         {
3260           if ((GENERIC_ID == GFC_ISYM_UBOUND || GENERIC_ID == GFC_ISYM_SIZE)
3261               && arg == expr->value.function.actual
3262               && arg->next != NULL && arg->next->expr)
3263             {
3264               if (arg->next->expr->expr_type != EXPR_CONSTANT)
3265                 break;
3266
3267               if (arg->next->name && strcmp (arg->next->name, "kind") == 0)
3268                 break;
3269
3270               if ((int)mpz_get_si (arg->next->expr->value.integer)
3271                         < arg->expr->rank)
3272                 break;
3273             }
3274
3275           if (arg->expr != NULL
3276               && arg->expr->rank > 0
3277               && resolve_assumed_size_actual (arg->expr))
3278             return false;
3279         }
3280     }
3281 #undef GENERIC_ID
3282
3283   need_full_assumed_size = temp;
3284
3285   if (!check_pure_function(expr))
3286     t = false;
3287
3288   /* Functions without the RECURSIVE attribution are not allowed to
3289    * call themselves.  */
3290   if (expr->value.function.esym && !expr->value.function.esym->attr.recursive)
3291     {
3292       gfc_symbol *esym;
3293       esym = expr->value.function.esym;
3294
3295       if (is_illegal_recursion (esym, gfc_current_ns))
3296       {
3297         if (esym->attr.entry && esym->ns->entries)
3298           gfc_error ("ENTRY %qs at %L cannot be called recursively, as"
3299                      " function %qs is not RECURSIVE",
3300                      esym->name, &expr->where, esym->ns->entries->sym->name);
3301         else
3302           gfc_error ("Function %qs at %L cannot be called recursively, as it"
3303                      " is not RECURSIVE", esym->name, &expr->where);
3304
3305         t = false;
3306       }
3307     }
3308
3309   /* Character lengths of use associated functions may contains references to
3310      symbols not referenced from the current program unit otherwise.  Make sure
3311      those symbols are marked as referenced.  */
3312
3313   if (expr->ts.type == BT_CHARACTER && expr->value.function.esym
3314       && expr->value.function.esym->attr.use_assoc)
3315     {
3316       gfc_expr_set_symbols_referenced (expr->ts.u.cl->length);
3317     }
3318
3319   /* Make sure that the expression has a typespec that works.  */
3320   if (expr->ts.type == BT_UNKNOWN)
3321     {
3322       if (expr->symtree->n.sym->result
3323             && expr->symtree->n.sym->result->ts.type != BT_UNKNOWN
3324             && !expr->symtree->n.sym->result->attr.proc_pointer)
3325         expr->ts = expr->symtree->n.sym->result->ts;
3326     }
3327
3328   if (!expr->ref && !expr->value.function.isym)
3329     {
3330       if (expr->value.function.esym)
3331         update_current_proc_array_outer_dependency (expr->value.function.esym);
3332       else
3333         update_current_proc_array_outer_dependency (sym);
3334     }
3335   else if (expr->ref)
3336     /* typebound procedure: Assume the worst.  */
3337     gfc_current_ns->proc_name->attr.array_outer_dependency = 1;
3338
3339   return t;
3340 }
3341
3342
3343 /************* Subroutine resolution *************/
3344
3345 static bool
3346 pure_subroutine (gfc_symbol *sym, const char *name, locus *loc)
3347 {
3348   if (gfc_pure (sym))
3349     return true;
3350
3351   if (forall_flag)
3352     {
3353       gfc_error ("Subroutine call to %qs in FORALL block at %L is not PURE",
3354                  name, loc);
3355       return false;
3356     }
3357   else if (gfc_do_concurrent_flag)
3358     {
3359       gfc_error ("Subroutine call to %qs in DO CONCURRENT block at %L is not "
3360                  "PURE", name, loc);
3361       return false;
3362     }
3363   else if (gfc_pure (NULL))
3364     {
3365       gfc_error ("Subroutine call to %qs at %L is not PURE", name, loc);
3366       return false;
3367     }
3368
3369   gfc_unset_implicit_pure (NULL);
3370   return true;
3371 }
3372
3373
3374 static match
3375 resolve_generic_s0 (gfc_code *c, gfc_symbol *sym)
3376 {
3377   gfc_symbol *s;
3378
3379   if (sym->attr.generic)
3380     {
3381       s = gfc_search_interface (sym->generic, 1, &c->ext.actual);
3382       if (s != NULL)
3383         {
3384           c->resolved_sym = s;
3385           if (!pure_subroutine (s, s->name, &c->loc))
3386             return MATCH_ERROR;
3387           return MATCH_YES;
3388         }
3389
3390       /* TODO: Need to search for elemental references in generic interface.  */
3391     }
3392
3393   if (sym->attr.intrinsic)
3394     return gfc_intrinsic_sub_interface (c, 0);
3395
3396   return MATCH_NO;
3397 }
3398
3399
3400 static bool
3401 resolve_generic_s (gfc_code *c)
3402 {
3403   gfc_symbol *sym;
3404   match m;
3405
3406   sym = c->symtree->n.sym;
3407
3408   for (;;)
3409     {
3410       m = resolve_generic_s0 (c, sym);
3411       if (m == MATCH_YES)
3412         return true;
3413       else if (m == MATCH_ERROR)
3414         return false;
3415
3416 generic:
3417       if (sym->ns->parent == NULL)
3418         break;
3419       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
3420
3421       if (sym == NULL)
3422         break;
3423       if (!generic_sym (sym))
3424         goto generic;
3425     }
3426
3427   /* Last ditch attempt.  See if the reference is to an intrinsic
3428      that possesses a matching interface.  14.1.2.4  */
3429   sym = c->symtree->n.sym;
3430
3431   if (!gfc_is_intrinsic (sym, 1, c->loc))
3432     {
3433       gfc_error ("There is no specific subroutine for the generic %qs at %L",
3434                  sym->name, &c->loc);
3435       return false;
3436     }
3437
3438   m = gfc_intrinsic_sub_interface (c, 0);
3439   if (m == MATCH_YES)
3440     return true;
3441   if (m == MATCH_NO)
3442     gfc_error ("Generic subroutine %qs at %L is not consistent with an "
3443                "intrinsic subroutine interface", sym->name, &c->loc);
3444
3445   return false;
3446 }
3447
3448
3449 /* Resolve a subroutine call known to be specific.  */
3450
3451 static match
3452 resolve_specific_s0 (gfc_code *c, gfc_symbol *sym)
3453 {
3454   match m;
3455
3456   if (sym->attr.external || sym->attr.if_source == IFSRC_IFBODY)
3457     {
3458       if (sym->attr.dummy)
3459         {
3460           sym->attr.proc = PROC_DUMMY;
3461           goto found;
3462         }
3463
3464       sym->attr.proc = PROC_EXTERNAL;
3465       goto found;
3466     }
3467
3468   if (sym->attr.proc == PROC_MODULE || sym->attr.proc == PROC_INTERNAL)
3469     goto found;
3470
3471   if (sym->attr.intrinsic)
3472     {
3473       m = gfc_intrinsic_sub_interface (c, 1);
3474       if (m == MATCH_YES)
3475         return MATCH_YES;
3476       if (m == MATCH_NO)
3477         gfc_error ("Subroutine %qs at %L is INTRINSIC but is not compatible "
3478                    "with an intrinsic", sym->name, &c->loc);
3479
3480       return MATCH_ERROR;
3481     }
3482
3483   return MATCH_NO;
3484
3485 found:
3486   gfc_procedure_use (sym, &c->ext.actual, &c->loc);
3487
3488   c->resolved_sym = sym;
3489   if (!pure_subroutine (sym, sym->name, &c->loc))
3490     return MATCH_ERROR;
3491
3492   return MATCH_YES;
3493 }
3494
3495
3496 static bool
3497 resolve_specific_s (gfc_code *c)
3498 {
3499   gfc_symbol *sym;
3500   match m;
3501
3502   sym = c->symtree->n.sym;
3503
3504   for (;;)
3505     {
3506       m = resolve_specific_s0 (c, sym);
3507       if (m == MATCH_YES)
3508         return true;
3509       if (m == MATCH_ERROR)
3510         return false;
3511
3512       if (sym->ns->parent == NULL)
3513         break;
3514
3515       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
3516
3517       if (sym == NULL)
3518         break;
3519     }
3520
3521   sym = c->symtree->n.sym;
3522   gfc_error ("Unable to resolve the specific subroutine %qs at %L",
3523              sym->name, &c->loc);
3524
3525   return false;
3526 }
3527
3528
3529 /* Resolve a subroutine call not known to be generic nor specific.  */
3530
3531 static bool
3532 resolve_unknown_s (gfc_code *c)
3533 {
3534   gfc_symbol *sym;
3535
3536   sym = c->symtree->n.sym;
3537
3538   if (sym->attr.dummy)
3539     {
3540       sym->attr.proc = PROC_DUMMY;
3541       goto found;
3542     }
3543
3544   /* See if we have an intrinsic function reference.  */
3545
3546   if (gfc_is_intrinsic (sym, 1, c->loc))
3547     {
3548       if (gfc_intrinsic_sub_interface (c, 1) == MATCH_YES)
3549         return true;
3550       return false;
3551     }
3552
3553   /* The reference is to an external name.  */
3554
3555 found:
3556   gfc_procedure_use (sym, &c->ext.actual, &c->loc);
3557
3558   c->resolved_sym = sym;
3559
3560   return pure_subroutine (sym, sym->name, &c->loc);
3561 }
3562
3563
3564 /* Resolve a subroutine call.  Although it was tempting to use the same code
3565    for functions, subroutines and functions are stored differently and this
3566    makes things awkward.  */
3567
3568 static bool
3569 resolve_call (gfc_code *c)
3570 {
3571   bool t;
3572   procedure_type ptype = PROC_INTRINSIC;
3573   gfc_symbol *csym, *sym;
3574   bool no_formal_args;
3575
3576   csym = c->symtree ? c->symtree->n.sym : NULL;
3577
3578   if (csym && csym->ts.type != BT_UNKNOWN)
3579     {
3580       gfc_error ("%qs at %L has a type, which is not consistent with "
3581                  "the CALL at %L", csym->name, &csym->declared_at, &c->loc);
3582       return false;
3583     }
3584
3585   if (csym && gfc_current_ns->parent && csym->ns != gfc_current_ns)
3586     {
3587       gfc_symtree *st;
3588       gfc_find_sym_tree (c->symtree->name, gfc_current_ns, 1, &st);
3589       sym = st ? st->n.sym : NULL;
3590       if (sym && csym != sym
3591               && sym->ns == gfc_current_ns
3592               && sym->attr.flavor == FL_PROCEDURE
3593               && sym->attr.contained)
3594         {
3595           sym->refs++;
3596           if (csym->attr.generic)
3597             c->symtree->n.sym = sym;
3598           else
3599             c->symtree = st;
3600           csym = c->symtree->n.sym;
3601         }
3602     }
3603
3604   /* If this ia a deferred TBP, c->expr1 will be set.  */
3605   if (!c->expr1 && csym)
3606     {
3607       if (csym->attr.abstract)
3608         {
3609           gfc_error ("ABSTRACT INTERFACE %qs must not be referenced at %L",
3610                     csym->name, &c->loc);
3611           return false;
3612         }
3613
3614       /* Subroutines without the RECURSIVE attribution are not allowed to
3615          call themselves.  */
3616       if (is_illegal_recursion (csym, gfc_current_ns))
3617         {
3618           if (csym->attr.entry && csym->ns->entries)
3619             gfc_error ("ENTRY %qs at %L cannot be called recursively, "
3620                        "as subroutine %qs is not RECURSIVE",
3621                        csym->name, &c->loc, csym->ns->entries->sym->name);
3622           else
3623             gfc_error ("SUBROUTINE %qs at %L cannot be called recursively, "
3624                        "as it is not RECURSIVE", csym->name, &c->loc);
3625
3626           t = false;
3627         }
3628     }
3629
3630   /* Switch off assumed size checking and do this again for certain kinds
3631      of procedure, once the procedure itself is resolved.  */
3632   need_full_assumed_size++;
3633
3634   if (csym)
3635     ptype = csym->attr.proc;
3636
3637   no_formal_args = csym && is_external_proc (csym)
3638                         && gfc_sym_get_dummy_args (csym) == NULL;
3639   if (!resolve_actual_arglist (c->ext.actual, ptype, no_formal_args))
3640     return false;
3641
3642   /* Resume assumed_size checking.  */
3643   need_full_assumed_size--;
3644
3645   /* If external, check for usage.  */
3646   if (csym && is_external_proc (csym))
3647     resolve_global_procedure (csym, &c->loc, &c->ext.actual, 1);
3648
3649   t = true;
3650   if (c->resolved_sym == NULL)
3651     {
3652       c->resolved_isym = NULL;
3653       switch (procedure_kind (csym))
3654         {
3655         case PTYPE_GENERIC:
3656           t = resolve_generic_s (c);
3657           break;
3658
3659         case PTYPE_SPECIFIC:
3660           t = resolve_specific_s (c);
3661           break;
3662
3663         case PTYPE_UNKNOWN:
3664           t = resolve_unknown_s (c);
3665           break;
3666
3667         default:
3668           gfc_internal_error ("resolve_subroutine(): bad function type");
3669         }
3670     }
3671
3672   /* Some checks of elemental subroutine actual arguments.  */
3673   if (!resolve_elemental_actual (NULL, c))
3674     return false;
3675
3676   if (!c->expr1)
3677     update_current_proc_array_outer_dependency (csym);
3678   else
3679     /* Typebound procedure: Assume the worst.  */
3680     gfc_current_ns->proc_name->attr.array_outer_dependency = 1;
3681
3682   return t;
3683 }
3684
3685
3686 /* Compare the shapes of two arrays that have non-NULL shapes.  If both
3687    op1->shape and op2->shape are non-NULL return true if their shapes
3688    match.  If both op1->shape and op2->shape are non-NULL return false
3689    if their shapes do not match.  If either op1->shape or op2->shape is
3690    NULL, return true.  */
3691
3692 static bool
3693 compare_shapes (gfc_expr *op1, gfc_expr *op2)
3694 {
3695   bool t;
3696   int i;
3697
3698   t = true;
3699
3700   if (op1->shape != NULL && op2->shape != NULL)
3701     {
3702       for (i = 0; i < op1->rank; i++)
3703         {
3704           if (mpz_cmp (op1->shape[i], op2->shape[i]) != 0)
3705            {
3706              gfc_error ("Shapes for operands at %L and %L are not conformable",
3707                         &op1->where, &op2->where);
3708              t = false;
3709              break;
3710            }
3711         }
3712     }
3713
3714   return t;
3715 }
3716
3717 /* Convert a logical operator to the corresponding bitwise intrinsic call.
3718    For example A .AND. B becomes IAND(A, B).  */
3719 static gfc_expr *
3720 logical_to_bitwise (gfc_expr *e)
3721 {
3722   gfc_expr *tmp, *op1, *op2;
3723   gfc_isym_id isym;
3724   gfc_actual_arglist *args = NULL;
3725
3726   gcc_assert (e->expr_type == EXPR_OP);
3727
3728   isym = GFC_ISYM_NONE;
3729   op1 = e->value.op.op1;
3730   op2 = e->value.op.op2;
3731
3732   switch (e->value.op.op)
3733     {
3734     case INTRINSIC_NOT:
3735       isym = GFC_ISYM_NOT;
3736       break;
3737     case INTRINSIC_AND:
3738       isym = GFC_ISYM_IAND;
3739       break;
3740     case INTRINSIC_OR:
3741       isym = GFC_ISYM_IOR;
3742       break;
3743     case INTRINSIC_NEQV:
3744       isym = GFC_ISYM_IEOR;
3745       break;
3746     case INTRINSIC_EQV:
3747       /* "Bitwise eqv" is just the complement of NEQV === IEOR.
3748          Change the old expression to NEQV, which will get replaced by IEOR,
3749          and wrap it in NOT.  */
3750       tmp = gfc_copy_expr (e);
3751       tmp->value.op.op = INTRINSIC_NEQV;
3752       tmp = logical_to_bitwise (tmp);
3753       isym = GFC_ISYM_NOT;
3754       op1 = tmp;
3755       op2 = NULL;
3756       break;
3757     default:
3758       gfc_internal_error ("logical_to_bitwise(): Bad intrinsic");
3759     }
3760
3761   /* Inherit the original operation's operands as arguments.  */
3762   args = gfc_get_actual_arglist ();
3763   args->expr = op1;
3764   if (op2)
3765     {
3766       args->next = gfc_get_actual_arglist ();
3767       args->next->expr = op2;
3768     }
3769
3770   /* Convert the expression to a function call.  */
3771   e->expr_type = EXPR_FUNCTION;
3772   e->value.function.actual = args;
3773   e->value.function.isym = gfc_intrinsic_function_by_id (isym);
3774   e->value.function.name = e->value.function.isym->name;
3775   e->value.function.esym = NULL;
3776
3777   /* Make up a pre-resolved function call symtree if we need to.  */
3778   if (!e->symtree || !e->symtree->n.sym)
3779     {
3780       gfc_symbol *sym;
3781       gfc_get_ha_sym_tree (e->value.function.isym->name, &e->symtree);
3782       sym = e->symtree->n.sym;
3783       sym->result = sym;
3784       sym->attr.flavor = FL_PROCEDURE;
3785       sym->attr.function = 1;
3786       sym->attr.elemental = 1;
3787       sym->attr.pure = 1;
3788       sym->attr.referenced = 1;
3789       gfc_intrinsic_symbol (sym);
3790       gfc_commit_symbol (sym);
3791     }
3792
3793   args->name = e->value.function.isym->formal->name;
3794   if (e->value.function.isym->formal->next)
3795     args->next->name = e->value.function.isym->formal->next->name;
3796
3797   return e;
3798 }
3799
3800 /* Recursively append candidate UOP to CANDIDATES.  Store the number of
3801    candidates in CANDIDATES_LEN.  */
3802 static void
3803 lookup_uop_fuzzy_find_candidates (gfc_symtree *uop,
3804                                   char **&candidates,
3805                                   size_t &candidates_len)
3806 {
3807   gfc_symtree *p;
3808
3809   if (uop == NULL)
3810     return;
3811
3812   /* Not sure how to properly filter here.  Use all for a start.
3813      n.uop.op is NULL for empty interface operators (is that legal?) disregard
3814      these as i suppose they don't make terribly sense.  */
3815
3816   if (uop->n.uop->op != NULL)
3817     vec_push (candidates, candidates_len, uop->name);
3818
3819   p = uop->left;
3820   if (p)
3821     lookup_uop_fuzzy_find_candidates (p, candidates, candidates_len);
3822
3823   p = uop->right;
3824   if (p)
3825     lookup_uop_fuzzy_find_candidates (p, candidates, candidates_len);
3826 }
3827
3828 /* Lookup user-operator OP fuzzily, taking names in UOP into account.  */
3829
3830 static const char*
3831 lookup_uop_fuzzy (const char *op, gfc_symtree *uop)
3832 {
3833   char **candidates = NULL;
3834   size_t candidates_len = 0;
3835   lookup_uop_fuzzy_find_candidates (uop, candidates, candidates_len);
3836   return gfc_closest_fuzzy_match (op, candidates);
3837 }
3838
3839
3840 /* Callback finding an impure function as an operand to an .and. or
3841    .or.  expression.  Remember the last function warned about to
3842    avoid double warnings when recursing.  */
3843
3844 static int
3845 impure_function_callback (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED,
3846                           void *data)
3847 {
3848   gfc_expr *f = *e;
3849   const char *name;
3850   static gfc_expr *last = NULL;
3851   bool *found = (bool *) data;
3852
3853   if (f->expr_type == EXPR_FUNCTION)
3854     {
3855       *found = 1;
3856       if (f != last && !gfc_pure_function (f, &name)
3857           && !gfc_implicit_pure_function (f))
3858         {
3859           if (name)
3860             gfc_warning (OPT_Wfunction_elimination,
3861                          "Impure function %qs at %L might not be evaluated",
3862                          name, &f->where);
3863           else
3864             gfc_warning (OPT_Wfunction_elimination,
3865                          "Impure function at %L might not be evaluated",
3866                          &f->where);
3867         }
3868       last = f;
3869     }
3870
3871   return 0;
3872 }
3873
3874
3875 /* Resolve an operator expression node.  This can involve replacing the
3876    operation with a user defined function call.  */
3877
3878 static bool
3879 resolve_operator (gfc_expr *e)
3880 {
3881   gfc_expr *op1, *op2;
3882   char msg[200];
3883   bool dual_locus_error;
3884   bool t = true;
3885
3886   /* Resolve all subnodes-- give them types.  */
3887
3888   switch (e->value.op.op)
3889     {
3890     default:
3891       if (!gfc_resolve_expr (e->value.op.op2))
3892         return false;
3893
3894     /* Fall through.  */
3895
3896     case INTRINSIC_NOT:
3897     case INTRINSIC_UPLUS:
3898     case INTRINSIC_UMINUS:
3899     case INTRINSIC_PARENTHESES:
3900       if (!gfc_resolve_expr (e->value.op.op1))
3901         return false;
3902       break;
3903     }
3904
3905   /* Typecheck the new node.  */
3906
3907   op1 = e->value.op.op1;
3908   op2 = e->value.op.op2;
3909   dual_locus_error = false;
3910
3911   if ((op1 && op1->expr_type == EXPR_NULL)
3912       || (op2 && op2->expr_type == EXPR_NULL))
3913     {
3914       sprintf (msg, _("Invalid context for NULL() pointer at %%L"));
3915       goto bad_op;
3916     }
3917
3918   switch (e->value.op.op)
3919     {
3920     case INTRINSIC_UPLUS:
3921     case INTRINSIC_UMINUS:
3922       if (op1->ts.type == BT_INTEGER
3923           || op1->ts.type == BT_REAL
3924           || op1->ts.type == BT_COMPLEX)
3925         {
3926           e->ts = op1->ts;
3927           break;
3928         }
3929
3930       sprintf (msg, _("Operand of unary numeric operator %%<%s%%> at %%L is %s"),
3931                gfc_op2string (e->value.op.op), gfc_typename (&e->ts));
3932       goto bad_op;
3933
3934     case INTRINSIC_PLUS:
3935     case INTRINSIC_MINUS:
3936     case INTRINSIC_TIMES:
3937     case INTRINSIC_DIVIDE:
3938     case INTRINSIC_POWER:
3939       if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
3940         {
3941           gfc_type_convert_binary (e, 1);
3942           break;
3943         }
3944
3945       if (op1->ts.type == BT_DERIVED || op2->ts.type == BT_DERIVED)
3946         sprintf (msg,
3947                _("Unexpected derived-type entities in binary intrinsic "
3948                  "numeric operator %%<%s%%> at %%L"),
3949                gfc_op2string (e->value.op.op));
3950       else
3951         sprintf (msg,
3952                _("Operands of binary numeric operator %%<%s%%> at %%L are %s/%s"),
3953                gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3954                gfc_typename (&op2->ts));
3955       goto bad_op;
3956
3957     case INTRINSIC_CONCAT:
3958       if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
3959           && op1->ts.kind == op2->ts.kind)
3960         {
3961           e->ts.type = BT_CHARACTER;
3962           e->ts.kind = op1->ts.kind;
3963           break;
3964         }
3965
3966       sprintf (msg,
3967                _("Operands of string concatenation operator at %%L are %s/%s"),
3968                gfc_typename (&op1->ts), gfc_typename (&op2->ts));
3969       goto bad_op;
3970
3971     case INTRINSIC_AND:
3972     case INTRINSIC_OR:
3973     case INTRINSIC_EQV:
3974     case INTRINSIC_NEQV:
3975       if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
3976         {
3977           e->ts.type = BT_LOGICAL;
3978           e->ts.kind = gfc_kind_max (op1, op2);
3979           if (op1->ts.kind < e->ts.kind)
3980             gfc_convert_type (op1, &e->ts, 2);
3981           else if (op2->ts.kind < e->ts.kind)
3982             gfc_convert_type (op2, &e->ts, 2);
3983
3984           if (flag_frontend_optimize &&
3985             (e->value.op.op == INTRINSIC_AND || e->value.op.op == INTRINSIC_OR))
3986             {
3987               /* Warn about short-circuiting
3988                  with impure function as second operand.  */
3989               bool op2_f = false;
3990               gfc_expr_walker (&op2, impure_function_callback, &op2_f);
3991             }
3992           break;
3993         }
3994
3995       /* Logical ops on integers become bitwise ops with -fdec.  */
3996       else if (flag_dec
3997                && (op1->ts.type == BT_INTEGER || op2->ts.type == BT_INTEGER))
3998         {
3999           e->ts.type = BT_INTEGER;
4000           e->ts.kind = gfc_kind_max (op1, op2);
4001           if (op1->ts.type != e->ts.type || op1->ts.kind != e->ts.kind)
4002             gfc_convert_type (op1, &e->ts, 1);
4003           if (op2->ts.type != e->ts.type || op2->ts.kind != e->ts.kind)
4004             gfc_convert_type (op2, &e->ts, 1);
4005           e = logical_to_bitwise (e);
4006           goto simplify_op;
4007         }
4008
4009       sprintf (msg, _("Operands of logical operator %%<%s%%> at %%L are %s/%s"),
4010                gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
4011                gfc_typename (&op2->ts));
4012
4013       goto bad_op;
4014
4015     case INTRINSIC_NOT:
4016       /* Logical ops on integers become bitwise ops with -fdec.  */
4017       if (flag_dec && op1->ts.type == BT_INTEGER)
4018         {
4019           e->ts.type = BT_INTEGER;
4020           e->ts.kind = op1->ts.kind;
4021           e = logical_to_bitwise (e);
4022           goto simplify_op;
4023         }
4024
4025       if (op1->ts.type == BT_LOGICAL)
4026         {
4027           e->ts.type = BT_LOGICAL;
4028           e->ts.kind = op1->ts.kind;
4029           break;
4030         }
4031
4032       sprintf (msg, _("Operand of .not. operator at %%L is %s"),
4033                gfc_typename (&op1->ts));
4034       goto bad_op;
4035
4036     case INTRINSIC_GT:
4037     case INTRINSIC_GT_OS:
4038     case INTRINSIC_GE:
4039     case INTRINSIC_GE_OS:
4040     case INTRINSIC_LT:
4041     case INTRINSIC_LT_OS:
4042     case INTRINSIC_LE:
4043     case INTRINSIC_LE_OS:
4044       if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
4045         {
4046           strcpy (msg, _("COMPLEX quantities cannot be compared at %L"));
4047           goto bad_op;
4048         }
4049
4050       /* Fall through.  */
4051
4052     case INTRINSIC_EQ:
4053     case INTRINSIC_EQ_OS:
4054     case INTRINSIC_NE:
4055     case INTRINSIC_NE_OS:
4056       if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
4057           && op1->ts.kind == op2->ts.kind)
4058         {
4059           e->ts.type = BT_LOGICAL;
4060           e->ts.kind = gfc_default_logical_kind;
4061           break;
4062         }
4063
4064       if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
4065         {
4066           gfc_type_convert_binary (e, 1);
4067
4068           e->ts.type = BT_LOGICAL;
4069           e->ts.kind = gfc_default_logical_kind;
4070
4071           if (warn_compare_reals)
4072             {
4073               gfc_intrinsic_op op = e->value.op.op;
4074
4075               /* Type conversion has made sure that the types of op1 and op2
4076                  agree, so it is only necessary to check the first one.   */
4077               if ((op1->ts.type == BT_REAL || op1->ts.type == BT_COMPLEX)
4078                   && (op == INTRINSIC_EQ || op == INTRINSIC_EQ_OS
4079                       || op == INTRINSIC_NE || op == INTRINSIC_NE_OS))
4080                 {
4081                   const char *msg;
4082
4083                   if (op == INTRINSIC_EQ || op == INTRINSIC_EQ_OS)
4084                     msg = "Equality comparison for %s at %L";
4085                   else
4086                     msg = "Inequality comparison for %s at %L";
4087
4088                   gfc_warning (OPT_Wcompare_reals, msg,
4089                                gfc_typename (&op1->ts), &op1->where);
4090                 }
4091             }
4092
4093           break;
4094         }
4095
4096       if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
4097         sprintf (msg,
4098                  _("Logicals at %%L must be compared with %s instead of %s"),
4099                  (e->value.op.op == INTRINSIC_EQ
4100                   || e->value.op.op == INTRINSIC_EQ_OS)
4101                  ? ".eqv." : ".neqv.", gfc_op2string (e->value.op.op));
4102       else
4103         sprintf (msg,
4104                  _("Operands of comparison operator %%<%s%%> at %%L are %s/%s"),
4105                  gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
4106                  gfc_typename (&op2->ts));
4107
4108       goto bad_op;
4109
4110     case INTRINSIC_USER:
4111       if (e->value.op.uop->op == NULL)
4112         {
4113           const char *name = e->value.op.uop->name;
4114           const char *guessed;
4115           guessed = lookup_uop_fuzzy (name, e->value.op.uop->ns->uop_root);
4116           if (guessed)
4117             sprintf (msg, _("Unknown operator %%<%s%%> at %%L; did you mean '%s'?"),
4118                 name, guessed);
4119           else
4120             sprintf (msg, _("Unknown operator %%<%s%%> at %%L"), name);
4121         }
4122       else if (op2 == NULL)
4123         sprintf (msg, _("Operand of user operator %%<%s%%> at %%L is %s"),
4124                  e->value.op.uop->name, gfc_typename (&op1->ts));
4125       else
4126         {
4127           sprintf (msg, _("Operands of user operator %%<%s%%> at %%L are %s/%s"),
4128                    e->value.op.uop->name, gfc_typename (&op1->ts),
4129                    gfc_typename (&op2->ts));
4130           e->value.op.uop->op->sym->attr.referenced = 1;
4131         }
4132
4133       goto bad_op;
4134
4135     case INTRINSIC_PARENTHESES:
4136       e->ts = op1->ts;
4137       if (e->ts.type == BT_CHARACTER)
4138         e->ts.u.cl = op1->ts.u.cl;
4139       break;
4140
4141     default:
4142       gfc_internal_error ("resolve_operator(): Bad intrinsic");
4143     }
4144
4145   /* Deal with arrayness of an operand through an operator.  */
4146
4147   switch (e->value.op.op)
4148     {
4149     case INTRINSIC_PLUS:
4150     case INTRINSIC_MINUS:
4151     case INTRINSIC_TIMES:
4152     case INTRINSIC_DIVIDE:
4153     case INTRINSIC_POWER:
4154     case INTRINSIC_CONCAT:
4155     case INTRINSIC_AND:
4156     case INTRINSIC_OR:
4157     case INTRINSIC_EQV:
4158     case INTRINSIC_NEQV:
4159     case INTRINSIC_EQ:
4160     case INTRINSIC_EQ_OS:
4161     case INTRINSIC_NE:
4162     case INTRINSIC_NE_OS:
4163     case INTRINSIC_GT:
4164     case INTRINSIC_GT_OS:
4165     case INTRINSIC_GE:
4166     case INTRINSIC_GE_OS:
4167     case INTRINSIC_LT:
4168     case INTRINSIC_LT_OS:
4169     case INTRINSIC_LE:
4170     case INTRINSIC_LE_OS:
4171
4172       if (op1->rank == 0 && op2->rank == 0)
4173         e->rank = 0;
4174
4175       if (op1->rank == 0 && op2->rank != 0)
4176         {
4177           e->rank = op2->rank;
4178
4179           if (e->shape == NULL)
4180             e->shape = gfc_copy_shape (op2->shape, op2->rank);
4181         }
4182
4183       if (op1->rank != 0 && op2->rank == 0)
4184         {
4185           e->rank = op1->rank;
4186
4187           if (e->shape == NULL)
4188             e->shape = gfc_copy_shape (op1->shape, op1->rank);
4189         }
4190
4191       if (op1->rank != 0 && op2->rank != 0)
4192         {
4193           if (op1->rank == op2->rank)
4194             {
4195               e->rank = op1->rank;
4196               if (e->shape == NULL)
4197                 {
4198                   t = compare_shapes (op1, op2);
4199                   if (!t)
4200                     e->shape = NULL;
4201                   else
4202                     e->shape = gfc_copy_shape (op1->shape, op1->rank);
4203                 }
4204             }
4205           else
4206             {
4207               /* Allow higher level expressions to work.  */
4208               e->rank = 0;
4209
4210               /* Try user-defined operators, and otherwise throw an error.  */
4211               dual_locus_error = true;
4212               sprintf (msg,
4213                        _("Inconsistent ranks for operator at %%L and %%L"));
4214               goto bad_op;
4215             }
4216         }
4217
4218       break;
4219
4220     case INTRINSIC_PARENTHESES:
4221     case INTRINSIC_NOT:
4222     case INTRINSIC_UPLUS:
4223     case INTRINSIC_UMINUS:
4224       /* Simply copy arrayness attribute */
4225       e->rank = op1->rank;
4226
4227       if (e->shape == NULL)
4228         e->shape = gfc_copy_shape (op1->shape, op1->rank);
4229
4230       break;
4231
4232     default:
4233       break;
4234     }
4235
4236 simplify_op:
4237
4238   /* Attempt to simplify the expression.  */
4239   if (t)
4240     {
4241       t = gfc_simplify_expr (e, 0);
4242       /* Some calls do not succeed in simplification and return false
4243          even though there is no error; e.g. variable references to
4244          PARAMETER arrays.  */
4245       if (!gfc_is_constant_expr (e))
4246         t = true;
4247     }
4248   return t;
4249
4250 bad_op:
4251
4252   {
4253     match m = gfc_extend_expr (e);
4254     if (m == MATCH_YES)
4255       return true;
4256     if (m == MATCH_ERROR)
4257       return false;
4258   }
4259
4260   if (dual_locus_error)
4261     gfc_error (msg, &op1->where, &op2->where);
4262   else
4263     gfc_error (msg, &e->where);
4264
4265   return false;
4266 }
4267
4268
4269 /************** Array resolution subroutines **************/
4270
4271 enum compare_result
4272 { CMP_LT, CMP_EQ, CMP_GT, CMP_UNKNOWN };
4273
4274 /* Compare two integer expressions.  */
4275
4276 static compare_result
4277 compare_bound (gfc_expr *a, gfc_expr *b)
4278 {
4279   int i;
4280
4281   if (a == NULL || a->expr_type != EXPR_CONSTANT
4282       || b == NULL || b->expr_type != EXPR_CONSTANT)
4283     return CMP_UNKNOWN;
4284
4285   /* If either of the types isn't INTEGER, we must have
4286      raised an error earlier.  */
4287
4288   if (a->ts.type != BT_INTEGER || b->ts.type != BT_INTEGER)
4289     return CMP_UNKNOWN;
4290
4291   i = mpz_cmp (a->value.integer, b->value.integer);
4292
4293   if (i < 0)
4294     return CMP_LT;
4295   if (i > 0)
4296     return CMP_GT;
4297   return CMP_EQ;
4298 }
4299
4300
4301 /* Compare an integer expression with an integer.  */
4302
4303 static compare_result
4304 compare_bound_int (gfc_expr *a, int b)
4305 {
4306   int i;
4307
4308   if (a == NULL || a->expr_type != EXPR_CONSTANT)
4309     return CMP_UNKNOWN;
4310
4311   if (a->ts.type != BT_INTEGER)
4312     gfc_internal_error ("compare_bound_int(): Bad expression");
4313
4314   i = mpz_cmp_si (a->value.integer, b);
4315
4316   if (i < 0)
4317     return CMP_LT;
4318   if (i > 0)
4319     return CMP_GT;
4320   return CMP_EQ;
4321 }
4322
4323
4324 /* Compare an integer expression with a mpz_t.  */
4325
4326 static compare_result
4327 compare_bound_mpz_t (gfc_expr *a, mpz_t b)
4328 {
4329   int i;
4330
4331   if (a == NULL || a->expr_type != EXPR_CONSTANT)
4332     return CMP_UNKNOWN;
4333
4334   if (a->ts.type != BT_INTEGER)
4335     gfc_internal_error ("compare_bound_int(): Bad expression");
4336
4337   i = mpz_cmp (a->value.integer, b);
4338
4339   if (i < 0)
4340     return CMP_LT;
4341   if (i > 0)
4342     return CMP_GT;
4343   return CMP_EQ;
4344 }
4345
4346
4347 /* Compute the last value of a sequence given by a triplet.
4348    Return 0 if it wasn't able to compute the last value, or if the
4349    sequence if empty, and 1 otherwise.  */
4350
4351 static int
4352 compute_last_value_for_triplet (gfc_expr *start, gfc_expr *end,
4353                                 gfc_expr *stride, mpz_t last)
4354 {
4355   mpz_t rem;
4356
4357   if (start == NULL || start->expr_type != EXPR_CONSTANT
4358       || end == NULL || end->expr_type != EXPR_CONSTANT
4359       || (stride != NULL && stride->expr_type != EXPR_CONSTANT))
4360     return 0;
4361
4362   if (start->ts.type != BT_INTEGER || end->ts.type != BT_INTEGER
4363       || (stride != NULL && stride->ts.type != BT_INTEGER))
4364     return 0;
4365
4366   if (stride == NULL || compare_bound_int (stride, 1) == CMP_EQ)
4367     {
4368       if (compare_bound (start, end) == CMP_GT)
4369         return 0;
4370       mpz_set (last, end->value.integer);
4371       return 1;
4372     }
4373
4374   if (compare_bound_int (stride, 0) == CMP_GT)
4375     {
4376       /* Stride is positive */
4377       if (mpz_cmp (start->value.integer, end->value.integer) > 0)
4378         return 0;
4379     }
4380   else
4381     {
4382       /* Stride is negative */
4383       if (mpz_cmp (start->value.integer, end->value.integer) < 0)
4384         return 0;
4385     }
4386
4387   mpz_init (rem);
4388   mpz_sub (rem, end->value.integer, start->value.integer);
4389   mpz_tdiv_r (rem, rem, stride->value.integer);
4390   mpz_sub (last, end->value.integer, rem);
4391   mpz_clear (rem);
4392
4393   return 1;
4394 }
4395
4396
4397 /* Compare a single dimension of an array reference to the array
4398    specification.  */
4399
4400 static bool
4401 check_dimension (int i, gfc_array_ref *ar, gfc_array_spec *as)
4402 {
4403   mpz_t last_value;
4404
4405   if (ar->dimen_type[i] == DIMEN_STAR)
4406     {
4407       gcc_assert (ar->stride[i] == NULL);
4408       /* This implies [*] as [*:] and [*:3] are not possible.  */
4409       if (ar->start[i] == NULL)
4410         {
4411           gcc_assert (ar->end[i] == NULL);
4412           return true;
4413         }
4414     }
4415
4416 /* Given start, end and stride values, calculate the minimum and
4417    maximum referenced indexes.  */
4418
4419   switch (ar->dimen_type[i])
4420     {
4421     case DIMEN_VECTOR:
4422     case DIMEN_THIS_IMAGE:
4423       break;
4424
4425     case DIMEN_STAR:
4426     case DIMEN_ELEMENT:
4427       if (compare_bound (ar->start[i], as->lower[i]) == CMP_LT)
4428         {
4429           if (i < as->rank)
4430             gfc_warning (0, "Array reference at %L is out of bounds "
4431                          "(%ld < %ld) in dimension %d", &ar->c_where[i],
4432                          mpz_get_si (ar->start[i]->value.integer),
4433                          mpz_get_si (as->lower[i]->value.integer), i+1);
4434           else
4435             gfc_warning (0, "Array reference at %L is out of bounds "
4436                          "(%ld < %ld) in codimension %d", &ar->c_where[i],
4437                          mpz_get_si (ar->start[i]->value.integer),
4438                          mpz_get_si (as->lower[i]->value.integer),
4439                          i + 1 - as->rank);
4440           return true;
4441         }
4442       if (compare_bound (ar->start[i], as->upper[i]) == CMP_GT)
4443         {
4444           if (i < as->rank)
4445             gfc_warning (0, "Array reference at %L is out of bounds "
4446                          "(%ld > %ld) in dimension %d", &ar->c_where[i],
4447                          mpz_get_si (ar->start[i]->value.integer),
4448                          mpz_get_si (as->upper[i]->value.integer), i+1);
4449           else
4450             gfc_warning (0, "Array reference at %L is out of bounds "
4451                          "(%ld > %ld) in codimension %d", &ar->c_where[i],
4452                          mpz_get_si (ar->start[i]->value.integer),
4453                          mpz_get_si (as->upper[i]->value.integer),
4454                          i + 1 - as->rank);
4455           return true;
4456         }
4457
4458       break;
4459
4460     case DIMEN_RANGE:
4461       {
4462 #define AR_START (ar->start[i] ? ar->start[i] : as->lower[i])
4463 #define AR_END (ar->end[i] ? ar->end[i] : as->upper[i])
4464
4465         compare_result comp_start_end = compare_bound (AR_START, AR_END);
4466
4467         /* Check for zero stride, which is not allowed.  */
4468         if (compare_bound_int (ar->stride[i], 0) == CMP_EQ)
4469           {
4470             gfc_error ("Illegal stride of zero at %L", &ar->c_where[i]);
4471             return false;
4472           }
4473
4474         /* if start == len || (stride > 0 && start < len)
4475                            || (stride < 0 && start > len),
4476            then the array section contains at least one element.  In this
4477            case, there is an out-of-bounds access if
4478            (start < lower || start > upper).  */
4479         if (compare_bound (AR_START, AR_END) == CMP_EQ
4480             || ((compare_bound_int (ar->stride[i], 0) == CMP_GT
4481                  || ar->stride[i] == NULL) && comp_start_end == CMP_LT)
4482             || (compare_bound_int (ar->stride[i], 0) == CMP_LT
4483                 && comp_start_end == CMP_GT))
4484           {
4485             if (compare_bound (AR_START, as->lower[i]) == CMP_LT)
4486               {
4487                 gfc_warning (0, "Lower array reference at %L is out of bounds "
4488                        "(%ld < %ld) in dimension %d", &ar->c_where[i],
4489                        mpz_get_si (AR_START->value.integer),
4490                        mpz_get_si (as->lower[i]->value.integer), i+1);
4491                 return true;
4492               }
4493             if (compare_bound (AR_START, as->upper[i]) == CMP_GT)
4494               {
4495                 gfc_warning (0, "Lower array reference at %L is out of bounds "
4496                        "(%ld > %ld) in dimension %d", &ar->c_where[i],
4497                        mpz_get_si (AR_START->value.integer),
4498                        mpz_get_si (as->upper[i]->value.integer), i+1);
4499                 return true;
4500               }
4501           }
4502
4503         /* If we can compute the highest index of the array section,
4504            then it also has to be between lower and upper.  */
4505         mpz_init (last_value);
4506         if (compute_last_value_for_triplet (AR_START, AR_END, ar->stride[i],
4507                                             last_value))
4508           {
4509             if (compare_bound_mpz_t (as->lower[i], last_value) == CMP_GT)
4510               {
4511                 gfc_warning (0, "Upper array reference at %L is out of bounds "
4512                        "(%ld < %ld) in dimension %d", &ar->c_where[i],
4513                        mpz_get_si (last_value),
4514                        mpz_get_si (as->lower[i]->value.integer), i+1);
4515                 mpz_clear (last_value);
4516                 return true;
4517               }
4518             if (compare_bound_mpz_t (as->upper[i], last_value) == CMP_LT)
4519               {
4520                 gfc_warning (0, "Upper array reference at %L is out of bounds "
4521                        "(%ld > %ld) in dimension %d", &ar->c_where[i],
4522                        mpz_get_si (last_value),
4523                        mpz_get_si (as->upper[i]->value.integer), i+1);
4524                 mpz_clear (last_value);
4525                 return true;
4526               }
4527           }
4528         mpz_clear (last_value);
4529
4530 #undef AR_START
4531 #undef AR_END
4532       }
4533       break;
4534
4535     default:
4536       gfc_internal_error ("check_dimension(): Bad array reference");
4537     }
4538
4539   return true;
4540 }
4541
4542
4543 /* Compare an array reference with an array specification.  */
4544
4545 static bool
4546 compare_spec_to_ref (gfc_array_ref *ar)
4547 {
4548   gfc_array_spec *as;
4549   int i;
4550
4551   as = ar->as;
4552   i = as->rank - 1;
4553   /* TODO: Full array sections are only allowed as actual parameters.  */
4554   if (as->type == AS_ASSUMED_SIZE
4555       && (/*ar->type == AR_FULL
4556           ||*/ (ar->type == AR_SECTION
4557               && ar->dimen_type[i] == DIMEN_RANGE && ar->end[i] == NULL)))
4558     {
4559       gfc_error ("Rightmost upper bound of assumed size array section "
4560                  "not specified at %L", &ar->where);
4561       return false;
4562     }
4563
4564   if (ar->type == AR_FULL)
4565     return true;
4566
4567   if (as->rank != ar->dimen)
4568     {
4569       gfc_error ("Rank mismatch in array reference at %L (%d/%d)",
4570                  &ar->where, ar->dimen, as->rank);
4571       return false;
4572     }
4573
4574   /* ar->codimen == 0 is a local array.  */
4575   if (as->corank != ar->codimen && ar->codimen != 0)
4576     {
4577       gfc_error ("Coindex rank mismatch in array reference at %L (%d/%d)",
4578                  &ar->where, ar->codimen, as->corank);
4579       return false;
4580     }
4581
4582   for (i = 0; i < as->rank; i++)
4583     if (!check_dimension (i, ar, as))
4584       return false;
4585
4586   /* Local access has no coarray spec.  */
4587   if (ar->codimen != 0)
4588     for (i = as->rank; i < as->rank + as->corank; i++)
4589       {
4590         if (ar->dimen_type[i] != DIMEN_ELEMENT && !ar->in_allocate
4591             && ar->dimen_type[i] != DIMEN_THIS_IMAGE)
4592           {
4593             gfc_error ("Coindex of codimension %d must be a scalar at %L",
4594                        i + 1 - as->rank, &ar->where);
4595             return false;
4596           }
4597         if (!check_dimension (i, ar, as))
4598           return false;
4599       }
4600
4601   return true;
4602 }
4603
4604
4605 /* Resolve one part of an array index.  */
4606
4607 static bool
4608 gfc_resolve_index_1 (gfc_expr *index, int check_scalar,
4609                      int force_index_integer_kind)
4610 {
4611   gfc_typespec ts;
4612
4613   if (index == NULL)
4614     return true;
4615
4616   if (!gfc_resolve_expr (index))
4617     return false;
4618
4619   if (check_scalar && index->rank != 0)
4620     {
4621       gfc_error ("Array index at %L must be scalar", &index->where);
4622       return false;
4623     }
4624
4625   if (index->ts.type != BT_INTEGER && index->ts.type != BT_REAL)
4626     {
4627       gfc_error ("Array index at %L must be of INTEGER type, found %s",
4628                  &index->where, gfc_basic_typename (index->ts.type));
4629       return false;
4630     }
4631
4632   if (index->ts.type == BT_REAL)
4633     if (!gfc_notify_std (GFC_STD_LEGACY, "REAL array index at %L",
4634                          &index->where))
4635       return false;
4636
4637   if ((index->ts.kind != gfc_index_integer_kind
4638        && force_index_integer_kind)
4639       || index->ts.type != BT_INTEGER)
4640     {
4641       gfc_clear_ts (&ts);
4642       ts.type = BT_INTEGER;
4643       ts.kind = gfc_index_integer_kind;
4644
4645       gfc_convert_type_warn (index, &ts, 2, 0);
4646     }
4647
4648   return true;
4649 }
4650
4651 /* Resolve one part of an array index.  */
4652
4653 bool
4654 gfc_resolve_index (gfc_expr *index, int check_scalar)
4655 {
4656   return gfc_resolve_index_1 (index, check_scalar, 1);
4657 }
4658
4659 /* Resolve a dim argument to an intrinsic function.  */
4660
4661 bool
4662 gfc_resolve_dim_arg (gfc_expr *dim)
4663 {
4664   if (dim == NULL)
4665     return true;
4666
4667   if (!gfc_resolve_expr (dim))
4668     return false;
4669
4670   if (dim->rank != 0)
4671     {
4672       gfc_error ("Argument dim at %L must be scalar", &dim->where);
4673       return false;
4674
4675     }
4676
4677   if (dim->ts.type != BT_INTEGER)
4678     {
4679       gfc_error ("Argument dim at %L must be of INTEGER type", &dim->where);
4680       return false;
4681     }
4682
4683   if (dim->ts.kind != gfc_index_integer_kind)
4684     {
4685       gfc_typespec ts;
4686
4687       gfc_clear_ts (&ts);
4688       ts.type = BT_INTEGER;
4689       ts.kind = gfc_index_integer_kind;
4690
4691       gfc_convert_type_warn (dim, &ts, 2, 0);
4692     }
4693
4694   return true;
4695 }
4696
4697 /* Given an expression that contains array references, update those array
4698    references to point to the right array specifications.  While this is
4699    filled in during matching, this information is difficult to save and load
4700    in a module, so we take care of it here.
4701
4702    The idea here is that the original array reference comes from the
4703    base symbol.  We traverse the list of reference structures, setting
4704    the stored reference to references.  Component references can
4705    provide an additional array specification.  */
4706
4707 static void
4708 find_array_spec (gfc_expr *e)
4709 {
4710   gfc_array_spec *as;
4711   gfc_component *c;
4712   gfc_ref *ref;
4713
4714   if (e->symtree->n.sym->ts.type == BT_CLASS)
4715     as = CLASS_DATA (e->symtree->n.sym)->as;
4716   else
4717     as = e->symtree->n.sym->as;
4718
4719   for (ref = e->ref; ref; ref = ref->next)
4720     switch (ref->type)
4721       {
4722       case REF_ARRAY:
4723         if (as == NULL)
4724           gfc_internal_error ("find_array_spec(): Missing spec");
4725
4726         ref->u.ar.as = as;
4727         as = NULL;
4728         break;
4729
4730       case REF_COMPONENT:
4731         c = ref->u.c.component;
4732         if (c->attr.dimension)
4733           {
4734             if (as != NULL)
4735               gfc_internal_error ("find_array_spec(): unused as(1)");
4736             as = c->as;
4737           }
4738
4739         break;
4740
4741       case REF_SUBSTRING:
4742       case REF_INQUIRY:
4743         break;
4744       }
4745
4746   if (as != NULL)
4747     gfc_internal_error ("find_array_spec(): unused as(2)");
4748 }
4749
4750
4751 /* Resolve an array reference.  */
4752
4753 static bool
4754 resolve_array_ref (gfc_array_ref *ar)
4755 {
4756   int i, check_scalar;
4757   gfc_expr *e;
4758
4759   for (i = 0; i < ar->dimen + ar->codimen; i++)
4760     {
4761       check_scalar = ar->dimen_type[i] == DIMEN_RANGE;
4762
4763       /* Do not force gfc_index_integer_kind for the start.  We can
4764          do fine with any integer kind.  This avoids temporary arrays
4765          created for indexing with a vector.  */
4766       if (!gfc_resolve_index_1 (ar->start[i], check_scalar, 0))
4767         return false;
4768       if (!gfc_resolve_index (ar->end[i], check_scalar))
4769         return false;
4770       if (!gfc_resolve_index (ar->stride[i], check_scalar))
4771         return false;
4772
4773       e = ar->start[i];
4774
4775       if (ar->dimen_type[i] == DIMEN_UNKNOWN)
4776         switch (e->rank)
4777           {
4778           case 0:
4779             ar->dimen_type[i] = DIMEN_ELEMENT;
4780             break;
4781
4782           case 1:
4783             ar->dimen_type[i] = DIMEN_VECTOR;
4784             if (e->expr_type == EXPR_VARIABLE
4785                 && e->symtree->n.sym->ts.type == BT_DERIVED)
4786               ar->start[i] = gfc_get_parentheses (e);
4787             break;
4788
4789           default:
4790             gfc_error ("Array index at %L is an array of rank %d",
4791                        &ar->c_where[i], e->rank);
4792             return false;
4793           }
4794
4795       /* Fill in the upper bound, which may be lower than the
4796          specified one for something like a(2:10:5), which is
4797          identical to a(2:7:5).  Only relevant for strides not equal
4798          to one.  Don't try a division by zero.  */
4799       if (ar->dimen_type[i] == DIMEN_RANGE
4800           && ar->stride[i] != NULL && ar->stride[i]->expr_type == EXPR_CONSTANT
4801           && mpz_cmp_si (ar->stride[i]->value.integer, 1L) != 0
4802           && mpz_cmp_si (ar->stride[i]->value.integer, 0L) != 0)
4803         {
4804           mpz_t size, end;
4805
4806           if (gfc_ref_dimen_size (ar, i, &size, &end))
4807             {
4808               if (ar->end[i] == NULL)
4809                 {
4810                   ar->end[i] =
4811                     gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind,
4812                                            &ar->where);
4813                   mpz_set (ar->end[i]->value.integer, end);
4814                 }
4815               else if (ar->end[i]->ts.type == BT_INTEGER
4816                        && ar->end[i]->expr_type == EXPR_CONSTANT)
4817                 {
4818                   mpz_set (ar->end[i]->value.integer, end);
4819                 }
4820               else
4821                 gcc_unreachable ();
4822
4823               mpz_clear (size);
4824               mpz_clear (end);
4825             }
4826         }
4827     }
4828
4829   if (ar->type == AR_FULL)
4830     {
4831       if (ar->as->rank == 0)
4832         ar->type = AR_ELEMENT;
4833
4834       /* Make sure array is the same as array(:,:), this way
4835          we don't need to special case all the time.  */
4836       ar->dimen = ar->as->rank;
4837       for (i = 0; i < ar->dimen; i++)
4838         {
4839           ar->dimen_type[i] = DIMEN_RANGE;
4840
4841           gcc_assert (ar->start[i] == NULL);
4842           gcc_assert (ar->end[i] == NULL);
4843           gcc_assert (ar->stride[i] == NULL);
4844         }
4845     }
4846
4847   /* If the reference type is unknown, figure out what kind it is.  */
4848
4849   if (ar->type == AR_UNKNOWN)
4850     {
4851       ar->type = AR_ELEMENT;
4852       for (i = 0; i < ar->dimen; i++)
4853         if (ar->dimen_type[i] == DIMEN_RANGE
4854             || ar->dimen_type[i] == DIMEN_VECTOR)
4855           {
4856             ar->type = AR_SECTION;
4857             break;
4858           }
4859     }
4860
4861   if (!ar->as->cray_pointee && !compare_spec_to_ref (ar))
4862     return false;
4863
4864   if (ar->as->corank && ar->codimen == 0)
4865     {
4866       int n;
4867       ar->codimen = ar->as->corank;
4868       for (n = ar->dimen; n < ar->dimen + ar->codimen; n++)
4869         ar->dimen_type[n] = DIMEN_THIS_IMAGE;
4870     }
4871
4872   return true;
4873 }
4874
4875
4876 static bool
4877 resolve_substring (gfc_ref *ref, bool *equal_length)
4878 {
4879   int k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
4880
4881   if (ref->u.ss.start != NULL)
4882     {
4883       if (!gfc_resolve_expr (ref->u.ss.start))
4884         return false;
4885
4886       if (ref->u.ss.start->ts.type != BT_INTEGER)
4887         {
4888           gfc_error ("Substring start index at %L must be of type INTEGER",
4889                      &ref->u.ss.start->where);
4890           return false;
4891         }
4892
4893       if (ref->u.ss.start->rank != 0)
4894         {
4895           gfc_error ("Substring start index at %L must be scalar",
4896                      &ref->u.ss.start->where);
4897           return false;
4898         }
4899
4900       if (compare_bound_int (ref->u.ss.start, 1) == CMP_LT
4901           && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
4902               || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
4903         {
4904           gfc_error ("Substring start index at %L is less than one",
4905                      &ref->u.ss.start->where);
4906           return false;
4907         }
4908     }
4909
4910   if (ref->u.ss.end != NULL)
4911     {
4912       if (!gfc_resolve_expr (ref->u.ss.end))
4913         return false;
4914
4915       if (ref->u.ss.end->ts.type != BT_INTEGER)
4916         {
4917           gfc_error ("Substring end index at %L must be of type INTEGER",
4918                      &ref->u.ss.end->where);
4919           return false;
4920         }
4921
4922       if (ref->u.ss.end->rank != 0)
4923         {
4924           gfc_error ("Substring end index at %L must be scalar",
4925                      &ref->u.ss.end->where);
4926           return false;
4927         }
4928
4929       if (ref->u.ss.length != NULL
4930           && compare_bound (ref->u.ss.end, ref->u.ss.length->length) == CMP_GT
4931           && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
4932               || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
4933         {
4934           gfc_error ("Substring end index at %L exceeds the string length",
4935                      &ref->u.ss.start->where);
4936           return false;
4937         }
4938
4939       if (compare_bound_mpz_t (ref->u.ss.end,
4940                                gfc_integer_kinds[k].huge) == CMP_GT
4941           && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
4942               || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
4943         {
4944           gfc_error ("Substring end index at %L is too large",
4945                      &ref->u.ss.end->where);
4946           return false;
4947         }
4948       /*  If the substring has the same length as the original
4949           variable, the reference itself can be deleted.  */
4950
4951       if (ref->u.ss.length != NULL
4952           && compare_bound (ref->u.ss.end, ref->u.ss.length->length) == CMP_EQ
4953           && compare_bound_int (ref->u.ss.start, 1) == CMP_EQ)
4954         *equal_length = true;
4955     }
4956
4957   return true;
4958 }
4959
4960
4961 /* This function supplies missing substring charlens.  */
4962
4963 void
4964 gfc_resolve_substring_charlen (gfc_expr *e)
4965 {
4966   gfc_ref *char_ref;
4967   gfc_expr *start, *end;
4968   gfc_typespec *ts = NULL;
4969   mpz_t diff;
4970
4971   for (char_ref = e->ref; char_ref; char_ref = char_ref->next)
4972     {
4973       if (char_ref->type == REF_SUBSTRING || char_ref->type == REF_INQUIRY)
4974         break;
4975       if (char_ref->type == REF_COMPONENT)
4976         ts = &char_ref->u.c.component->ts;
4977     }
4978
4979   if (!char_ref || char_ref->type == REF_INQUIRY)
4980     return;
4981
4982   gcc_assert (char_ref->next == NULL);
4983
4984   if (e->ts.u.cl)
4985     {
4986       if (e->ts.u.cl->length)
4987         gfc_free_expr (e->ts.u.cl->length);
4988       else if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym->attr.dummy)
4989         return;
4990     }
4991
4992   e->ts.type = BT_CHARACTER;
4993   e->ts.kind = gfc_default_character_kind;
4994
4995   if (!e->ts.u.cl)
4996     e->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4997
4998   if (char_ref->u.ss.start)
4999     start = gfc_copy_expr (char_ref->u.ss.start);
5000   else
5001     start = gfc_get_int_expr (gfc_charlen_int_kind, NULL, 1);
5002
5003   if (char_ref->u.ss.end)
5004     end = gfc_copy_expr (char_ref->u.ss.end);
5005   else if (e->expr_type == EXPR_VARIABLE)
5006     {
5007       if (!ts)
5008         ts = &e->symtree->n.sym->ts;
5009       end = gfc_copy_expr (ts->u.cl->length);
5010     }
5011   else
5012     end = NULL;
5013
5014   if (!start || !end)
5015     {
5016       gfc_free_expr (start);
5017       gfc_free_expr (end);
5018       return;
5019     }
5020
5021   /* Length = (end - start + 1).
5022      Check first whether it has a constant length.  */
5023   if (gfc_dep_difference (end, start, &diff))
5024     {
5025       gfc_expr *len = gfc_get_constant_expr (BT_INTEGER, gfc_charlen_int_kind,
5026                                              &e->where);
5027
5028       mpz_add_ui (len->value.integer, diff, 1);
5029       mpz_clear (diff);
5030       e->ts.u.cl->length = len;
5031       /* The check for length < 0 is handled below */
5032     }
5033   else
5034     {
5035       e->ts.u.cl->length = gfc_subtract (end, start);
5036       e->ts.u.cl->length = gfc_add (e->ts.u.cl->length,
5037                                     gfc_get_int_expr (gfc_charlen_int_kind,
5038                                                       NULL, 1));
5039     }
5040
5041   /* F2008, 6.4.1:  Both the starting point and the ending point shall
5042      be within the range 1, 2, ..., n unless the starting point exceeds
5043      the ending point, in which case the substring has length zero.  */
5044
5045   if (mpz_cmp_si (e->ts.u.cl->length->value.integer, 0) < 0)
5046     mpz_set_si (e->ts.u.cl->length->value.integer, 0);
5047
5048   e->ts.u.cl->length->ts.type = BT_INTEGER;
5049   e->ts.u.cl->length->ts.kind = gfc_charlen_int_kind;
5050
5051   /* Make sure that the length is simplified.  */
5052   gfc_simplify_expr (e->ts.u.cl->length, 1);
5053   gfc_resolve_expr (e->ts.u.cl->length);
5054 }
5055
5056
5057 /* Resolve subtype references.  */
5058
5059 static bool
5060 resolve_ref (gfc_expr *expr)
5061 {
5062   int current_part_dimension, n_components, seen_part_dimension;
5063   gfc_ref *ref, **prev;
5064   bool equal_length;
5065
5066   for (ref = expr->ref; ref; ref = ref->next)
5067     if (ref->type == REF_ARRAY && ref->u.ar.as == NULL)
5068       {
5069         find_array_spec (expr);
5070         break;
5071       }
5072
5073   for (prev = &expr->ref; *prev != NULL;
5074        prev = *prev == NULL ? prev : &(*prev)->next)
5075     switch ((*prev)->type)
5076       {
5077       case REF_ARRAY:
5078         if (!resolve_array_ref (&(*prev)->u.ar))
5079           return false;
5080         break;
5081
5082       case REF_COMPONENT:
5083       case REF_INQUIRY:
5084         break;
5085
5086       case REF_SUBSTRING:
5087         equal_length = false;
5088         if (!resolve_substring (*prev, &equal_length))
5089           return false;
5090
5091         if (expr->expr_type != EXPR_SUBSTRING && equal_length)
5092           {
5093             /* Remove the reference and move the charlen, if any.  */
5094             ref = *prev;
5095             *prev = ref->next;
5096             ref->next = NULL;
5097             expr->ts.u.cl = ref->u.ss.length;
5098             ref->u.ss.length = NULL;
5099             gfc_free_ref_list (ref);
5100           }
5101         break;
5102       }
5103
5104   /* Check constraints on part references.  */
5105
5106   current_part_dimension = 0;
5107   seen_part_dimension = 0;
5108   n_components = 0;
5109
5110   for (ref = expr->ref; ref; ref = ref->next)
5111     {
5112       switch (ref->type)
5113         {
5114         case REF_ARRAY:
5115           switch (ref->u.ar.type)
5116             {
5117             case AR_FULL:
5118               /* Coarray scalar.  */
5119               if (ref->u.ar.as->rank == 0)
5120                 {
5121                   current_part_dimension = 0;
5122                   break;
5123                 }
5124               /* Fall through.  */
5125             case AR_SECTION:
5126               current_part_dimension = 1;
5127               break;
5128
5129             case AR_ELEMENT:
5130               current_part_dimension = 0;
5131               break;
5132
5133             case AR_UNKNOWN:
5134               gfc_internal_error ("resolve_ref(): Bad array reference");
5135             }
5136
5137           break;
5138
5139         case REF_COMPONENT:
5140           if (current_part_dimension || seen_part_dimension)
5141             {
5142               /* F03:C614.  */
5143               if (ref->u.c.component->attr.pointer
5144                   || ref->u.c.component->attr.proc_pointer
5145                   || (ref->u.c.component->ts.type == BT_CLASS
5146                         && CLASS_DATA (ref->u.c.component)->attr.pointer))
5147                 {
5148                   gfc_error ("Component to the right of a part reference "
5149                              "with nonzero rank must not have the POINTER "
5150                              "attribute at %L", &expr->where);
5151                   return false;
5152                 }
5153               else if (ref->u.c.component->attr.allocatable
5154                         || (ref->u.c.component->ts.type == BT_CLASS
5155                             && CLASS_DATA (ref->u.c.component)->attr.allocatable))
5156
5157                 {
5158                   gfc_error ("Component to the right of a part reference "
5159                              "with nonzero rank must not have the ALLOCATABLE "
5160                              "attribute at %L", &expr->where);
5161                   return false;
5162                 }
5163             }
5164
5165           n_components++;
5166           break;
5167
5168         case REF_SUBSTRING:
5169         case REF_INQUIRY:
5170           break;
5171         }
5172
5173       if (((ref->type == REF_COMPONENT && n_components > 1)
5174            || ref->next == NULL)
5175           && current_part_dimension
5176           && seen_part_dimension)
5177         {
5178           gfc_error ("Two or more part references with nonzero rank must "
5179                      "not be specified at %L", &expr->where);
5180           return false;
5181         }
5182
5183       if (ref->type == REF_COMPONENT)
5184         {
5185           if (current_part_dimension)
5186             seen_part_dimension = 1;
5187
5188           /* reset to make sure */
5189           current_part_dimension = 0;
5190         }
5191     }
5192
5193   return true;
5194 }
5195
5196
5197 /* Given an expression, determine its shape.  This is easier than it sounds.
5198    Leaves the shape array NULL if it is not possible to determine the shape.  */
5199
5200 static void
5201 expression_shape (gfc_expr *e)
5202 {
5203   mpz_t array[GFC_MAX_DIMENSIONS];
5204   int i;
5205
5206   if (e->rank <= 0 || e->shape != NULL)
5207     return;
5208
5209   for (i = 0; i < e->rank; i++)
5210     if (!gfc_array_dimen_size (e, i, &array[i]))
5211       goto fail;
5212
5213   e->shape = gfc_get_shape (e->rank);
5214
5215   memcpy (e->shape, array, e->rank * sizeof (mpz_t));
5216
5217   return;
5218
5219 fail:
5220   for (i--; i >= 0; i--)
5221     mpz_clear (array[i]);
5222 }
5223
5224
5225 /* Given a variable expression node, compute the rank of the expression by
5226    examining the base symbol and any reference structures it may have.  */
5227
5228 void
5229 expression_rank (gfc_expr *e)
5230 {
5231   gfc_ref *ref;
5232   int i, rank;
5233
5234   /* Just to make sure, because EXPR_COMPCALL's also have an e->ref and that
5235      could lead to serious confusion...  */
5236   gcc_assert (e->expr_type != EXPR_COMPCALL);
5237
5238   if (e->ref == NULL)
5239     {
5240       if (e->expr_type == EXPR_ARRAY)
5241         goto done;
5242       /* Constructors can have a rank different from one via RESHAPE().  */
5243
5244       if (e->symtree == NULL)
5245         {
5246           e->rank = 0;
5247           goto done;
5248         }
5249
5250       e->rank = (e->symtree->n.sym->as == NULL)
5251                 ? 0 : e->symtree->n.sym->as->rank;
5252       goto done;
5253     }
5254
5255   rank = 0;
5256
5257   for (ref = e->ref; ref; ref = ref->next)
5258     {
5259       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.proc_pointer
5260           && ref->u.c.component->attr.function && !ref->next)
5261         rank = ref->u.c.component->as ? ref->u.c.component->as->rank : 0;
5262
5263       if (ref->type != REF_ARRAY)
5264         continue;
5265
5266       if (ref->u.ar.type == AR_FULL)
5267         {
5268           rank = ref->u.ar.as->rank;
5269           break;
5270         }
5271
5272       if (ref->u.ar.type == AR_SECTION)
5273         {
5274           /* Figure out the rank of the section.  */
5275           if (rank != 0)
5276             gfc_internal_error ("expression_rank(): Two array specs");
5277
5278           for (i = 0; i < ref->u.ar.dimen; i++)
5279             if (ref->u.ar.dimen_type[i] == DIMEN_RANGE
5280                 || ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
5281               rank++;
5282
5283           break;
5284         }
5285     }
5286
5287   e->rank = rank;
5288
5289 done:
5290   expression_shape (e);
5291 }
5292
5293
5294 static void
5295 add_caf_get_intrinsic (gfc_expr *e)
5296 {
5297   gfc_expr *wrapper, *tmp_expr;
5298   gfc_ref *ref;
5299   int n;
5300
5301   for (ref = e->ref; ref; ref = ref->next)
5302     if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
5303       break;
5304   if (ref == NULL)
5305     return;
5306
5307   for (n = ref->u.ar.dimen; n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
5308     if (ref->u.ar.dimen_type[n] != DIMEN_ELEMENT)
5309       return;
5310
5311   tmp_expr = XCNEW (gfc_expr);
5312   *tmp_expr = *e;
5313   wrapper = gfc_build_intrinsic_call (gfc_current_ns, GFC_ISYM_CAF_GET,
5314                                       "caf_get", tmp_expr->where, 1, tmp_expr);
5315   wrapper->ts = e->ts;
5316   wrapper->rank = e->rank;
5317   if (e->rank)
5318     wrapper->shape = gfc_copy_shape (e->shape, e->rank);
5319   *e = *wrapper;
5320   free (wrapper);
5321 }
5322
5323
5324 static void
5325 remove_caf_get_intrinsic (gfc_expr *e)
5326 {
5327   gcc_assert (e->expr_type == EXPR_FUNCTION && e->value.function.isym
5328               && e->value.function.isym->id == GFC_ISYM_CAF_GET);
5329   gfc_expr *e2 = e->value.function.actual->expr;
5330   e->value.function.actual->expr = NULL;
5331   gfc_free_actual_arglist (e->value.function.actual);
5332   gfc_free_shape (&e->shape, e->rank);
5333   *e = *e2;
5334   free (e2);
5335 }
5336
5337
5338 /* Resolve a variable expression.  */
5339
5340 static bool
5341 resolve_variable (gfc_expr *e)
5342 {
5343   gfc_symbol *sym;
5344   bool t;
5345
5346   t = true;
5347
5348   if (e->symtree == NULL)
5349     return false;
5350   sym = e->symtree->n.sym;
5351
5352   /* Use same check as for TYPE(*) below; this check has to be before TYPE(*)
5353      as ts.type is set to BT_ASSUMED in resolve_symbol.  */
5354   if (sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
5355     {
5356       if (!actual_arg || inquiry_argument)
5357         {
5358           gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute may only "
5359                      "be used as actual argument", sym->name, &e->where);
5360           return false;
5361         }
5362     }
5363   /* TS 29113, 407b.  */
5364   else if (e->ts.type == BT_ASSUMED)
5365     {
5366       if (!actual_arg)
5367         {
5368           gfc_error ("Assumed-type variable %s at %L may only be used "
5369                      "as actual argument", sym->name, &e->where);
5370           return false;
5371         }
5372       else if (inquiry_argument && !first_actual_arg)
5373         {
5374           /* FIXME: It doesn't work reliably as inquiry_argument is not set
5375              for all inquiry functions in resolve_function; the reason is
5376              that the function-name resolution happens too late in that
5377              function.  */
5378           gfc_error ("Assumed-type variable %s at %L as actual argument to "
5379                      "an inquiry function shall be the first argument",
5380                      sym->name, &e->where);
5381           return false;
5382         }
5383     }
5384   /* TS 29113, C535b.  */
5385   else if ((sym->ts.type == BT_CLASS && sym->attr.class_ok
5386             && CLASS_DATA (sym)->as
5387             && CLASS_DATA (sym)->as->type == AS_ASSUMED_RANK)
5388            || (sym->ts.type != BT_CLASS && sym->as
5389                && sym->as->type == AS_ASSUMED_RANK))
5390     {
5391       if (!actual_arg)
5392         {
5393           gfc_error ("Assumed-rank variable %s at %L may only be used as "
5394                      "actual argument", sym->name, &e->where);
5395           return false;
5396         }
5397       else if (inquiry_argument && !first_actual_arg)
5398         {
5399           /* FIXME: It doesn't work reliably as inquiry_argument is not set
5400              for all inquiry functions in resolve_function; the reason is
5401              that the function-name resolution happens too late in that
5402              function.  */
5403           gfc_error ("Assumed-rank variable %s at %L as actual argument "
5404                      "to an inquiry function shall be the first argument",
5405                      sym->name, &e->where);
5406           return false;
5407         }
5408     }
5409
5410   if ((sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK)) && e->ref
5411       && !(e->ref->type == REF_ARRAY && e->ref->u.ar.type == AR_FULL
5412            && e->ref->next == NULL))
5413     {
5414       gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall not have "
5415                  "a subobject reference", sym->name, &e->ref->u.ar.where);
5416       return false;
5417     }
5418   /* TS 29113, 407b.  */
5419   else if (e->ts.type == BT_ASSUMED && e->ref
5420            && !(e->ref->type == REF_ARRAY && e->ref->u.ar.type == AR_FULL
5421                 && e->ref->next == NULL))
5422     {
5423       gfc_error ("Assumed-type variable %s at %L shall not have a subobject "
5424                  "reference", sym->name, &e->ref->u.ar.where);
5425       return false;
5426     }
5427
5428   /* TS 29113, C535b.  */
5429   if (((sym->ts.type == BT_CLASS && sym->attr.class_ok
5430         && CLASS_DATA (sym)->as
5431         && CLASS_DATA (sym)->as->type == AS_ASSUMED_RANK)
5432        || (sym->ts.type != BT_CLASS && sym->as
5433            && sym->as->type == AS_ASSUMED_RANK))
5434       && e->ref
5435       && !(e->ref->type == REF_ARRAY && e->ref->u.ar.type == AR_FULL
5436            && e->ref->next == NULL))
5437     {
5438       gfc_error ("Assumed-rank variable %s at %L shall not have a subobject "
5439                  "reference", sym->name, &e->ref->u.ar.where);
5440       return false;
5441     }
5442
5443   /* For variables that are used in an associate (target => object) where
5444      the object's basetype is array valued while the target is scalar,
5445      the ts' type of the component refs is still array valued, which
5446      can't be translated that way.  */
5447   if (sym->assoc && e->rank == 0 && e->ref && sym->ts.type == BT_CLASS
5448       && sym->assoc->target && sym->assoc->target->ts.type == BT_CLASS
5449       && CLASS_DATA (sym->assoc->target)->as)
5450     {
5451       gfc_ref *ref = e->ref;
5452       while (ref)
5453         {
5454           switch (ref->type)
5455             {
5456             case REF_COMPONENT:
5457               ref->u.c.sym = sym->ts.u.derived;
5458               /* Stop the loop.  */
5459               ref = NULL;
5460               break;
5461             default:
5462               ref = ref->next;
5463               break;
5464             }
5465         }
5466     }
5467
5468   /* If this is an associate-name, it may be parsed with an array reference
5469      in error even though the target is scalar.  Fail directly in this case.
5470      TODO Understand why class scalar expressions must be excluded.  */
5471   if (sym->assoc && !(sym->ts.type == BT_CLASS && e->rank == 0))
5472     {
5473       if (sym->ts.type == BT_CLASS)
5474         gfc_fix_class_refs (e);
5475       if (!sym->attr.dimension && e->ref && e->ref->type == REF_ARRAY)
5476         return false;
5477       else if (sym->attr.dimension && (!e->ref || e->ref->type != REF_ARRAY))
5478         {
5479           /* This can happen because the parser did not detect that the
5480              associate name is an array and the expression had no array
5481              part_ref.  */
5482           gfc_ref *ref = gfc_get_ref ();
5483           ref->type = REF_ARRAY;
5484           ref->u.ar = *gfc_get_array_ref();
5485           ref->u.ar.type = AR_FULL;
5486           if (sym->as)
5487             {
5488               ref->u.ar.as = sym->as;
5489               ref->u.ar.dimen = sym->as->rank;
5490             }
5491           ref->next = e->ref;
5492           e->ref = ref;
5493
5494         }
5495     }
5496
5497   if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.generic)
5498     sym->ts.u.derived = gfc_find_dt_in_generic (sym->ts.u.derived);
5499
5500   /* On the other hand, the parser may not have known this is an array;
5501      in this case, we have to add a FULL reference.  */
5502   if (sym->assoc && sym->attr.dimension && !e->ref)
5503     {
5504       e->ref = gfc_get_ref ();
5505       e->ref->type = REF_ARRAY;
5506       e->ref->u.ar.type = AR_FULL;
5507       e->ref->u.ar.dimen = 0;
5508     }
5509
5510   /* Like above, but for class types, where the checking whether an array
5511      ref is present is more complicated.  Furthermore make sure not to add
5512      the full array ref to _vptr or _len refs.  */
5513   if (sym->assoc && sym->ts.type == BT_CLASS
5514       && CLASS_DATA (sym)->attr.dimension
5515       && (e->ts.type != BT_DERIVED || !e->ts.u.derived->attr.vtype))
5516     {
5517       gfc_ref *ref, *newref;
5518
5519       newref = gfc_get_ref ();
5520       newref->type = REF_ARRAY;
5521       newref->u.ar.type = AR_FULL;
5522       newref->u.ar.dimen = 0;
5523       /* Because this is an associate var and the first ref either is a ref to
5524          the _data component or not, no traversal of the ref chain is
5525          needed.  The array ref needs to be inserted after the _data ref,
5526          or when that is not present, which may happend for polymorphic
5527          types, then at the first position.  */
5528       ref = e->ref;
5529       if (!ref)
5530         e->ref = newref;
5531       else if (ref->type == REF_COMPONENT
5532                && strcmp ("_data", ref->u.c.component->name) == 0)
5533         {
5534           if (!ref->next || ref->next->type != REF_ARRAY)
5535             {
5536               newref->next = ref->next;
5537               ref->next = newref;
5538             }
5539           else
5540             /* Array ref present already.  */
5541             gfc_free_ref_list (newref);
5542         }
5543       else if (ref->type == REF_ARRAY)
5544         /* Array ref present already.  */
5545         gfc_free_ref_list (newref);
5546       else
5547         {
5548           newref->next = ref;
5549           e->ref = newref;
5550         }
5551     }
5552
5553   if (e->ref && !resolve_ref (e))
5554     return false;
5555
5556   if (sym->attr.flavor == FL_PROCEDURE
5557       && (!sym->attr.function
5558           || (sym->attr.function && sym->result
5559               && sym->result->attr.proc_pointer
5560               && !sym->result->attr.function)))
5561     {
5562       e->ts.type = BT_PROCEDURE;
5563       goto resolve_procedure;
5564     }
5565
5566   if (sym->ts.type != BT_UNKNOWN)
5567     gfc_variable_attr (e, &e->ts);
5568   else if (sym->attr.flavor == FL_PROCEDURE
5569            && sym->attr.function && sym->result
5570            && sym->result->ts.type != BT_UNKNOWN
5571            && sym->result->attr.proc_pointer)
5572     e->ts = sym->result->ts;
5573   else
5574     {
5575       /* Must be a simple variable reference.  */
5576       if (!gfc_set_default_type (sym, 1, sym->ns))
5577         return false;
5578       e->ts = sym->ts;
5579     }
5580
5581   if (check_assumed_size_reference (sym, e))
5582     return false;
5583
5584   /* Deal with forward references to entries during gfc_resolve_code, to
5585      satisfy, at least partially, 12.5.2.5.  */
5586   if (gfc_current_ns->entries
5587       && current_entry_id == sym->entry_id
5588       && cs_base
5589       && cs_base->current
5590       && cs_base->current->op != EXEC_ENTRY)
5591     {
5592       gfc_entry_list *entry;
5593       gfc_formal_arglist *formal;
5594       int n;
5595       bool seen, saved_specification_expr;
5596
5597       /* If the symbol is a dummy...  */
5598       if (sym->attr.dummy && sym->ns == gfc_current_ns)
5599         {
5600           entry = gfc_current_ns->entries;
5601           seen = false;
5602
5603           /* ...test if the symbol is a parameter of previous entries.  */
5604           for (; entry && entry->id <= current_entry_id; entry = entry->next)
5605             for (formal = entry->sym->formal; formal; formal = formal->next)
5606               {
5607                 if (formal->sym && sym->name == formal->sym->name)
5608                   {
5609                     seen = true;
5610                     break;
5611                   }
5612               }
5613
5614           /*  If it has not been seen as a dummy, this is an error.  */
5615           if (!seen)
5616             {
5617               if (specification_expr)
5618                 gfc_error ("Variable %qs, used in a specification expression"
5619                            ", is referenced at %L before the ENTRY statement "
5620                            "in which it is a parameter",
5621                            sym->name, &cs_base->current->loc);
5622               else
5623                 gfc_error ("Variable %qs is used at %L before the ENTRY "
5624                            "statement in which it is a parameter",
5625                            sym->name, &cs_base->current->loc);
5626               t = false;
5627             }
5628         }
5629
5630       /* Now do the same check on the specification expressions.  */
5631       saved_specification_expr = specification_expr;
5632       specification_expr = true;
5633       if (sym->ts.type == BT_CHARACTER
5634           && !gfc_resolve_expr (sym->ts.u.cl->length))
5635         t = false;
5636
5637       if (sym->as)
5638         for (n = 0; n < sym->as->rank; n++)
5639           {
5640              if (!gfc_resolve_expr (sym->as->lower[n]))
5641                t = false;
5642              if (!gfc_resolve_expr (sym->as->upper[n]))
5643                t = false;
5644           }
5645       specification_expr = saved_specification_expr;
5646
5647       if (t)
5648         /* Update the symbol's entry level.  */
5649         sym->entry_id = current_entry_id + 1;
5650     }
5651
5652   /* If a symbol has been host_associated mark it.  This is used latter,
5653      to identify if aliasing is possible via host association.  */
5654   if (sym->attr.flavor == FL_VARIABLE
5655         && gfc_current_ns->parent
5656         && (gfc_current_ns->parent == sym->ns
5657               || (gfc_current_ns->parent->parent
5658                     && gfc_current_ns->parent->parent == sym->ns)))
5659     sym->attr.host_assoc = 1;
5660
5661   if (gfc_current_ns->proc_name
5662       && sym->attr.dimension
5663       && (sym->ns != gfc_current_ns
5664           || sym->attr.use_assoc
5665           || sym->attr.in_common))
5666     gfc_current_ns->proc_name->attr.array_outer_dependency = 1;
5667
5668 resolve_procedure:
5669   if (t && !resolve_procedure_expression (e))
5670     t = false;
5671
5672   /* F2008, C617 and C1229.  */
5673   if (!inquiry_argument && (e->ts.type == BT_CLASS || e->ts.type == BT_DERIVED)
5674       && gfc_is_coindexed (e))
5675     {
5676       gfc_ref *ref, *ref2 = NULL;
5677
5678       for (ref = e->ref; ref; ref = ref->next)
5679         {
5680           if (ref->type == REF_COMPONENT)
5681             ref2 = ref;
5682           if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
5683             break;
5684         }
5685
5686       for ( ; ref; ref = ref->next)
5687         if (ref->type == REF_COMPONENT)
5688           break;
5689
5690       /* Expression itself is not coindexed object.  */
5691       if (ref && e->ts.type == BT_CLASS)
5692         {
5693           gfc_error ("Polymorphic subobject of coindexed object at %L",
5694                      &e->where);
5695           t = false;
5696         }
5697
5698       /* Expression itself is coindexed object.  */
5699       if (ref == NULL)
5700         {
5701           gfc_component *c;
5702           c = ref2 ? ref2->u.c.component : e->symtree->n.sym->components;
5703           for ( ; c; c = c->next)
5704             if (c->attr.allocatable && c->ts.type == BT_CLASS)
5705               {
5706                 gfc_error ("Coindexed object with polymorphic allocatable "
5707                          "subcomponent at %L", &e->where);
5708                 t = false;
5709                 break;
5710               }
5711         }
5712     }
5713
5714   if (t)
5715     expression_rank (e);
5716
5717   if (t && flag_coarray == GFC_FCOARRAY_LIB && gfc_is_coindexed (e))
5718     add_caf_get_intrinsic (e);
5719
5720   /* Simplify cases where access to a parameter array results in a
5721      single constant.  Suppress errors since those will have been
5722      issued before, as warnings.  */
5723   if (e->rank == 0 && sym->as && sym->attr.flavor == FL_PARAMETER)
5724     {
5725       gfc_push_suppress_errors ();
5726       gfc_simplify_expr (e, 1);
5727       gfc_pop_suppress_errors ();
5728     }
5729
5730   return t;
5731 }
5732
5733
5734 /* Checks to see that the correct symbol has been host associated.
5735    The only situation where this arises is that in which a twice
5736    contained function is parsed after the host association is made.
5737    Therefore, on detecting this, change the symbol in the expression
5738    and convert the array reference into an actual arglist if the old
5739    symbol is a variable.  */
5740 static bool
5741 check_host_association (gfc_expr *e)
5742 {
5743   gfc_symbol *sym, *old_sym;
5744   gfc_symtree *st;
5745   int n;
5746   gfc_ref *ref;
5747   gfc_actual_arglist *arg, *tail = NULL;
5748   bool retval = e->expr_type == EXPR_FUNCTION;
5749
5750   /*  If the expression is the result of substitution in
5751       interface.c(gfc_extend_expr) because there is no way in
5752       which the host association can be wrong.  */
5753   if (e->symtree == NULL
5754         || e->symtree->n.sym == NULL
5755         || e->user_operator)
5756     return retval;
5757
5758   old_sym = e->symtree->n.sym;
5759
5760   if (gfc_current_ns->parent
5761         && old_sym->ns != gfc_current_ns)
5762     {
5763       /* Use the 'USE' name so that renamed module symbols are
5764          correctly handled.  */
5765       gfc_find_symbol (e->symtree->name, gfc_current_ns, 1, &sym);
5766
5767       if (sym && old_sym != sym
5768               && sym->ts.type == old_sym->ts.type
5769               && sym->attr.flavor == FL_PROCEDURE
5770               && sym->attr.contained)
5771         {
5772           /* Clear the shape, since it might not be valid.  */
5773           gfc_free_shape (&e->shape, e->rank);
5774
5775           /* Give the expression the right symtree!  */
5776           gfc_find_sym_tree (e->symtree->name, NULL, 1, &st);
5777           gcc_assert (st != NULL);
5778
5779           if (old_sym->attr.flavor == FL_PROCEDURE
5780                 || e->expr_type == EXPR_FUNCTION)
5781             {
5782               /* Original was function so point to the new symbol, since
5783                  the actual argument list is already attached to the
5784                  expression.  */
5785               e->value.function.esym = NULL;
5786               e->symtree = st;
5787             }
5788           else
5789             {
5790               /* Original was variable so convert array references into
5791                  an actual arglist. This does not need any checking now
5792                  since resolve_function will take care of it.  */
5793               e->value.function.actual = NULL;
5794               e->expr_type = EXPR_FUNCTION;
5795               e->symtree = st;
5796
5797               /* Ambiguity will not arise if the array reference is not
5798                  the last reference.  */
5799               for (ref = e->ref; ref; ref = ref->next)
5800                 if (ref->type == REF_ARRAY && ref->next == NULL)
5801                   break;
5802
5803               gcc_assert (ref->type == REF_ARRAY);
5804
5805               /* Grab the start expressions from the array ref and
5806                  copy them into actual arguments.  */
5807               for (n = 0; n < ref->u.ar.dimen; n++)
5808                 {
5809                   arg = gfc_get_actual_arglist ();
5810                   arg->expr = gfc_copy_expr (ref->u.ar.start[n]);
5811                   if (e->value.function.actual == NULL)
5812                     tail = e->value.function.actual = arg;
5813                   else
5814                     {
5815                       tail->next = arg;
5816                       tail = arg;
5817                     }
5818                 }
5819
5820               /* Dump the reference list and set the rank.  */
5821               gfc_free_ref_list (e->ref);
5822               e->ref = NULL;
5823               e->rank = sym->as ? sym->as->rank : 0;
5824             }
5825
5826           gfc_resolve_expr (e);
5827           sym->refs++;
5828         }
5829     }
5830   /* This might have changed!  */
5831   return e->expr_type == EXPR_FUNCTION;
5832 }
5833
5834
5835 static void
5836 gfc_resolve_character_operator (gfc_expr *e)
5837 {
5838   gfc_expr *op1 = e->value.op.op1;
5839   gfc_expr *op2 = e->value.op.op2;
5840   gfc_expr *e1 = NULL;
5841   gfc_expr *e2 = NULL;
5842
5843   gcc_assert (e->value.op.op == INTRINSIC_CONCAT);
5844
5845   if (op1->ts.u.cl && op1->ts.u.cl->length)
5846     e1 = gfc_copy_expr (op1->ts.u.cl->length);
5847   else if (op1->expr_type == EXPR_CONSTANT)
5848     e1 = gfc_get_int_expr (gfc_charlen_int_kind, NULL,
5849                            op1->value.character.length);
5850
5851   if (op2->ts.u.cl && op2->ts.u.cl->length)
5852     e2 = gfc_copy_expr (op2->ts.u.cl->length);
5853   else if (op2->expr_type == EXPR_CONSTANT)
5854     e2 = gfc_get_int_expr (gfc_charlen_int_kind, NULL,
5855                            op2->value.character.length);
5856
5857   e->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
5858
5859   if (!e1 || !e2)
5860     {
5861       gfc_free_expr (e1);
5862       gfc_free_expr (e2);
5863
5864       return;
5865     }
5866
5867   e->ts.u.cl->length = gfc_add (e1, e2);
5868   e->ts.u.cl->length->ts.type = BT_INTEGER;
5869   e->ts.u.cl->length->ts.kind = gfc_charlen_int_kind;
5870   gfc_simplify_expr (e->ts.u.cl->length, 0);
5871   gfc_resolve_expr (e->ts.u.cl->length);
5872
5873   return;
5874 }
5875
5876
5877 /*  Ensure that an character expression has a charlen and, if possible, a
5878     length expression.  */
5879
5880 static void
5881 fixup_charlen (gfc_expr *e)
5882 {
5883   /* The cases fall through so that changes in expression type and the need
5884      for multiple fixes are picked up.  In all circumstances, a charlen should
5885      be available for the middle end to hang a backend_decl on.  */
5886   switch (e->expr_type)
5887     {
5888     case EXPR_OP:
5889       gfc_resolve_character_operator (e);
5890       /* FALLTHRU */
5891
5892     case EXPR_ARRAY:
5893       if (e->expr_type == EXPR_ARRAY)
5894         gfc_resolve_character_array_constructor (e);
5895       /* FALLTHRU */
5896
5897     case EXPR_SUBSTRING:
5898       if (!e->ts.u.cl && e->ref)
5899         gfc_resolve_substring_charlen (e);
5900       /* FALLTHRU */
5901
5902     default:
5903       if (!e->ts.u.cl)
5904         e->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
5905
5906       break;
5907     }
5908 }
5909
5910
5911 /* Update an actual argument to include the passed-object for type-bound
5912    procedures at the right position.  */
5913
5914 static gfc_actual_arglist*
5915 update_arglist_pass (gfc_actual_arglist* lst, gfc_expr* po, unsigned argpos,
5916                      const char *name)
5917 {
5918   gcc_assert (argpos > 0);
5919
5920   if (argpos == 1)
5921     {
5922       gfc_actual_arglist* result;
5923
5924       result = gfc_get_actual_arglist ();
5925       result->expr = po;
5926       result->next = lst;
5927       if (name)
5928         result->name = name;
5929
5930       return result;
5931     }
5932
5933   if (lst)
5934     lst->next = update_arglist_pass (lst->next, po, argpos - 1, name);
5935   else
5936     lst = update_arglist_pass (NULL, po, argpos - 1, name);
5937   return lst;
5938 }
5939
5940
5941 /* Extract the passed-object from an EXPR_COMPCALL (a copy of it).  */
5942
5943 static gfc_expr*
5944 extract_compcall_passed_object (gfc_expr* e)
5945 {
5946   gfc_expr* po;
5947
5948   if (e->expr_type == EXPR_UNKNOWN)
5949     {
5950       gfc_error ("Error in typebound call at %L",
5951                  &e->where);
5952       return NULL;
5953     }
5954
5955   gcc_assert (e->expr_type == EXPR_COMPCALL);
5956
5957   if (e->value.compcall.base_object)
5958     po = gfc_copy_expr (e->value.compcall.base_object);
5959   else
5960     {
5961       po = gfc_get_expr ();
5962       po->expr_type = EXPR_VARIABLE;
5963       po->symtree = e->symtree;
5964       po->ref = gfc_copy_ref (e->ref);
5965       po->where = e->where;
5966     }
5967
5968   if (!gfc_resolve_expr (po))
5969     return NULL;
5970
5971   return po;
5972 }
5973
5974
5975 /* Update the arglist of an EXPR_COMPCALL expression to include the
5976    passed-object.  */
5977
5978 static bool
5979 update_compcall_arglist (gfc_expr* e)
5980 {
5981   gfc_expr* po;
5982   gfc_typebound_proc* tbp;
5983
5984   tbp = e->value.compcall.tbp;
5985
5986   if (tbp->error)
5987     return false;
5988
5989   po = extract_compcall_passed_object (e);
5990   if (!po)
5991     return false;
5992
5993   if (tbp->nopass || e->value.compcall.ignore_pass)
5994     {
5995       gfc_free_expr (po);
5996       return true;
5997     }
5998
5999   if (tbp->pass_arg_num <= 0)
6000     return false;
6001
6002   e->value.compcall.actual = update_arglist_pass (e->value.compcall.actual, po,
6003                                                   tbp->pass_arg_num,
6004                                                   tbp->pass_arg);
6005
6006   return true;
6007 }
6008
6009
6010 /* Extract the passed object from a PPC call (a copy of it).  */
6011
6012 static gfc_expr*
6013 extract_ppc_passed_object (gfc_expr *e)
6014 {
6015   gfc_expr *po;
6016   gfc_ref **ref;
6017
6018   po = gfc_get_expr ();
6019   po->expr_type = EXPR_VARIABLE;
6020   po->symtree = e->symtree;
6021   po->ref = gfc_copy_ref (e->ref);
6022   po->where = e->where;
6023
6024   /* Remove PPC reference.  */
6025   ref = &po->ref;
6026   while ((*ref)->next)
6027     ref = &(*ref)->next;
6028   gfc_free_ref_list (*ref);
6029   *ref = NULL;
6030
6031   if (!gfc_resolve_expr (po))
6032     return NULL;
6033
6034   return po;
6035 }
6036
6037
6038 /* Update the actual arglist of a procedure pointer component to include the
6039    passed-object.  */
6040
6041 static bool
6042 update_ppc_arglist (gfc_expr* e)
6043 {
6044   gfc_expr* po;
6045   gfc_component *ppc;
6046   gfc_typebound_proc* tb;
6047
6048   ppc = gfc_get_proc_ptr_comp (e);
6049   if (!ppc)
6050     return false;
6051
6052   tb = ppc->tb;
6053
6054   if (tb->error)
6055     return false;
6056   else if (tb->nopass)
6057     return true;
6058
6059   po = extract_ppc_passed_object (e);
6060   if (!po)
6061     return false;
6062
6063   /* F08:R739.  */
6064   if (po->rank != 0)
6065     {
6066       gfc_error ("Passed-object at %L must be scalar", &e->where);
6067       return false;
6068     }
6069
6070   /* F08:C611.  */
6071   if (po->ts.type == BT_DERIVED && po->ts.u.derived->attr.abstract)
6072     {
6073       gfc_error ("Base object for procedure-pointer component call at %L is of"
6074                  " ABSTRACT type %qs", &e->where, po->ts.u.derived->name);
6075       return false;
6076     }
6077
6078   gcc_assert (tb->pass_arg_num > 0);
6079   e->value.compcall.actual = update_arglist_pass (e->value.compcall.actual, po,
6080                                                   tb->pass_arg_num,
6081                                                   tb->pass_arg);
6082
6083   return true;
6084 }
6085
6086
6087 /* Check that the object a TBP is called on is valid, i.e. it must not be
6088    of ABSTRACT type (as in subobject%abstract_parent%tbp()).  */
6089
6090 static bool
6091 check_typebound_baseobject (gfc_expr* e)
6092 {
6093   gfc_expr* base;
6094   bool return_value = false;
6095
6096   base = extract_compcall_passed_object (e);
6097   if (!base)
6098     return false;
6099
6100   if (base->ts.type != BT_DERIVED && base->ts.type != BT_CLASS)
6101     {
6102       gfc_error ("Error in typebound call at %L", &e->where);
6103       goto cleanup;
6104     }
6105
6106   if (base->ts.type == BT_CLASS && !gfc_expr_attr (base).class_ok)
6107     return false;
6108
6109   /* F08:C611.  */
6110   if (base->ts.type == BT_DERIVED && base->ts.u.derived->attr.abstract)
6111     {
6112       gfc_error ("Base object for type-bound procedure call at %L is of"
6113                  " ABSTRACT type %qs", &e->where, base->ts.u.derived->name);
6114       goto cleanup;
6115     }
6116
6117   /* F08:C1230. If the procedure called is NOPASS,
6118      the base object must be scalar.  */
6119   if (e->value.compcall.tbp->nopass && base->rank != 0)
6120     {
6121       gfc_error ("Base object for NOPASS type-bound procedure call at %L must"
6122                  " be scalar", &e->where);
6123       goto cleanup;
6124     }
6125
6126   return_value = true;
6127
6128 cleanup:
6129   gfc_free_expr (base);
6130   return return_value;
6131 }
6132
6133
6134 /* Resolve a call to a type-bound procedure, either function or subroutine,
6135    statically from the data in an EXPR_COMPCALL expression.  The adapted
6136    arglist and the target-procedure symtree are returned.  */
6137
6138 static bool
6139 resolve_typebound_static (gfc_expr* e, gfc_symtree** target,
6140                           gfc_actual_arglist** actual)
6141 {
6142   gcc_assert (e->expr_type == EXPR_COMPCALL);
6143   gcc_assert (!e->value.compcall.tbp->is_generic);
6144
6145   /* Update the actual arglist for PASS.  */
6146   if (!update_compcall_arglist (e))
6147     return false;
6148
6149   *actual = e->value.compcall.actual;
6150   *target = e->value.compcall.tbp->u.specific;
6151
6152   gfc_free_ref_list (e->ref);
6153   e->ref = NULL;
6154   e->value.compcall.actual = NULL;
6155
6156   /* If we find a deferred typebound procedure, check for derived types
6157      that an overriding typebound procedure has not been missed.  */
6158   if (e->value.compcall.name
6159       && !e->value.compcall.tbp->non_overridable
6160       && e->value.compcall.base_object
6161       && e->value.compcall.base_object->ts.type == BT_DERIVED)
6162     {
6163       gfc_symtree *st;
6164       gfc_symbol *derived;
6165
6166       /* Use the derived type of the base_object.  */
6167       derived = e->value.compcall.base_object->ts.u.derived;
6168       st = NULL;
6169
6170       /* If necessary, go through the inheritance chain.  */
6171       while (!st && derived)
6172         {
6173           /* Look for the typebound procedure 'name'.  */
6174           if (derived->f2k_derived && derived->f2k_derived->tb_sym_root)
6175             st = gfc_find_symtree (derived->f2k_derived->tb_sym_root,
6176                                    e->value.compcall.name);
6177           if (!st)
6178             derived = gfc_get_derived_super_type (derived);
6179         }
6180
6181       /* Now find the specific name in the derived type namespace.  */
6182       if (st && st->n.tb && st->n.tb->u.specific)
6183         gfc_find_sym_tree (st->n.tb->u.specific->name,
6184                            derived->ns, 1, &st);
6185       if (st)
6186         *target = st;
6187     }
6188   return true;
6189 }
6190
6191
6192 /* Get the ultimate declared type from an expression.  In addition,
6193    return the last class/derived type reference and the copy of the
6194    reference list.  If check_types is set true, derived types are
6195    identified as well as class references.  */
6196 static gfc_symbol*
6197 get_declared_from_expr (gfc_ref **class_ref, gfc_ref **new_ref,
6198                         gfc_expr *e, bool check_types)
6199 {
6200   gfc_symbol *declared;
6201   gfc_ref *ref;
6202
6203   declared = NULL;
6204   if (class_ref)
6205     *class_ref = NULL;
6206   if (new_ref)
6207     *new_ref = gfc_copy_ref (e->ref);
6208
6209   for (ref = e->ref; ref; ref = ref->next)
6210     {
6211       if (ref->type != REF_COMPONENT)
6212         continue;
6213
6214       if ((ref->u.c.component->ts.type == BT_CLASS
6215              || (check_types && gfc_bt_struct (ref->u.c.component->ts.type)))
6216           && ref->u.c.component->attr.flavor != FL_PROCEDURE)
6217         {
6218           declared = ref->u.c.component->ts.u.derived;
6219           if (class_ref)
6220             *class_ref = ref;
6221         }
6222     }
6223
6224   if (declared == NULL)
6225     declared = e->symtree->n.sym->ts.u.derived;
6226
6227   return declared;
6228 }
6229
6230
6231 /* Given an EXPR_COMPCALL calling a GENERIC typebound procedure, figure out
6232    which of the specific bindings (if any) matches the arglist and transform
6233    the expression into a call of that binding.  */
6234
6235 static bool
6236 resolve_typebound_generic_call (gfc_expr* e, const char **name)
6237 {
6238   gfc_typebound_proc* genproc;
6239   const char* genname;
6240   gfc_symtree *st;
6241   gfc_symbol *derived;
6242
6243   gcc_assert (e->expr_type == EXPR_COMPCALL);
6244   genname = e->value.compcall.name;
6245   genproc = e->value.compcall.tbp;
6246
6247   if (!genproc->is_generic)
6248     return true;
6249
6250   /* Try the bindings on this type and in the inheritance hierarchy.  */
6251   for (; genproc; genproc = genproc->overridden)
6252     {
6253       gfc_tbp_generic* g;
6254
6255       gcc_assert (genproc->is_generic);
6256       for (g = genproc->u.generic; g; g = g->next)
6257         {
6258           gfc_symbol* target;
6259           gfc_actual_arglist* args;
6260           bool matches;
6261
6262           gcc_assert (g->specific);
6263
6264           if (g->specific->error)
6265             continue;
6266
6267           target = g->specific->u.specific->n.sym;
6268
6269           /* Get the right arglist by handling PASS/NOPASS.  */
6270           args = gfc_copy_actual_arglist (e->value.compcall.actual);
6271           if (!g->specific->nopass)
6272             {
6273               gfc_expr* po;
6274               po = extract_compcall_passed_object (e);
6275               if (!po)
6276                 {
6277                   gfc_free_actual_arglist (args);
6278                   return false;
6279                 }
6280
6281               gcc_assert (g->specific->pass_arg_num > 0);
6282               gcc_assert (!g->specific->error);
6283               args = update_arglist_pass (args, po, g->specific->pass_arg_num,
6284                                           g->specific->pass_arg);
6285             }
6286           resolve_actual_arglist (args, target->attr.proc,
6287                                   is_external_proc (target)
6288                                   && gfc_sym_get_dummy_args (target) == NULL);
6289
6290           /* Check if this arglist matches the formal.  */
6291           matches = gfc_arglist_matches_symbol (&args, target);
6292
6293           /* Clean up and break out of the loop if we've found it.  */
6294           gfc_free_actual_arglist (args);
6295           if (matches)
6296             {
6297               e->value.compcall.tbp = g->specific;
6298               genname = g->specific_st->name;
6299               /* Pass along the name for CLASS methods, where the vtab
6300                  procedure pointer component has to be referenced.  */
6301               if (name)
6302                 *name = genname;
6303               goto success;
6304             }
6305         }
6306     }
6307
6308   /* Nothing matching found!  */
6309   gfc_error ("Found no matching specific binding for the call to the GENERIC"
6310              " %qs at %L", genname, &e->where);
6311   return false;
6312
6313 success:
6314   /* Make sure that we have the right specific instance for the name.  */
6315   derived = get_declared_from_expr (NULL, NULL, e, true);
6316
6317   st = gfc_find_typebound_proc (derived, NULL, genname, true, &e->where);
6318   if (st)
6319     e->value.compcall.tbp = st->n.tb;
6320
6321   return true;
6322 }
6323
6324
6325 /* Resolve a call to a type-bound subroutine.  */
6326
6327 static bool
6328 resolve_typebound_call (gfc_code* c, const char **name, bool *overridable)
6329 {
6330   gfc_actual_arglist* newactual;
6331   gfc_symtree* target;
6332
6333   /* Check that's really a SUBROUTINE.  */
6334   if (!c->expr1->value.compcall.tbp->subroutine)
6335     {
6336       if (!c->expr1->value.compcall.tbp->is_generic
6337           && c->expr1->value.compcall.tbp->u.specific
6338           && c->expr1->value.compcall.tbp->u.specific->n.sym
6339           && c->expr1->value.compcall.tbp->u.specific->n.sym->attr.subroutine)
6340         c->expr1->value.compcall.tbp->subroutine = 1;
6341       else
6342         {
6343           gfc_error ("%qs at %L should be a SUBROUTINE",
6344                      c->expr1->value.compcall.name, &c->loc);
6345           return false;
6346         }
6347     }
6348
6349   if (!check_typebound_baseobject (c->expr1))
6350     return false;
6351
6352   /* Pass along the name for CLASS methods, where the vtab
6353      procedure pointer component has to be referenced.  */
6354   if (name)
6355     *name = c->expr1->value.compcall.name;
6356
6357   if (!resolve_typebound_generic_call (c->expr1, name))
6358     return false;
6359
6360   /* Pass along the NON_OVERRIDABLE attribute of the specific TBP. */
6361   if (overridable)
6362     *overridable = !c->expr1->value.compcall.tbp->non_overridable;
6363
6364   /* Transform into an ordinary EXEC_CALL for now.  */
6365
6366   if (!resolve_typebound_static (c->expr1, &target, &newactual))
6367     return false;
6368
6369   c->ext.actual = newactual;
6370   c->symtree = target;
6371   c->op = (c->expr1->value.compcall.assign ? EXEC_ASSIGN_CALL : EXEC_CALL);
6372
6373   gcc_assert (!c->expr1->ref && !c->expr1->value.compcall.actual);
6374
6375   gfc_free_expr (c->expr1);
6376   c->expr1 = gfc_get_expr ();
6377   c->expr1->expr_type = EXPR_FUNCTION;
6378   c->expr1->symtree = target;
6379   c->expr1->where = c->loc;
6380
6381   return resolve_call (c);
6382 }
6383
6384
6385 /* Resolve a component-call expression.  */
6386 static bool
6387 resolve_compcall (gfc_expr* e, const char **name)
6388 {
6389   gfc_actual_arglist* newactual;
6390   gfc_symtree* target;
6391
6392   /* Check that's really a FUNCTION.  */
6393   if (!e->value.compcall.tbp->function)
6394     {
6395       gfc_error ("%qs at %L should be a FUNCTION",
6396                  e->value.compcall.name, &e->where);
6397       return false;
6398     }
6399
6400   /* These must not be assign-calls!  */
6401   gcc_assert (!e->value.compcall.assign);
6402
6403   if (!check_typebound_baseobject (e))
6404     return false;
6405
6406   /* Pass along the name for CLASS methods, where the vtab
6407      procedure pointer component has to be referenced.  */
6408   if (name)
6409     *name = e->value.compcall.name;
6410
6411   if (!resolve_typebound_generic_call (e, name))
6412     return false;
6413   gcc_assert (!e->value.compcall.tbp->is_generic);
6414
6415   /* Take the rank from the function's symbol.  */
6416   if (e->value.compcall.tbp->u.specific->n.sym->as)
6417     e->rank = e->value.compcall.tbp->u.specific->n.sym->as->rank;
6418
6419   /* For now, we simply transform it into an EXPR_FUNCTION call with the same
6420      arglist to the TBP's binding target.  */
6421
6422   if (!resolve_typebound_static (e, &target, &newactual))
6423     return false;
6424
6425   e->value.function.actual = newactual;
6426   e->value.function.name = NULL;
6427   e->value.function.esym = target->n.sym;
6428   e->value.function.isym = NULL;
6429   e->symtree = target;
6430   e->ts = target->n.sym->ts;
6431   e->expr_type = EXPR_FUNCTION;
6432
6433   /* Resolution is not necessary if this is a class subroutine; this
6434      function only has to identify the specific proc. Resolution of
6435      the call will be done next in resolve_typebound_call.  */
6436   return gfc_resolve_expr (e);
6437 }
6438
6439
6440 static bool resolve_fl_derived (gfc_symbol *sym);
6441
6442
6443 /* Resolve a typebound function, or 'method'. First separate all
6444    the non-CLASS references by calling resolve_compcall directly.  */
6445
6446 static bool
6447 resolve_typebound_function (gfc_expr* e)
6448 {
6449   gfc_symbol *declared;
6450   gfc_component *c;
6451   gfc_ref *new_ref;
6452   gfc_ref *class_ref;
6453   gfc_symtree *st;
6454   const char *name;
6455   gfc_typespec ts;
6456   gfc_expr *expr;
6457   bool overridable;
6458
6459   st = e->symtree;
6460
6461   /* Deal with typebound operators for CLASS objects.  */
6462   expr = e->value.compcall.base_object;
6463   overridable = !e->value.compcall.tbp->non_overridable;
6464   if (expr && expr->ts.type == BT_CLASS && e->value.compcall.name)
6465     {
6466       /* If the base_object is not a variable, the corresponding actual
6467          argument expression must be stored in e->base_expression so
6468          that the corresponding tree temporary can be used as the base
6469          object in gfc_conv_procedure_call.  */
6470       if (expr->expr_type != EXPR_VARIABLE)
6471         {
6472           gfc_actual_arglist *args;
6473
6474           for (args= e->value.function.actual; args; args = args->next)
6475             {
6476               if (expr == args->expr)
6477                 expr = args->expr;
6478             }
6479         }
6480
6481       /* Since the typebound operators are generic, we have to ensure
6482          that any delays in resolution are corrected and that the vtab
6483          is present.  */
6484       ts = expr->ts;
6485       declared = ts.u.derived;
6486       c = gfc_find_component (declared, "_vptr", true, true, NULL);
6487       if (c->ts.u.derived == NULL)
6488         c->ts.u.derived = gfc_find_derived_vtab (declared);
6489
6490       if (!resolve_compcall (e, &name))
6491         return false;
6492
6493       /* Use the generic name if it is there.  */
6494       name = name ? name : e->value.function.esym->name;
6495       e->symtree = expr->symtree;
6496       e->ref = gfc_copy_ref (expr->ref);
6497       get_declared_from_expr (&class_ref, NULL, e, false);
6498
6499       /* Trim away the extraneous references that emerge from nested
6500          use of interface.c (extend_expr).  */
6501       if (class_ref && class_ref->next)
6502         {
6503           gfc_free_ref_list (class_ref->next);
6504           class_ref->next = NULL;
6505         }
6506       else if (e->ref && !class_ref && expr->ts.type != BT_CLASS)
6507         {
6508           gfc_free_ref_list (e->ref);
6509           e->ref = NULL;
6510         }
6511
6512       gfc_add_vptr_component (e);
6513       gfc_add_component_ref (e, name);
6514       e->value.function.esym = NULL;
6515       if (expr->expr_type != EXPR_VARIABLE)
6516         e->base_expr = expr;
6517       return true;
6518     }
6519
6520   if (st == NULL)
6521     return resolve_compcall (e, NULL);
6522
6523   if (!resolve_ref (e))
6524     return false;
6525
6526   /* Get the CLASS declared type.  */
6527   declared = get_declared_from_expr (&class_ref, &new_ref, e, true);
6528
6529   if (!resolve_fl_derived (declared))
6530     return false;
6531
6532   /* Weed out cases of the ultimate component being a derived type.  */
6533   if ((class_ref && gfc_bt_struct (class_ref->u.c.component->ts.type))
6534          || (!class_ref && st->n.sym->ts.type != BT_CLASS))
6535     {
6536       gfc_free_ref_list (new_ref);
6537       return resolve_compcall (e, NULL);
6538     }
6539
6540   c = gfc_find_component (declared, "_data", true, true, NULL);
6541   declared = c->ts.u.derived;
6542
6543   /* Treat the call as if it is a typebound procedure, in order to roll
6544      out the correct name for the specific function.  */
6545   if (!resolve_compcall (e, &name))
6546     {
6547       gfc_free_ref_list (new_ref);
6548       return false;
6549     }
6550   ts = e->ts;
6551
6552   if (overridable)
6553     {
6554       /* Convert the expression to a procedure pointer component call.  */
6555       e->value.function.esym = NULL;
6556       e->symtree = st;
6557
6558       if (new_ref)
6559         e->ref = new_ref;
6560
6561       /* '_vptr' points to the vtab, which contains the procedure pointers.  */
6562       gfc_add_vptr_component (e);
6563       gfc_add_component_ref (e, name);
6564
6565       /* Recover the typespec for the expression.  This is really only
6566         necessary for generic procedures, where the additional call
6567         to gfc_add_component_ref seems to throw the collection of the
6568         correct typespec.  */
6569       e->ts = ts;
6570     }
6571   else if (new_ref)
6572     gfc_free_ref_list (new_ref);
6573
6574   return true;
6575 }
6576
6577 /* Resolve a typebound subroutine, or 'method'. First separate all
6578    the non-CLASS references by calling resolve_typebound_call
6579    directly.  */
6580
6581 static bool
6582 resolve_typebound_subroutine (gfc_code *code)
6583 {
6584   gfc_symbol *declared;
6585   gfc_component *c;
6586   gfc_ref *new_ref;
6587   gfc_ref *class_ref;
6588   gfc_symtree *st;
6589   const char *name;
6590   gfc_typespec ts;
6591   gfc_expr *expr;
6592   bool overridable;
6593
6594   st = code->expr1->symtree;
6595
6596   /* Deal with typebound operators for CLASS objects.  */
6597   expr = code->expr1->value.compcall.base_object;
6598   overridable = !code->expr1->value.compcall.tbp->non_overridable;
6599   if (expr && expr->ts.type == BT_CLASS && code->expr1->value.compcall.name)
6600     {
6601       /* If the base_object is not a variable, the corresponding actual
6602          argument expression must be stored in e->base_expression so
6603          that the corresponding tree temporary can be used as the base
6604          object in gfc_conv_procedure_call.  */
6605       if (expr->expr_type != EXPR_VARIABLE)
6606         {
6607           gfc_actual_arglist *args;
6608
6609           args= code->expr1->value.function.actual;
6610           for (; args; args = args->next)
6611             if (expr == args->expr)
6612               expr = args->expr;
6613         }
6614
6615       /* Since the typebound operators are generic, we have to ensure
6616          that any delays in resolution are corrected and that the vtab
6617          is present.  */
6618       declared = expr->ts.u.derived;
6619       c = gfc_find_component (declared, "_vptr", true, true, NULL);
6620       if (c->ts.u.derived == NULL)
6621         c->ts.u.derived = gfc_find_derived_vtab (declared);
6622
6623       if (!resolve_typebound_call (code, &name, NULL))
6624         return false;
6625
6626       /* Use the generic name if it is there.  */
6627       name = name ? name : code->expr1->value.function.esym->name;
6628       code->expr1->symtree = expr->symtree;
6629       code->expr1->ref = gfc_copy_ref (expr->ref);
6630
6631       /* Trim away the extraneous references that emerge from nested
6632          use of interface.c (extend_expr).  */
6633       get_declared_from_expr (&class_ref, NULL, code->expr1, false);
6634       if (class_ref && class_ref->next)
6635         {
6636           gfc_free_ref_list (class_ref->next);
6637           class_ref->next = NULL;
6638         }
6639       else if (code->expr1->ref && !class_ref)
6640         {
6641           gfc_free_ref_list (code->expr1->ref);
6642           code->expr1->ref = NULL;
6643         }
6644
6645       /* Now use the procedure in the vtable.  */
6646       gfc_add_vptr_component (code->expr1);
6647       gfc_add_component_ref (code->expr1, name);
6648       code->expr1->value.function.esym = NULL;
6649       if (expr->expr_type != EXPR_VARIABLE)
6650         code->expr1->base_expr = expr;
6651       return true;
6652     }
6653
6654   if (st == NULL)
6655     return resolve_typebound_call (code, NULL, NULL);
6656
6657   if (!resolve_ref (code->expr1))
6658     return false;
6659
6660   /* Get the CLASS declared type.  */
6661   get_declared_from_expr (&class_ref, &new_ref, code->expr1, true);
6662
6663   /* Weed out cases of the ultimate component being a derived type.  */
6664   if ((class_ref && gfc_bt_struct (class_ref->u.c.component->ts.type))
6665          || (!class_ref && st->n.sym->ts.type != BT_CLASS))
6666     {
6667       gfc_free_ref_list (new_ref);
6668       return resolve_typebound_call (code, NULL, NULL);
6669     }
6670
6671   if (!resolve_typebound_call (code, &name, &overridable))
6672     {
6673       gfc_free_ref_list (new_ref);
6674       return false;
6675     }
6676   ts = code->expr1->ts;
6677
6678   if (overridable)
6679     {
6680       /* Convert the expression to a procedure pointer component call.  */
6681       code->expr1->value.function.esym = NULL;
6682       code->expr1->symtree = st;
6683
6684       if (new_ref)
6685         code->expr1->ref = new_ref;
6686
6687       /* '_vptr' points to the vtab, which contains the procedure pointers.  */
6688       gfc_add_vptr_component (code->expr1);
6689       gfc_add_component_ref (code->expr1, name);
6690
6691       /* Recover the typespec for the expression.  This is really only
6692         necessary for generic procedures, where the additional call
6693         to gfc_add_component_ref seems to throw the collection of the
6694         correct typespec.  */
6695       code->expr1->ts = ts;
6696     }
6697   else if (new_ref)
6698     gfc_free_ref_list (new_ref);
6699
6700   return true;
6701 }
6702
6703
6704 /* Resolve a CALL to a Procedure Pointer Component (Subroutine).  */
6705
6706 static bool
6707 resolve_ppc_call (gfc_code* c)
6708 {
6709   gfc_component *comp;
6710
6711   comp = gfc_get_proc_ptr_comp (c->expr1);
6712   gcc_assert (comp != NULL);
6713
6714   c->resolved_sym = c->expr1->symtree->n.sym;
6715   c->expr1->expr_type = EXPR_VARIABLE;
6716
6717   if (!comp->attr.subroutine)
6718     gfc_add_subroutine (&comp->attr, comp->name, &c->expr1->where);
6719
6720   if (!resolve_ref (c->expr1))
6721     return false;
6722
6723   if (!update_ppc_arglist (c->expr1))
6724     return false;
6725
6726   c->ext.actual = c->expr1->value.compcall.actual;
6727
6728   if (!resolve_actual_arglist (c->ext.actual, comp->attr.proc,
6729                                !(comp->ts.interface
6730                                  && comp->ts.interface->formal)))
6731     return false;
6732
6733   if (!pure_subroutine (comp->ts.interface, comp->name, &c->expr1->where))
6734     return false;
6735
6736   gfc_ppc_use (comp, &c->expr1->value.compcall.actual, &c->expr1->where);
6737
6738   return true;
6739 }
6740
6741
6742 /* Resolve a Function Call to a Procedure Pointer Component (Function).  */
6743
6744 static bool
6745 resolve_expr_ppc (gfc_expr* e)
6746 {
6747   gfc_component *comp;
6748
6749   comp = gfc_get_proc_ptr_comp (e);
6750   gcc_assert (comp != NULL);
6751
6752   /* Convert to EXPR_FUNCTION.  */
6753   e->expr_type = EXPR_FUNCTION;
6754   e->value.function.isym = NULL;
6755   e->value.function.actual = e->value.compcall.actual;
6756   e->ts = comp->ts;
6757   if (comp->as != NULL)
6758     e->rank = comp->as->rank;
6759
6760   if (!comp->attr.function)
6761     gfc_add_function (&comp->attr, comp->name, &e->where);
6762
6763   if (!resolve_ref (e))
6764     return false;
6765
6766   if (!resolve_actual_arglist (e->value.function.actual, comp->attr.proc,
6767                                !(comp->ts.interface
6768                                  && comp->ts.interface->formal)))
6769     return false;
6770
6771   if (!update_ppc_arglist (e))
6772     return false;
6773
6774   if (!check_pure_function(e))
6775     return false;
6776
6777   gfc_ppc_use (comp, &e->value.compcall.actual, &e->where);
6778
6779   return true;
6780 }
6781
6782
6783 static bool
6784 gfc_is_expandable_expr (gfc_expr *e)
6785 {
6786   gfc_constructor *con;
6787
6788   if (e->expr_type == EXPR_ARRAY)
6789     {
6790       /* Traverse the constructor looking for variables that are flavor
6791          parameter.  Parameters must be expanded since they are fully used at
6792          compile time.  */
6793       con = gfc_constructor_first (e->value.constructor);
6794       for (; con; con = gfc_constructor_next (con))
6795         {
6796           if (con->expr->expr_type == EXPR_VARIABLE
6797               && con->expr->symtree
6798               && (con->expr->symtree->n.sym->attr.flavor == FL_PARAMETER
6799               || con->expr->symtree->n.sym->attr.flavor == FL_VARIABLE))
6800             return true;
6801           if (con->expr->expr_type == EXPR_ARRAY
6802               && gfc_is_expandable_expr (con->expr))
6803             return true;
6804         }
6805     }
6806
6807   return false;
6808 }
6809
6810
6811 /* Sometimes variables in specification expressions of the result
6812    of module procedures in submodules wind up not being the 'real'
6813    dummy.  Find this, if possible, in the namespace of the first
6814    formal argument.  */
6815
6816 static void
6817 fixup_unique_dummy (gfc_expr *e)
6818 {
6819   gfc_symtree *st = NULL;
6820   gfc_symbol *s = NULL;
6821
6822   if (e->symtree->n.sym->ns->proc_name
6823       && e->symtree->n.sym->ns->proc_name->formal)
6824     s = e->symtree->n.sym->ns->proc_name->formal->sym;
6825
6826   if (s != NULL)
6827     st = gfc_find_symtree (s->ns->sym_root, e->symtree->n.sym->name);
6828
6829   if (st != NULL
6830       && st->n.sym != NULL
6831       && st->n.sym->attr.dummy)
6832     e->symtree = st;
6833 }
6834
6835 /* Resolve an expression.  That is, make sure that types of operands agree
6836    with their operators, intrinsic operators are converted to function calls
6837    for overloaded types and unresolved function references are resolved.  */
6838
6839 bool
6840 gfc_resolve_expr (gfc_expr *e)
6841 {
6842   bool t;
6843   bool inquiry_save, actual_arg_save, first_actual_arg_save;
6844
6845   if (e == NULL)
6846     return true;
6847
6848   /* inquiry_argument only applies to variables.  */
6849   inquiry_save = inquiry_argument;
6850   actual_arg_save = actual_arg;
6851   first_actual_arg_save = first_actual_arg;
6852
6853   if (e->expr_type != EXPR_VARIABLE)
6854     {
6855       inquiry_argument = false;
6856       actual_arg = false;
6857       first_actual_arg = false;
6858     }
6859   else if (e->symtree != NULL
6860            && *e->symtree->name == '@'
6861            && e->symtree->n.sym->attr.dummy)
6862     {
6863       /* Deal with submodule specification expressions that are not
6864          found to be referenced in module.c(read_cleanup).  */
6865       fixup_unique_dummy (e);
6866     }
6867
6868   switch (e->expr_type)
6869     {
6870     case EXPR_OP:
6871       t = resolve_operator (e);
6872       break;
6873
6874     case EXPR_FUNCTION:
6875     case EXPR_VARIABLE:
6876
6877       if (check_host_association (e))
6878         t = resolve_function (e);
6879       else
6880         t = resolve_variable (e);
6881
6882       if (e->ts.type == BT_CHARACTER && e->ts.u.cl == NULL && e->ref
6883           && e->ref->type != REF_SUBSTRING)
6884         gfc_resolve_substring_charlen (e);
6885
6886       break;
6887
6888     case EXPR_COMPCALL:
6889       t = resolve_typebound_function (e);
6890       break;
6891
6892     case EXPR_SUBSTRING:
6893       t = resolve_ref (e);
6894       break;
6895
6896     case EXPR_CONSTANT:
6897     case EXPR_NULL:
6898       t = true;
6899       break;
6900
6901     case EXPR_PPC:
6902       t = resolve_expr_ppc (e);
6903       break;
6904
6905     case EXPR_ARRAY:
6906       t = false;
6907       if (!resolve_ref (e))
6908         break;
6909
6910       t = gfc_resolve_array_constructor (e);
6911       /* Also try to expand a constructor.  */
6912       if (t)
6913         {
6914           expression_rank (e);
6915           if (gfc_is_constant_expr (e) || gfc_is_expandable_expr (e))
6916             gfc_expand_constructor (e, false);
6917         }
6918
6919       /* This provides the opportunity for the length of constructors with
6920          character valued function elements to propagate the string length
6921          to the expression.  */
6922       if (t && e->ts.type == BT_CHARACTER)
6923         {
6924           /* For efficiency, we call gfc_expand_constructor for BT_CHARACTER
6925              here rather then add a duplicate test for it above.  */
6926           gfc_expand_constructor (e, false);
6927           t = gfc_resolve_character_array_constructor (e);
6928         }
6929
6930       break;
6931
6932     case EXPR_STRUCTURE:
6933       t = resolve_ref (e);
6934       if (!t)
6935         break;
6936
6937       t = resolve_structure_cons (e, 0);
6938       if (!t)
6939         break;
6940
6941       t = gfc_simplify_expr (e, 0);
6942       break;
6943
6944     default:
6945       gfc_internal_error ("gfc_resolve_expr(): Bad expression type");
6946     }
6947
6948   if (e->ts.type == BT_CHARACTER && t && !e->ts.u.cl)
6949     fixup_charlen (e);
6950
6951   inquiry_argument = inquiry_save;
6952   actual_arg = actual_arg_save;
6953   first_actual_arg = first_actual_arg_save;
6954
6955   return t;
6956 }
6957
6958
6959 /* Resolve an expression from an iterator.  They must be scalar and have
6960    INTEGER or (optionally) REAL type.  */
6961
6962 static bool
6963 gfc_resolve_iterator_expr (gfc_expr *expr, bool real_ok,
6964                            const char *name_msgid)
6965 {
6966   if (!gfc_resolve_expr (expr))
6967     return false;
6968
6969   if (expr->rank != 0)
6970     {
6971       gfc_error ("%s at %L must be a scalar", _(name_msgid), &expr->where);
6972       return false;
6973     }
6974
6975   if (expr->ts.type != BT_INTEGER)
6976     {
6977       if (expr->ts.type == BT_REAL)
6978         {
6979           if (real_ok)
6980             return gfc_notify_std (GFC_STD_F95_DEL,
6981                                    "%s at %L must be integer",
6982                                    _(name_msgid), &expr->where);
6983           else
6984             {
6985               gfc_error ("%s at %L must be INTEGER", _(name_msgid),
6986                          &expr->where);
6987               return false;
6988             }
6989         }
6990       else
6991         {
6992           gfc_error ("%s at %L must be INTEGER", _(name_msgid), &expr->where);
6993           return false;
6994         }
6995     }
6996   return true;
6997 }
6998
6999
7000 /* Resolve the expressions in an iterator structure.  If REAL_OK is
7001    false allow only INTEGER type iterators, otherwise allow REAL types.
7002    Set own_scope to true for ac-implied-do and data-implied-do as those
7003    have a separate scope such that, e.g., a INTENT(IN) doesn't apply.  */
7004
7005 bool
7006 gfc_resolve_iterator (gfc_iterator *iter, bool real_ok, bool own_scope)
7007 {
7008   if (!gfc_resolve_iterator_expr (iter->var, real_ok, "Loop variable"))
7009     return false;
7010
7011   if (!gfc_check_vardef_context (iter->var, false, false, own_scope,
7012                                  _("iterator variable")))
7013     return false;
7014
7015   if (!gfc_resolve_iterator_expr (iter->start, real_ok,
7016                                   "Start expression in DO loop"))
7017     return false;
7018
7019   if (!gfc_resolve_iterator_expr (iter->end, real_ok,
7020                                   "End expression in DO loop"))
7021     return false;
7022
7023   if (!gfc_resolve_iterator_expr (iter->step, real_ok,
7024                                   "Step expression in DO loop"))
7025     return false;
7026
7027   if (iter->step->expr_type == EXPR_CONSTANT)
7028     {
7029       if ((iter->step->ts.type == BT_INTEGER
7030            && mpz_cmp_ui (iter->step->value.integer, 0) == 0)
7031           || (iter->step->ts.type == BT_REAL
7032               && mpfr_sgn (iter->step->value.real) == 0))
7033         {
7034           gfc_error ("Step expression in DO loop at %L cannot be zero",
7035                      &iter->step->where);
7036           return false;
7037         }
7038     }
7039
7040   /* Convert start, end, and step to the same type as var.  */
7041   if (iter->start->ts.kind != iter->var->ts.kind
7042       || iter->start->ts.type != iter->var->ts.type)
7043     gfc_convert_type (iter->start, &iter->var->ts, 1);
7044
7045   if (iter->end->ts.kind != iter->var->ts.kind
7046       || iter->end->ts.type != iter->var->ts.type)
7047     gfc_convert_type (iter->end, &iter->var->ts, 1);
7048
7049   if (iter->step->ts.kind != iter->var->ts.kind
7050       || iter->step->ts.type != iter->var->ts.type)
7051     gfc_convert_type (iter->step, &iter->var->ts, 1);
7052
7053   if (iter->start->expr_type == EXPR_CONSTANT
7054       && iter->end->expr_type == EXPR_CONSTANT
7055       && iter->step->expr_type == EXPR_CONSTANT)
7056     {
7057       int sgn, cmp;
7058       if (iter->start->ts.type == BT_INTEGER)
7059         {
7060           sgn = mpz_cmp_ui (iter->step->value.integer, 0);
7061           cmp = mpz_cmp (iter->end->value.integer, iter->start->value.integer);
7062         }
7063       else
7064         {
7065           sgn = mpfr_sgn (iter->step->value.real);
7066           cmp = mpfr_cmp (iter->end->value.real, iter->start->value.real);
7067         }
7068       if (warn_zerotrip && ((sgn > 0 && cmp < 0) || (sgn < 0 && cmp > 0)))
7069         gfc_warning (OPT_Wzerotrip,
7070                      "DO loop at %L will be executed zero times",
7071                      &iter->step->where);
7072     }
7073
7074   if (iter->end->expr_type == EXPR_CONSTANT
7075       && iter->end->ts.type == BT_INTEGER
7076       && iter->step->expr_type == EXPR_CONSTANT
7077       && iter->step->ts.type == BT_INTEGER
7078       && (mpz_cmp_si (iter->step->value.integer, -1L) == 0
7079           || mpz_cmp_si (iter->step->value.integer, 1L) == 0))
7080     {
7081       bool is_step_positive = mpz_cmp_ui (iter->step->value.integer, 1) == 0;
7082       int k = gfc_validate_kind (BT_INTEGER, iter->end->ts.kind, false);
7083
7084       if (is_step_positive
7085           && mpz_cmp (iter->end->value.integer, gfc_integer_kinds[k].huge) == 0)
7086         gfc_warning (OPT_Wundefined_do_loop,
7087                      "DO loop at %L is undefined as it overflows",
7088                      &iter->step->where);
7089       else if (!is_step_positive
7090                && mpz_cmp (iter->end->value.integer,
7091                            gfc_integer_kinds[k].min_int) == 0)
7092         gfc_warning (OPT_Wundefined_do_loop,
7093                      "DO loop at %L is undefined as it underflows",
7094                      &iter->step->where);
7095     }
7096
7097   return true;
7098 }
7099
7100
7101 /* Traversal function for find_forall_index.  f == 2 signals that
7102    that variable itself is not to be checked - only the references.  */
7103
7104 static bool
7105 forall_index (gfc_expr *expr, gfc_symbol *sym, int *f)
7106 {
7107   if (expr->expr_type != EXPR_VARIABLE)
7108     return false;
7109
7110   /* A scalar assignment  */
7111   if (!expr->ref || *f == 1)
7112     {
7113       if (expr->symtree->n.sym == sym)
7114         return true;
7115       else
7116         return false;
7117     }
7118
7119   if (*f == 2)
7120     *f = 1;
7121   return false;
7122 }
7123
7124
7125 /* Check whether the FORALL index appears in the expression or not.
7126    Returns true if SYM is found in EXPR.  */
7127
7128 bool
7129 find_forall_index (gfc_expr *expr, gfc_symbol *sym, int f)
7130 {
7131   if (gfc_traverse_expr (expr, sym, forall_index, f))
7132     return true;
7133   else
7134     return false;
7135 }
7136
7137
7138 /* Resolve a list of FORALL iterators.  The FORALL index-name is constrained
7139    to be a scalar INTEGER variable.  The subscripts and stride are scalar
7140    INTEGERs, and if stride is a constant it must be nonzero.
7141    Furthermore "A subscript or stride in a forall-triplet-spec shall
7142    not contain a reference to any index-name in the
7143    forall-triplet-spec-list in which it appears." (7.5.4.1)  */
7144
7145 static void
7146 resolve_forall_iterators (gfc_forall_iterator *it)
7147 {
7148   gfc_forall_iterator *iter, *iter2;
7149
7150   for (iter = it; iter; iter = iter->next)
7151     {
7152       if (gfc_resolve_expr (iter->var)
7153           && (iter->var->ts.type != BT_INTEGER || iter->var->rank != 0))
7154         gfc_error ("FORALL index-name at %L must be a scalar INTEGER",
7155                    &iter->var->where);
7156
7157       if (gfc_resolve_expr (iter->start)
7158           && (iter->start->ts.type != BT_INTEGER || iter->start->rank != 0))
7159         gfc_error ("FORALL start expression at %L must be a scalar INTEGER",
7160                    &iter->start->where);
7161       if (iter->var->ts.kind != iter->start->ts.kind)
7162         gfc_convert_type (iter->start, &iter->var->ts, 1);
7163
7164       if (gfc_resolve_expr (iter->end)
7165           && (iter->end->ts.type != BT_INTEGER || iter->end->rank != 0))
7166         gfc_error ("FORALL end expression at %L must be a scalar INTEGER",
7167                    &iter->end->where);
7168       if (iter->var->ts.kind != iter->end->ts.kind)
7169         gfc_convert_type (iter->end, &iter->var->ts, 1);
7170
7171       if (gfc_resolve_expr (iter->stride))
7172         {
7173           if (iter->stride->ts.type != BT_INTEGER || iter->stride->rank != 0)
7174             gfc_error ("FORALL stride expression at %L must be a scalar %s",
7175                        &iter->stride->where, "INTEGER");
7176
7177           if (iter->stride->expr_type == EXPR_CONSTANT
7178               && mpz_cmp_ui (iter->stride->value.integer, 0) == 0)
7179             gfc_error ("FORALL stride expression at %L cannot be zero",
7180                        &iter->stride->where);
7181         }
7182       if (iter->var->ts.kind != iter->stride->ts.kind)
7183         gfc_convert_type (iter->stride, &iter->var->ts, 1);
7184     }
7185
7186   for (iter = it; iter; iter = iter->next)
7187     for (iter2 = iter; iter2; iter2 = iter2->next)
7188       {
7189         if (find_forall_index (iter2->start, iter->var->symtree->n.sym, 0)
7190             || find_forall_index (iter2->end, iter->var->symtree->n.sym, 0)
7191             || find_forall_index (iter2->stride, iter->var->symtree->n.sym, 0))
7192           gfc_error ("FORALL index %qs may not appear in triplet "
7193                      "specification at %L", iter->var->symtree->name,
7194                      &iter2->start->where);
7195       }
7196 }
7197
7198
7199 /* Given a pointer to a symbol that is a derived type, see if it's
7200    inaccessible, i.e. if it's defined in another module and the components are
7201    PRIVATE.  The search is recursive if necessary.  Returns zero if no
7202    inaccessible components are found, nonzero otherwise.  */
7203
7204 static int
7205 derived_inaccessible (gfc_symbol *sym)
7206 {
7207   gfc_component *c;
7208
7209   if (sym->attr.use_assoc && sym->attr.private_comp)
7210     return 1;
7211
7212   for (c = sym->components; c; c = c->next)
7213     {
7214         /* Prevent an infinite loop through this function.  */
7215         if (c->ts.type == BT_DERIVED && c->attr.pointer
7216             && sym == c->ts.u.derived)
7217           continue;
7218
7219         if (c->ts.type == BT_DERIVED && derived_inaccessible (c->ts.u.derived))
7220           return 1;
7221     }
7222
7223   return 0;
7224 }
7225
7226
7227 /* Resolve the argument of a deallocate expression.  The expression must be
7228    a pointer or a full array.  */
7229
7230 static bool
7231 resolve_deallocate_expr (gfc_expr *e)
7232 {
7233   symbol_attribute attr;
7234   int allocatable, pointer;
7235   gfc_ref *ref;
7236   gfc_symbol *sym;
7237   gfc_component *c;
7238   bool unlimited;
7239
7240   if (!gfc_resolve_expr (e))
7241     return false;
7242
7243   if (e->expr_type != EXPR_VARIABLE)
7244     goto bad;
7245
7246   sym = e->symtree->n.sym;
7247   unlimited = UNLIMITED_POLY(sym);
7248
7249   if (sym->ts.type == BT_CLASS)
7250     {
7251       allocatable = CLASS_DATA (sym)->attr.allocatable;
7252       pointer = CLASS_DATA (sym)->attr.class_pointer;
7253     }
7254   else
7255     {
7256       allocatable = sym->attr.allocatable;
7257       pointer = sym->attr.pointer;
7258     }
7259   for (ref = e->ref; ref; ref = ref->next)
7260     {
7261       switch (ref->type)
7262         {
7263         case REF_ARRAY:
7264           if (ref->u.ar.type != AR_FULL
7265               && !(ref->u.ar.type == AR_ELEMENT && ref->u.ar.as->rank == 0
7266                    && ref->u.ar.codimen && gfc_ref_this_image (ref)))
7267             allocatable = 0;
7268           break;
7269
7270         case REF_COMPONENT:
7271           c = ref->u.c.component;
7272           if (c->ts.type == BT_CLASS)
7273             {
7274               allocatable = CLASS_DATA (c)->attr.allocatable;
7275               pointer = CLASS_DATA (c)->attr.class_pointer;
7276             }
7277           else
7278             {
7279               allocatable = c->attr.allocatable;
7280               pointer = c->attr.pointer;
7281             }
7282           break;
7283
7284         case REF_SUBSTRING:
7285         case REF_INQUIRY:
7286           allocatable = 0;
7287           break;
7288         }
7289     }
7290
7291   attr = gfc_expr_attr (e);
7292
7293   if (allocatable == 0 && attr.pointer == 0 && !unlimited)
7294     {
7295     bad:
7296       gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",
7297                  &e->where);
7298       return false;
7299     }
7300
7301   /* F2008, C644.  */
7302   if (gfc_is_coindexed (e))
7303     {
7304       gfc_error ("Coindexed allocatable object at %L", &e->where);
7305       return false;
7306     }
7307
7308   if (pointer
7309       && !gfc_check_vardef_context (e, true, true, false,
7310                                     _("DEALLOCATE object")))
7311     return false;
7312   if (!gfc_check_vardef_context (e, false, true, false,
7313                                  _("DEALLOCATE object")))
7314     return false;
7315
7316   return true;
7317 }
7318
7319
7320 /* Returns true if the expression e contains a reference to the symbol sym.  */
7321 static bool
7322 sym_in_expr (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
7323 {
7324   if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym == sym)
7325     return true;
7326
7327   return false;
7328 }
7329
7330 bool
7331 gfc_find_sym_in_expr (gfc_symbol *sym, gfc_expr *e)
7332 {
7333   return gfc_traverse_expr (e, sym, sym_in_expr, 0);
7334 }
7335
7336
7337 /* Given the expression node e for an allocatable/pointer of derived type to be
7338    allocated, get the expression node to be initialized afterwards (needed for
7339    derived types with default initializers, and derived types with allocatable
7340    components that need nullification.)  */
7341
7342 gfc_expr *
7343 gfc_expr_to_initialize (gfc_expr *e)
7344 {
7345   gfc_expr *result;
7346   gfc_ref *ref;
7347   int i;
7348
7349   result = gfc_copy_expr (e);
7350
7351   /* Change the last array reference from AR_ELEMENT to AR_FULL.  */
7352   for (ref = result->ref; ref; ref = ref->next)
7353     if (ref->type == REF_ARRAY && ref->next == NULL)
7354       {
7355         ref->u.ar.type = AR_FULL;
7356
7357         for (i = 0; i < ref->u.ar.dimen; i++)
7358           ref->u.ar.start[i] = ref->u.ar.end[i] = ref->u.ar.stride[i] = NULL;
7359
7360         break;
7361       }
7362
7363   gfc_free_shape (&result->shape, result->rank);
7364
7365   /* Recalculate rank, shape, etc.  */
7366   gfc_resolve_expr (result);
7367   return result;
7368 }
7369
7370
7371 /* If the last ref of an expression is an array ref, return a copy of the
7372    expression with that one removed.  Otherwise, a copy of the original
7373    expression.  This is used for allocate-expressions and pointer assignment
7374    LHS, where there may be an array specification that needs to be stripped
7375    off when using gfc_check_vardef_context.  */
7376
7377 static gfc_expr*
7378 remove_last_array_ref (gfc_expr* e)
7379 {
7380   gfc_expr* e2;
7381   gfc_ref** r;
7382
7383   e2 = gfc_copy_expr (e);
7384   for (r = &e2->ref; *r; r = &(*r)->next)
7385     if ((*r)->type == REF_ARRAY && !(*r)->next)
7386       {
7387         gfc_free_ref_list (*r);
7388         *r = NULL;
7389         break;
7390       }
7391
7392   return e2;
7393 }
7394
7395
7396 /* Used in resolve_allocate_expr to check that a allocation-object and
7397    a source-expr are conformable.  This does not catch all possible
7398    cases; in particular a runtime checking is needed.  */
7399
7400 static bool
7401 conformable_arrays (gfc_expr *e1, gfc_expr *e2)
7402 {
7403   gfc_ref *tail;
7404   for (tail = e2->ref; tail && tail->next; tail = tail->next);
7405
7406   /* First compare rank.  */
7407   if ((tail && e1->rank != tail->u.ar.as->rank)
7408       || (!tail && e1->rank != e2->rank))
7409     {
7410       gfc_error ("Source-expr at %L must be scalar or have the "
7411                  "same rank as the allocate-object at %L",
7412                  &e1->where, &e2->where);
7413       return false;
7414     }
7415
7416   if (e1->shape)
7417     {
7418       int i;
7419       mpz_t s;
7420
7421       mpz_init (s);
7422
7423       for (i = 0; i < e1->rank; i++)
7424         {
7425           if (tail->u.ar.start[i] == NULL)
7426             break;
7427
7428           if (tail->u.ar.end[i])
7429             {
7430               mpz_set (s, tail->u.ar.end[i]->value.integer);
7431               mpz_sub (s, s, tail->u.ar.start[i]->value.integer);
7432               mpz_add_ui (s, s, 1);
7433             }
7434           else
7435             {
7436               mpz_set (s, tail->u.ar.start[i]->value.integer);
7437             }
7438
7439           if (mpz_cmp (e1->shape[i], s) != 0)
7440             {
7441               gfc_error ("Source-expr at %L and allocate-object at %L must "
7442                          "have the same shape", &e1->where, &e2->where);
7443               mpz_clear (s);
7444               return false;
7445             }
7446         }
7447
7448       mpz_clear (s);
7449     }
7450
7451   return true;
7452 }
7453
7454
7455 /* Resolve the expression in an ALLOCATE statement, doing the additional
7456    checks to see whether the expression is OK or not.  The expression must
7457    have a trailing array reference that gives the size of the array.  */
7458
7459 static bool
7460 resolve_allocate_expr (gfc_expr *e, gfc_code *code, bool *array_alloc_wo_spec)
7461 {
7462   int i, pointer, allocatable, dimension, is_abstract;
7463   int codimension;
7464   bool coindexed;
7465   bool unlimited;
7466   symbol_attribute attr;
7467   gfc_ref *ref, *ref2;
7468   gfc_expr *e2;
7469   gfc_array_ref *ar;
7470   gfc_symbol *sym = NULL;
7471   gfc_alloc *a;
7472   gfc_component *c;
7473   bool t;
7474
7475   /* Mark the utmost array component as being in allocate to allow DIMEN_STAR
7476      checking of coarrays.  */
7477   for (ref = e->ref; ref; ref = ref->next)
7478     if (ref->next == NULL)
7479       break;
7480
7481   if (ref && ref->type == REF_ARRAY)
7482     ref->u.ar.in_allocate = true;
7483
7484   if (!gfc_resolve_expr (e))
7485     goto failure;
7486
7487   /* Make sure the expression is allocatable or a pointer.  If it is
7488      pointer, the next-to-last reference must be a pointer.  */
7489
7490   ref2 = NULL;
7491   if (e->symtree)
7492     sym = e->symtree->n.sym;
7493
7494   /* Check whether ultimate component is abstract and CLASS.  */
7495   is_abstract = 0;
7496
7497   /* Is the allocate-object unlimited polymorphic?  */
7498   unlimited = UNLIMITED_POLY(e);
7499
7500   if (e->expr_type != EXPR_VARIABLE)
7501     {
7502       allocatable = 0;
7503       attr = gfc_expr_attr (e);
7504       pointer = attr.pointer;
7505       dimension = attr.dimension;
7506       codimension = attr.codimension;
7507     }
7508   else
7509     {
7510       if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
7511         {
7512           allocatable = CLASS_DATA (sym)->attr.allocatable;
7513           pointer = CLASS_DATA (sym)->attr.class_pointer;
7514           dimension = CLASS_DATA (sym)->attr.dimension;
7515           codimension = CLASS_DATA (sym)->attr.codimension;
7516           is_abstract = CLASS_DATA (sym)->attr.abstract;
7517         }
7518       else
7519         {
7520           allocatable = sym->attr.allocatable;
7521           pointer = sym->attr.pointer;
7522           dimension = sym->attr.dimension;
7523           codimension = sym->attr.codimension;
7524         }
7525
7526       coindexed = false;
7527
7528       for (ref = e->ref; ref; ref2 = ref, ref = ref->next)
7529         {
7530           switch (ref->type)
7531             {
7532               case REF_ARRAY:
7533                 if (ref->u.ar.codimen > 0)
7534                   {
7535                     int n;
7536                     for (n = ref->u.ar.dimen;
7537                          n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
7538                       if (ref->u.ar.dimen_type[n] != DIMEN_THIS_IMAGE)
7539                         {
7540                           coindexed = true;
7541                           break;
7542                         }
7543                    }
7544
7545                 if (ref->next != NULL)
7546                   pointer = 0;
7547                 break;
7548
7549               case REF_COMPONENT:
7550                 /* F2008, C644.  */
7551                 if (coindexed)
7552                   {
7553                     gfc_error ("Coindexed allocatable object at %L",
7554                                &e->where);
7555                     goto failure;
7556                   }
7557
7558                 c = ref->u.c.component;
7559                 if (c->ts.type == BT_CLASS)
7560                   {
7561                     allocatable = CLASS_DATA (c)->attr.allocatable;
7562                     pointer = CLASS_DATA (c)->attr.class_pointer;
7563                     dimension = CLASS_DATA (c)->attr.dimension;
7564                     codimension = CLASS_DATA (c)->attr.codimension;
7565                     is_abstract = CLASS_DATA (c)->attr.abstract;
7566                   }
7567                 else
7568                   {
7569                     allocatable = c->attr.allocatable;
7570                     pointer = c->attr.pointer;
7571                     dimension = c->attr.dimension;
7572                     codimension = c->attr.codimension;
7573                     is_abstract = c->attr.abstract;
7574                   }
7575                 break;
7576
7577               case REF_SUBSTRING:
7578               case REF_INQUIRY:
7579                 allocatable = 0;
7580                 pointer = 0;
7581                 break;
7582             }
7583         }
7584     }
7585
7586   /* Check for F08:C628.  */
7587   if (allocatable == 0 && pointer == 0 && !unlimited)
7588     {
7589       gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",
7590                  &e->where);
7591       goto failure;
7592     }
7593
7594   /* Some checks for the SOURCE tag.  */
7595   if (code->expr3)
7596     {
7597       /* Check F03:C631.  */
7598       if (!gfc_type_compatible (&e->ts, &code->expr3->ts))
7599         {
7600           gfc_error ("Type of entity at %L is type incompatible with "
7601                      "source-expr at %L", &e->where, &code->expr3->where);
7602           goto failure;
7603         }
7604
7605       /* Check F03:C632 and restriction following Note 6.18.  */
7606       if (code->expr3->rank > 0 && !conformable_arrays (code->expr3, e))
7607         goto failure;
7608
7609       /* Check F03:C633.  */
7610       if (code->expr3->ts.kind != e->ts.kind && !unlimited)
7611         {
7612           gfc_error ("The allocate-object at %L and the source-expr at %L "
7613                      "shall have the same kind type parameter",
7614                      &e->where, &code->expr3->where);
7615           goto failure;
7616         }
7617
7618       /* Check F2008, C642.  */
7619       if (code->expr3->ts.type == BT_DERIVED
7620           && ((codimension && gfc_expr_attr (code->expr3).lock_comp)
7621               || (code->expr3->ts.u.derived->from_intmod
7622                      == INTMOD_ISO_FORTRAN_ENV
7623                   && code->expr3->ts.u.derived->intmod_sym_id
7624                      == ISOFORTRAN_LOCK_TYPE)))
7625         {
7626           gfc_error ("The source-expr at %L shall neither be of type "
7627                      "LOCK_TYPE nor have a LOCK_TYPE component if "
7628                       "allocate-object at %L is a coarray",
7629                       &code->expr3->where, &e->where);
7630           goto failure;
7631         }
7632
7633       /* Check TS18508, C702/C703.  */
7634       if (code->expr3->ts.type == BT_DERIVED
7635           && ((codimension && gfc_expr_attr (code->expr3).event_comp)
7636               || (code->expr3->ts.u.derived->from_intmod
7637                      == INTMOD_ISO_FORTRAN_ENV
7638                   && code->expr3->ts.u.derived->intmod_sym_id
7639                      == ISOFORTRAN_EVENT_TYPE)))
7640         {
7641           gfc_error ("The source-expr at %L shall neither be of type "
7642                      "EVENT_TYPE nor have a EVENT_TYPE component if "
7643                       "allocate-object at %L is a coarray",
7644                       &code->expr3->where, &e->where);
7645           goto failure;
7646         }
7647     }
7648
7649   /* Check F08:C629.  */
7650   if (is_abstract && code->ext.alloc.ts.type == BT_UNKNOWN
7651       && !code->expr3)
7652     {
7653       gcc_assert (e->ts.type == BT_CLASS);
7654       gfc_error ("Allocating %s of ABSTRACT base type at %L requires a "
7655                  "type-spec or source-expr", sym->name, &e->where);
7656       goto failure;
7657     }
7658
7659   /* Check F08:C632.  */
7660   if (code->ext.alloc.ts.type == BT_CHARACTER && !e->ts.deferred
7661       && !UNLIMITED_POLY (e))
7662     {
7663       int cmp;
7664
7665       if (!e->ts.u.cl->length)
7666         goto failure;
7667
7668       cmp = gfc_dep_compare_expr (e->ts.u.cl->length,
7669                                   code->ext.alloc.ts.u.cl->length);
7670       if (cmp == 1 || cmp == -1 || cmp == -3)
7671         {
7672           gfc_error ("Allocating %s at %L with type-spec requires the same "
7673                      "character-length parameter as in the declaration",
7674                      sym->name, &e->where);
7675           goto failure;
7676         }
7677     }
7678
7679   /* In the variable definition context checks, gfc_expr_attr is used
7680      on the expression.  This is fooled by the array specification
7681      present in e, thus we have to eliminate that one temporarily.  */
7682   e2 = remove_last_array_ref (e);
7683   t = true;
7684   if (t && pointer)
7685     t = gfc_check_vardef_context (e2, true, true, false,
7686                                   _("ALLOCATE object"));
7687   if (t)
7688     t = gfc_check_vardef_context (e2, false, true, false,
7689                                   _("ALLOCATE object"));
7690   gfc_free_expr (e2);
7691   if (!t)
7692     goto failure;
7693
7694   if (e->ts.type == BT_CLASS && CLASS_DATA (e)->attr.dimension
7695         && !code->expr3 && code->ext.alloc.ts.type == BT_DERIVED)
7696     {
7697       /* For class arrays, the initialization with SOURCE is done
7698          using _copy and trans_call. It is convenient to exploit that
7699          when the allocated type is different from the declared type but
7700          no SOURCE exists by setting expr3.  */
7701       code->expr3 = gfc_default_initializer (&code->ext.alloc.ts);
7702     }
7703   else if (flag_coarray != GFC_FCOARRAY_LIB && e->ts.type == BT_DERIVED
7704            && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
7705            && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
7706     {
7707       /* We have to zero initialize the integer variable.  */
7708       code->expr3 = gfc_get_int_expr (gfc_default_integer_kind, &e->where, 0);
7709     }
7710
7711   if (e->ts.type == BT_CLASS && !unlimited && !UNLIMITED_POLY (code->expr3))
7712     {
7713       /* Make sure the vtab symbol is present when
7714          the module variables are generated.  */
7715       gfc_typespec ts = e->ts;
7716       if (code->expr3)
7717         ts = code->expr3->ts;
7718       else if (code->ext.alloc.ts.type == BT_DERIVED)
7719         ts = code->ext.alloc.ts;
7720
7721       /* Finding the vtab also publishes the type's symbol.  Therefore this
7722          statement is necessary.  */
7723       gfc_find_derived_vtab (ts.u.derived);
7724     }
7725   else if (unlimited && !UNLIMITED_POLY (code->expr3))
7726     {
7727       /* Again, make sure the vtab symbol is present when
7728          the module variables are generated.  */
7729       gfc_typespec *ts = NULL;
7730       if (code->expr3)
7731         ts = &code->expr3->ts;
7732       else
7733         ts = &code->ext.alloc.ts;
7734
7735       gcc_assert (ts);
7736
7737       /* Finding the vtab also publishes the type's symbol.  Therefore this
7738          statement is necessary.  */
7739       gfc_find_vtab (ts);
7740     }
7741
7742   if (dimension == 0 && codimension == 0)
7743     goto success;
7744
7745   /* Make sure the last reference node is an array specification.  */
7746
7747   if (!ref2 || ref2->type != REF_ARRAY || ref2->u.ar.type == AR_FULL
7748       || (dimension && ref2->u.ar.dimen == 0))
7749     {
7750       /* F08:C633.  */
7751       if (code->expr3)
7752         {
7753           if (!gfc_notify_std (GFC_STD_F2008, "Array specification required "
7754                                "in ALLOCATE statement at %L", &e->where))
7755             goto failure;
7756           if (code->expr3->rank != 0)
7757             *array_alloc_wo_spec = true;
7758           else
7759             {
7760               gfc_error ("Array specification or array-valued SOURCE= "
7761                          "expression required in ALLOCATE statement at %L",
7762                          &e->where);
7763               goto failure;
7764             }
7765         }
7766       else
7767         {
7768           gfc_error ("Array specification required in ALLOCATE statement "
7769                      "at %L", &e->where);
7770           goto failure;
7771         }
7772     }
7773
7774   /* Make sure that the array section reference makes sense in the
7775      context of an ALLOCATE specification.  */
7776
7777   ar = &ref2->u.ar;
7778
7779   if (codimension)
7780     for (i = ar->dimen; i < ar->dimen + ar->codimen; i++)
7781       {
7782         switch (ar->dimen_type[i])
7783           {
7784           case DIMEN_THIS_IMAGE:
7785             gfc_error ("Coarray specification required in ALLOCATE statement "
7786                        "at %L", &e->where);
7787             goto failure;
7788
7789           case  DIMEN_RANGE:
7790             if (ar->start[i] == 0 || ar->end[i] == 0)
7791               {
7792                 /* If ar->stride[i] is NULL, we issued a previous error.  */
7793                 if (ar->stride[i] == NULL)
7794                   gfc_error ("Bad array specification in ALLOCATE statement "
7795                              "at %L", &e->where);
7796                 goto failure;
7797               }
7798             else if (gfc_dep_compare_expr (ar->start[i], ar->end[i]) == 1)
7799               {
7800                 gfc_error ("Upper cobound is less than lower cobound at %L",
7801                            &ar->start[i]->where);
7802                 goto failure;
7803               }
7804             break;
7805
7806           case DIMEN_ELEMENT:
7807             if (ar->start[i]->expr_type == EXPR_CONSTANT)
7808               {
7809                 gcc_assert (ar->start[i]->ts.type == BT_INTEGER);
7810                 if (mpz_cmp_si (ar->start[i]->value.integer, 1) < 0)
7811                   {
7812                     gfc_error ("Upper cobound is less than lower cobound "
7813                                "of 1 at %L", &ar->start[i]->where);
7814                     goto failure;
7815                   }
7816               }
7817             break;
7818
7819           case DIMEN_STAR:
7820             break;
7821
7822           default:
7823             gfc_error ("Bad array specification in ALLOCATE statement at %L",
7824                        &e->where);
7825             goto failure;
7826
7827           }
7828       }
7829   for (i = 0; i < ar->dimen; i++)
7830     {
7831       if (ar->type == AR_ELEMENT || ar->type == AR_FULL)
7832         goto check_symbols;
7833
7834       switch (ar->dimen_type[i])
7835         {
7836         case DIMEN_ELEMENT:
7837           break;
7838
7839         case DIMEN_RANGE:
7840           if (ar->start[i] != NULL
7841               && ar->end[i] != NULL
7842               && ar->stride[i] == NULL)
7843             break;
7844
7845           /* Fall through.  */
7846
7847         case DIMEN_UNKNOWN:
7848         case DIMEN_VECTOR:
7849         case DIMEN_STAR:
7850         case DIMEN_THIS_IMAGE:
7851           gfc_error ("Bad array specification in ALLOCATE statement at %L",
7852                      &e->where);
7853           goto failure;
7854         }
7855
7856 check_symbols:
7857       for (a = code->ext.alloc.list; a; a = a->next)
7858         {
7859           sym = a->expr->symtree->n.sym;
7860
7861           /* TODO - check derived type components.  */
7862           if (gfc_bt_struct (sym->ts.type) || sym->ts.type == BT_CLASS)
7863             continue;
7864
7865           if ((ar->start[i] != NULL
7866                && gfc_find_sym_in_expr (sym, ar->start[i]))
7867               || (ar->end[i] != NULL
7868                   && gfc_find_sym_in_expr (sym, ar->end[i])))
7869             {
7870               gfc_error ("%qs must not appear in the array specification at "
7871                          "%L in the same ALLOCATE statement where it is "
7872                          "itself allocated", sym->name, &ar->where);
7873               goto failure;
7874             }
7875         }
7876     }
7877
7878   for (i = ar->dimen; i < ar->codimen + ar->dimen; i++)
7879     {
7880       if (ar->dimen_type[i] == DIMEN_ELEMENT
7881           || ar->dimen_type[i] == DIMEN_RANGE)
7882         {
7883           if (i == (ar->dimen + ar->codimen - 1))
7884             {
7885               gfc_error ("Expected '*' in coindex specification in ALLOCATE "
7886                          "statement at %L", &e->where);
7887               goto failure;
7888             }
7889           continue;
7890         }
7891
7892       if (ar->dimen_type[i] == DIMEN_STAR && i == (ar->dimen + ar->codimen - 1)
7893           && ar->stride[i] == NULL)
7894         break;
7895
7896       gfc_error ("Bad coarray specification in ALLOCATE statement at %L",
7897                  &e->where);
7898       goto failure;
7899     }
7900
7901 success:
7902   return true;
7903
7904 failure:
7905   return false;
7906 }
7907
7908
7909 static void
7910 resolve_allocate_deallocate (gfc_code *code, const char *fcn)
7911 {
7912   gfc_expr *stat, *errmsg, *pe, *qe;
7913   gfc_alloc *a, *p, *q;
7914
7915   stat = code->expr1;
7916   errmsg = code->expr2;
7917
7918   /* Check the stat variable.  */
7919   if (stat)
7920     {
7921       gfc_check_vardef_context (stat, false, false, false,
7922                                 _("STAT variable"));
7923
7924       if ((stat->ts.type != BT_INTEGER
7925            && !(stat->ref && (stat->ref->type == REF_ARRAY
7926                               || stat->ref->type == REF_COMPONENT)))
7927           || stat->rank > 0)
7928         gfc_error ("Stat-variable at %L must be a scalar INTEGER "
7929                    "variable", &stat->where);
7930
7931       for (p = code->ext.alloc.list; p; p = p->next)
7932         if (p->expr->symtree->n.sym->name == stat->symtree->n.sym->name)
7933           {
7934             gfc_ref *ref1, *ref2;
7935             bool found = true;
7936
7937             for (ref1 = p->expr->ref, ref2 = stat->ref; ref1 && ref2;
7938                  ref1 = ref1->next, ref2 = ref2->next)
7939               {
7940                 if (ref1->type != REF_COMPONENT || ref2->type != REF_COMPONENT)
7941                   continue;
7942                 if (ref1->u.c.component->name != ref2->u.c.component->name)
7943                   {
7944                     found = false;
7945                     break;
7946                   }
7947               }
7948
7949             if (found)
7950               {
7951                 gfc_error ("Stat-variable at %L shall not be %sd within "
7952                            "the same %s statement", &stat->where, fcn, fcn);
7953                 break;
7954               }
7955           }
7956     }
7957
7958   /* Check the errmsg variable.  */
7959   if (errmsg)
7960     {
7961       if (!stat)
7962         gfc_warning (0, "ERRMSG at %L is useless without a STAT tag",
7963                      &errmsg->where);
7964
7965       gfc_check_vardef_context (errmsg, false, false, false,
7966                                 _("ERRMSG variable"));
7967
7968       /* F18:R928  alloc-opt             is ERRMSG = errmsg-variable
7969          F18:R930  errmsg-variable       is scalar-default-char-variable
7970          F18:R906  default-char-variable is variable
7971          F18:C906  default-char-variable shall be default character.  */
7972       if ((errmsg->ts.type != BT_CHARACTER
7973            && !(errmsg->ref
7974                 && (errmsg->ref->type == REF_ARRAY
7975                     || errmsg->ref->type == REF_COMPONENT)))
7976           || errmsg->rank > 0
7977           || errmsg->ts.kind != gfc_default_character_kind)
7978         gfc_error ("ERRMSG variable at %L shall be a scalar default CHARACTER "
7979                    "variable", &errmsg->where);
7980
7981       for (p = code->ext.alloc.list; p; p = p->next)
7982         if (p->expr->symtree->n.sym->name == errmsg->symtree->n.sym->name)
7983           {
7984             gfc_ref *ref1, *ref2;
7985             bool found = true;
7986
7987             for (ref1 = p->expr->ref, ref2 = errmsg->ref; ref1 && ref2;
7988                  ref1 = ref1->next, ref2 = ref2->next)
7989               {
7990                 if (ref1->type != REF_COMPONENT || ref2->type != REF_COMPONENT)
7991                   continue;
7992                 if (ref1->u.c.component->name != ref2->u.c.component->name)
7993                   {
7994                     found = false;
7995                     break;
7996                   }
7997               }
7998
7999             if (found)
8000               {
8001                 gfc_error ("Errmsg-variable at %L shall not be %sd within "
8002                            "the same %s statement", &errmsg->where, fcn, fcn);
8003                 break;
8004               }
8005           }
8006     }
8007
8008   /* Check that an allocate-object appears only once in the statement.  */
8009
8010   for (p = code->ext.alloc.list; p; p = p->next)
8011     {
8012       pe = p->expr;
8013       for (q = p->next; q; q = q->next)
8014         {
8015           qe = q->expr;
8016           if (pe->symtree->n.sym->name == qe->symtree->n.sym->name)
8017             {
8018               /* This is a potential collision.  */
8019               gfc_ref *pr = pe->ref;
8020               gfc_ref *qr = qe->ref;
8021
8022               /* Follow the references  until
8023                  a) They start to differ, in which case there is no error;
8024                  you can deallocate a%b and a%c in a single statement
8025                  b) Both of them stop, which is an error
8026                  c) One of them stops, which is also an error.  */
8027               while (1)
8028                 {
8029                   if (pr == NULL && qr == NULL)
8030                     {
8031                       gfc_error ("Allocate-object at %L also appears at %L",
8032                                  &pe->where, &qe->where);
8033                       break;
8034                     }
8035                   else if (pr != NULL && qr == NULL)
8036                     {
8037                       gfc_error ("Allocate-object at %L is subobject of"
8038                                  " object at %L", &pe->where, &qe->where);
8039                       break;
8040                     }
8041                   else if (pr == NULL && qr != NULL)
8042                     {
8043                       gfc_error ("Allocate-object at %L is subobject of"
8044                                  " object at %L", &qe->where, &pe->where);
8045                       break;
8046                     }
8047                   /* Here, pr != NULL && qr != NULL  */
8048                   gcc_assert(pr->type == qr->type);
8049                   if (pr->type == REF_ARRAY)
8050                     {
8051                       /* Handle cases like allocate(v(3)%x(3), v(2)%x(3)),
8052                          which are legal.  */
8053                       gcc_assert (qr->type == REF_ARRAY);
8054
8055                       if (pr->next && qr->next)
8056                         {
8057                           int i;
8058                           gfc_array_ref *par = &(pr->u.ar);
8059                           gfc_array_ref *qar = &(qr->u.ar);
8060
8061                           for (i=0; i<par->dimen; i++)
8062                             {
8063                               if ((par->start[i] != NULL
8064                                    || qar->start[i] != NULL)
8065                                   && gfc_dep_compare_expr (par->start[i],
8066                                                            qar->start[i]) != 0)
8067                                 goto break_label;
8068                             }
8069                         }
8070                     }
8071                   else
8072                     {
8073                       if (pr->u.c.component->name != qr->u.c.component->name)
8074                         break;
8075                     }
8076
8077                   pr = pr->next;
8078                   qr = qr->next;
8079                 }
8080             break_label:
8081               ;
8082             }
8083         }
8084     }
8085
8086   if (strcmp (fcn, "ALLOCATE") == 0)
8087     {
8088       bool arr_alloc_wo_spec = false;
8089
8090       /* Resolving the expr3 in the loop over all objects to allocate would
8091          execute loop invariant code for each loop item.  Therefore do it just
8092          once here.  */
8093       if (code->expr3 && code->expr3->mold
8094           && code->expr3->ts.type == BT_DERIVED)
8095         {
8096           /* Default initialization via MOLD (non-polymorphic).  */
8097           gfc_expr *rhs = gfc_default_initializer (&code->expr3->ts);
8098           if (rhs != NULL)
8099             {
8100               gfc_resolve_expr (rhs);
8101               gfc_free_expr (code->expr3);
8102               code->expr3 = rhs;
8103             }
8104         }
8105       for (a = code->ext.alloc.list; a; a = a->next)
8106         resolve_allocate_expr (a->expr, code, &arr_alloc_wo_spec);
8107
8108       if (arr_alloc_wo_spec && code->expr3)
8109         {
8110           /* Mark the allocate to have to take the array specification
8111              from the expr3.  */
8112           code->ext.alloc.arr_spec_from_expr3 = 1;
8113         }
8114     }
8115   else
8116     {
8117       for (a = code->ext.alloc.list; a; a = a->next)
8118         resolve_deallocate_expr (a->expr);
8119     }
8120 }
8121
8122
8123 /************ SELECT CASE resolution subroutines ************/
8124
8125 /* Callback function for our mergesort variant.  Determines interval
8126    overlaps for CASEs. Return <0 if op1 < op2, 0 for overlap, >0 for
8127    op1 > op2.  Assumes we're not dealing with the default case.
8128    We have op1 = (:L), (K:L) or (K:) and op2 = (:N), (M:N) or (M:).
8129    There are nine situations to check.  */
8130
8131 static int
8132 compare_cases (const gfc_case *op1, const gfc_case *op2)
8133 {
8134   int retval;
8135
8136   if (op1->low == NULL) /* op1 = (:L)  */
8137     {
8138       /* op2 = (:N), so overlap.  */
8139       retval = 0;
8140       /* op2 = (M:) or (M:N),  L < M  */
8141       if (op2->low != NULL
8142           && gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
8143         retval = -1;
8144     }
8145   else if (op1->high == NULL) /* op1 = (K:)  */
8146     {
8147       /* op2 = (M:), so overlap.  */
8148       retval = 0;
8149       /* op2 = (:N) or (M:N), K > N  */
8150       if (op2->high != NULL
8151           && gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
8152         retval = 1;
8153     }
8154   else /* op1 = (K:L)  */
8155     {
8156       if (op2->low == NULL)       /* op2 = (:N), K > N  */
8157         retval = (gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
8158                  ? 1 : 0;
8159       else if (op2->high == NULL) /* op2 = (M:), L < M  */
8160         retval = (gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
8161                  ? -1 : 0;
8162       else                      /* op2 = (M:N)  */
8163         {
8164           retval =  0;
8165           /* L < M  */
8166           if (gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
8167             retval =  -1;
8168           /* K > N  */
8169           else if (gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
8170             retval =  1;
8171         }
8172     }
8173
8174   return retval;
8175 }
8176
8177
8178 /* Merge-sort a double linked case list, detecting overlap in the
8179    process.  LIST is the head of the double linked case list before it
8180    is sorted.  Returns the head of the sorted list if we don't see any
8181    overlap, or NULL otherwise.  */
8182
8183 static gfc_case *
8184 check_case_overlap (gfc_case *list)
8185 {
8186   gfc_case *p, *q, *e, *tail;
8187   int insize, nmerges, psize, qsize, cmp, overlap_seen;
8188
8189   /* If the passed list was empty, return immediately.  */
8190   if (!list)
8191     return NULL;
8192
8193   overlap_seen = 0;
8194   insize = 1;
8195
8196   /* Loop unconditionally.  The only exit from this loop is a return
8197      statement, when we've finished sorting the case list.  */
8198   for (;;)
8199     {
8200       p = list;
8201       list = NULL;
8202       tail = NULL;
8203
8204       /* Count the number of merges we do in this pass.  */
8205       nmerges = 0;
8206
8207       /* Loop while there exists a merge to be done.  */
8208       while (p)
8209         {
8210           int i;
8211
8212           /* Count this merge.  */
8213           nmerges++;
8214
8215           /* Cut the list in two pieces by stepping INSIZE places
8216              forward in the list, starting from P.  */
8217           psize = 0;
8218           q = p;
8219           for (i = 0; i < insize; i++)
8220             {
8221               psize++;
8222               q = q->right;
8223               if (!q)
8224                 break;
8225             }
8226           qsize = insize;
8227
8228           /* Now we have two lists.  Merge them!  */
8229           while (psize > 0 || (qsize > 0 && q != NULL))
8230             {
8231               /* See from which the next case to merge comes from.  */
8232               if (psize == 0)
8233                 {
8234                   /* P is empty so the next case must come from Q.  */
8235                   e = q;
8236                   q = q->right;
8237                   qsize--;
8238                 }
8239               else if (qsize == 0 || q == NULL)
8240                 {
8241                   /* Q is empty.  */
8242                   e = p;
8243                   p = p->right;
8244                   psize--;
8245                 }
8246               else
8247                 {
8248                   cmp = compare_cases (p, q);
8249                   if (cmp < 0)
8250                     {
8251                       /* The whole case range for P is less than the
8252                          one for Q.  */
8253                       e = p;
8254                       p = p->right;
8255                       psize--;
8256                     }
8257                   else if (cmp > 0)
8258                     {
8259                       /* The whole case range for Q is greater than
8260                          the case range for P.  */
8261                       e = q;
8262                       q = q->right;
8263                       qsize--;
8264                     }
8265                   else
8266                     {
8267                       /* The cases overlap, or they are the same
8268                          element in the list.  Either way, we must
8269                          issue an error and get the next case from P.  */
8270                       /* FIXME: Sort P and Q by line number.  */
8271                       gfc_error ("CASE label at %L overlaps with CASE "
8272                                  "label at %L", &p->where, &q->where);
8273                       overlap_seen = 1;
8274                       e = p;
8275                       p = p->right;
8276                       psize--;
8277                     }
8278                 }
8279
8280                 /* Add the next element to the merged list.  */
8281               if (tail)
8282                 tail->right = e;
8283               else
8284                 list = e;
8285               e->left = tail;
8286               tail = e;
8287             }
8288
8289           /* P has now stepped INSIZE places along, and so has Q.  So
8290              they're the same.  */
8291           p = q;
8292         }
8293       tail->right = NULL;
8294
8295       /* If we have done only one merge or none at all, we've
8296          finished sorting the cases.  */
8297       if (nmerges <= 1)
8298         {
8299           if (!overlap_seen)
8300             return list;
8301           else
8302             return NULL;
8303         }
8304
8305       /* Otherwise repeat, merging lists twice the size.  */
8306       insize *= 2;
8307     }
8308 }
8309
8310
8311 /* Check to see if an expression is suitable for use in a CASE statement.
8312    Makes sure that all case expressions are scalar constants of the same
8313    type.  Return false if anything is wrong.  */
8314
8315 static bool
8316 validate_case_label_expr (gfc_expr *e, gfc_expr *case_expr)
8317 {
8318   if (e == NULL) return true;
8319
8320   if (e->ts.type != case_expr->ts.type)
8321     {
8322       gfc_error ("Expression in CASE statement at %L must be of type %s",
8323                  &e->where, gfc_basic_typename (case_expr->ts.type));
8324       return false;
8325     }
8326
8327   /* C805 (R808) For a given case-construct, each case-value shall be of
8328      the same type as case-expr.  For character type, length differences
8329      are allowed, but the kind type parameters shall be the same.  */
8330
8331   if (case_expr->ts.type == BT_CHARACTER && e->ts.kind != case_expr->ts.kind)
8332     {
8333       gfc_error ("Expression in CASE statement at %L must be of kind %d",
8334                  &e->where, case_expr->ts.kind);
8335       return false;
8336     }
8337
8338   /* Convert the case value kind to that of case expression kind,
8339      if needed */
8340
8341   if (e->ts.kind != case_expr->ts.kind)
8342     gfc_convert_type_warn (e, &case_expr->ts, 2, 0);
8343
8344   if (e->rank != 0)
8345     {
8346       gfc_error ("Expression in CASE statement at %L must be scalar",
8347                  &e->where);
8348       return false;
8349     }
8350
8351   return true;
8352 }
8353
8354
8355 /* Given a completely parsed select statement, we:
8356
8357      - Validate all expressions and code within the SELECT.
8358      - Make sure that the selection expression is not of the wrong type.
8359      - Make sure that no case ranges overlap.
8360      - Eliminate unreachable cases and unreachable code resulting from
8361        removing case labels.
8362
8363    The standard does allow unreachable cases, e.g. CASE (5:3).  But
8364    they are a hassle for code generation, and to prevent that, we just
8365    cut them out here.  This is not necessary for overlapping cases
8366    because they are illegal and we never even try to generate code.
8367
8368    We have the additional caveat that a SELECT construct could have
8369    been a computed GOTO in the source code. Fortunately we can fairly
8370    easily work around that here: The case_expr for a "real" SELECT CASE
8371    is in code->expr1, but for a computed GOTO it is in code->expr2. All
8372    we have to do is make sure that the case_expr is a scalar integer
8373    expression.  */
8374
8375 static void
8376 resolve_select (gfc_code *code, bool select_type)
8377 {
8378   gfc_code *body;
8379   gfc_expr *case_expr;
8380   gfc_case *cp, *default_case, *tail, *head;
8381   int seen_unreachable;
8382   int seen_logical;
8383   int ncases;
8384   bt type;
8385   bool t;
8386
8387   if (code->expr1 == NULL)
8388     {
8389       /* This was actually a computed GOTO statement.  */
8390       case_expr = code->expr2;
8391       if (case_expr->ts.type != BT_INTEGER|| case_expr->rank != 0)
8392         gfc_error ("Selection expression in computed GOTO statement "
8393                    "at %L must be a scalar integer expression",
8394                    &case_expr->where);
8395
8396       /* Further checking is not necessary because this SELECT was built
8397          by the compiler, so it should always be OK.  Just move the
8398          case_expr from expr2 to expr so that we can handle computed
8399          GOTOs as normal SELECTs from here on.  */
8400       code->expr1 = code->expr2;
8401       code->expr2 = NULL;
8402       return;
8403     }
8404
8405   case_expr = code->expr1;
8406   type = case_expr->ts.type;
8407
8408   /* F08:C830.  */
8409   if (type != BT_LOGICAL && type != BT_INTEGER && type != BT_CHARACTER)
8410     {
8411       gfc_error ("Argument of SELECT statement at %L cannot be %s",
8412                  &case_expr->where, gfc_typename (&case_expr->ts));
8413
8414       /* Punt. Going on here just produce more garbage error messages.  */
8415       return;
8416     }
8417
8418   /* F08:R842.  */
8419   if (!select_type && case_expr->rank != 0)
8420     {
8421       gfc_error ("Argument of SELECT statement at %L must be a scalar "
8422                  "expression", &case_expr->where);
8423
8424       /* Punt.  */
8425       return;
8426     }
8427
8428   /* Raise a warning if an INTEGER case value exceeds the range of
8429      the case-expr. Later, all expressions will be promoted to the
8430      largest kind of all case-labels.  */
8431
8432   if (type == BT_INTEGER)
8433     for (body = code->block; body; body = body->block)
8434       for (cp = body->ext.block.case_list; cp; cp = cp->next)
8435         {
8436           if (cp->low
8437               && gfc_check_integer_range (cp->low->value.integer,
8438                                           case_expr->ts.kind) != ARITH_OK)
8439             gfc_warning (0, "Expression in CASE statement at %L is "
8440                          "not in the range of %s", &cp->low->where,
8441                          gfc_typename (&case_expr->ts));
8442
8443           if (cp->high
8444               && cp->low != cp->high
8445               && gfc_check_integer_range (cp->high->value.integer,
8446                                           case_expr->ts.kind) != ARITH_OK)
8447             gfc_warning (0, "Expression in CASE statement at %L is "
8448                          "not in the range of %s", &cp->high->where,
8449                          gfc_typename (&case_expr->ts));
8450         }
8451
8452   /* PR 19168 has a long discussion concerning a mismatch of the kinds
8453      of the SELECT CASE expression and its CASE values.  Walk the lists
8454      of case values, and if we find a mismatch, promote case_expr to
8455      the appropriate kind.  */
8456
8457   if (type == BT_LOGICAL || type == BT_INTEGER)
8458     {
8459       for (body = code->block; body; body = body->block)
8460         {
8461           /* Walk the case label list.  */
8462           for (cp = body->ext.block.case_list; cp; cp = cp->next)
8463             {
8464               /* Intercept the DEFAULT case.  It does not have a kind.  */
8465               if (cp->low == NULL && cp->high == NULL)
8466                 continue;
8467
8468               /* Unreachable case ranges are discarded, so ignore.  */
8469               if (cp->low != NULL && cp->high != NULL
8470                   && cp->low != cp->high
8471                   && gfc_compare_expr (cp->low, cp->high, INTRINSIC_GT) > 0)
8472                 continue;
8473
8474               if (cp->low != NULL
8475                   && case_expr->ts.kind != gfc_kind_max(case_expr, cp->low))
8476                 gfc_convert_type_warn (case_expr, &cp->low->ts, 2, 0);
8477
8478               if (cp->high != NULL
8479                   && case_expr->ts.kind != gfc_kind_max(case_expr, cp->high))
8480                 gfc_convert_type_warn (case_expr, &cp->high->ts, 2, 0);
8481             }
8482          }
8483     }
8484
8485   /* Assume there is no DEFAULT case.  */
8486   default_case = NULL;
8487   head = tail = NULL;
8488   ncases = 0;
8489   seen_logical = 0;
8490
8491   for (body = code->block; body; body = body->block)
8492     {
8493       /* Assume the CASE list is OK, and all CASE labels can be matched.  */
8494       t = true;
8495       seen_unreachable = 0;
8496
8497       /* Walk the case label list, making sure that all case labels
8498          are legal.  */
8499       for (cp = body->ext.block.case_list; cp; cp = cp->next)
8500         {
8501           /* Count the number of cases in the whole construct.  */
8502           ncases++;
8503
8504           /* Intercept the DEFAULT case.  */
8505           if (cp->low == NULL && cp->high == NULL)
8506             {
8507               if (default_case != NULL)
8508                 {
8509                   gfc_error ("The DEFAULT CASE at %L cannot be followed "
8510                              "by a second DEFAULT CASE at %L",
8511                              &default_case->where, &cp->where);
8512                   t = false;
8513                   break;
8514                 }
8515               else
8516                 {
8517                   default_case = cp;
8518                   continue;
8519                 }
8520             }
8521
8522           /* Deal with single value cases and case ranges.  Errors are
8523              issued from the validation function.  */
8524           if (!validate_case_label_expr (cp->low, case_expr)
8525               || !validate_case_label_expr (cp->high, case_expr))
8526             {
8527               t = false;
8528               break;
8529             }
8530
8531           if (type == BT_LOGICAL
8532               && ((cp->low == NULL || cp->high == NULL)
8533                   || cp->low != cp->high))
8534             {
8535               gfc_error ("Logical range in CASE statement at %L is not "
8536                          "allowed", &cp->low->where);
8537               t = false;
8538               break;
8539             }
8540
8541           if (type == BT_LOGICAL && cp->low->expr_type == EXPR_CONSTANT)
8542             {
8543               int value;
8544               value = cp->low->value.logical == 0 ? 2 : 1;
8545               if (value & seen_logical)
8546                 {
8547                   gfc_error ("Constant logical value in CASE statement "
8548                              "is repeated at %L",
8549                              &cp->low->where);
8550                   t = false;
8551                   break;
8552                 }
8553               seen_logical |= value;
8554             }
8555
8556           if (cp->low != NULL && cp->high != NULL
8557               && cp->low != cp->high
8558               && gfc_compare_expr (cp->low, cp->high, INTRINSIC_GT) > 0)
8559             {
8560               if (warn_surprising)
8561                 gfc_warning (OPT_Wsurprising,
8562                              "Range specification at %L can never be matched",
8563                              &cp->where);
8564
8565               cp->unreachable = 1;
8566               seen_unreachable = 1;
8567             }
8568           else
8569             {
8570               /* If the case range can be matched, it can also overlap with
8571                  other cases.  To make sure it does not, we put it in a
8572                  double linked list here.  We sort that with a merge sort
8573                  later on to detect any overlapping cases.  */
8574               if (!head)
8575                 {
8576                   head = tail = cp;
8577                   head->right = head->left = NULL;
8578                 }
8579               else
8580                 {
8581                   tail->right = cp;
8582                   tail->right->left = tail;
8583                   tail = tail->right;
8584                   tail->right = NULL;
8585                 }
8586             }
8587         }
8588
8589       /* It there was a failure in the previous case label, give up
8590          for this case label list.  Continue with the next block.  */
8591       if (!t)
8592         continue;
8593
8594       /* See if any case labels that are unreachable have been seen.
8595          If so, we eliminate them.  This is a bit of a kludge because
8596          the case lists for a single case statement (label) is a
8597          single forward linked lists.  */
8598       if (seen_unreachable)
8599       {
8600         /* Advance until the first case in the list is reachable.  */
8601         while (body->ext.block.case_list != NULL
8602                && body->ext.block.case_list->unreachable)
8603           {
8604             gfc_case *n = body->ext.block.case_list;
8605             body->ext.block.case_list = body->ext.block.case_list->next;
8606             n->next = NULL;
8607             gfc_free_case_list (n);
8608           }
8609
8610         /* Strip all other unreachable cases.  */
8611         if (body->ext.block.case_list)
8612           {
8613             for (cp = body->ext.block.case_list; cp && cp->next; cp = cp->next)
8614               {
8615                 if (cp->next->unreachable)
8616                   {
8617                     gfc_case *n = cp->next;
8618                     cp->next = cp->next->next;
8619                     n->next = NULL;
8620                     gfc_free_case_list (n);
8621                   }
8622               }
8623           }
8624       }
8625     }
8626
8627   /* See if there were overlapping cases.  If the check returns NULL,
8628      there was overlap.  In that case we don't do anything.  If head
8629      is non-NULL, we prepend the DEFAULT case.  The sorted list can
8630      then used during code generation for SELECT CASE constructs with
8631      a case expression of a CHARACTER type.  */
8632   if (head)
8633     {
8634       head = check_case_overlap (head);
8635
8636       /* Prepend the default_case if it is there.  */
8637       if (head != NULL && default_case)
8638         {
8639           default_case->left = NULL;
8640           default_case->right = head;
8641           head->left = default_case;
8642         }
8643     }
8644
8645   /* Eliminate dead blocks that may be the result if we've seen
8646      unreachable case labels for a block.  */
8647   for (body = code; body && body->block; body = body->block)
8648     {
8649       if (body->block->ext.block.case_list == NULL)
8650         {
8651           /* Cut the unreachable block from the code chain.  */
8652           gfc_code *c = body->block;
8653           body->block = c->block;
8654
8655           /* Kill the dead block, but not the blocks below it.  */
8656           c->block = NULL;
8657           gfc_free_statements (c);
8658         }
8659     }
8660
8661   /* More than two cases is legal but insane for logical selects.
8662      Issue a warning for it.  */
8663   if (warn_surprising && type == BT_LOGICAL && ncases > 2)
8664     gfc_warning (OPT_Wsurprising,
8665                  "Logical SELECT CASE block at %L has more that two cases",
8666                  &code->loc);
8667 }
8668
8669
8670 /* Check if a derived type is extensible.  */
8671
8672 bool
8673 gfc_type_is_extensible (gfc_symbol *sym)
8674 {
8675   return !(sym->attr.is_bind_c || sym->attr.sequence
8676            || (sym->attr.is_class
8677                && sym->components->ts.u.derived->attr.unlimited_polymorphic));
8678 }
8679
8680
8681 static void
8682 resolve_types (gfc_namespace *ns);
8683
8684 /* Resolve an associate-name:  Resolve target and ensure the type-spec is
8685    correct as well as possibly the array-spec.  */
8686
8687 static void
8688 resolve_assoc_var (gfc_symbol* sym, bool resolve_target)
8689 {
8690   gfc_expr* target;
8691
8692   gcc_assert (sym->assoc);
8693   gcc_assert (sym->attr.flavor == FL_VARIABLE);
8694
8695   /* If this is for SELECT TYPE, the target may not yet be set.  In that
8696      case, return.  Resolution will be called later manually again when
8697      this is done.  */
8698   target = sym->assoc->target;
8699   if (!target)
8700     return;
8701   gcc_assert (!sym->assoc->dangling);
8702
8703   if (resolve_target && !gfc_resolve_expr (target))
8704     return;
8705
8706   /* For variable targets, we get some attributes from the target.  */
8707   if (target->expr_type == EXPR_VARIABLE)
8708     {
8709       gfc_symbol* tsym;
8710
8711       gcc_assert (target->symtree);
8712       tsym = target->symtree->n.sym;
8713
8714       sym->attr.asynchronous = tsym->attr.asynchronous;
8715       sym->attr.volatile_ = tsym->attr.volatile_;
8716
8717       sym->attr.target = tsym->attr.target
8718                          || gfc_expr_attr (target).pointer;
8719       if (is_subref_array (target))
8720         sym->attr.subref_array_pointer = 1;
8721     }
8722
8723   if (target->expr_type == EXPR_NULL)
8724     {
8725       gfc_error ("Selector at %L cannot be NULL()", &target->where);
8726       return;
8727     }
8728   else if (target->ts.type == BT_UNKNOWN)
8729     {
8730       gfc_error ("Selector at %L has no type", &target->where);
8731       return;
8732     }
8733
8734   /* Get type if this was not already set.  Note that it can be
8735      some other type than the target in case this is a SELECT TYPE
8736      selector!  So we must not update when the type is already there.  */
8737   if (sym->ts.type == BT_UNKNOWN)
8738     sym->ts = target->ts;
8739
8740   gcc_assert (sym->ts.type != BT_UNKNOWN);
8741
8742   /* See if this is a valid association-to-variable.  */
8743   sym->assoc->variable = (target->expr_type == EXPR_VARIABLE
8744                           && !gfc_has_vector_subscript (target));
8745
8746   /* Finally resolve if this is an array or not.  */
8747   if (sym->attr.dimension && target->rank == 0)
8748     {
8749       /* primary.c makes the assumption that a reference to an associate
8750          name followed by a left parenthesis is an array reference.  */
8751       if (sym->ts.type != BT_CHARACTER)
8752         gfc_error ("Associate-name %qs at %L is used as array",
8753                    sym->name, &sym->declared_at);
8754       sym->attr.dimension = 0;
8755       return;
8756     }
8757
8758
8759   /* We cannot deal with class selectors that need temporaries.  */
8760   if (target->ts.type == BT_CLASS
8761         && gfc_ref_needs_temporary_p (target->ref))
8762     {
8763       gfc_error ("CLASS selector at %L needs a temporary which is not "
8764                  "yet implemented", &target->where);
8765       return;
8766     }
8767
8768   if (target->ts.type == BT_CLASS)
8769     gfc_fix_class_refs (target);
8770
8771   if (target->rank != 0)
8772     {
8773       gfc_array_spec *as;
8774       /* The rank may be incorrectly guessed at parsing, therefore make sure
8775          it is corrected now.  */
8776       if (sym->ts.type != BT_CLASS && (!sym->as || sym->assoc->rankguessed))
8777         {
8778           if (!sym->as)
8779             sym->as = gfc_get_array_spec ();
8780           as = sym->as;
8781           as->rank = target->rank;
8782           as->type = AS_DEFERRED;
8783           as->corank = gfc_get_corank (target);
8784           sym->attr.dimension = 1;
8785           if (as->corank != 0)
8786             sym->attr.codimension = 1;
8787         }
8788       else if (sym->ts.type == BT_CLASS && (!CLASS_DATA (sym)->as || sym->assoc->rankguessed))
8789         {
8790           if (!CLASS_DATA (sym)->as)
8791             CLASS_DATA (sym)->as = gfc_get_array_spec ();
8792           as = CLASS_DATA (sym)->as;
8793           as->rank = target->rank;
8794           as->type = AS_DEFERRED;
8795           as->corank = gfc_get_corank (target);
8796           CLASS_DATA (sym)->attr.dimension = 1;
8797           if (as->corank != 0)
8798             CLASS_DATA (sym)->attr.codimension = 1;
8799         }
8800     }
8801   else
8802     {
8803       /* target's rank is 0, but the type of the sym is still array valued,
8804          which has to be corrected.  */
8805       if (sym->ts.type == BT_CLASS
8806           && CLASS_DATA (sym) && CLASS_DATA (sym)->as)
8807         {
8808           gfc_array_spec *as;
8809           symbol_attribute attr;
8810           /* The associated variable's type is still the array type
8811              correct this now.  */
8812           gfc_typespec *ts = &target->ts;
8813           gfc_ref *ref;
8814           gfc_component *c;
8815           for (ref = target->ref; ref != NULL; ref = ref->next)
8816             {
8817               switch (ref->type)
8818                 {
8819                 case REF_COMPONENT:
8820                   ts = &ref->u.c.component->ts;
8821                   break;
8822                 case REF_ARRAY:
8823                   if (ts->type == BT_CLASS)
8824                     ts = &ts->u.derived->components->ts;
8825                   break;
8826                 default:
8827                   break;
8828                 }
8829             }
8830           /* Create a scalar instance of the current class type.  Because the
8831              rank of a class array goes into its name, the type has to be
8832              rebuild.  The alternative of (re-)setting just the attributes
8833              and as in the current type, destroys the type also in other
8834              places.  */
8835           as = NULL;
8836           sym->ts = *ts;
8837           sym->ts.type = BT_CLASS;
8838           attr = CLASS_DATA (sym)->attr;
8839           attr.class_ok = 0;
8840           attr.associate_var = 1;
8841           attr.dimension = attr.codimension = 0;
8842           attr.class_pointer = 1;
8843           if (!gfc_build_class_symbol (&sym->ts, &attr, &as))
8844             gcc_unreachable ();
8845           /* Make sure the _vptr is set.  */
8846           c = gfc_find_component (sym->ts.u.derived, "_vptr", true, true, NULL);
8847           if (c->ts.u.derived == NULL)
8848             c->ts.u.derived = gfc_find_derived_vtab (sym->ts.u.derived);
8849           CLASS_DATA (sym)->attr.pointer = 1;
8850           CLASS_DATA (sym)->attr.class_pointer = 1;
8851           gfc_set_sym_referenced (sym->ts.u.derived);
8852           gfc_commit_symbol (sym->ts.u.derived);
8853           /* _vptr now has the _vtab in it, change it to the _vtype.  */
8854           if (c->ts.u.derived->attr.vtab)
8855             c->ts.u.derived = c->ts.u.derived->ts.u.derived;
8856           c->ts.u.derived->ns->types_resolved = 0;
8857           resolve_types (c->ts.u.derived->ns);
8858         }
8859     }
8860
8861   /* Mark this as an associate variable.  */
8862   sym->attr.associate_var = 1;
8863
8864   /* Fix up the type-spec for CHARACTER types.  */
8865   if (sym->ts.type == BT_CHARACTER && !sym->attr.select_type_temporary)
8866     {
8867       if (!sym->ts.u.cl)
8868         sym->ts.u.cl = target->ts.u.cl;
8869
8870       if (sym->ts.deferred && target->expr_type == EXPR_VARIABLE
8871           && target->symtree->n.sym->attr.dummy
8872           && sym->ts.u.cl == target->ts.u.cl)
8873         {
8874           sym->ts.u.cl = gfc_new_charlen (sym->ns, NULL);
8875           sym->ts.deferred = 1;
8876         }
8877
8878       if (!sym->ts.u.cl->length
8879           && !sym->ts.deferred
8880           && target->expr_type == EXPR_CONSTANT)
8881         {
8882           sym->ts.u.cl->length =
8883                 gfc_get_int_expr (gfc_charlen_int_kind, NULL,
8884                                   target->value.character.length);
8885         }
8886       else if ((!sym->ts.u.cl->length
8887                 || sym->ts.u.cl->length->expr_type != EXPR_CONSTANT)
8888                 && target->expr_type != EXPR_VARIABLE)
8889         {
8890           sym->ts.u.cl = gfc_new_charlen (sym->ns, NULL);
8891           sym->ts.deferred = 1;
8892
8893           /* This is reset in trans-stmt.c after the assignment
8894              of the target expression to the associate name.  */
8895           sym->attr.allocatable = 1;
8896         }
8897     }
8898
8899   /* If the target is a good class object, so is the associate variable.  */
8900   if (sym->ts.type == BT_CLASS && gfc_expr_attr (target).class_ok)
8901     sym->attr.class_ok = 1;
8902 }
8903
8904
8905 /* Ensure that SELECT TYPE expressions have the correct rank and a full
8906    array reference, where necessary.  The symbols are artificial and so
8907    the dimension attribute and arrayspec can also be set.  In addition,
8908    sometimes the expr1 arrives as BT_DERIVED, when the symbol is BT_CLASS.
8909    This is corrected here as well.*/
8910
8911 static void
8912 fixup_array_ref (gfc_expr **expr1, gfc_expr *expr2,
8913                  int rank, gfc_ref *ref)
8914 {
8915   gfc_ref *nref = (*expr1)->ref;
8916   gfc_symbol *sym1 = (*expr1)->symtree->n.sym;
8917   gfc_symbol *sym2 = expr2 ? expr2->symtree->n.sym : NULL;
8918   (*expr1)->rank = rank;
8919   if (sym1->ts.type == BT_CLASS)
8920     {
8921       if ((*expr1)->ts.type != BT_CLASS)
8922         (*expr1)->ts = sym1->ts;
8923
8924       CLASS_DATA (sym1)->attr.dimension = 1;
8925       if (CLASS_DATA (sym1)->as == NULL && sym2)
8926         CLASS_DATA (sym1)->as
8927                 = gfc_copy_array_spec (CLASS_DATA (sym2)->as);
8928     }
8929   else
8930     {
8931       sym1->attr.dimension = 1;
8932       if (sym1->as == NULL && sym2)
8933         sym1->as = gfc_copy_array_spec (sym2->as);
8934     }
8935
8936   for (; nref; nref = nref->next)
8937     if (nref->next == NULL)
8938       break;
8939
8940   if (ref && nref && nref->type != REF_ARRAY)
8941     nref->next = gfc_copy_ref (ref);
8942   else if (ref && !nref)
8943     (*expr1)->ref = gfc_copy_ref (ref);
8944 }
8945
8946
8947 static gfc_expr *
8948 build_loc_call (gfc_expr *sym_expr)
8949 {
8950   gfc_expr *loc_call;
8951   loc_call = gfc_get_expr ();
8952   loc_call->expr_type = EXPR_FUNCTION;
8953   gfc_get_sym_tree ("_loc", gfc_current_ns, &loc_call->symtree, false);
8954   loc_call->symtree->n.sym->attr.flavor = FL_PROCEDURE;
8955   loc_call->symtree->n.sym->attr.intrinsic = 1;
8956   loc_call->symtree->n.sym->result = loc_call->symtree->n.sym;
8957   gfc_commit_symbol (loc_call->symtree->n.sym);
8958   loc_call->ts.type = BT_INTEGER;
8959   loc_call->ts.kind = gfc_index_integer_kind;
8960   loc_call->value.function.isym = gfc_intrinsic_function_by_id (GFC_ISYM_LOC);
8961   loc_call->value.function.actual = gfc_get_actual_arglist ();
8962   loc_call->value.function.actual->expr = sym_expr;
8963   loc_call->where = sym_expr->where;
8964   return loc_call;
8965 }
8966
8967 /* Resolve a SELECT TYPE statement.  */
8968
8969 static void
8970 resolve_select_type (gfc_code *code, gfc_namespace *old_ns)
8971 {
8972   gfc_symbol *selector_type;
8973   gfc_code *body, *new_st, *if_st, *tail;
8974   gfc_code *class_is = NULL, *default_case = NULL;
8975   gfc_case *c;
8976   gfc_symtree *st;
8977   char name[GFC_MAX_SYMBOL_LEN];
8978   gfc_namespace *ns;
8979   int error = 0;
8980   int rank = 0;
8981   gfc_ref* ref = NULL;
8982   gfc_expr *selector_expr = NULL;
8983
8984   ns = code->ext.block.ns;
8985   gfc_resolve (ns);
8986
8987   /* Check for F03:C813.  */
8988   if (code->expr1->ts.type != BT_CLASS
8989       && !(code->expr2 && code->expr2->ts.type == BT_CLASS))
8990     {
8991       gfc_error ("Selector shall be polymorphic in SELECT TYPE statement "
8992                  "at %L", &code->loc);
8993       return;
8994     }
8995
8996   if (!code->expr1->symtree->n.sym->attr.class_ok)
8997     return;
8998
8999   if (code->expr2)
9000     {
9001       gfc_ref *ref2 = NULL;
9002       for (ref = code->expr2->ref; ref != NULL; ref = ref->next)
9003          if (ref->type == REF_COMPONENT
9004              && ref->u.c.component->ts.type == BT_CLASS)
9005            ref2 = ref;
9006
9007       if (ref2)
9008         {
9009           if (code->expr1->symtree->n.sym->attr.untyped)
9010             code->expr1->symtree->n.sym->ts = ref2->u.c.component->ts;
9011           selector_type = CLASS_DATA (ref2->u.c.component)->ts.u.derived;
9012         }
9013       else
9014         {
9015           if (code->expr1->symtree->n.sym->attr.untyped)
9016             code->expr1->symtree->n.sym->ts = code->expr2->ts;
9017           selector_type = CLASS_DATA (code->expr2)->ts.u.derived;
9018         }
9019
9020       if (code->expr2->rank && CLASS_DATA (code->expr1)->as)
9021         CLASS_DATA (code->expr1)->as->rank = code->expr2->rank;
9022
9023       /* F2008: C803 The selector expression must not be coindexed.  */
9024       if (gfc_is_coindexed (code->expr2))
9025         {
9026           gfc_error ("Selector at %L must not be coindexed",
9027                      &code->expr2->where);
9028           return;
9029         }
9030
9031     }
9032   else
9033     {
9034       selector_type = CLASS_DATA (code->expr1)->ts.u.derived;
9035
9036       if (gfc_is_coindexed (code->expr1))
9037         {
9038           gfc_error ("Selector at %L must not be coindexed",
9039                      &code->expr1->where);
9040           return;
9041         }
9042     }
9043
9044   /* Loop over TYPE IS / CLASS IS cases.  */
9045   for (body = code->block; body; body = body->block)
9046     {
9047       c = body->ext.block.case_list;
9048
9049       if (!error)
9050         {
9051           /* Check for repeated cases.  */
9052           for (tail = code->block; tail; tail = tail->block)
9053             {
9054               gfc_case *d = tail->ext.block.case_list;
9055               if (tail == body)
9056                 break;
9057
9058               if (c->ts.type == d->ts.type
9059                   && ((c->ts.type == BT_DERIVED
9060                        && c->ts.u.derived && d->ts.u.derived
9061                        && !strcmp (c->ts.u.derived->name,
9062                                    d->ts.u.derived->name))
9063                       || c->ts.type == BT_UNKNOWN
9064                       || (!(c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
9065                           && c->ts.kind == d->ts.kind)))
9066                 {
9067                   gfc_error ("TYPE IS at %L overlaps with TYPE IS at %L",
9068                              &c->where, &d->where);
9069                   return;
9070                 }
9071             }
9072         }
9073
9074       /* Check F03:C815.  */
9075       if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
9076           && !selector_type->attr.unlimited_polymorphic
9077           && !gfc_type_is_extensible (c->ts.u.derived))
9078         {
9079           gfc_error ("Derived type %qs at %L must be extensible",
9080                      c->ts.u.derived->name, &c->where);
9081           error++;
9082           continue;
9083         }
9084
9085       /* Check F03:C816.  */
9086       if (c->ts.type != BT_UNKNOWN && !selector_type->attr.unlimited_polymorphic
9087           && ((c->ts.type != BT_DERIVED && c->ts.type != BT_CLASS)
9088               || !gfc_type_is_extension_of (selector_type, c->ts.u.derived)))
9089         {
9090           if (c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
9091             gfc_error ("Derived type %qs at %L must be an extension of %qs",
9092                        c->ts.u.derived->name, &c->where, selector_type->name);
9093           else
9094             gfc_error ("Unexpected intrinsic type %qs at %L",
9095                        gfc_basic_typename (c->ts.type), &c->where);
9096           error++;
9097           continue;
9098         }
9099
9100       /* Check F03:C814.  */
9101       if (c->ts.type == BT_CHARACTER
9102           && (c->ts.u.cl->length != NULL || c->ts.deferred))
9103         {
9104           gfc_error ("The type-spec at %L shall specify that each length "
9105                      "type parameter is assumed", &c->where);
9106           error++;
9107           continue;
9108         }
9109
9110       /* Intercept the DEFAULT case.  */
9111       if (c->ts.type == BT_UNKNOWN)
9112         {
9113           /* Check F03:C818.  */
9114           if (default_case)
9115             {
9116               gfc_error ("The DEFAULT CASE at %L cannot be followed "
9117                          "by a second DEFAULT CASE at %L",
9118                          &default_case->ext.block.case_list->where, &c->where);
9119               error++;
9120               continue;
9121             }
9122
9123           default_case = body;
9124         }
9125     }
9126
9127   if (error > 0)
9128     return;
9129
9130   /* Transform SELECT TYPE statement to BLOCK and associate selector to
9131      target if present.  If there are any EXIT statements referring to the
9132      SELECT TYPE construct, this is no problem because the gfc_code
9133      reference stays the same and EXIT is equally possible from the BLOCK
9134      it is changed to.  */
9135   code->op = EXEC_BLOCK;
9136   if (code->expr2)
9137     {
9138       gfc_association_list* assoc;
9139
9140       assoc = gfc_get_association_list ();
9141       assoc->st = code->expr1->symtree;
9142       assoc->target = gfc_copy_expr (code->expr2);
9143       assoc->target->where = code->expr2->where;
9144       /* assoc->variable will be set by resolve_assoc_var.  */
9145
9146       code->ext.block.assoc = assoc;
9147       code->expr1->symtree->n.sym->assoc = assoc;
9148
9149       resolve_assoc_var (code->expr1->symtree->n.sym, false);
9150     }
9151   else
9152     code->ext.block.assoc = NULL;
9153
9154   /* Ensure that the selector rank and arrayspec are available to
9155      correct expressions in which they might be missing.  */
9156   if (code->expr2 && code->expr2->rank)
9157     {
9158       rank = code->expr2->rank;
9159       for (ref = code->expr2->ref; ref; ref = ref->next)
9160         if (ref->next == NULL)
9161           break;
9162       if (ref && ref->type == REF_ARRAY)
9163         ref = gfc_copy_ref (ref);
9164
9165       /* Fixup expr1 if necessary.  */
9166       if (rank)
9167         fixup_array_ref (&code->expr1, code->expr2, rank, ref);
9168     }
9169   else if (code->expr1->rank)
9170     {
9171       rank = code->expr1->rank;
9172       for (ref = code->expr1->ref; ref; ref = ref->next)
9173         if (ref->next == NULL)
9174           break;
9175       if (ref && ref->type == REF_ARRAY)
9176         ref = gfc_copy_ref (ref);
9177     }
9178
9179   /* Add EXEC_SELECT to switch on type.  */
9180   new_st = gfc_get_code (code->op);
9181   new_st->expr1 = code->expr1;
9182   new_st->expr2 = code->expr2;
9183   new_st->block = code->block;
9184   code->expr1 = code->expr2 =  NULL;
9185   code->block = NULL;
9186   if (!ns->code)
9187     ns->code = new_st;
9188   else
9189     ns->code->next = new_st;
9190   code = new_st;
9191   code->op = EXEC_SELECT_TYPE;
9192
9193   /* Use the intrinsic LOC function to generate an integer expression
9194      for the vtable of the selector.  Note that the rank of the selector
9195      expression has to be set to zero.  */
9196   gfc_add_vptr_component (code->expr1);
9197   code->expr1->rank = 0;
9198   code->expr1 = build_loc_call (code->expr1);
9199   selector_expr = code->expr1->value.function.actual->expr;
9200
9201   /* Loop over TYPE IS / CLASS IS cases.  */
9202   for (body = code->block; body; body = body->block)
9203     {
9204       gfc_symbol *vtab;
9205       gfc_expr *e;
9206       c = body->ext.block.case_list;
9207
9208       /* Generate an index integer expression for address of the
9209          TYPE/CLASS vtable and store it in c->low.  The hash expression
9210          is stored in c->high and is used to resolve intrinsic cases.  */
9211       if (c->ts.type != BT_UNKNOWN)
9212         {
9213           if (c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
9214             {
9215               vtab = gfc_find_derived_vtab (c->ts.u.derived);
9216               gcc_assert (vtab);
9217               c->high = gfc_get_int_expr (gfc_integer_4_kind, NULL,
9218                                           c->ts.u.derived->hash_value);
9219             }
9220           else
9221             {
9222               vtab = gfc_find_vtab (&c->ts);
9223               gcc_assert (vtab && CLASS_DATA (vtab)->initializer);
9224               e = CLASS_DATA (vtab)->initializer;
9225               c->high = gfc_copy_expr (e);
9226               if (c->high->ts.kind != gfc_integer_4_kind)
9227                 {
9228                   gfc_typespec ts;
9229                   ts.kind = gfc_integer_4_kind;
9230                   ts.type = BT_INTEGER;
9231                   gfc_convert_type_warn (c->high, &ts, 2, 0);
9232                 }
9233             }
9234
9235           e = gfc_lval_expr_from_sym (vtab);
9236           c->low = build_loc_call (e);
9237         }
9238       else
9239         continue;
9240
9241       /* Associate temporary to selector.  This should only be done
9242          when this case is actually true, so build a new ASSOCIATE
9243          that does precisely this here (instead of using the
9244          'global' one).  */
9245
9246       if (c->ts.type == BT_CLASS)
9247         sprintf (name, "__tmp_class_%s", c->ts.u.derived->name);
9248       else if (c->ts.type == BT_DERIVED)
9249         sprintf (name, "__tmp_type_%s", c->ts.u.derived->name);
9250       else if (c->ts.type == BT_CHARACTER)
9251         {
9252           HOST_WIDE_INT charlen = 0;
9253           if (c->ts.u.cl && c->ts.u.cl->length
9254               && c->ts.u.cl->length->expr_type == EXPR_CONSTANT)
9255             charlen = gfc_mpz_get_hwi (c->ts.u.cl->length->value.integer);
9256           snprintf (name, sizeof (name),
9257                     "__tmp_%s_" HOST_WIDE_INT_PRINT_DEC "_%d",
9258                     gfc_basic_typename (c->ts.type), charlen, c->ts.kind);
9259         }
9260       else
9261         sprintf (name, "__tmp_%s_%d", gfc_basic_typename (c->ts.type),
9262                  c->ts.kind);
9263
9264       st = gfc_find_symtree (ns->sym_root, name);
9265       gcc_assert (st->n.sym->assoc);
9266       st->n.sym->assoc->target = gfc_get_variable_expr (selector_expr->symtree);
9267       st->n.sym->assoc->target->where = selector_expr->where;
9268       if (c->ts.type != BT_CLASS && c->ts.type != BT_UNKNOWN)
9269         {
9270           gfc_add_data_component (st->n.sym->assoc->target);
9271           /* Fixup the target expression if necessary.  */
9272           if (rank)
9273             fixup_array_ref (&st->n.sym->assoc->target, NULL, rank, ref);
9274         }
9275
9276       new_st = gfc_get_code (EXEC_BLOCK);
9277       new_st->ext.block.ns = gfc_build_block_ns (ns);
9278       new_st->ext.block.ns->code = body->next;
9279       body->next = new_st;
9280
9281       /* Chain in the new list only if it is marked as dangling.  Otherwise
9282          there is a CASE label overlap and this is already used.  Just ignore,
9283          the error is diagnosed elsewhere.  */
9284       if (st->n.sym->assoc->dangling)
9285         {
9286           new_st->ext.block.assoc = st->n.sym->assoc;
9287           st->n.sym->assoc->dangling = 0;
9288         }
9289
9290       resolve_assoc_var (st->n.sym, false);
9291     }
9292
9293   /* Take out CLASS IS cases for separate treatment.  */
9294   body = code;
9295   while (body && body->block)
9296     {
9297       if (body->block->ext.block.case_list->ts.type == BT_CLASS)
9298         {
9299           /* Add to class_is list.  */
9300           if (class_is == NULL)
9301             {
9302               class_is = body->block;
9303               tail = class_is;
9304             }
9305           else
9306             {
9307               for (tail = class_is; tail->block; tail = tail->block) ;
9308               tail->block = body->block;
9309               tail = tail->block;
9310             }
9311           /* Remove from EXEC_SELECT list.  */
9312           body->block = body->block->block;
9313           tail->block = NULL;
9314         }
9315       else
9316         body = body->block;
9317     }
9318
9319   if (class_is)
9320     {
9321       gfc_symbol *vtab;
9322
9323       if (!default_case)
9324         {
9325           /* Add a default case to hold the CLASS IS cases.  */
9326           for (tail = code; tail->block; tail = tail->block) ;
9327           tail->block = gfc_get_code (EXEC_SELECT_TYPE);
9328           tail = tail->block;
9329           tail->ext.block.case_list = gfc_get_case ();
9330           tail->ext.block.case_list->ts.type = BT_UNKNOWN;
9331           tail->next = NULL;
9332           default_case = tail;
9333         }
9334
9335       /* More than one CLASS IS block?  */
9336       if (class_is->block)
9337         {
9338           gfc_code **c1,*c2;
9339           bool swapped;
9340           /* Sort CLASS IS blocks by extension level.  */
9341           do
9342             {
9343               swapped = false;
9344               for (c1 = &class_is; (*c1) && (*c1)->block; c1 = &((*c1)->block))
9345                 {
9346                   c2 = (*c1)->block;
9347                   /* F03:C817 (check for doubles).  */
9348                   if ((*c1)->ext.block.case_list->ts.u.derived->hash_value
9349                       == c2->ext.block.case_list->ts.u.derived->hash_value)
9350                     {
9351                       gfc_error ("Double CLASS IS block in SELECT TYPE "
9352                                  "statement at %L",
9353                                  &c2->ext.block.case_list->where);
9354                       return;
9355                     }
9356                   if ((*c1)->ext.block.case_list->ts.u.derived->attr.extension
9357                       < c2->ext.block.case_list->ts.u.derived->attr.extension)
9358                     {
9359                       /* Swap.  */
9360                       (*c1)->block = c2->block;
9361                       c2->block = *c1;
9362                       *c1 = c2;
9363                       swapped = true;
9364                     }
9365                 }
9366             }
9367           while (swapped);
9368         }
9369
9370       /* Generate IF chain.  */
9371       if_st = gfc_get_code (EXEC_IF);
9372       new_st = if_st;
9373       for (body = class_is; body; body = body->block)
9374         {
9375           new_st->block = gfc_get_code (EXEC_IF);
9376           new_st = new_st->block;
9377           /* Set up IF condition: Call _gfortran_is_extension_of.  */
9378           new_st->expr1 = gfc_get_expr ();
9379           new_st->expr1->expr_type = EXPR_FUNCTION;
9380           new_st->expr1->ts.type = BT_LOGICAL;
9381           new_st->expr1->ts.kind = 4;
9382           new_st->expr1->value.function.name = gfc_get_string (PREFIX ("is_extension_of"));
9383           new_st->expr1->value.function.isym = XCNEW (gfc_intrinsic_sym);
9384           new_st->expr1->value.function.isym->id = GFC_ISYM_EXTENDS_TYPE_OF;
9385           /* Set up arguments.  */
9386           new_st->expr1->value.function.actual = gfc_get_actual_arglist ();
9387           new_st->expr1->value.function.actual->expr = gfc_get_variable_expr (selector_expr->symtree);
9388           new_st->expr1->value.function.actual->expr->where = code->loc;
9389           new_st->expr1->where = code->loc;
9390           gfc_add_vptr_component (new_st->expr1->value.function.actual->expr);
9391           vtab = gfc_find_derived_vtab (body->ext.block.case_list->ts.u.derived);
9392           st = gfc_find_symtree (vtab->ns->sym_root, vtab->name);
9393           new_st->expr1->value.function.actual->next = gfc_get_actual_arglist ();
9394           new_st->expr1->value.function.actual->next->expr = gfc_get_variable_expr (st);
9395           new_st->expr1->value.function.actual->next->expr->where = code->loc;
9396           new_st->next = body->next;
9397         }
9398         if (default_case->next)
9399           {
9400             new_st->block = gfc_get_code (EXEC_IF);
9401             new_st = new_st->block;
9402             new_st->next = default_case->next;
9403           }
9404
9405         /* Replace CLASS DEFAULT code by the IF chain.  */
9406         default_case->next = if_st;
9407     }
9408
9409   /* Resolve the internal code.  This cannot be done earlier because
9410      it requires that the sym->assoc of selectors is set already.  */
9411   gfc_current_ns = ns;
9412   gfc_resolve_blocks (code->block, gfc_current_ns);
9413   gfc_current_ns = old_ns;
9414
9415   if (ref)
9416     free (ref);
9417 }
9418
9419
9420 /* Resolve a transfer statement. This is making sure that:
9421    -- a derived type being transferred has only non-pointer components
9422    -- a derived type being transferred doesn't have private components, unless
9423       it's being transferred from the module where the type was defined
9424    -- we're not trying to transfer a whole assumed size array.  */
9425
9426 static void
9427 resolve_transfer (gfc_code *code)
9428 {
9429   gfc_symbol *sym, *derived;
9430   gfc_ref *ref;
9431   gfc_expr *exp;
9432   bool write = false;
9433   bool formatted = false;
9434   gfc_dt *dt = code->ext.dt;
9435   gfc_symbol *dtio_sub = NULL;
9436
9437   exp = code->expr1;
9438
9439   while (exp != NULL && exp->expr_type == EXPR_OP
9440          && exp->value.op.op == INTRINSIC_PARENTHESES)
9441     exp = exp->value.op.op1;
9442
9443   if (exp && exp->expr_type == EXPR_NULL
9444       && code->ext.dt)
9445     {
9446       gfc_error ("Invalid context for NULL () intrinsic at %L",
9447                  &exp->where);
9448       return;
9449     }
9450
9451   if (exp == NULL || (exp->expr_type != EXPR_VARIABLE
9452                       && exp->expr_type != EXPR_FUNCTION
9453                       && exp->expr_type != EXPR_STRUCTURE))
9454     return;
9455
9456   /* If we are reading, the variable will be changed.  Note that
9457      code->ext.dt may be NULL if the TRANSFER is related to
9458      an INQUIRE statement -- but in this case, we are not reading, either.  */
9459   if (dt && dt->dt_io_kind->value.iokind == M_READ
9460       && !gfc_check_vardef_context (exp, false, false, false,
9461                                     _("item in READ")))
9462     return;
9463
9464   const gfc_typespec *ts = exp->expr_type == EXPR_STRUCTURE
9465                         || exp->expr_type == EXPR_FUNCTION
9466                          ? &exp->ts : &exp->symtree->n.sym->ts;
9467
9468   /* Go to actual component transferred.  */
9469   for (ref = exp->ref; ref; ref = ref->next)
9470     if (ref->type == REF_COMPONENT)
9471       ts = &ref->u.c.component->ts;
9472
9473   if (dt && dt->dt_io_kind->value.iokind != M_INQUIRE
9474       && (ts->type == BT_DERIVED || ts->type == BT_CLASS))
9475     {
9476       derived = ts->u.derived;
9477
9478       /* Determine when to use the formatted DTIO procedure.  */
9479       if (dt && (dt->format_expr || dt->format_label))
9480         formatted = true;
9481
9482       write = dt->dt_io_kind->value.iokind == M_WRITE
9483               || dt->dt_io_kind->value.iokind == M_PRINT;
9484       dtio_sub = gfc_find_specific_dtio_proc (derived, write, formatted);
9485
9486       if (dtio_sub != NULL && exp->expr_type == EXPR_VARIABLE)
9487         {
9488           dt->udtio = exp;
9489           sym = exp->symtree->n.sym->ns->proc_name;
9490           /* Check to see if this is a nested DTIO call, with the
9491              dummy as the io-list object.  */
9492           if (sym && sym == dtio_sub && sym->formal
9493               && sym->formal->sym == exp->symtree->n.sym
9494               && exp->ref == NULL)
9495             {
9496               if (!sym->attr.recursive)
9497                 {
9498                   gfc_error ("DTIO %s procedure at %L must be recursive",
9499                              sym->name, &sym->declared_at);
9500                   return;
9501                 }
9502             }
9503         }
9504     }
9505
9506   if (ts->type == BT_CLASS && dtio_sub == NULL)
9507     {
9508       gfc_error ("Data transfer element at %L cannot be polymorphic unless "
9509                 "it is processed by a defined input/output procedure",
9510                 &code->loc);
9511       return;
9512     }
9513
9514   if (ts->type == BT_DERIVED)
9515     {
9516       /* Check that transferred derived type doesn't contain POINTER
9517          components unless it is processed by a defined input/output
9518          procedure".  */
9519       if (ts->u.derived->attr.pointer_comp && dtio_sub == NULL)
9520         {
9521           gfc_error ("Data transfer element at %L cannot have POINTER "
9522                      "components unless it is processed by a defined "
9523                      "input/output procedure", &code->loc);
9524           return;
9525         }
9526
9527       /* F08:C935.  */
9528       if (ts->u.derived->attr.proc_pointer_comp)
9529         {
9530           gfc_error ("Data transfer element at %L cannot have "
9531                      "procedure pointer components", &code->loc);
9532           return;
9533         }
9534
9535       if (ts->u.derived->attr.alloc_comp && dtio_sub == NULL)
9536         {
9537           gfc_error ("Data transfer element at %L cannot have ALLOCATABLE "
9538                      "components unless it is processed by a defined "
9539                      "input/output procedure", &code->loc);
9540           return;
9541         }
9542
9543       /* C_PTR and C_FUNPTR have private components which means they cannot
9544          be printed.  However, if -std=gnu and not -pedantic, allow
9545          the component to be printed to help debugging.  */
9546       if (ts->u.derived->ts.f90_type == BT_VOID)
9547         {
9548           if (!gfc_notify_std (GFC_STD_GNU, "Data transfer element at %L "
9549                                "cannot have PRIVATE components", &code->loc))
9550             return;
9551         }
9552       else if (derived_inaccessible (ts->u.derived) && dtio_sub == NULL)
9553         {
9554           gfc_error ("Data transfer element at %L cannot have "
9555                      "PRIVATE components unless it is processed by "
9556                      "a defined input/output procedure", &code->loc);
9557           return;
9558         }
9559     }
9560
9561   if (exp->expr_type == EXPR_STRUCTURE)
9562     return;
9563
9564   sym = exp->symtree->n.sym;
9565
9566   if (sym->as != NULL && sym->as->type == AS_ASSUMED_SIZE && exp->ref
9567       && exp->ref->type == REF_ARRAY && exp->ref->u.ar.type == AR_FULL)
9568     {
9569       gfc_error ("Data transfer element at %L cannot be a full reference to "
9570                  "an assumed-size array", &code->loc);
9571       return;
9572     }
9573
9574   if (async_io_dt && exp->expr_type == EXPR_VARIABLE)
9575     exp->symtree->n.sym->attr.asynchronous = 1;
9576 }
9577
9578
9579 /*********** Toplevel code resolution subroutines ***********/
9580
9581 /* Find the set of labels that are reachable from this block.  We also
9582    record the last statement in each block.  */
9583
9584 static void
9585 find_reachable_labels (gfc_code *block)
9586 {
9587   gfc_code *c;
9588
9589   if (!block)
9590     return;
9591
9592   cs_base->reachable_labels = bitmap_alloc (&labels_obstack);
9593
9594   /* Collect labels in this block.  We don't keep those corresponding
9595      to END {IF|SELECT}, these are checked in resolve_branch by going
9596      up through the code_stack.  */
9597   for (c = block; c; c = c->next)
9598     {
9599       if (c->here && c->op != EXEC_END_NESTED_BLOCK)
9600         bitmap_set_bit (cs_base->reachable_labels, c->here->value);
9601     }
9602
9603   /* Merge with labels from parent block.  */
9604   if (cs_base->prev)
9605     {
9606       gcc_assert (cs_base->prev->reachable_labels);
9607       bitmap_ior_into (cs_base->reachable_labels,
9608                        cs_base->prev->reachable_labels);
9609     }
9610 }
9611
9612
9613 static void
9614 resolve_lock_unlock_event (gfc_code *code)
9615 {
9616   if (code->expr1->expr_type == EXPR_FUNCTION
9617       && code->expr1->value.function.isym
9618       && code->expr1->value.function.isym->id == GFC_ISYM_CAF_GET)
9619     remove_caf_get_intrinsic (code->expr1);
9620
9621   if ((code->op == EXEC_LOCK || code->op == EXEC_UNLOCK)
9622       && (code->expr1->ts.type != BT_DERIVED
9623           || code->expr1->expr_type != EXPR_VARIABLE
9624           || code->expr1->ts.u.derived->from_intmod != INTMOD_ISO_FORTRAN_ENV
9625           || code->expr1->ts.u.derived->intmod_sym_id != ISOFORTRAN_LOCK_TYPE
9626           || code->expr1->rank != 0
9627           || (!gfc_is_coarray (code->expr1) &&
9628               !gfc_is_coindexed (code->expr1))))
9629     gfc_error ("Lock variable at %L must be a scalar of type LOCK_TYPE",
9630                &code->expr1->where);
9631   else if ((code->op == EXEC_EVENT_POST || code->op == EXEC_EVENT_WAIT)
9632            && (code->expr1->ts.type != BT_DERIVED
9633                || code->expr1->expr_type != EXPR_VARIABLE
9634                || code->expr1->ts.u.derived->from_intmod
9635                   != INTMOD_ISO_FORTRAN_ENV
9636                || code->expr1->ts.u.derived->intmod_sym_id
9637                   != ISOFORTRAN_EVENT_TYPE
9638                || code->expr1->rank != 0))
9639     gfc_error ("Event variable at %L must be a scalar of type EVENT_TYPE",
9640                &code->expr1->where);
9641   else if (code->op == EXEC_EVENT_POST && !gfc_is_coarray (code->expr1)
9642            && !gfc_is_coindexed (code->expr1))
9643     gfc_error ("Event variable argument at %L must be a coarray or coindexed",
9644                &code->expr1->where);
9645   else if (code->op == EXEC_EVENT_WAIT && !gfc_is_coarray (code->expr1))
9646     gfc_error ("Event variable argument at %L must be a coarray but not "
9647                "coindexed", &code->expr1->where);
9648
9649   /* Check STAT.  */
9650   if (code->expr2
9651       && (code->expr2->ts.type != BT_INTEGER || code->expr2->rank != 0
9652           || code->expr2->expr_type != EXPR_VARIABLE))
9653     gfc_error ("STAT= argument at %L must be a scalar INTEGER variable",
9654                &code->expr2->where);
9655
9656   if (code->expr2
9657       && !gfc_check_vardef_context (code->expr2, false, false, false,
9658                                     _("STAT variable")))
9659     return;
9660
9661   /* Check ERRMSG.  */
9662   if (code->expr3
9663       && (code->expr3->ts.type != BT_CHARACTER || code->expr3->rank != 0
9664           || code->expr3->expr_type != EXPR_VARIABLE))
9665     gfc_error ("ERRMSG= argument at %L must be a scalar CHARACTER variable",
9666                &code->expr3->where);
9667
9668   if (code->expr3
9669       && !gfc_check_vardef_context (code->expr3, false, false, false,
9670                                     _("ERRMSG variable")))
9671     return;
9672
9673   /* Check for LOCK the ACQUIRED_LOCK.  */
9674   if (code->op != EXEC_EVENT_WAIT && code->expr4
9675       && (code->expr4->ts.type != BT_LOGICAL || code->expr4->rank != 0
9676           || code->expr4->expr_type != EXPR_VARIABLE))
9677     gfc_error ("ACQUIRED_LOCK= argument at %L must be a scalar LOGICAL "
9678                "variable", &code->expr4->where);
9679
9680   if (code->op != EXEC_EVENT_WAIT && code->expr4
9681       && !gfc_check_vardef_context (code->expr4, false, false, false,
9682                                     _("ACQUIRED_LOCK variable")))
9683     return;
9684
9685   /* Check for EVENT WAIT the UNTIL_COUNT.  */
9686   if (code->op == EXEC_EVENT_WAIT && code->expr4)
9687     {
9688       if (!gfc_resolve_expr (code->expr4) || code->expr4->ts.type != BT_INTEGER
9689           || code->expr4->rank != 0)
9690         gfc_error ("UNTIL_COUNT= argument at %L must be a scalar INTEGER "
9691                    "expression", &code->expr4->where);
9692     }
9693 }
9694
9695
9696 static void
9697 resolve_critical (gfc_code *code)
9698 {
9699   gfc_symtree *symtree;
9700   gfc_symbol *lock_type;
9701   char name[GFC_MAX_SYMBOL_LEN];
9702   static int serial = 0;
9703
9704   if (flag_coarray != GFC_FCOARRAY_LIB)
9705     return;
9706
9707   symtree = gfc_find_symtree (gfc_current_ns->sym_root,
9708                               GFC_PREFIX ("lock_type"));
9709   if (symtree)
9710     lock_type = symtree->n.sym;
9711   else
9712     {
9713       if (gfc_get_sym_tree (GFC_PREFIX ("lock_type"), gfc_current_ns, &symtree,
9714                             false) != 0)
9715         gcc_unreachable ();
9716       lock_type = symtree->n.sym;
9717       lock_type->attr.flavor = FL_DERIVED;
9718       lock_type->attr.zero_comp = 1;
9719       lock_type->from_intmod = INTMOD_ISO_FORTRAN_ENV;
9720       lock_type->intmod_sym_id = ISOFORTRAN_LOCK_TYPE;
9721     }
9722
9723   sprintf(name, GFC_PREFIX ("lock_var") "%d",serial++);
9724   if (gfc_get_sym_tree (name, gfc_current_ns, &symtree, false) != 0)
9725     gcc_unreachable ();
9726
9727   code->resolved_sym = symtree->n.sym;
9728   symtree->n.sym->attr.flavor = FL_VARIABLE;
9729   symtree->n.sym->attr.referenced = 1;
9730   symtree->n.sym->attr.artificial = 1;
9731   symtree->n.sym->attr.codimension = 1;
9732   symtree->n.sym->ts.type = BT_DERIVED;
9733   symtree->n.sym->ts.u.derived = lock_type;
9734   symtree->n.sym->as = gfc_get_array_spec ();
9735   symtree->n.sym->as->corank = 1;
9736   symtree->n.sym->as->type = AS_EXPLICIT;
9737   symtree->n.sym->as->cotype = AS_EXPLICIT;
9738   symtree->n.sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind,
9739                                                    NULL, 1);
9740   gfc_commit_symbols();
9741 }
9742
9743
9744 static void
9745 resolve_sync (gfc_code *code)
9746 {
9747   /* Check imageset. The * case matches expr1 == NULL.  */
9748   if (code->expr1)
9749     {
9750       if (code->expr1->ts.type != BT_INTEGER || code->expr1->rank > 1)
9751         gfc_error ("Imageset argument at %L must be a scalar or rank-1 "
9752                    "INTEGER expression", &code->expr1->where);
9753       if (code->expr1->expr_type == EXPR_CONSTANT && code->expr1->rank == 0
9754           && mpz_cmp_si (code->expr1->value.integer, 1) < 0)
9755         gfc_error ("Imageset argument at %L must between 1 and num_images()",
9756                    &code->expr1->where);
9757       else if (code->expr1->expr_type == EXPR_ARRAY
9758                && gfc_simplify_expr (code->expr1, 0))
9759         {
9760            gfc_constructor *cons;
9761            cons = gfc_constructor_first (code->expr1->value.constructor);
9762            for (; cons; cons = gfc_constructor_next (cons))
9763              if (cons->expr->expr_type == EXPR_CONSTANT
9764                  &&  mpz_cmp_si (cons->expr->value.integer, 1) < 0)
9765                gfc_error ("Imageset argument at %L must between 1 and "
9766                           "num_images()", &cons->expr->where);
9767         }
9768     }
9769
9770   /* Check STAT.  */
9771   gfc_resolve_expr (code->expr2);
9772   if (code->expr2
9773       && (code->expr2->ts.type != BT_INTEGER || code->expr2->rank != 0
9774           || code->expr2->expr_type != EXPR_VARIABLE))
9775     gfc_error ("STAT= argument at %L must be a scalar INTEGER variable",
9776                &code->expr2->where);
9777
9778   /* Check ERRMSG.  */
9779   gfc_resolve_expr (code->expr3);
9780   if (code->expr3
9781       && (code->expr3->ts.type != BT_CHARACTER || code->expr3->rank != 0
9782           || code->expr3->expr_type != EXPR_VARIABLE))
9783     gfc_error ("ERRMSG= argument at %L must be a scalar CHARACTER variable",
9784                &code->expr3->where);
9785 }
9786
9787
9788 /* Given a branch to a label, see if the branch is conforming.
9789    The code node describes where the branch is located.  */
9790
9791 static void
9792 resolve_branch (gfc_st_label *label, gfc_code *code)
9793 {
9794   code_stack *stack;
9795
9796   if (label == NULL)
9797     return;
9798
9799   /* Step one: is this a valid branching target?  */
9800
9801   if (label->defined == ST_LABEL_UNKNOWN)
9802     {
9803       gfc_error ("Label %d referenced at %L is never defined", label->value,
9804                  &code->loc);
9805       return;
9806     }
9807
9808   if (label->defined != ST_LABEL_TARGET && label->defined != ST_LABEL_DO_TARGET)
9809     {
9810       gfc_error ("Statement at %L is not a valid branch target statement "
9811                  "for the branch statement at %L", &label->where, &code->loc);
9812       return;
9813     }
9814
9815   /* Step two: make sure this branch is not a branch to itself ;-)  */
9816
9817   if (code->here == label)
9818     {
9819       gfc_warning (0,
9820                    "Branch at %L may result in an infinite loop", &code->loc);
9821       return;
9822     }
9823
9824   /* Step three:  See if the label is in the same block as the
9825      branching statement.  The hard work has been done by setting up
9826      the bitmap reachable_labels.  */
9827
9828   if (bitmap_bit_p (cs_base->reachable_labels, label->value))
9829     {
9830       /* Check now whether there is a CRITICAL construct; if so, check
9831          whether the label is still visible outside of the CRITICAL block,
9832          which is invalid.  */
9833       for (stack = cs_base; stack; stack = stack->prev)
9834         {
9835           if (stack->current->op == EXEC_CRITICAL
9836               && bitmap_bit_p (stack->reachable_labels, label->value))
9837             gfc_error ("GOTO statement at %L leaves CRITICAL construct for "
9838                       "label at %L", &code->loc, &label->where);
9839           else if (stack->current->op == EXEC_DO_CONCURRENT
9840                    && bitmap_bit_p (stack->reachable_labels, label->value))
9841             gfc_error ("GOTO statement at %L leaves DO CONCURRENT construct "
9842                       "for label at %L", &code->loc, &label->where);
9843         }
9844
9845       return;
9846     }
9847
9848   /* Step four:  If we haven't found the label in the bitmap, it may
9849     still be the label of the END of the enclosing block, in which
9850     case we find it by going up the code_stack.  */
9851
9852   for (stack = cs_base; stack; stack = stack->prev)
9853     {
9854       if (stack->current->next && stack->current->next->here == label)
9855         break;
9856       if (stack->current->op == EXEC_CRITICAL)
9857         {
9858           /* Note: A label at END CRITICAL does not leave the CRITICAL
9859              construct as END CRITICAL is still part of it.  */
9860           gfc_error ("GOTO statement at %L leaves CRITICAL construct for label"
9861                       " at %L", &code->loc, &label->where);
9862           return;
9863         }
9864       else if (stack->current->op == EXEC_DO_CONCURRENT)
9865         {
9866           gfc_error ("GOTO statement at %L leaves DO CONCURRENT construct for "
9867                      "label at %L", &code->loc, &label->where);
9868           return;
9869         }
9870     }
9871
9872   if (stack)
9873     {
9874       gcc_assert (stack->current->next->op == EXEC_END_NESTED_BLOCK);
9875       return;
9876     }
9877
9878   /* The label is not in an enclosing block, so illegal.  This was
9879      allowed in Fortran 66, so we allow it as extension.  No
9880      further checks are necessary in this case.  */
9881   gfc_notify_std (GFC_STD_LEGACY, "Label at %L is not in the same block "
9882                   "as the GOTO statement at %L", &label->where,
9883                   &code->loc);
9884   return;
9885 }
9886
9887
9888 /* Check whether EXPR1 has the same shape as EXPR2.  */
9889
9890 static bool
9891 resolve_where_shape (gfc_expr *expr1, gfc_expr *expr2)
9892 {
9893   mpz_t shape[GFC_MAX_DIMENSIONS];
9894   mpz_t shape2[GFC_MAX_DIMENSIONS];
9895   bool result = false;
9896   int i;
9897
9898   /* Compare the rank.  */
9899   if (expr1->rank != expr2->rank)
9900     return result;
9901
9902   /* Compare the size of each dimension.  */
9903   for (i=0; i<expr1->rank; i++)
9904     {
9905       if (!gfc_array_dimen_size (expr1, i, &shape[i]))
9906         goto ignore;
9907
9908       if (!gfc_array_dimen_size (expr2, i, &shape2[i]))
9909         goto ignore;
9910
9911       if (mpz_cmp (shape[i], shape2[i]))
9912         goto over;
9913     }
9914
9915   /* When either of the two expression is an assumed size array, we
9916      ignore the comparison of dimension sizes.  */
9917 ignore:
9918   result = true;
9919
9920 over:
9921   gfc_clear_shape (shape, i);
9922   gfc_clear_shape (shape2, i);
9923   return result;
9924 }
9925
9926
9927 /* Check whether a WHERE assignment target or a WHERE mask expression
9928    has the same shape as the outmost WHERE mask expression.  */
9929
9930 static void
9931 resolve_where (gfc_code *code, gfc_expr *mask)
9932 {
9933   gfc_code *cblock;
9934   gfc_code *cnext;
9935   gfc_expr *e = NULL;
9936
9937   cblock = code->block;
9938
9939   /* Store the first WHERE mask-expr of the WHERE statement or construct.
9940      In case of nested WHERE, only the outmost one is stored.  */
9941   if (mask == NULL) /* outmost WHERE */
9942     e = cblock->expr1;
9943   else /* inner WHERE */
9944     e = mask;
9945
9946   while (cblock)
9947     {
9948       if (cblock->expr1)
9949         {
9950           /* Check if the mask-expr has a consistent shape with the
9951              outmost WHERE mask-expr.  */
9952           if (!resolve_where_shape (cblock->expr1, e))
9953             gfc_error ("WHERE mask at %L has inconsistent shape",
9954                        &cblock->expr1->where);
9955          }
9956
9957       /* the assignment statement of a WHERE statement, or the first
9958          statement in where-body-construct of a WHERE construct */
9959       cnext = cblock->next;
9960       while (cnext)
9961         {
9962           switch (cnext->op)
9963             {
9964             /* WHERE assignment statement */
9965             case EXEC_ASSIGN:
9966
9967               /* Check shape consistent for WHERE assignment target.  */
9968               if (e && !resolve_where_shape (cnext->expr1, e))
9969                gfc_error ("WHERE assignment target at %L has "
9970                           "inconsistent shape", &cnext->expr1->where);
9971               break;
9972
9973
9974             case EXEC_ASSIGN_CALL:
9975               resolve_call (cnext);
9976               if (!cnext->resolved_sym->attr.elemental)
9977                 gfc_error("Non-ELEMENTAL user-defined assignment in WHERE at %L",
9978                           &cnext->ext.actual->expr->where);
9979               break;
9980
9981             /* WHERE or WHERE construct is part of a where-body-construct */
9982             case EXEC_WHERE:
9983               resolve_where (cnext, e);
9984               break;
9985
9986             default:
9987               gfc_error ("Unsupported statement inside WHERE at %L",
9988                          &cnext->loc);
9989             }
9990          /* the next statement within the same where-body-construct */
9991          cnext = cnext->next;
9992        }
9993     /* the next masked-elsewhere-stmt, elsewhere-stmt, or end-where-stmt */
9994     cblock = cblock->block;
9995   }
9996 }
9997
9998
9999 /* Resolve assignment in FORALL construct.
10000    NVAR is the number of FORALL index variables, and VAR_EXPR records the
10001    FORALL index variables.  */
10002
10003 static void
10004 gfc_resolve_assign_in_forall (gfc_code *code, int nvar, gfc_expr **var_expr)
10005 {
10006   int n;
10007
10008   for (n = 0; n < nvar; n++)
10009     {
10010       gfc_symbol *forall_index;
10011
10012       forall_index = var_expr[n]->symtree->n.sym;
10013
10014       /* Check whether the assignment target is one of the FORALL index
10015          variable.  */
10016       if ((code->expr1->expr_type == EXPR_VARIABLE)
10017           && (code->expr1->symtree->n.sym == forall_index))
10018         gfc_error ("Assignment to a FORALL index variable at %L",
10019                    &code->expr1->where);
10020       else
10021         {
10022           /* If one of the FORALL index variables doesn't appear in the
10023              assignment variable, then there could be a many-to-one
10024              assignment.  Emit a warning rather than an error because the
10025              mask could be resolving this problem.  */
10026           if (!find_forall_index (code->expr1, forall_index, 0))
10027             gfc_warning (0, "The FORALL with index %qs is not used on the "
10028                          "left side of the assignment at %L and so might "
10029                          "cause multiple assignment to this object",
10030                          var_expr[n]->symtree->name, &code->expr1->where);
10031         }
10032     }
10033 }
10034
10035
10036 /* Resolve WHERE statement in FORALL construct.  */
10037
10038 static void
10039 gfc_resolve_where_code_in_forall (gfc_code *code, int nvar,
10040                                   gfc_expr **var_expr)
10041 {
10042   gfc_code *cblock;
10043   gfc_code *cnext;
10044
10045   cblock = code->block;
10046   while (cblock)
10047     {
10048       /* the assignment statement of a WHERE statement, or the first
10049          statement in where-body-construct of a WHERE construct */
10050       cnext = cblock->next;
10051       while (cnext)
10052         {
10053           switch (cnext->op)
10054             {
10055             /* WHERE assignment statement */
10056             case EXEC_ASSIGN:
10057               gfc_resolve_assign_in_forall (cnext, nvar, var_expr);
10058               break;
10059
10060             /* WHERE operator assignment statement */
10061             case EXEC_ASSIGN_CALL:
10062               resolve_call (cnext);
10063               if (!cnext->resolved_sym->attr.elemental)
10064                 gfc_error("Non-ELEMENTAL user-defined assignment in WHERE at %L",
10065                           &cnext->ext.actual->expr->where);
10066               break;
10067
10068             /* WHERE or WHERE construct is part of a where-body-construct */
10069             case EXEC_WHERE:
10070               gfc_resolve_where_code_in_forall (cnext, nvar, var_expr);
10071               break;
10072
10073             default:
10074               gfc_error ("Unsupported statement inside WHERE at %L",
10075                          &cnext->loc);
10076             }
10077           /* the next statement within the same where-body-construct */
10078           cnext = cnext->next;
10079         }
10080       /* the next masked-elsewhere-stmt, elsewhere-stmt, or end-where-stmt */
10081       cblock = cblock->block;
10082     }
10083 }
10084
10085
10086 /* Traverse the FORALL body to check whether the following errors exist:
10087    1. For assignment, check if a many-to-one assignment happens.
10088    2. For WHERE statement, check the WHERE body to see if there is any
10089       many-to-one assignment.  */
10090
10091 static void
10092 gfc_resolve_forall_body (gfc_code *code, int nvar, gfc_expr **var_expr)
10093 {
10094   gfc_code *c;
10095
10096   c = code->block->next;
10097   while (c)
10098     {
10099       switch (c->op)
10100         {
10101         case EXEC_ASSIGN:
10102         case EXEC_POINTER_ASSIGN:
10103           gfc_resolve_assign_in_forall (c, nvar, var_expr);
10104           break;
10105
10106         case EXEC_ASSIGN_CALL:
10107           resolve_call (c);
10108           break;
10109
10110         /* Because the gfc_resolve_blocks() will handle the nested FORALL,
10111            there is no need to handle it here.  */
10112         case EXEC_FORALL:
10113           break;
10114         case EXEC_WHERE:
10115           gfc_resolve_where_code_in_forall(c, nvar, var_expr);
10116           break;
10117         default:
10118           break;
10119         }
10120       /* The next statement in the FORALL body.  */
10121       c = c->next;
10122     }
10123 }
10124
10125
10126 /* Counts the number of iterators needed inside a forall construct, including
10127    nested forall constructs. This is used to allocate the needed memory
10128    in gfc_resolve_forall.  */
10129
10130 static int
10131 gfc_count_forall_iterators (gfc_code *code)
10132 {
10133   int max_iters, sub_iters, current_iters;
10134   gfc_forall_iterator *fa;
10135
10136   gcc_assert(code->op == EXEC_FORALL);
10137   max_iters = 0;
10138   current_iters = 0;
10139
10140   for (fa = code->ext.forall_iterator; fa; fa = fa->next)
10141     current_iters ++;
10142
10143   code = code->block->next;
10144
10145   while (code)
10146     {
10147       if (code->op == EXEC_FORALL)
10148         {
10149           sub_iters = gfc_count_forall_iterators (code);
10150           if (sub_iters > max_iters)
10151             max_iters = sub_iters;
10152         }
10153       code = code->next;
10154     }
10155
10156   return current_iters + max_iters;
10157 }
10158
10159
10160 /* Given a FORALL construct, first resolve the FORALL iterator, then call
10161    gfc_resolve_forall_body to resolve the FORALL body.  */
10162
10163 static void
10164 gfc_resolve_forall (gfc_code *code, gfc_namespace *ns, int forall_save)
10165 {
10166   static gfc_expr **var_expr;
10167   static int total_var = 0;
10168   static int nvar = 0;
10169   int i, old_nvar, tmp;
10170   gfc_forall_iterator *fa;
10171
10172   old_nvar = nvar;
10173
10174   if (!gfc_notify_std (GFC_STD_F2018_OBS, "FORALL construct at %L", &code->loc))
10175     return;
10176
10177   /* Start to resolve a FORALL construct   */
10178   if (forall_save == 0)
10179     {
10180       /* Count the total number of FORALL indices in the nested FORALL
10181          construct in order to allocate the VAR_EXPR with proper size.  */
10182       total_var = gfc_count_forall_iterators (code);
10183
10184       /* Allocate VAR_EXPR with NUMBER_OF_FORALL_INDEX elements.  */
10185       var_expr = XCNEWVEC (gfc_expr *, total_var);
10186     }
10187
10188   /* The information about FORALL iterator, including FORALL indices start, end
10189      and stride.  An outer FORALL indice cannot appear in start, end or stride.  */
10190   for (fa = code->ext.forall_iterator; fa; fa = fa->next)
10191     {
10192       /* Fortran 20008: C738 (R753).  */
10193       if (fa->var->ref && fa->var->ref->type == REF_ARRAY)
10194         {
10195           gfc_error ("FORALL index-name at %L must be a scalar variable "
10196                      "of type integer", &fa->var->where);
10197           continue;
10198         }
10199
10200       /* Check if any outer FORALL index name is the same as the current
10201          one.  */
10202       for (i = 0; i < nvar; i++)
10203         {
10204           if (fa->var->symtree->n.sym == var_expr[i]->symtree->n.sym)
10205             gfc_error ("An outer FORALL construct already has an index "
10206                         "with this name %L", &fa->var->where);
10207         }
10208
10209       /* Record the current FORALL index.  */
10210       var_expr[nvar] = gfc_copy_expr (fa->var);
10211
10212       nvar++;
10213
10214       /* No memory leak.  */
10215       gcc_assert (nvar <= total_var);
10216     }
10217
10218   /* Resolve the FORALL body.  */
10219   gfc_resolve_forall_body (code, nvar, var_expr);
10220
10221   /* May call gfc_resolve_forall to resolve the inner FORALL loop.  */
10222   gfc_resolve_blocks (code->block, ns);
10223
10224   tmp = nvar;
10225   nvar = old_nvar;
10226   /* Free only the VAR_EXPRs allocated in this frame.  */
10227   for (i = nvar; i < tmp; i++)
10228      gfc_free_expr (var_expr[i]);
10229
10230   if (nvar == 0)
10231     {
10232       /* We are in the outermost FORALL construct.  */
10233       gcc_assert (forall_save == 0);
10234
10235       /* VAR_EXPR is not needed any more.  */
10236       free (var_expr);
10237       total_var = 0;
10238     }
10239 }
10240
10241
10242 /* Resolve a BLOCK construct statement.  */
10243
10244 static void
10245 resolve_block_construct (gfc_code* code)
10246 {
10247   /* Resolve the BLOCK's namespace.  */
10248   gfc_resolve (code->ext.block.ns);
10249
10250   /* For an ASSOCIATE block, the associations (and their targets) are already
10251      resolved during resolve_symbol.  */
10252 }
10253
10254
10255 /* Resolve lists of blocks found in IF, SELECT CASE, WHERE, FORALL, GOTO and
10256    DO code nodes.  */
10257
10258 void
10259 gfc_resolve_blocks (gfc_code *b, gfc_namespace *ns)
10260 {
10261   bool t;
10262
10263   for (; b; b = b->block)
10264     {
10265       t = gfc_resolve_expr (b->expr1);
10266       if (!gfc_resolve_expr (b->expr2))
10267         t = false;
10268
10269       switch (b->op)
10270         {
10271         case EXEC_IF:
10272           if (t && b->expr1 != NULL
10273               && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank != 0))
10274             gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
10275                        &b->expr1->where);
10276           break;
10277
10278         case EXEC_WHERE:
10279           if (t
10280               && b->expr1 != NULL
10281               && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank == 0))
10282             gfc_error ("WHERE/ELSEWHERE clause at %L requires a LOGICAL array",
10283                        &b->expr1->where);
10284           break;
10285
10286         case EXEC_GOTO:
10287           resolve_branch (b->label1, b);
10288           break;
10289
10290         case EXEC_BLOCK:
10291           resolve_block_construct (b);
10292           break;
10293
10294         case EXEC_SELECT:
10295         case EXEC_SELECT_TYPE:
10296         case EXEC_FORALL:
10297         case EXEC_DO:
10298         case EXEC_DO_WHILE:
10299         case EXEC_DO_CONCURRENT:
10300         case EXEC_CRITICAL:
10301         case EXEC_READ:
10302         case EXEC_WRITE:
10303         case EXEC_IOLENGTH:
10304         case EXEC_WAIT:
10305           break;
10306
10307         case EXEC_OMP_ATOMIC:
10308         case EXEC_OACC_ATOMIC:
10309           {
10310             gfc_omp_atomic_op aop
10311               = (gfc_omp_atomic_op) (b->ext.omp_atomic & GFC_OMP_ATOMIC_MASK);
10312
10313             /* Verify this before calling gfc_resolve_code, which might
10314                change it.  */
10315             gcc_assert (b->next && b->next->op == EXEC_ASSIGN);
10316             gcc_assert (((aop != GFC_OMP_ATOMIC_CAPTURE)
10317                          && b->next->next == NULL)
10318                         || ((aop == GFC_OMP_ATOMIC_CAPTURE)
10319                             && b->next->next != NULL
10320                             && b->next->next->op == EXEC_ASSIGN
10321                             && b->next->next->next == NULL));
10322           }
10323           break;
10324
10325         case EXEC_OACC_PARALLEL_LOOP:
10326         case EXEC_OACC_PARALLEL:
10327         case EXEC_OACC_KERNELS_LOOP:
10328         case EXEC_OACC_KERNELS:
10329         case EXEC_OACC_DATA:
10330         case EXEC_OACC_HOST_DATA:
10331         case EXEC_OACC_LOOP:
10332         case EXEC_OACC_UPDATE:
10333         case EXEC_OACC_WAIT:
10334         case EXEC_OACC_CACHE:
10335         case EXEC_OACC_ENTER_DATA:
10336         case EXEC_OACC_EXIT_DATA:
10337         case EXEC_OACC_ROUTINE:
10338         case EXEC_OMP_CRITICAL:
10339         case EXEC_OMP_DISTRIBUTE:
10340         case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
10341         case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
10342         case EXEC_OMP_DISTRIBUTE_SIMD:
10343         case EXEC_OMP_DO:
10344         case EXEC_OMP_DO_SIMD:
10345         case EXEC_OMP_MASTER:
10346         case EXEC_OMP_ORDERED:
10347         case EXEC_OMP_PARALLEL:
10348         case EXEC_OMP_PARALLEL_DO:
10349         case EXEC_OMP_PARALLEL_DO_SIMD:
10350         case EXEC_OMP_PARALLEL_SECTIONS:
10351         case EXEC_OMP_PARALLEL_WORKSHARE:
10352         case EXEC_OMP_SECTIONS:
10353         case EXEC_OMP_SIMD:
10354         case EXEC_OMP_SINGLE:
10355         case EXEC_OMP_TARGET:
10356         case EXEC_OMP_TARGET_DATA:
10357         case EXEC_OMP_TARGET_ENTER_DATA:
10358         case EXEC_OMP_TARGET_EXIT_DATA:
10359         case EXEC_OMP_TARGET_PARALLEL:
10360         case EXEC_OMP_TARGET_PARALLEL_DO:
10361         case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
10362         case EXEC_OMP_TARGET_SIMD:
10363         case EXEC_OMP_TARGET_TEAMS:
10364         case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
10365         case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
10366         case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
10367         case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
10368         case EXEC_OMP_TARGET_UPDATE:
10369         case EXEC_OMP_TASK:
10370         case EXEC_OMP_TASKGROUP:
10371         case EXEC_OMP_TASKLOOP:
10372         case EXEC_OMP_TASKLOOP_SIMD:
10373         case EXEC_OMP_TASKWAIT:
10374         case EXEC_OMP_TASKYIELD:
10375         case EXEC_OMP_TEAMS:
10376         case EXEC_OMP_TEAMS_DISTRIBUTE:
10377         case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
10378         case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
10379         case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
10380         case EXEC_OMP_WORKSHARE:
10381           break;
10382
10383         default:
10384           gfc_internal_error ("gfc_resolve_blocks(): Bad block type");
10385         }
10386
10387       gfc_resolve_code (b->next, ns);
10388     }
10389 }
10390
10391
10392 /* Does everything to resolve an ordinary assignment.  Returns true
10393    if this is an interface assignment.  */
10394 static bool
10395 resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns)
10396 {
10397   bool rval = false;
10398   gfc_expr *lhs;
10399   gfc_expr *rhs;
10400   int n;
10401   gfc_ref *ref;
10402   symbol_attribute attr;
10403
10404   if (gfc_extend_assign (code, ns))
10405     {
10406       gfc_expr** rhsptr;
10407
10408       if (code->op == EXEC_ASSIGN_CALL)
10409         {
10410           lhs = code->ext.actual->expr;
10411           rhsptr = &code->ext.actual->next->expr;
10412         }
10413       else
10414         {
10415           gfc_actual_arglist* args;
10416           gfc_typebound_proc* tbp;
10417
10418           gcc_assert (code->op == EXEC_COMPCALL);
10419
10420           args = code->expr1->value.compcall.actual;
10421           lhs = args->expr;
10422           rhsptr = &args->next->expr;
10423
10424           tbp = code->expr1->value.compcall.tbp;
10425           gcc_assert (!tbp->is_generic);
10426         }
10427
10428       /* Make a temporary rhs when there is a default initializer
10429          and rhs is the same symbol as the lhs.  */
10430       if ((*rhsptr)->expr_type == EXPR_VARIABLE
10431             && (*rhsptr)->symtree->n.sym->ts.type == BT_DERIVED
10432             && gfc_has_default_initializer ((*rhsptr)->symtree->n.sym->ts.u.derived)
10433             && (lhs->symtree->n.sym == (*rhsptr)->symtree->n.sym))
10434         *rhsptr = gfc_get_parentheses (*rhsptr);
10435
10436       return true;
10437     }
10438
10439   lhs = code->expr1;
10440   rhs = code->expr2;
10441
10442   if (rhs->is_boz
10443       && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L outside "
10444                           "a DATA statement and outside INT/REAL/DBLE/CMPLX",
10445                           &code->loc))
10446     return false;
10447
10448   /* Handle the case of a BOZ literal on the RHS.  */
10449   if (rhs->is_boz && lhs->ts.type != BT_INTEGER)
10450     {
10451       int rc;
10452       if (warn_surprising)
10453         gfc_warning (OPT_Wsurprising,
10454                      "BOZ literal at %L is bitwise transferred "
10455                      "non-integer symbol %qs", &code->loc,
10456                      lhs->symtree->n.sym->name);
10457
10458       if (!gfc_convert_boz (rhs, &lhs->ts))
10459         return false;
10460       if ((rc = gfc_range_check (rhs)) != ARITH_OK)
10461         {
10462           if (rc == ARITH_UNDERFLOW)
10463             gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
10464                        ". This check can be disabled with the option "
10465                        "%<-fno-range-check%>", &rhs->where);
10466           else if (rc == ARITH_OVERFLOW)
10467             gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
10468                        ". This check can be disabled with the option "
10469                        "%<-fno-range-check%>", &rhs->where);
10470           else if (rc == ARITH_NAN)
10471             gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
10472                        ". This check can be disabled with the option "
10473                        "%<-fno-range-check%>", &rhs->where);
10474           return false;
10475         }
10476     }
10477
10478   if (lhs->ts.type == BT_CHARACTER
10479         && warn_character_truncation)
10480     {
10481       HOST_WIDE_INT llen = 0, rlen = 0;
10482       if (lhs->ts.u.cl != NULL
10483             && lhs->ts.u.cl->length != NULL
10484             && lhs->ts.u.cl->length->expr_type == EXPR_CONSTANT)
10485         llen = gfc_mpz_get_hwi (lhs->ts.u.cl->length->value.integer);
10486
10487       if (rhs->expr_type == EXPR_CONSTANT)
10488         rlen = rhs->value.character.length;
10489
10490       else if (rhs->ts.u.cl != NULL
10491                  && rhs->ts.u.cl->length != NULL
10492                  && rhs->ts.u.cl->length->expr_type == EXPR_CONSTANT)
10493         rlen = gfc_mpz_get_hwi (rhs->ts.u.cl->length->value.integer);
10494
10495       if (rlen && llen && rlen > llen)
10496         gfc_warning_now (OPT_Wcharacter_truncation,
10497                          "CHARACTER expression will be truncated "
10498                          "in assignment (%ld/%ld) at %L",
10499                          (long) llen, (long) rlen, &code->loc);
10500     }
10501
10502   /* Ensure that a vector index expression for the lvalue is evaluated
10503      to a temporary if the lvalue symbol is referenced in it.  */
10504   if (lhs->rank)
10505     {
10506       for (ref = lhs->ref; ref; ref= ref->next)
10507         if (ref->type == REF_ARRAY)
10508           {
10509             for (n = 0; n < ref->u.ar.dimen; n++)
10510               if (ref->u.ar.dimen_type[n] == DIMEN_VECTOR
10511                   && gfc_find_sym_in_expr (lhs->symtree->n.sym,
10512                                            ref->u.ar.start[n]))
10513                 ref->u.ar.start[n]
10514                         = gfc_get_parentheses (ref->u.ar.start[n]);
10515           }
10516     }
10517
10518   if (gfc_pure (NULL))
10519     {
10520       if (lhs->ts.type == BT_DERIVED
10521             && lhs->expr_type == EXPR_VARIABLE
10522             && lhs->ts.u.derived->attr.pointer_comp
10523             && rhs->expr_type == EXPR_VARIABLE
10524             && (gfc_impure_variable (rhs->symtree->n.sym)
10525                 || gfc_is_coindexed (rhs)))
10526         {
10527           /* F2008, C1283.  */
10528           if (gfc_is_coindexed (rhs))
10529             gfc_error ("Coindexed expression at %L is assigned to "
10530                         "a derived type variable with a POINTER "
10531                         "component in a PURE procedure",
10532                         &rhs->where);
10533           else
10534             gfc_error ("The impure variable at %L is assigned to "
10535                         "a derived type variable with a POINTER "
10536                         "component in a PURE procedure (12.6)",
10537                         &rhs->where);
10538           return rval;
10539         }
10540
10541       /* Fortran 2008, C1283.  */
10542       if (gfc_is_coindexed (lhs))
10543         {
10544           gfc_error ("Assignment to coindexed variable at %L in a PURE "
10545                      "procedure", &rhs->where);
10546           return rval;
10547         }
10548     }
10549
10550   if (gfc_implicit_pure (NULL))
10551     {
10552       if (lhs->expr_type == EXPR_VARIABLE
10553             && lhs->symtree->n.sym != gfc_current_ns->proc_name
10554             && lhs->symtree->n.sym->ns != gfc_current_ns)
10555         gfc_unset_implicit_pure (NULL);
10556
10557       if (lhs->ts.type == BT_DERIVED
10558             && lhs->expr_type == EXPR_VARIABLE
10559             && lhs->ts.u.derived->attr.pointer_comp
10560             && rhs->expr_type == EXPR_VARIABLE
10561             && (gfc_impure_variable (rhs->symtree->n.sym)
10562                 || gfc_is_coindexed (rhs)))
10563         gfc_unset_implicit_pure (NULL);
10564
10565       /* Fortran 2008, C1283.  */
10566       if (gfc_is_coindexed (lhs))
10567         gfc_unset_implicit_pure (NULL);
10568     }
10569
10570   /* F2008, 7.2.1.2.  */
10571   attr = gfc_expr_attr (lhs);
10572   if (lhs->ts.type == BT_CLASS && attr.allocatable)
10573     {
10574       if (attr.codimension)
10575         {
10576           gfc_error ("Assignment to polymorphic coarray at %L is not "
10577                      "permitted", &lhs->where);
10578           return false;
10579         }
10580       if (!gfc_notify_std (GFC_STD_F2008, "Assignment to an allocatable "
10581                            "polymorphic variable at %L", &lhs->where))
10582         return false;
10583       if (!flag_realloc_lhs)
10584         {
10585           gfc_error ("Assignment to an allocatable polymorphic variable at %L "
10586                      "requires %<-frealloc-lhs%>", &lhs->where);
10587           return false;
10588         }
10589     }
10590   else if (lhs->ts.type == BT_CLASS)
10591     {
10592       gfc_error ("Nonallocatable variable must not be polymorphic in intrinsic "
10593                  "assignment at %L - check that there is a matching specific "
10594                  "subroutine for '=' operator", &lhs->where);
10595       return false;
10596     }
10597
10598   bool lhs_coindexed = gfc_is_coindexed (lhs);
10599
10600   /* F2008, Section 7.2.1.2.  */
10601   if (lhs_coindexed && gfc_has_ultimate_allocatable (lhs))
10602     {
10603       gfc_error ("Coindexed variable must not have an allocatable ultimate "
10604                  "component in assignment at %L", &lhs->where);
10605       return false;
10606     }
10607
10608   /* Assign the 'data' of a class object to a derived type.  */
10609   if (lhs->ts.type == BT_DERIVED
10610       && rhs->ts.type == BT_CLASS
10611       && rhs->expr_type != EXPR_ARRAY)
10612     gfc_add_data_component (rhs);
10613
10614   /* Make sure there is a vtable and, in particular, a _copy for the
10615      rhs type.  */
10616   if (UNLIMITED_POLY (lhs) && lhs->rank && rhs->ts.type != BT_CLASS)
10617     gfc_find_vtab (&rhs->ts);
10618
10619   bool caf_convert_to_send = flag_coarray == GFC_FCOARRAY_LIB
10620       && (lhs_coindexed
10621           || (code->expr2->expr_type == EXPR_FUNCTION
10622               && code->expr2->value.function.isym
10623               && code->expr2->value.function.isym->id == GFC_ISYM_CAF_GET
10624               && (code->expr1->rank == 0 || code->expr2->rank != 0)
10625               && !gfc_expr_attr (rhs).allocatable
10626               && !gfc_has_vector_subscript (rhs)));
10627
10628   gfc_check_assign (lhs, rhs, 1, !caf_convert_to_send);
10629
10630   /* Insert a GFC_ISYM_CAF_SEND intrinsic, when the LHS is a coindexed variable.
10631      Additionally, insert this code when the RHS is a CAF as we then use the
10632      GFC_ISYM_CAF_SEND intrinsic just to avoid a temporary; but do not do so if
10633      the LHS is (re)allocatable or has a vector subscript.  If the LHS is a
10634      noncoindexed array and the RHS is a coindexed scalar, use the normal code
10635      path.  */
10636   if (caf_convert_to_send)
10637     {
10638       if (code->expr2->expr_type == EXPR_FUNCTION
10639           && code->expr2->value.function.isym
10640           && code->expr2->value.function.isym->id == GFC_ISYM_CAF_GET)
10641         remove_caf_get_intrinsic (code->expr2);
10642       code->op = EXEC_CALL;
10643       gfc_get_sym_tree (GFC_PREFIX ("caf_send"), ns, &code->symtree, true);
10644       code->resolved_sym = code->symtree->n.sym;
10645       code->resolved_sym->attr.flavor = FL_PROCEDURE;
10646       code->resolved_sym->attr.intrinsic = 1;
10647       code->resolved_sym->attr.subroutine = 1;
10648       code->resolved_isym = gfc_intrinsic_subroutine_by_id (GFC_ISYM_CAF_SEND);
10649       gfc_commit_symbol (code->resolved_sym);
10650       code->ext.actual = gfc_get_actual_arglist ();
10651       code->ext.actual->expr = lhs;
10652       code->ext.actual->next = gfc_get_actual_arglist ();
10653       code->ext.actual->next->expr = rhs;
10654       code->expr1 = NULL;
10655       code->expr2 = NULL;
10656     }
10657
10658   return false;
10659 }
10660
10661
10662 /* Add a component reference onto an expression.  */
10663
10664 static void
10665 add_comp_ref (gfc_expr *e, gfc_component *c)
10666 {
10667   gfc_ref **ref;
10668   ref = &(e->ref);
10669   while (*ref)
10670     ref = &((*ref)->next);
10671   *ref = gfc_get_ref ();
10672   (*ref)->type = REF_COMPONENT;
10673   (*ref)->u.c.sym = e->ts.u.derived;
10674   (*ref)->u.c.component = c;
10675   e->ts = c->ts;
10676
10677   /* Add a full array ref, as necessary.  */
10678   if (c->as)
10679     {
10680       gfc_add_full_array_ref (e, c->as);
10681       e->rank = c->as->rank;
10682     }
10683 }
10684
10685
10686 /* Build an assignment.  Keep the argument 'op' for future use, so that
10687    pointer assignments can be made.  */
10688
10689 static gfc_code *
10690 build_assignment (gfc_exec_op op, gfc_expr *expr1, gfc_expr *expr2,
10691                   gfc_component *comp1, gfc_component *comp2, locus loc)
10692 {
10693   gfc_code *this_code;
10694
10695   this_code = gfc_get_code (op);
10696   this_code->next = NULL;
10697   this_code->expr1 = gfc_copy_expr (expr1);
10698   this_code->expr2 = gfc_copy_expr (expr2);
10699   this_code->loc = loc;
10700   if (comp1 && comp2)
10701     {
10702       add_comp_ref (this_code->expr1, comp1);
10703       add_comp_ref (this_code->expr2, comp2);
10704     }
10705
10706   return this_code;
10707 }
10708
10709
10710 /* Makes a temporary variable expression based on the characteristics of
10711    a given variable expression.  */
10712
10713 static gfc_expr*
10714 get_temp_from_expr (gfc_expr *e, gfc_namespace *ns)
10715 {
10716   static int serial = 0;
10717   char name[GFC_MAX_SYMBOL_LEN];
10718   gfc_symtree *tmp;
10719   gfc_array_spec *as;
10720   gfc_array_ref *aref;
10721   gfc_ref *ref;
10722
10723   sprintf (name, GFC_PREFIX("DA%d"), serial++);
10724   gfc_get_sym_tree (name, ns, &tmp, false);
10725   gfc_add_type (tmp->n.sym, &e->ts, NULL);
10726
10727   if (e->expr_type == EXPR_CONSTANT && e->ts.type == BT_CHARACTER)
10728     tmp->n.sym->ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind,
10729                                                     NULL,
10730                                                     e->value.character.length);
10731
10732   as = NULL;
10733   ref = NULL;
10734   aref = NULL;
10735
10736   /* Obtain the arrayspec for the temporary.  */
10737    if (e->rank && e->expr_type != EXPR_ARRAY
10738        && e->expr_type != EXPR_FUNCTION
10739        && e->expr_type != EXPR_OP)
10740     {
10741       aref = gfc_find_array_ref (e);
10742       if (e->expr_type == EXPR_VARIABLE
10743           && e->symtree->n.sym->as == aref->as)
10744         as = aref->as;
10745       else
10746         {
10747           for (ref = e->ref; ref; ref = ref->next)
10748             if (ref->type == REF_COMPONENT
10749                 && ref->u.c.component->as == aref->as)
10750               {
10751                 as = aref->as;
10752                 break;
10753               }
10754         }
10755     }
10756
10757   /* Add the attributes and the arrayspec to the temporary.  */
10758   tmp->n.sym->attr = gfc_expr_attr (e);
10759   tmp->n.sym->attr.function = 0;
10760   tmp->n.sym->attr.result = 0;
10761   tmp->n.sym->attr.flavor = FL_VARIABLE;
10762   tmp->n.sym->attr.dummy = 0;
10763   tmp->n.sym->attr.intent = INTENT_UNKNOWN;
10764
10765   if (as)
10766     {
10767       tmp->n.sym->as = gfc_copy_array_spec (as);
10768       if (!ref)
10769         ref = e->ref;
10770       if (as->type == AS_DEFERRED)
10771         tmp->n.sym->attr.allocatable = 1;
10772     }
10773   else if (e->rank && (e->expr_type == EXPR_ARRAY
10774                        || e->expr_type == EXPR_FUNCTION
10775                        || e->expr_type == EXPR_OP))
10776     {
10777       tmp->n.sym->as = gfc_get_array_spec ();
10778       tmp->n.sym->as->type = AS_DEFERRED;
10779       tmp->n.sym->as->rank = e->rank;
10780       tmp->n.sym->attr.allocatable = 1;
10781       tmp->n.sym->attr.dimension = 1;
10782     }
10783   else
10784     tmp->n.sym->attr.dimension = 0;
10785
10786   gfc_set_sym_referenced (tmp->n.sym);
10787   gfc_commit_symbol (tmp->n.sym);
10788   e = gfc_lval_expr_from_sym (tmp->n.sym);
10789
10790   /* Should the lhs be a section, use its array ref for the
10791      temporary expression.  */
10792   if (aref && aref->type != AR_FULL)
10793     {
10794       gfc_free_ref_list (e->ref);
10795       e->ref = gfc_copy_ref (ref);
10796     }
10797   return e;
10798 }
10799
10800
10801 /* Add one line of code to the code chain, making sure that 'head' and
10802    'tail' are appropriately updated.  */
10803
10804 static void
10805 add_code_to_chain (gfc_code **this_code, gfc_code **head, gfc_code **tail)
10806 {
10807   gcc_assert (this_code);
10808   if (*head == NULL)
10809     *head = *tail = *this_code;
10810   else
10811     *tail = gfc_append_code (*tail, *this_code);
10812   *this_code = NULL;
10813 }
10814
10815
10816 /* Counts the potential number of part array references that would
10817    result from resolution of typebound defined assignments.  */
10818
10819 static int
10820 nonscalar_typebound_assign (gfc_symbol *derived, int depth)
10821 {
10822   gfc_component *c;
10823   int c_depth = 0, t_depth;
10824
10825   for (c= derived->components; c; c = c->next)
10826     {
10827       if ((!gfc_bt_struct (c->ts.type)
10828             || c->attr.pointer
10829             || c->attr.allocatable
10830             || c->attr.proc_pointer_comp
10831             || c->attr.class_pointer
10832             || c->attr.proc_pointer)
10833           && !c->attr.defined_assign_comp)
10834         continue;
10835
10836       if (c->as && c_depth == 0)
10837         c_depth = 1;
10838
10839       if (c->ts.u.derived->attr.defined_assign_comp)
10840         t_depth = nonscalar_typebound_assign (c->ts.u.derived,
10841                                               c->as ? 1 : 0);
10842       else
10843         t_depth = 0;
10844
10845       c_depth = t_depth > c_depth ? t_depth : c_depth;
10846     }
10847   return depth + c_depth;
10848 }
10849
10850
10851 /* Implement 7.2.1.3 of the F08 standard:
10852    "An intrinsic assignment where the variable is of derived type is
10853    performed as if each component of the variable were assigned from the
10854    corresponding component of expr using pointer assignment (7.2.2) for
10855    each pointer component, defined assignment for each nonpointer
10856    nonallocatable component of a type that has a type-bound defined
10857    assignment consistent with the component, intrinsic assignment for
10858    each other nonpointer nonallocatable component, ..."
10859
10860    The pointer assignments are taken care of by the intrinsic
10861    assignment of the structure itself.  This function recursively adds
10862    defined assignments where required.  The recursion is accomplished
10863    by calling gfc_resolve_code.
10864
10865    When the lhs in a defined assignment has intent INOUT, we need a
10866    temporary for the lhs.  In pseudo-code:
10867
10868    ! Only call function lhs once.
10869       if (lhs is not a constant or an variable)
10870           temp_x = expr2
10871           expr2 => temp_x
10872    ! Do the intrinsic assignment
10873       expr1 = expr2
10874    ! Now do the defined assignments
10875       do over components with typebound defined assignment [%cmp]
10876         #if one component's assignment procedure is INOUT
10877           t1 = expr1
10878           #if expr2 non-variable
10879             temp_x = expr2
10880             expr2 => temp_x
10881           # endif
10882           expr1 = expr2
10883           # for each cmp
10884             t1%cmp {defined=} expr2%cmp
10885             expr1%cmp = t1%cmp
10886         #else
10887           expr1 = expr2
10888
10889         # for each cmp
10890           expr1%cmp {defined=} expr2%cmp
10891         #endif
10892    */
10893
10894 /* The temporary assignments have to be put on top of the additional
10895    code to avoid the result being changed by the intrinsic assignment.
10896    */
10897 static int component_assignment_level = 0;
10898 static gfc_code *tmp_head = NULL, *tmp_tail = NULL;
10899
10900 static void
10901 generate_component_assignments (gfc_code **code, gfc_namespace *ns)
10902 {
10903   gfc_component *comp1, *comp2;
10904   gfc_code *this_code = NULL, *head = NULL, *tail = NULL;
10905   gfc_expr *t1;
10906   int error_count, depth;
10907
10908   gfc_get_errors (NULL, &error_count);
10909
10910   /* Filter out continuing processing after an error.  */
10911   if (error_count
10912       || (*code)->expr1->ts.type != BT_DERIVED
10913       || (*code)->expr2->ts.type != BT_DERIVED)
10914     return;
10915
10916   /* TODO: Handle more than one part array reference in assignments.  */
10917   depth = nonscalar_typebound_assign ((*code)->expr1->ts.u.derived,
10918                                       (*code)->expr1->rank ? 1 : 0);
10919   if (depth > 1)
10920     {
10921       gfc_warning (0, "TODO: type-bound defined assignment(s) at %L not "
10922                    "done because multiple part array references would "
10923                    "occur in intermediate expressions.", &(*code)->loc);
10924       return;
10925     }
10926
10927   component_assignment_level++;
10928
10929   /* Create a temporary so that functions get called only once.  */
10930   if ((*code)->expr2->expr_type != EXPR_VARIABLE
10931       && (*code)->expr2->expr_type != EXPR_CONSTANT)
10932     {
10933       gfc_expr *tmp_expr;
10934
10935       /* Assign the rhs to the temporary.  */
10936       tmp_expr = get_temp_from_expr ((*code)->expr1, ns);
10937       this_code = build_assignment (EXEC_ASSIGN,
10938                                     tmp_expr, (*code)->expr2,
10939                                     NULL, NULL, (*code)->loc);
10940       /* Add the code and substitute the rhs expression.  */
10941       add_code_to_chain (&this_code, &tmp_head, &tmp_tail);
10942       gfc_free_expr ((*code)->expr2);
10943       (*code)->expr2 = tmp_expr;
10944     }
10945
10946   /* Do the intrinsic assignment.  This is not needed if the lhs is one
10947      of the temporaries generated here, since the intrinsic assignment
10948      to the final result already does this.  */
10949   if ((*code)->expr1->symtree->n.sym->name[2] != '@')
10950     {
10951       this_code = build_assignment (EXEC_ASSIGN,
10952                                     (*code)->expr1, (*code)->expr2,
10953                                     NULL, NULL, (*code)->loc);
10954       add_code_to_chain (&this_code, &head, &tail);
10955     }
10956
10957   comp1 = (*code)->expr1->ts.u.derived->components;
10958   comp2 = (*code)->expr2->ts.u.derived->components;
10959
10960   t1 = NULL;
10961   for (; comp1; comp1 = comp1->next, comp2 = comp2->next)
10962     {
10963       bool inout = false;
10964
10965       /* The intrinsic assignment does the right thing for pointers
10966          of all kinds and allocatable components.  */
10967       if (!gfc_bt_struct (comp1->ts.type)
10968           || comp1->attr.pointer
10969           || comp1->attr.allocatable
10970           || comp1->attr.proc_pointer_comp
10971           || comp1->attr.class_pointer
10972           || comp1->attr.proc_pointer)
10973         continue;
10974
10975       /* Make an assigment for this component.  */
10976       this_code = build_assignment (EXEC_ASSIGN,
10977                                     (*code)->expr1, (*code)->expr2,
10978                                     comp1, comp2, (*code)->loc);
10979
10980       /* Convert the assignment if there is a defined assignment for
10981          this type.  Otherwise, using the call from gfc_resolve_code,
10982          recurse into its components.  */
10983       gfc_resolve_code (this_code, ns);
10984
10985       if (this_code->op == EXEC_ASSIGN_CALL)
10986         {
10987           gfc_formal_arglist *dummy_args;
10988           gfc_symbol *rsym;
10989           /* Check that there is a typebound defined assignment.  If not,
10990              then this must be a module defined assignment.  We cannot
10991              use the defined_assign_comp attribute here because it must
10992              be this derived type that has the defined assignment and not
10993              a parent type.  */
10994           if (!(comp1->ts.u.derived->f2k_derived
10995                 && comp1->ts.u.derived->f2k_derived
10996                                         ->tb_op[INTRINSIC_ASSIGN]))
10997             {
10998               gfc_free_statements (this_code);
10999               this_code = NULL;
11000               continue;
11001             }
11002
11003           /* If the first argument of the subroutine has intent INOUT
11004              a temporary must be generated and used instead.  */
11005           rsym = this_code->resolved_sym;
11006           dummy_args = gfc_sym_get_dummy_args (rsym);
11007           if (dummy_args
11008               && dummy_args->sym->attr.intent == INTENT_INOUT)
11009             {
11010               gfc_code *temp_code;
11011               inout = true;
11012
11013               /* Build the temporary required for the assignment and put
11014                  it at the head of the generated code.  */
11015               if (!t1)
11016                 {
11017                   t1 = get_temp_from_expr ((*code)->expr1, ns);
11018                   temp_code = build_assignment (EXEC_ASSIGN,
11019                                                 t1, (*code)->expr1,
11020                                 NULL, NULL, (*code)->loc);
11021
11022                   /* For allocatable LHS, check whether it is allocated.  Note
11023                      that allocatable components with defined assignment are
11024                      not yet support.  See PR 57696.  */
11025                   if ((*code)->expr1->symtree->n.sym->attr.allocatable)
11026                     {
11027                       gfc_code *block;
11028                       gfc_expr *e =
11029                         gfc_lval_expr_from_sym ((*code)->expr1->symtree->n.sym);
11030                       block = gfc_get_code (EXEC_IF);
11031                       block->block = gfc_get_code (EXEC_IF);
11032                       block->block->expr1
11033                           = gfc_build_intrinsic_call (ns,
11034                                     GFC_ISYM_ALLOCATED, "allocated",
11035                                     (*code)->loc, 1, e);
11036                       block->block->next = temp_code;
11037                       temp_code = block;
11038                     }
11039                   add_code_to_chain (&temp_code, &tmp_head, &tmp_tail);
11040                 }
11041
11042               /* Replace the first actual arg with the component of the
11043                  temporary.  */
11044               gfc_free_expr (this_code->ext.actual->expr);
11045               this_code->ext.actual->expr = gfc_copy_expr (t1);
11046               add_comp_ref (this_code->ext.actual->expr, comp1);
11047
11048               /* If the LHS variable is allocatable and wasn't allocated and
11049                  the temporary is allocatable, pointer assign the address of
11050                  the freshly allocated LHS to the temporary.  */
11051               if ((*code)->expr1->symtree->n.sym->attr.allocatable
11052                   && gfc_expr_attr ((*code)->expr1).allocatable)
11053                 {
11054                   gfc_code *block;
11055                   gfc_expr *cond;
11056
11057                   cond = gfc_get_expr ();
11058                   cond->ts.type = BT_LOGICAL;
11059                   cond->ts.kind = gfc_default_logical_kind;
11060                   cond->expr_type = EXPR_OP;
11061                   cond->where = (*code)->loc;
11062                   cond->value.op.op = INTRINSIC_NOT;
11063                   cond->value.op.op1 = gfc_build_intrinsic_call (ns,
11064                                           GFC_ISYM_ALLOCATED, "allocated",
11065                                           (*code)->loc, 1, gfc_copy_expr (t1));
11066                   block = gfc_get_code (EXEC_IF);
11067                   block->block = gfc_get_code (EXEC_IF);
11068                   block->block->expr1 = cond;
11069                   block->block->next = build_assignment (EXEC_POINTER_ASSIGN,
11070                                         t1, (*code)->expr1,
11071                                         NULL, NULL, (*code)->loc);
11072                   add_code_to_chain (&block, &head, &tail);
11073                 }
11074             }
11075         }
11076       else if (this_code->op == EXEC_ASSIGN && !this_code->next)
11077         {
11078           /* Don't add intrinsic assignments since they are already
11079              effected by the intrinsic assignment of the structure.  */
11080           gfc_free_statements (this_code);
11081           this_code = NULL;
11082           continue;
11083         }
11084
11085       add_code_to_chain (&this_code, &head, &tail);
11086
11087       if (t1 && inout)
11088         {
11089           /* Transfer the value to the final result.  */
11090           this_code = build_assignment (EXEC_ASSIGN,
11091                                         (*code)->expr1, t1,
11092                                         comp1, comp2, (*code)->loc);
11093           add_code_to_chain (&this_code, &head, &tail);
11094         }
11095     }
11096
11097   /* Put the temporary assignments at the top of the generated code.  */
11098   if (tmp_head && component_assignment_level == 1)
11099     {
11100       gfc_append_code (tmp_head, head);
11101       head = tmp_head;
11102       tmp_head = tmp_tail = NULL;
11103     }
11104
11105   // If we did a pointer assignment - thus, we need to ensure that the LHS is
11106   // not accidentally deallocated. Hence, nullify t1.
11107   if (t1 && (*code)->expr1->symtree->n.sym->attr.allocatable
11108       && gfc_expr_attr ((*code)->expr1).allocatable)
11109     {
11110       gfc_code *block;
11111       gfc_expr *cond;
11112       gfc_expr *e;
11113
11114       e = gfc_lval_expr_from_sym ((*code)->expr1->symtree->n.sym);
11115       cond = gfc_build_intrinsic_call (ns, GFC_ISYM_ASSOCIATED, "associated",
11116                                        (*code)->loc, 2, gfc_copy_expr (t1), e);
11117       block = gfc_get_code (EXEC_IF);
11118       block->block = gfc_get_code (EXEC_IF);
11119       block->block->expr1 = cond;
11120       block->block->next = build_assignment (EXEC_POINTER_ASSIGN,
11121                                         t1, gfc_get_null_expr (&(*code)->loc),
11122                                         NULL, NULL, (*code)->loc);
11123       gfc_append_code (tail, block);
11124       tail = block;
11125     }
11126
11127   /* Now attach the remaining code chain to the input code.  Step on
11128      to the end of the new code since resolution is complete.  */
11129   gcc_assert ((*code)->op == EXEC_ASSIGN);
11130   tail->next = (*code)->next;
11131   /* Overwrite 'code' because this would place the intrinsic assignment
11132      before the temporary for the lhs is created.  */
11133   gfc_free_expr ((*code)->expr1);
11134   gfc_free_expr ((*code)->expr2);
11135   **code = *head;
11136   if (head != tail)
11137     free (head);
11138   *code = tail;
11139
11140   component_assignment_level--;
11141 }
11142
11143
11144 /* F2008: Pointer function assignments are of the form:
11145         ptr_fcn (args) = expr
11146    This function breaks these assignments into two statements:
11147         temporary_pointer => ptr_fcn(args)
11148         temporary_pointer = expr  */
11149
11150 static bool
11151 resolve_ptr_fcn_assign (gfc_code **code, gfc_namespace *ns)
11152 {
11153   gfc_expr *tmp_ptr_expr;
11154   gfc_code *this_code;
11155   gfc_component *comp;
11156   gfc_symbol *s;
11157
11158   if ((*code)->expr1->expr_type != EXPR_FUNCTION)
11159     return false;
11160
11161   /* Even if standard does not support this feature, continue to build
11162      the two statements to avoid upsetting frontend_passes.c.  */
11163   gfc_notify_std (GFC_STD_F2008, "Pointer procedure assignment at "
11164                   "%L", &(*code)->loc);
11165
11166   comp = gfc_get_proc_ptr_comp ((*code)->expr1);
11167
11168   if (comp)
11169     s = comp->ts.interface;
11170   else
11171     s = (*code)->expr1->symtree->n.sym;
11172
11173   if (s == NULL || !s->result->attr.pointer)
11174     {
11175       gfc_error ("The function result on the lhs of the assignment at "
11176                  "%L must have the pointer attribute.",
11177                  &(*code)->expr1->where);
11178       (*code)->op = EXEC_NOP;
11179       return false;
11180     }
11181
11182   tmp_ptr_expr = get_temp_from_expr ((*code)->expr2, ns);
11183
11184   /* get_temp_from_expression is set up for ordinary assignments. To that
11185      end, where array bounds are not known, arrays are made allocatable.
11186      Change the temporary to a pointer here.  */
11187   tmp_ptr_expr->symtree->n.sym->attr.pointer = 1;
11188   tmp_ptr_expr->symtree->n.sym->attr.allocatable = 0;
11189   tmp_ptr_expr->where = (*code)->loc;
11190
11191   this_code = build_assignment (EXEC_ASSIGN,
11192                                 tmp_ptr_expr, (*code)->expr2,
11193                                 NULL, NULL, (*code)->loc);
11194   this_code->next = (*code)->next;
11195   (*code)->next = this_code;
11196   (*code)->op = EXEC_POINTER_ASSIGN;
11197   (*code)->expr2 = (*code)->expr1;
11198   (*code)->expr1 = tmp_ptr_expr;
11199
11200   return true;
11201 }
11202
11203
11204 /* Deferred character length assignments from an operator expression
11205    require a temporary because the character length of the lhs can
11206    change in the course of the assignment.  */
11207
11208 static bool
11209 deferred_op_assign (gfc_code **code, gfc_namespace *ns)
11210 {
11211   gfc_expr *tmp_expr;
11212   gfc_code *this_code;
11213
11214   if (!((*code)->expr1->ts.type == BT_CHARACTER
11215          && (*code)->expr1->ts.deferred && (*code)->expr1->rank
11216          && (*code)->expr2->expr_type == EXPR_OP))
11217     return false;
11218
11219   if (!gfc_check_dependency ((*code)->expr1, (*code)->expr2, 1))
11220     return false;
11221
11222   if (gfc_expr_attr ((*code)->expr1).pointer)
11223     return false;
11224
11225   tmp_expr = get_temp_from_expr ((*code)->expr1, ns);
11226   tmp_expr->where = (*code)->loc;
11227
11228   /* A new charlen is required to ensure that the variable string
11229      length is different to that of the original lhs.  */
11230   tmp_expr->ts.u.cl = gfc_get_charlen();
11231   tmp_expr->symtree->n.sym->ts.u.cl = tmp_expr->ts.u.cl;
11232   tmp_expr->ts.u.cl->next = (*code)->expr2->ts.u.cl->next;
11233   (*code)->expr2->ts.u.cl->next = tmp_expr->ts.u.cl;
11234
11235   tmp_expr->symtree->n.sym->ts.deferred = 1;
11236
11237   this_code = build_assignment (EXEC_ASSIGN,
11238                                 (*code)->expr1,
11239                                 gfc_copy_expr (tmp_expr),
11240                                 NULL, NULL, (*code)->loc);
11241
11242   (*code)->expr1 = tmp_expr;
11243
11244   this_code->next = (*code)->next;
11245   (*code)->next = this_code;
11246
11247   return true;
11248 }
11249
11250
11251 /* Given a block of code, recursively resolve everything pointed to by this
11252    code block.  */
11253
11254 void
11255 gfc_resolve_code (gfc_code *code, gfc_namespace *ns)
11256 {
11257   int omp_workshare_save;
11258   int forall_save, do_concurrent_save;
11259   code_stack frame;
11260   bool t;
11261
11262   frame.prev = cs_base;
11263   frame.head = code;
11264   cs_base = &frame;
11265
11266   find_reachable_labels (code);
11267
11268   for (; code; code = code->next)
11269     {
11270       frame.current = code;
11271       forall_save = forall_flag;
11272       do_concurrent_save = gfc_do_concurrent_flag;
11273
11274       if (code->op == EXEC_FORALL)
11275         {
11276           forall_flag = 1;
11277           gfc_resolve_forall (code, ns, forall_save);
11278           forall_flag = 2;
11279         }
11280       else if (code->block)
11281         {
11282           omp_workshare_save = -1;
11283           switch (code->op)
11284             {
11285             case EXEC_OACC_PARALLEL_LOOP:
11286             case EXEC_OACC_PARALLEL:
11287             case EXEC_OACC_KERNELS_LOOP:
11288             case EXEC_OACC_KERNELS:
11289             case EXEC_OACC_DATA:
11290             case EXEC_OACC_HOST_DATA:
11291             case EXEC_OACC_LOOP:
11292               gfc_resolve_oacc_blocks (code, ns);
11293               break;
11294             case EXEC_OMP_PARALLEL_WORKSHARE:
11295               omp_workshare_save = omp_workshare_flag;
11296               omp_workshare_flag = 1;
11297               gfc_resolve_omp_parallel_blocks (code, ns);
11298               break;
11299             case EXEC_OMP_PARALLEL:
11300             case EXEC_OMP_PARALLEL_DO:
11301             case EXEC_OMP_PARALLEL_DO_SIMD:
11302             case EXEC_OMP_PARALLEL_SECTIONS:
11303             case EXEC_OMP_TARGET_PARALLEL:
11304             case EXEC_OMP_TARGET_PARALLEL_DO:
11305             case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
11306             case EXEC_OMP_TARGET_TEAMS:
11307             case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
11308             case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
11309             case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
11310             case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
11311             case EXEC_OMP_TASK:
11312             case EXEC_OMP_TASKLOOP:
11313             case EXEC_OMP_TASKLOOP_SIMD:
11314             case EXEC_OMP_TEAMS:
11315             case EXEC_OMP_TEAMS_DISTRIBUTE:
11316             case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
11317             case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
11318             case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
11319               omp_workshare_save = omp_workshare_flag;
11320               omp_workshare_flag = 0;
11321               gfc_resolve_omp_parallel_blocks (code, ns);
11322               break;
11323             case EXEC_OMP_DISTRIBUTE:
11324             case EXEC_OMP_DISTRIBUTE_SIMD:
11325             case EXEC_OMP_DO:
11326             case EXEC_OMP_DO_SIMD:
11327             case EXEC_OMP_SIMD:
11328             case EXEC_OMP_TARGET_SIMD:
11329               gfc_resolve_omp_do_blocks (code, ns);
11330               break;
11331             case EXEC_SELECT_TYPE:
11332               /* Blocks are handled in resolve_select_type because we have
11333                  to transform the SELECT TYPE into ASSOCIATE first.  */
11334               break;
11335             case EXEC_DO_CONCURRENT:
11336               gfc_do_concurrent_flag = 1;
11337               gfc_resolve_blocks (code->block, ns);
11338               gfc_do_concurrent_flag = 2;
11339               break;
11340             case EXEC_OMP_WORKSHARE:
11341               omp_workshare_save = omp_workshare_flag;
11342               omp_workshare_flag = 1;
11343               /* FALL THROUGH */
11344             default:
11345               gfc_resolve_blocks (code->block, ns);
11346               break;
11347             }
11348
11349           if (omp_workshare_save != -1)
11350             omp_workshare_flag = omp_workshare_save;
11351         }
11352 start:
11353       t = true;
11354       if (code->op != EXEC_COMPCALL && code->op != EXEC_CALL_PPC)
11355         t = gfc_resolve_expr (code->expr1);
11356       forall_flag = forall_save;
11357       gfc_do_concurrent_flag = do_concurrent_save;
11358
11359       if (!gfc_resolve_expr (code->expr2))
11360         t = false;
11361
11362       if (code->op == EXEC_ALLOCATE
11363           && !gfc_resolve_expr (code->expr3))
11364         t = false;
11365
11366       switch (code->op)
11367         {
11368         case EXEC_NOP:
11369         case EXEC_END_BLOCK:
11370         case EXEC_END_NESTED_BLOCK:
11371         case EXEC_CYCLE:
11372         case EXEC_PAUSE:
11373         case EXEC_STOP:
11374         case EXEC_ERROR_STOP:
11375         case EXEC_EXIT:
11376         case EXEC_CONTINUE:
11377         case EXEC_DT_END:
11378         case EXEC_ASSIGN_CALL:
11379           break;
11380
11381         case EXEC_CRITICAL:
11382           resolve_critical (code);
11383           break;
11384
11385         case EXEC_SYNC_ALL:
11386         case EXEC_SYNC_IMAGES:
11387         case EXEC_SYNC_MEMORY:
11388           resolve_sync (code);
11389           break;
11390
11391         case EXEC_LOCK:
11392         case EXEC_UNLOCK:
11393         case EXEC_EVENT_POST:
11394         case EXEC_EVENT_WAIT:
11395           resolve_lock_unlock_event (code);
11396           break;
11397
11398         case EXEC_FAIL_IMAGE:
11399         case EXEC_FORM_TEAM:
11400         case EXEC_CHANGE_TEAM:
11401         case EXEC_END_TEAM:
11402         case EXEC_SYNC_TEAM:
11403           break;
11404
11405         case EXEC_ENTRY:
11406           /* Keep track of which entry we are up to.  */
11407           current_entry_id = code->ext.entry->id;
11408           break;
11409
11410         case EXEC_WHERE:
11411           resolve_where (code, NULL);
11412           break;
11413
11414         case EXEC_GOTO:
11415           if (code->expr1 != NULL)
11416             {
11417               if (code->expr1->ts.type != BT_INTEGER)
11418                 gfc_error ("ASSIGNED GOTO statement at %L requires an "
11419                            "INTEGER variable", &code->expr1->where);
11420               else if (code->expr1->symtree->n.sym->attr.assign != 1)
11421                 gfc_error ("Variable %qs has not been assigned a target "
11422                            "label at %L", code->expr1->symtree->n.sym->name,
11423                            &code->expr1->where);
11424             }
11425           else
11426             resolve_branch (code->label1, code);
11427           break;
11428
11429         case EXEC_RETURN:
11430           if (code->expr1 != NULL
11431                 && (code->expr1->ts.type != BT_INTEGER || code->expr1->rank))
11432             gfc_error ("Alternate RETURN statement at %L requires a SCALAR-"
11433                        "INTEGER return specifier", &code->expr1->where);
11434           break;
11435
11436         case EXEC_INIT_ASSIGN:
11437         case EXEC_END_PROCEDURE:
11438           break;
11439
11440         case EXEC_ASSIGN:
11441           if (!t)
11442             break;
11443
11444           /* Remove a GFC_ISYM_CAF_GET inserted for a coindexed variable on
11445              the LHS.  */
11446           if (code->expr1->expr_type == EXPR_FUNCTION
11447               && code->expr1->value.function.isym
11448               && code->expr1->value.function.isym->id == GFC_ISYM_CAF_GET)
11449             remove_caf_get_intrinsic (code->expr1);
11450
11451           /* If this is a pointer function in an lvalue variable context,
11452              the new code will have to be resolved afresh. This is also the
11453              case with an error, where the code is transformed into NOP to
11454              prevent ICEs downstream.  */
11455           if (resolve_ptr_fcn_assign (&code, ns)
11456               || code->op == EXEC_NOP)
11457             goto start;
11458
11459           if (!gfc_check_vardef_context (code->expr1, false, false, false,
11460                                          _("assignment")))
11461             break;
11462
11463           if (resolve_ordinary_assign (code, ns))
11464             {
11465               if (code->op == EXEC_COMPCALL)
11466                 goto compcall;
11467               else
11468                 goto call;
11469             }
11470
11471           /* Check for dependencies in deferred character length array
11472              assignments and generate a temporary, if necessary.  */
11473           if (code->op == EXEC_ASSIGN && deferred_op_assign (&code, ns))
11474             break;
11475
11476           /* F03 7.4.1.3 for non-allocatable, non-pointer components.  */
11477           if (code->op != EXEC_CALL && code->expr1->ts.type == BT_DERIVED
11478               && code->expr1->ts.u.derived
11479               && code->expr1->ts.u.derived->attr.defined_assign_comp)
11480             generate_component_assignments (&code, ns);
11481
11482           break;
11483
11484         case EXEC_LABEL_ASSIGN:
11485           if (code->label1->defined == ST_LABEL_UNKNOWN)
11486             gfc_error ("Label %d referenced at %L is never defined",
11487                        code->label1->value, &code->label1->where);
11488           if (t
11489               && (code->expr1->expr_type != EXPR_VARIABLE
11490                   || code->expr1->symtree->n.sym->ts.type != BT_INTEGER
11491                   || code->expr1->symtree->n.sym->ts.kind
11492                      != gfc_default_integer_kind
11493                   || code->expr1->symtree->n.sym->as != NULL))
11494             gfc_error ("ASSIGN statement at %L requires a scalar "
11495                        "default INTEGER variable", &code->expr1->where);
11496           break;
11497
11498         case EXEC_POINTER_ASSIGN:
11499           {
11500             gfc_expr* e;
11501
11502             if (!t)
11503               break;
11504
11505             /* This is both a variable definition and pointer assignment
11506                context, so check both of them.  For rank remapping, a final
11507                array ref may be present on the LHS and fool gfc_expr_attr
11508                used in gfc_check_vardef_context.  Remove it.  */
11509             e = remove_last_array_ref (code->expr1);
11510             t = gfc_check_vardef_context (e, true, false, false,
11511                                           _("pointer assignment"));
11512             if (t)
11513               t = gfc_check_vardef_context (e, false, false, false,
11514                                             _("pointer assignment"));
11515             gfc_free_expr (e);
11516
11517             t = gfc_check_pointer_assign (code->expr1, code->expr2, !t) && t;
11518
11519             if (!t)
11520               break;
11521
11522             /* Assigning a class object always is a regular assign.  */
11523             if (code->expr2->ts.type == BT_CLASS
11524                 && code->expr1->ts.type == BT_CLASS
11525                 && !CLASS_DATA (code->expr2)->attr.dimension
11526                 && !(gfc_expr_attr (code->expr1).proc_pointer
11527                      && code->expr2->expr_type == EXPR_VARIABLE
11528                      && code->expr2->symtree->n.sym->attr.flavor
11529                         == FL_PROCEDURE))
11530               code->op = EXEC_ASSIGN;
11531             break;
11532           }
11533
11534         case EXEC_ARITHMETIC_IF:
11535           {
11536             gfc_expr *e = code->expr1;
11537
11538             gfc_resolve_expr (e);
11539             if (e->expr_type == EXPR_NULL)
11540               gfc_error ("Invalid NULL at %L", &e->where);
11541
11542             if (t && (e->rank > 0
11543                       || !(e->ts.type == BT_REAL || e->ts.type == BT_INTEGER)))
11544               gfc_error ("Arithmetic IF statement at %L requires a scalar "
11545                          "REAL or INTEGER expression", &e->where);
11546
11547             resolve_branch (code->label1, code);
11548             resolve_branch (code->label2, code);
11549             resolve_branch (code->label3, code);
11550           }
11551           break;
11552
11553         case EXEC_IF:
11554           if (t && code->expr1 != NULL
11555               && (code->expr1->ts.type != BT_LOGICAL
11556                   || code->expr1->rank != 0))
11557             gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
11558                        &code->expr1->where);
11559           break;
11560
11561         case EXEC_CALL:
11562         call:
11563           resolve_call (code);
11564           break;
11565
11566         case EXEC_COMPCALL:
11567         compcall:
11568           resolve_typebound_subroutine (code);
11569           break;
11570
11571         case EXEC_CALL_PPC:
11572           resolve_ppc_call (code);
11573           break;
11574
11575         case EXEC_SELECT:
11576           /* Select is complicated. Also, a SELECT construct could be
11577              a transformed computed GOTO.  */
11578           resolve_select (code, false);
11579           break;
11580
11581         case EXEC_SELECT_TYPE:
11582           resolve_select_type (code, ns);
11583           break;
11584
11585         case EXEC_BLOCK:
11586           resolve_block_construct (code);
11587           break;
11588
11589         case EXEC_DO:
11590           if (code->ext.iterator != NULL)
11591             {
11592               gfc_iterator *iter = code->ext.iterator;
11593               if (gfc_resolve_iterator (iter, true, false))
11594                 gfc_resolve_do_iterator (code, iter->var->symtree->n.sym,
11595                                          true);
11596             }
11597           break;
11598
11599         case EXEC_DO_WHILE:
11600           if (code->expr1 == NULL)
11601             gfc_internal_error ("gfc_resolve_code(): No expression on "
11602                                 "DO WHILE");
11603           if (t
11604               && (code->expr1->rank != 0
11605                   || code->expr1->ts.type != BT_LOGICAL))
11606             gfc_error ("Exit condition of DO WHILE loop at %L must be "
11607                        "a scalar LOGICAL expression", &code->expr1->where);
11608           break;
11609
11610         case EXEC_ALLOCATE:
11611           if (t)
11612             resolve_allocate_deallocate (code, "ALLOCATE");
11613
11614           break;
11615
11616         case EXEC_DEALLOCATE:
11617           if (t)
11618             resolve_allocate_deallocate (code, "DEALLOCATE");
11619
11620           break;
11621
11622         case EXEC_OPEN:
11623           if (!gfc_resolve_open (code->ext.open))
11624             break;
11625
11626           resolve_branch (code->ext.open->err, code);
11627           break;
11628
11629         case EXEC_CLOSE:
11630           if (!gfc_resolve_close (code->ext.close))
11631             break;
11632
11633           resolve_branch (code->ext.close->err, code);
11634           break;
11635
11636         case EXEC_BACKSPACE:
11637         case EXEC_ENDFILE:
11638         case EXEC_REWIND:
11639         case EXEC_FLUSH:
11640           if (!gfc_resolve_filepos (code->ext.filepos, &code->loc))
11641             break;
11642
11643           resolve_branch (code->ext.filepos->err, code);
11644           break;
11645
11646         case EXEC_INQUIRE:
11647           if (!gfc_resolve_inquire (code->ext.inquire))
11648               break;
11649
11650           resolve_branch (code->ext.inquire->err, code);
11651           break;
11652
11653         case EXEC_IOLENGTH:
11654           gcc_assert (code->ext.inquire != NULL);
11655           if (!gfc_resolve_inquire (code->ext.inquire))
11656             break;
11657
11658           resolve_branch (code->ext.inquire->err, code);
11659           break;
11660
11661         case EXEC_WAIT:
11662           if (!gfc_resolve_wait (code->ext.wait))
11663             break;
11664
11665           resolve_branch (code->ext.wait->err, code);
11666           resolve_branch (code->ext.wait->end, code);
11667           resolve_branch (code->ext.wait->eor, code);
11668           break;
11669
11670         case EXEC_READ:
11671         case EXEC_WRITE:
11672           if (!gfc_resolve_dt (code->ext.dt, &code->loc))
11673             break;
11674
11675           resolve_branch (code->ext.dt->err, code);
11676           resolve_branch (code->ext.dt->end, code);
11677           resolve_branch (code->ext.dt->eor, code);
11678           break;
11679
11680         case EXEC_TRANSFER:
11681           resolve_transfer (code);
11682           break;
11683
11684         case EXEC_DO_CONCURRENT:
11685         case EXEC_FORALL:
11686           resolve_forall_iterators (code->ext.forall_iterator);
11687
11688           if (code->expr1 != NULL
11689               && (code->expr1->ts.type != BT_LOGICAL || code->expr1->rank))
11690             gfc_error ("FORALL mask clause at %L requires a scalar LOGICAL "
11691                        "expression", &code->expr1->where);
11692           break;
11693
11694         case EXEC_OACC_PARALLEL_LOOP:
11695         case EXEC_OACC_PARALLEL:
11696         case EXEC_OACC_KERNELS_LOOP:
11697         case EXEC_OACC_KERNELS:
11698         case EXEC_OACC_DATA:
11699         case EXEC_OACC_HOST_DATA:
11700         case EXEC_OACC_LOOP:
11701         case EXEC_OACC_UPDATE:
11702         case EXEC_OACC_WAIT:
11703         case EXEC_OACC_CACHE:
11704         case EXEC_OACC_ENTER_DATA:
11705         case EXEC_OACC_EXIT_DATA:
11706         case EXEC_OACC_ATOMIC:
11707         case EXEC_OACC_DECLARE:
11708           gfc_resolve_oacc_directive (code, ns);
11709           break;
11710
11711         case EXEC_OMP_ATOMIC:
11712         case EXEC_OMP_BARRIER:
11713         case EXEC_OMP_CANCEL:
11714         case EXEC_OMP_CANCELLATION_POINT:
11715         case EXEC_OMP_CRITICAL:
11716         case EXEC_OMP_FLUSH:
11717         case EXEC_OMP_DISTRIBUTE:
11718         case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
11719         case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
11720         case EXEC_OMP_DISTRIBUTE_SIMD:
11721         case EXEC_OMP_DO:
11722         case EXEC_OMP_DO_SIMD:
11723         case EXEC_OMP_MASTER:
11724         case EXEC_OMP_ORDERED:
11725         case EXEC_OMP_SECTIONS:
11726         case EXEC_OMP_SIMD:
11727         case EXEC_OMP_SINGLE:
11728         case EXEC_OMP_TARGET:
11729         case EXEC_OMP_TARGET_DATA:
11730         case EXEC_OMP_TARGET_ENTER_DATA:
11731         case EXEC_OMP_TARGET_EXIT_DATA:
11732         case EXEC_OMP_TARGET_PARALLEL:
11733         case EXEC_OMP_TARGET_PARALLEL_DO:
11734         case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
11735         case EXEC_OMP_TARGET_SIMD:
11736         case EXEC_OMP_TARGET_TEAMS:
11737         case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
11738         case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
11739         case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
11740         case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
11741         case EXEC_OMP_TARGET_UPDATE:
11742         case EXEC_OMP_TASK:
11743         case EXEC_OMP_TASKGROUP:
11744         case EXEC_OMP_TASKLOOP:
11745         case EXEC_OMP_TASKLOOP_SIMD:
11746         case EXEC_OMP_TASKWAIT:
11747         case EXEC_OMP_TASKYIELD:
11748         case EXEC_OMP_TEAMS:
11749         case EXEC_OMP_TEAMS_DISTRIBUTE:
11750         case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
11751         case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
11752         case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
11753         case EXEC_OMP_WORKSHARE:
11754           gfc_resolve_omp_directive (code, ns);
11755           break;
11756
11757         case EXEC_OMP_PARALLEL:
11758         case EXEC_OMP_PARALLEL_DO:
11759         case EXEC_OMP_PARALLEL_DO_SIMD:
11760         case EXEC_OMP_PARALLEL_SECTIONS:
11761         case EXEC_OMP_PARALLEL_WORKSHARE:
11762           omp_workshare_save = omp_workshare_flag;
11763           omp_workshare_flag = 0;
11764           gfc_resolve_omp_directive (code, ns);
11765           omp_workshare_flag = omp_workshare_save;
11766           break;
11767
11768         default:
11769           gfc_internal_error ("gfc_resolve_code(): Bad statement code");
11770         }
11771     }
11772
11773   cs_base = frame.prev;
11774 }
11775
11776
11777 /* Resolve initial values and make sure they are compatible with
11778    the variable.  */
11779
11780 static void
11781 resolve_values (gfc_symbol *sym)
11782 {
11783   bool t;
11784
11785   if (sym->value == NULL)
11786     return;
11787
11788   if (sym->value->expr_type == EXPR_STRUCTURE)
11789     t= resolve_structure_cons (sym->value, 1);
11790   else
11791     t = gfc_resolve_expr (sym->value);
11792
11793   if (!t)
11794     return;
11795
11796   gfc_check_assign_symbol (sym, NULL, sym->value);
11797 }
11798
11799
11800 /* Verify any BIND(C) derived types in the namespace so we can report errors
11801    for them once, rather than for each variable declared of that type.  */
11802
11803 static void
11804 resolve_bind_c_derived_types (gfc_symbol *derived_sym)
11805 {
11806   if (derived_sym != NULL && derived_sym->attr.flavor == FL_DERIVED
11807       && derived_sym->attr.is_bind_c == 1)
11808     verify_bind_c_derived_type (derived_sym);
11809
11810   return;
11811 }
11812
11813
11814 /* Check the interfaces of DTIO procedures associated with derived
11815    type 'sym'.  These procedures can either have typebound bindings or
11816    can appear in DTIO generic interfaces.  */
11817
11818 static void
11819 gfc_verify_DTIO_procedures (gfc_symbol *sym)
11820 {
11821   if (!sym || sym->attr.flavor != FL_DERIVED)
11822     return;
11823
11824   gfc_check_dtio_interfaces (sym);
11825
11826   return;
11827 }
11828
11829 /* Verify that any binding labels used in a given namespace do not collide
11830    with the names or binding labels of any global symbols.  Multiple INTERFACE
11831    for the same procedure are permitted.  */
11832
11833 static void
11834 gfc_verify_binding_labels (gfc_symbol *sym)
11835 {
11836   gfc_gsymbol *gsym;
11837   const char *module;
11838
11839   if (!sym || !sym->attr.is_bind_c || sym->attr.is_iso_c
11840       || sym->attr.flavor == FL_DERIVED || !sym->binding_label)
11841     return;
11842
11843   gsym = gfc_find_case_gsymbol (gfc_gsym_root, sym->binding_label);
11844
11845   if (sym->module)
11846     module = sym->module;
11847   else if (sym->ns && sym->ns->proc_name
11848            && sym->ns->proc_name->attr.flavor == FL_MODULE)
11849     module = sym->ns->proc_name->name;
11850   else if (sym->ns && sym->ns->parent
11851            && sym->ns && sym->ns->parent->proc_name
11852            && sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
11853     module = sym->ns->parent->proc_name->name;
11854   else
11855     module = NULL;
11856
11857   if (!gsym
11858       || (!gsym->defined
11859           && (gsym->type == GSYM_FUNCTION || gsym->type == GSYM_SUBROUTINE)))
11860     {
11861       if (!gsym)
11862         gsym = gfc_get_gsymbol (sym->binding_label, true);
11863       gsym->where = sym->declared_at;
11864       gsym->sym_name = sym->name;
11865       gsym->binding_label = sym->binding_label;
11866       gsym->ns = sym->ns;
11867       gsym->mod_name = module;
11868       if (sym->attr.function)
11869         gsym->type = GSYM_FUNCTION;
11870       else if (sym->attr.subroutine)
11871         gsym->type = GSYM_SUBROUTINE;
11872       /* Mark as variable/procedure as defined, unless its an INTERFACE.  */
11873       gsym->defined = sym->attr.if_source != IFSRC_IFBODY;
11874       return;
11875     }
11876
11877   if (sym->attr.flavor == FL_VARIABLE && gsym->type != GSYM_UNKNOWN)
11878     {
11879       gfc_error ("Variable %qs with binding label %qs at %L uses the same global "
11880                  "identifier as entity at %L", sym->name,
11881                  sym->binding_label, &sym->declared_at, &gsym->where);
11882       /* Clear the binding label to prevent checking multiple times.  */
11883       sym->binding_label = NULL;
11884       return;
11885     }
11886
11887   if (sym->attr.flavor == FL_VARIABLE && module
11888       && (strcmp (module, gsym->mod_name) != 0
11889           || strcmp (sym->name, gsym->sym_name) != 0))
11890     {
11891       /* This can only happen if the variable is defined in a module - if it
11892          isn't the same module, reject it.  */
11893       gfc_error ("Variable %qs from module %qs with binding label %qs at %L "
11894                  "uses the same global identifier as entity at %L from module %qs",
11895                  sym->name, module, sym->binding_label,
11896                  &sym->declared_at, &gsym->where, gsym->mod_name);
11897       sym->binding_label = NULL;
11898       return;
11899     }
11900
11901   if ((sym->attr.function || sym->attr.subroutine)
11902       && ((gsym->type != GSYM_SUBROUTINE && gsym->type != GSYM_FUNCTION)
11903            || (gsym->defined && sym->attr.if_source != IFSRC_IFBODY))
11904       && (sym != gsym->ns->proc_name && sym->attr.entry == 0)
11905       && (module != gsym->mod_name
11906           || strcmp (gsym->sym_name, sym->name) != 0
11907           || (module && strcmp (module, gsym->mod_name) != 0)))
11908     {
11909       /* Print an error if the procedure is defined multiple times; we have to
11910          exclude references to the same procedure via module association or
11911          multiple checks for the same procedure.  */
11912       gfc_error ("Procedure %qs with binding label %qs at %L uses the same "
11913                  "global identifier as entity at %L", sym->name,
11914                  sym->binding_label, &sym->declared_at, &gsym->where);
11915       sym->binding_label = NULL;
11916     }
11917 }
11918
11919
11920 /* Resolve an index expression.  */
11921
11922 static bool
11923 resolve_index_expr (gfc_expr *e)
11924 {
11925   if (!gfc_resolve_expr (e))
11926     return false;
11927
11928   if (!gfc_simplify_expr (e, 0))
11929     return false;
11930
11931   if (!gfc_specification_expr (e))
11932     return false;
11933
11934   return true;
11935 }
11936
11937
11938 /* Resolve a charlen structure.  */
11939
11940 static bool
11941 resolve_charlen (gfc_charlen *cl)
11942 {
11943   int k;
11944   bool saved_specification_expr;
11945
11946   if (cl->resolved)
11947     return true;
11948
11949   cl->resolved = 1;
11950   saved_specification_expr = specification_expr;
11951   specification_expr = true;
11952
11953   if (cl->length_from_typespec)
11954     {
11955       if (!gfc_resolve_expr (cl->length))
11956         {
11957           specification_expr = saved_specification_expr;
11958           return false;
11959         }
11960
11961       if (!gfc_simplify_expr (cl->length, 0))
11962         {
11963           specification_expr = saved_specification_expr;
11964           return false;
11965         }
11966
11967       /* cl->length has been resolved.  It should have an integer type.  */
11968       if (cl->length->ts.type != BT_INTEGER)
11969         {
11970           gfc_error ("Scalar INTEGER expression expected at %L",
11971                      &cl->length->where);
11972           return false;
11973         }
11974     }
11975   else
11976     {
11977       if (!resolve_index_expr (cl->length))
11978         {
11979           specification_expr = saved_specification_expr;
11980           return false;
11981         }
11982     }
11983
11984   /* F2008, 4.4.3.2:  If the character length parameter value evaluates to
11985      a negative value, the length of character entities declared is zero.  */
11986   if (cl->length && cl->length->expr_type == EXPR_CONSTANT
11987       && mpz_sgn (cl->length->value.integer) < 0)
11988     gfc_replace_expr (cl->length,
11989                       gfc_get_int_expr (gfc_charlen_int_kind, NULL, 0));
11990
11991   /* Check that the character length is not too large.  */
11992   k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
11993   if (cl->length && cl->length->expr_type == EXPR_CONSTANT
11994       && cl->length->ts.type == BT_INTEGER
11995       && mpz_cmp (cl->length->value.integer, gfc_integer_kinds[k].huge) > 0)
11996     {
11997       gfc_error ("String length at %L is too large", &cl->length->where);
11998       specification_expr = saved_specification_expr;
11999       return false;
12000     }
12001
12002   specification_expr = saved_specification_expr;
12003   return true;
12004 }
12005
12006
12007 /* Test for non-constant shape arrays.  */
12008
12009 static bool
12010 is_non_constant_shape_array (gfc_symbol *sym)
12011 {
12012   gfc_expr *e;
12013   int i;
12014   bool not_constant;
12015
12016   not_constant = false;
12017   if (sym->as != NULL)
12018     {
12019       /* Unfortunately, !gfc_is_compile_time_shape hits a legal case that
12020          has not been simplified; parameter array references.  Do the
12021          simplification now.  */
12022       for (i = 0; i < sym->as->rank + sym->as->corank; i++)
12023         {
12024           e = sym->as->lower[i];
12025           if (e && (!resolve_index_expr(e)
12026                     || !gfc_is_constant_expr (e)))
12027             not_constant = true;
12028           e = sym->as->upper[i];
12029           if (e && (!resolve_index_expr(e)
12030                     || !gfc_is_constant_expr (e)))
12031             not_constant = true;
12032         }
12033     }
12034   return not_constant;
12035 }
12036
12037 /* Given a symbol and an initialization expression, add code to initialize
12038    the symbol to the function entry.  */
12039 static void
12040 build_init_assign (gfc_symbol *sym, gfc_expr *init)
12041 {
12042   gfc_expr *lval;
12043   gfc_code *init_st;
12044   gfc_namespace *ns = sym->ns;
12045
12046   /* Search for the function namespace if this is a contained
12047      function without an explicit result.  */
12048   if (sym->attr.function && sym == sym->result
12049       && sym->name != sym->ns->proc_name->name)
12050     {
12051       ns = ns->contained;
12052       for (;ns; ns = ns->sibling)
12053         if (strcmp (ns->proc_name->name, sym->name) == 0)
12054           break;
12055     }
12056
12057   if (ns == NULL)
12058     {
12059       gfc_free_expr (init);
12060       return;
12061     }
12062
12063   /* Build an l-value expression for the result.  */
12064   lval = gfc_lval_expr_from_sym (sym);
12065
12066   /* Add the code at scope entry.  */
12067   init_st = gfc_get_code (EXEC_INIT_ASSIGN);
12068   init_st->next = ns->code;
12069   ns->code = init_st;
12070
12071   /* Assign the default initializer to the l-value.  */
12072   init_st->loc = sym->declared_at;
12073   init_st->expr1 = lval;
12074   init_st->expr2 = init;
12075 }
12076
12077
12078 /* Whether or not we can generate a default initializer for a symbol.  */
12079
12080 static bool
12081 can_generate_init (gfc_symbol *sym)
12082 {
12083   symbol_attribute *a;
12084   if (!sym)
12085     return false;
12086   a = &sym->attr;
12087
12088   /* These symbols should never have a default initialization.  */
12089   return !(
12090        a->allocatable
12091     || a->external
12092     || a->pointer
12093     || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
12094         && (CLASS_DATA (sym)->attr.class_pointer
12095             || CLASS_DATA (sym)->attr.proc_pointer))
12096     || a->in_equivalence
12097     || a->in_common
12098     || a->data
12099     || sym->module
12100     || a->cray_pointee
12101     || a->cray_pointer
12102     || sym->assoc
12103     || (!a->referenced && !a->result)
12104     || (a->dummy && a->intent != INTENT_OUT)
12105     || (a->function && sym != sym->result)
12106   );
12107 }
12108
12109
12110 /* Assign the default initializer to a derived type variable or result.  */
12111
12112 static void
12113 apply_default_init (gfc_symbol *sym)
12114 {
12115   gfc_expr *init = NULL;
12116
12117   if (sym->attr.flavor != FL_VARIABLE && !sym->attr.function)
12118     return;
12119
12120   if (sym->ts.type == BT_DERIVED && sym->ts.u.derived)
12121     init = gfc_generate_initializer (&sym->ts, can_generate_init (sym));
12122
12123   if (init == NULL && sym->ts.type != BT_CLASS)
12124     return;
12125
12126   build_init_assign (sym, init);
12127   sym->attr.referenced = 1;
12128 }
12129
12130
12131 /* Build an initializer for a local. Returns null if the symbol should not have
12132    a default initialization.  */
12133
12134 static gfc_expr *
12135 build_default_init_expr (gfc_symbol *sym)
12136 {
12137   /* These symbols should never have a default initialization.  */
12138   if (sym->attr.allocatable
12139       || sym->attr.external
12140       || sym->attr.dummy
12141       || sym->attr.pointer
12142       || sym->attr.in_equivalence
12143       || sym->attr.in_common
12144       || sym->attr.data
12145       || sym->module
12146       || sym->attr.cray_pointee
12147       || sym->attr.cray_pointer
12148       || sym->assoc)
12149     return NULL;
12150
12151   /* Get the appropriate init expression.  */
12152   return gfc_build_default_init_expr (&sym->ts, &sym->declared_at);
12153 }
12154
12155 /* Add an initialization expression to a local variable.  */
12156 static void
12157 apply_default_init_local (gfc_symbol *sym)
12158 {
12159   gfc_expr *init = NULL;
12160
12161   /* The symbol should be a variable or a function return value.  */
12162   if ((sym->attr.flavor != FL_VARIABLE && !sym->attr.function)
12163       || (sym->attr.function && sym->result != sym))
12164     return;
12165
12166   /* Try to build the initializer expression.  If we can't initialize
12167      this symbol, then init will be NULL.  */
12168   init = build_default_init_expr (sym);
12169   if (init == NULL)
12170     return;
12171
12172   /* For saved variables, we don't want to add an initializer at function
12173      entry, so we just add a static initializer. Note that automatic variables
12174      are stack allocated even with -fno-automatic; we have also to exclude
12175      result variable, which are also nonstatic.  */
12176   if (!sym->attr.automatic
12177       && (sym->attr.save || sym->ns->save_all
12178           || (flag_max_stack_var_size == 0 && !sym->attr.result
12179               && (sym->ns->proc_name && !sym->ns->proc_name->attr.recursive)
12180               && (!sym->attr.dimension || !is_non_constant_shape_array (sym)))))
12181     {
12182       /* Don't clobber an existing initializer!  */
12183       gcc_assert (sym->value == NULL);
12184       sym->value = init;
12185       return;
12186     }
12187
12188   build_init_assign (sym, init);
12189 }
12190
12191
12192 /* Resolution of common features of flavors variable and procedure.  */
12193
12194 static bool
12195 resolve_fl_var_and_proc (gfc_symbol *sym, int mp_flag)
12196 {
12197   gfc_array_spec *as;
12198
12199   if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
12200     as = CLASS_DATA (sym)->as;
12201   else
12202     as = sym->as;
12203
12204   /* Constraints on deferred shape variable.  */
12205   if (as == NULL || as->type != AS_DEFERRED)
12206     {
12207       bool pointer, allocatable, dimension;
12208
12209       if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
12210         {
12211           pointer = CLASS_DATA (sym)->attr.class_pointer;
12212           allocatable = CLASS_DATA (sym)->attr.allocatable;
12213           dimension = CLASS_DATA (sym)->attr.dimension;
12214         }
12215       else
12216         {
12217           pointer = sym->attr.pointer && !sym->attr.select_type_temporary;
12218           allocatable = sym->attr.allocatable;
12219           dimension = sym->attr.dimension;
12220         }
12221
12222       if (allocatable)
12223         {
12224           if (dimension && as->type != AS_ASSUMED_RANK)
12225             {
12226               gfc_error ("Allocatable array %qs at %L must have a deferred "
12227                          "shape or assumed rank", sym->name, &sym->declared_at);
12228               return false;
12229             }
12230           else if (!gfc_notify_std (GFC_STD_F2003, "Scalar object "
12231                                     "%qs at %L may not be ALLOCATABLE",
12232                                     sym->name, &sym->declared_at))
12233             return false;
12234         }
12235
12236       if (pointer && dimension && as->type != AS_ASSUMED_RANK)
12237         {
12238           gfc_error ("Array pointer %qs at %L must have a deferred shape or "
12239                      "assumed rank", sym->name, &sym->declared_at);
12240           return false;
12241         }
12242     }
12243   else
12244     {
12245       if (!mp_flag && !sym->attr.allocatable && !sym->attr.pointer
12246           && sym->ts.type != BT_CLASS && !sym->assoc)
12247         {
12248           gfc_error ("Array %qs at %L cannot have a deferred shape",
12249                      sym->name, &sym->declared_at);
12250           return false;
12251          }
12252     }
12253
12254   /* Constraints on polymorphic variables.  */
12255   if (sym->ts.type == BT_CLASS && !(sym->result && sym->result != sym))
12256     {
12257       /* F03:C502.  */
12258       if (sym->attr.class_ok
12259           && !sym->attr.select_type_temporary
12260           && !UNLIMITED_POLY (sym)
12261           && !gfc_type_is_extensible (CLASS_DATA (sym)->ts.u.derived))
12262         {
12263           gfc_error ("Type %qs of CLASS variable %qs at %L is not extensible",
12264                      CLASS_DATA (sym)->ts.u.derived->name, sym->name,
12265                      &sym->declared_at);
12266           return false;
12267         }
12268
12269       /* F03:C509.  */
12270       /* Assume that use associated symbols were checked in the module ns.
12271          Class-variables that are associate-names are also something special
12272          and excepted from the test.  */
12273       if (!sym->attr.class_ok && !sym->attr.use_assoc && !sym->assoc)
12274         {
12275           gfc_error ("CLASS variable %qs at %L must be dummy, allocatable "
12276                      "or pointer", sym->name, &sym->declared_at);
12277           return false;
12278         }
12279     }
12280
12281   return true;
12282 }
12283
12284
12285 /* Additional checks for symbols with flavor variable and derived
12286    type.  To be called from resolve_fl_variable.  */
12287
12288 static bool
12289 resolve_fl_variable_derived (gfc_symbol *sym, int no_init_flag)
12290 {
12291   gcc_assert (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS);
12292
12293   /* Check to see if a derived type is blocked from being host
12294      associated by the presence of another class I symbol in the same
12295      namespace.  14.6.1.3 of the standard and the discussion on
12296      comp.lang.fortran.  */
12297   if (sym->ns != sym->ts.u.derived->ns
12298       && !sym->ts.u.derived->attr.use_assoc
12299       && sym->ns->proc_name->attr.if_source != IFSRC_IFBODY)
12300     {
12301       gfc_symbol *s;
12302       gfc_find_symbol (sym->ts.u.derived->name, sym->ns, 0, &s);
12303       if (s && s->attr.generic)
12304         s = gfc_find_dt_in_generic (s);
12305       if (s && !gfc_fl_struct (s->attr.flavor))
12306         {
12307           gfc_error ("The type %qs cannot be host associated at %L "
12308                      "because it is blocked by an incompatible object "
12309                      "of the same name declared at %L",
12310                      sym->ts.u.derived->name, &sym->declared_at,
12311                      &s->declared_at);
12312           return false;
12313         }
12314     }
12315
12316   /* 4th constraint in section 11.3: "If an object of a type for which
12317      component-initialization is specified (R429) appears in the
12318      specification-part of a module and does not have the ALLOCATABLE
12319      or POINTER attribute, the object shall have the SAVE attribute."
12320
12321      The check for initializers is performed with
12322      gfc_has_default_initializer because gfc_default_initializer generates
12323      a hidden default for allocatable components.  */
12324   if (!(sym->value || no_init_flag) && sym->ns->proc_name
12325       && sym->ns->proc_name->attr.flavor == FL_MODULE
12326       && !(sym->ns->save_all && !sym->attr.automatic) && !sym->attr.save
12327       && !sym->attr.pointer && !sym->attr.allocatable
12328       && gfc_has_default_initializer (sym->ts.u.derived)
12329       && !gfc_notify_std (GFC_STD_F2008, "Implied SAVE for module variable "
12330                           "%qs at %L, needed due to the default "
12331                           "initialization", sym->name, &sym->declared_at))
12332     return false;
12333
12334   /* Assign default initializer.  */
12335   if (!(sym->value || sym->attr.pointer || sym->attr.allocatable)
12336       && (!no_init_flag || sym->attr.intent == INTENT_OUT))
12337     sym->value = gfc_generate_initializer (&sym->ts, can_generate_init (sym));
12338
12339   return true;
12340 }
12341
12342
12343 /* F2008, C402 (R401):  A colon shall not be used as a type-param-value
12344    except in the declaration of an entity or component that has the POINTER
12345    or ALLOCATABLE attribute.  */
12346
12347 static bool
12348 deferred_requirements (gfc_symbol *sym)
12349 {
12350   if (sym->ts.deferred
12351       && !(sym->attr.pointer
12352            || sym->attr.allocatable
12353            || sym->attr.associate_var
12354            || sym->attr.omp_udr_artificial_var))
12355     {
12356       gfc_error ("Entity %qs at %L has a deferred type parameter and "
12357                  "requires either the POINTER or ALLOCATABLE attribute",
12358                  sym->name, &sym->declared_at);
12359       return false;
12360     }
12361   return true;
12362 }
12363
12364
12365 /* Resolve symbols with flavor variable.  */
12366
12367 static bool
12368 resolve_fl_variable (gfc_symbol *sym, int mp_flag)
12369 {
12370   const char *auto_save_msg = "Automatic object %qs at %L cannot have the "
12371                               "SAVE attribute";
12372
12373   if (!resolve_fl_var_and_proc (sym, mp_flag))
12374     return false;
12375
12376   /* Set this flag to check that variables are parameters of all entries.
12377      This check is effected by the call to gfc_resolve_expr through
12378      is_non_constant_shape_array.  */
12379   bool saved_specification_expr = specification_expr;
12380   specification_expr = true;
12381
12382   if (sym->ns->proc_name
12383       && (sym->ns->proc_name->attr.flavor == FL_MODULE
12384           || sym->ns->proc_name->attr.is_main_program)
12385       && !sym->attr.use_assoc
12386       && !sym->attr.allocatable
12387       && !sym->attr.pointer
12388       && is_non_constant_shape_array (sym))
12389     {
12390       /* F08:C541. The shape of an array defined in a main program or module
12391        * needs to be constant.  */
12392       gfc_error ("The module or main program array %qs at %L must "
12393                  "have constant shape", sym->name, &sym->declared_at);
12394       specification_expr = saved_specification_expr;
12395       return false;
12396     }
12397
12398   /* Constraints on deferred type parameter.  */
12399   if (!deferred_requirements (sym))
12400     return false;
12401
12402   if (sym->ts.type == BT_CHARACTER && !sym->attr.associate_var)
12403     {
12404       /* Make sure that character string variables with assumed length are
12405          dummy arguments.  */
12406       gfc_expr *e = NULL;
12407
12408       if (sym->ts.u.cl)
12409         e = sym->ts.u.cl->length;
12410       else
12411         return false;
12412
12413       if (e == NULL && !sym->attr.dummy && !sym->attr.result
12414           && !sym->ts.deferred && !sym->attr.select_type_temporary
12415           && !sym->attr.omp_udr_artificial_var)
12416         {
12417           gfc_error ("Entity with assumed character length at %L must be a "
12418                      "dummy argument or a PARAMETER", &sym->declared_at);
12419           specification_expr = saved_specification_expr;
12420           return false;
12421         }
12422
12423       if (e && sym->attr.save == SAVE_EXPLICIT && !gfc_is_constant_expr (e))
12424         {
12425           gfc_error (auto_save_msg, sym->name, &sym->declared_at);
12426           specification_expr = saved_specification_expr;
12427           return false;
12428         }
12429
12430       if (!gfc_is_constant_expr (e)
12431           && !(e->expr_type == EXPR_VARIABLE
12432                && e->symtree->n.sym->attr.flavor == FL_PARAMETER))
12433         {
12434           if (!sym->attr.use_assoc && sym->ns->proc_name
12435               && (sym->ns->proc_name->attr.flavor == FL_MODULE
12436                   || sym->ns->proc_name->attr.is_main_program))
12437             {
12438               gfc_error ("%qs at %L must have constant character length "
12439                         "in this context", sym->name, &sym->declared_at);
12440               specification_expr = saved_specification_expr;
12441               return false;
12442             }
12443           if (sym->attr.in_common)
12444             {
12445               gfc_error ("COMMON variable %qs at %L must have constant "
12446                          "character length", sym->name, &sym->declared_at);
12447               specification_expr = saved_specification_expr;
12448               return false;
12449             }
12450         }
12451     }
12452
12453   if (sym->value == NULL && sym->attr.referenced)
12454     apply_default_init_local (sym); /* Try to apply a default initialization.  */
12455
12456   /* Determine if the symbol may not have an initializer.  */
12457   int no_init_flag = 0, automatic_flag = 0;
12458   if (sym->attr.allocatable || sym->attr.external || sym->attr.dummy
12459       || sym->attr.intrinsic || sym->attr.result)
12460     no_init_flag = 1;
12461   else if ((sym->attr.dimension || sym->attr.codimension) && !sym->attr.pointer
12462            && is_non_constant_shape_array (sym))
12463     {
12464       no_init_flag = automatic_flag = 1;
12465
12466       /* Also, they must not have the SAVE attribute.
12467          SAVE_IMPLICIT is checked below.  */
12468       if (sym->as && sym->attr.codimension)
12469         {
12470           int corank = sym->as->corank;
12471           sym->as->corank = 0;
12472           no_init_flag = automatic_flag = is_non_constant_shape_array (sym);
12473           sym->as->corank = corank;
12474         }
12475       if (automatic_flag && sym->attr.save == SAVE_EXPLICIT)
12476         {
12477           gfc_error (auto_save_msg, sym->name, &sym->declared_at);
12478           specification_expr = saved_specification_expr;
12479           return false;
12480         }
12481     }
12482
12483   /* Ensure that any initializer is simplified.  */
12484   if (sym->value)
12485     gfc_simplify_expr (sym->value, 1);
12486
12487   /* Reject illegal initializers.  */
12488   if (!sym->mark && sym->value)
12489     {
12490       if (sym->attr.allocatable || (sym->ts.type == BT_CLASS
12491                                     && CLASS_DATA (sym)->attr.allocatable))
12492         gfc_error ("Allocatable %qs at %L cannot have an initializer",
12493                    sym->name, &sym->declared_at);
12494       else if (sym->attr.external)
12495         gfc_error ("External %qs at %L cannot have an initializer",
12496                    sym->name, &sym->declared_at);
12497       else if (sym->attr.dummy
12498         && !(sym->ts.type == BT_DERIVED && sym->attr.intent == INTENT_OUT))
12499         gfc_error ("Dummy %qs at %L cannot have an initializer",
12500                    sym->name, &sym->declared_at);
12501       else if (sym->attr.intrinsic)
12502         gfc_error ("Intrinsic %qs at %L cannot have an initializer",
12503                    sym->name, &sym->declared_at);
12504       else if (sym->attr.result)
12505         gfc_error ("Function result %qs at %L cannot have an initializer",
12506                    sym->name, &sym->declared_at);
12507       else if (automatic_flag)
12508         gfc_error ("Automatic array %qs at %L cannot have an initializer",
12509                    sym->name, &sym->declared_at);
12510       else
12511         goto no_init_error;
12512       specification_expr = saved_specification_expr;
12513       return false;
12514     }
12515
12516 no_init_error:
12517   if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
12518     {
12519       bool res = resolve_fl_variable_derived (sym, no_init_flag);
12520       specification_expr = saved_specification_expr;
12521       return res;
12522     }
12523
12524   specification_expr = saved_specification_expr;
12525   return true;
12526 }
12527
12528
12529 /* Compare the dummy characteristics of a module procedure interface
12530    declaration with the corresponding declaration in a submodule.  */
12531 static gfc_formal_arglist *new_formal;
12532 static char errmsg[200];
12533
12534 static void
12535 compare_fsyms (gfc_symbol *sym)
12536 {
12537   gfc_symbol *fsym;
12538
12539   if (sym == NULL || new_formal == NULL)
12540     return;
12541
12542   fsym = new_formal->sym;
12543
12544   if (sym == fsym)
12545     return;
12546
12547   if (strcmp (sym->name, fsym->name) == 0)
12548     {
12549       if (!gfc_check_dummy_characteristics (fsym, sym, true, errmsg, 200))
12550         gfc_error ("%s at %L", errmsg, &fsym->declared_at);
12551     }
12552 }
12553
12554
12555 /* Resolve a procedure.  */
12556
12557 static bool
12558 resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
12559 {
12560   gfc_formal_arglist *arg;
12561
12562   if (sym->attr.function
12563       && !resolve_fl_var_and_proc (sym, mp_flag))
12564     return false;
12565
12566   if (sym->ts.type == BT_CHARACTER)
12567     {
12568       gfc_charlen *cl = sym->ts.u.cl;
12569
12570       if (cl && cl->length && gfc_is_constant_expr (cl->length)
12571              && !resolve_charlen (cl))
12572         return false;
12573
12574       if ((!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
12575           && sym->attr.proc == PROC_ST_FUNCTION)
12576         {
12577           gfc_error ("Character-valued statement function %qs at %L must "
12578                      "have constant length", sym->name, &sym->declared_at);
12579           return false;
12580         }
12581     }
12582
12583   /* Ensure that derived type for are not of a private type.  Internal
12584      module procedures are excluded by 2.2.3.3 - i.e., they are not
12585      externally accessible and can access all the objects accessible in
12586      the host.  */
12587   if (!(sym->ns->parent && sym->ns->parent->proc_name
12588         && sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
12589       && gfc_check_symbol_access (sym))
12590     {
12591       gfc_interface *iface;
12592
12593       for (arg = gfc_sym_get_dummy_args (sym); arg; arg = arg->next)
12594         {
12595           if (arg->sym
12596               && arg->sym->ts.type == BT_DERIVED
12597               && !arg->sym->ts.u.derived->attr.use_assoc
12598               && !gfc_check_symbol_access (arg->sym->ts.u.derived)
12599               && !gfc_notify_std (GFC_STD_F2003, "%qs is of a PRIVATE type "
12600                                   "and cannot be a dummy argument"
12601                                   " of %qs, which is PUBLIC at %L",
12602                                   arg->sym->name, sym->name,
12603                                   &sym->declared_at))
12604             {
12605               /* Stop this message from recurring.  */
12606               arg->sym->ts.u.derived->attr.access = ACCESS_PUBLIC;
12607               return false;
12608             }
12609         }
12610
12611       /* PUBLIC interfaces may expose PRIVATE procedures that take types
12612          PRIVATE to the containing module.  */
12613       for (iface = sym->generic; iface; iface = iface->next)
12614         {
12615           for (arg = gfc_sym_get_dummy_args (iface->sym); arg; arg = arg->next)
12616             {
12617               if (arg->sym
12618                   && arg->sym->ts.type == BT_DERIVED
12619                   && !arg->sym->ts.u.derived->attr.use_assoc
12620                   && !gfc_check_symbol_access (arg->sym->ts.u.derived)
12621                   && !gfc_notify_std (GFC_STD_F2003, "Procedure %qs in "
12622                                       "PUBLIC interface %qs at %L "
12623                                       "takes dummy arguments of %qs which "
12624                                       "is PRIVATE", iface->sym->name,
12625                                       sym->name, &iface->sym->declared_at,
12626                                       gfc_typename(&arg->sym->ts)))
12627                 {
12628                   /* Stop this message from recurring.  */
12629                   arg->sym->ts.u.derived->attr.access = ACCESS_PUBLIC;
12630                   return false;
12631                 }
12632              }
12633         }
12634     }
12635
12636   if (sym->attr.function && sym->value && sym->attr.proc != PROC_ST_FUNCTION
12637       && !sym->attr.proc_pointer)
12638     {
12639       gfc_error ("Function %qs at %L cannot have an initializer",
12640                  sym->name, &sym->declared_at);
12641
12642       /* Make sure no second error is issued for this.  */
12643       sym->value->error = 1;
12644       return false;
12645     }
12646
12647   /* An external symbol may not have an initializer because it is taken to be
12648      a procedure. Exception: Procedure Pointers.  */
12649   if (sym->attr.external && sym->value && !sym->attr.proc_pointer)
12650     {
12651       gfc_error ("External object %qs at %L may not have an initializer",
12652                  sym->name, &sym->declared_at);
12653       return false;
12654     }
12655
12656   /* An elemental function is required to return a scalar 12.7.1  */
12657   if (sym->attr.elemental && sym->attr.function
12658       && (sym->as || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as)))
12659     {
12660       gfc_error ("ELEMENTAL function %qs at %L must have a scalar "
12661                  "result", sym->name, &sym->declared_at);
12662       /* Reset so that the error only occurs once.  */
12663       sym->attr.elemental = 0;
12664       return false;
12665     }
12666
12667   if (sym->attr.proc == PROC_ST_FUNCTION
12668       && (sym->attr.allocatable || sym->attr.pointer))
12669     {
12670       gfc_error ("Statement function %qs at %L may not have pointer or "
12671                  "allocatable attribute", sym->name, &sym->declared_at);
12672       return false;
12673     }
12674
12675   /* 5.1.1.5 of the Standard: A function name declared with an asterisk
12676      char-len-param shall not be array-valued, pointer-valued, recursive
12677      or pure.  ....snip... A character value of * may only be used in the
12678      following ways: (i) Dummy arg of procedure - dummy associates with
12679      actual length; (ii) To declare a named constant; or (iii) External
12680      function - but length must be declared in calling scoping unit.  */
12681   if (sym->attr.function
12682       && sym->ts.type == BT_CHARACTER && !sym->ts.deferred
12683       && sym->ts.u.cl && sym->ts.u.cl->length == NULL)
12684     {
12685       if ((sym->as && sym->as->rank) || (sym->attr.pointer)
12686           || (sym->attr.recursive) || (sym->attr.pure))
12687         {
12688           if (sym->as && sym->as->rank)
12689             gfc_error ("CHARACTER(*) function %qs at %L cannot be "
12690                        "array-valued", sym->name, &sym->declared_at);
12691
12692           if (sym->attr.pointer)
12693             gfc_error ("CHARACTER(*) function %qs at %L cannot be "
12694                        "pointer-valued", sym->name, &sym->declared_at);
12695
12696           if (sym->attr.pure)
12697             gfc_error ("CHARACTER(*) function %qs at %L cannot be "
12698                        "pure", sym->name, &sym->declared_at);
12699
12700           if (sym->attr.recursive)
12701             gfc_error ("CHARACTER(*) function %qs at %L cannot be "
12702                        "recursive", sym->name, &sym->declared_at);
12703
12704           return false;
12705         }
12706
12707       /* Appendix B.2 of the standard.  Contained functions give an
12708          error anyway.  Deferred character length is an F2003 feature.
12709          Don't warn on intrinsic conversion functions, which start
12710          with two underscores.  */
12711       if (!sym->attr.contained && !sym->ts.deferred
12712           && (sym->name[0] != '_' || sym->name[1] != '_'))
12713         gfc_notify_std (GFC_STD_F95_OBS,
12714                         "CHARACTER(*) function %qs at %L",
12715                         sym->name, &sym->declared_at);
12716     }
12717
12718   /* F2008, C1218.  */
12719   if (sym->attr.elemental)
12720     {
12721       if (sym->attr.proc_pointer)
12722         {
12723           gfc_error ("Procedure pointer %qs at %L shall not be elemental",
12724                      sym->name, &sym->declared_at);
12725           return false;
12726         }
12727       if (sym->attr.dummy)
12728         {
12729           gfc_error ("Dummy procedure %qs at %L shall not be elemental",
12730                      sym->name, &sym->declared_at);
12731           return false;
12732         }
12733     }
12734
12735   /* F2018, C15100: "The result of an elemental function shall be scalar,
12736      and shall not have the POINTER or ALLOCATABLE attribute."  The scalar
12737      pointer is tested and caught elsewhere.  */
12738   if (sym->attr.elemental && sym->result
12739       && (sym->result->attr.allocatable || sym->result->attr.pointer))
12740     {
12741       gfc_error ("Function result variable %qs at %L of elemental "
12742                  "function %qs shall not have an ALLOCATABLE or POINTER "
12743                  "attribute", sym->result->name,
12744                  &sym->result->declared_at, sym->name);
12745       return false;
12746     }
12747
12748   if (sym->attr.is_bind_c && sym->attr.is_c_interop != 1)
12749     {
12750       gfc_formal_arglist *curr_arg;
12751       int has_non_interop_arg = 0;
12752
12753       if (!verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
12754                               sym->common_block))
12755         {
12756           /* Clear these to prevent looking at them again if there was an
12757              error.  */
12758           sym->attr.is_bind_c = 0;
12759           sym->attr.is_c_interop = 0;
12760           sym->ts.is_c_interop = 0;
12761         }
12762       else
12763         {
12764           /* So far, no errors have been found.  */
12765           sym->attr.is_c_interop = 1;
12766           sym->ts.is_c_interop = 1;
12767         }
12768
12769       curr_arg = gfc_sym_get_dummy_args (sym);
12770       while (curr_arg != NULL)
12771         {
12772           /* Skip implicitly typed dummy args here.  */
12773           if (curr_arg->sym && curr_arg->sym->attr.implicit_type == 0)
12774             if (!gfc_verify_c_interop_param (curr_arg->sym))
12775               /* If something is found to fail, record the fact so we
12776                  can mark the symbol for the procedure as not being
12777                  BIND(C) to try and prevent multiple errors being
12778                  reported.  */
12779               has_non_interop_arg = 1;
12780
12781           curr_arg = curr_arg->next;
12782         }
12783
12784       /* See if any of the arguments were not interoperable and if so, clear
12785          the procedure symbol to prevent duplicate error messages.  */
12786       if (has_non_interop_arg != 0)
12787         {
12788           sym->attr.is_c_interop = 0;
12789           sym->ts.is_c_interop = 0;
12790           sym->attr.is_bind_c = 0;
12791         }
12792     }
12793
12794   if (!sym->attr.proc_pointer)
12795     {
12796       if (sym->attr.save == SAVE_EXPLICIT)
12797         {
12798           gfc_error ("PROCEDURE attribute conflicts with SAVE attribute "
12799                      "in %qs at %L", sym->name, &sym->declared_at);
12800           return false;
12801         }
12802       if (sym->attr.intent)
12803         {
12804           gfc_error ("PROCEDURE attribute conflicts with INTENT attribute "
12805                      "in %qs at %L", sym->name, &sym->declared_at);
12806           return false;
12807         }
12808       if (sym->attr.subroutine && sym->attr.result)
12809         {
12810           gfc_error ("PROCEDURE attribute conflicts with RESULT attribute "
12811                      "in %qs at %L", sym->name, &sym->declared_at);
12812           return false;
12813         }
12814       if (sym->attr.external && sym->attr.function && !sym->attr.module_procedure
12815           && ((sym->attr.if_source == IFSRC_DECL && !sym->attr.procedure)
12816               || sym->attr.contained))
12817         {
12818           gfc_error ("EXTERNAL attribute conflicts with FUNCTION attribute "
12819                      "in %qs at %L", sym->name, &sym->declared_at);
12820           return false;
12821         }
12822       if (strcmp ("ppr@", sym->name) == 0)
12823         {
12824           gfc_error ("Procedure pointer result %qs at %L "
12825                      "is missing the pointer attribute",
12826                      sym->ns->proc_name->name, &sym->declared_at);
12827           return false;
12828         }
12829     }
12830
12831   /* Assume that a procedure whose body is not known has references
12832      to external arrays.  */
12833   if (sym->attr.if_source != IFSRC_DECL)
12834     sym->attr.array_outer_dependency = 1;
12835
12836   /* Compare the characteristics of a module procedure with the
12837      interface declaration. Ideally this would be done with
12838      gfc_compare_interfaces but, at present, the formal interface
12839      cannot be copied to the ts.interface.  */
12840   if (sym->attr.module_procedure
12841       && sym->attr.if_source == IFSRC_DECL)
12842     {
12843       gfc_symbol *iface;
12844       char name[2*GFC_MAX_SYMBOL_LEN + 1];
12845       char *module_name;
12846       char *submodule_name;
12847       strcpy (name, sym->ns->proc_name->name);
12848       module_name = strtok (name, ".");
12849       submodule_name = strtok (NULL, ".");
12850
12851       iface = sym->tlink;
12852       sym->tlink = NULL;
12853
12854       /* Make sure that the result uses the correct charlen for deferred
12855          length results.  */
12856       if (iface && sym->result
12857           && iface->ts.type == BT_CHARACTER
12858           && iface->ts.deferred)
12859         sym->result->ts.u.cl = iface->ts.u.cl;
12860
12861       if (iface == NULL)
12862         goto check_formal;
12863
12864       /* Check the procedure characteristics.  */
12865       if (sym->attr.elemental != iface->attr.elemental)
12866         {
12867           gfc_error ("Mismatch in ELEMENTAL attribute between MODULE "
12868                      "PROCEDURE at %L and its interface in %s",
12869                      &sym->declared_at, module_name);
12870           return false;
12871         }
12872
12873       if (sym->attr.pure != iface->attr.pure)
12874         {
12875           gfc_error ("Mismatch in PURE attribute between MODULE "
12876                      "PROCEDURE at %L and its interface in %s",
12877                      &sym->declared_at, module_name);
12878           return false;
12879         }
12880
12881       if (sym->attr.recursive != iface->attr.recursive)
12882         {
12883           gfc_error ("Mismatch in RECURSIVE attribute between MODULE "
12884                      "PROCEDURE at %L and its interface in %s",
12885                      &sym->declared_at, module_name);
12886           return false;
12887         }
12888
12889       /* Check the result characteristics.  */
12890       if (!gfc_check_result_characteristics (sym, iface, errmsg, 200))
12891         {
12892           gfc_error ("%s between the MODULE PROCEDURE declaration "
12893                      "in MODULE %qs and the declaration at %L in "
12894                      "(SUB)MODULE %qs",
12895                      errmsg, module_name, &sym->declared_at,
12896                      submodule_name ? submodule_name : module_name);
12897           return false;
12898         }
12899
12900 check_formal:
12901       /* Check the characteristics of the formal arguments.  */
12902       if (sym->formal && sym->formal_ns)
12903         {
12904           for (arg = sym->formal; arg && arg->sym; arg = arg->next)
12905             {
12906               new_formal = arg;
12907               gfc_traverse_ns (sym->formal_ns, compare_fsyms);
12908             }
12909         }
12910     }
12911   return true;
12912 }
12913
12914
12915 /* Resolve a list of finalizer procedures.  That is, after they have hopefully
12916    been defined and we now know their defined arguments, check that they fulfill
12917    the requirements of the standard for procedures used as finalizers.  */
12918
12919 static bool
12920 gfc_resolve_finalizers (gfc_symbol* derived, bool *finalizable)
12921 {
12922   gfc_finalizer* list;
12923   gfc_finalizer** prev_link; /* For removing wrong entries from the list.  */
12924   bool result = true;
12925   bool seen_scalar = false;
12926   gfc_symbol *vtab;
12927   gfc_component *c;
12928   gfc_symbol *parent = gfc_get_derived_super_type (derived);
12929
12930   if (parent)
12931     gfc_resolve_finalizers (parent, finalizable);
12932
12933   /* Ensure that derived-type components have a their finalizers resolved.  */
12934   bool has_final = derived->f2k_derived && derived->f2k_derived->finalizers;
12935   for (c = derived->components; c; c = c->next)
12936     if (c->ts.type == BT_DERIVED
12937         && !c->attr.pointer && !c->attr.proc_pointer && !c->attr.allocatable)
12938       {
12939         bool has_final2 = false;
12940         if (!gfc_resolve_finalizers (c->ts.u.derived, &has_final2))
12941           return false;  /* Error.  */
12942         has_final = has_final || has_final2;
12943       }
12944   /* Return early if not finalizable.  */
12945   if (!has_final)
12946     {
12947       if (finalizable)
12948         *finalizable = false;
12949       return true;
12950     }
12951
12952   /* Walk over the list of finalizer-procedures, check them, and if any one
12953      does not fit in with the standard's definition, print an error and remove
12954      it from the list.  */
12955   prev_link = &derived->f2k_derived->finalizers;
12956   for (list = derived->f2k_derived->finalizers; list; list = *prev_link)
12957     {
12958       gfc_formal_arglist *dummy_args;
12959       gfc_symbol* arg;
12960       gfc_finalizer* i;
12961       int my_rank;
12962
12963       /* Skip this finalizer if we already resolved it.  */
12964       if (list->proc_tree)
12965         {
12966           if (list->proc_tree->n.sym->formal->sym->as == NULL
12967               || list->proc_tree->n.sym->formal->sym->as->rank == 0)
12968             seen_scalar = true;
12969           prev_link = &(list->next);
12970           continue;
12971         }
12972
12973       /* Check this exists and is a SUBROUTINE.  */
12974       if (!list->proc_sym->attr.subroutine)
12975         {
12976           gfc_error ("FINAL procedure %qs at %L is not a SUBROUTINE",
12977                      list->proc_sym->name, &list->where);
12978           goto error;
12979         }
12980
12981       /* We should have exactly one argument.  */
12982       dummy_args = gfc_sym_get_dummy_args (list->proc_sym);
12983       if (!dummy_args || dummy_args->next)
12984         {
12985           gfc_error ("FINAL procedure at %L must have exactly one argument",
12986                      &list->where);
12987           goto error;
12988         }
12989       arg = dummy_args->sym;
12990
12991       /* This argument must be of our type.  */
12992       if (arg->ts.type != BT_DERIVED || arg->ts.u.derived != derived)
12993         {
12994           gfc_error ("Argument of FINAL procedure at %L must be of type %qs",
12995                      &arg->declared_at, derived->name);
12996           goto error;
12997         }
12998
12999       /* It must neither be a pointer nor allocatable nor optional.  */
13000       if (arg->attr.pointer)
13001         {
13002           gfc_error ("Argument of FINAL procedure at %L must not be a POINTER",
13003                      &arg->declared_at);
13004           goto error;
13005         }
13006       if (arg->attr.allocatable)
13007         {
13008           gfc_error ("Argument of FINAL procedure at %L must not be"
13009                      " ALLOCATABLE", &arg->declared_at);
13010           goto error;
13011         }
13012       if (arg->attr.optional)
13013         {
13014           gfc_error ("Argument of FINAL procedure at %L must not be OPTIONAL",
13015                      &arg->declared_at);
13016           goto error;
13017         }
13018
13019       /* It must not be INTENT(OUT).  */
13020       if (arg->attr.intent == INTENT_OUT)
13021         {
13022           gfc_error ("Argument of FINAL procedure at %L must not be"
13023                      " INTENT(OUT)", &arg->declared_at);
13024           goto error;
13025         }
13026
13027       /* Warn if the procedure is non-scalar and not assumed shape.  */
13028       if (warn_surprising && arg->as && arg->as->rank != 0
13029           && arg->as->type != AS_ASSUMED_SHAPE)
13030         gfc_warning (OPT_Wsurprising,
13031                      "Non-scalar FINAL procedure at %L should have assumed"
13032                      " shape argument", &arg->declared_at);
13033
13034       /* Check that it does not match in kind and rank with a FINAL procedure
13035          defined earlier.  To really loop over the *earlier* declarations,
13036          we need to walk the tail of the list as new ones were pushed at the
13037          front.  */
13038       /* TODO: Handle kind parameters once they are implemented.  */
13039       my_rank = (arg->as ? arg->as->rank : 0);
13040       for (i = list->next; i; i = i->next)
13041         {
13042           gfc_formal_arglist *dummy_args;
13043
13044           /* Argument list might be empty; that is an error signalled earlier,
13045              but we nevertheless continued resolving.  */
13046           dummy_args = gfc_sym_get_dummy_args (i->proc_sym);
13047           if (dummy_args)
13048             {
13049               gfc_symbol* i_arg = dummy_args->sym;
13050               const int i_rank = (i_arg->as ? i_arg->as->rank : 0);
13051               if (i_rank == my_rank)
13052                 {
13053                   gfc_error ("FINAL procedure %qs declared at %L has the same"
13054                              " rank (%d) as %qs",
13055                              list->proc_sym->name, &list->where, my_rank,
13056                              i->proc_sym->name);
13057                   goto error;
13058                 }
13059             }
13060         }
13061
13062         /* Is this the/a scalar finalizer procedure?  */
13063         if (my_rank == 0)
13064           seen_scalar = true;
13065
13066         /* Find the symtree for this procedure.  */
13067         gcc_assert (!list->proc_tree);
13068         list->proc_tree = gfc_find_sym_in_symtree (list->proc_sym);
13069
13070         prev_link = &list->next;
13071         continue;
13072
13073         /* Remove wrong nodes immediately from the list so we don't risk any
13074            troubles in the future when they might fail later expectations.  */
13075 error:
13076         i = list;
13077         *prev_link = list->next;
13078         gfc_free_finalizer (i);
13079         result = false;
13080     }
13081
13082   if (result == false)
13083     return false;
13084
13085   /* Warn if we haven't seen a scalar finalizer procedure (but we know there
13086      were nodes in the list, must have been for arrays.  It is surely a good
13087      idea to have a scalar version there if there's something to finalize.  */
13088   if (warn_surprising && derived->f2k_derived->finalizers && !seen_scalar)
13089     gfc_warning (OPT_Wsurprising,
13090                  "Only array FINAL procedures declared for derived type %qs"
13091                  " defined at %L, suggest also scalar one",
13092                  derived->name, &derived->declared_at);
13093
13094   vtab = gfc_find_derived_vtab (derived);
13095   c = vtab->ts.u.derived->components->next->next->next->next->next;
13096   gfc_set_sym_referenced (c->initializer->symtree->n.sym);
13097
13098   if (finalizable)
13099     *finalizable = true;
13100
13101   return true;
13102 }
13103
13104
13105 /* Check if two GENERIC targets are ambiguous and emit an error is they are.  */
13106
13107 static bool
13108 check_generic_tbp_ambiguity (gfc_tbp_generic* t1, gfc_tbp_generic* t2,
13109                              const char* generic_name, locus where)
13110 {
13111   gfc_symbol *sym1, *sym2;
13112   const char *pass1, *pass2;
13113   gfc_formal_arglist *dummy_args;
13114
13115   gcc_assert (t1->specific && t2->specific);
13116   gcc_assert (!t1->specific->is_generic);
13117   gcc_assert (!t2->specific->is_generic);
13118   gcc_assert (t1->is_operator == t2->is_operator);
13119
13120   sym1 = t1->specific->u.specific->n.sym;
13121   sym2 = t2->specific->u.specific->n.sym;
13122
13123   if (sym1 == sym2)
13124     return true;
13125
13126   /* Both must be SUBROUTINEs or both must be FUNCTIONs.  */
13127   if (sym1->attr.subroutine != sym2->attr.subroutine
13128       || sym1->attr.function != sym2->attr.function)
13129     {
13130       gfc_error ("%qs and %qs cannot be mixed FUNCTION/SUBROUTINE for"
13131                  " GENERIC %qs at %L",
13132                  sym1->name, sym2->name, generic_name, &where);
13133       return false;
13134     }
13135
13136   /* Determine PASS arguments.  */
13137   if (t1->specific->nopass)
13138     pass1 = NULL;
13139   else if (t1->specific->pass_arg)
13140     pass1 = t1->specific->pass_arg;
13141   else
13142     {
13143       dummy_args = gfc_sym_get_dummy_args (t1->specific->u.specific->n.sym);
13144       if (dummy_args)
13145         pass1 = dummy_args->sym->name;
13146       else
13147         pass1 = NULL;
13148     }
13149   if (t2->specific->nopass)
13150     pass2 = NULL;
13151   else if (t2->specific->pass_arg)
13152     pass2 = t2->specific->pass_arg;
13153   else
13154     {
13155       dummy_args = gfc_sym_get_dummy_args (t2->specific->u.specific->n.sym);
13156       if (dummy_args)
13157         pass2 = dummy_args->sym->name;
13158       else
13159         pass2 = NULL;
13160     }
13161
13162   /* Compare the interfaces.  */
13163   if (gfc_compare_interfaces (sym1, sym2, sym2->name, !t1->is_operator, 0,
13164                               NULL, 0, pass1, pass2))
13165     {
13166       gfc_error ("%qs and %qs for GENERIC %qs at %L are ambiguous",
13167                  sym1->name, sym2->name, generic_name, &where);
13168       return false;
13169     }
13170
13171   return true;
13172 }
13173
13174
13175 /* Worker function for resolving a generic procedure binding; this is used to
13176    resolve GENERIC as well as user and intrinsic OPERATOR typebound procedures.
13177
13178    The difference between those cases is finding possible inherited bindings
13179    that are overridden, as one has to look for them in tb_sym_root,
13180    tb_uop_root or tb_op, respectively.  Thus the caller must already find
13181    the super-type and set p->overridden correctly.  */
13182
13183 static bool
13184 resolve_tb_generic_targets (gfc_symbol* super_type,
13185                             gfc_typebound_proc* p, const char* name)
13186 {
13187   gfc_tbp_generic* target;
13188   gfc_symtree* first_target;
13189   gfc_symtree* inherited;
13190
13191   gcc_assert (p && p->is_generic);
13192
13193   /* Try to find the specific bindings for the symtrees in our target-list.  */
13194   gcc_assert (p->u.generic);
13195   for (target = p->u.generic; target; target = target->next)
13196     if (!target->specific)
13197       {
13198         gfc_typebound_proc* overridden_tbp;
13199         gfc_tbp_generic* g;
13200         const char* target_name;
13201
13202         target_name = target->specific_st->name;
13203
13204         /* Defined for this type directly.  */
13205         if (target->specific_st->n.tb && !target->specific_st->n.tb->error)
13206           {
13207             target->specific = target->specific_st->n.tb;
13208             goto specific_found;
13209           }
13210
13211         /* Look for an inherited specific binding.  */
13212         if (super_type)
13213           {
13214             inherited = gfc_find_typebound_proc (super_type, NULL, target_name,
13215                                                  true, NULL);
13216
13217             if (inherited)
13218               {
13219                 gcc_assert (inherited->n.tb);
13220                 target->specific = inherited->n.tb;
13221                 goto specific_found;
13222               }
13223           }
13224
13225         gfc_error ("Undefined specific binding %qs as target of GENERIC %qs"
13226                    " at %L", target_name, name, &p->where);
13227         return false;
13228
13229         /* Once we've found the specific binding, check it is not ambiguous with
13230            other specifics already found or inherited for the same GENERIC.  */
13231 specific_found:
13232         gcc_assert (target->specific);
13233
13234         /* This must really be a specific binding!  */
13235         if (target->specific->is_generic)
13236           {
13237             gfc_error ("GENERIC %qs at %L must target a specific binding,"
13238                        " %qs is GENERIC, too", name, &p->where, target_name);
13239             return false;
13240           }
13241
13242         /* Check those already resolved on this type directly.  */
13243         for (g = p->u.generic; g; g = g->next)
13244           if (g != target && g->specific
13245               && !check_generic_tbp_ambiguity (target, g, name, p->where))
13246             return false;
13247
13248         /* Check for ambiguity with inherited specific targets.  */
13249         for (overridden_tbp = p->overridden; overridden_tbp;
13250              overridden_tbp = overridden_tbp->overridden)
13251           if (overridden_tbp->is_generic)
13252             {
13253               for (g = overridden_tbp->u.generic; g; g = g->next)
13254                 {
13255                   gcc_assert (g->specific);
13256                   if (!check_generic_tbp_ambiguity (target, g, name, p->where))
13257                     return false;
13258                 }
13259             }
13260       }
13261
13262   /* If we attempt to "overwrite" a specific binding, this is an error.  */
13263   if (p->overridden && !p->overridden->is_generic)
13264     {
13265       gfc_error ("GENERIC %qs at %L cannot overwrite specific binding with"
13266                  " the same name", name, &p->where);
13267       return false;
13268     }
13269
13270   /* Take the SUBROUTINE/FUNCTION attributes of the first specific target, as
13271      all must have the same attributes here.  */
13272   first_target = p->u.generic->specific->u.specific;
13273   gcc_assert (first_target);
13274   p->subroutine = first_target->n.sym->attr.subroutine;
13275   p->function = first_target->n.sym->attr.function;
13276
13277   return true;
13278 }
13279
13280
13281 /* Resolve a GENERIC procedure binding for a derived type.  */
13282
13283 static bool
13284 resolve_typebound_generic (gfc_symbol* derived, gfc_symtree* st)
13285 {
13286   gfc_symbol* super_type;
13287
13288   /* Find the overridden binding if any.  */
13289   st->n.tb->overridden = NULL;
13290   super_type = gfc_get_derived_super_type (derived);
13291   if (super_type)
13292     {
13293       gfc_symtree* overridden;
13294       overridden = gfc_find_typebound_proc (super_type, NULL, st->name,
13295                                             true, NULL);
13296
13297       if (overridden && overridden->n.tb)
13298         st->n.tb->overridden = overridden->n.tb;
13299     }
13300
13301   /* Resolve using worker function.  */
13302   return resolve_tb_generic_targets (super_type, st->n.tb, st->name);
13303 }
13304
13305
13306 /* Retrieve the target-procedure of an operator binding and do some checks in
13307    common for intrinsic and user-defined type-bound operators.  */
13308
13309 static gfc_symbol*
13310 get_checked_tb_operator_target (gfc_tbp_generic* target, locus where)
13311 {
13312   gfc_symbol* target_proc;
13313
13314   gcc_assert (target->specific && !target->specific->is_generic);
13315   target_proc = target->specific->u.specific->n.sym;
13316   gcc_assert (target_proc);
13317
13318   /* F08:C468. All operator bindings must have a passed-object dummy argument.  */
13319   if (target->specific->nopass)
13320     {
13321       gfc_error ("Type-bound operator at %L cannot be NOPASS", &where);
13322       return NULL;
13323     }
13324
13325   return target_proc;
13326 }
13327
13328
13329 /* Resolve a type-bound intrinsic operator.  */
13330
13331 static bool
13332 resolve_typebound_intrinsic_op (gfc_symbol* derived, gfc_intrinsic_op op,
13333                                 gfc_typebound_proc* p)
13334 {
13335   gfc_symbol* super_type;
13336   gfc_tbp_generic* target;
13337
13338   /* If there's already an error here, do nothing (but don't fail again).  */
13339   if (p->error)
13340     return true;
13341
13342   /* Operators should always be GENERIC bindings.  */
13343   gcc_assert (p->is_generic);
13344
13345   /* Look for an overridden binding.  */
13346   super_type = gfc_get_derived_super_type (derived);
13347   if (super_type && super_type->f2k_derived)
13348     p->overridden = gfc_find_typebound_intrinsic_op (super_type, NULL,
13349                                                      op, true, NULL);
13350   else
13351     p->overridden = NULL;
13352
13353   /* Resolve general GENERIC properties using worker function.  */
13354   if (!resolve_tb_generic_targets (super_type, p, gfc_op2string(op)))
13355     goto error;
13356
13357   /* Check the targets to be procedures of correct interface.  */
13358   for (target = p->u.generic; target; target = target->next)
13359     {
13360       gfc_symbol* target_proc;
13361
13362       target_proc = get_checked_tb_operator_target (target, p->where);
13363       if (!target_proc)
13364         goto error;
13365
13366       if (!gfc_check_operator_interface (target_proc, op, p->where))
13367         goto error;
13368
13369       /* Add target to non-typebound operator list.  */
13370       if (!target->specific->deferred && !derived->attr.use_assoc
13371           && p->access != ACCESS_PRIVATE && derived->ns == gfc_current_ns)
13372         {
13373           gfc_interface *head, *intr;
13374
13375           /* Preempt 'gfc_check_new_interface' for submodules, where the
13376              mechanism for handling module procedures winds up resolving
13377              operator interfaces twice and would otherwise cause an error.  */
13378           for (intr = derived->ns->op[op]; intr; intr = intr->next)
13379             if (intr->sym == target_proc
13380                 && target_proc->attr.used_in_submodule)
13381               return true;
13382
13383           if (!gfc_check_new_interface (derived->ns->op[op],
13384                                         target_proc, p->where))
13385             return false;
13386           head = derived->ns->op[op];
13387           intr = gfc_get_interface ();
13388           intr->sym = target_proc;
13389           intr->where = p->where;
13390           intr->next = head;
13391           derived->ns->op[op] = intr;
13392         }
13393     }
13394
13395   return true;
13396
13397 error:
13398   p->error = 1;
13399   return false;
13400 }
13401
13402
13403 /* Resolve a type-bound user operator (tree-walker callback).  */
13404
13405 static gfc_symbol* resolve_bindings_derived;
13406 static bool resolve_bindings_result;
13407
13408 static bool check_uop_procedure (gfc_symbol* sym, locus where);
13409
13410 static void
13411 resolve_typebound_user_op (gfc_symtree* stree)
13412 {
13413   gfc_symbol* super_type;
13414   gfc_tbp_generic* target;
13415
13416   gcc_assert (stree && stree->n.tb);
13417
13418   if (stree->n.tb->error)
13419     return;
13420
13421   /* Operators should always be GENERIC bindings.  */
13422   gcc_assert (stree->n.tb->is_generic);
13423
13424   /* Find overridden procedure, if any.  */
13425   super_type = gfc_get_derived_super_type (resolve_bindings_derived);
13426   if (super_type && super_type->f2k_derived)
13427     {
13428       gfc_symtree* overridden;
13429       overridden = gfc_find_typebound_user_op (super_type, NULL,
13430                                                stree->name, true, NULL);
13431
13432       if (overridden && overridden->n.tb)
13433         stree->n.tb->overridden = overridden->n.tb;
13434     }
13435   else
13436     stree->n.tb->overridden = NULL;
13437
13438   /* Resolve basically using worker function.  */
13439   if (!resolve_tb_generic_targets (super_type, stree->n.tb, stree->name))
13440     goto error;
13441
13442   /* Check the targets to be functions of correct interface.  */
13443   for (target = stree->n.tb->u.generic; target; target = target->next)
13444     {
13445       gfc_symbol* target_proc;
13446
13447       target_proc = get_checked_tb_operator_target (target, stree->n.tb->where);
13448       if (!target_proc)
13449         goto error;
13450
13451       if (!check_uop_procedure (target_proc, stree->n.tb->where))
13452         goto error;
13453     }
13454
13455   return;
13456
13457 error:
13458   resolve_bindings_result = false;
13459   stree->n.tb->error = 1;
13460 }
13461
13462
13463 /* Resolve the type-bound procedures for a derived type.  */
13464
13465 static void
13466 resolve_typebound_procedure (gfc_symtree* stree)
13467 {
13468   gfc_symbol* proc;
13469   locus where;
13470   gfc_symbol* me_arg;
13471   gfc_symbol* super_type;
13472   gfc_component* comp;
13473
13474   gcc_assert (stree);
13475
13476   /* Undefined specific symbol from GENERIC target definition.  */
13477   if (!stree->n.tb)
13478     return;
13479
13480   if (stree->n.tb->error)
13481     return;
13482
13483   /* If this is a GENERIC binding, use that routine.  */
13484   if (stree->n.tb->is_generic)
13485     {
13486       if (!resolve_typebound_generic (resolve_bindings_derived, stree))
13487         goto error;
13488       return;
13489     }
13490
13491   /* Get the target-procedure to check it.  */
13492   gcc_assert (!stree->n.tb->is_generic);
13493   gcc_assert (stree->n.tb->u.specific);
13494   proc = stree->n.tb->u.specific->n.sym;
13495   where = stree->n.tb->where;
13496
13497   /* Default access should already be resolved from the parser.  */
13498   gcc_assert (stree->n.tb->access != ACCESS_UNKNOWN);
13499
13500   if (stree->n.tb->deferred)
13501     {
13502       if (!check_proc_interface (proc, &where))
13503         goto error;
13504     }
13505   else
13506     {
13507       /* Check for F08:C465.  */
13508       if ((!proc->attr.subroutine && !proc->attr.function)
13509           || (proc->attr.proc != PROC_MODULE
13510               && proc->attr.if_source != IFSRC_IFBODY)
13511           || proc->attr.abstract)
13512         {
13513           gfc_error ("%qs must be a module procedure or an external procedure with"
13514                     " an explicit interface at %L", proc->name, &where);
13515           goto error;
13516         }
13517     }
13518
13519   stree->n.tb->subroutine = proc->attr.subroutine;
13520   stree->n.tb->function = proc->attr.function;
13521
13522   /* Find the super-type of the current derived type.  We could do this once and
13523      store in a global if speed is needed, but as long as not I believe this is
13524      more readable and clearer.  */
13525   super_type = gfc_get_derived_super_type (resolve_bindings_derived);
13526
13527   /* If PASS, resolve and check arguments if not already resolved / loaded
13528      from a .mod file.  */
13529   if (!stree->n.tb->nopass && stree->n.tb->pass_arg_num == 0)
13530     {
13531       gfc_formal_arglist *dummy_args;
13532
13533       dummy_args = gfc_sym_get_dummy_args (proc);
13534       if (stree->n.tb->pass_arg)
13535         {
13536           gfc_formal_arglist *i;
13537
13538           /* If an explicit passing argument name is given, walk the arg-list
13539              and look for it.  */
13540
13541           me_arg = NULL;
13542           stree->n.tb->pass_arg_num = 1;
13543           for (i = dummy_args; i; i = i->next)
13544             {
13545               if (!strcmp (i->sym->name, stree->n.tb->pass_arg))
13546                 {
13547                   me_arg = i->sym;
13548                   break;
13549                 }
13550               ++stree->n.tb->pass_arg_num;
13551             }
13552
13553           if (!me_arg)
13554             {
13555               gfc_error ("Procedure %qs with PASS(%s) at %L has no"
13556                          " argument %qs",
13557                          proc->name, stree->n.tb->pass_arg, &where,
13558                          stree->n.tb->pass_arg);
13559               goto error;
13560             }
13561         }
13562       else
13563         {
13564           /* Otherwise, take the first one; there should in fact be at least
13565              one.  */
13566           stree->n.tb->pass_arg_num = 1;
13567           if (!dummy_args)
13568             {
13569               gfc_error ("Procedure %qs with PASS at %L must have at"
13570                          " least one argument", proc->name, &where);
13571               goto error;
13572             }
13573           me_arg = dummy_args->sym;
13574         }
13575
13576       /* Now check that the argument-type matches and the passed-object
13577          dummy argument is generally fine.  */
13578
13579       gcc_assert (me_arg);
13580
13581       if (me_arg->ts.type != BT_CLASS)
13582         {
13583           gfc_error ("Non-polymorphic passed-object dummy argument of %qs"
13584                      " at %L", proc->name, &where);
13585           goto error;
13586         }
13587
13588       if (CLASS_DATA (me_arg)->ts.u.derived
13589           != resolve_bindings_derived)
13590         {
13591           gfc_error ("Argument %qs of %qs with PASS(%s) at %L must be of"
13592                      " the derived-type %qs", me_arg->name, proc->name,
13593                      me_arg->name, &where, resolve_bindings_derived->name);
13594           goto error;
13595         }
13596
13597       gcc_assert (me_arg->ts.type == BT_CLASS);
13598       if (CLASS_DATA (me_arg)->as && CLASS_DATA (me_arg)->as->rank != 0)
13599         {
13600           gfc_error ("Passed-object dummy argument of %qs at %L must be"
13601                      " scalar", proc->name, &where);
13602           goto error;
13603         }
13604       if (CLASS_DATA (me_arg)->attr.allocatable)
13605         {
13606           gfc_error ("Passed-object dummy argument of %qs at %L must not"
13607                      " be ALLOCATABLE", proc->name, &where);
13608           goto error;
13609         }
13610       if (CLASS_DATA (me_arg)->attr.class_pointer)
13611         {
13612           gfc_error ("Passed-object dummy argument of %qs at %L must not"
13613                      " be POINTER", proc->name, &where);
13614           goto error;
13615         }
13616     }
13617
13618   /* If we are extending some type, check that we don't override a procedure
13619      flagged NON_OVERRIDABLE.  */
13620   stree->n.tb->overridden = NULL;
13621   if (super_type)
13622     {
13623       gfc_symtree* overridden;
13624       overridden = gfc_find_typebound_proc (super_type, NULL,
13625                                             stree->name, true, NULL);
13626
13627       if (overridden)
13628         {
13629           if (overridden->n.tb)
13630             stree->n.tb->overridden = overridden->n.tb;
13631
13632           if (!gfc_check_typebound_override (stree, overridden))
13633             goto error;
13634         }
13635     }
13636
13637   /* See if there's a name collision with a component directly in this type.  */
13638   for (comp = resolve_bindings_derived->components; comp; comp = comp->next)
13639     if (!strcmp (comp->name, stree->name))
13640       {
13641         gfc_error ("Procedure %qs at %L has the same name as a component of"
13642                    " %qs",
13643                    stree->name, &where, resolve_bindings_derived->name);
13644         goto error;
13645       }
13646
13647   /* Try to find a name collision with an inherited component.  */
13648   if (super_type && gfc_find_component (super_type, stree->name, true, true,
13649                                         NULL))
13650     {
13651       gfc_error ("Procedure %qs at %L has the same name as an inherited"
13652                  " component of %qs",
13653                  stree->name, &where, resolve_bindings_derived->name);
13654       goto error;
13655     }
13656
13657   stree->n.tb->error = 0;
13658   return;
13659
13660 error:
13661   resolve_bindings_result = false;
13662   stree->n.tb->error = 1;
13663 }
13664
13665
13666 static bool
13667 resolve_typebound_procedures (gfc_symbol* derived)
13668 {
13669   int op;
13670   gfc_symbol* super_type;
13671
13672   if (!derived->f2k_derived || !derived->f2k_derived->tb_sym_root)
13673     return true;
13674
13675   super_type = gfc_get_derived_super_type (derived);
13676   if (super_type)
13677     resolve_symbol (super_type);
13678
13679   resolve_bindings_derived = derived;
13680   resolve_bindings_result = true;
13681
13682   if (derived->f2k_derived->tb_sym_root)
13683     gfc_traverse_symtree (derived->f2k_derived->tb_sym_root,
13684                           &resolve_typebound_procedure);
13685
13686   if (derived->f2k_derived->tb_uop_root)
13687     gfc_traverse_symtree (derived->f2k_derived->tb_uop_root,
13688                           &resolve_typebound_user_op);
13689
13690   for (op = 0; op != GFC_INTRINSIC_OPS; ++op)
13691     {
13692       gfc_typebound_proc* p = derived->f2k_derived->tb_op[op];
13693       if (p && !resolve_typebound_intrinsic_op (derived,
13694                                                 (gfc_intrinsic_op)op, p))
13695         resolve_bindings_result = false;
13696     }
13697
13698   return resolve_bindings_result;
13699 }
13700
13701
13702 /* Add a derived type to the dt_list.  The dt_list is used in trans-types.c
13703    to give all identical derived types the same backend_decl.  */
13704 static void
13705 add_dt_to_dt_list (gfc_symbol *derived)
13706 {
13707   if (!derived->dt_next)
13708     {
13709       if (gfc_derived_types)
13710         {
13711           derived->dt_next = gfc_derived_types->dt_next;
13712           gfc_derived_types->dt_next = derived;
13713         }
13714       else
13715         {
13716           derived->dt_next = derived;
13717         }
13718       gfc_derived_types = derived;
13719     }
13720 }
13721
13722
13723 /* Ensure that a derived-type is really not abstract, meaning that every
13724    inherited DEFERRED binding is overridden by a non-DEFERRED one.  */
13725
13726 static bool
13727 ensure_not_abstract_walker (gfc_symbol* sub, gfc_symtree* st)
13728 {
13729   if (!st)
13730     return true;
13731
13732   if (!ensure_not_abstract_walker (sub, st->left))
13733     return false;
13734   if (!ensure_not_abstract_walker (sub, st->right))
13735     return false;
13736
13737   if (st->n.tb && st->n.tb->deferred)
13738     {
13739       gfc_symtree* overriding;
13740       overriding = gfc_find_typebound_proc (sub, NULL, st->name, true, NULL);
13741       if (!overriding)
13742         return false;
13743       gcc_assert (overriding->n.tb);
13744       if (overriding->n.tb->deferred)
13745         {
13746           gfc_error ("Derived-type %qs declared at %L must be ABSTRACT because"
13747                      " %qs is DEFERRED and not overridden",
13748                      sub->name, &sub->declared_at, st->name);
13749           return false;
13750         }
13751     }
13752
13753   return true;
13754 }
13755
13756 static bool
13757 ensure_not_abstract (gfc_symbol* sub, gfc_symbol* ancestor)
13758 {
13759   /* The algorithm used here is to recursively travel up the ancestry of sub
13760      and for each ancestor-type, check all bindings.  If any of them is
13761      DEFERRED, look it up starting from sub and see if the found (overriding)
13762      binding is not DEFERRED.
13763      This is not the most efficient way to do this, but it should be ok and is
13764      clearer than something sophisticated.  */
13765
13766   gcc_assert (ancestor && !sub->attr.abstract);
13767
13768   if (!ancestor->attr.abstract)
13769     return true;
13770
13771   /* Walk bindings of this ancestor.  */
13772   if (ancestor->f2k_derived)
13773     {
13774       bool t;
13775       t = ensure_not_abstract_walker (sub, ancestor->f2k_derived->tb_sym_root);
13776       if (!t)
13777         return false;
13778     }
13779
13780   /* Find next ancestor type and recurse on it.  */
13781   ancestor = gfc_get_derived_super_type (ancestor);
13782   if (ancestor)
13783     return ensure_not_abstract (sub, ancestor);
13784
13785   return true;
13786 }
13787
13788
13789 /* This check for typebound defined assignments is done recursively
13790    since the order in which derived types are resolved is not always in
13791    order of the declarations.  */
13792
13793 static void
13794 check_defined_assignments (gfc_symbol *derived)
13795 {
13796   gfc_component *c;
13797
13798   for (c = derived->components; c; c = c->next)
13799     {
13800       if (!gfc_bt_struct (c->ts.type)
13801           || c->attr.pointer
13802           || c->attr.allocatable
13803           || c->attr.proc_pointer_comp
13804           || c->attr.class_pointer
13805           || c->attr.proc_pointer)
13806         continue;
13807
13808       if (c->ts.u.derived->attr.defined_assign_comp
13809           || (c->ts.u.derived->f2k_derived
13810              && c->ts.u.derived->f2k_derived->tb_op[INTRINSIC_ASSIGN]))
13811         {
13812           derived->attr.defined_assign_comp = 1;
13813           return;
13814         }
13815
13816       check_defined_assignments (c->ts.u.derived);
13817       if (c->ts.u.derived->attr.defined_assign_comp)
13818         {
13819           derived->attr.defined_assign_comp = 1;
13820           return;
13821         }
13822     }
13823 }
13824
13825
13826 /* Resolve a single component of a derived type or structure.  */
13827
13828 static bool
13829 resolve_component (gfc_component *c, gfc_symbol *sym)
13830 {
13831   gfc_symbol *super_type;
13832   symbol_attribute *attr;
13833
13834   if (c->attr.artificial)
13835     return true;
13836
13837   /* Do not allow vtype components to be resolved in nameless namespaces
13838      such as block data because the procedure pointers will cause ICEs
13839      and vtables are not needed in these contexts.  */
13840   if (sym->attr.vtype && sym->attr.use_assoc
13841       && sym->ns->proc_name == NULL)
13842     return true;
13843
13844   /* F2008, C442.  */
13845   if ((!sym->attr.is_class || c != sym->components)
13846       && c->attr.codimension
13847       && (!c->attr.allocatable || (c->as && c->as->type != AS_DEFERRED)))
13848     {
13849       gfc_error ("Coarray component %qs at %L must be allocatable with "
13850                  "deferred shape", c->name, &c->loc);
13851       return false;
13852     }
13853
13854   /* F2008, C443.  */
13855   if (c->attr.codimension && c->ts.type == BT_DERIVED
13856       && c->ts.u.derived->ts.is_iso_c)
13857     {
13858       gfc_error ("Component %qs at %L of TYPE(C_PTR) or TYPE(C_FUNPTR) "
13859                  "shall not be a coarray", c->name, &c->loc);
13860       return false;
13861     }
13862
13863   /* F2008, C444.  */
13864   if (gfc_bt_struct (c->ts.type) && c->ts.u.derived->attr.coarray_comp
13865       && (c->attr.codimension || c->attr.pointer || c->attr.dimension
13866           || c->attr.allocatable))
13867     {
13868       gfc_error ("Component %qs at %L with coarray component "
13869                  "shall be a nonpointer, nonallocatable scalar",
13870                  c->name, &c->loc);
13871       return false;
13872     }
13873
13874   /* F2008, C448.  */
13875   if (c->ts.type == BT_CLASS)
13876     {
13877       if (CLASS_DATA (c))
13878         {
13879           attr = &(CLASS_DATA (c)->attr);
13880
13881           /* Fix up contiguous attribute.  */
13882           if (c->attr.contiguous)
13883             attr->contiguous = 1;
13884         }
13885       else
13886         attr = NULL;
13887     }
13888   else
13889     attr = &c->attr;
13890
13891   if (attr && attr->contiguous && (!attr->dimension || !attr->pointer))
13892     {
13893       gfc_error ("Component %qs at %L has the CONTIGUOUS attribute but "
13894                  "is not an array pointer", c->name, &c->loc);
13895       return false;
13896     }
13897
13898   /* F2003, 15.2.1 - length has to be one.  */
13899   if (sym->attr.is_bind_c && c->ts.type == BT_CHARACTER
13900       && (c->ts.u.cl == NULL || c->ts.u.cl->length == NULL
13901           || !gfc_is_constant_expr (c->ts.u.cl->length)
13902           || mpz_cmp_si (c->ts.u.cl->length->value.integer, 1) != 0))
13903     {
13904       gfc_error ("Component %qs of BIND(C) type at %L must have length one",
13905                  c->name, &c->loc);
13906       return false;
13907     }
13908
13909   if (c->attr.proc_pointer && c->ts.interface)
13910     {
13911       gfc_symbol *ifc = c->ts.interface;
13912
13913       if (!sym->attr.vtype && !check_proc_interface (ifc, &c->loc))
13914         {
13915           c->tb->error = 1;
13916           return false;
13917         }
13918
13919       if (ifc->attr.if_source || ifc->attr.intrinsic)
13920         {
13921           /* Resolve interface and copy attributes.  */
13922           if (ifc->formal && !ifc->formal_ns)
13923             resolve_symbol (ifc);
13924           if (ifc->attr.intrinsic)
13925             gfc_resolve_intrinsic (ifc, &ifc->declared_at);
13926
13927           if (ifc->result)
13928             {
13929               c->ts = ifc->result->ts;
13930               c->attr.allocatable = ifc->result->attr.allocatable;
13931               c->attr.pointer = ifc->result->attr.pointer;
13932               c->attr.dimension = ifc->result->attr.dimension;
13933               c->as = gfc_copy_array_spec (ifc->result->as);
13934               c->attr.class_ok = ifc->result->attr.class_ok;
13935             }
13936           else
13937             {
13938               c->ts = ifc->ts;
13939               c->attr.allocatable = ifc->attr.allocatable;
13940               c->attr.pointer = ifc->attr.pointer;
13941               c->attr.dimension = ifc->attr.dimension;
13942               c->as = gfc_copy_array_spec (ifc->as);
13943               c->attr.class_ok = ifc->attr.class_ok;
13944             }
13945           c->ts.interface = ifc;
13946           c->attr.function = ifc->attr.function;
13947           c->attr.subroutine = ifc->attr.subroutine;
13948
13949           c->attr.pure = ifc->attr.pure;
13950           c->attr.elemental = ifc->attr.elemental;
13951           c->attr.recursive = ifc->attr.recursive;
13952           c->attr.always_explicit = ifc->attr.always_explicit;
13953           c->attr.ext_attr |= ifc->attr.ext_attr;
13954           /* Copy char length.  */
13955           if (ifc->ts.type == BT_CHARACTER && ifc->ts.u.cl)
13956             {
13957               gfc_charlen *cl = gfc_new_charlen (sym->ns, ifc->ts.u.cl);
13958               if (cl->length && !cl->resolved
13959                   && !gfc_resolve_expr (cl->length))
13960                 {
13961                   c->tb->error = 1;
13962                   return false;
13963                 }
13964               c->ts.u.cl = cl;
13965             }
13966         }
13967     }
13968   else if (c->attr.proc_pointer && c->ts.type == BT_UNKNOWN)
13969     {
13970       /* Since PPCs are not implicitly typed, a PPC without an explicit
13971          interface must be a subroutine.  */
13972       gfc_add_subroutine (&c->attr, c->name, &c->loc);
13973     }
13974
13975   /* Procedure pointer components: Check PASS arg.  */
13976   if (c->attr.proc_pointer && !c->tb->nopass && c->tb->pass_arg_num == 0
13977       && !sym->attr.vtype)
13978     {
13979       gfc_symbol* me_arg;
13980
13981       if (c->tb->pass_arg)
13982         {
13983           gfc_formal_arglist* i;
13984
13985           /* If an explicit passing argument name is given, walk the arg-list
13986             and look for it.  */
13987
13988           me_arg = NULL;
13989           c->tb->pass_arg_num = 1;
13990           for (i = c->ts.interface->formal; i; i = i->next)
13991             {
13992               if (!strcmp (i->sym->name, c->tb->pass_arg))
13993                 {
13994                   me_arg = i->sym;
13995                   break;
13996                 }
13997               c->tb->pass_arg_num++;
13998             }
13999
14000           if (!me_arg)
14001             {
14002               gfc_error ("Procedure pointer component %qs with PASS(%s) "
14003                          "at %L has no argument %qs", c->name,
14004                          c->tb->pass_arg, &c->loc, c->tb->pass_arg);
14005               c->tb->error = 1;
14006               return false;
14007             }
14008         }
14009       else
14010         {
14011           /* Otherwise, take the first one; there should in fact be at least
14012             one.  */
14013           c->tb->pass_arg_num = 1;
14014           if (!c->ts.interface->formal)
14015             {
14016               gfc_error ("Procedure pointer component %qs with PASS at %L "
14017                          "must have at least one argument",
14018                          c->name, &c->loc);
14019               c->tb->error = 1;
14020               return false;
14021             }
14022           me_arg = c->ts.interface->formal->sym;
14023         }
14024
14025       /* Now check that the argument-type matches.  */
14026       gcc_assert (me_arg);
14027       if ((me_arg->ts.type != BT_DERIVED && me_arg->ts.type != BT_CLASS)
14028           || (me_arg->ts.type == BT_DERIVED && me_arg->ts.u.derived != sym)
14029           || (me_arg->ts.type == BT_CLASS
14030               && CLASS_DATA (me_arg)->ts.u.derived != sym))
14031         {
14032           gfc_error ("Argument %qs of %qs with PASS(%s) at %L must be of"
14033                      " the derived type %qs", me_arg->name, c->name,
14034                      me_arg->name, &c->loc, sym->name);
14035           c->tb->error = 1;
14036           return false;
14037         }
14038
14039       /* Check for F03:C453.  */
14040       if (CLASS_DATA (me_arg)->attr.dimension)
14041         {
14042           gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
14043                      "must be scalar", me_arg->name, c->name, me_arg->name,
14044                      &c->loc);
14045           c->tb->error = 1;
14046           return false;
14047         }
14048
14049       if (CLASS_DATA (me_arg)->attr.class_pointer)
14050         {
14051           gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
14052                      "may not have the POINTER attribute", me_arg->name,
14053                      c->name, me_arg->name, &c->loc);
14054           c->tb->error = 1;
14055           return false;
14056         }
14057
14058       if (CLASS_DATA (me_arg)->attr.allocatable)
14059         {
14060           gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
14061                      "may not be ALLOCATABLE", me_arg->name, c->name,
14062                      me_arg->name, &c->loc);
14063           c->tb->error = 1;
14064           return false;
14065         }
14066
14067       if (gfc_type_is_extensible (sym) && me_arg->ts.type != BT_CLASS)
14068         {
14069           gfc_error ("Non-polymorphic passed-object dummy argument of %qs"
14070                      " at %L", c->name, &c->loc);
14071           return false;
14072         }
14073
14074     }
14075
14076   /* Check type-spec if this is not the parent-type component.  */
14077   if (((sym->attr.is_class
14078         && (!sym->components->ts.u.derived->attr.extension
14079             || c != sym->components->ts.u.derived->components))
14080        || (!sym->attr.is_class
14081            && (!sym->attr.extension || c != sym->components)))
14082       && !sym->attr.vtype
14083       && !resolve_typespec_used (&c->ts, &c->loc, c->name))
14084     return false;
14085
14086   super_type = gfc_get_derived_super_type (sym);
14087
14088   /* If this type is an extension, set the accessibility of the parent
14089      component.  */
14090   if (super_type
14091       && ((sym->attr.is_class
14092            && c == sym->components->ts.u.derived->components)
14093           || (!sym->attr.is_class && c == sym->components))
14094       && strcmp (super_type->name, c->name) == 0)
14095     c->attr.access = super_type->attr.access;
14096
14097   /* If this type is an extension, see if this component has the same name
14098      as an inherited type-bound procedure.  */
14099   if (super_type && !sym->attr.is_class
14100       && gfc_find_typebound_proc (super_type, NULL, c->name, true, NULL))
14101     {
14102       gfc_error ("Component %qs of %qs at %L has the same name as an"
14103                  " inherited type-bound procedure",
14104                  c->name, sym->name, &c->loc);
14105       return false;
14106     }
14107
14108   if (c->ts.type == BT_CHARACTER && !c->attr.proc_pointer
14109         && !c->ts.deferred)
14110     {
14111      if (c->ts.u.cl->length == NULL
14112          || (!resolve_charlen(c->ts.u.cl))
14113          || !gfc_is_constant_expr (c->ts.u.cl->length))
14114        {
14115          gfc_error ("Character length of component %qs needs to "
14116                     "be a constant specification expression at %L",
14117                     c->name,
14118                     c->ts.u.cl->length ? &c->ts.u.cl->length->where : &c->loc);
14119          return false;
14120        }
14121     }
14122
14123   if (c->ts.type == BT_CHARACTER && c->ts.deferred
14124       && !c->attr.pointer && !c->attr.allocatable)
14125     {
14126       gfc_error ("Character component %qs of %qs at %L with deferred "
14127                  "length must be a POINTER or ALLOCATABLE",
14128                  c->name, sym->name, &c->loc);
14129       return false;
14130     }
14131
14132   /* Add the hidden deferred length field.  */
14133   if (c->ts.type == BT_CHARACTER
14134       && (c->ts.deferred || c->attr.pdt_string)
14135       && !c->attr.function
14136       && !sym->attr.is_class)
14137     {
14138       char name[GFC_MAX_SYMBOL_LEN+9];
14139       gfc_component *strlen;
14140       sprintf (name, "_%s_length", c->name);
14141       strlen = gfc_find_component (sym, name, true, true, NULL);
14142       if (strlen == NULL)
14143         {
14144           if (!gfc_add_component (sym, name, &strlen))
14145             return false;
14146           strlen->ts.type = BT_INTEGER;
14147           strlen->ts.kind = gfc_charlen_int_kind;
14148           strlen->attr.access = ACCESS_PRIVATE;
14149           strlen->attr.artificial = 1;
14150         }
14151     }
14152
14153   if (c->ts.type == BT_DERIVED
14154       && sym->component_access != ACCESS_PRIVATE
14155       && gfc_check_symbol_access (sym)
14156       && !is_sym_host_assoc (c->ts.u.derived, sym->ns)
14157       && !c->ts.u.derived->attr.use_assoc
14158       && !gfc_check_symbol_access (c->ts.u.derived)
14159       && !gfc_notify_std (GFC_STD_F2003, "the component %qs is a "
14160                           "PRIVATE type and cannot be a component of "
14161                           "%qs, which is PUBLIC at %L", c->name,
14162                           sym->name, &sym->declared_at))
14163     return false;
14164
14165   if ((sym->attr.sequence || sym->attr.is_bind_c) && c->ts.type == BT_CLASS)
14166     {
14167       gfc_error ("Polymorphic component %s at %L in SEQUENCE or BIND(C) "
14168                  "type %s", c->name, &c->loc, sym->name);
14169       return false;
14170     }
14171
14172   if (sym->attr.sequence)
14173     {
14174       if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.sequence == 0)
14175         {
14176           gfc_error ("Component %s of SEQUENCE type declared at %L does "
14177                      "not have the SEQUENCE attribute",
14178                      c->ts.u.derived->name, &sym->declared_at);
14179           return false;
14180         }
14181     }
14182
14183   if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.generic)
14184     c->ts.u.derived = gfc_find_dt_in_generic (c->ts.u.derived);
14185   else if (c->ts.type == BT_CLASS && c->attr.class_ok
14186            && CLASS_DATA (c)->ts.u.derived->attr.generic)
14187     CLASS_DATA (c)->ts.u.derived
14188                     = gfc_find_dt_in_generic (CLASS_DATA (c)->ts.u.derived);
14189
14190   /* If an allocatable component derived type is of the same type as
14191      the enclosing derived type, we need a vtable generating so that
14192      the __deallocate procedure is created.  */
14193   if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
14194        && c->ts.u.derived == sym && c->attr.allocatable == 1)
14195     gfc_find_vtab (&c->ts);
14196
14197   /* Ensure that all the derived type components are put on the
14198      derived type list; even in formal namespaces, where derived type
14199      pointer components might not have been declared.  */
14200   if (c->ts.type == BT_DERIVED
14201         && c->ts.u.derived
14202         && c->ts.u.derived->components
14203         && c->attr.pointer
14204         && sym != c->ts.u.derived)
14205     add_dt_to_dt_list (c->ts.u.derived);
14206
14207   if (!gfc_resolve_array_spec (c->as,
14208                                !(c->attr.pointer || c->attr.proc_pointer
14209                                  || c->attr.allocatable)))
14210     return false;
14211
14212   if (c->initializer && !sym->attr.vtype
14213       && !c->attr.pdt_kind && !c->attr.pdt_len
14214       && !gfc_check_assign_symbol (sym, c, c->initializer))
14215     return false;
14216
14217   return true;
14218 }
14219
14220
14221 /* Be nice about the locus for a structure expression - show the locus of the
14222    first non-null sub-expression if we can.  */
14223
14224 static locus *
14225 cons_where (gfc_expr *struct_expr)
14226 {
14227   gfc_constructor *cons;
14228
14229   gcc_assert (struct_expr && struct_expr->expr_type == EXPR_STRUCTURE);
14230
14231   cons = gfc_constructor_first (struct_expr->value.constructor);
14232   for (; cons; cons = gfc_constructor_next (cons))
14233     {
14234       if (cons->expr && cons->expr->expr_type != EXPR_NULL)
14235         return &cons->expr->where;
14236     }
14237
14238   return &struct_expr->where;
14239 }
14240
14241 /* Resolve the components of a structure type. Much less work than derived
14242    types.  */
14243
14244 static bool
14245 resolve_fl_struct (gfc_symbol *sym)
14246 {
14247   gfc_component *c;
14248   gfc_expr *init = NULL;
14249   bool success;
14250
14251   /* Make sure UNIONs do not have overlapping initializers.  */
14252   if (sym->attr.flavor == FL_UNION)
14253     {
14254       for (c = sym->components; c; c = c->next)
14255         {
14256           if (init && c->initializer)
14257             {
14258               gfc_error ("Conflicting initializers in union at %L and %L",
14259                          cons_where (init), cons_where (c->initializer));
14260               gfc_free_expr (c->initializer);
14261               c->initializer = NULL;
14262             }
14263           if (init == NULL)
14264             init = c->initializer;
14265         }
14266     }
14267
14268   success = true;
14269   for (c = sym->components; c; c = c->next)
14270     if (!resolve_component (c, sym))
14271       success = false;
14272
14273   if (!success)
14274     return false;
14275
14276   if (sym->components)
14277     add_dt_to_dt_list (sym);
14278
14279   return true;
14280 }
14281
14282
14283 /* Resolve the components of a derived type. This does not have to wait until
14284    resolution stage, but can be done as soon as the dt declaration has been
14285    parsed.  */
14286
14287 static bool
14288 resolve_fl_derived0 (gfc_symbol *sym)
14289 {
14290   gfc_symbol* super_type;
14291   gfc_component *c;
14292   gfc_formal_arglist *f;
14293   bool success;
14294
14295   if (sym->attr.unlimited_polymorphic)
14296     return true;
14297
14298   super_type = gfc_get_derived_super_type (sym);
14299
14300   /* F2008, C432.  */
14301   if (super_type && sym->attr.coarray_comp && !super_type->attr.coarray_comp)
14302     {
14303       gfc_error ("As extending type %qs at %L has a coarray component, "
14304                  "parent type %qs shall also have one", sym->name,
14305                  &sym->declared_at, super_type->name);
14306       return false;
14307     }
14308
14309   /* Ensure the extended type gets resolved before we do.  */
14310   if (super_type && !resolve_fl_derived0 (super_type))
14311     return false;
14312
14313   /* An ABSTRACT type must be extensible.  */
14314   if (sym->attr.abstract && !gfc_type_is_extensible (sym))
14315     {
14316       gfc_error ("Non-extensible derived-type %qs at %L must not be ABSTRACT",
14317                  sym->name, &sym->declared_at);
14318       return false;
14319     }
14320
14321   c = (sym->attr.is_class) ? sym->components->ts.u.derived->components
14322                            : sym->components;
14323
14324   success = true;
14325   for ( ; c != NULL; c = c->next)
14326     if (!resolve_component (c, sym))
14327       success = false;
14328
14329   if (!success)
14330     return false;
14331
14332   /* Now add the caf token field, where needed.  */
14333   if (flag_coarray != GFC_FCOARRAY_NONE
14334       && !sym->attr.is_class && !sym->attr.vtype)
14335     {
14336       for (c = sym->components; c; c = c->next)
14337         if (!c->attr.dimension && !c->attr.codimension
14338             && (c->attr.allocatable || c->attr.pointer))
14339           {
14340             char name[GFC_MAX_SYMBOL_LEN+9];
14341             gfc_component *token;
14342             sprintf (name, "_caf_%s", c->name);
14343             token = gfc_find_component (sym, name, true, true, NULL);
14344             if (token == NULL)
14345               {
14346                 if (!gfc_add_component (sym, name, &token))
14347                   return false;
14348                 token->ts.type = BT_VOID;
14349                 token->ts.kind = gfc_default_integer_kind;
14350                 token->attr.access = ACCESS_PRIVATE;
14351                 token->attr.artificial = 1;
14352                 token->attr.caf_token = 1;
14353               }
14354           }
14355     }
14356
14357   check_defined_assignments (sym);
14358
14359   if (!sym->attr.defined_assign_comp && super_type)
14360     sym->attr.defined_assign_comp
14361                         = super_type->attr.defined_assign_comp;
14362
14363   /* If this is a non-ABSTRACT type extending an ABSTRACT one, ensure that
14364      all DEFERRED bindings are overridden.  */
14365   if (super_type && super_type->attr.abstract && !sym->attr.abstract
14366       && !sym->attr.is_class
14367       && !ensure_not_abstract (sym, super_type))
14368     return false;
14369
14370   /* Check that there is a component for every PDT parameter.  */
14371   if (sym->attr.pdt_template)
14372     {
14373       for (f = sym->formal; f; f = f->next)
14374         {
14375           if (!f->sym)
14376             continue;
14377           c = gfc_find_component (sym, f->sym->name, true, true, NULL);
14378           if (c == NULL)
14379             {
14380               gfc_error ("Parameterized type %qs does not have a component "
14381                          "corresponding to parameter %qs at %L", sym->name,
14382                          f->sym->name, &sym->declared_at);
14383               break;
14384             }
14385         }
14386     }
14387
14388   /* Add derived type to the derived type list.  */
14389   add_dt_to_dt_list (sym);
14390
14391   return true;
14392 }
14393
14394
14395 /* The following procedure does the full resolution of a derived type,
14396    including resolution of all type-bound procedures (if present). In contrast
14397    to 'resolve_fl_derived0' this can only be done after the module has been
14398    parsed completely.  */
14399
14400 static bool
14401 resolve_fl_derived (gfc_symbol *sym)
14402 {
14403   gfc_symbol *gen_dt = NULL;
14404
14405   if (sym->attr.unlimited_polymorphic)
14406     return true;
14407
14408   if (!sym->attr.is_class)
14409     gfc_find_symbol (sym->name, sym->ns, 0, &gen_dt);
14410   if (gen_dt && gen_dt->generic && gen_dt->generic->next
14411       && (!gen_dt->generic->sym->attr.use_assoc
14412           || gen_dt->generic->sym->module != gen_dt->generic->next->sym->module)
14413       && !gfc_notify_std (GFC_STD_F2003, "Generic name %qs of function "
14414                           "%qs at %L being the same name as derived "
14415                           "type at %L", sym->name,
14416                           gen_dt->generic->sym == sym
14417                           ? gen_dt->generic->next->sym->name
14418                           : gen_dt->generic->sym->name,
14419                           gen_dt->generic->sym == sym
14420                           ? &gen_dt->generic->next->sym->declared_at
14421                           : &gen_dt->generic->sym->declared_at,
14422                           &sym->declared_at))
14423     return false;
14424
14425   if (sym->components == NULL && !sym->attr.zero_comp && !sym->attr.use_assoc)
14426     {
14427       gfc_error ("Derived type %qs at %L has not been declared",
14428                   sym->name, &sym->declared_at);
14429       return false;
14430     }
14431
14432   /* Resolve the finalizer procedures.  */
14433   if (!gfc_resolve_finalizers (sym, NULL))
14434     return false;
14435
14436   if (sym->attr.is_class && sym->ts.u.derived == NULL)
14437     {
14438       /* Fix up incomplete CLASS symbols.  */
14439       gfc_component *data = gfc_find_component (sym, "_data", true, true, NULL);
14440       gfc_component *vptr = gfc_find_component (sym, "_vptr", true, true, NULL);
14441
14442       /* Nothing more to do for unlimited polymorphic entities.  */
14443       if (data->ts.u.derived->attr.unlimited_polymorphic)
14444         return true;
14445       else if (vptr->ts.u.derived == NULL)
14446         {
14447           gfc_symbol *vtab = gfc_find_derived_vtab (data->ts.u.derived);
14448           gcc_assert (vtab);
14449           vptr->ts.u.derived = vtab->ts.u.derived;
14450           if (!resolve_fl_derived0 (vptr->ts.u.derived))
14451             return false;
14452         }
14453     }
14454
14455   if (!resolve_fl_derived0 (sym))
14456     return false;
14457
14458   /* Resolve the type-bound procedures.  */
14459   if (!resolve_typebound_procedures (sym))
14460     return false;
14461
14462   /* Generate module vtables subject to their accessibility and their not
14463      being vtables or pdt templates. If this is not done class declarations
14464      in external procedures wind up with their own version and so SELECT TYPE
14465      fails because the vptrs do not have the same address.  */
14466   if (gfc_option.allow_std & GFC_STD_F2003
14467       && sym->ns->proc_name
14468       && sym->ns->proc_name->attr.flavor == FL_MODULE
14469       && sym->attr.access != ACCESS_PRIVATE
14470       && !(sym->attr.use_assoc || sym->attr.vtype || sym->attr.pdt_template))
14471     {
14472       gfc_symbol *vtab = gfc_find_derived_vtab (sym);
14473       gfc_set_sym_referenced (vtab);
14474     }
14475
14476   return true;
14477 }
14478
14479
14480 static bool
14481 resolve_fl_namelist (gfc_symbol *sym)
14482 {
14483   gfc_namelist *nl;
14484   gfc_symbol *nlsym;
14485
14486   for (nl = sym->namelist; nl; nl = nl->next)
14487     {
14488       /* Check again, the check in match only works if NAMELIST comes
14489          after the decl.  */
14490       if (nl->sym->as && nl->sym->as->type == AS_ASSUMED_SIZE)
14491         {
14492           gfc_error ("Assumed size array %qs in namelist %qs at %L is not "
14493                      "allowed", nl->sym->name, sym->name, &sym->declared_at);
14494           return false;
14495         }
14496
14497       if (nl->sym->as && nl->sym->as->type == AS_ASSUMED_SHAPE
14498           && !gfc_notify_std (GFC_STD_F2003, "NAMELIST array object %qs "
14499                               "with assumed shape in namelist %qs at %L",
14500                               nl->sym->name, sym->name, &sym->declared_at))
14501         return false;
14502
14503       if (is_non_constant_shape_array (nl->sym)
14504           && !gfc_notify_std (GFC_STD_F2003, "NAMELIST array object %qs "
14505                               "with nonconstant shape in namelist %qs at %L",
14506                               nl->sym->name, sym->name, &sym->declared_at))
14507         return false;
14508
14509       if (nl->sym->ts.type == BT_CHARACTER
14510           && (nl->sym->ts.u.cl->length == NULL
14511               || !gfc_is_constant_expr (nl->sym->ts.u.cl->length))
14512           && !gfc_notify_std (GFC_STD_F2003, "NAMELIST object %qs with "
14513                               "nonconstant character length in "
14514                               "namelist %qs at %L", nl->sym->name,
14515                               sym->name, &sym->declared_at))
14516         return false;
14517
14518     }
14519
14520   /* Reject PRIVATE objects in a PUBLIC namelist.  */
14521   if (gfc_check_symbol_access (sym))
14522     {
14523       for (nl = sym->namelist; nl; nl = nl->next)
14524         {
14525           if (!nl->sym->attr.use_assoc
14526               && !is_sym_host_assoc (nl->sym, sym->ns)
14527               && !gfc_check_symbol_access (nl->sym))
14528             {
14529               gfc_error ("NAMELIST object %qs was declared PRIVATE and "
14530                          "cannot be member of PUBLIC namelist %qs at %L",
14531                          nl->sym->name, sym->name, &sym->declared_at);
14532               return false;
14533             }
14534
14535           if (nl->sym->ts.type == BT_DERIVED
14536              && (nl->sym->ts.u.derived->attr.alloc_comp
14537                  || nl->sym->ts.u.derived->attr.pointer_comp))
14538            {
14539              if (!gfc_notify_std (GFC_STD_F2003, "NAMELIST object %qs in "
14540                                   "namelist %qs at %L with ALLOCATABLE "
14541                                   "or POINTER components", nl->sym->name,
14542                                   sym->name, &sym->declared_at))
14543                return false;
14544              return true;
14545            }
14546
14547           /* Types with private components that came here by USE-association.  */
14548           if (nl->sym->ts.type == BT_DERIVED
14549               && derived_inaccessible (nl->sym->ts.u.derived))
14550             {
14551               gfc_error ("NAMELIST object %qs has use-associated PRIVATE "
14552                          "components and cannot be member of namelist %qs at %L",
14553                          nl->sym->name, sym->name, &sym->declared_at);
14554               return false;
14555             }
14556
14557           /* Types with private components that are defined in the same module.  */
14558           if (nl->sym->ts.type == BT_DERIVED
14559               && !is_sym_host_assoc (nl->sym->ts.u.derived, sym->ns)
14560               && nl->sym->ts.u.derived->attr.private_comp)
14561             {
14562               gfc_error ("NAMELIST object %qs has PRIVATE components and "
14563                          "cannot be a member of PUBLIC namelist %qs at %L",
14564                          nl->sym->name, sym->name, &sym->declared_at);
14565               return false;
14566             }
14567         }
14568     }
14569
14570
14571   /* 14.1.2 A module or internal procedure represent local entities
14572      of the same type as a namelist member and so are not allowed.  */
14573   for (nl = sym->namelist; nl; nl = nl->next)
14574     {
14575       if (nl->sym->ts.kind != 0 && nl->sym->attr.flavor == FL_VARIABLE)
14576         continue;
14577
14578       if (nl->sym->attr.function && nl->sym == nl->sym->result)
14579         if ((nl->sym == sym->ns->proc_name)
14580                ||
14581             (sym->ns->parent && nl->sym == sym->ns->parent->proc_name))
14582           continue;
14583
14584       nlsym = NULL;
14585       if (nl->sym->name)
14586         gfc_find_symbol (nl->sym->name, sym->ns, 1, &nlsym);
14587       if (nlsym && nlsym->attr.flavor == FL_PROCEDURE)
14588         {
14589           gfc_error ("PROCEDURE attribute conflicts with NAMELIST "
14590                      "attribute in %qs at %L", nlsym->name,
14591                      &sym->declared_at);
14592           return false;
14593         }
14594     }
14595
14596   if (async_io_dt)
14597     {
14598       for (nl = sym->namelist; nl; nl = nl->next)
14599         nl->sym->attr.asynchronous = 1;
14600     }
14601   return true;
14602 }
14603
14604
14605 static bool
14606 resolve_fl_parameter (gfc_symbol *sym)
14607 {
14608   /* A parameter array's shape needs to be constant.  */
14609   if (sym->as != NULL
14610       && (sym->as->type == AS_DEFERRED
14611           || is_non_constant_shape_array (sym)))
14612     {
14613       gfc_error ("Parameter array %qs at %L cannot be automatic "
14614                  "or of deferred shape", sym->name, &sym->declared_at);
14615       return false;
14616     }
14617
14618   /* Constraints on deferred type parameter.  */
14619   if (!deferred_requirements (sym))
14620     return false;
14621
14622   /* Make sure a parameter that has been implicitly typed still
14623      matches the implicit type, since PARAMETER statements can precede
14624      IMPLICIT statements.  */
14625   if (sym->attr.implicit_type
14626       && !gfc_compare_types (&sym->ts, gfc_get_default_type (sym->name,
14627                                                              sym->ns)))
14628     {
14629       gfc_error ("Implicitly typed PARAMETER %qs at %L doesn't match a "
14630                  "later IMPLICIT type", sym->name, &sym->declared_at);
14631       return false;
14632     }
14633
14634   /* Make sure the types of derived parameters are consistent.  This
14635      type checking is deferred until resolution because the type may
14636      refer to a derived type from the host.  */
14637   if (sym->ts.type == BT_DERIVED
14638       && !gfc_compare_types (&sym->ts, &sym->value->ts))
14639     {
14640       gfc_error ("Incompatible derived type in PARAMETER at %L",
14641                  &sym->value->where);
14642       return false;
14643     }
14644
14645   /* F03:C509,C514.  */
14646   if (sym->ts.type == BT_CLASS)
14647     {
14648       gfc_error ("CLASS variable %qs at %L cannot have the PARAMETER attribute",
14649                  sym->name, &sym->declared_at);
14650       return false;
14651     }
14652
14653   return true;
14654 }
14655
14656
14657 /* Called by resolve_symbol to check PDTs.  */
14658
14659 static void
14660 resolve_pdt (gfc_symbol* sym)
14661 {
14662   gfc_symbol *derived = NULL;
14663   gfc_actual_arglist *param;
14664   gfc_component *c;
14665   bool const_len_exprs = true;
14666   bool assumed_len_exprs = false;
14667   symbol_attribute *attr;
14668
14669   if (sym->ts.type == BT_DERIVED)
14670     {
14671       derived = sym->ts.u.derived;
14672       attr = &(sym->attr);
14673     }
14674   else if (sym->ts.type == BT_CLASS)
14675     {
14676       derived = CLASS_DATA (sym)->ts.u.derived;
14677       attr = &(CLASS_DATA (sym)->attr);
14678     }
14679   else
14680     gcc_unreachable ();
14681
14682   gcc_assert (derived->attr.pdt_type);
14683
14684   for (param = sym->param_list; param; param = param->next)
14685     {
14686       c = gfc_find_component (derived, param->name, false, true, NULL);
14687       gcc_assert (c);
14688       if (c->attr.pdt_kind)
14689         continue;
14690
14691       if (param->expr && !gfc_is_constant_expr (param->expr)
14692           && c->attr.pdt_len)
14693         const_len_exprs = false;
14694       else if (param->spec_type == SPEC_ASSUMED)
14695         assumed_len_exprs = true;
14696
14697       if (param->spec_type == SPEC_DEFERRED
14698           && !attr->allocatable && !attr->pointer)
14699         gfc_error ("The object %qs at %L has a deferred LEN "
14700                    "parameter %qs and is neither allocatable "
14701                    "nor a pointer", sym->name, &sym->declared_at,
14702                    param->name);
14703
14704     }
14705
14706   if (!const_len_exprs
14707       && (sym->ns->proc_name->attr.is_main_program
14708           || sym->ns->proc_name->attr.flavor == FL_MODULE
14709           || sym->attr.save != SAVE_NONE))
14710     gfc_error ("The AUTOMATIC object %qs at %L must not have the "
14711                "SAVE attribute or be a variable declared in the "
14712                "main program, a module or a submodule(F08/C513)",
14713                sym->name, &sym->declared_at);
14714
14715   if (assumed_len_exprs && !(sym->attr.dummy
14716       || sym->attr.select_type_temporary || sym->attr.associate_var))
14717     gfc_error ("The object %qs at %L with ASSUMED type parameters "
14718                "must be a dummy or a SELECT TYPE selector(F08/4.2)",
14719                sym->name, &sym->declared_at);
14720 }
14721
14722
14723 /* Do anything necessary to resolve a symbol.  Right now, we just
14724    assume that an otherwise unknown symbol is a variable.  This sort
14725    of thing commonly happens for symbols in module.  */
14726
14727 static void
14728 resolve_symbol (gfc_symbol *sym)
14729 {
14730   int check_constant, mp_flag;
14731   gfc_symtree *symtree;
14732   gfc_symtree *this_symtree;
14733   gfc_namespace *ns;
14734   gfc_component *c;
14735   symbol_attribute class_attr;
14736   gfc_array_spec *as;
14737   bool saved_specification_expr;
14738
14739   if (sym->resolved)
14740     return;
14741   sym->resolved = 1;
14742
14743   /* No symbol will ever have union type; only components can be unions.
14744      Union type declaration symbols have type BT_UNKNOWN but flavor FL_UNION
14745      (just like derived type declaration symbols have flavor FL_DERIVED). */
14746   gcc_assert (sym->ts.type != BT_UNION);
14747
14748   /* Coarrayed polymorphic objects with allocatable or pointer components are
14749      yet unsupported for -fcoarray=lib.  */
14750   if (flag_coarray == GFC_FCOARRAY_LIB && sym->ts.type == BT_CLASS
14751       && sym->ts.u.derived && CLASS_DATA (sym)
14752       && CLASS_DATA (sym)->attr.codimension
14753       && (CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp
14754           || CLASS_DATA (sym)->ts.u.derived->attr.pointer_comp))
14755     {
14756       gfc_error ("Sorry, allocatable/pointer components in polymorphic (CLASS) "
14757                  "type coarrays at %L are unsupported", &sym->declared_at);
14758       return;
14759     }
14760
14761   if (sym->attr.artificial)
14762     return;
14763
14764   if (sym->attr.unlimited_polymorphic)
14765     return;
14766
14767   if (sym->attr.flavor == FL_UNKNOWN
14768       || (sym->attr.flavor == FL_PROCEDURE && !sym->attr.intrinsic
14769           && !sym->attr.generic && !sym->attr.external
14770           && sym->attr.if_source == IFSRC_UNKNOWN
14771           && sym->ts.type == BT_UNKNOWN))
14772     {
14773
14774     /* If we find that a flavorless symbol is an interface in one of the
14775        parent namespaces, find its symtree in this namespace, free the
14776        symbol and set the symtree to point to the interface symbol.  */
14777       for (ns = gfc_current_ns->parent; ns; ns = ns->parent)
14778         {
14779           symtree = gfc_find_symtree (ns->sym_root, sym->name);
14780           if (symtree && (symtree->n.sym->generic ||
14781                           (symtree->n.sym->attr.flavor == FL_PROCEDURE
14782                            && sym->ns->construct_entities)))
14783             {
14784               this_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
14785                                                sym->name);
14786               if (this_symtree->n.sym == sym)
14787                 {
14788                   symtree->n.sym->refs++;
14789                   gfc_release_symbol (sym);
14790                   this_symtree->n.sym = symtree->n.sym;
14791                   return;
14792                 }
14793             }
14794         }
14795
14796       /* Otherwise give it a flavor according to such attributes as
14797          it has.  */
14798       if (sym->attr.flavor == FL_UNKNOWN && sym->attr.external == 0
14799           && sym->attr.intrinsic == 0)
14800         sym->attr.flavor = FL_VARIABLE;
14801       else if (sym->attr.flavor == FL_UNKNOWN)
14802         {
14803           sym->attr.flavor = FL_PROCEDURE;
14804           if (sym->attr.dimension)
14805             sym->attr.function = 1;
14806         }
14807     }
14808
14809   if (sym->attr.external && sym->ts.type != BT_UNKNOWN && !sym->attr.function)
14810     gfc_add_function (&sym->attr, sym->name, &sym->declared_at);
14811
14812   if (sym->attr.procedure && sym->attr.if_source != IFSRC_DECL
14813       && !resolve_procedure_interface (sym))
14814     return;
14815
14816   if (sym->attr.is_protected && !sym->attr.proc_pointer
14817       && (sym->attr.procedure || sym->attr.external))
14818     {
14819       if (sym->attr.external)
14820         gfc_error ("PROTECTED attribute conflicts with EXTERNAL attribute "
14821                    "at %L", &sym->declared_at);
14822       else
14823         gfc_error ("PROCEDURE attribute conflicts with PROTECTED attribute "
14824                    "at %L", &sym->declared_at);
14825
14826       return;
14827     }
14828
14829   if (sym->attr.flavor == FL_DERIVED && !resolve_fl_derived (sym))
14830     return;
14831
14832   else if ((sym->attr.flavor == FL_STRUCT || sym->attr.flavor == FL_UNION)
14833            && !resolve_fl_struct (sym))
14834     return;
14835
14836   /* Symbols that are module procedures with results (functions) have
14837      the types and array specification copied for type checking in
14838      procedures that call them, as well as for saving to a module
14839      file.  These symbols can't stand the scrutiny that their results
14840      can.  */
14841   mp_flag = (sym->result != NULL && sym->result != sym);
14842
14843   /* Make sure that the intrinsic is consistent with its internal
14844      representation. This needs to be done before assigning a default
14845      type to avoid spurious warnings.  */
14846   if (sym->attr.flavor != FL_MODULE && sym->attr.intrinsic
14847       && !gfc_resolve_intrinsic (sym, &sym->declared_at))
14848     return;
14849
14850   /* Resolve associate names.  */
14851   if (sym->assoc)
14852     resolve_assoc_var (sym, true);
14853
14854   /* Assign default type to symbols that need one and don't have one.  */
14855   if (sym->ts.type == BT_UNKNOWN)
14856     {
14857       if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER)
14858         {
14859           gfc_set_default_type (sym, 1, NULL);
14860         }
14861
14862       if (sym->attr.flavor == FL_PROCEDURE && sym->attr.external
14863           && !sym->attr.function && !sym->attr.subroutine
14864           && gfc_get_default_type (sym->name, sym->ns)->type == BT_UNKNOWN)
14865         gfc_add_subroutine (&sym->attr, sym->name, &sym->declared_at);
14866
14867       if (sym->attr.flavor == FL_PROCEDURE && sym->attr.function)
14868         {
14869           /* The specific case of an external procedure should emit an error
14870              in the case that there is no implicit type.  */
14871           if (!mp_flag)
14872             {
14873               if (!sym->attr.mixed_entry_master)
14874                 gfc_set_default_type (sym, sym->attr.external, NULL);
14875             }
14876           else
14877             {
14878               /* Result may be in another namespace.  */
14879               resolve_symbol (sym->result);
14880
14881               if (!sym->result->attr.proc_pointer)
14882                 {
14883                   sym->ts = sym->result->ts;
14884                   sym->as = gfc_copy_array_spec (sym->result->as);
14885                   sym->attr.dimension = sym->result->attr.dimension;
14886                   sym->attr.pointer = sym->result->attr.pointer;
14887                   sym->attr.allocatable = sym->result->attr.allocatable;
14888                   sym->attr.contiguous = sym->result->attr.contiguous;
14889                 }
14890             }
14891         }
14892     }
14893   else if (mp_flag && sym->attr.flavor == FL_PROCEDURE && sym->attr.function)
14894     {
14895       bool saved_specification_expr = specification_expr;
14896       specification_expr = true;
14897       gfc_resolve_array_spec (sym->result->as, false);
14898       specification_expr = saved_specification_expr;
14899     }
14900
14901   if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
14902     {
14903       as = CLASS_DATA (sym)->as;
14904       class_attr = CLASS_DATA (sym)->attr;
14905       class_attr.pointer = class_attr.class_pointer;
14906     }
14907   else
14908     {
14909       class_attr = sym->attr;
14910       as = sym->as;
14911     }
14912
14913   /* F2008, C530.  */
14914   if (sym->attr.contiguous
14915       && (!class_attr.dimension
14916           || (as->type != AS_ASSUMED_SHAPE && as->type != AS_ASSUMED_RANK
14917               && !class_attr.pointer)))
14918     {
14919       gfc_error ("%qs at %L has the CONTIGUOUS attribute but is not an "
14920                  "array pointer or an assumed-shape or assumed-rank array",
14921                  sym->name, &sym->declared_at);
14922       return;
14923     }
14924
14925   /* Assumed size arrays and assumed shape arrays must be dummy
14926      arguments.  Array-spec's of implied-shape should have been resolved to
14927      AS_EXPLICIT already.  */
14928
14929   if (as)
14930     {
14931       /* If AS_IMPLIED_SHAPE makes it to here, it must be a bad
14932          specification expression.  */
14933       if (as->type == AS_IMPLIED_SHAPE)
14934         {
14935           int i;
14936           for (i=0; i<as->rank; i++)
14937             {
14938               if (as->lower[i] != NULL && as->upper[i] == NULL)
14939                 {
14940                   gfc_error ("Bad specification for assumed size array at %L",
14941                              &as->lower[i]->where);
14942                   return;
14943                 }
14944             }
14945           gcc_unreachable();
14946         }
14947
14948       if (((as->type == AS_ASSUMED_SIZE && !as->cp_was_assumed)
14949            || as->type == AS_ASSUMED_SHAPE)
14950           && !sym->attr.dummy && !sym->attr.select_type_temporary)
14951         {
14952           if (as->type == AS_ASSUMED_SIZE)
14953             gfc_error ("Assumed size array at %L must be a dummy argument",
14954                        &sym->declared_at);
14955           else
14956             gfc_error ("Assumed shape array at %L must be a dummy argument",
14957                        &sym->declared_at);
14958           return;
14959         }
14960       /* TS 29113, C535a.  */
14961       if (as->type == AS_ASSUMED_RANK && !sym->attr.dummy
14962           && !sym->attr.select_type_temporary)
14963         {
14964           gfc_error ("Assumed-rank array at %L must be a dummy argument",
14965                      &sym->declared_at);
14966           return;
14967         }
14968       if (as->type == AS_ASSUMED_RANK
14969           && (sym->attr.codimension || sym->attr.value))
14970         {
14971           gfc_error ("Assumed-rank array at %L may not have the VALUE or "
14972                      "CODIMENSION attribute", &sym->declared_at);
14973           return;
14974         }
14975     }
14976
14977   /* Make sure symbols with known intent or optional are really dummy
14978      variable.  Because of ENTRY statement, this has to be deferred
14979      until resolution time.  */
14980
14981   if (!sym->attr.dummy
14982       && (sym->attr.optional || sym->attr.intent != INTENT_UNKNOWN))
14983     {
14984       gfc_error ("Symbol at %L is not a DUMMY variable", &sym->declared_at);
14985       return;
14986     }
14987
14988   if (sym->attr.value && !sym->attr.dummy)
14989     {
14990       gfc_error ("%qs at %L cannot have the VALUE attribute because "
14991                  "it is not a dummy argument", sym->name, &sym->declared_at);
14992       return;
14993     }
14994
14995   if (sym->attr.value && sym->ts.type == BT_CHARACTER)
14996     {
14997       gfc_charlen *cl = sym->ts.u.cl;
14998       if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
14999         {
15000           gfc_error ("Character dummy variable %qs at %L with VALUE "
15001                      "attribute must have constant length",
15002                      sym->name, &sym->declared_at);
15003           return;
15004         }
15005
15006       if (sym->ts.is_c_interop
15007           && mpz_cmp_si (cl->length->value.integer, 1) != 0)
15008         {
15009           gfc_error ("C interoperable character dummy variable %qs at %L "
15010                      "with VALUE attribute must have length one",
15011                      sym->name, &sym->declared_at);
15012           return;
15013         }
15014     }
15015
15016   if (sym->ts.type == BT_DERIVED && !sym->attr.is_iso_c
15017       && sym->ts.u.derived->attr.generic)
15018     {
15019       sym->ts.u.derived = gfc_find_dt_in_generic (sym->ts.u.derived);
15020       if (!sym->ts.u.derived)
15021         {
15022           gfc_error ("The derived type %qs at %L is of type %qs, "
15023                      "which has not been defined", sym->name,
15024                      &sym->declared_at, sym->ts.u.derived->name);
15025           sym->ts.type = BT_UNKNOWN;
15026           return;
15027         }
15028     }
15029
15030     /* Use the same constraints as TYPE(*), except for the type check
15031        and that only scalars and assumed-size arrays are permitted.  */
15032     if (sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
15033       {
15034         if (!sym->attr.dummy)
15035           {
15036             gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall be "
15037                        "a dummy argument", sym->name, &sym->declared_at);
15038             return;
15039           }
15040
15041         if (sym->ts.type != BT_ASSUMED && sym->ts.type != BT_INTEGER
15042             && sym->ts.type != BT_REAL && sym->ts.type != BT_LOGICAL
15043             && sym->ts.type != BT_COMPLEX)
15044           {
15045             gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall be "
15046                        "of type TYPE(*) or of an numeric intrinsic type",
15047                        sym->name, &sym->declared_at);
15048             return;
15049           }
15050
15051       if (sym->attr.allocatable || sym->attr.codimension
15052           || sym->attr.pointer || sym->attr.value)
15053         {
15054           gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute may not "
15055                      "have the ALLOCATABLE, CODIMENSION, POINTER or VALUE "
15056                      "attribute", sym->name, &sym->declared_at);
15057           return;
15058         }
15059
15060       if (sym->attr.intent == INTENT_OUT)
15061         {
15062           gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute may not "
15063                      "have the INTENT(OUT) attribute",
15064                      sym->name, &sym->declared_at);
15065           return;
15066         }
15067       if (sym->attr.dimension && sym->as->type != AS_ASSUMED_SIZE)
15068         {
15069           gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall "
15070                      "either be a scalar or an assumed-size array",
15071                      sym->name, &sym->declared_at);
15072           return;
15073         }
15074
15075       /* Set the type to TYPE(*) and add a dimension(*) to ensure
15076          NO_ARG_CHECK is correctly handled in trans*.c, e.g. with
15077          packing.  */
15078       sym->ts.type = BT_ASSUMED;
15079       sym->as = gfc_get_array_spec ();
15080       sym->as->type = AS_ASSUMED_SIZE;
15081       sym->as->rank = 1;
15082       sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
15083     }
15084   else if (sym->ts.type == BT_ASSUMED)
15085     {
15086       /* TS 29113, C407a.  */
15087       if (!sym->attr.dummy)
15088         {
15089           gfc_error ("Assumed type of variable %s at %L is only permitted "
15090                      "for dummy variables", sym->name, &sym->declared_at);
15091           return;
15092         }
15093       if (sym->attr.allocatable || sym->attr.codimension
15094           || sym->attr.pointer || sym->attr.value)
15095         {
15096           gfc_error ("Assumed-type variable %s at %L may not have the "
15097                      "ALLOCATABLE, CODIMENSION, POINTER or VALUE attribute",
15098                      sym->name, &sym->declared_at);
15099           return;
15100         }
15101       if (sym->attr.intent == INTENT_OUT)
15102         {
15103           gfc_error ("Assumed-type variable %s at %L may not have the "
15104                      "INTENT(OUT) attribute",
15105                      sym->name, &sym->declared_at);
15106           return;
15107         }
15108       if (sym->attr.dimension && sym->as->type == AS_EXPLICIT)
15109         {
15110           gfc_error ("Assumed-type variable %s at %L shall not be an "
15111                      "explicit-shape array", sym->name, &sym->declared_at);
15112           return;
15113         }
15114     }
15115
15116   /* If the symbol is marked as bind(c), that it is declared at module level
15117      scope and verify its type and kind.  Do not do the latter for symbols
15118      that are implicitly typed because that is handled in
15119      gfc_set_default_type.  Handle dummy arguments and procedure definitions
15120      separately.  Also, anything that is use associated is not handled here
15121      but instead is handled in the module it is declared in.  Finally, derived
15122      type definitions are allowed to be BIND(C) since that only implies that
15123      they're interoperable, and they are checked fully for interoperability
15124      when a variable is declared of that type.  */
15125   if (sym->attr.is_bind_c && sym->attr.use_assoc == 0
15126       && sym->attr.dummy == 0 && sym->attr.flavor != FL_PROCEDURE
15127       && sym->attr.flavor != FL_DERIVED)
15128     {
15129       bool t = true;
15130
15131       /* First, make sure the variable is declared at the
15132          module-level scope (J3/04-007, Section 15.3).  */
15133       if (sym->ns->proc_name->attr.flavor != FL_MODULE &&
15134           sym->attr.in_common == 0)
15135         {
15136           gfc_error ("Variable %qs at %L cannot be BIND(C) because it "
15137                      "is neither a COMMON block nor declared at the "
15138                      "module level scope", sym->name, &(sym->declared_at));
15139           t = false;
15140         }
15141       else if (sym->ts.type == BT_CHARACTER
15142                && (sym->ts.u.cl == NULL || sym->ts.u.cl->length == NULL
15143                    || !gfc_is_constant_expr (sym->ts.u.cl->length)
15144                    || mpz_cmp_si (sym->ts.u.cl->length->value.integer, 1) != 0))
15145         {
15146           gfc_error ("BIND(C) Variable %qs at %L must have length one",
15147                      sym->name, &sym->declared_at);
15148           t = false;
15149         }
15150       else if (sym->common_head != NULL && sym->attr.implicit_type == 0)
15151         {
15152           t = verify_com_block_vars_c_interop (sym->common_head);
15153         }
15154       else if (sym->attr.implicit_type == 0)
15155         {
15156           /* If type() declaration, we need to verify that the components
15157              of the given type are all C interoperable, etc.  */
15158           if (sym->ts.type == BT_DERIVED &&
15159               sym->ts.u.derived->attr.is_c_interop != 1)
15160             {
15161               /* Make sure the user marked the derived type as BIND(C).  If
15162                  not, call the verify routine.  This could print an error
15163                  for the derived type more than once if multiple variables
15164                  of that type are declared.  */
15165               if (sym->ts.u.derived->attr.is_bind_c != 1)
15166                 verify_bind_c_derived_type (sym->ts.u.derived);
15167               t = false;
15168             }
15169
15170           /* Verify the variable itself as C interoperable if it
15171              is BIND(C).  It is not possible for this to succeed if
15172              the verify_bind_c_derived_type failed, so don't have to handle
15173              any error returned by verify_bind_c_derived_type.  */
15174           t = verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
15175                                  sym->common_block);
15176         }
15177
15178       if (!t)
15179         {
15180           /* clear the is_bind_c flag to prevent reporting errors more than
15181              once if something failed.  */
15182           sym->attr.is_bind_c = 0;
15183           return;
15184         }
15185     }
15186
15187   /* If a derived type symbol has reached this point, without its
15188      type being declared, we have an error.  Notice that most
15189      conditions that produce undefined derived types have already
15190      been dealt with.  However, the likes of:
15191      implicit type(t) (t) ..... call foo (t) will get us here if
15192      the type is not declared in the scope of the implicit
15193      statement. Change the type to BT_UNKNOWN, both because it is so
15194      and to prevent an ICE.  */
15195   if (sym->ts.type == BT_DERIVED && !sym->attr.is_iso_c
15196       && sym->ts.u.derived->components == NULL
15197       && !sym->ts.u.derived->attr.zero_comp)
15198     {
15199       gfc_error ("The derived type %qs at %L is of type %qs, "
15200                  "which has not been defined", sym->name,
15201                   &sym->declared_at, sym->ts.u.derived->name);
15202       sym->ts.type = BT_UNKNOWN;
15203       return;
15204     }
15205
15206   /* Make sure that the derived type has been resolved and that the
15207      derived type is visible in the symbol's namespace, if it is a
15208      module function and is not PRIVATE.  */
15209   if (sym->ts.type == BT_DERIVED
15210         && sym->ts.u.derived->attr.use_assoc
15211         && sym->ns->proc_name
15212         && sym->ns->proc_name->attr.flavor == FL_MODULE
15213         && !resolve_fl_derived (sym->ts.u.derived))
15214     return;
15215
15216   /* Unless the derived-type declaration is use associated, Fortran 95
15217      does not allow public entries of private derived types.
15218      See 4.4.1 (F95) and 4.5.1.1 (F2003); and related interpretation
15219      161 in 95-006r3.  */
15220   if (sym->ts.type == BT_DERIVED
15221       && sym->ns->proc_name && sym->ns->proc_name->attr.flavor == FL_MODULE
15222       && !sym->ts.u.derived->attr.use_assoc
15223       && gfc_check_symbol_access (sym)
15224       && !gfc_check_symbol_access (sym->ts.u.derived)
15225       && !gfc_notify_std (GFC_STD_F2003, "PUBLIC %s %qs at %L of PRIVATE "
15226                           "derived type %qs",
15227                           (sym->attr.flavor == FL_PARAMETER)
15228                           ? "parameter" : "variable",
15229                           sym->name, &sym->declared_at,
15230                           sym->ts.u.derived->name))
15231     return;
15232
15233   /* F2008, C1302.  */
15234   if (sym->ts.type == BT_DERIVED
15235       && ((sym->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
15236            && sym->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
15237           || sym->ts.u.derived->attr.lock_comp)
15238       && !sym->attr.codimension && !sym->ts.u.derived->attr.coarray_comp)
15239     {
15240       gfc_error ("Variable %s at %L of type LOCK_TYPE or with subcomponent of "
15241                  "type LOCK_TYPE must be a coarray", sym->name,
15242                  &sym->declared_at);
15243       return;
15244     }
15245
15246   /* TS18508, C702/C703.  */
15247   if (sym->ts.type == BT_DERIVED
15248       && ((sym->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
15249            && sym->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
15250           || sym->ts.u.derived->attr.event_comp)
15251       && !sym->attr.codimension && !sym->ts.u.derived->attr.coarray_comp)
15252     {
15253       gfc_error ("Variable %s at %L of type EVENT_TYPE or with subcomponent of "
15254                  "type EVENT_TYPE must be a coarray", sym->name,
15255                  &sym->declared_at);
15256       return;
15257     }
15258
15259   /* An assumed-size array with INTENT(OUT) shall not be of a type for which
15260      default initialization is defined (5.1.2.4.4).  */
15261   if (sym->ts.type == BT_DERIVED
15262       && sym->attr.dummy
15263       && sym->attr.intent == INTENT_OUT
15264       && sym->as
15265       && sym->as->type == AS_ASSUMED_SIZE)
15266     {
15267       for (c = sym->ts.u.derived->components; c; c = c->next)
15268         {
15269           if (c->initializer)
15270             {
15271               gfc_error ("The INTENT(OUT) dummy argument %qs at %L is "
15272                          "ASSUMED SIZE and so cannot have a default initializer",
15273                          sym->name, &sym->declared_at);
15274               return;
15275             }
15276         }
15277     }
15278
15279   /* F2008, C542.  */
15280   if (sym->ts.type == BT_DERIVED && sym->attr.dummy
15281       && sym->attr.intent == INTENT_OUT && sym->attr.lock_comp)
15282     {
15283       gfc_error ("Dummy argument %qs at %L of LOCK_TYPE shall not be "
15284                  "INTENT(OUT)", sym->name, &sym->declared_at);
15285       return;
15286     }
15287
15288   /* TS18508.  */
15289   if (sym->ts.type == BT_DERIVED && sym->attr.dummy
15290       && sym->attr.intent == INTENT_OUT && sym->attr.event_comp)
15291     {
15292       gfc_error ("Dummy argument %qs at %L of EVENT_TYPE shall not be "
15293                  "INTENT(OUT)", sym->name, &sym->declared_at);
15294       return;
15295     }
15296
15297   /* F2008, C525.  */
15298   if ((((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.coarray_comp)
15299          || (sym->ts.type == BT_CLASS && sym->attr.class_ok
15300              && CLASS_DATA (sym)->attr.coarray_comp))
15301        || class_attr.codimension)
15302       && (sym->attr.result || sym->result == sym))
15303     {
15304       gfc_error ("Function result %qs at %L shall not be a coarray or have "
15305                  "a coarray component", sym->name, &sym->declared_at);
15306       return;
15307     }
15308
15309   /* F2008, C524.  */
15310   if (sym->attr.codimension && sym->ts.type == BT_DERIVED
15311       && sym->ts.u.derived->ts.is_iso_c)
15312     {
15313       gfc_error ("Variable %qs at %L of TYPE(C_PTR) or TYPE(C_FUNPTR) "
15314                  "shall not be a coarray", sym->name, &sym->declared_at);
15315       return;
15316     }
15317
15318   /* F2008, C525.  */
15319   if (((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.coarray_comp)
15320         || (sym->ts.type == BT_CLASS && sym->attr.class_ok
15321             && CLASS_DATA (sym)->attr.coarray_comp))
15322       && (class_attr.codimension || class_attr.pointer || class_attr.dimension
15323           || class_attr.allocatable))
15324     {
15325       gfc_error ("Variable %qs at %L with coarray component shall be a "
15326                  "nonpointer, nonallocatable scalar, which is not a coarray",
15327                  sym->name, &sym->declared_at);
15328       return;
15329     }
15330
15331   /* F2008, C526.  The function-result case was handled above.  */
15332   if (class_attr.codimension
15333       && !(class_attr.allocatable || sym->attr.dummy || sym->attr.save
15334            || sym->attr.select_type_temporary
15335            || sym->attr.associate_var
15336            || (sym->ns->save_all && !sym->attr.automatic)
15337            || sym->ns->proc_name->attr.flavor == FL_MODULE
15338            || sym->ns->proc_name->attr.is_main_program
15339            || sym->attr.function || sym->attr.result || sym->attr.use_assoc))
15340     {
15341       gfc_error ("Variable %qs at %L is a coarray and is not ALLOCATABLE, SAVE "
15342                  "nor a dummy argument", sym->name, &sym->declared_at);
15343       return;
15344     }
15345   /* F2008, C528.  */
15346   else if (class_attr.codimension && !sym->attr.select_type_temporary
15347            && !class_attr.allocatable && as && as->cotype == AS_DEFERRED)
15348     {
15349       gfc_error ("Coarray variable %qs at %L shall not have codimensions with "
15350                  "deferred shape", sym->name, &sym->declared_at);
15351       return;
15352     }
15353   else if (class_attr.codimension && class_attr.allocatable && as
15354            && (as->cotype != AS_DEFERRED || as->type != AS_DEFERRED))
15355     {
15356       gfc_error ("Allocatable coarray variable %qs at %L must have "
15357                  "deferred shape", sym->name, &sym->declared_at);
15358       return;
15359     }
15360
15361   /* F2008, C541.  */
15362   if ((((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.coarray_comp)
15363         || (sym->ts.type == BT_CLASS && sym->attr.class_ok
15364             && CLASS_DATA (sym)->attr.coarray_comp))
15365        || (class_attr.codimension && class_attr.allocatable))
15366       && sym->attr.dummy && sym->attr.intent == INTENT_OUT)
15367     {
15368       gfc_error ("Variable %qs at %L is INTENT(OUT) and can thus not be an "
15369                  "allocatable coarray or have coarray components",
15370                  sym->name, &sym->declared_at);
15371       return;
15372     }
15373
15374   if (class_attr.codimension && sym->attr.dummy
15375       && sym->ns->proc_name && sym->ns->proc_name->attr.is_bind_c)
15376     {
15377       gfc_error ("Coarray dummy variable %qs at %L not allowed in BIND(C) "
15378                  "procedure %qs", sym->name, &sym->declared_at,
15379                  sym->ns->proc_name->name);
15380       return;
15381     }
15382
15383   if (sym->ts.type == BT_LOGICAL
15384       && ((sym->attr.function && sym->attr.is_bind_c && sym->result == sym)
15385           || ((sym->attr.dummy || sym->attr.result) && sym->ns->proc_name
15386               && sym->ns->proc_name->attr.is_bind_c)))
15387     {
15388       int i;
15389       for (i = 0; gfc_logical_kinds[i].kind; i++)
15390         if (gfc_logical_kinds[i].kind == sym->ts.kind)
15391           break;
15392       if (!gfc_logical_kinds[i].c_bool && sym->attr.dummy
15393           && !gfc_notify_std (GFC_STD_GNU, "LOGICAL dummy argument %qs at "
15394                               "%L with non-C_Bool kind in BIND(C) procedure "
15395                               "%qs", sym->name, &sym->declared_at,
15396                               sym->ns->proc_name->name))
15397         return;
15398       else if (!gfc_logical_kinds[i].c_bool
15399                && !gfc_notify_std (GFC_STD_GNU, "LOGICAL result variable "
15400                                    "%qs at %L with non-C_Bool kind in "
15401                                    "BIND(C) procedure %qs", sym->name,
15402                                    &sym->declared_at,
15403                                    sym->attr.function ? sym->name
15404                                    : sym->ns->proc_name->name))
15405         return;
15406     }
15407
15408   switch (sym->attr.flavor)
15409     {
15410     case FL_VARIABLE:
15411       if (!resolve_fl_variable (sym, mp_flag))
15412         return;
15413       break;
15414
15415     case FL_PROCEDURE:
15416       if (sym->formal && !sym->formal_ns)
15417         {
15418           /* Check that none of the arguments are a namelist.  */
15419           gfc_formal_arglist *formal = sym->formal;
15420
15421           for (; formal; formal = formal->next)
15422             if (formal->sym && formal->sym->attr.flavor == FL_NAMELIST)
15423               {
15424                 gfc_error ("Namelist %qs cannot be an argument to "
15425                            "subroutine or function at %L",
15426                            formal->sym->name, &sym->declared_at);
15427                 return;
15428               }
15429         }
15430
15431       if (!resolve_fl_procedure (sym, mp_flag))
15432         return;
15433       break;
15434
15435     case FL_NAMELIST:
15436       if (!resolve_fl_namelist (sym))
15437         return;
15438       break;
15439
15440     case FL_PARAMETER:
15441       if (!resolve_fl_parameter (sym))
15442         return;
15443       break;
15444
15445     default:
15446       break;
15447     }
15448
15449   /* Resolve array specifier. Check as well some constraints
15450      on COMMON blocks.  */
15451
15452   check_constant = sym->attr.in_common && !sym->attr.pointer;
15453
15454   /* Set the formal_arg_flag so that check_conflict will not throw
15455      an error for host associated variables in the specification
15456      expression for an array_valued function.  */
15457   if ((sym->attr.function || sym->attr.result) && sym->as)
15458     formal_arg_flag = true;
15459
15460   saved_specification_expr = specification_expr;
15461   specification_expr = true;
15462   gfc_resolve_array_spec (sym->as, check_constant);
15463   specification_expr = saved_specification_expr;
15464
15465   formal_arg_flag = false;
15466
15467   /* Resolve formal namespaces.  */
15468   if (sym->formal_ns && sym->formal_ns != gfc_current_ns
15469       && !sym->attr.contained && !sym->attr.intrinsic)
15470     gfc_resolve (sym->formal_ns);
15471
15472   /* Make sure the formal namespace is present.  */
15473   if (sym->formal && !sym->formal_ns)
15474     {
15475       gfc_formal_arglist *formal = sym->formal;
15476       while (formal && !formal->sym)
15477         formal = formal->next;
15478
15479       if (formal)
15480         {
15481           sym->formal_ns = formal->sym->ns;
15482           if (sym->ns != formal->sym->ns)
15483             sym->formal_ns->refs++;
15484         }
15485     }
15486
15487   /* Check threadprivate restrictions.  */
15488   if (sym->attr.threadprivate && !sym->attr.save
15489       && !(sym->ns->save_all && !sym->attr.automatic)
15490       && (!sym->attr.in_common
15491           && sym->module == NULL
15492           && (sym->ns->proc_name == NULL
15493               || sym->ns->proc_name->attr.flavor != FL_MODULE)))
15494     gfc_error ("Threadprivate at %L isn't SAVEd", &sym->declared_at);
15495
15496   /* Check omp declare target restrictions.  */
15497   if (sym->attr.omp_declare_target
15498       && sym->attr.flavor == FL_VARIABLE
15499       && !sym->attr.save
15500       && !(sym->ns->save_all && !sym->attr.automatic)
15501       && (!sym->attr.in_common
15502           && sym->module == NULL
15503           && (sym->ns->proc_name == NULL
15504               || sym->ns->proc_name->attr.flavor != FL_MODULE)))
15505     gfc_error ("!$OMP DECLARE TARGET variable %qs at %L isn't SAVEd",
15506                sym->name, &sym->declared_at);
15507
15508   /* If we have come this far we can apply default-initializers, as
15509      described in 14.7.5, to those variables that have not already
15510      been assigned one.  */
15511   if (sym->ts.type == BT_DERIVED
15512       && !sym->value
15513       && !sym->attr.allocatable
15514       && !sym->attr.alloc_comp)
15515     {
15516       symbol_attribute *a = &sym->attr;
15517
15518       if ((!a->save && !a->dummy && !a->pointer
15519            && !a->in_common && !a->use_assoc
15520            && a->referenced
15521            && !((a->function || a->result)
15522                 && (!a->dimension
15523                     || sym->ts.u.derived->attr.alloc_comp
15524                     || sym->ts.u.derived->attr.pointer_comp))
15525            && !(a->function && sym != sym->result))
15526           || (a->dummy && a->intent == INTENT_OUT && !a->pointer))
15527         apply_default_init (sym);
15528       else if (a->function && sym->result && a->access != ACCESS_PRIVATE
15529                && (sym->ts.u.derived->attr.alloc_comp
15530                    || sym->ts.u.derived->attr.pointer_comp))
15531         /* Mark the result symbol to be referenced, when it has allocatable
15532            components.  */
15533         sym->result->attr.referenced = 1;
15534     }
15535
15536   if (sym->ts.type == BT_CLASS && sym->ns == gfc_current_ns
15537       && sym->attr.dummy && sym->attr.intent == INTENT_OUT
15538       && !CLASS_DATA (sym)->attr.class_pointer
15539       && !CLASS_DATA (sym)->attr.allocatable)
15540     apply_default_init (sym);
15541
15542   /* If this symbol has a type-spec, check it.  */
15543   if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER
15544       || (sym->attr.flavor == FL_PROCEDURE && sym->attr.function))
15545     if (!resolve_typespec_used (&sym->ts, &sym->declared_at, sym->name))
15546       return;
15547
15548   if (sym->param_list)
15549     resolve_pdt (sym);
15550 }
15551
15552
15553 /************* Resolve DATA statements *************/
15554
15555 static struct
15556 {
15557   gfc_data_value *vnode;
15558   mpz_t left;
15559 }
15560 values;
15561
15562
15563 /* Advance the values structure to point to the next value in the data list.  */
15564
15565 static bool
15566 next_data_value (void)
15567 {
15568   while (mpz_cmp_ui (values.left, 0) == 0)
15569     {
15570
15571       if (values.vnode->next == NULL)
15572         return false;
15573
15574       values.vnode = values.vnode->next;
15575       mpz_set (values.left, values.vnode->repeat);
15576     }
15577
15578   return true;
15579 }
15580
15581
15582 static bool
15583 check_data_variable (gfc_data_variable *var, locus *where)
15584 {
15585   gfc_expr *e;
15586   mpz_t size;
15587   mpz_t offset;
15588   bool t;
15589   ar_type mark = AR_UNKNOWN;
15590   int i;
15591   mpz_t section_index[GFC_MAX_DIMENSIONS];
15592   gfc_ref *ref;
15593   gfc_array_ref *ar;
15594   gfc_symbol *sym;
15595   int has_pointer;
15596
15597   if (!gfc_resolve_expr (var->expr))
15598     return false;
15599
15600   ar = NULL;
15601   mpz_init_set_si (offset, 0);
15602   e = var->expr;
15603
15604   if (e->expr_type == EXPR_FUNCTION && e->value.function.isym
15605       && e->value.function.isym->id == GFC_ISYM_CAF_GET)
15606     e = e->value.function.actual->expr;
15607
15608   if (e->expr_type != EXPR_VARIABLE)
15609     {
15610       gfc_error ("Expecting definable entity near %L", where);
15611       return false;
15612     }
15613
15614   sym = e->symtree->n.sym;
15615
15616   if (sym->ns->is_block_data && !sym->attr.in_common)
15617     {
15618       gfc_error ("BLOCK DATA element %qs at %L must be in COMMON",
15619                  sym->name, &sym->declared_at);
15620       return false;
15621     }
15622
15623   if (e->ref == NULL && sym->as)
15624     {
15625       gfc_error ("DATA array %qs at %L must be specified in a previous"
15626                  " declaration", sym->name, where);
15627       return false;
15628     }
15629
15630   has_pointer = sym->attr.pointer;
15631
15632   if (gfc_is_coindexed (e))
15633     {
15634       gfc_error ("DATA element %qs at %L cannot have a coindex", sym->name,
15635                  where);
15636       return false;
15637     }
15638
15639   for (ref = e->ref; ref; ref = ref->next)
15640     {
15641       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
15642         has_pointer = 1;
15643
15644       if (has_pointer
15645             && ref->type == REF_ARRAY
15646             && ref->u.ar.type != AR_FULL)
15647           {
15648             gfc_error ("DATA element %qs at %L is a pointer and so must "
15649                         "be a full array", sym->name, where);
15650             return false;
15651           }
15652     }
15653
15654   if (e->rank == 0 || has_pointer)
15655     {
15656       mpz_init_set_ui (size, 1);
15657       ref = NULL;
15658     }
15659   else
15660     {
15661       ref = e->ref;
15662
15663       /* Find the array section reference.  */
15664       for (ref = e->ref; ref; ref = ref->next)
15665         {
15666           if (ref->type != REF_ARRAY)
15667             continue;
15668           if (ref->u.ar.type == AR_ELEMENT)
15669             continue;
15670           break;
15671         }
15672       gcc_assert (ref);
15673
15674       /* Set marks according to the reference pattern.  */
15675       switch (ref->u.ar.type)
15676         {
15677         case AR_FULL:
15678           mark = AR_FULL;
15679           break;
15680
15681         case AR_SECTION:
15682           ar = &ref->u.ar;
15683           /* Get the start position of array section.  */
15684           gfc_get_section_index (ar, section_index, &offset);
15685           mark = AR_SECTION;
15686           break;
15687
15688         default:
15689           gcc_unreachable ();
15690         }
15691
15692       if (!gfc_array_size (e, &size))
15693         {
15694           gfc_error ("Nonconstant array section at %L in DATA statement",
15695                      where);
15696           mpz_clear (offset);
15697           return false;
15698         }
15699     }
15700
15701   t = true;
15702
15703   while (mpz_cmp_ui (size, 0) > 0)
15704     {
15705       if (!next_data_value ())
15706         {
15707           gfc_error ("DATA statement at %L has more variables than values",
15708                      where);
15709           t = false;
15710           break;
15711         }
15712
15713       t = gfc_check_assign (var->expr, values.vnode->expr, 0);
15714       if (!t)
15715         break;
15716
15717       /* If we have more than one element left in the repeat count,
15718          and we have more than one element left in the target variable,
15719          then create a range assignment.  */
15720       /* FIXME: Only done for full arrays for now, since array sections
15721          seem tricky.  */
15722       if (mark == AR_FULL && ref && ref->next == NULL
15723           && mpz_cmp_ui (values.left, 1) > 0 && mpz_cmp_ui (size, 1) > 0)
15724         {
15725           mpz_t range;
15726
15727           if (mpz_cmp (size, values.left) >= 0)
15728             {
15729               mpz_init_set (range, values.left);
15730               mpz_sub (size, size, values.left);
15731               mpz_set_ui (values.left, 0);
15732             }
15733           else
15734             {
15735               mpz_init_set (range, size);
15736               mpz_sub (values.left, values.left, size);
15737               mpz_set_ui (size, 0);
15738             }
15739
15740           t = gfc_assign_data_value (var->expr, values.vnode->expr,
15741                                      offset, &range);
15742
15743           mpz_add (offset, offset, range);
15744           mpz_clear (range);
15745
15746           if (!t)
15747             break;
15748         }
15749
15750       /* Assign initial value to symbol.  */
15751       else
15752         {
15753           mpz_sub_ui (values.left, values.left, 1);
15754           mpz_sub_ui (size, size, 1);
15755
15756           t = gfc_assign_data_value (var->expr, values.vnode->expr,
15757                                      offset, NULL);
15758           if (!t)
15759             break;
15760
15761           if (mark == AR_FULL)
15762             mpz_add_ui (offset, offset, 1);
15763
15764           /* Modify the array section indexes and recalculate the offset
15765              for next element.  */
15766           else if (mark == AR_SECTION)
15767             gfc_advance_section (section_index, ar, &offset);
15768         }
15769     }
15770
15771   if (mark == AR_SECTION)
15772     {
15773       for (i = 0; i < ar->dimen; i++)
15774         mpz_clear (section_index[i]);
15775     }
15776
15777   mpz_clear (size);
15778   mpz_clear (offset);
15779
15780   return t;
15781 }
15782
15783
15784 static bool traverse_data_var (gfc_data_variable *, locus *);
15785
15786 /* Iterate over a list of elements in a DATA statement.  */
15787
15788 static bool
15789 traverse_data_list (gfc_data_variable *var, locus *where)
15790 {
15791   mpz_t trip;
15792   iterator_stack frame;
15793   gfc_expr *e, *start, *end, *step;
15794   bool retval = true;
15795
15796   mpz_init (frame.value);
15797   mpz_init (trip);
15798
15799   start = gfc_copy_expr (var->iter.start);
15800   end = gfc_copy_expr (var->iter.end);
15801   step = gfc_copy_expr (var->iter.step);
15802
15803   if (!gfc_simplify_expr (start, 1)
15804       || start->expr_type != EXPR_CONSTANT)
15805     {
15806       gfc_error ("start of implied-do loop at %L could not be "
15807                  "simplified to a constant value", &start->where);
15808       retval = false;
15809       goto cleanup;
15810     }
15811   if (!gfc_simplify_expr (end, 1)
15812       || end->expr_type != EXPR_CONSTANT)
15813     {
15814       gfc_error ("end of implied-do loop at %L could not be "
15815                  "simplified to a constant value", &start->where);
15816       retval = false;
15817       goto cleanup;
15818     }
15819   if (!gfc_simplify_expr (step, 1)
15820       || step->expr_type != EXPR_CONSTANT)
15821     {
15822       gfc_error ("step of implied-do loop at %L could not be "
15823                  "simplified to a constant value", &start->where);
15824       retval = false;
15825       goto cleanup;
15826     }
15827
15828   mpz_set (trip, end->value.integer);
15829   mpz_sub (trip, trip, start->value.integer);
15830   mpz_add (trip, trip, step->value.integer);
15831
15832   mpz_div (trip, trip, step->value.integer);
15833
15834   mpz_set (frame.value, start->value.integer);
15835
15836   frame.prev = iter_stack;
15837   frame.variable = var->iter.var->symtree;
15838   iter_stack = &frame;
15839
15840   while (mpz_cmp_ui (trip, 0) > 0)
15841     {
15842       if (!traverse_data_var (var->list, where))
15843         {
15844           retval = false;
15845           goto cleanup;
15846         }
15847
15848       e = gfc_copy_expr (var->expr);
15849       if (!gfc_simplify_expr (e, 1))
15850         {
15851           gfc_free_expr (e);
15852           retval = false;
15853           goto cleanup;
15854         }
15855
15856       mpz_add (frame.value, frame.value, step->value.integer);
15857
15858       mpz_sub_ui (trip, trip, 1);
15859     }
15860
15861 cleanup:
15862   mpz_clear (frame.value);
15863   mpz_clear (trip);
15864
15865   gfc_free_expr (start);
15866   gfc_free_expr (end);
15867   gfc_free_expr (step);
15868
15869   iter_stack = frame.prev;
15870   return retval;
15871 }
15872
15873
15874 /* Type resolve variables in the variable list of a DATA statement.  */
15875
15876 static bool
15877 traverse_data_var (gfc_data_variable *var, locus *where)
15878 {
15879   bool t;
15880
15881   for (; var; var = var->next)
15882     {
15883       if (var->expr == NULL)
15884         t = traverse_data_list (var, where);
15885       else
15886         t = check_data_variable (var, where);
15887
15888       if (!t)
15889         return false;
15890     }
15891
15892   return true;
15893 }
15894
15895
15896 /* Resolve the expressions and iterators associated with a data statement.
15897    This is separate from the assignment checking because data lists should
15898    only be resolved once.  */
15899
15900 static bool
15901 resolve_data_variables (gfc_data_variable *d)
15902 {
15903   for (; d; d = d->next)
15904     {
15905       if (d->list == NULL)
15906         {
15907           if (!gfc_resolve_expr (d->expr))
15908             return false;
15909         }
15910       else
15911         {
15912           if (!gfc_resolve_iterator (&d->iter, false, true))
15913             return false;
15914
15915           if (!resolve_data_variables (d->list))
15916             return false;
15917         }
15918     }
15919
15920   return true;
15921 }
15922
15923
15924 /* Resolve a single DATA statement.  We implement this by storing a pointer to
15925    the value list into static variables, and then recursively traversing the
15926    variables list, expanding iterators and such.  */
15927
15928 static void
15929 resolve_data (gfc_data *d)
15930 {
15931
15932   if (!resolve_data_variables (d->var))
15933     return;
15934
15935   values.vnode = d->value;
15936   if (d->value == NULL)
15937     mpz_set_ui (values.left, 0);
15938   else
15939     mpz_set (values.left, d->value->repeat);
15940
15941   if (!traverse_data_var (d->var, &d->where))
15942     return;
15943
15944   /* At this point, we better not have any values left.  */
15945
15946   if (next_data_value ())
15947     gfc_error ("DATA statement at %L has more values than variables",
15948                &d->where);
15949 }
15950
15951
15952 /* 12.6 Constraint: In a pure subprogram any variable which is in common or
15953    accessed by host or use association, is a dummy argument to a pure function,
15954    is a dummy argument with INTENT (IN) to a pure subroutine, or an object that
15955    is storage associated with any such variable, shall not be used in the
15956    following contexts: (clients of this function).  */
15957
15958 /* Determines if a variable is not 'pure', i.e., not assignable within a pure
15959    procedure.  Returns zero if assignment is OK, nonzero if there is a
15960    problem.  */
15961 int
15962 gfc_impure_variable (gfc_symbol *sym)
15963 {
15964   gfc_symbol *proc;
15965   gfc_namespace *ns;
15966
15967   if (sym->attr.use_assoc || sym->attr.in_common)
15968     return 1;
15969
15970   /* Check if the symbol's ns is inside the pure procedure.  */
15971   for (ns = gfc_current_ns; ns; ns = ns->parent)
15972     {
15973       if (ns == sym->ns)
15974         break;
15975       if (ns->proc_name->attr.flavor == FL_PROCEDURE && !sym->attr.function)
15976         return 1;
15977     }
15978
15979   proc = sym->ns->proc_name;
15980   if (sym->attr.dummy
15981       && ((proc->attr.subroutine && sym->attr.intent == INTENT_IN)
15982           || proc->attr.function))
15983     return 1;
15984
15985   /* TODO: Sort out what can be storage associated, if anything, and include
15986      it here.  In principle equivalences should be scanned but it does not
15987      seem to be possible to storage associate an impure variable this way.  */
15988   return 0;
15989 }
15990
15991
15992 /* Test whether a symbol is pure or not.  For a NULL pointer, checks if the
15993    current namespace is inside a pure procedure.  */
15994
15995 int
15996 gfc_pure (gfc_symbol *sym)
15997 {
15998   symbol_attribute attr;
15999   gfc_namespace *ns;
16000
16001   if (sym == NULL)
16002     {
16003       /* Check if the current namespace or one of its parents
16004         belongs to a pure procedure.  */
16005       for (ns = gfc_current_ns; ns; ns = ns->parent)
16006         {
16007           sym = ns->proc_name;
16008           if (sym == NULL)
16009             return 0;
16010           attr = sym->attr;
16011           if (attr.flavor == FL_PROCEDURE && attr.pure)
16012             return 1;
16013         }
16014       return 0;
16015     }
16016
16017   attr = sym->attr;
16018
16019   return attr.flavor == FL_PROCEDURE && attr.pure;
16020 }
16021
16022
16023 /* Test whether a symbol is implicitly pure or not.  For a NULL pointer,
16024    checks if the current namespace is implicitly pure.  Note that this
16025    function returns false for a PURE procedure.  */
16026
16027 int
16028 gfc_implicit_pure (gfc_symbol *sym)
16029 {
16030   gfc_namespace *ns;
16031
16032   if (sym == NULL)
16033     {
16034       /* Check if the current procedure is implicit_pure.  Walk up
16035          the procedure list until we find a procedure.  */
16036       for (ns = gfc_current_ns; ns; ns = ns->parent)
16037         {
16038           sym = ns->proc_name;
16039           if (sym == NULL)
16040             return 0;
16041
16042           if (sym->attr.flavor == FL_PROCEDURE)
16043             break;
16044         }
16045     }
16046
16047   return sym->attr.flavor == FL_PROCEDURE && sym->attr.implicit_pure
16048     && !sym->attr.pure;
16049 }
16050
16051
16052 void
16053 gfc_unset_implicit_pure (gfc_symbol *sym)
16054 {
16055   gfc_namespace *ns;
16056
16057   if (sym == NULL)
16058     {
16059       /* Check if the current procedure is implicit_pure.  Walk up
16060          the procedure list until we find a procedure.  */
16061       for (ns = gfc_current_ns; ns; ns = ns->parent)
16062         {
16063           sym = ns->proc_name;
16064           if (sym == NULL)
16065             return;
16066
16067           if (sym->attr.flavor == FL_PROCEDURE)
16068             break;
16069         }
16070     }
16071
16072   if (sym->attr.flavor == FL_PROCEDURE)
16073     sym->attr.implicit_pure = 0;
16074   else
16075     sym->attr.pure = 0;
16076 }
16077
16078
16079 /* Test whether the current procedure is elemental or not.  */
16080
16081 int
16082 gfc_elemental (gfc_symbol *sym)
16083 {
16084   symbol_attribute attr;
16085
16086   if (sym == NULL)
16087     sym = gfc_current_ns->proc_name;
16088   if (sym == NULL)
16089     return 0;
16090   attr = sym->attr;
16091
16092   return attr.flavor == FL_PROCEDURE && attr.elemental;
16093 }
16094
16095
16096 /* Warn about unused labels.  */
16097
16098 static void
16099 warn_unused_fortran_label (gfc_st_label *label)
16100 {
16101   if (label == NULL)
16102     return;
16103
16104   warn_unused_fortran_label (label->left);
16105
16106   if (label->defined == ST_LABEL_UNKNOWN)
16107     return;
16108
16109   switch (label->referenced)
16110     {
16111     case ST_LABEL_UNKNOWN:
16112       gfc_warning (OPT_Wunused_label, "Label %d at %L defined but not used",
16113                    label->value, &label->where);
16114       break;
16115
16116     case ST_LABEL_BAD_TARGET:
16117       gfc_warning (OPT_Wunused_label,
16118                    "Label %d at %L defined but cannot be used",
16119                    label->value, &label->where);
16120       break;
16121
16122     default:
16123       break;
16124     }
16125
16126   warn_unused_fortran_label (label->right);
16127 }
16128
16129
16130 /* Returns the sequence type of a symbol or sequence.  */
16131
16132 static seq_type
16133 sequence_type (gfc_typespec ts)
16134 {
16135   seq_type result;
16136   gfc_component *c;
16137
16138   switch (ts.type)
16139   {
16140     case BT_DERIVED:
16141
16142       if (ts.u.derived->components == NULL)
16143         return SEQ_NONDEFAULT;
16144
16145       result = sequence_type (ts.u.derived->components->ts);
16146       for (c = ts.u.derived->components->next; c; c = c->next)
16147         if (sequence_type (c->ts) != result)
16148           return SEQ_MIXED;
16149
16150       return result;
16151
16152     case BT_CHARACTER:
16153       if (ts.kind != gfc_default_character_kind)
16154           return SEQ_NONDEFAULT;
16155
16156       return SEQ_CHARACTER;
16157
16158     case BT_INTEGER:
16159       if (ts.kind != gfc_default_integer_kind)
16160           return SEQ_NONDEFAULT;
16161
16162       return SEQ_NUMERIC;
16163
16164     case BT_REAL:
16165       if (!(ts.kind == gfc_default_real_kind
16166             || ts.kind == gfc_default_double_kind))
16167           return SEQ_NONDEFAULT;
16168
16169       return SEQ_NUMERIC;
16170
16171     case BT_COMPLEX:
16172       if (ts.kind != gfc_default_complex_kind)
16173           return SEQ_NONDEFAULT;
16174
16175       return SEQ_NUMERIC;
16176
16177     case BT_LOGICAL:
16178       if (ts.kind != gfc_default_logical_kind)
16179           return SEQ_NONDEFAULT;
16180
16181       return SEQ_NUMERIC;
16182
16183     default:
16184       return SEQ_NONDEFAULT;
16185   }
16186 }
16187
16188
16189 /* Resolve derived type EQUIVALENCE object.  */
16190
16191 static bool
16192 resolve_equivalence_derived (gfc_symbol *derived, gfc_symbol *sym, gfc_expr *e)
16193 {
16194   gfc_component *c = derived->components;
16195
16196   if (!derived)
16197     return true;
16198
16199   /* Shall not be an object of nonsequence derived type.  */
16200   if (!derived->attr.sequence)
16201     {
16202       gfc_error ("Derived type variable %qs at %L must have SEQUENCE "
16203                  "attribute to be an EQUIVALENCE object", sym->name,
16204                  &e->where);
16205       return false;
16206     }
16207
16208   /* Shall not have allocatable components.  */
16209   if (derived->attr.alloc_comp)
16210     {
16211       gfc_error ("Derived type variable %qs at %L cannot have ALLOCATABLE "
16212                  "components to be an EQUIVALENCE object",sym->name,
16213                  &e->where);
16214       return false;
16215     }
16216
16217   if (sym->attr.in_common && gfc_has_default_initializer (sym->ts.u.derived))
16218     {
16219       gfc_error ("Derived type variable %qs at %L with default "
16220                  "initialization cannot be in EQUIVALENCE with a variable "
16221                  "in COMMON", sym->name, &e->where);
16222       return false;
16223     }
16224
16225   for (; c ; c = c->next)
16226     {
16227       if (gfc_bt_struct (c->ts.type)
16228           && (!resolve_equivalence_derived(c->ts.u.derived, sym, e)))
16229         return false;
16230
16231       /* Shall not be an object of sequence derived type containing a pointer
16232          in the structure.  */
16233       if (c->attr.pointer)
16234         {
16235           gfc_error ("Derived type variable %qs at %L with pointer "
16236                      "component(s) cannot be an EQUIVALENCE object",
16237                      sym->name, &e->where);
16238           return false;
16239         }
16240     }
16241   return true;
16242 }
16243
16244
16245 /* Resolve equivalence object.
16246    An EQUIVALENCE object shall not be a dummy argument, a pointer, a target,
16247    an allocatable array, an object of nonsequence derived type, an object of
16248    sequence derived type containing a pointer at any level of component
16249    selection, an automatic object, a function name, an entry name, a result
16250    name, a named constant, a structure component, or a subobject of any of
16251    the preceding objects.  A substring shall not have length zero.  A
16252    derived type shall not have components with default initialization nor
16253    shall two objects of an equivalence group be initialized.
16254    Either all or none of the objects shall have an protected attribute.
16255    The simple constraints are done in symbol.c(check_conflict) and the rest
16256    are implemented here.  */
16257
16258 static void
16259 resolve_equivalence (gfc_equiv *eq)
16260 {
16261   gfc_symbol *sym;
16262   gfc_symbol *first_sym;
16263   gfc_expr *e;
16264   gfc_ref *r;
16265   locus *last_where = NULL;
16266   seq_type eq_type, last_eq_type;
16267   gfc_typespec *last_ts;
16268   int object, cnt_protected;
16269   const char *msg;
16270
16271   last_ts = &eq->expr->symtree->n.sym->ts;
16272
16273   first_sym = eq->expr->symtree->n.sym;
16274
16275   cnt_protected = 0;
16276
16277   for (object = 1; eq; eq = eq->eq, object++)
16278     {
16279       e = eq->expr;
16280
16281       e->ts = e->symtree->n.sym->ts;
16282       /* match_varspec might not know yet if it is seeing
16283          array reference or substring reference, as it doesn't
16284          know the types.  */
16285       if (e->ref && e->ref->type == REF_ARRAY)
16286         {
16287           gfc_ref *ref = e->ref;
16288           sym = e->symtree->n.sym;
16289
16290           if (sym->attr.dimension)
16291             {
16292               ref->u.ar.as = sym->as;
16293               ref = ref->next;
16294             }
16295
16296           /* For substrings, convert REF_ARRAY into REF_SUBSTRING.  */
16297           if (e->ts.type == BT_CHARACTER
16298               && ref
16299               && ref->type == REF_ARRAY
16300               && ref->u.ar.dimen == 1
16301               && ref->u.ar.dimen_type[0] == DIMEN_RANGE
16302               && ref->u.ar.stride[0] == NULL)
16303             {
16304               gfc_expr *start = ref->u.ar.start[0];
16305               gfc_expr *end = ref->u.ar.end[0];
16306               void *mem = NULL;
16307
16308               /* Optimize away the (:) reference.  */
16309               if (start == NULL && end == NULL)
16310                 {
16311                   if (e->ref == ref)
16312                     e->ref = ref->next;
16313                   else
16314                     e->ref->next = ref->next;
16315                   mem = ref;
16316                 }
16317               else
16318                 {
16319                   ref->type = REF_SUBSTRING;
16320                   if (start == NULL)
16321                     start = gfc_get_int_expr (gfc_charlen_int_kind,
16322                                               NULL, 1);
16323                   ref->u.ss.start = start;
16324                   if (end == NULL && e->ts.u.cl)
16325                     end = gfc_copy_expr (e->ts.u.cl->length);
16326                   ref->u.ss.end = end;
16327                   ref->u.ss.length = e->ts.u.cl;
16328                   e->ts.u.cl = NULL;
16329                 }
16330               ref = ref->next;
16331               free (mem);
16332             }
16333
16334           /* Any further ref is an error.  */
16335           if (ref)
16336             {
16337               gcc_assert (ref->type == REF_ARRAY);
16338               gfc_error ("Syntax error in EQUIVALENCE statement at %L",
16339                          &ref->u.ar.where);
16340               continue;
16341             }
16342         }
16343
16344       if (!gfc_resolve_expr (e))
16345         continue;
16346
16347       sym = e->symtree->n.sym;
16348
16349       if (sym->attr.is_protected)
16350         cnt_protected++;
16351       if (cnt_protected > 0 && cnt_protected != object)
16352         {
16353               gfc_error ("Either all or none of the objects in the "
16354                          "EQUIVALENCE set at %L shall have the "
16355                          "PROTECTED attribute",
16356                          &e->where);
16357               break;
16358         }
16359
16360       /* Shall not equivalence common block variables in a PURE procedure.  */
16361       if (sym->ns->proc_name
16362           && sym->ns->proc_name->attr.pure
16363           && sym->attr.in_common)
16364         {
16365           /* Need to check for symbols that may have entered the pure
16366              procedure via a USE statement.  */
16367           bool saw_sym = false;
16368           if (sym->ns->use_stmts)
16369             {
16370               gfc_use_rename *r;
16371               for (r = sym->ns->use_stmts->rename; r; r = r->next)
16372                 if (strcmp(r->use_name, sym->name) == 0) saw_sym = true;
16373             }
16374           else
16375             saw_sym = true;
16376
16377           if (saw_sym)
16378             gfc_error ("COMMON block member %qs at %L cannot be an "
16379                        "EQUIVALENCE object in the pure procedure %qs",
16380                        sym->name, &e->where, sym->ns->proc_name->name);
16381           break;
16382         }
16383
16384       /* Shall not be a named constant.  */
16385       if (e->expr_type == EXPR_CONSTANT)
16386         {
16387           gfc_error ("Named constant %qs at %L cannot be an EQUIVALENCE "
16388                      "object", sym->name, &e->where);
16389           continue;
16390         }
16391
16392       if (e->ts.type == BT_DERIVED
16393           && !resolve_equivalence_derived (e->ts.u.derived, sym, e))
16394         continue;
16395
16396       /* Check that the types correspond correctly:
16397          Note 5.28:
16398          A numeric sequence structure may be equivalenced to another sequence
16399          structure, an object of default integer type, default real type, double
16400          precision real type, default logical type such that components of the
16401          structure ultimately only become associated to objects of the same
16402          kind. A character sequence structure may be equivalenced to an object
16403          of default character kind or another character sequence structure.
16404          Other objects may be equivalenced only to objects of the same type and
16405          kind parameters.  */
16406
16407       /* Identical types are unconditionally OK.  */
16408       if (object == 1 || gfc_compare_types (last_ts, &sym->ts))
16409         goto identical_types;
16410
16411       last_eq_type = sequence_type (*last_ts);
16412       eq_type = sequence_type (sym->ts);
16413
16414       /* Since the pair of objects is not of the same type, mixed or
16415          non-default sequences can be rejected.  */
16416
16417       msg = "Sequence %s with mixed components in EQUIVALENCE "
16418             "statement at %L with different type objects";
16419       if ((object ==2
16420            && last_eq_type == SEQ_MIXED
16421            && !gfc_notify_std (GFC_STD_GNU, msg, first_sym->name, last_where))
16422           || (eq_type == SEQ_MIXED
16423               && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where)))
16424         continue;
16425
16426       msg = "Non-default type object or sequence %s in EQUIVALENCE "
16427             "statement at %L with objects of different type";
16428       if ((object ==2
16429            && last_eq_type == SEQ_NONDEFAULT
16430            && !gfc_notify_std (GFC_STD_GNU, msg, first_sym->name, last_where))
16431           || (eq_type == SEQ_NONDEFAULT
16432               && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where)))
16433         continue;
16434
16435       msg ="Non-CHARACTER object %qs in default CHARACTER "
16436            "EQUIVALENCE statement at %L";
16437       if (last_eq_type == SEQ_CHARACTER
16438           && eq_type != SEQ_CHARACTER
16439           && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where))
16440                 continue;
16441
16442       msg ="Non-NUMERIC object %qs in default NUMERIC "
16443            "EQUIVALENCE statement at %L";
16444       if (last_eq_type == SEQ_NUMERIC
16445           && eq_type != SEQ_NUMERIC
16446           && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where))
16447                 continue;
16448
16449   identical_types:
16450       last_ts =&sym->ts;
16451       last_where = &e->where;
16452
16453       if (!e->ref)
16454         continue;
16455
16456       /* Shall not be an automatic array.  */
16457       if (e->ref->type == REF_ARRAY
16458           && !gfc_resolve_array_spec (e->ref->u.ar.as, 1))
16459         {
16460           gfc_error ("Array %qs at %L with non-constant bounds cannot be "
16461                      "an EQUIVALENCE object", sym->name, &e->where);
16462           continue;
16463         }
16464
16465       r = e->ref;
16466       while (r)
16467         {
16468           /* Shall not be a structure component.  */
16469           if (r->type == REF_COMPONENT)
16470             {
16471               gfc_error ("Structure component %qs at %L cannot be an "
16472                          "EQUIVALENCE object",
16473                          r->u.c.component->name, &e->where);
16474               break;
16475             }
16476
16477           /* A substring shall not have length zero.  */
16478           if (r->type == REF_SUBSTRING)
16479             {
16480               if (compare_bound (r->u.ss.start, r->u.ss.end) == CMP_GT)
16481                 {
16482                   gfc_error ("Substring at %L has length zero",
16483                              &r->u.ss.start->where);
16484                   break;
16485                 }
16486             }
16487           r = r->next;
16488         }
16489     }
16490 }
16491
16492
16493 /* Function called by resolve_fntype to flag other symbol used in the
16494    length type parameter specification of function resuls.  */
16495
16496 static bool
16497 flag_fn_result_spec (gfc_expr *expr,
16498                      gfc_symbol *sym,
16499                      int *f ATTRIBUTE_UNUSED)
16500 {
16501   gfc_namespace *ns;
16502   gfc_symbol *s;
16503
16504   if (expr->expr_type == EXPR_VARIABLE)
16505     {
16506       s = expr->symtree->n.sym;
16507       for (ns = s->ns; ns; ns = ns->parent)
16508         if (!ns->parent)
16509           break;
16510
16511       if (sym == s)
16512         {
16513           gfc_error ("Self reference in character length expression "
16514                      "for %qs at %L", sym->name, &expr->where);
16515           return true;
16516         }
16517
16518       if (!s->fn_result_spec
16519           && s->attr.flavor == FL_PARAMETER)
16520         {
16521           /* Function contained in a module.... */
16522           if (ns->proc_name && ns->proc_name->attr.flavor == FL_MODULE)
16523             {
16524               gfc_symtree *st;
16525               s->fn_result_spec = 1;
16526               /* Make sure that this symbol is translated as a module
16527                  variable.  */
16528               st = gfc_get_unique_symtree (ns);
16529               st->n.sym = s;
16530               s->refs++;
16531             }
16532           /* ... which is use associated and called.  */
16533           else if (s->attr.use_assoc || s->attr.used_in_submodule
16534                         ||
16535                   /* External function matched with an interface.  */
16536                   (s->ns->proc_name
16537                    && ((s->ns == ns
16538                          && s->ns->proc_name->attr.if_source == IFSRC_DECL)
16539                        || s->ns->proc_name->attr.if_source == IFSRC_IFBODY)
16540                    && s->ns->proc_name->attr.function))
16541             s->fn_result_spec = 1;
16542         }
16543     }
16544   return false;
16545 }
16546
16547
16548 /* Resolve function and ENTRY types, issue diagnostics if needed.  */
16549
16550 static void
16551 resolve_fntype (gfc_namespace *ns)
16552 {
16553   gfc_entry_list *el;
16554   gfc_symbol *sym;
16555
16556   if (ns->proc_name == NULL || !ns->proc_name->attr.function)
16557     return;
16558
16559   /* If there are any entries, ns->proc_name is the entry master
16560      synthetic symbol and ns->entries->sym actual FUNCTION symbol.  */
16561   if (ns->entries)
16562     sym = ns->entries->sym;
16563   else
16564     sym = ns->proc_name;
16565   if (sym->result == sym
16566       && sym->ts.type == BT_UNKNOWN
16567       && !gfc_set_default_type (sym, 0, NULL)
16568       && !sym->attr.untyped)
16569     {
16570       gfc_error ("Function %qs at %L has no IMPLICIT type",
16571                  sym->name, &sym->declared_at);
16572       sym->attr.untyped = 1;
16573     }
16574
16575   if (sym->ts.type == BT_DERIVED && !sym->ts.u.derived->attr.use_assoc
16576       && !sym->attr.contained
16577       && !gfc_check_symbol_access (sym->ts.u.derived)
16578       && gfc_check_symbol_access (sym))
16579     {
16580       gfc_notify_std (GFC_STD_F2003, "PUBLIC function %qs at "
16581                       "%L of PRIVATE type %qs", sym->name,
16582                       &sym->declared_at, sym->ts.u.derived->name);
16583     }
16584
16585     if (ns->entries)
16586     for (el = ns->entries->next; el; el = el->next)
16587       {
16588         if (el->sym->result == el->sym
16589             && el->sym->ts.type == BT_UNKNOWN
16590             && !gfc_set_default_type (el->sym, 0, NULL)
16591             && !el->sym->attr.untyped)
16592           {
16593             gfc_error ("ENTRY %qs at %L has no IMPLICIT type",
16594                        el->sym->name, &el->sym->declared_at);
16595             el->sym->attr.untyped = 1;
16596           }
16597       }
16598
16599   if (sym->ts.type == BT_CHARACTER)
16600     gfc_traverse_expr (sym->ts.u.cl->length, sym, flag_fn_result_spec, 0);
16601 }
16602
16603
16604 /* 12.3.2.1.1 Defined operators.  */
16605
16606 static bool
16607 check_uop_procedure (gfc_symbol *sym, locus where)
16608 {
16609   gfc_formal_arglist *formal;
16610
16611   if (!sym->attr.function)
16612     {
16613       gfc_error ("User operator procedure %qs at %L must be a FUNCTION",
16614                  sym->name, &where);
16615       return false;
16616     }
16617
16618   if (sym->ts.type == BT_CHARACTER
16619       && !((sym->ts.u.cl && sym->ts.u.cl->length) || sym->ts.deferred)
16620       && !(sym->result && ((sym->result->ts.u.cl
16621            && sym->result->ts.u.cl->length) || sym->result->ts.deferred)))
16622     {
16623       gfc_error ("User operator procedure %qs at %L cannot be assumed "
16624                  "character length", sym->name, &where);
16625       return false;
16626     }
16627
16628   formal = gfc_sym_get_dummy_args (sym);
16629   if (!formal || !formal->sym)
16630     {
16631       gfc_error ("User operator procedure %qs at %L must have at least "
16632                  "one argument", sym->name, &where);
16633       return false;
16634     }
16635
16636   if (formal->sym->attr.intent != INTENT_IN)
16637     {
16638       gfc_error ("First argument of operator interface at %L must be "
16639                  "INTENT(IN)", &where);
16640       return false;
16641     }
16642
16643   if (formal->sym->attr.optional)
16644     {
16645       gfc_error ("First argument of operator interface at %L cannot be "
16646                  "optional", &where);
16647       return false;
16648     }
16649
16650   formal = formal->next;
16651   if (!formal || !formal->sym)
16652     return true;
16653
16654   if (formal->sym->attr.intent != INTENT_IN)
16655     {
16656       gfc_error ("Second argument of operator interface at %L must be "
16657                  "INTENT(IN)", &where);
16658       return false;
16659     }
16660
16661   if (formal->sym->attr.optional)
16662     {
16663       gfc_error ("Second argument of operator interface at %L cannot be "
16664                  "optional", &where);
16665       return false;
16666     }
16667
16668   if (formal->next)
16669     {
16670       gfc_error ("Operator interface at %L must have, at most, two "
16671                  "arguments", &where);
16672       return false;
16673     }
16674
16675   return true;
16676 }
16677
16678 static void
16679 gfc_resolve_uops (gfc_symtree *symtree)
16680 {
16681   gfc_interface *itr;
16682
16683   if (symtree == NULL)
16684     return;
16685
16686   gfc_resolve_uops (symtree->left);
16687   gfc_resolve_uops (symtree->right);
16688
16689   for (itr = symtree->n.uop->op; itr; itr = itr->next)
16690     check_uop_procedure (itr->sym, itr->sym->declared_at);
16691 }
16692
16693
16694 /* Examine all of the expressions associated with a program unit,
16695    assign types to all intermediate expressions, make sure that all
16696    assignments are to compatible types and figure out which names
16697    refer to which functions or subroutines.  It doesn't check code
16698    block, which is handled by gfc_resolve_code.  */
16699
16700 static void
16701 resolve_types (gfc_namespace *ns)
16702 {
16703   gfc_namespace *n;
16704   gfc_charlen *cl;
16705   gfc_data *d;
16706   gfc_equiv *eq;
16707   gfc_namespace* old_ns = gfc_current_ns;
16708
16709   if (ns->types_resolved)
16710     return;
16711
16712   /* Check that all IMPLICIT types are ok.  */
16713   if (!ns->seen_implicit_none)
16714     {
16715       unsigned letter;
16716       for (letter = 0; letter != GFC_LETTERS; ++letter)
16717         if (ns->set_flag[letter]
16718             && !resolve_typespec_used (&ns->default_type[letter],
16719                                        &ns->implicit_loc[letter], NULL))
16720           return;
16721     }
16722
16723   gfc_current_ns = ns;
16724
16725   resolve_entries (ns);
16726
16727   resolve_common_vars (&ns->blank_common, false);
16728   resolve_common_blocks (ns->common_root);
16729
16730   resolve_contained_functions (ns);
16731
16732   if (ns->proc_name && ns->proc_name->attr.flavor == FL_PROCEDURE
16733       && ns->proc_name->attr.if_source == IFSRC_IFBODY)
16734     resolve_formal_arglist (ns->proc_name);
16735
16736   gfc_traverse_ns (ns, resolve_bind_c_derived_types);
16737
16738   for (cl = ns->cl_list; cl; cl = cl->next)
16739     resolve_charlen (cl);
16740
16741   gfc_traverse_ns (ns, resolve_symbol);
16742
16743   resolve_fntype (ns);
16744
16745   for (n = ns->contained; n; n = n->sibling)
16746     {
16747       if (gfc_pure (ns->proc_name) && !gfc_pure (n->proc_name))
16748         gfc_error ("Contained procedure %qs at %L of a PURE procedure must "
16749                    "also be PURE", n->proc_name->name,
16750                    &n->proc_name->declared_at);
16751
16752       resolve_types (n);
16753     }
16754
16755   forall_flag = 0;
16756   gfc_do_concurrent_flag = 0;
16757   gfc_check_interfaces (ns);
16758
16759   gfc_traverse_ns (ns, resolve_values);
16760
16761   if (ns->save_all || !flag_automatic)
16762     gfc_save_all (ns);
16763
16764   iter_stack = NULL;
16765   for (d = ns->data; d; d = d->next)
16766     resolve_data (d);
16767
16768   iter_stack = NULL;
16769   gfc_traverse_ns (ns, gfc_formalize_init_value);
16770
16771   gfc_traverse_ns (ns, gfc_verify_binding_labels);
16772
16773   for (eq = ns->equiv; eq; eq = eq->next)
16774     resolve_equivalence (eq);
16775
16776   /* Warn about unused labels.  */
16777   if (warn_unused_label)
16778     warn_unused_fortran_label (ns->st_labels);
16779
16780   gfc_resolve_uops (ns->uop_root);
16781
16782   gfc_traverse_ns (ns, gfc_verify_DTIO_procedures);
16783
16784   gfc_resolve_omp_declare_simd (ns);
16785
16786   gfc_resolve_omp_udrs (ns->omp_udr_root);
16787
16788   ns->types_resolved = 1;
16789
16790   gfc_current_ns = old_ns;
16791 }
16792
16793
16794 /* Call gfc_resolve_code recursively.  */
16795
16796 static void
16797 resolve_codes (gfc_namespace *ns)
16798 {
16799   gfc_namespace *n;
16800   bitmap_obstack old_obstack;
16801
16802   if (ns->resolved == 1)
16803     return;
16804
16805   for (n = ns->contained; n; n = n->sibling)
16806     resolve_codes (n);
16807
16808   gfc_current_ns = ns;
16809
16810   /* Don't clear 'cs_base' if this is the namespace of a BLOCK construct.  */
16811   if (!(ns->proc_name && ns->proc_name->attr.flavor == FL_LABEL))
16812     cs_base = NULL;
16813
16814   /* Set to an out of range value.  */
16815   current_entry_id = -1;
16816
16817   old_obstack = labels_obstack;
16818   bitmap_obstack_initialize (&labels_obstack);
16819
16820   gfc_resolve_oacc_declare (ns);
16821   gfc_resolve_omp_local_vars (ns);
16822   gfc_resolve_code (ns->code, ns);
16823
16824   bitmap_obstack_release (&labels_obstack);
16825   labels_obstack = old_obstack;
16826 }
16827
16828
16829 /* This function is called after a complete program unit has been compiled.
16830    Its purpose is to examine all of the expressions associated with a program
16831    unit, assign types to all intermediate expressions, make sure that all
16832    assignments are to compatible types and figure out which names refer to
16833    which functions or subroutines.  */
16834
16835 void
16836 gfc_resolve (gfc_namespace *ns)
16837 {
16838   gfc_namespace *old_ns;
16839   code_stack *old_cs_base;
16840   struct gfc_omp_saved_state old_omp_state;
16841
16842   if (ns->resolved)
16843     return;
16844
16845   ns->resolved = -1;
16846   old_ns = gfc_current_ns;
16847   old_cs_base = cs_base;
16848
16849   /* As gfc_resolve can be called during resolution of an OpenMP construct
16850      body, we should clear any state associated to it, so that say NS's
16851      DO loops are not interpreted as OpenMP loops.  */
16852   if (!ns->construct_entities)
16853     gfc_omp_save_and_clear_state (&old_omp_state);
16854
16855   resolve_types (ns);
16856   component_assignment_level = 0;
16857   resolve_codes (ns);
16858
16859   gfc_current_ns = old_ns;
16860   cs_base = old_cs_base;
16861   ns->resolved = 1;
16862
16863   gfc_run_passes (ns);
16864
16865   if (!ns->construct_entities)
16866     gfc_omp_restore_state (&old_omp_state);
16867 }