OSDN Git Service

* src/x86/win32.S (_ffi_closure_STDCALL): New function.
[pf3gnuchains/gcc-fork.git] / gcc / fortran / resolve.c
1 /* Perform type resolution on the various structures.
2    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3    Free Software Foundation, Inc.
4    Contributed by Andy Vaught
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "flags.h"
25 #include "gfortran.h"
26 #include "obstack.h"
27 #include "bitmap.h"
28 #include "arith.h"  /* For gfc_compare_expr().  */
29 #include "dependency.h"
30 #include "data.h"
31 #include "target-memory.h" /* for gfc_simplify_transfer */
32
33 /* Types used in equivalence statements.  */
34
35 typedef enum seq_type
36 {
37   SEQ_NONDEFAULT, SEQ_NUMERIC, SEQ_CHARACTER, SEQ_MIXED
38 }
39 seq_type;
40
41 /* Stack to keep track of the nesting of blocks as we move through the
42    code.  See resolve_branch() and resolve_code().  */
43
44 typedef struct code_stack
45 {
46   struct gfc_code *head, *current;
47   struct code_stack *prev;
48
49   /* This bitmap keeps track of the targets valid for a branch from
50      inside this block except for END {IF|SELECT}s of enclosing
51      blocks.  */
52   bitmap reachable_labels;
53 }
54 code_stack;
55
56 static code_stack *cs_base = NULL;
57
58
59 /* Nonzero if we're inside a FORALL block.  */
60
61 static int forall_flag;
62
63 /* Nonzero if we're inside a OpenMP WORKSHARE or PARALLEL WORKSHARE block.  */
64
65 static int omp_workshare_flag;
66
67 /* Nonzero if we are processing a formal arglist. The corresponding function
68    resets the flag each time that it is read.  */
69 static int formal_arg_flag = 0;
70
71 /* True if we are resolving a specification expression.  */
72 static int specification_expr = 0;
73
74 /* The id of the last entry seen.  */
75 static int current_entry_id;
76
77 /* We use bitmaps to determine if a branch target is valid.  */
78 static bitmap_obstack labels_obstack;
79
80 int
81 gfc_is_formal_arg (void)
82 {
83   return formal_arg_flag;
84 }
85
86 /* Is the symbol host associated?  */
87 static bool
88 is_sym_host_assoc (gfc_symbol *sym, gfc_namespace *ns)
89 {
90   for (ns = ns->parent; ns; ns = ns->parent)
91     {      
92       if (sym->ns == ns)
93         return true;
94     }
95
96   return false;
97 }
98
99 /* Ensure a typespec used is valid; for instance, TYPE(t) is invalid if t is
100    an ABSTRACT derived-type.  If where is not NULL, an error message with that
101    locus is printed, optionally using name.  */
102
103 static gfc_try
104 resolve_typespec_used (gfc_typespec* ts, locus* where, const char* name)
105 {
106   if (ts->type == BT_DERIVED && ts->derived->attr.abstract)
107     {
108       if (where)
109         {
110           if (name)
111             gfc_error ("'%s' at %L is of the ABSTRACT type '%s'",
112                        name, where, ts->derived->name);
113           else
114             gfc_error ("ABSTRACT type '%s' used at %L",
115                        ts->derived->name, where);
116         }
117
118       return FAILURE;
119     }
120
121   return SUCCESS;
122 }
123
124
125 /* Resolve types of formal argument lists.  These have to be done early so that
126    the formal argument lists of module procedures can be copied to the
127    containing module before the individual procedures are resolved
128    individually.  We also resolve argument lists of procedures in interface
129    blocks because they are self-contained scoping units.
130
131    Since a dummy argument cannot be a non-dummy procedure, the only
132    resort left for untyped names are the IMPLICIT types.  */
133
134 static void
135 resolve_formal_arglist (gfc_symbol *proc)
136 {
137   gfc_formal_arglist *f;
138   gfc_symbol *sym;
139   int i;
140
141   if (proc->result != NULL)
142     sym = proc->result;
143   else
144     sym = proc;
145
146   if (gfc_elemental (proc)
147       || sym->attr.pointer || sym->attr.allocatable
148       || (sym->as && sym->as->rank > 0))
149     {
150       proc->attr.always_explicit = 1;
151       sym->attr.always_explicit = 1;
152     }
153
154   formal_arg_flag = 1;
155
156   for (f = proc->formal; f; f = f->next)
157     {
158       sym = f->sym;
159
160       if (sym == NULL)
161         {
162           /* Alternate return placeholder.  */
163           if (gfc_elemental (proc))
164             gfc_error ("Alternate return specifier in elemental subroutine "
165                        "'%s' at %L is not allowed", proc->name,
166                        &proc->declared_at);
167           if (proc->attr.function)
168             gfc_error ("Alternate return specifier in function "
169                        "'%s' at %L is not allowed", proc->name,
170                        &proc->declared_at);
171           continue;
172         }
173
174       if (sym->attr.if_source != IFSRC_UNKNOWN)
175         resolve_formal_arglist (sym);
176
177       if (sym->attr.subroutine || sym->attr.external || sym->attr.intrinsic)
178         {
179           if (gfc_pure (proc) && !gfc_pure (sym))
180             {
181               gfc_error ("Dummy procedure '%s' of PURE procedure at %L must "
182                          "also be PURE", sym->name, &sym->declared_at);
183               continue;
184             }
185
186           if (gfc_elemental (proc))
187             {
188               gfc_error ("Dummy procedure at %L not allowed in ELEMENTAL "
189                          "procedure", &sym->declared_at);
190               continue;
191             }
192
193           if (sym->attr.function
194                 && sym->ts.type == BT_UNKNOWN
195                 && sym->attr.intrinsic)
196             {
197               gfc_intrinsic_sym *isym;
198               isym = gfc_find_function (sym->name);
199               if (isym == NULL || !isym->specific)
200                 {
201                   gfc_error ("Unable to find a specific INTRINSIC procedure "
202                              "for the reference '%s' at %L", sym->name,
203                              &sym->declared_at);
204                 }
205               sym->ts = isym->ts;
206             }
207
208           continue;
209         }
210
211       if (sym->ts.type == BT_UNKNOWN)
212         {
213           if (!sym->attr.function || sym->result == sym)
214             gfc_set_default_type (sym, 1, sym->ns);
215         }
216
217       gfc_resolve_array_spec (sym->as, 0);
218
219       /* We can't tell if an array with dimension (:) is assumed or deferred
220          shape until we know if it has the pointer or allocatable attributes.
221       */
222       if (sym->as && sym->as->rank > 0 && sym->as->type == AS_DEFERRED
223           && !(sym->attr.pointer || sym->attr.allocatable))
224         {
225           sym->as->type = AS_ASSUMED_SHAPE;
226           for (i = 0; i < sym->as->rank; i++)
227             sym->as->lower[i] = gfc_int_expr (1);
228         }
229
230       if ((sym->as && sym->as->rank > 0 && sym->as->type == AS_ASSUMED_SHAPE)
231           || sym->attr.pointer || sym->attr.allocatable || sym->attr.target
232           || sym->attr.optional)
233         {
234           proc->attr.always_explicit = 1;
235           if (proc->result)
236             proc->result->attr.always_explicit = 1;
237         }
238
239       /* If the flavor is unknown at this point, it has to be a variable.
240          A procedure specification would have already set the type.  */
241
242       if (sym->attr.flavor == FL_UNKNOWN)
243         gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, &sym->declared_at);
244
245       if (gfc_pure (proc) && !sym->attr.pointer
246           && sym->attr.flavor != FL_PROCEDURE)
247         {
248           if (proc->attr.function && sym->attr.intent != INTENT_IN)
249             gfc_error ("Argument '%s' of pure function '%s' at %L must be "
250                        "INTENT(IN)", sym->name, proc->name,
251                        &sym->declared_at);
252
253           if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN)
254             gfc_error ("Argument '%s' of pure subroutine '%s' at %L must "
255                        "have its INTENT specified", sym->name, proc->name,
256                        &sym->declared_at);
257         }
258
259       if (gfc_elemental (proc))
260         {
261           if (sym->as != NULL)
262             {
263               gfc_error ("Argument '%s' of elemental procedure at %L must "
264                          "be scalar", sym->name, &sym->declared_at);
265               continue;
266             }
267
268           if (sym->attr.pointer)
269             {
270               gfc_error ("Argument '%s' of elemental procedure at %L cannot "
271                          "have the POINTER attribute", sym->name,
272                          &sym->declared_at);
273               continue;
274             }
275
276           if (sym->attr.flavor == FL_PROCEDURE)
277             {
278               gfc_error ("Dummy procedure '%s' not allowed in elemental "
279                          "procedure '%s' at %L", sym->name, proc->name,
280                          &sym->declared_at);
281               continue;
282             }
283         }
284
285       /* Each dummy shall be specified to be scalar.  */
286       if (proc->attr.proc == PROC_ST_FUNCTION)
287         {
288           if (sym->as != NULL)
289             {
290               gfc_error ("Argument '%s' of statement function at %L must "
291                          "be scalar", sym->name, &sym->declared_at);
292               continue;
293             }
294
295           if (sym->ts.type == BT_CHARACTER)
296             {
297               gfc_charlen *cl = sym->ts.cl;
298               if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
299                 {
300                   gfc_error ("Character-valued argument '%s' of statement "
301                              "function at %L must have constant length",
302                              sym->name, &sym->declared_at);
303                   continue;
304                 }
305             }
306         }
307     }
308   formal_arg_flag = 0;
309 }
310
311
312 /* Work function called when searching for symbols that have argument lists
313    associated with them.  */
314
315 static void
316 find_arglists (gfc_symbol *sym)
317 {
318   if (sym->attr.if_source == IFSRC_UNKNOWN || sym->ns != gfc_current_ns)
319     return;
320
321   resolve_formal_arglist (sym);
322 }
323
324
325 /* Given a namespace, resolve all formal argument lists within the namespace.
326  */
327
328 static void
329 resolve_formal_arglists (gfc_namespace *ns)
330 {
331   if (ns == NULL)
332     return;
333
334   gfc_traverse_ns (ns, find_arglists);
335 }
336
337
338 static void
339 resolve_contained_fntype (gfc_symbol *sym, gfc_namespace *ns)
340 {
341   gfc_try t;
342
343   /* If this namespace is not a function or an entry master function,
344      ignore it.  */
345   if (! sym || !(sym->attr.function || sym->attr.flavor == FL_VARIABLE)
346       || sym->attr.entry_master)
347     return;
348
349   /* Try to find out of what the return type is.  */
350   if (sym->result->ts.type == BT_UNKNOWN)
351     {
352       t = gfc_set_default_type (sym->result, 0, ns);
353
354       if (t == FAILURE && !sym->result->attr.untyped)
355         {
356           if (sym->result == sym)
357             gfc_error ("Contained function '%s' at %L has no IMPLICIT type",
358                        sym->name, &sym->declared_at);
359           else if (!sym->result->attr.proc_pointer)
360             gfc_error ("Result '%s' of contained function '%s' at %L has "
361                        "no IMPLICIT type", sym->result->name, sym->name,
362                        &sym->result->declared_at);
363           sym->result->attr.untyped = 1;
364         }
365     }
366
367   /* Fortran 95 Draft Standard, page 51, Section 5.1.1.5, on the Character 
368      type, lists the only ways a character length value of * can be used:
369      dummy arguments of procedures, named constants, and function results
370      in external functions.  Internal function results are not on that list;
371      ergo, not permitted.  */
372
373   if (sym->result->ts.type == BT_CHARACTER)
374     {
375       gfc_charlen *cl = sym->result->ts.cl;
376       if (!cl || !cl->length)
377         gfc_error ("Character-valued internal function '%s' at %L must "
378                    "not be assumed length", sym->name, &sym->declared_at);
379     }
380 }
381
382
383 /* Add NEW_ARGS to the formal argument list of PROC, taking care not to
384    introduce duplicates.  */
385
386 static void
387 merge_argument_lists (gfc_symbol *proc, gfc_formal_arglist *new_args)
388 {
389   gfc_formal_arglist *f, *new_arglist;
390   gfc_symbol *new_sym;
391
392   for (; new_args != NULL; new_args = new_args->next)
393     {
394       new_sym = new_args->sym;
395       /* See if this arg is already in the formal argument list.  */
396       for (f = proc->formal; f; f = f->next)
397         {
398           if (new_sym == f->sym)
399             break;
400         }
401
402       if (f)
403         continue;
404
405       /* Add a new argument.  Argument order is not important.  */
406       new_arglist = gfc_get_formal_arglist ();
407       new_arglist->sym = new_sym;
408       new_arglist->next = proc->formal;
409       proc->formal  = new_arglist;
410     }
411 }
412
413
414 /* Flag the arguments that are not present in all entries.  */
415
416 static void
417 check_argument_lists (gfc_symbol *proc, gfc_formal_arglist *new_args)
418 {
419   gfc_formal_arglist *f, *head;
420   head = new_args;
421
422   for (f = proc->formal; f; f = f->next)
423     {
424       if (f->sym == NULL)
425         continue;
426
427       for (new_args = head; new_args; new_args = new_args->next)
428         {
429           if (new_args->sym == f->sym)
430             break;
431         }
432
433       if (new_args)
434         continue;
435
436       f->sym->attr.not_always_present = 1;
437     }
438 }
439
440
441 /* Resolve alternate entry points.  If a symbol has multiple entry points we
442    create a new master symbol for the main routine, and turn the existing
443    symbol into an entry point.  */
444
445 static void
446 resolve_entries (gfc_namespace *ns)
447 {
448   gfc_namespace *old_ns;
449   gfc_code *c;
450   gfc_symbol *proc;
451   gfc_entry_list *el;
452   char name[GFC_MAX_SYMBOL_LEN + 1];
453   static int master_count = 0;
454
455   if (ns->proc_name == NULL)
456     return;
457
458   /* No need to do anything if this procedure doesn't have alternate entry
459      points.  */
460   if (!ns->entries)
461     return;
462
463   /* We may already have resolved alternate entry points.  */
464   if (ns->proc_name->attr.entry_master)
465     return;
466
467   /* If this isn't a procedure something has gone horribly wrong.  */
468   gcc_assert (ns->proc_name->attr.flavor == FL_PROCEDURE);
469
470   /* Remember the current namespace.  */
471   old_ns = gfc_current_ns;
472
473   gfc_current_ns = ns;
474
475   /* Add the main entry point to the list of entry points.  */
476   el = gfc_get_entry_list ();
477   el->sym = ns->proc_name;
478   el->id = 0;
479   el->next = ns->entries;
480   ns->entries = el;
481   ns->proc_name->attr.entry = 1;
482
483   /* If it is a module function, it needs to be in the right namespace
484      so that gfc_get_fake_result_decl can gather up the results. The
485      need for this arose in get_proc_name, where these beasts were
486      left in their own namespace, to keep prior references linked to
487      the entry declaration.*/
488   if (ns->proc_name->attr.function
489       && ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
490     el->sym->ns = ns;
491
492   /* Do the same for entries where the master is not a module
493      procedure.  These are retained in the module namespace because
494      of the module procedure declaration.  */
495   for (el = el->next; el; el = el->next)
496     if (el->sym->ns->proc_name->attr.flavor == FL_MODULE
497           && el->sym->attr.mod_proc)
498       el->sym->ns = ns;
499   el = ns->entries;
500
501   /* Add an entry statement for it.  */
502   c = gfc_get_code ();
503   c->op = EXEC_ENTRY;
504   c->ext.entry = el;
505   c->next = ns->code;
506   ns->code = c;
507
508   /* Create a new symbol for the master function.  */
509   /* Give the internal function a unique name (within this file).
510      Also include the function name so the user has some hope of figuring
511      out what is going on.  */
512   snprintf (name, GFC_MAX_SYMBOL_LEN, "master.%d.%s",
513             master_count++, ns->proc_name->name);
514   gfc_get_ha_symbol (name, &proc);
515   gcc_assert (proc != NULL);
516
517   gfc_add_procedure (&proc->attr, PROC_INTERNAL, proc->name, NULL);
518   if (ns->proc_name->attr.subroutine)
519     gfc_add_subroutine (&proc->attr, proc->name, NULL);
520   else
521     {
522       gfc_symbol *sym;
523       gfc_typespec *ts, *fts;
524       gfc_array_spec *as, *fas;
525       gfc_add_function (&proc->attr, proc->name, NULL);
526       proc->result = proc;
527       fas = ns->entries->sym->as;
528       fas = fas ? fas : ns->entries->sym->result->as;
529       fts = &ns->entries->sym->result->ts;
530       if (fts->type == BT_UNKNOWN)
531         fts = gfc_get_default_type (ns->entries->sym->result->name, NULL);
532       for (el = ns->entries->next; el; el = el->next)
533         {
534           ts = &el->sym->result->ts;
535           as = el->sym->as;
536           as = as ? as : el->sym->result->as;
537           if (ts->type == BT_UNKNOWN)
538             ts = gfc_get_default_type (el->sym->result->name, NULL);
539
540           if (! gfc_compare_types (ts, fts)
541               || (el->sym->result->attr.dimension
542                   != ns->entries->sym->result->attr.dimension)
543               || (el->sym->result->attr.pointer
544                   != ns->entries->sym->result->attr.pointer))
545             break;
546           else if (as && fas && ns->entries->sym->result != el->sym->result
547                       && gfc_compare_array_spec (as, fas) == 0)
548             gfc_error ("Function %s at %L has entries with mismatched "
549                        "array specifications", ns->entries->sym->name,
550                        &ns->entries->sym->declared_at);
551           /* The characteristics need to match and thus both need to have
552              the same string length, i.e. both len=*, or both len=4.
553              Having both len=<variable> is also possible, but difficult to
554              check at compile time.  */
555           else if (ts->type == BT_CHARACTER && ts->cl && fts->cl
556                    && (((ts->cl->length && !fts->cl->length)
557                         ||(!ts->cl->length && fts->cl->length))
558                        || (ts->cl->length
559                            && ts->cl->length->expr_type
560                               != fts->cl->length->expr_type)
561                        || (ts->cl->length
562                            && ts->cl->length->expr_type == EXPR_CONSTANT
563                            && mpz_cmp (ts->cl->length->value.integer,
564                                        fts->cl->length->value.integer) != 0)))
565             gfc_notify_std (GFC_STD_GNU, "Extension: Function %s at %L with "
566                             "entries returning variables of different "
567                             "string lengths", ns->entries->sym->name,
568                             &ns->entries->sym->declared_at);
569         }
570
571       if (el == NULL)
572         {
573           sym = ns->entries->sym->result;
574           /* All result types the same.  */
575           proc->ts = *fts;
576           if (sym->attr.dimension)
577             gfc_set_array_spec (proc, gfc_copy_array_spec (sym->as), NULL);
578           if (sym->attr.pointer)
579             gfc_add_pointer (&proc->attr, NULL);
580         }
581       else
582         {
583           /* Otherwise the result will be passed through a union by
584              reference.  */
585           proc->attr.mixed_entry_master = 1;
586           for (el = ns->entries; el; el = el->next)
587             {
588               sym = el->sym->result;
589               if (sym->attr.dimension)
590                 {
591                   if (el == ns->entries)
592                     gfc_error ("FUNCTION result %s can't be an array in "
593                                "FUNCTION %s at %L", sym->name,
594                                ns->entries->sym->name, &sym->declared_at);
595                   else
596                     gfc_error ("ENTRY result %s can't be an array in "
597                                "FUNCTION %s at %L", sym->name,
598                                ns->entries->sym->name, &sym->declared_at);
599                 }
600               else if (sym->attr.pointer)
601                 {
602                   if (el == ns->entries)
603                     gfc_error ("FUNCTION result %s can't be a POINTER in "
604                                "FUNCTION %s at %L", sym->name,
605                                ns->entries->sym->name, &sym->declared_at);
606                   else
607                     gfc_error ("ENTRY result %s can't be a POINTER in "
608                                "FUNCTION %s at %L", sym->name,
609                                ns->entries->sym->name, &sym->declared_at);
610                 }
611               else
612                 {
613                   ts = &sym->ts;
614                   if (ts->type == BT_UNKNOWN)
615                     ts = gfc_get_default_type (sym->name, NULL);
616                   switch (ts->type)
617                     {
618                     case BT_INTEGER:
619                       if (ts->kind == gfc_default_integer_kind)
620                         sym = NULL;
621                       break;
622                     case BT_REAL:
623                       if (ts->kind == gfc_default_real_kind
624                           || ts->kind == gfc_default_double_kind)
625                         sym = NULL;
626                       break;
627                     case BT_COMPLEX:
628                       if (ts->kind == gfc_default_complex_kind)
629                         sym = NULL;
630                       break;
631                     case BT_LOGICAL:
632                       if (ts->kind == gfc_default_logical_kind)
633                         sym = NULL;
634                       break;
635                     case BT_UNKNOWN:
636                       /* We will issue error elsewhere.  */
637                       sym = NULL;
638                       break;
639                     default:
640                       break;
641                     }
642                   if (sym)
643                     {
644                       if (el == ns->entries)
645                         gfc_error ("FUNCTION result %s can't be of type %s "
646                                    "in FUNCTION %s at %L", sym->name,
647                                    gfc_typename (ts), ns->entries->sym->name,
648                                    &sym->declared_at);
649                       else
650                         gfc_error ("ENTRY result %s can't be of type %s "
651                                    "in FUNCTION %s at %L", sym->name,
652                                    gfc_typename (ts), ns->entries->sym->name,
653                                    &sym->declared_at);
654                     }
655                 }
656             }
657         }
658     }
659   proc->attr.access = ACCESS_PRIVATE;
660   proc->attr.entry_master = 1;
661
662   /* Merge all the entry point arguments.  */
663   for (el = ns->entries; el; el = el->next)
664     merge_argument_lists (proc, el->sym->formal);
665
666   /* Check the master formal arguments for any that are not
667      present in all entry points.  */
668   for (el = ns->entries; el; el = el->next)
669     check_argument_lists (proc, el->sym->formal);
670
671   /* Use the master function for the function body.  */
672   ns->proc_name = proc;
673
674   /* Finalize the new symbols.  */
675   gfc_commit_symbols ();
676
677   /* Restore the original namespace.  */
678   gfc_current_ns = old_ns;
679 }
680
681
682 static bool
683 has_default_initializer (gfc_symbol *der)
684 {
685   gfc_component *c;
686
687   gcc_assert (der->attr.flavor == FL_DERIVED);
688   for (c = der->components; c; c = c->next)
689     if ((c->ts.type != BT_DERIVED && c->initializer)
690         || (c->ts.type == BT_DERIVED
691             && (!c->attr.pointer && has_default_initializer (c->ts.derived))))
692       break;
693
694   return c != NULL;
695 }
696
697 /* Resolve common variables.  */
698 static void
699 resolve_common_vars (gfc_symbol *sym, bool named_common)
700 {
701   gfc_symbol *csym = sym;
702
703   for (; csym; csym = csym->common_next)
704     {
705       if (csym->value || csym->attr.data)
706         {
707           if (!csym->ns->is_block_data)
708             gfc_notify_std (GFC_STD_GNU, "Variable '%s' at %L is in COMMON "
709                             "but only in BLOCK DATA initialization is "
710                             "allowed", csym->name, &csym->declared_at);
711           else if (!named_common)
712             gfc_notify_std (GFC_STD_GNU, "Initialized variable '%s' at %L is "
713                             "in a blank COMMON but initialization is only "
714                             "allowed in named common blocks", csym->name,
715                             &csym->declared_at);
716         }
717
718       if (csym->ts.type != BT_DERIVED)
719         continue;
720
721       if (!(csym->ts.derived->attr.sequence
722             || csym->ts.derived->attr.is_bind_c))
723         gfc_error_now ("Derived type variable '%s' in COMMON at %L "
724                        "has neither the SEQUENCE nor the BIND(C) "
725                        "attribute", csym->name, &csym->declared_at);
726       if (csym->ts.derived->attr.alloc_comp)
727         gfc_error_now ("Derived type variable '%s' in COMMON at %L "
728                        "has an ultimate component that is "
729                        "allocatable", csym->name, &csym->declared_at);
730       if (has_default_initializer (csym->ts.derived))
731         gfc_error_now ("Derived type variable '%s' in COMMON at %L "
732                        "may not have default initializer", csym->name,
733                        &csym->declared_at);
734
735       if (csym->attr.flavor == FL_UNKNOWN && !csym->attr.proc_pointer)
736         gfc_add_flavor (&csym->attr, FL_VARIABLE, csym->name, &csym->declared_at);
737     }
738 }
739
740 /* Resolve common blocks.  */
741 static void
742 resolve_common_blocks (gfc_symtree *common_root)
743 {
744   gfc_symbol *sym;
745
746   if (common_root == NULL)
747     return;
748
749   if (common_root->left)
750     resolve_common_blocks (common_root->left);
751   if (common_root->right)
752     resolve_common_blocks (common_root->right);
753
754   resolve_common_vars (common_root->n.common->head, true);
755
756   gfc_find_symbol (common_root->name, gfc_current_ns, 0, &sym);
757   if (sym == NULL)
758     return;
759
760   if (sym->attr.flavor == FL_PARAMETER)
761     gfc_error ("COMMON block '%s' at %L is used as PARAMETER at %L",
762                sym->name, &common_root->n.common->where, &sym->declared_at);
763
764   if (sym->attr.intrinsic)
765     gfc_error ("COMMON block '%s' at %L is also an intrinsic procedure",
766                sym->name, &common_root->n.common->where);
767   else if (sym->attr.result
768            ||(sym->attr.function && gfc_current_ns->proc_name == sym))
769     gfc_notify_std (GFC_STD_F2003, "Fortran 2003: COMMON block '%s' at %L "
770                     "that is also a function result", sym->name,
771                     &common_root->n.common->where);
772   else if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_INTERNAL
773            && sym->attr.proc != PROC_ST_FUNCTION)
774     gfc_notify_std (GFC_STD_F2003, "Fortran 2003: COMMON block '%s' at %L "
775                     "that is also a global procedure", sym->name,
776                     &common_root->n.common->where);
777 }
778
779
780 /* Resolve contained function types.  Because contained functions can call one
781    another, they have to be worked out before any of the contained procedures
782    can be resolved.
783
784    The good news is that if a function doesn't already have a type, the only
785    way it can get one is through an IMPLICIT type or a RESULT variable, because
786    by definition contained functions are contained namespace they're contained
787    in, not in a sibling or parent namespace.  */
788
789 static void
790 resolve_contained_functions (gfc_namespace *ns)
791 {
792   gfc_namespace *child;
793   gfc_entry_list *el;
794
795   resolve_formal_arglists (ns);
796
797   for (child = ns->contained; child; child = child->sibling)
798     {
799       /* Resolve alternate entry points first.  */
800       resolve_entries (child);
801
802       /* Then check function return types.  */
803       resolve_contained_fntype (child->proc_name, child);
804       for (el = child->entries; el; el = el->next)
805         resolve_contained_fntype (el->sym, child);
806     }
807 }
808
809
810 /* Resolve all of the elements of a structure constructor and make sure that
811    the types are correct.  */
812
813 static gfc_try
814 resolve_structure_cons (gfc_expr *expr)
815 {
816   gfc_constructor *cons;
817   gfc_component *comp;
818   gfc_try t;
819   symbol_attribute a;
820
821   t = SUCCESS;
822   cons = expr->value.constructor;
823   /* A constructor may have references if it is the result of substituting a
824      parameter variable.  In this case we just pull out the component we
825      want.  */
826   if (expr->ref)
827     comp = expr->ref->u.c.sym->components;
828   else
829     comp = expr->ts.derived->components;
830
831   /* See if the user is trying to invoke a structure constructor for one of
832      the iso_c_binding derived types.  */
833   if (expr->ts.derived && expr->ts.derived->ts.is_iso_c && cons
834       && cons->expr != NULL)
835     {
836       gfc_error ("Components of structure constructor '%s' at %L are PRIVATE",
837                  expr->ts.derived->name, &(expr->where));
838       return FAILURE;
839     }
840
841   for (; comp; comp = comp->next, cons = cons->next)
842     {
843       int rank;
844
845       if (!cons->expr)
846         continue;
847
848       if (gfc_resolve_expr (cons->expr) == FAILURE)
849         {
850           t = FAILURE;
851           continue;
852         }
853
854       rank = comp->as ? comp->as->rank : 0;
855       if (cons->expr->expr_type != EXPR_NULL && rank != cons->expr->rank
856           && (comp->attr.allocatable || cons->expr->rank))
857         {
858           gfc_error ("The rank of the element in the derived type "
859                      "constructor at %L does not match that of the "
860                      "component (%d/%d)", &cons->expr->where,
861                      cons->expr->rank, rank);
862           t = FAILURE;
863         }
864
865       /* If we don't have the right type, try to convert it.  */
866
867       if (!gfc_compare_types (&cons->expr->ts, &comp->ts))
868         {
869           t = FAILURE;
870           if (comp->attr.pointer && cons->expr->ts.type != BT_UNKNOWN)
871             gfc_error ("The element in the derived type constructor at %L, "
872                        "for pointer component '%s', is %s but should be %s",
873                        &cons->expr->where, comp->name,
874                        gfc_basic_typename (cons->expr->ts.type),
875                        gfc_basic_typename (comp->ts.type));
876           else
877             t = gfc_convert_type (cons->expr, &comp->ts, 1);
878         }
879
880       if (cons->expr->expr_type == EXPR_NULL
881           && !(comp->attr.pointer || comp->attr.allocatable
882                || comp->attr.proc_pointer))
883         {
884           t = FAILURE;
885           gfc_error ("The NULL in the derived type constructor at %L is "
886                      "being applied to component '%s', which is neither "
887                      "a POINTER nor ALLOCATABLE", &cons->expr->where,
888                      comp->name);
889         }
890
891       if (!comp->attr.pointer || cons->expr->expr_type == EXPR_NULL)
892         continue;
893
894       a = gfc_expr_attr (cons->expr);
895
896       if (!a.pointer && !a.target)
897         {
898           t = FAILURE;
899           gfc_error ("The element in the derived type constructor at %L, "
900                      "for pointer component '%s' should be a POINTER or "
901                      "a TARGET", &cons->expr->where, comp->name);
902         }
903     }
904
905   return t;
906 }
907
908
909 /****************** Expression name resolution ******************/
910
911 /* Returns 0 if a symbol was not declared with a type or
912    attribute declaration statement, nonzero otherwise.  */
913
914 static int
915 was_declared (gfc_symbol *sym)
916 {
917   symbol_attribute a;
918
919   a = sym->attr;
920
921   if (!a.implicit_type && sym->ts.type != BT_UNKNOWN)
922     return 1;
923
924   if (a.allocatable || a.dimension || a.dummy || a.external || a.intrinsic
925       || a.optional || a.pointer || a.save || a.target || a.volatile_
926       || a.value || a.access != ACCESS_UNKNOWN || a.intent != INTENT_UNKNOWN)
927     return 1;
928
929   return 0;
930 }
931
932
933 /* Determine if a symbol is generic or not.  */
934
935 static int
936 generic_sym (gfc_symbol *sym)
937 {
938   gfc_symbol *s;
939
940   if (sym->attr.generic ||
941       (sym->attr.intrinsic && gfc_generic_intrinsic (sym->name)))
942     return 1;
943
944   if (was_declared (sym) || sym->ns->parent == NULL)
945     return 0;
946
947   gfc_find_symbol (sym->name, sym->ns->parent, 1, &s);
948   
949   if (s != NULL)
950     {
951       if (s == sym)
952         return 0;
953       else
954         return generic_sym (s);
955     }
956
957   return 0;
958 }
959
960
961 /* Determine if a symbol is specific or not.  */
962
963 static int
964 specific_sym (gfc_symbol *sym)
965 {
966   gfc_symbol *s;
967
968   if (sym->attr.if_source == IFSRC_IFBODY
969       || sym->attr.proc == PROC_MODULE
970       || sym->attr.proc == PROC_INTERNAL
971       || sym->attr.proc == PROC_ST_FUNCTION
972       || (sym->attr.intrinsic && gfc_specific_intrinsic (sym->name))
973       || sym->attr.external)
974     return 1;
975
976   if (was_declared (sym) || sym->ns->parent == NULL)
977     return 0;
978
979   gfc_find_symbol (sym->name, sym->ns->parent, 1, &s);
980
981   return (s == NULL) ? 0 : specific_sym (s);
982 }
983
984
985 /* Figure out if the procedure is specific, generic or unknown.  */
986
987 typedef enum
988 { PTYPE_GENERIC = 1, PTYPE_SPECIFIC, PTYPE_UNKNOWN }
989 proc_type;
990
991 static proc_type
992 procedure_kind (gfc_symbol *sym)
993 {
994   if (generic_sym (sym))
995     return PTYPE_GENERIC;
996
997   if (specific_sym (sym))
998     return PTYPE_SPECIFIC;
999
1000   return PTYPE_UNKNOWN;
1001 }
1002
1003 /* Check references to assumed size arrays.  The flag need_full_assumed_size
1004    is nonzero when matching actual arguments.  */
1005
1006 static int need_full_assumed_size = 0;
1007
1008 static bool
1009 check_assumed_size_reference (gfc_symbol *sym, gfc_expr *e)
1010 {
1011   if (need_full_assumed_size || !(sym->as && sym->as->type == AS_ASSUMED_SIZE))
1012       return false;
1013
1014   /* FIXME: The comparison "e->ref->u.ar.type == AR_FULL" is wrong.
1015      What should it be?  */
1016   if ((e->ref->u.ar.end[e->ref->u.ar.as->rank - 1] == NULL)
1017           && (e->ref->u.ar.as->type == AS_ASSUMED_SIZE)
1018                && (e->ref->u.ar.type == AR_FULL))
1019     {
1020       gfc_error ("The upper bound in the last dimension must "
1021                  "appear in the reference to the assumed size "
1022                  "array '%s' at %L", sym->name, &e->where);
1023       return true;
1024     }
1025   return false;
1026 }
1027
1028
1029 /* Look for bad assumed size array references in argument expressions
1030   of elemental and array valued intrinsic procedures.  Since this is
1031   called from procedure resolution functions, it only recurses at
1032   operators.  */
1033
1034 static bool
1035 resolve_assumed_size_actual (gfc_expr *e)
1036 {
1037   if (e == NULL)
1038    return false;
1039
1040   switch (e->expr_type)
1041     {
1042     case EXPR_VARIABLE:
1043       if (e->symtree && check_assumed_size_reference (e->symtree->n.sym, e))
1044         return true;
1045       break;
1046
1047     case EXPR_OP:
1048       if (resolve_assumed_size_actual (e->value.op.op1)
1049           || resolve_assumed_size_actual (e->value.op.op2))
1050         return true;
1051       break;
1052
1053     default:
1054       break;
1055     }
1056   return false;
1057 }
1058
1059
1060 /* Check a generic procedure, passed as an actual argument, to see if
1061    there is a matching specific name.  If none, it is an error, and if
1062    more than one, the reference is ambiguous.  */
1063 static int
1064 count_specific_procs (gfc_expr *e)
1065 {
1066   int n;
1067   gfc_interface *p;
1068   gfc_symbol *sym;
1069         
1070   n = 0;
1071   sym = e->symtree->n.sym;
1072
1073   for (p = sym->generic; p; p = p->next)
1074     if (strcmp (sym->name, p->sym->name) == 0)
1075       {
1076         e->symtree = gfc_find_symtree (p->sym->ns->sym_root,
1077                                        sym->name);
1078         n++;
1079       }
1080
1081   if (n > 1)
1082     gfc_error ("'%s' at %L is ambiguous", e->symtree->n.sym->name,
1083                &e->where);
1084
1085   if (n == 0)
1086     gfc_error ("GENERIC procedure '%s' is not allowed as an actual "
1087                "argument at %L", sym->name, &e->where);
1088
1089   return n;
1090 }
1091
1092
1093 /* See if a call to sym could possibly be a not allowed RECURSION because of
1094    a missing RECURIVE declaration.  This means that either sym is the current
1095    context itself, or sym is the parent of a contained procedure calling its
1096    non-RECURSIVE containing procedure.
1097    This also works if sym is an ENTRY.  */
1098
1099 static bool
1100 is_illegal_recursion (gfc_symbol* sym, gfc_namespace* context)
1101 {
1102   gfc_symbol* proc_sym;
1103   gfc_symbol* context_proc;
1104
1105   gcc_assert (sym->attr.flavor == FL_PROCEDURE);
1106
1107   /* If we've got an ENTRY, find real procedure.  */
1108   if (sym->attr.entry && sym->ns->entries)
1109     proc_sym = sym->ns->entries->sym;
1110   else
1111     proc_sym = sym;
1112
1113   /* If sym is RECURSIVE, all is well of course.  */
1114   if (proc_sym->attr.recursive || gfc_option.flag_recursive)
1115     return false;
1116
1117   /* Find the context procdure's "real" symbol if it has entries.  */
1118   context_proc = (context->entries ? context->entries->sym
1119                                    : context->proc_name);
1120   if (!context_proc)
1121     return true;
1122
1123   /* A call from sym's body to itself is recursion, of course.  */
1124   if (context_proc == proc_sym)
1125     return true;
1126
1127   /* The same is true if context is a contained procedure and sym the
1128      containing one.  */
1129   if (context_proc->attr.contained)
1130     {
1131       gfc_symbol* parent_proc;
1132
1133       gcc_assert (context->parent);
1134       parent_proc = (context->parent->entries ? context->parent->entries->sym
1135                                               : context->parent->proc_name);
1136
1137       if (parent_proc == proc_sym)
1138         return true;
1139     }
1140
1141   return false;
1142 }
1143
1144
1145 /* Resolve an intrinsic procedure: Set its function/subroutine attribute,
1146    its typespec and formal argument list.  */
1147
1148 static gfc_try
1149 resolve_intrinsic (gfc_symbol *sym, locus *loc)
1150 {
1151   gfc_intrinsic_sym *isym = gfc_find_function (sym->name);
1152   if (isym)
1153     {
1154       if (!sym->attr.function &&
1155           gfc_add_function (&sym->attr, sym->name, loc) == FAILURE)
1156         return FAILURE;
1157       sym->ts = isym->ts;
1158     }
1159   else
1160     {
1161       isym = gfc_find_subroutine (sym->name);
1162       gcc_assert (isym);
1163       if (!sym->attr.subroutine &&
1164           gfc_add_subroutine (&sym->attr, sym->name, loc) == FAILURE)
1165         return FAILURE;
1166     }
1167   if (!sym->formal)
1168     gfc_copy_formal_args_intr (sym, isym);
1169   return SUCCESS;
1170 }
1171
1172
1173 /* Resolve a procedure expression, like passing it to a called procedure or as
1174    RHS for a procedure pointer assignment.  */
1175
1176 static gfc_try
1177 resolve_procedure_expression (gfc_expr* expr)
1178 {
1179   gfc_symbol* sym;
1180
1181   if (expr->expr_type != EXPR_VARIABLE)
1182     return SUCCESS;
1183   gcc_assert (expr->symtree);
1184
1185   sym = expr->symtree->n.sym;
1186
1187   if (sym->attr.intrinsic)
1188     resolve_intrinsic (sym, &expr->where);
1189
1190   if (sym->attr.flavor != FL_PROCEDURE
1191       || (sym->attr.function && sym->result == sym))
1192     return SUCCESS;
1193
1194   /* A non-RECURSIVE procedure that is used as procedure expression within its
1195      own body is in danger of being called recursively.  */
1196   if (is_illegal_recursion (sym, gfc_current_ns))
1197     gfc_warning ("Non-RECURSIVE procedure '%s' at %L is possibly calling"
1198                  " itself recursively.  Declare it RECURSIVE or use"
1199                  " -frecursive", sym->name, &expr->where);
1200   
1201   return SUCCESS;
1202 }
1203
1204
1205 /* Resolve an actual argument list.  Most of the time, this is just
1206    resolving the expressions in the list.
1207    The exception is that we sometimes have to decide whether arguments
1208    that look like procedure arguments are really simple variable
1209    references.  */
1210
1211 static gfc_try
1212 resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype,
1213                         bool no_formal_args)
1214 {
1215   gfc_symbol *sym;
1216   gfc_symtree *parent_st;
1217   gfc_expr *e;
1218   int save_need_full_assumed_size;
1219   gfc_component *comp;
1220         
1221   for (; arg; arg = arg->next)
1222     {
1223       e = arg->expr;
1224       if (e == NULL)
1225         {
1226           /* Check the label is a valid branching target.  */
1227           if (arg->label)
1228             {
1229               if (arg->label->defined == ST_LABEL_UNKNOWN)
1230                 {
1231                   gfc_error ("Label %d referenced at %L is never defined",
1232                              arg->label->value, &arg->label->where);
1233                   return FAILURE;
1234                 }
1235             }
1236           continue;
1237         }
1238
1239       if (is_proc_ptr_comp (e, &comp))
1240         {
1241           e->ts = comp->ts;
1242           e->expr_type = EXPR_VARIABLE;
1243           goto argument_list;
1244         }
1245
1246       if (e->expr_type == EXPR_VARIABLE
1247             && e->symtree->n.sym->attr.generic
1248             && no_formal_args
1249             && count_specific_procs (e) != 1)
1250         return FAILURE;
1251
1252       if (e->ts.type != BT_PROCEDURE)
1253         {
1254           save_need_full_assumed_size = need_full_assumed_size;
1255           if (e->expr_type != EXPR_VARIABLE)
1256             need_full_assumed_size = 0;
1257           if (gfc_resolve_expr (e) != SUCCESS)
1258             return FAILURE;
1259           need_full_assumed_size = save_need_full_assumed_size;
1260           goto argument_list;
1261         }
1262
1263       /* See if the expression node should really be a variable reference.  */
1264
1265       sym = e->symtree->n.sym;
1266
1267       if (sym->attr.flavor == FL_PROCEDURE
1268           || sym->attr.intrinsic
1269           || sym->attr.external)
1270         {
1271           int actual_ok;
1272
1273           /* If a procedure is not already determined to be something else
1274              check if it is intrinsic.  */
1275           if (!sym->attr.intrinsic
1276               && !(sym->attr.external || sym->attr.use_assoc
1277                    || sym->attr.if_source == IFSRC_IFBODY)
1278               && gfc_is_intrinsic (sym, sym->attr.subroutine, e->where))
1279             sym->attr.intrinsic = 1;
1280
1281           if (sym->attr.proc == PROC_ST_FUNCTION)
1282             {
1283               gfc_error ("Statement function '%s' at %L is not allowed as an "
1284                          "actual argument", sym->name, &e->where);
1285             }
1286
1287           actual_ok = gfc_intrinsic_actual_ok (sym->name,
1288                                                sym->attr.subroutine);
1289           if (sym->attr.intrinsic && actual_ok == 0)
1290             {
1291               gfc_error ("Intrinsic '%s' at %L is not allowed as an "
1292                          "actual argument", sym->name, &e->where);
1293             }
1294
1295           if (sym->attr.contained && !sym->attr.use_assoc
1296               && sym->ns->proc_name->attr.flavor != FL_MODULE)
1297             {
1298               gfc_error ("Internal procedure '%s' is not allowed as an "
1299                          "actual argument at %L", sym->name, &e->where);
1300             }
1301
1302           if (sym->attr.elemental && !sym->attr.intrinsic)
1303             {
1304               gfc_error ("ELEMENTAL non-INTRINSIC procedure '%s' is not "
1305                          "allowed as an actual argument at %L", sym->name,
1306                          &e->where);
1307             }
1308
1309           /* Check if a generic interface has a specific procedure
1310             with the same name before emitting an error.  */
1311           if (sym->attr.generic && count_specific_procs (e) != 1)
1312             return FAILURE;
1313           
1314           /* Just in case a specific was found for the expression.  */
1315           sym = e->symtree->n.sym;
1316
1317           /* If the symbol is the function that names the current (or
1318              parent) scope, then we really have a variable reference.  */
1319
1320           if (sym->attr.function && sym->result == sym
1321               && (sym->ns->proc_name == sym
1322                   || (sym->ns->parent != NULL
1323                       && sym->ns->parent->proc_name == sym)))
1324             goto got_variable;
1325
1326           /* If all else fails, see if we have a specific intrinsic.  */
1327           if (sym->ts.type == BT_UNKNOWN && sym->attr.intrinsic)
1328             {
1329               gfc_intrinsic_sym *isym;
1330
1331               isym = gfc_find_function (sym->name);
1332               if (isym == NULL || !isym->specific)
1333                 {
1334                   gfc_error ("Unable to find a specific INTRINSIC procedure "
1335                              "for the reference '%s' at %L", sym->name,
1336                              &e->where);
1337                   return FAILURE;
1338                 }
1339               sym->ts = isym->ts;
1340               sym->attr.intrinsic = 1;
1341               sym->attr.function = 1;
1342             }
1343
1344           if (gfc_resolve_expr (e) == FAILURE)
1345             return FAILURE;
1346           goto argument_list;
1347         }
1348
1349       /* See if the name is a module procedure in a parent unit.  */
1350
1351       if (was_declared (sym) || sym->ns->parent == NULL)
1352         goto got_variable;
1353
1354       if (gfc_find_sym_tree (sym->name, sym->ns->parent, 1, &parent_st))
1355         {
1356           gfc_error ("Symbol '%s' at %L is ambiguous", sym->name, &e->where);
1357           return FAILURE;
1358         }
1359
1360       if (parent_st == NULL)
1361         goto got_variable;
1362
1363       sym = parent_st->n.sym;
1364       e->symtree = parent_st;           /* Point to the right thing.  */
1365
1366       if (sym->attr.flavor == FL_PROCEDURE
1367           || sym->attr.intrinsic
1368           || sym->attr.external)
1369         {
1370           if (gfc_resolve_expr (e) == FAILURE)
1371             return FAILURE;
1372           goto argument_list;
1373         }
1374
1375     got_variable:
1376       e->expr_type = EXPR_VARIABLE;
1377       e->ts = sym->ts;
1378       if (sym->as != NULL)
1379         {
1380           e->rank = sym->as->rank;
1381           e->ref = gfc_get_ref ();
1382           e->ref->type = REF_ARRAY;
1383           e->ref->u.ar.type = AR_FULL;
1384           e->ref->u.ar.as = sym->as;
1385         }
1386
1387       /* Expressions are assigned a default ts.type of BT_PROCEDURE in
1388          primary.c (match_actual_arg). If above code determines that it
1389          is a  variable instead, it needs to be resolved as it was not
1390          done at the beginning of this function.  */
1391       save_need_full_assumed_size = need_full_assumed_size;
1392       if (e->expr_type != EXPR_VARIABLE)
1393         need_full_assumed_size = 0;
1394       if (gfc_resolve_expr (e) != SUCCESS)
1395         return FAILURE;
1396       need_full_assumed_size = save_need_full_assumed_size;
1397
1398     argument_list:
1399       /* Check argument list functions %VAL, %LOC and %REF.  There is
1400          nothing to do for %REF.  */
1401       if (arg->name && arg->name[0] == '%')
1402         {
1403           if (strncmp ("%VAL", arg->name, 4) == 0)
1404             {
1405               if (e->ts.type == BT_CHARACTER || e->ts.type == BT_DERIVED)
1406                 {
1407                   gfc_error ("By-value argument at %L is not of numeric "
1408                              "type", &e->where);
1409                   return FAILURE;
1410                 }
1411
1412               if (e->rank)
1413                 {
1414                   gfc_error ("By-value argument at %L cannot be an array or "
1415                              "an array section", &e->where);
1416                 return FAILURE;
1417                 }
1418
1419               /* Intrinsics are still PROC_UNKNOWN here.  However,
1420                  since same file external procedures are not resolvable
1421                  in gfortran, it is a good deal easier to leave them to
1422                  intrinsic.c.  */
1423               if (ptype != PROC_UNKNOWN
1424                   && ptype != PROC_DUMMY
1425                   && ptype != PROC_EXTERNAL
1426                   && ptype != PROC_MODULE)
1427                 {
1428                   gfc_error ("By-value argument at %L is not allowed "
1429                              "in this context", &e->where);
1430                   return FAILURE;
1431                 }
1432             }
1433
1434           /* Statement functions have already been excluded above.  */
1435           else if (strncmp ("%LOC", arg->name, 4) == 0
1436                    && e->ts.type == BT_PROCEDURE)
1437             {
1438               if (e->symtree->n.sym->attr.proc == PROC_INTERNAL)
1439                 {
1440                   gfc_error ("Passing internal procedure at %L by location "
1441                              "not allowed", &e->where);
1442                   return FAILURE;
1443                 }
1444             }
1445         }
1446     }
1447
1448   return SUCCESS;
1449 }
1450
1451
1452 /* Do the checks of the actual argument list that are specific to elemental
1453    procedures.  If called with c == NULL, we have a function, otherwise if
1454    expr == NULL, we have a subroutine.  */
1455
1456 static gfc_try
1457 resolve_elemental_actual (gfc_expr *expr, gfc_code *c)
1458 {
1459   gfc_actual_arglist *arg0;
1460   gfc_actual_arglist *arg;
1461   gfc_symbol *esym = NULL;
1462   gfc_intrinsic_sym *isym = NULL;
1463   gfc_expr *e = NULL;
1464   gfc_intrinsic_arg *iformal = NULL;
1465   gfc_formal_arglist *eformal = NULL;
1466   bool formal_optional = false;
1467   bool set_by_optional = false;
1468   int i;
1469   int rank = 0;
1470
1471   /* Is this an elemental procedure?  */
1472   if (expr && expr->value.function.actual != NULL)
1473     {
1474       if (expr->value.function.esym != NULL
1475           && expr->value.function.esym->attr.elemental)
1476         {
1477           arg0 = expr->value.function.actual;
1478           esym = expr->value.function.esym;
1479         }
1480       else if (expr->value.function.isym != NULL
1481                && expr->value.function.isym->elemental)
1482         {
1483           arg0 = expr->value.function.actual;
1484           isym = expr->value.function.isym;
1485         }
1486       else
1487         return SUCCESS;
1488     }
1489   else if (c && c->ext.actual != NULL)
1490     {
1491       arg0 = c->ext.actual;
1492       
1493       if (c->resolved_sym)
1494         esym = c->resolved_sym;
1495       else
1496         esym = c->symtree->n.sym;
1497       gcc_assert (esym);
1498
1499       if (!esym->attr.elemental)
1500         return SUCCESS;
1501     }
1502   else
1503     return SUCCESS;
1504
1505   /* The rank of an elemental is the rank of its array argument(s).  */
1506   for (arg = arg0; arg; arg = arg->next)
1507     {
1508       if (arg->expr != NULL && arg->expr->rank > 0)
1509         {
1510           rank = arg->expr->rank;
1511           if (arg->expr->expr_type == EXPR_VARIABLE
1512               && arg->expr->symtree->n.sym->attr.optional)
1513             set_by_optional = true;
1514
1515           /* Function specific; set the result rank and shape.  */
1516           if (expr)
1517             {
1518               expr->rank = rank;
1519               if (!expr->shape && arg->expr->shape)
1520                 {
1521                   expr->shape = gfc_get_shape (rank);
1522                   for (i = 0; i < rank; i++)
1523                     mpz_init_set (expr->shape[i], arg->expr->shape[i]);
1524                 }
1525             }
1526           break;
1527         }
1528     }
1529
1530   /* If it is an array, it shall not be supplied as an actual argument
1531      to an elemental procedure unless an array of the same rank is supplied
1532      as an actual argument corresponding to a nonoptional dummy argument of
1533      that elemental procedure(12.4.1.5).  */
1534   formal_optional = false;
1535   if (isym)
1536     iformal = isym->formal;
1537   else
1538     eformal = esym->formal;
1539
1540   for (arg = arg0; arg; arg = arg->next)
1541     {
1542       if (eformal)
1543         {
1544           if (eformal->sym && eformal->sym->attr.optional)
1545             formal_optional = true;
1546           eformal = eformal->next;
1547         }
1548       else if (isym && iformal)
1549         {
1550           if (iformal->optional)
1551             formal_optional = true;
1552           iformal = iformal->next;
1553         }
1554       else if (isym)
1555         formal_optional = true;
1556
1557       if (pedantic && arg->expr != NULL
1558           && arg->expr->expr_type == EXPR_VARIABLE
1559           && arg->expr->symtree->n.sym->attr.optional
1560           && formal_optional
1561           && arg->expr->rank
1562           && (set_by_optional || arg->expr->rank != rank)
1563           && !(isym && isym->id == GFC_ISYM_CONVERSION))
1564         {
1565           gfc_warning ("'%s' at %L is an array and OPTIONAL; IF IT IS "
1566                        "MISSING, it cannot be the actual argument of an "
1567                        "ELEMENTAL procedure unless there is a non-optional "
1568                        "argument with the same rank (12.4.1.5)",
1569                        arg->expr->symtree->n.sym->name, &arg->expr->where);
1570           return FAILURE;
1571         }
1572     }
1573
1574   for (arg = arg0; arg; arg = arg->next)
1575     {
1576       if (arg->expr == NULL || arg->expr->rank == 0)
1577         continue;
1578
1579       /* Being elemental, the last upper bound of an assumed size array
1580          argument must be present.  */
1581       if (resolve_assumed_size_actual (arg->expr))
1582         return FAILURE;
1583
1584       /* Elemental procedure's array actual arguments must conform.  */
1585       if (e != NULL)
1586         {
1587           if (gfc_check_conformance ("elemental procedure", arg->expr, e)
1588               == FAILURE)
1589             return FAILURE;
1590         }
1591       else
1592         e = arg->expr;
1593     }
1594
1595   /* INTENT(OUT) is only allowed for subroutines; if any actual argument
1596      is an array, the intent inout/out variable needs to be also an array.  */
1597   if (rank > 0 && esym && expr == NULL)
1598     for (eformal = esym->formal, arg = arg0; arg && eformal;
1599          arg = arg->next, eformal = eformal->next)
1600       if ((eformal->sym->attr.intent == INTENT_OUT
1601            || eformal->sym->attr.intent == INTENT_INOUT)
1602           && arg->expr && arg->expr->rank == 0)
1603         {
1604           gfc_error ("Actual argument at %L for INTENT(%s) dummy '%s' of "
1605                      "ELEMENTAL subroutine '%s' is a scalar, but another "
1606                      "actual argument is an array", &arg->expr->where,
1607                      (eformal->sym->attr.intent == INTENT_OUT) ? "OUT"
1608                      : "INOUT", eformal->sym->name, esym->name);
1609           return FAILURE;
1610         }
1611   return SUCCESS;
1612 }
1613
1614
1615 /* Go through each actual argument in ACTUAL and see if it can be
1616    implemented as an inlined, non-copying intrinsic.  FNSYM is the
1617    function being called, or NULL if not known.  */
1618
1619 static void
1620 find_noncopying_intrinsics (gfc_symbol *fnsym, gfc_actual_arglist *actual)
1621 {
1622   gfc_actual_arglist *ap;
1623   gfc_expr *expr;
1624
1625   for (ap = actual; ap; ap = ap->next)
1626     if (ap->expr
1627         && (expr = gfc_get_noncopying_intrinsic_argument (ap->expr))
1628         && !gfc_check_fncall_dependency (expr, INTENT_IN, fnsym, actual,
1629                                          NOT_ELEMENTAL))
1630       ap->expr->inline_noncopying_intrinsic = 1;
1631 }
1632
1633
1634 /* This function does the checking of references to global procedures
1635    as defined in sections 18.1 and 14.1, respectively, of the Fortran
1636    77 and 95 standards.  It checks for a gsymbol for the name, making
1637    one if it does not already exist.  If it already exists, then the
1638    reference being resolved must correspond to the type of gsymbol.
1639    Otherwise, the new symbol is equipped with the attributes of the
1640    reference.  The corresponding code that is called in creating
1641    global entities is parse.c.
1642
1643    In addition, for all but -std=legacy, the gsymbols are used to
1644    check the interfaces of external procedures from the same file.
1645    The namespace of the gsymbol is resolved and then, once this is
1646    done the interface is checked.  */
1647
1648 static void
1649 resolve_global_procedure (gfc_symbol *sym, locus *where,
1650                           gfc_actual_arglist **actual, int sub)
1651 {
1652   gfc_gsymbol * gsym;
1653   gfc_namespace *ns;
1654   enum gfc_symbol_type type;
1655
1656   type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
1657
1658   gsym = gfc_get_gsymbol (sym->name);
1659
1660   if ((gsym->type != GSYM_UNKNOWN && gsym->type != type))
1661     gfc_global_used (gsym, where);
1662
1663   if (gfc_option.flag_whole_file
1664         && gsym->type != GSYM_UNKNOWN
1665         && gsym->ns
1666         && gsym->ns->proc_name)
1667     {
1668       /* Make sure that translation for the gsymbol occurs before
1669          the procedure currently being resolved.  */
1670       ns = gsym->ns->resolved ? NULL : gfc_global_ns_list;
1671       for (; ns && ns != gsym->ns; ns = ns->sibling)
1672         {
1673           if (ns->sibling == gsym->ns)
1674             {
1675               ns->sibling = gsym->ns->sibling;
1676               gsym->ns->sibling = gfc_global_ns_list;
1677               gfc_global_ns_list = gsym->ns;
1678               break;
1679             }
1680         }
1681
1682       if (!gsym->ns->resolved)
1683         gfc_resolve (gsym->ns);
1684
1685       gfc_procedure_use (gsym->ns->proc_name, actual, where);
1686     }
1687
1688   if (gsym->type == GSYM_UNKNOWN)
1689     {
1690       gsym->type = type;
1691       gsym->where = *where;
1692     }
1693
1694   gsym->used = 1;
1695 }
1696
1697
1698 /************* Function resolution *************/
1699
1700 /* Resolve a function call known to be generic.
1701    Section 14.1.2.4.1.  */
1702
1703 static match
1704 resolve_generic_f0 (gfc_expr *expr, gfc_symbol *sym)
1705 {
1706   gfc_symbol *s;
1707
1708   if (sym->attr.generic)
1709     {
1710       s = gfc_search_interface (sym->generic, 0, &expr->value.function.actual);
1711       if (s != NULL)
1712         {
1713           expr->value.function.name = s->name;
1714           expr->value.function.esym = s;
1715
1716           if (s->ts.type != BT_UNKNOWN)
1717             expr->ts = s->ts;
1718           else if (s->result != NULL && s->result->ts.type != BT_UNKNOWN)
1719             expr->ts = s->result->ts;
1720
1721           if (s->as != NULL)
1722             expr->rank = s->as->rank;
1723           else if (s->result != NULL && s->result->as != NULL)
1724             expr->rank = s->result->as->rank;
1725
1726           gfc_set_sym_referenced (expr->value.function.esym);
1727
1728           return MATCH_YES;
1729         }
1730
1731       /* TODO: Need to search for elemental references in generic
1732          interface.  */
1733     }
1734
1735   if (sym->attr.intrinsic)
1736     return gfc_intrinsic_func_interface (expr, 0);
1737
1738   return MATCH_NO;
1739 }
1740
1741
1742 static gfc_try
1743 resolve_generic_f (gfc_expr *expr)
1744 {
1745   gfc_symbol *sym;
1746   match m;
1747
1748   sym = expr->symtree->n.sym;
1749
1750   for (;;)
1751     {
1752       m = resolve_generic_f0 (expr, sym);
1753       if (m == MATCH_YES)
1754         return SUCCESS;
1755       else if (m == MATCH_ERROR)
1756         return FAILURE;
1757
1758 generic:
1759       if (sym->ns->parent == NULL)
1760         break;
1761       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
1762
1763       if (sym == NULL)
1764         break;
1765       if (!generic_sym (sym))
1766         goto generic;
1767     }
1768
1769   /* Last ditch attempt.  See if the reference is to an intrinsic
1770      that possesses a matching interface.  14.1.2.4  */
1771   if (sym && !gfc_is_intrinsic (sym, 0, expr->where))
1772     {
1773       gfc_error ("There is no specific function for the generic '%s' at %L",
1774                  expr->symtree->n.sym->name, &expr->where);
1775       return FAILURE;
1776     }
1777
1778   m = gfc_intrinsic_func_interface (expr, 0);
1779   if (m == MATCH_YES)
1780     return SUCCESS;
1781   if (m == MATCH_NO)
1782     gfc_error ("Generic function '%s' at %L is not consistent with a "
1783                "specific intrinsic interface", expr->symtree->n.sym->name,
1784                &expr->where);
1785
1786   return FAILURE;
1787 }
1788
1789
1790 /* Resolve a function call known to be specific.  */
1791
1792 static match
1793 resolve_specific_f0 (gfc_symbol *sym, gfc_expr *expr)
1794 {
1795   match m;
1796
1797   if (sym->attr.external || sym->attr.if_source == IFSRC_IFBODY)
1798     {
1799       if (sym->attr.dummy)
1800         {
1801           sym->attr.proc = PROC_DUMMY;
1802           goto found;
1803         }
1804
1805       sym->attr.proc = PROC_EXTERNAL;
1806       goto found;
1807     }
1808
1809   if (sym->attr.proc == PROC_MODULE
1810       || sym->attr.proc == PROC_ST_FUNCTION
1811       || sym->attr.proc == PROC_INTERNAL)
1812     goto found;
1813
1814   if (sym->attr.intrinsic)
1815     {
1816       m = gfc_intrinsic_func_interface (expr, 1);
1817       if (m == MATCH_YES)
1818         return MATCH_YES;
1819       if (m == MATCH_NO)
1820         gfc_error ("Function '%s' at %L is INTRINSIC but is not compatible "
1821                    "with an intrinsic", sym->name, &expr->where);
1822
1823       return MATCH_ERROR;
1824     }
1825
1826   return MATCH_NO;
1827
1828 found:
1829   gfc_procedure_use (sym, &expr->value.function.actual, &expr->where);
1830
1831   expr->ts = sym->ts;
1832   expr->value.function.name = sym->name;
1833   expr->value.function.esym = sym;
1834   if (sym->as != NULL)
1835     expr->rank = sym->as->rank;
1836
1837   return MATCH_YES;
1838 }
1839
1840
1841 static gfc_try
1842 resolve_specific_f (gfc_expr *expr)
1843 {
1844   gfc_symbol *sym;
1845   match m;
1846
1847   sym = expr->symtree->n.sym;
1848
1849   for (;;)
1850     {
1851       m = resolve_specific_f0 (sym, expr);
1852       if (m == MATCH_YES)
1853         return SUCCESS;
1854       if (m == MATCH_ERROR)
1855         return FAILURE;
1856
1857       if (sym->ns->parent == NULL)
1858         break;
1859
1860       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
1861
1862       if (sym == NULL)
1863         break;
1864     }
1865
1866   gfc_error ("Unable to resolve the specific function '%s' at %L",
1867              expr->symtree->n.sym->name, &expr->where);
1868
1869   return SUCCESS;
1870 }
1871
1872
1873 /* Resolve a procedure call not known to be generic nor specific.  */
1874
1875 static gfc_try
1876 resolve_unknown_f (gfc_expr *expr)
1877 {
1878   gfc_symbol *sym;
1879   gfc_typespec *ts;
1880
1881   sym = expr->symtree->n.sym;
1882
1883   if (sym->attr.dummy)
1884     {
1885       sym->attr.proc = PROC_DUMMY;
1886       expr->value.function.name = sym->name;
1887       goto set_type;
1888     }
1889
1890   /* See if we have an intrinsic function reference.  */
1891
1892   if (gfc_is_intrinsic (sym, 0, expr->where))
1893     {
1894       if (gfc_intrinsic_func_interface (expr, 1) == MATCH_YES)
1895         return SUCCESS;
1896       return FAILURE;
1897     }
1898
1899   /* The reference is to an external name.  */
1900
1901   sym->attr.proc = PROC_EXTERNAL;
1902   expr->value.function.name = sym->name;
1903   expr->value.function.esym = expr->symtree->n.sym;
1904
1905   if (sym->as != NULL)
1906     expr->rank = sym->as->rank;
1907
1908   /* Type of the expression is either the type of the symbol or the
1909      default type of the symbol.  */
1910
1911 set_type:
1912   gfc_procedure_use (sym, &expr->value.function.actual, &expr->where);
1913
1914   if (sym->ts.type != BT_UNKNOWN)
1915     expr->ts = sym->ts;
1916   else
1917     {
1918       ts = gfc_get_default_type (sym->name, sym->ns);
1919
1920       if (ts->type == BT_UNKNOWN)
1921         {
1922           gfc_error ("Function '%s' at %L has no IMPLICIT type",
1923                      sym->name, &expr->where);
1924           return FAILURE;
1925         }
1926       else
1927         expr->ts = *ts;
1928     }
1929
1930   return SUCCESS;
1931 }
1932
1933
1934 /* Return true, if the symbol is an external procedure.  */
1935 static bool
1936 is_external_proc (gfc_symbol *sym)
1937 {
1938   if (!sym->attr.dummy && !sym->attr.contained
1939         && !(sym->attr.intrinsic
1940               || gfc_is_intrinsic (sym, sym->attr.subroutine, sym->declared_at))
1941         && sym->attr.proc != PROC_ST_FUNCTION
1942         && !sym->attr.use_assoc
1943         && sym->name)
1944     return true;
1945
1946   return false;
1947 }
1948
1949
1950 /* Figure out if a function reference is pure or not.  Also set the name
1951    of the function for a potential error message.  Return nonzero if the
1952    function is PURE, zero if not.  */
1953 static int
1954 pure_stmt_function (gfc_expr *, gfc_symbol *);
1955
1956 static int
1957 pure_function (gfc_expr *e, const char **name)
1958 {
1959   int pure;
1960
1961   *name = NULL;
1962
1963   if (e->symtree != NULL
1964         && e->symtree->n.sym != NULL
1965         && e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
1966     return pure_stmt_function (e, e->symtree->n.sym);
1967
1968   if (e->value.function.esym)
1969     {
1970       pure = gfc_pure (e->value.function.esym);
1971       *name = e->value.function.esym->name;
1972     }
1973   else if (e->value.function.isym)
1974     {
1975       pure = e->value.function.isym->pure
1976              || e->value.function.isym->elemental;
1977       *name = e->value.function.isym->name;
1978     }
1979   else
1980     {
1981       /* Implicit functions are not pure.  */
1982       pure = 0;
1983       *name = e->value.function.name;
1984     }
1985
1986   return pure;
1987 }
1988
1989
1990 static bool
1991 impure_stmt_fcn (gfc_expr *e, gfc_symbol *sym,
1992                  int *f ATTRIBUTE_UNUSED)
1993 {
1994   const char *name;
1995
1996   /* Don't bother recursing into other statement functions
1997      since they will be checked individually for purity.  */
1998   if (e->expr_type != EXPR_FUNCTION
1999         || !e->symtree
2000         || e->symtree->n.sym == sym
2001         || e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
2002     return false;
2003
2004   return pure_function (e, &name) ? false : true;
2005 }
2006
2007
2008 static int
2009 pure_stmt_function (gfc_expr *e, gfc_symbol *sym)
2010 {
2011   return gfc_traverse_expr (e, sym, impure_stmt_fcn, 0) ? 0 : 1;
2012 }
2013
2014
2015 static gfc_try
2016 is_scalar_expr_ptr (gfc_expr *expr)
2017 {
2018   gfc_try retval = SUCCESS;
2019   gfc_ref *ref;
2020   int start;
2021   int end;
2022
2023   /* See if we have a gfc_ref, which means we have a substring, array
2024      reference, or a component.  */
2025   if (expr->ref != NULL)
2026     {
2027       ref = expr->ref;
2028       while (ref->next != NULL)
2029         ref = ref->next;
2030
2031       switch (ref->type)
2032         {
2033         case REF_SUBSTRING:
2034           if (ref->u.ss.length != NULL 
2035               && ref->u.ss.length->length != NULL
2036               && ref->u.ss.start
2037               && ref->u.ss.start->expr_type == EXPR_CONSTANT 
2038               && ref->u.ss.end
2039               && ref->u.ss.end->expr_type == EXPR_CONSTANT)
2040             {
2041               start = (int) mpz_get_si (ref->u.ss.start->value.integer);
2042               end = (int) mpz_get_si (ref->u.ss.end->value.integer);
2043               if (end - start + 1 != 1)
2044                 retval = FAILURE;
2045             }
2046           else
2047             retval = FAILURE;
2048           break;
2049         case REF_ARRAY:
2050           if (ref->u.ar.type == AR_ELEMENT)
2051             retval = SUCCESS;
2052           else if (ref->u.ar.type == AR_FULL)
2053             {
2054               /* The user can give a full array if the array is of size 1.  */
2055               if (ref->u.ar.as != NULL
2056                   && ref->u.ar.as->rank == 1
2057                   && ref->u.ar.as->type == AS_EXPLICIT
2058                   && ref->u.ar.as->lower[0] != NULL
2059                   && ref->u.ar.as->lower[0]->expr_type == EXPR_CONSTANT
2060                   && ref->u.ar.as->upper[0] != NULL
2061                   && ref->u.ar.as->upper[0]->expr_type == EXPR_CONSTANT)
2062                 {
2063                   /* If we have a character string, we need to check if
2064                      its length is one.  */
2065                   if (expr->ts.type == BT_CHARACTER)
2066                     {
2067                       if (expr->ts.cl == NULL
2068                           || expr->ts.cl->length == NULL
2069                           || mpz_cmp_si (expr->ts.cl->length->value.integer, 1)
2070                           != 0)
2071                         retval = FAILURE;
2072                     }
2073                   else
2074                     {
2075                       /* We have constant lower and upper bounds.  If the
2076                          difference between is 1, it can be considered a
2077                          scalar.  */
2078                       start = (int) mpz_get_si
2079                                 (ref->u.ar.as->lower[0]->value.integer);
2080                       end = (int) mpz_get_si
2081                                 (ref->u.ar.as->upper[0]->value.integer);
2082                       if (end - start + 1 != 1)
2083                         retval = FAILURE;
2084                    }
2085                 }
2086               else
2087                 retval = FAILURE;
2088             }
2089           else
2090             retval = FAILURE;
2091           break;
2092         default:
2093           retval = SUCCESS;
2094           break;
2095         }
2096     }
2097   else if (expr->ts.type == BT_CHARACTER && expr->rank == 0)
2098     {
2099       /* Character string.  Make sure it's of length 1.  */
2100       if (expr->ts.cl == NULL
2101           || expr->ts.cl->length == NULL
2102           || mpz_cmp_si (expr->ts.cl->length->value.integer, 1) != 0)
2103         retval = FAILURE;
2104     }
2105   else if (expr->rank != 0)
2106     retval = FAILURE;
2107
2108   return retval;
2109 }
2110
2111
2112 /* Match one of the iso_c_binding functions (c_associated or c_loc)
2113    and, in the case of c_associated, set the binding label based on
2114    the arguments.  */
2115
2116 static gfc_try
2117 gfc_iso_c_func_interface (gfc_symbol *sym, gfc_actual_arglist *args,
2118                           gfc_symbol **new_sym)
2119 {
2120   char name[GFC_MAX_SYMBOL_LEN + 1];
2121   char binding_label[GFC_MAX_BINDING_LABEL_LEN + 1];
2122   int optional_arg = 0, is_pointer = 0;
2123   gfc_try retval = SUCCESS;
2124   gfc_symbol *args_sym;
2125   gfc_typespec *arg_ts;
2126
2127   if (args->expr->expr_type == EXPR_CONSTANT
2128       || args->expr->expr_type == EXPR_OP
2129       || args->expr->expr_type == EXPR_NULL)
2130     {
2131       gfc_error ("Argument to '%s' at %L is not a variable",
2132                  sym->name, &(args->expr->where));
2133       return FAILURE;
2134     }
2135
2136   args_sym = args->expr->symtree->n.sym;
2137
2138   /* The typespec for the actual arg should be that stored in the expr
2139      and not necessarily that of the expr symbol (args_sym), because
2140      the actual expression could be a part-ref of the expr symbol.  */
2141   arg_ts = &(args->expr->ts);
2142
2143   is_pointer = gfc_is_data_pointer (args->expr);
2144     
2145   if (sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)
2146     {
2147       /* If the user gave two args then they are providing something for
2148          the optional arg (the second cptr).  Therefore, set the name and
2149          binding label to the c_associated for two cptrs.  Otherwise,
2150          set c_associated to expect one cptr.  */
2151       if (args->next)
2152         {
2153           /* two args.  */
2154           sprintf (name, "%s_2", sym->name);
2155           sprintf (binding_label, "%s_2", sym->binding_label);
2156           optional_arg = 1;
2157         }
2158       else
2159         {
2160           /* one arg.  */
2161           sprintf (name, "%s_1", sym->name);
2162           sprintf (binding_label, "%s_1", sym->binding_label);
2163           optional_arg = 0;
2164         }
2165
2166       /* Get a new symbol for the version of c_associated that
2167          will get called.  */
2168       *new_sym = get_iso_c_sym (sym, name, binding_label, optional_arg);
2169     }
2170   else if (sym->intmod_sym_id == ISOCBINDING_LOC
2171            || sym->intmod_sym_id == ISOCBINDING_FUNLOC)
2172     {
2173       sprintf (name, "%s", sym->name);
2174       sprintf (binding_label, "%s", sym->binding_label);
2175
2176       /* Error check the call.  */
2177       if (args->next != NULL)
2178         {
2179           gfc_error_now ("More actual than formal arguments in '%s' "
2180                          "call at %L", name, &(args->expr->where));
2181           retval = FAILURE;
2182         }
2183       else if (sym->intmod_sym_id == ISOCBINDING_LOC)
2184         {
2185           /* Make sure we have either the target or pointer attribute.  */
2186           if (!args_sym->attr.target && !is_pointer)
2187             {
2188               gfc_error_now ("Parameter '%s' to '%s' at %L must be either "
2189                              "a TARGET or an associated pointer",
2190                              args_sym->name,
2191                              sym->name, &(args->expr->where));
2192               retval = FAILURE;
2193             }
2194
2195           /* See if we have interoperable type and type param.  */
2196           if (verify_c_interop (arg_ts) == SUCCESS
2197               || gfc_check_any_c_kind (arg_ts) == SUCCESS)
2198             {
2199               if (args_sym->attr.target == 1)
2200                 {
2201                   /* Case 1a, section 15.1.2.5, J3/04-007: variable that
2202                      has the target attribute and is interoperable.  */
2203                   /* Case 1b, section 15.1.2.5, J3/04-007: allocated
2204                      allocatable variable that has the TARGET attribute and
2205                      is not an array of zero size.  */
2206                   if (args_sym->attr.allocatable == 1)
2207                     {
2208                       if (args_sym->attr.dimension != 0 
2209                           && (args_sym->as && args_sym->as->rank == 0))
2210                         {
2211                           gfc_error_now ("Allocatable variable '%s' used as a "
2212                                          "parameter to '%s' at %L must not be "
2213                                          "an array of zero size",
2214                                          args_sym->name, sym->name,
2215                                          &(args->expr->where));
2216                           retval = FAILURE;
2217                         }
2218                     }
2219                   else
2220                     {
2221                       /* A non-allocatable target variable with C
2222                          interoperable type and type parameters must be
2223                          interoperable.  */
2224                       if (args_sym && args_sym->attr.dimension)
2225                         {
2226                           if (args_sym->as->type == AS_ASSUMED_SHAPE)
2227                             {
2228                               gfc_error ("Assumed-shape array '%s' at %L "
2229                                          "cannot be an argument to the "
2230                                          "procedure '%s' because "
2231                                          "it is not C interoperable",
2232                                          args_sym->name,
2233                                          &(args->expr->where), sym->name);
2234                               retval = FAILURE;
2235                             }
2236                           else if (args_sym->as->type == AS_DEFERRED)
2237                             {
2238                               gfc_error ("Deferred-shape array '%s' at %L "
2239                                          "cannot be an argument to the "
2240                                          "procedure '%s' because "
2241                                          "it is not C interoperable",
2242                                          args_sym->name,
2243                                          &(args->expr->where), sym->name);
2244                               retval = FAILURE;
2245                             }
2246                         }
2247                               
2248                       /* Make sure it's not a character string.  Arrays of
2249                          any type should be ok if the variable is of a C
2250                          interoperable type.  */
2251                       if (arg_ts->type == BT_CHARACTER)
2252                         if (arg_ts->cl != NULL
2253                             && (arg_ts->cl->length == NULL
2254                                 || arg_ts->cl->length->expr_type
2255                                    != EXPR_CONSTANT
2256                                 || mpz_cmp_si
2257                                     (arg_ts->cl->length->value.integer, 1)
2258                                    != 0)
2259                             && is_scalar_expr_ptr (args->expr) != SUCCESS)
2260                           {
2261                             gfc_error_now ("CHARACTER argument '%s' to '%s' "
2262                                            "at %L must have a length of 1",
2263                                            args_sym->name, sym->name,
2264                                            &(args->expr->where));
2265                             retval = FAILURE;
2266                           }
2267                     }
2268                 }
2269               else if (is_pointer
2270                        && is_scalar_expr_ptr (args->expr) != SUCCESS)
2271                 {
2272                   /* Case 1c, section 15.1.2.5, J3/04-007: an associated
2273                      scalar pointer.  */
2274                   gfc_error_now ("Argument '%s' to '%s' at %L must be an "
2275                                  "associated scalar POINTER", args_sym->name,
2276                                  sym->name, &(args->expr->where));
2277                   retval = FAILURE;
2278                 }
2279             }
2280           else
2281             {
2282               /* The parameter is not required to be C interoperable.  If it
2283                  is not C interoperable, it must be a nonpolymorphic scalar
2284                  with no length type parameters.  It still must have either
2285                  the pointer or target attribute, and it can be
2286                  allocatable (but must be allocated when c_loc is called).  */
2287               if (args->expr->rank != 0 
2288                   && is_scalar_expr_ptr (args->expr) != SUCCESS)
2289                 {
2290                   gfc_error_now ("Parameter '%s' to '%s' at %L must be a "
2291                                  "scalar", args_sym->name, sym->name,
2292                                  &(args->expr->where));
2293                   retval = FAILURE;
2294                 }
2295               else if (arg_ts->type == BT_CHARACTER 
2296                        && is_scalar_expr_ptr (args->expr) != SUCCESS)
2297                 {
2298                   gfc_error_now ("CHARACTER argument '%s' to '%s' at "
2299                                  "%L must have a length of 1",
2300                                  args_sym->name, sym->name,
2301                                  &(args->expr->where));
2302                   retval = FAILURE;
2303                 }
2304             }
2305         }
2306       else if (sym->intmod_sym_id == ISOCBINDING_FUNLOC)
2307         {
2308           if (args_sym->attr.flavor != FL_PROCEDURE)
2309             {
2310               /* TODO: Update this error message to allow for procedure
2311                  pointers once they are implemented.  */
2312               gfc_error_now ("Parameter '%s' to '%s' at %L must be a "
2313                              "procedure",
2314                              args_sym->name, sym->name,
2315                              &(args->expr->where));
2316               retval = FAILURE;
2317             }
2318           else if (args_sym->attr.is_bind_c != 1)
2319             {
2320               gfc_error_now ("Parameter '%s' to '%s' at %L must be "
2321                              "BIND(C)",
2322                              args_sym->name, sym->name,
2323                              &(args->expr->where));
2324               retval = FAILURE;
2325             }
2326         }
2327       
2328       /* for c_loc/c_funloc, the new symbol is the same as the old one */
2329       *new_sym = sym;
2330     }
2331   else
2332     {
2333       gfc_internal_error ("gfc_iso_c_func_interface(): Unhandled "
2334                           "iso_c_binding function: '%s'!\n", sym->name);
2335     }
2336
2337   return retval;
2338 }
2339
2340
2341 /* Resolve a function call, which means resolving the arguments, then figuring
2342    out which entity the name refers to.  */
2343 /* TODO: Check procedure arguments so that an INTENT(IN) isn't passed
2344    to INTENT(OUT) or INTENT(INOUT).  */
2345
2346 static gfc_try
2347 resolve_function (gfc_expr *expr)
2348 {
2349   gfc_actual_arglist *arg;
2350   gfc_symbol *sym;
2351   const char *name;
2352   gfc_try t;
2353   int temp;
2354   procedure_type p = PROC_INTRINSIC;
2355   bool no_formal_args;
2356
2357   sym = NULL;
2358   if (expr->symtree)
2359     sym = expr->symtree->n.sym;
2360
2361   if (sym && sym->attr.intrinsic
2362       && resolve_intrinsic (sym, &expr->where) == FAILURE)
2363     return FAILURE;
2364
2365   if (sym && (sym->attr.flavor == FL_VARIABLE || sym->attr.subroutine))
2366     {
2367       gfc_error ("'%s' at %L is not a function", sym->name, &expr->where);
2368       return FAILURE;
2369     }
2370
2371   if (sym && sym->attr.abstract)
2372     {
2373       gfc_error ("ABSTRACT INTERFACE '%s' must not be referenced at %L",
2374                  sym->name, &expr->where);
2375       return FAILURE;
2376     }
2377
2378   /* Switch off assumed size checking and do this again for certain kinds
2379      of procedure, once the procedure itself is resolved.  */
2380   need_full_assumed_size++;
2381
2382   if (expr->symtree && expr->symtree->n.sym)
2383     p = expr->symtree->n.sym->attr.proc;
2384
2385   no_formal_args = sym && is_external_proc (sym) && sym->formal == NULL;
2386   if (resolve_actual_arglist (expr->value.function.actual,
2387                               p, no_formal_args) == FAILURE)
2388       return FAILURE;
2389
2390   /* Need to setup the call to the correct c_associated, depending on
2391      the number of cptrs to user gives to compare.  */
2392   if (sym && sym->attr.is_iso_c == 1)
2393     {
2394       if (gfc_iso_c_func_interface (sym, expr->value.function.actual, &sym)
2395           == FAILURE)
2396         return FAILURE;
2397       
2398       /* Get the symtree for the new symbol (resolved func).
2399          the old one will be freed later, when it's no longer used.  */
2400       gfc_find_sym_tree (sym->name, sym->ns, 1, &(expr->symtree));
2401     }
2402   
2403   /* Resume assumed_size checking.  */
2404   need_full_assumed_size--;
2405
2406   /* If the procedure is external, check for usage.  */
2407   if (sym && is_external_proc (sym))
2408     resolve_global_procedure (sym, &expr->where,
2409                               &expr->value.function.actual, 0);
2410
2411   if (sym && sym->ts.type == BT_CHARACTER
2412       && sym->ts.cl
2413       && sym->ts.cl->length == NULL
2414       && !sym->attr.dummy
2415       && expr->value.function.esym == NULL
2416       && !sym->attr.contained)
2417     {
2418       /* Internal procedures are taken care of in resolve_contained_fntype.  */
2419       gfc_error ("Function '%s' is declared CHARACTER(*) and cannot "
2420                  "be used at %L since it is not a dummy argument",
2421                  sym->name, &expr->where);
2422       return FAILURE;
2423     }
2424
2425   /* See if function is already resolved.  */
2426
2427   if (expr->value.function.name != NULL)
2428     {
2429       if (expr->ts.type == BT_UNKNOWN)
2430         expr->ts = sym->ts;
2431       t = SUCCESS;
2432     }
2433   else
2434     {
2435       /* Apply the rules of section 14.1.2.  */
2436
2437       switch (procedure_kind (sym))
2438         {
2439         case PTYPE_GENERIC:
2440           t = resolve_generic_f (expr);
2441           break;
2442
2443         case PTYPE_SPECIFIC:
2444           t = resolve_specific_f (expr);
2445           break;
2446
2447         case PTYPE_UNKNOWN:
2448           t = resolve_unknown_f (expr);
2449           break;
2450
2451         default:
2452           gfc_internal_error ("resolve_function(): bad function type");
2453         }
2454     }
2455
2456   /* If the expression is still a function (it might have simplified),
2457      then we check to see if we are calling an elemental function.  */
2458
2459   if (expr->expr_type != EXPR_FUNCTION)
2460     return t;
2461
2462   temp = need_full_assumed_size;
2463   need_full_assumed_size = 0;
2464
2465   if (resolve_elemental_actual (expr, NULL) == FAILURE)
2466     return FAILURE;
2467
2468   if (omp_workshare_flag
2469       && expr->value.function.esym
2470       && ! gfc_elemental (expr->value.function.esym))
2471     {
2472       gfc_error ("User defined non-ELEMENTAL function '%s' at %L not allowed "
2473                  "in WORKSHARE construct", expr->value.function.esym->name,
2474                  &expr->where);
2475       t = FAILURE;
2476     }
2477
2478 #define GENERIC_ID expr->value.function.isym->id
2479   else if (expr->value.function.actual != NULL
2480            && expr->value.function.isym != NULL
2481            && GENERIC_ID != GFC_ISYM_LBOUND
2482            && GENERIC_ID != GFC_ISYM_LEN
2483            && GENERIC_ID != GFC_ISYM_LOC
2484            && GENERIC_ID != GFC_ISYM_PRESENT)
2485     {
2486       /* Array intrinsics must also have the last upper bound of an
2487          assumed size array argument.  UBOUND and SIZE have to be
2488          excluded from the check if the second argument is anything
2489          than a constant.  */
2490
2491       for (arg = expr->value.function.actual; arg; arg = arg->next)
2492         {
2493           if ((GENERIC_ID == GFC_ISYM_UBOUND || GENERIC_ID == GFC_ISYM_SIZE)
2494               && arg->next != NULL && arg->next->expr)
2495             {
2496               if (arg->next->expr->expr_type != EXPR_CONSTANT)
2497                 break;
2498
2499               if (arg->next->name && strncmp(arg->next->name, "kind", 4) == 0)
2500                 break;
2501
2502               if ((int)mpz_get_si (arg->next->expr->value.integer)
2503                         < arg->expr->rank)
2504                 break;
2505             }
2506
2507           if (arg->expr != NULL
2508               && arg->expr->rank > 0
2509               && resolve_assumed_size_actual (arg->expr))
2510             return FAILURE;
2511         }
2512     }
2513 #undef GENERIC_ID
2514
2515   need_full_assumed_size = temp;
2516   name = NULL;
2517
2518   if (!pure_function (expr, &name) && name)
2519     {
2520       if (forall_flag)
2521         {
2522           gfc_error ("reference to non-PURE function '%s' at %L inside a "
2523                      "FORALL %s", name, &expr->where,
2524                      forall_flag == 2 ? "mask" : "block");
2525           t = FAILURE;
2526         }
2527       else if (gfc_pure (NULL))
2528         {
2529           gfc_error ("Function reference to '%s' at %L is to a non-PURE "
2530                      "procedure within a PURE procedure", name, &expr->where);
2531           t = FAILURE;
2532         }
2533     }
2534
2535   /* Functions without the RECURSIVE attribution are not allowed to
2536    * call themselves.  */
2537   if (expr->value.function.esym && !expr->value.function.esym->attr.recursive)
2538     {
2539       gfc_symbol *esym;
2540       esym = expr->value.function.esym;
2541
2542       if (is_illegal_recursion (esym, gfc_current_ns))
2543       {
2544         if (esym->attr.entry && esym->ns->entries)
2545           gfc_error ("ENTRY '%s' at %L cannot be called recursively, as"
2546                      " function '%s' is not RECURSIVE",
2547                      esym->name, &expr->where, esym->ns->entries->sym->name);
2548         else
2549           gfc_error ("Function '%s' at %L cannot be called recursively, as it"
2550                      " is not RECURSIVE", esym->name, &expr->where);
2551
2552         t = FAILURE;
2553       }
2554     }
2555
2556   /* Character lengths of use associated functions may contains references to
2557      symbols not referenced from the current program unit otherwise.  Make sure
2558      those symbols are marked as referenced.  */
2559
2560   if (expr->ts.type == BT_CHARACTER && expr->value.function.esym
2561       && expr->value.function.esym->attr.use_assoc)
2562     {
2563       gfc_expr_set_symbols_referenced (expr->ts.cl->length);
2564     }
2565
2566   if (t == SUCCESS
2567         && !((expr->value.function.esym
2568                 && expr->value.function.esym->attr.elemental)
2569                         ||
2570              (expr->value.function.isym
2571                 && expr->value.function.isym->elemental)))
2572     find_noncopying_intrinsics (expr->value.function.esym,
2573                                 expr->value.function.actual);
2574
2575   /* Make sure that the expression has a typespec that works.  */
2576   if (expr->ts.type == BT_UNKNOWN)
2577     {
2578       if (expr->symtree->n.sym->result
2579             && expr->symtree->n.sym->result->ts.type != BT_UNKNOWN
2580             && !expr->symtree->n.sym->result->attr.proc_pointer)
2581         expr->ts = expr->symtree->n.sym->result->ts;
2582     }
2583
2584   return t;
2585 }
2586
2587
2588 /************* Subroutine resolution *************/
2589
2590 static void
2591 pure_subroutine (gfc_code *c, gfc_symbol *sym)
2592 {
2593   if (gfc_pure (sym))
2594     return;
2595
2596   if (forall_flag)
2597     gfc_error ("Subroutine call to '%s' in FORALL block at %L is not PURE",
2598                sym->name, &c->loc);
2599   else if (gfc_pure (NULL))
2600     gfc_error ("Subroutine call to '%s' at %L is not PURE", sym->name,
2601                &c->loc);
2602 }
2603
2604
2605 static match
2606 resolve_generic_s0 (gfc_code *c, gfc_symbol *sym)
2607 {
2608   gfc_symbol *s;
2609
2610   if (sym->attr.generic)
2611     {
2612       s = gfc_search_interface (sym->generic, 1, &c->ext.actual);
2613       if (s != NULL)
2614         {
2615           c->resolved_sym = s;
2616           pure_subroutine (c, s);
2617           return MATCH_YES;
2618         }
2619
2620       /* TODO: Need to search for elemental references in generic interface.  */
2621     }
2622
2623   if (sym->attr.intrinsic)
2624     return gfc_intrinsic_sub_interface (c, 0);
2625
2626   return MATCH_NO;
2627 }
2628
2629
2630 static gfc_try
2631 resolve_generic_s (gfc_code *c)
2632 {
2633   gfc_symbol *sym;
2634   match m;
2635
2636   sym = c->symtree->n.sym;
2637
2638   for (;;)
2639     {
2640       m = resolve_generic_s0 (c, sym);
2641       if (m == MATCH_YES)
2642         return SUCCESS;
2643       else if (m == MATCH_ERROR)
2644         return FAILURE;
2645
2646 generic:
2647       if (sym->ns->parent == NULL)
2648         break;
2649       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
2650
2651       if (sym == NULL)
2652         break;
2653       if (!generic_sym (sym))
2654         goto generic;
2655     }
2656
2657   /* Last ditch attempt.  See if the reference is to an intrinsic
2658      that possesses a matching interface.  14.1.2.4  */
2659   sym = c->symtree->n.sym;
2660
2661   if (!gfc_is_intrinsic (sym, 1, c->loc))
2662     {
2663       gfc_error ("There is no specific subroutine for the generic '%s' at %L",
2664                  sym->name, &c->loc);
2665       return FAILURE;
2666     }
2667
2668   m = gfc_intrinsic_sub_interface (c, 0);
2669   if (m == MATCH_YES)
2670     return SUCCESS;
2671   if (m == MATCH_NO)
2672     gfc_error ("Generic subroutine '%s' at %L is not consistent with an "
2673                "intrinsic subroutine interface", sym->name, &c->loc);
2674
2675   return FAILURE;
2676 }
2677
2678
2679 /* Set the name and binding label of the subroutine symbol in the call
2680    expression represented by 'c' to include the type and kind of the
2681    second parameter.  This function is for resolving the appropriate
2682    version of c_f_pointer() and c_f_procpointer().  For example, a
2683    call to c_f_pointer() for a default integer pointer could have a
2684    name of c_f_pointer_i4.  If no second arg exists, which is an error
2685    for these two functions, it defaults to the generic symbol's name
2686    and binding label.  */
2687
2688 static void
2689 set_name_and_label (gfc_code *c, gfc_symbol *sym,
2690                     char *name, char *binding_label)
2691 {
2692   gfc_expr *arg = NULL;
2693   char type;
2694   int kind;
2695
2696   /* The second arg of c_f_pointer and c_f_procpointer determines
2697      the type and kind for the procedure name.  */
2698   arg = c->ext.actual->next->expr;
2699
2700   if (arg != NULL)
2701     {
2702       /* Set up the name to have the given symbol's name,
2703          plus the type and kind.  */
2704       /* a derived type is marked with the type letter 'u' */
2705       if (arg->ts.type == BT_DERIVED)
2706         {
2707           type = 'd';
2708           kind = 0; /* set the kind as 0 for now */
2709         }
2710       else
2711         {
2712           type = gfc_type_letter (arg->ts.type);
2713           kind = arg->ts.kind;
2714         }
2715
2716       if (arg->ts.type == BT_CHARACTER)
2717         /* Kind info for character strings not needed.  */
2718         kind = 0;
2719
2720       sprintf (name, "%s_%c%d", sym->name, type, kind);
2721       /* Set up the binding label as the given symbol's label plus
2722          the type and kind.  */
2723       sprintf (binding_label, "%s_%c%d", sym->binding_label, type, kind);
2724     }
2725   else
2726     {
2727       /* If the second arg is missing, set the name and label as
2728          was, cause it should at least be found, and the missing
2729          arg error will be caught by compare_parameters().  */
2730       sprintf (name, "%s", sym->name);
2731       sprintf (binding_label, "%s", sym->binding_label);
2732     }
2733    
2734   return;
2735 }
2736
2737
2738 /* Resolve a generic version of the iso_c_binding procedure given
2739    (sym) to the specific one based on the type and kind of the
2740    argument(s).  Currently, this function resolves c_f_pointer() and
2741    c_f_procpointer based on the type and kind of the second argument
2742    (FPTR).  Other iso_c_binding procedures aren't specially handled.
2743    Upon successfully exiting, c->resolved_sym will hold the resolved
2744    symbol.  Returns MATCH_ERROR if an error occurred; MATCH_YES
2745    otherwise.  */
2746
2747 match
2748 gfc_iso_c_sub_interface (gfc_code *c, gfc_symbol *sym)
2749 {
2750   gfc_symbol *new_sym;
2751   /* this is fine, since we know the names won't use the max */
2752   char name[GFC_MAX_SYMBOL_LEN + 1];
2753   char binding_label[GFC_MAX_BINDING_LABEL_LEN + 1];
2754   /* default to success; will override if find error */
2755   match m = MATCH_YES;
2756
2757   /* Make sure the actual arguments are in the necessary order (based on the 
2758      formal args) before resolving.  */
2759   gfc_procedure_use (sym, &c->ext.actual, &(c->loc));
2760
2761   if ((sym->intmod_sym_id == ISOCBINDING_F_POINTER) ||
2762       (sym->intmod_sym_id == ISOCBINDING_F_PROCPOINTER))
2763     {
2764       set_name_and_label (c, sym, name, binding_label);
2765       
2766       if (sym->intmod_sym_id == ISOCBINDING_F_POINTER)
2767         {
2768           if (c->ext.actual != NULL && c->ext.actual->next != NULL)
2769             {
2770               /* Make sure we got a third arg if the second arg has non-zero
2771                  rank.  We must also check that the type and rank are
2772                  correct since we short-circuit this check in
2773                  gfc_procedure_use() (called above to sort actual args).  */
2774               if (c->ext.actual->next->expr->rank != 0)
2775                 {
2776                   if(c->ext.actual->next->next == NULL 
2777                      || c->ext.actual->next->next->expr == NULL)
2778                     {
2779                       m = MATCH_ERROR;
2780                       gfc_error ("Missing SHAPE parameter for call to %s "
2781                                  "at %L", sym->name, &(c->loc));
2782                     }
2783                   else if (c->ext.actual->next->next->expr->ts.type
2784                            != BT_INTEGER
2785                            || c->ext.actual->next->next->expr->rank != 1)
2786                     {
2787                       m = MATCH_ERROR;
2788                       gfc_error ("SHAPE parameter for call to %s at %L must "
2789                                  "be a rank 1 INTEGER array", sym->name,
2790                                  &(c->loc));
2791                     }
2792                 }
2793             }
2794         }
2795       
2796       if (m != MATCH_ERROR)
2797         {
2798           /* the 1 means to add the optional arg to formal list */
2799           new_sym = get_iso_c_sym (sym, name, binding_label, 1);
2800          
2801           /* for error reporting, say it's declared where the original was */
2802           new_sym->declared_at = sym->declared_at;
2803         }
2804     }
2805   else
2806     {
2807       /* no differences for c_loc or c_funloc */
2808       new_sym = sym;
2809     }
2810
2811   /* set the resolved symbol */
2812   if (m != MATCH_ERROR)
2813     c->resolved_sym = new_sym;
2814   else
2815     c->resolved_sym = sym;
2816   
2817   return m;
2818 }
2819
2820
2821 /* Resolve a subroutine call known to be specific.  */
2822
2823 static match
2824 resolve_specific_s0 (gfc_code *c, gfc_symbol *sym)
2825 {
2826   match m;
2827
2828   if(sym->attr.is_iso_c)
2829     {
2830       m = gfc_iso_c_sub_interface (c,sym);
2831       return m;
2832     }
2833   
2834   if (sym->attr.external || sym->attr.if_source == IFSRC_IFBODY)
2835     {
2836       if (sym->attr.dummy)
2837         {
2838           sym->attr.proc = PROC_DUMMY;
2839           goto found;
2840         }
2841
2842       sym->attr.proc = PROC_EXTERNAL;
2843       goto found;
2844     }
2845
2846   if (sym->attr.proc == PROC_MODULE || sym->attr.proc == PROC_INTERNAL)
2847     goto found;
2848
2849   if (sym->attr.intrinsic)
2850     {
2851       m = gfc_intrinsic_sub_interface (c, 1);
2852       if (m == MATCH_YES)
2853         return MATCH_YES;
2854       if (m == MATCH_NO)
2855         gfc_error ("Subroutine '%s' at %L is INTRINSIC but is not compatible "
2856                    "with an intrinsic", sym->name, &c->loc);
2857
2858       return MATCH_ERROR;
2859     }
2860
2861   return MATCH_NO;
2862
2863 found:
2864   gfc_procedure_use (sym, &c->ext.actual, &c->loc);
2865
2866   c->resolved_sym = sym;
2867   pure_subroutine (c, sym);
2868
2869   return MATCH_YES;
2870 }
2871
2872
2873 static gfc_try
2874 resolve_specific_s (gfc_code *c)
2875 {
2876   gfc_symbol *sym;
2877   match m;
2878
2879   sym = c->symtree->n.sym;
2880
2881   for (;;)
2882     {
2883       m = resolve_specific_s0 (c, sym);
2884       if (m == MATCH_YES)
2885         return SUCCESS;
2886       if (m == MATCH_ERROR)
2887         return FAILURE;
2888
2889       if (sym->ns->parent == NULL)
2890         break;
2891
2892       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
2893
2894       if (sym == NULL)
2895         break;
2896     }
2897
2898   sym = c->symtree->n.sym;
2899   gfc_error ("Unable to resolve the specific subroutine '%s' at %L",
2900              sym->name, &c->loc);
2901
2902   return FAILURE;
2903 }
2904
2905
2906 /* Resolve a subroutine call not known to be generic nor specific.  */
2907
2908 static gfc_try
2909 resolve_unknown_s (gfc_code *c)
2910 {
2911   gfc_symbol *sym;
2912
2913   sym = c->symtree->n.sym;
2914
2915   if (sym->attr.dummy)
2916     {
2917       sym->attr.proc = PROC_DUMMY;
2918       goto found;
2919     }
2920
2921   /* See if we have an intrinsic function reference.  */
2922
2923   if (gfc_is_intrinsic (sym, 1, c->loc))
2924     {
2925       if (gfc_intrinsic_sub_interface (c, 1) == MATCH_YES)
2926         return SUCCESS;
2927       return FAILURE;
2928     }
2929
2930   /* The reference is to an external name.  */
2931
2932 found:
2933   gfc_procedure_use (sym, &c->ext.actual, &c->loc);
2934
2935   c->resolved_sym = sym;
2936
2937   pure_subroutine (c, sym);
2938
2939   return SUCCESS;
2940 }
2941
2942
2943 /* Resolve a subroutine call.  Although it was tempting to use the same code
2944    for functions, subroutines and functions are stored differently and this
2945    makes things awkward.  */
2946
2947 static gfc_try
2948 resolve_call (gfc_code *c)
2949 {
2950   gfc_try t;
2951   procedure_type ptype = PROC_INTRINSIC;
2952   gfc_symbol *csym, *sym;
2953   bool no_formal_args;
2954
2955   csym = c->symtree ? c->symtree->n.sym : NULL;
2956
2957   if (csym && csym->ts.type != BT_UNKNOWN)
2958     {
2959       gfc_error ("'%s' at %L has a type, which is not consistent with "
2960                  "the CALL at %L", csym->name, &csym->declared_at, &c->loc);
2961       return FAILURE;
2962     }
2963
2964   if (csym && gfc_current_ns->parent && csym->ns != gfc_current_ns)
2965     {
2966       gfc_symtree *st;
2967       gfc_find_sym_tree (csym->name, gfc_current_ns, 1, &st);
2968       sym = st ? st->n.sym : NULL;
2969       if (sym && csym != sym
2970               && sym->ns == gfc_current_ns
2971               && sym->attr.flavor == FL_PROCEDURE
2972               && sym->attr.contained)
2973         {
2974           sym->refs++;
2975           if (csym->attr.generic)
2976             c->symtree->n.sym = sym;
2977           else
2978             c->symtree = st;
2979           csym = c->symtree->n.sym;
2980         }
2981     }
2982
2983   /* Subroutines without the RECURSIVE attribution are not allowed to
2984    * call themselves.  */
2985   if (csym && is_illegal_recursion (csym, gfc_current_ns))
2986     {
2987       if (csym->attr.entry && csym->ns->entries)
2988         gfc_error ("ENTRY '%s' at %L cannot be called recursively, as"
2989                    " subroutine '%s' is not RECURSIVE",
2990                    csym->name, &c->loc, csym->ns->entries->sym->name);
2991       else
2992         gfc_error ("SUBROUTINE '%s' at %L cannot be called recursively, as it"
2993                    " is not RECURSIVE", csym->name, &c->loc);
2994
2995       t = FAILURE;
2996     }
2997
2998   /* Switch off assumed size checking and do this again for certain kinds
2999      of procedure, once the procedure itself is resolved.  */
3000   need_full_assumed_size++;
3001
3002   if (csym)
3003     ptype = csym->attr.proc;
3004
3005   no_formal_args = csym && is_external_proc (csym) && csym->formal == NULL;
3006   if (resolve_actual_arglist (c->ext.actual, ptype,
3007                               no_formal_args) == FAILURE)
3008     return FAILURE;
3009
3010   /* Resume assumed_size checking.  */
3011   need_full_assumed_size--;
3012
3013   /* If external, check for usage.  */
3014   if (csym && is_external_proc (csym))
3015     resolve_global_procedure (csym, &c->loc, &c->ext.actual, 1);
3016
3017   t = SUCCESS;
3018   if (c->resolved_sym == NULL)
3019     {
3020       c->resolved_isym = NULL;
3021       switch (procedure_kind (csym))
3022         {
3023         case PTYPE_GENERIC:
3024           t = resolve_generic_s (c);
3025           break;
3026
3027         case PTYPE_SPECIFIC:
3028           t = resolve_specific_s (c);
3029           break;
3030
3031         case PTYPE_UNKNOWN:
3032           t = resolve_unknown_s (c);
3033           break;
3034
3035         default:
3036           gfc_internal_error ("resolve_subroutine(): bad function type");
3037         }
3038     }
3039
3040   /* Some checks of elemental subroutine actual arguments.  */
3041   if (resolve_elemental_actual (NULL, c) == FAILURE)
3042     return FAILURE;
3043
3044   if (t == SUCCESS && !(c->resolved_sym && c->resolved_sym->attr.elemental))
3045     find_noncopying_intrinsics (c->resolved_sym, c->ext.actual);
3046   return t;
3047 }
3048
3049
3050 /* Compare the shapes of two arrays that have non-NULL shapes.  If both
3051    op1->shape and op2->shape are non-NULL return SUCCESS if their shapes
3052    match.  If both op1->shape and op2->shape are non-NULL return FAILURE
3053    if their shapes do not match.  If either op1->shape or op2->shape is
3054    NULL, return SUCCESS.  */
3055
3056 static gfc_try
3057 compare_shapes (gfc_expr *op1, gfc_expr *op2)
3058 {
3059   gfc_try t;
3060   int i;
3061
3062   t = SUCCESS;
3063
3064   if (op1->shape != NULL && op2->shape != NULL)
3065     {
3066       for (i = 0; i < op1->rank; i++)
3067         {
3068           if (mpz_cmp (op1->shape[i], op2->shape[i]) != 0)
3069            {
3070              gfc_error ("Shapes for operands at %L and %L are not conformable",
3071                          &op1->where, &op2->where);
3072              t = FAILURE;
3073              break;
3074            }
3075         }
3076     }
3077
3078   return t;
3079 }
3080
3081
3082 /* Resolve an operator expression node.  This can involve replacing the
3083    operation with a user defined function call.  */
3084
3085 static gfc_try
3086 resolve_operator (gfc_expr *e)
3087 {
3088   gfc_expr *op1, *op2;
3089   char msg[200];
3090   bool dual_locus_error;
3091   gfc_try t;
3092
3093   /* Resolve all subnodes-- give them types.  */
3094
3095   switch (e->value.op.op)
3096     {
3097     default:
3098       if (gfc_resolve_expr (e->value.op.op2) == FAILURE)
3099         return FAILURE;
3100
3101     /* Fall through...  */
3102
3103     case INTRINSIC_NOT:
3104     case INTRINSIC_UPLUS:
3105     case INTRINSIC_UMINUS:
3106     case INTRINSIC_PARENTHESES:
3107       if (gfc_resolve_expr (e->value.op.op1) == FAILURE)
3108         return FAILURE;
3109       break;
3110     }
3111
3112   /* Typecheck the new node.  */
3113
3114   op1 = e->value.op.op1;
3115   op2 = e->value.op.op2;
3116   dual_locus_error = false;
3117
3118   if ((op1 && op1->expr_type == EXPR_NULL)
3119       || (op2 && op2->expr_type == EXPR_NULL))
3120     {
3121       sprintf (msg, _("Invalid context for NULL() pointer at %%L"));
3122       goto bad_op;
3123     }
3124
3125   switch (e->value.op.op)
3126     {
3127     case INTRINSIC_UPLUS:
3128     case INTRINSIC_UMINUS:
3129       if (op1->ts.type == BT_INTEGER
3130           || op1->ts.type == BT_REAL
3131           || op1->ts.type == BT_COMPLEX)
3132         {
3133           e->ts = op1->ts;
3134           break;
3135         }
3136
3137       sprintf (msg, _("Operand of unary numeric operator '%s' at %%L is %s"),
3138                gfc_op2string (e->value.op.op), gfc_typename (&e->ts));
3139       goto bad_op;
3140
3141     case INTRINSIC_PLUS:
3142     case INTRINSIC_MINUS:
3143     case INTRINSIC_TIMES:
3144     case INTRINSIC_DIVIDE:
3145     case INTRINSIC_POWER:
3146       if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
3147         {
3148           gfc_type_convert_binary (e);
3149           break;
3150         }
3151
3152       sprintf (msg,
3153                _("Operands of binary numeric operator '%s' at %%L are %s/%s"),
3154                gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3155                gfc_typename (&op2->ts));
3156       goto bad_op;
3157
3158     case INTRINSIC_CONCAT:
3159       if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
3160           && op1->ts.kind == op2->ts.kind)
3161         {
3162           e->ts.type = BT_CHARACTER;
3163           e->ts.kind = op1->ts.kind;
3164           break;
3165         }
3166
3167       sprintf (msg,
3168                _("Operands of string concatenation operator at %%L are %s/%s"),
3169                gfc_typename (&op1->ts), gfc_typename (&op2->ts));
3170       goto bad_op;
3171
3172     case INTRINSIC_AND:
3173     case INTRINSIC_OR:
3174     case INTRINSIC_EQV:
3175     case INTRINSIC_NEQV:
3176       if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
3177         {
3178           e->ts.type = BT_LOGICAL;
3179           e->ts.kind = gfc_kind_max (op1, op2);
3180           if (op1->ts.kind < e->ts.kind)
3181             gfc_convert_type (op1, &e->ts, 2);
3182           else if (op2->ts.kind < e->ts.kind)
3183             gfc_convert_type (op2, &e->ts, 2);
3184           break;
3185         }
3186
3187       sprintf (msg, _("Operands of logical operator '%s' at %%L are %s/%s"),
3188                gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3189                gfc_typename (&op2->ts));
3190
3191       goto bad_op;
3192
3193     case INTRINSIC_NOT:
3194       if (op1->ts.type == BT_LOGICAL)
3195         {
3196           e->ts.type = BT_LOGICAL;
3197           e->ts.kind = op1->ts.kind;
3198           break;
3199         }
3200
3201       sprintf (msg, _("Operand of .not. operator at %%L is %s"),
3202                gfc_typename (&op1->ts));
3203       goto bad_op;
3204
3205     case INTRINSIC_GT:
3206     case INTRINSIC_GT_OS:
3207     case INTRINSIC_GE:
3208     case INTRINSIC_GE_OS:
3209     case INTRINSIC_LT:
3210     case INTRINSIC_LT_OS:
3211     case INTRINSIC_LE:
3212     case INTRINSIC_LE_OS:
3213       if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
3214         {
3215           strcpy (msg, _("COMPLEX quantities cannot be compared at %L"));
3216           goto bad_op;
3217         }
3218
3219       /* Fall through...  */
3220
3221     case INTRINSIC_EQ:
3222     case INTRINSIC_EQ_OS:
3223     case INTRINSIC_NE:
3224     case INTRINSIC_NE_OS:
3225       if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
3226           && op1->ts.kind == op2->ts.kind)
3227         {
3228           e->ts.type = BT_LOGICAL;
3229           e->ts.kind = gfc_default_logical_kind;
3230           break;
3231         }
3232
3233       if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
3234         {
3235           gfc_type_convert_binary (e);
3236
3237           e->ts.type = BT_LOGICAL;
3238           e->ts.kind = gfc_default_logical_kind;
3239           break;
3240         }
3241
3242       if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
3243         sprintf (msg,
3244                  _("Logicals at %%L must be compared with %s instead of %s"),
3245                  (e->value.op.op == INTRINSIC_EQ 
3246                   || e->value.op.op == INTRINSIC_EQ_OS)
3247                  ? ".eqv." : ".neqv.", gfc_op2string (e->value.op.op));
3248       else
3249         sprintf (msg,
3250                  _("Operands of comparison operator '%s' at %%L are %s/%s"),
3251                  gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3252                  gfc_typename (&op2->ts));
3253
3254       goto bad_op;
3255
3256     case INTRINSIC_USER:
3257       if (e->value.op.uop->op == NULL)
3258         sprintf (msg, _("Unknown operator '%s' at %%L"), e->value.op.uop->name);
3259       else if (op2 == NULL)
3260         sprintf (msg, _("Operand of user operator '%s' at %%L is %s"),
3261                  e->value.op.uop->name, gfc_typename (&op1->ts));
3262       else
3263         sprintf (msg, _("Operands of user operator '%s' at %%L are %s/%s"),
3264                  e->value.op.uop->name, gfc_typename (&op1->ts),
3265                  gfc_typename (&op2->ts));
3266
3267       goto bad_op;
3268
3269     case INTRINSIC_PARENTHESES:
3270       e->ts = op1->ts;
3271       if (e->ts.type == BT_CHARACTER)
3272         e->ts.cl = op1->ts.cl;
3273       break;
3274
3275     default:
3276       gfc_internal_error ("resolve_operator(): Bad intrinsic");
3277     }
3278
3279   /* Deal with arrayness of an operand through an operator.  */
3280
3281   t = SUCCESS;
3282
3283   switch (e->value.op.op)
3284     {
3285     case INTRINSIC_PLUS:
3286     case INTRINSIC_MINUS:
3287     case INTRINSIC_TIMES:
3288     case INTRINSIC_DIVIDE:
3289     case INTRINSIC_POWER:
3290     case INTRINSIC_CONCAT:
3291     case INTRINSIC_AND:
3292     case INTRINSIC_OR:
3293     case INTRINSIC_EQV:
3294     case INTRINSIC_NEQV:
3295     case INTRINSIC_EQ:
3296     case INTRINSIC_EQ_OS:
3297     case INTRINSIC_NE:
3298     case INTRINSIC_NE_OS:
3299     case INTRINSIC_GT:
3300     case INTRINSIC_GT_OS:
3301     case INTRINSIC_GE:
3302     case INTRINSIC_GE_OS:
3303     case INTRINSIC_LT:
3304     case INTRINSIC_LT_OS:
3305     case INTRINSIC_LE:
3306     case INTRINSIC_LE_OS:
3307
3308       if (op1->rank == 0 && op2->rank == 0)
3309         e->rank = 0;
3310
3311       if (op1->rank == 0 && op2->rank != 0)
3312         {
3313           e->rank = op2->rank;
3314
3315           if (e->shape == NULL)
3316             e->shape = gfc_copy_shape (op2->shape, op2->rank);
3317         }
3318
3319       if (op1->rank != 0 && op2->rank == 0)
3320         {
3321           e->rank = op1->rank;
3322
3323           if (e->shape == NULL)
3324             e->shape = gfc_copy_shape (op1->shape, op1->rank);
3325         }
3326
3327       if (op1->rank != 0 && op2->rank != 0)
3328         {
3329           if (op1->rank == op2->rank)
3330             {
3331               e->rank = op1->rank;
3332               if (e->shape == NULL)
3333                 {
3334                   t = compare_shapes(op1, op2);
3335                   if (t == FAILURE)
3336                     e->shape = NULL;
3337                   else
3338                 e->shape = gfc_copy_shape (op1->shape, op1->rank);
3339                 }
3340             }
3341           else
3342             {
3343               /* Allow higher level expressions to work.  */
3344               e->rank = 0;
3345
3346               /* Try user-defined operators, and otherwise throw an error.  */
3347               dual_locus_error = true;
3348               sprintf (msg,
3349                        _("Inconsistent ranks for operator at %%L and %%L"));
3350               goto bad_op;
3351             }
3352         }
3353
3354       break;
3355
3356     case INTRINSIC_PARENTHESES:
3357     case INTRINSIC_NOT:
3358     case INTRINSIC_UPLUS:
3359     case INTRINSIC_UMINUS:
3360       /* Simply copy arrayness attribute */
3361       e->rank = op1->rank;
3362
3363       if (e->shape == NULL)
3364         e->shape = gfc_copy_shape (op1->shape, op1->rank);
3365
3366       break;
3367
3368     default:
3369       break;
3370     }
3371
3372   /* Attempt to simplify the expression.  */
3373   if (t == SUCCESS)
3374     {
3375       t = gfc_simplify_expr (e, 0);
3376       /* Some calls do not succeed in simplification and return FAILURE
3377          even though there is no error; e.g. variable references to
3378          PARAMETER arrays.  */
3379       if (!gfc_is_constant_expr (e))
3380         t = SUCCESS;
3381     }
3382   return t;
3383
3384 bad_op:
3385
3386   if (gfc_extend_expr (e) == SUCCESS)
3387     return SUCCESS;
3388
3389   if (dual_locus_error)
3390     gfc_error (msg, &op1->where, &op2->where);
3391   else
3392     gfc_error (msg, &e->where);
3393
3394   return FAILURE;
3395 }
3396
3397
3398 /************** Array resolution subroutines **************/
3399
3400 typedef enum
3401 { CMP_LT, CMP_EQ, CMP_GT, CMP_UNKNOWN }
3402 comparison;
3403
3404 /* Compare two integer expressions.  */
3405
3406 static comparison
3407 compare_bound (gfc_expr *a, gfc_expr *b)
3408 {
3409   int i;
3410
3411   if (a == NULL || a->expr_type != EXPR_CONSTANT
3412       || b == NULL || b->expr_type != EXPR_CONSTANT)
3413     return CMP_UNKNOWN;
3414
3415   /* If either of the types isn't INTEGER, we must have
3416      raised an error earlier.  */
3417
3418   if (a->ts.type != BT_INTEGER || b->ts.type != BT_INTEGER)
3419     return CMP_UNKNOWN;
3420
3421   i = mpz_cmp (a->value.integer, b->value.integer);
3422
3423   if (i < 0)
3424     return CMP_LT;
3425   if (i > 0)
3426     return CMP_GT;
3427   return CMP_EQ;
3428 }
3429
3430
3431 /* Compare an integer expression with an integer.  */
3432
3433 static comparison
3434 compare_bound_int (gfc_expr *a, int b)
3435 {
3436   int i;
3437
3438   if (a == NULL || a->expr_type != EXPR_CONSTANT)
3439     return CMP_UNKNOWN;
3440
3441   if (a->ts.type != BT_INTEGER)
3442     gfc_internal_error ("compare_bound_int(): Bad expression");
3443
3444   i = mpz_cmp_si (a->value.integer, b);
3445
3446   if (i < 0)
3447     return CMP_LT;
3448   if (i > 0)
3449     return CMP_GT;
3450   return CMP_EQ;
3451 }
3452
3453
3454 /* Compare an integer expression with a mpz_t.  */
3455
3456 static comparison
3457 compare_bound_mpz_t (gfc_expr *a, mpz_t b)
3458 {
3459   int i;
3460
3461   if (a == NULL || a->expr_type != EXPR_CONSTANT)
3462     return CMP_UNKNOWN;
3463
3464   if (a->ts.type != BT_INTEGER)
3465     gfc_internal_error ("compare_bound_int(): Bad expression");
3466
3467   i = mpz_cmp (a->value.integer, b);
3468
3469   if (i < 0)
3470     return CMP_LT;
3471   if (i > 0)
3472     return CMP_GT;
3473   return CMP_EQ;
3474 }
3475
3476
3477 /* Compute the last value of a sequence given by a triplet.  
3478    Return 0 if it wasn't able to compute the last value, or if the
3479    sequence if empty, and 1 otherwise.  */
3480
3481 static int
3482 compute_last_value_for_triplet (gfc_expr *start, gfc_expr *end,
3483                                 gfc_expr *stride, mpz_t last)
3484 {
3485   mpz_t rem;
3486
3487   if (start == NULL || start->expr_type != EXPR_CONSTANT
3488       || end == NULL || end->expr_type != EXPR_CONSTANT
3489       || (stride != NULL && stride->expr_type != EXPR_CONSTANT))
3490     return 0;
3491
3492   if (start->ts.type != BT_INTEGER || end->ts.type != BT_INTEGER
3493       || (stride != NULL && stride->ts.type != BT_INTEGER))
3494     return 0;
3495
3496   if (stride == NULL || compare_bound_int(stride, 1) == CMP_EQ)
3497     {
3498       if (compare_bound (start, end) == CMP_GT)
3499         return 0;
3500       mpz_set (last, end->value.integer);
3501       return 1;
3502     }
3503
3504   if (compare_bound_int (stride, 0) == CMP_GT)
3505     {
3506       /* Stride is positive */
3507       if (mpz_cmp (start->value.integer, end->value.integer) > 0)
3508         return 0;
3509     }
3510   else
3511     {
3512       /* Stride is negative */
3513       if (mpz_cmp (start->value.integer, end->value.integer) < 0)
3514         return 0;
3515     }
3516
3517   mpz_init (rem);
3518   mpz_sub (rem, end->value.integer, start->value.integer);
3519   mpz_tdiv_r (rem, rem, stride->value.integer);
3520   mpz_sub (last, end->value.integer, rem);
3521   mpz_clear (rem);
3522
3523   return 1;
3524 }
3525
3526
3527 /* Compare a single dimension of an array reference to the array
3528    specification.  */
3529
3530 static gfc_try
3531 check_dimension (int i, gfc_array_ref *ar, gfc_array_spec *as)
3532 {
3533   mpz_t last_value;
3534
3535 /* Given start, end and stride values, calculate the minimum and
3536    maximum referenced indexes.  */
3537
3538   switch (ar->dimen_type[i])
3539     {
3540     case DIMEN_VECTOR:
3541       break;
3542
3543     case DIMEN_ELEMENT:
3544       if (compare_bound (ar->start[i], as->lower[i]) == CMP_LT)
3545         {
3546           gfc_warning ("Array reference at %L is out of bounds "
3547                        "(%ld < %ld) in dimension %d", &ar->c_where[i],
3548                        mpz_get_si (ar->start[i]->value.integer),
3549                        mpz_get_si (as->lower[i]->value.integer), i+1);
3550           return SUCCESS;
3551         }
3552       if (compare_bound (ar->start[i], as->upper[i]) == CMP_GT)
3553         {
3554           gfc_warning ("Array reference at %L is out of bounds "
3555                        "(%ld > %ld) in dimension %d", &ar->c_where[i],
3556                        mpz_get_si (ar->start[i]->value.integer),
3557                        mpz_get_si (as->upper[i]->value.integer), i+1);
3558           return SUCCESS;
3559         }
3560
3561       break;
3562
3563     case DIMEN_RANGE:
3564       {
3565 #define AR_START (ar->start[i] ? ar->start[i] : as->lower[i])
3566 #define AR_END (ar->end[i] ? ar->end[i] : as->upper[i])
3567
3568         comparison comp_start_end = compare_bound (AR_START, AR_END);
3569
3570         /* Check for zero stride, which is not allowed.  */
3571         if (compare_bound_int (ar->stride[i], 0) == CMP_EQ)
3572           {
3573             gfc_error ("Illegal stride of zero at %L", &ar->c_where[i]);
3574             return FAILURE;
3575           }
3576
3577         /* if start == len || (stride > 0 && start < len)
3578                            || (stride < 0 && start > len),
3579            then the array section contains at least one element.  In this
3580            case, there is an out-of-bounds access if
3581            (start < lower || start > upper).  */
3582         if (compare_bound (AR_START, AR_END) == CMP_EQ
3583             || ((compare_bound_int (ar->stride[i], 0) == CMP_GT
3584                  || ar->stride[i] == NULL) && comp_start_end == CMP_LT)
3585             || (compare_bound_int (ar->stride[i], 0) == CMP_LT
3586                 && comp_start_end == CMP_GT))
3587           {
3588             if (compare_bound (AR_START, as->lower[i]) == CMP_LT)
3589               {
3590                 gfc_warning ("Lower array reference at %L is out of bounds "
3591                        "(%ld < %ld) in dimension %d", &ar->c_where[i],
3592                        mpz_get_si (AR_START->value.integer),
3593                        mpz_get_si (as->lower[i]->value.integer), i+1);
3594                 return SUCCESS;
3595               }
3596             if (compare_bound (AR_START, as->upper[i]) == CMP_GT)
3597               {
3598                 gfc_warning ("Lower array reference at %L is out of bounds "
3599                        "(%ld > %ld) in dimension %d", &ar->c_where[i],
3600                        mpz_get_si (AR_START->value.integer),
3601                        mpz_get_si (as->upper[i]->value.integer), i+1);
3602                 return SUCCESS;
3603               }
3604           }
3605
3606         /* If we can compute the highest index of the array section,
3607            then it also has to be between lower and upper.  */
3608         mpz_init (last_value);
3609         if (compute_last_value_for_triplet (AR_START, AR_END, ar->stride[i],
3610                                             last_value))
3611           {
3612             if (compare_bound_mpz_t (as->lower[i], last_value) == CMP_GT)
3613               {
3614                 gfc_warning ("Upper array reference at %L is out of bounds "
3615                        "(%ld < %ld) in dimension %d", &ar->c_where[i],
3616                        mpz_get_si (last_value),
3617                        mpz_get_si (as->lower[i]->value.integer), i+1);
3618                 mpz_clear (last_value);
3619                 return SUCCESS;
3620               }
3621             if (compare_bound_mpz_t (as->upper[i], last_value) == CMP_LT)
3622               {
3623                 gfc_warning ("Upper array reference at %L is out of bounds "
3624                        "(%ld > %ld) in dimension %d", &ar->c_where[i],
3625                        mpz_get_si (last_value),
3626                        mpz_get_si (as->upper[i]->value.integer), i+1);
3627                 mpz_clear (last_value);
3628                 return SUCCESS;
3629               }
3630           }
3631         mpz_clear (last_value);
3632
3633 #undef AR_START
3634 #undef AR_END
3635       }
3636       break;
3637
3638     default:
3639       gfc_internal_error ("check_dimension(): Bad array reference");
3640     }
3641
3642   return SUCCESS;
3643 }
3644
3645
3646 /* Compare an array reference with an array specification.  */
3647
3648 static gfc_try
3649 compare_spec_to_ref (gfc_array_ref *ar)
3650 {
3651   gfc_array_spec *as;
3652   int i;
3653
3654   as = ar->as;
3655   i = as->rank - 1;
3656   /* TODO: Full array sections are only allowed as actual parameters.  */
3657   if (as->type == AS_ASSUMED_SIZE
3658       && (/*ar->type == AR_FULL
3659           ||*/ (ar->type == AR_SECTION
3660               && ar->dimen_type[i] == DIMEN_RANGE && ar->end[i] == NULL)))
3661     {
3662       gfc_error ("Rightmost upper bound of assumed size array section "
3663                  "not specified at %L", &ar->where);
3664       return FAILURE;
3665     }
3666
3667   if (ar->type == AR_FULL)
3668     return SUCCESS;
3669
3670   if (as->rank != ar->dimen)
3671     {
3672       gfc_error ("Rank mismatch in array reference at %L (%d/%d)",
3673                  &ar->where, ar->dimen, as->rank);
3674       return FAILURE;
3675     }
3676
3677   for (i = 0; i < as->rank; i++)
3678     if (check_dimension (i, ar, as) == FAILURE)
3679       return FAILURE;
3680
3681   return SUCCESS;
3682 }
3683
3684
3685 /* Resolve one part of an array index.  */
3686
3687 gfc_try
3688 gfc_resolve_index (gfc_expr *index, int check_scalar)
3689 {
3690   gfc_typespec ts;
3691
3692   if (index == NULL)
3693     return SUCCESS;
3694
3695   if (gfc_resolve_expr (index) == FAILURE)
3696     return FAILURE;
3697
3698   if (check_scalar && index->rank != 0)
3699     {
3700       gfc_error ("Array index at %L must be scalar", &index->where);
3701       return FAILURE;
3702     }
3703
3704   if (index->ts.type != BT_INTEGER && index->ts.type != BT_REAL)
3705     {
3706       gfc_error ("Array index at %L must be of INTEGER type, found %s",
3707                  &index->where, gfc_basic_typename (index->ts.type));
3708       return FAILURE;
3709     }
3710
3711   if (index->ts.type == BT_REAL)
3712     if (gfc_notify_std (GFC_STD_LEGACY, "Extension: REAL array index at %L",
3713                         &index->where) == FAILURE)
3714       return FAILURE;
3715
3716   if (index->ts.kind != gfc_index_integer_kind
3717       || index->ts.type != BT_INTEGER)
3718     {
3719       gfc_clear_ts (&ts);
3720       ts.type = BT_INTEGER;
3721       ts.kind = gfc_index_integer_kind;
3722
3723       gfc_convert_type_warn (index, &ts, 2, 0);
3724     }
3725
3726   return SUCCESS;
3727 }
3728
3729 /* Resolve a dim argument to an intrinsic function.  */
3730
3731 gfc_try
3732 gfc_resolve_dim_arg (gfc_expr *dim)
3733 {
3734   if (dim == NULL)
3735     return SUCCESS;
3736
3737   if (gfc_resolve_expr (dim) == FAILURE)
3738     return FAILURE;
3739
3740   if (dim->rank != 0)
3741     {
3742       gfc_error ("Argument dim at %L must be scalar", &dim->where);
3743       return FAILURE;
3744
3745     }
3746
3747   if (dim->ts.type != BT_INTEGER)
3748     {
3749       gfc_error ("Argument dim at %L must be of INTEGER type", &dim->where);
3750       return FAILURE;
3751     }
3752
3753   if (dim->ts.kind != gfc_index_integer_kind)
3754     {
3755       gfc_typespec ts;
3756
3757       ts.type = BT_INTEGER;
3758       ts.kind = gfc_index_integer_kind;
3759
3760       gfc_convert_type_warn (dim, &ts, 2, 0);
3761     }
3762
3763   return SUCCESS;
3764 }
3765
3766 /* Given an expression that contains array references, update those array
3767    references to point to the right array specifications.  While this is
3768    filled in during matching, this information is difficult to save and load
3769    in a module, so we take care of it here.
3770
3771    The idea here is that the original array reference comes from the
3772    base symbol.  We traverse the list of reference structures, setting
3773    the stored reference to references.  Component references can
3774    provide an additional array specification.  */
3775
3776 static void
3777 find_array_spec (gfc_expr *e)
3778 {
3779   gfc_array_spec *as;
3780   gfc_component *c;
3781   gfc_symbol *derived;
3782   gfc_ref *ref;
3783
3784   as = e->symtree->n.sym->as;
3785   derived = NULL;
3786
3787   for (ref = e->ref; ref; ref = ref->next)
3788     switch (ref->type)
3789       {
3790       case REF_ARRAY:
3791         if (as == NULL)
3792           gfc_internal_error ("find_array_spec(): Missing spec");
3793
3794         ref->u.ar.as = as;
3795         as = NULL;
3796         break;
3797
3798       case REF_COMPONENT:
3799         if (derived == NULL)
3800           derived = e->symtree->n.sym->ts.derived;
3801
3802         c = derived->components;
3803
3804         for (; c; c = c->next)
3805           if (c == ref->u.c.component)
3806             {
3807               /* Track the sequence of component references.  */
3808               if (c->ts.type == BT_DERIVED)
3809                 derived = c->ts.derived;
3810               break;
3811             }
3812
3813         if (c == NULL)
3814           gfc_internal_error ("find_array_spec(): Component not found");
3815
3816         if (c->attr.dimension)
3817           {
3818             if (as != NULL)
3819               gfc_internal_error ("find_array_spec(): unused as(1)");
3820             as = c->as;
3821           }
3822
3823         break;
3824
3825       case REF_SUBSTRING:
3826         break;
3827       }
3828
3829   if (as != NULL)
3830     gfc_internal_error ("find_array_spec(): unused as(2)");
3831 }
3832
3833
3834 /* Resolve an array reference.  */
3835
3836 static gfc_try
3837 resolve_array_ref (gfc_array_ref *ar)
3838 {
3839   int i, check_scalar;
3840   gfc_expr *e;
3841
3842   for (i = 0; i < ar->dimen; i++)
3843     {
3844       check_scalar = ar->dimen_type[i] == DIMEN_RANGE;
3845
3846       if (gfc_resolve_index (ar->start[i], check_scalar) == FAILURE)
3847         return FAILURE;
3848       if (gfc_resolve_index (ar->end[i], check_scalar) == FAILURE)
3849         return FAILURE;
3850       if (gfc_resolve_index (ar->stride[i], check_scalar) == FAILURE)
3851         return FAILURE;
3852
3853       e = ar->start[i];
3854
3855       if (ar->dimen_type[i] == DIMEN_UNKNOWN)
3856         switch (e->rank)
3857           {
3858           case 0:
3859             ar->dimen_type[i] = DIMEN_ELEMENT;
3860             break;
3861
3862           case 1:
3863             ar->dimen_type[i] = DIMEN_VECTOR;
3864             if (e->expr_type == EXPR_VARIABLE
3865                 && e->symtree->n.sym->ts.type == BT_DERIVED)
3866               ar->start[i] = gfc_get_parentheses (e);
3867             break;
3868
3869           default:
3870             gfc_error ("Array index at %L is an array of rank %d",
3871                        &ar->c_where[i], e->rank);
3872             return FAILURE;
3873           }
3874     }
3875
3876   /* If the reference type is unknown, figure out what kind it is.  */
3877
3878   if (ar->type == AR_UNKNOWN)
3879     {
3880       ar->type = AR_ELEMENT;
3881       for (i = 0; i < ar->dimen; i++)
3882         if (ar->dimen_type[i] == DIMEN_RANGE
3883             || ar->dimen_type[i] == DIMEN_VECTOR)
3884           {
3885             ar->type = AR_SECTION;
3886             break;
3887           }
3888     }
3889
3890   if (!ar->as->cray_pointee && compare_spec_to_ref (ar) == FAILURE)
3891     return FAILURE;
3892
3893   return SUCCESS;
3894 }
3895
3896
3897 static gfc_try
3898 resolve_substring (gfc_ref *ref)
3899 {
3900   int k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
3901
3902   if (ref->u.ss.start != NULL)
3903     {
3904       if (gfc_resolve_expr (ref->u.ss.start) == FAILURE)
3905         return FAILURE;
3906
3907       if (ref->u.ss.start->ts.type != BT_INTEGER)
3908         {
3909           gfc_error ("Substring start index at %L must be of type INTEGER",
3910                      &ref->u.ss.start->where);
3911           return FAILURE;
3912         }
3913
3914       if (ref->u.ss.start->rank != 0)
3915         {
3916           gfc_error ("Substring start index at %L must be scalar",
3917                      &ref->u.ss.start->where);
3918           return FAILURE;
3919         }
3920
3921       if (compare_bound_int (ref->u.ss.start, 1) == CMP_LT
3922           && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
3923               || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
3924         {
3925           gfc_error ("Substring start index at %L is less than one",
3926                      &ref->u.ss.start->where);
3927           return FAILURE;
3928         }
3929     }
3930
3931   if (ref->u.ss.end != NULL)
3932     {
3933       if (gfc_resolve_expr (ref->u.ss.end) == FAILURE)
3934         return FAILURE;
3935
3936       if (ref->u.ss.end->ts.type != BT_INTEGER)
3937         {
3938           gfc_error ("Substring end index at %L must be of type INTEGER",
3939                      &ref->u.ss.end->where);
3940           return FAILURE;
3941         }
3942
3943       if (ref->u.ss.end->rank != 0)
3944         {
3945           gfc_error ("Substring end index at %L must be scalar",
3946                      &ref->u.ss.end->where);
3947           return FAILURE;
3948         }
3949
3950       if (ref->u.ss.length != NULL
3951           && compare_bound (ref->u.ss.end, ref->u.ss.length->length) == CMP_GT
3952           && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
3953               || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
3954         {
3955           gfc_error ("Substring end index at %L exceeds the string length",
3956                      &ref->u.ss.start->where);
3957           return FAILURE;
3958         }
3959
3960       if (compare_bound_mpz_t (ref->u.ss.end,
3961                                gfc_integer_kinds[k].huge) == CMP_GT
3962           && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
3963               || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
3964         {
3965           gfc_error ("Substring end index at %L is too large",
3966                      &ref->u.ss.end->where);
3967           return FAILURE;
3968         }
3969     }
3970
3971   return SUCCESS;
3972 }
3973
3974
3975 /* This function supplies missing substring charlens.  */
3976
3977 void
3978 gfc_resolve_substring_charlen (gfc_expr *e)
3979 {
3980   gfc_ref *char_ref;
3981   gfc_expr *start, *end;
3982
3983   for (char_ref = e->ref; char_ref; char_ref = char_ref->next)
3984     if (char_ref->type == REF_SUBSTRING)
3985       break;
3986
3987   if (!char_ref)
3988     return;
3989
3990   gcc_assert (char_ref->next == NULL);
3991
3992   if (e->ts.cl)
3993     {
3994       if (e->ts.cl->length)
3995         gfc_free_expr (e->ts.cl->length);
3996       else if (e->expr_type == EXPR_VARIABLE
3997                  && e->symtree->n.sym->attr.dummy)
3998         return;
3999     }
4000
4001   e->ts.type = BT_CHARACTER;
4002   e->ts.kind = gfc_default_character_kind;
4003
4004   if (!e->ts.cl)
4005     {
4006       e->ts.cl = gfc_get_charlen ();
4007       e->ts.cl->next = gfc_current_ns->cl_list;
4008       gfc_current_ns->cl_list = e->ts.cl;
4009     }
4010
4011   if (char_ref->u.ss.start)
4012     start = gfc_copy_expr (char_ref->u.ss.start);
4013   else
4014     start = gfc_int_expr (1);
4015
4016   if (char_ref->u.ss.end)
4017     end = gfc_copy_expr (char_ref->u.ss.end);
4018   else if (e->expr_type == EXPR_VARIABLE)
4019     end = gfc_copy_expr (e->symtree->n.sym->ts.cl->length);
4020   else
4021     end = NULL;
4022
4023   if (!start || !end)
4024     return;
4025
4026   /* Length = (end - start +1).  */
4027   e->ts.cl->length = gfc_subtract (end, start);
4028   e->ts.cl->length = gfc_add (e->ts.cl->length, gfc_int_expr (1));
4029
4030   e->ts.cl->length->ts.type = BT_INTEGER;
4031   e->ts.cl->length->ts.kind = gfc_charlen_int_kind;
4032
4033   /* Make sure that the length is simplified.  */
4034   gfc_simplify_expr (e->ts.cl->length, 1);
4035   gfc_resolve_expr (e->ts.cl->length);
4036 }
4037
4038
4039 /* Resolve subtype references.  */
4040
4041 static gfc_try
4042 resolve_ref (gfc_expr *expr)
4043 {
4044   int current_part_dimension, n_components, seen_part_dimension;
4045   gfc_ref *ref;
4046
4047   for (ref = expr->ref; ref; ref = ref->next)
4048     if (ref->type == REF_ARRAY && ref->u.ar.as == NULL)
4049       {
4050         find_array_spec (expr);
4051         break;
4052       }
4053
4054   for (ref = expr->ref; ref; ref = ref->next)
4055     switch (ref->type)
4056       {
4057       case REF_ARRAY:
4058         if (resolve_array_ref (&ref->u.ar) == FAILURE)
4059           return FAILURE;
4060         break;
4061
4062       case REF_COMPONENT:
4063         break;
4064
4065       case REF_SUBSTRING:
4066         resolve_substring (ref);
4067         break;
4068       }
4069
4070   /* Check constraints on part references.  */
4071
4072   current_part_dimension = 0;
4073   seen_part_dimension = 0;
4074   n_components = 0;
4075
4076   for (ref = expr->ref; ref; ref = ref->next)
4077     {
4078       switch (ref->type)
4079         {
4080         case REF_ARRAY:
4081           switch (ref->u.ar.type)
4082             {
4083             case AR_FULL:
4084             case AR_SECTION:
4085               current_part_dimension = 1;
4086               break;
4087
4088             case AR_ELEMENT:
4089               current_part_dimension = 0;
4090               break;
4091
4092             case AR_UNKNOWN:
4093               gfc_internal_error ("resolve_ref(): Bad array reference");
4094             }
4095
4096           break;
4097
4098         case REF_COMPONENT:
4099           if (current_part_dimension || seen_part_dimension)
4100             {
4101               if (ref->u.c.component->attr.pointer)
4102                 {
4103                   gfc_error ("Component to the right of a part reference "
4104                              "with nonzero rank must not have the POINTER "
4105                              "attribute at %L", &expr->where);
4106                   return FAILURE;
4107                 }
4108               else if (ref->u.c.component->attr.allocatable)
4109                 {
4110                   gfc_error ("Component to the right of a part reference "
4111                              "with nonzero rank must not have the ALLOCATABLE "
4112                              "attribute at %L", &expr->where);
4113                   return FAILURE;
4114                 }
4115             }
4116
4117           n_components++;
4118           break;
4119
4120         case REF_SUBSTRING:
4121           break;
4122         }
4123
4124       if (((ref->type == REF_COMPONENT && n_components > 1)
4125            || ref->next == NULL)
4126           && current_part_dimension
4127           && seen_part_dimension)
4128         {
4129           gfc_error ("Two or more part references with nonzero rank must "
4130                      "not be specified at %L", &expr->where);
4131           return FAILURE;
4132         }
4133
4134       if (ref->type == REF_COMPONENT)
4135         {
4136           if (current_part_dimension)
4137             seen_part_dimension = 1;
4138
4139           /* reset to make sure */
4140           current_part_dimension = 0;
4141         }
4142     }
4143
4144   return SUCCESS;
4145 }
4146
4147
4148 /* Given an expression, determine its shape.  This is easier than it sounds.
4149    Leaves the shape array NULL if it is not possible to determine the shape.  */
4150
4151 static void
4152 expression_shape (gfc_expr *e)
4153 {
4154   mpz_t array[GFC_MAX_DIMENSIONS];
4155   int i;
4156
4157   if (e->rank == 0 || e->shape != NULL)
4158     return;
4159
4160   for (i = 0; i < e->rank; i++)
4161     if (gfc_array_dimen_size (e, i, &array[i]) == FAILURE)
4162       goto fail;
4163
4164   e->shape = gfc_get_shape (e->rank);
4165
4166   memcpy (e->shape, array, e->rank * sizeof (mpz_t));
4167
4168   return;
4169
4170 fail:
4171   for (i--; i >= 0; i--)
4172     mpz_clear (array[i]);
4173 }
4174
4175
4176 /* Given a variable expression node, compute the rank of the expression by
4177    examining the base symbol and any reference structures it may have.  */
4178
4179 static void
4180 expression_rank (gfc_expr *e)
4181 {
4182   gfc_ref *ref;
4183   int i, rank;
4184
4185   /* Just to make sure, because EXPR_COMPCALL's also have an e->ref and that
4186      could lead to serious confusion...  */
4187   gcc_assert (e->expr_type != EXPR_COMPCALL);
4188
4189   if (e->ref == NULL)
4190     {
4191       if (e->expr_type == EXPR_ARRAY)
4192         goto done;
4193       /* Constructors can have a rank different from one via RESHAPE().  */
4194
4195       if (e->symtree == NULL)
4196         {
4197           e->rank = 0;
4198           goto done;
4199         }
4200
4201       e->rank = (e->symtree->n.sym->as == NULL)
4202                 ? 0 : e->symtree->n.sym->as->rank;
4203       goto done;
4204     }
4205
4206   rank = 0;
4207
4208   for (ref = e->ref; ref; ref = ref->next)
4209     {
4210       if (ref->type != REF_ARRAY)
4211         continue;
4212
4213       if (ref->u.ar.type == AR_FULL)
4214         {
4215           rank = ref->u.ar.as->rank;
4216           break;
4217         }
4218
4219       if (ref->u.ar.type == AR_SECTION)
4220         {
4221           /* Figure out the rank of the section.  */
4222           if (rank != 0)
4223             gfc_internal_error ("expression_rank(): Two array specs");
4224
4225           for (i = 0; i < ref->u.ar.dimen; i++)
4226             if (ref->u.ar.dimen_type[i] == DIMEN_RANGE
4227                 || ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
4228               rank++;
4229
4230           break;
4231         }
4232     }
4233
4234   e->rank = rank;
4235
4236 done:
4237   expression_shape (e);
4238 }
4239
4240
4241 /* Resolve a variable expression.  */
4242
4243 static gfc_try
4244 resolve_variable (gfc_expr *e)
4245 {
4246   gfc_symbol *sym;
4247   gfc_try t;
4248
4249   t = SUCCESS;
4250
4251   if (e->symtree == NULL)
4252     return FAILURE;
4253
4254   if (e->ref && resolve_ref (e) == FAILURE)
4255     return FAILURE;
4256
4257   sym = e->symtree->n.sym;
4258   if (sym->attr.flavor == FL_PROCEDURE
4259       && (!sym->attr.function
4260           || (sym->attr.function && sym->result
4261               && sym->result->attr.proc_pointer
4262               && !sym->result->attr.function)))
4263     {
4264       e->ts.type = BT_PROCEDURE;
4265       goto resolve_procedure;
4266     }
4267
4268   if (sym->ts.type != BT_UNKNOWN)
4269     gfc_variable_attr (e, &e->ts);
4270   else
4271     {
4272       /* Must be a simple variable reference.  */
4273       if (gfc_set_default_type (sym, 1, sym->ns) == FAILURE)
4274         return FAILURE;
4275       e->ts = sym->ts;
4276     }
4277
4278   if (check_assumed_size_reference (sym, e))
4279     return FAILURE;
4280
4281   /* Deal with forward references to entries during resolve_code, to
4282      satisfy, at least partially, 12.5.2.5.  */
4283   if (gfc_current_ns->entries
4284       && current_entry_id == sym->entry_id
4285       && cs_base
4286       && cs_base->current
4287       && cs_base->current->op != EXEC_ENTRY)
4288     {
4289       gfc_entry_list *entry;
4290       gfc_formal_arglist *formal;
4291       int n;
4292       bool seen;
4293
4294       /* If the symbol is a dummy...  */
4295       if (sym->attr.dummy && sym->ns == gfc_current_ns)
4296         {
4297           entry = gfc_current_ns->entries;
4298           seen = false;
4299
4300           /* ...test if the symbol is a parameter of previous entries.  */
4301           for (; entry && entry->id <= current_entry_id; entry = entry->next)
4302             for (formal = entry->sym->formal; formal; formal = formal->next)
4303               {
4304                 if (formal->sym && sym->name == formal->sym->name)
4305                   seen = true;
4306               }
4307
4308           /*  If it has not been seen as a dummy, this is an error.  */
4309           if (!seen)
4310             {
4311               if (specification_expr)
4312                 gfc_error ("Variable '%s', used in a specification expression"
4313                            ", is referenced at %L before the ENTRY statement "
4314                            "in which it is a parameter",
4315                            sym->name, &cs_base->current->loc);
4316               else
4317                 gfc_error ("Variable '%s' is used at %L before the ENTRY "
4318                            "statement in which it is a parameter",
4319                            sym->name, &cs_base->current->loc);
4320               t = FAILURE;
4321             }
4322         }
4323
4324       /* Now do the same check on the specification expressions.  */
4325       specification_expr = 1;
4326       if (sym->ts.type == BT_CHARACTER
4327           && gfc_resolve_expr (sym->ts.cl->length) == FAILURE)
4328         t = FAILURE;
4329
4330       if (sym->as)
4331         for (n = 0; n < sym->as->rank; n++)
4332           {
4333              specification_expr = 1;
4334              if (gfc_resolve_expr (sym->as->lower[n]) == FAILURE)
4335                t = FAILURE;
4336              specification_expr = 1;
4337              if (gfc_resolve_expr (sym->as->upper[n]) == FAILURE)
4338                t = FAILURE;
4339           }
4340       specification_expr = 0;
4341
4342       if (t == SUCCESS)
4343         /* Update the symbol's entry level.  */
4344         sym->entry_id = current_entry_id + 1;
4345     }
4346
4347 resolve_procedure:
4348   if (t == SUCCESS && resolve_procedure_expression (e) == FAILURE)
4349     t = FAILURE;
4350
4351   return t;
4352 }
4353
4354
4355 /* Checks to see that the correct symbol has been host associated.
4356    The only situation where this arises is that in which a twice
4357    contained function is parsed after the host association is made.
4358    Therefore, on detecting this, change the symbol in the expression
4359    and convert the array reference into an actual arglist if the old
4360    symbol is a variable.  */
4361 static bool
4362 check_host_association (gfc_expr *e)
4363 {
4364   gfc_symbol *sym, *old_sym;
4365   gfc_symtree *st;
4366   int n;
4367   gfc_ref *ref;
4368   gfc_actual_arglist *arg, *tail = NULL;
4369   bool retval = e->expr_type == EXPR_FUNCTION;
4370
4371   /*  If the expression is the result of substitution in
4372       interface.c(gfc_extend_expr) because there is no way in
4373       which the host association can be wrong.  */
4374   if (e->symtree == NULL
4375         || e->symtree->n.sym == NULL
4376         || e->user_operator)
4377     return retval;
4378
4379   old_sym = e->symtree->n.sym;
4380
4381   if (gfc_current_ns->parent
4382         && old_sym->ns != gfc_current_ns)
4383     {
4384       /* Use the 'USE' name so that renamed module symbols are
4385          correctly handled.  */
4386       gfc_find_symbol (e->symtree->name, gfc_current_ns, 1, &sym);
4387
4388       if (sym && old_sym != sym
4389               && sym->ts.type == old_sym->ts.type
4390               && sym->attr.flavor == FL_PROCEDURE
4391               && sym->attr.contained)
4392         {
4393           /* Clear the shape, since it might not be valid.  */
4394           if (e->shape != NULL)
4395             {
4396               for (n = 0; n < e->rank; n++)
4397                 mpz_clear (e->shape[n]);
4398
4399               gfc_free (e->shape);
4400             }
4401
4402           /* Give the symbol a symtree in the right place!  */
4403           gfc_get_sym_tree (sym->name, gfc_current_ns, &st);
4404           st->n.sym = sym;
4405
4406           if (old_sym->attr.flavor == FL_PROCEDURE)
4407             {
4408               /* Original was function so point to the new symbol, since
4409                  the actual argument list is already attached to the
4410                  expression. */
4411               e->value.function.esym = NULL;
4412               e->symtree = st;
4413             }
4414           else
4415             {
4416               /* Original was variable so convert array references into
4417                  an actual arglist. This does not need any checking now
4418                  since gfc_resolve_function will take care of it.  */
4419               e->value.function.actual = NULL;
4420               e->expr_type = EXPR_FUNCTION;
4421               e->symtree = st;
4422
4423               /* Ambiguity will not arise if the array reference is not
4424                  the last reference.  */
4425               for (ref = e->ref; ref; ref = ref->next)
4426                 if (ref->type == REF_ARRAY && ref->next == NULL)
4427                   break;
4428
4429               gcc_assert (ref->type == REF_ARRAY);
4430
4431               /* Grab the start expressions from the array ref and
4432                  copy them into actual arguments.  */
4433               for (n = 0; n < ref->u.ar.dimen; n++)
4434                 {
4435                   arg = gfc_get_actual_arglist ();
4436                   arg->expr = gfc_copy_expr (ref->u.ar.start[n]);
4437                   if (e->value.function.actual == NULL)
4438                     tail = e->value.function.actual = arg;
4439                   else
4440                     {
4441                       tail->next = arg;
4442                       tail = arg;
4443                     }
4444                 }
4445
4446               /* Dump the reference list and set the rank.  */
4447               gfc_free_ref_list (e->ref);
4448               e->ref = NULL;
4449               e->rank = sym->as ? sym->as->rank : 0;
4450             }
4451
4452           gfc_resolve_expr (e);
4453           sym->refs++;
4454         }
4455     }
4456   /* This might have changed!  */
4457   return e->expr_type == EXPR_FUNCTION;
4458 }
4459
4460
4461 static void
4462 gfc_resolve_character_operator (gfc_expr *e)
4463 {
4464   gfc_expr *op1 = e->value.op.op1;
4465   gfc_expr *op2 = e->value.op.op2;
4466   gfc_expr *e1 = NULL;
4467   gfc_expr *e2 = NULL;
4468
4469   gcc_assert (e->value.op.op == INTRINSIC_CONCAT);
4470
4471   if (op1->ts.cl && op1->ts.cl->length)
4472     e1 = gfc_copy_expr (op1->ts.cl->length);
4473   else if (op1->expr_type == EXPR_CONSTANT)
4474     e1 = gfc_int_expr (op1->value.character.length);
4475
4476   if (op2->ts.cl && op2->ts.cl->length)
4477     e2 = gfc_copy_expr (op2->ts.cl->length);
4478   else if (op2->expr_type == EXPR_CONSTANT)
4479     e2 = gfc_int_expr (op2->value.character.length);
4480
4481   e->ts.cl = gfc_get_charlen ();
4482   e->ts.cl->next = gfc_current_ns->cl_list;
4483   gfc_current_ns->cl_list = e->ts.cl;
4484
4485   if (!e1 || !e2)
4486     return;
4487
4488   e->ts.cl->length = gfc_add (e1, e2);
4489   e->ts.cl->length->ts.type = BT_INTEGER;
4490   e->ts.cl->length->ts.kind = gfc_charlen_int_kind;
4491   gfc_simplify_expr (e->ts.cl->length, 0);
4492   gfc_resolve_expr (e->ts.cl->length);
4493
4494   return;
4495 }
4496
4497
4498 /*  Ensure that an character expression has a charlen and, if possible, a
4499     length expression.  */
4500
4501 static void
4502 fixup_charlen (gfc_expr *e)
4503 {
4504   /* The cases fall through so that changes in expression type and the need
4505      for multiple fixes are picked up.  In all circumstances, a charlen should
4506      be available for the middle end to hang a backend_decl on.  */
4507   switch (e->expr_type)
4508     {
4509     case EXPR_OP:
4510       gfc_resolve_character_operator (e);
4511
4512     case EXPR_ARRAY:
4513       if (e->expr_type == EXPR_ARRAY)
4514         gfc_resolve_character_array_constructor (e);
4515
4516     case EXPR_SUBSTRING:
4517       if (!e->ts.cl && e->ref)
4518         gfc_resolve_substring_charlen (e);
4519
4520     default:
4521       if (!e->ts.cl)
4522         {
4523           e->ts.cl = gfc_get_charlen ();
4524           e->ts.cl->next = gfc_current_ns->cl_list;
4525           gfc_current_ns->cl_list = e->ts.cl;
4526         }
4527
4528       break;
4529     }
4530 }
4531
4532
4533 /* Update an actual argument to include the passed-object for type-bound
4534    procedures at the right position.  */
4535
4536 static gfc_actual_arglist*
4537 update_arglist_pass (gfc_actual_arglist* lst, gfc_expr* po, unsigned argpos)
4538 {
4539   gcc_assert (argpos > 0);
4540
4541   if (argpos == 1)
4542     {
4543       gfc_actual_arglist* result;
4544
4545       result = gfc_get_actual_arglist ();
4546       result->expr = po;
4547       result->next = lst;
4548
4549       return result;
4550     }
4551
4552   gcc_assert (lst);
4553   gcc_assert (argpos > 1);
4554
4555   lst->next = update_arglist_pass (lst->next, po, argpos - 1);
4556   return lst;
4557 }
4558
4559
4560 /* Extract the passed-object from an EXPR_COMPCALL (a copy of it).  */
4561
4562 static gfc_expr*
4563 extract_compcall_passed_object (gfc_expr* e)
4564 {
4565   gfc_expr* po;
4566
4567   gcc_assert (e->expr_type == EXPR_COMPCALL);
4568
4569   po = gfc_get_expr ();
4570   po->expr_type = EXPR_VARIABLE;
4571   po->symtree = e->symtree;
4572   po->ref = gfc_copy_ref (e->ref);
4573
4574   if (gfc_resolve_expr (po) == FAILURE)
4575     return NULL;
4576
4577   return po;
4578 }
4579
4580
4581 /* Update the arglist of an EXPR_COMPCALL expression to include the
4582    passed-object.  */
4583
4584 static gfc_try
4585 update_compcall_arglist (gfc_expr* e)
4586 {
4587   gfc_expr* po;
4588   gfc_typebound_proc* tbp;
4589
4590   tbp = e->value.compcall.tbp;
4591
4592   if (tbp->error)
4593     return FAILURE;
4594
4595   po = extract_compcall_passed_object (e);
4596   if (!po)
4597     return FAILURE;
4598
4599   if (po->rank > 0)
4600     {
4601       gfc_error ("Passed-object at %L must be scalar", &e->where);
4602       return FAILURE;
4603     }
4604
4605   if (tbp->nopass)
4606     {
4607       gfc_free_expr (po);
4608       return SUCCESS;
4609     }
4610
4611   gcc_assert (tbp->pass_arg_num > 0);
4612   e->value.compcall.actual = update_arglist_pass (e->value.compcall.actual, po,
4613                                                   tbp->pass_arg_num);
4614
4615   return SUCCESS;
4616 }
4617
4618
4619 /* Check that the object a TBP is called on is valid, i.e. it must not be
4620    of ABSTRACT type (as in subobject%abstract_parent%tbp()).  */
4621
4622 static gfc_try
4623 check_typebound_baseobject (gfc_expr* e)
4624 {
4625   gfc_expr* base;
4626
4627   base = extract_compcall_passed_object (e);
4628   if (!base)
4629     return FAILURE;
4630
4631   gcc_assert (base->ts.type == BT_DERIVED);
4632   if (base->ts.derived->attr.abstract)
4633     {
4634       gfc_error ("Base object for type-bound procedure call at %L is of"
4635                  " ABSTRACT type '%s'", &e->where, base->ts.derived->name);
4636       return FAILURE;
4637     }
4638
4639   return SUCCESS;
4640 }
4641
4642
4643 /* Resolve a call to a type-bound procedure, either function or subroutine,
4644    statically from the data in an EXPR_COMPCALL expression.  The adapted
4645    arglist and the target-procedure symtree are returned.  */
4646
4647 static gfc_try
4648 resolve_typebound_static (gfc_expr* e, gfc_symtree** target,
4649                           gfc_actual_arglist** actual)
4650 {
4651   gcc_assert (e->expr_type == EXPR_COMPCALL);
4652   gcc_assert (!e->value.compcall.tbp->is_generic);
4653
4654   /* Update the actual arglist for PASS.  */
4655   if (update_compcall_arglist (e) == FAILURE)
4656     return FAILURE;
4657
4658   *actual = e->value.compcall.actual;
4659   *target = e->value.compcall.tbp->u.specific;
4660
4661   gfc_free_ref_list (e->ref);
4662   e->ref = NULL;
4663   e->value.compcall.actual = NULL;
4664
4665   return SUCCESS;
4666 }
4667
4668
4669 /* Given an EXPR_COMPCALL calling a GENERIC typebound procedure, figure out
4670    which of the specific bindings (if any) matches the arglist and transform
4671    the expression into a call of that binding.  */
4672
4673 static gfc_try
4674 resolve_typebound_generic_call (gfc_expr* e)
4675 {
4676   gfc_typebound_proc* genproc;
4677   const char* genname;
4678
4679   gcc_assert (e->expr_type == EXPR_COMPCALL);
4680   genname = e->value.compcall.name;
4681   genproc = e->value.compcall.tbp;
4682
4683   if (!genproc->is_generic)
4684     return SUCCESS;
4685
4686   /* Try the bindings on this type and in the inheritance hierarchy.  */
4687   for (; genproc; genproc = genproc->overridden)
4688     {
4689       gfc_tbp_generic* g;
4690
4691       gcc_assert (genproc->is_generic);
4692       for (g = genproc->u.generic; g; g = g->next)
4693         {
4694           gfc_symbol* target;
4695           gfc_actual_arglist* args;
4696           bool matches;
4697
4698           gcc_assert (g->specific);
4699
4700           if (g->specific->error)
4701             continue;
4702
4703           target = g->specific->u.specific->n.sym;
4704
4705           /* Get the right arglist by handling PASS/NOPASS.  */
4706           args = gfc_copy_actual_arglist (e->value.compcall.actual);
4707           if (!g->specific->nopass)
4708             {
4709               gfc_expr* po;
4710               po = extract_compcall_passed_object (e);
4711               if (!po)
4712                 return FAILURE;
4713
4714               gcc_assert (g->specific->pass_arg_num > 0);
4715               gcc_assert (!g->specific->error);
4716               args = update_arglist_pass (args, po, g->specific->pass_arg_num);
4717             }
4718           resolve_actual_arglist (args, target->attr.proc,
4719                                   is_external_proc (target) && !target->formal);
4720
4721           /* Check if this arglist matches the formal.  */
4722           matches = gfc_arglist_matches_symbol (&args, target);
4723
4724           /* Clean up and break out of the loop if we've found it.  */
4725           gfc_free_actual_arglist (args);
4726           if (matches)
4727             {
4728               e->value.compcall.tbp = g->specific;
4729               goto success;
4730             }
4731         }
4732     }
4733
4734   /* Nothing matching found!  */
4735   gfc_error ("Found no matching specific binding for the call to the GENERIC"
4736              " '%s' at %L", genname, &e->where);
4737   return FAILURE;
4738
4739 success:
4740   return SUCCESS;
4741 }
4742
4743
4744 /* Resolve a call to a type-bound subroutine.  */
4745
4746 static gfc_try
4747 resolve_typebound_call (gfc_code* c)
4748 {
4749   gfc_actual_arglist* newactual;
4750   gfc_symtree* target;
4751
4752   /* Check that's really a SUBROUTINE.  */
4753   if (!c->expr1->value.compcall.tbp->subroutine)
4754     {
4755       gfc_error ("'%s' at %L should be a SUBROUTINE",
4756                  c->expr1->value.compcall.name, &c->loc);
4757       return FAILURE;
4758     }
4759
4760   if (check_typebound_baseobject (c->expr1) == FAILURE)
4761     return FAILURE;
4762
4763   if (resolve_typebound_generic_call (c->expr1) == FAILURE)
4764     return FAILURE;
4765
4766   /* Transform into an ordinary EXEC_CALL for now.  */
4767
4768   if (resolve_typebound_static (c->expr1, &target, &newactual) == FAILURE)
4769     return FAILURE;
4770
4771   c->ext.actual = newactual;
4772   c->symtree = target;
4773   c->op = EXEC_CALL;
4774
4775   gcc_assert (!c->expr1->ref && !c->expr1->value.compcall.actual);
4776   gfc_free_expr (c->expr1);
4777   c->expr1 = NULL;
4778
4779   return resolve_call (c);
4780 }
4781
4782
4783 /* Resolve a component-call expression.  */
4784
4785 static gfc_try
4786 resolve_compcall (gfc_expr* e)
4787 {
4788   gfc_actual_arglist* newactual;
4789   gfc_symtree* target;
4790
4791   /* Check that's really a FUNCTION.  */
4792   if (!e->value.compcall.tbp->function)
4793     {
4794       gfc_error ("'%s' at %L should be a FUNCTION",
4795                  e->value.compcall.name, &e->where);
4796       return FAILURE;
4797     }
4798
4799   if (check_typebound_baseobject (e) == FAILURE)
4800     return FAILURE;
4801
4802   if (resolve_typebound_generic_call (e) == FAILURE)
4803     return FAILURE;
4804   gcc_assert (!e->value.compcall.tbp->is_generic);
4805
4806   /* Take the rank from the function's symbol.  */
4807   if (e->value.compcall.tbp->u.specific->n.sym->as)
4808     e->rank = e->value.compcall.tbp->u.specific->n.sym->as->rank;
4809
4810   /* For now, we simply transform it into an EXPR_FUNCTION call with the same
4811      arglist to the TBP's binding target.  */
4812
4813   if (resolve_typebound_static (e, &target, &newactual) == FAILURE)
4814     return FAILURE;
4815
4816   e->value.function.actual = newactual;
4817   e->value.function.name = e->value.compcall.name;
4818   e->value.function.isym = NULL;
4819   e->value.function.esym = NULL;
4820   e->symtree = target;
4821   e->ts = target->n.sym->ts;
4822   e->expr_type = EXPR_FUNCTION;
4823
4824   return gfc_resolve_expr (e);
4825 }
4826
4827
4828 /* Resolve a CALL to a Procedure Pointer Component (Subroutine).  */
4829
4830 static gfc_try
4831 resolve_ppc_call (gfc_code* c)
4832 {
4833   gfc_component *comp;
4834   gcc_assert (is_proc_ptr_comp (c->expr1, &comp));
4835
4836   c->resolved_sym = c->expr1->symtree->n.sym;
4837   c->expr1->expr_type = EXPR_VARIABLE;
4838   c->ext.actual = c->expr1->value.compcall.actual;
4839
4840   if (!comp->attr.subroutine)
4841     gfc_add_subroutine (&comp->attr, comp->name, &c->expr1->where);
4842
4843   if (resolve_ref (c->expr1) == FAILURE)
4844     return FAILURE;
4845
4846   if (resolve_actual_arglist (c->ext.actual, comp->attr.proc,
4847                               comp->formal == NULL) == FAILURE)
4848     return FAILURE;
4849
4850   /* TODO: Check actual arguments.
4851      gfc_procedure_use (stree->n.sym, &c->expr1->value.compcall.actual,
4852                         &c->expr1->where);*/
4853
4854   return SUCCESS;
4855 }
4856
4857
4858 /* Resolve a Function Call to a Procedure Pointer Component (Function).  */
4859
4860 static gfc_try
4861 resolve_expr_ppc (gfc_expr* e)
4862 {
4863   gfc_component *comp;
4864   gcc_assert (is_proc_ptr_comp (e, &comp));
4865
4866   /* Convert to EXPR_FUNCTION.  */
4867   e->expr_type = EXPR_FUNCTION;
4868   e->value.function.isym = NULL;
4869   e->value.function.actual = e->value.compcall.actual;
4870   e->ts = comp->ts;
4871
4872   if (!comp->attr.function)
4873     gfc_add_function (&comp->attr, comp->name, &e->where);
4874
4875   if (resolve_ref (e) == FAILURE)
4876     return FAILURE;
4877
4878   if (resolve_actual_arglist (e->value.function.actual, comp->attr.proc,
4879                               comp->formal == NULL) == FAILURE)
4880     return FAILURE;
4881
4882   /* TODO: Check actual arguments.
4883      gfc_procedure_use (stree->n.sym, &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) == 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       mpfr_init (init_expr->value.complex.r);
7612       mpfr_init (init_expr->value.complex.i);
7613       switch (gfc_option.flag_init_real)
7614         {
7615         case GFC_INIT_REAL_SNAN:
7616           init_expr->is_snan = 1;
7617           /* Fall through.  */
7618         case GFC_INIT_REAL_NAN:
7619           mpfr_set_nan (init_expr->value.complex.r);
7620           mpfr_set_nan (init_expr->value.complex.i);
7621           break;
7622
7623         case GFC_INIT_REAL_INF:
7624           mpfr_set_inf (init_expr->value.complex.r, 1);
7625           mpfr_set_inf (init_expr->value.complex.i, 1);
7626           break;
7627
7628         case GFC_INIT_REAL_NEG_INF:
7629           mpfr_set_inf (init_expr->value.complex.r, -1);
7630           mpfr_set_inf (init_expr->value.complex.i, -1);
7631           break;
7632
7633         case GFC_INIT_REAL_ZERO:
7634           mpfr_set_ui (init_expr->value.complex.r, 0.0, GFC_RND_MODE);
7635           mpfr_set_ui (init_expr->value.complex.i, 0.0, GFC_RND_MODE);
7636           break;
7637
7638         default:
7639           gfc_free_expr (init_expr);
7640           init_expr = NULL;
7641           break;
7642         }
7643       break;
7644           
7645     case BT_LOGICAL:
7646       if (gfc_option.flag_init_logical == GFC_INIT_LOGICAL_FALSE)
7647         init_expr->value.logical = 0;
7648       else if (gfc_option.flag_init_logical == GFC_INIT_LOGICAL_TRUE)
7649         init_expr->value.logical = 1;
7650       else
7651         {
7652           gfc_free_expr (init_expr);
7653           init_expr = NULL;
7654         }
7655       break;
7656           
7657     case BT_CHARACTER:
7658       /* For characters, the length must be constant in order to 
7659          create a default initializer.  */
7660       if (gfc_option.flag_init_character == GFC_INIT_CHARACTER_ON
7661           && sym->ts.cl->length
7662           && sym->ts.cl->length->expr_type == EXPR_CONSTANT)
7663         {
7664           char_len = mpz_get_si (sym->ts.cl->length->value.integer);
7665           init_expr->value.character.length = char_len;
7666           init_expr->value.character.string = gfc_get_wide_string (char_len+1);
7667           for (i = 0; i < char_len; i++)
7668             init_expr->value.character.string[i]
7669               = (unsigned char) gfc_option.flag_init_character_value;
7670         }
7671       else
7672         {
7673           gfc_free_expr (init_expr);
7674           init_expr = NULL;
7675         }
7676       break;
7677           
7678     default:
7679      gfc_free_expr (init_expr);
7680      init_expr = NULL;
7681     }
7682   return init_expr;
7683 }
7684
7685 /* Add an initialization expression to a local variable.  */
7686 static void
7687 apply_default_init_local (gfc_symbol *sym)
7688 {
7689   gfc_expr *init = NULL;
7690
7691   /* The symbol should be a variable or a function return value.  */
7692   if ((sym->attr.flavor != FL_VARIABLE && !sym->attr.function)
7693       || (sym->attr.function && sym->result != sym))
7694     return;
7695
7696   /* Try to build the initializer expression.  If we can't initialize
7697      this symbol, then init will be NULL.  */
7698   init = build_default_init_expr (sym);
7699   if (init == NULL)
7700     return;
7701
7702   /* For saved variables, we don't want to add an initializer at 
7703      function entry, so we just add a static initializer.  */
7704   if (sym->attr.save || sym->ns->save_all)
7705     {
7706       /* Don't clobber an existing initializer!  */
7707       gcc_assert (sym->value == NULL);
7708       sym->value = init;
7709       return;
7710     }
7711
7712   build_init_assign (sym, init);
7713 }
7714
7715 /* Resolution of common features of flavors variable and procedure.  */
7716
7717 static gfc_try
7718 resolve_fl_var_and_proc (gfc_symbol *sym, int mp_flag)
7719 {
7720   /* Constraints on deferred shape variable.  */
7721   if (sym->as == NULL || sym->as->type != AS_DEFERRED)
7722     {
7723       if (sym->attr.allocatable)
7724         {
7725           if (sym->attr.dimension)
7726             gfc_error ("Allocatable array '%s' at %L must have "
7727                        "a deferred shape", sym->name, &sym->declared_at);
7728           else
7729             gfc_error ("Scalar object '%s' at %L may not be ALLOCATABLE",
7730                        sym->name, &sym->declared_at);
7731             return FAILURE;
7732         }
7733
7734       if (sym->attr.pointer && sym->attr.dimension)
7735         {
7736           gfc_error ("Array pointer '%s' at %L must have a deferred shape",
7737                      sym->name, &sym->declared_at);
7738           return FAILURE;
7739         }
7740
7741     }
7742   else
7743     {
7744       if (!mp_flag && !sym->attr.allocatable
7745           && !sym->attr.pointer && !sym->attr.dummy)
7746         {
7747           gfc_error ("Array '%s' at %L cannot have a deferred shape",
7748                      sym->name, &sym->declared_at);
7749           return FAILURE;
7750          }
7751     }
7752   return SUCCESS;
7753 }
7754
7755
7756 /* Additional checks for symbols with flavor variable and derived
7757    type.  To be called from resolve_fl_variable.  */
7758
7759 static gfc_try
7760 resolve_fl_variable_derived (gfc_symbol *sym, int no_init_flag)
7761 {
7762   gcc_assert (sym->ts.type == BT_DERIVED);
7763
7764   /* Check to see if a derived type is blocked from being host
7765      associated by the presence of another class I symbol in the same
7766      namespace.  14.6.1.3 of the standard and the discussion on
7767      comp.lang.fortran.  */
7768   if (sym->ns != sym->ts.derived->ns
7769       && sym->ns->proc_name->attr.if_source != IFSRC_IFBODY)
7770     {
7771       gfc_symbol *s;
7772       gfc_find_symbol (sym->ts.derived->name, sym->ns, 0, &s);
7773       if (s && s->attr.flavor != FL_DERIVED)
7774         {
7775           gfc_error ("The type '%s' cannot be host associated at %L "
7776                      "because it is blocked by an incompatible object "
7777                      "of the same name declared at %L",
7778                      sym->ts.derived->name, &sym->declared_at,
7779                      &s->declared_at);
7780           return FAILURE;
7781         }
7782     }
7783
7784   /* 4th constraint in section 11.3: "If an object of a type for which
7785      component-initialization is specified (R429) appears in the
7786      specification-part of a module and does not have the ALLOCATABLE
7787      or POINTER attribute, the object shall have the SAVE attribute."
7788
7789      The check for initializers is performed with
7790      has_default_initializer because gfc_default_initializer generates
7791      a hidden default for allocatable components.  */
7792   if (!(sym->value || no_init_flag) && sym->ns->proc_name
7793       && sym->ns->proc_name->attr.flavor == FL_MODULE
7794       && !sym->ns->save_all && !sym->attr.save
7795       && !sym->attr.pointer && !sym->attr.allocatable
7796       && has_default_initializer (sym->ts.derived))
7797     {
7798       gfc_error("Object '%s' at %L must have the SAVE attribute for "
7799                 "default initialization of a component",
7800                 sym->name, &sym->declared_at);
7801       return FAILURE;
7802     }
7803
7804   /* Assign default initializer.  */
7805   if (!(sym->value || sym->attr.pointer || sym->attr.allocatable)
7806       && (!no_init_flag || sym->attr.intent == INTENT_OUT))
7807     {
7808       sym->value = gfc_default_initializer (&sym->ts);
7809     }
7810
7811   return SUCCESS;
7812 }
7813
7814
7815 /* Resolve symbols with flavor variable.  */
7816
7817 static gfc_try
7818 resolve_fl_variable (gfc_symbol *sym, int mp_flag)
7819 {
7820   int no_init_flag, automatic_flag;
7821   gfc_expr *e;
7822   const char *auto_save_msg;
7823
7824   auto_save_msg = "Automatic object '%s' at %L cannot have the "
7825                   "SAVE attribute";
7826
7827   if (resolve_fl_var_and_proc (sym, mp_flag) == FAILURE)
7828     return FAILURE;
7829
7830   /* Set this flag to check that variables are parameters of all entries.
7831      This check is effected by the call to gfc_resolve_expr through
7832      is_non_constant_shape_array.  */
7833   specification_expr = 1;
7834
7835   if (sym->ns->proc_name
7836       && (sym->ns->proc_name->attr.flavor == FL_MODULE
7837           || sym->ns->proc_name->attr.is_main_program)
7838       && !sym->attr.use_assoc
7839       && !sym->attr.allocatable
7840       && !sym->attr.pointer
7841       && is_non_constant_shape_array (sym))
7842     {
7843       /* The shape of a main program or module array needs to be
7844          constant.  */
7845       gfc_error ("The module or main program array '%s' at %L must "
7846                  "have constant shape", sym->name, &sym->declared_at);
7847       specification_expr = 0;
7848       return FAILURE;
7849     }
7850
7851   if (sym->ts.type == BT_CHARACTER)
7852     {
7853       /* Make sure that character string variables with assumed length are
7854          dummy arguments.  */
7855       e = sym->ts.cl->length;
7856       if (e == NULL && !sym->attr.dummy && !sym->attr.result)
7857         {
7858           gfc_error ("Entity with assumed character length at %L must be a "
7859                      "dummy argument or a PARAMETER", &sym->declared_at);
7860           return FAILURE;
7861         }
7862
7863       if (e && sym->attr.save && !gfc_is_constant_expr (e))
7864         {
7865           gfc_error (auto_save_msg, sym->name, &sym->declared_at);
7866           return FAILURE;
7867         }
7868
7869       if (!gfc_is_constant_expr (e)
7870           && !(e->expr_type == EXPR_VARIABLE
7871                && e->symtree->n.sym->attr.flavor == FL_PARAMETER)
7872           && sym->ns->proc_name
7873           && (sym->ns->proc_name->attr.flavor == FL_MODULE
7874               || sym->ns->proc_name->attr.is_main_program)
7875           && !sym->attr.use_assoc)
7876         {
7877           gfc_error ("'%s' at %L must have constant character length "
7878                      "in this context", sym->name, &sym->declared_at);
7879           return FAILURE;
7880         }
7881     }
7882
7883   if (sym->value == NULL && sym->attr.referenced)
7884     apply_default_init_local (sym); /* Try to apply a default initialization.  */
7885
7886   /* Determine if the symbol may not have an initializer.  */
7887   no_init_flag = automatic_flag = 0;
7888   if (sym->attr.allocatable || sym->attr.external || sym->attr.dummy
7889       || sym->attr.intrinsic || sym->attr.result)
7890     no_init_flag = 1;
7891   else if (sym->attr.dimension && !sym->attr.pointer
7892            && is_non_constant_shape_array (sym))
7893     {
7894       no_init_flag = automatic_flag = 1;
7895
7896       /* Also, they must not have the SAVE attribute.
7897          SAVE_IMPLICIT is checked below.  */
7898       if (sym->attr.save == SAVE_EXPLICIT)
7899         {
7900           gfc_error (auto_save_msg, sym->name, &sym->declared_at);
7901           return FAILURE;
7902         }
7903     }
7904
7905   /* Ensure that any initializer is simplified.  */
7906   if (sym->value)
7907     gfc_simplify_expr (sym->value, 1);
7908
7909   /* Reject illegal initializers.  */
7910   if (!sym->mark && sym->value)
7911     {
7912       if (sym->attr.allocatable)
7913         gfc_error ("Allocatable '%s' at %L cannot have an initializer",
7914                    sym->name, &sym->declared_at);
7915       else if (sym->attr.external)
7916         gfc_error ("External '%s' at %L cannot have an initializer",
7917                    sym->name, &sym->declared_at);
7918       else if (sym->attr.dummy
7919         && !(sym->ts.type == BT_DERIVED && sym->attr.intent == INTENT_OUT))
7920         gfc_error ("Dummy '%s' at %L cannot have an initializer",
7921                    sym->name, &sym->declared_at);
7922       else if (sym->attr.intrinsic)
7923         gfc_error ("Intrinsic '%s' at %L cannot have an initializer",
7924                    sym->name, &sym->declared_at);
7925       else if (sym->attr.result)
7926         gfc_error ("Function result '%s' at %L cannot have an initializer",
7927                    sym->name, &sym->declared_at);
7928       else if (automatic_flag)
7929         gfc_error ("Automatic array '%s' at %L cannot have an initializer",
7930                    sym->name, &sym->declared_at);
7931       else
7932         goto no_init_error;
7933       return FAILURE;
7934     }
7935
7936 no_init_error:
7937   if (sym->ts.type == BT_DERIVED)
7938     return resolve_fl_variable_derived (sym, no_init_flag);
7939
7940   return SUCCESS;
7941 }
7942
7943
7944 /* Resolve a procedure.  */
7945
7946 static gfc_try
7947 resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
7948 {
7949   gfc_formal_arglist *arg;
7950
7951   if (sym->attr.ambiguous_interfaces && !sym->attr.referenced)
7952     gfc_warning ("Although not referenced, '%s' at %L has ambiguous "
7953                  "interfaces", sym->name, &sym->declared_at);
7954
7955   if (sym->attr.function
7956       && resolve_fl_var_and_proc (sym, mp_flag) == FAILURE)
7957     return FAILURE;
7958
7959   if (sym->ts.type == BT_CHARACTER)
7960     {
7961       gfc_charlen *cl = sym->ts.cl;
7962
7963       if (cl && cl->length && gfc_is_constant_expr (cl->length)
7964              && resolve_charlen (cl) == FAILURE)
7965         return FAILURE;
7966
7967       if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
7968         {
7969           if (sym->attr.proc == PROC_ST_FUNCTION)
7970             {
7971               gfc_error ("Character-valued statement function '%s' at %L must "
7972                          "have constant length", sym->name, &sym->declared_at);
7973               return FAILURE;
7974             }
7975
7976           if (sym->attr.external && sym->formal == NULL
7977               && cl && cl->length && cl->length->expr_type != EXPR_CONSTANT)
7978             {
7979               gfc_error ("Automatic character length function '%s' at %L must "
7980                          "have an explicit interface", sym->name,
7981                          &sym->declared_at);
7982               return FAILURE;
7983             }
7984         }
7985     }
7986
7987   /* Ensure that derived type for are not of a private type.  Internal
7988      module procedures are excluded by 2.2.3.3 - i.e., they are not
7989      externally accessible and can access all the objects accessible in
7990      the host.  */
7991   if (!(sym->ns->parent
7992         && sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
7993       && gfc_check_access(sym->attr.access, sym->ns->default_access))
7994     {
7995       gfc_interface *iface;
7996
7997       for (arg = sym->formal; arg; arg = arg->next)
7998         {
7999           if (arg->sym
8000               && arg->sym->ts.type == BT_DERIVED
8001               && !arg->sym->ts.derived->attr.use_assoc
8002               && !gfc_check_access (arg->sym->ts.derived->attr.access,
8003                                     arg->sym->ts.derived->ns->default_access)
8004               && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: '%s' is of a "
8005                                  "PRIVATE type and cannot be a dummy argument"
8006                                  " of '%s', which is PUBLIC at %L",
8007                                  arg->sym->name, sym->name, &sym->declared_at)
8008                  == FAILURE)
8009             {
8010               /* Stop this message from recurring.  */
8011               arg->sym->ts.derived->attr.access = ACCESS_PUBLIC;
8012               return FAILURE;
8013             }
8014         }
8015
8016       /* PUBLIC interfaces may expose PRIVATE procedures that take types
8017          PRIVATE to the containing module.  */
8018       for (iface = sym->generic; iface; iface = iface->next)
8019         {
8020           for (arg = iface->sym->formal; arg; arg = arg->next)
8021             {
8022               if (arg->sym
8023                   && arg->sym->ts.type == BT_DERIVED
8024                   && !arg->sym->ts.derived->attr.use_assoc
8025                   && !gfc_check_access (arg->sym->ts.derived->attr.access,
8026                                         arg->sym->ts.derived->ns->default_access)
8027                   && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Procedure "
8028                                      "'%s' in PUBLIC interface '%s' at %L "
8029                                      "takes dummy arguments of '%s' which is "
8030                                      "PRIVATE", iface->sym->name, sym->name,
8031                                      &iface->sym->declared_at,
8032                                      gfc_typename (&arg->sym->ts)) == FAILURE)
8033                 {
8034                   /* Stop this message from recurring.  */
8035                   arg->sym->ts.derived->attr.access = ACCESS_PUBLIC;
8036                   return FAILURE;
8037                 }
8038              }
8039         }
8040
8041       /* PUBLIC interfaces may expose PRIVATE procedures that take types
8042          PRIVATE to the containing module.  */
8043       for (iface = sym->generic; iface; iface = iface->next)
8044         {
8045           for (arg = iface->sym->formal; arg; arg = arg->next)
8046             {
8047               if (arg->sym
8048                   && arg->sym->ts.type == BT_DERIVED
8049                   && !arg->sym->ts.derived->attr.use_assoc
8050                   && !gfc_check_access (arg->sym->ts.derived->attr.access,
8051                                         arg->sym->ts.derived->ns->default_access)
8052                   && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Procedure "
8053                                      "'%s' in PUBLIC interface '%s' at %L "
8054                                      "takes dummy arguments of '%s' which is "
8055                                      "PRIVATE", iface->sym->name, sym->name,
8056                                      &iface->sym->declared_at,
8057                                      gfc_typename (&arg->sym->ts)) == FAILURE)
8058                 {
8059                   /* Stop this message from recurring.  */
8060                   arg->sym->ts.derived->attr.access = ACCESS_PUBLIC;
8061                   return FAILURE;
8062                 }
8063              }
8064         }
8065     }
8066
8067   if (sym->attr.function && sym->value && sym->attr.proc != PROC_ST_FUNCTION
8068       && !sym->attr.proc_pointer)
8069     {
8070       gfc_error ("Function '%s' at %L cannot have an initializer",
8071                  sym->name, &sym->declared_at);
8072       return FAILURE;
8073     }
8074
8075   /* An external symbol may not have an initializer because it is taken to be
8076      a procedure. Exception: Procedure Pointers.  */
8077   if (sym->attr.external && sym->value && !sym->attr.proc_pointer)
8078     {
8079       gfc_error ("External object '%s' at %L may not have an initializer",
8080                  sym->name, &sym->declared_at);
8081       return FAILURE;
8082     }
8083
8084   /* An elemental function is required to return a scalar 12.7.1  */
8085   if (sym->attr.elemental && sym->attr.function && sym->as)
8086     {
8087       gfc_error ("ELEMENTAL function '%s' at %L must have a scalar "
8088                  "result", sym->name, &sym->declared_at);
8089       /* Reset so that the error only occurs once.  */
8090       sym->attr.elemental = 0;
8091       return FAILURE;
8092     }
8093
8094   /* 5.1.1.5 of the Standard: A function name declared with an asterisk
8095      char-len-param shall not be array-valued, pointer-valued, recursive
8096      or pure.  ....snip... A character value of * may only be used in the
8097      following ways: (i) Dummy arg of procedure - dummy associates with
8098      actual length; (ii) To declare a named constant; or (iii) External
8099      function - but length must be declared in calling scoping unit.  */
8100   if (sym->attr.function
8101       && sym->ts.type == BT_CHARACTER
8102       && sym->ts.cl && sym->ts.cl->length == NULL)
8103     {
8104       if ((sym->as && sym->as->rank) || (sym->attr.pointer)
8105           || (sym->attr.recursive) || (sym->attr.pure))
8106         {
8107           if (sym->as && sym->as->rank)
8108             gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
8109                        "array-valued", sym->name, &sym->declared_at);
8110
8111           if (sym->attr.pointer)
8112             gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
8113                        "pointer-valued", sym->name, &sym->declared_at);
8114
8115           if (sym->attr.pure)
8116             gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
8117                        "pure", sym->name, &sym->declared_at);
8118
8119           if (sym->attr.recursive)
8120             gfc_error ("CHARACTER(*) function '%s' at %L cannot be "
8121                        "recursive", sym->name, &sym->declared_at);
8122
8123           return FAILURE;
8124         }
8125
8126       /* Appendix B.2 of the standard.  Contained functions give an
8127          error anyway.  Fixed-form is likely to be F77/legacy.  */
8128       if (!sym->attr.contained && gfc_current_form != FORM_FIXED)
8129         gfc_notify_std (GFC_STD_F95_OBS, "CHARACTER(*) function "
8130                         "'%s' at %L is obsolescent in fortran 95",
8131                         sym->name, &sym->declared_at);
8132     }
8133
8134   if (sym->attr.is_bind_c && sym->attr.is_c_interop != 1)
8135     {
8136       gfc_formal_arglist *curr_arg;
8137       int has_non_interop_arg = 0;
8138
8139       if (verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
8140                              sym->common_block) == FAILURE)
8141         {
8142           /* Clear these to prevent looking at them again if there was an
8143              error.  */
8144           sym->attr.is_bind_c = 0;
8145           sym->attr.is_c_interop = 0;
8146           sym->ts.is_c_interop = 0;
8147         }
8148       else
8149         {
8150           /* So far, no errors have been found.  */
8151           sym->attr.is_c_interop = 1;
8152           sym->ts.is_c_interop = 1;
8153         }
8154       
8155       curr_arg = sym->formal;
8156       while (curr_arg != NULL)
8157         {
8158           /* Skip implicitly typed dummy args here.  */
8159           if (curr_arg->sym->attr.implicit_type == 0)
8160             if (verify_c_interop_param (curr_arg->sym) == FAILURE)
8161               /* If something is found to fail, record the fact so we
8162                  can mark the symbol for the procedure as not being
8163                  BIND(C) to try and prevent multiple errors being
8164                  reported.  */
8165               has_non_interop_arg = 1;
8166           
8167           curr_arg = curr_arg->next;
8168         }
8169
8170       /* See if any of the arguments were not interoperable and if so, clear
8171          the procedure symbol to prevent duplicate error messages.  */
8172       if (has_non_interop_arg != 0)
8173         {
8174           sym->attr.is_c_interop = 0;
8175           sym->ts.is_c_interop = 0;
8176           sym->attr.is_bind_c = 0;
8177         }
8178     }
8179   
8180   if (!sym->attr.proc_pointer)
8181     {
8182       if (sym->attr.save == SAVE_EXPLICIT)
8183         {
8184           gfc_error ("PROCEDURE attribute conflicts with SAVE attribute "
8185                      "in '%s' at %L", sym->name, &sym->declared_at);
8186           return FAILURE;
8187         }
8188       if (sym->attr.intent)
8189         {
8190           gfc_error ("PROCEDURE attribute conflicts with INTENT attribute "
8191                      "in '%s' at %L", sym->name, &sym->declared_at);
8192           return FAILURE;
8193         }
8194       if (sym->attr.subroutine && sym->attr.result)
8195         {
8196           gfc_error ("PROCEDURE attribute conflicts with RESULT attribute "
8197                      "in '%s' at %L", sym->name, &sym->declared_at);
8198           return FAILURE;
8199         }
8200       if (sym->attr.external && sym->attr.function
8201           && ((sym->attr.if_source == IFSRC_DECL && !sym->attr.procedure)
8202               || sym->attr.contained))
8203         {
8204           gfc_error ("EXTERNAL attribute conflicts with FUNCTION attribute "
8205                      "in '%s' at %L", sym->name, &sym->declared_at);
8206           return FAILURE;
8207         }
8208       if (strcmp ("ppr@", sym->name) == 0)
8209         {
8210           gfc_error ("Procedure pointer result '%s' at %L "
8211                      "is missing the pointer attribute",
8212                      sym->ns->proc_name->name, &sym->declared_at);
8213           return FAILURE;
8214         }
8215     }
8216
8217   return SUCCESS;
8218 }
8219
8220
8221 /* Resolve a list of finalizer procedures.  That is, after they have hopefully
8222    been defined and we now know their defined arguments, check that they fulfill
8223    the requirements of the standard for procedures used as finalizers.  */
8224
8225 static gfc_try
8226 gfc_resolve_finalizers (gfc_symbol* derived)
8227 {
8228   gfc_finalizer* list;
8229   gfc_finalizer** prev_link; /* For removing wrong entries from the list.  */
8230   gfc_try result = SUCCESS;
8231   bool seen_scalar = false;
8232
8233   if (!derived->f2k_derived || !derived->f2k_derived->finalizers)
8234     return SUCCESS;
8235
8236   /* Walk over the list of finalizer-procedures, check them, and if any one
8237      does not fit in with the standard's definition, print an error and remove
8238      it from the list.  */
8239   prev_link = &derived->f2k_derived->finalizers;
8240   for (list = derived->f2k_derived->finalizers; list; list = *prev_link)
8241     {
8242       gfc_symbol* arg;
8243       gfc_finalizer* i;
8244       int my_rank;
8245
8246       /* Skip this finalizer if we already resolved it.  */
8247       if (list->proc_tree)
8248         {
8249           prev_link = &(list->next);
8250           continue;
8251         }
8252
8253       /* Check this exists and is a SUBROUTINE.  */
8254       if (!list->proc_sym->attr.subroutine)
8255         {
8256           gfc_error ("FINAL procedure '%s' at %L is not a SUBROUTINE",
8257                      list->proc_sym->name, &list->where);
8258           goto error;
8259         }
8260
8261       /* We should have exactly one argument.  */
8262       if (!list->proc_sym->formal || list->proc_sym->formal->next)
8263         {
8264           gfc_error ("FINAL procedure at %L must have exactly one argument",
8265                      &list->where);
8266           goto error;
8267         }
8268       arg = list->proc_sym->formal->sym;
8269
8270       /* This argument must be of our type.  */
8271       if (arg->ts.type != BT_DERIVED || arg->ts.derived != derived)
8272         {
8273           gfc_error ("Argument of FINAL procedure at %L must be of type '%s'",
8274                      &arg->declared_at, derived->name);
8275           goto error;
8276         }
8277
8278       /* It must neither be a pointer nor allocatable nor optional.  */
8279       if (arg->attr.pointer)
8280         {
8281           gfc_error ("Argument of FINAL procedure at %L must not be a POINTER",
8282                      &arg->declared_at);
8283           goto error;
8284         }
8285       if (arg->attr.allocatable)
8286         {
8287           gfc_error ("Argument of FINAL procedure at %L must not be"
8288                      " ALLOCATABLE", &arg->declared_at);
8289           goto error;
8290         }
8291       if (arg->attr.optional)
8292         {
8293           gfc_error ("Argument of FINAL procedure at %L must not be OPTIONAL",
8294                      &arg->declared_at);
8295           goto error;
8296         }
8297
8298       /* It must not be INTENT(OUT).  */
8299       if (arg->attr.intent == INTENT_OUT)
8300         {
8301           gfc_error ("Argument of FINAL procedure at %L must not be"
8302                      " INTENT(OUT)", &arg->declared_at);
8303           goto error;
8304         }
8305
8306       /* Warn if the procedure is non-scalar and not assumed shape.  */
8307       if (gfc_option.warn_surprising && arg->as && arg->as->rank > 0
8308           && arg->as->type != AS_ASSUMED_SHAPE)
8309         gfc_warning ("Non-scalar FINAL procedure at %L should have assumed"
8310                      " shape argument", &arg->declared_at);
8311
8312       /* Check that it does not match in kind and rank with a FINAL procedure
8313          defined earlier.  To really loop over the *earlier* declarations,
8314          we need to walk the tail of the list as new ones were pushed at the
8315          front.  */
8316       /* TODO: Handle kind parameters once they are implemented.  */
8317       my_rank = (arg->as ? arg->as->rank : 0);
8318       for (i = list->next; i; i = i->next)
8319         {
8320           /* Argument list might be empty; that is an error signalled earlier,
8321              but we nevertheless continued resolving.  */
8322           if (i->proc_sym->formal)
8323             {
8324               gfc_symbol* i_arg = i->proc_sym->formal->sym;
8325               const int i_rank = (i_arg->as ? i_arg->as->rank : 0);
8326               if (i_rank == my_rank)
8327                 {
8328                   gfc_error ("FINAL procedure '%s' declared at %L has the same"
8329                              " rank (%d) as '%s'",
8330                              list->proc_sym->name, &list->where, my_rank, 
8331                              i->proc_sym->name);
8332                   goto error;
8333                 }
8334             }
8335         }
8336
8337         /* Is this the/a scalar finalizer procedure?  */
8338         if (!arg->as || arg->as->rank == 0)
8339           seen_scalar = true;
8340
8341         /* Find the symtree for this procedure.  */
8342         gcc_assert (!list->proc_tree);
8343         list->proc_tree = gfc_find_sym_in_symtree (list->proc_sym);
8344
8345         prev_link = &list->next;
8346         continue;
8347
8348         /* Remove wrong nodes immediately from the list so we don't risk any
8349            troubles in the future when they might fail later expectations.  */
8350 error:
8351         result = FAILURE;
8352         i = list;
8353         *prev_link = list->next;
8354         gfc_free_finalizer (i);
8355     }
8356
8357   /* Warn if we haven't seen a scalar finalizer procedure (but we know there
8358      were nodes in the list, must have been for arrays.  It is surely a good
8359      idea to have a scalar version there if there's something to finalize.  */
8360   if (gfc_option.warn_surprising && result == SUCCESS && !seen_scalar)
8361     gfc_warning ("Only array FINAL procedures declared for derived type '%s'"
8362                  " defined at %L, suggest also scalar one",
8363                  derived->name, &derived->declared_at);
8364
8365   /* TODO:  Remove this error when finalization is finished.  */
8366   gfc_error ("Finalization at %L is not yet implemented",
8367              &derived->declared_at);
8368
8369   return result;
8370 }
8371
8372
8373 /* Check that it is ok for the typebound procedure proc to override the
8374    procedure old.  */
8375
8376 static gfc_try
8377 check_typebound_override (gfc_symtree* proc, gfc_symtree* old)
8378 {
8379   locus where;
8380   const gfc_symbol* proc_target;
8381   const gfc_symbol* old_target;
8382   unsigned proc_pass_arg, old_pass_arg, argpos;
8383   gfc_formal_arglist* proc_formal;
8384   gfc_formal_arglist* old_formal;
8385
8386   /* This procedure should only be called for non-GENERIC proc.  */
8387   gcc_assert (!proc->n.tb->is_generic);
8388
8389   /* If the overwritten procedure is GENERIC, this is an error.  */
8390   if (old->n.tb->is_generic)
8391     {
8392       gfc_error ("Can't overwrite GENERIC '%s' at %L",
8393                  old->name, &proc->n.tb->where);
8394       return FAILURE;
8395     }
8396
8397   where = proc->n.tb->where;
8398   proc_target = proc->n.tb->u.specific->n.sym;
8399   old_target = old->n.tb->u.specific->n.sym;
8400
8401   /* Check that overridden binding is not NON_OVERRIDABLE.  */
8402   if (old->n.tb->non_overridable)
8403     {
8404       gfc_error ("'%s' at %L overrides a procedure binding declared"
8405                  " NON_OVERRIDABLE", proc->name, &where);
8406       return FAILURE;
8407     }
8408
8409   /* It's an error to override a non-DEFERRED procedure with a DEFERRED one.  */
8410   if (!old->n.tb->deferred && proc->n.tb->deferred)
8411     {
8412       gfc_error ("'%s' at %L must not be DEFERRED as it overrides a"
8413                  " non-DEFERRED binding", proc->name, &where);
8414       return FAILURE;
8415     }
8416
8417   /* If the overridden binding is PURE, the overriding must be, too.  */
8418   if (old_target->attr.pure && !proc_target->attr.pure)
8419     {
8420       gfc_error ("'%s' at %L overrides a PURE procedure and must also be PURE",
8421                  proc->name, &where);
8422       return FAILURE;
8423     }
8424
8425   /* If the overridden binding is ELEMENTAL, the overriding must be, too.  If it
8426      is not, the overriding must not be either.  */
8427   if (old_target->attr.elemental && !proc_target->attr.elemental)
8428     {
8429       gfc_error ("'%s' at %L overrides an ELEMENTAL procedure and must also be"
8430                  " ELEMENTAL", proc->name, &where);
8431       return FAILURE;
8432     }
8433   if (!old_target->attr.elemental && proc_target->attr.elemental)
8434     {
8435       gfc_error ("'%s' at %L overrides a non-ELEMENTAL procedure and must not"
8436                  " be ELEMENTAL, either", proc->name, &where);
8437       return FAILURE;
8438     }
8439
8440   /* If the overridden binding is a SUBROUTINE, the overriding must also be a
8441      SUBROUTINE.  */
8442   if (old_target->attr.subroutine && !proc_target->attr.subroutine)
8443     {
8444       gfc_error ("'%s' at %L overrides a SUBROUTINE and must also be a"
8445                  " SUBROUTINE", proc->name, &where);
8446       return FAILURE;
8447     }
8448
8449   /* If the overridden binding is a FUNCTION, the overriding must also be a
8450      FUNCTION and have the same characteristics.  */
8451   if (old_target->attr.function)
8452     {
8453       if (!proc_target->attr.function)
8454         {
8455           gfc_error ("'%s' at %L overrides a FUNCTION and must also be a"
8456                      " FUNCTION", proc->name, &where);
8457           return FAILURE;
8458         }
8459
8460       /* FIXME:  Do more comprehensive checking (including, for instance, the
8461          rank and array-shape).  */
8462       gcc_assert (proc_target->result && old_target->result);
8463       if (!gfc_compare_types (&proc_target->result->ts,
8464                               &old_target->result->ts))
8465         {
8466           gfc_error ("'%s' at %L and the overridden FUNCTION should have"
8467                      " matching result types", proc->name, &where);
8468           return FAILURE;
8469         }
8470     }
8471
8472   /* If the overridden binding is PUBLIC, the overriding one must not be
8473      PRIVATE.  */
8474   if (old->n.tb->access == ACCESS_PUBLIC
8475       && proc->n.tb->access == ACCESS_PRIVATE)
8476     {
8477       gfc_error ("'%s' at %L overrides a PUBLIC procedure and must not be"
8478                  " PRIVATE", proc->name, &where);
8479       return FAILURE;
8480     }
8481
8482   /* Compare the formal argument lists of both procedures.  This is also abused
8483      to find the position of the passed-object dummy arguments of both
8484      bindings as at least the overridden one might not yet be resolved and we
8485      need those positions in the check below.  */
8486   proc_pass_arg = old_pass_arg = 0;
8487   if (!proc->n.tb->nopass && !proc->n.tb->pass_arg)
8488     proc_pass_arg = 1;
8489   if (!old->n.tb->nopass && !old->n.tb->pass_arg)
8490     old_pass_arg = 1;
8491   argpos = 1;
8492   for (proc_formal = proc_target->formal, old_formal = old_target->formal;
8493        proc_formal && old_formal;
8494        proc_formal = proc_formal->next, old_formal = old_formal->next)
8495     {
8496       if (proc->n.tb->pass_arg
8497           && !strcmp (proc->n.tb->pass_arg, proc_formal->sym->name))
8498         proc_pass_arg = argpos;
8499       if (old->n.tb->pass_arg
8500           && !strcmp (old->n.tb->pass_arg, old_formal->sym->name))
8501         old_pass_arg = argpos;
8502
8503       /* Check that the names correspond.  */
8504       if (strcmp (proc_formal->sym->name, old_formal->sym->name))
8505         {
8506           gfc_error ("Dummy argument '%s' of '%s' at %L should be named '%s' as"
8507                      " to match the corresponding argument of the overridden"
8508                      " procedure", proc_formal->sym->name, proc->name, &where,
8509                      old_formal->sym->name);
8510           return FAILURE;
8511         }
8512
8513       /* Check that the types correspond if neither is the passed-object
8514          argument.  */
8515       /* FIXME:  Do more comprehensive testing here.  */
8516       if (proc_pass_arg != argpos && old_pass_arg != argpos
8517           && !gfc_compare_types (&proc_formal->sym->ts, &old_formal->sym->ts))
8518         {
8519           gfc_error ("Types mismatch for dummy argument '%s' of '%s' %L in"
8520                      " in respect to the overridden procedure",
8521                      proc_formal->sym->name, proc->name, &where);
8522           return FAILURE;
8523         }
8524
8525       ++argpos;
8526     }
8527   if (proc_formal || old_formal)
8528     {
8529       gfc_error ("'%s' at %L must have the same number of formal arguments as"
8530                  " the overridden procedure", proc->name, &where);
8531       return FAILURE;
8532     }
8533
8534   /* If the overridden binding is NOPASS, the overriding one must also be
8535      NOPASS.  */
8536   if (old->n.tb->nopass && !proc->n.tb->nopass)
8537     {
8538       gfc_error ("'%s' at %L overrides a NOPASS binding and must also be"
8539                  " NOPASS", proc->name, &where);
8540       return FAILURE;
8541     }
8542
8543   /* If the overridden binding is PASS(x), the overriding one must also be
8544      PASS and the passed-object dummy arguments must correspond.  */
8545   if (!old->n.tb->nopass)
8546     {
8547       if (proc->n.tb->nopass)
8548         {
8549           gfc_error ("'%s' at %L overrides a binding with PASS and must also be"
8550                      " PASS", proc->name, &where);
8551           return FAILURE;
8552         }
8553
8554       if (proc_pass_arg != old_pass_arg)
8555         {
8556           gfc_error ("Passed-object dummy argument of '%s' at %L must be at"
8557                      " the same position as the passed-object dummy argument of"
8558                      " the overridden procedure", proc->name, &where);
8559           return FAILURE;
8560         }
8561     }
8562
8563   return SUCCESS;
8564 }
8565
8566
8567 /* Check if two GENERIC targets are ambiguous and emit an error is they are.  */
8568
8569 static gfc_try
8570 check_generic_tbp_ambiguity (gfc_tbp_generic* t1, gfc_tbp_generic* t2,
8571                              const char* generic_name, locus where)
8572 {
8573   gfc_symbol* sym1;
8574   gfc_symbol* sym2;
8575
8576   gcc_assert (t1->specific && t2->specific);
8577   gcc_assert (!t1->specific->is_generic);
8578   gcc_assert (!t2->specific->is_generic);
8579
8580   sym1 = t1->specific->u.specific->n.sym;
8581   sym2 = t2->specific->u.specific->n.sym;
8582
8583   /* Both must be SUBROUTINEs or both must be FUNCTIONs.  */
8584   if (sym1->attr.subroutine != sym2->attr.subroutine
8585       || sym1->attr.function != sym2->attr.function)
8586     {
8587       gfc_error ("'%s' and '%s' can't be mixed FUNCTION/SUBROUTINE for"
8588                  " GENERIC '%s' at %L",
8589                  sym1->name, sym2->name, generic_name, &where);
8590       return FAILURE;
8591     }
8592
8593   /* Compare the interfaces.  */
8594   if (gfc_compare_interfaces (sym1, sym2, 1, 0))
8595     {
8596       gfc_error ("'%s' and '%s' for GENERIC '%s' at %L are ambiguous",
8597                  sym1->name, sym2->name, generic_name, &where);
8598       return FAILURE;
8599     }
8600
8601   return SUCCESS;
8602 }
8603
8604
8605 /* Resolve a GENERIC procedure binding for a derived type.  */
8606
8607 static gfc_try
8608 resolve_typebound_generic (gfc_symbol* derived, gfc_symtree* st)
8609 {
8610   gfc_tbp_generic* target;
8611   gfc_symtree* first_target;
8612   gfc_symbol* super_type;
8613   gfc_symtree* inherited;
8614   locus where;
8615
8616   gcc_assert (st->n.tb);
8617   gcc_assert (st->n.tb->is_generic);
8618
8619   where = st->n.tb->where;
8620   super_type = gfc_get_derived_super_type (derived);
8621
8622   /* Find the overridden binding if any.  */
8623   st->n.tb->overridden = NULL;
8624   if (super_type)
8625     {
8626       gfc_symtree* overridden;
8627       overridden = gfc_find_typebound_proc (super_type, NULL, st->name, true);
8628
8629       if (overridden && overridden->n.tb)
8630         st->n.tb->overridden = overridden->n.tb;
8631     }
8632
8633   /* Try to find the specific bindings for the symtrees in our target-list.  */
8634   gcc_assert (st->n.tb->u.generic);
8635   for (target = st->n.tb->u.generic; target; target = target->next)
8636     if (!target->specific)
8637       {
8638         gfc_typebound_proc* overridden_tbp;
8639         gfc_tbp_generic* g;
8640         const char* target_name;
8641
8642         target_name = target->specific_st->name;
8643
8644         /* Defined for this type directly.  */
8645         if (target->specific_st->n.tb)
8646           {
8647             target->specific = target->specific_st->n.tb;
8648             goto specific_found;
8649           }
8650
8651         /* Look for an inherited specific binding.  */
8652         if (super_type)
8653           {
8654             inherited = gfc_find_typebound_proc (super_type, NULL,
8655                                                  target_name, true);
8656
8657             if (inherited)
8658               {
8659                 gcc_assert (inherited->n.tb);
8660                 target->specific = inherited->n.tb;
8661                 goto specific_found;
8662               }
8663           }
8664
8665         gfc_error ("Undefined specific binding '%s' as target of GENERIC '%s'"
8666                    " at %L", target_name, st->name, &where);
8667         return FAILURE;
8668
8669         /* Once we've found the specific binding, check it is not ambiguous with
8670            other specifics already found or inherited for the same GENERIC.  */
8671 specific_found:
8672         gcc_assert (target->specific);
8673
8674         /* This must really be a specific binding!  */
8675         if (target->specific->is_generic)
8676           {
8677             gfc_error ("GENERIC '%s' at %L must target a specific binding,"
8678                        " '%s' is GENERIC, too", st->name, &where, target_name);
8679             return FAILURE;
8680           }
8681
8682         /* Check those already resolved on this type directly.  */
8683         for (g = st->n.tb->u.generic; g; g = g->next)
8684           if (g != target && g->specific
8685               && check_generic_tbp_ambiguity (target, g, st->name, where)
8686                   == FAILURE)
8687             return FAILURE;
8688
8689         /* Check for ambiguity with inherited specific targets.  */
8690         for (overridden_tbp = st->n.tb->overridden; overridden_tbp;
8691              overridden_tbp = overridden_tbp->overridden)
8692           if (overridden_tbp->is_generic)
8693             {
8694               for (g = overridden_tbp->u.generic; g; g = g->next)
8695                 {
8696                   gcc_assert (g->specific);
8697                   if (check_generic_tbp_ambiguity (target, g,
8698                                                    st->name, where) == FAILURE)
8699                     return FAILURE;
8700                 }
8701             }
8702       }
8703
8704   /* If we attempt to "overwrite" a specific binding, this is an error.  */
8705   if (st->n.tb->overridden && !st->n.tb->overridden->is_generic)
8706     {
8707       gfc_error ("GENERIC '%s' at %L can't overwrite specific binding with"
8708                  " the same name", st->name, &where);
8709       return FAILURE;
8710     }
8711
8712   /* Take the SUBROUTINE/FUNCTION attributes of the first specific target, as
8713      all must have the same attributes here.  */
8714   first_target = st->n.tb->u.generic->specific->u.specific;
8715   gcc_assert (first_target);
8716   st->n.tb->subroutine = first_target->n.sym->attr.subroutine;
8717   st->n.tb->function = first_target->n.sym->attr.function;
8718
8719   return SUCCESS;
8720 }
8721
8722
8723 /* Resolve the type-bound procedures for a derived type.  */
8724
8725 static gfc_symbol* resolve_bindings_derived;
8726 static gfc_try resolve_bindings_result;
8727
8728 static void
8729 resolve_typebound_procedure (gfc_symtree* stree)
8730 {
8731   gfc_symbol* proc;
8732   locus where;
8733   gfc_symbol* me_arg;
8734   gfc_symbol* super_type;
8735   gfc_component* comp;
8736
8737   gcc_assert (stree);
8738
8739   /* Undefined specific symbol from GENERIC target definition.  */
8740   if (!stree->n.tb)
8741     return;
8742
8743   if (stree->n.tb->error)
8744     return;
8745
8746   /* If this is a GENERIC binding, use that routine.  */
8747   if (stree->n.tb->is_generic)
8748     {
8749       if (resolve_typebound_generic (resolve_bindings_derived, stree)
8750             == FAILURE)
8751         goto error;
8752       return;
8753     }
8754
8755   /* Get the target-procedure to check it.  */
8756   gcc_assert (!stree->n.tb->is_generic);
8757   gcc_assert (stree->n.tb->u.specific);
8758   proc = stree->n.tb->u.specific->n.sym;
8759   where = stree->n.tb->where;
8760
8761   /* Default access should already be resolved from the parser.  */
8762   gcc_assert (stree->n.tb->access != ACCESS_UNKNOWN);
8763
8764   /* It should be a module procedure or an external procedure with explicit
8765      interface.  For DEFERRED bindings, abstract interfaces are ok as well.  */
8766   if ((!proc->attr.subroutine && !proc->attr.function)
8767       || (proc->attr.proc != PROC_MODULE
8768           && proc->attr.if_source != IFSRC_IFBODY)
8769       || (proc->attr.abstract && !stree->n.tb->deferred))
8770     {
8771       gfc_error ("'%s' must be a module procedure or an external procedure with"
8772                  " an explicit interface at %L", proc->name, &where);
8773       goto error;
8774     }
8775   stree->n.tb->subroutine = proc->attr.subroutine;
8776   stree->n.tb->function = proc->attr.function;
8777
8778   /* Find the super-type of the current derived type.  We could do this once and
8779      store in a global if speed is needed, but as long as not I believe this is
8780      more readable and clearer.  */
8781   super_type = gfc_get_derived_super_type (resolve_bindings_derived);
8782
8783   /* If PASS, resolve and check arguments if not already resolved / loaded
8784      from a .mod file.  */
8785   if (!stree->n.tb->nopass && stree->n.tb->pass_arg_num == 0)
8786     {
8787       if (stree->n.tb->pass_arg)
8788         {
8789           gfc_formal_arglist* i;
8790
8791           /* If an explicit passing argument name is given, walk the arg-list
8792              and look for it.  */
8793
8794           me_arg = NULL;
8795           stree->n.tb->pass_arg_num = 1;
8796           for (i = proc->formal; i; i = i->next)
8797             {
8798               if (!strcmp (i->sym->name, stree->n.tb->pass_arg))
8799                 {
8800                   me_arg = i->sym;
8801                   break;
8802                 }
8803               ++stree->n.tb->pass_arg_num;
8804             }
8805
8806           if (!me_arg)
8807             {
8808               gfc_error ("Procedure '%s' with PASS(%s) at %L has no"
8809                          " argument '%s'",
8810                          proc->name, stree->n.tb->pass_arg, &where,
8811                          stree->n.tb->pass_arg);
8812               goto error;
8813             }
8814         }
8815       else
8816         {
8817           /* Otherwise, take the first one; there should in fact be at least
8818              one.  */
8819           stree->n.tb->pass_arg_num = 1;
8820           if (!proc->formal)
8821             {
8822               gfc_error ("Procedure '%s' with PASS at %L must have at"
8823                          " least one argument", proc->name, &where);
8824               goto error;
8825             }
8826           me_arg = proc->formal->sym;
8827         }
8828
8829       /* Now check that the argument-type matches.  */
8830       gcc_assert (me_arg);
8831       if (me_arg->ts.type != BT_DERIVED
8832           || me_arg->ts.derived != resolve_bindings_derived)
8833         {
8834           gfc_error ("Argument '%s' of '%s' with PASS(%s) at %L must be of"
8835                      " the derived-type '%s'", me_arg->name, proc->name,
8836                      me_arg->name, &where, resolve_bindings_derived->name);
8837           goto error;
8838         }
8839
8840       gfc_warning ("Polymorphic entities are not yet implemented,"
8841                    " non-polymorphic passed-object dummy argument of '%s'"
8842                    " at %L accepted", proc->name, &where);
8843     }
8844
8845   /* If we are extending some type, check that we don't override a procedure
8846      flagged NON_OVERRIDABLE.  */
8847   stree->n.tb->overridden = NULL;
8848   if (super_type)
8849     {
8850       gfc_symtree* overridden;
8851       overridden = gfc_find_typebound_proc (super_type, NULL,
8852                                             stree->name, true);
8853
8854       if (overridden && overridden->n.tb)
8855         stree->n.tb->overridden = overridden->n.tb;
8856
8857       if (overridden && check_typebound_override (stree, overridden) == FAILURE)
8858         goto error;
8859     }
8860
8861   /* See if there's a name collision with a component directly in this type.  */
8862   for (comp = resolve_bindings_derived->components; comp; comp = comp->next)
8863     if (!strcmp (comp->name, stree->name))
8864       {
8865         gfc_error ("Procedure '%s' at %L has the same name as a component of"
8866                    " '%s'",
8867                    stree->name, &where, resolve_bindings_derived->name);
8868         goto error;
8869       }
8870
8871   /* Try to find a name collision with an inherited component.  */
8872   if (super_type && gfc_find_component (super_type, stree->name, true, true))
8873     {
8874       gfc_error ("Procedure '%s' at %L has the same name as an inherited"
8875                  " component of '%s'",
8876                  stree->name, &where, resolve_bindings_derived->name);
8877       goto error;
8878     }
8879
8880   stree->n.tb->error = 0;
8881   return;
8882
8883 error:
8884   resolve_bindings_result = FAILURE;
8885   stree->n.tb->error = 1;
8886 }
8887
8888 static gfc_try
8889 resolve_typebound_procedures (gfc_symbol* derived)
8890 {
8891   if (!derived->f2k_derived || !derived->f2k_derived->tb_sym_root)
8892     return SUCCESS;
8893
8894   resolve_bindings_derived = derived;
8895   resolve_bindings_result = SUCCESS;
8896   gfc_traverse_symtree (derived->f2k_derived->tb_sym_root,
8897                         &resolve_typebound_procedure);
8898
8899   return resolve_bindings_result;
8900 }
8901
8902
8903 /* Add a derived type to the dt_list.  The dt_list is used in trans-types.c
8904    to give all identical derived types the same backend_decl.  */
8905 static void
8906 add_dt_to_dt_list (gfc_symbol *derived)
8907 {
8908   gfc_dt_list *dt_list;
8909
8910   for (dt_list = gfc_derived_types; dt_list; dt_list = dt_list->next)
8911     if (derived == dt_list->derived)
8912       break;
8913
8914   if (dt_list == NULL)
8915     {
8916       dt_list = gfc_get_dt_list ();
8917       dt_list->next = gfc_derived_types;
8918       dt_list->derived = derived;
8919       gfc_derived_types = dt_list;
8920     }
8921 }
8922
8923
8924 /* Ensure that a derived-type is really not abstract, meaning that every
8925    inherited DEFERRED binding is overridden by a non-DEFERRED one.  */
8926
8927 static gfc_try
8928 ensure_not_abstract_walker (gfc_symbol* sub, gfc_symtree* st)
8929 {
8930   if (!st)
8931     return SUCCESS;
8932
8933   if (ensure_not_abstract_walker (sub, st->left) == FAILURE)
8934     return FAILURE;
8935   if (ensure_not_abstract_walker (sub, st->right) == FAILURE)
8936     return FAILURE;
8937
8938   if (st->n.tb && st->n.tb->deferred)
8939     {
8940       gfc_symtree* overriding;
8941       overriding = gfc_find_typebound_proc (sub, NULL, st->name, true);
8942       gcc_assert (overriding && overriding->n.tb);
8943       if (overriding->n.tb->deferred)
8944         {
8945           gfc_error ("Derived-type '%s' declared at %L must be ABSTRACT because"
8946                      " '%s' is DEFERRED and not overridden",
8947                      sub->name, &sub->declared_at, st->name);
8948           return FAILURE;
8949         }
8950     }
8951
8952   return SUCCESS;
8953 }
8954
8955 static gfc_try
8956 ensure_not_abstract (gfc_symbol* sub, gfc_symbol* ancestor)
8957 {
8958   /* The algorithm used here is to recursively travel up the ancestry of sub
8959      and for each ancestor-type, check all bindings.  If any of them is
8960      DEFERRED, look it up starting from sub and see if the found (overriding)
8961      binding is not DEFERRED.
8962      This is not the most efficient way to do this, but it should be ok and is
8963      clearer than something sophisticated.  */
8964
8965   gcc_assert (ancestor && ancestor->attr.abstract && !sub->attr.abstract);
8966
8967   /* Walk bindings of this ancestor.  */
8968   if (ancestor->f2k_derived)
8969     {
8970       gfc_try t;
8971       t = ensure_not_abstract_walker (sub, ancestor->f2k_derived->tb_sym_root);
8972       if (t == FAILURE)
8973         return FAILURE;
8974     }
8975
8976   /* Find next ancestor type and recurse on it.  */
8977   ancestor = gfc_get_derived_super_type (ancestor);
8978   if (ancestor)
8979     return ensure_not_abstract (sub, ancestor);
8980
8981   return SUCCESS;
8982 }
8983
8984
8985 /* Resolve the components of a derived type.  */
8986
8987 static gfc_try
8988 resolve_fl_derived (gfc_symbol *sym)
8989 {
8990   gfc_symbol* super_type;
8991   gfc_component *c;
8992   int i;
8993
8994   super_type = gfc_get_derived_super_type (sym);
8995
8996   /* Ensure the extended type gets resolved before we do.  */
8997   if (super_type && resolve_fl_derived (super_type) == FAILURE)
8998     return FAILURE;
8999
9000   /* An ABSTRACT type must be extensible.  */
9001   if (sym->attr.abstract && (sym->attr.is_bind_c || sym->attr.sequence))
9002     {
9003       gfc_error ("Non-extensible derived-type '%s' at %L must not be ABSTRACT",
9004                  sym->name, &sym->declared_at);
9005       return FAILURE;
9006     }
9007
9008   for (c = sym->components; c != NULL; c = c->next)
9009     {
9010       if (c->attr.proc_pointer && c->ts.interface)
9011         {
9012           if (c->ts.interface->attr.procedure)
9013             gfc_error ("Interface '%s', used by procedure pointer component "
9014                        "'%s' at %L, is declared in a later PROCEDURE statement",
9015                        c->ts.interface->name, c->name, &c->loc);
9016
9017           /* Get the attributes from the interface (now resolved).  */
9018           if (c->ts.interface->attr.if_source
9019               || c->ts.interface->attr.intrinsic)
9020             {
9021               gfc_symbol *ifc = c->ts.interface;
9022
9023               if (ifc->attr.intrinsic)
9024                 resolve_intrinsic (ifc, &ifc->declared_at);
9025
9026               if (ifc->result)
9027                 c->ts = ifc->result->ts;
9028               else   
9029                 c->ts = ifc->ts;
9030               c->ts.interface = ifc;
9031               c->attr.function = ifc->attr.function;
9032               c->attr.subroutine = ifc->attr.subroutine;
9033               /* TODO: gfc_copy_formal_args (c, ifc);  */
9034
9035               c->attr.allocatable = ifc->attr.allocatable;
9036               c->attr.pointer = ifc->attr.pointer;
9037               c->attr.pure = ifc->attr.pure;
9038               c->attr.elemental = ifc->attr.elemental;
9039               c->attr.dimension = ifc->attr.dimension;
9040               c->attr.recursive = ifc->attr.recursive;
9041               c->attr.always_explicit = ifc->attr.always_explicit;
9042               /* Copy array spec.  */
9043               c->as = gfc_copy_array_spec (ifc->as);
9044               /*if (c->as)
9045                 {
9046                   int i;
9047                   for (i = 0; i < c->as->rank; i++)
9048                     {
9049                       gfc_expr_replace_symbols (c->as->lower[i], c);
9050                       gfc_expr_replace_symbols (c->as->upper[i], c);
9051                     }
9052                 }*/
9053               /* Copy char length.  */
9054               if (ifc->ts.cl)
9055                 {
9056                   c->ts.cl = gfc_get_charlen();
9057                   c->ts.cl->resolved = ifc->ts.cl->resolved;
9058                   c->ts.cl->length = gfc_copy_expr (ifc->ts.cl->length);
9059                   /*gfc_expr_replace_symbols (c->ts.cl->length, c);*/
9060                   /* Add charlen to namespace.  */
9061                   /*if (c->formal_ns)
9062                     {
9063                       c->ts.cl->next = c->formal_ns->cl_list;
9064                       c->formal_ns->cl_list = c->ts.cl;
9065                     }*/
9066                 }
9067             }
9068           else if (c->ts.interface->name[0] != '\0')
9069             {
9070               gfc_error ("Interface '%s' of procedure pointer component "
9071                          "'%s' at %L must be explicit", c->ts.interface->name,
9072                          c->name, &c->loc);
9073               return FAILURE;
9074             }
9075         }
9076       else if (c->attr.proc_pointer && c->ts.type == BT_UNKNOWN)
9077         {
9078           c->ts = *gfc_get_default_type (c->name, NULL);
9079           c->attr.implicit_type = 1;
9080         }
9081
9082       /* Check type-spec if this is not the parent-type component.  */
9083       if ((!sym->attr.extension || c != sym->components)
9084           && resolve_typespec_used (&c->ts, &c->loc, c->name) == FAILURE)
9085         return FAILURE;
9086
9087       /* If this type is an extension, see if this component has the same name
9088          as an inherited type-bound procedure.  */
9089       if (super_type
9090           && gfc_find_typebound_proc (super_type, NULL, c->name, true))
9091         {
9092           gfc_error ("Component '%s' of '%s' at %L has the same name as an"
9093                      " inherited type-bound procedure",
9094                      c->name, sym->name, &c->loc);
9095           return FAILURE;
9096         }
9097
9098       if (c->ts.type == BT_CHARACTER)
9099         {
9100          if (c->ts.cl->length == NULL
9101              || (resolve_charlen (c->ts.cl) == FAILURE)
9102              || !gfc_is_constant_expr (c->ts.cl->length))
9103            {
9104              gfc_error ("Character length of component '%s' needs to "
9105                         "be a constant specification expression at %L",
9106                         c->name,
9107                         c->ts.cl->length ? &c->ts.cl->length->where : &c->loc);
9108              return FAILURE;
9109            }
9110         }
9111
9112       if (c->ts.type == BT_DERIVED
9113           && sym->component_access != ACCESS_PRIVATE
9114           && gfc_check_access (sym->attr.access, sym->ns->default_access)
9115           && !is_sym_host_assoc (c->ts.derived, sym->ns)
9116           && !c->ts.derived->attr.use_assoc
9117           && !gfc_check_access (c->ts.derived->attr.access,
9118                                 c->ts.derived->ns->default_access)
9119           && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: the component '%s' "
9120                              "is a PRIVATE type and cannot be a component of "
9121                              "'%s', which is PUBLIC at %L", c->name,
9122                              sym->name, &sym->declared_at) == FAILURE)
9123         return FAILURE;
9124
9125       if (sym->attr.sequence)
9126         {
9127           if (c->ts.type == BT_DERIVED && c->ts.derived->attr.sequence == 0)
9128             {
9129               gfc_error ("Component %s of SEQUENCE type declared at %L does "
9130                          "not have the SEQUENCE attribute",
9131                          c->ts.derived->name, &sym->declared_at);
9132               return FAILURE;
9133             }
9134         }
9135
9136       if (c->ts.type == BT_DERIVED && c->attr.pointer
9137           && c->ts.derived->components == NULL
9138           && !c->ts.derived->attr.zero_comp)
9139         {
9140           gfc_error ("The pointer component '%s' of '%s' at %L is a type "
9141                      "that has not been declared", c->name, sym->name,
9142                      &c->loc);
9143           return FAILURE;
9144         }
9145
9146       /* Ensure that all the derived type components are put on the
9147          derived type list; even in formal namespaces, where derived type
9148          pointer components might not have been declared.  */
9149       if (c->ts.type == BT_DERIVED
9150             && c->ts.derived
9151             && c->ts.derived->components
9152             && c->attr.pointer
9153             && sym != c->ts.derived)
9154         add_dt_to_dt_list (c->ts.derived);
9155
9156       if (c->attr.pointer || c->attr.proc_pointer || c->attr.allocatable
9157           || c->as == NULL)
9158         continue;
9159
9160       for (i = 0; i < c->as->rank; i++)
9161         {
9162           if (c->as->lower[i] == NULL
9163               || (resolve_index_expr (c->as->lower[i]) == FAILURE)
9164               || !gfc_is_constant_expr (c->as->lower[i])
9165               || c->as->upper[i] == NULL
9166               || (resolve_index_expr (c->as->upper[i]) == FAILURE)
9167               || !gfc_is_constant_expr (c->as->upper[i]))
9168             {
9169               gfc_error ("Component '%s' of '%s' at %L must have "
9170                          "constant array bounds",
9171                          c->name, sym->name, &c->loc);
9172               return FAILURE;
9173             }
9174         }
9175     }
9176
9177   /* Resolve the type-bound procedures.  */
9178   if (resolve_typebound_procedures (sym) == FAILURE)
9179     return FAILURE;
9180
9181   /* Resolve the finalizer procedures.  */
9182   if (gfc_resolve_finalizers (sym) == FAILURE)
9183     return FAILURE;
9184
9185   /* If this is a non-ABSTRACT type extending an ABSTRACT one, ensure that
9186      all DEFERRED bindings are overridden.  */
9187   if (super_type && super_type->attr.abstract && !sym->attr.abstract
9188       && ensure_not_abstract (sym, super_type) == FAILURE)
9189     return FAILURE;
9190
9191   /* Add derived type to the derived type list.  */
9192   add_dt_to_dt_list (sym);
9193
9194   return SUCCESS;
9195 }
9196
9197
9198 static gfc_try
9199 resolve_fl_namelist (gfc_symbol *sym)
9200 {
9201   gfc_namelist *nl;
9202   gfc_symbol *nlsym;
9203
9204   /* Reject PRIVATE objects in a PUBLIC namelist.  */
9205   if (gfc_check_access(sym->attr.access, sym->ns->default_access))
9206     {
9207       for (nl = sym->namelist; nl; nl = nl->next)
9208         {
9209           if (!nl->sym->attr.use_assoc
9210               && !is_sym_host_assoc (nl->sym, sym->ns)
9211               && !gfc_check_access(nl->sym->attr.access,
9212                                 nl->sym->ns->default_access))
9213             {
9214               gfc_error ("NAMELIST object '%s' was declared PRIVATE and "
9215                          "cannot be member of PUBLIC namelist '%s' at %L",
9216                          nl->sym->name, sym->name, &sym->declared_at);
9217               return FAILURE;
9218             }
9219
9220           /* Types with private components that came here by USE-association.  */
9221           if (nl->sym->ts.type == BT_DERIVED
9222               && derived_inaccessible (nl->sym->ts.derived))
9223             {
9224               gfc_error ("NAMELIST object '%s' has use-associated PRIVATE "
9225                          "components and cannot be member of namelist '%s' at %L",
9226                          nl->sym->name, sym->name, &sym->declared_at);
9227               return FAILURE;
9228             }
9229
9230           /* Types with private components that are defined in the same module.  */
9231           if (nl->sym->ts.type == BT_DERIVED
9232               && !is_sym_host_assoc (nl->sym->ts.derived, sym->ns)
9233               && !gfc_check_access (nl->sym->ts.derived->attr.private_comp
9234                                         ? ACCESS_PRIVATE : ACCESS_UNKNOWN,
9235                                         nl->sym->ns->default_access))
9236             {
9237               gfc_error ("NAMELIST object '%s' has PRIVATE components and "
9238                          "cannot be a member of PUBLIC namelist '%s' at %L",
9239                          nl->sym->name, sym->name, &sym->declared_at);
9240               return FAILURE;
9241             }
9242         }
9243     }
9244
9245   for (nl = sym->namelist; nl; nl = nl->next)
9246     {
9247       /* Reject namelist arrays of assumed shape.  */
9248       if (nl->sym->as && nl->sym->as->type == AS_ASSUMED_SHAPE
9249           && gfc_notify_std (GFC_STD_F2003, "NAMELIST array object '%s' "
9250                              "must not have assumed shape in namelist "
9251                              "'%s' at %L", nl->sym->name, sym->name,
9252                              &sym->declared_at) == FAILURE)
9253             return FAILURE;
9254
9255       /* Reject namelist arrays that are not constant shape.  */
9256       if (is_non_constant_shape_array (nl->sym))
9257         {
9258           gfc_error ("NAMELIST array object '%s' must have constant "
9259                      "shape in namelist '%s' at %L", nl->sym->name,
9260                      sym->name, &sym->declared_at);
9261           return FAILURE;
9262         }
9263
9264       /* Namelist objects cannot have allocatable or pointer components.  */
9265       if (nl->sym->ts.type != BT_DERIVED)
9266         continue;
9267
9268       if (nl->sym->ts.derived->attr.alloc_comp)
9269         {
9270           gfc_error ("NAMELIST object '%s' in namelist '%s' at %L cannot "
9271                      "have ALLOCATABLE components",
9272                      nl->sym->name, sym->name, &sym->declared_at);
9273           return FAILURE;
9274         }
9275
9276       if (nl->sym->ts.derived->attr.pointer_comp)
9277         {
9278           gfc_error ("NAMELIST object '%s' in namelist '%s' at %L cannot "
9279                      "have POINTER components", 
9280                      nl->sym->name, sym->name, &sym->declared_at);
9281           return FAILURE;
9282         }
9283     }
9284
9285
9286   /* 14.1.2 A module or internal procedure represent local entities
9287      of the same type as a namelist member and so are not allowed.  */
9288   for (nl = sym->namelist; nl; nl = nl->next)
9289     {
9290       if (nl->sym->ts.kind != 0 && nl->sym->attr.flavor == FL_VARIABLE)
9291         continue;
9292
9293       if (nl->sym->attr.function && nl->sym == nl->sym->result)
9294         if ((nl->sym == sym->ns->proc_name)
9295                ||
9296             (sym->ns->parent && nl->sym == sym->ns->parent->proc_name))
9297           continue;
9298
9299       nlsym = NULL;
9300       if (nl->sym && nl->sym->name)
9301         gfc_find_symbol (nl->sym->name, sym->ns, 1, &nlsym);
9302       if (nlsym && nlsym->attr.flavor == FL_PROCEDURE)
9303         {
9304           gfc_error ("PROCEDURE attribute conflicts with NAMELIST "
9305                      "attribute in '%s' at %L", nlsym->name,
9306                      &sym->declared_at);
9307           return FAILURE;
9308         }
9309     }
9310
9311   return SUCCESS;
9312 }
9313
9314
9315 static gfc_try
9316 resolve_fl_parameter (gfc_symbol *sym)
9317 {
9318   /* A parameter array's shape needs to be constant.  */
9319   if (sym->as != NULL 
9320       && (sym->as->type == AS_DEFERRED
9321           || is_non_constant_shape_array (sym)))
9322     {
9323       gfc_error ("Parameter array '%s' at %L cannot be automatic "
9324                  "or of deferred shape", sym->name, &sym->declared_at);
9325       return FAILURE;
9326     }
9327
9328   /* Make sure a parameter that has been implicitly typed still
9329      matches the implicit type, since PARAMETER statements can precede
9330      IMPLICIT statements.  */
9331   if (sym->attr.implicit_type
9332       && !gfc_compare_types (&sym->ts, gfc_get_default_type (sym->name,
9333                                                              sym->ns)))
9334     {
9335       gfc_error ("Implicitly typed PARAMETER '%s' at %L doesn't match a "
9336                  "later IMPLICIT type", sym->name, &sym->declared_at);
9337       return FAILURE;
9338     }
9339
9340   /* Make sure the types of derived parameters are consistent.  This
9341      type checking is deferred until resolution because the type may
9342      refer to a derived type from the host.  */
9343   if (sym->ts.type == BT_DERIVED
9344       && !gfc_compare_types (&sym->ts, &sym->value->ts))
9345     {
9346       gfc_error ("Incompatible derived type in PARAMETER at %L",
9347                  &sym->value->where);
9348       return FAILURE;
9349     }
9350   return SUCCESS;
9351 }
9352
9353
9354 /* Do anything necessary to resolve a symbol.  Right now, we just
9355    assume that an otherwise unknown symbol is a variable.  This sort
9356    of thing commonly happens for symbols in module.  */
9357
9358 static void
9359 resolve_symbol (gfc_symbol *sym)
9360 {
9361   int check_constant, mp_flag;
9362   gfc_symtree *symtree;
9363   gfc_symtree *this_symtree;
9364   gfc_namespace *ns;
9365   gfc_component *c;
9366
9367   if (sym->attr.flavor == FL_UNKNOWN)
9368     {
9369
9370     /* If we find that a flavorless symbol is an interface in one of the
9371        parent namespaces, find its symtree in this namespace, free the
9372        symbol and set the symtree to point to the interface symbol.  */
9373       for (ns = gfc_current_ns->parent; ns; ns = ns->parent)
9374         {
9375           symtree = gfc_find_symtree (ns->sym_root, sym->name);
9376           if (symtree && symtree->n.sym->generic)
9377             {
9378               this_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
9379                                                sym->name);
9380               sym->refs--;
9381               if (!sym->refs)
9382                 gfc_free_symbol (sym);
9383               symtree->n.sym->refs++;
9384               this_symtree->n.sym = symtree->n.sym;
9385               return;
9386             }
9387         }
9388
9389       /* Otherwise give it a flavor according to such attributes as
9390          it has.  */
9391       if (sym->attr.external == 0 && sym->attr.intrinsic == 0)
9392         sym->attr.flavor = FL_VARIABLE;
9393       else
9394         {
9395           sym->attr.flavor = FL_PROCEDURE;
9396           if (sym->attr.dimension)
9397             sym->attr.function = 1;
9398         }
9399     }
9400
9401   if (sym->attr.external && sym->ts.type != BT_UNKNOWN && !sym->attr.function)
9402     gfc_add_function (&sym->attr, sym->name, &sym->declared_at);
9403
9404   if (sym->attr.procedure && sym->ts.interface
9405       && sym->attr.if_source != IFSRC_DECL)
9406     {
9407       if (sym->ts.interface->attr.procedure)
9408         gfc_error ("Interface '%s', used by procedure '%s' at %L, is declared "
9409                    "in a later PROCEDURE statement", sym->ts.interface->name,
9410                    sym->name,&sym->declared_at);
9411
9412       /* Get the attributes from the interface (now resolved).  */
9413       if (sym->ts.interface->attr.if_source
9414           || sym->ts.interface->attr.intrinsic)
9415         {
9416           gfc_symbol *ifc = sym->ts.interface;
9417
9418           if (ifc->attr.intrinsic)
9419             resolve_intrinsic (ifc, &ifc->declared_at);
9420
9421           if (ifc->result)
9422             sym->ts = ifc->result->ts;
9423           else   
9424             sym->ts = ifc->ts;
9425           sym->ts.interface = ifc;
9426           sym->attr.function = ifc->attr.function;
9427           sym->attr.subroutine = ifc->attr.subroutine;
9428           gfc_copy_formal_args (sym, ifc);
9429
9430           sym->attr.allocatable = ifc->attr.allocatable;
9431           sym->attr.pointer = ifc->attr.pointer;
9432           sym->attr.pure = ifc->attr.pure;
9433           sym->attr.elemental = ifc->attr.elemental;
9434           sym->attr.dimension = ifc->attr.dimension;
9435           sym->attr.recursive = ifc->attr.recursive;
9436           sym->attr.always_explicit = ifc->attr.always_explicit;
9437           /* Copy array spec.  */
9438           sym->as = gfc_copy_array_spec (ifc->as);
9439           if (sym->as)
9440             {
9441               int i;
9442               for (i = 0; i < sym->as->rank; i++)
9443                 {
9444                   gfc_expr_replace_symbols (sym->as->lower[i], sym);
9445                   gfc_expr_replace_symbols (sym->as->upper[i], sym);
9446                 }
9447             }
9448           /* Copy char length.  */
9449           if (ifc->ts.cl)
9450             {
9451               sym->ts.cl = gfc_get_charlen();
9452               sym->ts.cl->resolved = ifc->ts.cl->resolved;
9453               sym->ts.cl->length = gfc_copy_expr (ifc->ts.cl->length);
9454               gfc_expr_replace_symbols (sym->ts.cl->length, sym);
9455               /* Add charlen to namespace.  */
9456               if (sym->formal_ns)
9457                 {
9458                   sym->ts.cl->next = sym->formal_ns->cl_list;
9459                   sym->formal_ns->cl_list = sym->ts.cl;
9460                 }
9461             }
9462         }
9463       else if (sym->ts.interface->name[0] != '\0')
9464         {
9465           gfc_error ("Interface '%s' of procedure '%s' at %L must be explicit",
9466                     sym->ts.interface->name, sym->name, &sym->declared_at);
9467           return;
9468         }
9469     }
9470
9471   if (sym->attr.flavor == FL_DERIVED && resolve_fl_derived (sym) == FAILURE)
9472     return;
9473
9474   /* Symbols that are module procedures with results (functions) have
9475      the types and array specification copied for type checking in
9476      procedures that call them, as well as for saving to a module
9477      file.  These symbols can't stand the scrutiny that their results
9478      can.  */
9479   mp_flag = (sym->result != NULL && sym->result != sym);
9480
9481
9482   /* Make sure that the intrinsic is consistent with its internal 
9483      representation. This needs to be done before assigning a default 
9484      type to avoid spurious warnings.  */
9485   if (sym->attr.flavor != FL_MODULE && sym->attr.intrinsic)
9486     {
9487       gfc_intrinsic_sym* isym;
9488       const char* symstd;
9489
9490       /* We already know this one is an intrinsic, so we don't call
9491          gfc_is_intrinsic for full checking but rather use gfc_find_function and
9492          gfc_find_subroutine directly to check whether it is a function or
9493          subroutine.  */
9494
9495       if ((isym = gfc_find_function (sym->name)))
9496         {
9497           if (sym->ts.type != BT_UNKNOWN && gfc_option.warn_surprising
9498               && !sym->attr.implicit_type)
9499             gfc_warning ("Type specified for intrinsic function '%s' at %L is"
9500                          " ignored", sym->name, &sym->declared_at);
9501         }
9502       else if ((isym = gfc_find_subroutine (sym->name)))
9503         {
9504           if (sym->ts.type != BT_UNKNOWN && !sym->attr.implicit_type)
9505             {
9506               gfc_error ("Intrinsic subroutine '%s' at %L shall not have a type"
9507                          " specifier", sym->name, &sym->declared_at);
9508               return;
9509             }
9510         }
9511       else
9512         {
9513           gfc_error ("'%s' declared INTRINSIC at %L does not exist",
9514                      sym->name, &sym->declared_at);
9515           return;
9516         }
9517
9518       /* Check it is actually available in the standard settings.  */
9519       if (gfc_check_intrinsic_standard (isym, &symstd, false, sym->declared_at)
9520             == FAILURE)
9521         {
9522           gfc_error ("The intrinsic '%s' declared INTRINSIC at %L is not"
9523                      " available in the current standard settings but %s.  Use"
9524                      " an appropriate -std=* option or enable -fall-intrinsics"
9525                      " in order to use it.",
9526                      sym->name, &sym->declared_at, symstd);
9527           return;
9528         }
9529      }
9530
9531   /* Assign default type to symbols that need one and don't have one.  */
9532   if (sym->ts.type == BT_UNKNOWN)
9533     {
9534       if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER)
9535         gfc_set_default_type (sym, 1, NULL);
9536
9537       if (sym->attr.flavor == FL_PROCEDURE && sym->attr.function)
9538         {
9539           /* The specific case of an external procedure should emit an error
9540              in the case that there is no implicit type.  */
9541           if (!mp_flag)
9542             gfc_set_default_type (sym, sym->attr.external, NULL);
9543           else
9544             {
9545               /* Result may be in another namespace.  */
9546               resolve_symbol (sym->result);
9547
9548               if (!sym->result->attr.proc_pointer)
9549                 {
9550                   sym->ts = sym->result->ts;
9551                   sym->as = gfc_copy_array_spec (sym->result->as);
9552                   sym->attr.dimension = sym->result->attr.dimension;
9553                   sym->attr.pointer = sym->result->attr.pointer;
9554                   sym->attr.allocatable = sym->result->attr.allocatable;
9555                 }
9556             }
9557         }
9558     }
9559
9560   /* Assumed size arrays and assumed shape arrays must be dummy
9561      arguments.  */
9562
9563   if (sym->as != NULL
9564       && (sym->as->type == AS_ASSUMED_SIZE
9565           || sym->as->type == AS_ASSUMED_SHAPE)
9566       && sym->attr.dummy == 0)
9567     {
9568       if (sym->as->type == AS_ASSUMED_SIZE)
9569         gfc_error ("Assumed size array at %L must be a dummy argument",
9570                    &sym->declared_at);
9571       else
9572         gfc_error ("Assumed shape array at %L must be a dummy argument",
9573                    &sym->declared_at);
9574       return;
9575     }
9576
9577   /* Make sure symbols with known intent or optional are really dummy
9578      variable.  Because of ENTRY statement, this has to be deferred
9579      until resolution time.  */
9580
9581   if (!sym->attr.dummy
9582       && (sym->attr.optional || sym->attr.intent != INTENT_UNKNOWN))
9583     {
9584       gfc_error ("Symbol at %L is not a DUMMY variable", &sym->declared_at);
9585       return;
9586     }
9587
9588   if (sym->attr.value && !sym->attr.dummy)
9589     {
9590       gfc_error ("'%s' at %L cannot have the VALUE attribute because "
9591                  "it is not a dummy argument", sym->name, &sym->declared_at);
9592       return;
9593     }
9594
9595   if (sym->attr.value && sym->ts.type == BT_CHARACTER)
9596     {
9597       gfc_charlen *cl = sym->ts.cl;
9598       if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
9599         {
9600           gfc_error ("Character dummy variable '%s' at %L with VALUE "
9601                      "attribute must have constant length",
9602                      sym->name, &sym->declared_at);
9603           return;
9604         }
9605
9606       if (sym->ts.is_c_interop
9607           && mpz_cmp_si (cl->length->value.integer, 1) != 0)
9608         {
9609           gfc_error ("C interoperable character dummy variable '%s' at %L "
9610                      "with VALUE attribute must have length one",
9611                      sym->name, &sym->declared_at);
9612           return;
9613         }
9614     }
9615
9616   /* If the symbol is marked as bind(c), verify it's type and kind.  Do not
9617      do this for something that was implicitly typed because that is handled
9618      in gfc_set_default_type.  Handle dummy arguments and procedure
9619      definitions separately.  Also, anything that is use associated is not
9620      handled here but instead is handled in the module it is declared in.
9621      Finally, derived type definitions are allowed to be BIND(C) since that
9622      only implies that they're interoperable, and they are checked fully for
9623      interoperability when a variable is declared of that type.  */
9624   if (sym->attr.is_bind_c && sym->attr.implicit_type == 0 &&
9625       sym->attr.use_assoc == 0 && sym->attr.dummy == 0 &&
9626       sym->attr.flavor != FL_PROCEDURE && sym->attr.flavor != FL_DERIVED)
9627     {
9628       gfc_try t = SUCCESS;
9629       
9630       /* First, make sure the variable is declared at the
9631          module-level scope (J3/04-007, Section 15.3).  */
9632       if (sym->ns->proc_name->attr.flavor != FL_MODULE &&
9633           sym->attr.in_common == 0)
9634         {
9635           gfc_error ("Variable '%s' at %L cannot be BIND(C) because it "
9636                      "is neither a COMMON block nor declared at the "
9637                      "module level scope", sym->name, &(sym->declared_at));
9638           t = FAILURE;
9639         }
9640       else if (sym->common_head != NULL)
9641         {
9642           t = verify_com_block_vars_c_interop (sym->common_head);
9643         }
9644       else
9645         {
9646           /* If type() declaration, we need to verify that the components
9647              of the given type are all C interoperable, etc.  */
9648           if (sym->ts.type == BT_DERIVED &&
9649               sym->ts.derived->attr.is_c_interop != 1)
9650             {
9651               /* Make sure the user marked the derived type as BIND(C).  If
9652                  not, call the verify routine.  This could print an error
9653                  for the derived type more than once if multiple variables
9654                  of that type are declared.  */
9655               if (sym->ts.derived->attr.is_bind_c != 1)
9656                 verify_bind_c_derived_type (sym->ts.derived);
9657               t = FAILURE;
9658             }
9659           
9660           /* Verify the variable itself as C interoperable if it
9661              is BIND(C).  It is not possible for this to succeed if
9662              the verify_bind_c_derived_type failed, so don't have to handle
9663              any error returned by verify_bind_c_derived_type.  */
9664           t = verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
9665                                  sym->common_block);
9666         }
9667
9668       if (t == FAILURE)
9669         {
9670           /* clear the is_bind_c flag to prevent reporting errors more than
9671              once if something failed.  */
9672           sym->attr.is_bind_c = 0;
9673           return;
9674         }
9675     }
9676
9677   /* If a derived type symbol has reached this point, without its
9678      type being declared, we have an error.  Notice that most
9679      conditions that produce undefined derived types have already
9680      been dealt with.  However, the likes of:
9681      implicit type(t) (t) ..... call foo (t) will get us here if
9682      the type is not declared in the scope of the implicit
9683      statement. Change the type to BT_UNKNOWN, both because it is so
9684      and to prevent an ICE.  */
9685   if (sym->ts.type == BT_DERIVED && sym->ts.derived->components == NULL
9686       && !sym->ts.derived->attr.zero_comp)
9687     {
9688       gfc_error ("The derived type '%s' at %L is of type '%s', "
9689                  "which has not been defined", sym->name,
9690                   &sym->declared_at, sym->ts.derived->name);
9691       sym->ts.type = BT_UNKNOWN;
9692       return;
9693     }
9694
9695   /* Make sure that the derived type has been resolved and that the
9696      derived type is visible in the symbol's namespace, if it is a
9697      module function and is not PRIVATE.  */
9698   if (sym->ts.type == BT_DERIVED
9699         && sym->ts.derived->attr.use_assoc
9700         && sym->ns->proc_name
9701         && sym->ns->proc_name->attr.flavor == FL_MODULE)
9702     {
9703       gfc_symbol *ds;
9704
9705       if (resolve_fl_derived (sym->ts.derived) == FAILURE)
9706         return;
9707
9708       gfc_find_symbol (sym->ts.derived->name, sym->ns, 1, &ds);
9709       if (!ds && sym->attr.function
9710             && gfc_check_access (sym->attr.access, sym->ns->default_access))
9711         {
9712           symtree = gfc_new_symtree (&sym->ns->sym_root,
9713                                      sym->ts.derived->name);
9714           symtree->n.sym = sym->ts.derived;
9715           sym->ts.derived->refs++;
9716         }
9717     }
9718
9719   /* Unless the derived-type declaration is use associated, Fortran 95
9720      does not allow public entries of private derived types.
9721      See 4.4.1 (F95) and 4.5.1.1 (F2003); and related interpretation
9722      161 in 95-006r3.  */
9723   if (sym->ts.type == BT_DERIVED
9724       && sym->ns->proc_name && sym->ns->proc_name->attr.flavor == FL_MODULE
9725       && !sym->ts.derived->attr.use_assoc
9726       && gfc_check_access (sym->attr.access, sym->ns->default_access)
9727       && !gfc_check_access (sym->ts.derived->attr.access,
9728                             sym->ts.derived->ns->default_access)
9729       && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PUBLIC %s '%s' at %L "
9730                          "of PRIVATE derived type '%s'",
9731                          (sym->attr.flavor == FL_PARAMETER) ? "parameter"
9732                          : "variable", sym->name, &sym->declared_at,
9733                          sym->ts.derived->name) == FAILURE)
9734     return;
9735
9736   /* An assumed-size array with INTENT(OUT) shall not be of a type for which
9737      default initialization is defined (5.1.2.4.4).  */
9738   if (sym->ts.type == BT_DERIVED
9739       && sym->attr.dummy
9740       && sym->attr.intent == INTENT_OUT
9741       && sym->as
9742       && sym->as->type == AS_ASSUMED_SIZE)
9743     {
9744       for (c = sym->ts.derived->components; c; c = c->next)
9745         {
9746           if (c->initializer)
9747             {
9748               gfc_error ("The INTENT(OUT) dummy argument '%s' at %L is "
9749                          "ASSUMED SIZE and so cannot have a default initializer",
9750                          sym->name, &sym->declared_at);
9751               return;
9752             }
9753         }
9754     }
9755
9756   switch (sym->attr.flavor)
9757     {
9758     case FL_VARIABLE:
9759       if (resolve_fl_variable (sym, mp_flag) == FAILURE)
9760         return;
9761       break;
9762
9763     case FL_PROCEDURE:
9764       if (resolve_fl_procedure (sym, mp_flag) == FAILURE)
9765         return;
9766       break;
9767
9768     case FL_NAMELIST:
9769       if (resolve_fl_namelist (sym) == FAILURE)
9770         return;
9771       break;
9772
9773     case FL_PARAMETER:
9774       if (resolve_fl_parameter (sym) == FAILURE)
9775         return;
9776       break;
9777
9778     default:
9779       break;
9780     }
9781
9782   /* Resolve array specifier. Check as well some constraints
9783      on COMMON blocks.  */
9784
9785   check_constant = sym->attr.in_common && !sym->attr.pointer;
9786
9787   /* Set the formal_arg_flag so that check_conflict will not throw
9788      an error for host associated variables in the specification
9789      expression for an array_valued function.  */
9790   if (sym->attr.function && sym->as)
9791     formal_arg_flag = 1;
9792
9793   gfc_resolve_array_spec (sym->as, check_constant);
9794
9795   formal_arg_flag = 0;
9796
9797   /* Resolve formal namespaces.  */
9798   if (sym->formal_ns && sym->formal_ns != gfc_current_ns)
9799     gfc_resolve (sym->formal_ns);
9800
9801   /* Check threadprivate restrictions.  */
9802   if (sym->attr.threadprivate && !sym->attr.save && !sym->ns->save_all
9803       && (!sym->attr.in_common
9804           && sym->module == NULL
9805           && (sym->ns->proc_name == NULL
9806               || sym->ns->proc_name->attr.flavor != FL_MODULE)))
9807     gfc_error ("Threadprivate at %L isn't SAVEd", &sym->declared_at);
9808
9809   /* If we have come this far we can apply default-initializers, as
9810      described in 14.7.5, to those variables that have not already
9811      been assigned one.  */
9812   if (sym->ts.type == BT_DERIVED
9813       && sym->attr.referenced
9814       && sym->ns == gfc_current_ns
9815       && !sym->value
9816       && !sym->attr.allocatable
9817       && !sym->attr.alloc_comp)
9818     {
9819       symbol_attribute *a = &sym->attr;
9820
9821       if ((!a->save && !a->dummy && !a->pointer
9822            && !a->in_common && !a->use_assoc
9823            && !(a->function && sym != sym->result))
9824           || (a->dummy && a->intent == INTENT_OUT))
9825         apply_default_init (sym);
9826     }
9827
9828   /* If this symbol has a type-spec, check it.  */
9829   if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER
9830       || (sym->attr.flavor == FL_PROCEDURE && sym->attr.function))
9831     if (resolve_typespec_used (&sym->ts, &sym->declared_at, sym->name)
9832           == FAILURE)
9833       return;
9834 }
9835
9836
9837 /************* Resolve DATA statements *************/
9838
9839 static struct
9840 {
9841   gfc_data_value *vnode;
9842   mpz_t left;
9843 }
9844 values;
9845
9846
9847 /* Advance the values structure to point to the next value in the data list.  */
9848
9849 static gfc_try
9850 next_data_value (void)
9851 {
9852
9853   while (mpz_cmp_ui (values.left, 0) == 0)
9854     {
9855       if (values.vnode->next == NULL)
9856         return FAILURE;
9857
9858       values.vnode = values.vnode->next;
9859       mpz_set (values.left, values.vnode->repeat);
9860     }
9861
9862   return SUCCESS;
9863 }
9864
9865
9866 static gfc_try
9867 check_data_variable (gfc_data_variable *var, locus *where)
9868 {
9869   gfc_expr *e;
9870   mpz_t size;
9871   mpz_t offset;
9872   gfc_try t;
9873   ar_type mark = AR_UNKNOWN;
9874   int i;
9875   mpz_t section_index[GFC_MAX_DIMENSIONS];
9876   gfc_ref *ref;
9877   gfc_array_ref *ar;
9878   gfc_symbol *sym;
9879   int has_pointer;
9880
9881   if (gfc_resolve_expr (var->expr) == FAILURE)
9882     return FAILURE;
9883
9884   ar = NULL;
9885   mpz_init_set_si (offset, 0);
9886   e = var->expr;
9887
9888   if (e->expr_type != EXPR_VARIABLE)
9889     gfc_internal_error ("check_data_variable(): Bad expression");
9890
9891   sym = e->symtree->n.sym;
9892
9893   if (sym->ns->is_block_data && !sym->attr.in_common)
9894     {
9895       gfc_error ("BLOCK DATA element '%s' at %L must be in COMMON",
9896                  sym->name, &sym->declared_at);
9897     }
9898
9899   if (e->ref == NULL && sym->as)
9900     {
9901       gfc_error ("DATA array '%s' at %L must be specified in a previous"
9902                  " declaration", sym->name, where);
9903       return FAILURE;
9904     }
9905
9906   has_pointer = sym->attr.pointer;
9907
9908   for (ref = e->ref; ref; ref = ref->next)
9909     {
9910       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
9911         has_pointer = 1;
9912
9913       if (has_pointer
9914             && ref->type == REF_ARRAY
9915             && ref->u.ar.type != AR_FULL)
9916           {
9917             gfc_error ("DATA element '%s' at %L is a pointer and so must "
9918                         "be a full array", sym->name, where);
9919             return FAILURE;
9920           }
9921     }
9922
9923   if (e->rank == 0 || has_pointer)
9924     {
9925       mpz_init_set_ui (size, 1);
9926       ref = NULL;
9927     }
9928   else
9929     {
9930       ref = e->ref;
9931
9932       /* Find the array section reference.  */
9933       for (ref = e->ref; ref; ref = ref->next)
9934         {
9935           if (ref->type != REF_ARRAY)
9936             continue;
9937           if (ref->u.ar.type == AR_ELEMENT)
9938             continue;
9939           break;
9940         }
9941       gcc_assert (ref);
9942
9943       /* Set marks according to the reference pattern.  */
9944       switch (ref->u.ar.type)
9945         {
9946         case AR_FULL:
9947           mark = AR_FULL;
9948           break;
9949
9950         case AR_SECTION:
9951           ar = &ref->u.ar;
9952           /* Get the start position of array section.  */
9953           gfc_get_section_index (ar, section_index, &offset);
9954           mark = AR_SECTION;
9955           break;
9956
9957         default:
9958           gcc_unreachable ();
9959         }
9960
9961       if (gfc_array_size (e, &size) == FAILURE)
9962         {
9963           gfc_error ("Nonconstant array section at %L in DATA statement",
9964                      &e->where);
9965           mpz_clear (offset);
9966           return FAILURE;
9967         }
9968     }
9969
9970   t = SUCCESS;
9971
9972   while (mpz_cmp_ui (size, 0) > 0)
9973     {
9974       if (next_data_value () == FAILURE)
9975         {
9976           gfc_error ("DATA statement at %L has more variables than values",
9977                      where);
9978           t = FAILURE;
9979           break;
9980         }
9981
9982       t = gfc_check_assign (var->expr, values.vnode->expr, 0);
9983       if (t == FAILURE)
9984         break;
9985
9986       /* If we have more than one element left in the repeat count,
9987          and we have more than one element left in the target variable,
9988          then create a range assignment.  */
9989       /* FIXME: Only done for full arrays for now, since array sections
9990          seem tricky.  */
9991       if (mark == AR_FULL && ref && ref->next == NULL
9992           && mpz_cmp_ui (values.left, 1) > 0 && mpz_cmp_ui (size, 1) > 0)
9993         {
9994           mpz_t range;
9995
9996           if (mpz_cmp (size, values.left) >= 0)
9997             {
9998               mpz_init_set (range, values.left);
9999               mpz_sub (size, size, values.left);
10000               mpz_set_ui (values.left, 0);
10001             }
10002           else
10003             {
10004               mpz_init_set (range, size);
10005               mpz_sub (values.left, values.left, size);
10006               mpz_set_ui (size, 0);
10007             }
10008
10009           gfc_assign_data_value_range (var->expr, values.vnode->expr,
10010                                        offset, range);
10011
10012           mpz_add (offset, offset, range);
10013           mpz_clear (range);
10014         }
10015
10016       /* Assign initial value to symbol.  */
10017       else
10018         {
10019           mpz_sub_ui (values.left, values.left, 1);
10020           mpz_sub_ui (size, size, 1);
10021
10022           t = gfc_assign_data_value (var->expr, values.vnode->expr, offset);
10023           if (t == FAILURE)
10024             break;
10025
10026           if (mark == AR_FULL)
10027             mpz_add_ui (offset, offset, 1);
10028
10029           /* Modify the array section indexes and recalculate the offset
10030              for next element.  */
10031           else if (mark == AR_SECTION)
10032             gfc_advance_section (section_index, ar, &offset);
10033         }
10034     }
10035
10036   if (mark == AR_SECTION)
10037     {
10038       for (i = 0; i < ar->dimen; i++)
10039         mpz_clear (section_index[i]);
10040     }
10041
10042   mpz_clear (size);
10043   mpz_clear (offset);
10044
10045   return t;
10046 }
10047
10048
10049 static gfc_try traverse_data_var (gfc_data_variable *, locus *);
10050
10051 /* Iterate over a list of elements in a DATA statement.  */
10052
10053 static gfc_try
10054 traverse_data_list (gfc_data_variable *var, locus *where)
10055 {
10056   mpz_t trip;
10057   iterator_stack frame;
10058   gfc_expr *e, *start, *end, *step;
10059   gfc_try retval = SUCCESS;
10060
10061   mpz_init (frame.value);
10062
10063   start = gfc_copy_expr (var->iter.start);
10064   end = gfc_copy_expr (var->iter.end);
10065   step = gfc_copy_expr (var->iter.step);
10066
10067   if (gfc_simplify_expr (start, 1) == FAILURE
10068       || start->expr_type != EXPR_CONSTANT)
10069     {
10070       gfc_error ("iterator start at %L does not simplify", &start->where);
10071       retval = FAILURE;
10072       goto cleanup;
10073     }
10074   if (gfc_simplify_expr (end, 1) == FAILURE
10075       || end->expr_type != EXPR_CONSTANT)
10076     {
10077       gfc_error ("iterator end at %L does not simplify", &end->where);
10078       retval = FAILURE;
10079       goto cleanup;
10080     }
10081   if (gfc_simplify_expr (step, 1) == FAILURE
10082       || step->expr_type != EXPR_CONSTANT)
10083     {
10084       gfc_error ("iterator step at %L does not simplify", &step->where);
10085       retval = FAILURE;
10086       goto cleanup;
10087     }
10088
10089   mpz_init_set (trip, end->value.integer);
10090   mpz_sub (trip, trip, start->value.integer);
10091   mpz_add (trip, trip, step->value.integer);
10092
10093   mpz_div (trip, trip, step->value.integer);
10094
10095   mpz_set (frame.value, start->value.integer);
10096
10097   frame.prev = iter_stack;
10098   frame.variable = var->iter.var->symtree;
10099   iter_stack = &frame;
10100
10101   while (mpz_cmp_ui (trip, 0) > 0)
10102     {
10103       if (traverse_data_var (var->list, where) == FAILURE)
10104         {
10105           mpz_clear (trip);
10106           retval = FAILURE;
10107           goto cleanup;
10108         }
10109
10110       e = gfc_copy_expr (var->expr);
10111       if (gfc_simplify_expr (e, 1) == FAILURE)
10112         {
10113           gfc_free_expr (e);
10114           mpz_clear (trip);
10115           retval = FAILURE;
10116           goto cleanup;
10117         }
10118
10119       mpz_add (frame.value, frame.value, step->value.integer);
10120
10121       mpz_sub_ui (trip, trip, 1);
10122     }
10123
10124   mpz_clear (trip);
10125 cleanup:
10126   mpz_clear (frame.value);
10127
10128   gfc_free_expr (start);
10129   gfc_free_expr (end);
10130   gfc_free_expr (step);
10131
10132   iter_stack = frame.prev;
10133   return retval;
10134 }
10135
10136
10137 /* Type resolve variables in the variable list of a DATA statement.  */
10138
10139 static gfc_try
10140 traverse_data_var (gfc_data_variable *var, locus *where)
10141 {
10142   gfc_try t;
10143
10144   for (; var; var = var->next)
10145     {
10146       if (var->expr == NULL)
10147         t = traverse_data_list (var, where);
10148       else
10149         t = check_data_variable (var, where);
10150
10151       if (t == FAILURE)
10152         return FAILURE;
10153     }
10154
10155   return SUCCESS;
10156 }
10157
10158
10159 /* Resolve the expressions and iterators associated with a data statement.
10160    This is separate from the assignment checking because data lists should
10161    only be resolved once.  */
10162
10163 static gfc_try
10164 resolve_data_variables (gfc_data_variable *d)
10165 {
10166   for (; d; d = d->next)
10167     {
10168       if (d->list == NULL)
10169         {
10170           if (gfc_resolve_expr (d->expr) == FAILURE)
10171             return FAILURE;
10172         }
10173       else
10174         {
10175           if (gfc_resolve_iterator (&d->iter, false) == FAILURE)
10176             return FAILURE;
10177
10178           if (resolve_data_variables (d->list) == FAILURE)
10179             return FAILURE;
10180         }
10181     }
10182
10183   return SUCCESS;
10184 }
10185
10186
10187 /* Resolve a single DATA statement.  We implement this by storing a pointer to
10188    the value list into static variables, and then recursively traversing the
10189    variables list, expanding iterators and such.  */
10190
10191 static void
10192 resolve_data (gfc_data *d)
10193 {
10194
10195   if (resolve_data_variables (d->var) == FAILURE)
10196     return;
10197
10198   values.vnode = d->value;
10199   if (d->value == NULL)
10200     mpz_set_ui (values.left, 0);
10201   else
10202     mpz_set (values.left, d->value->repeat);
10203
10204   if (traverse_data_var (d->var, &d->where) == FAILURE)
10205     return;
10206
10207   /* At this point, we better not have any values left.  */
10208
10209   if (next_data_value () == SUCCESS)
10210     gfc_error ("DATA statement at %L has more values than variables",
10211                &d->where);
10212 }
10213
10214
10215 /* 12.6 Constraint: In a pure subprogram any variable which is in common or
10216    accessed by host or use association, is a dummy argument to a pure function,
10217    is a dummy argument with INTENT (IN) to a pure subroutine, or an object that
10218    is storage associated with any such variable, shall not be used in the
10219    following contexts: (clients of this function).  */
10220
10221 /* Determines if a variable is not 'pure', i.e., not assignable within a pure
10222    procedure.  Returns zero if assignment is OK, nonzero if there is a
10223    problem.  */
10224 int
10225 gfc_impure_variable (gfc_symbol *sym)
10226 {
10227   gfc_symbol *proc;
10228
10229   if (sym->attr.use_assoc || sym->attr.in_common)
10230     return 1;
10231
10232   if (sym->ns != gfc_current_ns)
10233     return !sym->attr.function;
10234
10235   proc = sym->ns->proc_name;
10236   if (sym->attr.dummy && gfc_pure (proc)
10237         && ((proc->attr.subroutine && sym->attr.intent == INTENT_IN)
10238                 ||
10239              proc->attr.function))
10240     return 1;
10241
10242   /* TODO: Sort out what can be storage associated, if anything, and include
10243      it here.  In principle equivalences should be scanned but it does not
10244      seem to be possible to storage associate an impure variable this way.  */
10245   return 0;
10246 }
10247
10248
10249 /* Test whether a symbol is pure or not.  For a NULL pointer, checks the
10250    symbol of the current procedure.  */
10251
10252 int
10253 gfc_pure (gfc_symbol *sym)
10254 {
10255   symbol_attribute attr;
10256
10257   if (sym == NULL)
10258     sym = gfc_current_ns->proc_name;
10259   if (sym == NULL)
10260     return 0;
10261
10262   attr = sym->attr;
10263
10264   return attr.flavor == FL_PROCEDURE && (attr.pure || attr.elemental);
10265 }
10266
10267
10268 /* Test whether the current procedure is elemental or not.  */
10269
10270 int
10271 gfc_elemental (gfc_symbol *sym)
10272 {
10273   symbol_attribute attr;
10274
10275   if (sym == NULL)
10276     sym = gfc_current_ns->proc_name;
10277   if (sym == NULL)
10278     return 0;
10279   attr = sym->attr;
10280
10281   return attr.flavor == FL_PROCEDURE && attr.elemental;
10282 }
10283
10284
10285 /* Warn about unused labels.  */
10286
10287 static void
10288 warn_unused_fortran_label (gfc_st_label *label)
10289 {
10290   if (label == NULL)
10291     return;
10292
10293   warn_unused_fortran_label (label->left);
10294
10295   if (label->defined == ST_LABEL_UNKNOWN)
10296     return;
10297
10298   switch (label->referenced)
10299     {
10300     case ST_LABEL_UNKNOWN:
10301       gfc_warning ("Label %d at %L defined but not used", label->value,
10302                    &label->where);
10303       break;
10304
10305     case ST_LABEL_BAD_TARGET:
10306       gfc_warning ("Label %d at %L defined but cannot be used",
10307                    label->value, &label->where);
10308       break;
10309
10310     default:
10311       break;
10312     }
10313
10314   warn_unused_fortran_label (label->right);
10315 }
10316
10317
10318 /* Returns the sequence type of a symbol or sequence.  */
10319
10320 static seq_type
10321 sequence_type (gfc_typespec ts)
10322 {
10323   seq_type result;
10324   gfc_component *c;
10325
10326   switch (ts.type)
10327   {
10328     case BT_DERIVED:
10329
10330       if (ts.derived->components == NULL)
10331         return SEQ_NONDEFAULT;
10332
10333       result = sequence_type (ts.derived->components->ts);
10334       for (c = ts.derived->components->next; c; c = c->next)
10335         if (sequence_type (c->ts) != result)
10336           return SEQ_MIXED;
10337
10338       return result;
10339
10340     case BT_CHARACTER:
10341       if (ts.kind != gfc_default_character_kind)
10342           return SEQ_NONDEFAULT;
10343
10344       return SEQ_CHARACTER;
10345
10346     case BT_INTEGER:
10347       if (ts.kind != gfc_default_integer_kind)
10348           return SEQ_NONDEFAULT;
10349
10350       return SEQ_NUMERIC;
10351
10352     case BT_REAL:
10353       if (!(ts.kind == gfc_default_real_kind
10354             || ts.kind == gfc_default_double_kind))
10355           return SEQ_NONDEFAULT;
10356
10357       return SEQ_NUMERIC;
10358
10359     case BT_COMPLEX:
10360       if (ts.kind != gfc_default_complex_kind)
10361           return SEQ_NONDEFAULT;
10362
10363       return SEQ_NUMERIC;
10364
10365     case BT_LOGICAL:
10366       if (ts.kind != gfc_default_logical_kind)
10367           return SEQ_NONDEFAULT;
10368
10369       return SEQ_NUMERIC;
10370
10371     default:
10372       return SEQ_NONDEFAULT;
10373   }
10374 }
10375
10376
10377 /* Resolve derived type EQUIVALENCE object.  */
10378
10379 static gfc_try
10380 resolve_equivalence_derived (gfc_symbol *derived, gfc_symbol *sym, gfc_expr *e)
10381 {
10382   gfc_symbol *d;
10383   gfc_component *c = derived->components;
10384
10385   if (!derived)
10386     return SUCCESS;
10387
10388   /* Shall not be an object of nonsequence derived type.  */
10389   if (!derived->attr.sequence)
10390     {
10391       gfc_error ("Derived type variable '%s' at %L must have SEQUENCE "
10392                  "attribute to be an EQUIVALENCE object", sym->name,
10393                  &e->where);
10394       return FAILURE;
10395     }
10396
10397   /* Shall not have allocatable components.  */
10398   if (derived->attr.alloc_comp)
10399     {
10400       gfc_error ("Derived type variable '%s' at %L cannot have ALLOCATABLE "
10401                  "components to be an EQUIVALENCE object",sym->name,
10402                  &e->where);
10403       return FAILURE;
10404     }
10405
10406   if (sym->attr.in_common && has_default_initializer (sym->ts.derived))
10407     {
10408       gfc_error ("Derived type variable '%s' at %L with default "
10409                  "initialization cannot be in EQUIVALENCE with a variable "
10410                  "in COMMON", sym->name, &e->where);
10411       return FAILURE;
10412     }
10413
10414   for (; c ; c = c->next)
10415     {
10416       d = c->ts.derived;
10417       if (d
10418           && (resolve_equivalence_derived (c->ts.derived, sym, e) == FAILURE))
10419         return FAILURE;
10420
10421       /* Shall not be an object of sequence derived type containing a pointer
10422          in the structure.  */
10423       if (c->attr.pointer)
10424         {
10425           gfc_error ("Derived type variable '%s' at %L with pointer "
10426                      "component(s) cannot be an EQUIVALENCE object",
10427                      sym->name, &e->where);
10428           return FAILURE;
10429         }
10430     }
10431   return SUCCESS;
10432 }
10433
10434
10435 /* Resolve equivalence object. 
10436    An EQUIVALENCE object shall not be a dummy argument, a pointer, a target,
10437    an allocatable array, an object of nonsequence derived type, an object of
10438    sequence derived type containing a pointer at any level of component
10439    selection, an automatic object, a function name, an entry name, a result
10440    name, a named constant, a structure component, or a subobject of any of
10441    the preceding objects.  A substring shall not have length zero.  A
10442    derived type shall not have components with default initialization nor
10443    shall two objects of an equivalence group be initialized.
10444    Either all or none of the objects shall have an protected attribute.
10445    The simple constraints are done in symbol.c(check_conflict) and the rest
10446    are implemented here.  */
10447
10448 static void
10449 resolve_equivalence (gfc_equiv *eq)
10450 {
10451   gfc_symbol *sym;
10452   gfc_symbol *derived;
10453   gfc_symbol *first_sym;
10454   gfc_expr *e;
10455   gfc_ref *r;
10456   locus *last_where = NULL;
10457   seq_type eq_type, last_eq_type;
10458   gfc_typespec *last_ts;
10459   int object, cnt_protected;
10460   const char *value_name;
10461   const char *msg;
10462
10463   value_name = NULL;
10464   last_ts = &eq->expr->symtree->n.sym->ts;
10465
10466   first_sym = eq->expr->symtree->n.sym;
10467
10468   cnt_protected = 0;
10469
10470   for (object = 1; eq; eq = eq->eq, object++)
10471     {
10472       e = eq->expr;
10473
10474       e->ts = e->symtree->n.sym->ts;
10475       /* match_varspec might not know yet if it is seeing
10476          array reference or substring reference, as it doesn't
10477          know the types.  */
10478       if (e->ref && e->ref->type == REF_ARRAY)
10479         {
10480           gfc_ref *ref = e->ref;
10481           sym = e->symtree->n.sym;
10482
10483           if (sym->attr.dimension)
10484             {
10485               ref->u.ar.as = sym->as;
10486               ref = ref->next;
10487             }
10488
10489           /* For substrings, convert REF_ARRAY into REF_SUBSTRING.  */
10490           if (e->ts.type == BT_CHARACTER
10491               && ref
10492               && ref->type == REF_ARRAY
10493               && ref->u.ar.dimen == 1
10494               && ref->u.ar.dimen_type[0] == DIMEN_RANGE
10495               && ref->u.ar.stride[0] == NULL)
10496             {
10497               gfc_expr *start = ref->u.ar.start[0];
10498               gfc_expr *end = ref->u.ar.end[0];
10499               void *mem = NULL;
10500
10501               /* Optimize away the (:) reference.  */
10502               if (start == NULL && end == NULL)
10503                 {
10504                   if (e->ref == ref)
10505                     e->ref = ref->next;
10506                   else
10507                     e->ref->next = ref->next;
10508                   mem = ref;
10509                 }
10510               else
10511                 {
10512                   ref->type = REF_SUBSTRING;
10513                   if (start == NULL)
10514                     start = gfc_int_expr (1);
10515                   ref->u.ss.start = start;
10516                   if (end == NULL && e->ts.cl)
10517                     end = gfc_copy_expr (e->ts.cl->length);
10518                   ref->u.ss.end = end;
10519                   ref->u.ss.length = e->ts.cl;
10520                   e->ts.cl = NULL;
10521                 }
10522               ref = ref->next;
10523               gfc_free (mem);
10524             }
10525
10526           /* Any further ref is an error.  */
10527           if (ref)
10528             {
10529               gcc_assert (ref->type == REF_ARRAY);
10530               gfc_error ("Syntax error in EQUIVALENCE statement at %L",
10531                          &ref->u.ar.where);
10532               continue;
10533             }
10534         }
10535
10536       if (gfc_resolve_expr (e) == FAILURE)
10537         continue;
10538
10539       sym = e->symtree->n.sym;
10540
10541       if (sym->attr.is_protected)
10542         cnt_protected++;
10543       if (cnt_protected > 0 && cnt_protected != object)
10544         {
10545               gfc_error ("Either all or none of the objects in the "
10546                          "EQUIVALENCE set at %L shall have the "
10547                          "PROTECTED attribute",
10548                          &e->where);
10549               break;
10550         }
10551
10552       /* Shall not equivalence common block variables in a PURE procedure.  */
10553       if (sym->ns->proc_name
10554           && sym->ns->proc_name->attr.pure
10555           && sym->attr.in_common)
10556         {
10557           gfc_error ("Common block member '%s' at %L cannot be an EQUIVALENCE "
10558                      "object in the pure procedure '%s'",
10559                      sym->name, &e->where, sym->ns->proc_name->name);
10560           break;
10561         }
10562
10563       /* Shall not be a named constant.  */
10564       if (e->expr_type == EXPR_CONSTANT)
10565         {
10566           gfc_error ("Named constant '%s' at %L cannot be an EQUIVALENCE "
10567                      "object", sym->name, &e->where);
10568           continue;
10569         }
10570
10571       derived = e->ts.derived;
10572       if (derived && resolve_equivalence_derived (derived, sym, e) == FAILURE)
10573         continue;
10574
10575       /* Check that the types correspond correctly:
10576          Note 5.28:
10577          A numeric sequence structure may be equivalenced to another sequence
10578          structure, an object of default integer type, default real type, double
10579          precision real type, default logical type such that components of the
10580          structure ultimately only become associated to objects of the same
10581          kind. A character sequence structure may be equivalenced to an object
10582          of default character kind or another character sequence structure.
10583          Other objects may be equivalenced only to objects of the same type and
10584          kind parameters.  */
10585
10586       /* Identical types are unconditionally OK.  */
10587       if (object == 1 || gfc_compare_types (last_ts, &sym->ts))
10588         goto identical_types;
10589
10590       last_eq_type = sequence_type (*last_ts);
10591       eq_type = sequence_type (sym->ts);
10592
10593       /* Since the pair of objects is not of the same type, mixed or
10594          non-default sequences can be rejected.  */
10595
10596       msg = "Sequence %s with mixed components in EQUIVALENCE "
10597             "statement at %L with different type objects";
10598       if ((object ==2
10599            && last_eq_type == SEQ_MIXED
10600            && gfc_notify_std (GFC_STD_GNU, msg, first_sym->name, last_where)
10601               == FAILURE)
10602           || (eq_type == SEQ_MIXED
10603               && gfc_notify_std (GFC_STD_GNU, msg, sym->name,
10604                                  &e->where) == FAILURE))
10605         continue;
10606
10607       msg = "Non-default type object or sequence %s in EQUIVALENCE "
10608             "statement at %L with objects of different type";
10609       if ((object ==2
10610            && last_eq_type == SEQ_NONDEFAULT
10611            && gfc_notify_std (GFC_STD_GNU, msg, first_sym->name,
10612                               last_where) == FAILURE)
10613           || (eq_type == SEQ_NONDEFAULT
10614               && gfc_notify_std (GFC_STD_GNU, msg, sym->name,
10615                                  &e->where) == FAILURE))
10616         continue;
10617
10618       msg ="Non-CHARACTER object '%s' in default CHARACTER "
10619            "EQUIVALENCE statement at %L";
10620       if (last_eq_type == SEQ_CHARACTER
10621           && eq_type != SEQ_CHARACTER
10622           && gfc_notify_std (GFC_STD_GNU, msg, sym->name,
10623                              &e->where) == FAILURE)
10624                 continue;
10625
10626       msg ="Non-NUMERIC object '%s' in default NUMERIC "
10627            "EQUIVALENCE statement at %L";
10628       if (last_eq_type == SEQ_NUMERIC
10629           && eq_type != SEQ_NUMERIC
10630           && gfc_notify_std (GFC_STD_GNU, msg, sym->name,
10631                              &e->where) == FAILURE)
10632                 continue;
10633
10634   identical_types:
10635       last_ts =&sym->ts;
10636       last_where = &e->where;
10637
10638       if (!e->ref)
10639         continue;
10640
10641       /* Shall not be an automatic array.  */
10642       if (e->ref->type == REF_ARRAY
10643           && gfc_resolve_array_spec (e->ref->u.ar.as, 1) == FAILURE)
10644         {
10645           gfc_error ("Array '%s' at %L with non-constant bounds cannot be "
10646                      "an EQUIVALENCE object", sym->name, &e->where);
10647           continue;
10648         }
10649
10650       r = e->ref;
10651       while (r)
10652         {
10653           /* Shall not be a structure component.  */
10654           if (r->type == REF_COMPONENT)
10655             {
10656               gfc_error ("Structure component '%s' at %L cannot be an "
10657                          "EQUIVALENCE object",
10658                          r->u.c.component->name, &e->where);
10659               break;
10660             }
10661
10662           /* A substring shall not have length zero.  */
10663           if (r->type == REF_SUBSTRING)
10664             {
10665               if (compare_bound (r->u.ss.start, r->u.ss.end) == CMP_GT)
10666                 {
10667                   gfc_error ("Substring at %L has length zero",
10668                              &r->u.ss.start->where);
10669                   break;
10670                 }
10671             }
10672           r = r->next;
10673         }
10674     }
10675 }
10676
10677
10678 /* Resolve function and ENTRY types, issue diagnostics if needed.  */
10679
10680 static void
10681 resolve_fntype (gfc_namespace *ns)
10682 {
10683   gfc_entry_list *el;
10684   gfc_symbol *sym;
10685
10686   if (ns->proc_name == NULL || !ns->proc_name->attr.function)
10687     return;
10688
10689   /* If there are any entries, ns->proc_name is the entry master
10690      synthetic symbol and ns->entries->sym actual FUNCTION symbol.  */
10691   if (ns->entries)
10692     sym = ns->entries->sym;
10693   else
10694     sym = ns->proc_name;
10695   if (sym->result == sym
10696       && sym->ts.type == BT_UNKNOWN
10697       && gfc_set_default_type (sym, 0, NULL) == FAILURE
10698       && !sym->attr.untyped)
10699     {
10700       gfc_error ("Function '%s' at %L has no IMPLICIT type",
10701                  sym->name, &sym->declared_at);
10702       sym->attr.untyped = 1;
10703     }
10704
10705   if (sym->ts.type == BT_DERIVED && !sym->ts.derived->attr.use_assoc
10706       && !sym->attr.contained
10707       && !gfc_check_access (sym->ts.derived->attr.access,
10708                             sym->ts.derived->ns->default_access)
10709       && gfc_check_access (sym->attr.access, sym->ns->default_access))
10710     {
10711       gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PUBLIC function '%s' at "
10712                       "%L of PRIVATE type '%s'", sym->name,
10713                       &sym->declared_at, sym->ts.derived->name);
10714     }
10715
10716     if (ns->entries)
10717     for (el = ns->entries->next; el; el = el->next)
10718       {
10719         if (el->sym->result == el->sym
10720             && el->sym->ts.type == BT_UNKNOWN
10721             && gfc_set_default_type (el->sym, 0, NULL) == FAILURE
10722             && !el->sym->attr.untyped)
10723           {
10724             gfc_error ("ENTRY '%s' at %L has no IMPLICIT type",
10725                        el->sym->name, &el->sym->declared_at);
10726             el->sym->attr.untyped = 1;
10727           }
10728       }
10729 }
10730
10731 /* 12.3.2.1.1 Defined operators.  */
10732
10733 static void
10734 gfc_resolve_uops (gfc_symtree *symtree)
10735 {
10736   gfc_interface *itr;
10737   gfc_symbol *sym;
10738   gfc_formal_arglist *formal;
10739
10740   if (symtree == NULL)
10741     return;
10742
10743   gfc_resolve_uops (symtree->left);
10744   gfc_resolve_uops (symtree->right);
10745
10746   for (itr = symtree->n.uop->op; itr; itr = itr->next)
10747     {
10748       sym = itr->sym;
10749       if (!sym->attr.function)
10750         gfc_error ("User operator procedure '%s' at %L must be a FUNCTION",
10751                    sym->name, &sym->declared_at);
10752
10753       if (sym->ts.type == BT_CHARACTER
10754           && !(sym->ts.cl && sym->ts.cl->length)
10755           && !(sym->result && sym->result->ts.cl
10756                && sym->result->ts.cl->length))
10757         gfc_error ("User operator procedure '%s' at %L cannot be assumed "
10758                    "character length", sym->name, &sym->declared_at);
10759
10760       formal = sym->formal;
10761       if (!formal || !formal->sym)
10762         {
10763           gfc_error ("User operator procedure '%s' at %L must have at least "
10764                      "one argument", sym->name, &sym->declared_at);
10765           continue;
10766         }
10767
10768       if (formal->sym->attr.intent != INTENT_IN)
10769         gfc_error ("First argument of operator interface at %L must be "
10770                    "INTENT(IN)", &sym->declared_at);
10771
10772       if (formal->sym->attr.optional)
10773         gfc_error ("First argument of operator interface at %L cannot be "
10774                    "optional", &sym->declared_at);
10775
10776       formal = formal->next;
10777       if (!formal || !formal->sym)
10778         continue;
10779
10780       if (formal->sym->attr.intent != INTENT_IN)
10781         gfc_error ("Second argument of operator interface at %L must be "
10782                    "INTENT(IN)", &sym->declared_at);
10783
10784       if (formal->sym->attr.optional)
10785         gfc_error ("Second argument of operator interface at %L cannot be "
10786                    "optional", &sym->declared_at);
10787
10788       if (formal->next)
10789         gfc_error ("Operator interface at %L must have, at most, two "
10790                    "arguments", &sym->declared_at);
10791     }
10792 }
10793
10794
10795 /* Examine all of the expressions associated with a program unit,
10796    assign types to all intermediate expressions, make sure that all
10797    assignments are to compatible types and figure out which names
10798    refer to which functions or subroutines.  It doesn't check code
10799    block, which is handled by resolve_code.  */
10800
10801 static void
10802 resolve_types (gfc_namespace *ns)
10803 {
10804   gfc_namespace *n;
10805   gfc_charlen *cl;
10806   gfc_data *d;
10807   gfc_equiv *eq;
10808   gfc_namespace* old_ns = gfc_current_ns;
10809
10810   /* Check that all IMPLICIT types are ok.  */
10811   if (!ns->seen_implicit_none)
10812     {
10813       unsigned letter;
10814       for (letter = 0; letter != GFC_LETTERS; ++letter)
10815         if (ns->set_flag[letter]
10816             && resolve_typespec_used (&ns->default_type[letter],
10817                                       &ns->implicit_loc[letter],
10818                                       NULL) == FAILURE)
10819           return;
10820     }
10821
10822   gfc_current_ns = ns;
10823
10824   resolve_entries (ns);
10825
10826   resolve_common_vars (ns->blank_common.head, false);
10827   resolve_common_blocks (ns->common_root);
10828
10829   resolve_contained_functions (ns);
10830
10831   gfc_traverse_ns (ns, resolve_bind_c_derived_types);
10832
10833   for (cl = ns->cl_list; cl; cl = cl->next)
10834     resolve_charlen (cl);
10835
10836   gfc_traverse_ns (ns, resolve_symbol);
10837
10838   resolve_fntype (ns);
10839
10840   for (n = ns->contained; n; n = n->sibling)
10841     {
10842       if (gfc_pure (ns->proc_name) && !gfc_pure (n->proc_name))
10843         gfc_error ("Contained procedure '%s' at %L of a PURE procedure must "
10844                    "also be PURE", n->proc_name->name,
10845                    &n->proc_name->declared_at);
10846
10847       resolve_types (n);
10848     }
10849
10850   forall_flag = 0;
10851   gfc_check_interfaces (ns);
10852
10853   gfc_traverse_ns (ns, resolve_values);
10854
10855   if (ns->save_all)
10856     gfc_save_all (ns);
10857
10858   iter_stack = NULL;
10859   for (d = ns->data; d; d = d->next)
10860     resolve_data (d);
10861
10862   iter_stack = NULL;
10863   gfc_traverse_ns (ns, gfc_formalize_init_value);
10864
10865   gfc_traverse_ns (ns, gfc_verify_binding_labels);
10866
10867   if (ns->common_root != NULL)
10868     gfc_traverse_symtree (ns->common_root, resolve_bind_c_comms);
10869
10870   for (eq = ns->equiv; eq; eq = eq->next)
10871     resolve_equivalence (eq);
10872
10873   /* Warn about unused labels.  */
10874   if (warn_unused_label)
10875     warn_unused_fortran_label (ns->st_labels);
10876
10877   gfc_resolve_uops (ns->uop_root);
10878
10879   gfc_current_ns = old_ns;
10880 }
10881
10882
10883 /* Call resolve_code recursively.  */
10884
10885 static void
10886 resolve_codes (gfc_namespace *ns)
10887 {
10888   gfc_namespace *n;
10889   bitmap_obstack old_obstack;
10890
10891   for (n = ns->contained; n; n = n->sibling)
10892     resolve_codes (n);
10893
10894   gfc_current_ns = ns;
10895   cs_base = NULL;
10896   /* Set to an out of range value.  */
10897   current_entry_id = -1;
10898
10899   old_obstack = labels_obstack;
10900   bitmap_obstack_initialize (&labels_obstack);
10901
10902   resolve_code (ns->code, ns);
10903
10904   bitmap_obstack_release (&labels_obstack);
10905   labels_obstack = old_obstack;
10906 }
10907
10908
10909 /* This function is called after a complete program unit has been compiled.
10910    Its purpose is to examine all of the expressions associated with a program
10911    unit, assign types to all intermediate expressions, make sure that all
10912    assignments are to compatible types and figure out which names refer to
10913    which functions or subroutines.  */
10914
10915 void
10916 gfc_resolve (gfc_namespace *ns)
10917 {
10918   gfc_namespace *old_ns;
10919
10920   if (ns->resolved)
10921     return;
10922
10923   old_ns = gfc_current_ns;
10924
10925   resolve_types (ns);
10926   resolve_codes (ns);
10927
10928   gfc_current_ns = old_ns;
10929   ns->resolved = 1;
10930 }