OSDN Git Service

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