OSDN Git Service

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