tree.h (OMP_CLAUSE_LINEAR_STMT): Define.
[platform/upstream/gcc.git] / gcc / fortran / symbol.c
1 /* Maintain binary trees of symbols.
2    Copyright (C) 2000-2014 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))
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)
1118     gfc_unset_implicit_pure (NULL);
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_omp_declare_simd_list (ns->omp_declare_simd);
3472   gfc_free_charlen (ns->cl_list, NULL);
3473   free_st_labels (ns->st_labels);
3474
3475   free_entry_list (ns->entries);
3476   gfc_free_equiv (ns->equiv);
3477   gfc_free_equiv_lists (ns->equiv_lists);
3478   gfc_free_use_stmts (ns->use_stmts);
3479
3480   for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3481     gfc_free_interface (ns->op[i]);
3482
3483   gfc_free_data (ns->data);
3484   p = ns->contained;
3485   free (ns);
3486
3487   /* Recursively free any contained namespaces.  */
3488   while (p != NULL)
3489     {
3490       q = p;
3491       p = p->sibling;
3492       gfc_free_namespace (q);
3493     }
3494 }
3495
3496
3497 void
3498 gfc_symbol_init_2 (void)
3499 {
3500
3501   gfc_current_ns = gfc_get_namespace (NULL, 0);
3502 }
3503
3504
3505 void
3506 gfc_symbol_done_2 (void)
3507 {
3508   gfc_free_namespace (gfc_current_ns);
3509   gfc_current_ns = NULL;
3510   gfc_free_dt_list ();
3511
3512   enforce_single_undo_checkpoint ();
3513   free_undo_change_set_data (*latest_undo_chgset);
3514 }
3515
3516
3517 /* Count how many nodes a symtree has.  */
3518
3519 static unsigned
3520 count_st_nodes (const gfc_symtree *st)
3521 {
3522   unsigned nodes;
3523   if (!st)
3524     return 0;
3525
3526   nodes = count_st_nodes (st->left);
3527   nodes++;
3528   nodes += count_st_nodes (st->right);
3529
3530   return nodes;
3531 }
3532
3533
3534 /* Convert symtree tree into symtree vector.  */
3535
3536 static unsigned
3537 fill_st_vector (gfc_symtree *st, gfc_symtree **st_vec, unsigned node_cntr)
3538 {
3539   if (!st)
3540     return node_cntr;
3541
3542   node_cntr = fill_st_vector (st->left, st_vec, node_cntr);
3543   st_vec[node_cntr++] = st;
3544   node_cntr = fill_st_vector (st->right, st_vec, node_cntr);
3545
3546   return node_cntr;
3547 }
3548
3549
3550 /* Traverse namespace.  As the functions might modify the symtree, we store the
3551    symtree as a vector and operate on this vector.  Note: We assume that
3552    sym_func or st_func never deletes nodes from the symtree - only adding is
3553    allowed. Additionally, newly added nodes are not traversed.  */
3554
3555 static void
3556 do_traverse_symtree (gfc_symtree *st, void (*st_func) (gfc_symtree *),
3557                      void (*sym_func) (gfc_symbol *))
3558 {
3559   gfc_symtree **st_vec;
3560   unsigned nodes, i, node_cntr;
3561
3562   gcc_assert ((st_func && !sym_func) || (!st_func && sym_func));
3563   nodes = count_st_nodes (st);
3564   st_vec = XALLOCAVEC (gfc_symtree *, nodes);
3565   node_cntr = 0; 
3566   fill_st_vector (st, st_vec, node_cntr);
3567
3568   if (sym_func)
3569     {
3570       /* Clear marks.  */
3571       for (i = 0; i < nodes; i++)
3572         st_vec[i]->n.sym->mark = 0;
3573       for (i = 0; i < nodes; i++)
3574         if (!st_vec[i]->n.sym->mark)
3575           {
3576             (*sym_func) (st_vec[i]->n.sym);
3577             st_vec[i]->n.sym->mark = 1;
3578           }
3579      }
3580    else
3581       for (i = 0; i < nodes; i++)
3582         (*st_func) (st_vec[i]);
3583 }
3584
3585
3586 /* Recursively traverse the symtree nodes.  */
3587
3588 void
3589 gfc_traverse_symtree (gfc_symtree *st, void (*st_func) (gfc_symtree *))
3590 {
3591   do_traverse_symtree (st, st_func, NULL);
3592 }
3593
3594
3595 /* Call a given function for all symbols in the namespace.  We take
3596    care that each gfc_symbol node is called exactly once.  */
3597
3598 void
3599 gfc_traverse_ns (gfc_namespace *ns, void (*sym_func) (gfc_symbol *))
3600 {
3601   do_traverse_symtree (ns->sym_root, NULL, sym_func);
3602 }
3603
3604
3605 /* Return TRUE when name is the name of an intrinsic type.  */
3606
3607 bool
3608 gfc_is_intrinsic_typename (const char *name)
3609 {
3610   if (strcmp (name, "integer") == 0
3611       || strcmp (name, "real") == 0
3612       || strcmp (name, "character") == 0
3613       || strcmp (name, "logical") == 0
3614       || strcmp (name, "complex") == 0
3615       || strcmp (name, "doubleprecision") == 0
3616       || strcmp (name, "doublecomplex") == 0)
3617     return true;
3618   else
3619     return false;
3620 }
3621
3622
3623 /* Return TRUE if the symbol is an automatic variable.  */
3624
3625 static bool
3626 gfc_is_var_automatic (gfc_symbol *sym)
3627 {
3628   /* Pointer and allocatable variables are never automatic.  */
3629   if (sym->attr.pointer || sym->attr.allocatable)
3630     return false;
3631   /* Check for arrays with non-constant size.  */
3632   if (sym->attr.dimension && sym->as
3633       && !gfc_is_compile_time_shape (sym->as))
3634     return true;
3635   /* Check for non-constant length character variables.  */
3636   if (sym->ts.type == BT_CHARACTER
3637       && sym->ts.u.cl
3638       && !gfc_is_constant_expr (sym->ts.u.cl->length))
3639     return true;
3640   return false;
3641 }
3642
3643 /* Given a symbol, mark it as SAVEd if it is allowed.  */
3644
3645 static void
3646 save_symbol (gfc_symbol *sym)
3647 {
3648
3649   if (sym->attr.use_assoc)
3650     return;
3651
3652   if (sym->attr.in_common
3653       || sym->attr.dummy
3654       || sym->attr.result
3655       || sym->attr.flavor != FL_VARIABLE)
3656     return;
3657   /* Automatic objects are not saved.  */
3658   if (gfc_is_var_automatic (sym))
3659     return;
3660   gfc_add_save (&sym->attr, SAVE_EXPLICIT, sym->name, &sym->declared_at);
3661 }
3662
3663
3664 /* Mark those symbols which can be SAVEd as such.  */
3665
3666 void
3667 gfc_save_all (gfc_namespace *ns)
3668 {
3669   gfc_traverse_ns (ns, save_symbol);
3670 }
3671
3672
3673 /* Make sure that no changes to symbols are pending.  */
3674
3675 void
3676 gfc_enforce_clean_symbol_state(void)
3677 {
3678   enforce_single_undo_checkpoint ();
3679   gcc_assert (latest_undo_chgset->syms.is_empty ());
3680 }
3681
3682
3683 /************** Global symbol handling ************/
3684
3685
3686 /* Search a tree for the global symbol.  */
3687
3688 gfc_gsymbol *
3689 gfc_find_gsymbol (gfc_gsymbol *symbol, const char *name)
3690 {
3691   int c;
3692
3693   if (symbol == NULL)
3694     return NULL;
3695
3696   while (symbol)
3697     {
3698       c = strcmp (name, symbol->name);
3699       if (!c)
3700         return symbol;
3701
3702       symbol = (c < 0) ? symbol->left : symbol->right;
3703     }
3704
3705   return NULL;
3706 }
3707
3708
3709 /* Compare two global symbols. Used for managing the BB tree.  */
3710
3711 static int
3712 gsym_compare (void *_s1, void *_s2)
3713 {
3714   gfc_gsymbol *s1, *s2;
3715
3716   s1 = (gfc_gsymbol *) _s1;
3717   s2 = (gfc_gsymbol *) _s2;
3718   return strcmp (s1->name, s2->name);
3719 }
3720
3721
3722 /* Get a global symbol, creating it if it doesn't exist.  */
3723
3724 gfc_gsymbol *
3725 gfc_get_gsymbol (const char *name)
3726 {
3727   gfc_gsymbol *s;
3728
3729   s = gfc_find_gsymbol (gfc_gsym_root, name);
3730   if (s != NULL)
3731     return s;
3732
3733   s = XCNEW (gfc_gsymbol);
3734   s->type = GSYM_UNKNOWN;
3735   s->name = gfc_get_string (name);
3736
3737   gfc_insert_bbt (&gfc_gsym_root, s, gsym_compare);
3738
3739   return s;
3740 }
3741
3742
3743 static gfc_symbol *
3744 get_iso_c_binding_dt (int sym_id)
3745 {
3746   gfc_dt_list *dt_list;
3747
3748   dt_list = gfc_derived_types;
3749
3750   /* Loop through the derived types in the name list, searching for
3751      the desired symbol from iso_c_binding.  Search the parent namespaces
3752      if necessary and requested to (parent_flag).  */
3753   while (dt_list != NULL)
3754     {
3755       if (dt_list->derived->from_intmod != INTMOD_NONE
3756           && dt_list->derived->intmod_sym_id == sym_id)
3757         return dt_list->derived;
3758
3759       dt_list = dt_list->next;
3760     }
3761
3762   return NULL;
3763 }
3764
3765
3766 /* Verifies that the given derived type symbol, derived_sym, is interoperable
3767    with C.  This is necessary for any derived type that is BIND(C) and for
3768    derived types that are parameters to functions that are BIND(C).  All
3769    fields of the derived type are required to be interoperable, and are tested
3770    for such.  If an error occurs, the errors are reported here, allowing for
3771    multiple errors to be handled for a single derived type.  */
3772
3773 bool
3774 verify_bind_c_derived_type (gfc_symbol *derived_sym)
3775 {
3776   gfc_component *curr_comp = NULL;
3777   bool is_c_interop = false;
3778   bool retval = true;
3779    
3780   if (derived_sym == NULL)
3781     gfc_internal_error ("verify_bind_c_derived_type(): Given symbol is "
3782                         "unexpectedly NULL");
3783
3784   /* If we've already looked at this derived symbol, do not look at it again
3785      so we don't repeat warnings/errors.  */
3786   if (derived_sym->ts.is_c_interop)
3787     return true;
3788   
3789   /* The derived type must have the BIND attribute to be interoperable
3790      J3/04-007, Section 15.2.3.  */
3791   if (derived_sym->attr.is_bind_c != 1)
3792     {
3793       derived_sym->ts.is_c_interop = 0;
3794       gfc_error_now ("Derived type '%s' declared at %L must have the BIND "
3795                      "attribute to be C interoperable", derived_sym->name,
3796                      &(derived_sym->declared_at));
3797       retval = false;
3798     }
3799   
3800   curr_comp = derived_sym->components;
3801
3802   /* Fortran 2003 allows an empty derived type.  C99 appears to disallow an
3803      empty struct.  Section 15.2 in Fortran 2003 states:  "The following
3804      subclauses define the conditions under which a Fortran entity is
3805      interoperable.  If a Fortran entity is interoperable, an equivalent
3806      entity may be defined by means of C and the Fortran entity is said
3807      to be interoperable with the C entity.  There does not have to be such
3808      an interoperating C entity."
3809   */
3810   if (curr_comp == NULL)
3811     {
3812       gfc_warning ("Derived type '%s' with BIND(C) attribute at %L is empty, "
3813                    "and may be inaccessible by the C companion processor",
3814                    derived_sym->name, &(derived_sym->declared_at));
3815       derived_sym->ts.is_c_interop = 1;
3816       derived_sym->attr.is_bind_c = 1;
3817       return true;
3818     }
3819
3820
3821   /* Initialize the derived type as being C interoperable.
3822      If we find an error in the components, this will be set false.  */
3823   derived_sym->ts.is_c_interop = 1;
3824   
3825   /* Loop through the list of components to verify that the kind of
3826      each is a C interoperable type.  */
3827   do
3828     {
3829       /* The components cannot be pointers (fortran sense).  
3830          J3/04-007, Section 15.2.3, C1505.      */
3831       if (curr_comp->attr.pointer != 0)
3832         {
3833           gfc_error ("Component '%s' at %L cannot have the "
3834                      "POINTER attribute because it is a member "
3835                      "of the BIND(C) derived type '%s' at %L",
3836                      curr_comp->name, &(curr_comp->loc),
3837                      derived_sym->name, &(derived_sym->declared_at));
3838           retval = false;
3839         }
3840
3841       if (curr_comp->attr.proc_pointer != 0)
3842         {
3843           gfc_error ("Procedure pointer component '%s' at %L cannot be a member"
3844                      " of the BIND(C) derived type '%s' at %L", curr_comp->name,
3845                      &curr_comp->loc, derived_sym->name,
3846                      &derived_sym->declared_at);
3847           retval = false;
3848         }
3849
3850       /* The components cannot be allocatable.
3851          J3/04-007, Section 15.2.3, C1505.      */
3852       if (curr_comp->attr.allocatable != 0)
3853         {
3854           gfc_error ("Component '%s' at %L cannot have the "
3855                      "ALLOCATABLE attribute because it is a member "
3856                      "of the BIND(C) derived type '%s' at %L",
3857                      curr_comp->name, &(curr_comp->loc),
3858                      derived_sym->name, &(derived_sym->declared_at));
3859           retval = false;
3860         }
3861       
3862       /* BIND(C) derived types must have interoperable components.  */
3863       if (curr_comp->ts.type == BT_DERIVED
3864           && curr_comp->ts.u.derived->ts.is_iso_c != 1 
3865           && curr_comp->ts.u.derived != derived_sym)
3866         {
3867           /* This should be allowed; the draft says a derived-type can not
3868              have type parameters if it is has the BIND attribute.  Type
3869              parameters seem to be for making parameterized derived types.
3870              There's no need to verify the type if it is c_ptr/c_funptr.  */
3871           retval = verify_bind_c_derived_type (curr_comp->ts.u.derived);
3872         }
3873       else
3874         {
3875           /* Grab the typespec for the given component and test the kind.  */ 
3876           is_c_interop = gfc_verify_c_interop (&(curr_comp->ts));
3877           
3878           if (!is_c_interop)
3879             {
3880               /* Report warning and continue since not fatal.  The
3881                  draft does specify a constraint that requires all fields
3882                  to interoperate, but if the user says real(4), etc., it
3883                  may interoperate with *something* in C, but the compiler
3884                  most likely won't know exactly what.  Further, it may not
3885                  interoperate with the same data type(s) in C if the user
3886                  recompiles with different flags (e.g., -m32 and -m64 on
3887                  x86_64 and using integer(4) to claim interop with a
3888                  C_LONG).  */
3889               if (derived_sym->attr.is_bind_c == 1
3890                   && gfc_option.warn_c_binding_type)
3891                 /* If the derived type is bind(c), all fields must be
3892                    interop.  */
3893                 gfc_warning ("Component '%s' in derived type '%s' at %L "
3894                              "may not be C interoperable, even though "
3895                              "derived type '%s' is BIND(C)",
3896                              curr_comp->name, derived_sym->name,
3897                              &(curr_comp->loc), derived_sym->name);
3898               else if (gfc_option.warn_c_binding_type)
3899                 /* If derived type is param to bind(c) routine, or to one
3900                    of the iso_c_binding procs, it must be interoperable, so
3901                    all fields must interop too.  */
3902                 gfc_warning ("Component '%s' in derived type '%s' at %L "
3903                              "may not be C interoperable",
3904                              curr_comp->name, derived_sym->name,
3905                              &(curr_comp->loc));
3906             }
3907         }
3908       
3909       curr_comp = curr_comp->next;
3910     } while (curr_comp != NULL); 
3911
3912
3913   /* Make sure we don't have conflicts with the attributes.  */
3914   if (derived_sym->attr.access == ACCESS_PRIVATE)
3915     {
3916       gfc_error ("Derived type '%s' at %L cannot be declared with both "
3917                  "PRIVATE and BIND(C) attributes", derived_sym->name,
3918                  &(derived_sym->declared_at));
3919       retval = false;
3920     }
3921
3922   if (derived_sym->attr.sequence != 0)
3923     {
3924       gfc_error ("Derived type '%s' at %L cannot have the SEQUENCE "
3925                  "attribute because it is BIND(C)", derived_sym->name,
3926                  &(derived_sym->declared_at));
3927       retval = false;
3928     }
3929
3930   /* Mark the derived type as not being C interoperable if we found an
3931      error.  If there were only warnings, proceed with the assumption
3932      it's interoperable.  */
3933   if (!retval)
3934     derived_sym->ts.is_c_interop = 0;
3935   
3936   return retval;
3937 }
3938
3939
3940 /* Generate symbols for the named constants c_null_ptr and c_null_funptr.  */
3941
3942 static bool
3943 gen_special_c_interop_ptr (gfc_symbol *tmp_sym, gfc_symtree *dt_symtree)
3944 {
3945   gfc_constructor *c;
3946
3947   gcc_assert (tmp_sym && dt_symtree && dt_symtree->n.sym);
3948   dt_symtree->n.sym->attr.referenced = 1;
3949
3950   tmp_sym->attr.is_c_interop = 1;
3951   tmp_sym->attr.is_bind_c = 1;
3952   tmp_sym->ts.is_c_interop = 1;
3953   tmp_sym->ts.is_iso_c = 1;
3954   tmp_sym->ts.type = BT_DERIVED;
3955   tmp_sym->ts.f90_type = BT_VOID;
3956   tmp_sym->attr.flavor = FL_PARAMETER;
3957   tmp_sym->ts.u.derived = dt_symtree->n.sym;
3958   
3959   /* Set the c_address field of c_null_ptr and c_null_funptr to
3960      the value of NULL.  */
3961   tmp_sym->value = gfc_get_expr ();
3962   tmp_sym->value->expr_type = EXPR_STRUCTURE;
3963   tmp_sym->value->ts.type = BT_DERIVED;
3964   tmp_sym->value->ts.f90_type = BT_VOID;
3965   tmp_sym->value->ts.u.derived = tmp_sym->ts.u.derived;
3966   gfc_constructor_append_expr (&tmp_sym->value->value.constructor, NULL, NULL);
3967   c = gfc_constructor_first (tmp_sym->value->value.constructor);
3968   c->expr = gfc_get_int_expr (gfc_index_integer_kind, NULL, 0);
3969   c->expr->ts.is_iso_c = 1;
3970
3971   return true;
3972 }
3973
3974
3975 /* Add a formal argument, gfc_formal_arglist, to the
3976    end of the given list of arguments.  Set the reference to the
3977    provided symbol, param_sym, in the argument.  */
3978
3979 static void
3980 add_formal_arg (gfc_formal_arglist **head,
3981                 gfc_formal_arglist **tail,
3982                 gfc_formal_arglist *formal_arg,
3983                 gfc_symbol *param_sym)
3984 {
3985   /* Put in list, either as first arg or at the tail (curr arg).  */
3986   if (*head == NULL)
3987     *head = *tail = formal_arg;
3988   else
3989     {
3990       (*tail)->next = formal_arg;
3991       (*tail) = formal_arg;
3992     }
3993    
3994   (*tail)->sym = param_sym;
3995   (*tail)->next = NULL;
3996    
3997   return;
3998 }
3999
4000
4001 /* Add a procedure interface to the given symbol (i.e., store a
4002    reference to the list of formal arguments).  */
4003
4004 static void
4005 add_proc_interface (gfc_symbol *sym, ifsrc source, gfc_formal_arglist *formal)
4006 {
4007
4008   sym->formal = formal;
4009   sym->attr.if_source = source;
4010 }
4011
4012
4013 /* Copy the formal args from an existing symbol, src, into a new
4014    symbol, dest.  New formal args are created, and the description of
4015    each arg is set according to the existing ones.  This function is
4016    used when creating procedure declaration variables from a procedure
4017    declaration statement (see match_proc_decl()) to create the formal
4018    args based on the args of a given named interface.  */
4019
4020 void
4021 gfc_copy_formal_args_intr (gfc_symbol *dest, gfc_intrinsic_sym *src)
4022 {
4023   gfc_formal_arglist *head = NULL;
4024   gfc_formal_arglist *tail = NULL;
4025   gfc_formal_arglist *formal_arg = NULL;
4026   gfc_intrinsic_arg *curr_arg = NULL;
4027   gfc_formal_arglist *formal_prev = NULL;
4028   /* Save current namespace so we can change it for formal args.  */
4029   gfc_namespace *parent_ns = gfc_current_ns;
4030
4031   /* Create a new namespace, which will be the formal ns (namespace
4032      of the formal args).  */
4033   gfc_current_ns = gfc_get_namespace (parent_ns, 0);
4034   gfc_current_ns->proc_name = dest;
4035
4036   for (curr_arg = src->formal; curr_arg; curr_arg = curr_arg->next)
4037     {
4038       formal_arg = gfc_get_formal_arglist ();
4039       gfc_get_symbol (curr_arg->name, gfc_current_ns, &(formal_arg->sym));
4040
4041       /* May need to copy more info for the symbol.  */
4042       formal_arg->sym->ts = curr_arg->ts;
4043       formal_arg->sym->attr.optional = curr_arg->optional;
4044       formal_arg->sym->attr.value = curr_arg->value;
4045       formal_arg->sym->attr.intent = curr_arg->intent;
4046       formal_arg->sym->attr.flavor = FL_VARIABLE;
4047       formal_arg->sym->attr.dummy = 1;
4048
4049       if (formal_arg->sym->ts.type == BT_CHARACTER)
4050         formal_arg->sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4051
4052       /* If this isn't the first arg, set up the next ptr.  For the
4053         last arg built, the formal_arg->next will never get set to
4054         anything other than NULL.  */
4055       if (formal_prev != NULL)
4056         formal_prev->next = formal_arg;
4057       else
4058         formal_arg->next = NULL;
4059
4060       formal_prev = formal_arg;
4061
4062       /* Add arg to list of formal args.  */
4063       add_formal_arg (&head, &tail, formal_arg, formal_arg->sym);
4064
4065       /* Validate changes.  */
4066       gfc_commit_symbol (formal_arg->sym);
4067     }
4068
4069   /* Add the interface to the symbol.  */
4070   add_proc_interface (dest, IFSRC_DECL, head);
4071
4072   /* Store the formal namespace information.  */
4073   if (dest->formal != NULL)
4074     /* The current ns should be that for the dest proc.  */
4075     dest->formal_ns = gfc_current_ns;
4076   /* Restore the current namespace to what it was on entry.  */
4077   gfc_current_ns = parent_ns;
4078 }
4079
4080
4081 static int
4082 std_for_isocbinding_symbol (int id)
4083 {
4084   switch (id)
4085     {
4086 #define NAMED_INTCST(a,b,c,d) \
4087       case a:\
4088         return d;
4089 #include "iso-c-binding.def"
4090 #undef NAMED_INTCST
4091
4092 #define NAMED_FUNCTION(a,b,c,d) \
4093       case a:\
4094         return d;
4095 #define NAMED_SUBROUTINE(a,b,c,d) \
4096       case a:\
4097         return d;
4098 #include "iso-c-binding.def"
4099 #undef NAMED_FUNCTION
4100 #undef NAMED_SUBROUTINE
4101
4102        default:
4103          return GFC_STD_F2003;
4104     }
4105 }
4106
4107 /* Generate the given set of C interoperable kind objects, or all
4108    interoperable kinds.  This function will only be given kind objects
4109    for valid iso_c_binding defined types because this is verified when
4110    the 'use' statement is parsed.  If the user gives an 'only' clause,
4111    the specific kinds are looked up; if they don't exist, an error is
4112    reported.  If the user does not give an 'only' clause, all
4113    iso_c_binding symbols are generated.  If a list of specific kinds
4114    is given, it must have a NULL in the first empty spot to mark the
4115    end of the list. For C_null_(fun)ptr, dt_symtree has to be set and
4116    point to the symtree for c_(fun)ptr.  */
4117
4118 gfc_symtree *
4119 generate_isocbinding_symbol (const char *mod_name, iso_c_binding_symbol s,
4120                              const char *local_name, gfc_symtree *dt_symtree,
4121                              bool hidden)
4122 {
4123   const char *const name = (local_name && local_name[0])
4124                            ? local_name : c_interop_kinds_table[s].name;
4125   gfc_symtree *tmp_symtree;
4126   gfc_symbol *tmp_sym = NULL;
4127   int index;
4128
4129   if (gfc_notification_std (std_for_isocbinding_symbol (s)) == ERROR)
4130     return NULL;
4131
4132   tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
4133   if (hidden
4134       && (!tmp_symtree || !tmp_symtree->n.sym
4135           || tmp_symtree->n.sym->from_intmod != INTMOD_ISO_C_BINDING
4136           || tmp_symtree->n.sym->intmod_sym_id != s))
4137     tmp_symtree = NULL;
4138
4139   /* Already exists in this scope so don't re-add it. */
4140   if (tmp_symtree != NULL && (tmp_sym = tmp_symtree->n.sym) != NULL
4141       && (!tmp_sym->attr.generic
4142           || (tmp_sym = gfc_find_dt_in_generic (tmp_sym)) != NULL)
4143       && tmp_sym->from_intmod == INTMOD_ISO_C_BINDING)
4144     {
4145       if (tmp_sym->attr.flavor == FL_DERIVED
4146           && !get_iso_c_binding_dt (tmp_sym->intmod_sym_id))
4147         {
4148           gfc_dt_list *dt_list;
4149           dt_list = gfc_get_dt_list ();
4150           dt_list->derived = tmp_sym;
4151           dt_list->next = gfc_derived_types;
4152           gfc_derived_types = dt_list;
4153         }
4154
4155       return tmp_symtree;
4156     }
4157
4158   /* Create the sym tree in the current ns.  */
4159   if (hidden)
4160     {
4161       tmp_symtree = gfc_get_unique_symtree (gfc_current_ns);
4162       tmp_sym = gfc_new_symbol (name, gfc_current_ns);
4163
4164       /* Add to the list of tentative symbols.  */
4165       latest_undo_chgset->syms.safe_push (tmp_sym);
4166       tmp_sym->old_symbol = NULL;
4167       tmp_sym->mark = 1;
4168       tmp_sym->gfc_new = 1;
4169
4170       tmp_symtree->n.sym = tmp_sym;
4171       tmp_sym->refs++;
4172     }
4173   else
4174     {
4175       gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
4176       gcc_assert (tmp_symtree);
4177       tmp_sym = tmp_symtree->n.sym;
4178     }
4179
4180   /* Say what module this symbol belongs to.  */
4181   tmp_sym->module = gfc_get_string (mod_name);
4182   tmp_sym->from_intmod = INTMOD_ISO_C_BINDING;
4183   tmp_sym->intmod_sym_id = s;
4184   tmp_sym->attr.is_iso_c = 1;
4185   tmp_sym->attr.use_assoc = 1;
4186
4187   gcc_assert (dt_symtree == NULL || s == ISOCBINDING_NULL_FUNPTR
4188               || s == ISOCBINDING_NULL_PTR);
4189
4190   switch (s)
4191     {
4192
4193 #define NAMED_INTCST(a,b,c,d) case a : 
4194 #define NAMED_REALCST(a,b,c,d) case a :
4195 #define NAMED_CMPXCST(a,b,c,d) case a :
4196 #define NAMED_LOGCST(a,b,c) case a :
4197 #define NAMED_CHARKNDCST(a,b,c) case a :
4198 #include "iso-c-binding.def"
4199
4200         tmp_sym->value = gfc_get_int_expr (gfc_default_integer_kind, NULL,
4201                                            c_interop_kinds_table[s].value);
4202
4203         /* Initialize an integer constant expression node.  */
4204         tmp_sym->attr.flavor = FL_PARAMETER;
4205         tmp_sym->ts.type = BT_INTEGER;
4206         tmp_sym->ts.kind = gfc_default_integer_kind;
4207
4208         /* Mark this type as a C interoperable one.  */
4209         tmp_sym->ts.is_c_interop = 1;
4210         tmp_sym->ts.is_iso_c = 1;
4211         tmp_sym->value->ts.is_c_interop = 1;
4212         tmp_sym->value->ts.is_iso_c = 1;
4213         tmp_sym->attr.is_c_interop = 1;
4214
4215         /* Tell what f90 type this c interop kind is valid.  */
4216         tmp_sym->ts.f90_type = c_interop_kinds_table[s].f90_type;
4217
4218         break;
4219
4220
4221 #define NAMED_CHARCST(a,b,c) case a :
4222 #include "iso-c-binding.def"
4223
4224         /* Initialize an integer constant expression node for the
4225            length of the character.  */
4226         tmp_sym->value = gfc_get_character_expr (gfc_default_character_kind,
4227                                                  &gfc_current_locus, NULL, 1);
4228         tmp_sym->value->ts.is_c_interop = 1;
4229         tmp_sym->value->ts.is_iso_c = 1;
4230         tmp_sym->value->value.character.length = 1;
4231         tmp_sym->value->value.character.string[0]
4232           = (gfc_char_t) c_interop_kinds_table[s].value;
4233         tmp_sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4234         tmp_sym->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
4235                                                      NULL, 1);
4236
4237         /* May not need this in both attr and ts, but do need in
4238            attr for writing module file.  */
4239         tmp_sym->attr.is_c_interop = 1;
4240
4241         tmp_sym->attr.flavor = FL_PARAMETER;
4242         tmp_sym->ts.type = BT_CHARACTER;
4243
4244         /* Need to set it to the C_CHAR kind.  */
4245         tmp_sym->ts.kind = gfc_default_character_kind;
4246
4247         /* Mark this type as a C interoperable one.  */
4248         tmp_sym->ts.is_c_interop = 1;
4249         tmp_sym->ts.is_iso_c = 1;
4250
4251         /* Tell what f90 type this c interop kind is valid.  */
4252         tmp_sym->ts.f90_type = BT_CHARACTER;
4253
4254         break;
4255
4256       case ISOCBINDING_PTR:
4257       case ISOCBINDING_FUNPTR:
4258         {
4259           gfc_symbol *dt_sym;
4260           gfc_dt_list **dt_list_ptr = NULL;
4261           gfc_component *tmp_comp = NULL;
4262
4263           /* Generate real derived type.  */
4264           if (hidden)
4265             dt_sym = tmp_sym;
4266           else
4267             {
4268               const char *hidden_name;
4269               gfc_interface *intr, *head;
4270
4271               hidden_name = gfc_get_string ("%c%s",
4272                                             (char) TOUPPER ((unsigned char)
4273                                                               tmp_sym->name[0]),
4274                                             &tmp_sym->name[1]);
4275               tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
4276                                               hidden_name);
4277               gcc_assert (tmp_symtree == NULL);
4278               gfc_get_sym_tree (hidden_name, gfc_current_ns, &tmp_symtree, false);
4279               dt_sym = tmp_symtree->n.sym;
4280               dt_sym->name = gfc_get_string (s == ISOCBINDING_PTR
4281                                             ? "c_ptr" : "c_funptr");
4282
4283               /* Generate an artificial generic function.  */
4284               head = tmp_sym->generic;
4285               intr = gfc_get_interface ();
4286               intr->sym = dt_sym;
4287               intr->where = gfc_current_locus;
4288               intr->next = head;
4289               tmp_sym->generic = intr;
4290
4291               if (!tmp_sym->attr.generic
4292                   && !gfc_add_generic (&tmp_sym->attr, tmp_sym->name, NULL))
4293                 return NULL;
4294
4295               if (!tmp_sym->attr.function
4296                   && !gfc_add_function (&tmp_sym->attr, tmp_sym->name, NULL))
4297                 return NULL;
4298             }
4299
4300           /* Say what module this symbol belongs to.  */
4301           dt_sym->module = gfc_get_string (mod_name);
4302           dt_sym->from_intmod = INTMOD_ISO_C_BINDING;
4303           dt_sym->intmod_sym_id = s;
4304           dt_sym->attr.use_assoc = 1;
4305
4306           /* Initialize an integer constant expression node.  */
4307           dt_sym->attr.flavor = FL_DERIVED;
4308           dt_sym->ts.is_c_interop = 1;
4309           dt_sym->attr.is_c_interop = 1;
4310           dt_sym->attr.private_comp = 1;
4311           dt_sym->component_access = ACCESS_PRIVATE;
4312           dt_sym->ts.is_iso_c = 1;
4313           dt_sym->ts.type = BT_DERIVED;
4314           dt_sym->ts.f90_type = BT_VOID;
4315
4316           /* A derived type must have the bind attribute to be
4317              interoperable (J3/04-007, Section 15.2.3), even though
4318              the binding label is not used.  */
4319           dt_sym->attr.is_bind_c = 1;
4320
4321           dt_sym->attr.referenced = 1;
4322           dt_sym->ts.u.derived = dt_sym;
4323
4324           /* Add the symbol created for the derived type to the current ns.  */
4325           dt_list_ptr = &(gfc_derived_types);
4326           while (*dt_list_ptr != NULL && (*dt_list_ptr)->next != NULL)
4327             dt_list_ptr = &((*dt_list_ptr)->next);
4328
4329           /* There is already at least one derived type in the list, so append
4330              the one we're currently building for c_ptr or c_funptr.  */
4331           if (*dt_list_ptr != NULL)
4332             dt_list_ptr = &((*dt_list_ptr)->next);
4333           (*dt_list_ptr) = gfc_get_dt_list ();
4334           (*dt_list_ptr)->derived = dt_sym;
4335           (*dt_list_ptr)->next = NULL;
4336
4337           gfc_add_component (dt_sym, "c_address", &tmp_comp);
4338           if (tmp_comp == NULL)
4339             gcc_unreachable ();
4340
4341           tmp_comp->ts.type = BT_INTEGER;
4342
4343           /* Set this because the module will need to read/write this field.  */
4344           tmp_comp->ts.f90_type = BT_INTEGER;
4345
4346           /* The kinds for c_ptr and c_funptr are the same.  */
4347           index = get_c_kind ("c_ptr", c_interop_kinds_table);
4348           tmp_comp->ts.kind = c_interop_kinds_table[index].value;
4349           tmp_comp->attr.access = ACCESS_PRIVATE;
4350
4351           /* Mark the component as C interoperable.  */
4352           tmp_comp->ts.is_c_interop = 1;
4353         }
4354
4355         break;
4356
4357       case ISOCBINDING_NULL_PTR:
4358       case ISOCBINDING_NULL_FUNPTR:
4359         gen_special_c_interop_ptr (tmp_sym, dt_symtree);
4360         break;
4361
4362       default:
4363         gcc_unreachable ();
4364     }
4365   gfc_commit_symbol (tmp_sym);
4366   return tmp_symtree;
4367 }
4368
4369
4370 /* Check that a symbol is already typed.  If strict is not set, an untyped
4371    symbol is acceptable for non-standard-conforming mode.  */
4372
4373 bool
4374 gfc_check_symbol_typed (gfc_symbol* sym, gfc_namespace* ns,
4375                         bool strict, locus where)
4376 {
4377   gcc_assert (sym);
4378
4379   if (gfc_matching_prefix)
4380     return true;
4381
4382   /* Check for the type and try to give it an implicit one.  */
4383   if (sym->ts.type == BT_UNKNOWN
4384       && !gfc_set_default_type (sym, 0, ns))
4385     {
4386       if (strict)
4387         {
4388           gfc_error ("Symbol '%s' is used before it is typed at %L",
4389                      sym->name, &where);
4390           return false;
4391         }
4392
4393       if (!gfc_notify_std (GFC_STD_GNU, "Symbol '%s' is used before"
4394                            " it is typed at %L", sym->name, &where))
4395         return false;
4396     }
4397
4398   /* Everything is ok.  */
4399   return true;
4400 }
4401
4402
4403 /* Construct a typebound-procedure structure.  Those are stored in a tentative
4404    list and marked `error' until symbols are committed.  */
4405
4406 gfc_typebound_proc*
4407 gfc_get_typebound_proc (gfc_typebound_proc *tb0)
4408 {
4409   gfc_typebound_proc *result;
4410
4411   result = XCNEW (gfc_typebound_proc);
4412   if (tb0)
4413     *result = *tb0;
4414   result->error = 1;
4415
4416   latest_undo_chgset->tbps.safe_push (result);
4417
4418   return result;
4419 }
4420
4421
4422 /* Get the super-type of a given derived type.  */
4423
4424 gfc_symbol*
4425 gfc_get_derived_super_type (gfc_symbol* derived)
4426 {
4427   gcc_assert (derived);
4428
4429   if (derived->attr.generic)
4430     derived = gfc_find_dt_in_generic (derived);
4431
4432   if (!derived->attr.extension)
4433     return NULL;
4434
4435   gcc_assert (derived->components);
4436   gcc_assert (derived->components->ts.type == BT_DERIVED);
4437   gcc_assert (derived->components->ts.u.derived);
4438
4439   if (derived->components->ts.u.derived->attr.generic)
4440     return gfc_find_dt_in_generic (derived->components->ts.u.derived);
4441
4442   return derived->components->ts.u.derived;
4443 }
4444
4445
4446 /* Get the ultimate super-type of a given derived type.  */
4447
4448 gfc_symbol*
4449 gfc_get_ultimate_derived_super_type (gfc_symbol* derived)
4450 {
4451   if (!derived->attr.extension)
4452     return NULL;
4453
4454   derived = gfc_get_derived_super_type (derived);
4455
4456   if (derived->attr.extension)
4457     return gfc_get_ultimate_derived_super_type (derived);
4458   else
4459     return derived;
4460 }
4461
4462
4463 /* Check if a derived type t2 is an extension of (or equal to) a type t1.  */
4464
4465 bool
4466 gfc_type_is_extension_of (gfc_symbol *t1, gfc_symbol *t2)
4467 {
4468   while (!gfc_compare_derived_types (t1, t2) && t2->attr.extension)
4469     t2 = gfc_get_derived_super_type (t2);
4470   return gfc_compare_derived_types (t1, t2);
4471 }
4472
4473
4474 /* Check if two typespecs are type compatible (F03:5.1.1.2):
4475    If ts1 is nonpolymorphic, ts2 must be the same type.
4476    If ts1 is polymorphic (CLASS), ts2 must be an extension of ts1.  */
4477
4478 bool
4479 gfc_type_compatible (gfc_typespec *ts1, gfc_typespec *ts2)
4480 {
4481   bool is_class1 = (ts1->type == BT_CLASS);
4482   bool is_class2 = (ts2->type == BT_CLASS);
4483   bool is_derived1 = (ts1->type == BT_DERIVED);
4484   bool is_derived2 = (ts2->type == BT_DERIVED);
4485
4486   if (is_class1
4487       && ts1->u.derived->components
4488       && ts1->u.derived->components->ts.u.derived->attr.unlimited_polymorphic)
4489     return 1;
4490
4491   if (!is_derived1 && !is_derived2 && !is_class1 && !is_class2)
4492     return (ts1->type == ts2->type);
4493
4494   if (is_derived1 && is_derived2)
4495     return gfc_compare_derived_types (ts1->u.derived, ts2->u.derived);
4496
4497   if (is_derived1 && is_class2)
4498     return gfc_compare_derived_types (ts1->u.derived,
4499                                       ts2->u.derived->components->ts.u.derived);
4500   if (is_class1 && is_derived2)
4501     return gfc_type_is_extension_of (ts1->u.derived->components->ts.u.derived,
4502                                      ts2->u.derived);
4503   else if (is_class1 && is_class2)
4504     return gfc_type_is_extension_of (ts1->u.derived->components->ts.u.derived,
4505                                      ts2->u.derived->components->ts.u.derived);
4506   else
4507     return 0;
4508 }
4509
4510
4511 /* Find the parent-namespace of the current function.  If we're inside
4512    BLOCK constructs, it may not be the current one.  */
4513
4514 gfc_namespace*
4515 gfc_find_proc_namespace (gfc_namespace* ns)
4516 {
4517   while (ns->construct_entities)
4518     {
4519       ns = ns->parent;
4520       gcc_assert (ns);
4521     }
4522
4523   return ns;
4524 }
4525
4526
4527 /* Check if an associate-variable should be translated as an `implicit' pointer
4528    internally (if it is associated to a variable and not an array with
4529    descriptor).  */
4530
4531 bool
4532 gfc_is_associate_pointer (gfc_symbol* sym)
4533 {
4534   if (!sym->assoc)
4535     return false;
4536
4537   if (sym->ts.type == BT_CLASS)
4538     return true;
4539
4540   if (!sym->assoc->variable)
4541     return false;
4542
4543   if (sym->attr.dimension && sym->as->type != AS_EXPLICIT)
4544     return false;
4545
4546   return true;
4547 }
4548
4549
4550 gfc_symbol *
4551 gfc_find_dt_in_generic (gfc_symbol *sym)
4552 {
4553   gfc_interface *intr = NULL;
4554
4555   if (!sym || sym->attr.flavor == FL_DERIVED)
4556     return sym;
4557
4558   if (sym->attr.generic)
4559     for (intr = sym->generic; intr; intr = intr->next)
4560       if (intr->sym->attr.flavor == FL_DERIVED)
4561         break;
4562   return intr ? intr->sym : NULL;
4563 }
4564
4565
4566 /* Get the dummy arguments from a procedure symbol. If it has been declared
4567    via a PROCEDURE statement with a named interface, ts.interface will be set
4568    and the arguments need to be taken from there.  */
4569
4570 gfc_formal_arglist *
4571 gfc_sym_get_dummy_args (gfc_symbol *sym)
4572 {
4573   gfc_formal_arglist *dummies;
4574
4575   dummies = sym->formal;
4576   if (dummies == NULL && sym->ts.interface != NULL)
4577     dummies = sym->ts.interface->formal;
4578
4579   return dummies;
4580 }