re PR fortran/54949 ([F03] abstract procedure pointers not rejected)
[platform/upstream/gcc.git] / gcc / fortran / symbol.c
1 /* Maintain binary trees of symbols.
2    Copyright (C) 2000-2013 Free Software Foundation, Inc.
3    Contributed by Andy Vaught
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "flags.h"
26 #include "gfortran.h"
27 #include "parse.h"
28 #include "match.h"
29 #include "constructor.h"
30
31
32 /* Strings for all symbol attributes.  We use these for dumping the
33    parse tree, in error messages, and also when reading and writing
34    modules.  */
35
36 const mstring flavors[] =
37 {
38   minit ("UNKNOWN-FL", FL_UNKNOWN), minit ("PROGRAM", FL_PROGRAM),
39   minit ("BLOCK-DATA", FL_BLOCK_DATA), minit ("MODULE", FL_MODULE),
40   minit ("VARIABLE", FL_VARIABLE), minit ("PARAMETER", FL_PARAMETER),
41   minit ("LABEL", FL_LABEL), minit ("PROCEDURE", FL_PROCEDURE),
42   minit ("DERIVED", FL_DERIVED), minit ("NAMELIST", FL_NAMELIST),
43   minit (NULL, -1)
44 };
45
46 const mstring procedures[] =
47 {
48     minit ("UNKNOWN-PROC", PROC_UNKNOWN),
49     minit ("MODULE-PROC", PROC_MODULE),
50     minit ("INTERNAL-PROC", PROC_INTERNAL),
51     minit ("DUMMY-PROC", PROC_DUMMY),
52     minit ("INTRINSIC-PROC", PROC_INTRINSIC),
53     minit ("EXTERNAL-PROC", PROC_EXTERNAL),
54     minit ("STATEMENT-PROC", PROC_ST_FUNCTION),
55     minit (NULL, -1)
56 };
57
58 const mstring intents[] =
59 {
60     minit ("UNKNOWN-INTENT", INTENT_UNKNOWN),
61     minit ("IN", INTENT_IN),
62     minit ("OUT", INTENT_OUT),
63     minit ("INOUT", INTENT_INOUT),
64     minit (NULL, -1)
65 };
66
67 const mstring access_types[] =
68 {
69     minit ("UNKNOWN-ACCESS", ACCESS_UNKNOWN),
70     minit ("PUBLIC", ACCESS_PUBLIC),
71     minit ("PRIVATE", ACCESS_PRIVATE),
72     minit (NULL, -1)
73 };
74
75 const mstring ifsrc_types[] =
76 {
77     minit ("UNKNOWN", IFSRC_UNKNOWN),
78     minit ("DECL", IFSRC_DECL),
79     minit ("BODY", IFSRC_IFBODY)
80 };
81
82 const mstring save_status[] =
83 {
84     minit ("UNKNOWN", SAVE_NONE),
85     minit ("EXPLICIT-SAVE", SAVE_EXPLICIT),
86     minit ("IMPLICIT-SAVE", SAVE_IMPLICIT),
87 };
88
89 /* This is to make sure the backend generates setup code in the correct
90    order.  */
91
92 static int next_dummy_order = 1;
93
94
95 gfc_namespace *gfc_current_ns;
96 gfc_namespace *gfc_global_ns_list;
97
98 gfc_gsymbol *gfc_gsym_root = NULL;
99
100 gfc_dt_list *gfc_derived_types;
101
102 static gfc_undo_change_set default_undo_chgset_var = { vNULL, vNULL, NULL };
103 static gfc_undo_change_set *latest_undo_chgset = &default_undo_chgset_var;
104
105
106 /*********** IMPLICIT NONE and IMPLICIT statement handlers ***********/
107
108 /* The following static variable indicates whether a particular element has
109    been explicitly set or not.  */
110
111 static int new_flag[GFC_LETTERS];
112
113
114 /* Handle a correctly parsed IMPLICIT NONE.  */
115
116 void
117 gfc_set_implicit_none (void)
118 {
119   int i;
120
121   if (gfc_current_ns->seen_implicit_none)
122     {
123       gfc_error ("Duplicate IMPLICIT NONE statement at %C");
124       return;
125     }
126
127   gfc_current_ns->seen_implicit_none = 1;
128
129   for (i = 0; i < GFC_LETTERS; i++)
130     {
131       gfc_clear_ts (&gfc_current_ns->default_type[i]);
132       gfc_current_ns->set_flag[i] = 1;
133     }
134 }
135
136
137 /* Reset the implicit range flags.  */
138
139 void
140 gfc_clear_new_implicit (void)
141 {
142   int i;
143
144   for (i = 0; i < GFC_LETTERS; i++)
145     new_flag[i] = 0;
146 }
147
148
149 /* Prepare for a new implicit range.  Sets flags in new_flag[].  */
150
151 bool
152 gfc_add_new_implicit_range (int c1, int c2)
153 {
154   int i;
155
156   c1 -= 'a';
157   c2 -= 'a';
158
159   for (i = c1; i <= c2; i++)
160     {
161       if (new_flag[i])
162         {
163           gfc_error ("Letter '%c' already set in IMPLICIT statement at %C",
164                      i + 'A');
165           return false;
166         }
167
168       new_flag[i] = 1;
169     }
170
171   return true;
172 }
173
174
175 /* Add a matched implicit range for gfc_set_implicit().  Check if merging
176    the new implicit types back into the existing types will work.  */
177
178 bool
179 gfc_merge_new_implicit (gfc_typespec *ts)
180 {
181   int i;
182
183   if (gfc_current_ns->seen_implicit_none)
184     {
185       gfc_error ("Cannot specify IMPLICIT at %C after IMPLICIT NONE");
186       return false;
187     }
188
189   for (i = 0; i < GFC_LETTERS; i++)
190     {
191       if (new_flag[i])
192         {
193           if (gfc_current_ns->set_flag[i])
194             {
195               gfc_error ("Letter %c already has an IMPLICIT type at %C",
196                          i + 'A');
197               return false;
198             }
199
200           gfc_current_ns->default_type[i] = *ts;
201           gfc_current_ns->implicit_loc[i] = gfc_current_locus;
202           gfc_current_ns->set_flag[i] = 1;
203         }
204     }
205   return true;
206 }
207
208
209 /* Given a symbol, return a pointer to the typespec for its default type.  */
210
211 gfc_typespec *
212 gfc_get_default_type (const char *name, gfc_namespace *ns)
213 {
214   char letter;
215
216   letter = name[0];
217
218   if (gfc_option.flag_allow_leading_underscore && letter == '_')
219     gfc_internal_error ("Option -fallow-leading-underscore is for use only by "
220                         "gfortran developers, and should not be used for "
221                         "implicitly typed variables");
222
223   if (letter < 'a' || letter > 'z')
224     gfc_internal_error ("gfc_get_default_type(): Bad symbol '%s'", name);
225
226   if (ns == NULL)
227     ns = gfc_current_ns;
228
229   return &ns->default_type[letter - 'a'];
230 }
231
232
233 /* Given a pointer to a symbol, set its type according to the first
234    letter of its name.  Fails if the letter in question has no default
235    type.  */
236
237 bool
238 gfc_set_default_type (gfc_symbol *sym, int error_flag, gfc_namespace *ns)
239 {
240   gfc_typespec *ts;
241
242   if (sym->ts.type != BT_UNKNOWN)
243     gfc_internal_error ("gfc_set_default_type(): symbol already has a type");
244
245   ts = gfc_get_default_type (sym->name, ns);
246
247   if (ts->type == BT_UNKNOWN)
248     {
249       if (error_flag && !sym->attr.untyped)
250         {
251           gfc_error ("Symbol '%s' at %L has no IMPLICIT type",
252                      sym->name, &sym->declared_at);
253           sym->attr.untyped = 1; /* Ensure we only give an error once.  */
254         }
255
256       return false;
257     }
258
259   sym->ts = *ts;
260   sym->attr.implicit_type = 1;
261
262   if (ts->type == BT_CHARACTER && ts->u.cl)
263     sym->ts.u.cl = gfc_new_charlen (sym->ns, ts->u.cl);
264   else if (ts->type == BT_CLASS
265            && !gfc_build_class_symbol (&sym->ts, &sym->attr, &sym->as, false))
266     return false;
267
268   if (sym->attr.is_bind_c == 1 && gfc_option.warn_c_binding_type)
269     {
270       /* BIND(C) variables should not be implicitly declared.  */
271       gfc_warning_now ("Implicitly declared BIND(C) variable '%s' at %L may "
272                        "not be C interoperable", sym->name, &sym->declared_at);
273       sym->ts.f90_type = sym->ts.type;
274     }
275
276   if (sym->attr.dummy != 0)
277     {
278       if (sym->ns->proc_name != NULL
279           && (sym->ns->proc_name->attr.subroutine != 0
280               || sym->ns->proc_name->attr.function != 0)
281           && sym->ns->proc_name->attr.is_bind_c != 0
282           && gfc_option.warn_c_binding_type)
283         {
284           /* Dummy args to a BIND(C) routine may not be interoperable if
285              they are implicitly typed.  */
286           gfc_warning_now ("Implicitly declared variable '%s' at %L may not "
287                            "be C interoperable but it is a dummy argument to "
288                            "the BIND(C) procedure '%s' at %L", sym->name,
289                            &(sym->declared_at), sym->ns->proc_name->name,
290                            &(sym->ns->proc_name->declared_at));
291           sym->ts.f90_type = sym->ts.type;
292         }
293     }
294   
295   return true;
296 }
297
298
299 /* This function is called from parse.c(parse_progunit) to check the
300    type of the function is not implicitly typed in the host namespace
301    and to implicitly type the function result, if necessary.  */
302
303 void
304 gfc_check_function_type (gfc_namespace *ns)
305 {
306   gfc_symbol *proc = ns->proc_name;
307
308   if (!proc->attr.contained || proc->result->attr.implicit_type)
309     return;
310
311   if (proc->result->ts.type == BT_UNKNOWN && proc->result->ts.interface == NULL)
312     {
313       if (gfc_set_default_type (proc->result, 0, gfc_current_ns))
314         {
315           if (proc->result != proc)
316             {
317               proc->ts = proc->result->ts;
318               proc->as = gfc_copy_array_spec (proc->result->as);
319               proc->attr.dimension = proc->result->attr.dimension;
320               proc->attr.pointer = proc->result->attr.pointer;
321               proc->attr.allocatable = proc->result->attr.allocatable;
322             }
323         }
324       else if (!proc->result->attr.proc_pointer)
325         {
326           gfc_error ("Function result '%s' at %L has no IMPLICIT type",
327                      proc->result->name, &proc->result->declared_at);
328           proc->result->attr.untyped = 1;
329         }
330     }
331 }
332
333
334 /******************** Symbol attribute stuff *********************/
335
336 /* This is a generic conflict-checker.  We do this to avoid having a
337    single conflict in two places.  */
338
339 #define conf(a, b) if (attr->a && attr->b) { a1 = a; a2 = b; goto conflict; }
340 #define conf2(a) if (attr->a) { a2 = a; goto conflict; }
341 #define conf_std(a, b, std) if (attr->a && attr->b)\
342                               {\
343                                 a1 = a;\
344                                 a2 = b;\
345                                 standard = std;\
346                                 goto conflict_std;\
347                               }
348
349 static bool
350 check_conflict (symbol_attribute *attr, const char *name, locus *where)
351 {
352   static const char *dummy = "DUMMY", *save = "SAVE", *pointer = "POINTER",
353     *target = "TARGET", *external = "EXTERNAL", *intent = "INTENT",
354     *intent_in = "INTENT(IN)", *intrinsic = "INTRINSIC",
355     *intent_out = "INTENT(OUT)", *intent_inout = "INTENT(INOUT)",
356     *allocatable = "ALLOCATABLE", *elemental = "ELEMENTAL",
357     *privat = "PRIVATE", *recursive = "RECURSIVE",
358     *in_common = "COMMON", *result = "RESULT", *in_namelist = "NAMELIST",
359     *publik = "PUBLIC", *optional = "OPTIONAL", *entry = "ENTRY",
360     *function = "FUNCTION", *subroutine = "SUBROUTINE",
361     *dimension = "DIMENSION", *in_equivalence = "EQUIVALENCE",
362     *use_assoc = "USE ASSOCIATED", *cray_pointer = "CRAY POINTER",
363     *cray_pointee = "CRAY POINTEE", *data = "DATA", *value = "VALUE",
364     *volatile_ = "VOLATILE", *is_protected = "PROTECTED",
365     *is_bind_c = "BIND(C)", *procedure = "PROCEDURE",
366     *proc_pointer = "PROCEDURE POINTER", *abstract = "ABSTRACT",
367     *asynchronous = "ASYNCHRONOUS", *codimension = "CODIMENSION",
368     *contiguous = "CONTIGUOUS", *generic = "GENERIC";
369   static const char *threadprivate = "THREADPRIVATE";
370
371   const char *a1, *a2;
372   int standard;
373
374   if (where == NULL)
375     where = &gfc_current_locus;
376
377   if (attr->pointer && attr->intent != INTENT_UNKNOWN)
378     {
379       a1 = pointer;
380       a2 = intent;
381       standard = GFC_STD_F2003;
382       goto conflict_std;
383     }
384
385   if (attr->in_namelist && (attr->allocatable || attr->pointer))
386     {
387       a1 = in_namelist;
388       a2 = attr->allocatable ? allocatable : pointer;
389       standard = GFC_STD_F2003;
390       goto conflict_std;
391     }
392
393   /* Check for attributes not allowed in a BLOCK DATA.  */
394   if (gfc_current_state () == COMP_BLOCK_DATA)
395     {
396       a1 = NULL;
397
398       if (attr->in_namelist)
399         a1 = in_namelist;
400       if (attr->allocatable)
401         a1 = allocatable;
402       if (attr->external)
403         a1 = external;
404       if (attr->optional)
405         a1 = optional;
406       if (attr->access == ACCESS_PRIVATE)
407         a1 = privat;
408       if (attr->access == ACCESS_PUBLIC)
409         a1 = publik;
410       if (attr->intent != INTENT_UNKNOWN)
411         a1 = intent;
412
413       if (a1 != NULL)
414         {
415           gfc_error
416             ("%s attribute not allowed in BLOCK DATA program unit at %L",
417              a1, where);
418           return false;
419         }
420     }
421
422   if (attr->save == SAVE_EXPLICIT)
423     {
424       conf (dummy, save);
425       conf (in_common, save);
426       conf (result, save);
427
428       switch (attr->flavor)
429         {
430           case FL_PROGRAM:
431           case FL_BLOCK_DATA:
432           case FL_MODULE:
433           case FL_LABEL:
434           case FL_DERIVED:
435           case FL_PARAMETER:
436             a1 = gfc_code2string (flavors, attr->flavor);
437             a2 = save;
438             goto conflict;
439           case FL_NAMELIST:
440             gfc_error ("Namelist group name at %L cannot have the "
441                        "SAVE attribute", where);
442             return false; 
443             break;
444           case FL_PROCEDURE:
445             /* Conflicts between SAVE and PROCEDURE will be checked at
446                resolution stage, see "resolve_fl_procedure".  */
447           case FL_VARIABLE:
448           default:
449             break;
450         }
451     }
452
453   conf (dummy, entry);
454   conf (dummy, intrinsic);
455   conf (dummy, threadprivate);
456   conf (pointer, target);
457   conf (pointer, intrinsic);
458   conf (pointer, elemental);
459   conf (allocatable, elemental);
460
461   conf (target, external);
462   conf (target, intrinsic);
463
464   if (!attr->if_source)
465     conf (external, dimension);   /* See Fortran 95's R504.  */
466
467   conf (external, intrinsic);
468   conf (entry, intrinsic);
469
470   if ((attr->if_source == IFSRC_DECL && !attr->procedure) || attr->contained)
471     conf (external, subroutine);
472
473   if (attr->proc_pointer && !gfc_notify_std (GFC_STD_F2003, 
474                                              "Procedure pointer at %C"))
475     return false;
476
477   conf (allocatable, pointer);
478   conf_std (allocatable, dummy, GFC_STD_F2003);
479   conf_std (allocatable, function, GFC_STD_F2003);
480   conf_std (allocatable, result, GFC_STD_F2003);
481   conf (elemental, recursive);
482
483   conf (in_common, dummy);
484   conf (in_common, allocatable);
485   conf (in_common, codimension);
486   conf (in_common, result);
487
488   conf (in_equivalence, use_assoc);
489   conf (in_equivalence, codimension);
490   conf (in_equivalence, dummy);
491   conf (in_equivalence, target);
492   conf (in_equivalence, pointer);
493   conf (in_equivalence, function);
494   conf (in_equivalence, result);
495   conf (in_equivalence, entry);
496   conf (in_equivalence, allocatable);
497   conf (in_equivalence, threadprivate);
498
499   conf (dummy, result);
500   conf (entry, result);
501   conf (generic, result);
502
503   conf (function, subroutine);
504
505   if (!function && !subroutine)
506     conf (is_bind_c, dummy);
507
508   conf (is_bind_c, cray_pointer);
509   conf (is_bind_c, cray_pointee);
510   conf (is_bind_c, codimension);
511   conf (is_bind_c, allocatable);
512   conf (is_bind_c, elemental);
513
514   /* Need to also get volatile attr, according to 5.1 of F2003 draft.
515      Parameter conflict caught below.  Also, value cannot be specified
516      for a dummy procedure.  */
517
518   /* Cray pointer/pointee conflicts.  */
519   conf (cray_pointer, cray_pointee);
520   conf (cray_pointer, dimension);
521   conf (cray_pointer, codimension);
522   conf (cray_pointer, contiguous);
523   conf (cray_pointer, pointer);
524   conf (cray_pointer, target);
525   conf (cray_pointer, allocatable);
526   conf (cray_pointer, external);
527   conf (cray_pointer, intrinsic);
528   conf (cray_pointer, in_namelist);
529   conf (cray_pointer, function);
530   conf (cray_pointer, subroutine);
531   conf (cray_pointer, entry);
532
533   conf (cray_pointee, allocatable);
534   conf (cray_pointer, contiguous);
535   conf (cray_pointer, codimension);
536   conf (cray_pointee, intent);
537   conf (cray_pointee, optional);
538   conf (cray_pointee, dummy);
539   conf (cray_pointee, target);
540   conf (cray_pointee, intrinsic);
541   conf (cray_pointee, pointer);
542   conf (cray_pointee, entry);
543   conf (cray_pointee, in_common);
544   conf (cray_pointee, in_equivalence);
545   conf (cray_pointee, threadprivate);
546
547   conf (data, dummy);
548   conf (data, function);
549   conf (data, result);
550   conf (data, allocatable);
551
552   conf (value, pointer)
553   conf (value, allocatable)
554   conf (value, subroutine)
555   conf (value, function)
556   conf (value, volatile_)
557   conf (value, dimension)
558   conf (value, codimension)
559   conf (value, external)
560
561   conf (codimension, result)
562
563   if (attr->value
564       && (attr->intent == INTENT_OUT || attr->intent == INTENT_INOUT))
565     {
566       a1 = value;
567       a2 = attr->intent == INTENT_OUT ? intent_out : intent_inout;
568       goto conflict;
569     }
570
571   conf (is_protected, intrinsic)
572   conf (is_protected, in_common)
573
574   conf (asynchronous, intrinsic)
575   conf (asynchronous, external)
576
577   conf (volatile_, intrinsic)
578   conf (volatile_, external)
579
580   if (attr->volatile_ && attr->intent == INTENT_IN)
581     {
582       a1 = volatile_;
583       a2 = intent_in;
584       goto conflict;
585     }
586
587   conf (procedure, allocatable)
588   conf (procedure, dimension)
589   conf (procedure, codimension)
590   conf (procedure, intrinsic)
591   conf (procedure, target)
592   conf (procedure, value)
593   conf (procedure, volatile_)
594   conf (procedure, asynchronous)
595   conf (procedure, entry)
596
597   conf (proc_pointer, abstract)
598
599   a1 = gfc_code2string (flavors, attr->flavor);
600
601   if (attr->in_namelist
602       && attr->flavor != FL_VARIABLE
603       && attr->flavor != FL_PROCEDURE
604       && attr->flavor != FL_UNKNOWN)
605     {
606       a2 = in_namelist;
607       goto conflict;
608     }
609
610   switch (attr->flavor)
611     {
612     case FL_PROGRAM:
613     case FL_BLOCK_DATA:
614     case FL_MODULE:
615     case FL_LABEL:
616       conf2 (codimension);
617       conf2 (dimension);
618       conf2 (dummy);
619       conf2 (volatile_);
620       conf2 (asynchronous);
621       conf2 (contiguous);
622       conf2 (pointer);
623       conf2 (is_protected);
624       conf2 (target);
625       conf2 (external);
626       conf2 (intrinsic);
627       conf2 (allocatable);
628       conf2 (result);
629       conf2 (in_namelist);
630       conf2 (optional);
631       conf2 (function);
632       conf2 (subroutine);
633       conf2 (threadprivate);
634
635       if (attr->access == ACCESS_PUBLIC || attr->access == ACCESS_PRIVATE)
636         {
637           a2 = attr->access == ACCESS_PUBLIC ? publik : privat;
638           gfc_error ("%s attribute applied to %s %s at %L", a2, a1,
639             name, where);
640           return false;
641         }
642
643       if (attr->is_bind_c)
644         {
645           gfc_error_now ("BIND(C) applied to %s %s at %L", a1, name, where);
646           return false;
647         }
648
649       break;
650
651     case FL_VARIABLE:
652       break;
653
654     case FL_NAMELIST:
655       conf2 (result);
656       break;
657
658     case FL_PROCEDURE:
659       /* Conflicts with INTENT, SAVE and RESULT will be checked
660          at resolution stage, see "resolve_fl_procedure".  */
661
662       if (attr->subroutine)
663         {
664           a1 = subroutine;
665           conf2 (target);
666           conf2 (allocatable);
667           conf2 (volatile_);
668           conf2 (asynchronous);
669           conf2 (in_namelist);
670           conf2 (codimension);
671           conf2 (dimension);
672           conf2 (function);
673           if (!attr->proc_pointer)
674             conf2 (threadprivate);
675         }
676
677       if (!attr->proc_pointer)
678         conf2 (in_common);
679
680       switch (attr->proc)
681         {
682         case PROC_ST_FUNCTION:
683           conf2 (dummy);
684           conf2 (target);
685           break;
686
687         case PROC_MODULE:
688           conf2 (dummy);
689           break;
690
691         case PROC_DUMMY:
692           conf2 (result);
693           conf2 (threadprivate);
694           break;
695
696         default:
697           break;
698         }
699
700       break;
701
702     case FL_DERIVED:
703       conf2 (dummy);
704       conf2 (pointer);
705       conf2 (target);
706       conf2 (external);
707       conf2 (intrinsic);
708       conf2 (allocatable);
709       conf2 (optional);
710       conf2 (entry);
711       conf2 (function);
712       conf2 (subroutine);
713       conf2 (threadprivate);
714       conf2 (result);
715
716       if (attr->intent != INTENT_UNKNOWN)
717         {
718           a2 = intent;
719           goto conflict;
720         }
721       break;
722
723     case FL_PARAMETER:
724       conf2 (external);
725       conf2 (intrinsic);
726       conf2 (optional);
727       conf2 (allocatable);
728       conf2 (function);
729       conf2 (subroutine);
730       conf2 (entry);
731       conf2 (contiguous);
732       conf2 (pointer);
733       conf2 (is_protected);
734       conf2 (target);
735       conf2 (dummy);
736       conf2 (in_common);
737       conf2 (value);
738       conf2 (volatile_);
739       conf2 (asynchronous);
740       conf2 (threadprivate);
741       conf2 (value);
742       conf2 (codimension);
743       conf2 (result);
744       if (!attr->is_iso_c)
745         conf2 (is_bind_c);
746       break;
747
748     default:
749       break;
750     }
751
752   return true;
753
754 conflict:
755   if (name == NULL)
756     gfc_error ("%s attribute conflicts with %s attribute at %L",
757                a1, a2, where);
758   else
759     gfc_error ("%s attribute conflicts with %s attribute in '%s' at %L",
760                a1, a2, name, where);
761
762   return false;
763
764 conflict_std:
765   if (name == NULL)
766     {
767       return gfc_notify_std (standard, "%s attribute "
768                              "with %s attribute at %L", a1, a2,
769                              where);
770     }
771   else
772     {
773       return gfc_notify_std (standard, "%s attribute "
774                              "with %s attribute in '%s' at %L",
775                              a1, a2, name, where);
776     }
777 }
778
779 #undef conf
780 #undef conf2
781 #undef conf_std
782
783
784 /* Mark a symbol as referenced.  */
785
786 void
787 gfc_set_sym_referenced (gfc_symbol *sym)
788 {
789
790   if (sym->attr.referenced)
791     return;
792
793   sym->attr.referenced = 1;
794
795   /* Remember which order dummy variables are accessed in.  */
796   if (sym->attr.dummy)
797     sym->dummy_order = next_dummy_order++;
798 }
799
800
801 /* Common subroutine called by attribute changing subroutines in order
802    to prevent them from changing a symbol that has been
803    use-associated.  Returns zero if it is OK to change the symbol,
804    nonzero if not.  */
805
806 static int
807 check_used (symbol_attribute *attr, const char *name, locus *where)
808 {
809
810   if (attr->use_assoc == 0)
811     return 0;
812
813   if (where == NULL)
814     where = &gfc_current_locus;
815
816   if (name == NULL)
817     gfc_error ("Cannot change attributes of USE-associated symbol at %L",
818                where);
819   else
820     gfc_error ("Cannot change attributes of USE-associated symbol %s at %L",
821                name, where);
822
823   return 1;
824 }
825
826
827 /* Generate an error because of a duplicate attribute.  */
828
829 static void
830 duplicate_attr (const char *attr, locus *where)
831 {
832
833   if (where == NULL)
834     where = &gfc_current_locus;
835
836   gfc_error ("Duplicate %s attribute specified at %L", attr, where);
837 }
838
839
840 bool
841 gfc_add_ext_attribute (symbol_attribute *attr, ext_attr_id_t ext_attr,
842                        locus *where ATTRIBUTE_UNUSED)
843 {
844   attr->ext_attr |= 1 << ext_attr;
845   return true;
846 }
847
848
849 /* Called from decl.c (attr_decl1) to check attributes, when declared
850    separately.  */
851
852 bool
853 gfc_add_attribute (symbol_attribute *attr, locus *where)
854 {
855   if (check_used (attr, NULL, where))
856     return false;
857
858   return check_conflict (attr, NULL, where);
859 }
860
861
862 bool
863 gfc_add_allocatable (symbol_attribute *attr, locus *where)
864 {
865
866   if (check_used (attr, NULL, where))
867     return false;
868
869   if (attr->allocatable)
870     {
871       duplicate_attr ("ALLOCATABLE", where);
872       return false;
873     }
874
875   if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
876       && !gfc_find_state (COMP_INTERFACE))
877     {
878       gfc_error ("ALLOCATABLE specified outside of INTERFACE body at %L",
879                  where);
880       return false;
881     }
882
883   attr->allocatable = 1;
884   return check_conflict (attr, NULL, where);
885 }
886
887
888 bool
889 gfc_add_codimension (symbol_attribute *attr, const char *name, locus *where)
890 {
891
892   if (check_used (attr, name, where))
893     return false;
894
895   if (attr->codimension)
896     {
897       duplicate_attr ("CODIMENSION", where);
898       return false;
899     }
900
901   if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
902       && !gfc_find_state (COMP_INTERFACE))
903     {
904       gfc_error ("CODIMENSION specified for '%s' outside its INTERFACE body "
905                  "at %L", name, where);
906       return false;
907     }
908
909   attr->codimension = 1;
910   return check_conflict (attr, name, where);
911 }
912
913
914 bool
915 gfc_add_dimension (symbol_attribute *attr, const char *name, locus *where)
916 {
917
918   if (check_used (attr, name, where))
919     return false;
920
921   if (attr->dimension)
922     {
923       duplicate_attr ("DIMENSION", where);
924       return false;
925     }
926
927   if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
928       && !gfc_find_state (COMP_INTERFACE))
929     {
930       gfc_error ("DIMENSION specified for '%s' outside its INTERFACE body "
931                  "at %L", name, where);
932       return false;
933     }
934
935   attr->dimension = 1;
936   return check_conflict (attr, name, where);
937 }
938
939
940 bool
941 gfc_add_contiguous (symbol_attribute *attr, const char *name, locus *where)
942 {
943
944   if (check_used (attr, name, where))
945     return false;
946
947   attr->contiguous = 1;
948   return check_conflict (attr, name, where);
949 }
950
951
952 bool
953 gfc_add_external (symbol_attribute *attr, locus *where)
954 {
955
956   if (check_used (attr, NULL, where))
957     return false;
958
959   if (attr->external)
960     {
961       duplicate_attr ("EXTERNAL", where);
962       return false;
963     }
964
965   if (attr->pointer && attr->if_source != IFSRC_IFBODY)
966     {
967       attr->pointer = 0;
968       attr->proc_pointer = 1;
969     }
970
971   attr->external = 1;
972
973   return check_conflict (attr, NULL, where);
974 }
975
976
977 bool
978 gfc_add_intrinsic (symbol_attribute *attr, locus *where)
979 {
980
981   if (check_used (attr, NULL, where))
982     return false;
983
984   if (attr->intrinsic)
985     {
986       duplicate_attr ("INTRINSIC", where);
987       return false;
988     }
989
990   attr->intrinsic = 1;
991
992   return check_conflict (attr, NULL, where);
993 }
994
995
996 bool
997 gfc_add_optional (symbol_attribute *attr, locus *where)
998 {
999
1000   if (check_used (attr, NULL, where))
1001     return false;
1002
1003   if (attr->optional)
1004     {
1005       duplicate_attr ("OPTIONAL", where);
1006       return false;
1007     }
1008
1009   attr->optional = 1;
1010   return check_conflict (attr, NULL, where);
1011 }
1012
1013
1014 bool
1015 gfc_add_pointer (symbol_attribute *attr, locus *where)
1016 {
1017
1018   if (check_used (attr, NULL, where))
1019     return false;
1020
1021   if (attr->pointer && !(attr->if_source == IFSRC_IFBODY
1022       && !gfc_find_state (COMP_INTERFACE)))
1023     {
1024       duplicate_attr ("POINTER", where);
1025       return false;
1026     }
1027
1028   if (attr->procedure || (attr->external && attr->if_source != IFSRC_IFBODY)
1029       || (attr->if_source == IFSRC_IFBODY
1030       && !gfc_find_state (COMP_INTERFACE)))
1031     attr->proc_pointer = 1;
1032   else
1033     attr->pointer = 1;
1034
1035   return check_conflict (attr, NULL, where);
1036 }
1037
1038
1039 bool
1040 gfc_add_cray_pointer (symbol_attribute *attr, locus *where)
1041 {
1042
1043   if (check_used (attr, NULL, where))
1044     return false;
1045
1046   attr->cray_pointer = 1;
1047   return check_conflict (attr, NULL, where);
1048 }
1049
1050
1051 bool
1052 gfc_add_cray_pointee (symbol_attribute *attr, locus *where)
1053 {
1054
1055   if (check_used (attr, NULL, where))
1056     return false;
1057
1058   if (attr->cray_pointee)
1059     {
1060       gfc_error ("Cray Pointee at %L appears in multiple pointer()"
1061                  " statements", where);
1062       return false;
1063     }
1064
1065   attr->cray_pointee = 1;
1066   return check_conflict (attr, NULL, where);
1067 }
1068
1069
1070 bool
1071 gfc_add_protected (symbol_attribute *attr, const char *name, locus *where)
1072 {
1073   if (check_used (attr, name, where))
1074     return false;
1075
1076   if (attr->is_protected)
1077     {
1078         if (!gfc_notify_std (GFC_STD_LEGACY, 
1079                              "Duplicate PROTECTED attribute specified at %L", 
1080                              where))
1081           return false;
1082     }
1083
1084   attr->is_protected = 1;
1085   return check_conflict (attr, name, where);
1086 }
1087
1088
1089 bool
1090 gfc_add_result (symbol_attribute *attr, const char *name, locus *where)
1091 {
1092
1093   if (check_used (attr, name, where))
1094     return false;
1095
1096   attr->result = 1;
1097   return check_conflict (attr, name, where);
1098 }
1099
1100
1101 bool
1102 gfc_add_save (symbol_attribute *attr, save_state s, const char *name,
1103               locus *where)
1104 {
1105
1106   if (check_used (attr, name, where))
1107     return false;
1108
1109   if (s == SAVE_EXPLICIT && gfc_pure (NULL))
1110     {
1111       gfc_error
1112         ("SAVE attribute at %L cannot be specified in a PURE procedure",
1113          where);
1114       return false;
1115     }
1116
1117   if (s == SAVE_EXPLICIT && gfc_implicit_pure (NULL))
1118     gfc_current_ns->proc_name->attr.implicit_pure = 0;
1119
1120   if (s == SAVE_EXPLICIT && attr->save == SAVE_EXPLICIT)
1121     {
1122         if (!gfc_notify_std (GFC_STD_LEGACY, 
1123                              "Duplicate SAVE attribute specified at %L", 
1124                              where))
1125           return false;
1126     }
1127
1128   attr->save = s;
1129   return check_conflict (attr, name, where);
1130 }
1131
1132
1133 bool
1134 gfc_add_value (symbol_attribute *attr, const char *name, locus *where)
1135 {
1136
1137   if (check_used (attr, name, where))
1138     return false;
1139
1140   if (attr->value)
1141     {
1142         if (!gfc_notify_std (GFC_STD_LEGACY, 
1143                              "Duplicate VALUE attribute specified at %L", 
1144                              where))
1145           return false;
1146     }
1147
1148   attr->value = 1;
1149   return check_conflict (attr, name, where);
1150 }
1151
1152
1153 bool
1154 gfc_add_volatile (symbol_attribute *attr, const char *name, locus *where)
1155 {
1156   /* No check_used needed as 11.2.1 of the F2003 standard allows
1157      that the local identifier made accessible by a use statement can be
1158      given a VOLATILE attribute - unless it is a coarray (F2008, C560).  */
1159
1160   if (attr->volatile_ && attr->volatile_ns == gfc_current_ns)
1161     if (!gfc_notify_std (GFC_STD_LEGACY, 
1162                          "Duplicate VOLATILE attribute specified at %L", 
1163                          where))
1164       return false;
1165
1166   attr->volatile_ = 1;
1167   attr->volatile_ns = gfc_current_ns;
1168   return check_conflict (attr, name, where);
1169 }
1170
1171
1172 bool
1173 gfc_add_asynchronous (symbol_attribute *attr, const char *name, locus *where)
1174 {
1175   /* No check_used needed as 11.2.1 of the F2003 standard allows
1176      that the local identifier made accessible by a use statement can be
1177      given a ASYNCHRONOUS attribute.  */
1178
1179   if (attr->asynchronous && attr->asynchronous_ns == gfc_current_ns)
1180     if (!gfc_notify_std (GFC_STD_LEGACY, 
1181                          "Duplicate ASYNCHRONOUS attribute specified at %L", 
1182                          where))
1183       return false;
1184
1185   attr->asynchronous = 1;
1186   attr->asynchronous_ns = gfc_current_ns;
1187   return check_conflict (attr, name, where);
1188 }
1189
1190
1191 bool
1192 gfc_add_threadprivate (symbol_attribute *attr, const char *name, locus *where)
1193 {
1194
1195   if (check_used (attr, name, where))
1196     return false;
1197
1198   if (attr->threadprivate)
1199     {
1200       duplicate_attr ("THREADPRIVATE", where);
1201       return false;
1202     }
1203
1204   attr->threadprivate = 1;
1205   return check_conflict (attr, name, where);
1206 }
1207
1208
1209 bool
1210 gfc_add_target (symbol_attribute *attr, locus *where)
1211 {
1212
1213   if (check_used (attr, NULL, where))
1214     return false;
1215
1216   if (attr->target)
1217     {
1218       duplicate_attr ("TARGET", where);
1219       return false;
1220     }
1221
1222   attr->target = 1;
1223   return check_conflict (attr, NULL, where);
1224 }
1225
1226
1227 bool
1228 gfc_add_dummy (symbol_attribute *attr, const char *name, locus *where)
1229 {
1230
1231   if (check_used (attr, name, where))
1232     return false;
1233
1234   /* Duplicate dummy arguments are allowed due to ENTRY statements.  */
1235   attr->dummy = 1;
1236   return check_conflict (attr, name, where);
1237 }
1238
1239
1240 bool
1241 gfc_add_in_common (symbol_attribute *attr, const char *name, locus *where)
1242 {
1243
1244   if (check_used (attr, name, where))
1245     return false;
1246
1247   /* Duplicate attribute already checked for.  */
1248   attr->in_common = 1;
1249   return check_conflict (attr, name, where);
1250 }
1251
1252
1253 bool
1254 gfc_add_in_equivalence (symbol_attribute *attr, const char *name, locus *where)
1255 {
1256
1257   /* Duplicate attribute already checked for.  */
1258   attr->in_equivalence = 1;
1259   if (!check_conflict (attr, name, where))
1260     return false;
1261
1262   if (attr->flavor == FL_VARIABLE)
1263     return true;
1264
1265   return gfc_add_flavor (attr, FL_VARIABLE, name, where);
1266 }
1267
1268
1269 bool
1270 gfc_add_data (symbol_attribute *attr, const char *name, locus *where)
1271 {
1272
1273   if (check_used (attr, name, where))
1274     return false;
1275
1276   attr->data = 1;
1277   return check_conflict (attr, name, where);
1278 }
1279
1280
1281 bool
1282 gfc_add_in_namelist (symbol_attribute *attr, const char *name, locus *where)
1283 {
1284
1285   attr->in_namelist = 1;
1286   return check_conflict (attr, name, where);
1287 }
1288
1289
1290 bool
1291 gfc_add_sequence (symbol_attribute *attr, const char *name, locus *where)
1292 {
1293
1294   if (check_used (attr, name, where))
1295     return false;
1296
1297   attr->sequence = 1;
1298   return check_conflict (attr, name, where);
1299 }
1300
1301
1302 bool
1303 gfc_add_elemental (symbol_attribute *attr, locus *where)
1304 {
1305
1306   if (check_used (attr, NULL, where))
1307     return false;
1308
1309   if (attr->elemental)
1310     {
1311       duplicate_attr ("ELEMENTAL", where);
1312       return false;
1313     }
1314
1315   attr->elemental = 1;
1316   return check_conflict (attr, NULL, where);
1317 }
1318
1319
1320 bool
1321 gfc_add_pure (symbol_attribute *attr, locus *where)
1322 {
1323
1324   if (check_used (attr, NULL, where))
1325     return false;
1326
1327   if (attr->pure)
1328     {
1329       duplicate_attr ("PURE", where);
1330       return false;
1331     }
1332
1333   attr->pure = 1;
1334   return check_conflict (attr, NULL, where);
1335 }
1336
1337
1338 bool
1339 gfc_add_recursive (symbol_attribute *attr, locus *where)
1340 {
1341
1342   if (check_used (attr, NULL, where))
1343     return false;
1344
1345   if (attr->recursive)
1346     {
1347       duplicate_attr ("RECURSIVE", where);
1348       return false;
1349     }
1350
1351   attr->recursive = 1;
1352   return check_conflict (attr, NULL, where);
1353 }
1354
1355
1356 bool
1357 gfc_add_entry (symbol_attribute *attr, const char *name, locus *where)
1358 {
1359
1360   if (check_used (attr, name, where))
1361     return false;
1362
1363   if (attr->entry)
1364     {
1365       duplicate_attr ("ENTRY", where);
1366       return false;
1367     }
1368
1369   attr->entry = 1;
1370   return check_conflict (attr, name, where);
1371 }
1372
1373
1374 bool
1375 gfc_add_function (symbol_attribute *attr, const char *name, locus *where)
1376 {
1377
1378   if (attr->flavor != FL_PROCEDURE
1379       && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1380     return false;
1381
1382   attr->function = 1;
1383   return check_conflict (attr, name, where);
1384 }
1385
1386
1387 bool
1388 gfc_add_subroutine (symbol_attribute *attr, const char *name, locus *where)
1389 {
1390
1391   if (attr->flavor != FL_PROCEDURE
1392       && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1393     return false;
1394
1395   attr->subroutine = 1;
1396   return check_conflict (attr, name, where);
1397 }
1398
1399
1400 bool
1401 gfc_add_generic (symbol_attribute *attr, const char *name, locus *where)
1402 {
1403
1404   if (attr->flavor != FL_PROCEDURE
1405       && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1406     return false;
1407
1408   attr->generic = 1;
1409   return check_conflict (attr, name, where);
1410 }
1411
1412
1413 bool
1414 gfc_add_proc (symbol_attribute *attr, const char *name, locus *where)
1415 {
1416
1417   if (check_used (attr, NULL, where))
1418     return false;
1419
1420   if (attr->flavor != FL_PROCEDURE
1421       && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1422     return false;
1423
1424   if (attr->procedure)
1425     {
1426       duplicate_attr ("PROCEDURE", where);
1427       return false;
1428     }
1429
1430   attr->procedure = 1;
1431
1432   return check_conflict (attr, NULL, where);
1433 }
1434
1435
1436 bool
1437 gfc_add_abstract (symbol_attribute* attr, locus* where)
1438 {
1439   if (attr->abstract)
1440     {
1441       duplicate_attr ("ABSTRACT", where);
1442       return false;
1443     }
1444
1445   attr->abstract = 1;
1446
1447   return check_conflict (attr, NULL, where);
1448 }
1449
1450
1451 /* Flavors are special because some flavors are not what Fortran
1452    considers attributes and can be reaffirmed multiple times.  */
1453
1454 bool
1455 gfc_add_flavor (symbol_attribute *attr, sym_flavor f, const char *name,
1456                 locus *where)
1457 {
1458
1459   if ((f == FL_PROGRAM || f == FL_BLOCK_DATA || f == FL_MODULE
1460        || f == FL_PARAMETER || f == FL_LABEL || f == FL_DERIVED
1461        || f == FL_NAMELIST) && check_used (attr, name, where))
1462     return false;
1463
1464   if (attr->flavor == f && f == FL_VARIABLE)
1465     return true;
1466
1467   if (attr->flavor != FL_UNKNOWN)
1468     {
1469       if (where == NULL)
1470         where = &gfc_current_locus;
1471
1472       if (name)
1473         gfc_error ("%s attribute of '%s' conflicts with %s attribute at %L",
1474                    gfc_code2string (flavors, attr->flavor), name,
1475                    gfc_code2string (flavors, f), where);
1476       else
1477         gfc_error ("%s attribute conflicts with %s attribute at %L",
1478                    gfc_code2string (flavors, attr->flavor),
1479                    gfc_code2string (flavors, f), where);
1480
1481       return false;
1482     }
1483
1484   attr->flavor = f;
1485
1486   return check_conflict (attr, name, where);
1487 }
1488
1489
1490 bool
1491 gfc_add_procedure (symbol_attribute *attr, procedure_type t,
1492                    const char *name, locus *where)
1493 {
1494
1495   if (check_used (attr, name, where))
1496     return false;
1497
1498   if (attr->flavor != FL_PROCEDURE
1499       && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1500     return false;
1501
1502   if (where == NULL)
1503     where = &gfc_current_locus;
1504
1505   if (attr->proc != PROC_UNKNOWN)
1506     {
1507       gfc_error ("%s procedure at %L is already declared as %s procedure",
1508                  gfc_code2string (procedures, t), where,
1509                  gfc_code2string (procedures, attr->proc));
1510
1511       return false;
1512     }
1513
1514   attr->proc = t;
1515
1516   /* Statement functions are always scalar and functions.  */
1517   if (t == PROC_ST_FUNCTION
1518       && ((!attr->function && !gfc_add_function (attr, name, where))
1519           || attr->dimension))
1520     return false;
1521
1522   return check_conflict (attr, name, where);
1523 }
1524
1525
1526 bool
1527 gfc_add_intent (symbol_attribute *attr, sym_intent intent, locus *where)
1528 {
1529
1530   if (check_used (attr, NULL, where))
1531     return false;
1532
1533   if (attr->intent == INTENT_UNKNOWN)
1534     {
1535       attr->intent = intent;
1536       return check_conflict (attr, NULL, where);
1537     }
1538
1539   if (where == NULL)
1540     where = &gfc_current_locus;
1541
1542   gfc_error ("INTENT (%s) conflicts with INTENT(%s) at %L",
1543              gfc_intent_string (attr->intent),
1544              gfc_intent_string (intent), where);
1545
1546   return false;
1547 }
1548
1549
1550 /* No checks for use-association in public and private statements.  */
1551
1552 bool
1553 gfc_add_access (symbol_attribute *attr, gfc_access access,
1554                 const char *name, locus *where)
1555 {
1556
1557   if (attr->access == ACCESS_UNKNOWN
1558         || (attr->use_assoc && attr->access != ACCESS_PRIVATE))
1559     {
1560       attr->access = access;
1561       return check_conflict (attr, name, where);
1562     }
1563
1564   if (where == NULL)
1565     where = &gfc_current_locus;
1566   gfc_error ("ACCESS specification at %L was already specified", where);
1567
1568   return false;
1569 }
1570
1571
1572 /* Set the is_bind_c field for the given symbol_attribute.  */
1573
1574 bool
1575 gfc_add_is_bind_c (symbol_attribute *attr, const char *name, locus *where,
1576                    int is_proc_lang_bind_spec)
1577 {
1578
1579   if (is_proc_lang_bind_spec == 0 && attr->flavor == FL_PROCEDURE)
1580     gfc_error_now ("BIND(C) attribute at %L can only be used for "
1581                    "variables or common blocks", where);
1582   else if (attr->is_bind_c)
1583     gfc_error_now ("Duplicate BIND attribute specified at %L", where);
1584   else
1585     attr->is_bind_c = 1;
1586   
1587   if (where == NULL)
1588     where = &gfc_current_locus;
1589    
1590   if (!gfc_notify_std (GFC_STD_F2003, "BIND(C) at %L", where))
1591     return false;
1592
1593   return check_conflict (attr, name, where);
1594 }
1595
1596
1597 /* Set the extension field for the given symbol_attribute.  */
1598
1599 bool
1600 gfc_add_extension (symbol_attribute *attr, locus *where)
1601 {
1602   if (where == NULL)
1603     where = &gfc_current_locus;
1604
1605   if (attr->extension)
1606     gfc_error_now ("Duplicate EXTENDS attribute specified at %L", where);
1607   else
1608     attr->extension = 1;
1609
1610   if (!gfc_notify_std (GFC_STD_F2003, "EXTENDS at %L", where))
1611     return false;
1612
1613   return true;
1614 }
1615
1616
1617 bool
1618 gfc_add_explicit_interface (gfc_symbol *sym, ifsrc source,
1619                             gfc_formal_arglist * formal, locus *where)
1620 {
1621
1622   if (check_used (&sym->attr, sym->name, where))
1623     return false;
1624
1625   if (where == NULL)
1626     where = &gfc_current_locus;
1627
1628   if (sym->attr.if_source != IFSRC_UNKNOWN
1629       && sym->attr.if_source != IFSRC_DECL)
1630     {
1631       gfc_error ("Symbol '%s' at %L already has an explicit interface",
1632                  sym->name, where);
1633       return false;
1634     }
1635
1636   if (source == IFSRC_IFBODY && (sym->attr.dimension || sym->attr.allocatable))
1637     {
1638       gfc_error ("'%s' at %L has attributes specified outside its INTERFACE "
1639                  "body", sym->name, where);
1640       return false;
1641     }
1642
1643   sym->formal = formal;
1644   sym->attr.if_source = source;
1645
1646   return true;
1647 }
1648
1649
1650 /* Add a type to a symbol.  */
1651
1652 bool
1653 gfc_add_type (gfc_symbol *sym, gfc_typespec *ts, locus *where)
1654 {
1655   sym_flavor flavor;
1656   bt type;
1657
1658   if (where == NULL)
1659     where = &gfc_current_locus;
1660
1661   if (sym->result)
1662     type = sym->result->ts.type;
1663   else
1664     type = sym->ts.type;
1665
1666   if (sym->attr.result && type == BT_UNKNOWN && sym->ns->proc_name)
1667     type = sym->ns->proc_name->ts.type;
1668
1669   if (type != BT_UNKNOWN && !(sym->attr.function && sym->attr.implicit_type))
1670     {
1671       if (sym->attr.use_assoc)
1672         gfc_error ("Symbol '%s' at %L conflicts with symbol from module '%s', "
1673                    "use-associated at %L", sym->name, where, sym->module,
1674                    &sym->declared_at);
1675       else
1676         gfc_error ("Symbol '%s' at %L already has basic type of %s", sym->name,
1677                  where, gfc_basic_typename (type));
1678       return false;
1679     }
1680
1681   if (sym->attr.procedure && sym->ts.interface)
1682     {
1683       gfc_error ("Procedure '%s' at %L may not have basic type of %s",
1684                  sym->name, where, gfc_basic_typename (ts->type));
1685       return false;
1686     }
1687
1688   flavor = sym->attr.flavor;
1689
1690   if (flavor == FL_PROGRAM || flavor == FL_BLOCK_DATA || flavor == FL_MODULE
1691       || flavor == FL_LABEL
1692       || (flavor == FL_PROCEDURE && sym->attr.subroutine)
1693       || flavor == FL_DERIVED || flavor == FL_NAMELIST)
1694     {
1695       gfc_error ("Symbol '%s' at %L cannot have a type", sym->name, where);
1696       return false;
1697     }
1698
1699   sym->ts = *ts;
1700   return true;
1701 }
1702
1703
1704 /* Clears all attributes.  */
1705
1706 void
1707 gfc_clear_attr (symbol_attribute *attr)
1708 {
1709   memset (attr, 0, sizeof (symbol_attribute));
1710 }
1711
1712
1713 /* Check for missing attributes in the new symbol.  Currently does
1714    nothing, but it's not clear that it is unnecessary yet.  */
1715
1716 bool
1717 gfc_missing_attr (symbol_attribute *attr ATTRIBUTE_UNUSED,
1718                   locus *where ATTRIBUTE_UNUSED)
1719 {
1720
1721   return true;
1722 }
1723
1724
1725 /* Copy an attribute to a symbol attribute, bit by bit.  Some
1726    attributes have a lot of side-effects but cannot be present given
1727    where we are called from, so we ignore some bits.  */
1728
1729 bool
1730 gfc_copy_attr (symbol_attribute *dest, symbol_attribute *src, locus *where)
1731 {
1732   int is_proc_lang_bind_spec;
1733   
1734   /* In line with the other attributes, we only add bits but do not remove
1735      them; cf. also PR 41034.  */
1736   dest->ext_attr |= src->ext_attr;
1737
1738   if (src->allocatable && !gfc_add_allocatable (dest, where))
1739     goto fail;
1740
1741   if (src->dimension && !gfc_add_dimension (dest, NULL, where))
1742     goto fail;
1743   if (src->codimension && !gfc_add_codimension (dest, NULL, where))
1744     goto fail;
1745   if (src->contiguous && !gfc_add_contiguous (dest, NULL, where))
1746     goto fail;
1747   if (src->optional && !gfc_add_optional (dest, where))
1748     goto fail;
1749   if (src->pointer && !gfc_add_pointer (dest, where))
1750     goto fail;
1751   if (src->is_protected && !gfc_add_protected (dest, NULL, where))
1752     goto fail;
1753   if (src->save && !gfc_add_save (dest, src->save, NULL, where))
1754     goto fail;
1755   if (src->value && !gfc_add_value (dest, NULL, where))
1756     goto fail;
1757   if (src->volatile_ && !gfc_add_volatile (dest, NULL, where))
1758     goto fail;
1759   if (src->asynchronous && !gfc_add_asynchronous (dest, NULL, where))
1760     goto fail;
1761   if (src->threadprivate
1762       && !gfc_add_threadprivate (dest, NULL, where))
1763     goto fail;
1764   if (src->target && !gfc_add_target (dest, where))
1765     goto fail;
1766   if (src->dummy && !gfc_add_dummy (dest, NULL, where))
1767     goto fail;
1768   if (src->result && !gfc_add_result (dest, NULL, where))
1769     goto fail;
1770   if (src->entry)
1771     dest->entry = 1;
1772
1773   if (src->in_namelist && !gfc_add_in_namelist (dest, NULL, where))
1774     goto fail;
1775
1776   if (src->in_common && !gfc_add_in_common (dest, NULL, where))
1777     goto fail;
1778
1779   if (src->generic && !gfc_add_generic (dest, NULL, where))
1780     goto fail;
1781   if (src->function && !gfc_add_function (dest, NULL, where))
1782     goto fail;
1783   if (src->subroutine && !gfc_add_subroutine (dest, NULL, where))
1784     goto fail;
1785
1786   if (src->sequence && !gfc_add_sequence (dest, NULL, where))
1787     goto fail;
1788   if (src->elemental && !gfc_add_elemental (dest, where))
1789     goto fail;
1790   if (src->pure && !gfc_add_pure (dest, where))
1791     goto fail;
1792   if (src->recursive && !gfc_add_recursive (dest, where))
1793     goto fail;
1794
1795   if (src->flavor != FL_UNKNOWN
1796       && !gfc_add_flavor (dest, src->flavor, NULL, where))
1797     goto fail;
1798
1799   if (src->intent != INTENT_UNKNOWN
1800       && !gfc_add_intent (dest, src->intent, where))
1801     goto fail;
1802
1803   if (src->access != ACCESS_UNKNOWN
1804       && !gfc_add_access (dest, src->access, NULL, where))
1805     goto fail;
1806
1807   if (!gfc_missing_attr (dest, where))
1808     goto fail;
1809
1810   if (src->cray_pointer && !gfc_add_cray_pointer (dest, where))
1811     goto fail;
1812   if (src->cray_pointee && !gfc_add_cray_pointee (dest, where))
1813     goto fail;
1814
1815   is_proc_lang_bind_spec = (src->flavor == FL_PROCEDURE ? 1 : 0);
1816   if (src->is_bind_c
1817       && !gfc_add_is_bind_c (dest, NULL, where, is_proc_lang_bind_spec))
1818     return false;
1819
1820   if (src->is_c_interop)
1821     dest->is_c_interop = 1;
1822   if (src->is_iso_c)
1823     dest->is_iso_c = 1;
1824   
1825   if (src->external && !gfc_add_external (dest, where))
1826     goto fail;
1827   if (src->intrinsic && !gfc_add_intrinsic (dest, where))
1828     goto fail;
1829   if (src->proc_pointer)
1830     dest->proc_pointer = 1;
1831
1832   return true;
1833
1834 fail:
1835   return false;
1836 }
1837
1838
1839 /************** Component name management ************/
1840
1841 /* Component names of a derived type form their own little namespaces
1842    that are separate from all other spaces.  The space is composed of
1843    a singly linked list of gfc_component structures whose head is
1844    located in the parent symbol.  */
1845
1846
1847 /* Add a component name to a symbol.  The call fails if the name is
1848    already present.  On success, the component pointer is modified to
1849    point to the additional component structure.  */
1850
1851 bool
1852 gfc_add_component (gfc_symbol *sym, const char *name,
1853                    gfc_component **component)
1854 {
1855   gfc_component *p, *tail;
1856
1857   tail = NULL;
1858
1859   for (p = sym->components; p; p = p->next)
1860     {
1861       if (strcmp (p->name, name) == 0)
1862         {
1863           gfc_error ("Component '%s' at %C already declared at %L",
1864                      name, &p->loc);
1865           return false;
1866         }
1867
1868       tail = p;
1869     }
1870
1871   if (sym->attr.extension
1872         && gfc_find_component (sym->components->ts.u.derived, name, true, true))
1873     {
1874       gfc_error ("Component '%s' at %C already in the parent type "
1875                  "at %L", name, &sym->components->ts.u.derived->declared_at);
1876       return false;
1877     }
1878
1879   /* Allocate a new component.  */
1880   p = gfc_get_component ();
1881
1882   if (tail == NULL)
1883     sym->components = p;
1884   else
1885     tail->next = p;
1886
1887   p->name = gfc_get_string (name);
1888   p->loc = gfc_current_locus;
1889   p->ts.type = BT_UNKNOWN;
1890
1891   *component = p;
1892   return true;
1893 }
1894
1895
1896 /* Recursive function to switch derived types of all symbol in a
1897    namespace.  */
1898
1899 static void
1900 switch_types (gfc_symtree *st, gfc_symbol *from, gfc_symbol *to)
1901 {
1902   gfc_symbol *sym;
1903
1904   if (st == NULL)
1905     return;
1906
1907   sym = st->n.sym;
1908   if (sym->ts.type == BT_DERIVED && sym->ts.u.derived == from)
1909     sym->ts.u.derived = to;
1910
1911   switch_types (st->left, from, to);
1912   switch_types (st->right, from, to);
1913 }
1914
1915
1916 /* This subroutine is called when a derived type is used in order to
1917    make the final determination about which version to use.  The
1918    standard requires that a type be defined before it is 'used', but
1919    such types can appear in IMPLICIT statements before the actual
1920    definition.  'Using' in this context means declaring a variable to
1921    be that type or using the type constructor.
1922
1923    If a type is used and the components haven't been defined, then we
1924    have to have a derived type in a parent unit.  We find the node in
1925    the other namespace and point the symtree node in this namespace to
1926    that node.  Further reference to this name point to the correct
1927    node.  If we can't find the node in a parent namespace, then we have
1928    an error.
1929
1930    This subroutine takes a pointer to a symbol node and returns a
1931    pointer to the translated node or NULL for an error.  Usually there
1932    is no translation and we return the node we were passed.  */
1933
1934 gfc_symbol *
1935 gfc_use_derived (gfc_symbol *sym)
1936 {
1937   gfc_symbol *s;
1938   gfc_typespec *t;
1939   gfc_symtree *st;
1940   int i;
1941
1942   if (!sym)
1943     return NULL;
1944
1945   if (sym->attr.unlimited_polymorphic)
1946     return sym;
1947
1948   if (sym->attr.generic)
1949     sym = gfc_find_dt_in_generic (sym);
1950
1951   if (sym->components != NULL || sym->attr.zero_comp)
1952     return sym;               /* Already defined.  */
1953
1954   if (sym->ns->parent == NULL)
1955     goto bad;
1956
1957   if (gfc_find_symbol (sym->name, sym->ns->parent, 1, &s))
1958     {
1959       gfc_error ("Symbol '%s' at %C is ambiguous", sym->name);
1960       return NULL;
1961     }
1962
1963   if (s == NULL || s->attr.flavor != FL_DERIVED)
1964     goto bad;
1965
1966   /* Get rid of symbol sym, translating all references to s.  */
1967   for (i = 0; i < GFC_LETTERS; i++)
1968     {
1969       t = &sym->ns->default_type[i];
1970       if (t->u.derived == sym)
1971         t->u.derived = s;
1972     }
1973
1974   st = gfc_find_symtree (sym->ns->sym_root, sym->name);
1975   st->n.sym = s;
1976
1977   s->refs++;
1978
1979   /* Unlink from list of modified symbols.  */
1980   gfc_commit_symbol (sym);
1981
1982   switch_types (sym->ns->sym_root, sym, s);
1983
1984   /* TODO: Also have to replace sym -> s in other lists like
1985      namelists, common lists and interface lists.  */
1986   gfc_free_symbol (sym);
1987
1988   return s;
1989
1990 bad:
1991   gfc_error ("Derived type '%s' at %C is being used before it is defined",
1992              sym->name);
1993   return NULL;
1994 }
1995
1996
1997 /* Given a derived type node and a component name, try to locate the
1998    component structure.  Returns the NULL pointer if the component is
1999    not found or the components are private.  If noaccess is set, no access
2000    checks are done.  */
2001
2002 gfc_component *
2003 gfc_find_component (gfc_symbol *sym, const char *name,
2004                     bool noaccess, bool silent)
2005 {
2006   gfc_component *p;
2007
2008   if (name == NULL || sym == NULL)
2009     return NULL;
2010
2011   sym = gfc_use_derived (sym);
2012
2013   if (sym == NULL)
2014     return NULL;
2015
2016   for (p = sym->components; p; p = p->next)
2017     if (strcmp (p->name, name) == 0)
2018       break;
2019
2020   if (p && sym->attr.use_assoc && !noaccess)
2021     {
2022       bool is_parent_comp = sym->attr.extension && (p == sym->components);
2023       if (p->attr.access == ACCESS_PRIVATE ||
2024           (p->attr.access != ACCESS_PUBLIC
2025            && sym->component_access == ACCESS_PRIVATE
2026            && !is_parent_comp))
2027         {
2028           if (!silent)
2029             gfc_error ("Component '%s' at %C is a PRIVATE component of '%s'",
2030                        name, sym->name);
2031           return NULL;
2032         }
2033     }
2034
2035   if (p == NULL
2036         && sym->attr.extension
2037         && sym->components->ts.type == BT_DERIVED)
2038     {
2039       p = gfc_find_component (sym->components->ts.u.derived, name,
2040                               noaccess, silent);
2041       /* Do not overwrite the error.  */
2042       if (p == NULL)
2043         return p;
2044     }
2045
2046   if (p == NULL && !silent)
2047     gfc_error ("'%s' at %C is not a member of the '%s' structure",
2048                name, sym->name);
2049
2050   return p;
2051 }
2052
2053
2054 /* Given a symbol, free all of the component structures and everything
2055    they point to.  */
2056
2057 static void
2058 free_components (gfc_component *p)
2059 {
2060   gfc_component *q;
2061
2062   for (; p; p = q)
2063     {
2064       q = p->next;
2065
2066       gfc_free_array_spec (p->as);
2067       gfc_free_expr (p->initializer);
2068       free (p->tb);
2069
2070       free (p);
2071     }
2072 }
2073
2074
2075 /******************** Statement label management ********************/
2076
2077 /* Comparison function for statement labels, used for managing the
2078    binary tree.  */
2079
2080 static int
2081 compare_st_labels (void *a1, void *b1)
2082 {
2083   int a = ((gfc_st_label *) a1)->value;
2084   int b = ((gfc_st_label *) b1)->value;
2085
2086   return (b - a);
2087 }
2088
2089
2090 /* Free a single gfc_st_label structure, making sure the tree is not
2091    messed up.  This function is called only when some parse error
2092    occurs.  */
2093
2094 void
2095 gfc_free_st_label (gfc_st_label *label)
2096 {
2097
2098   if (label == NULL)
2099     return;
2100
2101   gfc_delete_bbt (&gfc_current_ns->st_labels, label, compare_st_labels);
2102
2103   if (label->format != NULL)
2104     gfc_free_expr (label->format);
2105
2106   free (label);
2107 }
2108
2109
2110 /* Free a whole tree of gfc_st_label structures.  */
2111
2112 static void
2113 free_st_labels (gfc_st_label *label)
2114 {
2115
2116   if (label == NULL)
2117     return;
2118
2119   free_st_labels (label->left);
2120   free_st_labels (label->right);
2121   
2122   if (label->format != NULL)
2123     gfc_free_expr (label->format);
2124   free (label);
2125 }
2126
2127
2128 /* Given a label number, search for and return a pointer to the label
2129    structure, creating it if it does not exist.  */
2130
2131 gfc_st_label *
2132 gfc_get_st_label (int labelno)
2133 {
2134   gfc_st_label *lp;
2135   gfc_namespace *ns;
2136
2137   if (gfc_current_state () == COMP_DERIVED)
2138     ns = gfc_current_block ()->f2k_derived;
2139   else
2140     {
2141       /* Find the namespace of the scoping unit:
2142          If we're in a BLOCK construct, jump to the parent namespace.  */
2143       ns = gfc_current_ns;
2144       while (ns->proc_name && ns->proc_name->attr.flavor == FL_LABEL)
2145         ns = ns->parent;
2146     }
2147
2148   /* First see if the label is already in this namespace.  */
2149   lp = ns->st_labels;
2150   while (lp)
2151     {
2152       if (lp->value == labelno)
2153         return lp;
2154
2155       if (lp->value < labelno)
2156         lp = lp->left;
2157       else
2158         lp = lp->right;
2159     }
2160
2161   lp = XCNEW (gfc_st_label);
2162
2163   lp->value = labelno;
2164   lp->defined = ST_LABEL_UNKNOWN;
2165   lp->referenced = ST_LABEL_UNKNOWN;
2166
2167   gfc_insert_bbt (&ns->st_labels, lp, compare_st_labels);
2168
2169   return lp;
2170 }
2171
2172
2173 /* Called when a statement with a statement label is about to be
2174    accepted.  We add the label to the list of the current namespace,
2175    making sure it hasn't been defined previously and referenced
2176    correctly.  */
2177
2178 void
2179 gfc_define_st_label (gfc_st_label *lp, gfc_sl_type type, locus *label_locus)
2180 {
2181   int labelno;
2182
2183   labelno = lp->value;
2184
2185   if (lp->defined != ST_LABEL_UNKNOWN)
2186     gfc_error ("Duplicate statement label %d at %L and %L", labelno,
2187                &lp->where, label_locus);
2188   else
2189     {
2190       lp->where = *label_locus;
2191
2192       switch (type)
2193         {
2194         case ST_LABEL_FORMAT:
2195           if (lp->referenced == ST_LABEL_TARGET
2196               || lp->referenced == ST_LABEL_DO_TARGET)
2197             gfc_error ("Label %d at %C already referenced as branch target",
2198                        labelno);
2199           else
2200             lp->defined = ST_LABEL_FORMAT;
2201
2202           break;
2203
2204         case ST_LABEL_TARGET:
2205         case ST_LABEL_DO_TARGET:
2206           if (lp->referenced == ST_LABEL_FORMAT)
2207             gfc_error ("Label %d at %C already referenced as a format label",
2208                        labelno);
2209           else
2210             lp->defined = type;
2211
2212           if (lp->referenced == ST_LABEL_DO_TARGET && type != ST_LABEL_DO_TARGET
2213               && !gfc_notify_std (GFC_STD_F95_OBS, "DO termination statement "
2214                                   "which is not END DO or CONTINUE with "
2215                                   "label %d at %C", labelno))
2216             return;
2217           break;
2218
2219         default:
2220           lp->defined = ST_LABEL_BAD_TARGET;
2221           lp->referenced = ST_LABEL_BAD_TARGET;
2222         }
2223     }
2224 }
2225
2226
2227 /* Reference a label.  Given a label and its type, see if that
2228    reference is consistent with what is known about that label,
2229    updating the unknown state.  Returns false if something goes
2230    wrong.  */
2231
2232 bool
2233 gfc_reference_st_label (gfc_st_label *lp, gfc_sl_type type)
2234 {
2235   gfc_sl_type label_type;
2236   int labelno;
2237   bool rc;
2238
2239   if (lp == NULL)
2240     return true;
2241
2242   labelno = lp->value;
2243
2244   if (lp->defined != ST_LABEL_UNKNOWN)
2245     label_type = lp->defined;
2246   else
2247     {
2248       label_type = lp->referenced;
2249       lp->where = gfc_current_locus;
2250     }
2251
2252   if (label_type == ST_LABEL_FORMAT
2253       && (type == ST_LABEL_TARGET || type == ST_LABEL_DO_TARGET))
2254     {
2255       gfc_error ("Label %d at %C previously used as a FORMAT label", labelno);
2256       rc = false;
2257       goto done;
2258     }
2259
2260   if ((label_type == ST_LABEL_TARGET || label_type == ST_LABEL_DO_TARGET
2261        || label_type == ST_LABEL_BAD_TARGET)
2262       && type == ST_LABEL_FORMAT)
2263     {
2264       gfc_error ("Label %d at %C previously used as branch target", labelno);
2265       rc = false;
2266       goto done;
2267     }
2268
2269   if (lp->referenced == ST_LABEL_DO_TARGET && type == ST_LABEL_DO_TARGET
2270       && !gfc_notify_std (GFC_STD_F95_OBS, "Shared DO termination label %d "
2271                           "at %C", labelno))
2272     return false;
2273
2274   if (lp->referenced != ST_LABEL_DO_TARGET)
2275     lp->referenced = type;
2276   rc = true;
2277
2278 done:
2279   return rc;
2280 }
2281
2282
2283 /************** Symbol table management subroutines ****************/
2284
2285 /* Basic details: Fortran 95 requires a potentially unlimited number
2286    of distinct namespaces when compiling a program unit.  This case
2287    occurs during a compilation of internal subprograms because all of
2288    the internal subprograms must be read before we can start
2289    generating code for the host.
2290
2291    Given the tricky nature of the Fortran grammar, we must be able to
2292    undo changes made to a symbol table if the current interpretation
2293    of a statement is found to be incorrect.  Whenever a symbol is
2294    looked up, we make a copy of it and link to it.  All of these
2295    symbols are kept in a vector so that we can commit or
2296    undo the changes at a later time.
2297
2298    A symtree may point to a symbol node outside of its namespace.  In
2299    this case, that symbol has been used as a host associated variable
2300    at some previous time.  */
2301
2302 /* Allocate a new namespace structure.  Copies the implicit types from
2303    PARENT if PARENT_TYPES is set.  */
2304
2305 gfc_namespace *
2306 gfc_get_namespace (gfc_namespace *parent, int parent_types)
2307 {
2308   gfc_namespace *ns;
2309   gfc_typespec *ts;
2310   int in;
2311   int i;
2312
2313   ns = XCNEW (gfc_namespace);
2314   ns->sym_root = NULL;
2315   ns->uop_root = NULL;
2316   ns->tb_sym_root = NULL;
2317   ns->finalizers = NULL;
2318   ns->default_access = ACCESS_UNKNOWN;
2319   ns->parent = parent;
2320
2321   for (in = GFC_INTRINSIC_BEGIN; in != GFC_INTRINSIC_END; in++)
2322     {
2323       ns->operator_access[in] = ACCESS_UNKNOWN;
2324       ns->tb_op[in] = NULL;
2325     }
2326
2327   /* Initialize default implicit types.  */
2328   for (i = 'a'; i <= 'z'; i++)
2329     {
2330       ns->set_flag[i - 'a'] = 0;
2331       ts = &ns->default_type[i - 'a'];
2332
2333       if (parent_types && ns->parent != NULL)
2334         {
2335           /* Copy parent settings.  */
2336           *ts = ns->parent->default_type[i - 'a'];
2337           continue;
2338         }
2339
2340       if (gfc_option.flag_implicit_none != 0)
2341         {
2342           gfc_clear_ts (ts);
2343           continue;
2344         }
2345
2346       if ('i' <= i && i <= 'n')
2347         {
2348           ts->type = BT_INTEGER;
2349           ts->kind = gfc_default_integer_kind;
2350         }
2351       else
2352         {
2353           ts->type = BT_REAL;
2354           ts->kind = gfc_default_real_kind;
2355         }
2356     }
2357
2358   ns->refs = 1;
2359
2360   return ns;
2361 }
2362
2363
2364 /* Comparison function for symtree nodes.  */
2365
2366 static int
2367 compare_symtree (void *_st1, void *_st2)
2368 {
2369   gfc_symtree *st1, *st2;
2370
2371   st1 = (gfc_symtree *) _st1;
2372   st2 = (gfc_symtree *) _st2;
2373
2374   return strcmp (st1->name, st2->name);
2375 }
2376
2377
2378 /* Allocate a new symtree node and associate it with the new symbol.  */
2379
2380 gfc_symtree *
2381 gfc_new_symtree (gfc_symtree **root, const char *name)
2382 {
2383   gfc_symtree *st;
2384
2385   st = XCNEW (gfc_symtree);
2386   st->name = gfc_get_string (name);
2387
2388   gfc_insert_bbt (root, st, compare_symtree);
2389   return st;
2390 }
2391
2392
2393 /* Delete a symbol from the tree.  Does not free the symbol itself!  */
2394
2395 void
2396 gfc_delete_symtree (gfc_symtree **root, const char *name)
2397 {
2398   gfc_symtree st, *st0;
2399
2400   st0 = gfc_find_symtree (*root, name);
2401
2402   st.name = gfc_get_string (name);
2403   gfc_delete_bbt (root, &st, compare_symtree);
2404
2405   free (st0);
2406 }
2407
2408
2409 /* Given a root symtree node and a name, try to find the symbol within
2410    the namespace.  Returns NULL if the symbol is not found.  */
2411
2412 gfc_symtree *
2413 gfc_find_symtree (gfc_symtree *st, const char *name)
2414 {
2415   int c;
2416
2417   while (st != NULL)
2418     {
2419       c = strcmp (name, st->name);
2420       if (c == 0)
2421         return st;
2422
2423       st = (c < 0) ? st->left : st->right;
2424     }
2425
2426   return NULL;
2427 }
2428
2429
2430 /* Return a symtree node with a name that is guaranteed to be unique
2431    within the namespace and corresponds to an illegal fortran name.  */
2432
2433 gfc_symtree *
2434 gfc_get_unique_symtree (gfc_namespace *ns)
2435 {
2436   char name[GFC_MAX_SYMBOL_LEN + 1];
2437   static int serial = 0;
2438
2439   sprintf (name, "@%d", serial++);
2440   return gfc_new_symtree (&ns->sym_root, name);
2441 }
2442
2443
2444 /* Given a name find a user operator node, creating it if it doesn't
2445    exist.  These are much simpler than symbols because they can't be
2446    ambiguous with one another.  */
2447
2448 gfc_user_op *
2449 gfc_get_uop (const char *name)
2450 {
2451   gfc_user_op *uop;
2452   gfc_symtree *st;
2453
2454   st = gfc_find_symtree (gfc_current_ns->uop_root, name);
2455   if (st != NULL)
2456     return st->n.uop;
2457
2458   st = gfc_new_symtree (&gfc_current_ns->uop_root, name);
2459
2460   uop = st->n.uop = XCNEW (gfc_user_op);
2461   uop->name = gfc_get_string (name);
2462   uop->access = ACCESS_UNKNOWN;
2463   uop->ns = gfc_current_ns;
2464
2465   return uop;
2466 }
2467
2468
2469 /* Given a name find the user operator node.  Returns NULL if it does
2470    not exist.  */
2471
2472 gfc_user_op *
2473 gfc_find_uop (const char *name, gfc_namespace *ns)
2474 {
2475   gfc_symtree *st;
2476
2477   if (ns == NULL)
2478     ns = gfc_current_ns;
2479
2480   st = gfc_find_symtree (ns->uop_root, name);
2481   return (st == NULL) ? NULL : st->n.uop;
2482 }
2483
2484
2485 /* Remove a gfc_symbol structure and everything it points to.  */
2486
2487 void
2488 gfc_free_symbol (gfc_symbol *sym)
2489 {
2490
2491   if (sym == NULL)
2492     return;
2493
2494   gfc_free_array_spec (sym->as);
2495
2496   free_components (sym->components);
2497
2498   gfc_free_expr (sym->value);
2499
2500   gfc_free_namelist (sym->namelist);
2501
2502   if (sym->ns != sym->formal_ns)
2503     gfc_free_namespace (sym->formal_ns);
2504
2505   if (!sym->attr.generic_copy)
2506     gfc_free_interface (sym->generic);
2507
2508   gfc_free_formal_arglist (sym->formal);
2509
2510   gfc_free_namespace (sym->f2k_derived);
2511
2512   if (sym->common_block && sym->common_block->name[0] != '\0')
2513     { 
2514       sym->common_block->refs--; 
2515       if (sym->common_block->refs == 0)
2516         free (sym->common_block);
2517     }
2518
2519   free (sym);
2520 }
2521
2522
2523 /* Decrease the reference counter and free memory when we reach zero.  */
2524
2525 void
2526 gfc_release_symbol (gfc_symbol *sym)
2527 {
2528   if (sym == NULL)
2529     return;
2530
2531   if (sym->formal_ns != NULL && sym->refs == 2 && sym->formal_ns != sym->ns
2532       && (!sym->attr.entry || !sym->module))
2533     {
2534       /* As formal_ns contains a reference to sym, delete formal_ns just
2535          before the deletion of sym.  */
2536       gfc_namespace *ns = sym->formal_ns;
2537       sym->formal_ns = NULL;
2538       gfc_free_namespace (ns);
2539     }
2540
2541   sym->refs--;
2542   if (sym->refs > 0)
2543     return;
2544
2545   gcc_assert (sym->refs == 0);
2546   gfc_free_symbol (sym);
2547 }
2548
2549
2550 /* Allocate and initialize a new symbol node.  */
2551
2552 gfc_symbol *
2553 gfc_new_symbol (const char *name, gfc_namespace *ns)
2554 {
2555   gfc_symbol *p;
2556
2557   p = XCNEW (gfc_symbol);
2558
2559   gfc_clear_ts (&p->ts);
2560   gfc_clear_attr (&p->attr);
2561   p->ns = ns;
2562
2563   p->declared_at = gfc_current_locus;
2564
2565   if (strlen (name) > GFC_MAX_SYMBOL_LEN)
2566     gfc_internal_error ("new_symbol(): Symbol name too long");
2567
2568   p->name = gfc_get_string (name);
2569
2570   /* Make sure flags for symbol being C bound are clear initially.  */
2571   p->attr.is_bind_c = 0;
2572   p->attr.is_iso_c = 0;
2573
2574   /* Clear the ptrs we may need.  */
2575   p->common_block = NULL;
2576   p->f2k_derived = NULL;
2577   p->assoc = NULL;
2578   
2579   return p;
2580 }
2581
2582
2583 /* Generate an error if a symbol is ambiguous.  */
2584
2585 static void
2586 ambiguous_symbol (const char *name, gfc_symtree *st)
2587 {
2588
2589   if (st->n.sym->module)
2590     gfc_error ("Name '%s' at %C is an ambiguous reference to '%s' "
2591                "from module '%s'", name, st->n.sym->name, st->n.sym->module);
2592   else
2593     gfc_error ("Name '%s' at %C is an ambiguous reference to '%s' "
2594                "from current program unit", name, st->n.sym->name);
2595 }
2596
2597
2598 /* If we're in a SELECT TYPE block, check if the variable 'st' matches any
2599    selector on the stack. If yes, replace it by the corresponding temporary.  */
2600
2601 static void
2602 select_type_insert_tmp (gfc_symtree **st)
2603 {
2604   gfc_select_type_stack *stack = select_type_stack;
2605   for (; stack; stack = stack->prev)
2606     if ((*st)->n.sym == stack->selector && stack->tmp)
2607       *st = stack->tmp;
2608 }
2609
2610
2611 /* Look for a symtree in the current procedure -- that is, go up to
2612    parent namespaces but only if inside a BLOCK.  Returns NULL if not found.  */
2613
2614 gfc_symtree*
2615 gfc_find_symtree_in_proc (const char* name, gfc_namespace* ns)
2616 {
2617   while (ns)
2618     {
2619       gfc_symtree* st = gfc_find_symtree (ns->sym_root, name);
2620       if (st)
2621         return st;
2622
2623       if (!ns->construct_entities)
2624         break;
2625       ns = ns->parent;
2626     }
2627
2628   return NULL;
2629 }
2630
2631
2632 /* Search for a symtree starting in the current namespace, resorting to
2633    any parent namespaces if requested by a nonzero parent_flag.
2634    Returns nonzero if the name is ambiguous.  */
2635
2636 int
2637 gfc_find_sym_tree (const char *name, gfc_namespace *ns, int parent_flag,
2638                    gfc_symtree **result)
2639 {
2640   gfc_symtree *st;
2641
2642   if (ns == NULL)
2643     ns = gfc_current_ns;
2644
2645   do
2646     {
2647       st = gfc_find_symtree (ns->sym_root, name);
2648       if (st != NULL)
2649         {
2650           select_type_insert_tmp (&st);
2651
2652           *result = st;
2653           /* Ambiguous generic interfaces are permitted, as long
2654              as the specific interfaces are different.  */
2655           if (st->ambiguous && !st->n.sym->attr.generic)
2656             {
2657               ambiguous_symbol (name, st);
2658               return 1;
2659             }
2660
2661           return 0;
2662         }
2663
2664       if (!parent_flag)
2665         break;
2666
2667       /* Don't escape an interface block.  */
2668       if (ns && !ns->has_import_set
2669           && ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY)
2670         break;
2671
2672       ns = ns->parent;
2673     }
2674   while (ns != NULL);
2675
2676   *result = NULL;
2677   return 0;
2678 }
2679
2680
2681 /* Same, but returns the symbol instead.  */
2682
2683 int
2684 gfc_find_symbol (const char *name, gfc_namespace *ns, int parent_flag,
2685                  gfc_symbol **result)
2686 {
2687   gfc_symtree *st;
2688   int i;
2689
2690   i = gfc_find_sym_tree (name, ns, parent_flag, &st);
2691
2692   if (st == NULL)
2693     *result = NULL;
2694   else
2695     *result = st->n.sym;
2696
2697   return i;
2698 }
2699
2700
2701 /* Tells whether there is only one set of changes in the stack.  */
2702
2703 static bool
2704 single_undo_checkpoint_p (void)
2705 {
2706   if (latest_undo_chgset == &default_undo_chgset_var)
2707     {
2708       gcc_assert (latest_undo_chgset->previous == NULL);
2709       return true;
2710     }
2711   else
2712     {
2713       gcc_assert (latest_undo_chgset->previous != NULL);
2714       return false;
2715     }
2716 }
2717
2718 /* Save symbol with the information necessary to back it out.  */
2719
2720 static void
2721 save_symbol_data (gfc_symbol *sym)
2722 {
2723   gfc_symbol *s;
2724   unsigned i;
2725
2726   if (!single_undo_checkpoint_p ())
2727     {
2728       /* If there is more than one change set, look for the symbol in the
2729          current one.  If it is found there, we can reuse it.  */
2730       FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, s)
2731         if (s == sym)
2732           {
2733             gcc_assert (sym->gfc_new || sym->old_symbol != NULL);
2734             return;
2735           }
2736     }
2737   else if (sym->gfc_new || sym->old_symbol != NULL)
2738     return;
2739
2740   s = XCNEW (gfc_symbol);
2741   *s = *sym;
2742   sym->old_symbol = s;
2743   sym->gfc_new = 0;
2744
2745   latest_undo_chgset->syms.safe_push (sym);
2746 }
2747
2748
2749 /* Given a name, find a symbol, or create it if it does not exist yet
2750    in the current namespace.  If the symbol is found we make sure that
2751    it's OK.
2752
2753    The integer return code indicates
2754      0   All OK
2755      1   The symbol name was ambiguous
2756      2   The name meant to be established was already host associated.
2757
2758    So if the return value is nonzero, then an error was issued.  */
2759
2760 int
2761 gfc_get_sym_tree (const char *name, gfc_namespace *ns, gfc_symtree **result,
2762                   bool allow_subroutine)
2763 {
2764   gfc_symtree *st;
2765   gfc_symbol *p;
2766
2767   /* This doesn't usually happen during resolution.  */
2768   if (ns == NULL)
2769     ns = gfc_current_ns;
2770
2771   /* Try to find the symbol in ns.  */
2772   st = gfc_find_symtree (ns->sym_root, name);
2773
2774   if (st == NULL)
2775     {
2776       /* If not there, create a new symbol.  */
2777       p = gfc_new_symbol (name, ns);
2778
2779       /* Add to the list of tentative symbols.  */
2780       p->old_symbol = NULL;
2781       p->mark = 1;
2782       p->gfc_new = 1;
2783       latest_undo_chgset->syms.safe_push (p);
2784
2785       st = gfc_new_symtree (&ns->sym_root, name);
2786       st->n.sym = p;
2787       p->refs++;
2788
2789     }
2790   else
2791     {
2792       /* Make sure the existing symbol is OK.  Ambiguous
2793          generic interfaces are permitted, as long as the
2794          specific interfaces are different.  */
2795       if (st->ambiguous && !st->n.sym->attr.generic)
2796         {
2797           ambiguous_symbol (name, st);
2798           return 1;
2799         }
2800
2801       p = st->n.sym;
2802       if (p->ns != ns && (!p->attr.function || ns->proc_name != p)
2803           && !(allow_subroutine && p->attr.subroutine)
2804           && !(ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY
2805           && (ns->has_import_set || p->attr.imported)))
2806         {
2807           /* Symbol is from another namespace.  */
2808           gfc_error ("Symbol '%s' at %C has already been host associated",
2809                      name);
2810           return 2;
2811         }
2812
2813       p->mark = 1;
2814
2815       /* Copy in case this symbol is changed.  */
2816       save_symbol_data (p);
2817     }
2818
2819   *result = st;
2820   return 0;
2821 }
2822
2823
2824 int
2825 gfc_get_symbol (const char *name, gfc_namespace *ns, gfc_symbol **result)
2826 {
2827   gfc_symtree *st;
2828   int i;
2829
2830   i = gfc_get_sym_tree (name, ns, &st, false);
2831   if (i != 0)
2832     return i;
2833
2834   if (st)
2835     *result = st->n.sym;
2836   else
2837     *result = NULL;
2838   return i;
2839 }
2840
2841
2842 /* Subroutine that searches for a symbol, creating it if it doesn't
2843    exist, but tries to host-associate the symbol if possible.  */
2844
2845 int
2846 gfc_get_ha_sym_tree (const char *name, gfc_symtree **result)
2847 {
2848   gfc_symtree *st;
2849   int i;
2850
2851   i = gfc_find_sym_tree (name, gfc_current_ns, 0, &st);
2852
2853   if (st != NULL)
2854     {
2855       save_symbol_data (st->n.sym);
2856       *result = st;
2857       return i;
2858     }
2859
2860   i = gfc_find_sym_tree (name, gfc_current_ns, 1, &st);
2861   if (i)
2862     return i;
2863
2864   if (st != NULL)
2865     {
2866       *result = st;
2867       return 0;
2868     }
2869
2870   return gfc_get_sym_tree (name, gfc_current_ns, result, false);
2871 }
2872
2873
2874 int
2875 gfc_get_ha_symbol (const char *name, gfc_symbol **result)
2876 {
2877   int i;
2878   gfc_symtree *st;
2879
2880   i = gfc_get_ha_sym_tree (name, &st);
2881
2882   if (st)
2883     *result = st->n.sym;
2884   else
2885     *result = NULL;
2886
2887   return i;
2888 }
2889
2890
2891 /* Search for the symtree belonging to a gfc_common_head; we cannot use
2892    head->name as the common_root symtree's name might be mangled.  */
2893
2894 static gfc_symtree *
2895 find_common_symtree (gfc_symtree *st, gfc_common_head *head)
2896 {
2897
2898   gfc_symtree *result;
2899
2900   if (st == NULL)
2901     return NULL;
2902
2903   if (st->n.common == head)
2904     return st;
2905
2906   result = find_common_symtree (st->left, head);
2907   if (!result)  
2908     result = find_common_symtree (st->right, head);
2909
2910   return result;
2911 }
2912
2913
2914 /* Clear the given storage, and make it the current change set for registering
2915    changed symbols.  Its contents are freed after a call to
2916    gfc_restore_last_undo_checkpoint or gfc_drop_last_undo_checkpoint, but
2917    it is up to the caller to free the storage itself.  It is usually a local
2918    variable, so there is nothing to do anyway.  */
2919
2920 void
2921 gfc_new_undo_checkpoint (gfc_undo_change_set &chg_syms)
2922 {
2923   chg_syms.syms = vNULL;
2924   chg_syms.tbps = vNULL;
2925   chg_syms.previous = latest_undo_chgset;
2926   latest_undo_chgset = &chg_syms;
2927 }
2928
2929
2930 /* Restore previous state of symbol.  Just copy simple stuff.  */
2931   
2932 static void
2933 restore_old_symbol (gfc_symbol *p)
2934 {
2935   gfc_symbol *old;
2936
2937   p->mark = 0;
2938   old = p->old_symbol;
2939
2940   p->ts.type = old->ts.type;
2941   p->ts.kind = old->ts.kind;
2942
2943   p->attr = old->attr;
2944
2945   if (p->value != old->value)
2946     {
2947       gcc_checking_assert (old->value == NULL);
2948       gfc_free_expr (p->value);
2949       p->value = NULL;
2950     }
2951
2952   if (p->as != old->as)
2953     {
2954       if (p->as)
2955         gfc_free_array_spec (p->as);
2956       p->as = old->as;
2957     }
2958
2959   p->generic = old->generic;
2960   p->component_access = old->component_access;
2961
2962   if (p->namelist != NULL && old->namelist == NULL)
2963     {
2964       gfc_free_namelist (p->namelist);
2965       p->namelist = NULL;
2966     }
2967   else
2968     {
2969       if (p->namelist_tail != old->namelist_tail)
2970         {
2971           gfc_free_namelist (old->namelist_tail->next);
2972           old->namelist_tail->next = NULL;
2973         }
2974     }
2975
2976   p->namelist_tail = old->namelist_tail;
2977
2978   if (p->formal != old->formal)
2979     {
2980       gfc_free_formal_arglist (p->formal);
2981       p->formal = old->formal;
2982     }
2983
2984   p->old_symbol = old->old_symbol;
2985   free (old);
2986 }
2987
2988
2989 /* Frees the internal data of a gfc_undo_change_set structure.  Doesn't free
2990    the structure itself.  */
2991
2992 static void
2993 free_undo_change_set_data (gfc_undo_change_set &cs)
2994 {
2995   cs.syms.release ();
2996   cs.tbps.release ();
2997 }
2998
2999
3000 /* Given a change set pointer, free its target's contents and update it with
3001    the address of the previous change set.  Note that only the contents are
3002    freed, not the target itself (the contents' container).  It is not a problem
3003    as the latter will be a local variable usually.  */
3004
3005 static void
3006 pop_undo_change_set (gfc_undo_change_set *&cs)
3007 {
3008   free_undo_change_set_data (*cs);
3009   cs = cs->previous;
3010 }
3011
3012
3013 static void free_old_symbol (gfc_symbol *sym);
3014
3015
3016 /* Merges the current change set into the previous one.  The changes themselves
3017    are left untouched; only one checkpoint is forgotten.  */
3018
3019 void
3020 gfc_drop_last_undo_checkpoint (void)
3021 {
3022   gfc_symbol *s, *t;
3023   unsigned i, j;
3024
3025   FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, s)
3026     {
3027       /* No need to loop in this case.  */
3028       if (s->old_symbol == NULL)
3029         continue;
3030
3031       /* Remove the duplicate symbols.  */
3032       FOR_EACH_VEC_ELT (latest_undo_chgset->previous->syms, j, t)
3033         if (t == s)
3034           {
3035             latest_undo_chgset->previous->syms.unordered_remove (j);
3036
3037             /* S->OLD_SYMBOL is the backup symbol for S as it was at the
3038                last checkpoint.  We drop that checkpoint, so S->OLD_SYMBOL
3039                shall contain from now on the backup symbol for S as it was
3040                at the checkpoint before.  */
3041             if (s->old_symbol->gfc_new)
3042               {
3043                 gcc_assert (s->old_symbol->old_symbol == NULL);
3044                 s->gfc_new = s->old_symbol->gfc_new;
3045                 free_old_symbol (s);
3046               }
3047             else
3048               restore_old_symbol (s->old_symbol);
3049             break;
3050           }
3051     }
3052
3053   latest_undo_chgset->previous->syms.safe_splice (latest_undo_chgset->syms);
3054   latest_undo_chgset->previous->tbps.safe_splice (latest_undo_chgset->tbps);
3055
3056   pop_undo_change_set (latest_undo_chgset);
3057 }
3058
3059
3060 /* Undoes all the changes made to symbols since the previous checkpoint.
3061    This subroutine is made simpler due to the fact that attributes are
3062    never removed once added.  */
3063
3064 void
3065 gfc_restore_last_undo_checkpoint (void)
3066 {
3067   gfc_symbol *p;
3068   unsigned i;
3069
3070   FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3071     {
3072       if (p->gfc_new)
3073         {
3074           /* Symbol was new.  */
3075           if (p->attr.in_common && p->common_block && p->common_block->head)
3076             {
3077               /* If the symbol was added to any common block, it
3078                  needs to be removed to stop the resolver looking
3079                  for a (possibly) dead symbol.  */
3080
3081               if (p->common_block->head == p && !p->common_next)
3082                 {
3083                   gfc_symtree st, *st0;
3084                   st0 = find_common_symtree (p->ns->common_root,
3085                                              p->common_block);
3086                   if (st0)
3087                     {
3088                       st.name = st0->name;
3089                       gfc_delete_bbt (&p->ns->common_root, &st, compare_symtree);
3090                       free (st0);
3091                     }
3092                 }
3093
3094               if (p->common_block->head == p)
3095                 p->common_block->head = p->common_next;
3096               else
3097                 {
3098                   gfc_symbol *cparent, *csym;
3099
3100                   cparent = p->common_block->head;
3101                   csym = cparent->common_next;
3102
3103                   while (csym != p)
3104                     {
3105                       cparent = csym;
3106                       csym = csym->common_next;
3107                     }
3108
3109                   gcc_assert(cparent->common_next == p);
3110
3111                   cparent->common_next = csym->common_next;
3112                 }
3113             }
3114
3115           /* The derived type is saved in the symtree with the first
3116              letter capitalized; the all lower-case version to the
3117              derived type contains its associated generic function.  */
3118           if (p->attr.flavor == FL_DERIVED)
3119             gfc_delete_symtree (&p->ns->sym_root, gfc_get_string ("%c%s",
3120                         (char) TOUPPER ((unsigned char) p->name[0]),
3121                         &p->name[1]));
3122           else
3123             gfc_delete_symtree (&p->ns->sym_root, p->name);
3124
3125           gfc_release_symbol (p);
3126         }
3127       else
3128         restore_old_symbol (p);
3129     }
3130
3131   latest_undo_chgset->syms.truncate (0);
3132   latest_undo_chgset->tbps.truncate (0);
3133
3134   if (!single_undo_checkpoint_p ())
3135     pop_undo_change_set (latest_undo_chgset);
3136 }
3137
3138
3139 /* Makes sure that there is only one set of changes; in other words we haven't
3140    forgotten to pair a call to gfc_new_checkpoint with a call to either
3141    gfc_drop_last_undo_checkpoint or gfc_restore_last_undo_checkpoint.  */
3142
3143 static void
3144 enforce_single_undo_checkpoint (void)
3145 {
3146   gcc_checking_assert (single_undo_checkpoint_p ());
3147 }
3148
3149
3150 /* Undoes all the changes made to symbols in the current statement.  */
3151
3152 void
3153 gfc_undo_symbols (void)
3154 {
3155   enforce_single_undo_checkpoint ();
3156   gfc_restore_last_undo_checkpoint ();
3157 }
3158
3159
3160 /* Free sym->old_symbol. sym->old_symbol is mostly a shallow copy of sym; the
3161    components of old_symbol that might need deallocation are the "allocatables"
3162    that are restored in gfc_undo_symbols(), with two exceptions: namelist and
3163    namelist_tail.  In case these differ between old_symbol and sym, it's just
3164    because sym->namelist has gotten a few more items.  */
3165
3166 static void
3167 free_old_symbol (gfc_symbol *sym)
3168 {
3169
3170   if (sym->old_symbol == NULL)
3171     return;
3172
3173   if (sym->old_symbol->as != sym->as) 
3174     gfc_free_array_spec (sym->old_symbol->as);
3175
3176   if (sym->old_symbol->value != sym->value) 
3177     gfc_free_expr (sym->old_symbol->value);
3178
3179   if (sym->old_symbol->formal != sym->formal)
3180     gfc_free_formal_arglist (sym->old_symbol->formal);
3181
3182   free (sym->old_symbol);
3183   sym->old_symbol = NULL;
3184 }
3185
3186
3187 /* Makes the changes made in the current statement permanent-- gets
3188    rid of undo information.  */
3189
3190 void
3191 gfc_commit_symbols (void)
3192 {
3193   gfc_symbol *p;
3194   gfc_typebound_proc *tbp;
3195   unsigned i;
3196
3197   enforce_single_undo_checkpoint ();
3198
3199   FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3200     {
3201       p->mark = 0;
3202       p->gfc_new = 0;
3203       free_old_symbol (p);
3204     }
3205   latest_undo_chgset->syms.truncate (0);
3206
3207   FOR_EACH_VEC_ELT (latest_undo_chgset->tbps, i, tbp)
3208     tbp->error = 0;
3209   latest_undo_chgset->tbps.truncate (0);
3210 }
3211
3212
3213 /* Makes the changes made in one symbol permanent -- gets rid of undo
3214    information.  */
3215
3216 void
3217 gfc_commit_symbol (gfc_symbol *sym)
3218 {
3219   gfc_symbol *p;
3220   unsigned i;
3221
3222   enforce_single_undo_checkpoint ();
3223
3224   FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3225     if (p == sym)
3226       {
3227         latest_undo_chgset->syms.unordered_remove (i);
3228         break;
3229       }
3230
3231   sym->mark = 0;
3232   sym->gfc_new = 0;
3233
3234   free_old_symbol (sym);
3235 }
3236
3237
3238 /* Recursively free trees containing type-bound procedures.  */
3239
3240 static void
3241 free_tb_tree (gfc_symtree *t)
3242 {
3243   if (t == NULL)
3244     return;
3245
3246   free_tb_tree (t->left);
3247   free_tb_tree (t->right);
3248
3249   /* TODO: Free type-bound procedure structs themselves; probably needs some
3250      sort of ref-counting mechanism.  */
3251
3252   free (t);
3253 }
3254
3255
3256 /* Recursive function that deletes an entire tree and all the common
3257    head structures it points to.  */
3258
3259 static void
3260 free_common_tree (gfc_symtree * common_tree)
3261 {
3262   if (common_tree == NULL)
3263     return;
3264
3265   free_common_tree (common_tree->left);
3266   free_common_tree (common_tree->right);
3267
3268   free (common_tree);
3269 }  
3270
3271
3272 /* Recursive function that deletes an entire tree and all the user
3273    operator nodes that it contains.  */
3274
3275 static void
3276 free_uop_tree (gfc_symtree *uop_tree)
3277 {
3278   if (uop_tree == NULL)
3279     return;
3280
3281   free_uop_tree (uop_tree->left);
3282   free_uop_tree (uop_tree->right);
3283
3284   gfc_free_interface (uop_tree->n.uop->op);
3285   free (uop_tree->n.uop);
3286   free (uop_tree);
3287 }
3288
3289
3290 /* Recursive function that deletes an entire tree and all the symbols
3291    that it contains.  */
3292
3293 static void
3294 free_sym_tree (gfc_symtree *sym_tree)
3295 {
3296   if (sym_tree == NULL)
3297     return;
3298
3299   free_sym_tree (sym_tree->left);
3300   free_sym_tree (sym_tree->right);
3301
3302   gfc_release_symbol (sym_tree->n.sym);
3303   free (sym_tree);
3304 }
3305
3306
3307 /* Free the derived type list.  */
3308
3309 void
3310 gfc_free_dt_list (void)
3311 {
3312   gfc_dt_list *dt, *n;
3313
3314   for (dt = gfc_derived_types; dt; dt = n)
3315     {
3316       n = dt->next;
3317       free (dt);
3318     }
3319
3320   gfc_derived_types = NULL;
3321 }
3322
3323
3324 /* Free the gfc_equiv_info's.  */
3325
3326 static void
3327 gfc_free_equiv_infos (gfc_equiv_info *s)
3328 {
3329   if (s == NULL)
3330     return;
3331   gfc_free_equiv_infos (s->next);
3332   free (s);
3333 }
3334
3335
3336 /* Free the gfc_equiv_lists.  */
3337
3338 static void
3339 gfc_free_equiv_lists (gfc_equiv_list *l)
3340 {
3341   if (l == NULL)
3342     return;
3343   gfc_free_equiv_lists (l->next);
3344   gfc_free_equiv_infos (l->equiv);
3345   free (l);
3346 }
3347
3348
3349 /* Free a finalizer procedure list.  */
3350
3351 void
3352 gfc_free_finalizer (gfc_finalizer* el)
3353 {
3354   if (el)
3355     {
3356       gfc_release_symbol (el->proc_sym);
3357       free (el);
3358     }
3359 }
3360
3361 static void
3362 gfc_free_finalizer_list (gfc_finalizer* list)
3363 {
3364   while (list)
3365     {
3366       gfc_finalizer* current = list;
3367       list = list->next;
3368       gfc_free_finalizer (current);
3369     }
3370 }
3371
3372
3373 /* Create a new gfc_charlen structure and add it to a namespace.
3374    If 'old_cl' is given, the newly created charlen will be a copy of it.  */
3375
3376 gfc_charlen*
3377 gfc_new_charlen (gfc_namespace *ns, gfc_charlen *old_cl)
3378 {
3379   gfc_charlen *cl;
3380   cl = gfc_get_charlen ();
3381
3382   /* Copy old_cl.  */
3383   if (old_cl)
3384     {
3385       /* Put into namespace, but don't allow reject_statement
3386          to free it if old_cl is given.  */
3387       gfc_charlen **prev = &ns->cl_list;
3388       cl->next = ns->old_cl_list;
3389       while (*prev != ns->old_cl_list)
3390         prev = &(*prev)->next;
3391       *prev = cl;
3392       ns->old_cl_list = cl;
3393       cl->length = gfc_copy_expr (old_cl->length);
3394       cl->length_from_typespec = old_cl->length_from_typespec;
3395       cl->backend_decl = old_cl->backend_decl;
3396       cl->passed_length = old_cl->passed_length;
3397       cl->resolved = old_cl->resolved;
3398     }
3399   else
3400     {
3401       /* Put into namespace.  */
3402       cl->next = ns->cl_list;
3403       ns->cl_list = cl;
3404     }
3405
3406   return cl;
3407 }
3408
3409
3410 /* Free the charlen list from cl to end (end is not freed). 
3411    Free the whole list if end is NULL.  */
3412
3413 void
3414 gfc_free_charlen (gfc_charlen *cl, gfc_charlen *end)
3415 {
3416   gfc_charlen *cl2;
3417
3418   for (; cl != end; cl = cl2)
3419     {
3420       gcc_assert (cl);
3421
3422       cl2 = cl->next;
3423       gfc_free_expr (cl->length);
3424       free (cl);
3425     }
3426 }
3427
3428
3429 /* Free entry list structs.  */
3430
3431 static void
3432 free_entry_list (gfc_entry_list *el)
3433 {
3434   gfc_entry_list *next;
3435
3436   if (el == NULL)
3437     return;
3438
3439   next = el->next;
3440   free (el);
3441   free_entry_list (next);
3442 }
3443
3444
3445 /* Free a namespace structure and everything below it.  Interface
3446    lists associated with intrinsic operators are not freed.  These are
3447    taken care of when a specific name is freed.  */
3448
3449 void
3450 gfc_free_namespace (gfc_namespace *ns)
3451 {
3452   gfc_namespace *p, *q;
3453   int i;
3454
3455   if (ns == NULL)
3456     return;
3457
3458   ns->refs--;
3459   if (ns->refs > 0)
3460     return;
3461   gcc_assert (ns->refs == 0);
3462
3463   gfc_free_statements (ns->code);
3464
3465   free_sym_tree (ns->sym_root);
3466   free_uop_tree (ns->uop_root);
3467   free_common_tree (ns->common_root);
3468   free_tb_tree (ns->tb_sym_root);
3469   free_tb_tree (ns->tb_uop_root);
3470   gfc_free_finalizer_list (ns->finalizers);
3471   gfc_free_charlen (ns->cl_list, NULL);
3472   free_st_labels (ns->st_labels);
3473
3474   free_entry_list (ns->entries);
3475   gfc_free_equiv (ns->equiv);
3476   gfc_free_equiv_lists (ns->equiv_lists);
3477   gfc_free_use_stmts (ns->use_stmts);
3478
3479   for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3480     gfc_free_interface (ns->op[i]);
3481
3482   gfc_free_data (ns->data);
3483   p = ns->contained;
3484   free (ns);
3485
3486   /* Recursively free any contained namespaces.  */
3487   while (p != NULL)
3488     {
3489       q = p;
3490       p = p->sibling;
3491       gfc_free_namespace (q);
3492     }
3493 }
3494
3495
3496 void
3497 gfc_symbol_init_2 (void)
3498 {
3499
3500   gfc_current_ns = gfc_get_namespace (NULL, 0);
3501 }
3502
3503
3504 void
3505 gfc_symbol_done_2 (void)
3506 {
3507   gfc_free_namespace (gfc_current_ns);
3508   gfc_current_ns = NULL;
3509   gfc_free_dt_list ();
3510
3511   enforce_single_undo_checkpoint ();
3512   free_undo_change_set_data (*latest_undo_chgset);
3513 }
3514
3515
3516 /* Count how many nodes a symtree has.  */
3517
3518 static unsigned
3519 count_st_nodes (const gfc_symtree *st)
3520 {
3521   unsigned nodes;
3522   if (!st)
3523     return 0;
3524
3525   nodes = count_st_nodes (st->left);
3526   nodes++;
3527   nodes += count_st_nodes (st->right);
3528
3529   return nodes;
3530 }
3531
3532
3533 /* Convert symtree tree into symtree vector.  */
3534
3535 static unsigned
3536 fill_st_vector (gfc_symtree *st, gfc_symtree **st_vec, unsigned node_cntr)
3537 {
3538   if (!st)
3539     return node_cntr;
3540
3541   node_cntr = fill_st_vector (st->left, st_vec, node_cntr);
3542   st_vec[node_cntr++] = st;
3543   node_cntr = fill_st_vector (st->right, st_vec, node_cntr);
3544
3545   return node_cntr;
3546 }
3547
3548
3549 /* Traverse namespace.  As the functions might modify the symtree, we store the
3550    symtree as a vector and operate on this vector.  Note: We assume that
3551    sym_func or st_func never deletes nodes from the symtree - only adding is
3552    allowed. Additionally, newly added nodes are not traversed.  */
3553
3554 static void
3555 do_traverse_symtree (gfc_symtree *st, void (*st_func) (gfc_symtree *),
3556                      void (*sym_func) (gfc_symbol *))
3557 {
3558   gfc_symtree **st_vec;
3559   unsigned nodes, i, node_cntr;
3560
3561   gcc_assert ((st_func && !sym_func) || (!st_func && sym_func));
3562   nodes = count_st_nodes (st);
3563   st_vec = XALLOCAVEC (gfc_symtree *, nodes);
3564   node_cntr = 0; 
3565   fill_st_vector (st, st_vec, node_cntr);
3566
3567   if (sym_func)
3568     {
3569       /* Clear marks.  */
3570       for (i = 0; i < nodes; i++)
3571         st_vec[i]->n.sym->mark = 0;
3572       for (i = 0; i < nodes; i++)
3573         if (!st_vec[i]->n.sym->mark)
3574           {
3575             (*sym_func) (st_vec[i]->n.sym);
3576             st_vec[i]->n.sym->mark = 1;
3577           }
3578      }
3579    else
3580       for (i = 0; i < nodes; i++)
3581         (*st_func) (st_vec[i]);
3582 }
3583
3584
3585 /* Recursively traverse the symtree nodes.  */
3586
3587 void
3588 gfc_traverse_symtree (gfc_symtree *st, void (*st_func) (gfc_symtree *))
3589 {
3590   do_traverse_symtree (st, st_func, NULL);
3591 }
3592
3593
3594 /* Call a given function for all symbols in the namespace.  We take
3595    care that each gfc_symbol node is called exactly once.  */
3596
3597 void
3598 gfc_traverse_ns (gfc_namespace *ns, void (*sym_func) (gfc_symbol *))
3599 {
3600   do_traverse_symtree (ns->sym_root, NULL, sym_func);
3601 }
3602
3603
3604 /* Return TRUE when name is the name of an intrinsic type.  */
3605
3606 bool
3607 gfc_is_intrinsic_typename (const char *name)
3608 {
3609   if (strcmp (name, "integer") == 0
3610       || strcmp (name, "real") == 0
3611       || strcmp (name, "character") == 0
3612       || strcmp (name, "logical") == 0
3613       || strcmp (name, "complex") == 0
3614       || strcmp (name, "doubleprecision") == 0
3615       || strcmp (name, "doublecomplex") == 0)
3616     return true;
3617   else
3618     return false;
3619 }
3620
3621
3622 /* Return TRUE if the symbol is an automatic variable.  */
3623
3624 static bool
3625 gfc_is_var_automatic (gfc_symbol *sym)
3626 {
3627   /* Pointer and allocatable variables are never automatic.  */
3628   if (sym->attr.pointer || sym->attr.allocatable)
3629     return false;
3630   /* Check for arrays with non-constant size.  */
3631   if (sym->attr.dimension && sym->as
3632       && !gfc_is_compile_time_shape (sym->as))
3633     return true;
3634   /* Check for non-constant length character variables.  */
3635   if (sym->ts.type == BT_CHARACTER
3636       && sym->ts.u.cl
3637       && !gfc_is_constant_expr (sym->ts.u.cl->length))
3638     return true;
3639   return false;
3640 }
3641
3642 /* Given a symbol, mark it as SAVEd if it is allowed.  */
3643
3644 static void
3645 save_symbol (gfc_symbol *sym)
3646 {
3647
3648   if (sym->attr.use_assoc)
3649     return;
3650
3651   if (sym->attr.in_common
3652       || sym->attr.dummy
3653       || sym->attr.result
3654       || sym->attr.flavor != FL_VARIABLE)
3655     return;
3656   /* Automatic objects are not saved.  */
3657   if (gfc_is_var_automatic (sym))
3658     return;
3659   gfc_add_save (&sym->attr, SAVE_EXPLICIT, sym->name, &sym->declared_at);
3660 }
3661
3662
3663 /* Mark those symbols which can be SAVEd as such.  */
3664
3665 void
3666 gfc_save_all (gfc_namespace *ns)
3667 {
3668   gfc_traverse_ns (ns, save_symbol);
3669 }
3670
3671
3672 /* Make sure that no changes to symbols are pending.  */
3673
3674 void
3675 gfc_enforce_clean_symbol_state(void)
3676 {
3677   enforce_single_undo_checkpoint ();
3678   gcc_assert (latest_undo_chgset->syms.is_empty ());
3679 }
3680
3681
3682 /************** Global symbol handling ************/
3683
3684
3685 /* Search a tree for the global symbol.  */
3686
3687 gfc_gsymbol *
3688 gfc_find_gsymbol (gfc_gsymbol *symbol, const char *name)
3689 {
3690   int c;
3691
3692   if (symbol == NULL)
3693     return NULL;
3694
3695   while (symbol)
3696     {
3697       c = strcmp (name, symbol->name);
3698       if (!c)
3699         return symbol;
3700
3701       symbol = (c < 0) ? symbol->left : symbol->right;
3702     }
3703
3704   return NULL;
3705 }
3706
3707
3708 /* Compare two global symbols. Used for managing the BB tree.  */
3709
3710 static int
3711 gsym_compare (void *_s1, void *_s2)
3712 {
3713   gfc_gsymbol *s1, *s2;
3714
3715   s1 = (gfc_gsymbol *) _s1;
3716   s2 = (gfc_gsymbol *) _s2;
3717   return strcmp (s1->name, s2->name);
3718 }
3719
3720
3721 /* Get a global symbol, creating it if it doesn't exist.  */
3722
3723 gfc_gsymbol *
3724 gfc_get_gsymbol (const char *name)
3725 {
3726   gfc_gsymbol *s;
3727
3728   s = gfc_find_gsymbol (gfc_gsym_root, name);
3729   if (s != NULL)
3730     return s;
3731
3732   s = XCNEW (gfc_gsymbol);
3733   s->type = GSYM_UNKNOWN;
3734   s->name = gfc_get_string (name);
3735
3736   gfc_insert_bbt (&gfc_gsym_root, s, gsym_compare);
3737
3738   return s;
3739 }
3740
3741
3742 static gfc_symbol *
3743 get_iso_c_binding_dt (int sym_id)
3744 {
3745   gfc_dt_list *dt_list;
3746
3747   dt_list = gfc_derived_types;
3748
3749   /* Loop through the derived types in the name list, searching for
3750      the desired symbol from iso_c_binding.  Search the parent namespaces
3751      if necessary and requested to (parent_flag).  */
3752   while (dt_list != NULL)
3753     {
3754       if (dt_list->derived->from_intmod != INTMOD_NONE
3755           && dt_list->derived->intmod_sym_id == sym_id)
3756         return dt_list->derived;
3757
3758       dt_list = dt_list->next;
3759     }
3760
3761   return NULL;
3762 }
3763
3764
3765 /* Verifies that the given derived type symbol, derived_sym, is interoperable
3766    with C.  This is necessary for any derived type that is BIND(C) and for
3767    derived types that are parameters to functions that are BIND(C).  All
3768    fields of the derived type are required to be interoperable, and are tested
3769    for such.  If an error occurs, the errors are reported here, allowing for
3770    multiple errors to be handled for a single derived type.  */
3771
3772 bool
3773 verify_bind_c_derived_type (gfc_symbol *derived_sym)
3774 {
3775   gfc_component *curr_comp = NULL;
3776   bool is_c_interop = false;
3777   bool retval = true;
3778    
3779   if (derived_sym == NULL)
3780     gfc_internal_error ("verify_bind_c_derived_type(): Given symbol is "
3781                         "unexpectedly NULL");
3782
3783   /* If we've already looked at this derived symbol, do not look at it again
3784      so we don't repeat warnings/errors.  */
3785   if (derived_sym->ts.is_c_interop)
3786     return true;
3787   
3788   /* The derived type must have the BIND attribute to be interoperable
3789      J3/04-007, Section 15.2.3.  */
3790   if (derived_sym->attr.is_bind_c != 1)
3791     {
3792       derived_sym->ts.is_c_interop = 0;
3793       gfc_error_now ("Derived type '%s' declared at %L must have the BIND "
3794                      "attribute to be C interoperable", derived_sym->name,
3795                      &(derived_sym->declared_at));
3796       retval = false;
3797     }
3798   
3799   curr_comp = derived_sym->components;
3800
3801   /* Fortran 2003 allows an empty derived type.  C99 appears to disallow an
3802      empty struct.  Section 15.2 in Fortran 2003 states:  "The following
3803      subclauses define the conditions under which a Fortran entity is
3804      interoperable.  If a Fortran entity is interoperable, an equivalent
3805      entity may be defined by means of C and the Fortran entity is said
3806      to be interoperable with the C entity.  There does not have to be such
3807      an interoperating C entity."
3808   */
3809   if (curr_comp == NULL)
3810     {
3811       gfc_warning ("Derived type '%s' with BIND(C) attribute at %L is empty, "
3812                    "and may be inaccessible by the C companion processor",
3813                    derived_sym->name, &(derived_sym->declared_at));
3814       derived_sym->ts.is_c_interop = 1;
3815       derived_sym->attr.is_bind_c = 1;
3816       return true;
3817     }
3818
3819
3820   /* Initialize the derived type as being C interoperable.
3821      If we find an error in the components, this will be set false.  */
3822   derived_sym->ts.is_c_interop = 1;
3823   
3824   /* Loop through the list of components to verify that the kind of
3825      each is a C interoperable type.  */
3826   do
3827     {
3828       /* The components cannot be pointers (fortran sense).  
3829          J3/04-007, Section 15.2.3, C1505.      */
3830       if (curr_comp->attr.pointer != 0)
3831         {
3832           gfc_error ("Component '%s' at %L cannot have the "
3833                      "POINTER attribute because it is a member "
3834                      "of the BIND(C) derived type '%s' at %L",
3835                      curr_comp->name, &(curr_comp->loc),
3836                      derived_sym->name, &(derived_sym->declared_at));
3837           retval = false;
3838         }
3839
3840       if (curr_comp->attr.proc_pointer != 0)
3841         {
3842           gfc_error ("Procedure pointer component '%s' at %L cannot be a member"
3843                      " of the BIND(C) derived type '%s' at %L", curr_comp->name,
3844                      &curr_comp->loc, derived_sym->name,
3845                      &derived_sym->declared_at);
3846           retval = false;
3847         }
3848
3849       /* The components cannot be allocatable.
3850          J3/04-007, Section 15.2.3, C1505.      */
3851       if (curr_comp->attr.allocatable != 0)
3852         {
3853           gfc_error ("Component '%s' at %L cannot have the "
3854                      "ALLOCATABLE attribute because it is a member "
3855                      "of the BIND(C) derived type '%s' at %L",
3856                      curr_comp->name, &(curr_comp->loc),
3857                      derived_sym->name, &(derived_sym->declared_at));
3858           retval = false;
3859         }
3860       
3861       /* BIND(C) derived types must have interoperable components.  */
3862       if (curr_comp->ts.type == BT_DERIVED
3863           && curr_comp->ts.u.derived->ts.is_iso_c != 1 
3864           && curr_comp->ts.u.derived != derived_sym)
3865         {
3866           /* This should be allowed; the draft says a derived-type can not
3867              have type parameters if it is has the BIND attribute.  Type
3868              parameters seem to be for making parameterized derived types.
3869              There's no need to verify the type if it is c_ptr/c_funptr.  */
3870           retval = verify_bind_c_derived_type (curr_comp->ts.u.derived);
3871         }
3872       else
3873         {
3874           /* Grab the typespec for the given component and test the kind.  */ 
3875           is_c_interop = gfc_verify_c_interop (&(curr_comp->ts));
3876           
3877           if (!is_c_interop)
3878             {
3879               /* Report warning and continue since not fatal.  The
3880                  draft does specify a constraint that requires all fields
3881                  to interoperate, but if the user says real(4), etc., it
3882                  may interoperate with *something* in C, but the compiler
3883                  most likely won't know exactly what.  Further, it may not
3884                  interoperate with the same data type(s) in C if the user
3885                  recompiles with different flags (e.g., -m32 and -m64 on
3886                  x86_64 and using integer(4) to claim interop with a
3887                  C_LONG).  */
3888               if (derived_sym->attr.is_bind_c == 1
3889                   && gfc_option.warn_c_binding_type)
3890                 /* If the derived type is bind(c), all fields must be
3891                    interop.  */
3892                 gfc_warning ("Component '%s' in derived type '%s' at %L "
3893                              "may not be C interoperable, even though "
3894                              "derived type '%s' is BIND(C)",
3895                              curr_comp->name, derived_sym->name,
3896                              &(curr_comp->loc), derived_sym->name);
3897               else if (gfc_option.warn_c_binding_type)
3898                 /* If derived type is param to bind(c) routine, or to one
3899                    of the iso_c_binding procs, it must be interoperable, so
3900                    all fields must interop too.  */
3901                 gfc_warning ("Component '%s' in derived type '%s' at %L "
3902                              "may not be C interoperable",
3903                              curr_comp->name, derived_sym->name,
3904                              &(curr_comp->loc));
3905             }
3906         }
3907       
3908       curr_comp = curr_comp->next;
3909     } while (curr_comp != NULL); 
3910
3911
3912   /* Make sure we don't have conflicts with the attributes.  */
3913   if (derived_sym->attr.access == ACCESS_PRIVATE)
3914     {
3915       gfc_error ("Derived type '%s' at %L cannot be declared with both "
3916                  "PRIVATE and BIND(C) attributes", derived_sym->name,
3917                  &(derived_sym->declared_at));
3918       retval = false;
3919     }
3920
3921   if (derived_sym->attr.sequence != 0)
3922     {
3923       gfc_error ("Derived type '%s' at %L cannot have the SEQUENCE "
3924                  "attribute because it is BIND(C)", derived_sym->name,
3925                  &(derived_sym->declared_at));
3926       retval = false;
3927     }
3928
3929   /* Mark the derived type as not being C interoperable if we found an
3930      error.  If there were only warnings, proceed with the assumption
3931      it's interoperable.  */
3932   if (!retval)
3933     derived_sym->ts.is_c_interop = 0;
3934   
3935   return retval;
3936 }
3937
3938
3939 /* Generate symbols for the named constants c_null_ptr and c_null_funptr.  */
3940
3941 static bool
3942 gen_special_c_interop_ptr (gfc_symbol *tmp_sym, gfc_symtree *dt_symtree)
3943 {
3944   gfc_constructor *c;
3945
3946   gcc_assert (tmp_sym && dt_symtree && dt_symtree->n.sym);
3947   dt_symtree->n.sym->attr.referenced = 1;
3948
3949   tmp_sym->attr.is_c_interop = 1;
3950   tmp_sym->attr.is_bind_c = 1;
3951   tmp_sym->ts.is_c_interop = 1;
3952   tmp_sym->ts.is_iso_c = 1;
3953   tmp_sym->ts.type = BT_DERIVED;
3954   tmp_sym->ts.f90_type = BT_VOID;
3955   tmp_sym->attr.flavor = FL_PARAMETER;
3956   tmp_sym->ts.u.derived = dt_symtree->n.sym;
3957   
3958   /* Set the c_address field of c_null_ptr and c_null_funptr to
3959      the value of NULL.  */
3960   tmp_sym->value = gfc_get_expr ();
3961   tmp_sym->value->expr_type = EXPR_STRUCTURE;
3962   tmp_sym->value->ts.type = BT_DERIVED;
3963   tmp_sym->value->ts.f90_type = BT_VOID;
3964   tmp_sym->value->ts.u.derived = tmp_sym->ts.u.derived;
3965   gfc_constructor_append_expr (&tmp_sym->value->value.constructor, NULL, NULL);
3966   c = gfc_constructor_first (tmp_sym->value->value.constructor);
3967   c->expr = gfc_get_int_expr (gfc_index_integer_kind, NULL, 0);
3968   c->expr->ts.is_iso_c = 1;
3969
3970   return true;
3971 }
3972
3973
3974 /* Add a formal argument, gfc_formal_arglist, to the
3975    end of the given list of arguments.  Set the reference to the
3976    provided symbol, param_sym, in the argument.  */
3977
3978 static void
3979 add_formal_arg (gfc_formal_arglist **head,
3980                 gfc_formal_arglist **tail,
3981                 gfc_formal_arglist *formal_arg,
3982                 gfc_symbol *param_sym)
3983 {
3984   /* Put in list, either as first arg or at the tail (curr arg).  */
3985   if (*head == NULL)
3986     *head = *tail = formal_arg;
3987   else
3988     {
3989       (*tail)->next = formal_arg;
3990       (*tail) = formal_arg;
3991     }
3992    
3993   (*tail)->sym = param_sym;
3994   (*tail)->next = NULL;
3995    
3996   return;
3997 }
3998
3999
4000 /* Add a procedure interface to the given symbol (i.e., store a
4001    reference to the list of formal arguments).  */
4002
4003 static void
4004 add_proc_interface (gfc_symbol *sym, ifsrc source, gfc_formal_arglist *formal)
4005 {
4006
4007   sym->formal = formal;
4008   sym->attr.if_source = source;
4009 }
4010
4011
4012 /* Copy the formal args from an existing symbol, src, into a new
4013    symbol, dest.  New formal args are created, and the description of
4014    each arg is set according to the existing ones.  This function is
4015    used when creating procedure declaration variables from a procedure
4016    declaration statement (see match_proc_decl()) to create the formal
4017    args based on the args of a given named interface.  */
4018
4019 void
4020 gfc_copy_formal_args_intr (gfc_symbol *dest, gfc_intrinsic_sym *src)
4021 {
4022   gfc_formal_arglist *head = NULL;
4023   gfc_formal_arglist *tail = NULL;
4024   gfc_formal_arglist *formal_arg = NULL;
4025   gfc_intrinsic_arg *curr_arg = NULL;
4026   gfc_formal_arglist *formal_prev = NULL;
4027   /* Save current namespace so we can change it for formal args.  */
4028   gfc_namespace *parent_ns = gfc_current_ns;
4029
4030   /* Create a new namespace, which will be the formal ns (namespace
4031      of the formal args).  */
4032   gfc_current_ns = gfc_get_namespace (parent_ns, 0);
4033   gfc_current_ns->proc_name = dest;
4034
4035   for (curr_arg = src->formal; curr_arg; curr_arg = curr_arg->next)
4036     {
4037       formal_arg = gfc_get_formal_arglist ();
4038       gfc_get_symbol (curr_arg->name, gfc_current_ns, &(formal_arg->sym));
4039
4040       /* May need to copy more info for the symbol.  */
4041       formal_arg->sym->ts = curr_arg->ts;
4042       formal_arg->sym->attr.optional = curr_arg->optional;
4043       formal_arg->sym->attr.value = curr_arg->value;
4044       formal_arg->sym->attr.intent = curr_arg->intent;
4045       formal_arg->sym->attr.flavor = FL_VARIABLE;
4046       formal_arg->sym->attr.dummy = 1;
4047
4048       if (formal_arg->sym->ts.type == BT_CHARACTER)
4049         formal_arg->sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4050
4051       /* If this isn't the first arg, set up the next ptr.  For the
4052         last arg built, the formal_arg->next will never get set to
4053         anything other than NULL.  */
4054       if (formal_prev != NULL)
4055         formal_prev->next = formal_arg;
4056       else
4057         formal_arg->next = NULL;
4058
4059       formal_prev = formal_arg;
4060
4061       /* Add arg to list of formal args.  */
4062       add_formal_arg (&head, &tail, formal_arg, formal_arg->sym);
4063
4064       /* Validate changes.  */
4065       gfc_commit_symbol (formal_arg->sym);
4066     }
4067
4068   /* Add the interface to the symbol.  */
4069   add_proc_interface (dest, IFSRC_DECL, head);
4070
4071   /* Store the formal namespace information.  */
4072   if (dest->formal != NULL)
4073     /* The current ns should be that for the dest proc.  */
4074     dest->formal_ns = gfc_current_ns;
4075   /* Restore the current namespace to what it was on entry.  */
4076   gfc_current_ns = parent_ns;
4077 }
4078
4079
4080 static int
4081 std_for_isocbinding_symbol (int id)
4082 {
4083   switch (id)
4084     {
4085 #define NAMED_INTCST(a,b,c,d) \
4086       case a:\
4087         return d;
4088 #include "iso-c-binding.def"
4089 #undef NAMED_INTCST
4090
4091 #define NAMED_FUNCTION(a,b,c,d) \
4092       case a:\
4093         return d;
4094 #define NAMED_SUBROUTINE(a,b,c,d) \
4095       case a:\
4096         return d;
4097 #include "iso-c-binding.def"
4098 #undef NAMED_FUNCTION
4099 #undef NAMED_SUBROUTINE
4100
4101        default:
4102          return GFC_STD_F2003;
4103     }
4104 }
4105
4106 /* Generate the given set of C interoperable kind objects, or all
4107    interoperable kinds.  This function will only be given kind objects
4108    for valid iso_c_binding defined types because this is verified when
4109    the 'use' statement is parsed.  If the user gives an 'only' clause,
4110    the specific kinds are looked up; if they don't exist, an error is
4111    reported.  If the user does not give an 'only' clause, all
4112    iso_c_binding symbols are generated.  If a list of specific kinds
4113    is given, it must have a NULL in the first empty spot to mark the
4114    end of the list. For C_null_(fun)ptr, dt_symtree has to be set and
4115    point to the symtree for c_(fun)ptr.  */
4116
4117 gfc_symtree *
4118 generate_isocbinding_symbol (const char *mod_name, iso_c_binding_symbol s,
4119                              const char *local_name, gfc_symtree *dt_symtree,
4120                              bool hidden)
4121 {
4122   const char *const name = (local_name && local_name[0])
4123                            ? local_name : c_interop_kinds_table[s].name;
4124   gfc_symtree *tmp_symtree;
4125   gfc_symbol *tmp_sym = NULL;
4126   int index;
4127
4128   if (gfc_notification_std (std_for_isocbinding_symbol (s)) == ERROR)
4129     return NULL;
4130
4131   tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
4132   if (hidden
4133       && (!tmp_symtree || !tmp_symtree->n.sym
4134           || tmp_symtree->n.sym->from_intmod != INTMOD_ISO_C_BINDING
4135           || tmp_symtree->n.sym->intmod_sym_id != s))
4136     tmp_symtree = NULL;
4137
4138   /* Already exists in this scope so don't re-add it. */
4139   if (tmp_symtree != NULL && (tmp_sym = tmp_symtree->n.sym) != NULL
4140       && (!tmp_sym->attr.generic
4141           || (tmp_sym = gfc_find_dt_in_generic (tmp_sym)) != NULL)
4142       && tmp_sym->from_intmod == INTMOD_ISO_C_BINDING)
4143     {
4144       if (tmp_sym->attr.flavor == FL_DERIVED
4145           && !get_iso_c_binding_dt (tmp_sym->intmod_sym_id))
4146         {
4147           gfc_dt_list *dt_list;
4148           dt_list = gfc_get_dt_list ();
4149           dt_list->derived = tmp_sym;
4150           dt_list->next = gfc_derived_types;
4151           gfc_derived_types = dt_list;
4152         }
4153
4154       return tmp_symtree;
4155     }
4156
4157   /* Create the sym tree in the current ns.  */
4158   if (hidden)
4159     {
4160       tmp_symtree = gfc_get_unique_symtree (gfc_current_ns);
4161       tmp_sym = gfc_new_symbol (name, gfc_current_ns);
4162
4163       /* Add to the list of tentative symbols.  */
4164       latest_undo_chgset->syms.safe_push (tmp_sym);
4165       tmp_sym->old_symbol = NULL;
4166       tmp_sym->mark = 1;
4167       tmp_sym->gfc_new = 1;
4168
4169       tmp_symtree->n.sym = tmp_sym;
4170       tmp_sym->refs++;
4171     }
4172   else
4173     {
4174       gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
4175       gcc_assert (tmp_symtree);
4176       tmp_sym = tmp_symtree->n.sym;
4177     }
4178
4179   /* Say what module this symbol belongs to.  */
4180   tmp_sym->module = gfc_get_string (mod_name);
4181   tmp_sym->from_intmod = INTMOD_ISO_C_BINDING;
4182   tmp_sym->intmod_sym_id = s;
4183   tmp_sym->attr.is_iso_c = 1;
4184   tmp_sym->attr.use_assoc = 1;
4185
4186   gcc_assert (dt_symtree == NULL || s == ISOCBINDING_NULL_FUNPTR
4187               || s == ISOCBINDING_NULL_PTR);
4188
4189   switch (s)
4190     {
4191
4192 #define NAMED_INTCST(a,b,c,d) case a : 
4193 #define NAMED_REALCST(a,b,c,d) case a :
4194 #define NAMED_CMPXCST(a,b,c,d) case a :
4195 #define NAMED_LOGCST(a,b,c) case a :
4196 #define NAMED_CHARKNDCST(a,b,c) case a :
4197 #include "iso-c-binding.def"
4198
4199         tmp_sym->value = gfc_get_int_expr (gfc_default_integer_kind, NULL,
4200                                            c_interop_kinds_table[s].value);
4201
4202         /* Initialize an integer constant expression node.  */
4203         tmp_sym->attr.flavor = FL_PARAMETER;
4204         tmp_sym->ts.type = BT_INTEGER;
4205         tmp_sym->ts.kind = gfc_default_integer_kind;
4206
4207         /* Mark this type as a C interoperable one.  */
4208         tmp_sym->ts.is_c_interop = 1;
4209         tmp_sym->ts.is_iso_c = 1;
4210         tmp_sym->value->ts.is_c_interop = 1;
4211         tmp_sym->value->ts.is_iso_c = 1;
4212         tmp_sym->attr.is_c_interop = 1;
4213
4214         /* Tell what f90 type this c interop kind is valid.  */
4215         tmp_sym->ts.f90_type = c_interop_kinds_table[s].f90_type;
4216
4217         break;
4218
4219
4220 #define NAMED_CHARCST(a,b,c) case a :
4221 #include "iso-c-binding.def"
4222
4223         /* Initialize an integer constant expression node for the
4224            length of the character.  */
4225         tmp_sym->value = gfc_get_character_expr (gfc_default_character_kind,
4226                                                  &gfc_current_locus, NULL, 1);
4227         tmp_sym->value->ts.is_c_interop = 1;
4228         tmp_sym->value->ts.is_iso_c = 1;
4229         tmp_sym->value->value.character.length = 1;
4230         tmp_sym->value->value.character.string[0]
4231           = (gfc_char_t) c_interop_kinds_table[s].value;
4232         tmp_sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4233         tmp_sym->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
4234                                                      NULL, 1);
4235
4236         /* May not need this in both attr and ts, but do need in
4237            attr for writing module file.  */
4238         tmp_sym->attr.is_c_interop = 1;
4239
4240         tmp_sym->attr.flavor = FL_PARAMETER;
4241         tmp_sym->ts.type = BT_CHARACTER;
4242
4243         /* Need to set it to the C_CHAR kind.  */
4244         tmp_sym->ts.kind = gfc_default_character_kind;
4245
4246         /* Mark this type as a C interoperable one.  */
4247         tmp_sym->ts.is_c_interop = 1;
4248         tmp_sym->ts.is_iso_c = 1;
4249
4250         /* Tell what f90 type this c interop kind is valid.  */
4251         tmp_sym->ts.f90_type = BT_CHARACTER;
4252
4253         break;
4254
4255       case ISOCBINDING_PTR:
4256       case ISOCBINDING_FUNPTR:
4257         {
4258           gfc_symbol *dt_sym;
4259           gfc_dt_list **dt_list_ptr = NULL;
4260           gfc_component *tmp_comp = NULL;
4261
4262           /* Generate real derived type.  */
4263           if (hidden)
4264             dt_sym = tmp_sym;
4265           else
4266             {
4267               const char *hidden_name;
4268               gfc_interface *intr, *head;
4269
4270               hidden_name = gfc_get_string ("%c%s",
4271                                             (char) TOUPPER ((unsigned char)
4272                                                               tmp_sym->name[0]),
4273                                             &tmp_sym->name[1]);
4274               tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
4275                                               hidden_name);
4276               gcc_assert (tmp_symtree == NULL);
4277               gfc_get_sym_tree (hidden_name, gfc_current_ns, &tmp_symtree, false);
4278               dt_sym = tmp_symtree->n.sym;
4279               dt_sym->name = gfc_get_string (s == ISOCBINDING_PTR
4280                                             ? "c_ptr" : "c_funptr");
4281
4282               /* Generate an artificial generic function.  */
4283               head = tmp_sym->generic;
4284               intr = gfc_get_interface ();
4285               intr->sym = dt_sym;
4286               intr->where = gfc_current_locus;
4287               intr->next = head;
4288               tmp_sym->generic = intr;
4289
4290               if (!tmp_sym->attr.generic
4291                   && !gfc_add_generic (&tmp_sym->attr, tmp_sym->name, NULL))
4292                 return NULL;
4293
4294               if (!tmp_sym->attr.function
4295                   && !gfc_add_function (&tmp_sym->attr, tmp_sym->name, NULL))
4296                 return NULL;
4297             }
4298
4299           /* Say what module this symbol belongs to.  */
4300           dt_sym->module = gfc_get_string (mod_name);
4301           dt_sym->from_intmod = INTMOD_ISO_C_BINDING;
4302           dt_sym->intmod_sym_id = s;
4303           dt_sym->attr.use_assoc = 1;
4304
4305           /* Initialize an integer constant expression node.  */
4306           dt_sym->attr.flavor = FL_DERIVED;
4307           dt_sym->ts.is_c_interop = 1;
4308           dt_sym->attr.is_c_interop = 1;
4309           dt_sym->attr.private_comp = 1;
4310           dt_sym->component_access = ACCESS_PRIVATE;
4311           dt_sym->ts.is_iso_c = 1;
4312           dt_sym->ts.type = BT_DERIVED;
4313           dt_sym->ts.f90_type = BT_VOID;
4314
4315           /* A derived type must have the bind attribute to be
4316              interoperable (J3/04-007, Section 15.2.3), even though
4317              the binding label is not used.  */
4318           dt_sym->attr.is_bind_c = 1;
4319
4320           dt_sym->attr.referenced = 1;
4321           dt_sym->ts.u.derived = dt_sym;
4322
4323           /* Add the symbol created for the derived type to the current ns.  */
4324           dt_list_ptr = &(gfc_derived_types);
4325           while (*dt_list_ptr != NULL && (*dt_list_ptr)->next != NULL)
4326             dt_list_ptr = &((*dt_list_ptr)->next);
4327
4328           /* There is already at least one derived type in the list, so append
4329              the one we're currently building for c_ptr or c_funptr.  */
4330           if (*dt_list_ptr != NULL)
4331             dt_list_ptr = &((*dt_list_ptr)->next);
4332           (*dt_list_ptr) = gfc_get_dt_list ();
4333           (*dt_list_ptr)->derived = dt_sym;
4334           (*dt_list_ptr)->next = NULL;
4335
4336           gfc_add_component (dt_sym, "c_address", &tmp_comp);
4337           if (tmp_comp == NULL)
4338             gcc_unreachable ();
4339
4340           tmp_comp->ts.type = BT_INTEGER;
4341
4342           /* Set this because the module will need to read/write this field.  */
4343           tmp_comp->ts.f90_type = BT_INTEGER;
4344
4345           /* The kinds for c_ptr and c_funptr are the same.  */
4346           index = get_c_kind ("c_ptr", c_interop_kinds_table);
4347           tmp_comp->ts.kind = c_interop_kinds_table[index].value;
4348           tmp_comp->attr.access = ACCESS_PRIVATE;
4349
4350           /* Mark the component as C interoperable.  */
4351           tmp_comp->ts.is_c_interop = 1;
4352         }
4353
4354         break;
4355
4356       case ISOCBINDING_NULL_PTR:
4357       case ISOCBINDING_NULL_FUNPTR:
4358         gen_special_c_interop_ptr (tmp_sym, dt_symtree);
4359         break;
4360
4361       default:
4362         gcc_unreachable ();
4363     }
4364   gfc_commit_symbol (tmp_sym);
4365   return tmp_symtree;
4366 }
4367
4368
4369 /* Check that a symbol is already typed.  If strict is not set, an untyped
4370    symbol is acceptable for non-standard-conforming mode.  */
4371
4372 bool
4373 gfc_check_symbol_typed (gfc_symbol* sym, gfc_namespace* ns,
4374                         bool strict, locus where)
4375 {
4376   gcc_assert (sym);
4377
4378   if (gfc_matching_prefix)
4379     return true;
4380
4381   /* Check for the type and try to give it an implicit one.  */
4382   if (sym->ts.type == BT_UNKNOWN
4383       && !gfc_set_default_type (sym, 0, ns))
4384     {
4385       if (strict)
4386         {
4387           gfc_error ("Symbol '%s' is used before it is typed at %L",
4388                      sym->name, &where);
4389           return false;
4390         }
4391
4392       if (!gfc_notify_std (GFC_STD_GNU, "Symbol '%s' is used before"
4393                            " it is typed at %L", sym->name, &where))
4394         return false;
4395     }
4396
4397   /* Everything is ok.  */
4398   return true;
4399 }
4400
4401
4402 /* Construct a typebound-procedure structure.  Those are stored in a tentative
4403    list and marked `error' until symbols are committed.  */
4404
4405 gfc_typebound_proc*
4406 gfc_get_typebound_proc (gfc_typebound_proc *tb0)
4407 {
4408   gfc_typebound_proc *result;
4409
4410   result = XCNEW (gfc_typebound_proc);
4411   if (tb0)
4412     *result = *tb0;
4413   result->error = 1;
4414
4415   latest_undo_chgset->tbps.safe_push (result);
4416
4417   return result;
4418 }
4419
4420
4421 /* Get the super-type of a given derived type.  */
4422
4423 gfc_symbol*
4424 gfc_get_derived_super_type (gfc_symbol* derived)
4425 {
4426   gcc_assert (derived);
4427
4428   if (derived->attr.generic)
4429     derived = gfc_find_dt_in_generic (derived);
4430
4431   if (!derived->attr.extension)
4432     return NULL;
4433
4434   gcc_assert (derived->components);
4435   gcc_assert (derived->components->ts.type == BT_DERIVED);
4436   gcc_assert (derived->components->ts.u.derived);
4437
4438   if (derived->components->ts.u.derived->attr.generic)
4439     return gfc_find_dt_in_generic (derived->components->ts.u.derived);
4440
4441   return derived->components->ts.u.derived;
4442 }
4443
4444
4445 /* Get the ultimate super-type of a given derived type.  */
4446
4447 gfc_symbol*
4448 gfc_get_ultimate_derived_super_type (gfc_symbol* derived)
4449 {
4450   if (!derived->attr.extension)
4451     return NULL;
4452
4453   derived = gfc_get_derived_super_type (derived);
4454
4455   if (derived->attr.extension)
4456     return gfc_get_ultimate_derived_super_type (derived);
4457   else
4458     return derived;
4459 }
4460
4461
4462 /* Check if a derived type t2 is an extension of (or equal to) a type t1.  */
4463
4464 bool
4465 gfc_type_is_extension_of (gfc_symbol *t1, gfc_symbol *t2)
4466 {
4467   while (!gfc_compare_derived_types (t1, t2) && t2->attr.extension)
4468     t2 = gfc_get_derived_super_type (t2);
4469   return gfc_compare_derived_types (t1, t2);
4470 }
4471
4472
4473 /* Check if two typespecs are type compatible (F03:5.1.1.2):
4474    If ts1 is nonpolymorphic, ts2 must be the same type.
4475    If ts1 is polymorphic (CLASS), ts2 must be an extension of ts1.  */
4476
4477 bool
4478 gfc_type_compatible (gfc_typespec *ts1, gfc_typespec *ts2)
4479 {
4480   bool is_class1 = (ts1->type == BT_CLASS);
4481   bool is_class2 = (ts2->type == BT_CLASS);
4482   bool is_derived1 = (ts1->type == BT_DERIVED);
4483   bool is_derived2 = (ts2->type == BT_DERIVED);
4484
4485   if (is_class1
4486       && ts1->u.derived->components
4487       && ts1->u.derived->components->ts.u.derived->attr.unlimited_polymorphic)
4488     return 1;
4489
4490   if (!is_derived1 && !is_derived2 && !is_class1 && !is_class2)
4491     return (ts1->type == ts2->type);
4492
4493   if (is_derived1 && is_derived2)
4494     return gfc_compare_derived_types (ts1->u.derived, ts2->u.derived);
4495
4496   if (is_derived1 && is_class2)
4497     return gfc_compare_derived_types (ts1->u.derived,
4498                                       ts2->u.derived->components->ts.u.derived);
4499   if (is_class1 && is_derived2)
4500     return gfc_type_is_extension_of (ts1->u.derived->components->ts.u.derived,
4501                                      ts2->u.derived);
4502   else if (is_class1 && is_class2)
4503     return gfc_type_is_extension_of (ts1->u.derived->components->ts.u.derived,
4504                                      ts2->u.derived->components->ts.u.derived);
4505   else
4506     return 0;
4507 }
4508
4509
4510 /* Find the parent-namespace of the current function.  If we're inside
4511    BLOCK constructs, it may not be the current one.  */
4512
4513 gfc_namespace*
4514 gfc_find_proc_namespace (gfc_namespace* ns)
4515 {
4516   while (ns->construct_entities)
4517     {
4518       ns = ns->parent;
4519       gcc_assert (ns);
4520     }
4521
4522   return ns;
4523 }
4524
4525
4526 /* Check if an associate-variable should be translated as an `implicit' pointer
4527    internally (if it is associated to a variable and not an array with
4528    descriptor).  */
4529
4530 bool
4531 gfc_is_associate_pointer (gfc_symbol* sym)
4532 {
4533   if (!sym->assoc)
4534     return false;
4535
4536   if (sym->ts.type == BT_CLASS)
4537     return true;
4538
4539   if (!sym->assoc->variable)
4540     return false;
4541
4542   if (sym->attr.dimension && sym->as->type != AS_EXPLICIT)
4543     return false;
4544
4545   return true;
4546 }
4547
4548
4549 gfc_symbol *
4550 gfc_find_dt_in_generic (gfc_symbol *sym)
4551 {
4552   gfc_interface *intr = NULL;
4553
4554   if (!sym || sym->attr.flavor == FL_DERIVED)
4555     return sym;
4556
4557   if (sym->attr.generic)
4558     for (intr = sym->generic; intr; intr = intr->next)
4559       if (intr->sym->attr.flavor == FL_DERIVED)
4560         break;
4561   return intr ? intr->sym : NULL;
4562 }
4563
4564
4565 /* Get the dummy arguments from a procedure symbol. If it has been declared
4566    via a PROCEDURE statement with a named interface, ts.interface will be set
4567    and the arguments need to be taken from there.  */
4568
4569 gfc_formal_arglist *
4570 gfc_sym_get_dummy_args (gfc_symbol *sym)
4571 {
4572   gfc_formal_arglist *dummies;
4573
4574   dummies = sym->formal;
4575   if (dummies == NULL && sym->ts.interface != NULL)
4576     dummies = sym->ts.interface->formal;
4577
4578   return dummies;
4579 }