OSDN Git Service

2009-07-13 Janus Weil <janus@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / fortran / resolve.c
1 /* Perform type resolution on the various structures.
2    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3    Free Software Foundation, Inc.
4    Contributed by Andy Vaught
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "flags.h"
25 #include "gfortran.h"
26 #include "obstack.h"
27 #include "bitmap.h"
28 #include "arith.h"  /* For gfc_compare_expr().  */
29 #include "dependency.h"
30 #include "data.h"
31 #include "target-memory.h" /* for gfc_simplify_transfer */
32
33 /* Types used in equivalence statements.  */
34
35 typedef enum seq_type
36 {
37   SEQ_NONDEFAULT, SEQ_NUMERIC, SEQ_CHARACTER, SEQ_MIXED
38 }
39 seq_type;
40
41 /* Stack to keep track of the nesting of blocks as we move through the
42    code.  See resolve_branch() and resolve_code().  */
43
44 typedef struct code_stack
45 {
46   struct gfc_code *head, *current;
47   struct code_stack *prev;
48
49   /* This bitmap keeps track of the targets valid for a branch from
50      inside this block except for END {IF|SELECT}s of enclosing
51      blocks.  */
52   bitmap reachable_labels;
53 }
54 code_stack;
55
56 static code_stack *cs_base = NULL;
57
58
59 /* Nonzero if we're inside a FORALL block.  */
60
61 static int forall_flag;
62
63 /* Nonzero if we're inside a OpenMP WORKSHARE or PARALLEL WORKSHARE block.  */
64
65 static int omp_workshare_flag;
66
67 /* Nonzero if we are processing a formal arglist. The corresponding function
68    resets the flag each time that it is read.  */
69 static int formal_arg_flag = 0;
70
71 /* True if we are resolving a specification expression.  */
72 static int specification_expr = 0;
73
74 /* The id of the last entry seen.  */
75 static int current_entry_id;
76
77 /* We use bitmaps to determine if a branch target is valid.  */
78 static bitmap_obstack labels_obstack;
79
80 int
81 gfc_is_formal_arg (void)
82 {
83   return formal_arg_flag;
84 }
85
86 /* Is the symbol host associated?  */
87 static bool
88 is_sym_host_assoc (gfc_symbol *sym, gfc_namespace *ns)
89 {
90   for (ns = ns->parent; ns; ns = ns->parent)
91     {      
92       if (sym->ns == ns)
93         return true;
94     }
95
96   return false;
97 }
98
99 /* Ensure a typespec used is valid; for instance, TYPE(t) is invalid if t is
100    an ABSTRACT derived-type.  If where is not NULL, an error message with that
101    locus is printed, optionally using name.  */
102
103 static gfc_try
104 resolve_typespec_used (gfc_typespec* ts, locus* where, const char* name)
105 {
106   if (ts->type == BT_DERIVED && ts->derived->attr.abstract)
107     {
108       if (where)
109         {
110           if (name)
111             gfc_error ("'%s' at %L is of the ABSTRACT type '%s'",
112                        name, where, ts->derived->name);
113           else
114             gfc_error ("ABSTRACT type '%s' used at %L",
115                        ts->derived->name, where);
116         }
117
118       return FAILURE;
119     }
120
121   return SUCCESS;
122 }
123
124
125 /* Resolve types of formal argument lists.  These have to be done early so that
126    the formal argument lists of module procedures can be copied to the
127    containing module before the individual procedures are resolved
128    individually.  We also resolve argument lists of procedures in interface
129    blocks because they are self-contained scoping units.
130
131    Since a dummy argument cannot be a non-dummy procedure, the only
132    resort left for untyped names are the IMPLICIT types.  */
133
134 static void
135 resolve_formal_arglist (gfc_symbol *proc)
136 {
137   gfc_formal_arglist *f;
138   gfc_symbol *sym;
139   int i;
140
141   if (proc->result != NULL)
142     sym = proc->result;
143   else
144     sym = proc;
145
146   if (gfc_elemental (proc)
147       || sym->attr.pointer || sym->attr.allocatable
148       || (sym->as && sym->as->rank > 0))
149     {
150       proc->attr.always_explicit = 1;
151       sym->attr.always_explicit = 1;
152     }
153
154   formal_arg_flag = 1;
155
156   for (f = proc->formal; f; f = f->next)
157     {
158       sym = f->sym;
159
160       if (sym == NULL)
161         {
162           /* Alternate return placeholder.  */
163           if (gfc_elemental (proc))
164             gfc_error ("Alternate return specifier in elemental subroutine "
165                        "'%s' at %L is not allowed", proc->name,
166                        &proc->declared_at);
167           if (proc->attr.function)
168             gfc_error ("Alternate return specifier in function "
169                        "'%s' at %L is not allowed", proc->name,
170                        &proc->declared_at);
171           continue;
172         }
173
174       if (sym->attr.if_source != IFSRC_UNKNOWN)
175         resolve_formal_arglist (sym);
176
177       if (sym->attr.subroutine || sym->attr.external || sym->attr.intrinsic)
178         {
179           if (gfc_pure (proc) && !gfc_pure (sym))
180             {
181               gfc_error ("Dummy procedure '%s' of PURE procedure at %L must "
182                          "also be PURE", sym->name, &sym->declared_at);
183               continue;
184             }
185
186           if (gfc_elemental (proc))
187             {
188               gfc_error ("Dummy procedure at %L not allowed in ELEMENTAL "
189                          "procedure", &sym->declared_at);
190               continue;
191             }
192
193           if (sym->attr.function
194                 && sym->ts.type == BT_UNKNOWN
195                 && sym->attr.intrinsic)
196             {
197               gfc_intrinsic_sym *isym;
198               isym = gfc_find_function (sym->name);
199               if (isym == NULL || !isym->specific)
200                 {
201                   gfc_error ("Unable to find a specific INTRINSIC procedure "
202                              "for the reference '%s' at %L", sym->name,
203                              &sym->declared_at);
204                 }
205               sym->ts = isym->ts;
206             }
207
208           continue;
209         }
210
211       if (sym->ts.type == BT_UNKNOWN)
212         {
213           if (!sym->attr.function || sym->result == sym)
214             gfc_set_default_type (sym, 1, sym->ns);
215         }
216
217       gfc_resolve_array_spec (sym->as, 0);
218
219       /* We can't tell if an array with dimension (:) is assumed or deferred
220          shape until we know if it has the pointer or allocatable attributes.
221       */
222       if (sym->as && sym->as->rank > 0 && sym->as->type == AS_DEFERRED
223           && !(sym->attr.pointer || sym->attr.allocatable))
224         {
225           sym->as->type = AS_ASSUMED_SHAPE;
226           for (i = 0; i < sym->as->rank; i++)
227             sym->as->lower[i] = gfc_int_expr (1);
228         }
229
230       if ((sym->as && sym->as->rank > 0 && sym->as->type == AS_ASSUMED_SHAPE)
231           || sym->attr.pointer || sym->attr.allocatable || sym->attr.target
232           || sym->attr.optional)
233         {
234           proc->attr.always_explicit = 1;
235           if (proc->result)
236             proc->result->attr.always_explicit = 1;
237         }
238
239       /* If the flavor is unknown at this point, it has to be a variable.
240          A procedure specification would have already set the type.  */
241
242       if (sym->attr.flavor == FL_UNKNOWN)
243         gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, &sym->declared_at);
244
245       if (gfc_pure (proc) && !sym->attr.pointer
246           && sym->attr.flavor != FL_PROCEDURE)
247         {
248           if (proc->attr.function && sym->attr.intent != INTENT_IN)
249             gfc_error ("Argument '%s' of pure function '%s' at %L must be "
250                        "INTENT(IN)", sym->name, proc->name,
251                        &sym->declared_at);
252
253           if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN)
254             gfc_error ("Argument '%s' of pure subroutine '%s' at %L must "
255                        "have its INTENT specified", sym->name, proc->name,
256                        &sym->declared_at);
257         }
258
259       if (gfc_elemental (proc))
260         {
261           if (sym->as != NULL)
262             {
263               gfc_error ("Argument '%s' of elemental procedure at %L must "
264                          "be scalar", sym->name, &sym->declared_at);
265               continue;
266             }
267
268           if (sym->attr.pointer)
269             {
270               gfc_error ("Argument '%s' of elemental procedure at %L cannot "
271                          "have the POINTER attribute", sym->name,
272                          &sym->declared_at);
273               continue;
274             }
275
276           if (sym->attr.flavor == FL_PROCEDURE)
277             {
278               gfc_error ("Dummy procedure '%s' not allowed in elemental "
279                          "procedure '%s' at %L", sym->name, proc->name,
280                          &sym->declared_at);
281               continue;
282             }
283         }
284
285       /* Each dummy shall be specified to be scalar.  */
286       if (proc->attr.proc == PROC_ST_FUNCTION)
287         {
288           if (sym->as != NULL)
289             {
290               gfc_error ("Argument '%s' of statement function at %L must "
291                          "be scalar", sym->name, &sym->declared_at);
292               continue;
293             }
294
295           if (sym->ts.type == BT_CHARACTER)
296             {
297               gfc_charlen *cl = sym->ts.cl;
298               if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
299                 {
300                   gfc_error ("Character-valued argument '%s' of statement "
301                              "function at %L must have constant length",
302                              sym->name, &sym->declared_at);
303                   continue;
304                 }
305             }
306         }
307     }
308   formal_arg_flag = 0;
309 }
310
311
312 /* Work function called when searching for symbols that have argument lists
313    associated with them.  */
314
315 static void
316 find_arglists (gfc_symbol *sym)
317 {
318   if (sym->attr.if_source == IFSRC_UNKNOWN || sym->ns != gfc_current_ns)
319     return;
320
321   resolve_formal_arglist (sym);
322 }
323
324
325 /* Given a namespace, resolve all formal argument lists within the namespace.
326  */
327
328 static void
329 resolve_formal_arglists (gfc_namespace *ns)
330 {
331   if (ns == NULL)
332     return;
333
334   gfc_traverse_ns (ns, find_arglists);
335 }
336
337
338 static void
339 resolve_contained_fntype (gfc_symbol *sym, gfc_namespace *ns)
340 {
341   gfc_try t;
342
343   /* If this namespace is not a function or an entry master function,
344      ignore it.  */
345   if (! sym || !(sym->attr.function || sym->attr.flavor == FL_VARIABLE)
346       || sym->attr.entry_master)
347     return;
348
349   /* Try to find out of what the return type is.  */
350   if (sym->result->ts.type == BT_UNKNOWN && sym->result->ts.interface == NULL)
351     {
352       t = gfc_set_default_type (sym->result, 0, ns);
353
354       if (t == FAILURE && !sym->result->attr.untyped)
355         {
356           if (sym->result == sym)
357             gfc_error ("Contained function '%s' at %L has no IMPLICIT type",
358                        sym->name, &sym->declared_at);
359           else if (!sym->result->attr.proc_pointer)
360             gfc_error ("Result '%s' of contained function '%s' at %L has "
361                        "no IMPLICIT type", sym->result->name, sym->name,
362                        &sym->result->declared_at);
363           sym->result->attr.untyped = 1;
364         }
365     }
366
367   /* Fortran 95 Draft Standard, page 51, Section 5.1.1.5, on the Character 
368      type, lists the only ways a character length value of * can be used:
369      dummy arguments of procedures, named constants, and function results
370      in external functions.  Internal function results are not on that list;
371      ergo, not permitted.  */
372
373   if (sym->result->ts.type == BT_CHARACTER)
374     {
375       gfc_charlen *cl = sym->result->ts.cl;
376       if (!cl || !cl->length)
377         gfc_error ("Character-valued internal function '%s' at %L must "
378                    "not be assumed length", sym->name, &sym->declared_at);
379     }
380 }
381
382
383 /* Add NEW_ARGS to the formal argument list of PROC, taking care not to
384    introduce duplicates.  */
385
386 static void
387 merge_argument_lists (gfc_symbol *proc, gfc_formal_arglist *new_args)
388 {
389   gfc_formal_arglist *f, *new_arglist;
390   gfc_symbol *new_sym;
391
392   for (; new_args != NULL; new_args = new_args->next)
393     {
394       new_sym = new_args->sym;
395       /* See if this arg is already in the formal argument list.  */
396       for (f = proc->formal; f; f = f->next)
397         {
398           if (new_sym == f->sym)
399             break;
400         }
401
402       if (f)
403         continue;
404
405       /* Add a new argument.  Argument order is not important.  */
406       new_arglist = gfc_get_formal_arglist ();
407       new_arglist->sym = new_sym;
408       new_arglist->next = proc->formal;
409       proc->formal  = new_arglist;
410     }
411 }
412
413
414 /* Flag the arguments that are not present in all entries.  */
415
416 static void
417 check_argument_lists (gfc_symbol *proc, gfc_formal_arglist *new_args)
418 {
419   gfc_formal_arglist *f, *head;
420   head = new_args;
421
422   for (f = proc->formal; f; f = f->next)
423     {
424       if (f->sym == NULL)
425         continue;
426
427       for (new_args = head; new_args; new_args = new_args->next)
428         {
429           if (new_args->sym == f->sym)
430             break;
431         }
432
433       if (new_args)
434         continue;
435
436       f->sym->attr.not_always_present = 1;
437     }
438 }
439
440
441 /* Resolve alternate entry points.  If a symbol has multiple entry points we
442    create a new master symbol for the main routine, and turn the existing
443    symbol into an entry point.  */
444
445 static void
446 resolve_entries (gfc_namespace *ns)
447 {
448   gfc_namespace *old_ns;
449   gfc_code *c;
450   gfc_symbol *proc;
451   gfc_entry_list *el;
452   char name[GFC_MAX_SYMBOL_LEN + 1];
453   static int master_count = 0;
454
455   if (ns->proc_name == NULL)
456     return;
457
458   /* No need to do anything if this procedure doesn't have alternate entry
459      points.  */
460   if (!ns->entries)
461     return;
462
463   /* We may already have resolved alternate entry points.  */
464   if (ns->proc_name->attr.entry_master)
465     return;
466
467   /* If this isn't a procedure something has gone horribly wrong.  */
468   gcc_assert (ns->proc_name->attr.flavor == FL_PROCEDURE);
469
470   /* Remember the current namespace.  */
471   old_ns = gfc_current_ns;
472
473   gfc_current_ns = ns;
474
475   /* Add the main entry point to the list of entry points.  */
476   el = gfc_get_entry_list ();
477   el->sym = ns->proc_name;
478   el->id = 0;
479   el->next = ns->entries;
480   ns->entries = el;
481   ns->proc_name->attr.entry = 1;
482
483   /* If it is a module function, it needs to be in the right namespace
484      so that gfc_get_fake_result_decl can gather up the results. The
485      need for this arose in get_proc_name, where these beasts were
486      left in their own namespace, to keep prior references linked to
487      the entry declaration.*/
488   if (ns->proc_name->attr.function
489       && ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
490     el->sym->ns = ns;
491
492   /* Do the same for entries where the master is not a module
493      procedure.  These are retained in the module namespace because
494      of the module procedure declaration.  */
495   for (el = el->next; el; el = el->next)
496     if (el->sym->ns->proc_name->attr.flavor == FL_MODULE
497           && el->sym->attr.mod_proc)
498       el->sym->ns = ns;
499   el = ns->entries;
500
501   /* Add an entry statement for it.  */
502   c = gfc_get_code ();
503   c->op = EXEC_ENTRY;
504   c->ext.entry = el;
505   c->next = ns->code;
506   ns->code = c;
507
508   /* Create a new symbol for the master function.  */
509   /* Give the internal function a unique name (within this file).
510      Also include the function name so the user has some hope of figuring
511      out what is going on.  */
512   snprintf (name, GFC_MAX_SYMBOL_LEN, "master.%d.%s",
513             master_count++, ns->proc_name->name);
514   gfc_get_ha_symbol (name, &proc);
515   gcc_assert (proc != NULL);
516
517   gfc_add_procedure (&proc->attr, PROC_INTERNAL, proc->name, NULL);
518   if (ns->proc_name->attr.subroutine)
519     gfc_add_subroutine (&proc->attr, proc->name, NULL);
520   else
521     {
522       gfc_symbol *sym;
523       gfc_typespec *ts, *fts;
524       gfc_array_spec *as, *fas;
525       gfc_add_function (&proc->attr, proc->name, NULL);
526       proc->result = proc;
527       fas = ns->entries->sym->as;
528       fas = fas ? fas : ns->entries->sym->result->as;
529       fts = &ns->entries->sym->result->ts;
530       if (fts->type == BT_UNKNOWN)
531         fts = gfc_get_default_type (ns->entries->sym->result->name, NULL);
532       for (el = ns->entries->next; el; el = el->next)
533         {
534           ts = &el->sym->result->ts;
535           as = el->sym->as;
536           as = as ? as : el->sym->result->as;
537           if (ts->type == BT_UNKNOWN)
538             ts = gfc_get_default_type (el->sym->result->name, NULL);
539
540           if (! gfc_compare_types (ts, fts)
541               || (el->sym->result->attr.dimension
542                   != ns->entries->sym->result->attr.dimension)
543               || (el->sym->result->attr.pointer
544                   != ns->entries->sym->result->attr.pointer))
545             break;
546           else if (as && fas && ns->entries->sym->result != el->sym->result
547                       && gfc_compare_array_spec (as, fas) == 0)
548             gfc_error ("Function %s at %L has entries with mismatched "
549                        "array specifications", ns->entries->sym->name,
550                        &ns->entries->sym->declared_at);
551           /* The characteristics need to match and thus both need to have
552              the same string length, i.e. both len=*, or both len=4.
553              Having both len=<variable> is also possible, but difficult to
554              check at compile time.  */
555           else if (ts->type == BT_CHARACTER && ts->cl && fts->cl
556                    && (((ts->cl->length && !fts->cl->length)
557                         ||(!ts->cl->length && fts->cl->length))
558                        || (ts->cl->length
559                            && ts->cl->length->expr_type
560                               != fts->cl->length->expr_type)
561                        || (ts->cl->length
562                            && ts->cl->length->expr_type == EXPR_CONSTANT
563                            && mpz_cmp (ts->cl->length->value.integer,
564                                        fts->cl->length->value.integer) != 0)))
565             gfc_notify_std (GFC_STD_GNU, "Extension: Function %s at %L with "
566                             "entries returning variables of different "
567                             "string lengths", ns->entries->sym->name,
568                             &ns->entries->sym->declared_at);
569         }
570
571       if (el == NULL)
572         {
573           sym = ns->entries->sym->result;
574           /* All result types the same.  */
575           proc->ts = *fts;
576           if (sym->attr.dimension)
577             gfc_set_array_spec (proc, gfc_copy_array_spec (sym->as), NULL);
578           if (sym->attr.pointer)
579             gfc_add_pointer (&proc->attr, NULL);
580         }
581       else
582         {
583           /* Otherwise the result will be passed through a union by
584              reference.  */
585           proc->attr.mixed_entry_master = 1;
586           for (el = ns->entries; el; el = el->next)
587             {
588               sym = el->sym->result;
589               if (sym->attr.dimension)
590                 {
591                   if (el == ns->entries)
592                     gfc_error ("FUNCTION result %s can't be an array in "
593                                "FUNCTION %s at %L", sym->name,
594                                ns->entries->sym->name, &sym->declared_at);
595                   else
596                     gfc_error ("ENTRY result %s can't be an array in "
597                                "FUNCTION %s at %L", sym->name,
598                                ns->entries->sym->name, &sym->declared_at);
599                 }
600               else if (sym->attr.pointer)
601                 {
602                   if (el == ns->entries)
603                     gfc_error ("FUNCTION result %s can't be a POINTER in "
604                                "FUNCTION %s at %L", sym->name,
605                                ns->entries->sym->name, &sym->declared_at);
606                   else
607                     gfc_error ("ENTRY result %s can't be a POINTER in "
608                                "FUNCTION %s at %L", sym->name,
609                                ns->entries->sym->name, &sym->declared_at);
610                 }
611               else
612                 {
613                   ts = &sym->ts;
614                   if (ts->type == BT_UNKNOWN)
615                     ts = gfc_get_default_type (sym->name, NULL);
616                   switch (ts->type)
617                     {
618                     case BT_INTEGER:
619                       if (ts->kind == gfc_default_integer_kind)
620                         sym = NULL;
621                       break;
622                     case BT_REAL:
623                       if (ts->kind == gfc_default_real_kind
624                           || ts->kind == gfc_default_double_kind)
625                         sym = NULL;
626                       break;
627                     case BT_COMPLEX:
628                       if (ts->kind == gfc_default_complex_kind)
629                         sym = NULL;
630                       break;
631                     case BT_LOGICAL:
632                       if (ts->kind == gfc_default_logical_kind)
633                         sym = NULL;
634                       break;
635                     case BT_UNKNOWN:
636                       /* We will issue error elsewhere.  */
637                       sym = NULL;
638                       break;
639                     default:
640                       break;
641                     }
642                   if (sym)
643                     {
644                       if (el == ns->entries)
645                         gfc_error ("FUNCTION result %s can't be of type %s "
646                                    "in FUNCTION %s at %L", sym->name,
647                                    gfc_typename (ts), ns->entries->sym->name,
648                                    &sym->declared_at);
649                       else
650                         gfc_error ("ENTRY result %s can't be of type %s "
651                                    "in FUNCTION %s at %L", sym->name,
652                                    gfc_typename (ts), ns->entries->sym->name,
653                                    &sym->declared_at);
654                     }
655                 }
656             }
657         }
658     }
659   proc->attr.access = ACCESS_PRIVATE;
660   proc->attr.entry_master = 1;
661
662   /* Merge all the entry point arguments.  */
663   for (el = ns->entries; el; el = el->next)
664     merge_argument_lists (proc, el->sym->formal);
665
666   /* Check the master formal arguments for any that are not
667      present in all entry points.  */
668   for (el = ns->entries; el; el = el->next)
669     check_argument_lists (proc, el->sym->formal);
670
671   /* Use the master function for the function body.  */
672   ns->proc_name = proc;
673
674   /* Finalize the new symbols.  */
675   gfc_commit_symbols ();
676
677   /* Restore the original namespace.  */
678   gfc_current_ns = old_ns;
679 }
680
681
682 static bool
683 has_default_initializer (gfc_symbol *der)
684 {
685   gfc_component *c;
686
687   gcc_assert (der->attr.flavor == FL_DERIVED);
688   for (c = der->components; c; c = c->next)
689     if ((c->ts.type != BT_DERIVED && c->initializer)
690         || (c->ts.type == BT_DERIVED
691             && (!c->attr.pointer && has_default_initializer (c->ts.derived))))
692       break;
693
694   return c != NULL;
695 }
696
697 /* Resolve common variables.  */
698 static void
699 resolve_common_vars (gfc_symbol *sym, bool named_common)
700 {
701   gfc_symbol *csym = sym;
702
703   for (; csym; csym = csym->common_next)
704     {
705       if (csym->value || csym->attr.data)
706         {
707           if (!csym->ns->is_block_data)
708             gfc_notify_std (GFC_STD_GNU, "Variable '%s' at %L is in COMMON "
709                             "but only in BLOCK DATA initialization is "
710                             "allowed", csym->name, &csym->declared_at);
711           else if (!named_common)
712             gfc_notify_std (GFC_STD_GNU, "Initialized variable '%s' at %L is "
713                             "in a blank COMMON but initialization is only "
714                             "allowed in named common blocks", csym->name,
715                             &csym->declared_at);
716         }
717
718       if (csym->ts.type != BT_DERIVED)
719         continue;
720
721       if (!(csym->ts.derived->attr.sequence
722             || csym->ts.derived->attr.is_bind_c))
723         gfc_error_now ("Derived type variable '%s' in COMMON at %L "
724                        "has neither the SEQUENCE nor the BIND(C) "
725                        "attribute", csym->name, &csym->declared_at);
726       if (csym->ts.derived->attr.alloc_comp)
727         gfc_error_now ("Derived type variable '%s' in COMMON at %L "
728                        "has an ultimate component that is "
729                        "allocatable", csym->name, &csym->declared_at);
730       if (has_default_initializer (csym->ts.derived))
731         gfc_error_now ("Derived type variable '%s' in COMMON at %L "
732                        "may not have default initializer", csym->name,
733                        &csym->declared_at);
734
735       if (csym->attr.flavor == FL_UNKNOWN && !csym->attr.proc_pointer)
736         gfc_add_flavor (&csym->attr, FL_VARIABLE, csym->name, &csym->declared_at);
737     }
738 }
739
740 /* Resolve common blocks.  */
741 static void
742 resolve_common_blocks (gfc_symtree *common_root)
743 {
744   gfc_symbol *sym;
745
746   if (common_root == NULL)
747     return;
748
749   if (common_root->left)
750     resolve_common_blocks (common_root->left);
751   if (common_root->right)
752     resolve_common_blocks (common_root->right);
753
754   resolve_common_vars (common_root->n.common->head, true);
755
756   gfc_find_symbol (common_root->name, gfc_current_ns, 0, &sym);
757   if (sym == NULL)
758     return;
759
760   if (sym->attr.flavor == FL_PARAMETER)
761     gfc_error ("COMMON block '%s' at %L is used as PARAMETER at %L",
762                sym->name, &common_root->n.common->where, &sym->declared_at);
763
764   if (sym->attr.intrinsic)
765     gfc_error ("COMMON block '%s' at %L is also an intrinsic procedure",
766                sym->name, &common_root->n.common->where);
767   else if (sym->attr.result
768            ||(sym->attr.function && gfc_current_ns->proc_name == sym))
769     gfc_notify_std (GFC_STD_F2003, "Fortran 2003: COMMON block '%s' at %L "
770                     "that is also a function result", sym->name,
771                     &common_root->n.common->where);
772   else if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_INTERNAL
773            && sym->attr.proc != PROC_ST_FUNCTION)
774     gfc_notify_std (GFC_STD_F2003, "Fortran 2003: COMMON block '%s' at %L "
775                     "that is also a global procedure", sym->name,
776                     &common_root->n.common->where);
777 }
778
779
780 /* Resolve contained function types.  Because contained functions can call one
781    another, they have to be worked out before any of the contained procedures
782    can be resolved.
783
784    The good news is that if a function doesn't already have a type, the only
785    way it can get one is through an IMPLICIT type or a RESULT variable, because
786    by definition contained functions are contained namespace they're contained
787    in, not in a sibling or parent namespace.  */
788
789 static void
790 resolve_contained_functions (gfc_namespace *ns)
791 {
792   gfc_namespace *child;
793   gfc_entry_list *el;
794
795   resolve_formal_arglists (ns);
796
797   for (child = ns->contained; child; child = child->sibling)
798     {
799       /* Resolve alternate entry points first.  */
800       resolve_entries (child);
801
802       /* Then check function return types.  */
803       resolve_contained_fntype (child->proc_name, child);
804       for (el = child->entries; el; el = el->next)
805         resolve_contained_fntype (el->sym, child);
806     }
807 }
808
809
810 /* Resolve all of the elements of a structure constructor and make sure that
811    the types are correct.  */
812
813 static gfc_try
814 resolve_structure_cons (gfc_expr *expr)
815 {
816   gfc_constructor *cons;
817   gfc_component *comp;
818   gfc_try t;
819   symbol_attribute a;
820
821   t = SUCCESS;
822   cons = expr->value.constructor;
823   /* A constructor may have references if it is the result of substituting a
824      parameter variable.  In this case we just pull out the component we
825      want.  */
826   if (expr->ref)
827     comp = expr->ref->u.c.sym->components;
828   else
829     comp = expr->ts.derived->components;
830
831   /* See if the user is trying to invoke a structure constructor for one of
832      the iso_c_binding derived types.  */
833   if (expr->ts.derived && expr->ts.derived->ts.is_iso_c && cons
834       && cons->expr != NULL)
835     {
836       gfc_error ("Components of structure constructor '%s' at %L are PRIVATE",
837                  expr->ts.derived->name, &(expr->where));
838       return FAILURE;
839     }
840
841   for (; comp; comp = comp->next, cons = cons->next)
842     {
843       int rank;
844
845       if (!cons->expr)
846         continue;
847
848       if (gfc_resolve_expr (cons->expr) == FAILURE)
849         {
850           t = FAILURE;
851           continue;
852         }
853
854       rank = comp->as ? comp->as->rank : 0;
855       if (cons->expr->expr_type != EXPR_NULL && rank != cons->expr->rank
856           && (comp->attr.allocatable || cons->expr->rank))
857         {
858           gfc_error ("The rank of the element in the derived type "
859                      "constructor at %L does not match that of the "
860                      "component (%d/%d)", &cons->expr->where,
861                      cons->expr->rank, rank);
862           t = FAILURE;
863         }
864
865       /* If we don't have the right type, try to convert it.  */
866
867       if (!gfc_compare_types (&cons->expr->ts, &comp->ts))
868         {
869           t = FAILURE;
870           if (comp->attr.pointer && cons->expr->ts.type != BT_UNKNOWN)
871             gfc_error ("The element in the derived type constructor at %L, "
872                        "for pointer component '%s', is %s but should be %s",
873                        &cons->expr->where, comp->name,
874                        gfc_basic_typename (cons->expr->ts.type),
875                        gfc_basic_typename (comp->ts.type));
876           else
877             t = gfc_convert_type (cons->expr, &comp->ts, 1);
878         }
879
880       if (cons->expr->expr_type == EXPR_NULL
881           && !(comp->attr.pointer || comp->attr.allocatable
882                || comp->attr.proc_pointer))
883         {
884           t = FAILURE;
885           gfc_error ("The NULL in the derived type constructor at %L is "
886                      "being applied to component '%s', which is neither "
887                      "a POINTER nor ALLOCATABLE", &cons->expr->where,
888                      comp->name);
889         }
890
891       if (!comp->attr.pointer || cons->expr->expr_type == EXPR_NULL)
892         continue;
893
894       a = gfc_expr_attr (cons->expr);
895
896       if (!a.pointer && !a.target)
897         {
898           t = FAILURE;
899           gfc_error ("The element in the derived type constructor at %L, "
900                      "for pointer component '%s' should be a POINTER or "
901                      "a TARGET", &cons->expr->where, comp->name);
902         }
903     }
904
905   return t;
906 }
907
908
909 /****************** Expression name resolution ******************/
910
911 /* Returns 0 if a symbol was not declared with a type or
912    attribute declaration statement, nonzero otherwise.  */
913
914 static int
915 was_declared (gfc_symbol *sym)
916 {
917   symbol_attribute a;
918
919   a = sym->attr;
920
921   if (!a.implicit_type && sym->ts.type != BT_UNKNOWN)
922     return 1;
923
924   if (a.allocatable || a.dimension || a.dummy || a.external || a.intrinsic
925       || a.optional || a.pointer || a.save || a.target || a.volatile_
926       || a.value || a.access != ACCESS_UNKNOWN || a.intent != INTENT_UNKNOWN)
927     return 1;
928
929   return 0;
930 }
931
932
933 /* Determine if a symbol is generic or not.  */
934
935 static int
936 generic_sym (gfc_symbol *sym)
937 {
938   gfc_symbol *s;
939
940   if (sym->attr.generic ||
941       (sym->attr.intrinsic && gfc_generic_intrinsic (sym->name)))
942     return 1;
943
944   if (was_declared (sym) || sym->ns->parent == NULL)
945     return 0;
946
947   gfc_find_symbol (sym->name, sym->ns->parent, 1, &s);
948   
949   if (s != NULL)
950     {
951       if (s == sym)
952         return 0;
953       else
954         return generic_sym (s);
955     }
956
957   return 0;
958 }
959
960
961 /* Determine if a symbol is specific or not.  */
962
963 static int
964 specific_sym (gfc_symbol *sym)
965 {
966   gfc_symbol *s;
967
968   if (sym->attr.if_source == IFSRC_IFBODY
969       || sym->attr.proc == PROC_MODULE
970       || sym->attr.proc == PROC_INTERNAL
971       || sym->attr.proc == PROC_ST_FUNCTION
972       || (sym->attr.intrinsic && gfc_specific_intrinsic (sym->name))
973       || sym->attr.external)
974     return 1;
975
976   if (was_declared (sym) || sym->ns->parent == NULL)
977     return 0;
978
979   gfc_find_symbol (sym->name, sym->ns->parent, 1, &s);
980
981   return (s == NULL) ? 0 : specific_sym (s);
982 }
983
984
985 /* Figure out if the procedure is specific, generic or unknown.  */
986
987 typedef enum
988 { PTYPE_GENERIC = 1, PTYPE_SPECIFIC, PTYPE_UNKNOWN }
989 proc_type;
990
991 static proc_type
992 procedure_kind (gfc_symbol *sym)
993 {
994   if (generic_sym (sym))
995     return PTYPE_GENERIC;
996
997   if (specific_sym (sym))
998     return PTYPE_SPECIFIC;
999
1000   return PTYPE_UNKNOWN;
1001 }
1002
1003 /* Check references to assumed size arrays.  The flag need_full_assumed_size
1004    is nonzero when matching actual arguments.  */
1005
1006 static int need_full_assumed_size = 0;
1007
1008 static bool
1009 check_assumed_size_reference (gfc_symbol *sym, gfc_expr *e)
1010 {
1011   if (need_full_assumed_size || !(sym->as && sym->as->type == AS_ASSUMED_SIZE))
1012       return false;
1013
1014   /* FIXME: The comparison "e->ref->u.ar.type == AR_FULL" is wrong.
1015      What should it be?  */
1016   if ((e->ref->u.ar.end[e->ref->u.ar.as->rank - 1] == NULL)
1017           && (e->ref->u.ar.as->type == AS_ASSUMED_SIZE)
1018                && (e->ref->u.ar.type == AR_FULL))
1019     {
1020       gfc_error ("The upper bound in the last dimension must "
1021                  "appear in the reference to the assumed size "
1022                  "array '%s' at %L", sym->name, &e->where);
1023       return true;
1024     }
1025   return false;
1026 }
1027
1028
1029 /* Look for bad assumed size array references in argument expressions
1030   of elemental and array valued intrinsic procedures.  Since this is
1031   called from procedure resolution functions, it only recurses at
1032   operators.  */
1033
1034 static bool
1035 resolve_assumed_size_actual (gfc_expr *e)
1036 {
1037   if (e == NULL)
1038    return false;
1039
1040   switch (e->expr_type)
1041     {
1042     case EXPR_VARIABLE:
1043       if (e->symtree && check_assumed_size_reference (e->symtree->n.sym, e))
1044         return true;
1045       break;
1046
1047     case EXPR_OP:
1048       if (resolve_assumed_size_actual (e->value.op.op1)
1049           || resolve_assumed_size_actual (e->value.op.op2))
1050         return true;
1051       break;
1052
1053     default:
1054       break;
1055     }
1056   return false;
1057 }
1058
1059
1060 /* Check a generic procedure, passed as an actual argument, to see if
1061    there is a matching specific name.  If none, it is an error, and if
1062    more than one, the reference is ambiguous.  */
1063 static int
1064 count_specific_procs (gfc_expr *e)
1065 {
1066   int n;
1067   gfc_interface *p;
1068   gfc_symbol *sym;
1069         
1070   n = 0;
1071   sym = e->symtree->n.sym;
1072
1073   for (p = sym->generic; p; p = p->next)
1074     if (strcmp (sym->name, p->sym->name) == 0)
1075       {
1076         e->symtree = gfc_find_symtree (p->sym->ns->sym_root,
1077                                        sym->name);
1078         n++;
1079       }
1080
1081   if (n > 1)
1082     gfc_error ("'%s' at %L is ambiguous", e->symtree->n.sym->name,
1083                &e->where);
1084
1085   if (n == 0)
1086     gfc_error ("GENERIC procedure '%s' is not allowed as an actual "
1087                "argument at %L", sym->name, &e->where);
1088
1089   return n;
1090 }
1091
1092
1093 /* See if a call to sym could possibly be a not allowed RECURSION because of
1094    a missing RECURIVE declaration.  This means that either sym is the current
1095    context itself, or sym is the parent of a contained procedure calling its
1096    non-RECURSIVE containing procedure.
1097    This also works if sym is an ENTRY.  */
1098
1099 static bool
1100 is_illegal_recursion (gfc_symbol* sym, gfc_namespace* context)
1101 {
1102   gfc_symbol* proc_sym;
1103   gfc_symbol* context_proc;
1104
1105   gcc_assert (sym->attr.flavor == FL_PROCEDURE);
1106
1107   /* If we've got an ENTRY, find real procedure.  */
1108   if (sym->attr.entry && sym->ns->entries)
1109     proc_sym = sym->ns->entries->sym;
1110   else
1111     proc_sym = sym;
1112
1113   /* If sym is RECURSIVE, all is well of course.  */
1114   if (proc_sym->attr.recursive || gfc_option.flag_recursive)
1115     return false;
1116
1117   /* Find the context procdure's "real" symbol if it has entries.  */
1118   context_proc = (context->entries ? context->entries->sym
1119                                    : context->proc_name);
1120   if (!context_proc)
1121     return true;
1122
1123   /* A call from sym's body to itself is recursion, of course.  */
1124   if (context_proc == proc_sym)
1125     return true;
1126
1127   /* The same is true if context is a contained procedure and sym the
1128      containing one.  */
1129   if (context_proc->attr.contained)
1130     {
1131       gfc_symbol* parent_proc;
1132
1133       gcc_assert (context->parent);
1134       parent_proc = (context->parent->entries ? context->parent->entries->sym
1135                                               : context->parent->proc_name);
1136
1137       if (parent_proc == proc_sym)
1138         return true;
1139     }
1140
1141   return false;
1142 }
1143
1144
1145 /* Resolve an intrinsic procedure: Set its function/subroutine attribute,
1146    its typespec and formal argument list.  */
1147
1148 static gfc_try
1149 resolve_intrinsic (gfc_symbol *sym, locus *loc)
1150 {
1151   gfc_intrinsic_sym *isym = gfc_find_function (sym->name);
1152   if (isym)
1153     {
1154       if (!sym->attr.function &&
1155           gfc_add_function (&sym->attr, sym->name, loc) == FAILURE)
1156         return FAILURE;
1157       sym->ts = isym->ts;
1158     }
1159   else
1160     {
1161       isym = gfc_find_subroutine (sym->name);
1162       gcc_assert (isym);
1163       if (!sym->attr.subroutine &&
1164           gfc_add_subroutine (&sym->attr, sym->name, loc) == FAILURE)
1165         return FAILURE;
1166     }
1167   if (!sym->formal)
1168     gfc_copy_formal_args_intr (sym, isym);
1169   return SUCCESS;
1170 }
1171
1172
1173 /* Resolve a procedure expression, like passing it to a called procedure or as
1174    RHS for a procedure pointer assignment.  */
1175
1176 static gfc_try
1177 resolve_procedure_expression (gfc_expr* expr)
1178 {
1179   gfc_symbol* sym;
1180
1181   if (expr->expr_type != EXPR_VARIABLE)
1182     return SUCCESS;
1183   gcc_assert (expr->symtree);
1184
1185   sym = expr->symtree->n.sym;
1186
1187   if (sym->attr.intrinsic)
1188     resolve_intrinsic (sym, &expr->where);
1189
1190   if (sym->attr.flavor != FL_PROCEDURE
1191       || (sym->attr.function && sym->result == sym))
1192     return SUCCESS;
1193
1194   /* A non-RECURSIVE procedure that is used as procedure expression within its
1195      own body is in danger of being called recursively.  */
1196   if (is_illegal_recursion (sym, gfc_current_ns))
1197     gfc_warning ("Non-RECURSIVE procedure '%s' at %L is possibly calling"
1198                  " itself recursively.  Declare it RECURSIVE or use"
1199                  " -frecursive", sym->name, &expr->where);
1200   
1201   return SUCCESS;
1202 }
1203
1204
1205 /* Resolve an actual argument list.  Most of the time, this is just
1206    resolving the expressions in the list.
1207    The exception is that we sometimes have to decide whether arguments
1208    that look like procedure arguments are really simple variable
1209    references.  */
1210
1211 static gfc_try
1212 resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype,
1213                         bool no_formal_args)
1214 {
1215   gfc_symbol *sym;
1216   gfc_symtree *parent_st;
1217   gfc_expr *e;
1218   int save_need_full_assumed_size;
1219   gfc_component *comp;
1220         
1221   for (; arg; arg = arg->next)
1222     {
1223       e = arg->expr;
1224       if (e == NULL)
1225         {
1226           /* Check the label is a valid branching target.  */
1227           if (arg->label)
1228             {
1229               if (arg->label->defined == ST_LABEL_UNKNOWN)
1230                 {
1231                   gfc_error ("Label %d referenced at %L is never defined",
1232                              arg->label->value, &arg->label->where);
1233                   return FAILURE;
1234                 }
1235             }
1236           continue;
1237         }
1238
1239       if (gfc_is_proc_ptr_comp (e, &comp))
1240         {
1241           e->ts = comp->ts;
1242           if (e->value.compcall.actual == NULL)
1243             e->expr_type = EXPR_VARIABLE;
1244           else
1245             {
1246               if (comp->as != NULL)
1247                 e->rank = comp->as->rank;
1248               e->expr_type = EXPR_FUNCTION;
1249             }
1250           goto argument_list;
1251         }
1252
1253       if (e->expr_type == EXPR_VARIABLE
1254             && e->symtree->n.sym->attr.generic
1255             && no_formal_args
1256             && count_specific_procs (e) != 1)
1257         return FAILURE;
1258
1259       if (e->ts.type != BT_PROCEDURE)
1260         {
1261           save_need_full_assumed_size = need_full_assumed_size;
1262           if (e->expr_type != EXPR_VARIABLE)
1263             need_full_assumed_size = 0;
1264           if (gfc_resolve_expr (e) != SUCCESS)
1265             return FAILURE;
1266           need_full_assumed_size = save_need_full_assumed_size;
1267           goto argument_list;
1268         }
1269
1270       /* See if the expression node should really be a variable reference.  */
1271
1272       sym = e->symtree->n.sym;
1273
1274       if (sym->attr.flavor == FL_PROCEDURE
1275           || sym->attr.intrinsic
1276           || sym->attr.external)
1277         {
1278           int actual_ok;
1279
1280           /* If a procedure is not already determined to be something else
1281              check if it is intrinsic.  */
1282           if (!sym->attr.intrinsic
1283               && !(sym->attr.external || sym->attr.use_assoc
1284                    || sym->attr.if_source == IFSRC_IFBODY)
1285               && gfc_is_intrinsic (sym, sym->attr.subroutine, e->where))
1286             sym->attr.intrinsic = 1;
1287
1288           if (sym->attr.proc == PROC_ST_FUNCTION)
1289             {
1290               gfc_error ("Statement function '%s' at %L is not allowed as an "
1291                          "actual argument", sym->name, &e->where);
1292             }
1293
1294           actual_ok = gfc_intrinsic_actual_ok (sym->name,
1295                                                sym->attr.subroutine);
1296           if (sym->attr.intrinsic && actual_ok == 0)
1297             {
1298               gfc_error ("Intrinsic '%s' at %L is not allowed as an "
1299                          "actual argument", sym->name, &e->where);
1300             }
1301
1302           if (sym->attr.contained && !sym->attr.use_assoc
1303               && sym->ns->proc_name->attr.flavor != FL_MODULE)
1304             {
1305               gfc_error ("Internal procedure '%s' is not allowed as an "
1306                          "actual argument at %L", sym->name, &e->where);
1307             }
1308
1309           if (sym->attr.elemental && !sym->attr.intrinsic)
1310             {
1311               gfc_error ("ELEMENTAL non-INTRINSIC procedure '%s' is not "
1312                          "allowed as an actual argument at %L", sym->name,
1313                          &e->where);
1314             }
1315
1316           /* Check if a generic interface has a specific procedure
1317             with the same name before emitting an error.  */
1318           if (sym->attr.generic && count_specific_procs (e) != 1)
1319             return FAILURE;
1320           
1321           /* Just in case a specific was found for the expression.  */
1322           sym = e->symtree->n.sym;
1323
1324           /* If the symbol is the function that names the current (or
1325              parent) scope, then we really have a variable reference.  */
1326
1327           if (sym->attr.function && sym->result == sym
1328               && (sym->ns->proc_name == sym
1329                   || (sym->ns->parent != NULL
1330                       && sym->ns->parent->proc_name == sym)))
1331             goto got_variable;
1332
1333           /* If all else fails, see if we have a specific intrinsic.  */
1334           if (sym->ts.type == BT_UNKNOWN && sym->attr.intrinsic)
1335             {
1336               gfc_intrinsic_sym *isym;
1337
1338               isym = gfc_find_function (sym->name);
1339               if (isym == NULL || !isym->specific)
1340                 {
1341                   gfc_error ("Unable to find a specific INTRINSIC procedure "
1342                              "for the reference '%s' at %L", sym->name,
1343                              &e->where);
1344                   return FAILURE;
1345                 }
1346               sym->ts = isym->ts;
1347               sym->attr.intrinsic = 1;
1348               sym->attr.function = 1;
1349             }
1350
1351           if (gfc_resolve_expr (e) == FAILURE)
1352             return FAILURE;
1353           goto argument_list;
1354         }
1355
1356       /* See if the name is a module procedure in a parent unit.  */
1357
1358       if (was_declared (sym) || sym->ns->parent == NULL)
1359         goto got_variable;
1360
1361       if (gfc_find_sym_tree (sym->name, sym->ns->parent, 1, &parent_st))
1362         {
1363           gfc_error ("Symbol '%s' at %L is ambiguous", sym->name, &e->where);
1364           return FAILURE;
1365         }
1366
1367       if (parent_st == NULL)
1368         goto got_variable;
1369
1370       sym = parent_st->n.sym;
1371       e->symtree = parent_st;           /* Point to the right thing.  */
1372
1373       if (sym->attr.flavor == FL_PROCEDURE
1374           || sym->attr.intrinsic
1375           || sym->attr.external)
1376         {
1377           if (gfc_resolve_expr (e) == FAILURE)
1378             return FAILURE;
1379           goto argument_list;
1380         }
1381
1382     got_variable:
1383       e->expr_type = EXPR_VARIABLE;
1384       e->ts = sym->ts;
1385       if (sym->as != NULL)
1386         {
1387           e->rank = sym->as->rank;
1388           e->ref = gfc_get_ref ();
1389           e->ref->type = REF_ARRAY;
1390           e->ref->u.ar.type = AR_FULL;
1391           e->ref->u.ar.as = sym->as;
1392         }
1393
1394       /* Expressions are assigned a default ts.type of BT_PROCEDURE in
1395          primary.c (match_actual_arg). If above code determines that it
1396          is a  variable instead, it needs to be resolved as it was not
1397          done at the beginning of this function.  */
1398       save_need_full_assumed_size = need_full_assumed_size;
1399       if (e->expr_type != EXPR_VARIABLE)
1400         need_full_assumed_size = 0;
1401       if (gfc_resolve_expr (e) != SUCCESS)
1402         return FAILURE;
1403       need_full_assumed_size = save_need_full_assumed_size;
1404
1405     argument_list:
1406       /* Check argument list functions %VAL, %LOC and %REF.  There is
1407          nothing to do for %REF.  */
1408       if (arg->name && arg->name[0] == '%')
1409         {
1410           if (strncmp ("%VAL", arg->name, 4) == 0)
1411             {
1412               if (e->ts.type == BT_CHARACTER || e->ts.type == BT_DERIVED)
1413                 {
1414                   gfc_error ("By-value argument at %L is not of numeric "
1415                              "type", &e->where);
1416                   return FAILURE;
1417                 }
1418
1419               if (e->rank)
1420                 {
1421                   gfc_error ("By-value argument at %L cannot be an array or "
1422                              "an array section", &e->where);
1423                 return FAILURE;
1424                 }
1425
1426               /* Intrinsics are still PROC_UNKNOWN here.  However,
1427                  since same file external procedures are not resolvable
1428                  in gfortran, it is a good deal easier to leave them to
1429                  intrinsic.c.  */
1430               if (ptype != PROC_UNKNOWN
1431                   && ptype != PROC_DUMMY
1432                   && ptype != PROC_EXTERNAL
1433                   && ptype != PROC_MODULE)
1434                 {
1435                   gfc_error ("By-value argument at %L is not allowed "
1436                              "in this context", &e->where);
1437                   return FAILURE;
1438                 }
1439             }
1440
1441           /* Statement functions have already been excluded above.  */
1442           else if (strncmp ("%LOC", arg->name, 4) == 0
1443                    && e->ts.type == BT_PROCEDURE)
1444             {
1445               if (e->symtree->n.sym->attr.proc == PROC_INTERNAL)
1446                 {
1447                   gfc_error ("Passing internal procedure at %L by location "
1448                              "not allowed", &e->where);
1449                   return FAILURE;
1450                 }
1451             }
1452         }
1453     }
1454
1455   return SUCCESS;
1456 }
1457
1458
1459 /* Do the checks of the actual argument list that are specific to elemental
1460    procedures.  If called with c == NULL, we have a function, otherwise if
1461    expr == NULL, we have a subroutine.  */
1462
1463 static gfc_try
1464 resolve_elemental_actual (gfc_expr *expr, gfc_code *c)
1465 {
1466   gfc_actual_arglist *arg0;
1467   gfc_actual_arglist *arg;
1468   gfc_symbol *esym = NULL;
1469   gfc_intrinsic_sym *isym = NULL;
1470   gfc_expr *e = NULL;
1471   gfc_intrinsic_arg *iformal = NULL;
1472   gfc_formal_arglist *eformal = NULL;
1473   bool formal_optional = false;
1474   bool set_by_optional = false;
1475   int i;
1476   int rank = 0;
1477
1478   /* Is this an elemental procedure?  */
1479   if (expr && expr->value.function.actual != NULL)
1480     {
1481       if (expr->value.function.esym != NULL
1482           && expr->value.function.esym->attr.elemental)
1483         {
1484           arg0 = expr->value.function.actual;
1485           esym = expr->value.function.esym;
1486         }
1487       else if (expr->value.function.isym != NULL
1488                && expr->value.function.isym->elemental)
1489         {
1490           arg0 = expr->value.function.actual;
1491           isym = expr->value.function.isym;
1492         }
1493       else
1494         return SUCCESS;
1495     }
1496   else if (c && c->ext.actual != NULL)
1497     {
1498       arg0 = c->ext.actual;
1499       
1500       if (c->resolved_sym)
1501         esym = c->resolved_sym;
1502       else
1503         esym = c->symtree->n.sym;
1504       gcc_assert (esym);
1505
1506       if (!esym->attr.elemental)
1507         return SUCCESS;
1508     }
1509   else
1510     return SUCCESS;
1511
1512   /* The rank of an elemental is the rank of its array argument(s).  */
1513   for (arg = arg0; arg; arg = arg->next)
1514     {
1515       if (arg->expr != NULL && arg->expr->rank > 0)
1516         {
1517           rank = arg->expr->rank;
1518           if (arg->expr->expr_type == EXPR_VARIABLE
1519               && arg->expr->symtree->n.sym->attr.optional)
1520             set_by_optional = true;
1521
1522           /* Function specific; set the result rank and shape.  */
1523           if (expr)
1524             {
1525               expr->rank = rank;
1526               if (!expr->shape && arg->expr->shape)
1527                 {
1528                   expr->shape = gfc_get_shape (rank);
1529                   for (i = 0; i < rank; i++)
1530                     mpz_init_set (expr->shape[i], arg->expr->shape[i]);
1531                 }
1532             }
1533           break;
1534         }
1535     }
1536
1537   /* If it is an array, it shall not be supplied as an actual argument
1538      to an elemental procedure unless an array of the same rank is supplied
1539      as an actual argument corresponding to a nonoptional dummy argument of
1540      that elemental procedure(12.4.1.5).  */
1541   formal_optional = false;
1542   if (isym)
1543     iformal = isym->formal;
1544   else
1545     eformal = esym->formal;
1546
1547   for (arg = arg0; arg; arg = arg->next)
1548     {
1549       if (eformal)
1550         {
1551           if (eformal->sym && eformal->sym->attr.optional)
1552             formal_optional = true;
1553           eformal = eformal->next;
1554         }
1555       else if (isym && iformal)
1556         {
1557           if (iformal->optional)
1558             formal_optional = true;
1559           iformal = iformal->next;
1560         }
1561       else if (isym)
1562         formal_optional = true;
1563
1564       if (pedantic && arg->expr != NULL
1565           && arg->expr->expr_type == EXPR_VARIABLE
1566           && arg->expr->symtree->n.sym->attr.optional
1567           && formal_optional
1568           && arg->expr->rank
1569           && (set_by_optional || arg->expr->rank != rank)
1570           && !(isym && isym->id == GFC_ISYM_CONVERSION))
1571         {
1572           gfc_warning ("'%s' at %L is an array and OPTIONAL; IF IT IS "
1573                        "MISSING, it cannot be the actual argument of an "
1574                        "ELEMENTAL procedure unless there is a non-optional "
1575                        "argument with the same rank (12.4.1.5)",
1576                        arg->expr->symtree->n.sym->name, &arg->expr->where);
1577           return FAILURE;
1578         }
1579     }
1580
1581   for (arg = arg0; arg; arg = arg->next)
1582     {
1583       if (arg->expr == NULL || arg->expr->rank == 0)
1584         continue;
1585
1586       /* Being elemental, the last upper bound of an assumed size array
1587          argument must be present.  */
1588       if (resolve_assumed_size_actual (arg->expr))
1589         return FAILURE;
1590
1591       /* Elemental procedure's array actual arguments must conform.  */
1592       if (e != NULL)
1593         {
1594           if (gfc_check_conformance (arg->expr, e,
1595                                      "elemental procedure") == FAILURE)
1596             return FAILURE;
1597         }
1598       else
1599         e = arg->expr;
1600     }
1601
1602   /* INTENT(OUT) is only allowed for subroutines; if any actual argument
1603      is an array, the intent inout/out variable needs to be also an array.  */
1604   if (rank > 0 && esym && expr == NULL)
1605     for (eformal = esym->formal, arg = arg0; arg && eformal;
1606          arg = arg->next, eformal = eformal->next)
1607       if ((eformal->sym->attr.intent == INTENT_OUT
1608            || eformal->sym->attr.intent == INTENT_INOUT)
1609           && arg->expr && arg->expr->rank == 0)
1610         {
1611           gfc_error ("Actual argument at %L for INTENT(%s) dummy '%s' of "
1612                      "ELEMENTAL subroutine '%s' is a scalar, but another "
1613                      "actual argument is an array", &arg->expr->where,
1614                      (eformal->sym->attr.intent == INTENT_OUT) ? "OUT"
1615                      : "INOUT", eformal->sym->name, esym->name);
1616           return FAILURE;
1617         }
1618   return SUCCESS;
1619 }
1620
1621
1622 /* Go through each actual argument in ACTUAL and see if it can be
1623    implemented as an inlined, non-copying intrinsic.  FNSYM is the
1624    function being called, or NULL if not known.  */
1625
1626 static void
1627 find_noncopying_intrinsics (gfc_symbol *fnsym, gfc_actual_arglist *actual)
1628 {
1629   gfc_actual_arglist *ap;
1630   gfc_expr *expr;
1631
1632   for (ap = actual; ap; ap = ap->next)
1633     if (ap->expr
1634         && (expr = gfc_get_noncopying_intrinsic_argument (ap->expr))
1635         && !gfc_check_fncall_dependency (expr, INTENT_IN, fnsym, actual,
1636                                          NOT_ELEMENTAL))
1637       ap->expr->inline_noncopying_intrinsic = 1;
1638 }
1639
1640
1641 /* This function does the checking of references to global procedures
1642    as defined in sections 18.1 and 14.1, respectively, of the Fortran
1643    77 and 95 standards.  It checks for a gsymbol for the name, making
1644    one if it does not already exist.  If it already exists, then the
1645    reference being resolved must correspond to the type of gsymbol.
1646    Otherwise, the new symbol is equipped with the attributes of the
1647    reference.  The corresponding code that is called in creating
1648    global entities is parse.c.
1649
1650    In addition, for all but -std=legacy, the gsymbols are used to
1651    check the interfaces of external procedures from the same file.
1652    The namespace of the gsymbol is resolved and then, once this is
1653    done the interface is checked.  */
1654
1655 static void
1656 resolve_global_procedure (gfc_symbol *sym, locus *where,
1657                           gfc_actual_arglist **actual, int sub)
1658 {
1659   gfc_gsymbol * gsym;
1660   gfc_namespace *ns;
1661   enum gfc_symbol_type type;
1662
1663   type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
1664
1665   gsym = gfc_get_gsymbol (sym->name);
1666
1667   if ((gsym->type != GSYM_UNKNOWN && gsym->type != type))
1668     gfc_global_used (gsym, where);
1669
1670   if (gfc_option.flag_whole_file
1671         && gsym->type != GSYM_UNKNOWN
1672         && gsym->ns
1673         && gsym->ns->proc_name)
1674     {
1675       /* Make sure that translation for the gsymbol occurs before
1676          the procedure currently being resolved.  */
1677       ns = gsym->ns->resolved ? NULL : gfc_global_ns_list;
1678       for (; ns && ns != gsym->ns; ns = ns->sibling)
1679         {
1680           if (ns->sibling == gsym->ns)
1681             {
1682               ns->sibling = gsym->ns->sibling;
1683               gsym->ns->sibling = gfc_global_ns_list;
1684               gfc_global_ns_list = gsym->ns;
1685               break;
1686             }
1687         }
1688
1689       if (!gsym->ns->resolved)
1690         gfc_resolve (gsym->ns);
1691
1692       gfc_procedure_use (gsym->ns->proc_name, actual, where);
1693     }
1694
1695   if (gsym->type == GSYM_UNKNOWN)
1696     {
1697       gsym->type = type;
1698       gsym->where = *where;
1699     }
1700
1701   gsym->used = 1;
1702 }
1703
1704
1705 /************* Function resolution *************/
1706
1707 /* Resolve a function call known to be generic.
1708    Section 14.1.2.4.1.  */
1709
1710 static match
1711 resolve_generic_f0 (gfc_expr *expr, gfc_symbol *sym)
1712 {
1713   gfc_symbol *s;
1714
1715   if (sym->attr.generic)
1716     {
1717       s = gfc_search_interface (sym->generic, 0, &expr->value.function.actual);
1718       if (s != NULL)
1719         {
1720           expr->value.function.name = s->name;
1721           expr->value.function.esym = s;
1722
1723           if (s->ts.type != BT_UNKNOWN)
1724             expr->ts = s->ts;
1725           else if (s->result != NULL && s->result->ts.type != BT_UNKNOWN)
1726             expr->ts = s->result->ts;
1727
1728           if (s->as != NULL)
1729             expr->rank = s->as->rank;
1730           else if (s->result != NULL && s->result->as != NULL)
1731             expr->rank = s->result->as->rank;
1732
1733           gfc_set_sym_referenced (expr->value.function.esym);
1734
1735           return MATCH_YES;
1736         }
1737
1738       /* TODO: Need to search for elemental references in generic
1739          interface.  */
1740     }
1741
1742   if (sym->attr.intrinsic)
1743     return gfc_intrinsic_func_interface (expr, 0);
1744
1745   return MATCH_NO;
1746 }
1747
1748
1749 static gfc_try
1750 resolve_generic_f (gfc_expr *expr)
1751 {
1752   gfc_symbol *sym;
1753   match m;
1754
1755   sym = expr->symtree->n.sym;
1756
1757   for (;;)
1758     {
1759       m = resolve_generic_f0 (expr, sym);
1760       if (m == MATCH_YES)
1761         return SUCCESS;
1762       else if (m == MATCH_ERROR)
1763         return FAILURE;
1764
1765 generic:
1766       if (sym->ns->parent == NULL)
1767         break;
1768       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
1769
1770       if (sym == NULL)
1771         break;
1772       if (!generic_sym (sym))
1773         goto generic;
1774     }
1775
1776   /* Last ditch attempt.  See if the reference is to an intrinsic
1777      that possesses a matching interface.  14.1.2.4  */
1778   if (sym && !gfc_is_intrinsic (sym, 0, expr->where))
1779     {
1780       gfc_error ("There is no specific function for the generic '%s' at %L",
1781                  expr->symtree->n.sym->name, &expr->where);
1782       return FAILURE;
1783     }
1784
1785   m = gfc_intrinsic_func_interface (expr, 0);
1786   if (m == MATCH_YES)
1787     return SUCCESS;
1788   if (m == MATCH_NO)
1789     gfc_error ("Generic function '%s' at %L is not consistent with a "
1790                "specific intrinsic interface", expr->symtree->n.sym->name,
1791                &expr->where);
1792
1793   return FAILURE;
1794 }
1795
1796
1797 /* Resolve a function call known to be specific.  */
1798
1799 static match
1800 resolve_specific_f0 (gfc_symbol *sym, gfc_expr *expr)
1801 {
1802   match m;
1803
1804   if (sym->attr.external || sym->attr.if_source == IFSRC_IFBODY)
1805     {
1806       if (sym->attr.dummy)
1807         {
1808           sym->attr.proc = PROC_DUMMY;
1809           goto found;
1810         }
1811
1812       sym->attr.proc = PROC_EXTERNAL;
1813       goto found;
1814     }
1815
1816   if (sym->attr.proc == PROC_MODULE
1817       || sym->attr.proc == PROC_ST_FUNCTION
1818       || sym->attr.proc == PROC_INTERNAL)
1819     goto found;
1820
1821   if (sym->attr.intrinsic)
1822     {
1823       m = gfc_intrinsic_func_interface (expr, 1);
1824       if (m == MATCH_YES)
1825         return MATCH_YES;
1826       if (m == MATCH_NO)
1827         gfc_error ("Function '%s' at %L is INTRINSIC but is not compatible "
1828                    "with an intrinsic", sym->name, &expr->where);
1829
1830       return MATCH_ERROR;
1831     }
1832
1833   return MATCH_NO;
1834
1835 found:
1836   gfc_procedure_use (sym, &expr->value.function.actual, &expr->where);
1837
1838   if (sym->result)
1839     expr->ts = sym->result->ts;
1840   else
1841     expr->ts = sym->ts;
1842   expr->value.function.name = sym->name;
1843   expr->value.function.esym = sym;
1844   if (sym->as != NULL)
1845     expr->rank = sym->as->rank;
1846
1847   return MATCH_YES;
1848 }
1849
1850
1851 static gfc_try
1852 resolve_specific_f (gfc_expr *expr)
1853 {
1854   gfc_symbol *sym;
1855   match m;
1856
1857   sym = expr->symtree->n.sym;
1858
1859   for (;;)
1860     {
1861       m = resolve_specific_f0 (sym, expr);
1862       if (m == MATCH_YES)
1863         return SUCCESS;
1864       if (m == MATCH_ERROR)
1865         return FAILURE;
1866
1867       if (sym->ns->parent == NULL)
1868         break;
1869
1870       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
1871
1872       if (sym == NULL)
1873         break;
1874     }
1875
1876   gfc_error ("Unable to resolve the specific function '%s' at %L",
1877              expr->symtree->n.sym->name, &expr->where);
1878
1879   return SUCCESS;
1880 }
1881
1882
1883 /* Resolve a procedure call not known to be generic nor specific.  */
1884
1885 static gfc_try
1886 resolve_unknown_f (gfc_expr *expr)
1887 {
1888   gfc_symbol *sym;
1889   gfc_typespec *ts;
1890
1891   sym = expr->symtree->n.sym;
1892
1893   if (sym->attr.dummy)
1894     {
1895       sym->attr.proc = PROC_DUMMY;
1896       expr->value.function.name = sym->name;
1897       goto set_type;
1898     }
1899
1900   /* See if we have an intrinsic function reference.  */
1901
1902   if (gfc_is_intrinsic (sym, 0, expr->where))
1903     {
1904       if (gfc_intrinsic_func_interface (expr, 1) == MATCH_YES)
1905         return SUCCESS;
1906       return FAILURE;
1907     }
1908
1909   /* The reference is to an external name.  */
1910
1911   sym->attr.proc = PROC_EXTERNAL;
1912   expr->value.function.name = sym->name;
1913   expr->value.function.esym = expr->symtree->n.sym;
1914
1915   if (sym->as != NULL)
1916     expr->rank = sym->as->rank;
1917
1918   /* Type of the expression is either the type of the symbol or the
1919      default type of the symbol.  */
1920
1921 set_type:
1922   gfc_procedure_use (sym, &expr->value.function.actual, &expr->where);
1923
1924   if (sym->ts.type != BT_UNKNOWN)
1925     expr->ts = sym->ts;
1926   else
1927     {
1928       ts = gfc_get_default_type (sym->name, sym->ns);
1929
1930       if (ts->type == BT_UNKNOWN)
1931         {
1932           gfc_error ("Function '%s' at %L has no IMPLICIT type",
1933                      sym->name, &expr->where);
1934           return FAILURE;
1935         }
1936       else
1937         expr->ts = *ts;
1938     }
1939
1940   return SUCCESS;
1941 }
1942
1943
1944 /* Return true, if the symbol is an external procedure.  */
1945 static bool
1946 is_external_proc (gfc_symbol *sym)
1947 {
1948   if (!sym->attr.dummy && !sym->attr.contained
1949         && !(sym->attr.intrinsic
1950               || gfc_is_intrinsic (sym, sym->attr.subroutine, sym->declared_at))
1951         && sym->attr.proc != PROC_ST_FUNCTION
1952         && !sym->attr.use_assoc
1953         && sym->name)
1954     return true;
1955
1956   return false;
1957 }
1958
1959
1960 /* Figure out if a function reference is pure or not.  Also set the name
1961    of the function for a potential error message.  Return nonzero if the
1962    function is PURE, zero if not.  */
1963 static int
1964 pure_stmt_function (gfc_expr *, gfc_symbol *);
1965
1966 static int
1967 pure_function (gfc_expr *e, const char **name)
1968 {
1969   int pure;
1970
1971   *name = NULL;
1972
1973   if (e->symtree != NULL
1974         && e->symtree->n.sym != NULL
1975         && e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
1976     return pure_stmt_function (e, e->symtree->n.sym);
1977
1978   if (e->value.function.esym)
1979     {
1980       pure = gfc_pure (e->value.function.esym);
1981       *name = e->value.function.esym->name;
1982     }
1983   else if (e->value.function.isym)
1984     {
1985       pure = e->value.function.isym->pure
1986              || e->value.function.isym->elemental;
1987       *name = e->value.function.isym->name;
1988     }
1989   else
1990     {
1991       /* Implicit functions are not pure.  */
1992       pure = 0;
1993       *name = e->value.function.name;
1994     }
1995
1996   return pure;
1997 }
1998
1999
2000 static bool
2001 impure_stmt_fcn (gfc_expr *e, gfc_symbol *sym,
2002                  int *f ATTRIBUTE_UNUSED)
2003 {
2004   const char *name;
2005
2006   /* Don't bother recursing into other statement functions
2007      since they will be checked individually for purity.  */
2008   if (e->expr_type != EXPR_FUNCTION
2009         || !e->symtree
2010         || e->symtree->n.sym == sym
2011         || e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
2012     return false;
2013
2014   return pure_function (e, &name) ? false : true;
2015 }
2016
2017
2018 static int
2019 pure_stmt_function (gfc_expr *e, gfc_symbol *sym)
2020 {
2021   return gfc_traverse_expr (e, sym, impure_stmt_fcn, 0) ? 0 : 1;
2022 }
2023
2024
2025 static gfc_try
2026 is_scalar_expr_ptr (gfc_expr *expr)
2027 {
2028   gfc_try retval = SUCCESS;
2029   gfc_ref *ref;
2030   int start;
2031   int end;
2032
2033   /* See if we have a gfc_ref, which means we have a substring, array
2034      reference, or a component.  */
2035   if (expr->ref != NULL)
2036     {
2037       ref = expr->ref;
2038       while (ref->next != NULL)
2039         ref = ref->next;
2040
2041       switch (ref->type)
2042         {
2043         case REF_SUBSTRING:
2044           if (ref->u.ss.length != NULL 
2045               && ref->u.ss.length->length != NULL
2046               && ref->u.ss.start
2047               && ref->u.ss.start->expr_type == EXPR_CONSTANT 
2048               && ref->u.ss.end
2049               && ref->u.ss.end->expr_type == EXPR_CONSTANT)
2050             {
2051               start = (int) mpz_get_si (ref->u.ss.start->value.integer);
2052               end = (int) mpz_get_si (ref->u.ss.end->value.integer);
2053               if (end - start + 1 != 1)
2054                 retval = FAILURE;
2055             }
2056           else
2057             retval = FAILURE;
2058           break;
2059         case REF_ARRAY:
2060           if (ref->u.ar.type == AR_ELEMENT)
2061             retval = SUCCESS;
2062           else if (ref->u.ar.type == AR_FULL)
2063             {
2064               /* The user can give a full array if the array is of size 1.  */
2065               if (ref->u.ar.as != NULL
2066                   && ref->u.ar.as->rank == 1
2067                   && ref->u.ar.as->type == AS_EXPLICIT
2068                   && ref->u.ar.as->lower[0] != NULL
2069                   && ref->u.ar.as->lower[0]->expr_type == EXPR_CONSTANT
2070                   && ref->u.ar.as->upper[0] != NULL
2071                   && ref->u.ar.as->upper[0]->expr_type == EXPR_CONSTANT)
2072                 {
2073                   /* If we have a character string, we need to check if
2074                      its length is one.  */
2075                   if (expr->ts.type == BT_CHARACTER)
2076                     {
2077                       if (expr->ts.cl == NULL
2078                           || expr->ts.cl->length == NULL
2079                           || mpz_cmp_si (expr->ts.cl->length->value.integer, 1)
2080                           != 0)
2081                         retval = FAILURE;
2082                     }
2083                   else
2084                     {
2085                       /* We have constant lower and upper bounds.  If the
2086                          difference between is 1, it can be considered a
2087                          scalar.  */
2088                       start = (int) mpz_get_si
2089                                 (ref->u.ar.as->lower[0]->value.integer);
2090                       end = (int) mpz_get_si
2091                                 (ref->u.ar.as->upper[0]->value.integer);
2092                       if (end - start + 1 != 1)
2093                         retval = FAILURE;
2094                    }
2095                 }
2096               else
2097                 retval = FAILURE;
2098             }
2099           else
2100             retval = FAILURE;
2101           break;
2102         default:
2103           retval = SUCCESS;
2104           break;
2105         }
2106     }
2107   else if (expr->ts.type == BT_CHARACTER && expr->rank == 0)
2108     {
2109       /* Character string.  Make sure it's of length 1.  */
2110       if (expr->ts.cl == NULL
2111           || expr->ts.cl->length == NULL
2112           || mpz_cmp_si (expr->ts.cl->length->value.integer, 1) != 0)
2113         retval = FAILURE;
2114     }
2115   else if (expr->rank != 0)
2116     retval = FAILURE;
2117
2118   return retval;
2119 }
2120
2121
2122 /* Match one of the iso_c_binding functions (c_associated or c_loc)
2123    and, in the case of c_associated, set the binding label based on
2124    the arguments.  */
2125
2126 static gfc_try
2127 gfc_iso_c_func_interface (gfc_symbol *sym, gfc_actual_arglist *args,
2128                           gfc_symbol **new_sym)
2129 {
2130   char name[GFC_MAX_SYMBOL_LEN + 1];
2131   char binding_label[GFC_MAX_BINDING_LABEL_LEN + 1];
2132   int optional_arg = 0, is_pointer = 0;
2133   gfc_try retval = SUCCESS;
2134   gfc_symbol *args_sym;
2135   gfc_typespec *arg_ts;
2136
2137   if (args->expr->expr_type == EXPR_CONSTANT
2138       || args->expr->expr_type == EXPR_OP
2139       || args->expr->expr_type == EXPR_NULL)
2140     {
2141       gfc_error ("Argument to '%s' at %L is not a variable",
2142                  sym->name, &(args->expr->where));
2143       return FAILURE;
2144     }
2145
2146   args_sym = args->expr->symtree->n.sym;
2147
2148   /* The typespec for the actual arg should be that stored in the expr
2149      and not necessarily that of the expr symbol (args_sym), because
2150      the actual expression could be a part-ref of the expr symbol.  */
2151   arg_ts = &(args->expr->ts);
2152
2153   is_pointer = gfc_is_data_pointer (args->expr);
2154     
2155   if (sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)
2156     {
2157       /* If the user gave two args then they are providing something for
2158          the optional arg (the second cptr).  Therefore, set the name and
2159          binding label to the c_associated for two cptrs.  Otherwise,
2160          set c_associated to expect one cptr.  */
2161       if (args->next)
2162         {
2163           /* two args.  */
2164           sprintf (name, "%s_2", sym->name);
2165           sprintf (binding_label, "%s_2", sym->binding_label);
2166           optional_arg = 1;
2167         }
2168       else
2169         {
2170           /* one arg.  */
2171           sprintf (name, "%s_1", sym->name);
2172           sprintf (binding_label, "%s_1", sym->binding_label);
2173           optional_arg = 0;
2174         }
2175
2176       /* Get a new symbol for the version of c_associated that
2177          will get called.  */
2178       *new_sym = get_iso_c_sym (sym, name, binding_label, optional_arg);
2179     }
2180   else if (sym->intmod_sym_id == ISOCBINDING_LOC
2181            || sym->intmod_sym_id == ISOCBINDING_FUNLOC)
2182     {
2183       sprintf (name, "%s", sym->name);
2184       sprintf (binding_label, "%s", sym->binding_label);
2185
2186       /* Error check the call.  */
2187       if (args->next != NULL)
2188         {
2189           gfc_error_now ("More actual than formal arguments in '%s' "
2190                          "call at %L", name, &(args->expr->where));
2191           retval = FAILURE;
2192         }
2193       else if (sym->intmod_sym_id == ISOCBINDING_LOC)
2194         {
2195           /* Make sure we have either the target or pointer attribute.  */
2196           if (!args_sym->attr.target && !is_pointer)
2197             {
2198               gfc_error_now ("Parameter '%s' to '%s' at %L must be either "
2199                              "a TARGET or an associated pointer",
2200                              args_sym->name,
2201                              sym->name, &(args->expr->where));
2202               retval = FAILURE;
2203             }
2204
2205           /* See if we have interoperable type and type param.  */
2206           if (verify_c_interop (arg_ts) == SUCCESS
2207               || gfc_check_any_c_kind (arg_ts) == SUCCESS)
2208             {
2209               if (args_sym->attr.target == 1)
2210                 {
2211                   /* Case 1a, section 15.1.2.5, J3/04-007: variable that
2212                      has the target attribute and is interoperable.  */
2213                   /* Case 1b, section 15.1.2.5, J3/04-007: allocated
2214                      allocatable variable that has the TARGET attribute and
2215                      is not an array of zero size.  */
2216                   if (args_sym->attr.allocatable == 1)
2217                     {
2218                       if (args_sym->attr.dimension != 0 
2219                           && (args_sym->as && args_sym->as->rank == 0))
2220                         {
2221                           gfc_error_now ("Allocatable variable '%s' used as a "
2222                                          "parameter to '%s' at %L must not be "
2223                                          "an array of zero size",
2224                                          args_sym->name, sym->name,
2225                                          &(args->expr->where));
2226                           retval = FAILURE;
2227                         }
2228                     }
2229                   else
2230                     {
2231                       /* A non-allocatable target variable with C
2232                          interoperable type and type parameters must be
2233                          interoperable.  */
2234                       if (args_sym && args_sym->attr.dimension)
2235                         {
2236                           if (args_sym->as->type == AS_ASSUMED_SHAPE)
2237                             {
2238                               gfc_error ("Assumed-shape array '%s' at %L "
2239                                          "cannot be an argument to the "
2240                                          "procedure '%s' because "
2241                                          "it is not C interoperable",
2242                                          args_sym->name,
2243                                          &(args->expr->where), sym->name);
2244                               retval = FAILURE;
2245                             }
2246                           else if (args_sym->as->type == AS_DEFERRED)
2247                             {
2248                               gfc_error ("Deferred-shape array '%s' at %L "
2249                                          "cannot be an argument to the "
2250                                          "procedure '%s' because "
2251                                          "it is not C interoperable",
2252                                          args_sym->name,
2253                                          &(args->expr->where), sym->name);
2254                               retval = FAILURE;
2255                             }
2256                         }
2257                               
2258                       /* Make sure it's not a character string.  Arrays of
2259                          any type should be ok if the variable is of a C
2260                          interoperable type.  */
2261                       if (arg_ts->type == BT_CHARACTER)
2262                         if (arg_ts->cl != NULL
2263                             && (arg_ts->cl->length == NULL
2264                                 || arg_ts->cl->length->expr_type
2265                                    != EXPR_CONSTANT
2266                                 || mpz_cmp_si
2267                                     (arg_ts->cl->length->value.integer, 1)
2268                                    != 0)
2269                             && is_scalar_expr_ptr (args->expr) != SUCCESS)
2270                           {
2271                             gfc_error_now ("CHARACTER argument '%s' to '%s' "
2272                                            "at %L must have a length of 1",
2273                                            args_sym->name, sym->name,
2274                                            &(args->expr->where));
2275                             retval = FAILURE;
2276                           }
2277                     }
2278                 }
2279               else if (is_pointer
2280                        && is_scalar_expr_ptr (args->expr) != SUCCESS)
2281                 {
2282                   /* Case 1c, section 15.1.2.5, J3/04-007: an associated
2283                      scalar pointer.  */
2284                   gfc_error_now ("Argument '%s' to '%s' at %L must be an "
2285                                  "associated scalar POINTER", args_sym->name,
2286                                  sym->name, &(args->expr->where));
2287                   retval = FAILURE;
2288                 }
2289             }
2290           else
2291             {
2292               /* The parameter is not required to be C interoperable.  If it
2293                  is not C interoperable, it must be a nonpolymorphic scalar
2294                  with no length type parameters.  It still must have either
2295                  the pointer or target attribute, and it can be
2296                  allocatable (but must be allocated when c_loc is called).  */
2297               if (args->expr->rank != 0 
2298                   && is_scalar_expr_ptr (args->expr) != SUCCESS)
2299                 {
2300                   gfc_error_now ("Parameter '%s' to '%s' at %L must be a "
2301                                  "scalar", args_sym->name, sym->name,
2302                                  &(args->expr->where));
2303                   retval = FAILURE;
2304                 }
2305               else if (arg_ts->type == BT_CHARACTER 
2306                        && is_scalar_expr_ptr (args->expr) != SUCCESS)
2307                 {
2308                   gfc_error_now ("CHARACTER argument '%s' to '%s' at "
2309                                  "%L must have a length of 1",
2310                                  args_sym->name, sym->name,
2311                                  &(args->expr->where));
2312                   retval = FAILURE;
2313                 }
2314             }
2315         }
2316       else if (sym->intmod_sym_id == ISOCBINDING_FUNLOC)
2317         {
2318           if (args_sym->attr.flavor != FL_PROCEDURE)
2319             {
2320               /* TODO: Update this error message to allow for procedure
2321                  pointers once they are implemented.  */
2322               gfc_error_now ("Parameter '%s' to '%s' at %L must be a "
2323                              "procedure",
2324                              args_sym->name, sym->name,
2325                              &(args->expr->where));
2326               retval = FAILURE;
2327             }
2328           else if (args_sym->attr.is_bind_c != 1)
2329             {
2330               gfc_error_now ("Parameter '%s' to '%s' at %L must be "
2331                              "BIND(C)",
2332                              args_sym->name, sym->name,
2333                              &(args->expr->where));
2334               retval = FAILURE;
2335             }
2336         }
2337       
2338       /* for c_loc/c_funloc, the new symbol is the same as the old one */
2339       *new_sym = sym;
2340     }
2341   else
2342     {
2343       gfc_internal_error ("gfc_iso_c_func_interface(): Unhandled "
2344                           "iso_c_binding function: '%s'!\n", sym->name);
2345     }
2346
2347   return retval;
2348 }
2349
2350
2351 /* Resolve a function call, which means resolving the arguments, then figuring
2352    out which entity the name refers to.  */
2353 /* TODO: Check procedure arguments so that an INTENT(IN) isn't passed
2354    to INTENT(OUT) or INTENT(INOUT).  */
2355
2356 static gfc_try
2357 resolve_function (gfc_expr *expr)
2358 {
2359   gfc_actual_arglist *arg;
2360   gfc_symbol *sym;
2361   const char *name;
2362   gfc_try t;
2363   int temp;
2364   procedure_type p = PROC_INTRINSIC;
2365   bool no_formal_args;
2366
2367   sym = NULL;
2368   if (expr->symtree)
2369     sym = expr->symtree->n.sym;
2370
2371   if (sym && sym->attr.intrinsic
2372       && resolve_intrinsic (sym, &expr->where) == FAILURE)
2373     return FAILURE;
2374
2375   if (sym && (sym->attr.flavor == FL_VARIABLE || sym->attr.subroutine))
2376     {
2377       gfc_error ("'%s' at %L is not a function", sym->name, &expr->where);
2378       return FAILURE;
2379     }
2380
2381   if (sym && sym->attr.abstract)
2382     {
2383       gfc_error ("ABSTRACT INTERFACE '%s' must not be referenced at %L",
2384                  sym->name, &expr->where);
2385       return FAILURE;
2386     }
2387
2388   /* Switch off assumed size checking and do this again for certain kinds
2389      of procedure, once the procedure itself is resolved.  */
2390   need_full_assumed_size++;
2391
2392   if (expr->symtree && expr->symtree->n.sym)
2393     p = expr->symtree->n.sym->attr.proc;
2394
2395   no_formal_args = sym && is_external_proc (sym) && sym->formal == NULL;
2396   if (resolve_actual_arglist (expr->value.function.actual,
2397                               p, no_formal_args) == FAILURE)
2398       return FAILURE;
2399
2400   /* Need to setup the call to the correct c_associated, depending on
2401      the number of cptrs to user gives to compare.  */
2402   if (sym && sym->attr.is_iso_c == 1)
2403     {
2404       if (gfc_iso_c_func_interface (sym, expr->value.function.actual, &sym)
2405           == FAILURE)
2406         return FAILURE;
2407       
2408       /* Get the symtree for the new symbol (resolved func).
2409          the old one will be freed later, when it's no longer used.  */
2410       gfc_find_sym_tree (sym->name, sym->ns, 1, &(expr->symtree));
2411     }
2412   
2413   /* Resume assumed_size checking.  */
2414   need_full_assumed_size--;
2415
2416   /* If the procedure is external, check for usage.  */
2417   if (sym && is_external_proc (sym))
2418     resolve_global_procedure (sym, &expr->where,
2419                               &expr->value.function.actual, 0);
2420
2421   if (sym && sym->ts.type == BT_CHARACTER
2422       && sym->ts.cl
2423       && sym->ts.cl->length == NULL
2424       && !sym->attr.dummy
2425       && expr->value.function.esym == NULL
2426       && !sym->attr.contained)
2427     {
2428       /* Internal procedures are taken care of in resolve_contained_fntype.  */
2429       gfc_error ("Function '%s' is declared CHARACTER(*) and cannot "
2430                  "be used at %L since it is not a dummy argument",
2431                  sym->name, &expr->where);
2432       return FAILURE;
2433     }
2434
2435   /* See if function is already resolved.  */
2436
2437   if (expr->value.function.name != NULL)
2438     {
2439       if (expr->ts.type == BT_UNKNOWN)
2440         expr->ts = sym->ts;
2441       t = SUCCESS;
2442     }
2443   else
2444     {
2445       /* Apply the rules of section 14.1.2.  */
2446
2447       switch (procedure_kind (sym))
2448         {
2449         case PTYPE_GENERIC:
2450           t = resolve_generic_f (expr);
2451           break;
2452
2453         case PTYPE_SPECIFIC:
2454           t = resolve_specific_f (expr);
2455           break;
2456
2457         case PTYPE_UNKNOWN:
2458           t = resolve_unknown_f (expr);
2459           break;
2460
2461         default:
2462           gfc_internal_error ("resolve_function(): bad function type");
2463         }
2464     }
2465
2466   /* If the expression is still a function (it might have simplified),
2467      then we check to see if we are calling an elemental function.  */
2468
2469   if (expr->expr_type != EXPR_FUNCTION)
2470     return t;
2471
2472   temp = need_full_assumed_size;
2473   need_full_assumed_size = 0;
2474
2475   if (resolve_elemental_actual (expr, NULL) == FAILURE)
2476     return FAILURE;
2477
2478   if (omp_workshare_flag
2479       && expr->value.function.esym
2480       && ! gfc_elemental (expr->value.function.esym))
2481     {
2482       gfc_error ("User defined non-ELEMENTAL function '%s' at %L not allowed "
2483                  "in WORKSHARE construct", expr->value.function.esym->name,
2484                  &expr->where);
2485       t = FAILURE;
2486     }
2487
2488 #define GENERIC_ID expr->value.function.isym->id
2489   else if (expr->value.function.actual != NULL
2490            && expr->value.function.isym != NULL
2491            && GENERIC_ID != GFC_ISYM_LBOUND
2492            && GENERIC_ID != GFC_ISYM_LEN
2493            && GENERIC_ID != GFC_ISYM_LOC
2494            && GENERIC_ID != GFC_ISYM_PRESENT)
2495     {
2496       /* Array intrinsics must also have the last upper bound of an
2497          assumed size array argument.  UBOUND and SIZE have to be
2498          excluded from the check if the second argument is anything
2499          than a constant.  */
2500
2501       for (arg = expr->value.function.actual; arg; arg = arg->next)
2502         {
2503           if ((GENERIC_ID == GFC_ISYM_UBOUND || GENERIC_ID == GFC_ISYM_SIZE)
2504               && arg->next != NULL && arg->next->expr)
2505             {
2506               if (arg->next->expr->expr_type != EXPR_CONSTANT)
2507                 break;
2508
2509               if (arg->next->name && strncmp(arg->next->name, "kind", 4) == 0)
2510                 break;
2511
2512               if ((int)mpz_get_si (arg->next->expr->value.integer)
2513                         < arg->expr->rank)
2514                 break;
2515             }
2516
2517           if (arg->expr != NULL
2518               && arg->expr->rank > 0
2519               && resolve_assumed_size_actual (arg->expr))
2520             return FAILURE;
2521         }
2522     }
2523 #undef GENERIC_ID
2524
2525   need_full_assumed_size = temp;
2526   name = NULL;
2527
2528   if (!pure_function (expr, &name) && name)
2529     {
2530       if (forall_flag)
2531         {
2532           gfc_error ("reference to non-PURE function '%s' at %L inside a "
2533                      "FORALL %s", name, &expr->where,
2534                      forall_flag == 2 ? "mask" : "block");
2535           t = FAILURE;
2536         }
2537       else if (gfc_pure (NULL))
2538         {
2539           gfc_error ("Function reference to '%s' at %L is to a non-PURE "
2540                      "procedure within a PURE procedure", name, &expr->where);
2541           t = FAILURE;
2542         }
2543     }
2544
2545   /* Functions without the RECURSIVE attribution are not allowed to
2546    * call themselves.  */
2547   if (expr->value.function.esym && !expr->value.function.esym->attr.recursive)
2548     {
2549       gfc_symbol *esym;
2550       esym = expr->value.function.esym;
2551
2552       if (is_illegal_recursion (esym, gfc_current_ns))
2553       {
2554         if (esym->attr.entry && esym->ns->entries)
2555           gfc_error ("ENTRY '%s' at %L cannot be called recursively, as"
2556                      " function '%s' is not RECURSIVE",
2557                      esym->name, &expr->where, esym->ns->entries->sym->name);
2558         else
2559           gfc_error ("Function '%s' at %L cannot be called recursively, as it"
2560                      " is not RECURSIVE", esym->name, &expr->where);
2561
2562         t = FAILURE;
2563       }
2564     }
2565
2566   /* Character lengths of use associated functions may contains references to
2567      symbols not referenced from the current program unit otherwise.  Make sure
2568      those symbols are marked as referenced.  */
2569
2570   if (expr->ts.type == BT_CHARACTER && expr->value.function.esym
2571       && expr->value.function.esym->attr.use_assoc)
2572     {
2573       gfc_expr_set_symbols_referenced (expr->ts.cl->length);
2574     }
2575
2576   if (t == SUCCESS
2577         && !((expr->value.function.esym
2578                 && expr->value.function.esym->attr.elemental)
2579                         ||
2580              (expr->value.function.isym
2581                 && expr->value.function.isym->elemental)))
2582     find_noncopying_intrinsics (expr->value.function.esym,
2583                                 expr->value.function.actual);
2584
2585   /* Make sure that the expression has a typespec that works.  */
2586   if (expr->ts.type == BT_UNKNOWN)
2587     {
2588       if (expr->symtree->n.sym->result
2589             && expr->symtree->n.sym->result->ts.type != BT_UNKNOWN
2590             && !expr->symtree->n.sym->result->attr.proc_pointer)
2591         expr->ts = expr->symtree->n.sym->result->ts;
2592     }
2593
2594   return t;
2595 }
2596
2597
2598 /************* Subroutine resolution *************/
2599
2600 static void
2601 pure_subroutine (gfc_code *c, gfc_symbol *sym)
2602 {
2603   if (gfc_pure (sym))
2604     return;
2605
2606   if (forall_flag)
2607     gfc_error ("Subroutine call to '%s' in FORALL block at %L is not PURE",
2608                sym->name, &c->loc);
2609   else if (gfc_pure (NULL))
2610     gfc_error ("Subroutine call to '%s' at %L is not PURE", sym->name,
2611                &c->loc);
2612 }
2613
2614
2615 static match
2616 resolve_generic_s0 (gfc_code *c, gfc_symbol *sym)
2617 {
2618   gfc_symbol *s;
2619
2620   if (sym->attr.generic)
2621     {
2622       s = gfc_search_interface (sym->generic, 1, &c->ext.actual);
2623       if (s != NULL)
2624         {
2625           c->resolved_sym = s;
2626           pure_subroutine (c, s);
2627           return MATCH_YES;
2628         }
2629
2630       /* TODO: Need to search for elemental references in generic interface.  */
2631     }
2632
2633   if (sym->attr.intrinsic)
2634     return gfc_intrinsic_sub_interface (c, 0);
2635
2636   return MATCH_NO;
2637 }
2638
2639
2640 static gfc_try
2641 resolve_generic_s (gfc_code *c)
2642 {
2643   gfc_symbol *sym;
2644   match m;
2645
2646   sym = c->symtree->n.sym;
2647
2648   for (;;)
2649     {
2650       m = resolve_generic_s0 (c, sym);
2651       if (m == MATCH_YES)
2652         return SUCCESS;
2653       else if (m == MATCH_ERROR)
2654         return FAILURE;
2655
2656 generic:
2657       if (sym->ns->parent == NULL)
2658         break;
2659       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
2660
2661       if (sym == NULL)
2662         break;
2663       if (!generic_sym (sym))
2664         goto generic;
2665     }
2666
2667   /* Last ditch attempt.  See if the reference is to an intrinsic
2668      that possesses a matching interface.  14.1.2.4  */
2669   sym = c->symtree->n.sym;
2670
2671   if (!gfc_is_intrinsic (sym, 1, c->loc))
2672     {
2673       gfc_error ("There is no specific subroutine for the generic '%s' at %L",
2674                  sym->name, &c->loc);
2675       return FAILURE;
2676     }
2677
2678   m = gfc_intrinsic_sub_interface (c, 0);
2679   if (m == MATCH_YES)
2680     return SUCCESS;
2681   if (m == MATCH_NO)
2682     gfc_error ("Generic subroutine '%s' at %L is not consistent with an "
2683                "intrinsic subroutine interface", sym->name, &c->loc);
2684
2685   return FAILURE;
2686 }
2687
2688
2689 /* Set the name and binding label of the subroutine symbol in the call
2690    expression represented by 'c' to include the type and kind of the
2691    second parameter.  This function is for resolving the appropriate
2692    version of c_f_pointer() and c_f_procpointer().  For example, a
2693    call to c_f_pointer() for a default integer pointer could have a
2694    name of c_f_pointer_i4.  If no second arg exists, which is an error
2695    for these two functions, it defaults to the generic symbol's name
2696    and binding label.  */
2697
2698 static void
2699 set_name_and_label (gfc_code *c, gfc_symbol *sym,
2700                     char *name, char *binding_label)
2701 {
2702   gfc_expr *arg = NULL;
2703   char type;
2704   int kind;
2705
2706   /* The second arg of c_f_pointer and c_f_procpointer determines
2707      the type and kind for the procedure name.  */
2708   arg = c->ext.actual->next->expr;
2709
2710   if (arg != NULL)
2711     {
2712       /* Set up the name to have the given symbol's name,
2713          plus the type and kind.  */
2714       /* a derived type is marked with the type letter 'u' */
2715       if (arg->ts.type == BT_DERIVED)
2716         {
2717           type = 'd';
2718           kind = 0; /* set the kind as 0 for now */
2719         }
2720       else
2721         {
2722           type = gfc_type_letter (arg->ts.type);
2723           kind = arg->ts.kind;
2724         }
2725
2726       if (arg->ts.type == BT_CHARACTER)
2727         /* Kind info for character strings not needed.  */
2728         kind = 0;
2729
2730       sprintf (name, "%s_%c%d", sym->name, type, kind);
2731       /* Set up the binding label as the given symbol's label plus
2732          the type and kind.  */
2733       sprintf (binding_label, "%s_%c%d", sym->binding_label, type, kind);
2734     }
2735   else
2736     {
2737       /* If the second arg is missing, set the name and label as
2738          was, cause it should at least be found, and the missing
2739          arg error will be caught by compare_parameters().  */
2740       sprintf (name, "%s", sym->name);
2741       sprintf (binding_label, "%s", sym->binding_label);
2742     }
2743    
2744   return;
2745 }
2746
2747
2748 /* Resolve a generic version of the iso_c_binding procedure given
2749    (sym) to the specific one based on the type and kind of the
2750    argument(s).  Currently, this function resolves c_f_pointer() and
2751    c_f_procpointer based on the type and kind of the second argument
2752    (FPTR).  Other iso_c_binding procedures aren't specially handled.
2753    Upon successfully exiting, c->resolved_sym will hold the resolved
2754    symbol.  Returns MATCH_ERROR if an error occurred; MATCH_YES
2755    otherwise.  */
2756
2757 match
2758 gfc_iso_c_sub_interface (gfc_code *c, gfc_symbol *sym)
2759 {
2760   gfc_symbol *new_sym;
2761   /* this is fine, since we know the names won't use the max */
2762   char name[GFC_MAX_SYMBOL_LEN + 1];
2763   char binding_label[GFC_MAX_BINDING_LABEL_LEN + 1];
2764   /* default to success; will override if find error */
2765   match m = MATCH_YES;
2766
2767   /* Make sure the actual arguments are in the necessary order (based on the 
2768      formal args) before resolving.  */
2769   gfc_procedure_use (sym, &c->ext.actual, &(c->loc));
2770
2771   if ((sym->intmod_sym_id == ISOCBINDING_F_POINTER) ||
2772       (sym->intmod_sym_id == ISOCBINDING_F_PROCPOINTER))
2773     {
2774       set_name_and_label (c, sym, name, binding_label);
2775       
2776       if (sym->intmod_sym_id == ISOCBINDING_F_POINTER)
2777         {
2778           if (c->ext.actual != NULL && c->ext.actual->next != NULL)
2779             {
2780               /* Make sure we got a third arg if the second arg has non-zero
2781                  rank.  We must also check that the type and rank are
2782                  correct since we short-circuit this check in
2783                  gfc_procedure_use() (called above to sort actual args).  */
2784               if (c->ext.actual->next->expr->rank != 0)
2785                 {
2786                   if(c->ext.actual->next->next == NULL 
2787                      || c->ext.actual->next->next->expr == NULL)
2788                     {
2789                       m = MATCH_ERROR;
2790                       gfc_error ("Missing SHAPE parameter for call to %s "
2791                                  "at %L", sym->name, &(c->loc));
2792                     }
2793                   else if (c->ext.actual->next->next->expr->ts.type
2794                            != BT_INTEGER
2795                            || c->ext.actual->next->next->expr->rank != 1)
2796                     {
2797                       m = MATCH_ERROR;
2798                       gfc_error ("SHAPE parameter for call to %s at %L must "
2799                                  "be a rank 1 INTEGER array", sym->name,
2800                                  &(c->loc));
2801                     }
2802                 }
2803             }
2804         }
2805       
2806       if (m != MATCH_ERROR)
2807         {
2808           /* the 1 means to add the optional arg to formal list */
2809           new_sym = get_iso_c_sym (sym, name, binding_label, 1);
2810          
2811           /* for error reporting, say it's declared where the original was */
2812           new_sym->declared_at = sym->declared_at;
2813         }
2814     }
2815   else
2816     {
2817       /* no differences for c_loc or c_funloc */
2818       new_sym = sym;
2819     }
2820
2821   /* set the resolved symbol */
2822   if (m != MATCH_ERROR)
2823     c->resolved_sym = new_sym;
2824   else
2825     c->resolved_sym = sym;
2826   
2827   return m;
2828 }
2829
2830
2831 /* Resolve a subroutine call known to be specific.  */
2832
2833 static match
2834 resolve_specific_s0 (gfc_code *c, gfc_symbol *sym)
2835 {
2836   match m;
2837
2838   if(sym->attr.is_iso_c)
2839     {
2840       m = gfc_iso_c_sub_interface (c,sym);
2841       return m;
2842     }
2843   
2844   if (sym->attr.external || sym->attr.if_source == IFSRC_IFBODY)
2845     {
2846       if (sym->attr.dummy)
2847         {
2848           sym->attr.proc = PROC_DUMMY;
2849           goto found;
2850         }
2851
2852       sym->attr.proc = PROC_EXTERNAL;
2853       goto found;
2854     }
2855
2856   if (sym->attr.proc == PROC_MODULE || sym->attr.proc == PROC_INTERNAL)
2857     goto found;
2858
2859   if (sym->attr.intrinsic)
2860     {
2861       m = gfc_intrinsic_sub_interface (c, 1);
2862       if (m == MATCH_YES)
2863         return MATCH_YES;
2864       if (m == MATCH_NO)
2865         gfc_error ("Subroutine '%s' at %L is INTRINSIC but is not compatible "
2866                    "with an intrinsic", sym->name, &c->loc);
2867
2868       return MATCH_ERROR;
2869     }
2870
2871   return MATCH_NO;
2872
2873 found:
2874   gfc_procedure_use (sym, &c->ext.actual, &c->loc);
2875
2876   c->resolved_sym = sym;
2877   pure_subroutine (c, sym);
2878
2879   return MATCH_YES;
2880 }
2881
2882
2883 static gfc_try
2884 resolve_specific_s (gfc_code *c)
2885 {
2886   gfc_symbol *sym;
2887   match m;
2888
2889   sym = c->symtree->n.sym;
2890
2891   for (;;)
2892     {
2893       m = resolve_specific_s0 (c, sym);
2894       if (m == MATCH_YES)
2895         return SUCCESS;
2896       if (m == MATCH_ERROR)
2897         return FAILURE;
2898
2899       if (sym->ns->parent == NULL)
2900         break;
2901
2902       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
2903
2904       if (sym == NULL)
2905         break;
2906     }
2907
2908   sym = c->symtree->n.sym;
2909   gfc_error ("Unable to resolve the specific subroutine '%s' at %L",
2910              sym->name, &c->loc);
2911
2912   return FAILURE;
2913 }
2914
2915
2916 /* Resolve a subroutine call not known to be generic nor specific.  */
2917
2918 static gfc_try
2919 resolve_unknown_s (gfc_code *c)
2920 {
2921   gfc_symbol *sym;
2922
2923   sym = c->symtree->n.sym;
2924
2925   if (sym->attr.dummy)
2926     {
2927       sym->attr.proc = PROC_DUMMY;
2928       goto found;
2929     }
2930
2931   /* See if we have an intrinsic function reference.  */
2932
2933   if (gfc_is_intrinsic (sym, 1, c->loc))
2934     {
2935       if (gfc_intrinsic_sub_interface (c, 1) == MATCH_YES)
2936         return SUCCESS;
2937       return FAILURE;
2938     }
2939
2940   /* The reference is to an external name.  */
2941
2942 found:
2943   gfc_procedure_use (sym, &c->ext.actual, &c->loc);
2944
2945   c->resolved_sym = sym;
2946
2947   pure_subroutine (c, sym);
2948
2949   return SUCCESS;
2950 }
2951
2952
2953 /* Resolve a subroutine call.  Although it was tempting to use the same code
2954    for functions, subroutines and functions are stored differently and this
2955    makes things awkward.  */
2956
2957 static gfc_try
2958 resolve_call (gfc_code *c)
2959 {
2960   gfc_try t;
2961   procedure_type ptype = PROC_INTRINSIC;
2962   gfc_symbol *csym, *sym;
2963   bool no_formal_args;
2964
2965   csym = c->symtree ? c->symtree->n.sym : NULL;
2966
2967   if (csym && csym->ts.type != BT_UNKNOWN)
2968     {
2969       gfc_error ("'%s' at %L has a type, which is not consistent with "
2970                  "the CALL at %L", csym->name, &csym->declared_at, &c->loc);
2971       return FAILURE;
2972     }
2973
2974   if (csym && gfc_current_ns->parent && csym->ns != gfc_current_ns)
2975     {
2976       gfc_symtree *st;
2977       gfc_find_sym_tree (csym->name, gfc_current_ns, 1, &st);
2978       sym = st ? st->n.sym : NULL;
2979       if (sym && csym != sym
2980               && sym->ns == gfc_current_ns
2981               && sym->attr.flavor == FL_PROCEDURE
2982               && sym->attr.contained)
2983         {
2984           sym->refs++;
2985           if (csym->attr.generic)
2986             c->symtree->n.sym = sym;
2987           else
2988             c->symtree = st;
2989           csym = c->symtree->n.sym;
2990         }
2991     }
2992
2993   /* Subroutines without the RECURSIVE attribution are not allowed to
2994    * call themselves.  */
2995   if (csym && is_illegal_recursion (csym, gfc_current_ns))
2996     {
2997       if (csym->attr.entry && csym->ns->entries)
2998         gfc_error ("ENTRY '%s' at %L cannot be called recursively, as"
2999                    " subroutine '%s' is not RECURSIVE",
3000                    csym->name, &c->loc, csym->ns->entries->sym->name);
3001       else
3002         gfc_error ("SUBROUTINE '%s' at %L cannot be called recursively, as it"
3003                    " is not RECURSIVE", csym->name, &c->loc);
3004
3005       t = FAILURE;
3006     }
3007
3008   /* Switch off assumed size checking and do this again for certain kinds
3009      of procedure, once the procedure itself is resolved.  */
3010   need_full_assumed_size++;
3011
3012   if (csym)
3013     ptype = csym->attr.proc;
3014
3015   no_formal_args = csym && is_external_proc (csym) && csym->formal == NULL;
3016   if (resolve_actual_arglist (c->ext.actual, ptype,
3017                               no_formal_args) == FAILURE)
3018     return FAILURE;
3019
3020   /* Resume assumed_size checking.  */
3021   need_full_assumed_size--;
3022
3023   /* If external, check for usage.  */
3024   if (csym && is_external_proc (csym))
3025     resolve_global_procedure (csym, &c->loc, &c->ext.actual, 1);
3026
3027   t = SUCCESS;
3028   if (c->resolved_sym == NULL)
3029     {
3030       c->resolved_isym = NULL;
3031       switch (procedure_kind (csym))
3032         {
3033         case PTYPE_GENERIC:
3034           t = resolve_generic_s (c);
3035           break;
3036
3037         case PTYPE_SPECIFIC:
3038           t = resolve_specific_s (c);
3039           break;
3040
3041         case PTYPE_UNKNOWN:
3042           t = resolve_unknown_s (c);
3043           break;
3044
3045         default:
3046           gfc_internal_error ("resolve_subroutine(): bad function type");
3047         }
3048     }
3049
3050   /* Some checks of elemental subroutine actual arguments.  */
3051   if (resolve_elemental_actual (NULL, c) == FAILURE)
3052     return FAILURE;
3053
3054   if (t == SUCCESS && !(c->resolved_sym && c->resolved_sym->attr.elemental))
3055     find_noncopying_intrinsics (c->resolved_sym, c->ext.actual);
3056   return t;
3057 }
3058
3059
3060 /* Compare the shapes of two arrays that have non-NULL shapes.  If both
3061    op1->shape and op2->shape are non-NULL return SUCCESS if their shapes
3062    match.  If both op1->shape and op2->shape are non-NULL return FAILURE
3063    if their shapes do not match.  If either op1->shape or op2->shape is
3064    NULL, return SUCCESS.  */
3065
3066 static gfc_try
3067 compare_shapes (gfc_expr *op1, gfc_expr *op2)
3068 {
3069   gfc_try t;
3070   int i;
3071
3072   t = SUCCESS;
3073
3074   if (op1->shape != NULL && op2->shape != NULL)
3075     {
3076       for (i = 0; i < op1->rank; i++)
3077         {
3078           if (mpz_cmp (op1->shape[i], op2->shape[i]) != 0)
3079            {
3080              gfc_error ("Shapes for operands at %L and %L are not conformable",
3081                          &op1->where, &op2->where);
3082              t = FAILURE;
3083              break;
3084            }
3085         }
3086     }
3087
3088   return t;
3089 }
3090
3091
3092 /* Resolve an operator expression node.  This can involve replacing the
3093    operation with a user defined function call.  */
3094
3095 static gfc_try
3096 resolve_operator (gfc_expr *e)
3097 {
3098   gfc_expr *op1, *op2;
3099   char msg[200];
3100   bool dual_locus_error;
3101   gfc_try t;
3102
3103   /* Resolve all subnodes-- give them types.  */
3104
3105   switch (e->value.op.op)
3106     {
3107     default:
3108       if (gfc_resolve_expr (e->value.op.op2) == FAILURE)
3109         return FAILURE;
3110
3111     /* Fall through...  */
3112
3113     case INTRINSIC_NOT:
3114     case INTRINSIC_UPLUS:
3115     case INTRINSIC_UMINUS:
3116     case INTRINSIC_PARENTHESES:
3117       if (gfc_resolve_expr (e->value.op.op1) == FAILURE)
3118         return FAILURE;
3119       break;
3120     }
3121
3122   /* Typecheck the new node.  */
3123
3124   op1 = e->value.op.op1;
3125   op2 = e->value.op.op2;
3126   dual_locus_error = false;
3127
3128   if ((op1 && op1->expr_type == EXPR_NULL)
3129       || (op2 && op2->expr_type == EXPR_NULL))
3130     {
3131       sprintf (msg, _("Invalid context for NULL() pointer at %%L"));
3132       goto bad_op;
3133     }
3134
3135   switch (e->value.op.op)
3136     {
3137     case INTRINSIC_UPLUS:
3138     case INTRINSIC_UMINUS:
3139       if (op1->ts.type == BT_INTEGER
3140           || op1->ts.type == BT_REAL
3141           || op1->ts.type == BT_COMPLEX)
3142         {
3143           e->ts = op1->ts;
3144           break;
3145         }
3146
3147       sprintf (msg, _("Operand of unary numeric operator '%s' at %%L is %s"),
3148                gfc_op2string (e->value.op.op), gfc_typename (&e->ts));
3149       goto bad_op;
3150
3151     case INTRINSIC_PLUS:
3152     case INTRINSIC_MINUS:
3153     case INTRINSIC_TIMES:
3154     case INTRINSIC_DIVIDE:
3155     case INTRINSIC_POWER:
3156       if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
3157         {
3158           gfc_type_convert_binary (e);
3159           break;
3160         }
3161
3162       sprintf (msg,
3163                _("Operands of binary numeric operator '%s' at %%L are %s/%s"),
3164                gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3165                gfc_typename (&op2->ts));
3166       goto bad_op;
3167
3168     case INTRINSIC_CONCAT:
3169       if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
3170           && op1->ts.kind == op2->ts.kind)
3171         {
3172           e->ts.type = BT_CHARACTER;
3173           e->ts.kind = op1->ts.kind;
3174           break;
3175         }
3176
3177       sprintf (msg,
3178                _("Operands of string concatenation operator at %%L are %s/%s"),
3179                gfc_typename (&op1->ts), gfc_typename (&op2->ts));
3180       goto bad_op;
3181
3182     case INTRINSIC_AND:
3183     case INTRINSIC_OR:
3184     case INTRINSIC_EQV:
3185     case INTRINSIC_NEQV:
3186       if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
3187         {
3188           e->ts.type = BT_LOGICAL;
3189           e->ts.kind = gfc_kind_max (op1, op2);
3190           if (op1->ts.kind < e->ts.kind)
3191             gfc_convert_type (op1, &e->ts, 2);
3192           else if (op2->ts.kind < e->ts.kind)
3193             gfc_convert_type (op2, &e->ts, 2);
3194           break;
3195         }
3196
3197       sprintf (msg, _("Operands of logical operator '%s' at %%L are %s/%s"),
3198                gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3199                gfc_typename (&op2->ts));
3200
3201       goto bad_op;
3202
3203     case INTRINSIC_NOT:
3204       if (op1->ts.type == BT_LOGICAL)
3205         {
3206           e->ts.type = BT_LOGICAL;
3207           e->ts.kind = op1->ts.kind;
3208           break;
3209         }
3210
3211       sprintf (msg, _("Operand of .not. operator at %%L is %s"),
3212                gfc_typename (&op1->ts));
3213       goto bad_op;
3214
3215     case INTRINSIC_GT:
3216     case INTRINSIC_GT_OS:
3217     case INTRINSIC_GE:
3218     case INTRINSIC_GE_OS:
3219     case INTRINSIC_LT:
3220     case INTRINSIC_LT_OS:
3221     case INTRINSIC_LE:
3222     case INTRINSIC_LE_OS:
3223       if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
3224         {
3225           strcpy (msg, _("COMPLEX quantities cannot be compared at %L"));
3226           goto bad_op;
3227         }
3228
3229       /* Fall through...  */
3230
3231     case INTRINSIC_EQ:
3232     case INTRINSIC_EQ_OS:
3233     case INTRINSIC_NE:
3234     case INTRINSIC_NE_OS:
3235       if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
3236           && op1->ts.kind == op2->ts.kind)
3237         {
3238           e->ts.type = BT_LOGICAL;
3239           e->ts.kind = gfc_default_logical_kind;
3240           break;
3241         }
3242
3243       if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
3244         {
3245           gfc_type_convert_binary (e);
3246
3247           e->ts.type = BT_LOGICAL;
3248           e->ts.kind = gfc_default_logical_kind;
3249           break;
3250         }
3251
3252       if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
3253         sprintf (msg,
3254                  _("Logicals at %%L must be compared with %s instead of %s"),
3255                  (e->value.op.op == INTRINSIC_EQ 
3256                   || e->value.op.op == INTRINSIC_EQ_OS)
3257                  ? ".eqv." : ".neqv.", gfc_op2string (e->value.op.op));
3258       else
3259         sprintf (msg,
3260                  _("Operands of comparison operator '%s' at %%L are %s/%s"),
3261                  gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3262                  gfc_typename (&op2->ts));
3263
3264       goto bad_op;
3265
3266     case INTRINSIC_USER:
3267       if (e->value.op.uop->op == NULL)
3268         sprintf (msg, _("Unknown operator '%s' at %%L"), e->value.op.uop->name);
3269       else if (op2 == NULL)
3270         sprintf (msg, _("Operand of user operator '%s' at %%L is %s"),
3271                  e->value.op.uop->name, gfc_typename (&op1->ts));
3272       else
3273         sprintf (msg, _("Operands of user operator '%s' at %%L are %s/%s"),
3274                  e->value.op.uop->name, gfc_typename (&op1->ts),
3275                  gfc_typename (&op2->ts));
3276
3277       goto bad_op;
3278
3279     case INTRINSIC_PARENTHESES:
3280       e->ts = op1->ts;
3281       if (e->ts.type == BT_CHARACTER)
3282         e->ts.cl = op1->ts.cl;
3283       break;
3284
3285     default:
3286       gfc_internal_error ("resolve_operator(): Bad intrinsic");
3287     }
3288
3289   /* Deal with arrayness of an operand through an operator.  */
3290
3291   t = SUCCESS;
3292
3293   switch (e->value.op.op)
3294     {
3295     case INTRINSIC_PLUS:
3296     case INTRINSIC_MINUS:
3297     case INTRINSIC_TIMES:
3298     case INTRINSIC_DIVIDE:
3299     case INTRINSIC_POWER:
3300     case INTRINSIC_CONCAT:
3301     case INTRINSIC_AND:
3302     case INTRINSIC_OR:
3303     case INTRINSIC_EQV:
3304     case INTRINSIC_NEQV:
3305     case INTRINSIC_EQ:
3306     case INTRINSIC_EQ_OS:
3307     case INTRINSIC_NE:
3308     case INTRINSIC_NE_OS:
3309     case INTRINSIC_GT:
3310     case INTRINSIC_GT_OS:
3311     case INTRINSIC_GE:
3312     case INTRINSIC_GE_OS:
3313     case INTRINSIC_LT:
3314     case INTRINSIC_LT_OS:
3315     case INTRINSIC_LE:
3316     case INTRINSIC_LE_OS:
3317
3318       if (op1->rank == 0 && op2->rank == 0)
3319         e->rank = 0;
3320
3321       if (op1->rank == 0 && op2->rank != 0)
3322         {
3323           e->rank = op2->rank;
3324
3325           if (e->shape == NULL)
3326             e->shape = gfc_copy_shape (op2->shape, op2->rank);
3327         }
3328
3329       if (op1->rank != 0 && op2->rank == 0)
3330         {
3331           e->rank = op1->rank;
3332
3333           if (e->shape == NULL)
3334             e->shape = gfc_copy_shape (op1->shape, op1->rank);
3335         }
3336
3337       if (op1->rank != 0 && op2->rank != 0)
3338         {
3339           if (op1->rank == op2->rank)
3340             {
3341               e->rank = op1->rank;
3342               if (e->shape == NULL)
3343                 {
3344                   t = compare_shapes(op1, op2);
3345                   if (t == FAILURE)
3346                     e->shape = NULL;
3347                   else
3348                 e->shape = gfc_copy_shape (op1->shape, op1->rank);
3349                 }
3350             }
3351           else
3352             {
3353               /* Allow higher level expressions to work.  */
3354               e->rank = 0;
3355
3356               /* Try user-defined operators, and otherwise throw an error.  */
3357               dual_locus_error = true;
3358               sprintf (msg,
3359                        _("Inconsistent ranks for operator at %%L and %%L"));
3360               goto bad_op;
3361             }
3362         }
3363
3364       break;
3365
3366     case INTRINSIC_PARENTHESES:
3367     case INTRINSIC_NOT:
3368     case INTRINSIC_UPLUS:
3369     case INTRINSIC_UMINUS:
3370       /* Simply copy arrayness attribute */
3371       e->rank = op1->rank;
3372
3373       if (e->shape == NULL)
3374         e->shape = gfc_copy_shape (op1->shape, op1->rank);
3375
3376       break;
3377
3378     default:
3379       break;
3380     }
3381
3382   /* Attempt to simplify the expression.  */
3383   if (t == SUCCESS)
3384     {
3385       t = gfc_simplify_expr (e, 0);
3386       /* Some calls do not succeed in simplification and return FAILURE
3387          even though there is no error; e.g. variable references to
3388          PARAMETER arrays.  */
3389       if (!gfc_is_constant_expr (e))
3390         t = SUCCESS;
3391     }
3392   return t;
3393
3394 bad_op:
3395
3396   if (gfc_extend_expr (e) == SUCCESS)
3397     return SUCCESS;
3398
3399   if (dual_locus_error)
3400     gfc_error (msg, &op1->where, &op2->where);
3401   else
3402     gfc_error (msg, &e->where);
3403
3404   return FAILURE;
3405 }
3406
3407
3408 /************** Array resolution subroutines **************/
3409
3410 typedef enum
3411 { CMP_LT, CMP_EQ, CMP_GT, CMP_UNKNOWN }
3412 comparison;
3413
3414 /* Compare two integer expressions.  */
3415
3416 static comparison
3417 compare_bound (gfc_expr *a, gfc_expr *b)
3418 {
3419   int i;
3420
3421   if (a == NULL || a->expr_type != EXPR_CONSTANT
3422       || b == NULL || b->expr_type != EXPR_CONSTANT)
3423     return CMP_UNKNOWN;
3424
3425   /* If either of the types isn't INTEGER, we must have
3426      raised an error earlier.  */
3427
3428   if (a->ts.type != BT_INTEGER || b->ts.type != BT_INTEGER)
3429     return CMP_UNKNOWN;
3430
3431   i = mpz_cmp (a->value.integer, b->value.integer);
3432
3433   if (i < 0)
3434     return CMP_LT;
3435   if (i > 0)
3436     return CMP_GT;
3437   return CMP_EQ;
3438 }
3439
3440
3441 /* Compare an integer expression with an integer.  */
3442
3443 static comparison
3444 compare_bound_int (gfc_expr *a, int b)
3445 {
3446   int i;
3447
3448   if (a == NULL || a->expr_type != EXPR_CONSTANT)
3449     return CMP_UNKNOWN;
3450
3451   if (a->ts.type != BT_INTEGER)
3452     gfc_internal_error ("compare_bound_int(): Bad expression");
3453
3454   i = mpz_cmp_si (a->value.integer, b);
3455
3456   if (i < 0)
3457     return CMP_LT;
3458   if (i > 0)
3459     return CMP_GT;
3460   return CMP_EQ;
3461 }
3462
3463
3464 /* Compare an integer expression with a mpz_t.  */
3465
3466 static comparison
3467 compare_bound_mpz_t (gfc_expr *a, mpz_t b)
3468 {
3469   int i;
3470
3471   if (a == NULL || a->expr_type != EXPR_CONSTANT)
3472     return CMP_UNKNOWN;
3473
3474   if (a->ts.type != BT_INTEGER)
3475     gfc_internal_error ("compare_bound_int(): Bad expression");
3476
3477   i = mpz_cmp (a->value.integer, b);
3478
3479   if (i < 0)
3480     return CMP_LT;
3481   if (i > 0)
3482     return CMP_GT;
3483   return CMP_EQ;
3484 }
3485
3486
3487 /* Compute the last value of a sequence given by a triplet.  
3488    Return 0 if it wasn't able to compute the last value, or if the
3489    sequence if empty, and 1 otherwise.  */
3490
3491 static int
3492 compute_last_value_for_triplet (gfc_expr *start, gfc_expr *end,
3493                                 gfc_expr *stride, mpz_t last)
3494 {
3495   mpz_t rem;
3496
3497   if (start == NULL || start->expr_type != EXPR_CONSTANT
3498       || end == NULL || end->expr_type != EXPR_CONSTANT
3499       || (stride != NULL && stride->expr_type != EXPR_CONSTANT))
3500     return 0;
3501
3502   if (start->ts.type != BT_INTEGER || end->ts.type != BT_INTEGER
3503       || (stride != NULL && stride->ts.type != BT_INTEGER))
3504     return 0;
3505
3506   if (stride == NULL || compare_bound_int(stride, 1) == CMP_EQ)
3507     {
3508       if (compare_bound (start, end) == CMP_GT)
3509         return 0;
3510       mpz_set (last, end->value.integer);
3511       return 1;
3512     }
3513
3514   if (compare_bound_int (stride, 0) == CMP_GT)
3515     {
3516       /* Stride is positive */
3517       if (mpz_cmp (start->value.integer, end->value.integer) > 0)
3518         return 0;
3519     }
3520   else
3521     {
3522       /* Stride is negative */
3523       if (mpz_cmp (start->value.integer, end->value.integer) < 0)
3524         return 0;
3525     }
3526
3527   mpz_init (rem);
3528   mpz_sub (rem, end->value.integer, start->value.integer);
3529   mpz_tdiv_r (rem, rem, stride->value.integer);
3530   mpz_sub (last, end->value.integer, rem);
3531   mpz_clear (rem);
3532
3533   return 1;
3534 }
3535
3536
3537 /* Compare a single dimension of an array reference to the array
3538    specification.  */
3539
3540 static gfc_try
3541 check_dimension (int i, gfc_array_ref *ar, gfc_array_spec *as)
3542 {
3543   mpz_t last_value;
3544
3545 /* Given start, end and stride values, calculate the minimum and
3546    maximum referenced indexes.  */
3547
3548   switch (ar->dimen_type[i])
3549     {
3550     case DIMEN_VECTOR:
3551       break;
3552
3553     case DIMEN_ELEMENT:
3554       if (compare_bound (ar->start[i], as->lower[i]) == CMP_LT)
3555         {
3556           gfc_warning ("Array reference at %L is out of bounds "
3557                        "(%ld < %ld) in dimension %d", &ar->c_where[i],
3558                        mpz_get_si (ar->start[i]->value.integer),
3559                        mpz_get_si (as->lower[i]->value.integer), i+1);
3560           return SUCCESS;
3561         }
3562       if (compare_bound (ar->start[i], as->upper[i]) == CMP_GT)
3563         {
3564           gfc_warning ("Array reference at %L is out of bounds "
3565                        "(%ld > %ld) in dimension %d", &ar->c_where[i],
3566                        mpz_get_si (ar->start[i]->value.integer),
3567                        mpz_get_si (as->upper[i]->value.integer), i+1);
3568           return SUCCESS;
3569         }
3570
3571       break;
3572
3573     case DIMEN_RANGE:
3574       {
3575 #define AR_START (ar->start[i] ? ar->start[i] : as->lower[i])
3576 #define AR_END (ar->end[i] ? ar->end[i] : as->upper[i])
3577
3578         comparison comp_start_end = compare_bound (AR_START, AR_END);
3579
3580         /* Check for zero stride, which is not allowed.  */
3581         if (compare_bound_int (ar->stride[i], 0) == CMP_EQ)
3582           {
3583             gfc_error ("Illegal stride of zero at %L", &ar->c_where[i]);
3584             return FAILURE;
3585           }
3586
3587         /* if start == len || (stride > 0 && start < len)
3588                            || (stride < 0 && start > len),
3589            then the array section contains at least one element.  In this
3590            case, there is an out-of-bounds access if
3591            (start < lower || start > upper).  */
3592         if (compare_bound (AR_START, AR_END) == CMP_EQ
3593             || ((compare_bound_int (ar->stride[i], 0) == CMP_GT
3594                  || ar->stride[i] == NULL) && comp_start_end == CMP_LT)
3595             || (compare_bound_int (ar->stride[i], 0) == CMP_LT
3596                 && comp_start_end == CMP_GT))
3597           {
3598             if (compare_bound (AR_START, as->lower[i]) == CMP_LT)
3599               {
3600                 gfc_warning ("Lower array reference at %L is out of bounds "
3601                        "(%ld < %ld) in dimension %d", &ar->c_where[i],
3602                        mpz_get_si (AR_START->value.integer),
3603                        mpz_get_si (as->lower[i]->value.integer), i+1);
3604                 return SUCCESS;
3605               }
3606             if (compare_bound (AR_START, as->upper[i]) == CMP_GT)
3607               {
3608                 gfc_warning ("Lower array reference at %L is out of bounds "
3609                        "(%ld > %ld) in dimension %d", &ar->c_where[i],
3610                        mpz_get_si (AR_START->value.integer),
3611                        mpz_get_si (as->upper[i]->value.integer), i+1);
3612                 return SUCCESS;
3613               }
3614           }
3615
3616         /* If we can compute the highest index of the array section,
3617            then it also has to be between lower and upper.  */
3618         mpz_init (last_value);
3619         if (compute_last_value_for_triplet (AR_START, AR_END, ar->stride[i],
3620                                             last_value))
3621           {
3622             if (compare_bound_mpz_t (as->lower[i], last_value) == CMP_GT)
3623               {
3624                 gfc_warning ("Upper array reference at %L is out of bounds "
3625                        "(%ld < %ld) in dimension %d", &ar->c_where[i],
3626                        mpz_get_si (last_value),
3627                        mpz_get_si (as->lower[i]->value.integer), i+1);
3628                 mpz_clear (last_value);
3629                 return SUCCESS;
3630               }
3631             if (compare_bound_mpz_t (as->upper[i], last_value) == CMP_LT)
3632               {
3633                 gfc_warning ("Upper array reference at %L is out of bounds "
3634                        "(%ld > %ld) in dimension %d", &ar->c_where[i],
3635                        mpz_get_si (last_value),
3636                        mpz_get_si (as->upper[i]->value.integer), i+1);
3637                 mpz_clear (last_value);
3638                 return SUCCESS;
3639               }
3640           }
3641         mpz_clear (last_value);
3642
3643 #undef AR_START
3644 #undef AR_END
3645       }
3646       break;
3647
3648     default:
3649       gfc_internal_error ("check_dimension(): Bad array reference");
3650     }
3651
3652   return SUCCESS;
3653 }
3654
3655
3656 /* Compare an array reference with an array specification.  */
3657
3658 static gfc_try
3659 compare_spec_to_ref (gfc_array_ref *ar)
3660 {
3661   gfc_array_spec *as;
3662   int i;
3663
3664   as = ar->as;
3665   i = as->rank - 1;
3666   /* TODO: Full array sections are only allowed as actual parameters.  */
3667   if (as->type == AS_ASSUMED_SIZE
3668       && (/*ar->type == AR_FULL
3669           ||*/ (ar->type == AR_SECTION
3670               && ar->dimen_type[i] == DIMEN_RANGE && ar->end[i] == NULL)))
3671     {
3672       gfc_error ("Rightmost upper bound of assumed size array section "
3673                  "not specified at %L", &ar->where);
3674       return FAILURE;
3675     }
3676
3677   if (ar->type == AR_FULL)
3678     return SUCCESS;
3679
3680   if (as->rank != ar->dimen)
3681     {
3682       gfc_error ("Rank mismatch in array reference at %L (%d/%d)",
3683                  &ar->where, ar->dimen, as->rank);
3684       return FAILURE;
3685     }
3686
3687   for (i = 0; i < as->rank; i++)
3688     if (check_dimension (i, ar, as) == FAILURE)
3689       return FAILURE;
3690
3691   return SUCCESS;
3692 }
3693
3694
3695 /* Resolve one part of an array index.  */
3696
3697 gfc_try
3698 gfc_resolve_index (gfc_expr *index, int check_scalar)
3699 {
3700   gfc_typespec ts;
3701
3702   if (index == NULL)
3703     return SUCCESS;
3704
3705   if (gfc_resolve_expr (index) == FAILURE)
3706     return FAILURE;
3707
3708   if (check_scalar && index->rank != 0)
3709     {
3710       gfc_error ("Array index at %L must be scalar", &index->where);
3711       return FAILURE;
3712     }
3713
3714   if (index->ts.type != BT_INTEGER && index->ts.type != BT_REAL)
3715     {
3716       gfc_error ("Array index at %L must be of INTEGER type, found %s",
3717                  &index->where, gfc_basic_typename (index->ts.type));
3718       return FAILURE;
3719     }
3720
3721   if (index->ts.type == BT_REAL)
3722     if (gfc_notify_std (GFC_STD_LEGACY, "Extension: REAL array index at %L",
3723                         &index->where) == FAILURE)
3724       return FAILURE;
3725
3726   if (index->ts.kind != gfc_index_integer_kind
3727       || index->ts.type != BT_INTEGER)
3728     {
3729       gfc_clear_ts (&ts);
3730       ts.type = BT_INTEGER;
3731       ts.kind = gfc_index_integer_kind;
3732
3733       gfc_convert_type_warn (index, &ts, 2, 0);
3734     }
3735
3736   return SUCCESS;
3737 }
3738
3739 /* Resolve a dim argument to an intrinsic function.  */
3740
3741 gfc_try
3742 gfc_resolve_dim_arg (gfc_expr *dim)
3743 {
3744   if (dim == NULL)
3745     return SUCCESS;
3746
3747   if (gfc_resolve_expr (dim) == FAILURE)
3748     return FAILURE;
3749
3750   if (dim->rank != 0)
3751     {
3752       gfc_error ("Argument dim at %L must be scalar", &dim->where);
3753       return FAILURE;
3754
3755     }
3756
3757   if (dim->ts.type != BT_INTEGER)
3758     {
3759       gfc_error ("Argument dim at %L must be of INTEGER type", &dim->where);
3760       return FAILURE;
3761     }
3762
3763   if (dim->ts.kind != gfc_index_integer_kind)
3764     {
3765       gfc_typespec ts;
3766
3767       ts.type = BT_INTEGER;
3768       ts.kind = gfc_index_integer_kind;
3769
3770       gfc_convert_type_warn (dim, &ts, 2, 0);
3771     }
3772
3773   return SUCCESS;
3774 }
3775
3776 /* Given an expression that contains array references, update those array
3777    references to point to the right array specifications.  While this is
3778    filled in during matching, this information is difficult to save and load
3779    in a module, so we take care of it here.
3780
3781    The idea here is that the original array reference comes from the
3782    base symbol.  We traverse the list of reference structures, setting
3783    the stored reference to references.  Component references can
3784    provide an additional array specification.  */
3785
3786 static void
3787 find_array_spec (gfc_expr *e)
3788 {
3789   gfc_array_spec *as;
3790   gfc_component *c;
3791   gfc_symbol *derived;
3792   gfc_ref *ref;
3793
3794   as = e->symtree->n.sym->as;
3795   derived = NULL;
3796
3797   for (ref = e->ref; ref; ref = ref->next)
3798     switch (ref->type)
3799       {
3800       case REF_ARRAY:
3801         if (as == NULL)
3802           gfc_internal_error ("find_array_spec(): Missing spec");
3803
3804         ref->u.ar.as = as;
3805         as = NULL;
3806         break;
3807
3808       case REF_COMPONENT:
3809         if (derived == NULL)
3810           derived = e->symtree->n.sym->ts.derived;
3811
3812         c = derived->components;
3813
3814         for (; c; c = c->next)
3815           if (c == ref->u.c.component)
3816             {
3817               /* Track the sequence of component references.  */
3818               if (c->ts.type == BT_DERIVED)
3819                 derived = c->ts.derived;
3820               break;
3821             }
3822
3823         if (c == NULL)
3824           gfc_internal_error ("find_array_spec(): Component not found");
3825
3826         if (c->attr.dimension)
3827           {
3828             if (as != NULL)
3829               gfc_internal_error ("find_array_spec(): unused as(1)");
3830             as = c->as;
3831           }
3832
3833         break;
3834
3835       case REF_SUBSTRING:
3836         break;
3837       }
3838
3839   if (as != NULL)
3840     gfc_internal_error ("find_array_spec(): unused as(2)");
3841 }
3842
3843
3844 /* Resolve an array reference.  */
3845
3846 static gfc_try
3847 resolve_array_ref (gfc_array_ref *ar)
3848 {
3849   int i, check_scalar;
3850   gfc_expr *e;
3851
3852   for (i = 0; i < ar->dimen; i++)
3853     {
3854       check_scalar = ar->dimen_type[i] == DIMEN_RANGE;
3855
3856       if (gfc_resolve_index (ar->start[i], check_scalar) == FAILURE)
3857         return FAILURE;
3858       if (gfc_resolve_index (ar->end[i], check_scalar) == FAILURE)
3859         return FAILURE;
3860       if (gfc_resolve_index (ar->stride[i], check_scalar) == FAILURE)
3861         return FAILURE;
3862
3863       e = ar->start[i];
3864
3865       if (ar->dimen_type[i] == DIMEN_UNKNOWN)
3866         switch (e->rank)
3867           {
3868           case 0:
3869             ar->dimen_type[i] = DIMEN_ELEMENT;
3870             break;
3871
3872           case 1:
3873             ar->dimen_type[i] = DIMEN_VECTOR;
3874             if (e->expr_type == EXPR_VARIABLE
3875                 && e->symtree->n.sym->ts.type == BT_DERIVED)
3876               ar->start[i] = gfc_get_parentheses (e);
3877             break;
3878
3879           default:
3880             gfc_error ("Array index at %L is an array of rank %d",
3881                        &ar->c_where[i], e->rank);
3882             return FAILURE;
3883           }
3884     }
3885
3886   /* If the reference type is unknown, figure out what kind it is.  */
3887
3888   if (ar->type == AR_UNKNOWN)
3889     {
3890       ar->type = AR_ELEMENT;
3891       for (i = 0; i < ar->dimen; i++)
3892         if (ar->dimen_type[i] == DIMEN_RANGE
3893             || ar->dimen_type[i] == DIMEN_VECTOR)
3894           {
3895             ar->type = AR_SECTION;
3896             break;
3897           }
3898     }
3899
3900   if (!ar->as->cray_pointee && compare_spec_to_ref (ar) == FAILURE)
3901     return FAILURE;
3902
3903   return SUCCESS;
3904 }
3905
3906
3907 static gfc_try
3908 resolve_substring (gfc_ref *ref)
3909 {
3910   int k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
3911
3912   if (ref->u.ss.start != NULL)
3913     {
3914       if (gfc_resolve_expr (ref->u.ss.start) == FAILURE)
3915         return FAILURE;
3916
3917       if (ref->u.ss.start->ts.type != BT_INTEGER)
3918         {
3919           gfc_error ("Substring start index at %L must be of type INTEGER",
3920                      &ref->u.ss.start->where);
3921           return FAILURE;
3922         }
3923
3924       if (ref->u.ss.start->rank != 0)
3925         {
3926           gfc_error ("Substring start index at %L must be scalar",
3927                      &ref->u.ss.start->where);
3928           return FAILURE;
3929         }
3930
3931       if (compare_bound_int (ref->u.ss.start, 1) == CMP_LT
3932           && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
3933               || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
3934         {
3935           gfc_error ("Substring start index at %L is less than one",
3936                      &ref->u.ss.start->where);
3937           return FAILURE;
3938         }
3939     }
3940
3941   if (ref->u.ss.end != NULL)
3942     {
3943       if (gfc_resolve_expr (ref->u.ss.end) == FAILURE)
3944         return FAILURE;
3945
3946       if (ref->u.ss.end->ts.type != BT_INTEGER)
3947         {
3948           gfc_error ("Substring end index at %L must be of type INTEGER",
3949                      &ref->u.ss.end->where);
3950           return FAILURE;
3951         }
3952
3953       if (ref->u.ss.end->rank != 0)
3954         {
3955           gfc_error ("Substring end index at %L must be scalar",
3956                      &ref->u.ss.end->where);
3957           return FAILURE;
3958         }
3959
3960       if (ref->u.ss.length != NULL
3961           && compare_bound (ref->u.ss.end, ref->u.ss.length->length) == CMP_GT
3962           && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
3963               || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
3964         {
3965           gfc_error ("Substring end index at %L exceeds the string length",
3966                      &ref->u.ss.start->where);
3967           return FAILURE;
3968         }
3969
3970       if (compare_bound_mpz_t (ref->u.ss.end,
3971                                gfc_integer_kinds[k].huge) == CMP_GT
3972           && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
3973               || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
3974         {
3975           gfc_error ("Substring end index at %L is too large",
3976                      &ref->u.ss.end->where);
3977           return FAILURE;
3978         }
3979     }
3980
3981   return SUCCESS;
3982 }
3983
3984
3985 /* This function supplies missing substring charlens.  */
3986
3987 void
3988 gfc_resolve_substring_charlen (gfc_expr *e)
3989 {
3990   gfc_ref *char_ref;
3991   gfc_expr *start, *end;
3992
3993   for (char_ref = e->ref; char_ref; char_ref = char_ref->next)
3994     if (char_ref->type == REF_SUBSTRING)
3995       break;
3996
3997   if (!char_ref)
3998     return;
3999
4000   gcc_assert (char_ref->next == NULL);
4001
4002   if (e->ts.cl)
4003     {
4004       if (e->ts.cl->length)
4005         gfc_free_expr (e->ts.cl->length);
4006       else if (e->expr_type == EXPR_VARIABLE
4007                  && e->symtree->n.sym->attr.dummy)
4008         return;
4009     }
4010
4011   e->ts.type = BT_CHARACTER;
4012   e->ts.kind = gfc_default_character_kind;
4013
4014   if (!e->ts.cl)
4015     {
4016       e->ts.cl = gfc_get_charlen ();
4017       e->ts.cl->next = gfc_current_ns->cl_list;
4018       gfc_current_ns->cl_list = e->ts.cl;
4019     }
4020
4021   if (char_ref->u.ss.start)
4022     start = gfc_copy_expr (char_ref->u.ss.start);
4023   else
4024     start = gfc_int_expr (1);
4025
4026   if (char_ref->u.ss.end)
4027     end = gfc_copy_expr (char_ref->u.ss.end);
4028   else if (e->expr_type == EXPR_VARIABLE)
4029     end = gfc_copy_expr (e->symtree->n.sym->ts.cl->length);
4030   else
4031     end = NULL;
4032
4033   if (!start || !end)
4034     return;
4035
4036   /* Length = (end - start +1).  */
4037   e->ts.cl->length = gfc_subtract (end, start);
4038   e->ts.cl->length = gfc_add (e->ts.cl->length, gfc_int_expr (1));
4039
4040   e->ts.cl->length->ts.type = BT_INTEGER;
4041   e->ts.cl->length->ts.kind = gfc_charlen_int_kind;
4042
4043   /* Make sure that the length is simplified.  */
4044   gfc_simplify_expr (e->ts.cl->length, 1);
4045   gfc_resolve_expr (e->ts.cl->length);
4046 }
4047
4048
4049 /* Resolve subtype references.  */
4050
4051 static gfc_try
4052 resolve_ref (gfc_expr *expr)
4053 {
4054   int current_part_dimension, n_components, seen_part_dimension;
4055   gfc_ref *ref;
4056
4057   for (ref = expr->ref; ref; ref = ref->next)
4058     if (ref->type == REF_ARRAY && ref->u.ar.as == NULL)
4059       {
4060         find_array_spec (expr);
4061         break;
4062       }
4063
4064   for (ref = expr->ref; ref; ref = ref->next)
4065     switch (ref->type)
4066       {
4067       case REF_ARRAY:
4068         if (resolve_array_ref (&ref->u.ar) == FAILURE)
4069           return FAILURE;
4070         break;
4071
4072       case REF_COMPONENT:
4073         break;
4074
4075       case REF_SUBSTRING:
4076         resolve_substring (ref);
4077         break;
4078       }
4079
4080   /* Check constraints on part references.  */
4081
4082   current_part_dimension = 0;
4083   seen_part_dimension = 0;
4084   n_components = 0;
4085
4086   for (ref = expr->ref; ref; ref = ref->next)
4087     {
4088       switch (ref->type)
4089         {
4090         case REF_ARRAY:
4091           switch (ref->u.ar.type)
4092             {
4093             case AR_FULL:
4094             case AR_SECTION:
4095               current_part_dimension = 1;
4096               break;
4097
4098             case AR_ELEMENT:
4099               current_part_dimension = 0;
4100               break;
4101
4102             case AR_UNKNOWN:
4103               gfc_internal_error ("resolve_ref(): Bad array reference");
4104             }
4105
4106           break;
4107
4108         case REF_COMPONENT:
4109           if (current_part_dimension || seen_part_dimension)
4110             {
4111               if (ref->u.c.component->attr.pointer)
4112                 {
4113                   gfc_error ("Component to the right of a part reference "
4114                              "with nonzero rank must not have the POINTER "
4115                              "attribute at %L", &expr->where);
4116                   return FAILURE;
4117                 }
4118               else if (ref->u.c.component->attr.allocatable)
4119                 {
4120                   gfc_error ("Component to the right of a part reference "
4121                              "with nonzero rank must not have the ALLOCATABLE "
4122                              "attribute at %L", &expr->where);
4123                   return FAILURE;
4124                 }
4125             }
4126
4127           n_components++;
4128           break;
4129
4130         case REF_SUBSTRING:
4131           break;
4132         }
4133
4134       if (((ref->type == REF_COMPONENT && n_components > 1)
4135            || ref->next == NULL)
4136           && current_part_dimension
4137           && seen_part_dimension)
4138         {
4139           gfc_error ("Two or more part references with nonzero rank must "
4140                      "not be specified at %L", &expr->where);
4141           return FAILURE;
4142         }
4143
4144       if (ref->type == REF_COMPONENT)
4145         {
4146           if (current_part_dimension)
4147             seen_part_dimension = 1;
4148
4149           /* reset to make sure */
4150           current_part_dimension = 0;
4151         }
4152     }
4153
4154   return SUCCESS;
4155 }
4156
4157
4158 /* Given an expression, determine its shape.  This is easier than it sounds.
4159    Leaves the shape array NULL if it is not possible to determine the shape.  */
4160
4161 static void
4162 expression_shape (gfc_expr *e)
4163 {
4164   mpz_t array[GFC_MAX_DIMENSIONS];
4165   int i;
4166
4167   if (e->rank == 0 || e->shape != NULL)
4168     return;
4169
4170   for (i = 0; i < e->rank; i++)
4171     if (gfc_array_dimen_size (e, i, &array[i]) == FAILURE)
4172       goto fail;
4173
4174   e->shape = gfc_get_shape (e->rank);
4175
4176   memcpy (e->shape, array, e->rank * sizeof (mpz_t));
4177
4178   return;
4179
4180 fail:
4181   for (i--; i >= 0; i--)
4182     mpz_clear (array[i]);
4183 }
4184
4185
4186 /* Given a variable expression node, compute the rank of the expression by
4187    examining the base symbol and any reference structures it may have.  */
4188
4189 static void
4190 expression_rank (gfc_expr *e)
4191 {
4192   gfc_ref *ref;
4193   int i, rank;
4194
4195   /* Just to make sure, because EXPR_COMPCALL's also have an e->ref and that
4196      could lead to serious confusion...  */
4197   gcc_assert (e->expr_type != EXPR_COMPCALL);
4198
4199   if (e->ref == NULL)
4200     {
4201       if (e->expr_type == EXPR_ARRAY)
4202         goto done;
4203       /* Constructors can have a rank different from one via RESHAPE().  */
4204
4205       if (e->symtree == NULL)
4206         {
4207           e->rank = 0;
4208           goto done;
4209         }
4210
4211       e->rank = (e->symtree->n.sym->as == NULL)
4212                 ? 0 : e->symtree->n.sym->as->rank;
4213       goto done;
4214     }
4215
4216   rank = 0;
4217
4218   for (ref = e->ref; ref; ref = ref->next)
4219     {
4220       if (ref->type != REF_ARRAY)
4221         continue;
4222
4223       if (ref->u.ar.type == AR_FULL)
4224         {
4225           rank = ref->u.ar.as->rank;
4226           break;
4227         }
4228
4229       if (ref->u.ar.type == AR_SECTION)
4230         {
4231           /* Figure out the rank of the section.  */
4232           if (rank != 0)
4233             gfc_internal_error ("expression_rank(): Two array specs");
4234
4235           for (i = 0; i < ref->u.ar.dimen; i++)
4236             if (ref->u.ar.dimen_type[i] == DIMEN_RANGE
4237                 || ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
4238               rank++;
4239
4240           break;
4241         }
4242     }
4243
4244   e->rank = rank;
4245
4246 done:
4247   expression_shape (e);
4248 }
4249
4250
4251 /* Resolve a variable expression.  */
4252
4253 static gfc_try
4254 resolve_variable (gfc_expr *e)
4255 {
4256   gfc_symbol *sym;
4257   gfc_try t;
4258
4259   t = SUCCESS;
4260
4261   if (e->symtree == NULL)
4262     return FAILURE;
4263
4264   if (e->ref && resolve_ref (e) == FAILURE)
4265     return FAILURE;
4266
4267   sym = e->symtree->n.sym;
4268   if (sym->attr.flavor == FL_PROCEDURE
4269       && (!sym->attr.function
4270           || (sym->attr.function && sym->result
4271               && sym->result->attr.proc_pointer
4272               && !sym->result->attr.function)))
4273     {
4274       e->ts.type = BT_PROCEDURE;
4275       goto resolve_procedure;
4276     }
4277
4278   if (sym->ts.type != BT_UNKNOWN)
4279     gfc_variable_attr (e, &e->ts);
4280   else
4281     {
4282       /* Must be a simple variable reference.  */
4283       if (gfc_set_default_type (sym, 1, sym->ns) == FAILURE)
4284         return FAILURE;
4285       e->ts = sym->ts;
4286     }
4287
4288   if (check_assumed_size_reference (sym, e))
4289     return FAILURE;
4290
4291   /* Deal with forward references to entries during resolve_code, to
4292      satisfy, at least partially, 12.5.2.5.  */
4293   if (gfc_current_ns->entries
4294       && current_entry_id == sym->entry_id
4295       && cs_base
4296       && cs_base->current
4297       && cs_base->current->op != EXEC_ENTRY)
4298     {
4299       gfc_entry_list *entry;
4300       gfc_formal_arglist *formal;
4301       int n;
4302       bool seen;
4303
4304       /* If the symbol is a dummy...  */
4305       if (sym->attr.dummy && sym->ns == gfc_current_ns)
4306         {
4307           entry = gfc_current_ns->entries;
4308           seen = false;
4309
4310           /* ...test if the symbol is a parameter of previous entries.  */
4311           for (; entry && entry->id <= current_entry_id; entry = entry->next)
4312             for (formal = entry->sym->formal; formal; formal = formal->next)
4313               {
4314                 if (formal->sym && sym->name == formal->sym->name)
4315                   seen = true;
4316               }
4317
4318           /*  If it has not been seen as a dummy, this is an error.  */
4319           if (!seen)
4320             {
4321               if (specification_expr)
4322                 gfc_error ("Variable '%s', used in a specification expression"
4323                            ", is referenced at %L before the ENTRY statement "
4324                            "in which it is a parameter",
4325                            sym->name, &cs_base->current->loc);
4326               else
4327                 gfc_error ("Variable '%s' is used at %L before the ENTRY "
4328                            "statement in which it is a parameter",
4329                            sym->name, &cs_base->current->loc);
4330               t = FAILURE;
4331             }
4332         }
4333
4334       /* Now do the same check on the specification expressions.  */
4335       specification_expr = 1;
4336       if (sym->ts.type == BT_CHARACTER
4337           && gfc_resolve_expr (sym->ts.cl->length) == FAILURE)
4338         t = FAILURE;
4339
4340       if (sym->as)
4341         for (n = 0; n < sym->as->rank; n++)
4342           {
4343              specification_expr = 1;
4344              if (gfc_resolve_expr (sym->as->lower[n]) == FAILURE)
4345                t = FAILURE;
4346              specification_expr = 1;
4347              if (gfc_resolve_expr (sym->as->upper[n]) == FAILURE)
4348                t = FAILURE;
4349           }
4350       specification_expr = 0;
4351
4352       if (t == SUCCESS)
4353         /* Update the symbol's entry level.  */
4354         sym->entry_id = current_entry_id + 1;
4355     }
4356
4357 resolve_procedure:
4358   if (t == SUCCESS && resolve_procedure_expression (e) == FAILURE)
4359     t = FAILURE;
4360
4361   return t;
4362 }
4363
4364
4365 /* Checks to see that the correct symbol has been host associated.
4366    The only situation where this arises is that in which a twice
4367    contained function is parsed after the host association is made.
4368    Therefore, on detecting this, change the symbol in the expression
4369    and convert the array reference into an actual arglist if the old
4370    symbol is a variable.  */
4371 static bool
4372 check_host_association (gfc_expr *e)
4373 {
4374   gfc_symbol *sym, *old_sym;
4375   gfc_symtree *st;
4376   int n;
4377   gfc_ref *ref;
4378   gfc_actual_arglist *arg, *tail = NULL;
4379   bool retval = e->expr_type == EXPR_FUNCTION;
4380
4381   /*  If the expression is the result of substitution in
4382       interface.c(gfc_extend_expr) because there is no way in
4383       which the host association can be wrong.  */
4384   if (e->symtree == NULL
4385         || e->symtree->n.sym == NULL
4386         || e->user_operator)
4387     return retval;
4388
4389   old_sym = e->symtree->n.sym;
4390
4391   if (gfc_current_ns->parent
4392         && old_sym->ns != gfc_current_ns)
4393     {
4394       /* Use the 'USE' name so that renamed module symbols are
4395          correctly handled.  */
4396       gfc_find_symbol (e->symtree->name, gfc_current_ns, 1, &sym);
4397
4398       if (sym && old_sym != sym
4399               && sym->ts.type == old_sym->ts.type
4400               && sym->attr.flavor == FL_PROCEDURE
4401               && sym->attr.contained)
4402         {
4403           /* Clear the shape, since it might not be valid.  */
4404           if (e->shape != NULL)
4405             {
4406               for (n = 0; n < e->rank; n++)
4407                 mpz_clear (e->shape[n]);
4408
4409               gfc_free (e->shape);
4410             }
4411
4412           /* Give the expression the right symtree!  */
4413           gfc_find_sym_tree (e->symtree->name, NULL, 1, &st);
4414           gcc_assert (st != NULL);
4415
4416           if (old_sym->attr.flavor == FL_PROCEDURE
4417                 || e->expr_type == EXPR_FUNCTION)
4418             {
4419               /* Original was function so point to the new symbol, since
4420                  the actual argument list is already attached to the
4421                  expression. */
4422               e->value.function.esym = NULL;
4423               e->symtree = st;
4424             }
4425           else
4426             {
4427               /* Original was variable so convert array references into
4428                  an actual arglist. This does not need any checking now
4429                  since gfc_resolve_function will take care of it.  */
4430               e->value.function.actual = NULL;
4431               e->expr_type = EXPR_FUNCTION;
4432               e->symtree = st;
4433
4434               /* Ambiguity will not arise if the array reference is not
4435                  the last reference.  */
4436               for (ref = e->ref; ref; ref = ref->next)
4437                 if (ref->type == REF_ARRAY && ref->next == NULL)
4438                   break;
4439
4440               gcc_assert (ref->type == REF_ARRAY);
4441
4442               /* Grab the start expressions from the array ref and
4443                  copy them into actual arguments.  */
4444               for (n = 0; n < ref->u.ar.dimen; n++)
4445                 {
4446                   arg = gfc_get_actual_arglist ();
4447                   arg->expr = gfc_copy_expr (ref->u.ar.start[n]);
4448                   if (e->value.function.actual == NULL)
4449                     tail = e->value.function.actual = arg;
4450                   else
4451                     {
4452                       tail->next = arg;
4453                       tail = arg;
4454                     }
4455                 }
4456
4457               /* Dump the reference list and set the rank.  */
4458               gfc_free_ref_list (e->ref);
4459               e->ref = NULL;
4460               e->rank = sym->as ? sym->as->rank : 0;
4461             }
4462
4463           gfc_resolve_expr (e);
4464           sym->refs++;
4465         }
4466     }
4467   /* This might have changed!  */
4468   return e->expr_type == EXPR_FUNCTION;
4469 }
4470
4471
4472 static void
4473 gfc_resolve_character_operator (gfc_expr *e)
4474 {
4475   gfc_expr *op1 = e->value.op.op1;
4476   gfc_expr *op2 = e->value.op.op2;
4477   gfc_expr *e1 = NULL;
4478   gfc_expr *e2 = NULL;
4479
4480   gcc_assert (e->value.op.op == INTRINSIC_CONCAT);
4481
4482   if (op1->ts.cl && op1->ts.cl->length)
4483     e1 = gfc_copy_expr (op1->ts.cl->length);
4484   else if (op1->expr_type == EXPR_CONSTANT)
4485     e1 = gfc_int_expr (op1->value.character.length);
4486
4487   if (op2->ts.cl && op2->ts.cl->length)
4488     e2 = gfc_copy_expr (op2->ts.cl->length);
4489   else if (op2->expr_type == EXPR_CONSTANT)
4490     e2 = gfc_int_expr (op2->value.character.length);
4491
4492   e->ts.cl = gfc_get_charlen ();
4493   e->ts.cl->next = gfc_current_ns->cl_list;
4494   gfc_current_ns->cl_list = e->ts.cl;
4495
4496   if (!e1 || !e2)
4497     return;
4498
4499   e->ts.cl->length = gfc_add (e1, e2);
4500   e->ts.cl->length->ts.type = BT_INTEGER;
4501   e->ts.cl->length->ts.kind = gfc_charlen_int_kind;
4502   gfc_simplify_expr (e->ts.cl->length, 0);
4503   gfc_resolve_expr (e->ts.cl->length);
4504
4505   return;
4506 }
4507
4508
4509 /*  Ensure that an character expression has a charlen and, if possible, a
4510     length expression.  */
4511
4512 static void
4513 fixup_charlen (gfc_expr *e)
4514 {
4515   /* The cases fall through so that changes in expression type and the need
4516      for multiple fixes are picked up.  In all circumstances, a charlen should
4517      be available for the middle end to hang a backend_decl on.  */
4518   switch (e->expr_type)
4519     {
4520     case EXPR_OP:
4521       gfc_resolve_character_operator (e);
4522
4523     case EXPR_ARRAY:
4524       if (e->expr_type == EXPR_ARRAY)
4525         gfc_resolve_character_array_constructor (e);
4526
4527     case EXPR_SUBSTRING:
4528       if (!e->ts.cl && e->ref)
4529         gfc_resolve_substring_charlen (e);
4530
4531     default:
4532       if (!e->ts.cl)
4533         {
4534           e->ts.cl = gfc_get_charlen ();
4535           e->ts.cl->next = gfc_current_ns->cl_list;
4536           gfc_current_ns->cl_list = e->ts.cl;
4537         }
4538
4539       break;
4540     }
4541 }
4542
4543
4544 /* Update an actual argument to include the passed-object for type-bound
4545    procedures at the right position.  */
4546
4547 static gfc_actual_arglist*
4548 update_arglist_pass (gfc_actual_arglist* lst, gfc_expr* po, unsigned argpos)
4549 {
4550   gcc_assert (argpos > 0);
4551
4552   if (argpos == 1)
4553     {
4554       gfc_actual_arglist* result;
4555
4556       result = gfc_get_actual_arglist ();
4557       result->expr = po;
4558       result->next = lst;
4559
4560       return result;
4561     }
4562
4563   gcc_assert (lst);
4564   gcc_assert (argpos > 1);
4565
4566   lst->next = update_arglist_pass (lst->next, po, argpos - 1);
4567   return lst;
4568 }
4569
4570
4571 /* Extract the passed-object from an EXPR_COMPCALL (a copy of it).  */
4572
4573 static gfc_expr*
4574 extract_compcall_passed_object (gfc_expr* e)
4575 {
4576   gfc_expr* po;
4577
4578   gcc_assert (e->expr_type == EXPR_COMPCALL);
4579
4580   po = gfc_get_expr ();
4581   po->expr_type = EXPR_VARIABLE;
4582   po->symtree = e->symtree;
4583   po->ref = gfc_copy_ref (e->ref);
4584
4585   if (gfc_resolve_expr (po) == FAILURE)
4586     return NULL;
4587
4588   return po;
4589 }
4590
4591
4592 /* Update the arglist of an EXPR_COMPCALL expression to include the
4593    passed-object.  */
4594
4595 static gfc_try
4596 update_compcall_arglist (gfc_expr* e)
4597 {
4598   gfc_expr* po;
4599   gfc_typebound_proc* tbp;
4600
4601   tbp = e->value.compcall.tbp;
4602
4603   if (tbp->error)
4604     return FAILURE;
4605
4606   po = extract_compcall_passed_object (e);
4607   if (!po)
4608     return FAILURE;
4609
4610   if (po->rank > 0)
4611     {
4612       gfc_error ("Passed-object at %L must be scalar", &e->where);
4613       return FAILURE;
4614     }
4615
4616   if (tbp->nopass)
4617     {
4618       gfc_free_expr (po);
4619       return SUCCESS;
4620     }
4621
4622   gcc_assert (tbp->pass_arg_num > 0);
4623   e->value.compcall.actual = update_arglist_pass (e->value.compcall.actual, po,
4624                                                   tbp->pass_arg_num);
4625
4626   return SUCCESS;
4627 }
4628
4629
4630 /* Check that the object a TBP is called on is valid, i.e. it must not be
4631    of ABSTRACT type (as in subobject%abstract_parent%tbp()).  */
4632
4633 static gfc_try
4634 check_typebound_baseobject (gfc_expr* e)
4635 {
4636   gfc_expr* base;
4637
4638   base = extract_compcall_passed_object (e);
4639   if (!base)
4640     return FAILURE;
4641
4642   gcc_assert (base->ts.type == BT_DERIVED);
4643   if (base->ts.derived->attr.abstract)
4644     {
4645       gfc_error ("Base object for type-bound procedure call at %L is of"
4646                  " ABSTRACT type '%s'", &e->where, base->ts.derived->name);
4647       return FAILURE;
4648     }
4649
4650   return SUCCESS;
4651 }
4652
4653
4654 /* Resolve a call to a type-bound procedure, either function or subroutine,
4655    statically from the data in an EXPR_COMPCALL expression.  The adapted
4656    arglist and the target-procedure symtree are returned.  */
4657
4658 static gfc_try
4659 resolve_typebound_static (gfc_expr* e, gfc_symtree** target,
4660                           gfc_actual_arglist** actual)
4661 {
4662   gcc_assert (e->expr_type == EXPR_COMPCALL);
4663   gcc_assert (!e->value.compcall.tbp->is_generic);
4664
4665   /* Update the actual arglist for PASS.  */
4666   if (update_compcall_arglist (e) == FAILURE)
4667     return FAILURE;
4668
4669   *actual = e->value.compcall.actual;
4670   *target = e->value.compcall.tbp->u.specific;
4671
4672   gfc_free_ref_list (e->ref);
4673   e->ref = NULL;
4674   e->value.compcall.actual = NULL;
4675
4676   return SUCCESS;
4677 }
4678
4679
4680 /* Given an EXPR_COMPCALL calling a GENERIC typebound procedure, figure out
4681    which of the specific bindings (if any) matches the arglist and transform
4682    the expression into a call of that binding.  */
4683
4684 static gfc_try
4685 resolve_typebound_generic_call (gfc_expr* e)
4686 {
4687   gfc_typebound_proc* genproc;
4688   const char* genname;
4689
4690   gcc_assert (e->expr_type == EXPR_COMPCALL);
4691   genname = e->value.compcall.name;
4692   genproc = e->value.compcall.tbp;
4693
4694   if (!genproc->is_generic)
4695     return SUCCESS;
4696
4697   /* Try the bindings on this type and in the inheritance hierarchy.  */
4698   for (; genproc; genproc = genproc->overridden)
4699     {
4700       gfc_tbp_generic* g;
4701
4702       gcc_assert (genproc->is_generic);
4703       for (g = genproc->u.generic; g; g = g->next)
4704         {
4705           gfc_symbol* target;
4706           gfc_actual_arglist* args;
4707           bool matches;
4708
4709           gcc_assert (g->specific);
4710
4711           if (g->specific->error)
4712             continue;
4713
4714           target = g->specific->u.specific->n.sym;
4715
4716           /* Get the right arglist by handling PASS/NOPASS.  */
4717           args = gfc_copy_actual_arglist (e->value.compcall.actual);
4718           if (!g->specific->nopass)
4719             {
4720               gfc_expr* po;
4721               po = extract_compcall_passed_object (e);
4722               if (!po)
4723                 return FAILURE;
4724
4725               gcc_assert (g->specific->pass_arg_num > 0);
4726               gcc_assert (!g->specific->error);
4727               args = update_arglist_pass (args, po, g->specific->pass_arg_num);
4728             }
4729           resolve_actual_arglist (args, target->attr.proc,
4730                                   is_external_proc (target) && !target->formal);
4731
4732           /* Check if this arglist matches the formal.  */
4733           matches = gfc_arglist_matches_symbol (&args, target);
4734
4735           /* Clean up and break out of the loop if we've found it.  */
4736           gfc_free_actual_arglist (args);
4737           if (matches)
4738             {
4739               e->value.compcall.tbp = g->specific;
4740               goto success;
4741             }
4742         }
4743     }
4744
4745   /* Nothing matching found!  */
4746   gfc_error ("Found no matching specific binding for the call to the GENERIC"
4747              " '%s' at %L", genname, &e->where);
4748   return FAILURE;
4749
4750 success:
4751   return SUCCESS;
4752 }
4753
4754
4755 /* Resolve a call to a type-bound subroutine.  */
4756
4757 static gfc_try
4758 resolve_typebound_call (gfc_code* c)
4759 {
4760   gfc_actual_arglist* newactual;
4761   gfc_symtree* target;
4762
4763   /* Check that's really a SUBROUTINE.  */
4764   if (!c->expr1->value.compcall.tbp->subroutine)
4765     {
4766       gfc_error ("'%s' at %L should be a SUBROUTINE",
4767                  c->expr1->value.compcall.name, &c->loc);
4768       return FAILURE;
4769     }
4770
4771   if (check_typebound_baseobject (c->expr1) == FAILURE)
4772     return FAILURE;
4773
4774   if (resolve_typebound_generic_call (c->expr1) == FAILURE)
4775     return FAILURE;
4776
4777   /* Transform into an ordinary EXEC_CALL for now.  */
4778
4779   if (resolve_typebound_static (c->expr1, &target, &newactual) == FAILURE)
4780     return FAILURE;
4781
4782   c->ext.actual = newactual;
4783   c->symtree = target;
4784   c->op = EXEC_CALL;
4785
4786   gcc_assert (!c->expr1->ref && !c->expr1->value.compcall.actual);
4787   gfc_free_expr (c->expr1);
4788   c->expr1 = NULL;
4789
4790   return resolve_call (c);
4791 }
4792
4793
4794 /* Resolve a component-call expression.  */
4795
4796 static gfc_try
4797 resolve_compcall (gfc_expr* e)
4798 {
4799   gfc_actual_arglist* newactual;
4800   gfc_symtree* target;
4801
4802   /* Check that's really a FUNCTION.  */
4803   if (!e->value.compcall.tbp->function)
4804     {
4805       gfc_error ("'%s' at %L should be a FUNCTION",
4806                  e->value.compcall.name, &e->where);
4807       return FAILURE;
4808     }
4809
4810   if (check_typebound_baseobject (e) == FAILURE)
4811     return FAILURE;
4812
4813   if (resolve_typebound_generic_call (e) == FAILURE)
4814     return FAILURE;
4815   gcc_assert (!e->value.compcall.tbp->is_generic);
4816
4817   /* Take the rank from the function's symbol.  */
4818   if (e->value.compcall.tbp->u.specific->n.sym->as)
4819     e->rank = e->value.compcall.tbp->u.specific->n.sym->as->rank;
4820
4821   /* For now, we simply transform it into an EXPR_FUNCTION call with the same
4822      arglist to the TBP's binding target.  */
4823
4824   if (resolve_typebound_static (e, &target, &newactual) == FAILURE)
4825     return FAILURE;
4826
4827   e->value.function.actual = newactual;
4828   e->value.function.name = e->value.compcall.name;
4829   e->value.function.esym = target->n.sym;
4830   e->value.function.isym = NULL;
4831   e->symtree = target;
4832   e->ts = target->n.sym->ts;
4833   e->expr_type = EXPR_FUNCTION;
4834
4835   return gfc_resolve_expr (e);
4836 }
4837
4838
4839 /* Resolve a CALL to a Procedure Pointer Component (Subroutine).  */
4840
4841 static gfc_try
4842 resolve_ppc_call (gfc_code* c)
4843 {
4844   gfc_component *comp;
4845   gcc_assert (gfc_is_proc_ptr_comp (c->expr1, &comp));
4846
4847   c->resolved_sym = c->expr1->symtree->n.sym;
4848   c->expr1->expr_type = EXPR_VARIABLE;
4849   c->ext.actual = c->expr1->value.compcall.actual;
4850
4851   if (!comp->attr.subroutine)
4852     gfc_add_subroutine (&comp->attr, comp->name, &c->expr1->where);
4853
4854   if (resolve_ref (c->expr1) == FAILURE)
4855     return FAILURE;
4856
4857   if (resolve_actual_arglist (c->ext.actual, comp->attr.proc,
4858                               comp->formal == NULL) == FAILURE)
4859     return FAILURE;
4860
4861   gfc_ppc_use (comp, &c->expr1->value.compcall.actual, &c->expr1->where);
4862
4863   return SUCCESS;
4864 }
4865
4866
4867 /* Resolve a Function Call to a Procedure Pointer Component (Function).  */
4868
4869 static gfc_try
4870 resolve_expr_ppc (gfc_expr* e)
4871 {
4872   gfc_component *comp;
4873   gcc_assert (gfc_is_proc_ptr_comp (e, &comp));
4874
4875   /* Convert to EXPR_FUNCTION.  */
4876   e->expr_type = EXPR_FUNCTION;
4877   e->value.function.isym = NULL;
4878   e->value.function.actual = e->value.compcall.actual;
4879   e->ts = comp->ts;
4880   if (comp->as != NULL)
4881     e->rank = comp->as->rank;
4882
4883   if (!comp->attr.function)
4884     gfc_add_function (&comp->attr, comp->name, &e->where);
4885
4886   if (resolve_ref (e) == FAILURE)
4887     return FAILURE;
4888
4889   if (resolve_actual_arglist (e->value.function.actual, comp->attr.proc,
4890                               comp->formal == NULL) == FAILURE)
4891     return FAILURE;
4892
4893   gfc_ppc_use (comp, &e->value.compcall.actual, &e->where);
4894
4895   return SUCCESS;
4896 }
4897
4898
4899 /* Resolve an expression.  That is, make sure that types of operands agree
4900    with their operators, intrinsic operators are converted to function calls
4901    for overloaded types and unresolved function references are resolved.  */
4902
4903 gfc_try
4904 gfc_resolve_expr (gfc_expr *e)
4905 {
4906   gfc_try t;
4907
4908   if (e == NULL)
4909     return SUCCESS;
4910
4911   switch (e->expr_type)
4912     {
4913     case EXPR_OP:
4914       t = resolve_operator (e);
4915       break;
4916
4917     case EXPR_FUNCTION:
4918     case EXPR_VARIABLE:
4919
4920       if (check_host_association (e))
4921         t = resolve_function (e);
4922       else
4923         {
4924           t = resolve_variable (e);
4925           if (t == SUCCESS)
4926             expression_rank (e);
4927         }
4928
4929       if (e->ts.type == BT_CHARACTER && e->ts.cl == NULL && e->ref
4930           && e->ref->type != REF_SUBSTRING)
4931         gfc_resolve_substring_charlen (e);
4932
4933       break;
4934
4935     case EXPR_COMPCALL:
4936       t = resolve_compcall (e);
4937       break;
4938
4939     case EXPR_SUBSTRING:
4940       t = resolve_ref (e);
4941       break;
4942
4943     case EXPR_CONSTANT:
4944     case EXPR_NULL:
4945       t = SUCCESS;
4946       break;
4947
4948     case EXPR_PPC:
4949       t = resolve_expr_ppc (e);
4950       break;
4951
4952     case EXPR_ARRAY:
4953       t = FAILURE;
4954       if (resolve_ref (e) == FAILURE)
4955         break;
4956
4957       t = gfc_resolve_array_constructor (e);
4958       /* Also try to expand a constructor.  */
4959       if (t == SUCCESS)
4960         {
4961           expression_rank (e);
4962           gfc_expand_constructor (e);
4963         }
4964
4965       /* This provides the opportunity for the length of constructors with
4966          character valued function elements to propagate the string length
4967          to the expression.  */
4968       if (t == SUCCESS && e->ts.type == BT_CHARACTER)
4969         t = gfc_resolve_character_array_constructor (e);
4970
4971       break;
4972
4973     case EXPR_STRUCTURE:
4974       t = resolve_ref (e);
4975       if (t == FAILURE)
4976         break;
4977
4978       t = resolve_structure_cons (e);
4979       if (t == FAILURE)
4980         break;
4981
4982       t = gfc_simplify_expr (e, 0);
4983       break;
4984
4985     default:
4986       gfc_internal_error ("gfc_resolve_expr(): Bad expression type");
4987     }
4988
4989   if (e->ts.type == BT_CHARACTER && t == SUCCESS && !e->ts.cl)
4990     fixup_charlen (e);
4991
4992   return t;
4993 }
4994
4995
4996 /* Resolve an expression from an iterator.  They must be scalar and have
4997    INTEGER or (optionally) REAL type.  */
4998
4999 static gfc_try
5000 gfc_resolve_iterator_expr (gfc_expr *expr, bool real_ok,
5001                            const char *name_msgid)
5002 {
5003   if (gfc_resolve_expr (expr) == FAILURE)
5004     return FAILURE;
5005
5006   if (expr->rank != 0)
5007     {
5008       gfc_error ("%s at %L must be a scalar", _(name_msgid), &expr->where);
5009       return FAILURE;
5010     }
5011
5012   if (expr->ts.type != BT_INTEGER)
5013     {
5014       if (expr->ts.type == BT_REAL)
5015         {
5016           if (real_ok)
5017             return gfc_notify_std (GFC_STD_F95_DEL,
5018                                    "Deleted feature: %s at %L must be integer",
5019                                    _(name_msgid), &expr->where);
5020           else
5021             {
5022               gfc_error ("%s at %L must be INTEGER", _(name_msgid),
5023                          &expr->where);
5024               return FAILURE;
5025             }
5026         }
5027       else
5028         {
5029           gfc_error ("%s at %L must be INTEGER", _(name_msgid), &expr->where);
5030           return FAILURE;
5031         }
5032     }
5033   return SUCCESS;
5034 }
5035
5036
5037 /* Resolve the expressions in an iterator structure.  If REAL_OK is
5038    false allow only INTEGER type iterators, otherwise allow REAL types.  */
5039
5040 gfc_try
5041 gfc_resolve_iterator (gfc_iterator *iter, bool real_ok)
5042 {
5043   if (gfc_resolve_iterator_expr (iter->var, real_ok, "Loop variable")
5044       == FAILURE)
5045     return FAILURE;
5046
5047   if (gfc_pure (NULL) && gfc_impure_variable (iter->var->symtree->n.sym))
5048     {
5049       gfc_error ("Cannot assign to loop variable in PURE procedure at %L",
5050                  &iter->var->where);
5051       return FAILURE;
5052     }
5053
5054   if (gfc_resolve_iterator_expr (iter->start, real_ok,
5055                                  "Start expression in DO loop") == FAILURE)
5056     return FAILURE;
5057
5058   if (gfc_resolve_iterator_expr (iter->end, real_ok,
5059                                  "End expression in DO loop") == FAILURE)
5060     return FAILURE;
5061
5062   if (gfc_resolve_iterator_expr (iter->step, real_ok,
5063                                  "Step expression in DO loop") == FAILURE)
5064     return FAILURE;
5065
5066   if (iter->step->expr_type == EXPR_CONSTANT)
5067     {
5068       if ((iter->step->ts.type == BT_INTEGER
5069            && mpz_cmp_ui (iter->step->value.integer, 0) == 0)
5070           || (iter->step->ts.type == BT_REAL
5071               && mpfr_sgn (iter->step->value.real) == 0))
5072         {
5073           gfc_error ("Step expression in DO loop at %L cannot be zero",
5074                      &iter->step->where);
5075           return FAILURE;
5076         }
5077     }
5078
5079   /* Convert start, end, and step to the same type as var.  */
5080   if (iter->start->ts.kind != iter->var->ts.kind
5081       || iter->start->ts.type != iter->var->ts.type)
5082     gfc_convert_type (iter->start, &iter->var->ts, 2);
5083
5084   if (iter->end->ts.kind != iter->var->ts.kind
5085       || iter->end->ts.type != iter->var->ts.type)
5086     gfc_convert_type (iter->end, &iter->var->ts, 2);
5087
5088   if (iter->step->ts.kind != iter->var->ts.kind
5089       || iter->step->ts.type != iter->var->ts.type)
5090     gfc_convert_type (iter->step, &iter->var->ts, 2);
5091
5092   if (iter->start->expr_type == EXPR_CONSTANT
5093       && iter->end->expr_type == EXPR_CONSTANT
5094       && iter->step->expr_type == EXPR_CONSTANT)
5095     {
5096       int sgn, cmp;
5097       if (iter->start->ts.type == BT_INTEGER)
5098         {
5099           sgn = mpz_cmp_ui (iter->step->value.integer, 0);
5100           cmp = mpz_cmp (iter->end->value.integer, iter->start->value.integer);
5101         }
5102       else
5103         {
5104           sgn = mpfr_sgn (iter->step->value.real);
5105           cmp = mpfr_cmp (iter->end->value.real, iter->start->value.real);
5106         }
5107       if ((sgn > 0 && cmp < 0) || (sgn < 0 && cmp > 0))
5108         gfc_warning ("DO loop at %L will be executed zero times",
5109                      &iter->step->where);
5110     }
5111
5112   return SUCCESS;
5113 }
5114
5115
5116 /* Traversal function for find_forall_index.  f == 2 signals that
5117    that variable itself is not to be checked - only the references.  */
5118
5119 static bool
5120 forall_index (gfc_expr *expr, gfc_symbol *sym, int *f)
5121 {
5122   if (expr->expr_type != EXPR_VARIABLE)
5123     return false;
5124   
5125   /* A scalar assignment  */
5126   if (!expr->ref || *f == 1)
5127     {
5128       if (expr->symtree->n.sym == sym)
5129         return true;
5130       else
5131         return false;
5132     }
5133
5134   if (*f == 2)
5135     *f = 1;
5136   return false;
5137 }
5138
5139
5140 /* Check whether the FORALL index appears in the expression or not.
5141    Returns SUCCESS if SYM is found in EXPR.  */
5142
5143 gfc_try
5144 find_forall_index (gfc_expr *expr, gfc_symbol *sym, int f)
5145 {
5146   if (gfc_traverse_expr (expr, sym, forall_index, f))
5147     return SUCCESS;
5148   else
5149     return FAILURE;
5150 }
5151
5152
5153 /* Resolve a list of FORALL iterators.  The FORALL index-name is constrained
5154    to be a scalar INTEGER variable.  The subscripts and stride are scalar
5155    INTEGERs, and if stride is a constant it must be nonzero.
5156    Furthermore "A subscript or stride in a forall-triplet-spec shall
5157    not contain a reference to any index-name in the
5158    forall-triplet-spec-list in which it appears." (7.5.4.1)  */
5159
5160 static void
5161 resolve_forall_iterators (gfc_forall_iterator *it)
5162 {
5163   gfc_forall_iterator *iter, *iter2;
5164
5165   for (iter = it; iter; iter = iter->next)
5166     {
5167       if (gfc_resolve_expr (iter->var) == SUCCESS
5168           && (iter->var->ts.type != BT_INTEGER || iter->var->rank != 0))
5169         gfc_error ("FORALL index-name at %L must be a scalar INTEGER",
5170                    &iter->var->where);
5171
5172       if (gfc_resolve_expr (iter->start) == SUCCESS
5173           && (iter->start->ts.type != BT_INTEGER || iter->start->rank != 0))
5174         gfc_error ("FORALL start expression at %L must be a scalar INTEGER",
5175                    &iter->start->where);
5176       if (iter->var->ts.kind != iter->start->ts.kind)
5177         gfc_convert_type (iter->start, &iter->var->ts, 2);
5178
5179       if (gfc_resolve_expr (iter->end) == SUCCESS
5180           && (iter->end->ts.type != BT_INTEGER || iter->end->rank != 0))
5181         gfc_error ("FORALL end expression at %L must be a scalar INTEGER",
5182                    &iter->end->where);
5183       if (iter->var->ts.kind != iter->end->ts.kind)
5184         gfc_convert_type (iter->end, &iter->var->ts, 2);
5185
5186       if (gfc_resolve_expr (iter->stride) == SUCCESS)
5187         {
5188           if (iter->stride->ts.type != BT_INTEGER || iter->stride->rank != 0)
5189             gfc_error ("FORALL stride expression at %L must be a scalar %s",
5190                        &iter->stride->where, "INTEGER");
5191
5192           if (iter->stride->expr_type == EXPR_CONSTANT
5193               && mpz_cmp_ui(iter->stride->value.integer, 0) == 0)
5194             gfc_error ("FORALL stride expression at %L cannot be zero",
5195                        &iter->stride->where);
5196         }
5197       if (iter->var->ts.kind != iter->stride->ts.kind)
5198         gfc_convert_type (iter->stride, &iter->var->ts, 2);
5199     }
5200
5201   for (iter = it; iter; iter = iter->next)
5202     for (iter2 = iter; iter2; iter2 = iter2->next)
5203       {
5204         if (find_forall_index (iter2->start,
5205                                iter->var->symtree->n.sym, 0) == SUCCESS
5206             || find_forall_index (iter2->end,
5207                                   iter->var->symtree->n.sym, 0) == SUCCESS
5208             || find_forall_index (iter2->stride,
5209                                   iter->var->symtree->n.sym, 0) == SUCCESS)
5210           gfc_error ("FORALL index '%s' may not appear in triplet "
5211                      "specification at %L", iter->var->symtree->name,
5212                      &iter2->start->where);
5213       }
5214 }
5215
5216
5217 /* Given a pointer to a symbol that is a derived type, see if it's
5218    inaccessible, i.e. if it's defined in another module and the components are
5219    PRIVATE.  The search is recursive if necessary.  Returns zero if no
5220    inaccessible components are found, nonzero otherwise.  */
5221
5222 static int
5223 derived_inaccessible (gfc_symbol *sym)
5224 {
5225   gfc_component *c;
5226
5227   if (sym->attr.use_assoc && sym->attr.private_comp)
5228     return 1;
5229
5230   for (c = sym->components; c; c = c->next)
5231     {
5232         if (c->ts.type == BT_DERIVED && derived_inaccessible (c->ts.derived))
5233           return 1;
5234     }
5235
5236   return 0;
5237 }
5238
5239
5240 /* Resolve the argument of a deallocate expression.  The expression must be
5241    a pointer or a full array.  */
5242
5243 static gfc_try
5244 resolve_deallocate_expr (gfc_expr *e)
5245 {
5246   symbol_attribute attr;
5247   int allocatable, pointer, check_intent_in;
5248   gfc_ref *ref;
5249
5250   /* Check INTENT(IN), unless the object is a sub-component of a pointer.  */
5251   check_intent_in = 1;
5252
5253   if (gfc_resolve_expr (e) == FAILURE)
5254     return FAILURE;
5255
5256   if (e->expr_type != EXPR_VARIABLE)
5257     goto bad;
5258
5259   allocatable = e->symtree->n.sym->attr.allocatable;
5260   pointer = e->symtree->n.sym->attr.pointer;
5261   for (ref = e->ref; ref; ref = ref->next)
5262     {
5263       if (pointer)
5264         check_intent_in = 0;
5265
5266       switch (ref->type)
5267         {
5268         case REF_ARRAY:
5269           if (ref->u.ar.type != AR_FULL)
5270             allocatable = 0;
5271           break;
5272
5273         case REF_COMPONENT:
5274           allocatable = (ref->u.c.component->as != NULL
5275                          && ref->u.c.component->as->type == AS_DEFERRED);
5276           pointer = ref->u.c.component->attr.pointer;
5277           break;
5278
5279         case REF_SUBSTRING:
5280           allocatable = 0;
5281           break;
5282         }
5283     }
5284
5285   attr = gfc_expr_attr (e);
5286
5287   if (allocatable == 0 && attr.pointer == 0)
5288     {
5289     bad:
5290       gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",
5291                  &e->where);
5292     }
5293
5294   if (check_intent_in
5295       && e->symtree->n.sym->attr.intent == INTENT_IN)
5296     {
5297       gfc_error ("Cannot deallocate INTENT(IN) variable '%s' at %L",
5298                  e->symtree->n.sym->name, &e->where);
5299       return FAILURE;
5300     }
5301
5302   return SUCCESS;
5303 }
5304
5305
5306 /* Returns true if the expression e contains a reference to the symbol sym.  */
5307 static bool
5308 sym_in_expr (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
5309 {
5310   if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym == sym)
5311     return true;
5312
5313   return false;
5314 }
5315
5316 bool
5317 gfc_find_sym_in_expr (gfc_symbol *sym, gfc_expr *e)
5318 {
5319   return gfc_traverse_expr (e, sym, sym_in_expr, 0);
5320 }
5321
5322
5323 /* Given the expression node e for an allocatable/pointer of derived type to be
5324    allocated, get the expression node to be initialized afterwards (needed for
5325    derived types with default initializers, and derived types with allocatable
5326    components that need nullification.)  */
5327
5328 static gfc_expr *
5329 expr_to_initialize (gfc_expr *e)
5330 {
5331   gfc_expr *result;
5332   gfc_ref *ref;
5333   int i;
5334
5335   result = gfc_copy_expr (e);
5336
5337   /* Change the last array reference from AR_ELEMENT to AR_FULL.  */
5338   for (ref = result->ref; ref; ref = ref->next)
5339     if (ref->type == REF_ARRAY && ref->next == NULL)
5340       {
5341         ref->u.ar.type = AR_FULL;
5342
5343         for (i = 0; i < ref->u.ar.dimen; i++)
5344           ref->u.ar.start[i] = ref->u.ar.end[i] = ref->u.ar.stride[i] = NULL;
5345
5346         result->rank = ref->u.ar.dimen;
5347         break;
5348       }
5349
5350   return result;
5351 }
5352
5353
5354 /* Resolve the expression in an ALLOCATE statement, doing the additional
5355    checks to see whether the expression is OK or not.  The expression must
5356    have a trailing array reference that gives the size of the array.  */
5357
5358 static gfc_try
5359 resolve_allocate_expr (gfc_expr *e, gfc_code *code)
5360 {
5361   int i, pointer, allocatable, dimension, check_intent_in;
5362   symbol_attribute attr;
5363   gfc_ref *ref, *ref2;
5364   gfc_array_ref *ar;
5365   gfc_code *init_st;
5366   gfc_expr *init_e;
5367   gfc_symbol *sym;
5368   gfc_alloc *a;
5369
5370   /* Check INTENT(IN), unless the object is a sub-component of a pointer.  */
5371   check_intent_in = 1;
5372
5373   if (gfc_resolve_expr (e) == FAILURE)
5374     return FAILURE;
5375
5376   /* Make sure the expression is allocatable or a pointer.  If it is
5377      pointer, the next-to-last reference must be a pointer.  */
5378
5379   ref2 = NULL;
5380
5381   if (e->expr_type != EXPR_VARIABLE)
5382     {
5383       allocatable = 0;
5384       attr = gfc_expr_attr (e);
5385       pointer = attr.pointer;
5386       dimension = attr.dimension;
5387     }
5388   else
5389     {
5390       allocatable = e->symtree->n.sym->attr.allocatable;
5391       pointer = e->symtree->n.sym->attr.pointer;
5392       dimension = e->symtree->n.sym->attr.dimension;
5393
5394       for (ref = e->ref; ref; ref2 = ref, ref = ref->next)
5395         {
5396           if (pointer)
5397             check_intent_in = 0;
5398
5399           switch (ref->type)
5400             {
5401               case REF_ARRAY:
5402                 if (ref->next != NULL)
5403                   pointer = 0;
5404                 break;
5405
5406               case REF_COMPONENT:
5407                 allocatable = (ref->u.c.component->as != NULL
5408                                && ref->u.c.component->as->type == AS_DEFERRED);
5409
5410                 pointer = ref->u.c.component->attr.pointer;
5411                 dimension = ref->u.c.component->attr.dimension;
5412                 break;
5413
5414               case REF_SUBSTRING:
5415                 allocatable = 0;
5416                 pointer = 0;
5417                 break;
5418             }
5419         }
5420     }
5421
5422   if (allocatable == 0 && pointer == 0)
5423     {
5424       gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",
5425                  &e->where);
5426       return FAILURE;
5427     }
5428
5429   if (check_intent_in
5430       && e->symtree->n.sym->attr.intent == INTENT_IN)
5431     {
5432       gfc_error ("Cannot allocate INTENT(IN) variable '%s' at %L",
5433                  e->symtree->n.sym->name, &e->where);
5434       return FAILURE;
5435     }
5436
5437   /* Add default initializer for those derived types that need them.  */
5438   if (e->ts.type == BT_DERIVED && (init_e = gfc_default_initializer (&e->ts)))
5439     {
5440       init_st = gfc_get_code ();
5441       init_st->loc = code->loc;
5442       init_st->op = EXEC_INIT_ASSIGN;
5443       init_st->expr1 = expr_to_initialize (e);
5444       init_st->expr2 = init_e;
5445       init_st->next = code->next;
5446       code->next = init_st;
5447     }
5448
5449   if (pointer && dimension == 0)
5450     return SUCCESS;
5451
5452   /* Make sure the next-to-last reference node is an array specification.  */
5453
5454   if (ref2 == NULL || ref2->type != REF_ARRAY || ref2->u.ar.type == AR_FULL)
5455     {
5456       gfc_error ("Array specification required in ALLOCATE statement "
5457                  "at %L", &e->where);
5458       return FAILURE;
5459     }
5460
5461   /* Make sure that the array section reference makes sense in the
5462     context of an ALLOCATE specification.  */
5463
5464   ar = &ref2->u.ar;
5465
5466   for (i = 0; i < ar->dimen; i++)
5467     {
5468       if (ref2->u.ar.type == AR_ELEMENT)
5469         goto check_symbols;
5470
5471       switch (ar->dimen_type[i])
5472         {
5473         case DIMEN_ELEMENT:
5474           break;
5475
5476         case DIMEN_RANGE:
5477           if (ar->start[i] != NULL
5478               && ar->end[i] != NULL
5479               && ar->stride[i] == NULL)
5480             break;
5481
5482           /* Fall Through...  */
5483
5484         case DIMEN_UNKNOWN:
5485         case DIMEN_VECTOR:
5486           gfc_error ("Bad array specification in ALLOCATE statement at %L",
5487                      &e->where);
5488           return FAILURE;
5489         }
5490
5491 check_symbols:
5492
5493       for (a = code->ext.alloc_list; a; a = a->next)
5494         {
5495           sym = a->expr->symtree->n.sym;
5496
5497           /* TODO - check derived type components.  */
5498           if (sym->ts.type == BT_DERIVED)
5499             continue;
5500
5501           if ((ar->start[i] != NULL
5502                && gfc_find_sym_in_expr (sym, ar->start[i]))
5503               || (ar->end[i] != NULL
5504                   && gfc_find_sym_in_expr (sym, ar->end[i])))
5505             {
5506               gfc_error ("'%s' must not appear in the array specification at "
5507                          "%L in the same ALLOCATE statement where it is "
5508                          "itself allocated", sym->name, &ar->where);
5509               return FAILURE;
5510             }
5511         }
5512     }
5513
5514   return SUCCESS;
5515 }
5516
5517 static void
5518 resolve_allocate_deallocate (gfc_code *code, const char *fcn)
5519 {
5520   gfc_expr *stat, *errmsg, *pe, *qe;
5521   gfc_alloc *a, *p, *q;
5522
5523   stat = code->expr1 ? code->expr1 : NULL;
5524
5525   errmsg = code->expr2 ? code->expr2 : NULL;
5526
5527   /* Check the stat variable.  */
5528   if (stat)
5529     {
5530       if (stat->symtree->n.sym->attr.intent == INTENT_IN)
5531         gfc_error ("Stat-variable '%s' at %L cannot be INTENT(IN)",
5532                    stat->symtree->n.sym->name, &stat->where);
5533
5534       if (gfc_pure (NULL) && gfc_impure_variable (stat->symtree->n.sym))
5535         gfc_error ("Illegal stat-variable at %L for a PURE procedure",
5536                    &stat->where);
5537
5538       if (stat->ts.type != BT_INTEGER
5539           && !(stat->ref && (stat->ref->type == REF_ARRAY
5540                || stat->ref->type == REF_COMPONENT)))
5541         gfc_error ("Stat-variable at %L must be a scalar INTEGER "
5542                    "variable", &stat->where);
5543
5544       for (p = code->ext.alloc_list; p; p = p->next)
5545         if (p->expr->symtree->n.sym->name == stat->symtree->n.sym->name)
5546           gfc_error ("Stat-variable at %L shall not be %sd within "
5547                      "the same %s statement", &stat->where, fcn, fcn);
5548     }
5549
5550   /* Check the errmsg variable.  */
5551   if (errmsg)
5552     {
5553       if (!stat)
5554         gfc_warning ("ERRMSG at %L is useless without a STAT tag",
5555                      &errmsg->where);
5556
5557       if (errmsg->symtree->n.sym->attr.intent == INTENT_IN)
5558         gfc_error ("Errmsg-variable '%s' at %L cannot be INTENT(IN)",
5559                    errmsg->symtree->n.sym->name, &errmsg->where);
5560
5561       if (gfc_pure (NULL) && gfc_impure_variable (errmsg->symtree->n.sym))
5562         gfc_error ("Illegal errmsg-variable at %L for a PURE procedure",
5563                    &errmsg->where);
5564
5565       if (errmsg->ts.type != BT_CHARACTER
5566           && !(errmsg->ref
5567                && (errmsg->ref->type == REF_ARRAY
5568                    || errmsg->ref->type == REF_COMPONENT)))
5569         gfc_error ("Errmsg-variable at %L must be a scalar CHARACTER "
5570                    "variable", &errmsg->where);
5571
5572       for (p = code->ext.alloc_list; p; p = p->next)
5573         if (p->expr->symtree->n.sym->name == errmsg->symtree->n.sym->name)
5574           gfc_error ("Errmsg-variable at %L shall not be %sd within "
5575                      "the same %s statement", &errmsg->where, fcn, fcn);
5576     }
5577
5578   /* Check that an allocate-object appears only once in the statement.  
5579      FIXME: Checking derived types is disabled.  */
5580   for (p = code->ext.alloc_list; p; p = p->next)
5581     {
5582       pe = p->expr;
5583       if ((pe->ref && pe->ref->type != REF_COMPONENT)
5584            && (pe->symtree->n.sym->ts.type != BT_DERIVED))
5585         {
5586           for (q = p->next; q; q = q->next)
5587             {
5588               qe = q->expr;
5589               if ((qe->ref && qe->ref->type != REF_COMPONENT)
5590                   && (qe->symtree->n.sym->ts.type != BT_DERIVED)
5591                   && (pe->symtree->n.sym->name == qe->symtree->n.sym->name))
5592                 gfc_error ("Allocate-object at %L also appears at %L",
5593                            &pe->where, &qe->where);
5594             }
5595         }
5596     }
5597
5598   if (strcmp (fcn, "ALLOCATE") == 0)
5599     {
5600       for (a = code->ext.alloc_list; a; a = a->next)
5601         resolve_allocate_expr (a->expr, code);
5602     }
5603   else
5604     {
5605       for (a = code->ext.alloc_list; a; a = a->next)
5606         resolve_deallocate_expr (a->expr);
5607     }
5608 }
5609
5610
5611 /************ SELECT CASE resolution subroutines ************/
5612
5613 /* Callback function for our mergesort variant.  Determines interval
5614    overlaps for CASEs. Return <0 if op1 < op2, 0 for overlap, >0 for
5615    op1 > op2.  Assumes we're not dealing with the default case.  
5616    We have op1 = (:L), (K:L) or (K:) and op2 = (:N), (M:N) or (M:).
5617    There are nine situations to check.  */
5618
5619 static int
5620 compare_cases (const gfc_case *op1, const gfc_case *op2)
5621 {
5622   int retval;
5623
5624   if (op1->low == NULL) /* op1 = (:L)  */
5625     {
5626       /* op2 = (:N), so overlap.  */
5627       retval = 0;
5628       /* op2 = (M:) or (M:N),  L < M  */
5629       if (op2->low != NULL
5630           && gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
5631         retval = -1;
5632     }
5633   else if (op1->high == NULL) /* op1 = (K:)  */
5634     {
5635       /* op2 = (M:), so overlap.  */
5636       retval = 0;
5637       /* op2 = (:N) or (M:N), K > N  */
5638       if (op2->high != NULL
5639           && gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
5640         retval = 1;
5641     }
5642   else /* op1 = (K:L)  */
5643     {
5644       if (op2->low == NULL)       /* op2 = (:N), K > N  */
5645         retval = (gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
5646                  ? 1 : 0;
5647       else if (op2->high == NULL) /* op2 = (M:), L < M  */
5648         retval = (gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
5649                  ? -1 : 0;
5650       else                      /* op2 = (M:N)  */
5651         {
5652           retval =  0;
5653           /* L < M  */
5654           if (gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
5655             retval =  -1;
5656           /* K > N  */
5657           else if (gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
5658             retval =  1;
5659         }
5660     }
5661
5662   return retval;
5663 }
5664
5665
5666 /* Merge-sort a double linked case list, detecting overlap in the
5667    process.  LIST is the head of the double linked case list before it
5668    is sorted.  Returns the head of the sorted list if we don't see any
5669    overlap, or NULL otherwise.  */
5670
5671 static gfc_case *
5672 check_case_overlap (gfc_case *list)
5673 {
5674   gfc_case *p, *q, *e, *tail;
5675   int insize, nmerges, psize, qsize, cmp, overlap_seen;
5676
5677   /* If the passed list was empty, return immediately.  */
5678   if (!list)
5679     return NULL;
5680
5681   overlap_seen = 0;
5682   insize = 1;
5683
5684   /* Loop unconditionally.  The only exit from this loop is a return
5685      statement, when we've finished sorting the case list.  */
5686   for (;;)
5687     {
5688       p = list;
5689       list = NULL;
5690       tail = NULL;
5691
5692       /* Count the number of merges we do in this pass.  */
5693       nmerges = 0;
5694
5695       /* Loop while there exists a merge to be done.  */
5696       while (p)
5697         {
5698           int i;
5699
5700           /* Count this merge.  */
5701           nmerges++;
5702
5703           /* Cut the list in two pieces by stepping INSIZE places
5704              forward in the list, starting from P.  */
5705           psize = 0;
5706           q = p;
5707           for (i = 0; i < insize; i++)
5708             {
5709               psize++;
5710               q = q->right;
5711               if (!q)
5712                 break;
5713             }
5714           qsize = insize;
5715
5716           /* Now we have two lists.  Merge them!  */
5717           while (psize > 0 || (qsize > 0 && q != NULL))
5718             {
5719               /* See from which the next case to merge comes from.  */
5720               if (psize == 0)
5721                 {
5722                   /* P is empty so the next case must come from Q.  */
5723                   e = q;
5724                   q = q->right;
5725                   qsize--;
5726                 }
5727               else if (qsize == 0 || q == NULL)
5728                 {
5729                   /* Q is empty.  */
5730                   e = p;
5731                   p = p->right;
5732                   psize--;
5733                 }
5734               else
5735                 {
5736                   cmp = compare_cases (p, q);
5737                   if (cmp < 0)
5738                     {
5739                       /* The whole case range for P is less than the
5740                          one for Q.  */
5741                       e = p;
5742                       p = p->right;
5743                       psize--;
5744                     }
5745                   else if (cmp > 0)
5746                     {
5747                       /* The whole case range for Q is greater than
5748                          the case range for P.  */
5749                       e = q;
5750                       q = q->right;
5751                       qsize--;
5752                     }
5753                   else
5754                     {
5755                       /* The cases overlap, or they are the same
5756                          element in the list.  Either way, we must
5757                          issue an error and get the next case from P.  */
5758                       /* FIXME: Sort P and Q by line number.  */
5759                       gfc_error ("CASE label at %L overlaps with CASE "
5760                                  "label at %L", &p->where, &q->where);
5761                       overlap_seen = 1;
5762                       e = p;
5763                       p = p->right;
5764                       psize--;
5765                     }
5766                 }
5767
5768                 /* Add the next element to the merged list.  */
5769               if (tail)
5770                 tail->right = e;
5771               else
5772                 list = e;
5773               e->left = tail;
5774               tail = e;
5775             }
5776
5777           /* P has now stepped INSIZE places along, and so has Q.  So
5778              they're the same.  */
5779           p = q;
5780         }
5781       tail->right = NULL;
5782
5783       /* If we have done only one merge or none at all, we've
5784          finished sorting the cases.  */
5785       if (nmerges <= 1)
5786         {
5787           if (!overlap_seen)
5788             return list;
5789           else
5790             return NULL;
5791         }
5792
5793       /* Otherwise repeat, merging lists twice the size.  */
5794       insize *= 2;
5795     }
5796 }
5797
5798
5799 /* Check to see if an expression is suitable for use in a CASE statement.
5800    Makes sure that all case expressions are scalar constants of the same
5801    type.  Return FAILURE if anything is wrong.  */
5802
5803 static gfc_try
5804 validate_case_label_expr (gfc_expr *e, gfc_expr *case_expr)
5805 {
5806   if (e == NULL) return SUCCESS;
5807
5808   if (e->ts.type != case_expr->ts.type)
5809     {
5810       gfc_error ("Expression in CASE statement at %L must be of type %s",
5811                  &e->where, gfc_basic_typename (case_expr->ts.type));
5812       return FAILURE;
5813     }
5814
5815   /* C805 (R808) For a given case-construct, each case-value shall be of
5816      the same type as case-expr.  For character type, length differences
5817      are allowed, but the kind type parameters shall be the same.  */
5818
5819   if (case_expr->ts.type == BT_CHARACTER && e->ts.kind != case_expr->ts.kind)
5820     {
5821       gfc_error ("Expression in CASE statement at %L must be of kind %d",
5822                  &e->where, case_expr->ts.kind);
5823       return FAILURE;
5824     }
5825
5826   /* Convert the case value kind to that of case expression kind, if needed.
5827      FIXME:  Should a warning be issued?  */
5828   if (e->ts.kind != case_expr->ts.kind)
5829     gfc_convert_type_warn (e, &case_expr->ts, 2, 0);
5830
5831   if (e->rank != 0)
5832     {
5833       gfc_error ("Expression in CASE statement at %L must be scalar",
5834                  &e->where);
5835       return FAILURE;
5836     }
5837
5838   return SUCCESS;
5839 }
5840
5841
5842 /* Given a completely parsed select statement, we:
5843
5844      - Validate all expressions and code within the SELECT.
5845      - Make sure that the selection expression is not of the wrong type.
5846      - Make sure that no case ranges overlap.
5847      - Eliminate unreachable cases and unreachable code resulting from
5848        removing case labels.
5849
5850    The standard does allow unreachable cases, e.g. CASE (5:3).  But
5851    they are a hassle for code generation, and to prevent that, we just
5852    cut them out here.  This is not necessary for overlapping cases
5853    because they are illegal and we never even try to generate code.
5854
5855    We have the additional caveat that a SELECT construct could have
5856    been a computed GOTO in the source code. Fortunately we can fairly
5857    easily work around that here: The case_expr for a "real" SELECT CASE
5858    is in code->expr1, but for a computed GOTO it is in code->expr2. All
5859    we have to do is make sure that the case_expr is a scalar integer
5860    expression.  */
5861
5862 static void
5863 resolve_select (gfc_code *code)
5864 {
5865   gfc_code *body;
5866   gfc_expr *case_expr;
5867   gfc_case *cp, *default_case, *tail, *head;
5868   int seen_unreachable;
5869   int seen_logical;
5870   int ncases;
5871   bt type;
5872   gfc_try t;
5873
5874   if (code->expr1 == NULL)
5875     {
5876       /* This was actually a computed GOTO statement.  */
5877       case_expr = code->expr2;
5878       if (case_expr->ts.type != BT_INTEGER|| case_expr->rank != 0)
5879         gfc_error ("Selection expression in computed GOTO statement "
5880                    "at %L must be a scalar integer expression",
5881                    &case_expr->where);
5882
5883       /* Further checking is not necessary because this SELECT was built
5884          by the compiler, so it should always be OK.  Just move the
5885          case_expr from expr2 to expr so that we can handle computed
5886          GOTOs as normal SELECTs from here on.  */
5887       code->expr1 = code->expr2;
5888       code->expr2 = NULL;
5889       return;
5890     }
5891
5892   case_expr = code->expr1;
5893
5894   type = case_expr->ts.type;
5895   if (type != BT_LOGICAL && type != BT_INTEGER && type != BT_CHARACTER)
5896     {
5897       gfc_error ("Argument of SELECT statement at %L cannot be %s",
5898                  &case_expr->where, gfc_typename (&case_expr->ts));
5899
5900       /* Punt. Going on here just produce more garbage error messages.  */
5901       return;
5902     }
5903
5904   if (case_expr->rank != 0)
5905     {
5906       gfc_error ("Argument of SELECT statement at %L must be a scalar "
5907                  "expression", &case_expr->where);
5908
5909       /* Punt.  */
5910       return;
5911     }
5912
5913   /* PR 19168 has a long discussion concerning a mismatch of the kinds
5914      of the SELECT CASE expression and its CASE values.  Walk the lists
5915      of case values, and if we find a mismatch, promote case_expr to
5916      the appropriate kind.  */
5917
5918   if (type == BT_LOGICAL || type == BT_INTEGER)
5919     {
5920       for (body = code->block; body; body = body->block)
5921         {
5922           /* Walk the case label list.  */
5923           for (cp = body->ext.case_list; cp; cp = cp->next)
5924             {
5925               /* Intercept the DEFAULT case.  It does not have a kind.  */
5926               if (cp->low == NULL && cp->high == NULL)
5927                 continue;
5928
5929               /* Unreachable case ranges are discarded, so ignore.  */
5930               if (cp->low != NULL && cp->high != NULL
5931                   && cp->low != cp->high
5932                   && gfc_compare_expr (cp->low, cp->high, INTRINSIC_GT) > 0)
5933                 continue;
5934
5935               /* FIXME: Should a warning be issued?  */
5936               if (cp->low != NULL
5937                   && case_expr->ts.kind != gfc_kind_max(case_expr, cp->low))
5938                 gfc_convert_type_warn (case_expr, &cp->low->ts, 2, 0);
5939
5940               if (cp->high != NULL
5941                   && case_expr->ts.kind != gfc_kind_max(case_expr, cp->high))
5942                 gfc_convert_type_warn (case_expr, &cp->high->ts, 2, 0);
5943             }
5944          }
5945     }
5946
5947   /* Assume there is no DEFAULT case.  */
5948   default_case = NULL;
5949   head = tail = NULL;
5950   ncases = 0;
5951   seen_logical = 0;
5952
5953   for (body = code->block; body; body = body->block)
5954     {
5955       /* Assume the CASE list is OK, and all CASE labels can be matched.  */
5956       t = SUCCESS;
5957       seen_unreachable = 0;
5958
5959       /* Walk the case label list, making sure that all case labels
5960          are legal.  */
5961       for (cp = body->ext.case_list; cp; cp = cp->next)
5962         {
5963           /* Count the number of cases in the whole construct.  */
5964           ncases++;
5965
5966           /* Intercept the DEFAULT case.  */
5967           if (cp->low == NULL && cp->high == NULL)
5968             {
5969               if (default_case != NULL)
5970                 {
5971                   gfc_error ("The DEFAULT CASE at %L cannot be followed "
5972                              "by a second DEFAULT CASE at %L",
5973                              &default_case->where, &cp->where);
5974                   t = FAILURE;
5975                   break;
5976                 }
5977               else
5978                 {
5979                   default_case = cp;
5980                   continue;
5981                 }
5982             }
5983
5984           /* Deal with single value cases and case ranges.  Errors are
5985              issued from the validation function.  */
5986           if(validate_case_label_expr (cp->low, case_expr) != SUCCESS
5987              || validate_case_label_expr (cp->high, case_expr) != SUCCESS)
5988             {
5989               t = FAILURE;
5990               break;
5991             }
5992
5993           if (type == BT_LOGICAL
5994               && ((cp->low == NULL || cp->high == NULL)
5995                   || cp->low != cp->high))
5996             {
5997               gfc_error ("Logical range in CASE statement at %L is not "
5998                          "allowed", &cp->low->where);
5999               t = FAILURE;
6000               break;
6001             }
6002
6003           if (type == BT_LOGICAL && cp->low->expr_type == EXPR_CONSTANT)
6004             {
6005               int value;
6006               value = cp->low->value.logical == 0 ? 2 : 1;
6007               if (value & seen_logical)
6008                 {
6009                   gfc_error ("constant logical value in CASE statement "
6010                              "is repeated at %L",
6011                              &cp->low->where);
6012                   t = FAILURE;
6013                   break;
6014                 }
6015               seen_logical |= value;
6016             }
6017
6018           if (cp->low != NULL && cp->high != NULL
6019               && cp->low != cp->high
6020               && gfc_compare_expr (cp->low, cp->high, INTRINSIC_GT) > 0)
6021             {
6022               if (gfc_option.warn_surprising)
6023                 gfc_warning ("Range specification at %L can never "
6024                              "be matched", &cp->where);
6025
6026               cp->unreachable = 1;
6027               seen_unreachable = 1;
6028             }
6029           else
6030             {
6031               /* If the case range can be matched, it can also overlap with
6032                  other cases.  To make sure it does not, we put it in a
6033                  double linked list here.  We sort that with a merge sort
6034                  later on to detect any overlapping cases.  */
6035               if (!head)
6036                 {
6037                   head = tail = cp;
6038                   head->right = head->left = NULL;
6039                 }
6040               else
6041                 {
6042                   tail->right = cp;
6043                   tail->right->left = tail;
6044                   tail = tail->right;
6045                   tail->right = NULL;
6046                 }
6047             }
6048         }
6049
6050       /* It there was a failure in the previous case label, give up
6051          for this case label list.  Continue with the next block.  */
6052       if (t == FAILURE)
6053         continue;
6054
6055       /* See if any case labels that are unreachable have been seen.
6056          If so, we eliminate them.  This is a bit of a kludge because
6057          the case lists for a single case statement (label) is a
6058          single forward linked lists.  */
6059       if (seen_unreachable)
6060       {
6061         /* Advance until the first case in the list is reachable.  */
6062         while (body->ext.case_list != NULL
6063                && body->ext.case_list->unreachable)
6064           {
6065             gfc_case *n = body->ext.case_list;
6066             body->ext.case_list = body->ext.case_list->next;
6067             n->next = NULL;
6068             gfc_free_case_list (n);
6069           }
6070
6071         /* Strip all other unreachable cases.  */
6072         if (body->ext.case_list)
6073           {
6074             for (cp = body->ext.case_list; cp->next; cp = cp->next)
6075               {
6076                 if (cp->next->unreachable)
6077                   {
6078                     gfc_case *n = cp->next;
6079                     cp->next = cp->next->next;
6080                     n->next = NULL;
6081                     gfc_free_case_list (n);
6082                   }
6083               }
6084           }
6085       }
6086     }
6087
6088   /* See if there were overlapping cases.  If the check returns NULL,
6089      there was overlap.  In that case we don't do anything.  If head
6090      is non-NULL, we prepend the DEFAULT case.  The sorted list can
6091      then used during code generation for SELECT CASE constructs with
6092      a case expression of a CHARACTER type.  */
6093   if (head)
6094     {
6095       head = check_case_overlap (head);
6096
6097       /* Prepend the default_case if it is there.  */
6098       if (head != NULL && default_case)
6099         {
6100           default_case->left = NULL;
6101           default_case->right = head;
6102           head->left = default_case;
6103         }
6104     }
6105
6106   /* Eliminate dead blocks that may be the result if we've seen
6107      unreachable case labels for a block.  */
6108   for (body = code; body && body->block; body = body->block)
6109     {
6110       if (body->block->ext.case_list == NULL)
6111         {
6112           /* Cut the unreachable block from the code chain.  */
6113           gfc_code *c = body->block;
6114           body->block = c->block;
6115
6116           /* Kill the dead block, but not the blocks below it.  */
6117           c->block = NULL;
6118           gfc_free_statements (c);
6119         }
6120     }
6121
6122   /* More than two cases is legal but insane for logical selects.
6123      Issue a warning for it.  */
6124   if (gfc_option.warn_surprising && type == BT_LOGICAL
6125       && ncases > 2)
6126     gfc_warning ("Logical SELECT CASE block at %L has more that two cases",
6127                  &code->loc);
6128 }
6129
6130
6131 /* Resolve a transfer statement. This is making sure that:
6132    -- a derived type being transferred has only non-pointer components
6133    -- a derived type being transferred doesn't have private components, unless 
6134       it's being transferred from the module where the type was defined
6135    -- we're not trying to transfer a whole assumed size array.  */
6136
6137 static void
6138 resolve_transfer (gfc_code *code)
6139 {
6140   gfc_typespec *ts;
6141   gfc_symbol *sym;
6142   gfc_ref *ref;
6143   gfc_expr *exp;
6144
6145   exp = code->expr1;
6146
6147   if (exp->expr_type != EXPR_VARIABLE && exp->expr_type != EXPR_FUNCTION)
6148     return;
6149
6150   sym = exp->symtree->n.sym;
6151   ts = &sym->ts;
6152
6153   /* Go to actual component transferred.  */
6154   for (ref = code->expr1->ref; ref; ref = ref->next)
6155     if (ref->type == REF_COMPONENT)
6156       ts = &ref->u.c.component->ts;
6157
6158   if (ts->type == BT_DERIVED)
6159     {
6160       /* Check that transferred derived type doesn't contain POINTER
6161          components.  */
6162       if (ts->derived->attr.pointer_comp)
6163         {
6164           gfc_error ("Data transfer element at %L cannot have "
6165                      "POINTER components", &code->loc);
6166           return;
6167         }
6168
6169       if (ts->derived->attr.alloc_comp)
6170         {
6171           gfc_error ("Data transfer element at %L cannot have "
6172                      "ALLOCATABLE components", &code->loc);
6173           return;
6174         }
6175
6176       if (derived_inaccessible (ts->derived))
6177         {
6178           gfc_error ("Data transfer element at %L cannot have "
6179                      "PRIVATE components",&code->loc);
6180           return;
6181         }
6182     }
6183
6184   if (sym->as != NULL && sym->as->type == AS_ASSUMED_SIZE
6185       && exp->ref->type == REF_ARRAY && exp->ref->u.ar.type == AR_FULL)
6186     {
6187       gfc_error ("Data transfer element at %L cannot be a full reference to "
6188                  "an assumed-size array", &code->loc);
6189       return;
6190     }
6191 }
6192
6193
6194 /*********** Toplevel code resolution subroutines ***********/
6195
6196 /* Find the set of labels that are reachable from this block.  We also
6197    record the last statement in each block.  */
6198      
6199 static void
6200 find_reachable_labels (gfc_code *block)
6201 {
6202   gfc_code *c;
6203
6204   if (!block)
6205     return;
6206
6207   cs_base->reachable_labels = bitmap_obstack_alloc (&labels_obstack);
6208
6209   /* Collect labels in this block.  We don't keep those corresponding
6210      to END {IF|SELECT}, these are checked in resolve_branch by going
6211      up through the code_stack.  */
6212   for (c = block; c; c = c->next)
6213     {
6214       if (c->here && c->op != EXEC_END_BLOCK)
6215         bitmap_set_bit (cs_base->reachable_labels, c->here->value);
6216     }
6217
6218   /* Merge with labels from parent block.  */
6219   if (cs_base->prev)
6220     {
6221       gcc_assert (cs_base->prev->reachable_labels);
6222       bitmap_ior_into (cs_base->reachable_labels,
6223                        cs_base->prev->reachable_labels);
6224     }
6225 }
6226
6227 /* Given a branch to a label, see if the branch is conforming.
6228    The code node describes where the branch is located.  */
6229
6230 static void
6231 resolve_branch (gfc_st_label *label, gfc_code *code)
6232 {
6233   code_stack *stack;
6234
6235   if (label == NULL)
6236     return;
6237
6238   /* Step one: is this a valid branching target?  */
6239
6240   if (label->defined == ST_LABEL_UNKNOWN)
6241     {
6242       gfc_error ("Label %d referenced at %L is never defined", label->value,
6243                  &label->where);
6244       return;
6245     }
6246
6247   if (label->defined != ST_LABEL_TARGET)
6248     {
6249       gfc_error ("Statement at %L is not a valid branch target statement "
6250                  "for the branch statement at %L", &label->where, &code->loc);
6251       return;
6252     }
6253
6254   /* Step two: make sure this branch is not a branch to itself ;-)  */
6255
6256   if (code->here == label)
6257     {
6258       gfc_warning ("Branch at %L may result in an infinite loop", &code->loc);
6259       return;
6260     }
6261
6262   /* Step three:  See if the label is in the same block as the
6263      branching statement.  The hard work has been done by setting up
6264      the bitmap reachable_labels.  */
6265
6266   if (bitmap_bit_p (cs_base->reachable_labels, label->value))
6267     return;
6268
6269   /* Step four:  If we haven't found the label in the bitmap, it may
6270     still be the label of the END of the enclosing block, in which
6271     case we find it by going up the code_stack.  */
6272
6273   for (stack = cs_base; stack; stack = stack->prev)
6274     if (stack->current->next && stack->current->next->here == label)
6275       break;
6276
6277   if (stack)
6278     {
6279       gcc_assert (stack->current->next->op == EXEC_END_BLOCK);
6280       return;
6281     }
6282
6283   /* The label is not in an enclosing block, so illegal.  This was
6284      allowed in Fortran 66, so we allow it as extension.  No
6285      further checks are necessary in this case.  */
6286   gfc_notify_std (GFC_STD_LEGACY, "Label at %L is not in the same block "
6287                   "as the GOTO statement at %L", &label->where,
6288                   &code->loc);
6289   return;
6290 }
6291
6292
6293 /* Check whether EXPR1 has the same shape as EXPR2.  */
6294
6295 static gfc_try
6296 resolve_where_shape (gfc_expr *expr1, gfc_expr *expr2)
6297 {
6298   mpz_t shape[GFC_MAX_DIMENSIONS];
6299   mpz_t shape2[GFC_MAX_DIMENSIONS];
6300   gfc_try result = FAILURE;
6301   int i;
6302
6303   /* Compare the rank.  */
6304   if (expr1->rank != expr2->rank)
6305     return result;
6306
6307   /* Compare the size of each dimension.  */
6308   for (i=0; i<expr1->rank; i++)
6309     {
6310       if (gfc_array_dimen_size (expr1, i, &shape[i]) == FAILURE)
6311         goto ignore;
6312
6313       if (gfc_array_dimen_size (expr2, i, &shape2[i]) == FAILURE)
6314         goto ignore;
6315
6316       if (mpz_cmp (shape[i], shape2[i]))
6317         goto over;
6318     }
6319
6320   /* When either of the two expression is an assumed size array, we
6321      ignore the comparison of dimension sizes.  */
6322 ignore:
6323   result = SUCCESS;
6324
6325 over:
6326   for (i--; i >= 0; i--)
6327     {
6328       mpz_clear (shape[i]);
6329       mpz_clear (shape2[i]);
6330     }
6331   return result;
6332 }
6333
6334
6335 /* Check whether a WHERE assignment target or a WHERE mask expression
6336    has the same shape as the outmost WHERE mask expression.  */
6337
6338 static void
6339 resolve_where (gfc_code *code, gfc_expr *mask)
6340 {
6341   gfc_code *cblock;
6342   gfc_code *cnext;
6343   gfc_expr *e = NULL;
6344
6345   cblock = code->block;
6346
6347   /* Store the first WHERE mask-expr of the WHERE statement or construct.
6348      In case of nested WHERE, only the outmost one is stored.  */
6349   if (mask == NULL) /* outmost WHERE */
6350     e = cblock->expr1;
6351   else /* inner WHERE */
6352     e = mask;
6353
6354   while (cblock)
6355     {
6356       if (cblock->expr1)
6357         {
6358           /* Check if the mask-expr has a consistent shape with the
6359              outmost WHERE mask-expr.  */
6360           if (resolve_where_shape (cblock->expr1, e) == FAILURE)
6361             gfc_error ("WHERE mask at %L has inconsistent shape",
6362                        &cblock->expr1->where);
6363          }
6364
6365       /* the assignment statement of a WHERE statement, or the first
6366          statement in where-body-construct of a WHERE construct */
6367       cnext = cblock->next;
6368       while (cnext)
6369         {
6370           switch (cnext->op)
6371             {
6372             /* WHERE assignment statement */
6373             case EXEC_ASSIGN:
6374
6375               /* Check shape consistent for WHERE assignment target.  */
6376               if (e && resolve_where_shape (cnext->expr1, e) == FAILURE)
6377                gfc_error ("WHERE assignment target at %L has "
6378                           "inconsistent shape", &cnext->expr1->where);
6379               break;
6380
6381   
6382             case EXEC_ASSIGN_CALL:
6383               resolve_call (cnext);
6384               if (!cnext->resolved_sym->attr.elemental)
6385                 gfc_error("Non-ELEMENTAL user-defined assignment in WHERE at %L",
6386                           &cnext->ext.actual->expr->where);
6387               break;
6388
6389             /* WHERE or WHERE construct is part of a where-body-construct */
6390             case EXEC_WHERE:
6391               resolve_where (cnext, e);
6392               break;
6393
6394             default:
6395               gfc_error ("Unsupported statement inside WHERE at %L",
6396                          &cnext->loc);
6397             }
6398          /* the next statement within the same where-body-construct */
6399          cnext = cnext->next;
6400        }
6401     /* the next masked-elsewhere-stmt, elsewhere-stmt, or end-where-stmt */
6402     cblock = cblock->block;
6403   }
6404 }
6405
6406
6407 /* Resolve assignment in FORALL construct.
6408    NVAR is the number of FORALL index variables, and VAR_EXPR records the
6409    FORALL index variables.  */
6410
6411 static void
6412 gfc_resolve_assign_in_forall (gfc_code *code, int nvar, gfc_expr **var_expr)
6413 {
6414   int n;
6415
6416   for (n = 0; n < nvar; n++)
6417     {
6418       gfc_symbol *forall_index;
6419
6420       forall_index = var_expr[n]->symtree->n.sym;
6421
6422       /* Check whether the assignment target is one of the FORALL index
6423          variable.  */
6424       if ((code->expr1->expr_type == EXPR_VARIABLE)
6425           && (code->expr1->symtree->n.sym == forall_index))
6426         gfc_error ("Assignment to a FORALL index variable at %L",
6427                    &code->expr1->where);
6428       else
6429         {
6430           /* If one of the FORALL index variables doesn't appear in the
6431              assignment variable, then there could be a many-to-one
6432              assignment.  Emit a warning rather than an error because the
6433              mask could be resolving this problem.  */
6434           if (find_forall_index (code->expr1, forall_index, 0) == FAILURE)
6435             gfc_warning ("The FORALL with index '%s' is not used on the "
6436                          "left side of the assignment at %L and so might "
6437                          "cause multiple assignment to this object",
6438                          var_expr[n]->symtree->name, &code->expr1->where);
6439         }
6440     }
6441 }
6442
6443
6444 /* Resolve WHERE statement in FORALL construct.  */
6445
6446 static void
6447 gfc_resolve_where_code_in_forall (gfc_code *code, int nvar,
6448                                   gfc_expr **var_expr)
6449 {
6450   gfc_code *cblock;
6451   gfc_code *cnext;
6452
6453   cblock = code->block;
6454   while (cblock)
6455     {
6456       /* the assignment statement of a WHERE statement, or the first
6457          statement in where-body-construct of a WHERE construct */
6458       cnext = cblock->next;
6459       while (cnext)
6460         {
6461           switch (cnext->op)
6462             {
6463             /* WHERE assignment statement */
6464             case EXEC_ASSIGN:
6465               gfc_resolve_assign_in_forall (cnext, nvar, var_expr);
6466               break;
6467   
6468             /* WHERE operator assignment statement */
6469             case EXEC_ASSIGN_CALL:
6470               resolve_call (cnext);
6471               if (!cnext->resolved_sym->attr.elemental)
6472                 gfc_error("Non-ELEMENTAL user-defined assignment in WHERE at %L",
6473                           &cnext->ext.actual->expr->where);
6474               break;
6475
6476             /* WHERE or WHERE construct is part of a where-body-construct */
6477             case EXEC_WHERE:
6478               gfc_resolve_where_code_in_forall (cnext, nvar, var_expr);
6479               break;
6480
6481             default:
6482               gfc_error ("Unsupported statement inside WHERE at %L",
6483                          &cnext->loc);
6484             }
6485           /* the next statement within the same where-body-construct */
6486           cnext = cnext->next;
6487         }
6488       /* the next masked-elsewhere-stmt, elsewhere-stmt, or end-where-stmt */
6489       cblock = cblock->block;
6490     }
6491 }
6492
6493
6494 /* Traverse the FORALL body to check whether the following errors exist:
6495    1. For assignment, check if a many-to-one assignment happens.
6496    2. For WHERE statement, check the WHERE body to see if there is any
6497       many-to-one assignment.  */
6498
6499 static void
6500 gfc_resolve_forall_body (gfc_code *code, int nvar, gfc_expr **var_expr)
6501 {
6502   gfc_code *c;
6503
6504   c = code->block->next;
6505   while (c)
6506     {
6507       switch (c->op)
6508         {
6509         case EXEC_ASSIGN:
6510         case EXEC_POINTER_ASSIGN:
6511           gfc_resolve_assign_in_forall (c, nvar, var_expr);
6512           break;
6513
6514         case EXEC_ASSIGN_CALL:
6515           resolve_call (c);
6516           break;
6517
6518         /* Because the gfc_resolve_blocks() will handle the nested FORALL,
6519            there is no need to handle it here.  */
6520         case EXEC_FORALL:
6521           break;
6522         case EXEC_WHERE:
6523           gfc_resolve_where_code_in_forall(c, nvar, var_expr);
6524           break;
6525         default:
6526           break;
6527         }
6528       /* The next statement in the FORALL body.  */
6529       c = c->next;
6530     }
6531 }
6532
6533
6534 /* Counts the number of iterators needed inside a forall construct, including
6535    nested forall constructs. This is used to allocate the needed memory 
6536    in gfc_resolve_forall.  */
6537
6538 static int 
6539 gfc_count_forall_iterators (gfc_code *code)
6540 {
6541   int max_iters, sub_iters, current_iters;
6542   gfc_forall_iterator *fa;
6543
6544   gcc_assert(code->op == EXEC_FORALL);
6545   max_iters = 0;
6546   current_iters = 0;
6547
6548   for (fa = code->ext.forall_iterator; fa; fa = fa->next)
6549     current_iters ++;
6550   
6551   code = code->block->next;
6552
6553   while (code)
6554     {          
6555       if (code->op == EXEC_FORALL)
6556         {
6557           sub_iters = gfc_count_forall_iterators (code);
6558           if (sub_iters > max_iters)
6559             max_iters = sub_iters;
6560         }
6561       code = code->next;
6562     }
6563
6564   return current_iters + max_iters;
6565 }
6566
6567
6568 /* Given a FORALL construct, first resolve the FORALL iterator, then call
6569    gfc_resolve_forall_body to resolve the FORALL body.  */
6570
6571 static void
6572 gfc_resolve_forall (gfc_code *code, gfc_namespace *ns, int forall_save)
6573 {
6574   static gfc_expr **var_expr;
6575   static int total_var = 0;
6576   static int nvar = 0;
6577   int old_nvar, tmp;
6578   gfc_forall_iterator *fa;
6579   int i;
6580
6581   old_nvar = nvar;
6582
6583   /* Start to resolve a FORALL construct   */
6584   if (forall_save == 0)
6585     {
6586       /* Count the total number of FORALL index in the nested FORALL
6587          construct in order to allocate the VAR_EXPR with proper size.  */
6588       total_var = gfc_count_forall_iterators (code);
6589
6590       /* Allocate VAR_EXPR with NUMBER_OF_FORALL_INDEX elements.  */
6591       var_expr = (gfc_expr **) gfc_getmem (total_var * sizeof (gfc_expr *));
6592     }
6593
6594   /* The information about FORALL iterator, including FORALL index start, end
6595      and stride. The FORALL index can not appear in start, end or stride.  */
6596   for (fa = code->ext.forall_iterator; fa; fa = fa->next)
6597     {
6598       /* Check if any outer FORALL index name is the same as the current
6599          one.  */
6600       for (i = 0; i < nvar; i++)
6601         {
6602           if (fa->var->symtree->n.sym == var_expr[i]->symtree->n.sym)
6603             {
6604               gfc_error ("An outer FORALL construct already has an index "
6605                          "with this name %L", &fa->var->where);
6606             }
6607         }
6608
6609       /* Record the current FORALL index.  */
6610       var_expr[nvar] = gfc_copy_expr (fa->var);
6611
6612       nvar++;
6613
6614       /* No memory leak.  */
6615       gcc_assert (nvar <= total_var);
6616     }
6617
6618   /* Resolve the FORALL body.  */
6619   gfc_resolve_forall_body (code, nvar, var_expr);
6620
6621   /* May call gfc_resolve_forall to resolve the inner FORALL loop.  */
6622   gfc_resolve_blocks (code->block, ns);
6623
6624   tmp = nvar;
6625   nvar = old_nvar;
6626   /* Free only the VAR_EXPRs allocated in this frame.  */
6627   for (i = nvar; i < tmp; i++)
6628      gfc_free_expr (var_expr[i]);
6629
6630   if (nvar == 0)
6631     {
6632       /* We are in the outermost FORALL construct.  */
6633       gcc_assert (forall_save == 0);
6634
6635       /* VAR_EXPR is not needed any more.  */
6636       gfc_free (var_expr);
6637       total_var = 0;
6638     }
6639 }
6640
6641
6642 /* Resolve lists of blocks found in IF, SELECT CASE, WHERE, FORALL ,GOTO and
6643    DO code nodes.  */
6644
6645 static void resolve_code (gfc_code *, gfc_namespace *);
6646
6647 void
6648 gfc_resolve_blocks (gfc_code *b, gfc_namespace *ns)
6649 {
6650   gfc_try t;
6651
6652   for (; b; b = b->block)
6653     {
6654       t = gfc_resolve_expr (b->expr1);
6655       if (gfc_resolve_expr (b->expr2) == FAILURE)
6656         t = FAILURE;
6657
6658       switch (b->op)
6659         {
6660         case EXEC_IF:
6661           if (t == SUCCESS && b->expr1 != NULL
6662               && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank != 0))
6663             gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
6664                        &b->expr1->where);
6665           break;
6666
6667         case EXEC_WHERE:
6668           if (t == SUCCESS
6669               && b->expr1 != NULL
6670               && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank == 0))
6671             gfc_error ("WHERE/ELSEWHERE clause at %L requires a LOGICAL array",
6672                        &b->expr1->where);
6673           break;
6674
6675         case EXEC_GOTO:
6676           resolve_branch (b->label1, b);
6677           break;
6678
6679         case EXEC_SELECT:
6680         case EXEC_FORALL:
6681         case EXEC_DO:
6682         case EXEC_DO_WHILE:
6683         case EXEC_READ:
6684         case EXEC_WRITE:
6685         case EXEC_IOLENGTH:
6686         case EXEC_WAIT:
6687           break;
6688
6689         case EXEC_OMP_ATOMIC:
6690         case EXEC_OMP_CRITICAL:
6691         case EXEC_OMP_DO:
6692         case EXEC_OMP_MASTER:
6693         case EXEC_OMP_ORDERED:
6694         case EXEC_OMP_PARALLEL:
6695         case EXEC_OMP_PARALLEL_DO:
6696         case EXEC_OMP_PARALLEL_SECTIONS:
6697         case EXEC_OMP_PARALLEL_WORKSHARE:
6698         case EXEC_OMP_SECTIONS:
6699         case EXEC_OMP_SINGLE:
6700         case EXEC_OMP_TASK:
6701         case EXEC_OMP_TASKWAIT:
6702         case EXEC_OMP_WORKSHARE:
6703           break;
6704
6705         default:
6706           gfc_internal_error ("resolve_block(): Bad block type");
6707         }
6708
6709       resolve_code (b->next, ns);
6710     }
6711 }
6712
6713
6714 /* Does everything to resolve an ordinary assignment.  Returns true
6715    if this is an interface assignment.  */
6716 static bool
6717 resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns)
6718 {
6719   bool rval = false;
6720   gfc_expr *lhs;
6721   gfc_expr *rhs;
6722   int llen = 0;
6723   int rlen = 0;
6724   int n;
6725   gfc_ref *ref;
6726
6727   if (gfc_extend_assign (code, ns) == SUCCESS)
6728     {
6729       lhs = code->ext.actual->expr;
6730       rhs = code->ext.actual->next->expr;
6731       if (gfc_pure (NULL) && !gfc_pure (code->symtree->n.sym))
6732         {
6733           gfc_error ("Subroutine '%s' called instead of assignment at "
6734                      "%L must be PURE", code->symtree->n.sym->name,
6735                      &code->loc);
6736           return rval;
6737         }
6738
6739       /* Make a temporary rhs when there is a default initializer
6740          and rhs is the same symbol as the lhs.  */
6741       if (rhs->expr_type == EXPR_VARIABLE
6742             && rhs->symtree->n.sym->ts.type == BT_DERIVED
6743             && has_default_initializer (rhs->symtree->n.sym->ts.derived)
6744             && (lhs->symtree->n.sym == rhs->symtree->n.sym))
6745         code->ext.actual->next->expr = gfc_get_parentheses (rhs);
6746
6747       return true;
6748     }
6749
6750   lhs = code->expr1;
6751   rhs = code->expr2;
6752
6753   if (rhs->is_boz
6754       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L outside "
6755                          "a DATA statement and outside INT/REAL/DBLE/CMPLX",
6756                          &code->loc) == FAILURE)
6757     return false;
6758
6759   /* Handle the case of a BOZ literal on the RHS.  */
6760   if (rhs->is_boz && lhs->ts.type != BT_INTEGER)
6761     {
6762       int rc;
6763       if (gfc_option.warn_surprising)
6764         gfc_warning ("BOZ literal at %L is bitwise transferred "
6765                      "non-integer symbol '%s'", &code->loc,
6766                      lhs->symtree->n.sym->name);
6767
6768       if (!gfc_convert_boz (rhs, &lhs->ts))
6769         return false;
6770       if ((rc = gfc_range_check (rhs)) != ARITH_OK)
6771         {
6772           if (rc == ARITH_UNDERFLOW)
6773             gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
6774                        ". This check can be disabled with the option "
6775                        "-fno-range-check", &rhs->where);
6776           else if (rc == ARITH_OVERFLOW)
6777             gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
6778                        ". This check can be disabled with the option "
6779                        "-fno-range-check", &rhs->where);
6780           else if (rc == ARITH_NAN)
6781             gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
6782                        ". This check can be disabled with the option "
6783                        "-fno-range-check", &rhs->where);
6784           return false;
6785         }
6786     }
6787
6788
6789   if (lhs->ts.type == BT_CHARACTER
6790         && gfc_option.warn_character_truncation)
6791     {
6792       if (lhs->ts.cl != NULL
6793             && lhs->ts.cl->length != NULL
6794             && lhs->ts.cl->length->expr_type == EXPR_CONSTANT)
6795         llen = mpz_get_si (lhs->ts.cl->length->value.integer);
6796
6797       if (rhs->expr_type == EXPR_CONSTANT)
6798         rlen = rhs->value.character.length;
6799
6800       else if (rhs->ts.cl != NULL
6801                  && rhs->ts.cl->length != NULL
6802                  && rhs->ts.cl->length->expr_type == EXPR_CONSTANT)
6803         rlen = mpz_get_si (rhs->ts.cl->length->value.integer);
6804
6805       if (rlen && llen && rlen > llen)
6806         gfc_warning_now ("CHARACTER expression will be truncated "
6807                          "in assignment (%d/%d) at %L",
6808                          llen, rlen, &code->loc);
6809     }
6810
6811   /* Ensure that a vector index expression for the lvalue is evaluated
6812      to a temporary if the lvalue symbol is referenced in it.  */
6813   if (lhs->rank)
6814     {
6815       for (ref = lhs->ref; ref; ref= ref->next)
6816         if (ref->type == REF_ARRAY)
6817           {
6818             for (n = 0; n < ref->u.ar.dimen; n++)
6819               if (ref->u.ar.dimen_type[n] == DIMEN_VECTOR
6820                   && gfc_find_sym_in_expr (lhs->symtree->n.sym,
6821                                            ref->u.ar.start[n]))
6822                 ref->u.ar.start[n]
6823                         = gfc_get_parentheses (ref->u.ar.start[n]);
6824           }
6825     }
6826
6827   if (gfc_pure (NULL))
6828     {
6829       if (gfc_impure_variable (lhs->symtree->n.sym))
6830         {
6831           gfc_error ("Cannot assign to variable '%s' in PURE "
6832                      "procedure at %L",
6833                       lhs->symtree->n.sym->name,
6834                       &lhs->where);
6835           return rval;
6836         }
6837
6838       if (lhs->ts.type == BT_DERIVED
6839             && lhs->expr_type == EXPR_VARIABLE
6840             && lhs->ts.derived->attr.pointer_comp
6841             && gfc_impure_variable (rhs->symtree->n.sym))
6842         {
6843           gfc_error ("The impure variable at %L is assigned to "
6844                      "a derived type variable with a POINTER "
6845                      "component in a PURE procedure (12.6)",
6846                      &rhs->where);
6847           return rval;
6848         }
6849     }
6850
6851   gfc_check_assign (lhs, rhs, 1);
6852   return false;
6853 }
6854
6855 /* Given a block of code, recursively resolve everything pointed to by this
6856    code block.  */
6857
6858 static void
6859 resolve_code (gfc_code *code, gfc_namespace *ns)
6860 {
6861   int omp_workshare_save;
6862   int forall_save;
6863   code_stack frame;
6864   gfc_try t;
6865
6866   frame.prev = cs_base;
6867   frame.head = code;
6868   cs_base = &frame;
6869
6870   find_reachable_labels (code);
6871
6872   for (; code; code = code->next)
6873     {
6874       frame.current = code;
6875       forall_save = forall_flag;
6876
6877       if (code->op == EXEC_FORALL)
6878         {
6879           forall_flag = 1;
6880           gfc_resolve_forall (code, ns, forall_save);
6881           forall_flag = 2;
6882         }
6883       else if (code->block)
6884         {
6885           omp_workshare_save = -1;
6886           switch (code->op)
6887             {
6888             case EXEC_OMP_PARALLEL_WORKSHARE:
6889               omp_workshare_save = omp_workshare_flag;
6890               omp_workshare_flag = 1;
6891               gfc_resolve_omp_parallel_blocks (code, ns);
6892               break;
6893             case EXEC_OMP_PARALLEL:
6894             case EXEC_OMP_PARALLEL_DO:
6895             case EXEC_OMP_PARALLEL_SECTIONS:
6896             case EXEC_OMP_TASK:
6897               omp_workshare_save = omp_workshare_flag;
6898               omp_workshare_flag = 0;
6899               gfc_resolve_omp_parallel_blocks (code, ns);
6900               break;
6901             case EXEC_OMP_DO:
6902               gfc_resolve_omp_do_blocks (code, ns);
6903               break;
6904             case EXEC_OMP_WORKSHARE:
6905               omp_workshare_save = omp_workshare_flag;
6906               omp_workshare_flag = 1;
6907               /* FALLTHROUGH */
6908             default:
6909               gfc_resolve_blocks (code->block, ns);
6910               break;
6911             }
6912
6913           if (omp_workshare_save != -1)
6914             omp_workshare_flag = omp_workshare_save;
6915         }
6916
6917       t = SUCCESS;
6918       if (code->op != EXEC_COMPCALL && code->op != EXEC_CALL_PPC)
6919         t = gfc_resolve_expr (code->expr1);
6920       forall_flag = forall_save;
6921
6922       if (gfc_resolve_expr (code->expr2) == FAILURE)
6923         t = FAILURE;
6924
6925       switch (code->op)
6926         {
6927         case EXEC_NOP:
6928         case EXEC_END_BLOCK:
6929         case EXEC_CYCLE:
6930         case EXEC_PAUSE:
6931         case EXEC_STOP:
6932         case EXEC_EXIT:
6933         case EXEC_CONTINUE:
6934         case EXEC_DT_END:
6935           break;
6936
6937         case EXEC_ENTRY:
6938           /* Keep track of which entry we are up to.  */
6939           current_entry_id = code->ext.entry->id;
6940           break;
6941
6942         case EXEC_WHERE:
6943           resolve_where (code, NULL);
6944           break;
6945
6946         case EXEC_GOTO:
6947           if (code->expr1 != NULL)
6948             {
6949               if (code->expr1->ts.type != BT_INTEGER)
6950                 gfc_error ("ASSIGNED GOTO statement at %L requires an "
6951                            "INTEGER variable", &code->expr1->where);
6952               else if (code->expr1->symtree->n.sym->attr.assign != 1)
6953                 gfc_error ("Variable '%s' has not been assigned a target "
6954                            "label at %L", code->expr1->symtree->n.sym->name,
6955                            &code->expr1->where);
6956             }
6957           else
6958             resolve_branch (code->label1, code);
6959           break;
6960
6961         case EXEC_RETURN:
6962           if (code->expr1 != NULL
6963                 && (code->expr1->ts.type != BT_INTEGER || code->expr1->rank))
6964             gfc_error ("Alternate RETURN statement at %L requires a SCALAR-"
6965                        "INTEGER return specifier", &code->expr1->where);
6966           break;
6967
6968         case EXEC_INIT_ASSIGN:
6969         case EXEC_END_PROCEDURE:
6970           break;
6971
6972         case EXEC_ASSIGN:
6973           if (t == FAILURE)
6974             break;
6975
6976           if (resolve_ordinary_assign (code, ns))
6977             goto call;
6978
6979           break;
6980
6981         case EXEC_LABEL_ASSIGN:
6982           if (code->label1->defined == ST_LABEL_UNKNOWN)
6983             gfc_error ("Label %d referenced at %L is never defined",
6984                        code->label1->value, &code->label1->where);
6985           if (t == SUCCESS
6986               && (code->expr1->expr_type != EXPR_VARIABLE
6987                   || code->expr1->symtree->n.sym->ts.type != BT_INTEGER
6988                   || code->expr1->symtree->n.sym->ts.kind
6989                      != gfc_default_integer_kind
6990                   || code->expr1->symtree->n.sym->as != NULL))
6991             gfc_error ("ASSIGN statement at %L requires a scalar "
6992                        "default INTEGER variable", &code->expr1->where);
6993           break;
6994
6995         case EXEC_POINTER_ASSIGN:
6996           if (t == FAILURE)
6997             break;
6998
6999           gfc_check_pointer_assign (code->expr1, code->expr2);
7000           break;
7001
7002         case EXEC_ARITHMETIC_IF:
7003           if (t == SUCCESS
7004               && code->expr1->ts.type != BT_INTEGER
7005               && code->expr1->ts.type != BT_REAL)
7006             gfc_error ("Arithmetic IF statement at %L requires a numeric "
7007                        "expression", &code->expr1->where);
7008
7009           resolve_branch (code->label1, code);
7010           resolve_branch (code->label2, code);
7011           resolve_branch (code->label3, code);
7012           break;
7013
7014         case EXEC_IF:
7015           if (t == SUCCESS && code->expr1 != NULL
7016               && (code->expr1->ts.type != BT_LOGICAL
7017                   || code->expr1->rank != 0))
7018             gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
7019                        &code->expr1->where);
7020           break;
7021
7022         case EXEC_CALL:
7023         call:
7024           resolve_call (code);
7025           break;
7026
7027         case EXEC_COMPCALL:
7028           resolve_typebound_call (code);
7029           break;
7030
7031         case EXEC_CALL_PPC:
7032           resolve_ppc_call (code);
7033           break;
7034
7035         case EXEC_SELECT:
7036           /* Select is complicated. Also, a SELECT construct could be
7037              a transformed computed GOTO.  */
7038           resolve_select (code);
7039           break;
7040
7041         case EXEC_DO:
7042           if (code->ext.iterator != NULL)
7043             {
7044               gfc_iterator *iter = code->ext.iterator;
7045               if (gfc_resolve_iterator (iter, true) != FAILURE)
7046                 gfc_resolve_do_iterator (code, iter->var->symtree->n.sym);
7047             }
7048           break;
7049
7050         case EXEC_DO_WHILE:
7051           if (code->expr1 == NULL)
7052             gfc_internal_error ("resolve_code(): No expression on DO WHILE");
7053           if (t == SUCCESS
7054               && (code->expr1->rank != 0
7055                   || code->expr1->ts.type != BT_LOGICAL))
7056             gfc_error ("Exit condition of DO WHILE loop at %L must be "
7057                        "a scalar LOGICAL expression", &code->expr1->where);
7058           break;
7059
7060         case EXEC_ALLOCATE:
7061           if (t == SUCCESS)
7062             resolve_allocate_deallocate (code, "ALLOCATE");
7063
7064           break;
7065
7066         case EXEC_DEALLOCATE:
7067           if (t == SUCCESS)
7068             resolve_allocate_deallocate (code, "DEALLOCATE");
7069
7070           break;
7071
7072         case EXEC_OPEN:
7073           if (gfc_resolve_open (code->ext.open) == FAILURE)
7074             break;
7075
7076           resolve_branch (code->ext.open->err, code);
7077           break;
7078
7079         case EXEC_CLOSE:
7080           if (gfc_resolve_close (code->ext.close) == FAILURE)
7081             break;
7082
7083           resolve_branch (code->ext.close->err, code);
7084           break;
7085
7086         case EXEC_BACKSPACE:
7087         case EXEC_ENDFILE:
7088         case EXEC_REWIND:
7089         case EXEC_FLUSH:
7090           if (gfc_resolve_filepos (code->ext.filepos) == FAILURE)
7091             break;
7092
7093           resolve_branch (code->ext.filepos->err, code);
7094           break;
7095
7096         case EXEC_INQUIRE:
7097           if (gfc_resolve_inquire (code->ext.inquire) == FAILURE)
7098               break;
7099
7100           resolve_branch (code->ext.inquire->err, code);
7101           break;
7102
7103         case EXEC_IOLENGTH:
7104           gcc_assert (code->ext.inquire != NULL);
7105           if (gfc_resolve_inquire (code->ext.inquire) == FAILURE)
7106             break;
7107
7108           resolve_branch (code->ext.inquire->err, code);
7109           break;
7110
7111         case EXEC_WAIT:
7112           if (gfc_resolve_wait (code->ext.wait) == FAILURE)
7113             break;
7114
7115           resolve_branch (code->ext.wait->err, code);
7116           resolve_branch (code->ext.wait->end, code);
7117           resolve_branch (code->ext.wait->eor, code);
7118           break;
7119
7120         case EXEC_READ:
7121         case EXEC_WRITE:
7122           if (gfc_resolve_dt (code->ext.dt) == FAILURE)
7123             break;
7124
7125           resolve_branch (code->ext.dt->err, code);
7126           resolve_branch (code->ext.dt->end, code);
7127           resolve_branch (code->ext.dt->eor, code);
7128           break;
7129
7130         case EXEC_TRANSFER:
7131           resolve_transfer (code);
7132           break;
7133
7134         case EXEC_FORALL:
7135           resolve_forall_iterators (code->ext.forall_iterator);
7136
7137           if (code->expr1 != NULL && code->expr1->ts.type != BT_LOGICAL)
7138             gfc_error ("FORALL mask clause at %L requires a LOGICAL "
7139                        "expression", &code->expr1->where);
7140           break;
7141
7142         case EXEC_OMP_ATOMIC:
7143         case EXEC_OMP_BARRIER:
7144         case EXEC_OMP_CRITICAL:
7145         case EXEC_OMP_FLUSH:
7146         case EXEC_OMP_DO:
7147         case EXEC_OMP_MASTER:
7148         case EXEC_OMP_ORDERED:
7149         case EXEC_OMP_SECTIONS:
7150         case EXEC_OMP_SINGLE:
7151         case EXEC_OMP_TASKWAIT:
7152         case EXEC_OMP_WORKSHARE:
7153           gfc_resolve_omp_directive (code, ns);
7154           break;
7155
7156         case EXEC_OMP_PARALLEL:
7157         case EXEC_OMP_PARALLEL_DO:
7158         case EXEC_OMP_PARALLEL_SECTIONS:
7159         case EXEC_OMP_PARALLEL_WORKSHARE:
7160         case EXEC_OMP_TASK:
7161           omp_workshare_save = omp_workshare_flag;
7162           omp_workshare_flag = 0;
7163           gfc_resolve_omp_directive (code, ns);
7164           omp_workshare_flag = omp_workshare_save;
7165           break;
7166
7167         default:
7168           gfc_internal_error ("resolve_code(): Bad statement code");
7169         }
7170     }
7171
7172   cs_base = frame.prev;
7173 }
7174
7175
7176 /* Resolve initial values and make sure they are compatible with
7177    the variable.  */
7178
7179 static void
7180 resolve_values (gfc_symbol *sym)
7181 {
7182   if (sym->value == NULL)
7183     return;
7184
7185   if (gfc_resolve_expr (sym->value) == FAILURE)
7186     return;
7187
7188   gfc_check_assign_symbol (sym, sym->value);
7189 }
7190
7191
7192 /* Verify the binding labels for common blocks that are BIND(C).  The label
7193    for a BIND(C) common block must be identical in all scoping units in which
7194    the common block is declared.  Further, the binding label can not collide
7195    with any other global entity in the program.  */
7196
7197 static void
7198 resolve_bind_c_comms (gfc_symtree *comm_block_tree)
7199 {
7200   if (comm_block_tree->n.common->is_bind_c == 1)
7201     {
7202       gfc_gsymbol *binding_label_gsym;
7203       gfc_gsymbol *comm_name_gsym;
7204
7205       /* See if a global symbol exists by the common block's name.  It may
7206          be NULL if the common block is use-associated.  */
7207       comm_name_gsym = gfc_find_gsymbol (gfc_gsym_root,
7208                                          comm_block_tree->n.common->name);
7209       if (comm_name_gsym != NULL && comm_name_gsym->type != GSYM_COMMON)
7210         gfc_error ("Binding label '%s' for common block '%s' at %L collides "
7211                    "with the global entity '%s' at %L",
7212                    comm_block_tree->n.common->binding_label,
7213                    comm_block_tree->n.common->name,
7214                    &(comm_block_tree->n.common->where),
7215                    comm_name_gsym->name, &(comm_name_gsym->where));
7216       else if (comm_name_gsym != NULL
7217                && strcmp (comm_name_gsym->name,
7218                           comm_block_tree->n.common->name) == 0)
7219         {
7220           /* TODO: Need to make sure the fields of gfc_gsymbol are initialized
7221              as expected.  */
7222           if (comm_name_gsym->binding_label == NULL)
7223             /* No binding label for common block stored yet; save this one.  */
7224             comm_name_gsym->binding_label =
7225               comm_block_tree->n.common->binding_label;
7226           else
7227             if (strcmp (comm_name_gsym->binding_label,
7228                         comm_block_tree->n.common->binding_label) != 0)
7229               {
7230                 /* Common block names match but binding labels do not.  */
7231                 gfc_error ("Binding label '%s' for common block '%s' at %L "
7232                            "does not match the binding label '%s' for common "
7233                            "block '%s' at %L",
7234                            comm_block_tree->n.common->binding_label,
7235                            comm_block_tree->n.common->name,
7236                            &(comm_block_tree->n.common->where),
7237                            comm_name_gsym->binding_label,
7238                            comm_name_gsym->name,
7239                            &(comm_name_gsym->where));
7240                 return;
7241               }
7242         }
7243
7244       /* There is no binding label (NAME="") so we have nothing further to
7245          check and nothing to add as a global symbol for the label.  */
7246       if (comm_block_tree->n.common->binding_label[0] == '\0' )
7247         return;
7248       
7249       binding_label_gsym =
7250         gfc_find_gsymbol (gfc_gsym_root,
7251                           comm_block_tree->n.common->binding_label);
7252       if (binding_label_gsym == NULL)
7253         {
7254           /* Need to make a global symbol for the binding label to prevent
7255              it from colliding with another.  */
7256           binding_label_gsym =
7257             gfc_get_gsymbol (comm_block_tree->n.common->binding_label);
7258           binding_label_gsym->sym_name = comm_block_tree->n.common->name;
7259           binding_label_gsym->type = GSYM_COMMON;
7260         }
7261       else
7262         {
7263           /* If comm_name_gsym is NULL, the name common block is use
7264              associated and the name could be colliding.  */
7265           if (binding_label_gsym->type != GSYM_COMMON)
7266             gfc_error ("Binding label '%s' for common block '%s' at %L "
7267                        "collides with the global entity '%s' at %L",
7268                        comm_block_tree->n.common->binding_label,
7269                        comm_block_tree->n.common->name,
7270                        &(comm_block_tree->n.common->where),
7271                        binding_label_gsym->name,
7272                        &(binding_label_gsym->where));
7273           else if (comm_name_gsym != NULL
7274                    && (strcmp (binding_label_gsym->name,
7275                                comm_name_gsym->binding_label) != 0)
7276                    && (strcmp (binding_label_gsym->sym_name,
7277                                comm_name_gsym->name) != 0))
7278             gfc_error ("Binding label '%s' for common block '%s' at %L "
7279                        "collides with global entity '%s' at %L",
7280                        binding_label_gsym->name, binding_label_gsym->sym_name,
7281                        &(comm_block_tree->n.common->where),
7282                        comm_name_gsym->name, &(comm_name_gsym->where));
7283         }
7284     }
7285   
7286   return;
7287 }
7288
7289
7290 /* Verify any BIND(C) derived types in the namespace so we can report errors
7291    for them once, rather than for each variable declared of that type.  */
7292
7293 static void
7294 resolve_bind_c_derived_types (gfc_symbol *derived_sym)
7295 {
7296   if (derived_sym != NULL && derived_sym->attr.flavor == FL_DERIVED
7297       && derived_sym->attr.is_bind_c == 1)
7298     verify_bind_c_derived_type (derived_sym);
7299   
7300   return;
7301 }
7302
7303
7304 /* Verify that any binding labels used in a given namespace do not collide 
7305    with the names or binding labels of any global symbols.  */
7306
7307 static void
7308 gfc_verify_binding_labels (gfc_symbol *sym)
7309 {
7310   int has_error = 0;
7311   
7312   if (sym != NULL && sym->attr.is_bind_c && sym->attr.is_iso_c == 0 
7313       && sym->attr.flavor != FL_DERIVED && sym->binding_label[0] != '\0')
7314     {
7315       gfc_gsymbol *bind_c_sym;
7316
7317       bind_c_sym = gfc_find_gsymbol (gfc_gsym_root, sym->binding_label);
7318       if (bind_c_sym != NULL 
7319           && strcmp (bind_c_sym->name, sym->binding_label) == 0)
7320         {
7321           if (sym->attr.if_source == IFSRC_DECL 
7322               && (bind_c_sym->type != GSYM_SUBROUTINE 
7323                   && bind_c_sym->type != GSYM_FUNCTION) 
7324               && ((sym->attr.contained == 1 
7325                    && strcmp (bind_c_sym->sym_name, sym->name) != 0) 
7326                   || (sym->attr.use_assoc == 1 
7327                       && (strcmp (bind_c_sym->mod_name, sym->module) != 0))))
7328             {
7329               /* Make sure global procedures don't collide with anything.  */
7330               gfc_error ("Binding label '%s' at %L collides with the global "
7331                          "entity '%s' at %L", sym->binding_label,
7332                          &(sym->declared_at), bind_c_sym->name,
7333                          &(bind_c_sym->where));
7334               has_error = 1;
7335             }
7336           else if (sym->attr.contained == 0 
7337                    && (sym->attr.if_source == IFSRC_IFBODY 
7338                        && sym->attr.flavor == FL_PROCEDURE) 
7339                    && (bind_c_sym->sym_name != NULL 
7340                        && strcmp (bind_c_sym->sym_name, sym->name) != 0))
7341             {
7342               /* Make sure procedures in interface bodies don't collide.  */
7343               gfc_error ("Binding label '%s' in interface body at %L collides "
7344                          "with the global entity '%s' at %L",
7345                          sym->binding_label,
7346                          &(sym->declared_at), bind_c_sym->name,
7347                          &(bind_c_sym->where));
7348               has_error = 1;
7349             }
7350           else if (sym->attr.contained == 0 
7351                    && sym->attr.if_source == IFSRC_UNKNOWN)
7352             if ((sym->attr.use_assoc && bind_c_sym->mod_name
7353                  && strcmp (bind_c_sym->mod_name, sym->module) != 0) 
7354                 || sym->attr.use_assoc == 0)
7355               {
7356                 gfc_error ("Binding label '%s' at %L collides with global "
7357                            "entity '%s' at %L", sym->binding_label,
7358                            &(sym->declared_at), bind_c_sym->name,
7359                            &(bind_c_sym->where));
7360                 has_error = 1;
7361               }
7362
7363           if (has_error != 0)
7364             /* Clear the binding label to prevent checking multiple times.  */
7365             sym->binding_label[0] = '\0';
7366         }
7367       else if (bind_c_sym == NULL)
7368         {
7369           bind_c_sym = gfc_get_gsymbol (sym->binding_label);
7370           bind_c_sym->where = sym->declared_at;
7371           bind_c_sym->sym_name = sym->name;
7372
7373           if (sym->attr.use_assoc == 1)
7374             bind_c_sym->mod_name = sym->module;
7375           else
7376             if (sym->ns->proc_name != NULL)
7377               bind_c_sym->mod_name = sym->ns->proc_name->name;
7378
7379           if (sym->attr.contained == 0)
7380             {
7381               if (sym->attr.subroutine)
7382                 bind_c_sym->type = GSYM_SUBROUTINE;
7383               else if (sym->attr.function)
7384                 bind_c_sym->type = GSYM_FUNCTION;
7385             }
7386         }
7387     }
7388   return;
7389 }
7390
7391
7392 /* Resolve an index expression.  */
7393
7394 static gfc_try
7395 resolve_index_expr (gfc_expr *e)
7396 {
7397   if (gfc_resolve_expr (e) == FAILURE)
7398     return FAILURE;
7399
7400   if (gfc_simplify_expr (e, 0) == FAILURE)
7401     return FAILURE;
7402
7403   if (gfc_specification_expr (e) == FAILURE)
7404     return FAILURE;
7405
7406   return SUCCESS;
7407 }
7408
7409 /* Resolve a charlen structure.  */
7410
7411 static gfc_try
7412 resolve_charlen (gfc_charlen *cl)
7413 {
7414   int i, k;
7415
7416   if (cl->resolved)
7417     return SUCCESS;
7418
7419   cl->resolved = 1;
7420
7421   specification_expr = 1;
7422
7423   if (resolve_index_expr (cl->length) == FAILURE)
7424     {
7425       specification_expr = 0;
7426       return FAILURE;
7427     }
7428
7429   /* "If the character length parameter value evaluates to a negative
7430      value, the length of character entities declared is zero."  */
7431   if (cl->length && !gfc_extract_int (cl->length, &i) && i < 0)
7432     {
7433       gfc_warning_now ("CHARACTER variable has zero length at %L",
7434                        &cl->length->where);
7435       gfc_replace_expr (cl->length, gfc_int_expr (0));
7436     }
7437
7438   /* Check that the character length is not too large.  */
7439   k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
7440   if (cl->length && cl->length->expr_type == EXPR_CONSTANT
7441       && cl->length->ts.type == BT_INTEGER
7442       && mpz_cmp (cl->length->value.integer, gfc_integer_kinds[k].huge) > 0)
7443     {
7444       gfc_error ("String length at %L is too large", &cl->length->where);
7445       return FAILURE;
7446     }
7447
7448   return SUCCESS;
7449 }
7450
7451
7452 /* Test for non-constant shape arrays.  */
7453
7454 static bool
7455 is_non_constant_shape_array (gfc_symbol *sym)
7456 {
7457   gfc_expr *e;
7458   int i;
7459   bool not_constant;
7460
7461   not_constant = false;
7462   if (sym->as != NULL)
7463     {
7464       /* Unfortunately, !gfc_is_compile_time_shape hits a legal case that
7465          has not been simplified; parameter array references.  Do the
7466          simplification now.  */
7467       for (i = 0; i < sym->as->rank; i++)
7468         {
7469           e = sym->as->lower[i];
7470           if (e && (resolve_index_expr (e) == FAILURE
7471                     || !gfc_is_constant_expr (e)))
7472             not_constant = true;
7473
7474           e = sym->as->upper[i];
7475           if (e && (resolve_index_expr (e) == FAILURE
7476                     || !gfc_is_constant_expr (e)))
7477             not_constant = true;
7478         }
7479     }
7480   return not_constant;
7481 }
7482
7483 /* Given a symbol and an initialization expression, add code to initialize
7484    the symbol to the function entry.  */
7485 static void
7486 build_init_assign (gfc_symbol *sym, gfc_expr *init)
7487 {
7488   gfc_expr *lval;
7489   gfc_code *init_st;
7490   gfc_namespace *ns = sym->ns;
7491
7492   /* Search for the function namespace if this is a contained
7493      function without an explicit result.  */
7494   if (sym->attr.function && sym == sym->result
7495       && sym->name != sym->ns->proc_name->name)
7496     {
7497       ns = ns->contained;
7498       for (;ns; ns = ns->sibling)
7499         if (strcmp (ns->proc_name->name, sym->name) == 0)
7500           break;
7501     }
7502
7503   if (ns == NULL)
7504     {
7505       gfc_free_expr (init);
7506       return;
7507     }
7508
7509   /* Build an l-value expression for the result.  */
7510   lval = gfc_lval_expr_from_sym (sym);
7511
7512   /* Add the code at scope entry.  */
7513   init_st = gfc_get_code ();
7514   init_st->next = ns->code;
7515   ns->code = init_st;
7516
7517   /* Assign the default initializer to the l-value.  */
7518   init_st->loc = sym->declared_at;
7519   init_st->op = EXEC_INIT_ASSIGN;
7520   init_st->expr1 = lval;
7521   init_st->expr2 = init;
7522 }
7523
7524 /* Assign the default initializer to a derived type variable or result.  */
7525
7526 static void
7527 apply_default_init (gfc_symbol *sym)
7528 {
7529   gfc_expr *init = NULL;
7530
7531   if (sym->attr.flavor != FL_VARIABLE && !sym->attr.function)
7532     return;
7533
7534   if (sym->ts.type == BT_DERIVED && sym->ts.derived)
7535     init = gfc_default_initializer (&sym->ts);
7536
7537   if (init == NULL)
7538     return;
7539
7540   build_init_assign (sym, init);
7541 }
7542
7543 /* Build an initializer for a local integer, real, complex, logical, or
7544    character variable, based on the command line flags finit-local-zero,
7545    finit-integer=, finit-real=, finit-logical=, and finit-runtime.  Returns 
7546    null if the symbol should not have a default initialization.  */
7547 static gfc_expr *
7548 build_default_init_expr (gfc_symbol *sym)
7549 {
7550   int char_len;
7551   gfc_expr *init_expr;
7552   int i;
7553
7554   /* These symbols should never have a default initialization.  */
7555   if ((sym->attr.dimension && !gfc_is_compile_time_shape (sym->as))
7556       || sym->attr.external
7557       || sym->attr.dummy
7558       || sym->attr.pointer
7559       || sym->attr.in_equivalence
7560       || sym->attr.in_common
7561       || sym->attr.data
7562       || sym->module
7563       || sym->attr.cray_pointee
7564       || sym->attr.cray_pointer)
7565     return NULL;
7566
7567   /* Now we'll try to build an initializer expression.  */
7568   init_expr = gfc_get_expr ();
7569   init_expr->expr_type = EXPR_CONSTANT;
7570   init_expr->ts.type = sym->ts.type;
7571   init_expr->ts.kind = sym->ts.kind;
7572   init_expr->where = sym->declared_at;
7573   
7574   /* We will only initialize integers, reals, complex, logicals, and
7575      characters, and only if the corresponding command-line flags
7576      were set.  Otherwise, we free init_expr and return null.  */
7577   switch (sym->ts.type)
7578     {    
7579     case BT_INTEGER:
7580       if (gfc_option.flag_init_integer != GFC_INIT_INTEGER_OFF)
7581         mpz_init_set_si (init_expr->value.integer, 
7582                          gfc_option.flag_init_integer_value);
7583       else
7584         {
7585           gfc_free_expr (init_expr);
7586           init_expr = NULL;
7587         }
7588       break;
7589
7590     case BT_REAL:
7591       mpfr_init (init_expr->value.real);
7592       switch (gfc_option.flag_init_real)
7593         {
7594         case GFC_INIT_REAL_SNAN:
7595           init_expr->is_snan = 1;
7596           /* Fall through.  */
7597         case GFC_INIT_REAL_NAN:
7598           mpfr_set_nan (init_expr->value.real);
7599           break;
7600
7601         case GFC_INIT_REAL_INF:
7602           mpfr_set_inf (init_expr->value.real, 1);
7603           break;
7604
7605         case GFC_INIT_REAL_NEG_INF:
7606           mpfr_set_inf (init_expr->value.real, -1);
7607           break;
7608
7609         case GFC_INIT_REAL_ZERO:
7610           mpfr_set_ui (init_expr->value.real, 0.0, GFC_RND_MODE);
7611           break;
7612
7613         default:
7614           gfc_free_expr (init_expr);
7615           init_expr = NULL;
7616           break;
7617         }
7618       break;
7619           
7620     case BT_COMPLEX:
7621 #ifdef HAVE_mpc
7622       mpc_init2 (init_expr->value.complex, mpfr_get_default_prec());
7623 #else
7624       mpfr_init (init_expr->value.complex.r);
7625       mpfr_init (init_expr->value.complex.i);
7626 #endif
7627       switch (gfc_option.flag_init_real)
7628         {
7629         case GFC_INIT_REAL_SNAN:
7630           init_expr->is_snan = 1;
7631           /* Fall through.  */
7632         case GFC_INIT_REAL_NAN:
7633           mpfr_set_nan (mpc_realref (init_expr->value.complex));
7634           mpfr_set_nan (mpc_imagref (init_expr->value.complex));
7635           break;
7636
7637         case GFC_INIT_REAL_INF:
7638           mpfr_set_inf (mpc_realref (init_expr->value.complex), 1);
7639           mpfr_set_inf (mpc_imagref (init_expr->value.complex), 1);
7640           break;
7641
7642         case GFC_INIT_REAL_NEG_INF:
7643           mpfr_set_inf (mpc_realref (init_expr->value.complex), -1);
7644           mpfr_set_inf (mpc_imagref (init_expr->value.complex), -1);
7645           break;
7646
7647         case GFC_INIT_REAL_ZERO:
7648 #ifdef HAVE_mpc
7649           mpc_set_ui (init_expr->value.complex, 0, GFC_MPC_RND_MODE);
7650 #else
7651           mpfr_set_ui (init_expr->value.complex.r, 0.0, GFC_RND_MODE);
7652           mpfr_set_ui (init_expr->value.complex.i, 0.0, GFC_RND_MODE);
7653 #endif
7654           break;
7655
7656         default:
7657           gfc_free_expr (init_expr);
7658           init_expr = NULL;
7659           break;
7660         }
7661       break;
7662           
7663     case BT_LOGICAL:
7664       if (gfc_option.flag_init_logical == GFC_INIT_LOGICAL_FALSE)
7665         init_expr->value.logical = 0;
7666       else if (gfc_option.flag_init_logical == GFC_INIT_LOGICAL_TRUE)
7667         init_expr->value.logical = 1;
7668       else
7669         {
7670           gfc_free_expr (init_expr);
7671           init_expr = NULL;
7672         }
7673       break;
7674           
7675     case BT_CHARACTER:
7676       /* For characters, the length must be constant in order to 
7677          create a default initializer.  */
7678       if (gfc_option.flag_init_character == GFC_INIT_CHARACTER_ON
7679           && sym->ts.cl->length
7680           && sym->ts.cl->length->expr_type == EXPR_CONSTANT)
7681         {
7682           char_len = mpz_get_si (sym->ts.cl->length->value.integer);
7683           init_expr->value.character.length = char_len;
7684           init_expr->value.character.string = gfc_get_wide_string (char_len+1);
7685           for (i = 0; i < char_len; i++)
7686             init_expr->value.character.string[i]
7687               = (unsigned char) gfc_option.flag_init_character_value;
7688         }
7689       else
7690         {
7691           gfc_free_expr (init_expr);
7692           init_expr = NULL;
7693         }
7694       break;
7695           
7696     default:
7697      gfc_free_expr (init_expr);
7698      init_expr = NULL;
7699     }
7700   return init_expr;
7701 }
7702
7703 /* Add an initialization expression to a local variable.  */
7704 static void
7705 apply_default_init_local (gfc_symbol *sym)
7706 {
7707   gfc_expr *init = NULL;
7708
7709   /* The symbol should be a variable or a function return value.  */
7710   if ((sym->attr.flavor != FL_VARIABLE && !sym->attr.function)
7711       || (sym->attr.function && sym->result != sym))
7712     return;
7713
7714   /* Try to build the initializer expression.  If we can't initialize
7715      this symbol, then init will be NULL.  */
7716   init = build_default_init_expr (sym);
7717   if (init == NULL)
7718     return;
7719
7720   /* For saved variables, we don't want to add an initializer at 
7721      function entry, so we just add a static initializer.  */
7722   if (sym->attr.save || sym->ns->save_all)
7723     {
7724       /* Don't clobber an existing initializer!  */
7725       gcc_assert (sym->value == NULL);
7726       sym->value = init;
7727       return;
7728     }
7729
7730   build_init_assign (sym, init);
7731 }
7732
7733 /* Resolution of common features of flavors variable and procedure.  */
7734
7735 static gfc_try
7736 resolve_fl_var_and_proc (gfc_symbol *sym, int mp_flag)
7737 {
7738   /* Constraints on deferred shape variable.  */
7739   if (sym->as == NULL || sym->as->type != AS_DEFERRED)
7740     {
7741       if (sym->attr.allocatable)
7742         {
7743           if (sym->attr.dimension)
7744             gfc_error ("Allocatable array '%s' at %L must have "
7745                        "a deferred shape", sym->name, &sym->declared_at);
7746           else
7747             gfc_error ("Scalar object '%s' at %L may not be ALLOCATABLE",
7748                        sym->name, &sym->declared_at);
7749             return FAILURE;
7750         }
7751
7752       if (sym->attr.pointer && sym->attr.dimension)
7753         {
7754           gfc_error ("Array pointer '%s' at %L must have a deferred shape",
7755                      sym->name, &sym->declared_at);
7756           return FAILURE;
7757         }
7758
7759     }
7760   else
7761     {
7762       if (!mp_flag && !sym->attr.allocatable
7763           && !sym->attr.pointer && !sym->attr.dummy)
7764         {
7765           gfc_error ("Array '%s' at %L cannot have a deferred shape",
7766                      sym->name, &sym->declared_at);
7767           return FAILURE;
7768          }
7769     }
7770   return SUCCESS;
7771 }
7772
7773
7774 /* Additional checks for symbols with flavor variable and derived
7775    type.  To be called from resolve_fl_variable.  */
7776
7777 static gfc_try
7778 resolve_fl_variable_derived (gfc_symbol *sym, int no_init_flag)
7779 {
7780   gcc_assert (sym->ts.type == BT_DERIVED);
7781
7782   /* Check to see if a derived type is blocked from being host
7783      associated by the presence of another class I symbol in the same
7784      namespace.  14.6.1.3 of the standard and the discussion on
7785      comp.lang.fortran.  */
7786   if (sym->ns != sym->ts.derived->ns
7787       && sym->ns->proc_name->attr.if_source != IFSRC_IFBODY)
7788     {
7789       gfc_symbol *s;
7790       gfc_find_symbol (sym->ts.derived->name, sym->ns, 0, &s);
7791       if (s && s->attr.flavor != FL_DERIVED)
7792         {
7793           gfc_error ("The type '%s' cannot be host associated at %L "
7794                      "because it is blocked by an incompatible object "
7795                      "of the same name declared at %L",
7796                      sym->ts.derived->name, &sym->declared_at,
7797                      &s->declared_at);
7798           return FAILURE;
7799         }
7800     }
7801
7802   /* 4th constraint in section 11.3: "If an object of a type for which
7803      component-initialization is specified (R429) appears in the
7804      specification-part of a module and does not have the ALLOCATABLE
7805      or POINTER attribute, the object shall have the SAVE attribute."
7806
7807      The check for initializers is performed with
7808      has_default_initializer because gfc_default_initializer generates
7809      a hidden default for allocatable components.  */
7810   if (!(sym->value || no_init_flag) && sym->ns->proc_name
7811       && sym->ns->proc_name->attr.flavor == FL_MODULE
7812       && !sym->ns->save_all && !sym->attr.save
7813       && !sym->attr.pointer && !sym->attr.allocatable
7814       && has_default_initializer (sym->ts.derived))
7815     {
7816       gfc_error("Object '%s' at %L must have the SAVE attribute for "
7817                 "default initialization of a component",
7818                 sym->name, &sym->declared_at);
7819       return FAILURE;
7820     }
7821
7822   /* Assign default initializer.  */
7823   if (!(sym->value || sym->attr.pointer || sym->attr.allocatable)
7824       && (!no_init_flag || sym->attr.intent == INTENT_OUT))
7825     {
7826       sym->value = gfc_default_initializer (&sym->ts);
7827     }
7828
7829   return SUCCESS;
7830 }
7831
7832
7833 /* Resolve symbols with flavor variable.  */
7834
7835 static gfc_try
7836 resolve_fl_variable (gfc_symbol *sym, int mp_flag)
7837 {
7838   int no_init_flag, automatic_flag;
7839   gfc_expr *e;
7840   const char *auto_save_msg;
7841
7842   auto_save_msg = "Automatic object '%s' at %L cannot have the "
7843                   "SAVE attribute";
7844
7845   if (resolve_fl_var_and_proc (sym, mp_flag) == FAILURE)
7846     return FAILURE;
7847
7848   /* Set this flag to check that variables are parameters of all entries.
7849      This check is effected by the call to gfc_resolve_expr through
7850      is_non_constant_shape_array.  */
7851   specification_expr = 1;
7852
7853   if (sym->ns->proc_name
7854       && (sym->ns->proc_name->attr.flavor == FL_MODULE
7855           || sym->ns->proc_name->attr.is_main_program)
7856       && !sym->attr.use_assoc
7857       && !sym->attr.allocatable
7858       && !sym->attr.pointer
7859       && is_non_constant_shape_array (sym))
7860     {
7861       /* The shape of a main program or module array needs to be
7862          constant.  */
7863       gfc_error ("The module or main program array '%s' at %L must "
7864                  "have constant shape", sym->name, &sym->declared_at);
7865       specification_expr = 0;
7866       return FAILURE;
7867     }
7868
7869   if (sym->ts.type == BT_CHARACTER)
7870     {
7871       /* Make sure that character string variables with assumed length are
7872          dummy arguments.  */
7873       e = sym->ts.cl->length;
7874       if (e == NULL && !sym->attr.dummy && !sym->attr.result)
7875         {
7876           gfc_error ("Entity with assumed character length at %L must be a "
7877                      "dummy argument or a PARAMETER", &sym->declared_at);
7878           return FAILURE;
7879         }
7880
7881       if (e && sym->attr.save && !gfc_is_constant_expr (e))
7882         {
7883           gfc_error (auto_save_msg, sym->name, &sym->declared_at);
7884           return FAILURE;
7885         }
7886
7887       if (!gfc_is_constant_expr (e)
7888           && !(e->expr_type == EXPR_VARIABLE
7889                && e->symtree->n.sym->attr.flavor == FL_PARAMETER)
7890           && sym->ns->proc_name
7891           && (sym->ns->proc_name->attr.flavor == FL_MODULE
7892               || sym->ns->proc_name->attr.is_main_program)
7893           && !sym->attr.use_assoc)
7894         {
7895           gfc_error ("'%s' at %L must have constant character length "
7896                      "in this context", sym->name, &sym->declared_at);
7897           return FAILURE;
7898         }
7899     }
7900
7901   if (sym->value == NULL && sym->attr.referenced)
7902     apply_default_init_local (sym); /* Try to apply a default initialization.  */
7903
7904   /* Determine if the symbol may not have an initializer.  */
7905   no_init_flag = automatic_flag = 0;
7906   if (sym->attr.allocatable || sym->attr.external || sym->attr.dummy
7907       || sym->attr.intrinsic || sym->attr.result)
7908     no_init_flag = 1;
7909   else if (sym->attr.dimension && !sym->attr.pointer
7910            && is_non_constant_shape_array (sym))
7911     {
7912       no_init_flag = automatic_flag = 1;
7913
7914       /* Also, they must not have the SAVE attribute.
7915          SAVE_IMPLICIT is checked below.  */
7916       if (sym->attr.save == SAVE_EXPLICIT)
7917         {
7918           gfc_error (auto_save_msg, sym->name, &sym->declared_at);
7919           return FAILURE;
7920         }
7921     }
7922
7923   /* Ensure that any initializer is simplified.  */
7924   if (sym->value)
7925     gfc_simplify_expr (sym->value, 1);
7926
7927   /* Reject illegal initializers.  */
7928   if (!sym->mark && sym->value)
7929     {
7930       if (sym->attr.allocatable)
7931         gfc_error ("Allocatable '%s' at %L cannot have an initializer",
7932                    sym->name, &sym->declared_at);
7933       else if (sym->attr.external)
7934         gfc_error ("External '%s' at %L cannot have an initializer",
7935                    sym->name, &sym->declared_at);
7936       else if (sym->attr.dummy
7937         && !(sym->ts.type == BT_DERIVED && sym->attr.intent == INTENT_OUT))
7938         gfc_error ("Dummy '%s' at %L cannot have an initializer",
7939                    sym->name, &sym->declared_at);
7940       else if (sym->attr.intrinsic)
7941         gfc_error ("Intrinsic '%s' at %L cannot have an initializer",
7942                    sym->name, &sym->declared_at);
7943       else if (sym->attr.result)
7944         gfc_error ("Function result '%s' at %L cannot have an initializer",
7945                    sym->name, &sym->declared_at);
7946       else if (automatic_flag)
7947         gfc_error ("Automatic array '%s' at %L cannot have an initializer",
7948                    sym->name, &sym->declared_at);
7949       else
7950         goto no_init_error;
7951       return FAILURE;
7952     }
7953
7954 no_init_error:
7955   if (sym->ts.type == BT_DERIVED)
7956     return resolve_fl_variable_derived (sym, no_init_flag);
7957
7958   return SUCCESS;
7959 }
7960
7961
7962 /* Resolve a procedure.  */
7963
7964 static gfc_try
7965 resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
7966 {
7967   gfc_formal_arglist *arg;
7968
7969   if (sym->attr.ambiguous_interfaces && !sym->attr.referenced)
7970     gfc_warning ("Although not referenced, '%s' at %L has ambiguous "
7971                  "interfaces", sym->name, &sym->declared_at);
7972
7973   if (sym->attr.function
7974       && resolve_fl_var_and_proc (sym, mp_flag) == FAILURE)
7975     return FAILURE;
7976
7977   if (sym->ts.type == BT_CHARACTER)
7978     {
7979       gfc_charlen *cl = sym->ts.cl;
7980
7981       if (cl && cl->length && gfc_is_constant_expr (cl->length)
7982              && resolve_charlen (cl) == FAILURE)
7983         return FAILURE;
7984
7985       if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
7986         {
7987           if (sym->attr.proc == PROC_ST_FUNCTION)
7988             {
7989               gfc_error ("Character-valued statement function '%s' at %L must "
7990                          "have constant length", sym->name, &sym->declared_at);
7991               return FAILURE;
7992             }
7993
7994           if (sym->attr.external && sym->formal == NULL
7995               && cl && cl->length && cl->length->expr_type != EXPR_CONSTANT)
7996             {
7997               gfc_error ("Automatic character length function '%s' at %L must "
7998                          "have an explicit interface", sym->name,
7999                          &sym->declared_at);
8000               return FAILURE;
8001             }
8002         }
8003     }
8004
8005   /* Ensure that derived type for are not of a private type.  Internal
8006      module procedures are excluded by 2.2.3.3 - i.e., they are not
8007      externally accessible and can access all the objects accessible in
8008      the host.  */
8009   if (!(sym->ns->parent
8010         && sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
8011       && gfc_check_access(sym->attr.access, sym->ns->default_access))
8012     {
8013       gfc_interface *iface;
8014
8015       for (arg = sym->formal; arg; arg = arg->next)
8016         {
8017           if (arg->sym
8018               && arg->sym->ts.type == BT_DERIVED
8019               && !arg->sym->ts.derived->attr.use_assoc
8020               && !gfc_check_access (arg->sym->ts.derived->attr.access,
8021                                     arg->sym->ts.derived->ns->default_access)
8022               && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: '%s' is of a "
8023                                  "PRIVATE type and cannot be a dummy argument"
8024                                  " of '%s', which is PUBLIC at %L",
8025                                  arg->sym->name, sym->name, &sym->declared_at)
8026                  == FAILURE)
8027             {
8028               /* Stop this message from recurring.  */
8029               arg->sym->ts.derived->attr.access = ACCESS_PUBLIC;
8030               return FAILURE;
8031             }
8032         }
8033
8034       /* PUBLIC interfaces may expose PRIVATE procedures that take types
8035          PRIVATE to the containing module.  */
8036       for (iface = sym->generic; iface; iface = iface->next)
8037         {
8038           for (arg = iface->sym->formal; arg; arg = arg->next)
8039             {
8040               if (arg->sym
8041                   && arg->sym->ts.type == BT_DERIVED
8042                   && !arg->sym->ts.derived->attr.use_assoc
8043                   && !gfc_check_access (arg->sym->ts.derived->attr.access,
8044                                         arg->sym->ts.derived->ns->default_access)
8045                   && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Procedure "
8046                                      "'%s' in PUBLIC interface '%s' at %L "
8047                                      "takes dummy arguments of '%s' which is "
8048                                      "PRIVATE", iface->sym->name, sym->name,
8049                                      &iface->sym->declared_at,
8050                                      gfc_typename (&arg->sym->ts)) == FAILURE)
8051                 {
8052                   /* Stop this message from recurring.  */
8053                   arg->sym->ts.derived->attr.access = ACCESS_PUBLIC;
8054                   return FAILURE;
8055                 }
8056              }
8057         }
8058
8059       /* PUBLIC interfaces may expose PRIVATE procedures that take types
8060          PRIVATE to the containing module.  */
8061       for (iface = sym->generic; iface; iface = iface->next)
8062         {
8063           for (arg = iface->sym->formal; arg; arg = arg->next)
8064             {
8065               if (arg->sym
8066                   && arg->sym->ts.type == BT_DERIVED
8067                   && !arg->sym->ts.derived->attr.use_assoc
8068                   && !gfc_check_access (arg->sym->ts.derived->attr.access,
8069                                         arg->sym->ts.derived->ns->default_access)
8070                   && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Procedure "
8071                                      "'%s' in PUBLIC interface '%s' at %L "
8072                                      "takes dummy arguments of '%s' which is "
8073                                      "PRIVATE", iface->sym->name, sym->name,
8074                                      &iface->sym->declared_at,
8075                                      gfc_typename (&arg->sym->ts)) == FAILURE)
8076                 {
8077                   /* Stop this message from recurring.  */
8078                   arg->sym->ts.derived->attr.access = ACCESS_PUBLIC;
8079                   return FAILURE;
8080                 }
8081              }
8082         }
8083     }
8084
8085   if (sym->attr.function && sym->value && sym->attr.proc != PROC_ST_FUNCTION
8086       && !sym->attr.proc_pointer)
8087     {
8088       gfc_error ("Function '%s' at %L cannot have an initializer",
8089                  sym->name, &sym->declared_at);
8090       return FAILURE;
8091     }
8092
8093   /* An external symbol may not have an initializer because it is taken to be
8094      a procedure. Exception: Procedure Pointers.  */
8095   if (sym->attr.external && sym->value && !sym->attr.proc_pointer)
8096     {
8097       gfc_error ("External object '%s' at %L may not have an initializer",
8098                  sym->name, &sym->declared_at);
8099       return FAILURE;
8100     }
8101
8102   /* An elemental function is required to return a scalar 12.7.1  */
8103   if (sym->attr.elemental && sym->attr.function && sym->as)
8104     {
8105       gfc_error ("ELEMENTAL function '%s' at %L must have a scalar "
8106                  "result", sym->name, &sym->declared_at);
8107       /* Reset so that the error only occurs once.  */
8108       sym->attr.elemental = 0;
8109       return FAILURE;
8110     }
8111
8112   /* 5.1.1.5 of the Standard: A function name declared with an asterisk
8113      char-len-param shall not be array-valued, pointer-valued, recursive
8114      or pure.  ....snip... A character value of * may only be used in the
8115      following ways: (i) Dummy arg of procedure - dummy associates with
8116      actual length; (ii) To declare a named constant; or (iii) External
8117      function - but length must be declared in calling scoping unit.  */
8118   if (sym->attr.function
8119       && sym->ts.type == BT_CHARACTER
8120       && sym->ts.cl && sym->ts.cl->length == NULL)
8121     {
8122       if ((sym->as && sym->as->rank) || (sym->attr.pointer)
8123           || (sym->attr.recursive) || (sym->attr.pure))
8124         {
8125           if (sym->as && sym->as->rank)
8126             gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
8127                        "array-valued", sym->name, &sym->declared_at);
8128
8129           if (sym->attr.pointer)
8130             gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
8131                        "pointer-valued", sym->name, &sym->declared_at);
8132
8133           if (sym->attr.pure)
8134             gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
8135                        "pure", sym->name, &sym->declared_at);
8136
8137           if (sym->attr.recursive)
8138             gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
8139                        "recursive", sym->name, &sym->declared_at);
8140
8141           return FAILURE;
8142         }
8143
8144       /* Appendix B.2 of the standard.  Contained functions give an
8145          error anyway.  Fixed-form is likely to be F77/legacy.  */
8146       if (!sym->attr.contained && gfc_current_form != FORM_FIXED)
8147         gfc_notify_std (GFC_STD_F95_OBS, "CHARACTER(*) function "
8148                         "'%s' at %L is obsolescent in fortran 95",
8149                         sym->name, &sym->declared_at);
8150     }
8151
8152   if (sym->attr.is_bind_c && sym->attr.is_c_interop != 1)
8153     {
8154       gfc_formal_arglist *curr_arg;
8155       int has_non_interop_arg = 0;
8156
8157       if (verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
8158                              sym->common_block) == FAILURE)
8159         {
8160           /* Clear these to prevent looking at them again if there was an
8161              error.  */
8162           sym->attr.is_bind_c = 0;
8163           sym->attr.is_c_interop = 0;
8164           sym->ts.is_c_interop = 0;
8165         }
8166       else
8167         {
8168           /* So far, no errors have been found.  */
8169           sym->attr.is_c_interop = 1;
8170           sym->ts.is_c_interop = 1;
8171         }
8172       
8173       curr_arg = sym->formal;
8174       while (curr_arg != NULL)
8175         {
8176           /* Skip implicitly typed dummy args here.  */
8177           if (curr_arg->sym->attr.implicit_type == 0)
8178             if (verify_c_interop_param (curr_arg->sym) == FAILURE)
8179               /* If something is found to fail, record the fact so we
8180                  can mark the symbol for the procedure as not being
8181                  BIND(C) to try and prevent multiple errors being
8182                  reported.  */
8183               has_non_interop_arg = 1;
8184           
8185           curr_arg = curr_arg->next;
8186         }
8187
8188       /* See if any of the arguments were not interoperable and if so, clear
8189          the procedure symbol to prevent duplicate error messages.  */
8190       if (has_non_interop_arg != 0)
8191         {
8192           sym->attr.is_c_interop = 0;
8193           sym->ts.is_c_interop = 0;
8194           sym->attr.is_bind_c = 0;
8195         }
8196     }
8197   
8198   if (!sym->attr.proc_pointer)
8199     {
8200       if (sym->attr.save == SAVE_EXPLICIT)
8201         {
8202           gfc_error ("PROCEDURE attribute conflicts with SAVE attribute "
8203                      "in '%s' at %L", sym->name, &sym->declared_at);
8204           return FAILURE;
8205         }
8206       if (sym->attr.intent)
8207         {
8208           gfc_error ("PROCEDURE attribute conflicts with INTENT attribute "
8209                      "in '%s' at %L", sym->name, &sym->declared_at);
8210           return FAILURE;
8211         }
8212       if (sym->attr.subroutine && sym->attr.result)
8213         {
8214           gfc_error ("PROCEDURE attribute conflicts with RESULT attribute "
8215                      "in '%s' at %L", sym->name, &sym->declared_at);
8216           return FAILURE;
8217         }
8218       if (sym->attr.external && sym->attr.function
8219           && ((sym->attr.if_source == IFSRC_DECL && !sym->attr.procedure)
8220               || sym->attr.contained))
8221         {
8222           gfc_error ("EXTERNAL attribute conflicts with FUNCTION attribute "
8223                      "in '%s' at %L", sym->name, &sym->declared_at);
8224           return FAILURE;
8225         }
8226       if (strcmp ("ppr@", sym->name) == 0)
8227         {
8228           gfc_error ("Procedure pointer result '%s' at %L "
8229                      "is missing the pointer attribute",
8230                      sym->ns->proc_name->name, &sym->declared_at);
8231           return FAILURE;
8232         }
8233     }
8234
8235   return SUCCESS;
8236 }
8237
8238
8239 /* Resolve a list of finalizer procedures.  That is, after they have hopefully
8240    been defined and we now know their defined arguments, check that they fulfill
8241    the requirements of the standard for procedures used as finalizers.  */
8242
8243 static gfc_try
8244 gfc_resolve_finalizers (gfc_symbol* derived)
8245 {
8246   gfc_finalizer* list;
8247   gfc_finalizer** prev_link; /* For removing wrong entries from the list.  */
8248   gfc_try result = SUCCESS;
8249   bool seen_scalar = false;
8250
8251   if (!derived->f2k_derived || !derived->f2k_derived->finalizers)
8252     return SUCCESS;
8253
8254   /* Walk over the list of finalizer-procedures, check them, and if any one
8255      does not fit in with the standard's definition, print an error and remove
8256      it from the list.  */
8257   prev_link = &derived->f2k_derived->finalizers;
8258   for (list = derived->f2k_derived->finalizers; list; list = *prev_link)
8259     {
8260       gfc_symbol* arg;
8261       gfc_finalizer* i;
8262       int my_rank;
8263
8264       /* Skip this finalizer if we already resolved it.  */
8265       if (list->proc_tree)
8266         {
8267           prev_link = &(list->next);
8268           continue;
8269         }
8270
8271       /* Check this exists and is a SUBROUTINE.  */
8272       if (!list->proc_sym->attr.subroutine)
8273         {
8274           gfc_error ("FINAL procedure '%s' at %L is not a SUBROUTINE",
8275                      list->proc_sym->name, &list->where);
8276           goto error;
8277         }
8278
8279       /* We should have exactly one argument.  */
8280       if (!list->proc_sym->formal || list->proc_sym->formal->next)
8281         {
8282           gfc_error ("FINAL procedure at %L must have exactly one argument",
8283                      &list->where);
8284           goto error;
8285         }
8286       arg = list->proc_sym->formal->sym;
8287
8288       /* This argument must be of our type.  */
8289       if (arg->ts.type != BT_DERIVED || arg->ts.derived != derived)
8290         {
8291           gfc_error ("Argument of FINAL procedure at %L must be of type '%s'",
8292                      &arg->declared_at, derived->name);
8293           goto error;
8294         }
8295
8296       /* It must neither be a pointer nor allocatable nor optional.  */
8297       if (arg->attr.pointer)
8298         {
8299           gfc_error ("Argument of FINAL procedure at %L must not be a POINTER",
8300                      &arg->declared_at);
8301           goto error;
8302         }
8303       if (arg->attr.allocatable)
8304         {
8305           gfc_error ("Argument of FINAL procedure at %L must not be"
8306                      " ALLOCATABLE", &arg->declared_at);
8307           goto error;
8308         }
8309       if (arg->attr.optional)
8310         {
8311           gfc_error ("Argument of FINAL procedure at %L must not be OPTIONAL",
8312                      &arg->declared_at);
8313           goto error;
8314         }
8315
8316       /* It must not be INTENT(OUT).  */
8317       if (arg->attr.intent == INTENT_OUT)
8318         {
8319           gfc_error ("Argument of FINAL procedure at %L must not be"
8320                      " INTENT(OUT)", &arg->declared_at);
8321           goto error;
8322         }
8323
8324       /* Warn if the procedure is non-scalar and not assumed shape.  */
8325       if (gfc_option.warn_surprising && arg->as && arg->as->rank > 0
8326           && arg->as->type != AS_ASSUMED_SHAPE)
8327         gfc_warning ("Non-scalar FINAL procedure at %L should have assumed"
8328                      " shape argument", &arg->declared_at);
8329
8330       /* Check that it does not match in kind and rank with a FINAL procedure
8331          defined earlier.  To really loop over the *earlier* declarations,
8332          we need to walk the tail of the list as new ones were pushed at the
8333          front.  */
8334       /* TODO: Handle kind parameters once they are implemented.  */
8335       my_rank = (arg->as ? arg->as->rank : 0);
8336       for (i = list->next; i; i = i->next)
8337         {
8338           /* Argument list might be empty; that is an error signalled earlier,
8339              but we nevertheless continued resolving.  */
8340           if (i->proc_sym->formal)
8341             {
8342               gfc_symbol* i_arg = i->proc_sym->formal->sym;
8343               const int i_rank = (i_arg->as ? i_arg->as->rank : 0);
8344               if (i_rank == my_rank)
8345                 {
8346                   gfc_error ("FINAL procedure '%s' declared at %L has the same"
8347                              " rank (%d) as '%s'",
8348                              list->proc_sym->name, &list->where, my_rank, 
8349                              i->proc_sym->name);
8350                   goto error;
8351                 }
8352             }
8353         }
8354
8355         /* Is this the/a scalar finalizer procedure?  */
8356         if (!arg->as || arg->as->rank == 0)
8357           seen_scalar = true;
8358
8359         /* Find the symtree for this procedure.  */
8360         gcc_assert (!list->proc_tree);
8361         list->proc_tree = gfc_find_sym_in_symtree (list->proc_sym);
8362
8363         prev_link = &list->next;
8364         continue;
8365
8366         /* Remove wrong nodes immediately from the list so we don't risk any
8367            troubles in the future when they might fail later expectations.  */
8368 error:
8369         result = FAILURE;
8370         i = list;
8371         *prev_link = list->next;
8372         gfc_free_finalizer (i);
8373     }
8374
8375   /* Warn if we haven't seen a scalar finalizer procedure (but we know there
8376      were nodes in the list, must have been for arrays.  It is surely a good
8377      idea to have a scalar version there if there's something to finalize.  */
8378   if (gfc_option.warn_surprising && result == SUCCESS && !seen_scalar)
8379     gfc_warning ("Only array FINAL procedures declared for derived type '%s'"
8380                  " defined at %L, suggest also scalar one",
8381                  derived->name, &derived->declared_at);
8382
8383   /* TODO:  Remove this error when finalization is finished.  */
8384   gfc_error ("Finalization at %L is not yet implemented",
8385              &derived->declared_at);
8386
8387   return result;
8388 }
8389
8390
8391 /* Check that it is ok for the typebound procedure proc to override the
8392    procedure old.  */
8393
8394 static gfc_try
8395 check_typebound_override (gfc_symtree* proc, gfc_symtree* old)
8396 {
8397   locus where;
8398   const gfc_symbol* proc_target;
8399   const gfc_symbol* old_target;
8400   unsigned proc_pass_arg, old_pass_arg, argpos;
8401   gfc_formal_arglist* proc_formal;
8402   gfc_formal_arglist* old_formal;
8403
8404   /* This procedure should only be called for non-GENERIC proc.  */
8405   gcc_assert (!proc->n.tb->is_generic);
8406
8407   /* If the overwritten procedure is GENERIC, this is an error.  */
8408   if (old->n.tb->is_generic)
8409     {
8410       gfc_error ("Can't overwrite GENERIC '%s' at %L",
8411                  old->name, &proc->n.tb->where);
8412       return FAILURE;
8413     }
8414
8415   where = proc->n.tb->where;
8416   proc_target = proc->n.tb->u.specific->n.sym;
8417   old_target = old->n.tb->u.specific->n.sym;
8418
8419   /* Check that overridden binding is not NON_OVERRIDABLE.  */
8420   if (old->n.tb->non_overridable)
8421     {
8422       gfc_error ("'%s' at %L overrides a procedure binding declared"
8423                  " NON_OVERRIDABLE", proc->name, &where);
8424       return FAILURE;
8425     }
8426
8427   /* It's an error to override a non-DEFERRED procedure with a DEFERRED one.  */
8428   if (!old->n.tb->deferred && proc->n.tb->deferred)
8429     {
8430       gfc_error ("'%s' at %L must not be DEFERRED as it overrides a"
8431                  " non-DEFERRED binding", proc->name, &where);
8432       return FAILURE;
8433     }
8434
8435   /* If the overridden binding is PURE, the overriding must be, too.  */
8436   if (old_target->attr.pure && !proc_target->attr.pure)
8437     {
8438       gfc_error ("'%s' at %L overrides a PURE procedure and must also be PURE",
8439                  proc->name, &where);
8440       return FAILURE;
8441     }
8442
8443   /* If the overridden binding is ELEMENTAL, the overriding must be, too.  If it
8444      is not, the overriding must not be either.  */
8445   if (old_target->attr.elemental && !proc_target->attr.elemental)
8446     {
8447       gfc_error ("'%s' at %L overrides an ELEMENTAL procedure and must also be"
8448                  " ELEMENTAL", proc->name, &where);
8449       return FAILURE;
8450     }
8451   if (!old_target->attr.elemental && proc_target->attr.elemental)
8452     {
8453       gfc_error ("'%s' at %L overrides a non-ELEMENTAL procedure and must not"
8454                  " be ELEMENTAL, either", proc->name, &where);
8455       return FAILURE;
8456     }
8457
8458   /* If the overridden binding is a SUBROUTINE, the overriding must also be a
8459      SUBROUTINE.  */
8460   if (old_target->attr.subroutine && !proc_target->attr.subroutine)
8461     {
8462       gfc_error ("'%s' at %L overrides a SUBROUTINE and must also be a"
8463                  " SUBROUTINE", proc->name, &where);
8464       return FAILURE;
8465     }
8466
8467   /* If the overridden binding is a FUNCTION, the overriding must also be a
8468      FUNCTION and have the same characteristics.  */
8469   if (old_target->attr.function)
8470     {
8471       if (!proc_target->attr.function)
8472         {
8473           gfc_error ("'%s' at %L overrides a FUNCTION and must also be a"
8474                      " FUNCTION", proc->name, &where);
8475           return FAILURE;
8476         }
8477
8478       /* FIXME:  Do more comprehensive checking (including, for instance, the
8479          rank and array-shape).  */
8480       gcc_assert (proc_target->result && old_target->result);
8481       if (!gfc_compare_types (&proc_target->result->ts,
8482                               &old_target->result->ts))
8483         {
8484           gfc_error ("'%s' at %L and the overridden FUNCTION should have"
8485                      " matching result types", proc->name, &where);
8486           return FAILURE;
8487         }
8488     }
8489
8490   /* If the overridden binding is PUBLIC, the overriding one must not be
8491      PRIVATE.  */
8492   if (old->n.tb->access == ACCESS_PUBLIC
8493       && proc->n.tb->access == ACCESS_PRIVATE)
8494     {
8495       gfc_error ("'%s' at %L overrides a PUBLIC procedure and must not be"
8496                  " PRIVATE", proc->name, &where);
8497       return FAILURE;
8498     }
8499
8500   /* Compare the formal argument lists of both procedures.  This is also abused
8501      to find the position of the passed-object dummy arguments of both
8502      bindings as at least the overridden one might not yet be resolved and we
8503      need those positions in the check below.  */
8504   proc_pass_arg = old_pass_arg = 0;
8505   if (!proc->n.tb->nopass && !proc->n.tb->pass_arg)
8506     proc_pass_arg = 1;
8507   if (!old->n.tb->nopass && !old->n.tb->pass_arg)
8508     old_pass_arg = 1;
8509   argpos = 1;
8510   for (proc_formal = proc_target->formal, old_formal = old_target->formal;
8511        proc_formal && old_formal;
8512        proc_formal = proc_formal->next, old_formal = old_formal->next)
8513     {
8514       if (proc->n.tb->pass_arg
8515           && !strcmp (proc->n.tb->pass_arg, proc_formal->sym->name))
8516         proc_pass_arg = argpos;
8517       if (old->n.tb->pass_arg
8518           && !strcmp (old->n.tb->pass_arg, old_formal->sym->name))
8519         old_pass_arg = argpos;
8520
8521       /* Check that the names correspond.  */
8522       if (strcmp (proc_formal->sym->name, old_formal->sym->name))
8523         {
8524           gfc_error ("Dummy argument '%s' of '%s' at %L should be named '%s' as"
8525                      " to match the corresponding argument of the overridden"
8526                      " procedure", proc_formal->sym->name, proc->name, &where,
8527                      old_formal->sym->name);
8528           return FAILURE;
8529         }
8530
8531       /* Check that the types correspond if neither is the passed-object
8532          argument.  */
8533       /* FIXME:  Do more comprehensive testing here.  */
8534       if (proc_pass_arg != argpos && old_pass_arg != argpos
8535           && !gfc_compare_types (&proc_formal->sym->ts, &old_formal->sym->ts))
8536         {
8537           gfc_error ("Types mismatch for dummy argument '%s' of '%s' %L in"
8538                      " in respect to the overridden procedure",
8539                      proc_formal->sym->name, proc->name, &where);
8540           return FAILURE;
8541         }
8542
8543       ++argpos;
8544     }
8545   if (proc_formal || old_formal)
8546     {
8547       gfc_error ("'%s' at %L must have the same number of formal arguments as"
8548                  " the overridden procedure", proc->name, &where);
8549       return FAILURE;
8550     }
8551
8552   /* If the overridden binding is NOPASS, the overriding one must also be
8553      NOPASS.  */
8554   if (old->n.tb->nopass && !proc->n.tb->nopass)
8555     {
8556       gfc_error ("'%s' at %L overrides a NOPASS binding and must also be"
8557                  " NOPASS", proc->name, &where);
8558       return FAILURE;
8559     }
8560
8561   /* If the overridden binding is PASS(x), the overriding one must also be
8562      PASS and the passed-object dummy arguments must correspond.  */
8563   if (!old->n.tb->nopass)
8564     {
8565       if (proc->n.tb->nopass)
8566         {
8567           gfc_error ("'%s' at %L overrides a binding with PASS and must also be"
8568                      " PASS", proc->name, &where);
8569           return FAILURE;
8570         }
8571
8572       if (proc_pass_arg != old_pass_arg)
8573         {
8574           gfc_error ("Passed-object dummy argument of '%s' at %L must be at"
8575                      " the same position as the passed-object dummy argument of"
8576                      " the overridden procedure", proc->name, &where);
8577           return FAILURE;
8578         }
8579     }
8580
8581   return SUCCESS;
8582 }
8583
8584
8585 /* Check if two GENERIC targets are ambiguous and emit an error is they are.  */
8586
8587 static gfc_try
8588 check_generic_tbp_ambiguity (gfc_tbp_generic* t1, gfc_tbp_generic* t2,
8589                              const char* generic_name, locus where)
8590 {
8591   gfc_symbol* sym1;
8592   gfc_symbol* sym2;
8593
8594   gcc_assert (t1->specific && t2->specific);
8595   gcc_assert (!t1->specific->is_generic);
8596   gcc_assert (!t2->specific->is_generic);
8597
8598   sym1 = t1->specific->u.specific->n.sym;
8599   sym2 = t2->specific->u.specific->n.sym;
8600
8601   /* Both must be SUBROUTINEs or both must be FUNCTIONs.  */
8602   if (sym1->attr.subroutine != sym2->attr.subroutine
8603       || sym1->attr.function != sym2->attr.function)
8604     {
8605       gfc_error ("'%s' and '%s' can't be mixed FUNCTION/SUBROUTINE for"
8606                  " GENERIC '%s' at %L",
8607                  sym1->name, sym2->name, generic_name, &where);
8608       return FAILURE;
8609     }
8610
8611   /* Compare the interfaces.  */
8612   if (gfc_compare_interfaces (sym1, sym2, 1, 0, NULL, 0))
8613     {
8614       gfc_error ("'%s' and '%s' for GENERIC '%s' at %L are ambiguous",
8615                  sym1->name, sym2->name, generic_name, &where);
8616       return FAILURE;
8617     }
8618
8619   return SUCCESS;
8620 }
8621
8622
8623 /* Resolve a GENERIC procedure binding for a derived type.  */
8624
8625 static gfc_try
8626 resolve_typebound_generic (gfc_symbol* derived, gfc_symtree* st)
8627 {
8628   gfc_tbp_generic* target;
8629   gfc_symtree* first_target;
8630   gfc_symbol* super_type;
8631   gfc_symtree* inherited;
8632   locus where;
8633
8634   gcc_assert (st->n.tb);
8635   gcc_assert (st->n.tb->is_generic);
8636
8637   where = st->n.tb->where;
8638   super_type = gfc_get_derived_super_type (derived);
8639
8640   /* Find the overridden binding if any.  */
8641   st->n.tb->overridden = NULL;
8642   if (super_type)
8643     {
8644       gfc_symtree* overridden;
8645       overridden = gfc_find_typebound_proc (super_type, NULL, st->name, true);
8646
8647       if (overridden && overridden->n.tb)
8648         st->n.tb->overridden = overridden->n.tb;
8649     }
8650
8651   /* Try to find the specific bindings for the symtrees in our target-list.  */
8652   gcc_assert (st->n.tb->u.generic);
8653   for (target = st->n.tb->u.generic; target; target = target->next)
8654     if (!target->specific)
8655       {
8656         gfc_typebound_proc* overridden_tbp;
8657         gfc_tbp_generic* g;
8658         const char* target_name;
8659
8660         target_name = target->specific_st->name;
8661
8662         /* Defined for this type directly.  */
8663         if (target->specific_st->n.tb)
8664           {
8665             target->specific = target->specific_st->n.tb;
8666             goto specific_found;
8667           }
8668
8669         /* Look for an inherited specific binding.  */
8670         if (super_type)
8671           {
8672             inherited = gfc_find_typebound_proc (super_type, NULL,
8673                                                  target_name, true);
8674
8675             if (inherited)
8676               {
8677                 gcc_assert (inherited->n.tb);
8678                 target->specific = inherited->n.tb;
8679                 goto specific_found;
8680               }
8681           }
8682
8683         gfc_error ("Undefined specific binding '%s' as target of GENERIC '%s'"
8684                    " at %L", target_name, st->name, &where);
8685         return FAILURE;
8686
8687         /* Once we've found the specific binding, check it is not ambiguous with
8688            other specifics already found or inherited for the same GENERIC.  */
8689 specific_found:
8690         gcc_assert (target->specific);
8691
8692         /* This must really be a specific binding!  */
8693         if (target->specific->is_generic)
8694           {
8695             gfc_error ("GENERIC '%s' at %L must target a specific binding,"
8696                        " '%s' is GENERIC, too", st->name, &where, target_name);
8697             return FAILURE;
8698           }
8699
8700         /* Check those already resolved on this type directly.  */
8701         for (g = st->n.tb->u.generic; g; g = g->next)
8702           if (g != target && g->specific
8703               && check_generic_tbp_ambiguity (target, g, st->name, where)
8704                   == FAILURE)
8705             return FAILURE;
8706
8707         /* Check for ambiguity with inherited specific targets.  */
8708         for (overridden_tbp = st->n.tb->overridden; overridden_tbp;
8709              overridden_tbp = overridden_tbp->overridden)
8710           if (overridden_tbp->is_generic)
8711             {
8712               for (g = overridden_tbp->u.generic; g; g = g->next)
8713                 {
8714                   gcc_assert (g->specific);
8715                   if (check_generic_tbp_ambiguity (target, g,
8716                                                    st->name, where) == FAILURE)
8717                     return FAILURE;
8718                 }
8719             }
8720       }
8721
8722   /* If we attempt to "overwrite" a specific binding, this is an error.  */
8723   if (st->n.tb->overridden && !st->n.tb->overridden->is_generic)
8724     {
8725       gfc_error ("GENERIC '%s' at %L can't overwrite specific binding with"
8726                  " the same name", st->name, &where);
8727       return FAILURE;
8728     }
8729
8730   /* Take the SUBROUTINE/FUNCTION attributes of the first specific target, as
8731      all must have the same attributes here.  */
8732   first_target = st->n.tb->u.generic->specific->u.specific;
8733   gcc_assert (first_target);
8734   st->n.tb->subroutine = first_target->n.sym->attr.subroutine;
8735   st->n.tb->function = first_target->n.sym->attr.function;
8736
8737   return SUCCESS;
8738 }
8739
8740
8741 /* Resolve the type-bound procedures for a derived type.  */
8742
8743 static gfc_symbol* resolve_bindings_derived;
8744 static gfc_try resolve_bindings_result;
8745
8746 static void
8747 resolve_typebound_procedure (gfc_symtree* stree)
8748 {
8749   gfc_symbol* proc;
8750   locus where;
8751   gfc_symbol* me_arg;
8752   gfc_symbol* super_type;
8753   gfc_component* comp;
8754
8755   gcc_assert (stree);
8756
8757   /* Undefined specific symbol from GENERIC target definition.  */
8758   if (!stree->n.tb)
8759     return;
8760
8761   if (stree->n.tb->error)
8762     return;
8763
8764   /* If this is a GENERIC binding, use that routine.  */
8765   if (stree->n.tb->is_generic)
8766     {
8767       if (resolve_typebound_generic (resolve_bindings_derived, stree)
8768             == FAILURE)
8769         goto error;
8770       return;
8771     }
8772
8773   /* Get the target-procedure to check it.  */
8774   gcc_assert (!stree->n.tb->is_generic);
8775   gcc_assert (stree->n.tb->u.specific);
8776   proc = stree->n.tb->u.specific->n.sym;
8777   where = stree->n.tb->where;
8778
8779   /* Default access should already be resolved from the parser.  */
8780   gcc_assert (stree->n.tb->access != ACCESS_UNKNOWN);
8781
8782   /* It should be a module procedure or an external procedure with explicit
8783      interface.  For DEFERRED bindings, abstract interfaces are ok as well.  */
8784   if ((!proc->attr.subroutine && !proc->attr.function)
8785       || (proc->attr.proc != PROC_MODULE
8786           && proc->attr.if_source != IFSRC_IFBODY)
8787       || (proc->attr.abstract && !stree->n.tb->deferred))
8788     {
8789       gfc_error ("'%s' must be a module procedure or an external procedure with"
8790                  " an explicit interface at %L", proc->name, &where);
8791       goto error;
8792     }
8793   stree->n.tb->subroutine = proc->attr.subroutine;
8794   stree->n.tb->function = proc->attr.function;
8795
8796   /* Find the super-type of the current derived type.  We could do this once and
8797      store in a global if speed is needed, but as long as not I believe this is
8798      more readable and clearer.  */
8799   super_type = gfc_get_derived_super_type (resolve_bindings_derived);
8800
8801   /* If PASS, resolve and check arguments if not already resolved / loaded
8802      from a .mod file.  */
8803   if (!stree->n.tb->nopass && stree->n.tb->pass_arg_num == 0)
8804     {
8805       if (stree->n.tb->pass_arg)
8806         {
8807           gfc_formal_arglist* i;
8808
8809           /* If an explicit passing argument name is given, walk the arg-list
8810              and look for it.  */
8811
8812           me_arg = NULL;
8813           stree->n.tb->pass_arg_num = 1;
8814           for (i = proc->formal; i; i = i->next)
8815             {
8816               if (!strcmp (i->sym->name, stree->n.tb->pass_arg))
8817                 {
8818                   me_arg = i->sym;
8819                   break;
8820                 }
8821               ++stree->n.tb->pass_arg_num;
8822             }
8823
8824           if (!me_arg)
8825             {
8826               gfc_error ("Procedure '%s' with PASS(%s) at %L has no"
8827                          " argument '%s'",
8828                          proc->name, stree->n.tb->pass_arg, &where,
8829                          stree->n.tb->pass_arg);
8830               goto error;
8831             }
8832         }
8833       else
8834         {
8835           /* Otherwise, take the first one; there should in fact be at least
8836              one.  */
8837           stree->n.tb->pass_arg_num = 1;
8838           if (!proc->formal)
8839             {
8840               gfc_error ("Procedure '%s' with PASS at %L must have at"
8841                          " least one argument", proc->name, &where);
8842               goto error;
8843             }
8844           me_arg = proc->formal->sym;
8845         }
8846
8847       /* Now check that the argument-type matches.  */
8848       gcc_assert (me_arg);
8849       if (me_arg->ts.type != BT_DERIVED
8850           || me_arg->ts.derived != resolve_bindings_derived)
8851         {
8852           gfc_error ("Argument '%s' of '%s' with PASS(%s) at %L must be of"
8853                      " the derived-type '%s'", me_arg->name, proc->name,
8854                      me_arg->name, &where, resolve_bindings_derived->name);
8855           goto error;
8856         }
8857
8858       gfc_warning ("Polymorphic entities are not yet implemented,"
8859                    " non-polymorphic passed-object dummy argument of '%s'"
8860                    " at %L accepted", proc->name, &where);
8861     }
8862
8863   /* If we are extending some type, check that we don't override a procedure
8864      flagged NON_OVERRIDABLE.  */
8865   stree->n.tb->overridden = NULL;
8866   if (super_type)
8867     {
8868       gfc_symtree* overridden;
8869       overridden = gfc_find_typebound_proc (super_type, NULL,
8870                                             stree->name, true);
8871
8872       if (overridden && overridden->n.tb)
8873         stree->n.tb->overridden = overridden->n.tb;
8874
8875       if (overridden && check_typebound_override (stree, overridden) == FAILURE)
8876         goto error;
8877     }
8878
8879   /* See if there's a name collision with a component directly in this type.  */
8880   for (comp = resolve_bindings_derived->components; comp; comp = comp->next)
8881     if (!strcmp (comp->name, stree->name))
8882       {
8883         gfc_error ("Procedure '%s' at %L has the same name as a component of"
8884                    " '%s'",
8885                    stree->name, &where, resolve_bindings_derived->name);
8886         goto error;
8887       }
8888
8889   /* Try to find a name collision with an inherited component.  */
8890   if (super_type && gfc_find_component (super_type, stree->name, true, true))
8891     {
8892       gfc_error ("Procedure '%s' at %L has the same name as an inherited"
8893                  " component of '%s'",
8894                  stree->name, &where, resolve_bindings_derived->name);
8895       goto error;
8896     }
8897
8898   stree->n.tb->error = 0;
8899   return;
8900
8901 error:
8902   resolve_bindings_result = FAILURE;
8903   stree->n.tb->error = 1;
8904 }
8905
8906 static gfc_try
8907 resolve_typebound_procedures (gfc_symbol* derived)
8908 {
8909   if (!derived->f2k_derived || !derived->f2k_derived->tb_sym_root)
8910     return SUCCESS;
8911
8912   resolve_bindings_derived = derived;
8913   resolve_bindings_result = SUCCESS;
8914   gfc_traverse_symtree (derived->f2k_derived->tb_sym_root,
8915                         &resolve_typebound_procedure);
8916
8917   return resolve_bindings_result;
8918 }
8919
8920
8921 /* Add a derived type to the dt_list.  The dt_list is used in trans-types.c
8922    to give all identical derived types the same backend_decl.  */
8923 static void
8924 add_dt_to_dt_list (gfc_symbol *derived)
8925 {
8926   gfc_dt_list *dt_list;
8927
8928   for (dt_list = gfc_derived_types; dt_list; dt_list = dt_list->next)
8929     if (derived == dt_list->derived)
8930       break;
8931
8932   if (dt_list == NULL)
8933     {
8934       dt_list = gfc_get_dt_list ();
8935       dt_list->next = gfc_derived_types;
8936       dt_list->derived = derived;
8937       gfc_derived_types = dt_list;
8938     }
8939 }
8940
8941
8942 /* Ensure that a derived-type is really not abstract, meaning that every
8943    inherited DEFERRED binding is overridden by a non-DEFERRED one.  */
8944
8945 static gfc_try
8946 ensure_not_abstract_walker (gfc_symbol* sub, gfc_symtree* st)
8947 {
8948   if (!st)
8949     return SUCCESS;
8950
8951   if (ensure_not_abstract_walker (sub, st->left) == FAILURE)
8952     return FAILURE;
8953   if (ensure_not_abstract_walker (sub, st->right) == FAILURE)
8954     return FAILURE;
8955
8956   if (st->n.tb && st->n.tb->deferred)
8957     {
8958       gfc_symtree* overriding;
8959       overriding = gfc_find_typebound_proc (sub, NULL, st->name, true);
8960       gcc_assert (overriding && overriding->n.tb);
8961       if (overriding->n.tb->deferred)
8962         {
8963           gfc_error ("Derived-type '%s' declared at %L must be ABSTRACT because"
8964                      " '%s' is DEFERRED and not overridden",
8965                      sub->name, &sub->declared_at, st->name);
8966           return FAILURE;
8967         }
8968     }
8969
8970   return SUCCESS;
8971 }
8972
8973 static gfc_try
8974 ensure_not_abstract (gfc_symbol* sub, gfc_symbol* ancestor)
8975 {
8976   /* The algorithm used here is to recursively travel up the ancestry of sub
8977      and for each ancestor-type, check all bindings.  If any of them is
8978      DEFERRED, look it up starting from sub and see if the found (overriding)
8979      binding is not DEFERRED.
8980      This is not the most efficient way to do this, but it should be ok and is
8981      clearer than something sophisticated.  */
8982
8983   gcc_assert (ancestor && ancestor->attr.abstract && !sub->attr.abstract);
8984
8985   /* Walk bindings of this ancestor.  */
8986   if (ancestor->f2k_derived)
8987     {
8988       gfc_try t;
8989       t = ensure_not_abstract_walker (sub, ancestor->f2k_derived->tb_sym_root);
8990       if (t == FAILURE)
8991         return FAILURE;
8992     }
8993
8994   /* Find next ancestor type and recurse on it.  */
8995   ancestor = gfc_get_derived_super_type (ancestor);
8996   if (ancestor)
8997     return ensure_not_abstract (sub, ancestor);
8998
8999   return SUCCESS;
9000 }
9001
9002
9003 static void resolve_symbol (gfc_symbol *sym);
9004
9005
9006 /* Resolve the components of a derived type.  */
9007
9008 static gfc_try
9009 resolve_fl_derived (gfc_symbol *sym)
9010 {
9011   gfc_symbol* super_type;
9012   gfc_component *c;
9013   int i;
9014
9015   super_type = gfc_get_derived_super_type (sym);
9016
9017   /* Ensure the extended type gets resolved before we do.  */
9018   if (super_type && resolve_fl_derived (super_type) == FAILURE)
9019     return FAILURE;
9020
9021   /* An ABSTRACT type must be extensible.  */
9022   if (sym->attr.abstract && (sym->attr.is_bind_c || sym->attr.sequence))
9023     {
9024       gfc_error ("Non-extensible derived-type '%s' at %L must not be ABSTRACT",
9025                  sym->name, &sym->declared_at);
9026       return FAILURE;
9027     }
9028
9029   for (c = sym->components; c != NULL; c = c->next)
9030     {
9031       if (c->attr.proc_pointer && c->ts.interface)
9032         {
9033           if (c->ts.interface->attr.procedure)
9034             gfc_error ("Interface '%s', used by procedure pointer component "
9035                        "'%s' at %L, is declared in a later PROCEDURE statement",
9036                        c->ts.interface->name, c->name, &c->loc);
9037
9038           /* Get the attributes from the interface (now resolved).  */
9039           if (c->ts.interface->attr.if_source
9040               || c->ts.interface->attr.intrinsic)
9041             {
9042               gfc_symbol *ifc = c->ts.interface;
9043
9044               if (ifc->formal && !ifc->formal_ns)
9045                 resolve_symbol (ifc);
9046
9047               if (ifc->attr.intrinsic)
9048                 resolve_intrinsic (ifc, &ifc->declared_at);
9049
9050               if (ifc->result)
9051                 {
9052                   c->ts = ifc->result->ts;
9053                   c->attr.allocatable = ifc->result->attr.allocatable;
9054                   c->attr.pointer = ifc->result->attr.pointer;
9055                   c->attr.dimension = ifc->result->attr.dimension;
9056                   c->as = gfc_copy_array_spec (ifc->result->as);
9057                 }
9058               else
9059                 {   
9060                   c->ts = ifc->ts;
9061                   c->attr.allocatable = ifc->attr.allocatable;
9062                   c->attr.pointer = ifc->attr.pointer;
9063                   c->attr.dimension = ifc->attr.dimension;
9064                   c->as = gfc_copy_array_spec (ifc->as);
9065                 }
9066               c->ts.interface = ifc;
9067               c->attr.function = ifc->attr.function;
9068               c->attr.subroutine = ifc->attr.subroutine;
9069               gfc_copy_formal_args_ppc (c, ifc);
9070
9071               c->attr.pure = ifc->attr.pure;
9072               c->attr.elemental = ifc->attr.elemental;
9073               c->attr.recursive = ifc->attr.recursive;
9074               c->attr.always_explicit = ifc->attr.always_explicit;
9075               /* Replace symbols in array spec.  */
9076               if (c->as)
9077                 {
9078                   int i;
9079                   for (i = 0; i < c->as->rank; i++)
9080                     {
9081                       gfc_expr_replace_comp (c->as->lower[i], c);
9082                       gfc_expr_replace_comp (c->as->upper[i], c);
9083                     }
9084                 }
9085               /* Copy char length.  */
9086               if (ifc->ts.cl)
9087                 {
9088                   c->ts.cl = gfc_get_charlen();
9089                   c->ts.cl->resolved = ifc->ts.cl->resolved;
9090                   c->ts.cl->length = gfc_copy_expr (ifc->ts.cl->length);
9091                   /* TODO: gfc_expr_replace_symbols (c->ts.cl->length, c);*/
9092                   /* Add charlen to namespace.  */
9093                   /*if (c->formal_ns)
9094                     {
9095                       c->ts.cl->next = c->formal_ns->cl_list;
9096                       c->formal_ns->cl_list = c->ts.cl;
9097                     }*/
9098                 }
9099             }
9100           else if (c->ts.interface->name[0] != '\0')
9101             {
9102               gfc_error ("Interface '%s' of procedure pointer component "
9103                          "'%s' at %L must be explicit", c->ts.interface->name,
9104                          c->name, &c->loc);
9105               return FAILURE;
9106             }
9107         }
9108       else if (c->attr.proc_pointer && c->ts.type == BT_UNKNOWN)
9109         {
9110           c->ts = *gfc_get_default_type (c->name, NULL);
9111           c->attr.implicit_type = 1;
9112         }
9113
9114       /* Check type-spec if this is not the parent-type component.  */
9115       if ((!sym->attr.extension || c != sym->components)
9116           && resolve_typespec_used (&c->ts, &c->loc, c->name) == FAILURE)
9117         return FAILURE;
9118
9119       /* If this type is an extension, see if this component has the same name
9120          as an inherited type-bound procedure.  */
9121       if (super_type
9122           && gfc_find_typebound_proc (super_type, NULL, c->name, true))
9123         {
9124           gfc_error ("Component '%s' of '%s' at %L has the same name as an"
9125                      " inherited type-bound procedure",
9126                      c->name, sym->name, &c->loc);
9127           return FAILURE;
9128         }
9129
9130       if (c->ts.type == BT_CHARACTER)
9131         {
9132          if (c->ts.cl->length == NULL
9133              || (resolve_charlen (c->ts.cl) == FAILURE)
9134              || !gfc_is_constant_expr (c->ts.cl->length))
9135            {
9136              gfc_error ("Character length of component '%s' needs to "
9137                         "be a constant specification expression at %L",
9138                         c->name,
9139                         c->ts.cl->length ? &c->ts.cl->length->where : &c->loc);
9140              return FAILURE;
9141            }
9142         }
9143
9144       if (c->ts.type == BT_DERIVED
9145           && sym->component_access != ACCESS_PRIVATE
9146           && gfc_check_access (sym->attr.access, sym->ns->default_access)
9147           && !is_sym_host_assoc (c->ts.derived, sym->ns)
9148           && !c->ts.derived->attr.use_assoc
9149           && !gfc_check_access (c->ts.derived->attr.access,
9150                                 c->ts.derived->ns->default_access)
9151           && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: the component '%s' "
9152                              "is a PRIVATE type and cannot be a component of "
9153                              "'%s', which is PUBLIC at %L", c->name,
9154                              sym->name, &sym->declared_at) == FAILURE)
9155         return FAILURE;
9156
9157       if (sym->attr.sequence)
9158         {
9159           if (c->ts.type == BT_DERIVED && c->ts.derived->attr.sequence == 0)
9160             {
9161               gfc_error ("Component %s of SEQUENCE type declared at %L does "
9162                          "not have the SEQUENCE attribute",
9163                          c->ts.derived->name, &sym->declared_at);
9164               return FAILURE;
9165             }
9166         }
9167
9168       if (c->ts.type == BT_DERIVED && c->attr.pointer
9169           && c->ts.derived->components == NULL
9170           && !c->ts.derived->attr.zero_comp)
9171         {
9172           gfc_error ("The pointer component '%s' of '%s' at %L is a type "
9173                      "that has not been declared", c->name, sym->name,
9174                      &c->loc);
9175           return FAILURE;
9176         }
9177
9178       /* Ensure that all the derived type components are put on the
9179          derived type list; even in formal namespaces, where derived type
9180          pointer components might not have been declared.  */
9181       if (c->ts.type == BT_DERIVED
9182             && c->ts.derived
9183             && c->ts.derived->components
9184             && c->attr.pointer
9185             && sym != c->ts.derived)
9186         add_dt_to_dt_list (c->ts.derived);
9187
9188       if (c->attr.pointer || c->attr.proc_pointer || c->attr.allocatable
9189           || c->as == NULL)
9190         continue;
9191
9192       for (i = 0; i < c->as->rank; i++)
9193         {
9194           if (c->as->lower[i] == NULL
9195               || (resolve_index_expr (c->as->lower[i]) == FAILURE)
9196               || !gfc_is_constant_expr (c->as->lower[i])
9197               || c->as->upper[i] == NULL
9198               || (resolve_index_expr (c->as->upper[i]) == FAILURE)
9199               || !gfc_is_constant_expr (c->as->upper[i]))
9200             {
9201               gfc_error ("Component '%s' of '%s' at %L must have "
9202                          "constant array bounds",
9203                          c->name, sym->name, &c->loc);
9204               return FAILURE;
9205             }
9206         }
9207     }
9208
9209   /* Resolve the type-bound procedures.  */
9210   if (resolve_typebound_procedures (sym) == FAILURE)
9211     return FAILURE;
9212
9213   /* Resolve the finalizer procedures.  */
9214   if (gfc_resolve_finalizers (sym) == FAILURE)
9215     return FAILURE;
9216
9217   /* If this is a non-ABSTRACT type extending an ABSTRACT one, ensure that
9218      all DEFERRED bindings are overridden.  */
9219   if (super_type && super_type->attr.abstract && !sym->attr.abstract
9220       && ensure_not_abstract (sym, super_type) == FAILURE)
9221     return FAILURE;
9222
9223   /* Add derived type to the derived type list.  */
9224   add_dt_to_dt_list (sym);
9225
9226   return SUCCESS;
9227 }
9228
9229
9230 static gfc_try
9231 resolve_fl_namelist (gfc_symbol *sym)
9232 {
9233   gfc_namelist *nl;
9234   gfc_symbol *nlsym;
9235
9236   /* Reject PRIVATE objects in a PUBLIC namelist.  */
9237   if (gfc_check_access(sym->attr.access, sym->ns->default_access))
9238     {
9239       for (nl = sym->namelist; nl; nl = nl->next)
9240         {
9241           if (!nl->sym->attr.use_assoc
9242               && !is_sym_host_assoc (nl->sym, sym->ns)
9243               && !gfc_check_access(nl->sym->attr.access,
9244                                 nl->sym->ns->default_access))
9245             {
9246               gfc_error ("NAMELIST object '%s' was declared PRIVATE and "
9247                          "cannot be member of PUBLIC namelist '%s' at %L",
9248                          nl->sym->name, sym->name, &sym->declared_at);
9249               return FAILURE;
9250             }
9251
9252           /* Types with private components that came here by USE-association.  */
9253           if (nl->sym->ts.type == BT_DERIVED
9254               && derived_inaccessible (nl->sym->ts.derived))
9255             {
9256               gfc_error ("NAMELIST object '%s' has use-associated PRIVATE "
9257                          "components and cannot be member of namelist '%s' at %L",
9258                          nl->sym->name, sym->name, &sym->declared_at);
9259               return FAILURE;
9260             }
9261
9262           /* Types with private components that are defined in the same module.  */
9263           if (nl->sym->ts.type == BT_DERIVED
9264               && !is_sym_host_assoc (nl->sym->ts.derived, sym->ns)
9265               && !gfc_check_access (nl->sym->ts.derived->attr.private_comp
9266                                         ? ACCESS_PRIVATE : ACCESS_UNKNOWN,
9267                                         nl->sym->ns->default_access))
9268             {
9269               gfc_error ("NAMELIST object '%s' has PRIVATE components and "
9270                          "cannot be a member of PUBLIC namelist '%s' at %L",
9271                          nl->sym->name, sym->name, &sym->declared_at);
9272               return FAILURE;
9273             }
9274         }
9275     }
9276
9277   for (nl = sym->namelist; nl; nl = nl->next)
9278     {
9279       /* Reject namelist arrays of assumed shape.  */
9280       if (nl->sym->as && nl->sym->as->type == AS_ASSUMED_SHAPE
9281           && gfc_notify_std (GFC_STD_F2003, "NAMELIST array object '%s' "
9282                              "must not have assumed shape in namelist "
9283                              "'%s' at %L", nl->sym->name, sym->name,
9284                              &sym->declared_at) == FAILURE)
9285             return FAILURE;
9286
9287       /* Reject namelist arrays that are not constant shape.  */
9288       if (is_non_constant_shape_array (nl->sym))
9289         {
9290           gfc_error ("NAMELIST array object '%s' must have constant "
9291                      "shape in namelist '%s' at %L", nl->sym->name,
9292                      sym->name, &sym->declared_at);
9293           return FAILURE;
9294         }
9295
9296       /* Namelist objects cannot have allocatable or pointer components.  */
9297       if (nl->sym->ts.type != BT_DERIVED)
9298         continue;
9299
9300       if (nl->sym->ts.derived->attr.alloc_comp)
9301         {
9302           gfc_error ("NAMELIST object '%s' in namelist '%s' at %L cannot "
9303                      "have ALLOCATABLE components",
9304                      nl->sym->name, sym->name, &sym->declared_at);
9305           return FAILURE;
9306         }
9307
9308       if (nl->sym->ts.derived->attr.pointer_comp)
9309         {
9310           gfc_error ("NAMELIST object '%s' in namelist '%s' at %L cannot "
9311                      "have POINTER components", 
9312                      nl->sym->name, sym->name, &sym->declared_at);
9313           return FAILURE;
9314         }
9315     }
9316
9317
9318   /* 14.1.2 A module or internal procedure represent local entities
9319      of the same type as a namelist member and so are not allowed.  */
9320   for (nl = sym->namelist; nl; nl = nl->next)
9321     {
9322       if (nl->sym->ts.kind != 0 && nl->sym->attr.flavor == FL_VARIABLE)
9323         continue;
9324
9325       if (nl->sym->attr.function && nl->sym == nl->sym->result)
9326         if ((nl->sym == sym->ns->proc_name)
9327                ||
9328             (sym->ns->parent && nl->sym == sym->ns->parent->proc_name))
9329           continue;
9330
9331       nlsym = NULL;
9332       if (nl->sym && nl->sym->name)
9333         gfc_find_symbol (nl->sym->name, sym->ns, 1, &nlsym);
9334       if (nlsym && nlsym->attr.flavor == FL_PROCEDURE)
9335         {
9336           gfc_error ("PROCEDURE attribute conflicts with NAMELIST "
9337                      "attribute in '%s' at %L", nlsym->name,
9338                      &sym->declared_at);
9339           return FAILURE;
9340         }
9341     }
9342
9343   return SUCCESS;
9344 }
9345
9346
9347 static gfc_try
9348 resolve_fl_parameter (gfc_symbol *sym)
9349 {
9350   /* A parameter array's shape needs to be constant.  */
9351   if (sym->as != NULL 
9352       && (sym->as->type == AS_DEFERRED
9353           || is_non_constant_shape_array (sym)))
9354     {
9355       gfc_error ("Parameter array '%s' at %L cannot be automatic "
9356                  "or of deferred shape", sym->name, &sym->declared_at);
9357       return FAILURE;
9358     }
9359
9360   /* Make sure a parameter that has been implicitly typed still
9361      matches the implicit type, since PARAMETER statements can precede
9362      IMPLICIT statements.  */
9363   if (sym->attr.implicit_type
9364       && !gfc_compare_types (&sym->ts, gfc_get_default_type (sym->name,
9365                                                              sym->ns)))
9366     {
9367       gfc_error ("Implicitly typed PARAMETER '%s' at %L doesn't match a "
9368                  "later IMPLICIT type", sym->name, &sym->declared_at);
9369       return FAILURE;
9370     }
9371
9372   /* Make sure the types of derived parameters are consistent.  This
9373      type checking is deferred until resolution because the type may
9374      refer to a derived type from the host.  */
9375   if (sym->ts.type == BT_DERIVED
9376       && !gfc_compare_types (&sym->ts, &sym->value->ts))
9377     {
9378       gfc_error ("Incompatible derived type in PARAMETER at %L",
9379                  &sym->value->where);
9380       return FAILURE;
9381     }
9382   return SUCCESS;
9383 }
9384
9385
9386 /* Do anything necessary to resolve a symbol.  Right now, we just
9387    assume that an otherwise unknown symbol is a variable.  This sort
9388    of thing commonly happens for symbols in module.  */
9389
9390 static void
9391 resolve_symbol (gfc_symbol *sym)
9392 {
9393   int check_constant, mp_flag;
9394   gfc_symtree *symtree;
9395   gfc_symtree *this_symtree;
9396   gfc_namespace *ns;
9397   gfc_component *c;
9398
9399   if (sym->attr.flavor == FL_UNKNOWN)
9400     {
9401
9402     /* If we find that a flavorless symbol is an interface in one of the
9403        parent namespaces, find its symtree in this namespace, free the
9404        symbol and set the symtree to point to the interface symbol.  */
9405       for (ns = gfc_current_ns->parent; ns; ns = ns->parent)
9406         {
9407           symtree = gfc_find_symtree (ns->sym_root, sym->name);
9408           if (symtree && symtree->n.sym->generic)
9409             {
9410               this_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
9411                                                sym->name);
9412               sym->refs--;
9413               if (!sym->refs)
9414                 gfc_free_symbol (sym);
9415               symtree->n.sym->refs++;
9416               this_symtree->n.sym = symtree->n.sym;
9417               return;
9418             }
9419         }
9420
9421       /* Otherwise give it a flavor according to such attributes as
9422          it has.  */
9423       if (sym->attr.external == 0 && sym->attr.intrinsic == 0)
9424         sym->attr.flavor = FL_VARIABLE;
9425       else
9426         {
9427           sym->attr.flavor = FL_PROCEDURE;
9428           if (sym->attr.dimension)
9429             sym->attr.function = 1;
9430         }
9431     }
9432
9433   if (sym->attr.external && sym->ts.type != BT_UNKNOWN && !sym->attr.function)
9434     gfc_add_function (&sym->attr, sym->name, &sym->declared_at);
9435
9436   if (sym->attr.procedure && sym->ts.interface
9437       && sym->attr.if_source != IFSRC_DECL)
9438     {
9439       if (sym->ts.interface == sym)
9440         {
9441           gfc_error ("PROCEDURE '%s' at %L may not be used as its own "
9442                      "interface", sym->name, &sym->declared_at);
9443           return;
9444         }
9445       if (sym->ts.interface->attr.procedure)
9446         {
9447           gfc_error ("Interface '%s', used by procedure '%s' at %L, is declared"
9448                      " in a later PROCEDURE statement", sym->ts.interface->name,
9449                      sym->name,&sym->declared_at);
9450           return;
9451         }
9452
9453       /* Get the attributes from the interface (now resolved).  */
9454       if (sym->ts.interface->attr.if_source
9455           || sym->ts.interface->attr.intrinsic)
9456         {
9457           gfc_symbol *ifc = sym->ts.interface;
9458           resolve_symbol (ifc);
9459
9460           if (ifc->attr.intrinsic)
9461             resolve_intrinsic (ifc, &ifc->declared_at);
9462
9463           if (ifc->result)
9464             sym->ts = ifc->result->ts;
9465           else   
9466             sym->ts = ifc->ts;
9467           sym->ts.interface = ifc;
9468           sym->attr.function = ifc->attr.function;
9469           sym->attr.subroutine = ifc->attr.subroutine;
9470           gfc_copy_formal_args (sym, ifc);
9471
9472           sym->attr.allocatable = ifc->attr.allocatable;
9473           sym->attr.pointer = ifc->attr.pointer;
9474           sym->attr.pure = ifc->attr.pure;
9475           sym->attr.elemental = ifc->attr.elemental;
9476           sym->attr.dimension = ifc->attr.dimension;
9477           sym->attr.recursive = ifc->attr.recursive;
9478           sym->attr.always_explicit = ifc->attr.always_explicit;
9479           /* Copy array spec.  */
9480           sym->as = gfc_copy_array_spec (ifc->as);
9481           if (sym->as)
9482             {
9483               int i;
9484               for (i = 0; i < sym->as->rank; i++)
9485                 {
9486                   gfc_expr_replace_symbols (sym->as->lower[i], sym);
9487                   gfc_expr_replace_symbols (sym->as->upper[i], sym);
9488                 }
9489             }
9490           /* Copy char length.  */
9491           if (ifc->ts.cl)
9492             {
9493               sym->ts.cl = gfc_get_charlen();
9494               sym->ts.cl->resolved = ifc->ts.cl->resolved;
9495               sym->ts.cl->length = gfc_copy_expr (ifc->ts.cl->length);
9496               gfc_expr_replace_symbols (sym->ts.cl->length, sym);
9497               /* Add charlen to namespace.  */
9498               if (sym->formal_ns)
9499                 {
9500                   sym->ts.cl->next = sym->formal_ns->cl_list;
9501                   sym->formal_ns->cl_list = sym->ts.cl;
9502                 }
9503             }
9504         }
9505       else if (sym->ts.interface->name[0] != '\0')
9506         {
9507           gfc_error ("Interface '%s' of procedure '%s' at %L must be explicit",
9508                     sym->ts.interface->name, sym->name, &sym->declared_at);
9509           return;
9510         }
9511     }
9512
9513   if (sym->attr.flavor == FL_DERIVED && resolve_fl_derived (sym) == FAILURE)
9514     return;
9515
9516   /* Symbols that are module procedures with results (functions) have
9517      the types and array specification copied for type checking in
9518      procedures that call them, as well as for saving to a module
9519      file.  These symbols can't stand the scrutiny that their results
9520      can.  */
9521   mp_flag = (sym->result != NULL && sym->result != sym);
9522
9523
9524   /* Make sure that the intrinsic is consistent with its internal 
9525      representation. This needs to be done before assigning a default 
9526      type to avoid spurious warnings.  */
9527   if (sym->attr.flavor != FL_MODULE && sym->attr.intrinsic)
9528     {
9529       gfc_intrinsic_sym* isym;
9530       const char* symstd;
9531
9532       /* We already know this one is an intrinsic, so we don't call
9533          gfc_is_intrinsic for full checking but rather use gfc_find_function and
9534          gfc_find_subroutine directly to check whether it is a function or
9535          subroutine.  */
9536
9537       if ((isym = gfc_find_function (sym->name)))
9538         {
9539           if (sym->ts.type != BT_UNKNOWN && gfc_option.warn_surprising
9540               && !sym->attr.implicit_type)
9541             gfc_warning ("Type specified for intrinsic function '%s' at %L is"
9542                          " ignored", sym->name, &sym->declared_at);
9543         }
9544       else if ((isym = gfc_find_subroutine (sym->name)))
9545         {
9546           if (sym->ts.type != BT_UNKNOWN && !sym->attr.implicit_type)
9547             {
9548               gfc_error ("Intrinsic subroutine '%s' at %L shall not have a type"
9549                          " specifier", sym->name, &sym->declared_at);
9550               return;
9551             }
9552         }
9553       else
9554         {
9555           gfc_error ("'%s' declared INTRINSIC at %L does not exist",
9556                      sym->name, &sym->declared_at);
9557           return;
9558         }
9559
9560       /* Check it is actually available in the standard settings.  */
9561       if (gfc_check_intrinsic_standard (isym, &symstd, false, sym->declared_at)
9562             == FAILURE)
9563         {
9564           gfc_error ("The intrinsic '%s' declared INTRINSIC at %L is not"
9565                      " available in the current standard settings but %s.  Use"
9566                      " an appropriate -std=* option or enable -fall-intrinsics"
9567                      " in order to use it.",
9568                      sym->name, &sym->declared_at, symstd);
9569           return;
9570         }
9571      }
9572
9573   /* Assign default type to symbols that need one and don't have one.  */
9574   if (sym->ts.type == BT_UNKNOWN)
9575     {
9576       if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER)
9577         gfc_set_default_type (sym, 1, NULL);
9578
9579       if (sym->attr.flavor == FL_PROCEDURE && sym->attr.external
9580           && !sym->attr.function && !sym->attr.subroutine
9581           && gfc_get_default_type (sym->name, sym->ns)->type == BT_UNKNOWN)
9582         gfc_add_subroutine (&sym->attr, sym->name, &sym->declared_at);
9583
9584       if (sym->attr.flavor == FL_PROCEDURE && sym->attr.function)
9585         {
9586           /* The specific case of an external procedure should emit an error
9587              in the case that there is no implicit type.  */
9588           if (!mp_flag)
9589             gfc_set_default_type (sym, sym->attr.external, NULL);
9590           else
9591             {
9592               /* Result may be in another namespace.  */
9593               resolve_symbol (sym->result);
9594
9595               if (!sym->result->attr.proc_pointer)
9596                 {
9597                   sym->ts = sym->result->ts;
9598                   sym->as = gfc_copy_array_spec (sym->result->as);
9599                   sym->attr.dimension = sym->result->attr.dimension;
9600                   sym->attr.pointer = sym->result->attr.pointer;
9601                   sym->attr.allocatable = sym->result->attr.allocatable;
9602                 }
9603             }
9604         }
9605     }
9606
9607   /* Assumed size arrays and assumed shape arrays must be dummy
9608      arguments.  */
9609
9610   if (sym->as != NULL
9611       && (sym->as->type == AS_ASSUMED_SIZE
9612           || sym->as->type == AS_ASSUMED_SHAPE)
9613       && sym->attr.dummy == 0)
9614     {
9615       if (sym->as->type == AS_ASSUMED_SIZE)
9616         gfc_error ("Assumed size array at %L must be a dummy argument",
9617                    &sym->declared_at);
9618       else
9619         gfc_error ("Assumed shape array at %L must be a dummy argument",
9620                    &sym->declared_at);
9621       return;
9622     }
9623
9624   /* Make sure symbols with known intent or optional are really dummy
9625      variable.  Because of ENTRY statement, this has to be deferred
9626      until resolution time.  */
9627
9628   if (!sym->attr.dummy
9629       && (sym->attr.optional || sym->attr.intent != INTENT_UNKNOWN))
9630     {
9631       gfc_error ("Symbol at %L is not a DUMMY variable", &sym->declared_at);
9632       return;
9633     }
9634
9635   if (sym->attr.value && !sym->attr.dummy)
9636     {
9637       gfc_error ("'%s' at %L cannot have the VALUE attribute because "
9638                  "it is not a dummy argument", sym->name, &sym->declared_at);
9639       return;
9640     }
9641
9642   if (sym->attr.value && sym->ts.type == BT_CHARACTER)
9643     {
9644       gfc_charlen *cl = sym->ts.cl;
9645       if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
9646         {
9647           gfc_error ("Character dummy variable '%s' at %L with VALUE "
9648                      "attribute must have constant length",
9649                      sym->name, &sym->declared_at);
9650           return;
9651         }
9652
9653       if (sym->ts.is_c_interop
9654           && mpz_cmp_si (cl->length->value.integer, 1) != 0)
9655         {
9656           gfc_error ("C interoperable character dummy variable '%s' at %L "
9657                      "with VALUE attribute must have length one",
9658                      sym->name, &sym->declared_at);
9659           return;
9660         }
9661     }
9662
9663   /* If the symbol is marked as bind(c), verify it's type and kind.  Do not
9664      do this for something that was implicitly typed because that is handled
9665      in gfc_set_default_type.  Handle dummy arguments and procedure
9666      definitions separately.  Also, anything that is use associated is not
9667      handled here but instead is handled in the module it is declared in.
9668      Finally, derived type definitions are allowed to be BIND(C) since that
9669      only implies that they're interoperable, and they are checked fully for
9670      interoperability when a variable is declared of that type.  */
9671   if (sym->attr.is_bind_c && sym->attr.implicit_type == 0 &&
9672       sym->attr.use_assoc == 0 && sym->attr.dummy == 0 &&
9673       sym->attr.flavor != FL_PROCEDURE && sym->attr.flavor != FL_DERIVED)
9674     {
9675       gfc_try t = SUCCESS;
9676       
9677       /* First, make sure the variable is declared at the
9678          module-level scope (J3/04-007, Section 15.3).  */
9679       if (sym->ns->proc_name->attr.flavor != FL_MODULE &&
9680           sym->attr.in_common == 0)
9681         {
9682           gfc_error ("Variable '%s' at %L cannot be BIND(C) because it "
9683                      "is neither a COMMON block nor declared at the "
9684                      "module level scope", sym->name, &(sym->declared_at));
9685           t = FAILURE;
9686         }
9687       else if (sym->common_head != NULL)
9688         {
9689           t = verify_com_block_vars_c_interop (sym->common_head);
9690         }
9691       else
9692         {
9693           /* If type() declaration, we need to verify that the components
9694              of the given type are all C interoperable, etc.  */
9695           if (sym->ts.type == BT_DERIVED &&
9696               sym->ts.derived->attr.is_c_interop != 1)
9697             {
9698               /* Make sure the user marked the derived type as BIND(C).  If
9699                  not, call the verify routine.  This could print an error
9700                  for the derived type more than once if multiple variables
9701                  of that type are declared.  */
9702               if (sym->ts.derived->attr.is_bind_c != 1)
9703                 verify_bind_c_derived_type (sym->ts.derived);
9704               t = FAILURE;
9705             }
9706           
9707           /* Verify the variable itself as C interoperable if it
9708              is BIND(C).  It is not possible for this to succeed if
9709              the verify_bind_c_derived_type failed, so don't have to handle
9710              any error returned by verify_bind_c_derived_type.  */
9711           t = verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
9712                                  sym->common_block);
9713         }
9714
9715       if (t == FAILURE)
9716         {
9717           /* clear the is_bind_c flag to prevent reporting errors more than
9718              once if something failed.  */
9719           sym->attr.is_bind_c = 0;
9720           return;
9721         }
9722     }
9723
9724   /* If a derived type symbol has reached this point, without its
9725      type being declared, we have an error.  Notice that most
9726      conditions that produce undefined derived types have already
9727      been dealt with.  However, the likes of:
9728      implicit type(t) (t) ..... call foo (t) will get us here if
9729      the type is not declared in the scope of the implicit
9730      statement. Change the type to BT_UNKNOWN, both because it is so
9731      and to prevent an ICE.  */
9732   if (sym->ts.type == BT_DERIVED && sym->ts.derived->components == NULL
9733       && !sym->ts.derived->attr.zero_comp)
9734     {
9735       gfc_error ("The derived type '%s' at %L is of type '%s', "
9736                  "which has not been defined", sym->name,
9737                   &sym->declared_at, sym->ts.derived->name);
9738       sym->ts.type = BT_UNKNOWN;
9739       return;
9740     }
9741
9742   /* Make sure that the derived type has been resolved and that the
9743      derived type is visible in the symbol's namespace, if it is a
9744      module function and is not PRIVATE.  */
9745   if (sym->ts.type == BT_DERIVED
9746         && sym->ts.derived->attr.use_assoc
9747         && sym->ns->proc_name
9748         && sym->ns->proc_name->attr.flavor == FL_MODULE)
9749     {
9750       gfc_symbol *ds;
9751
9752       if (resolve_fl_derived (sym->ts.derived) == FAILURE)
9753         return;
9754
9755       gfc_find_symbol (sym->ts.derived->name, sym->ns, 1, &ds);
9756       if (!ds && sym->attr.function
9757             && gfc_check_access (sym->attr.access, sym->ns->default_access))
9758         {
9759           symtree = gfc_new_symtree (&sym->ns->sym_root,
9760                                      sym->ts.derived->name);
9761           symtree->n.sym = sym->ts.derived;
9762           sym->ts.derived->refs++;
9763         }
9764     }
9765
9766   /* Unless the derived-type declaration is use associated, Fortran 95
9767      does not allow public entries of private derived types.
9768      See 4.4.1 (F95) and 4.5.1.1 (F2003); and related interpretation
9769      161 in 95-006r3.  */
9770   if (sym->ts.type == BT_DERIVED
9771       && sym->ns->proc_name && sym->ns->proc_name->attr.flavor == FL_MODULE
9772       && !sym->ts.derived->attr.use_assoc
9773       && gfc_check_access (sym->attr.access, sym->ns->default_access)
9774       && !gfc_check_access (sym->ts.derived->attr.access,
9775                             sym->ts.derived->ns->default_access)
9776       && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PUBLIC %s '%s' at %L "
9777                          "of PRIVATE derived type '%s'",
9778                          (sym->attr.flavor == FL_PARAMETER) ? "parameter"
9779                          : "variable", sym->name, &sym->declared_at,
9780                          sym->ts.derived->name) == FAILURE)
9781     return;
9782
9783   /* An assumed-size array with INTENT(OUT) shall not be of a type for which
9784      default initialization is defined (5.1.2.4.4).  */
9785   if (sym->ts.type == BT_DERIVED
9786       && sym->attr.dummy
9787       && sym->attr.intent == INTENT_OUT
9788       && sym->as
9789       && sym->as->type == AS_ASSUMED_SIZE)
9790     {
9791       for (c = sym->ts.derived->components; c; c = c->next)
9792         {
9793           if (c->initializer)
9794             {
9795               gfc_error ("The INTENT(OUT) dummy argument '%s' at %L is "
9796                          "ASSUMED SIZE and so cannot have a default initializer",
9797                          sym->name, &sym->declared_at);
9798               return;
9799             }
9800         }
9801     }
9802
9803   switch (sym->attr.flavor)
9804     {
9805     case FL_VARIABLE:
9806       if (resolve_fl_variable (sym, mp_flag) == FAILURE)
9807         return;
9808       break;
9809
9810     case FL_PROCEDURE:
9811       if (resolve_fl_procedure (sym, mp_flag) == FAILURE)
9812         return;
9813       break;
9814
9815     case FL_NAMELIST:
9816       if (resolve_fl_namelist (sym) == FAILURE)
9817         return;
9818       break;
9819
9820     case FL_PARAMETER:
9821       if (resolve_fl_parameter (sym) == FAILURE)
9822         return;
9823       break;
9824
9825     default:
9826       break;
9827     }
9828
9829   /* Resolve array specifier. Check as well some constraints
9830      on COMMON blocks.  */
9831
9832   check_constant = sym->attr.in_common && !sym->attr.pointer;
9833
9834   /* Set the formal_arg_flag so that check_conflict will not throw
9835      an error for host associated variables in the specification
9836      expression for an array_valued function.  */
9837   if (sym->attr.function && sym->as)
9838     formal_arg_flag = 1;
9839
9840   gfc_resolve_array_spec (sym->as, check_constant);
9841
9842   formal_arg_flag = 0;
9843
9844   /* Resolve formal namespaces.  */
9845   if (sym->formal_ns && sym->formal_ns != gfc_current_ns)
9846     gfc_resolve (sym->formal_ns);
9847
9848   /* Make sure the formal namespace is present.  */
9849   if (sym->formal && !sym->formal_ns)
9850     {
9851       gfc_formal_arglist *formal = sym->formal;
9852       while (formal && !formal->sym)
9853         formal = formal->next;
9854
9855       if (formal)
9856         {
9857           sym->formal_ns = formal->sym->ns;
9858           sym->formal_ns->refs++;
9859         }
9860     }
9861
9862   /* Check threadprivate restrictions.  */
9863   if (sym->attr.threadprivate && !sym->attr.save && !sym->ns->save_all
9864       && (!sym->attr.in_common
9865           && sym->module == NULL
9866           && (sym->ns->proc_name == NULL
9867               || sym->ns->proc_name->attr.flavor != FL_MODULE)))
9868     gfc_error ("Threadprivate at %L isn't SAVEd", &sym->declared_at);
9869
9870   /* If we have come this far we can apply default-initializers, as
9871      described in 14.7.5, to those variables that have not already
9872      been assigned one.  */
9873   if (sym->ts.type == BT_DERIVED
9874       && sym->attr.referenced
9875       && sym->ns == gfc_current_ns
9876       && !sym->value
9877       && !sym->attr.allocatable
9878       && !sym->attr.alloc_comp)
9879     {
9880       symbol_attribute *a = &sym->attr;
9881
9882       if ((!a->save && !a->dummy && !a->pointer
9883            && !a->in_common && !a->use_assoc
9884            && !(a->function && sym != sym->result))
9885           || (a->dummy && a->intent == INTENT_OUT))
9886         apply_default_init (sym);
9887     }
9888
9889   /* If this symbol has a type-spec, check it.  */
9890   if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER
9891       || (sym->attr.flavor == FL_PROCEDURE && sym->attr.function))
9892     if (resolve_typespec_used (&sym->ts, &sym->declared_at, sym->name)
9893           == FAILURE)
9894       return;
9895 }
9896
9897
9898 /************* Resolve DATA statements *************/
9899
9900 static struct
9901 {
9902   gfc_data_value *vnode;
9903   mpz_t left;
9904 }
9905 values;
9906
9907
9908 /* Advance the values structure to point to the next value in the data list.  */
9909
9910 static gfc_try
9911 next_data_value (void)
9912 {
9913   while (mpz_cmp_ui (values.left, 0) == 0)
9914     {
9915       if (!gfc_is_constant_expr (values.vnode->expr))
9916         gfc_error ("non-constant DATA value at %L",
9917                    &values.vnode->expr->where);
9918
9919       if (values.vnode->next == NULL)
9920         return FAILURE;
9921
9922       values.vnode = values.vnode->next;
9923       mpz_set (values.left, values.vnode->repeat);
9924     }
9925
9926   return SUCCESS;
9927 }
9928
9929
9930 static gfc_try
9931 check_data_variable (gfc_data_variable *var, locus *where)
9932 {
9933   gfc_expr *e;
9934   mpz_t size;
9935   mpz_t offset;
9936   gfc_try t;
9937   ar_type mark = AR_UNKNOWN;
9938   int i;
9939   mpz_t section_index[GFC_MAX_DIMENSIONS];
9940   gfc_ref *ref;
9941   gfc_array_ref *ar;
9942   gfc_symbol *sym;
9943   int has_pointer;
9944
9945   if (gfc_resolve_expr (var->expr) == FAILURE)
9946     return FAILURE;
9947
9948   ar = NULL;
9949   mpz_init_set_si (offset, 0);
9950   e = var->expr;
9951
9952   if (e->expr_type != EXPR_VARIABLE)
9953     gfc_internal_error ("check_data_variable(): Bad expression");
9954
9955   sym = e->symtree->n.sym;
9956
9957   if (sym->ns->is_block_data && !sym->attr.in_common)
9958     {
9959       gfc_error ("BLOCK DATA element '%s' at %L must be in COMMON",
9960                  sym->name, &sym->declared_at);
9961     }
9962
9963   if (e->ref == NULL && sym->as)
9964     {
9965       gfc_error ("DATA array '%s' at %L must be specified in a previous"
9966                  " declaration", sym->name, where);
9967       return FAILURE;
9968     }
9969
9970   has_pointer = sym->attr.pointer;
9971
9972   for (ref = e->ref; ref; ref = ref->next)
9973     {
9974       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
9975         has_pointer = 1;
9976
9977       if (has_pointer
9978             && ref->type == REF_ARRAY
9979             && ref->u.ar.type != AR_FULL)
9980           {
9981             gfc_error ("DATA element '%s' at %L is a pointer and so must "
9982                         "be a full array", sym->name, where);
9983             return FAILURE;
9984           }
9985     }
9986
9987   if (e->rank == 0 || has_pointer)
9988     {
9989       mpz_init_set_ui (size, 1);
9990       ref = NULL;
9991     }
9992   else
9993     {
9994       ref = e->ref;
9995
9996       /* Find the array section reference.  */
9997       for (ref = e->ref; ref; ref = ref->next)
9998         {
9999           if (ref->type != REF_ARRAY)
10000             continue;
10001           if (ref->u.ar.type == AR_ELEMENT)
10002             continue;
10003           break;
10004         }
10005       gcc_assert (ref);
10006
10007       /* Set marks according to the reference pattern.  */
10008       switch (ref->u.ar.type)
10009         {
10010         case AR_FULL:
10011           mark = AR_FULL;
10012           break;
10013
10014         case AR_SECTION:
10015           ar = &ref->u.ar;
10016           /* Get the start position of array section.  */
10017           gfc_get_section_index (ar, section_index, &offset);
10018           mark = AR_SECTION;
10019           break;
10020
10021         default:
10022           gcc_unreachable ();
10023         }
10024
10025       if (gfc_array_size (e, &size) == FAILURE)
10026         {
10027           gfc_error ("Nonconstant array section at %L in DATA statement",
10028                      &e->where);
10029           mpz_clear (offset);
10030           return FAILURE;
10031         }
10032     }
10033
10034   t = SUCCESS;
10035
10036   while (mpz_cmp_ui (size, 0) > 0)
10037     {
10038       if (next_data_value () == FAILURE)
10039         {
10040           gfc_error ("DATA statement at %L has more variables than values",
10041                      where);
10042           t = FAILURE;
10043           break;
10044         }
10045
10046       t = gfc_check_assign (var->expr, values.vnode->expr, 0);
10047       if (t == FAILURE)
10048         break;
10049
10050       /* If we have more than one element left in the repeat count,
10051          and we have more than one element left in the target variable,
10052          then create a range assignment.  */
10053       /* FIXME: Only done for full arrays for now, since array sections
10054          seem tricky.  */
10055       if (mark == AR_FULL && ref && ref->next == NULL
10056           && mpz_cmp_ui (values.left, 1) > 0 && mpz_cmp_ui (size, 1) > 0)
10057         {
10058           mpz_t range;
10059
10060           if (mpz_cmp (size, values.left) >= 0)
10061             {
10062               mpz_init_set (range, values.left);
10063               mpz_sub (size, size, values.left);
10064               mpz_set_ui (values.left, 0);
10065             }
10066           else
10067             {
10068               mpz_init_set (range, size);
10069               mpz_sub (values.left, values.left, size);
10070               mpz_set_ui (size, 0);
10071             }
10072
10073           gfc_assign_data_value_range (var->expr, values.vnode->expr,
10074                                        offset, range);
10075
10076           mpz_add (offset, offset, range);
10077           mpz_clear (range);
10078         }
10079
10080       /* Assign initial value to symbol.  */
10081       else
10082         {
10083           mpz_sub_ui (values.left, values.left, 1);
10084           mpz_sub_ui (size, size, 1);
10085
10086           t = gfc_assign_data_value (var->expr, values.vnode->expr, offset);
10087           if (t == FAILURE)
10088             break;
10089
10090           if (mark == AR_FULL)
10091             mpz_add_ui (offset, offset, 1);
10092
10093           /* Modify the array section indexes and recalculate the offset
10094              for next element.  */
10095           else if (mark == AR_SECTION)
10096             gfc_advance_section (section_index, ar, &offset);
10097         }
10098     }
10099
10100   if (mark == AR_SECTION)
10101     {
10102       for (i = 0; i < ar->dimen; i++)
10103         mpz_clear (section_index[i]);
10104     }
10105
10106   mpz_clear (size);
10107   mpz_clear (offset);
10108
10109   return t;
10110 }
10111
10112
10113 static gfc_try traverse_data_var (gfc_data_variable *, locus *);
10114
10115 /* Iterate over a list of elements in a DATA statement.  */
10116
10117 static gfc_try
10118 traverse_data_list (gfc_data_variable *var, locus *where)
10119 {
10120   mpz_t trip;
10121   iterator_stack frame;
10122   gfc_expr *e, *start, *end, *step;
10123   gfc_try retval = SUCCESS;
10124
10125   mpz_init (frame.value);
10126
10127   start = gfc_copy_expr (var->iter.start);
10128   end = gfc_copy_expr (var->iter.end);
10129   step = gfc_copy_expr (var->iter.step);
10130
10131   if (gfc_simplify_expr (start, 1) == FAILURE
10132       || start->expr_type != EXPR_CONSTANT)
10133     {
10134       gfc_error ("iterator start at %L does not simplify", &start->where);
10135       retval = FAILURE;
10136       goto cleanup;
10137     }
10138   if (gfc_simplify_expr (end, 1) == FAILURE
10139       || end->expr_type != EXPR_CONSTANT)
10140     {
10141       gfc_error ("iterator end at %L does not simplify", &end->where);
10142       retval = FAILURE;
10143       goto cleanup;
10144     }
10145   if (gfc_simplify_expr (step, 1) == FAILURE
10146       || step->expr_type != EXPR_CONSTANT)
10147     {
10148       gfc_error ("iterator step at %L does not simplify", &step->where);
10149       retval = FAILURE;
10150       goto cleanup;
10151     }
10152
10153   mpz_init_set (trip, end->value.integer);
10154   mpz_sub (trip, trip, start->value.integer);
10155   mpz_add (trip, trip, step->value.integer);
10156
10157   mpz_div (trip, trip, step->value.integer);
10158
10159   mpz_set (frame.value, start->value.integer);
10160
10161   frame.prev = iter_stack;
10162   frame.variable = var->iter.var->symtree;
10163   iter_stack = &frame;
10164
10165   while (mpz_cmp_ui (trip, 0) > 0)
10166     {
10167       if (traverse_data_var (var->list, where) == FAILURE)
10168         {
10169           mpz_clear (trip);
10170           retval = FAILURE;
10171           goto cleanup;
10172         }
10173
10174       e = gfc_copy_expr (var->expr);
10175       if (gfc_simplify_expr (e, 1) == FAILURE)
10176         {
10177           gfc_free_expr (e);
10178           mpz_clear (trip);
10179           retval = FAILURE;
10180           goto cleanup;
10181         }
10182
10183       mpz_add (frame.value, frame.value, step->value.integer);
10184
10185       mpz_sub_ui (trip, trip, 1);
10186     }
10187
10188   mpz_clear (trip);
10189 cleanup:
10190   mpz_clear (frame.value);
10191
10192   gfc_free_expr (start);
10193   gfc_free_expr (end);
10194   gfc_free_expr (step);
10195
10196   iter_stack = frame.prev;
10197   return retval;
10198 }
10199
10200
10201 /* Type resolve variables in the variable list of a DATA statement.  */
10202
10203 static gfc_try
10204 traverse_data_var (gfc_data_variable *var, locus *where)
10205 {
10206   gfc_try t;
10207
10208   for (; var; var = var->next)
10209     {
10210       if (var->expr == NULL)
10211         t = traverse_data_list (var, where);
10212       else
10213         t = check_data_variable (var, where);
10214
10215       if (t == FAILURE)
10216         return FAILURE;
10217     }
10218
10219   return SUCCESS;
10220 }
10221
10222
10223 /* Resolve the expressions and iterators associated with a data statement.
10224    This is separate from the assignment checking because data lists should
10225    only be resolved once.  */
10226
10227 static gfc_try
10228 resolve_data_variables (gfc_data_variable *d)
10229 {
10230   for (; d; d = d->next)
10231     {
10232       if (d->list == NULL)
10233         {
10234           if (gfc_resolve_expr (d->expr) == FAILURE)
10235             return FAILURE;
10236         }
10237       else
10238         {
10239           if (gfc_resolve_iterator (&d->iter, false) == FAILURE)
10240             return FAILURE;
10241
10242           if (resolve_data_variables (d->list) == FAILURE)
10243             return FAILURE;
10244         }
10245     }
10246
10247   return SUCCESS;
10248 }
10249
10250
10251 /* Resolve a single DATA statement.  We implement this by storing a pointer to
10252    the value list into static variables, and then recursively traversing the
10253    variables list, expanding iterators and such.  */
10254
10255 static void
10256 resolve_data (gfc_data *d)
10257 {
10258
10259   if (resolve_data_variables (d->var) == FAILURE)
10260     return;
10261
10262   values.vnode = d->value;
10263   if (d->value == NULL)
10264     mpz_set_ui (values.left, 0);
10265   else
10266     mpz_set (values.left, d->value->repeat);
10267
10268   if (traverse_data_var (d->var, &d->where) == FAILURE)
10269     return;
10270
10271   /* At this point, we better not have any values left.  */
10272
10273   if (next_data_value () == SUCCESS)
10274     gfc_error ("DATA statement at %L has more values than variables",
10275                &d->where);
10276 }
10277
10278
10279 /* 12.6 Constraint: In a pure subprogram any variable which is in common or
10280    accessed by host or use association, is a dummy argument to a pure function,
10281    is a dummy argument with INTENT (IN) to a pure subroutine, or an object that
10282    is storage associated with any such variable, shall not be used in the
10283    following contexts: (clients of this function).  */
10284
10285 /* Determines if a variable is not 'pure', i.e., not assignable within a pure
10286    procedure.  Returns zero if assignment is OK, nonzero if there is a
10287    problem.  */
10288 int
10289 gfc_impure_variable (gfc_symbol *sym)
10290 {
10291   gfc_symbol *proc;
10292
10293   if (sym->attr.use_assoc || sym->attr.in_common)
10294     return 1;
10295
10296   if (sym->ns != gfc_current_ns)
10297     return !sym->attr.function;
10298
10299   proc = sym->ns->proc_name;
10300   if (sym->attr.dummy && gfc_pure (proc)
10301         && ((proc->attr.subroutine && sym->attr.intent == INTENT_IN)
10302                 ||
10303              proc->attr.function))
10304     return 1;
10305
10306   /* TODO: Sort out what can be storage associated, if anything, and include
10307      it here.  In principle equivalences should be scanned but it does not
10308      seem to be possible to storage associate an impure variable this way.  */
10309   return 0;
10310 }
10311
10312
10313 /* Test whether a symbol is pure or not.  For a NULL pointer, checks the
10314    symbol of the current procedure.  */
10315
10316 int
10317 gfc_pure (gfc_symbol *sym)
10318 {
10319   symbol_attribute attr;
10320
10321   if (sym == NULL)
10322     sym = gfc_current_ns->proc_name;
10323   if (sym == NULL)
10324     return 0;
10325
10326   attr = sym->attr;
10327
10328   return attr.flavor == FL_PROCEDURE && (attr.pure || attr.elemental);
10329 }
10330
10331
10332 /* Test whether the current procedure is elemental or not.  */
10333
10334 int
10335 gfc_elemental (gfc_symbol *sym)
10336 {
10337   symbol_attribute attr;
10338
10339   if (sym == NULL)
10340     sym = gfc_current_ns->proc_name;
10341   if (sym == NULL)
10342     return 0;
10343   attr = sym->attr;
10344
10345   return attr.flavor == FL_PROCEDURE && attr.elemental;
10346 }
10347
10348
10349 /* Warn about unused labels.  */
10350
10351 static void
10352 warn_unused_fortran_label (gfc_st_label *label)
10353 {
10354   if (label == NULL)
10355     return;
10356
10357   warn_unused_fortran_label (label->left);
10358
10359   if (label->defined == ST_LABEL_UNKNOWN)
10360     return;
10361
10362   switch (label->referenced)
10363     {
10364     case ST_LABEL_UNKNOWN:
10365       gfc_warning ("Label %d at %L defined but not used", label->value,
10366                    &label->where);
10367       break;
10368
10369     case ST_LABEL_BAD_TARGET:
10370       gfc_warning ("Label %d at %L defined but cannot be used",
10371                    label->value, &label->where);
10372       break;
10373
10374     default:
10375       break;
10376     }
10377
10378   warn_unused_fortran_label (label->right);
10379 }
10380
10381
10382 /* Returns the sequence type of a symbol or sequence.  */
10383
10384 static seq_type
10385 sequence_type (gfc_typespec ts)
10386 {
10387   seq_type result;
10388   gfc_component *c;
10389
10390   switch (ts.type)
10391   {
10392     case BT_DERIVED:
10393
10394       if (ts.derived->components == NULL)
10395         return SEQ_NONDEFAULT;
10396
10397       result = sequence_type (ts.derived->components->ts);
10398       for (c = ts.derived->components->next; c; c = c->next)
10399         if (sequence_type (c->ts) != result)
10400           return SEQ_MIXED;
10401
10402       return result;
10403
10404     case BT_CHARACTER:
10405       if (ts.kind != gfc_default_character_kind)
10406           return SEQ_NONDEFAULT;
10407
10408       return SEQ_CHARACTER;
10409
10410     case BT_INTEGER:
10411       if (ts.kind != gfc_default_integer_kind)
10412           return SEQ_NONDEFAULT;
10413
10414       return SEQ_NUMERIC;
10415
10416     case BT_REAL:
10417       if (!(ts.kind == gfc_default_real_kind
10418             || ts.kind == gfc_default_double_kind))
10419           return SEQ_NONDEFAULT;
10420
10421       return SEQ_NUMERIC;
10422
10423     case BT_COMPLEX:
10424       if (ts.kind != gfc_default_complex_kind)
10425           return SEQ_NONDEFAULT;
10426
10427       return SEQ_NUMERIC;
10428
10429     case BT_LOGICAL:
10430       if (ts.kind != gfc_default_logical_kind)
10431           return SEQ_NONDEFAULT;
10432
10433       return SEQ_NUMERIC;
10434
10435     default:
10436       return SEQ_NONDEFAULT;
10437   }
10438 }
10439
10440
10441 /* Resolve derived type EQUIVALENCE object.  */
10442
10443 static gfc_try
10444 resolve_equivalence_derived (gfc_symbol *derived, gfc_symbol *sym, gfc_expr *e)
10445 {
10446   gfc_symbol *d;
10447   gfc_component *c = derived->components;
10448
10449   if (!derived)
10450     return SUCCESS;
10451
10452   /* Shall not be an object of nonsequence derived type.  */
10453   if (!derived->attr.sequence)
10454     {
10455       gfc_error ("Derived type variable '%s' at %L must have SEQUENCE "
10456                  "attribute to be an EQUIVALENCE object", sym->name,
10457                  &e->where);
10458       return FAILURE;
10459     }
10460
10461   /* Shall not have allocatable components.  */
10462   if (derived->attr.alloc_comp)
10463     {
10464       gfc_error ("Derived type variable '%s' at %L cannot have ALLOCATABLE "
10465                  "components to be an EQUIVALENCE object",sym->name,
10466                  &e->where);
10467       return FAILURE;
10468     }
10469
10470   if (sym->attr.in_common && has_default_initializer (sym->ts.derived))
10471     {
10472       gfc_error ("Derived type variable '%s' at %L with default "
10473                  "initialization cannot be in EQUIVALENCE with a variable "
10474                  "in COMMON", sym->name, &e->where);
10475       return FAILURE;
10476     }
10477
10478   for (; c ; c = c->next)
10479     {
10480       d = c->ts.derived;
10481       if (d
10482           && (resolve_equivalence_derived (c->ts.derived, sym, e) == FAILURE))
10483         return FAILURE;
10484
10485       /* Shall not be an object of sequence derived type containing a pointer
10486          in the structure.  */
10487       if (c->attr.pointer)
10488         {
10489           gfc_error ("Derived type variable '%s' at %L with pointer "
10490                      "component(s) cannot be an EQUIVALENCE object",
10491                      sym->name, &e->where);
10492           return FAILURE;
10493         }
10494     }
10495   return SUCCESS;
10496 }
10497
10498
10499 /* Resolve equivalence object. 
10500    An EQUIVALENCE object shall not be a dummy argument, a pointer, a target,
10501    an allocatable array, an object of nonsequence derived type, an object of
10502    sequence derived type containing a pointer at any level of component
10503    selection, an automatic object, a function name, an entry name, a result
10504    name, a named constant, a structure component, or a subobject of any of
10505    the preceding objects.  A substring shall not have length zero.  A
10506    derived type shall not have components with default initialization nor
10507    shall two objects of an equivalence group be initialized.
10508    Either all or none of the objects shall have an protected attribute.
10509    The simple constraints are done in symbol.c(check_conflict) and the rest
10510    are implemented here.  */
10511
10512 static void
10513 resolve_equivalence (gfc_equiv *eq)
10514 {
10515   gfc_symbol *sym;
10516   gfc_symbol *derived;
10517   gfc_symbol *first_sym;
10518   gfc_expr *e;
10519   gfc_ref *r;
10520   locus *last_where = NULL;
10521   seq_type eq_type, last_eq_type;
10522   gfc_typespec *last_ts;
10523   int object, cnt_protected;
10524   const char *value_name;
10525   const char *msg;
10526
10527   value_name = NULL;
10528   last_ts = &eq->expr->symtree->n.sym->ts;
10529
10530   first_sym = eq->expr->symtree->n.sym;
10531
10532   cnt_protected = 0;
10533
10534   for (object = 1; eq; eq = eq->eq, object++)
10535     {
10536       e = eq->expr;
10537
10538       e->ts = e->symtree->n.sym->ts;
10539       /* match_varspec might not know yet if it is seeing
10540          array reference or substring reference, as it doesn't
10541          know the types.  */
10542       if (e->ref && e->ref->type == REF_ARRAY)
10543         {
10544           gfc_ref *ref = e->ref;
10545           sym = e->symtree->n.sym;
10546
10547           if (sym->attr.dimension)
10548             {
10549               ref->u.ar.as = sym->as;
10550               ref = ref->next;
10551             }
10552
10553           /* For substrings, convert REF_ARRAY into REF_SUBSTRING.  */
10554           if (e->ts.type == BT_CHARACTER
10555               && ref
10556               && ref->type == REF_ARRAY
10557               && ref->u.ar.dimen == 1
10558               && ref->u.ar.dimen_type[0] == DIMEN_RANGE
10559               && ref->u.ar.stride[0] == NULL)
10560             {
10561               gfc_expr *start = ref->u.ar.start[0];
10562               gfc_expr *end = ref->u.ar.end[0];
10563               void *mem = NULL;
10564
10565               /* Optimize away the (:) reference.  */
10566               if (start == NULL && end == NULL)
10567                 {
10568                   if (e->ref == ref)
10569                     e->ref = ref->next;
10570                   else
10571                     e->ref->next = ref->next;
10572                   mem = ref;
10573                 }
10574               else
10575                 {
10576                   ref->type = REF_SUBSTRING;
10577                   if (start == NULL)
10578                     start = gfc_int_expr (1);
10579                   ref->u.ss.start = start;
10580                   if (end == NULL && e->ts.cl)
10581                     end = gfc_copy_expr (e->ts.cl->length);
10582                   ref->u.ss.end = end;
10583                   ref->u.ss.length = e->ts.cl;
10584                   e->ts.cl = NULL;
10585                 }
10586               ref = ref->next;
10587               gfc_free (mem);
10588             }
10589
10590           /* Any further ref is an error.  */
10591           if (ref)
10592             {
10593               gcc_assert (ref->type == REF_ARRAY);
10594               gfc_error ("Syntax error in EQUIVALENCE statement at %L",
10595                          &ref->u.ar.where);
10596               continue;
10597             }
10598         }
10599
10600       if (gfc_resolve_expr (e) == FAILURE)
10601         continue;
10602
10603       sym = e->symtree->n.sym;
10604
10605       if (sym->attr.is_protected)
10606         cnt_protected++;
10607       if (cnt_protected > 0 && cnt_protected != object)
10608         {
10609               gfc_error ("Either all or none of the objects in the "
10610                          "EQUIVALENCE set at %L shall have the "
10611                          "PROTECTED attribute",
10612                          &e->where);
10613               break;
10614         }
10615
10616       /* Shall not equivalence common block variables in a PURE procedure.  */
10617       if (sym->ns->proc_name
10618           && sym->ns->proc_name->attr.pure
10619           && sym->attr.in_common)
10620         {
10621           gfc_error ("Common block member '%s' at %L cannot be an EQUIVALENCE "
10622                      "object in the pure procedure '%s'",
10623                      sym->name, &e->where, sym->ns->proc_name->name);
10624           break;
10625         }
10626
10627       /* Shall not be a named constant.  */
10628       if (e->expr_type == EXPR_CONSTANT)
10629         {
10630           gfc_error ("Named constant '%s' at %L cannot be an EQUIVALENCE "
10631                      "object", sym->name, &e->where);
10632           continue;
10633         }
10634
10635       derived = e->ts.derived;
10636       if (derived && resolve_equivalence_derived (derived, sym, e) == FAILURE)
10637         continue;
10638
10639       /* Check that the types correspond correctly:
10640          Note 5.28:
10641          A numeric sequence structure may be equivalenced to another sequence
10642          structure, an object of default integer type, default real type, double
10643          precision real type, default logical type such that components of the
10644          structure ultimately only become associated to objects of the same
10645          kind. A character sequence structure may be equivalenced to an object
10646          of default character kind or another character sequence structure.
10647          Other objects may be equivalenced only to objects of the same type and
10648          kind parameters.  */
10649
10650       /* Identical types are unconditionally OK.  */
10651       if (object == 1 || gfc_compare_types (last_ts, &sym->ts))
10652         goto identical_types;
10653
10654       last_eq_type = sequence_type (*last_ts);
10655       eq_type = sequence_type (sym->ts);
10656
10657       /* Since the pair of objects is not of the same type, mixed or
10658          non-default sequences can be rejected.  */
10659
10660       msg = "Sequence %s with mixed components in EQUIVALENCE "
10661             "statement at %L with different type objects";
10662       if ((object ==2
10663            && last_eq_type == SEQ_MIXED
10664            && gfc_notify_std (GFC_STD_GNU, msg, first_sym->name, last_where)
10665               == FAILURE)
10666           || (eq_type == SEQ_MIXED
10667               && gfc_notify_std (GFC_STD_GNU, msg, sym->name,
10668                                  &e->where) == FAILURE))
10669         continue;
10670
10671       msg = "Non-default type object or sequence %s in EQUIVALENCE "
10672             "statement at %L with objects of different type";
10673       if ((object ==2
10674            && last_eq_type == SEQ_NONDEFAULT
10675            && gfc_notify_std (GFC_STD_GNU, msg, first_sym->name,
10676                               last_where) == FAILURE)
10677           || (eq_type == SEQ_NONDEFAULT
10678               && gfc_notify_std (GFC_STD_GNU, msg, sym->name,
10679                                  &e->where) == FAILURE))
10680         continue;
10681
10682       msg ="Non-CHARACTER object '%s' in default CHARACTER "
10683            "EQUIVALENCE statement at %L";
10684       if (last_eq_type == SEQ_CHARACTER
10685           && eq_type != SEQ_CHARACTER
10686           && gfc_notify_std (GFC_STD_GNU, msg, sym->name,
10687                              &e->where) == FAILURE)
10688                 continue;
10689
10690       msg ="Non-NUMERIC object '%s' in default NUMERIC "
10691            "EQUIVALENCE statement at %L";
10692       if (last_eq_type == SEQ_NUMERIC
10693           && eq_type != SEQ_NUMERIC
10694           && gfc_notify_std (GFC_STD_GNU, msg, sym->name,
10695                              &e->where) == FAILURE)
10696                 continue;
10697
10698   identical_types:
10699       last_ts =&sym->ts;
10700       last_where = &e->where;
10701
10702       if (!e->ref)
10703         continue;
10704
10705       /* Shall not be an automatic array.  */
10706       if (e->ref->type == REF_ARRAY
10707           && gfc_resolve_array_spec (e->ref->u.ar.as, 1) == FAILURE)
10708         {
10709           gfc_error ("Array '%s' at %L with non-constant bounds cannot be "
10710                      "an EQUIVALENCE object", sym->name, &e->where);
10711           continue;
10712         }
10713
10714       r = e->ref;
10715       while (r)
10716         {
10717           /* Shall not be a structure component.  */
10718           if (r->type == REF_COMPONENT)
10719             {
10720               gfc_error ("Structure component '%s' at %L cannot be an "
10721                          "EQUIVALENCE object",
10722                          r->u.c.component->name, &e->where);
10723               break;
10724             }
10725
10726           /* A substring shall not have length zero.  */
10727           if (r->type == REF_SUBSTRING)
10728             {
10729               if (compare_bound (r->u.ss.start, r->u.ss.end) == CMP_GT)
10730                 {
10731                   gfc_error ("Substring at %L has length zero",
10732                              &r->u.ss.start->where);
10733                   break;
10734                 }
10735             }
10736           r = r->next;
10737         }
10738     }
10739 }
10740
10741
10742 /* Resolve function and ENTRY types, issue diagnostics if needed.  */
10743
10744 static void
10745 resolve_fntype (gfc_namespace *ns)
10746 {
10747   gfc_entry_list *el;
10748   gfc_symbol *sym;
10749
10750   if (ns->proc_name == NULL || !ns->proc_name->attr.function)
10751     return;
10752
10753   /* If there are any entries, ns->proc_name is the entry master
10754      synthetic symbol and ns->entries->sym actual FUNCTION symbol.  */
10755   if (ns->entries)
10756     sym = ns->entries->sym;
10757   else
10758     sym = ns->proc_name;
10759   if (sym->result == sym
10760       && sym->ts.type == BT_UNKNOWN
10761       && gfc_set_default_type (sym, 0, NULL) == FAILURE
10762       && !sym->attr.untyped)
10763     {
10764       gfc_error ("Function '%s' at %L has no IMPLICIT type",
10765                  sym->name, &sym->declared_at);
10766       sym->attr.untyped = 1;
10767     }
10768
10769   if (sym->ts.type == BT_DERIVED && !sym->ts.derived->attr.use_assoc
10770       && !sym->attr.contained
10771       && !gfc_check_access (sym->ts.derived->attr.access,
10772                             sym->ts.derived->ns->default_access)
10773       && gfc_check_access (sym->attr.access, sym->ns->default_access))
10774     {
10775       gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PUBLIC function '%s' at "
10776                       "%L of PRIVATE type '%s'", sym->name,
10777                       &sym->declared_at, sym->ts.derived->name);
10778     }
10779
10780     if (ns->entries)
10781     for (el = ns->entries->next; el; el = el->next)
10782       {
10783         if (el->sym->result == el->sym
10784             && el->sym->ts.type == BT_UNKNOWN
10785             && gfc_set_default_type (el->sym, 0, NULL) == FAILURE
10786             && !el->sym->attr.untyped)
10787           {
10788             gfc_error ("ENTRY '%s' at %L has no IMPLICIT type",
10789                        el->sym->name, &el->sym->declared_at);
10790             el->sym->attr.untyped = 1;
10791           }
10792       }
10793 }
10794
10795 /* 12.3.2.1.1 Defined operators.  */
10796
10797 static void
10798 gfc_resolve_uops (gfc_symtree *symtree)
10799 {
10800   gfc_interface *itr;
10801   gfc_symbol *sym;
10802   gfc_formal_arglist *formal;
10803
10804   if (symtree == NULL)
10805     return;
10806
10807   gfc_resolve_uops (symtree->left);
10808   gfc_resolve_uops (symtree->right);
10809
10810   for (itr = symtree->n.uop->op; itr; itr = itr->next)
10811     {
10812       sym = itr->sym;
10813       if (!sym->attr.function)
10814         gfc_error ("User operator procedure '%s' at %L must be a FUNCTION",
10815                    sym->name, &sym->declared_at);
10816
10817       if (sym->ts.type == BT_CHARACTER
10818           && !(sym->ts.cl && sym->ts.cl->length)
10819           && !(sym->result && sym->result->ts.cl
10820                && sym->result->ts.cl->length))
10821         gfc_error ("User operator procedure '%s' at %L cannot be assumed "
10822                    "character length", sym->name, &sym->declared_at);
10823
10824       formal = sym->formal;
10825       if (!formal || !formal->sym)
10826         {
10827           gfc_error ("User operator procedure '%s' at %L must have at least "
10828                      "one argument", sym->name, &sym->declared_at);
10829           continue;
10830         }
10831
10832       if (formal->sym->attr.intent != INTENT_IN)
10833         gfc_error ("First argument of operator interface at %L must be "
10834                    "INTENT(IN)", &sym->declared_at);
10835
10836       if (formal->sym->attr.optional)
10837         gfc_error ("First argument of operator interface at %L cannot be "
10838                    "optional", &sym->declared_at);
10839
10840       formal = formal->next;
10841       if (!formal || !formal->sym)
10842         continue;
10843
10844       if (formal->sym->attr.intent != INTENT_IN)
10845         gfc_error ("Second argument of operator interface at %L must be "
10846                    "INTENT(IN)", &sym->declared_at);
10847
10848       if (formal->sym->attr.optional)
10849         gfc_error ("Second argument of operator interface at %L cannot be "
10850                    "optional", &sym->declared_at);
10851
10852       if (formal->next)
10853         gfc_error ("Operator interface at %L must have, at most, two "
10854                    "arguments", &sym->declared_at);
10855     }
10856 }
10857
10858
10859 /* Examine all of the expressions associated with a program unit,
10860    assign types to all intermediate expressions, make sure that all
10861    assignments are to compatible types and figure out which names
10862    refer to which functions or subroutines.  It doesn't check code
10863    block, which is handled by resolve_code.  */
10864
10865 static void
10866 resolve_types (gfc_namespace *ns)
10867 {
10868   gfc_namespace *n;
10869   gfc_charlen *cl;
10870   gfc_data *d;
10871   gfc_equiv *eq;
10872   gfc_namespace* old_ns = gfc_current_ns;
10873
10874   /* Check that all IMPLICIT types are ok.  */
10875   if (!ns->seen_implicit_none)
10876     {
10877       unsigned letter;
10878       for (letter = 0; letter != GFC_LETTERS; ++letter)
10879         if (ns->set_flag[letter]
10880             && resolve_typespec_used (&ns->default_type[letter],
10881                                       &ns->implicit_loc[letter],
10882                                       NULL) == FAILURE)
10883           return;
10884     }
10885
10886   gfc_current_ns = ns;
10887
10888   resolve_entries (ns);
10889
10890   resolve_common_vars (ns->blank_common.head, false);
10891   resolve_common_blocks (ns->common_root);
10892
10893   resolve_contained_functions (ns);
10894
10895   gfc_traverse_ns (ns, resolve_bind_c_derived_types);
10896
10897   for (cl = ns->cl_list; cl; cl = cl->next)
10898     resolve_charlen (cl);
10899
10900   gfc_traverse_ns (ns, resolve_symbol);
10901
10902   resolve_fntype (ns);
10903
10904   for (n = ns->contained; n; n = n->sibling)
10905     {
10906       if (gfc_pure (ns->proc_name) && !gfc_pure (n->proc_name))
10907         gfc_error ("Contained procedure '%s' at %L of a PURE procedure must "
10908                    "also be PURE", n->proc_name->name,
10909                    &n->proc_name->declared_at);
10910
10911       resolve_types (n);
10912     }
10913
10914   forall_flag = 0;
10915   gfc_check_interfaces (ns);
10916
10917   gfc_traverse_ns (ns, resolve_values);
10918
10919   if (ns->save_all)
10920     gfc_save_all (ns);
10921
10922   iter_stack = NULL;
10923   for (d = ns->data; d; d = d->next)
10924     resolve_data (d);
10925
10926   iter_stack = NULL;
10927   gfc_traverse_ns (ns, gfc_formalize_init_value);
10928
10929   gfc_traverse_ns (ns, gfc_verify_binding_labels);
10930
10931   if (ns->common_root != NULL)
10932     gfc_traverse_symtree (ns->common_root, resolve_bind_c_comms);
10933
10934   for (eq = ns->equiv; eq; eq = eq->next)
10935     resolve_equivalence (eq);
10936
10937   /* Warn about unused labels.  */
10938   if (warn_unused_label)
10939     warn_unused_fortran_label (ns->st_labels);
10940
10941   gfc_resolve_uops (ns->uop_root);
10942
10943   gfc_current_ns = old_ns;
10944 }
10945
10946
10947 /* Call resolve_code recursively.  */
10948
10949 static void
10950 resolve_codes (gfc_namespace *ns)
10951 {
10952   gfc_namespace *n;
10953   bitmap_obstack old_obstack;
10954
10955   for (n = ns->contained; n; n = n->sibling)
10956     resolve_codes (n);
10957
10958   gfc_current_ns = ns;
10959   cs_base = NULL;
10960   /* Set to an out of range value.  */
10961   current_entry_id = -1;
10962
10963   old_obstack = labels_obstack;
10964   bitmap_obstack_initialize (&labels_obstack);
10965
10966   resolve_code (ns->code, ns);
10967
10968   bitmap_obstack_release (&labels_obstack);
10969   labels_obstack = old_obstack;
10970 }
10971
10972
10973 /* This function is called after a complete program unit has been compiled.
10974    Its purpose is to examine all of the expressions associated with a program
10975    unit, assign types to all intermediate expressions, make sure that all
10976    assignments are to compatible types and figure out which names refer to
10977    which functions or subroutines.  */
10978
10979 void
10980 gfc_resolve (gfc_namespace *ns)
10981 {
10982   gfc_namespace *old_ns;
10983
10984   if (ns->resolved)
10985     return;
10986
10987   old_ns = gfc_current_ns;
10988
10989   resolve_types (ns);
10990   resolve_codes (ns);
10991
10992   gfc_current_ns = old_ns;
10993   ns->resolved = 1;
10994 }