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