OSDN Git Service

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