OSDN Git Service

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