OSDN Git Service

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