OSDN Git Service

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