OSDN Git Service

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