OSDN Git Service

PR fortran/31243
[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)
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 ("elemental procedure", arg->expr, e)
1588               == 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_actual_arglist (c->ext.actual, comp->attr.proc,
4844                               comp->formal == NULL) == FAILURE)
4845     return FAILURE;
4846
4847   /* TODO: Check actual arguments.
4848      gfc_procedure_use (stree->n.sym, &c->expr1->value.compcall.actual,
4849                         &c->expr1->where);*/
4850
4851   return SUCCESS;
4852 }
4853
4854
4855 /* Resolve a Function Call to a Procedure Pointer Component (Function).  */
4856
4857 static gfc_try
4858 resolve_expr_ppc (gfc_expr* e)
4859 {
4860   gfc_component *comp;
4861   gcc_assert (is_proc_ptr_comp (e, &comp));
4862
4863   /* Convert to EXPR_FUNCTION.  */
4864   e->expr_type = EXPR_FUNCTION;
4865   e->value.function.isym = NULL;
4866   e->value.function.actual = e->value.compcall.actual;
4867   e->ts = comp->ts;
4868
4869   if (!comp->attr.function)
4870     gfc_add_function (&comp->attr, comp->name, &e->where);
4871
4872   if (resolve_actual_arglist (e->value.function.actual, comp->attr.proc,
4873                               comp->formal == NULL) == FAILURE)
4874     return FAILURE;
4875
4876   /* TODO: Check actual arguments.
4877      gfc_procedure_use (stree->n.sym, &e->value.compcall.actual, &e->where);  */
4878
4879   return SUCCESS;
4880 }
4881
4882
4883 /* Resolve an expression.  That is, make sure that types of operands agree
4884    with their operators, intrinsic operators are converted to function calls
4885    for overloaded types and unresolved function references are resolved.  */
4886
4887 gfc_try
4888 gfc_resolve_expr (gfc_expr *e)
4889 {
4890   gfc_try t;
4891
4892   if (e == NULL)
4893     return SUCCESS;
4894
4895   switch (e->expr_type)
4896     {
4897     case EXPR_OP:
4898       t = resolve_operator (e);
4899       break;
4900
4901     case EXPR_FUNCTION:
4902     case EXPR_VARIABLE:
4903
4904       if (check_host_association (e))
4905         t = resolve_function (e);
4906       else
4907         {
4908           t = resolve_variable (e);
4909           if (t == SUCCESS)
4910             expression_rank (e);
4911         }
4912
4913       if (e->ts.type == BT_CHARACTER && e->ts.cl == NULL && e->ref
4914           && e->ref->type != REF_SUBSTRING)
4915         gfc_resolve_substring_charlen (e);
4916
4917       break;
4918
4919     case EXPR_COMPCALL:
4920       t = resolve_compcall (e);
4921       break;
4922
4923     case EXPR_SUBSTRING:
4924       t = resolve_ref (e);
4925       break;
4926
4927     case EXPR_CONSTANT:
4928     case EXPR_NULL:
4929       t = SUCCESS;
4930       break;
4931
4932     case EXPR_PPC:
4933       t = resolve_expr_ppc (e);
4934       break;
4935
4936     case EXPR_ARRAY:
4937       t = FAILURE;
4938       if (resolve_ref (e) == FAILURE)
4939         break;
4940
4941       t = gfc_resolve_array_constructor (e);
4942       /* Also try to expand a constructor.  */
4943       if (t == SUCCESS)
4944         {
4945           expression_rank (e);
4946           gfc_expand_constructor (e);
4947         }
4948
4949       /* This provides the opportunity for the length of constructors with
4950          character valued function elements to propagate the string length
4951          to the expression.  */
4952       if (t == SUCCESS && e->ts.type == BT_CHARACTER)
4953         t = gfc_resolve_character_array_constructor (e);
4954
4955       break;
4956
4957     case EXPR_STRUCTURE:
4958       t = resolve_ref (e);
4959       if (t == FAILURE)
4960         break;
4961
4962       t = resolve_structure_cons (e);
4963       if (t == FAILURE)
4964         break;
4965
4966       t = gfc_simplify_expr (e, 0);
4967       break;
4968
4969     default:
4970       gfc_internal_error ("gfc_resolve_expr(): Bad expression type");
4971     }
4972
4973   if (e->ts.type == BT_CHARACTER && t == SUCCESS && !e->ts.cl)
4974     fixup_charlen (e);
4975
4976   return t;
4977 }
4978
4979
4980 /* Resolve an expression from an iterator.  They must be scalar and have
4981    INTEGER or (optionally) REAL type.  */
4982
4983 static gfc_try
4984 gfc_resolve_iterator_expr (gfc_expr *expr, bool real_ok,
4985                            const char *name_msgid)
4986 {
4987   if (gfc_resolve_expr (expr) == FAILURE)
4988     return FAILURE;
4989
4990   if (expr->rank != 0)
4991     {
4992       gfc_error ("%s at %L must be a scalar", _(name_msgid), &expr->where);
4993       return FAILURE;
4994     }
4995
4996   if (expr->ts.type != BT_INTEGER)
4997     {
4998       if (expr->ts.type == BT_REAL)
4999         {
5000           if (real_ok)
5001             return gfc_notify_std (GFC_STD_F95_DEL,
5002                                    "Deleted feature: %s at %L must be integer",
5003                                    _(name_msgid), &expr->where);
5004           else
5005             {
5006               gfc_error ("%s at %L must be INTEGER", _(name_msgid),
5007                          &expr->where);
5008               return FAILURE;
5009             }
5010         }
5011       else
5012         {
5013           gfc_error ("%s at %L must be INTEGER", _(name_msgid), &expr->where);
5014           return FAILURE;
5015         }
5016     }
5017   return SUCCESS;
5018 }
5019
5020
5021 /* Resolve the expressions in an iterator structure.  If REAL_OK is
5022    false allow only INTEGER type iterators, otherwise allow REAL types.  */
5023
5024 gfc_try
5025 gfc_resolve_iterator (gfc_iterator *iter, bool real_ok)
5026 {
5027   if (gfc_resolve_iterator_expr (iter->var, real_ok, "Loop variable")
5028       == FAILURE)
5029     return FAILURE;
5030
5031   if (gfc_pure (NULL) && gfc_impure_variable (iter->var->symtree->n.sym))
5032     {
5033       gfc_error ("Cannot assign to loop variable in PURE procedure at %L",
5034                  &iter->var->where);
5035       return FAILURE;
5036     }
5037
5038   if (gfc_resolve_iterator_expr (iter->start, real_ok,
5039                                  "Start expression in DO loop") == FAILURE)
5040     return FAILURE;
5041
5042   if (gfc_resolve_iterator_expr (iter->end, real_ok,
5043                                  "End expression in DO loop") == FAILURE)
5044     return FAILURE;
5045
5046   if (gfc_resolve_iterator_expr (iter->step, real_ok,
5047                                  "Step expression in DO loop") == FAILURE)
5048     return FAILURE;
5049
5050   if (iter->step->expr_type == EXPR_CONSTANT)
5051     {
5052       if ((iter->step->ts.type == BT_INTEGER
5053            && mpz_cmp_ui (iter->step->value.integer, 0) == 0)
5054           || (iter->step->ts.type == BT_REAL
5055               && mpfr_sgn (iter->step->value.real) == 0))
5056         {
5057           gfc_error ("Step expression in DO loop at %L cannot be zero",
5058                      &iter->step->where);
5059           return FAILURE;
5060         }
5061     }
5062
5063   /* Convert start, end, and step to the same type as var.  */
5064   if (iter->start->ts.kind != iter->var->ts.kind
5065       || iter->start->ts.type != iter->var->ts.type)
5066     gfc_convert_type (iter->start, &iter->var->ts, 2);
5067
5068   if (iter->end->ts.kind != iter->var->ts.kind
5069       || iter->end->ts.type != iter->var->ts.type)
5070     gfc_convert_type (iter->end, &iter->var->ts, 2);
5071
5072   if (iter->step->ts.kind != iter->var->ts.kind
5073       || iter->step->ts.type != iter->var->ts.type)
5074     gfc_convert_type (iter->step, &iter->var->ts, 2);
5075
5076   if (iter->start->expr_type == EXPR_CONSTANT
5077       && iter->end->expr_type == EXPR_CONSTANT
5078       && iter->step->expr_type == EXPR_CONSTANT)
5079     {
5080       int sgn, cmp;
5081       if (iter->start->ts.type == BT_INTEGER)
5082         {
5083           sgn = mpz_cmp_ui (iter->step->value.integer, 0);
5084           cmp = mpz_cmp (iter->end->value.integer, iter->start->value.integer);
5085         }
5086       else
5087         {
5088           sgn = mpfr_sgn (iter->step->value.real);
5089           cmp = mpfr_cmp (iter->end->value.real, iter->start->value.real);
5090         }
5091       if ((sgn > 0 && cmp < 0) || (sgn < 0 && cmp > 0))
5092         gfc_warning ("DO loop at %L will be executed zero times",
5093                      &iter->step->where);
5094     }
5095
5096   return SUCCESS;
5097 }
5098
5099
5100 /* Traversal function for find_forall_index.  f == 2 signals that
5101    that variable itself is not to be checked - only the references.  */
5102
5103 static bool
5104 forall_index (gfc_expr *expr, gfc_symbol *sym, int *f)
5105 {
5106   if (expr->expr_type != EXPR_VARIABLE)
5107     return false;
5108   
5109   /* A scalar assignment  */
5110   if (!expr->ref || *f == 1)
5111     {
5112       if (expr->symtree->n.sym == sym)
5113         return true;
5114       else
5115         return false;
5116     }
5117
5118   if (*f == 2)
5119     *f = 1;
5120   return false;
5121 }
5122
5123
5124 /* Check whether the FORALL index appears in the expression or not.
5125    Returns SUCCESS if SYM is found in EXPR.  */
5126
5127 gfc_try
5128 find_forall_index (gfc_expr *expr, gfc_symbol *sym, int f)
5129 {
5130   if (gfc_traverse_expr (expr, sym, forall_index, f))
5131     return SUCCESS;
5132   else
5133     return FAILURE;
5134 }
5135
5136
5137 /* Resolve a list of FORALL iterators.  The FORALL index-name is constrained
5138    to be a scalar INTEGER variable.  The subscripts and stride are scalar
5139    INTEGERs, and if stride is a constant it must be nonzero.
5140    Furthermore "A subscript or stride in a forall-triplet-spec shall
5141    not contain a reference to any index-name in the
5142    forall-triplet-spec-list in which it appears." (7.5.4.1)  */
5143
5144 static void
5145 resolve_forall_iterators (gfc_forall_iterator *it)
5146 {
5147   gfc_forall_iterator *iter, *iter2;
5148
5149   for (iter = it; iter; iter = iter->next)
5150     {
5151       if (gfc_resolve_expr (iter->var) == SUCCESS
5152           && (iter->var->ts.type != BT_INTEGER || iter->var->rank != 0))
5153         gfc_error ("FORALL index-name at %L must be a scalar INTEGER",
5154                    &iter->var->where);
5155
5156       if (gfc_resolve_expr (iter->start) == SUCCESS
5157           && (iter->start->ts.type != BT_INTEGER || iter->start->rank != 0))
5158         gfc_error ("FORALL start expression at %L must be a scalar INTEGER",
5159                    &iter->start->where);
5160       if (iter->var->ts.kind != iter->start->ts.kind)
5161         gfc_convert_type (iter->start, &iter->var->ts, 2);
5162
5163       if (gfc_resolve_expr (iter->end) == SUCCESS
5164           && (iter->end->ts.type != BT_INTEGER || iter->end->rank != 0))
5165         gfc_error ("FORALL end expression at %L must be a scalar INTEGER",
5166                    &iter->end->where);
5167       if (iter->var->ts.kind != iter->end->ts.kind)
5168         gfc_convert_type (iter->end, &iter->var->ts, 2);
5169
5170       if (gfc_resolve_expr (iter->stride) == SUCCESS)
5171         {
5172           if (iter->stride->ts.type != BT_INTEGER || iter->stride->rank != 0)
5173             gfc_error ("FORALL stride expression at %L must be a scalar %s",
5174                        &iter->stride->where, "INTEGER");
5175
5176           if (iter->stride->expr_type == EXPR_CONSTANT
5177               && mpz_cmp_ui(iter->stride->value.integer, 0) == 0)
5178             gfc_error ("FORALL stride expression at %L cannot be zero",
5179                        &iter->stride->where);
5180         }
5181       if (iter->var->ts.kind != iter->stride->ts.kind)
5182         gfc_convert_type (iter->stride, &iter->var->ts, 2);
5183     }
5184
5185   for (iter = it; iter; iter = iter->next)
5186     for (iter2 = iter; iter2; iter2 = iter2->next)
5187       {
5188         if (find_forall_index (iter2->start,
5189                                iter->var->symtree->n.sym, 0) == SUCCESS
5190             || find_forall_index (iter2->end,
5191                                   iter->var->symtree->n.sym, 0) == SUCCESS
5192             || find_forall_index (iter2->stride,
5193                                   iter->var->symtree->n.sym, 0) == SUCCESS)
5194           gfc_error ("FORALL index '%s' may not appear in triplet "
5195                      "specification at %L", iter->var->symtree->name,
5196                      &iter2->start->where);
5197       }
5198 }
5199
5200
5201 /* Given a pointer to a symbol that is a derived type, see if it's
5202    inaccessible, i.e. if it's defined in another module and the components are
5203    PRIVATE.  The search is recursive if necessary.  Returns zero if no
5204    inaccessible components are found, nonzero otherwise.  */
5205
5206 static int
5207 derived_inaccessible (gfc_symbol *sym)
5208 {
5209   gfc_component *c;
5210
5211   if (sym->attr.use_assoc && sym->attr.private_comp)
5212     return 1;
5213
5214   for (c = sym->components; c; c = c->next)
5215     {
5216         if (c->ts.type == BT_DERIVED && derived_inaccessible (c->ts.derived))
5217           return 1;
5218     }
5219
5220   return 0;
5221 }
5222
5223
5224 /* Resolve the argument of a deallocate expression.  The expression must be
5225    a pointer or a full array.  */
5226
5227 static gfc_try
5228 resolve_deallocate_expr (gfc_expr *e)
5229 {
5230   symbol_attribute attr;
5231   int allocatable, pointer, check_intent_in;
5232   gfc_ref *ref;
5233
5234   /* Check INTENT(IN), unless the object is a sub-component of a pointer.  */
5235   check_intent_in = 1;
5236
5237   if (gfc_resolve_expr (e) == FAILURE)
5238     return FAILURE;
5239
5240   if (e->expr_type != EXPR_VARIABLE)
5241     goto bad;
5242
5243   allocatable = e->symtree->n.sym->attr.allocatable;
5244   pointer = e->symtree->n.sym->attr.pointer;
5245   for (ref = e->ref; ref; ref = ref->next)
5246     {
5247       if (pointer)
5248         check_intent_in = 0;
5249
5250       switch (ref->type)
5251         {
5252         case REF_ARRAY:
5253           if (ref->u.ar.type != AR_FULL)
5254             allocatable = 0;
5255           break;
5256
5257         case REF_COMPONENT:
5258           allocatable = (ref->u.c.component->as != NULL
5259                          && ref->u.c.component->as->type == AS_DEFERRED);
5260           pointer = ref->u.c.component->attr.pointer;
5261           break;
5262
5263         case REF_SUBSTRING:
5264           allocatable = 0;
5265           break;
5266         }
5267     }
5268
5269   attr = gfc_expr_attr (e);
5270
5271   if (allocatable == 0 && attr.pointer == 0)
5272     {
5273     bad:
5274       gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",
5275                  &e->where);
5276     }
5277
5278   if (check_intent_in
5279       && e->symtree->n.sym->attr.intent == INTENT_IN)
5280     {
5281       gfc_error ("Cannot deallocate INTENT(IN) variable '%s' at %L",
5282                  e->symtree->n.sym->name, &e->where);
5283       return FAILURE;
5284     }
5285
5286   return SUCCESS;
5287 }
5288
5289
5290 /* Returns true if the expression e contains a reference to the symbol sym.  */
5291 static bool
5292 sym_in_expr (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
5293 {
5294   if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym == sym)
5295     return true;
5296
5297   return false;
5298 }
5299
5300 bool
5301 gfc_find_sym_in_expr (gfc_symbol *sym, gfc_expr *e)
5302 {
5303   return gfc_traverse_expr (e, sym, sym_in_expr, 0);
5304 }
5305
5306
5307 /* Given the expression node e for an allocatable/pointer of derived type to be
5308    allocated, get the expression node to be initialized afterwards (needed for
5309    derived types with default initializers, and derived types with allocatable
5310    components that need nullification.)  */
5311
5312 static gfc_expr *
5313 expr_to_initialize (gfc_expr *e)
5314 {
5315   gfc_expr *result;
5316   gfc_ref *ref;
5317   int i;
5318
5319   result = gfc_copy_expr (e);
5320
5321   /* Change the last array reference from AR_ELEMENT to AR_FULL.  */
5322   for (ref = result->ref; ref; ref = ref->next)
5323     if (ref->type == REF_ARRAY && ref->next == NULL)
5324       {
5325         ref->u.ar.type = AR_FULL;
5326
5327         for (i = 0; i < ref->u.ar.dimen; i++)
5328           ref->u.ar.start[i] = ref->u.ar.end[i] = ref->u.ar.stride[i] = NULL;
5329
5330         result->rank = ref->u.ar.dimen;
5331         break;
5332       }
5333
5334   return result;
5335 }
5336
5337
5338 /* Resolve the expression in an ALLOCATE statement, doing the additional
5339    checks to see whether the expression is OK or not.  The expression must
5340    have a trailing array reference that gives the size of the array.  */
5341
5342 static gfc_try
5343 resolve_allocate_expr (gfc_expr *e, gfc_code *code)
5344 {
5345   int i, pointer, allocatable, dimension, check_intent_in;
5346   symbol_attribute attr;
5347   gfc_ref *ref, *ref2;
5348   gfc_array_ref *ar;
5349   gfc_code *init_st;
5350   gfc_expr *init_e;
5351   gfc_symbol *sym;
5352   gfc_alloc *a;
5353
5354   /* Check INTENT(IN), unless the object is a sub-component of a pointer.  */
5355   check_intent_in = 1;
5356
5357   if (gfc_resolve_expr (e) == FAILURE)
5358     return FAILURE;
5359
5360   /* Make sure the expression is allocatable or a pointer.  If it is
5361      pointer, the next-to-last reference must be a pointer.  */
5362
5363   ref2 = NULL;
5364
5365   if (e->expr_type != EXPR_VARIABLE)
5366     {
5367       allocatable = 0;
5368       attr = gfc_expr_attr (e);
5369       pointer = attr.pointer;
5370       dimension = attr.dimension;
5371     }
5372   else
5373     {
5374       allocatable = e->symtree->n.sym->attr.allocatable;
5375       pointer = e->symtree->n.sym->attr.pointer;
5376       dimension = e->symtree->n.sym->attr.dimension;
5377
5378       for (ref = e->ref; ref; ref2 = ref, ref = ref->next)
5379         {
5380           if (pointer)
5381             check_intent_in = 0;
5382
5383           switch (ref->type)
5384             {
5385               case REF_ARRAY:
5386                 if (ref->next != NULL)
5387                   pointer = 0;
5388                 break;
5389
5390               case REF_COMPONENT:
5391                 allocatable = (ref->u.c.component->as != NULL
5392                                && ref->u.c.component->as->type == AS_DEFERRED);
5393
5394                 pointer = ref->u.c.component->attr.pointer;
5395                 dimension = ref->u.c.component->attr.dimension;
5396                 break;
5397
5398               case REF_SUBSTRING:
5399                 allocatable = 0;
5400                 pointer = 0;
5401                 break;
5402             }
5403         }
5404     }
5405
5406   if (allocatable == 0 && pointer == 0)
5407     {
5408       gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",
5409                  &e->where);
5410       return FAILURE;
5411     }
5412
5413   if (check_intent_in
5414       && e->symtree->n.sym->attr.intent == INTENT_IN)
5415     {
5416       gfc_error ("Cannot allocate INTENT(IN) variable '%s' at %L",
5417                  e->symtree->n.sym->name, &e->where);
5418       return FAILURE;
5419     }
5420
5421   /* Add default initializer for those derived types that need them.  */
5422   if (e->ts.type == BT_DERIVED && (init_e = gfc_default_initializer (&e->ts)))
5423     {
5424       init_st = gfc_get_code ();
5425       init_st->loc = code->loc;
5426       init_st->op = EXEC_INIT_ASSIGN;
5427       init_st->expr1 = expr_to_initialize (e);
5428       init_st->expr2 = init_e;
5429       init_st->next = code->next;
5430       code->next = init_st;
5431     }
5432
5433   if (pointer && dimension == 0)
5434     return SUCCESS;
5435
5436   /* Make sure the next-to-last reference node is an array specification.  */
5437
5438   if (ref2 == NULL || ref2->type != REF_ARRAY || ref2->u.ar.type == AR_FULL)
5439     {
5440       gfc_error ("Array specification required in ALLOCATE statement "
5441                  "at %L", &e->where);
5442       return FAILURE;
5443     }
5444
5445   /* Make sure that the array section reference makes sense in the
5446     context of an ALLOCATE specification.  */
5447
5448   ar = &ref2->u.ar;
5449
5450   for (i = 0; i < ar->dimen; i++)
5451     {
5452       if (ref2->u.ar.type == AR_ELEMENT)
5453         goto check_symbols;
5454
5455       switch (ar->dimen_type[i])
5456         {
5457         case DIMEN_ELEMENT:
5458           break;
5459
5460         case DIMEN_RANGE:
5461           if (ar->start[i] != NULL
5462               && ar->end[i] != NULL
5463               && ar->stride[i] == NULL)
5464             break;
5465
5466           /* Fall Through...  */
5467
5468         case DIMEN_UNKNOWN:
5469         case DIMEN_VECTOR:
5470           gfc_error ("Bad array specification in ALLOCATE statement at %L",
5471                      &e->where);
5472           return FAILURE;
5473         }
5474
5475 check_symbols:
5476
5477       for (a = code->ext.alloc_list; a; a = a->next)
5478         {
5479           sym = a->expr->symtree->n.sym;
5480
5481           /* TODO - check derived type components.  */
5482           if (sym->ts.type == BT_DERIVED)
5483             continue;
5484
5485           if ((ar->start[i] != NULL
5486                && gfc_find_sym_in_expr (sym, ar->start[i]))
5487               || (ar->end[i] != NULL
5488                   && gfc_find_sym_in_expr (sym, ar->end[i])))
5489             {
5490               gfc_error ("'%s' must not appear in the array specification at "
5491                          "%L in the same ALLOCATE statement where it is "
5492                          "itself allocated", sym->name, &ar->where);
5493               return FAILURE;
5494             }
5495         }
5496     }
5497
5498   return SUCCESS;
5499 }
5500
5501 static void
5502 resolve_allocate_deallocate (gfc_code *code, const char *fcn)
5503 {
5504   gfc_expr *stat, *errmsg, *pe, *qe;
5505   gfc_alloc *a, *p, *q;
5506
5507   stat = code->expr1 ? code->expr1 : NULL;
5508
5509   errmsg = code->expr2 ? code->expr2 : NULL;
5510
5511   /* Check the stat variable.  */
5512   if (stat)
5513     {
5514       if (stat->symtree->n.sym->attr.intent == INTENT_IN)
5515         gfc_error ("Stat-variable '%s' at %L cannot be INTENT(IN)",
5516                    stat->symtree->n.sym->name, &stat->where);
5517
5518       if (gfc_pure (NULL) && gfc_impure_variable (stat->symtree->n.sym))
5519         gfc_error ("Illegal stat-variable at %L for a PURE procedure",
5520                    &stat->where);
5521
5522       if (stat->ts.type != BT_INTEGER
5523           && !(stat->ref && (stat->ref->type == REF_ARRAY
5524                || stat->ref->type == REF_COMPONENT)))
5525         gfc_error ("Stat-variable at %L must be a scalar INTEGER "
5526                    "variable", &stat->where);
5527
5528       for (p = code->ext.alloc_list; p; p = p->next)
5529         if (p->expr->symtree->n.sym->name == stat->symtree->n.sym->name)
5530           gfc_error ("Stat-variable at %L shall not be %sd within "
5531                      "the same %s statement", &stat->where, fcn, fcn);
5532     }
5533
5534   /* Check the errmsg variable.  */
5535   if (errmsg)
5536     {
5537       if (!stat)
5538         gfc_warning ("ERRMSG at %L is useless without a STAT tag",
5539                      &errmsg->where);
5540
5541       if (errmsg->symtree->n.sym->attr.intent == INTENT_IN)
5542         gfc_error ("Errmsg-variable '%s' at %L cannot be INTENT(IN)",
5543                    errmsg->symtree->n.sym->name, &errmsg->where);
5544
5545       if (gfc_pure (NULL) && gfc_impure_variable (errmsg->symtree->n.sym))
5546         gfc_error ("Illegal errmsg-variable at %L for a PURE procedure",
5547                    &errmsg->where);
5548
5549       if (errmsg->ts.type != BT_CHARACTER
5550           && !(errmsg->ref
5551                && (errmsg->ref->type == REF_ARRAY
5552                    || errmsg->ref->type == REF_COMPONENT)))
5553         gfc_error ("Errmsg-variable at %L must be a scalar CHARACTER "
5554                    "variable", &errmsg->where);
5555
5556       for (p = code->ext.alloc_list; p; p = p->next)
5557         if (p->expr->symtree->n.sym->name == errmsg->symtree->n.sym->name)
5558           gfc_error ("Errmsg-variable at %L shall not be %sd within "
5559                      "the same %s statement", &errmsg->where, fcn, fcn);
5560     }
5561
5562   /* Check that an allocate-object appears only once in the statement.  
5563      FIXME: Checking derived types is disabled.  */
5564   for (p = code->ext.alloc_list; p; p = p->next)
5565     {
5566       pe = p->expr;
5567       if ((pe->ref && pe->ref->type != REF_COMPONENT)
5568            && (pe->symtree->n.sym->ts.type != BT_DERIVED))
5569         {
5570           for (q = p->next; q; q = q->next)
5571             {
5572               qe = q->expr;
5573               if ((qe->ref && qe->ref->type != REF_COMPONENT)
5574                   && (qe->symtree->n.sym->ts.type != BT_DERIVED)
5575                   && (pe->symtree->n.sym->name == qe->symtree->n.sym->name))
5576                 gfc_error ("Allocate-object at %L also appears at %L",
5577                            &pe->where, &qe->where);
5578             }
5579         }
5580     }
5581
5582   if (strcmp (fcn, "ALLOCATE") == 0)
5583     {
5584       for (a = code->ext.alloc_list; a; a = a->next)
5585         resolve_allocate_expr (a->expr, code);
5586     }
5587   else
5588     {
5589       for (a = code->ext.alloc_list; a; a = a->next)
5590         resolve_deallocate_expr (a->expr);
5591     }
5592 }
5593
5594
5595 /************ SELECT CASE resolution subroutines ************/
5596
5597 /* Callback function for our mergesort variant.  Determines interval
5598    overlaps for CASEs. Return <0 if op1 < op2, 0 for overlap, >0 for
5599    op1 > op2.  Assumes we're not dealing with the default case.  
5600    We have op1 = (:L), (K:L) or (K:) and op2 = (:N), (M:N) or (M:).
5601    There are nine situations to check.  */
5602
5603 static int
5604 compare_cases (const gfc_case *op1, const gfc_case *op2)
5605 {
5606   int retval;
5607
5608   if (op1->low == NULL) /* op1 = (:L)  */
5609     {
5610       /* op2 = (:N), so overlap.  */
5611       retval = 0;
5612       /* op2 = (M:) or (M:N),  L < M  */
5613       if (op2->low != NULL
5614           && gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
5615         retval = -1;
5616     }
5617   else if (op1->high == NULL) /* op1 = (K:)  */
5618     {
5619       /* op2 = (M:), so overlap.  */
5620       retval = 0;
5621       /* op2 = (:N) or (M:N), K > N  */
5622       if (op2->high != NULL
5623           && gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
5624         retval = 1;
5625     }
5626   else /* op1 = (K:L)  */
5627     {
5628       if (op2->low == NULL)       /* op2 = (:N), K > N  */
5629         retval = (gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
5630                  ? 1 : 0;
5631       else if (op2->high == NULL) /* op2 = (M:), L < M  */
5632         retval = (gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
5633                  ? -1 : 0;
5634       else                      /* op2 = (M:N)  */
5635         {
5636           retval =  0;
5637           /* L < M  */
5638           if (gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
5639             retval =  -1;
5640           /* K > N  */
5641           else if (gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
5642             retval =  1;
5643         }
5644     }
5645
5646   return retval;
5647 }
5648
5649
5650 /* Merge-sort a double linked case list, detecting overlap in the
5651    process.  LIST is the head of the double linked case list before it
5652    is sorted.  Returns the head of the sorted list if we don't see any
5653    overlap, or NULL otherwise.  */
5654
5655 static gfc_case *
5656 check_case_overlap (gfc_case *list)
5657 {
5658   gfc_case *p, *q, *e, *tail;
5659   int insize, nmerges, psize, qsize, cmp, overlap_seen;
5660
5661   /* If the passed list was empty, return immediately.  */
5662   if (!list)
5663     return NULL;
5664
5665   overlap_seen = 0;
5666   insize = 1;
5667
5668   /* Loop unconditionally.  The only exit from this loop is a return
5669      statement, when we've finished sorting the case list.  */
5670   for (;;)
5671     {
5672       p = list;
5673       list = NULL;
5674       tail = NULL;
5675
5676       /* Count the number of merges we do in this pass.  */
5677       nmerges = 0;
5678
5679       /* Loop while there exists a merge to be done.  */
5680       while (p)
5681         {
5682           int i;
5683
5684           /* Count this merge.  */
5685           nmerges++;
5686
5687           /* Cut the list in two pieces by stepping INSIZE places
5688              forward in the list, starting from P.  */
5689           psize = 0;
5690           q = p;
5691           for (i = 0; i < insize; i++)
5692             {
5693               psize++;
5694               q = q->right;
5695               if (!q)
5696                 break;
5697             }
5698           qsize = insize;
5699
5700           /* Now we have two lists.  Merge them!  */
5701           while (psize > 0 || (qsize > 0 && q != NULL))
5702             {
5703               /* See from which the next case to merge comes from.  */
5704               if (psize == 0)
5705                 {
5706                   /* P is empty so the next case must come from Q.  */
5707                   e = q;
5708                   q = q->right;
5709                   qsize--;
5710                 }
5711               else if (qsize == 0 || q == NULL)
5712                 {
5713                   /* Q is empty.  */
5714                   e = p;
5715                   p = p->right;
5716                   psize--;
5717                 }
5718               else
5719                 {
5720                   cmp = compare_cases (p, q);
5721                   if (cmp < 0)
5722                     {
5723                       /* The whole case range for P is less than the
5724                          one for Q.  */
5725                       e = p;
5726                       p = p->right;
5727                       psize--;
5728                     }
5729                   else if (cmp > 0)
5730                     {
5731                       /* The whole case range for Q is greater than
5732                          the case range for P.  */
5733                       e = q;
5734                       q = q->right;
5735                       qsize--;
5736                     }
5737                   else
5738                     {
5739                       /* The cases overlap, or they are the same
5740                          element in the list.  Either way, we must
5741                          issue an error and get the next case from P.  */
5742                       /* FIXME: Sort P and Q by line number.  */
5743                       gfc_error ("CASE label at %L overlaps with CASE "
5744                                  "label at %L", &p->where, &q->where);
5745                       overlap_seen = 1;
5746                       e = p;
5747                       p = p->right;
5748                       psize--;
5749                     }
5750                 }
5751
5752                 /* Add the next element to the merged list.  */
5753               if (tail)
5754                 tail->right = e;
5755               else
5756                 list = e;
5757               e->left = tail;
5758               tail = e;
5759             }
5760
5761           /* P has now stepped INSIZE places along, and so has Q.  So
5762              they're the same.  */
5763           p = q;
5764         }
5765       tail->right = NULL;
5766
5767       /* If we have done only one merge or none at all, we've
5768          finished sorting the cases.  */
5769       if (nmerges <= 1)
5770         {
5771           if (!overlap_seen)
5772             return list;
5773           else
5774             return NULL;
5775         }
5776
5777       /* Otherwise repeat, merging lists twice the size.  */
5778       insize *= 2;
5779     }
5780 }
5781
5782
5783 /* Check to see if an expression is suitable for use in a CASE statement.
5784    Makes sure that all case expressions are scalar constants of the same
5785    type.  Return FAILURE if anything is wrong.  */
5786
5787 static gfc_try
5788 validate_case_label_expr (gfc_expr *e, gfc_expr *case_expr)
5789 {
5790   if (e == NULL) return SUCCESS;
5791
5792   if (e->ts.type != case_expr->ts.type)
5793     {
5794       gfc_error ("Expression in CASE statement at %L must be of type %s",
5795                  &e->where, gfc_basic_typename (case_expr->ts.type));
5796       return FAILURE;
5797     }
5798
5799   /* C805 (R808) For a given case-construct, each case-value shall be of
5800      the same type as case-expr.  For character type, length differences
5801      are allowed, but the kind type parameters shall be the same.  */
5802
5803   if (case_expr->ts.type == BT_CHARACTER && e->ts.kind != case_expr->ts.kind)
5804     {
5805       gfc_error ("Expression in CASE statement at %L must be of kind %d",
5806                  &e->where, case_expr->ts.kind);
5807       return FAILURE;
5808     }
5809
5810   /* Convert the case value kind to that of case expression kind, if needed.
5811      FIXME:  Should a warning be issued?  */
5812   if (e->ts.kind != case_expr->ts.kind)
5813     gfc_convert_type_warn (e, &case_expr->ts, 2, 0);
5814
5815   if (e->rank != 0)
5816     {
5817       gfc_error ("Expression in CASE statement at %L must be scalar",
5818                  &e->where);
5819       return FAILURE;
5820     }
5821
5822   return SUCCESS;
5823 }
5824
5825
5826 /* Given a completely parsed select statement, we:
5827
5828      - Validate all expressions and code within the SELECT.
5829      - Make sure that the selection expression is not of the wrong type.
5830      - Make sure that no case ranges overlap.
5831      - Eliminate unreachable cases and unreachable code resulting from
5832        removing case labels.
5833
5834    The standard does allow unreachable cases, e.g. CASE (5:3).  But
5835    they are a hassle for code generation, and to prevent that, we just
5836    cut them out here.  This is not necessary for overlapping cases
5837    because they are illegal and we never even try to generate code.
5838
5839    We have the additional caveat that a SELECT construct could have
5840    been a computed GOTO in the source code. Fortunately we can fairly
5841    easily work around that here: The case_expr for a "real" SELECT CASE
5842    is in code->expr1, but for a computed GOTO it is in code->expr2. All
5843    we have to do is make sure that the case_expr is a scalar integer
5844    expression.  */
5845
5846 static void
5847 resolve_select (gfc_code *code)
5848 {
5849   gfc_code *body;
5850   gfc_expr *case_expr;
5851   gfc_case *cp, *default_case, *tail, *head;
5852   int seen_unreachable;
5853   int seen_logical;
5854   int ncases;
5855   bt type;
5856   gfc_try t;
5857
5858   if (code->expr1 == NULL)
5859     {
5860       /* This was actually a computed GOTO statement.  */
5861       case_expr = code->expr2;
5862       if (case_expr->ts.type != BT_INTEGER|| case_expr->rank != 0)
5863         gfc_error ("Selection expression in computed GOTO statement "
5864                    "at %L must be a scalar integer expression",
5865                    &case_expr->where);
5866
5867       /* Further checking is not necessary because this SELECT was built
5868          by the compiler, so it should always be OK.  Just move the
5869          case_expr from expr2 to expr so that we can handle computed
5870          GOTOs as normal SELECTs from here on.  */
5871       code->expr1 = code->expr2;
5872       code->expr2 = NULL;
5873       return;
5874     }
5875
5876   case_expr = code->expr1;
5877
5878   type = case_expr->ts.type;
5879   if (type != BT_LOGICAL && type != BT_INTEGER && type != BT_CHARACTER)
5880     {
5881       gfc_error ("Argument of SELECT statement at %L cannot be %s",
5882                  &case_expr->where, gfc_typename (&case_expr->ts));
5883
5884       /* Punt. Going on here just produce more garbage error messages.  */
5885       return;
5886     }
5887
5888   if (case_expr->rank != 0)
5889     {
5890       gfc_error ("Argument of SELECT statement at %L must be a scalar "
5891                  "expression", &case_expr->where);
5892
5893       /* Punt.  */
5894       return;
5895     }
5896
5897   /* PR 19168 has a long discussion concerning a mismatch of the kinds
5898      of the SELECT CASE expression and its CASE values.  Walk the lists
5899      of case values, and if we find a mismatch, promote case_expr to
5900      the appropriate kind.  */
5901
5902   if (type == BT_LOGICAL || type == BT_INTEGER)
5903     {
5904       for (body = code->block; body; body = body->block)
5905         {
5906           /* Walk the case label list.  */
5907           for (cp = body->ext.case_list; cp; cp = cp->next)
5908             {
5909               /* Intercept the DEFAULT case.  It does not have a kind.  */
5910               if (cp->low == NULL && cp->high == NULL)
5911                 continue;
5912
5913               /* Unreachable case ranges are discarded, so ignore.  */
5914               if (cp->low != NULL && cp->high != NULL
5915                   && cp->low != cp->high
5916                   && gfc_compare_expr (cp->low, cp->high, INTRINSIC_GT) > 0)
5917                 continue;
5918
5919               /* FIXME: Should a warning be issued?  */
5920               if (cp->low != NULL
5921                   && case_expr->ts.kind != gfc_kind_max(case_expr, cp->low))
5922                 gfc_convert_type_warn (case_expr, &cp->low->ts, 2, 0);
5923
5924               if (cp->high != NULL
5925                   && case_expr->ts.kind != gfc_kind_max(case_expr, cp->high))
5926                 gfc_convert_type_warn (case_expr, &cp->high->ts, 2, 0);
5927             }
5928          }
5929     }
5930
5931   /* Assume there is no DEFAULT case.  */
5932   default_case = NULL;
5933   head = tail = NULL;
5934   ncases = 0;
5935   seen_logical = 0;
5936
5937   for (body = code->block; body; body = body->block)
5938     {
5939       /* Assume the CASE list is OK, and all CASE labels can be matched.  */
5940       t = SUCCESS;
5941       seen_unreachable = 0;
5942
5943       /* Walk the case label list, making sure that all case labels
5944          are legal.  */
5945       for (cp = body->ext.case_list; cp; cp = cp->next)
5946         {
5947           /* Count the number of cases in the whole construct.  */
5948           ncases++;
5949
5950           /* Intercept the DEFAULT case.  */
5951           if (cp->low == NULL && cp->high == NULL)
5952             {
5953               if (default_case != NULL)
5954                 {
5955                   gfc_error ("The DEFAULT CASE at %L cannot be followed "
5956                              "by a second DEFAULT CASE at %L",
5957                              &default_case->where, &cp->where);
5958                   t = FAILURE;
5959                   break;
5960                 }
5961               else
5962                 {
5963                   default_case = cp;
5964                   continue;
5965                 }
5966             }
5967
5968           /* Deal with single value cases and case ranges.  Errors are
5969              issued from the validation function.  */
5970           if(validate_case_label_expr (cp->low, case_expr) != SUCCESS
5971              || validate_case_label_expr (cp->high, case_expr) != SUCCESS)
5972             {
5973               t = FAILURE;
5974               break;
5975             }
5976
5977           if (type == BT_LOGICAL
5978               && ((cp->low == NULL || cp->high == NULL)
5979                   || cp->low != cp->high))
5980             {
5981               gfc_error ("Logical range in CASE statement at %L is not "
5982                          "allowed", &cp->low->where);
5983               t = FAILURE;
5984               break;
5985             }
5986
5987           if (type == BT_LOGICAL && cp->low->expr_type == EXPR_CONSTANT)
5988             {
5989               int value;
5990               value = cp->low->value.logical == 0 ? 2 : 1;
5991               if (value & seen_logical)
5992                 {
5993                   gfc_error ("constant logical value in CASE statement "
5994                              "is repeated at %L",
5995                              &cp->low->where);
5996                   t = FAILURE;
5997                   break;
5998                 }
5999               seen_logical |= value;
6000             }
6001
6002           if (cp->low != NULL && cp->high != NULL
6003               && cp->low != cp->high
6004               && gfc_compare_expr (cp->low, cp->high, INTRINSIC_GT) > 0)
6005             {
6006               if (gfc_option.warn_surprising)
6007                 gfc_warning ("Range specification at %L can never "
6008                              "be matched", &cp->where);
6009
6010               cp->unreachable = 1;
6011               seen_unreachable = 1;
6012             }
6013           else
6014             {
6015               /* If the case range can be matched, it can also overlap with
6016                  other cases.  To make sure it does not, we put it in a
6017                  double linked list here.  We sort that with a merge sort
6018                  later on to detect any overlapping cases.  */
6019               if (!head)
6020                 {
6021                   head = tail = cp;
6022                   head->right = head->left = NULL;
6023                 }
6024               else
6025                 {
6026                   tail->right = cp;
6027                   tail->right->left = tail;
6028                   tail = tail->right;
6029                   tail->right = NULL;
6030                 }
6031             }
6032         }
6033
6034       /* It there was a failure in the previous case label, give up
6035          for this case label list.  Continue with the next block.  */
6036       if (t == FAILURE)
6037         continue;
6038
6039       /* See if any case labels that are unreachable have been seen.
6040          If so, we eliminate them.  This is a bit of a kludge because
6041          the case lists for a single case statement (label) is a
6042          single forward linked lists.  */
6043       if (seen_unreachable)
6044       {
6045         /* Advance until the first case in the list is reachable.  */
6046         while (body->ext.case_list != NULL
6047                && body->ext.case_list->unreachable)
6048           {
6049             gfc_case *n = body->ext.case_list;
6050             body->ext.case_list = body->ext.case_list->next;
6051             n->next = NULL;
6052             gfc_free_case_list (n);
6053           }
6054
6055         /* Strip all other unreachable cases.  */
6056         if (body->ext.case_list)
6057           {
6058             for (cp = body->ext.case_list; cp->next; cp = cp->next)
6059               {
6060                 if (cp->next->unreachable)
6061                   {
6062                     gfc_case *n = cp->next;
6063                     cp->next = cp->next->next;
6064                     n->next = NULL;
6065                     gfc_free_case_list (n);
6066                   }
6067               }
6068           }
6069       }
6070     }
6071
6072   /* See if there were overlapping cases.  If the check returns NULL,
6073      there was overlap.  In that case we don't do anything.  If head
6074      is non-NULL, we prepend the DEFAULT case.  The sorted list can
6075      then used during code generation for SELECT CASE constructs with
6076      a case expression of a CHARACTER type.  */
6077   if (head)
6078     {
6079       head = check_case_overlap (head);
6080
6081       /* Prepend the default_case if it is there.  */
6082       if (head != NULL && default_case)
6083         {
6084           default_case->left = NULL;
6085           default_case->right = head;
6086           head->left = default_case;
6087         }
6088     }
6089
6090   /* Eliminate dead blocks that may be the result if we've seen
6091      unreachable case labels for a block.  */
6092   for (body = code; body && body->block; body = body->block)
6093     {
6094       if (body->block->ext.case_list == NULL)
6095         {
6096           /* Cut the unreachable block from the code chain.  */
6097           gfc_code *c = body->block;
6098           body->block = c->block;
6099
6100           /* Kill the dead block, but not the blocks below it.  */
6101           c->block = NULL;
6102           gfc_free_statements (c);
6103         }
6104     }
6105
6106   /* More than two cases is legal but insane for logical selects.
6107      Issue a warning for it.  */
6108   if (gfc_option.warn_surprising && type == BT_LOGICAL
6109       && ncases > 2)
6110     gfc_warning ("Logical SELECT CASE block at %L has more that two cases",
6111                  &code->loc);
6112 }
6113
6114
6115 /* Resolve a transfer statement. This is making sure that:
6116    -- a derived type being transferred has only non-pointer components
6117    -- a derived type being transferred doesn't have private components, unless 
6118       it's being transferred from the module where the type was defined
6119    -- we're not trying to transfer a whole assumed size array.  */
6120
6121 static void
6122 resolve_transfer (gfc_code *code)
6123 {
6124   gfc_typespec *ts;
6125   gfc_symbol *sym;
6126   gfc_ref *ref;
6127   gfc_expr *exp;
6128
6129   exp = code->expr1;
6130
6131   if (exp->expr_type != EXPR_VARIABLE && exp->expr_type != EXPR_FUNCTION)
6132     return;
6133
6134   sym = exp->symtree->n.sym;
6135   ts = &sym->ts;
6136
6137   /* Go to actual component transferred.  */
6138   for (ref = code->expr1->ref; ref; ref = ref->next)
6139     if (ref->type == REF_COMPONENT)
6140       ts = &ref->u.c.component->ts;
6141
6142   if (ts->type == BT_DERIVED)
6143     {
6144       /* Check that transferred derived type doesn't contain POINTER
6145          components.  */
6146       if (ts->derived->attr.pointer_comp)
6147         {
6148           gfc_error ("Data transfer element at %L cannot have "
6149                      "POINTER components", &code->loc);
6150           return;
6151         }
6152
6153       if (ts->derived->attr.alloc_comp)
6154         {
6155           gfc_error ("Data transfer element at %L cannot have "
6156                      "ALLOCATABLE components", &code->loc);
6157           return;
6158         }
6159
6160       if (derived_inaccessible (ts->derived))
6161         {
6162           gfc_error ("Data transfer element at %L cannot have "
6163                      "PRIVATE components",&code->loc);
6164           return;
6165         }
6166     }
6167
6168   if (sym->as != NULL && sym->as->type == AS_ASSUMED_SIZE
6169       && exp->ref->type == REF_ARRAY && exp->ref->u.ar.type == AR_FULL)
6170     {
6171       gfc_error ("Data transfer element at %L cannot be a full reference to "
6172                  "an assumed-size array", &code->loc);
6173       return;
6174     }
6175 }
6176
6177
6178 /*********** Toplevel code resolution subroutines ***********/
6179
6180 /* Find the set of labels that are reachable from this block.  We also
6181    record the last statement in each block.  */
6182      
6183 static void
6184 find_reachable_labels (gfc_code *block)
6185 {
6186   gfc_code *c;
6187
6188   if (!block)
6189     return;
6190
6191   cs_base->reachable_labels = bitmap_obstack_alloc (&labels_obstack);
6192
6193   /* Collect labels in this block.  We don't keep those corresponding
6194      to END {IF|SELECT}, these are checked in resolve_branch by going
6195      up through the code_stack.  */
6196   for (c = block; c; c = c->next)
6197     {
6198       if (c->here && c->op != EXEC_END_BLOCK)
6199         bitmap_set_bit (cs_base->reachable_labels, c->here->value);
6200     }
6201
6202   /* Merge with labels from parent block.  */
6203   if (cs_base->prev)
6204     {
6205       gcc_assert (cs_base->prev->reachable_labels);
6206       bitmap_ior_into (cs_base->reachable_labels,
6207                        cs_base->prev->reachable_labels);
6208     }
6209 }
6210
6211 /* Given a branch to a label, see if the branch is conforming.
6212    The code node describes where the branch is located.  */
6213
6214 static void
6215 resolve_branch (gfc_st_label *label, gfc_code *code)
6216 {
6217   code_stack *stack;
6218
6219   if (label == NULL)
6220     return;
6221
6222   /* Step one: is this a valid branching target?  */
6223
6224   if (label->defined == ST_LABEL_UNKNOWN)
6225     {
6226       gfc_error ("Label %d referenced at %L is never defined", label->value,
6227                  &label->where);
6228       return;
6229     }
6230
6231   if (label->defined != ST_LABEL_TARGET)
6232     {
6233       gfc_error ("Statement at %L is not a valid branch target statement "
6234                  "for the branch statement at %L", &label->where, &code->loc);
6235       return;
6236     }
6237
6238   /* Step two: make sure this branch is not a branch to itself ;-)  */
6239
6240   if (code->here == label)
6241     {
6242       gfc_warning ("Branch at %L may result in an infinite loop", &code->loc);
6243       return;
6244     }
6245
6246   /* Step three:  See if the label is in the same block as the
6247      branching statement.  The hard work has been done by setting up
6248      the bitmap reachable_labels.  */
6249
6250   if (bitmap_bit_p (cs_base->reachable_labels, label->value))
6251     return;
6252
6253   /* Step four:  If we haven't found the label in the bitmap, it may
6254     still be the label of the END of the enclosing block, in which
6255     case we find it by going up the code_stack.  */
6256
6257   for (stack = cs_base; stack; stack = stack->prev)
6258     if (stack->current->next && stack->current->next->here == label)
6259       break;
6260
6261   if (stack)
6262     {
6263       gcc_assert (stack->current->next->op == EXEC_END_BLOCK);
6264       return;
6265     }
6266
6267   /* The label is not in an enclosing block, so illegal.  This was
6268      allowed in Fortran 66, so we allow it as extension.  No
6269      further checks are necessary in this case.  */
6270   gfc_notify_std (GFC_STD_LEGACY, "Label at %L is not in the same block "
6271                   "as the GOTO statement at %L", &label->where,
6272                   &code->loc);
6273   return;
6274 }
6275
6276
6277 /* Check whether EXPR1 has the same shape as EXPR2.  */
6278
6279 static gfc_try
6280 resolve_where_shape (gfc_expr *expr1, gfc_expr *expr2)
6281 {
6282   mpz_t shape[GFC_MAX_DIMENSIONS];
6283   mpz_t shape2[GFC_MAX_DIMENSIONS];
6284   gfc_try result = FAILURE;
6285   int i;
6286
6287   /* Compare the rank.  */
6288   if (expr1->rank != expr2->rank)
6289     return result;
6290
6291   /* Compare the size of each dimension.  */
6292   for (i=0; i<expr1->rank; i++)
6293     {
6294       if (gfc_array_dimen_size (expr1, i, &shape[i]) == FAILURE)
6295         goto ignore;
6296
6297       if (gfc_array_dimen_size (expr2, i, &shape2[i]) == FAILURE)
6298         goto ignore;
6299
6300       if (mpz_cmp (shape[i], shape2[i]))
6301         goto over;
6302     }
6303
6304   /* When either of the two expression is an assumed size array, we
6305      ignore the comparison of dimension sizes.  */
6306 ignore:
6307   result = SUCCESS;
6308
6309 over:
6310   for (i--; i >= 0; i--)
6311     {
6312       mpz_clear (shape[i]);
6313       mpz_clear (shape2[i]);
6314     }
6315   return result;
6316 }
6317
6318
6319 /* Check whether a WHERE assignment target or a WHERE mask expression
6320    has the same shape as the outmost WHERE mask expression.  */
6321
6322 static void
6323 resolve_where (gfc_code *code, gfc_expr *mask)
6324 {
6325   gfc_code *cblock;
6326   gfc_code *cnext;
6327   gfc_expr *e = NULL;
6328
6329   cblock = code->block;
6330
6331   /* Store the first WHERE mask-expr of the WHERE statement or construct.
6332      In case of nested WHERE, only the outmost one is stored.  */
6333   if (mask == NULL) /* outmost WHERE */
6334     e = cblock->expr1;
6335   else /* inner WHERE */
6336     e = mask;
6337
6338   while (cblock)
6339     {
6340       if (cblock->expr1)
6341         {
6342           /* Check if the mask-expr has a consistent shape with the
6343              outmost WHERE mask-expr.  */
6344           if (resolve_where_shape (cblock->expr1, e) == FAILURE)
6345             gfc_error ("WHERE mask at %L has inconsistent shape",
6346                        &cblock->expr1->where);
6347          }
6348
6349       /* the assignment statement of a WHERE statement, or the first
6350          statement in where-body-construct of a WHERE construct */
6351       cnext = cblock->next;
6352       while (cnext)
6353         {
6354           switch (cnext->op)
6355             {
6356             /* WHERE assignment statement */
6357             case EXEC_ASSIGN:
6358
6359               /* Check shape consistent for WHERE assignment target.  */
6360               if (e && resolve_where_shape (cnext->expr1, e) == FAILURE)
6361                gfc_error ("WHERE assignment target at %L has "
6362                           "inconsistent shape", &cnext->expr1->where);
6363               break;
6364
6365   
6366             case EXEC_ASSIGN_CALL:
6367               resolve_call (cnext);
6368               if (!cnext->resolved_sym->attr.elemental)
6369                 gfc_error("Non-ELEMENTAL user-defined assignment in WHERE at %L",
6370                           &cnext->ext.actual->expr->where);
6371               break;
6372
6373             /* WHERE or WHERE construct is part of a where-body-construct */
6374             case EXEC_WHERE:
6375               resolve_where (cnext, e);
6376               break;
6377
6378             default:
6379               gfc_error ("Unsupported statement inside WHERE at %L",
6380                          &cnext->loc);
6381             }
6382          /* the next statement within the same where-body-construct */
6383          cnext = cnext->next;
6384        }
6385     /* the next masked-elsewhere-stmt, elsewhere-stmt, or end-where-stmt */
6386     cblock = cblock->block;
6387   }
6388 }
6389
6390
6391 /* Resolve assignment in FORALL construct.
6392    NVAR is the number of FORALL index variables, and VAR_EXPR records the
6393    FORALL index variables.  */
6394
6395 static void
6396 gfc_resolve_assign_in_forall (gfc_code *code, int nvar, gfc_expr **var_expr)
6397 {
6398   int n;
6399
6400   for (n = 0; n < nvar; n++)
6401     {
6402       gfc_symbol *forall_index;
6403
6404       forall_index = var_expr[n]->symtree->n.sym;
6405
6406       /* Check whether the assignment target is one of the FORALL index
6407          variable.  */
6408       if ((code->expr1->expr_type == EXPR_VARIABLE)
6409           && (code->expr1->symtree->n.sym == forall_index))
6410         gfc_error ("Assignment to a FORALL index variable at %L",
6411                    &code->expr1->where);
6412       else
6413         {
6414           /* If one of the FORALL index variables doesn't appear in the
6415              assignment variable, then there could be a many-to-one
6416              assignment.  Emit a warning rather than an error because the
6417              mask could be resolving this problem.  */
6418           if (find_forall_index (code->expr1, forall_index, 0) == FAILURE)
6419             gfc_warning ("The FORALL with index '%s' is not used on the "
6420                          "left side of the assignment at %L and so might "
6421                          "cause multiple assignment to this object",
6422                          var_expr[n]->symtree->name, &code->expr1->where);
6423         }
6424     }
6425 }
6426
6427
6428 /* Resolve WHERE statement in FORALL construct.  */
6429
6430 static void
6431 gfc_resolve_where_code_in_forall (gfc_code *code, int nvar,
6432                                   gfc_expr **var_expr)
6433 {
6434   gfc_code *cblock;
6435   gfc_code *cnext;
6436
6437   cblock = code->block;
6438   while (cblock)
6439     {
6440       /* the assignment statement of a WHERE statement, or the first
6441          statement in where-body-construct of a WHERE construct */
6442       cnext = cblock->next;
6443       while (cnext)
6444         {
6445           switch (cnext->op)
6446             {
6447             /* WHERE assignment statement */
6448             case EXEC_ASSIGN:
6449               gfc_resolve_assign_in_forall (cnext, nvar, var_expr);
6450               break;
6451   
6452             /* WHERE operator assignment statement */
6453             case EXEC_ASSIGN_CALL:
6454               resolve_call (cnext);
6455               if (!cnext->resolved_sym->attr.elemental)
6456                 gfc_error("Non-ELEMENTAL user-defined assignment in WHERE at %L",
6457                           &cnext->ext.actual->expr->where);
6458               break;
6459
6460             /* WHERE or WHERE construct is part of a where-body-construct */
6461             case EXEC_WHERE:
6462               gfc_resolve_where_code_in_forall (cnext, nvar, var_expr);
6463               break;
6464
6465             default:
6466               gfc_error ("Unsupported statement inside WHERE at %L",
6467                          &cnext->loc);
6468             }
6469           /* the next statement within the same where-body-construct */
6470           cnext = cnext->next;
6471         }
6472       /* the next masked-elsewhere-stmt, elsewhere-stmt, or end-where-stmt */
6473       cblock = cblock->block;
6474     }
6475 }
6476
6477
6478 /* Traverse the FORALL body to check whether the following errors exist:
6479    1. For assignment, check if a many-to-one assignment happens.
6480    2. For WHERE statement, check the WHERE body to see if there is any
6481       many-to-one assignment.  */
6482
6483 static void
6484 gfc_resolve_forall_body (gfc_code *code, int nvar, gfc_expr **var_expr)
6485 {
6486   gfc_code *c;
6487
6488   c = code->block->next;
6489   while (c)
6490     {
6491       switch (c->op)
6492         {
6493         case EXEC_ASSIGN:
6494         case EXEC_POINTER_ASSIGN:
6495           gfc_resolve_assign_in_forall (c, nvar, var_expr);
6496           break;
6497
6498         case EXEC_ASSIGN_CALL:
6499           resolve_call (c);
6500           break;
6501
6502         /* Because the gfc_resolve_blocks() will handle the nested FORALL,
6503            there is no need to handle it here.  */
6504         case EXEC_FORALL:
6505           break;
6506         case EXEC_WHERE:
6507           gfc_resolve_where_code_in_forall(c, nvar, var_expr);
6508           break;
6509         default:
6510           break;
6511         }
6512       /* The next statement in the FORALL body.  */
6513       c = c->next;
6514     }
6515 }
6516
6517
6518 /* Counts the number of iterators needed inside a forall construct, including
6519    nested forall constructs. This is used to allocate the needed memory 
6520    in gfc_resolve_forall.  */
6521
6522 static int 
6523 gfc_count_forall_iterators (gfc_code *code)
6524 {
6525   int max_iters, sub_iters, current_iters;
6526   gfc_forall_iterator *fa;
6527
6528   gcc_assert(code->op == EXEC_FORALL);
6529   max_iters = 0;
6530   current_iters = 0;
6531
6532   for (fa = code->ext.forall_iterator; fa; fa = fa->next)
6533     current_iters ++;
6534   
6535   code = code->block->next;
6536
6537   while (code)
6538     {          
6539       if (code->op == EXEC_FORALL)
6540         {
6541           sub_iters = gfc_count_forall_iterators (code);
6542           if (sub_iters > max_iters)
6543             max_iters = sub_iters;
6544         }
6545       code = code->next;
6546     }
6547
6548   return current_iters + max_iters;
6549 }
6550
6551
6552 /* Given a FORALL construct, first resolve the FORALL iterator, then call
6553    gfc_resolve_forall_body to resolve the FORALL body.  */
6554
6555 static void
6556 gfc_resolve_forall (gfc_code *code, gfc_namespace *ns, int forall_save)
6557 {
6558   static gfc_expr **var_expr;
6559   static int total_var = 0;
6560   static int nvar = 0;
6561   int old_nvar, tmp;
6562   gfc_forall_iterator *fa;
6563   int i;
6564
6565   old_nvar = nvar;
6566
6567   /* Start to resolve a FORALL construct   */
6568   if (forall_save == 0)
6569     {
6570       /* Count the total number of FORALL index in the nested FORALL
6571          construct in order to allocate the VAR_EXPR with proper size.  */
6572       total_var = gfc_count_forall_iterators (code);
6573
6574       /* Allocate VAR_EXPR with NUMBER_OF_FORALL_INDEX elements.  */
6575       var_expr = (gfc_expr **) gfc_getmem (total_var * sizeof (gfc_expr *));
6576     }
6577
6578   /* The information about FORALL iterator, including FORALL index start, end
6579      and stride. The FORALL index can not appear in start, end or stride.  */
6580   for (fa = code->ext.forall_iterator; fa; fa = fa->next)
6581     {
6582       /* Check if any outer FORALL index name is the same as the current
6583          one.  */
6584       for (i = 0; i < nvar; i++)
6585         {
6586           if (fa->var->symtree->n.sym == var_expr[i]->symtree->n.sym)
6587             {
6588               gfc_error ("An outer FORALL construct already has an index "
6589                          "with this name %L", &fa->var->where);
6590             }
6591         }
6592
6593       /* Record the current FORALL index.  */
6594       var_expr[nvar] = gfc_copy_expr (fa->var);
6595
6596       nvar++;
6597
6598       /* No memory leak.  */
6599       gcc_assert (nvar <= total_var);
6600     }
6601
6602   /* Resolve the FORALL body.  */
6603   gfc_resolve_forall_body (code, nvar, var_expr);
6604
6605   /* May call gfc_resolve_forall to resolve the inner FORALL loop.  */
6606   gfc_resolve_blocks (code->block, ns);
6607
6608   tmp = nvar;
6609   nvar = old_nvar;
6610   /* Free only the VAR_EXPRs allocated in this frame.  */
6611   for (i = nvar; i < tmp; i++)
6612      gfc_free_expr (var_expr[i]);
6613
6614   if (nvar == 0)
6615     {
6616       /* We are in the outermost FORALL construct.  */
6617       gcc_assert (forall_save == 0);
6618
6619       /* VAR_EXPR is not needed any more.  */
6620       gfc_free (var_expr);
6621       total_var = 0;
6622     }
6623 }
6624
6625
6626 /* Resolve lists of blocks found in IF, SELECT CASE, WHERE, FORALL ,GOTO and
6627    DO code nodes.  */
6628
6629 static void resolve_code (gfc_code *, gfc_namespace *);
6630
6631 void
6632 gfc_resolve_blocks (gfc_code *b, gfc_namespace *ns)
6633 {
6634   gfc_try t;
6635
6636   for (; b; b = b->block)
6637     {
6638       t = gfc_resolve_expr (b->expr1);
6639       if (gfc_resolve_expr (b->expr2) == FAILURE)
6640         t = FAILURE;
6641
6642       switch (b->op)
6643         {
6644         case EXEC_IF:
6645           if (t == SUCCESS && b->expr1 != NULL
6646               && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank != 0))
6647             gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
6648                        &b->expr1->where);
6649           break;
6650
6651         case EXEC_WHERE:
6652           if (t == SUCCESS
6653               && b->expr1 != NULL
6654               && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank == 0))
6655             gfc_error ("WHERE/ELSEWHERE clause at %L requires a LOGICAL array",
6656                        &b->expr1->where);
6657           break;
6658
6659         case EXEC_GOTO:
6660           resolve_branch (b->label1, b);
6661           break;
6662
6663         case EXEC_SELECT:
6664         case EXEC_FORALL:
6665         case EXEC_DO:
6666         case EXEC_DO_WHILE:
6667         case EXEC_READ:
6668         case EXEC_WRITE:
6669         case EXEC_IOLENGTH:
6670         case EXEC_WAIT:
6671           break;
6672
6673         case EXEC_OMP_ATOMIC:
6674         case EXEC_OMP_CRITICAL:
6675         case EXEC_OMP_DO:
6676         case EXEC_OMP_MASTER:
6677         case EXEC_OMP_ORDERED:
6678         case EXEC_OMP_PARALLEL:
6679         case EXEC_OMP_PARALLEL_DO:
6680         case EXEC_OMP_PARALLEL_SECTIONS:
6681         case EXEC_OMP_PARALLEL_WORKSHARE:
6682         case EXEC_OMP_SECTIONS:
6683         case EXEC_OMP_SINGLE:
6684         case EXEC_OMP_TASK:
6685         case EXEC_OMP_TASKWAIT:
6686         case EXEC_OMP_WORKSHARE:
6687           break;
6688
6689         default:
6690           gfc_internal_error ("resolve_block(): Bad block type");
6691         }
6692
6693       resolve_code (b->next, ns);
6694     }
6695 }
6696
6697
6698 /* Does everything to resolve an ordinary assignment.  Returns true
6699    if this is an interface assignment.  */
6700 static bool
6701 resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns)
6702 {
6703   bool rval = false;
6704   gfc_expr *lhs;
6705   gfc_expr *rhs;
6706   int llen = 0;
6707   int rlen = 0;
6708   int n;
6709   gfc_ref *ref;
6710
6711   if (gfc_extend_assign (code, ns) == SUCCESS)
6712     {
6713       lhs = code->ext.actual->expr;
6714       rhs = code->ext.actual->next->expr;
6715       if (gfc_pure (NULL) && !gfc_pure (code->symtree->n.sym))
6716         {
6717           gfc_error ("Subroutine '%s' called instead of assignment at "
6718                      "%L must be PURE", code->symtree->n.sym->name,
6719                      &code->loc);
6720           return rval;
6721         }
6722
6723       /* Make a temporary rhs when there is a default initializer
6724          and rhs is the same symbol as the lhs.  */
6725       if (rhs->expr_type == EXPR_VARIABLE
6726             && rhs->symtree->n.sym->ts.type == BT_DERIVED
6727             && has_default_initializer (rhs->symtree->n.sym->ts.derived)
6728             && (lhs->symtree->n.sym == rhs->symtree->n.sym))
6729         code->ext.actual->next->expr = gfc_get_parentheses (rhs);
6730
6731       return true;
6732     }
6733
6734   lhs = code->expr1;
6735   rhs = code->expr2;
6736
6737   if (rhs->is_boz
6738       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L outside "
6739                          "a DATA statement and outside INT/REAL/DBLE/CMPLX",
6740                          &code->loc) == FAILURE)
6741     return false;
6742
6743   /* Handle the case of a BOZ literal on the RHS.  */
6744   if (rhs->is_boz && lhs->ts.type != BT_INTEGER)
6745     {
6746       int rc;
6747       if (gfc_option.warn_surprising)
6748         gfc_warning ("BOZ literal at %L is bitwise transferred "
6749                      "non-integer symbol '%s'", &code->loc,
6750                      lhs->symtree->n.sym->name);
6751
6752       if (!gfc_convert_boz (rhs, &lhs->ts))
6753         return false;
6754       if ((rc = gfc_range_check (rhs)) != ARITH_OK)
6755         {
6756           if (rc == ARITH_UNDERFLOW)
6757             gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
6758                        ". This check can be disabled with the option "
6759                        "-fno-range-check", &rhs->where);
6760           else if (rc == ARITH_OVERFLOW)
6761             gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
6762                        ". This check can be disabled with the option "
6763                        "-fno-range-check", &rhs->where);
6764           else if (rc == ARITH_NAN)
6765             gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
6766                        ". This check can be disabled with the option "
6767                        "-fno-range-check", &rhs->where);
6768           return false;
6769         }
6770     }
6771
6772
6773   if (lhs->ts.type == BT_CHARACTER
6774         && gfc_option.warn_character_truncation)
6775     {
6776       if (lhs->ts.cl != NULL
6777             && lhs->ts.cl->length != NULL
6778             && lhs->ts.cl->length->expr_type == EXPR_CONSTANT)
6779         llen = mpz_get_si (lhs->ts.cl->length->value.integer);
6780
6781       if (rhs->expr_type == EXPR_CONSTANT)
6782         rlen = rhs->value.character.length;
6783
6784       else if (rhs->ts.cl != NULL
6785                  && rhs->ts.cl->length != NULL
6786                  && rhs->ts.cl->length->expr_type == EXPR_CONSTANT)
6787         rlen = mpz_get_si (rhs->ts.cl->length->value.integer);
6788
6789       if (rlen && llen && rlen > llen)
6790         gfc_warning_now ("CHARACTER expression will be truncated "
6791                          "in assignment (%d/%d) at %L",
6792                          llen, rlen, &code->loc);
6793     }
6794
6795   /* Ensure that a vector index expression for the lvalue is evaluated
6796      to a temporary if the lvalue symbol is referenced in it.  */
6797   if (lhs->rank)
6798     {
6799       for (ref = lhs->ref; ref; ref= ref->next)
6800         if (ref->type == REF_ARRAY)
6801           {
6802             for (n = 0; n < ref->u.ar.dimen; n++)
6803               if (ref->u.ar.dimen_type[n] == DIMEN_VECTOR
6804                   && gfc_find_sym_in_expr (lhs->symtree->n.sym,
6805                                            ref->u.ar.start[n]))
6806                 ref->u.ar.start[n]
6807                         = gfc_get_parentheses (ref->u.ar.start[n]);
6808           }
6809     }
6810
6811   if (gfc_pure (NULL))
6812     {
6813       if (gfc_impure_variable (lhs->symtree->n.sym))
6814         {
6815           gfc_error ("Cannot assign to variable '%s' in PURE "
6816                      "procedure at %L",
6817                       lhs->symtree->n.sym->name,
6818                       &lhs->where);
6819           return rval;
6820         }
6821
6822       if (lhs->ts.type == BT_DERIVED
6823             && lhs->expr_type == EXPR_VARIABLE
6824             && lhs->ts.derived->attr.pointer_comp
6825             && gfc_impure_variable (rhs->symtree->n.sym))
6826         {
6827           gfc_error ("The impure variable at %L is assigned to "
6828                      "a derived type variable with a POINTER "
6829                      "component in a PURE procedure (12.6)",
6830                      &rhs->where);
6831           return rval;
6832         }
6833     }
6834
6835   gfc_check_assign (lhs, rhs, 1);
6836   return false;
6837 }
6838
6839 /* Given a block of code, recursively resolve everything pointed to by this
6840    code block.  */
6841
6842 static void
6843 resolve_code (gfc_code *code, gfc_namespace *ns)
6844 {
6845   int omp_workshare_save;
6846   int forall_save;
6847   code_stack frame;
6848   gfc_try t;
6849
6850   frame.prev = cs_base;
6851   frame.head = code;
6852   cs_base = &frame;
6853
6854   find_reachable_labels (code);
6855
6856   for (; code; code = code->next)
6857     {
6858       frame.current = code;
6859       forall_save = forall_flag;
6860
6861       if (code->op == EXEC_FORALL)
6862         {
6863           forall_flag = 1;
6864           gfc_resolve_forall (code, ns, forall_save);
6865           forall_flag = 2;
6866         }
6867       else if (code->block)
6868         {
6869           omp_workshare_save = -1;
6870           switch (code->op)
6871             {
6872             case EXEC_OMP_PARALLEL_WORKSHARE:
6873               omp_workshare_save = omp_workshare_flag;
6874               omp_workshare_flag = 1;
6875               gfc_resolve_omp_parallel_blocks (code, ns);
6876               break;
6877             case EXEC_OMP_PARALLEL:
6878             case EXEC_OMP_PARALLEL_DO:
6879             case EXEC_OMP_PARALLEL_SECTIONS:
6880             case EXEC_OMP_TASK:
6881               omp_workshare_save = omp_workshare_flag;
6882               omp_workshare_flag = 0;
6883               gfc_resolve_omp_parallel_blocks (code, ns);
6884               break;
6885             case EXEC_OMP_DO:
6886               gfc_resolve_omp_do_blocks (code, ns);
6887               break;
6888             case EXEC_OMP_WORKSHARE:
6889               omp_workshare_save = omp_workshare_flag;
6890               omp_workshare_flag = 1;
6891               /* FALLTHROUGH */
6892             default:
6893               gfc_resolve_blocks (code->block, ns);
6894               break;
6895             }
6896
6897           if (omp_workshare_save != -1)
6898             omp_workshare_flag = omp_workshare_save;
6899         }
6900
6901       t = SUCCESS;
6902       if (code->op != EXEC_COMPCALL && code->op != EXEC_CALL_PPC)
6903         t = gfc_resolve_expr (code->expr1);
6904       forall_flag = forall_save;
6905
6906       if (gfc_resolve_expr (code->expr2) == FAILURE)
6907         t = FAILURE;
6908
6909       switch (code->op)
6910         {
6911         case EXEC_NOP:
6912         case EXEC_END_BLOCK:
6913         case EXEC_CYCLE:
6914         case EXEC_PAUSE:
6915         case EXEC_STOP:
6916         case EXEC_EXIT:
6917         case EXEC_CONTINUE:
6918         case EXEC_DT_END:
6919           break;
6920
6921         case EXEC_ENTRY:
6922           /* Keep track of which entry we are up to.  */
6923           current_entry_id = code->ext.entry->id;
6924           break;
6925
6926         case EXEC_WHERE:
6927           resolve_where (code, NULL);
6928           break;
6929
6930         case EXEC_GOTO:
6931           if (code->expr1 != NULL)
6932             {
6933               if (code->expr1->ts.type != BT_INTEGER)
6934                 gfc_error ("ASSIGNED GOTO statement at %L requires an "
6935                            "INTEGER variable", &code->expr1->where);
6936               else if (code->expr1->symtree->n.sym->attr.assign != 1)
6937                 gfc_error ("Variable '%s' has not been assigned a target "
6938                            "label at %L", code->expr1->symtree->n.sym->name,
6939                            &code->expr1->where);
6940             }
6941           else
6942             resolve_branch (code->label1, code);
6943           break;
6944
6945         case EXEC_RETURN:
6946           if (code->expr1 != NULL
6947                 && (code->expr1->ts.type != BT_INTEGER || code->expr1->rank))
6948             gfc_error ("Alternate RETURN statement at %L requires a SCALAR-"
6949                        "INTEGER return specifier", &code->expr1->where);
6950           break;
6951
6952         case EXEC_INIT_ASSIGN:
6953         case EXEC_END_PROCEDURE:
6954           break;
6955
6956         case EXEC_ASSIGN:
6957           if (t == FAILURE)
6958             break;
6959
6960           if (resolve_ordinary_assign (code, ns))
6961             goto call;
6962
6963           break;
6964
6965         case EXEC_LABEL_ASSIGN:
6966           if (code->label1->defined == ST_LABEL_UNKNOWN)
6967             gfc_error ("Label %d referenced at %L is never defined",
6968                        code->label1->value, &code->label1->where);
6969           if (t == SUCCESS
6970               && (code->expr1->expr_type != EXPR_VARIABLE
6971                   || code->expr1->symtree->n.sym->ts.type != BT_INTEGER
6972                   || code->expr1->symtree->n.sym->ts.kind
6973                      != gfc_default_integer_kind
6974                   || code->expr1->symtree->n.sym->as != NULL))
6975             gfc_error ("ASSIGN statement at %L requires a scalar "
6976                        "default INTEGER variable", &code->expr1->where);
6977           break;
6978
6979         case EXEC_POINTER_ASSIGN:
6980           if (t == FAILURE)
6981             break;
6982
6983           gfc_check_pointer_assign (code->expr1, code->expr2);
6984           break;
6985
6986         case EXEC_ARITHMETIC_IF:
6987           if (t == SUCCESS
6988               && code->expr1->ts.type != BT_INTEGER
6989               && code->expr1->ts.type != BT_REAL)
6990             gfc_error ("Arithmetic IF statement at %L requires a numeric "
6991                        "expression", &code->expr1->where);
6992
6993           resolve_branch (code->label1, code);
6994           resolve_branch (code->label2, code);
6995           resolve_branch (code->label3, code);
6996           break;
6997
6998         case EXEC_IF:
6999           if (t == SUCCESS && code->expr1 != NULL
7000               && (code->expr1->ts.type != BT_LOGICAL
7001                   || code->expr1->rank != 0))
7002             gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
7003                        &code->expr1->where);
7004           break;
7005
7006         case EXEC_CALL:
7007         call:
7008           resolve_call (code);
7009           break;
7010
7011         case EXEC_COMPCALL:
7012           resolve_typebound_call (code);
7013           break;
7014
7015         case EXEC_CALL_PPC:
7016           resolve_ppc_call (code);
7017           break;
7018
7019         case EXEC_SELECT:
7020           /* Select is complicated. Also, a SELECT construct could be
7021              a transformed computed GOTO.  */
7022           resolve_select (code);
7023           break;
7024
7025         case EXEC_DO:
7026           if (code->ext.iterator != NULL)
7027             {
7028               gfc_iterator *iter = code->ext.iterator;
7029               if (gfc_resolve_iterator (iter, true) != FAILURE)
7030                 gfc_resolve_do_iterator (code, iter->var->symtree->n.sym);
7031             }
7032           break;
7033
7034         case EXEC_DO_WHILE:
7035           if (code->expr1 == NULL)
7036             gfc_internal_error ("resolve_code(): No expression on DO WHILE");
7037           if (t == SUCCESS
7038               && (code->expr1->rank != 0
7039                   || code->expr1->ts.type != BT_LOGICAL))
7040             gfc_error ("Exit condition of DO WHILE loop at %L must be "
7041                        "a scalar LOGICAL expression", &code->expr1->where);
7042           break;
7043
7044         case EXEC_ALLOCATE:
7045           if (t == SUCCESS)
7046             resolve_allocate_deallocate (code, "ALLOCATE");
7047
7048           break;
7049
7050         case EXEC_DEALLOCATE:
7051           if (t == SUCCESS)
7052             resolve_allocate_deallocate (code, "DEALLOCATE");
7053
7054           break;
7055
7056         case EXEC_OPEN:
7057           if (gfc_resolve_open (code->ext.open) == FAILURE)
7058             break;
7059
7060           resolve_branch (code->ext.open->err, code);
7061           break;
7062
7063         case EXEC_CLOSE:
7064           if (gfc_resolve_close (code->ext.close) == FAILURE)
7065             break;
7066
7067           resolve_branch (code->ext.close->err, code);
7068           break;
7069
7070         case EXEC_BACKSPACE:
7071         case EXEC_ENDFILE:
7072         case EXEC_REWIND:
7073         case EXEC_FLUSH:
7074           if (gfc_resolve_filepos (code->ext.filepos) == FAILURE)
7075             break;
7076
7077           resolve_branch (code->ext.filepos->err, code);
7078           break;
7079
7080         case EXEC_INQUIRE:
7081           if (gfc_resolve_inquire (code->ext.inquire) == FAILURE)
7082               break;
7083
7084           resolve_branch (code->ext.inquire->err, code);
7085           break;
7086
7087         case EXEC_IOLENGTH:
7088           gcc_assert (code->ext.inquire != NULL);
7089           if (gfc_resolve_inquire (code->ext.inquire) == FAILURE)
7090             break;
7091
7092           resolve_branch (code->ext.inquire->err, code);
7093           break;
7094
7095         case EXEC_WAIT:
7096           if (gfc_resolve_wait (code->ext.wait) == FAILURE)
7097             break;
7098
7099           resolve_branch (code->ext.wait->err, code);
7100           resolve_branch (code->ext.wait->end, code);
7101           resolve_branch (code->ext.wait->eor, code);
7102           break;
7103
7104         case EXEC_READ:
7105         case EXEC_WRITE:
7106           if (gfc_resolve_dt (code->ext.dt) == FAILURE)
7107             break;
7108
7109           resolve_branch (code->ext.dt->err, code);
7110           resolve_branch (code->ext.dt->end, code);
7111           resolve_branch (code->ext.dt->eor, code);
7112           break;
7113
7114         case EXEC_TRANSFER:
7115           resolve_transfer (code);
7116           break;
7117
7118         case EXEC_FORALL:
7119           resolve_forall_iterators (code->ext.forall_iterator);
7120
7121           if (code->expr1 != NULL && code->expr1->ts.type != BT_LOGICAL)
7122             gfc_error ("FORALL mask clause at %L requires a LOGICAL "
7123                        "expression", &code->expr1->where);
7124           break;
7125
7126         case EXEC_OMP_ATOMIC:
7127         case EXEC_OMP_BARRIER:
7128         case EXEC_OMP_CRITICAL:
7129         case EXEC_OMP_FLUSH:
7130         case EXEC_OMP_DO:
7131         case EXEC_OMP_MASTER:
7132         case EXEC_OMP_ORDERED:
7133         case EXEC_OMP_SECTIONS:
7134         case EXEC_OMP_SINGLE:
7135         case EXEC_OMP_TASKWAIT:
7136         case EXEC_OMP_WORKSHARE:
7137           gfc_resolve_omp_directive (code, ns);
7138           break;
7139
7140         case EXEC_OMP_PARALLEL:
7141         case EXEC_OMP_PARALLEL_DO:
7142         case EXEC_OMP_PARALLEL_SECTIONS:
7143         case EXEC_OMP_PARALLEL_WORKSHARE:
7144         case EXEC_OMP_TASK:
7145           omp_workshare_save = omp_workshare_flag;
7146           omp_workshare_flag = 0;
7147           gfc_resolve_omp_directive (code, ns);
7148           omp_workshare_flag = omp_workshare_save;
7149           break;
7150
7151         default:
7152           gfc_internal_error ("resolve_code(): Bad statement code");
7153         }
7154     }
7155
7156   cs_base = frame.prev;
7157 }
7158
7159
7160 /* Resolve initial values and make sure they are compatible with
7161    the variable.  */
7162
7163 static void
7164 resolve_values (gfc_symbol *sym)
7165 {
7166   if (sym->value == NULL)
7167     return;
7168
7169   if (gfc_resolve_expr (sym->value) == FAILURE)
7170     return;
7171
7172   gfc_check_assign_symbol (sym, sym->value);
7173 }
7174
7175
7176 /* Verify the binding labels for common blocks that are BIND(C).  The label
7177    for a BIND(C) common block must be identical in all scoping units in which
7178    the common block is declared.  Further, the binding label can not collide
7179    with any other global entity in the program.  */
7180
7181 static void
7182 resolve_bind_c_comms (gfc_symtree *comm_block_tree)
7183 {
7184   if (comm_block_tree->n.common->is_bind_c == 1)
7185     {
7186       gfc_gsymbol *binding_label_gsym;
7187       gfc_gsymbol *comm_name_gsym;
7188
7189       /* See if a global symbol exists by the common block's name.  It may
7190          be NULL if the common block is use-associated.  */
7191       comm_name_gsym = gfc_find_gsymbol (gfc_gsym_root,
7192                                          comm_block_tree->n.common->name);
7193       if (comm_name_gsym != NULL && comm_name_gsym->type != GSYM_COMMON)
7194         gfc_error ("Binding label '%s' for common block '%s' at %L collides "
7195                    "with the global entity '%s' at %L",
7196                    comm_block_tree->n.common->binding_label,
7197                    comm_block_tree->n.common->name,
7198                    &(comm_block_tree->n.common->where),
7199                    comm_name_gsym->name, &(comm_name_gsym->where));
7200       else if (comm_name_gsym != NULL
7201                && strcmp (comm_name_gsym->name,
7202                           comm_block_tree->n.common->name) == 0)
7203         {
7204           /* TODO: Need to make sure the fields of gfc_gsymbol are initialized
7205              as expected.  */
7206           if (comm_name_gsym->binding_label == NULL)
7207             /* No binding label for common block stored yet; save this one.  */
7208             comm_name_gsym->binding_label =
7209               comm_block_tree->n.common->binding_label;
7210           else
7211             if (strcmp (comm_name_gsym->binding_label,
7212                         comm_block_tree->n.common->binding_label) != 0)
7213               {
7214                 /* Common block names match but binding labels do not.  */
7215                 gfc_error ("Binding label '%s' for common block '%s' at %L "
7216                            "does not match the binding label '%s' for common "
7217                            "block '%s' at %L",
7218                            comm_block_tree->n.common->binding_label,
7219                            comm_block_tree->n.common->name,
7220                            &(comm_block_tree->n.common->where),
7221                            comm_name_gsym->binding_label,
7222                            comm_name_gsym->name,
7223                            &(comm_name_gsym->where));
7224                 return;
7225               }
7226         }
7227
7228       /* There is no binding label (NAME="") so we have nothing further to
7229          check and nothing to add as a global symbol for the label.  */
7230       if (comm_block_tree->n.common->binding_label[0] == '\0' )
7231         return;
7232       
7233       binding_label_gsym =
7234         gfc_find_gsymbol (gfc_gsym_root,
7235                           comm_block_tree->n.common->binding_label);
7236       if (binding_label_gsym == NULL)
7237         {
7238           /* Need to make a global symbol for the binding label to prevent
7239              it from colliding with another.  */
7240           binding_label_gsym =
7241             gfc_get_gsymbol (comm_block_tree->n.common->binding_label);
7242           binding_label_gsym->sym_name = comm_block_tree->n.common->name;
7243           binding_label_gsym->type = GSYM_COMMON;
7244         }
7245       else
7246         {
7247           /* If comm_name_gsym is NULL, the name common block is use
7248              associated and the name could be colliding.  */
7249           if (binding_label_gsym->type != GSYM_COMMON)
7250             gfc_error ("Binding label '%s' for common block '%s' at %L "
7251                        "collides with the global entity '%s' at %L",
7252                        comm_block_tree->n.common->binding_label,
7253                        comm_block_tree->n.common->name,
7254                        &(comm_block_tree->n.common->where),
7255                        binding_label_gsym->name,
7256                        &(binding_label_gsym->where));
7257           else if (comm_name_gsym != NULL
7258                    && (strcmp (binding_label_gsym->name,
7259                                comm_name_gsym->binding_label) != 0)
7260                    && (strcmp (binding_label_gsym->sym_name,
7261                                comm_name_gsym->name) != 0))
7262             gfc_error ("Binding label '%s' for common block '%s' at %L "
7263                        "collides with global entity '%s' at %L",
7264                        binding_label_gsym->name, binding_label_gsym->sym_name,
7265                        &(comm_block_tree->n.common->where),
7266                        comm_name_gsym->name, &(comm_name_gsym->where));
7267         }
7268     }
7269   
7270   return;
7271 }
7272
7273
7274 /* Verify any BIND(C) derived types in the namespace so we can report errors
7275    for them once, rather than for each variable declared of that type.  */
7276
7277 static void
7278 resolve_bind_c_derived_types (gfc_symbol *derived_sym)
7279 {
7280   if (derived_sym != NULL && derived_sym->attr.flavor == FL_DERIVED
7281       && derived_sym->attr.is_bind_c == 1)
7282     verify_bind_c_derived_type (derived_sym);
7283   
7284   return;
7285 }
7286
7287
7288 /* Verify that any binding labels used in a given namespace do not collide 
7289    with the names or binding labels of any global symbols.  */
7290
7291 static void
7292 gfc_verify_binding_labels (gfc_symbol *sym)
7293 {
7294   int has_error = 0;
7295   
7296   if (sym != NULL && sym->attr.is_bind_c && sym->attr.is_iso_c == 0 
7297       && sym->attr.flavor != FL_DERIVED && sym->binding_label[0] != '\0')
7298     {
7299       gfc_gsymbol *bind_c_sym;
7300
7301       bind_c_sym = gfc_find_gsymbol (gfc_gsym_root, sym->binding_label);
7302       if (bind_c_sym != NULL 
7303           && strcmp (bind_c_sym->name, sym->binding_label) == 0)
7304         {
7305           if (sym->attr.if_source == IFSRC_DECL 
7306               && (bind_c_sym->type != GSYM_SUBROUTINE 
7307                   && bind_c_sym->type != GSYM_FUNCTION) 
7308               && ((sym->attr.contained == 1 
7309                    && strcmp (bind_c_sym->sym_name, sym->name) != 0) 
7310                   || (sym->attr.use_assoc == 1 
7311                       && (strcmp (bind_c_sym->mod_name, sym->module) != 0))))
7312             {
7313               /* Make sure global procedures don't collide with anything.  */
7314               gfc_error ("Binding label '%s' at %L collides with the global "
7315                          "entity '%s' at %L", sym->binding_label,
7316                          &(sym->declared_at), bind_c_sym->name,
7317                          &(bind_c_sym->where));
7318               has_error = 1;
7319             }
7320           else if (sym->attr.contained == 0 
7321                    && (sym->attr.if_source == IFSRC_IFBODY 
7322                        && sym->attr.flavor == FL_PROCEDURE) 
7323                    && (bind_c_sym->sym_name != NULL 
7324                        && strcmp (bind_c_sym->sym_name, sym->name) != 0))
7325             {
7326               /* Make sure procedures in interface bodies don't collide.  */
7327               gfc_error ("Binding label '%s' in interface body at %L collides "
7328                          "with the global entity '%s' at %L",
7329                          sym->binding_label,
7330                          &(sym->declared_at), bind_c_sym->name,
7331                          &(bind_c_sym->where));
7332               has_error = 1;
7333             }
7334           else if (sym->attr.contained == 0 
7335                    && sym->attr.if_source == IFSRC_UNKNOWN)
7336             if ((sym->attr.use_assoc && bind_c_sym->mod_name
7337                  && strcmp (bind_c_sym->mod_name, sym->module) != 0) 
7338                 || sym->attr.use_assoc == 0)
7339               {
7340                 gfc_error ("Binding label '%s' at %L collides with global "
7341                            "entity '%s' at %L", sym->binding_label,
7342                            &(sym->declared_at), bind_c_sym->name,
7343                            &(bind_c_sym->where));
7344                 has_error = 1;
7345               }
7346
7347           if (has_error != 0)
7348             /* Clear the binding label to prevent checking multiple times.  */
7349             sym->binding_label[0] = '\0';
7350         }
7351       else if (bind_c_sym == NULL)
7352         {
7353           bind_c_sym = gfc_get_gsymbol (sym->binding_label);
7354           bind_c_sym->where = sym->declared_at;
7355           bind_c_sym->sym_name = sym->name;
7356
7357           if (sym->attr.use_assoc == 1)
7358             bind_c_sym->mod_name = sym->module;
7359           else
7360             if (sym->ns->proc_name != NULL)
7361               bind_c_sym->mod_name = sym->ns->proc_name->name;
7362
7363           if (sym->attr.contained == 0)
7364             {
7365               if (sym->attr.subroutine)
7366                 bind_c_sym->type = GSYM_SUBROUTINE;
7367               else if (sym->attr.function)
7368                 bind_c_sym->type = GSYM_FUNCTION;
7369             }
7370         }
7371     }
7372   return;
7373 }
7374
7375
7376 /* Resolve an index expression.  */
7377
7378 static gfc_try
7379 resolve_index_expr (gfc_expr *e)
7380 {
7381   if (gfc_resolve_expr (e) == FAILURE)
7382     return FAILURE;
7383
7384   if (gfc_simplify_expr (e, 0) == FAILURE)
7385     return FAILURE;
7386
7387   if (gfc_specification_expr (e) == FAILURE)
7388     return FAILURE;
7389
7390   return SUCCESS;
7391 }
7392
7393 /* Resolve a charlen structure.  */
7394
7395 static gfc_try
7396 resolve_charlen (gfc_charlen *cl)
7397 {
7398   int i, k;
7399
7400   if (cl->resolved)
7401     return SUCCESS;
7402
7403   cl->resolved = 1;
7404
7405   specification_expr = 1;
7406
7407   if (resolve_index_expr (cl->length) == FAILURE)
7408     {
7409       specification_expr = 0;
7410       return FAILURE;
7411     }
7412
7413   /* "If the character length parameter value evaluates to a negative
7414      value, the length of character entities declared is zero."  */
7415   if (cl->length && !gfc_extract_int (cl->length, &i) && i < 0)
7416     {
7417       gfc_warning_now ("CHARACTER variable has zero length at %L",
7418                        &cl->length->where);
7419       gfc_replace_expr (cl->length, gfc_int_expr (0));
7420     }
7421
7422   /* Check that the character length is not too large.  */
7423   k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
7424   if (cl->length && cl->length->expr_type == EXPR_CONSTANT
7425       && cl->length->ts.type == BT_INTEGER
7426       && mpz_cmp (cl->length->value.integer, gfc_integer_kinds[k].huge) > 0)
7427     {
7428       gfc_error ("String length at %L is too large", &cl->length->where);
7429       return FAILURE;
7430     }
7431
7432   return SUCCESS;
7433 }
7434
7435
7436 /* Test for non-constant shape arrays.  */
7437
7438 static bool
7439 is_non_constant_shape_array (gfc_symbol *sym)
7440 {
7441   gfc_expr *e;
7442   int i;
7443   bool not_constant;
7444
7445   not_constant = false;
7446   if (sym->as != NULL)
7447     {
7448       /* Unfortunately, !gfc_is_compile_time_shape hits a legal case that
7449          has not been simplified; parameter array references.  Do the
7450          simplification now.  */
7451       for (i = 0; i < sym->as->rank; i++)
7452         {
7453           e = sym->as->lower[i];
7454           if (e && (resolve_index_expr (e) == FAILURE
7455                     || !gfc_is_constant_expr (e)))
7456             not_constant = true;
7457
7458           e = sym->as->upper[i];
7459           if (e && (resolve_index_expr (e) == FAILURE
7460                     || !gfc_is_constant_expr (e)))
7461             not_constant = true;
7462         }
7463     }
7464   return not_constant;
7465 }
7466
7467 /* Given a symbol and an initialization expression, add code to initialize
7468    the symbol to the function entry.  */
7469 static void
7470 build_init_assign (gfc_symbol *sym, gfc_expr *init)
7471 {
7472   gfc_expr *lval;
7473   gfc_code *init_st;
7474   gfc_namespace *ns = sym->ns;
7475
7476   /* Search for the function namespace if this is a contained
7477      function without an explicit result.  */
7478   if (sym->attr.function && sym == sym->result
7479       && sym->name != sym->ns->proc_name->name)
7480     {
7481       ns = ns->contained;
7482       for (;ns; ns = ns->sibling)
7483         if (strcmp (ns->proc_name->name, sym->name) == 0)
7484           break;
7485     }
7486
7487   if (ns == NULL)
7488     {
7489       gfc_free_expr (init);
7490       return;
7491     }
7492
7493   /* Build an l-value expression for the result.  */
7494   lval = gfc_lval_expr_from_sym (sym);
7495
7496   /* Add the code at scope entry.  */
7497   init_st = gfc_get_code ();
7498   init_st->next = ns->code;
7499   ns->code = init_st;
7500
7501   /* Assign the default initializer to the l-value.  */
7502   init_st->loc = sym->declared_at;
7503   init_st->op = EXEC_INIT_ASSIGN;
7504   init_st->expr1 = lval;
7505   init_st->expr2 = init;
7506 }
7507
7508 /* Assign the default initializer to a derived type variable or result.  */
7509
7510 static void
7511 apply_default_init (gfc_symbol *sym)
7512 {
7513   gfc_expr *init = NULL;
7514
7515   if (sym->attr.flavor != FL_VARIABLE && !sym->attr.function)
7516     return;
7517
7518   if (sym->ts.type == BT_DERIVED && sym->ts.derived)
7519     init = gfc_default_initializer (&sym->ts);
7520
7521   if (init == NULL)
7522     return;
7523
7524   build_init_assign (sym, init);
7525 }
7526
7527 /* Build an initializer for a local integer, real, complex, logical, or
7528    character variable, based on the command line flags finit-local-zero,
7529    finit-integer=, finit-real=, finit-logical=, and finit-runtime.  Returns 
7530    null if the symbol should not have a default initialization.  */
7531 static gfc_expr *
7532 build_default_init_expr (gfc_symbol *sym)
7533 {
7534   int char_len;
7535   gfc_expr *init_expr;
7536   int i;
7537
7538   /* These symbols should never have a default initialization.  */
7539   if ((sym->attr.dimension && !gfc_is_compile_time_shape (sym->as))
7540       || sym->attr.external
7541       || sym->attr.dummy
7542       || sym->attr.pointer
7543       || sym->attr.in_equivalence
7544       || sym->attr.in_common
7545       || sym->attr.data
7546       || sym->module
7547       || sym->attr.cray_pointee
7548       || sym->attr.cray_pointer)
7549     return NULL;
7550
7551   /* Now we'll try to build an initializer expression.  */
7552   init_expr = gfc_get_expr ();
7553   init_expr->expr_type = EXPR_CONSTANT;
7554   init_expr->ts.type = sym->ts.type;
7555   init_expr->ts.kind = sym->ts.kind;
7556   init_expr->where = sym->declared_at;
7557   
7558   /* We will only initialize integers, reals, complex, logicals, and
7559      characters, and only if the corresponding command-line flags
7560      were set.  Otherwise, we free init_expr and return null.  */
7561   switch (sym->ts.type)
7562     {    
7563     case BT_INTEGER:
7564       if (gfc_option.flag_init_integer != GFC_INIT_INTEGER_OFF)
7565         mpz_init_set_si (init_expr->value.integer, 
7566                          gfc_option.flag_init_integer_value);
7567       else
7568         {
7569           gfc_free_expr (init_expr);
7570           init_expr = NULL;
7571         }
7572       break;
7573
7574     case BT_REAL:
7575       mpfr_init (init_expr->value.real);
7576       switch (gfc_option.flag_init_real)
7577         {
7578         case GFC_INIT_REAL_SNAN:
7579           init_expr->is_snan = 1;
7580           /* Fall through.  */
7581         case GFC_INIT_REAL_NAN:
7582           mpfr_set_nan (init_expr->value.real);
7583           break;
7584
7585         case GFC_INIT_REAL_INF:
7586           mpfr_set_inf (init_expr->value.real, 1);
7587           break;
7588
7589         case GFC_INIT_REAL_NEG_INF:
7590           mpfr_set_inf (init_expr->value.real, -1);
7591           break;
7592
7593         case GFC_INIT_REAL_ZERO:
7594           mpfr_set_ui (init_expr->value.real, 0.0, GFC_RND_MODE);
7595           break;
7596
7597         default:
7598           gfc_free_expr (init_expr);
7599           init_expr = NULL;
7600           break;
7601         }
7602       break;
7603           
7604     case BT_COMPLEX:
7605       mpfr_init (init_expr->value.complex.r);
7606       mpfr_init (init_expr->value.complex.i);
7607       switch (gfc_option.flag_init_real)
7608         {
7609         case GFC_INIT_REAL_SNAN:
7610           init_expr->is_snan = 1;
7611           /* Fall through.  */
7612         case GFC_INIT_REAL_NAN:
7613           mpfr_set_nan (init_expr->value.complex.r);
7614           mpfr_set_nan (init_expr->value.complex.i);
7615           break;
7616
7617         case GFC_INIT_REAL_INF:
7618           mpfr_set_inf (init_expr->value.complex.r, 1);
7619           mpfr_set_inf (init_expr->value.complex.i, 1);
7620           break;
7621
7622         case GFC_INIT_REAL_NEG_INF:
7623           mpfr_set_inf (init_expr->value.complex.r, -1);
7624           mpfr_set_inf (init_expr->value.complex.i, -1);
7625           break;
7626
7627         case GFC_INIT_REAL_ZERO:
7628           mpfr_set_ui (init_expr->value.complex.r, 0.0, GFC_RND_MODE);
7629           mpfr_set_ui (init_expr->value.complex.i, 0.0, GFC_RND_MODE);
7630           break;
7631
7632         default:
7633           gfc_free_expr (init_expr);
7634           init_expr = NULL;
7635           break;
7636         }
7637       break;
7638           
7639     case BT_LOGICAL:
7640       if (gfc_option.flag_init_logical == GFC_INIT_LOGICAL_FALSE)
7641         init_expr->value.logical = 0;
7642       else if (gfc_option.flag_init_logical == GFC_INIT_LOGICAL_TRUE)
7643         init_expr->value.logical = 1;
7644       else
7645         {
7646           gfc_free_expr (init_expr);
7647           init_expr = NULL;
7648         }
7649       break;
7650           
7651     case BT_CHARACTER:
7652       /* For characters, the length must be constant in order to 
7653          create a default initializer.  */
7654       if (gfc_option.flag_init_character == GFC_INIT_CHARACTER_ON
7655           && sym->ts.cl->length
7656           && sym->ts.cl->length->expr_type == EXPR_CONSTANT)
7657         {
7658           char_len = mpz_get_si (sym->ts.cl->length->value.integer);
7659           init_expr->value.character.length = char_len;
7660           init_expr->value.character.string = gfc_get_wide_string (char_len+1);
7661           for (i = 0; i < char_len; i++)
7662             init_expr->value.character.string[i]
7663               = (unsigned char) gfc_option.flag_init_character_value;
7664         }
7665       else
7666         {
7667           gfc_free_expr (init_expr);
7668           init_expr = NULL;
7669         }
7670       break;
7671           
7672     default:
7673      gfc_free_expr (init_expr);
7674      init_expr = NULL;
7675     }
7676   return init_expr;
7677 }
7678
7679 /* Add an initialization expression to a local variable.  */
7680 static void
7681 apply_default_init_local (gfc_symbol *sym)
7682 {
7683   gfc_expr *init = NULL;
7684
7685   /* The symbol should be a variable or a function return value.  */
7686   if ((sym->attr.flavor != FL_VARIABLE && !sym->attr.function)
7687       || (sym->attr.function && sym->result != sym))
7688     return;
7689
7690   /* Try to build the initializer expression.  If we can't initialize
7691      this symbol, then init will be NULL.  */
7692   init = build_default_init_expr (sym);
7693   if (init == NULL)
7694     return;
7695
7696   /* For saved variables, we don't want to add an initializer at 
7697      function entry, so we just add a static initializer.  */
7698   if (sym->attr.save || sym->ns->save_all)
7699     {
7700       /* Don't clobber an existing initializer!  */
7701       gcc_assert (sym->value == NULL);
7702       sym->value = init;
7703       return;
7704     }
7705
7706   build_init_assign (sym, init);
7707 }
7708
7709 /* Resolution of common features of flavors variable and procedure.  */
7710
7711 static gfc_try
7712 resolve_fl_var_and_proc (gfc_symbol *sym, int mp_flag)
7713 {
7714   /* Constraints on deferred shape variable.  */
7715   if (sym->as == NULL || sym->as->type != AS_DEFERRED)
7716     {
7717       if (sym->attr.allocatable)
7718         {
7719           if (sym->attr.dimension)
7720             gfc_error ("Allocatable array '%s' at %L must have "
7721                        "a deferred shape", sym->name, &sym->declared_at);
7722           else
7723             gfc_error ("Scalar object '%s' at %L may not be ALLOCATABLE",
7724                        sym->name, &sym->declared_at);
7725             return FAILURE;
7726         }
7727
7728       if (sym->attr.pointer && sym->attr.dimension)
7729         {
7730           gfc_error ("Array pointer '%s' at %L must have a deferred shape",
7731                      sym->name, &sym->declared_at);
7732           return FAILURE;
7733         }
7734
7735     }
7736   else
7737     {
7738       if (!mp_flag && !sym->attr.allocatable
7739           && !sym->attr.pointer && !sym->attr.dummy)
7740         {
7741           gfc_error ("Array '%s' at %L cannot have a deferred shape",
7742                      sym->name, &sym->declared_at);
7743           return FAILURE;
7744          }
7745     }
7746   return SUCCESS;
7747 }
7748
7749
7750 /* Additional checks for symbols with flavor variable and derived
7751    type.  To be called from resolve_fl_variable.  */
7752
7753 static gfc_try
7754 resolve_fl_variable_derived (gfc_symbol *sym, int no_init_flag)
7755 {
7756   gcc_assert (sym->ts.type == BT_DERIVED);
7757
7758   /* Check to see if a derived type is blocked from being host
7759      associated by the presence of another class I symbol in the same
7760      namespace.  14.6.1.3 of the standard and the discussion on
7761      comp.lang.fortran.  */
7762   if (sym->ns != sym->ts.derived->ns
7763       && sym->ns->proc_name->attr.if_source != IFSRC_IFBODY)
7764     {
7765       gfc_symbol *s;
7766       gfc_find_symbol (sym->ts.derived->name, sym->ns, 0, &s);
7767       if (s && s->attr.flavor != FL_DERIVED)
7768         {
7769           gfc_error ("The type '%s' cannot be host associated at %L "
7770                      "because it is blocked by an incompatible object "
7771                      "of the same name declared at %L",
7772                      sym->ts.derived->name, &sym->declared_at,
7773                      &s->declared_at);
7774           return FAILURE;
7775         }
7776     }
7777
7778   /* 4th constraint in section 11.3: "If an object of a type for which
7779      component-initialization is specified (R429) appears in the
7780      specification-part of a module and does not have the ALLOCATABLE
7781      or POINTER attribute, the object shall have the SAVE attribute."
7782
7783      The check for initializers is performed with
7784      has_default_initializer because gfc_default_initializer generates
7785      a hidden default for allocatable components.  */
7786   if (!(sym->value || no_init_flag) && sym->ns->proc_name
7787       && sym->ns->proc_name->attr.flavor == FL_MODULE
7788       && !sym->ns->save_all && !sym->attr.save
7789       && !sym->attr.pointer && !sym->attr.allocatable
7790       && has_default_initializer (sym->ts.derived))
7791     {
7792       gfc_error("Object '%s' at %L must have the SAVE attribute for "
7793                 "default initialization of a component",
7794                 sym->name, &sym->declared_at);
7795       return FAILURE;
7796     }
7797
7798   /* Assign default initializer.  */
7799   if (!(sym->value || sym->attr.pointer || sym->attr.allocatable)
7800       && (!no_init_flag || sym->attr.intent == INTENT_OUT))
7801     {
7802       sym->value = gfc_default_initializer (&sym->ts);
7803     }
7804
7805   return SUCCESS;
7806 }
7807
7808
7809 /* Resolve symbols with flavor variable.  */
7810
7811 static gfc_try
7812 resolve_fl_variable (gfc_symbol *sym, int mp_flag)
7813 {
7814   int no_init_flag, automatic_flag;
7815   gfc_expr *e;
7816   const char *auto_save_msg;
7817
7818   auto_save_msg = "Automatic object '%s' at %L cannot have the "
7819                   "SAVE attribute";
7820
7821   if (resolve_fl_var_and_proc (sym, mp_flag) == FAILURE)
7822     return FAILURE;
7823
7824   /* Set this flag to check that variables are parameters of all entries.
7825      This check is effected by the call to gfc_resolve_expr through
7826      is_non_constant_shape_array.  */
7827   specification_expr = 1;
7828
7829   if (sym->ns->proc_name
7830       && (sym->ns->proc_name->attr.flavor == FL_MODULE
7831           || sym->ns->proc_name->attr.is_main_program)
7832       && !sym->attr.use_assoc
7833       && !sym->attr.allocatable
7834       && !sym->attr.pointer
7835       && is_non_constant_shape_array (sym))
7836     {
7837       /* The shape of a main program or module array needs to be
7838          constant.  */
7839       gfc_error ("The module or main program array '%s' at %L must "
7840                  "have constant shape", sym->name, &sym->declared_at);
7841       specification_expr = 0;
7842       return FAILURE;
7843     }
7844
7845   if (sym->ts.type == BT_CHARACTER)
7846     {
7847       /* Make sure that character string variables with assumed length are
7848          dummy arguments.  */
7849       e = sym->ts.cl->length;
7850       if (e == NULL && !sym->attr.dummy && !sym->attr.result)
7851         {
7852           gfc_error ("Entity with assumed character length at %L must be a "
7853                      "dummy argument or a PARAMETER", &sym->declared_at);
7854           return FAILURE;
7855         }
7856
7857       if (e && sym->attr.save && !gfc_is_constant_expr (e))
7858         {
7859           gfc_error (auto_save_msg, sym->name, &sym->declared_at);
7860           return FAILURE;
7861         }
7862
7863       if (!gfc_is_constant_expr (e)
7864           && !(e->expr_type == EXPR_VARIABLE
7865                && e->symtree->n.sym->attr.flavor == FL_PARAMETER)
7866           && sym->ns->proc_name
7867           && (sym->ns->proc_name->attr.flavor == FL_MODULE
7868               || sym->ns->proc_name->attr.is_main_program)
7869           && !sym->attr.use_assoc)
7870         {
7871           gfc_error ("'%s' at %L must have constant character length "
7872                      "in this context", sym->name, &sym->declared_at);
7873           return FAILURE;
7874         }
7875     }
7876
7877   if (sym->value == NULL && sym->attr.referenced)
7878     apply_default_init_local (sym); /* Try to apply a default initialization.  */
7879
7880   /* Determine if the symbol may not have an initializer.  */
7881   no_init_flag = automatic_flag = 0;
7882   if (sym->attr.allocatable || sym->attr.external || sym->attr.dummy
7883       || sym->attr.intrinsic || sym->attr.result)
7884     no_init_flag = 1;
7885   else if (sym->attr.dimension && !sym->attr.pointer
7886            && is_non_constant_shape_array (sym))
7887     {
7888       no_init_flag = automatic_flag = 1;
7889
7890       /* Also, they must not have the SAVE attribute.
7891          SAVE_IMPLICIT is checked below.  */
7892       if (sym->attr.save == SAVE_EXPLICIT)
7893         {
7894           gfc_error (auto_save_msg, sym->name, &sym->declared_at);
7895           return FAILURE;
7896         }
7897     }
7898
7899   /* Ensure that any initializer is simplified.  */
7900   if (sym->value)
7901     gfc_simplify_expr (sym->value, 1);
7902
7903   /* Reject illegal initializers.  */
7904   if (!sym->mark && sym->value)
7905     {
7906       if (sym->attr.allocatable)
7907         gfc_error ("Allocatable '%s' at %L cannot have an initializer",
7908                    sym->name, &sym->declared_at);
7909       else if (sym->attr.external)
7910         gfc_error ("External '%s' at %L cannot have an initializer",
7911                    sym->name, &sym->declared_at);
7912       else if (sym->attr.dummy
7913         && !(sym->ts.type == BT_DERIVED && sym->attr.intent == INTENT_OUT))
7914         gfc_error ("Dummy '%s' at %L cannot have an initializer",
7915                    sym->name, &sym->declared_at);
7916       else if (sym->attr.intrinsic)
7917         gfc_error ("Intrinsic '%s' at %L cannot have an initializer",
7918                    sym->name, &sym->declared_at);
7919       else if (sym->attr.result)
7920         gfc_error ("Function result '%s' at %L cannot have an initializer",
7921                    sym->name, &sym->declared_at);
7922       else if (automatic_flag)
7923         gfc_error ("Automatic array '%s' at %L cannot have an initializer",
7924                    sym->name, &sym->declared_at);
7925       else
7926         goto no_init_error;
7927       return FAILURE;
7928     }
7929
7930 no_init_error:
7931   if (sym->ts.type == BT_DERIVED)
7932     return resolve_fl_variable_derived (sym, no_init_flag);
7933
7934   return SUCCESS;
7935 }
7936
7937
7938 /* Resolve a procedure.  */
7939
7940 static gfc_try
7941 resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
7942 {
7943   gfc_formal_arglist *arg;
7944
7945   if (sym->attr.ambiguous_interfaces && !sym->attr.referenced)
7946     gfc_warning ("Although not referenced, '%s' at %L has ambiguous "
7947                  "interfaces", sym->name, &sym->declared_at);
7948
7949   if (sym->attr.function
7950       && resolve_fl_var_and_proc (sym, mp_flag) == FAILURE)
7951     return FAILURE;
7952
7953   if (sym->ts.type == BT_CHARACTER)
7954     {
7955       gfc_charlen *cl = sym->ts.cl;
7956
7957       if (cl && cl->length && gfc_is_constant_expr (cl->length)
7958              && resolve_charlen (cl) == FAILURE)
7959         return FAILURE;
7960
7961       if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
7962         {
7963           if (sym->attr.proc == PROC_ST_FUNCTION)
7964             {
7965               gfc_error ("Character-valued statement function '%s' at %L must "
7966                          "have constant length", sym->name, &sym->declared_at);
7967               return FAILURE;
7968             }
7969
7970           if (sym->attr.external && sym->formal == NULL
7971               && cl && cl->length && cl->length->expr_type != EXPR_CONSTANT)
7972             {
7973               gfc_error ("Automatic character length function '%s' at %L must "
7974                          "have an explicit interface", sym->name,
7975                          &sym->declared_at);
7976               return FAILURE;
7977             }
7978         }
7979     }
7980
7981   /* Ensure that derived type for are not of a private type.  Internal
7982      module procedures are excluded by 2.2.3.3 - i.e., they are not
7983      externally accessible and can access all the objects accessible in
7984      the host.  */
7985   if (!(sym->ns->parent
7986         && sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
7987       && gfc_check_access(sym->attr.access, sym->ns->default_access))
7988     {
7989       gfc_interface *iface;
7990
7991       for (arg = sym->formal; arg; arg = arg->next)
7992         {
7993           if (arg->sym
7994               && arg->sym->ts.type == BT_DERIVED
7995               && !arg->sym->ts.derived->attr.use_assoc
7996               && !gfc_check_access (arg->sym->ts.derived->attr.access,
7997                                     arg->sym->ts.derived->ns->default_access)
7998               && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: '%s' is of a "
7999                                  "PRIVATE type and cannot be a dummy argument"
8000                                  " of '%s', which is PUBLIC at %L",
8001                                  arg->sym->name, sym->name, &sym->declared_at)
8002                  == FAILURE)
8003             {
8004               /* Stop this message from recurring.  */
8005               arg->sym->ts.derived->attr.access = ACCESS_PUBLIC;
8006               return FAILURE;
8007             }
8008         }
8009
8010       /* PUBLIC interfaces may expose PRIVATE procedures that take types
8011          PRIVATE to the containing module.  */
8012       for (iface = sym->generic; iface; iface = iface->next)
8013         {
8014           for (arg = iface->sym->formal; arg; arg = arg->next)
8015             {
8016               if (arg->sym
8017                   && arg->sym->ts.type == BT_DERIVED
8018                   && !arg->sym->ts.derived->attr.use_assoc
8019                   && !gfc_check_access (arg->sym->ts.derived->attr.access,
8020                                         arg->sym->ts.derived->ns->default_access)
8021                   && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Procedure "
8022                                      "'%s' in PUBLIC interface '%s' at %L "
8023                                      "takes dummy arguments of '%s' which is "
8024                                      "PRIVATE", iface->sym->name, sym->name,
8025                                      &iface->sym->declared_at,
8026                                      gfc_typename (&arg->sym->ts)) == FAILURE)
8027                 {
8028                   /* Stop this message from recurring.  */
8029                   arg->sym->ts.derived->attr.access = ACCESS_PUBLIC;
8030                   return FAILURE;
8031                 }
8032              }
8033         }
8034
8035       /* PUBLIC interfaces may expose PRIVATE procedures that take types
8036          PRIVATE to the containing module.  */
8037       for (iface = sym->generic; iface; iface = iface->next)
8038         {
8039           for (arg = iface->sym->formal; arg; arg = arg->next)
8040             {
8041               if (arg->sym
8042                   && arg->sym->ts.type == BT_DERIVED
8043                   && !arg->sym->ts.derived->attr.use_assoc
8044                   && !gfc_check_access (arg->sym->ts.derived->attr.access,
8045                                         arg->sym->ts.derived->ns->default_access)
8046                   && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Procedure "
8047                                      "'%s' in PUBLIC interface '%s' at %L "
8048                                      "takes dummy arguments of '%s' which is "
8049                                      "PRIVATE", iface->sym->name, sym->name,
8050                                      &iface->sym->declared_at,
8051                                      gfc_typename (&arg->sym->ts)) == FAILURE)
8052                 {
8053                   /* Stop this message from recurring.  */
8054                   arg->sym->ts.derived->attr.access = ACCESS_PUBLIC;
8055                   return FAILURE;
8056                 }
8057              }
8058         }
8059     }
8060
8061   if (sym->attr.function && sym->value && sym->attr.proc != PROC_ST_FUNCTION
8062       && !sym->attr.proc_pointer)
8063     {
8064       gfc_error ("Function '%s' at %L cannot have an initializer",
8065                  sym->name, &sym->declared_at);
8066       return FAILURE;
8067     }
8068
8069   /* An external symbol may not have an initializer because it is taken to be
8070      a procedure. Exception: Procedure Pointers.  */
8071   if (sym->attr.external && sym->value && !sym->attr.proc_pointer)
8072     {
8073       gfc_error ("External object '%s' at %L may not have an initializer",
8074                  sym->name, &sym->declared_at);
8075       return FAILURE;
8076     }
8077
8078   /* An elemental function is required to return a scalar 12.7.1  */
8079   if (sym->attr.elemental && sym->attr.function && sym->as)
8080     {
8081       gfc_error ("ELEMENTAL function '%s' at %L must have a scalar "
8082                  "result", sym->name, &sym->declared_at);
8083       /* Reset so that the error only occurs once.  */
8084       sym->attr.elemental = 0;
8085       return FAILURE;
8086     }
8087
8088   /* 5.1.1.5 of the Standard: A function name declared with an asterisk
8089      char-len-param shall not be array-valued, pointer-valued, recursive
8090      or pure.  ....snip... A character value of * may only be used in the
8091      following ways: (i) Dummy arg of procedure - dummy associates with
8092      actual length; (ii) To declare a named constant; or (iii) External
8093      function - but length must be declared in calling scoping unit.  */
8094   if (sym->attr.function
8095       && sym->ts.type == BT_CHARACTER
8096       && sym->ts.cl && sym->ts.cl->length == NULL)
8097     {
8098       if ((sym->as && sym->as->rank) || (sym->attr.pointer)
8099           || (sym->attr.recursive) || (sym->attr.pure))
8100         {
8101           if (sym->as && sym->as->rank)
8102             gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
8103                        "array-valued", sym->name, &sym->declared_at);
8104
8105           if (sym->attr.pointer)
8106             gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
8107                        "pointer-valued", sym->name, &sym->declared_at);
8108
8109           if (sym->attr.pure)
8110             gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
8111                        "pure", sym->name, &sym->declared_at);
8112
8113           if (sym->attr.recursive)
8114             gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
8115                        "recursive", sym->name, &sym->declared_at);
8116
8117           return FAILURE;
8118         }
8119
8120       /* Appendix B.2 of the standard.  Contained functions give an
8121          error anyway.  Fixed-form is likely to be F77/legacy.  */
8122       if (!sym->attr.contained && gfc_current_form != FORM_FIXED)
8123         gfc_notify_std (GFC_STD_F95_OBS, "CHARACTER(*) function "
8124                         "'%s' at %L is obsolescent in fortran 95",
8125                         sym->name, &sym->declared_at);
8126     }
8127
8128   if (sym->attr.is_bind_c && sym->attr.is_c_interop != 1)
8129     {
8130       gfc_formal_arglist *curr_arg;
8131       int has_non_interop_arg = 0;
8132
8133       if (verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
8134                              sym->common_block) == FAILURE)
8135         {
8136           /* Clear these to prevent looking at them again if there was an
8137              error.  */
8138           sym->attr.is_bind_c = 0;
8139           sym->attr.is_c_interop = 0;
8140           sym->ts.is_c_interop = 0;
8141         }
8142       else
8143         {
8144           /* So far, no errors have been found.  */
8145           sym->attr.is_c_interop = 1;
8146           sym->ts.is_c_interop = 1;
8147         }
8148       
8149       curr_arg = sym->formal;
8150       while (curr_arg != NULL)
8151         {
8152           /* Skip implicitly typed dummy args here.  */
8153           if (curr_arg->sym->attr.implicit_type == 0)
8154             if (verify_c_interop_param (curr_arg->sym) == FAILURE)
8155               /* If something is found to fail, record the fact so we
8156                  can mark the symbol for the procedure as not being
8157                  BIND(C) to try and prevent multiple errors being
8158                  reported.  */
8159               has_non_interop_arg = 1;
8160           
8161           curr_arg = curr_arg->next;
8162         }
8163
8164       /* See if any of the arguments were not interoperable and if so, clear
8165          the procedure symbol to prevent duplicate error messages.  */
8166       if (has_non_interop_arg != 0)
8167         {
8168           sym->attr.is_c_interop = 0;
8169           sym->ts.is_c_interop = 0;
8170           sym->attr.is_bind_c = 0;
8171         }
8172     }
8173   
8174   if (!sym->attr.proc_pointer)
8175     {
8176       if (sym->attr.save == SAVE_EXPLICIT)
8177         {
8178           gfc_error ("PROCEDURE attribute conflicts with SAVE attribute "
8179                      "in '%s' at %L", sym->name, &sym->declared_at);
8180           return FAILURE;
8181         }
8182       if (sym->attr.intent)
8183         {
8184           gfc_error ("PROCEDURE attribute conflicts with INTENT attribute "
8185                      "in '%s' at %L", sym->name, &sym->declared_at);
8186           return FAILURE;
8187         }
8188       if (sym->attr.subroutine && sym->attr.result)
8189         {
8190           gfc_error ("PROCEDURE attribute conflicts with RESULT attribute "
8191                      "in '%s' at %L", sym->name, &sym->declared_at);
8192           return FAILURE;
8193         }
8194       if (sym->attr.external && sym->attr.function
8195           && ((sym->attr.if_source == IFSRC_DECL && !sym->attr.procedure)
8196               || sym->attr.contained))
8197         {
8198           gfc_error ("EXTERNAL attribute conflicts with FUNCTION attribute "
8199                      "in '%s' at %L", sym->name, &sym->declared_at);
8200           return FAILURE;
8201         }
8202       if (strcmp ("ppr@", sym->name) == 0)
8203         {
8204           gfc_error ("Procedure pointer result '%s' at %L "
8205                      "is missing the pointer attribute",
8206                      sym->ns->proc_name->name, &sym->declared_at);
8207           return FAILURE;
8208         }
8209     }
8210
8211   return SUCCESS;
8212 }
8213
8214
8215 /* Resolve a list of finalizer procedures.  That is, after they have hopefully
8216    been defined and we now know their defined arguments, check that they fulfill
8217    the requirements of the standard for procedures used as finalizers.  */
8218
8219 static gfc_try
8220 gfc_resolve_finalizers (gfc_symbol* derived)
8221 {
8222   gfc_finalizer* list;
8223   gfc_finalizer** prev_link; /* For removing wrong entries from the list.  */
8224   gfc_try result = SUCCESS;
8225   bool seen_scalar = false;
8226
8227   if (!derived->f2k_derived || !derived->f2k_derived->finalizers)
8228     return SUCCESS;
8229
8230   /* Walk over the list of finalizer-procedures, check them, and if any one
8231      does not fit in with the standard's definition, print an error and remove
8232      it from the list.  */
8233   prev_link = &derived->f2k_derived->finalizers;
8234   for (list = derived->f2k_derived->finalizers; list; list = *prev_link)
8235     {
8236       gfc_symbol* arg;
8237       gfc_finalizer* i;
8238       int my_rank;
8239
8240       /* Skip this finalizer if we already resolved it.  */
8241       if (list->proc_tree)
8242         {
8243           prev_link = &(list->next);
8244           continue;
8245         }
8246
8247       /* Check this exists and is a SUBROUTINE.  */
8248       if (!list->proc_sym->attr.subroutine)
8249         {
8250           gfc_error ("FINAL procedure '%s' at %L is not a SUBROUTINE",
8251                      list->proc_sym->name, &list->where);
8252           goto error;
8253         }
8254
8255       /* We should have exactly one argument.  */
8256       if (!list->proc_sym->formal || list->proc_sym->formal->next)
8257         {
8258           gfc_error ("FINAL procedure at %L must have exactly one argument",
8259                      &list->where);
8260           goto error;
8261         }
8262       arg = list->proc_sym->formal->sym;
8263
8264       /* This argument must be of our type.  */
8265       if (arg->ts.type != BT_DERIVED || arg->ts.derived != derived)
8266         {
8267           gfc_error ("Argument of FINAL procedure at %L must be of type '%s'",
8268                      &arg->declared_at, derived->name);
8269           goto error;
8270         }
8271
8272       /* It must neither be a pointer nor allocatable nor optional.  */
8273       if (arg->attr.pointer)
8274         {
8275           gfc_error ("Argument of FINAL procedure at %L must not be a POINTER",
8276                      &arg->declared_at);
8277           goto error;
8278         }
8279       if (arg->attr.allocatable)
8280         {
8281           gfc_error ("Argument of FINAL procedure at %L must not be"
8282                      " ALLOCATABLE", &arg->declared_at);
8283           goto error;
8284         }
8285       if (arg->attr.optional)
8286         {
8287           gfc_error ("Argument of FINAL procedure at %L must not be OPTIONAL",
8288                      &arg->declared_at);
8289           goto error;
8290         }
8291
8292       /* It must not be INTENT(OUT).  */
8293       if (arg->attr.intent == INTENT_OUT)
8294         {
8295           gfc_error ("Argument of FINAL procedure at %L must not be"
8296                      " INTENT(OUT)", &arg->declared_at);
8297           goto error;
8298         }
8299
8300       /* Warn if the procedure is non-scalar and not assumed shape.  */
8301       if (gfc_option.warn_surprising && arg->as && arg->as->rank > 0
8302           && arg->as->type != AS_ASSUMED_SHAPE)
8303         gfc_warning ("Non-scalar FINAL procedure at %L should have assumed"
8304                      " shape argument", &arg->declared_at);
8305
8306       /* Check that it does not match in kind and rank with a FINAL procedure
8307          defined earlier.  To really loop over the *earlier* declarations,
8308          we need to walk the tail of the list as new ones were pushed at the
8309          front.  */
8310       /* TODO: Handle kind parameters once they are implemented.  */
8311       my_rank = (arg->as ? arg->as->rank : 0);
8312       for (i = list->next; i; i = i->next)
8313         {
8314           /* Argument list might be empty; that is an error signalled earlier,
8315              but we nevertheless continued resolving.  */
8316           if (i->proc_sym->formal)
8317             {
8318               gfc_symbol* i_arg = i->proc_sym->formal->sym;
8319               const int i_rank = (i_arg->as ? i_arg->as->rank : 0);
8320               if (i_rank == my_rank)
8321                 {
8322                   gfc_error ("FINAL procedure '%s' declared at %L has the same"
8323                              " rank (%d) as '%s'",
8324                              list->proc_sym->name, &list->where, my_rank, 
8325                              i->proc_sym->name);
8326                   goto error;
8327                 }
8328             }
8329         }
8330
8331         /* Is this the/a scalar finalizer procedure?  */
8332         if (!arg->as || arg->as->rank == 0)
8333           seen_scalar = true;
8334
8335         /* Find the symtree for this procedure.  */
8336         gcc_assert (!list->proc_tree);
8337         list->proc_tree = gfc_find_sym_in_symtree (list->proc_sym);
8338
8339         prev_link = &list->next;
8340         continue;
8341
8342         /* Remove wrong nodes immediately from the list so we don't risk any
8343            troubles in the future when they might fail later expectations.  */
8344 error:
8345         result = FAILURE;
8346         i = list;
8347         *prev_link = list->next;
8348         gfc_free_finalizer (i);
8349     }
8350
8351   /* Warn if we haven't seen a scalar finalizer procedure (but we know there
8352      were nodes in the list, must have been for arrays.  It is surely a good
8353      idea to have a scalar version there if there's something to finalize.  */
8354   if (gfc_option.warn_surprising && result == SUCCESS && !seen_scalar)
8355     gfc_warning ("Only array FINAL procedures declared for derived type '%s'"
8356                  " defined at %L, suggest also scalar one",
8357                  derived->name, &derived->declared_at);
8358
8359   /* TODO:  Remove this error when finalization is finished.  */
8360   gfc_error ("Finalization at %L is not yet implemented",
8361              &derived->declared_at);
8362
8363   return result;
8364 }
8365
8366
8367 /* Check that it is ok for the typebound procedure proc to override the
8368    procedure old.  */
8369
8370 static gfc_try
8371 check_typebound_override (gfc_symtree* proc, gfc_symtree* old)
8372 {
8373   locus where;
8374   const gfc_symbol* proc_target;
8375   const gfc_symbol* old_target;
8376   unsigned proc_pass_arg, old_pass_arg, argpos;
8377   gfc_formal_arglist* proc_formal;
8378   gfc_formal_arglist* old_formal;
8379
8380   /* This procedure should only be called for non-GENERIC proc.  */
8381   gcc_assert (!proc->n.tb->is_generic);
8382
8383   /* If the overwritten procedure is GENERIC, this is an error.  */
8384   if (old->n.tb->is_generic)
8385     {
8386       gfc_error ("Can't overwrite GENERIC '%s' at %L",
8387                  old->name, &proc->n.tb->where);
8388       return FAILURE;
8389     }
8390
8391   where = proc->n.tb->where;
8392   proc_target = proc->n.tb->u.specific->n.sym;
8393   old_target = old->n.tb->u.specific->n.sym;
8394
8395   /* Check that overridden binding is not NON_OVERRIDABLE.  */
8396   if (old->n.tb->non_overridable)
8397     {
8398       gfc_error ("'%s' at %L overrides a procedure binding declared"
8399                  " NON_OVERRIDABLE", proc->name, &where);
8400       return FAILURE;
8401     }
8402
8403   /* It's an error to override a non-DEFERRED procedure with a DEFERRED one.  */
8404   if (!old->n.tb->deferred && proc->n.tb->deferred)
8405     {
8406       gfc_error ("'%s' at %L must not be DEFERRED as it overrides a"
8407                  " non-DEFERRED binding", proc->name, &where);
8408       return FAILURE;
8409     }
8410
8411   /* If the overridden binding is PURE, the overriding must be, too.  */
8412   if (old_target->attr.pure && !proc_target->attr.pure)
8413     {
8414       gfc_error ("'%s' at %L overrides a PURE procedure and must also be PURE",
8415                  proc->name, &where);
8416       return FAILURE;
8417     }
8418
8419   /* If the overridden binding is ELEMENTAL, the overriding must be, too.  If it
8420      is not, the overriding must not be either.  */
8421   if (old_target->attr.elemental && !proc_target->attr.elemental)
8422     {
8423       gfc_error ("'%s' at %L overrides an ELEMENTAL procedure and must also be"
8424                  " ELEMENTAL", proc->name, &where);
8425       return FAILURE;
8426     }
8427   if (!old_target->attr.elemental && proc_target->attr.elemental)
8428     {
8429       gfc_error ("'%s' at %L overrides a non-ELEMENTAL procedure and must not"
8430                  " be ELEMENTAL, either", proc->name, &where);
8431       return FAILURE;
8432     }
8433
8434   /* If the overridden binding is a SUBROUTINE, the overriding must also be a
8435      SUBROUTINE.  */
8436   if (old_target->attr.subroutine && !proc_target->attr.subroutine)
8437     {
8438       gfc_error ("'%s' at %L overrides a SUBROUTINE and must also be a"
8439                  " SUBROUTINE", proc->name, &where);
8440       return FAILURE;
8441     }
8442
8443   /* If the overridden binding is a FUNCTION, the overriding must also be a
8444      FUNCTION and have the same characteristics.  */
8445   if (old_target->attr.function)
8446     {
8447       if (!proc_target->attr.function)
8448         {
8449           gfc_error ("'%s' at %L overrides a FUNCTION and must also be a"
8450                      " FUNCTION", proc->name, &where);
8451           return FAILURE;
8452         }
8453
8454       /* FIXME:  Do more comprehensive checking (including, for instance, the
8455          rank and array-shape).  */
8456       gcc_assert (proc_target->result && old_target->result);
8457       if (!gfc_compare_types (&proc_target->result->ts,
8458                               &old_target->result->ts))
8459         {
8460           gfc_error ("'%s' at %L and the overridden FUNCTION should have"
8461                      " matching result types", proc->name, &where);
8462           return FAILURE;
8463         }
8464     }
8465
8466   /* If the overridden binding is PUBLIC, the overriding one must not be
8467      PRIVATE.  */
8468   if (old->n.tb->access == ACCESS_PUBLIC
8469       && proc->n.tb->access == ACCESS_PRIVATE)
8470     {
8471       gfc_error ("'%s' at %L overrides a PUBLIC procedure and must not be"
8472                  " PRIVATE", proc->name, &where);
8473       return FAILURE;
8474     }
8475
8476   /* Compare the formal argument lists of both procedures.  This is also abused
8477      to find the position of the passed-object dummy arguments of both
8478      bindings as at least the overridden one might not yet be resolved and we
8479      need those positions in the check below.  */
8480   proc_pass_arg = old_pass_arg = 0;
8481   if (!proc->n.tb->nopass && !proc->n.tb->pass_arg)
8482     proc_pass_arg = 1;
8483   if (!old->n.tb->nopass && !old->n.tb->pass_arg)
8484     old_pass_arg = 1;
8485   argpos = 1;
8486   for (proc_formal = proc_target->formal, old_formal = old_target->formal;
8487        proc_formal && old_formal;
8488        proc_formal = proc_formal->next, old_formal = old_formal->next)
8489     {
8490       if (proc->n.tb->pass_arg
8491           && !strcmp (proc->n.tb->pass_arg, proc_formal->sym->name))
8492         proc_pass_arg = argpos;
8493       if (old->n.tb->pass_arg
8494           && !strcmp (old->n.tb->pass_arg, old_formal->sym->name))
8495         old_pass_arg = argpos;
8496
8497       /* Check that the names correspond.  */
8498       if (strcmp (proc_formal->sym->name, old_formal->sym->name))
8499         {
8500           gfc_error ("Dummy argument '%s' of '%s' at %L should be named '%s' as"
8501                      " to match the corresponding argument of the overridden"
8502                      " procedure", proc_formal->sym->name, proc->name, &where,
8503                      old_formal->sym->name);
8504           return FAILURE;
8505         }
8506
8507       /* Check that the types correspond if neither is the passed-object
8508          argument.  */
8509       /* FIXME:  Do more comprehensive testing here.  */
8510       if (proc_pass_arg != argpos && old_pass_arg != argpos
8511           && !gfc_compare_types (&proc_formal->sym->ts, &old_formal->sym->ts))
8512         {
8513           gfc_error ("Types mismatch for dummy argument '%s' of '%s' %L in"
8514                      " in respect to the overridden procedure",
8515                      proc_formal->sym->name, proc->name, &where);
8516           return FAILURE;
8517         }
8518
8519       ++argpos;
8520     }
8521   if (proc_formal || old_formal)
8522     {
8523       gfc_error ("'%s' at %L must have the same number of formal arguments as"
8524                  " the overridden procedure", proc->name, &where);
8525       return FAILURE;
8526     }
8527
8528   /* If the overridden binding is NOPASS, the overriding one must also be
8529      NOPASS.  */
8530   if (old->n.tb->nopass && !proc->n.tb->nopass)
8531     {
8532       gfc_error ("'%s' at %L overrides a NOPASS binding and must also be"
8533                  " NOPASS", proc->name, &where);
8534       return FAILURE;
8535     }
8536
8537   /* If the overridden binding is PASS(x), the overriding one must also be
8538      PASS and the passed-object dummy arguments must correspond.  */
8539   if (!old->n.tb->nopass)
8540     {
8541       if (proc->n.tb->nopass)
8542         {
8543           gfc_error ("'%s' at %L overrides a binding with PASS and must also be"
8544                      " PASS", proc->name, &where);
8545           return FAILURE;
8546         }
8547
8548       if (proc_pass_arg != old_pass_arg)
8549         {
8550           gfc_error ("Passed-object dummy argument of '%s' at %L must be at"
8551                      " the same position as the passed-object dummy argument of"
8552                      " the overridden procedure", proc->name, &where);
8553           return FAILURE;
8554         }
8555     }
8556
8557   return SUCCESS;
8558 }
8559
8560
8561 /* Check if two GENERIC targets are ambiguous and emit an error is they are.  */
8562
8563 static gfc_try
8564 check_generic_tbp_ambiguity (gfc_tbp_generic* t1, gfc_tbp_generic* t2,
8565                              const char* generic_name, locus where)
8566 {
8567   gfc_symbol* sym1;
8568   gfc_symbol* sym2;
8569
8570   gcc_assert (t1->specific && t2->specific);
8571   gcc_assert (!t1->specific->is_generic);
8572   gcc_assert (!t2->specific->is_generic);
8573
8574   sym1 = t1->specific->u.specific->n.sym;
8575   sym2 = t2->specific->u.specific->n.sym;
8576
8577   /* Both must be SUBROUTINEs or both must be FUNCTIONs.  */
8578   if (sym1->attr.subroutine != sym2->attr.subroutine
8579       || sym1->attr.function != sym2->attr.function)
8580     {
8581       gfc_error ("'%s' and '%s' can't be mixed FUNCTION/SUBROUTINE for"
8582                  " GENERIC '%s' at %L",
8583                  sym1->name, sym2->name, generic_name, &where);
8584       return FAILURE;
8585     }
8586
8587   /* Compare the interfaces.  */
8588   if (gfc_compare_interfaces (sym1, sym2, 1))
8589     {
8590       gfc_error ("'%s' and '%s' for GENERIC '%s' at %L are ambiguous",
8591                  sym1->name, sym2->name, generic_name, &where);
8592       return FAILURE;
8593     }
8594
8595   return SUCCESS;
8596 }
8597
8598
8599 /* Resolve a GENERIC procedure binding for a derived type.  */
8600
8601 static gfc_try
8602 resolve_typebound_generic (gfc_symbol* derived, gfc_symtree* st)
8603 {
8604   gfc_tbp_generic* target;
8605   gfc_symtree* first_target;
8606   gfc_symbol* super_type;
8607   gfc_symtree* inherited;
8608   locus where;
8609
8610   gcc_assert (st->n.tb);
8611   gcc_assert (st->n.tb->is_generic);
8612
8613   where = st->n.tb->where;
8614   super_type = gfc_get_derived_super_type (derived);
8615
8616   /* Find the overridden binding if any.  */
8617   st->n.tb->overridden = NULL;
8618   if (super_type)
8619     {
8620       gfc_symtree* overridden;
8621       overridden = gfc_find_typebound_proc (super_type, NULL, st->name, true);
8622
8623       if (overridden && overridden->n.tb)
8624         st->n.tb->overridden = overridden->n.tb;
8625     }
8626
8627   /* Try to find the specific bindings for the symtrees in our target-list.  */
8628   gcc_assert (st->n.tb->u.generic);
8629   for (target = st->n.tb->u.generic; target; target = target->next)
8630     if (!target->specific)
8631       {
8632         gfc_typebound_proc* overridden_tbp;
8633         gfc_tbp_generic* g;
8634         const char* target_name;
8635
8636         target_name = target->specific_st->name;
8637
8638         /* Defined for this type directly.  */
8639         if (target->specific_st->n.tb)
8640           {
8641             target->specific = target->specific_st->n.tb;
8642             goto specific_found;
8643           }
8644
8645         /* Look for an inherited specific binding.  */
8646         if (super_type)
8647           {
8648             inherited = gfc_find_typebound_proc (super_type, NULL,
8649                                                  target_name, true);
8650
8651             if (inherited)
8652               {
8653                 gcc_assert (inherited->n.tb);
8654                 target->specific = inherited->n.tb;
8655                 goto specific_found;
8656               }
8657           }
8658
8659         gfc_error ("Undefined specific binding '%s' as target of GENERIC '%s'"
8660                    " at %L", target_name, st->name, &where);
8661         return FAILURE;
8662
8663         /* Once we've found the specific binding, check it is not ambiguous with
8664            other specifics already found or inherited for the same GENERIC.  */
8665 specific_found:
8666         gcc_assert (target->specific);
8667
8668         /* This must really be a specific binding!  */
8669         if (target->specific->is_generic)
8670           {
8671             gfc_error ("GENERIC '%s' at %L must target a specific binding,"
8672                        " '%s' is GENERIC, too", st->name, &where, target_name);
8673             return FAILURE;
8674           }
8675
8676         /* Check those already resolved on this type directly.  */
8677         for (g = st->n.tb->u.generic; g; g = g->next)
8678           if (g != target && g->specific
8679               && check_generic_tbp_ambiguity (target, g, st->name, where)
8680                   == FAILURE)
8681             return FAILURE;
8682
8683         /* Check for ambiguity with inherited specific targets.  */
8684         for (overridden_tbp = st->n.tb->overridden; overridden_tbp;
8685              overridden_tbp = overridden_tbp->overridden)
8686           if (overridden_tbp->is_generic)
8687             {
8688               for (g = overridden_tbp->u.generic; g; g = g->next)
8689                 {
8690                   gcc_assert (g->specific);
8691                   if (check_generic_tbp_ambiguity (target, g,
8692                                                    st->name, where) == FAILURE)
8693                     return FAILURE;
8694                 }
8695             }
8696       }
8697
8698   /* If we attempt to "overwrite" a specific binding, this is an error.  */
8699   if (st->n.tb->overridden && !st->n.tb->overridden->is_generic)
8700     {
8701       gfc_error ("GENERIC '%s' at %L can't overwrite specific binding with"
8702                  " the same name", st->name, &where);
8703       return FAILURE;
8704     }
8705
8706   /* Take the SUBROUTINE/FUNCTION attributes of the first specific target, as
8707      all must have the same attributes here.  */
8708   first_target = st->n.tb->u.generic->specific->u.specific;
8709   gcc_assert (first_target);
8710   st->n.tb->subroutine = first_target->n.sym->attr.subroutine;
8711   st->n.tb->function = first_target->n.sym->attr.function;
8712
8713   return SUCCESS;
8714 }
8715
8716
8717 /* Resolve the type-bound procedures for a derived type.  */
8718
8719 static gfc_symbol* resolve_bindings_derived;
8720 static gfc_try resolve_bindings_result;
8721
8722 static void
8723 resolve_typebound_procedure (gfc_symtree* stree)
8724 {
8725   gfc_symbol* proc;
8726   locus where;
8727   gfc_symbol* me_arg;
8728   gfc_symbol* super_type;
8729   gfc_component* comp;
8730
8731   gcc_assert (stree);
8732
8733   /* Undefined specific symbol from GENERIC target definition.  */
8734   if (!stree->n.tb)
8735     return;
8736
8737   if (stree->n.tb->error)
8738     return;
8739
8740   /* If this is a GENERIC binding, use that routine.  */
8741   if (stree->n.tb->is_generic)
8742     {
8743       if (resolve_typebound_generic (resolve_bindings_derived, stree)
8744             == FAILURE)
8745         goto error;
8746       return;
8747     }
8748
8749   /* Get the target-procedure to check it.  */
8750   gcc_assert (!stree->n.tb->is_generic);
8751   gcc_assert (stree->n.tb->u.specific);
8752   proc = stree->n.tb->u.specific->n.sym;
8753   where = stree->n.tb->where;
8754
8755   /* Default access should already be resolved from the parser.  */
8756   gcc_assert (stree->n.tb->access != ACCESS_UNKNOWN);
8757
8758   /* It should be a module procedure or an external procedure with explicit
8759      interface.  For DEFERRED bindings, abstract interfaces are ok as well.  */
8760   if ((!proc->attr.subroutine && !proc->attr.function)
8761       || (proc->attr.proc != PROC_MODULE
8762           && proc->attr.if_source != IFSRC_IFBODY)
8763       || (proc->attr.abstract && !stree->n.tb->deferred))
8764     {
8765       gfc_error ("'%s' must be a module procedure or an external procedure with"
8766                  " an explicit interface at %L", proc->name, &where);
8767       goto error;
8768     }
8769   stree->n.tb->subroutine = proc->attr.subroutine;
8770   stree->n.tb->function = proc->attr.function;
8771
8772   /* Find the super-type of the current derived type.  We could do this once and
8773      store in a global if speed is needed, but as long as not I believe this is
8774      more readable and clearer.  */
8775   super_type = gfc_get_derived_super_type (resolve_bindings_derived);
8776
8777   /* If PASS, resolve and check arguments if not already resolved / loaded
8778      from a .mod file.  */
8779   if (!stree->n.tb->nopass && stree->n.tb->pass_arg_num == 0)
8780     {
8781       if (stree->n.tb->pass_arg)
8782         {
8783           gfc_formal_arglist* i;
8784
8785           /* If an explicit passing argument name is given, walk the arg-list
8786              and look for it.  */
8787
8788           me_arg = NULL;
8789           stree->n.tb->pass_arg_num = 1;
8790           for (i = proc->formal; i; i = i->next)
8791             {
8792               if (!strcmp (i->sym->name, stree->n.tb->pass_arg))
8793                 {
8794                   me_arg = i->sym;
8795                   break;
8796                 }
8797               ++stree->n.tb->pass_arg_num;
8798             }
8799
8800           if (!me_arg)
8801             {
8802               gfc_error ("Procedure '%s' with PASS(%s) at %L has no"
8803                          " argument '%s'",
8804                          proc->name, stree->n.tb->pass_arg, &where,
8805                          stree->n.tb->pass_arg);
8806               goto error;
8807             }
8808         }
8809       else
8810         {
8811           /* Otherwise, take the first one; there should in fact be at least
8812              one.  */
8813           stree->n.tb->pass_arg_num = 1;
8814           if (!proc->formal)
8815             {
8816               gfc_error ("Procedure '%s' with PASS at %L must have at"
8817                          " least one argument", proc->name, &where);
8818               goto error;
8819             }
8820           me_arg = proc->formal->sym;
8821         }
8822
8823       /* Now check that the argument-type matches.  */
8824       gcc_assert (me_arg);
8825       if (me_arg->ts.type != BT_DERIVED
8826           || me_arg->ts.derived != resolve_bindings_derived)
8827         {
8828           gfc_error ("Argument '%s' of '%s' with PASS(%s) at %L must be of"
8829                      " the derived-type '%s'", me_arg->name, proc->name,
8830                      me_arg->name, &where, resolve_bindings_derived->name);
8831           goto error;
8832         }
8833
8834       gfc_warning ("Polymorphic entities are not yet implemented,"
8835                    " non-polymorphic passed-object dummy argument of '%s'"
8836                    " at %L accepted", proc->name, &where);
8837     }
8838
8839   /* If we are extending some type, check that we don't override a procedure
8840      flagged NON_OVERRIDABLE.  */
8841   stree->n.tb->overridden = NULL;
8842   if (super_type)
8843     {
8844       gfc_symtree* overridden;
8845       overridden = gfc_find_typebound_proc (super_type, NULL,
8846                                             stree->name, true);
8847
8848       if (overridden && overridden->n.tb)
8849         stree->n.tb->overridden = overridden->n.tb;
8850
8851       if (overridden && check_typebound_override (stree, overridden) == FAILURE)
8852         goto error;
8853     }
8854
8855   /* See if there's a name collision with a component directly in this type.  */
8856   for (comp = resolve_bindings_derived->components; comp; comp = comp->next)
8857     if (!strcmp (comp->name, stree->name))
8858       {
8859         gfc_error ("Procedure '%s' at %L has the same name as a component of"
8860                    " '%s'",
8861                    stree->name, &where, resolve_bindings_derived->name);
8862         goto error;
8863       }
8864
8865   /* Try to find a name collision with an inherited component.  */
8866   if (super_type && gfc_find_component (super_type, stree->name, true, true))
8867     {
8868       gfc_error ("Procedure '%s' at %L has the same name as an inherited"
8869                  " component of '%s'",
8870                  stree->name, &where, resolve_bindings_derived->name);
8871       goto error;
8872     }
8873
8874   stree->n.tb->error = 0;
8875   return;
8876
8877 error:
8878   resolve_bindings_result = FAILURE;
8879   stree->n.tb->error = 1;
8880 }
8881
8882 static gfc_try
8883 resolve_typebound_procedures (gfc_symbol* derived)
8884 {
8885   if (!derived->f2k_derived || !derived->f2k_derived->tb_sym_root)
8886     return SUCCESS;
8887
8888   resolve_bindings_derived = derived;
8889   resolve_bindings_result = SUCCESS;
8890   gfc_traverse_symtree (derived->f2k_derived->tb_sym_root,
8891                         &resolve_typebound_procedure);
8892
8893   return resolve_bindings_result;
8894 }
8895
8896
8897 /* Add a derived type to the dt_list.  The dt_list is used in trans-types.c
8898    to give all identical derived types the same backend_decl.  */
8899 static void
8900 add_dt_to_dt_list (gfc_symbol *derived)
8901 {
8902   gfc_dt_list *dt_list;
8903
8904   for (dt_list = gfc_derived_types; dt_list; dt_list = dt_list->next)
8905     if (derived == dt_list->derived)
8906       break;
8907
8908   if (dt_list == NULL)
8909     {
8910       dt_list = gfc_get_dt_list ();
8911       dt_list->next = gfc_derived_types;
8912       dt_list->derived = derived;
8913       gfc_derived_types = dt_list;
8914     }
8915 }
8916
8917
8918 /* Ensure that a derived-type is really not abstract, meaning that every
8919    inherited DEFERRED binding is overridden by a non-DEFERRED one.  */
8920
8921 static gfc_try
8922 ensure_not_abstract_walker (gfc_symbol* sub, gfc_symtree* st)
8923 {
8924   if (!st)
8925     return SUCCESS;
8926
8927   if (ensure_not_abstract_walker (sub, st->left) == FAILURE)
8928     return FAILURE;
8929   if (ensure_not_abstract_walker (sub, st->right) == FAILURE)
8930     return FAILURE;
8931
8932   if (st->n.tb && st->n.tb->deferred)
8933     {
8934       gfc_symtree* overriding;
8935       overriding = gfc_find_typebound_proc (sub, NULL, st->name, true);
8936       gcc_assert (overriding && overriding->n.tb);
8937       if (overriding->n.tb->deferred)
8938         {
8939           gfc_error ("Derived-type '%s' declared at %L must be ABSTRACT because"
8940                      " '%s' is DEFERRED and not overridden",
8941                      sub->name, &sub->declared_at, st->name);
8942           return FAILURE;
8943         }
8944     }
8945
8946   return SUCCESS;
8947 }
8948
8949 static gfc_try
8950 ensure_not_abstract (gfc_symbol* sub, gfc_symbol* ancestor)
8951 {
8952   /* The algorithm used here is to recursively travel up the ancestry of sub
8953      and for each ancestor-type, check all bindings.  If any of them is
8954      DEFERRED, look it up starting from sub and see if the found (overriding)
8955      binding is not DEFERRED.
8956      This is not the most efficient way to do this, but it should be ok and is
8957      clearer than something sophisticated.  */
8958
8959   gcc_assert (ancestor && ancestor->attr.abstract && !sub->attr.abstract);
8960
8961   /* Walk bindings of this ancestor.  */
8962   if (ancestor->f2k_derived)
8963     {
8964       gfc_try t;
8965       t = ensure_not_abstract_walker (sub, ancestor->f2k_derived->tb_sym_root);
8966       if (t == FAILURE)
8967         return FAILURE;
8968     }
8969
8970   /* Find next ancestor type and recurse on it.  */
8971   ancestor = gfc_get_derived_super_type (ancestor);
8972   if (ancestor)
8973     return ensure_not_abstract (sub, ancestor);
8974
8975   return SUCCESS;
8976 }
8977
8978
8979 /* Resolve the components of a derived type.  */
8980
8981 static gfc_try
8982 resolve_fl_derived (gfc_symbol *sym)
8983 {
8984   gfc_symbol* super_type;
8985   gfc_component *c;
8986   int i;
8987
8988   super_type = gfc_get_derived_super_type (sym);
8989
8990   /* Ensure the extended type gets resolved before we do.  */
8991   if (super_type && resolve_fl_derived (super_type) == FAILURE)
8992     return FAILURE;
8993
8994   /* An ABSTRACT type must be extensible.  */
8995   if (sym->attr.abstract && (sym->attr.is_bind_c || sym->attr.sequence))
8996     {
8997       gfc_error ("Non-extensible derived-type '%s' at %L must not be ABSTRACT",
8998                  sym->name, &sym->declared_at);
8999       return FAILURE;
9000     }
9001
9002   for (c = sym->components; c != NULL; c = c->next)
9003     {
9004       if (c->attr.proc_pointer && c->ts.interface)
9005         {
9006           if (c->ts.interface->attr.procedure)
9007             gfc_error ("Interface '%s', used by procedure pointer component "
9008                        "'%s' at %L, is declared in a later PROCEDURE statement",
9009                        c->ts.interface->name, c->name, &c->loc);
9010
9011           /* Get the attributes from the interface (now resolved).  */
9012           if (c->ts.interface->attr.if_source
9013               || c->ts.interface->attr.intrinsic)
9014             {
9015               gfc_symbol *ifc = c->ts.interface;
9016
9017               if (ifc->attr.intrinsic)
9018                 resolve_intrinsic (ifc, &ifc->declared_at);
9019
9020               if (ifc->result)
9021                 c->ts = ifc->result->ts;
9022               else   
9023                 c->ts = ifc->ts;
9024               c->ts.interface = ifc;
9025               c->attr.function = ifc->attr.function;
9026               c->attr.subroutine = ifc->attr.subroutine;
9027               /* TODO: gfc_copy_formal_args (c, ifc);  */
9028
9029               c->attr.allocatable = ifc->attr.allocatable;
9030               c->attr.pointer = ifc->attr.pointer;
9031               c->attr.pure = ifc->attr.pure;
9032               c->attr.elemental = ifc->attr.elemental;
9033               c->attr.dimension = ifc->attr.dimension;
9034               c->attr.recursive = ifc->attr.recursive;
9035               c->attr.always_explicit = ifc->attr.always_explicit;
9036               /* Copy array spec.  */
9037               c->as = gfc_copy_array_spec (ifc->as);
9038               /*if (c->as)
9039                 {
9040                   int i;
9041                   for (i = 0; i < c->as->rank; i++)
9042                     {
9043                       gfc_expr_replace_symbols (c->as->lower[i], c);
9044                       gfc_expr_replace_symbols (c->as->upper[i], c);
9045                     }
9046                 }*/
9047               /* Copy char length.  */
9048               if (ifc->ts.cl)
9049                 {
9050                   c->ts.cl = gfc_get_charlen();
9051                   c->ts.cl->resolved = ifc->ts.cl->resolved;
9052                   c->ts.cl->length = gfc_copy_expr (ifc->ts.cl->length);
9053                   /*gfc_expr_replace_symbols (c->ts.cl->length, c);*/
9054                   /* Add charlen to namespace.  */
9055                   /*if (c->formal_ns)
9056                     {
9057                       c->ts.cl->next = c->formal_ns->cl_list;
9058                       c->formal_ns->cl_list = c->ts.cl;
9059                     }*/
9060                 }
9061             }
9062           else if (c->ts.interface->name[0] != '\0')
9063             {
9064               gfc_error ("Interface '%s' of procedure pointer component "
9065                          "'%s' at %L must be explicit", c->ts.interface->name,
9066                          c->name, &c->loc);
9067               return FAILURE;
9068             }
9069         }
9070       else if (c->attr.proc_pointer && c->ts.type == BT_UNKNOWN)
9071         {
9072           c->ts = *gfc_get_default_type (c->name, NULL);
9073           c->attr.implicit_type = 1;
9074         }
9075
9076       /* Check type-spec if this is not the parent-type component.  */
9077       if ((!sym->attr.extension || c != sym->components)
9078           && resolve_typespec_used (&c->ts, &c->loc, c->name) == FAILURE)
9079         return FAILURE;
9080
9081       /* If this type is an extension, see if this component has the same name
9082          as an inherited type-bound procedure.  */
9083       if (super_type
9084           && gfc_find_typebound_proc (super_type, NULL, c->name, true))
9085         {
9086           gfc_error ("Component '%s' of '%s' at %L has the same name as an"
9087                      " inherited type-bound procedure",
9088                      c->name, sym->name, &c->loc);
9089           return FAILURE;
9090         }
9091
9092       if (c->ts.type == BT_CHARACTER)
9093         {
9094          if (c->ts.cl->length == NULL
9095              || (resolve_charlen (c->ts.cl) == FAILURE)
9096              || !gfc_is_constant_expr (c->ts.cl->length))
9097            {
9098              gfc_error ("Character length of component '%s' needs to "
9099                         "be a constant specification expression at %L",
9100                         c->name,
9101                         c->ts.cl->length ? &c->ts.cl->length->where : &c->loc);
9102              return FAILURE;
9103            }
9104         }
9105
9106       if (c->ts.type == BT_DERIVED
9107           && sym->component_access != ACCESS_PRIVATE
9108           && gfc_check_access (sym->attr.access, sym->ns->default_access)
9109           && !is_sym_host_assoc (c->ts.derived, sym->ns)
9110           && !c->ts.derived->attr.use_assoc
9111           && !gfc_check_access (c->ts.derived->attr.access,
9112                                 c->ts.derived->ns->default_access)
9113           && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: the component '%s' "
9114                              "is a PRIVATE type and cannot be a component of "
9115                              "'%s', which is PUBLIC at %L", c->name,
9116                              sym->name, &sym->declared_at) == FAILURE)
9117         return FAILURE;
9118
9119       if (sym->attr.sequence)
9120         {
9121           if (c->ts.type == BT_DERIVED && c->ts.derived->attr.sequence == 0)
9122             {
9123               gfc_error ("Component %s of SEQUENCE type declared at %L does "
9124                          "not have the SEQUENCE attribute",
9125                          c->ts.derived->name, &sym->declared_at);
9126               return FAILURE;
9127             }
9128         }
9129
9130       if (c->ts.type == BT_DERIVED && c->attr.pointer
9131           && c->ts.derived->components == NULL
9132           && !c->ts.derived->attr.zero_comp)
9133         {
9134           gfc_error ("The pointer component '%s' of '%s' at %L is a type "
9135                      "that has not been declared", c->name, sym->name,
9136                      &c->loc);
9137           return FAILURE;
9138         }
9139
9140       /* Ensure that all the derived type components are put on the
9141          derived type list; even in formal namespaces, where derived type
9142          pointer components might not have been declared.  */
9143       if (c->ts.type == BT_DERIVED
9144             && c->ts.derived
9145             && c->ts.derived->components
9146             && c->attr.pointer
9147             && sym != c->ts.derived)
9148         add_dt_to_dt_list (c->ts.derived);
9149
9150       if (c->attr.pointer || c->attr.allocatable ||  c->as == NULL)
9151         continue;
9152
9153       for (i = 0; i < c->as->rank; i++)
9154         {
9155           if (c->as->lower[i] == NULL
9156               || (resolve_index_expr (c->as->lower[i]) == FAILURE)
9157               || !gfc_is_constant_expr (c->as->lower[i])
9158               || c->as->upper[i] == NULL
9159               || (resolve_index_expr (c->as->upper[i]) == FAILURE)
9160               || !gfc_is_constant_expr (c->as->upper[i]))
9161             {
9162               gfc_error ("Component '%s' of '%s' at %L must have "
9163                          "constant array bounds",
9164                          c->name, sym->name, &c->loc);
9165               return FAILURE;
9166             }
9167         }
9168     }
9169
9170   /* Resolve the type-bound procedures.  */
9171   if (resolve_typebound_procedures (sym) == FAILURE)
9172     return FAILURE;
9173
9174   /* Resolve the finalizer procedures.  */
9175   if (gfc_resolve_finalizers (sym) == FAILURE)
9176     return FAILURE;
9177
9178   /* If this is a non-ABSTRACT type extending an ABSTRACT one, ensure that
9179      all DEFERRED bindings are overridden.  */
9180   if (super_type && super_type->attr.abstract && !sym->attr.abstract
9181       && ensure_not_abstract (sym, super_type) == FAILURE)
9182     return FAILURE;
9183
9184   /* Add derived type to the derived type list.  */
9185   add_dt_to_dt_list (sym);
9186
9187   return SUCCESS;
9188 }
9189
9190
9191 static gfc_try
9192 resolve_fl_namelist (gfc_symbol *sym)
9193 {
9194   gfc_namelist *nl;
9195   gfc_symbol *nlsym;
9196
9197   /* Reject PRIVATE objects in a PUBLIC namelist.  */
9198   if (gfc_check_access(sym->attr.access, sym->ns->default_access))
9199     {
9200       for (nl = sym->namelist; nl; nl = nl->next)
9201         {
9202           if (!nl->sym->attr.use_assoc
9203               && !is_sym_host_assoc (nl->sym, sym->ns)
9204               && !gfc_check_access(nl->sym->attr.access,
9205                                 nl->sym->ns->default_access))
9206             {
9207               gfc_error ("NAMELIST object '%s' was declared PRIVATE and "
9208                          "cannot be member of PUBLIC namelist '%s' at %L",
9209                          nl->sym->name, sym->name, &sym->declared_at);
9210               return FAILURE;
9211             }
9212
9213           /* Types with private components that came here by USE-association.  */
9214           if (nl->sym->ts.type == BT_DERIVED
9215               && derived_inaccessible (nl->sym->ts.derived))
9216             {
9217               gfc_error ("NAMELIST object '%s' has use-associated PRIVATE "
9218                          "components and cannot be member of namelist '%s' at %L",
9219                          nl->sym->name, sym->name, &sym->declared_at);
9220               return FAILURE;
9221             }
9222
9223           /* Types with private components that are defined in the same module.  */
9224           if (nl->sym->ts.type == BT_DERIVED
9225               && !is_sym_host_assoc (nl->sym->ts.derived, sym->ns)
9226               && !gfc_check_access (nl->sym->ts.derived->attr.private_comp
9227                                         ? ACCESS_PRIVATE : ACCESS_UNKNOWN,
9228                                         nl->sym->ns->default_access))
9229             {
9230               gfc_error ("NAMELIST object '%s' has PRIVATE components and "
9231                          "cannot be a member of PUBLIC namelist '%s' at %L",
9232                          nl->sym->name, sym->name, &sym->declared_at);
9233               return FAILURE;
9234             }
9235         }
9236     }
9237
9238   for (nl = sym->namelist; nl; nl = nl->next)
9239     {
9240       /* Reject namelist arrays of assumed shape.  */
9241       if (nl->sym->as && nl->sym->as->type == AS_ASSUMED_SHAPE
9242           && gfc_notify_std (GFC_STD_F2003, "NAMELIST array object '%s' "
9243                              "must not have assumed shape in namelist "
9244                              "'%s' at %L", nl->sym->name, sym->name,
9245                              &sym->declared_at) == FAILURE)
9246             return FAILURE;
9247
9248       /* Reject namelist arrays that are not constant shape.  */
9249       if (is_non_constant_shape_array (nl->sym))
9250         {
9251           gfc_error ("NAMELIST array object '%s' must have constant "
9252                      "shape in namelist '%s' at %L", nl->sym->name,
9253                      sym->name, &sym->declared_at);
9254           return FAILURE;
9255         }
9256
9257       /* Namelist objects cannot have allocatable or pointer components.  */
9258       if (nl->sym->ts.type != BT_DERIVED)
9259         continue;
9260
9261       if (nl->sym->ts.derived->attr.alloc_comp)
9262         {
9263           gfc_error ("NAMELIST object '%s' in namelist '%s' at %L cannot "
9264                      "have ALLOCATABLE components",
9265                      nl->sym->name, sym->name, &sym->declared_at);
9266           return FAILURE;
9267         }
9268
9269       if (nl->sym->ts.derived->attr.pointer_comp)
9270         {
9271           gfc_error ("NAMELIST object '%s' in namelist '%s' at %L cannot "
9272                      "have POINTER components", 
9273                      nl->sym->name, sym->name, &sym->declared_at);
9274           return FAILURE;
9275         }
9276     }
9277
9278
9279   /* 14.1.2 A module or internal procedure represent local entities
9280      of the same type as a namelist member and so are not allowed.  */
9281   for (nl = sym->namelist; nl; nl = nl->next)
9282     {
9283       if (nl->sym->ts.kind != 0 && nl->sym->attr.flavor == FL_VARIABLE)
9284         continue;
9285
9286       if (nl->sym->attr.function && nl->sym == nl->sym->result)
9287         if ((nl->sym == sym->ns->proc_name)
9288                ||
9289             (sym->ns->parent && nl->sym == sym->ns->parent->proc_name))
9290           continue;
9291
9292       nlsym = NULL;
9293       if (nl->sym && nl->sym->name)
9294         gfc_find_symbol (nl->sym->name, sym->ns, 1, &nlsym);
9295       if (nlsym && nlsym->attr.flavor == FL_PROCEDURE)
9296         {
9297           gfc_error ("PROCEDURE attribute conflicts with NAMELIST "
9298                      "attribute in '%s' at %L", nlsym->name,
9299                      &sym->declared_at);
9300           return FAILURE;
9301         }
9302     }
9303
9304   return SUCCESS;
9305 }
9306
9307
9308 static gfc_try
9309 resolve_fl_parameter (gfc_symbol *sym)
9310 {
9311   /* A parameter array's shape needs to be constant.  */
9312   if (sym->as != NULL 
9313       && (sym->as->type == AS_DEFERRED
9314           || is_non_constant_shape_array (sym)))
9315     {
9316       gfc_error ("Parameter array '%s' at %L cannot be automatic "
9317                  "or of deferred shape", sym->name, &sym->declared_at);
9318       return FAILURE;
9319     }
9320
9321   /* Make sure a parameter that has been implicitly typed still
9322      matches the implicit type, since PARAMETER statements can precede
9323      IMPLICIT statements.  */
9324   if (sym->attr.implicit_type
9325       && !gfc_compare_types (&sym->ts, gfc_get_default_type (sym->name,
9326                                                              sym->ns)))
9327     {
9328       gfc_error ("Implicitly typed PARAMETER '%s' at %L doesn't match a "
9329                  "later IMPLICIT type", sym->name, &sym->declared_at);
9330       return FAILURE;
9331     }
9332
9333   /* Make sure the types of derived parameters are consistent.  This
9334      type checking is deferred until resolution because the type may
9335      refer to a derived type from the host.  */
9336   if (sym->ts.type == BT_DERIVED
9337       && !gfc_compare_types (&sym->ts, &sym->value->ts))
9338     {
9339       gfc_error ("Incompatible derived type in PARAMETER at %L",
9340                  &sym->value->where);
9341       return FAILURE;
9342     }
9343   return SUCCESS;
9344 }
9345
9346
9347 /* Do anything necessary to resolve a symbol.  Right now, we just
9348    assume that an otherwise unknown symbol is a variable.  This sort
9349    of thing commonly happens for symbols in module.  */
9350
9351 static void
9352 resolve_symbol (gfc_symbol *sym)
9353 {
9354   int check_constant, mp_flag;
9355   gfc_symtree *symtree;
9356   gfc_symtree *this_symtree;
9357   gfc_namespace *ns;
9358   gfc_component *c;
9359
9360   if (sym->attr.flavor == FL_UNKNOWN)
9361     {
9362
9363     /* If we find that a flavorless symbol is an interface in one of the
9364        parent namespaces, find its symtree in this namespace, free the
9365        symbol and set the symtree to point to the interface symbol.  */
9366       for (ns = gfc_current_ns->parent; ns; ns = ns->parent)
9367         {
9368           symtree = gfc_find_symtree (ns->sym_root, sym->name);
9369           if (symtree && symtree->n.sym->generic)
9370             {
9371               this_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
9372                                                sym->name);
9373               sym->refs--;
9374               if (!sym->refs)
9375                 gfc_free_symbol (sym);
9376               symtree->n.sym->refs++;
9377               this_symtree->n.sym = symtree->n.sym;
9378               return;
9379             }
9380         }
9381
9382       /* Otherwise give it a flavor according to such attributes as
9383          it has.  */
9384       if (sym->attr.external == 0 && sym->attr.intrinsic == 0)
9385         sym->attr.flavor = FL_VARIABLE;
9386       else
9387         {
9388           sym->attr.flavor = FL_PROCEDURE;
9389           if (sym->attr.dimension)
9390             sym->attr.function = 1;
9391         }
9392     }
9393
9394   if (sym->attr.external && sym->ts.type != BT_UNKNOWN && !sym->attr.function)
9395     gfc_add_function (&sym->attr, sym->name, &sym->declared_at);
9396
9397   if (sym->attr.procedure && sym->ts.interface
9398       && sym->attr.if_source != IFSRC_DECL)
9399     {
9400       if (sym->ts.interface->attr.procedure)
9401         gfc_error ("Interface '%s', used by procedure '%s' at %L, is declared "
9402                    "in a later PROCEDURE statement", sym->ts.interface->name,
9403                    sym->name,&sym->declared_at);
9404
9405       /* Get the attributes from the interface (now resolved).  */
9406       if (sym->ts.interface->attr.if_source
9407           || sym->ts.interface->attr.intrinsic)
9408         {
9409           gfc_symbol *ifc = sym->ts.interface;
9410
9411           if (ifc->attr.intrinsic)
9412             resolve_intrinsic (ifc, &ifc->declared_at);
9413
9414           if (ifc->result)
9415             sym->ts = ifc->result->ts;
9416           else   
9417             sym->ts = ifc->ts;
9418           sym->ts.interface = ifc;
9419           sym->attr.function = ifc->attr.function;
9420           sym->attr.subroutine = ifc->attr.subroutine;
9421           gfc_copy_formal_args (sym, ifc);
9422
9423           sym->attr.allocatable = ifc->attr.allocatable;
9424           sym->attr.pointer = ifc->attr.pointer;
9425           sym->attr.pure = ifc->attr.pure;
9426           sym->attr.elemental = ifc->attr.elemental;
9427           sym->attr.dimension = ifc->attr.dimension;
9428           sym->attr.recursive = ifc->attr.recursive;
9429           sym->attr.always_explicit = ifc->attr.always_explicit;
9430           /* Copy array spec.  */
9431           sym->as = gfc_copy_array_spec (ifc->as);
9432           if (sym->as)
9433             {
9434               int i;
9435               for (i = 0; i < sym->as->rank; i++)
9436                 {
9437                   gfc_expr_replace_symbols (sym->as->lower[i], sym);
9438                   gfc_expr_replace_symbols (sym->as->upper[i], sym);
9439                 }
9440             }
9441           /* Copy char length.  */
9442           if (ifc->ts.cl)
9443             {
9444               sym->ts.cl = gfc_get_charlen();
9445               sym->ts.cl->resolved = ifc->ts.cl->resolved;
9446               sym->ts.cl->length = gfc_copy_expr (ifc->ts.cl->length);
9447               gfc_expr_replace_symbols (sym->ts.cl->length, sym);
9448               /* Add charlen to namespace.  */
9449               if (sym->formal_ns)
9450                 {
9451                   sym->ts.cl->next = sym->formal_ns->cl_list;
9452                   sym->formal_ns->cl_list = sym->ts.cl;
9453                 }
9454             }
9455         }
9456       else if (sym->ts.interface->name[0] != '\0')
9457         {
9458           gfc_error ("Interface '%s' of procedure '%s' at %L must be explicit",
9459                     sym->ts.interface->name, sym->name, &sym->declared_at);
9460           return;
9461         }
9462     }
9463
9464   if (sym->attr.flavor == FL_DERIVED && resolve_fl_derived (sym) == FAILURE)
9465     return;
9466
9467   /* Symbols that are module procedures with results (functions) have
9468      the types and array specification copied for type checking in
9469      procedures that call them, as well as for saving to a module
9470      file.  These symbols can't stand the scrutiny that their results
9471      can.  */
9472   mp_flag = (sym->result != NULL && sym->result != sym);
9473
9474
9475   /* Make sure that the intrinsic is consistent with its internal 
9476      representation. This needs to be done before assigning a default 
9477      type to avoid spurious warnings.  */
9478   if (sym->attr.flavor != FL_MODULE && sym->attr.intrinsic)
9479     {
9480       gfc_intrinsic_sym* isym;
9481       const char* symstd;
9482
9483       /* We already know this one is an intrinsic, so we don't call
9484          gfc_is_intrinsic for full checking but rather use gfc_find_function and
9485          gfc_find_subroutine directly to check whether it is a function or
9486          subroutine.  */
9487
9488       if ((isym = gfc_find_function (sym->name)))
9489         {
9490           if (sym->ts.type != BT_UNKNOWN && gfc_option.warn_surprising
9491               && !sym->attr.implicit_type)
9492             gfc_warning ("Type specified for intrinsic function '%s' at %L is"
9493                          " ignored", sym->name, &sym->declared_at);
9494         }
9495       else if ((isym = gfc_find_subroutine (sym->name)))
9496         {
9497           if (sym->ts.type != BT_UNKNOWN && !sym->attr.implicit_type)
9498             {
9499               gfc_error ("Intrinsic subroutine '%s' at %L shall not have a type"
9500                          " specifier", sym->name, &sym->declared_at);
9501               return;
9502             }
9503         }
9504       else
9505         {
9506           gfc_error ("'%s' declared INTRINSIC at %L does not exist",
9507                      sym->name, &sym->declared_at);
9508           return;
9509         }
9510
9511       /* Check it is actually available in the standard settings.  */
9512       if (gfc_check_intrinsic_standard (isym, &symstd, false, sym->declared_at)
9513             == FAILURE)
9514         {
9515           gfc_error ("The intrinsic '%s' declared INTRINSIC at %L is not"
9516                      " available in the current standard settings but %s.  Use"
9517                      " an appropriate -std=* option or enable -fall-intrinsics"
9518                      " in order to use it.",
9519                      sym->name, &sym->declared_at, symstd);
9520           return;
9521         }
9522      }
9523
9524   /* Assign default type to symbols that need one and don't have one.  */
9525   if (sym->ts.type == BT_UNKNOWN)
9526     {
9527       if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER)
9528         gfc_set_default_type (sym, 1, NULL);
9529
9530       if (sym->attr.flavor == FL_PROCEDURE && sym->attr.function)
9531         {
9532           /* The specific case of an external procedure should emit an error
9533              in the case that there is no implicit type.  */
9534           if (!mp_flag)
9535             gfc_set_default_type (sym, sym->attr.external, NULL);
9536           else
9537             {
9538               /* Result may be in another namespace.  */
9539               resolve_symbol (sym->result);
9540
9541               if (!sym->result->attr.proc_pointer)
9542                 {
9543                   sym->ts = sym->result->ts;
9544                   sym->as = gfc_copy_array_spec (sym->result->as);
9545                   sym->attr.dimension = sym->result->attr.dimension;
9546                   sym->attr.pointer = sym->result->attr.pointer;
9547                   sym->attr.allocatable = sym->result->attr.allocatable;
9548                 }
9549             }
9550         }
9551     }
9552
9553   /* Assumed size arrays and assumed shape arrays must be dummy
9554      arguments.  */
9555
9556   if (sym->as != NULL
9557       && (sym->as->type == AS_ASSUMED_SIZE
9558           || sym->as->type == AS_ASSUMED_SHAPE)
9559       && sym->attr.dummy == 0)
9560     {
9561       if (sym->as->type == AS_ASSUMED_SIZE)
9562         gfc_error ("Assumed size array at %L must be a dummy argument",
9563                    &sym->declared_at);
9564       else
9565         gfc_error ("Assumed shape array at %L must be a dummy argument",
9566                    &sym->declared_at);
9567       return;
9568     }
9569
9570   /* Make sure symbols with known intent or optional are really dummy
9571      variable.  Because of ENTRY statement, this has to be deferred
9572      until resolution time.  */
9573
9574   if (!sym->attr.dummy
9575       && (sym->attr.optional || sym->attr.intent != INTENT_UNKNOWN))
9576     {
9577       gfc_error ("Symbol at %L is not a DUMMY variable", &sym->declared_at);
9578       return;
9579     }
9580
9581   if (sym->attr.value && !sym->attr.dummy)
9582     {
9583       gfc_error ("'%s' at %L cannot have the VALUE attribute because "
9584                  "it is not a dummy argument", sym->name, &sym->declared_at);
9585       return;
9586     }
9587
9588   if (sym->attr.value && sym->ts.type == BT_CHARACTER)
9589     {
9590       gfc_charlen *cl = sym->ts.cl;
9591       if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
9592         {
9593           gfc_error ("Character dummy variable '%s' at %L with VALUE "
9594                      "attribute must have constant length",
9595                      sym->name, &sym->declared_at);
9596           return;
9597         }
9598
9599       if (sym->ts.is_c_interop
9600           && mpz_cmp_si (cl->length->value.integer, 1) != 0)
9601         {
9602           gfc_error ("C interoperable character dummy variable '%s' at %L "
9603                      "with VALUE attribute must have length one",
9604                      sym->name, &sym->declared_at);
9605           return;
9606         }
9607     }
9608
9609   /* If the symbol is marked as bind(c), verify it's type and kind.  Do not
9610      do this for something that was implicitly typed because that is handled
9611      in gfc_set_default_type.  Handle dummy arguments and procedure
9612      definitions separately.  Also, anything that is use associated is not
9613      handled here but instead is handled in the module it is declared in.
9614      Finally, derived type definitions are allowed to be BIND(C) since that
9615      only implies that they're interoperable, and they are checked fully for
9616      interoperability when a variable is declared of that type.  */
9617   if (sym->attr.is_bind_c && sym->attr.implicit_type == 0 &&
9618       sym->attr.use_assoc == 0 && sym->attr.dummy == 0 &&
9619       sym->attr.flavor != FL_PROCEDURE && sym->attr.flavor != FL_DERIVED)
9620     {
9621       gfc_try t = SUCCESS;
9622       
9623       /* First, make sure the variable is declared at the
9624          module-level scope (J3/04-007, Section 15.3).  */
9625       if (sym->ns->proc_name->attr.flavor != FL_MODULE &&
9626           sym->attr.in_common == 0)
9627         {
9628           gfc_error ("Variable '%s' at %L cannot be BIND(C) because it "
9629                      "is neither a COMMON block nor declared at the "
9630                      "module level scope", sym->name, &(sym->declared_at));
9631           t = FAILURE;
9632         }
9633       else if (sym->common_head != NULL)
9634         {
9635           t = verify_com_block_vars_c_interop (sym->common_head);
9636         }
9637       else
9638         {
9639           /* If type() declaration, we need to verify that the components
9640              of the given type are all C interoperable, etc.  */
9641           if (sym->ts.type == BT_DERIVED &&
9642               sym->ts.derived->attr.is_c_interop != 1)
9643             {
9644               /* Make sure the user marked the derived type as BIND(C).  If
9645                  not, call the verify routine.  This could print an error
9646                  for the derived type more than once if multiple variables
9647                  of that type are declared.  */
9648               if (sym->ts.derived->attr.is_bind_c != 1)
9649                 verify_bind_c_derived_type (sym->ts.derived);
9650               t = FAILURE;
9651             }
9652           
9653           /* Verify the variable itself as C interoperable if it
9654              is BIND(C).  It is not possible for this to succeed if
9655              the verify_bind_c_derived_type failed, so don't have to handle
9656              any error returned by verify_bind_c_derived_type.  */
9657           t = verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
9658                                  sym->common_block);
9659         }
9660
9661       if (t == FAILURE)
9662         {
9663           /* clear the is_bind_c flag to prevent reporting errors more than
9664              once if something failed.  */
9665           sym->attr.is_bind_c = 0;
9666           return;
9667         }
9668     }
9669
9670   /* If a derived type symbol has reached this point, without its
9671      type being declared, we have an error.  Notice that most
9672      conditions that produce undefined derived types have already
9673      been dealt with.  However, the likes of:
9674      implicit type(t) (t) ..... call foo (t) will get us here if
9675      the type is not declared in the scope of the implicit
9676      statement. Change the type to BT_UNKNOWN, both because it is so
9677      and to prevent an ICE.  */
9678   if (sym->ts.type == BT_DERIVED && sym->ts.derived->components == NULL
9679       && !sym->ts.derived->attr.zero_comp)
9680     {
9681       gfc_error ("The derived type '%s' at %L is of type '%s', "
9682                  "which has not been defined", sym->name,
9683                   &sym->declared_at, sym->ts.derived->name);
9684       sym->ts.type = BT_UNKNOWN;
9685       return;
9686     }
9687
9688   /* Make sure that the derived type has been resolved and that the
9689      derived type is visible in the symbol's namespace, if it is a
9690      module function and is not PRIVATE.  */
9691   if (sym->ts.type == BT_DERIVED
9692         && sym->ts.derived->attr.use_assoc
9693         && sym->ns->proc_name
9694         && sym->ns->proc_name->attr.flavor == FL_MODULE)
9695     {
9696       gfc_symbol *ds;
9697
9698       if (resolve_fl_derived (sym->ts.derived) == FAILURE)
9699         return;
9700
9701       gfc_find_symbol (sym->ts.derived->name, sym->ns, 1, &ds);
9702       if (!ds && sym->attr.function
9703             && gfc_check_access (sym->attr.access, sym->ns->default_access))
9704         {
9705           symtree = gfc_new_symtree (&sym->ns->sym_root,
9706                                      sym->ts.derived->name);
9707           symtree->n.sym = sym->ts.derived;
9708           sym->ts.derived->refs++;
9709         }
9710     }
9711
9712   /* Unless the derived-type declaration is use associated, Fortran 95
9713      does not allow public entries of private derived types.
9714      See 4.4.1 (F95) and 4.5.1.1 (F2003); and related interpretation
9715      161 in 95-006r3.  */
9716   if (sym->ts.type == BT_DERIVED
9717       && sym->ns->proc_name && sym->ns->proc_name->attr.flavor == FL_MODULE
9718       && !sym->ts.derived->attr.use_assoc
9719       && gfc_check_access (sym->attr.access, sym->ns->default_access)
9720       && !gfc_check_access (sym->ts.derived->attr.access,
9721                             sym->ts.derived->ns->default_access)
9722       && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PUBLIC %s '%s' at %L "
9723                          "of PRIVATE derived type '%s'",
9724                          (sym->attr.flavor == FL_PARAMETER) ? "parameter"
9725                          : "variable", sym->name, &sym->declared_at,
9726                          sym->ts.derived->name) == FAILURE)
9727     return;
9728
9729   /* An assumed-size array with INTENT(OUT) shall not be of a type for which
9730      default initialization is defined (5.1.2.4.4).  */
9731   if (sym->ts.type == BT_DERIVED
9732       && sym->attr.dummy
9733       && sym->attr.intent == INTENT_OUT
9734       && sym->as
9735       && sym->as->type == AS_ASSUMED_SIZE)
9736     {
9737       for (c = sym->ts.derived->components; c; c = c->next)
9738         {
9739           if (c->initializer)
9740             {
9741               gfc_error ("The INTENT(OUT) dummy argument '%s' at %L is "
9742                          "ASSUMED SIZE and so cannot have a default initializer",
9743                          sym->name, &sym->declared_at);
9744               return;
9745             }
9746         }
9747     }
9748
9749   switch (sym->attr.flavor)
9750     {
9751     case FL_VARIABLE:
9752       if (resolve_fl_variable (sym, mp_flag) == FAILURE)
9753         return;
9754       break;
9755
9756     case FL_PROCEDURE:
9757       if (resolve_fl_procedure (sym, mp_flag) == FAILURE)
9758         return;
9759       break;
9760
9761     case FL_NAMELIST:
9762       if (resolve_fl_namelist (sym) == FAILURE)
9763         return;
9764       break;
9765
9766     case FL_PARAMETER:
9767       if (resolve_fl_parameter (sym) == FAILURE)
9768         return;
9769       break;
9770
9771     default:
9772       break;
9773     }
9774
9775   /* Resolve array specifier. Check as well some constraints
9776      on COMMON blocks.  */
9777
9778   check_constant = sym->attr.in_common && !sym->attr.pointer;
9779
9780   /* Set the formal_arg_flag so that check_conflict will not throw
9781      an error for host associated variables in the specification
9782      expression for an array_valued function.  */
9783   if (sym->attr.function && sym->as)
9784     formal_arg_flag = 1;
9785
9786   gfc_resolve_array_spec (sym->as, check_constant);
9787
9788   formal_arg_flag = 0;
9789
9790   /* Resolve formal namespaces.  */
9791   if (sym->formal_ns && sym->formal_ns != gfc_current_ns)
9792     gfc_resolve (sym->formal_ns);
9793
9794   /* Check threadprivate restrictions.  */
9795   if (sym->attr.threadprivate && !sym->attr.save && !sym->ns->save_all
9796       && (!sym->attr.in_common
9797           && sym->module == NULL
9798           && (sym->ns->proc_name == NULL
9799               || sym->ns->proc_name->attr.flavor != FL_MODULE)))
9800     gfc_error ("Threadprivate at %L isn't SAVEd", &sym->declared_at);
9801
9802   /* If we have come this far we can apply default-initializers, as
9803      described in 14.7.5, to those variables that have not already
9804      been assigned one.  */
9805   if (sym->ts.type == BT_DERIVED
9806       && sym->attr.referenced
9807       && sym->ns == gfc_current_ns
9808       && !sym->value
9809       && !sym->attr.allocatable
9810       && !sym->attr.alloc_comp)
9811     {
9812       symbol_attribute *a = &sym->attr;
9813
9814       if ((!a->save && !a->dummy && !a->pointer
9815            && !a->in_common && !a->use_assoc
9816            && !(a->function && sym != sym->result))
9817           || (a->dummy && a->intent == INTENT_OUT))
9818         apply_default_init (sym);
9819     }
9820
9821   /* If this symbol has a type-spec, check it.  */
9822   if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER
9823       || (sym->attr.flavor == FL_PROCEDURE && sym->attr.function))
9824     if (resolve_typespec_used (&sym->ts, &sym->declared_at, sym->name)
9825           == FAILURE)
9826       return;
9827 }
9828
9829
9830 /************* Resolve DATA statements *************/
9831
9832 static struct
9833 {
9834   gfc_data_value *vnode;
9835   mpz_t left;
9836 }
9837 values;
9838
9839
9840 /* Advance the values structure to point to the next value in the data list.  */
9841
9842 static gfc_try
9843 next_data_value (void)
9844 {
9845
9846   while (mpz_cmp_ui (values.left, 0) == 0)
9847     {
9848       if (values.vnode->next == NULL)
9849         return FAILURE;
9850
9851       values.vnode = values.vnode->next;
9852       mpz_set (values.left, values.vnode->repeat);
9853     }
9854
9855   return SUCCESS;
9856 }
9857
9858
9859 static gfc_try
9860 check_data_variable (gfc_data_variable *var, locus *where)
9861 {
9862   gfc_expr *e;
9863   mpz_t size;
9864   mpz_t offset;
9865   gfc_try t;
9866   ar_type mark = AR_UNKNOWN;
9867   int i;
9868   mpz_t section_index[GFC_MAX_DIMENSIONS];
9869   gfc_ref *ref;
9870   gfc_array_ref *ar;
9871   gfc_symbol *sym;
9872   int has_pointer;
9873
9874   if (gfc_resolve_expr (var->expr) == FAILURE)
9875     return FAILURE;
9876
9877   ar = NULL;
9878   mpz_init_set_si (offset, 0);
9879   e = var->expr;
9880
9881   if (e->expr_type != EXPR_VARIABLE)
9882     gfc_internal_error ("check_data_variable(): Bad expression");
9883
9884   sym = e->symtree->n.sym;
9885
9886   if (sym->ns->is_block_data && !sym->attr.in_common)
9887     {
9888       gfc_error ("BLOCK DATA element '%s' at %L must be in COMMON",
9889                  sym->name, &sym->declared_at);
9890     }
9891
9892   if (e->ref == NULL && sym->as)
9893     {
9894       gfc_error ("DATA array '%s' at %L must be specified in a previous"
9895                  " declaration", sym->name, where);
9896       return FAILURE;
9897     }
9898
9899   has_pointer = sym->attr.pointer;
9900
9901   for (ref = e->ref; ref; ref = ref->next)
9902     {
9903       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
9904         has_pointer = 1;
9905
9906       if (has_pointer
9907             && ref->type == REF_ARRAY
9908             && ref->u.ar.type != AR_FULL)
9909           {
9910             gfc_error ("DATA element '%s' at %L is a pointer and so must "
9911                         "be a full array", sym->name, where);
9912             return FAILURE;
9913           }
9914     }
9915
9916   if (e->rank == 0 || has_pointer)
9917     {
9918       mpz_init_set_ui (size, 1);
9919       ref = NULL;
9920     }
9921   else
9922     {
9923       ref = e->ref;
9924
9925       /* Find the array section reference.  */
9926       for (ref = e->ref; ref; ref = ref->next)
9927         {
9928           if (ref->type != REF_ARRAY)
9929             continue;
9930           if (ref->u.ar.type == AR_ELEMENT)
9931             continue;
9932           break;
9933         }
9934       gcc_assert (ref);
9935
9936       /* Set marks according to the reference pattern.  */
9937       switch (ref->u.ar.type)
9938         {
9939         case AR_FULL:
9940           mark = AR_FULL;
9941           break;
9942
9943         case AR_SECTION:
9944           ar = &ref->u.ar;
9945           /* Get the start position of array section.  */
9946           gfc_get_section_index (ar, section_index, &offset);
9947           mark = AR_SECTION;
9948           break;
9949
9950         default:
9951           gcc_unreachable ();
9952         }
9953
9954       if (gfc_array_size (e, &size) == FAILURE)
9955         {
9956           gfc_error ("Nonconstant array section at %L in DATA statement",
9957                      &e->where);
9958           mpz_clear (offset);
9959           return FAILURE;
9960         }
9961     }
9962
9963   t = SUCCESS;
9964
9965   while (mpz_cmp_ui (size, 0) > 0)
9966     {
9967       if (next_data_value () == FAILURE)
9968         {
9969           gfc_error ("DATA statement at %L has more variables than values",
9970                      where);
9971           t = FAILURE;
9972           break;
9973         }
9974
9975       t = gfc_check_assign (var->expr, values.vnode->expr, 0);
9976       if (t == FAILURE)
9977         break;
9978
9979       /* If we have more than one element left in the repeat count,
9980          and we have more than one element left in the target variable,
9981          then create a range assignment.  */
9982       /* FIXME: Only done for full arrays for now, since array sections
9983          seem tricky.  */
9984       if (mark == AR_FULL && ref && ref->next == NULL
9985           && mpz_cmp_ui (values.left, 1) > 0 && mpz_cmp_ui (size, 1) > 0)
9986         {
9987           mpz_t range;
9988
9989           if (mpz_cmp (size, values.left) >= 0)
9990             {
9991               mpz_init_set (range, values.left);
9992               mpz_sub (size, size, values.left);
9993               mpz_set_ui (values.left, 0);
9994             }
9995           else
9996             {
9997               mpz_init_set (range, size);
9998               mpz_sub (values.left, values.left, size);
9999               mpz_set_ui (size, 0);
10000             }
10001
10002           gfc_assign_data_value_range (var->expr, values.vnode->expr,
10003                                        offset, range);
10004
10005           mpz_add (offset, offset, range);
10006           mpz_clear (range);
10007         }
10008
10009       /* Assign initial value to symbol.  */
10010       else
10011         {
10012           mpz_sub_ui (values.left, values.left, 1);
10013           mpz_sub_ui (size, size, 1);
10014
10015           t = gfc_assign_data_value (var->expr, values.vnode->expr, offset);
10016           if (t == FAILURE)
10017             break;
10018
10019           if (mark == AR_FULL)
10020             mpz_add_ui (offset, offset, 1);
10021
10022           /* Modify the array section indexes and recalculate the offset
10023              for next element.  */
10024           else if (mark == AR_SECTION)
10025             gfc_advance_section (section_index, ar, &offset);
10026         }
10027     }
10028
10029   if (mark == AR_SECTION)
10030     {
10031       for (i = 0; i < ar->dimen; i++)
10032         mpz_clear (section_index[i]);
10033     }
10034
10035   mpz_clear (size);
10036   mpz_clear (offset);
10037
10038   return t;
10039 }
10040
10041
10042 static gfc_try traverse_data_var (gfc_data_variable *, locus *);
10043
10044 /* Iterate over a list of elements in a DATA statement.  */
10045
10046 static gfc_try
10047 traverse_data_list (gfc_data_variable *var, locus *where)
10048 {
10049   mpz_t trip;
10050   iterator_stack frame;
10051   gfc_expr *e, *start, *end, *step;
10052   gfc_try retval = SUCCESS;
10053
10054   mpz_init (frame.value);
10055
10056   start = gfc_copy_expr (var->iter.start);
10057   end = gfc_copy_expr (var->iter.end);
10058   step = gfc_copy_expr (var->iter.step);
10059
10060   if (gfc_simplify_expr (start, 1) == FAILURE
10061       || start->expr_type != EXPR_CONSTANT)
10062     {
10063       gfc_error ("iterator start at %L does not simplify", &start->where);
10064       retval = FAILURE;
10065       goto cleanup;
10066     }
10067   if (gfc_simplify_expr (end, 1) == FAILURE
10068       || end->expr_type != EXPR_CONSTANT)
10069     {
10070       gfc_error ("iterator end at %L does not simplify", &end->where);
10071       retval = FAILURE;
10072       goto cleanup;
10073     }
10074   if (gfc_simplify_expr (step, 1) == FAILURE
10075       || step->expr_type != EXPR_CONSTANT)
10076     {
10077       gfc_error ("iterator step at %L does not simplify", &step->where);
10078       retval = FAILURE;
10079       goto cleanup;
10080     }
10081
10082   mpz_init_set (trip, end->value.integer);
10083   mpz_sub (trip, trip, start->value.integer);
10084   mpz_add (trip, trip, step->value.integer);
10085
10086   mpz_div (trip, trip, step->value.integer);
10087
10088   mpz_set (frame.value, start->value.integer);
10089
10090   frame.prev = iter_stack;
10091   frame.variable = var->iter.var->symtree;
10092   iter_stack = &frame;
10093
10094   while (mpz_cmp_ui (trip, 0) > 0)
10095     {
10096       if (traverse_data_var (var->list, where) == FAILURE)
10097         {
10098           mpz_clear (trip);
10099           retval = FAILURE;
10100           goto cleanup;
10101         }
10102
10103       e = gfc_copy_expr (var->expr);
10104       if (gfc_simplify_expr (e, 1) == FAILURE)
10105         {
10106           gfc_free_expr (e);
10107           mpz_clear (trip);
10108           retval = FAILURE;
10109           goto cleanup;
10110         }
10111
10112       mpz_add (frame.value, frame.value, step->value.integer);
10113
10114       mpz_sub_ui (trip, trip, 1);
10115     }
10116
10117   mpz_clear (trip);
10118 cleanup:
10119   mpz_clear (frame.value);
10120
10121   gfc_free_expr (start);
10122   gfc_free_expr (end);
10123   gfc_free_expr (step);
10124
10125   iter_stack = frame.prev;
10126   return retval;
10127 }
10128
10129
10130 /* Type resolve variables in the variable list of a DATA statement.  */
10131
10132 static gfc_try
10133 traverse_data_var (gfc_data_variable *var, locus *where)
10134 {
10135   gfc_try t;
10136
10137   for (; var; var = var->next)
10138     {
10139       if (var->expr == NULL)
10140         t = traverse_data_list (var, where);
10141       else
10142         t = check_data_variable (var, where);
10143
10144       if (t == FAILURE)
10145         return FAILURE;
10146     }
10147
10148   return SUCCESS;
10149 }
10150
10151
10152 /* Resolve the expressions and iterators associated with a data statement.
10153    This is separate from the assignment checking because data lists should
10154    only be resolved once.  */
10155
10156 static gfc_try
10157 resolve_data_variables (gfc_data_variable *d)
10158 {
10159   for (; d; d = d->next)
10160     {
10161       if (d->list == NULL)
10162         {
10163           if (gfc_resolve_expr (d->expr) == FAILURE)
10164             return FAILURE;
10165         }
10166       else
10167         {
10168           if (gfc_resolve_iterator (&d->iter, false) == FAILURE)
10169             return FAILURE;
10170
10171           if (resolve_data_variables (d->list) == FAILURE)
10172             return FAILURE;
10173         }
10174     }
10175
10176   return SUCCESS;
10177 }
10178
10179
10180 /* Resolve a single DATA statement.  We implement this by storing a pointer to
10181    the value list into static variables, and then recursively traversing the
10182    variables list, expanding iterators and such.  */
10183
10184 static void
10185 resolve_data (gfc_data *d)
10186 {
10187
10188   if (resolve_data_variables (d->var) == FAILURE)
10189     return;
10190
10191   values.vnode = d->value;
10192   if (d->value == NULL)
10193     mpz_set_ui (values.left, 0);
10194   else
10195     mpz_set (values.left, d->value->repeat);
10196
10197   if (traverse_data_var (d->var, &d->where) == FAILURE)
10198     return;
10199
10200   /* At this point, we better not have any values left.  */
10201
10202   if (next_data_value () == SUCCESS)
10203     gfc_error ("DATA statement at %L has more values than variables",
10204                &d->where);
10205 }
10206
10207
10208 /* 12.6 Constraint: In a pure subprogram any variable which is in common or
10209    accessed by host or use association, is a dummy argument to a pure function,
10210    is a dummy argument with INTENT (IN) to a pure subroutine, or an object that
10211    is storage associated with any such variable, shall not be used in the
10212    following contexts: (clients of this function).  */
10213
10214 /* Determines if a variable is not 'pure', i.e., not assignable within a pure
10215    procedure.  Returns zero if assignment is OK, nonzero if there is a
10216    problem.  */
10217 int
10218 gfc_impure_variable (gfc_symbol *sym)
10219 {
10220   gfc_symbol *proc;
10221
10222   if (sym->attr.use_assoc || sym->attr.in_common)
10223     return 1;
10224
10225   if (sym->ns != gfc_current_ns)
10226     return !sym->attr.function;
10227
10228   proc = sym->ns->proc_name;
10229   if (sym->attr.dummy && gfc_pure (proc)
10230         && ((proc->attr.subroutine && sym->attr.intent == INTENT_IN)
10231                 ||
10232              proc->attr.function))
10233     return 1;
10234
10235   /* TODO: Sort out what can be storage associated, if anything, and include
10236      it here.  In principle equivalences should be scanned but it does not
10237      seem to be possible to storage associate an impure variable this way.  */
10238   return 0;
10239 }
10240
10241
10242 /* Test whether a symbol is pure or not.  For a NULL pointer, checks the
10243    symbol of the current procedure.  */
10244
10245 int
10246 gfc_pure (gfc_symbol *sym)
10247 {
10248   symbol_attribute attr;
10249
10250   if (sym == NULL)
10251     sym = gfc_current_ns->proc_name;
10252   if (sym == NULL)
10253     return 0;
10254
10255   attr = sym->attr;
10256
10257   return attr.flavor == FL_PROCEDURE && (attr.pure || attr.elemental);
10258 }
10259
10260
10261 /* Test whether the current procedure is elemental or not.  */
10262
10263 int
10264 gfc_elemental (gfc_symbol *sym)
10265 {
10266   symbol_attribute attr;
10267
10268   if (sym == NULL)
10269     sym = gfc_current_ns->proc_name;
10270   if (sym == NULL)
10271     return 0;
10272   attr = sym->attr;
10273
10274   return attr.flavor == FL_PROCEDURE && attr.elemental;
10275 }
10276
10277
10278 /* Warn about unused labels.  */
10279
10280 static void
10281 warn_unused_fortran_label (gfc_st_label *label)
10282 {
10283   if (label == NULL)
10284     return;
10285
10286   warn_unused_fortran_label (label->left);
10287
10288   if (label->defined == ST_LABEL_UNKNOWN)
10289     return;
10290
10291   switch (label->referenced)
10292     {
10293     case ST_LABEL_UNKNOWN:
10294       gfc_warning ("Label %d at %L defined but not used", label->value,
10295                    &label->where);
10296       break;
10297
10298     case ST_LABEL_BAD_TARGET:
10299       gfc_warning ("Label %d at %L defined but cannot be used",
10300                    label->value, &label->where);
10301       break;
10302
10303     default:
10304       break;
10305     }
10306
10307   warn_unused_fortran_label (label->right);
10308 }
10309
10310
10311 /* Returns the sequence type of a symbol or sequence.  */
10312
10313 static seq_type
10314 sequence_type (gfc_typespec ts)
10315 {
10316   seq_type result;
10317   gfc_component *c;
10318
10319   switch (ts.type)
10320   {
10321     case BT_DERIVED:
10322
10323       if (ts.derived->components == NULL)
10324         return SEQ_NONDEFAULT;
10325
10326       result = sequence_type (ts.derived->components->ts);
10327       for (c = ts.derived->components->next; c; c = c->next)
10328         if (sequence_type (c->ts) != result)
10329           return SEQ_MIXED;
10330
10331       return result;
10332
10333     case BT_CHARACTER:
10334       if (ts.kind != gfc_default_character_kind)
10335           return SEQ_NONDEFAULT;
10336
10337       return SEQ_CHARACTER;
10338
10339     case BT_INTEGER:
10340       if (ts.kind != gfc_default_integer_kind)
10341           return SEQ_NONDEFAULT;
10342
10343       return SEQ_NUMERIC;
10344
10345     case BT_REAL:
10346       if (!(ts.kind == gfc_default_real_kind
10347             || ts.kind == gfc_default_double_kind))
10348           return SEQ_NONDEFAULT;
10349
10350       return SEQ_NUMERIC;
10351
10352     case BT_COMPLEX:
10353       if (ts.kind != gfc_default_complex_kind)
10354           return SEQ_NONDEFAULT;
10355
10356       return SEQ_NUMERIC;
10357
10358     case BT_LOGICAL:
10359       if (ts.kind != gfc_default_logical_kind)
10360           return SEQ_NONDEFAULT;
10361
10362       return SEQ_NUMERIC;
10363
10364     default:
10365       return SEQ_NONDEFAULT;
10366   }
10367 }
10368
10369
10370 /* Resolve derived type EQUIVALENCE object.  */
10371
10372 static gfc_try
10373 resolve_equivalence_derived (gfc_symbol *derived, gfc_symbol *sym, gfc_expr *e)
10374 {
10375   gfc_symbol *d;
10376   gfc_component *c = derived->components;
10377
10378   if (!derived)
10379     return SUCCESS;
10380
10381   /* Shall not be an object of nonsequence derived type.  */
10382   if (!derived->attr.sequence)
10383     {
10384       gfc_error ("Derived type variable '%s' at %L must have SEQUENCE "
10385                  "attribute to be an EQUIVALENCE object", sym->name,
10386                  &e->where);
10387       return FAILURE;
10388     }
10389
10390   /* Shall not have allocatable components.  */
10391   if (derived->attr.alloc_comp)
10392     {
10393       gfc_error ("Derived type variable '%s' at %L cannot have ALLOCATABLE "
10394                  "components to be an EQUIVALENCE object",sym->name,
10395                  &e->where);
10396       return FAILURE;
10397     }
10398
10399   if (sym->attr.in_common && has_default_initializer (sym->ts.derived))
10400     {
10401       gfc_error ("Derived type variable '%s' at %L with default "
10402                  "initialization cannot be in EQUIVALENCE with a variable "
10403                  "in COMMON", sym->name, &e->where);
10404       return FAILURE;
10405     }
10406
10407   for (; c ; c = c->next)
10408     {
10409       d = c->ts.derived;
10410       if (d
10411           && (resolve_equivalence_derived (c->ts.derived, sym, e) == FAILURE))
10412         return FAILURE;
10413
10414       /* Shall not be an object of sequence derived type containing a pointer
10415          in the structure.  */
10416       if (c->attr.pointer)
10417         {
10418           gfc_error ("Derived type variable '%s' at %L with pointer "
10419                      "component(s) cannot be an EQUIVALENCE object",
10420                      sym->name, &e->where);
10421           return FAILURE;
10422         }
10423     }
10424   return SUCCESS;
10425 }
10426
10427
10428 /* Resolve equivalence object. 
10429    An EQUIVALENCE object shall not be a dummy argument, a pointer, a target,
10430    an allocatable array, an object of nonsequence derived type, an object of
10431    sequence derived type containing a pointer at any level of component
10432    selection, an automatic object, a function name, an entry name, a result
10433    name, a named constant, a structure component, or a subobject of any of
10434    the preceding objects.  A substring shall not have length zero.  A
10435    derived type shall not have components with default initialization nor
10436    shall two objects of an equivalence group be initialized.
10437    Either all or none of the objects shall have an protected attribute.
10438    The simple constraints are done in symbol.c(check_conflict) and the rest
10439    are implemented here.  */
10440
10441 static void
10442 resolve_equivalence (gfc_equiv *eq)
10443 {
10444   gfc_symbol *sym;
10445   gfc_symbol *derived;
10446   gfc_symbol *first_sym;
10447   gfc_expr *e;
10448   gfc_ref *r;
10449   locus *last_where = NULL;
10450   seq_type eq_type, last_eq_type;
10451   gfc_typespec *last_ts;
10452   int object, cnt_protected;
10453   const char *value_name;
10454   const char *msg;
10455
10456   value_name = NULL;
10457   last_ts = &eq->expr->symtree->n.sym->ts;
10458
10459   first_sym = eq->expr->symtree->n.sym;
10460
10461   cnt_protected = 0;
10462
10463   for (object = 1; eq; eq = eq->eq, object++)
10464     {
10465       e = eq->expr;
10466
10467       e->ts = e->symtree->n.sym->ts;
10468       /* match_varspec might not know yet if it is seeing
10469          array reference or substring reference, as it doesn't
10470          know the types.  */
10471       if (e->ref && e->ref->type == REF_ARRAY)
10472         {
10473           gfc_ref *ref = e->ref;
10474           sym = e->symtree->n.sym;
10475
10476           if (sym->attr.dimension)
10477             {
10478               ref->u.ar.as = sym->as;
10479               ref = ref->next;
10480             }
10481
10482           /* For substrings, convert REF_ARRAY into REF_SUBSTRING.  */
10483           if (e->ts.type == BT_CHARACTER
10484               && ref
10485               && ref->type == REF_ARRAY
10486               && ref->u.ar.dimen == 1
10487               && ref->u.ar.dimen_type[0] == DIMEN_RANGE
10488               && ref->u.ar.stride[0] == NULL)
10489             {
10490               gfc_expr *start = ref->u.ar.start[0];
10491               gfc_expr *end = ref->u.ar.end[0];
10492               void *mem = NULL;
10493
10494               /* Optimize away the (:) reference.  */
10495               if (start == NULL && end == NULL)
10496                 {
10497                   if (e->ref == ref)
10498                     e->ref = ref->next;
10499                   else
10500                     e->ref->next = ref->next;
10501                   mem = ref;
10502                 }
10503               else
10504                 {
10505                   ref->type = REF_SUBSTRING;
10506                   if (start == NULL)
10507                     start = gfc_int_expr (1);
10508                   ref->u.ss.start = start;
10509                   if (end == NULL && e->ts.cl)
10510                     end = gfc_copy_expr (e->ts.cl->length);
10511                   ref->u.ss.end = end;
10512                   ref->u.ss.length = e->ts.cl;
10513                   e->ts.cl = NULL;
10514                 }
10515               ref = ref->next;
10516               gfc_free (mem);
10517             }
10518
10519           /* Any further ref is an error.  */
10520           if (ref)
10521             {
10522               gcc_assert (ref->type == REF_ARRAY);
10523               gfc_error ("Syntax error in EQUIVALENCE statement at %L",
10524                          &ref->u.ar.where);
10525               continue;
10526             }
10527         }
10528
10529       if (gfc_resolve_expr (e) == FAILURE)
10530         continue;
10531
10532       sym = e->symtree->n.sym;
10533
10534       if (sym->attr.is_protected)
10535         cnt_protected++;
10536       if (cnt_protected > 0 && cnt_protected != object)
10537         {
10538               gfc_error ("Either all or none of the objects in the "
10539                          "EQUIVALENCE set at %L shall have the "
10540                          "PROTECTED attribute",
10541                          &e->where);
10542               break;
10543         }
10544
10545       /* Shall not equivalence common block variables in a PURE procedure.  */
10546       if (sym->ns->proc_name
10547           && sym->ns->proc_name->attr.pure
10548           && sym->attr.in_common)
10549         {
10550           gfc_error ("Common block member '%s' at %L cannot be an EQUIVALENCE "
10551                      "object in the pure procedure '%s'",
10552                      sym->name, &e->where, sym->ns->proc_name->name);
10553           break;
10554         }
10555
10556       /* Shall not be a named constant.  */
10557       if (e->expr_type == EXPR_CONSTANT)
10558         {
10559           gfc_error ("Named constant '%s' at %L cannot be an EQUIVALENCE "
10560                      "object", sym->name, &e->where);
10561           continue;
10562         }
10563
10564       derived = e->ts.derived;
10565       if (derived && resolve_equivalence_derived (derived, sym, e) == FAILURE)
10566         continue;
10567
10568       /* Check that the types correspond correctly:
10569          Note 5.28:
10570          A numeric sequence structure may be equivalenced to another sequence
10571          structure, an object of default integer type, default real type, double
10572          precision real type, default logical type such that components of the
10573          structure ultimately only become associated to objects of the same
10574          kind. A character sequence structure may be equivalenced to an object
10575          of default character kind or another character sequence structure.
10576          Other objects may be equivalenced only to objects of the same type and
10577          kind parameters.  */
10578
10579       /* Identical types are unconditionally OK.  */
10580       if (object == 1 || gfc_compare_types (last_ts, &sym->ts))
10581         goto identical_types;
10582
10583       last_eq_type = sequence_type (*last_ts);
10584       eq_type = sequence_type (sym->ts);
10585
10586       /* Since the pair of objects is not of the same type, mixed or
10587          non-default sequences can be rejected.  */
10588
10589       msg = "Sequence %s with mixed components in EQUIVALENCE "
10590             "statement at %L with different type objects";
10591       if ((object ==2
10592            && last_eq_type == SEQ_MIXED
10593            && gfc_notify_std (GFC_STD_GNU, msg, first_sym->name, last_where)
10594               == FAILURE)
10595           || (eq_type == SEQ_MIXED
10596               && gfc_notify_std (GFC_STD_GNU, msg, sym->name,
10597                                  &e->where) == FAILURE))
10598         continue;
10599
10600       msg = "Non-default type object or sequence %s in EQUIVALENCE "
10601             "statement at %L with objects of different type";
10602       if ((object ==2
10603            && last_eq_type == SEQ_NONDEFAULT
10604            && gfc_notify_std (GFC_STD_GNU, msg, first_sym->name,
10605                               last_where) == FAILURE)
10606           || (eq_type == SEQ_NONDEFAULT
10607               && gfc_notify_std (GFC_STD_GNU, msg, sym->name,
10608                                  &e->where) == FAILURE))
10609         continue;
10610
10611       msg ="Non-CHARACTER object '%s' in default CHARACTER "
10612            "EQUIVALENCE statement at %L";
10613       if (last_eq_type == SEQ_CHARACTER
10614           && eq_type != SEQ_CHARACTER
10615           && gfc_notify_std (GFC_STD_GNU, msg, sym->name,
10616                              &e->where) == FAILURE)
10617                 continue;
10618
10619       msg ="Non-NUMERIC object '%s' in default NUMERIC "
10620            "EQUIVALENCE statement at %L";
10621       if (last_eq_type == SEQ_NUMERIC
10622           && eq_type != SEQ_NUMERIC
10623           && gfc_notify_std (GFC_STD_GNU, msg, sym->name,
10624                              &e->where) == FAILURE)
10625                 continue;
10626
10627   identical_types:
10628       last_ts =&sym->ts;
10629       last_where = &e->where;
10630
10631       if (!e->ref)
10632         continue;
10633
10634       /* Shall not be an automatic array.  */
10635       if (e->ref->type == REF_ARRAY
10636           && gfc_resolve_array_spec (e->ref->u.ar.as, 1) == FAILURE)
10637         {
10638           gfc_error ("Array '%s' at %L with non-constant bounds cannot be "
10639                      "an EQUIVALENCE object", sym->name, &e->where);
10640           continue;
10641         }
10642
10643       r = e->ref;
10644       while (r)
10645         {
10646           /* Shall not be a structure component.  */
10647           if (r->type == REF_COMPONENT)
10648             {
10649               gfc_error ("Structure component '%s' at %L cannot be an "
10650                          "EQUIVALENCE object",
10651                          r->u.c.component->name, &e->where);
10652               break;
10653             }
10654
10655           /* A substring shall not have length zero.  */
10656           if (r->type == REF_SUBSTRING)
10657             {
10658               if (compare_bound (r->u.ss.start, r->u.ss.end) == CMP_GT)
10659                 {
10660                   gfc_error ("Substring at %L has length zero",
10661                              &r->u.ss.start->where);
10662                   break;
10663                 }
10664             }
10665           r = r->next;
10666         }
10667     }
10668 }
10669
10670
10671 /* Resolve function and ENTRY types, issue diagnostics if needed.  */
10672
10673 static void
10674 resolve_fntype (gfc_namespace *ns)
10675 {
10676   gfc_entry_list *el;
10677   gfc_symbol *sym;
10678
10679   if (ns->proc_name == NULL || !ns->proc_name->attr.function)
10680     return;
10681
10682   /* If there are any entries, ns->proc_name is the entry master
10683      synthetic symbol and ns->entries->sym actual FUNCTION symbol.  */
10684   if (ns->entries)
10685     sym = ns->entries->sym;
10686   else
10687     sym = ns->proc_name;
10688   if (sym->result == sym
10689       && sym->ts.type == BT_UNKNOWN
10690       && gfc_set_default_type (sym, 0, NULL) == FAILURE
10691       && !sym->attr.untyped)
10692     {
10693       gfc_error ("Function '%s' at %L has no IMPLICIT type",
10694                  sym->name, &sym->declared_at);
10695       sym->attr.untyped = 1;
10696     }
10697
10698   if (sym->ts.type == BT_DERIVED && !sym->ts.derived->attr.use_assoc
10699       && !sym->attr.contained
10700       && !gfc_check_access (sym->ts.derived->attr.access,
10701                             sym->ts.derived->ns->default_access)
10702       && gfc_check_access (sym->attr.access, sym->ns->default_access))
10703     {
10704       gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PUBLIC function '%s' at "
10705                       "%L of PRIVATE type '%s'", sym->name,
10706                       &sym->declared_at, sym->ts.derived->name);
10707     }
10708
10709     if (ns->entries)
10710     for (el = ns->entries->next; el; el = el->next)
10711       {
10712         if (el->sym->result == el->sym
10713             && el->sym->ts.type == BT_UNKNOWN
10714             && gfc_set_default_type (el->sym, 0, NULL) == FAILURE
10715             && !el->sym->attr.untyped)
10716           {
10717             gfc_error ("ENTRY '%s' at %L has no IMPLICIT type",
10718                        el->sym->name, &el->sym->declared_at);
10719             el->sym->attr.untyped = 1;
10720           }
10721       }
10722 }
10723
10724 /* 12.3.2.1.1 Defined operators.  */
10725
10726 static void
10727 gfc_resolve_uops (gfc_symtree *symtree)
10728 {
10729   gfc_interface *itr;
10730   gfc_symbol *sym;
10731   gfc_formal_arglist *formal;
10732
10733   if (symtree == NULL)
10734     return;
10735
10736   gfc_resolve_uops (symtree->left);
10737   gfc_resolve_uops (symtree->right);
10738
10739   for (itr = symtree->n.uop->op; itr; itr = itr->next)
10740     {
10741       sym = itr->sym;
10742       if (!sym->attr.function)
10743         gfc_error ("User operator procedure '%s' at %L must be a FUNCTION",
10744                    sym->name, &sym->declared_at);
10745
10746       if (sym->ts.type == BT_CHARACTER
10747           && !(sym->ts.cl && sym->ts.cl->length)
10748           && !(sym->result && sym->result->ts.cl
10749                && sym->result->ts.cl->length))
10750         gfc_error ("User operator procedure '%s' at %L cannot be assumed "
10751                    "character length", sym->name, &sym->declared_at);
10752
10753       formal = sym->formal;
10754       if (!formal || !formal->sym)
10755         {
10756           gfc_error ("User operator procedure '%s' at %L must have at least "
10757                      "one argument", sym->name, &sym->declared_at);
10758           continue;
10759         }
10760
10761       if (formal->sym->attr.intent != INTENT_IN)
10762         gfc_error ("First argument of operator interface at %L must be "
10763                    "INTENT(IN)", &sym->declared_at);
10764
10765       if (formal->sym->attr.optional)
10766         gfc_error ("First argument of operator interface at %L cannot be "
10767                    "optional", &sym->declared_at);
10768
10769       formal = formal->next;
10770       if (!formal || !formal->sym)
10771         continue;
10772
10773       if (formal->sym->attr.intent != INTENT_IN)
10774         gfc_error ("Second argument of operator interface at %L must be "
10775                    "INTENT(IN)", &sym->declared_at);
10776
10777       if (formal->sym->attr.optional)
10778         gfc_error ("Second argument of operator interface at %L cannot be "
10779                    "optional", &sym->declared_at);
10780
10781       if (formal->next)
10782         gfc_error ("Operator interface at %L must have, at most, two "
10783                    "arguments", &sym->declared_at);
10784     }
10785 }
10786
10787
10788 /* Examine all of the expressions associated with a program unit,
10789    assign types to all intermediate expressions, make sure that all
10790    assignments are to compatible types and figure out which names
10791    refer to which functions or subroutines.  It doesn't check code
10792    block, which is handled by resolve_code.  */
10793
10794 static void
10795 resolve_types (gfc_namespace *ns)
10796 {
10797   gfc_namespace *n;
10798   gfc_charlen *cl;
10799   gfc_data *d;
10800   gfc_equiv *eq;
10801   gfc_namespace* old_ns = gfc_current_ns;
10802
10803   /* Check that all IMPLICIT types are ok.  */
10804   if (!ns->seen_implicit_none)
10805     {
10806       unsigned letter;
10807       for (letter = 0; letter != GFC_LETTERS; ++letter)
10808         if (ns->set_flag[letter]
10809             && resolve_typespec_used (&ns->default_type[letter],
10810                                       &ns->implicit_loc[letter],
10811                                       NULL) == FAILURE)
10812           return;
10813     }
10814
10815   gfc_current_ns = ns;
10816
10817   resolve_entries (ns);
10818
10819   resolve_common_vars (ns->blank_common.head, false);
10820   resolve_common_blocks (ns->common_root);
10821
10822   resolve_contained_functions (ns);
10823
10824   gfc_traverse_ns (ns, resolve_bind_c_derived_types);
10825
10826   for (cl = ns->cl_list; cl; cl = cl->next)
10827     resolve_charlen (cl);
10828
10829   gfc_traverse_ns (ns, resolve_symbol);
10830
10831   resolve_fntype (ns);
10832
10833   for (n = ns->contained; n; n = n->sibling)
10834     {
10835       if (gfc_pure (ns->proc_name) && !gfc_pure (n->proc_name))
10836         gfc_error ("Contained procedure '%s' at %L of a PURE procedure must "
10837                    "also be PURE", n->proc_name->name,
10838                    &n->proc_name->declared_at);
10839
10840       resolve_types (n);
10841     }
10842
10843   forall_flag = 0;
10844   gfc_check_interfaces (ns);
10845
10846   gfc_traverse_ns (ns, resolve_values);
10847
10848   if (ns->save_all)
10849     gfc_save_all (ns);
10850
10851   iter_stack = NULL;
10852   for (d = ns->data; d; d = d->next)
10853     resolve_data (d);
10854
10855   iter_stack = NULL;
10856   gfc_traverse_ns (ns, gfc_formalize_init_value);
10857
10858   gfc_traverse_ns (ns, gfc_verify_binding_labels);
10859
10860   if (ns->common_root != NULL)
10861     gfc_traverse_symtree (ns->common_root, resolve_bind_c_comms);
10862
10863   for (eq = ns->equiv; eq; eq = eq->next)
10864     resolve_equivalence (eq);
10865
10866   /* Warn about unused labels.  */
10867   if (warn_unused_label)
10868     warn_unused_fortran_label (ns->st_labels);
10869
10870   gfc_resolve_uops (ns->uop_root);
10871
10872   gfc_current_ns = old_ns;
10873 }
10874
10875
10876 /* Call resolve_code recursively.  */
10877
10878 static void
10879 resolve_codes (gfc_namespace *ns)
10880 {
10881   gfc_namespace *n;
10882   bitmap_obstack old_obstack;
10883
10884   for (n = ns->contained; n; n = n->sibling)
10885     resolve_codes (n);
10886
10887   gfc_current_ns = ns;
10888   cs_base = NULL;
10889   /* Set to an out of range value.  */
10890   current_entry_id = -1;
10891
10892   old_obstack = labels_obstack;
10893   bitmap_obstack_initialize (&labels_obstack);
10894
10895   resolve_code (ns->code, ns);
10896
10897   bitmap_obstack_release (&labels_obstack);
10898   labels_obstack = old_obstack;
10899 }
10900
10901
10902 /* This function is called after a complete program unit has been compiled.
10903    Its purpose is to examine all of the expressions associated with a program
10904    unit, assign types to all intermediate expressions, make sure that all
10905    assignments are to compatible types and figure out which names refer to
10906    which functions or subroutines.  */
10907
10908 void
10909 gfc_resolve (gfc_namespace *ns)
10910 {
10911   gfc_namespace *old_ns;
10912
10913   if (ns->resolved)
10914     return;
10915
10916   old_ns = gfc_current_ns;
10917
10918   resolve_types (ns);
10919   resolve_codes (ns);
10920
10921   gfc_current_ns = old_ns;
10922   ns->resolved = 1;
10923 }