OSDN Git Service

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