OSDN Git Service

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