OSDN Git Service

* array.c: Don't include assert.h.
[pf3gnuchains/gcc-fork.git] / gcc / fortran / symbol.c
1 /* Maintain binary trees of symbols.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, 
3    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 2, 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 COPYING.  If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA.  */
22
23
24 #include "config.h"
25 #include <string.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28
29 #include "gfortran.h"
30 #include "parse.h"
31
32 /* Strings for all symbol attributes.  We use these for dumping the
33    parse tree, in error messages, and also when reading and writing
34    modules.  */
35
36 const mstring flavors[] =
37 {
38   minit ("UNKNOWN-FL", FL_UNKNOWN), minit ("PROGRAM", FL_PROGRAM),
39   minit ("BLOCK-DATA", FL_BLOCK_DATA), minit ("MODULE", FL_MODULE),
40   minit ("VARIABLE", FL_VARIABLE), minit ("PARAMETER", FL_PARAMETER),
41   minit ("LABEL", FL_LABEL), minit ("PROCEDURE", FL_PROCEDURE),
42   minit ("DERIVED", FL_DERIVED), minit ("NAMELIST", FL_NAMELIST),
43   minit (NULL, -1)
44 };
45
46 const mstring procedures[] =
47 {
48     minit ("UNKNOWN-PROC", PROC_UNKNOWN),
49     minit ("MODULE-PROC", PROC_MODULE),
50     minit ("INTERNAL-PROC", PROC_INTERNAL),
51     minit ("DUMMY-PROC", PROC_DUMMY),
52     minit ("INTRINSIC-PROC", PROC_INTRINSIC),
53     minit ("EXTERNAL-PROC", PROC_EXTERNAL),
54     minit ("STATEMENT-PROC", PROC_ST_FUNCTION),
55     minit (NULL, -1)
56 };
57
58 const mstring intents[] =
59 {
60     minit ("UNKNOWN-INTENT", INTENT_UNKNOWN),
61     minit ("IN", INTENT_IN),
62     minit ("OUT", INTENT_OUT),
63     minit ("INOUT", INTENT_INOUT),
64     minit (NULL, -1)
65 };
66
67 const mstring access_types[] =
68 {
69     minit ("UNKNOWN-ACCESS", ACCESS_UNKNOWN),
70     minit ("PUBLIC", ACCESS_PUBLIC),
71     minit ("PRIVATE", ACCESS_PRIVATE),
72     minit (NULL, -1)
73 };
74
75 const mstring ifsrc_types[] =
76 {
77     minit ("UNKNOWN", IFSRC_UNKNOWN),
78     minit ("DECL", IFSRC_DECL),
79     minit ("BODY", IFSRC_IFBODY),
80     minit ("USAGE", IFSRC_USAGE)
81 };
82
83
84 /* This is to make sure the backend generates setup code in the correct
85    order.  */
86
87 static int next_dummy_order = 1;
88
89
90 gfc_namespace *gfc_current_ns;
91
92 gfc_gsymbol *gfc_gsym_root = NULL;
93
94 static gfc_symbol *changed_syms = NULL;
95
96
97 /*********** IMPLICIT NONE and IMPLICIT statement handlers ***********/
98
99 /* The following static variable indicates whether a particular element has
100    been explicitly set or not.  */
101
102 static int new_flag[GFC_LETTERS];
103
104
105 /* Handle a correctly parsed IMPLICIT NONE.  */
106
107 void
108 gfc_set_implicit_none (void)
109 {
110   int i;
111
112   for (i = 0; i < GFC_LETTERS; i++)
113     {
114       gfc_clear_ts (&gfc_current_ns->default_type[i]);
115       gfc_current_ns->set_flag[i] = 1;
116     }
117 }
118
119
120 /* Reset the implicit range flags.  */
121
122 void
123 gfc_clear_new_implicit (void)
124 {
125   int i;
126
127   for (i = 0; i < GFC_LETTERS; i++)
128     new_flag[i] = 0;
129 }
130
131
132 /* Prepare for a new implicit range.  Sets flags in new_flag[].  */
133
134 try
135 gfc_add_new_implicit_range (int c1, int c2)
136 {
137   int i;
138
139   c1 -= 'a';
140   c2 -= 'a';
141
142   for (i = c1; i <= c2; i++)
143     {
144       if (new_flag[i])
145         {
146           gfc_error ("Letter '%c' already set in IMPLICIT statement at %C",
147                      i + 'A');
148           return FAILURE;
149         }
150
151       new_flag[i] = 1;
152     }
153
154   return SUCCESS;
155 }
156
157
158 /* Add a matched implicit range for gfc_set_implicit().  Check if merging
159    the new implicit types back into the existing types will work.  */
160
161 try
162 gfc_merge_new_implicit (gfc_typespec * ts)
163 {
164   int i;
165
166   for (i = 0; i < GFC_LETTERS; i++)
167     {
168       if (new_flag[i])
169         {
170
171           if (gfc_current_ns->set_flag[i])
172             {
173               gfc_error ("Letter %c already has an IMPLICIT type at %C",
174                          i + 'A');
175               return FAILURE;
176             }
177           gfc_current_ns->default_type[i] = *ts;
178           gfc_current_ns->set_flag[i] = 1;
179         }
180     }
181   return SUCCESS;
182 }
183
184
185 /* Given a symbol, return a pointer to the typespec for it's default
186    type.  */
187
188 gfc_typespec *
189 gfc_get_default_type (gfc_symbol * sym, gfc_namespace * ns)
190 {
191   char letter;
192
193   letter = sym->name[0];
194   if (letter < 'a' || letter > 'z')
195     gfc_internal_error ("gfc_get_default_type(): Bad symbol");
196
197   if (ns == NULL)
198     ns = gfc_current_ns;
199
200   return &ns->default_type[letter - 'a'];
201 }
202
203
204 /* Given a pointer to a symbol, set its type according to the first
205    letter of its name.  Fails if the letter in question has no default
206    type.  */
207
208 try
209 gfc_set_default_type (gfc_symbol * sym, int error_flag, gfc_namespace * ns)
210 {
211   gfc_typespec *ts;
212
213   if (sym->ts.type != BT_UNKNOWN)
214     gfc_internal_error ("gfc_set_default_type(): symbol already has a type");
215
216   ts = gfc_get_default_type (sym, ns);
217
218   if (ts->type == BT_UNKNOWN)
219     {
220       if (error_flag)
221         gfc_error ("Symbol '%s' at %L has no IMPLICIT type", sym->name,
222                    &sym->declared_at);
223
224       return FAILURE;
225     }
226
227   sym->ts = *ts;
228   sym->attr.implicit_type = 1;
229
230   return SUCCESS;
231 }
232
233
234 /******************** Symbol attribute stuff *********************/
235
236 /* This is a generic conflict-checker.  We do this to avoid having a
237    single conflict in two places.  */
238
239 #define conf(a, b) if (attr->a && attr->b) { a1 = a; a2 = b; goto conflict; }
240 #define conf2(a) if (attr->a) { a2 = a; goto conflict; }
241
242 static try
243 check_conflict (symbol_attribute * attr, locus * where)
244 {
245   static const char *dummy = "DUMMY", *save = "SAVE", *pointer = "POINTER",
246     *target = "TARGET", *external = "EXTERNAL", *intent = "INTENT",
247     *intrinsic = "INTRINSIC", *allocatable = "ALLOCATABLE",
248     *elemental = "ELEMENTAL", *private = "PRIVATE", *recursive = "RECURSIVE",
249     *in_common = "COMMON", *result = "RESULT", *in_namelist = "NAMELIST",
250     *public = "PUBLIC", *optional = "OPTIONAL", *entry = "ENTRY",
251     *function = "FUNCTION", *subroutine = "SUBROUTINE",
252     *dimension = "DIMENSION";
253
254   const char *a1, *a2;
255
256   if (where == NULL)
257     where = &gfc_current_locus;
258
259   if (attr->pointer && attr->intent != INTENT_UNKNOWN)
260     {
261       a1 = pointer;
262       a2 = intent;
263       goto conflict;
264     }
265
266   /* Check for attributes not allowed in a BLOCK DATA.  */
267   if (gfc_current_state () == COMP_BLOCK_DATA)
268     {
269       a1 = NULL;
270
271       if (attr->allocatable)
272         a1 = allocatable;
273       if (attr->external)
274         a1 = external;
275       if (attr->optional)
276         a1 = optional;
277       if (attr->access == ACCESS_PRIVATE)
278         a1 = private;
279       if (attr->access == ACCESS_PUBLIC)
280         a1 = public;
281       if (attr->intent != INTENT_UNKNOWN)
282         a1 = intent;
283
284       if (a1 != NULL)
285         {
286           gfc_error
287             ("%s attribute not allowed in BLOCK DATA program unit at %L", a1,
288              where);
289           return FAILURE;
290         }
291     }
292
293   conf (dummy, save);
294   conf (pointer, target);
295   conf (pointer, external);
296   conf (pointer, intrinsic);
297   conf (target, external);
298   conf (target, intrinsic);
299   conf (external, dimension);   /* See Fortran 95's R504.  */
300
301   conf (external, intrinsic);
302   conf (allocatable, pointer);
303   conf (allocatable, dummy);    /* TODO: Allowed in Fortran 200x.  */
304   conf (allocatable, function); /* TODO: Allowed in Fortran 200x.  */
305   conf (allocatable, result);   /* TODO: Allowed in Fortran 200x.  */
306   conf (elemental, recursive);
307
308   conf (in_common, dummy);
309   conf (in_common, allocatable);
310   conf (in_common, result);
311   conf (dummy, result);
312
313   conf (in_namelist, pointer);
314   conf (in_namelist, allocatable);
315
316   conf (entry, result);
317
318   conf (function, subroutine);
319
320   a1 = gfc_code2string (flavors, attr->flavor);
321
322   if (attr->in_namelist
323       && attr->flavor != FL_VARIABLE
324       && attr->flavor != FL_UNKNOWN)
325     {
326
327       a2 = in_namelist;
328       goto conflict;
329     }
330
331   switch (attr->flavor)
332     {
333     case FL_PROGRAM:
334     case FL_BLOCK_DATA:
335     case FL_MODULE:
336     case FL_LABEL:
337       conf2 (dummy);
338       conf2 (save);
339       conf2 (pointer);
340       conf2 (target);
341       conf2 (external);
342       conf2 (intrinsic);
343       conf2 (allocatable);
344       conf2 (result);
345       conf2 (in_namelist);
346       conf2 (optional);
347       conf2 (function);
348       conf2 (subroutine);
349       break;
350
351     case FL_VARIABLE:
352     case FL_NAMELIST:
353       break;
354
355     case FL_PROCEDURE:
356       conf2 (intent);
357
358       if (attr->subroutine)
359         {
360           conf2(save);
361           conf2(pointer);
362           conf2(target);
363           conf2(allocatable);
364           conf2(result);
365           conf2(in_namelist);
366           conf2(function);
367         }
368
369       switch (attr->proc)
370         {
371         case PROC_ST_FUNCTION:
372           conf2 (in_common);
373           break;
374
375         case PROC_MODULE:
376           conf2 (dummy);
377           break;
378
379         case PROC_DUMMY:
380           conf2 (result);
381           conf2 (in_common);
382           conf2 (save);
383           break;
384
385         default:
386           break;
387         }
388
389       break;
390
391     case FL_DERIVED:
392       conf2 (dummy);
393       conf2 (save);
394       conf2 (pointer);
395       conf2 (target);
396       conf2 (external);
397       conf2 (intrinsic);
398       conf2 (allocatable);
399       conf2 (optional);
400       conf2 (entry);
401       conf2 (function);
402       conf2 (subroutine);
403
404       if (attr->intent != INTENT_UNKNOWN)
405         {
406           a2 = intent;
407           goto conflict;
408         }
409       break;
410
411     case FL_PARAMETER:
412       conf2 (external);
413       conf2 (intrinsic);
414       conf2 (optional);
415       conf2 (allocatable);
416       conf2 (function);
417       conf2 (subroutine);
418       conf2 (entry);
419       conf2 (pointer);
420       conf2 (target);
421       conf2 (dummy);
422       conf2 (in_common);
423       break;
424
425     default:
426       break;
427     }
428
429   return SUCCESS;
430
431 conflict:
432   gfc_error ("%s attribute conflicts with %s attribute at %L", a1, a2, where);
433   return FAILURE;
434 }
435
436 #undef conf
437 #undef conf2
438
439
440 /* Mark a symbol as referenced.  */
441
442 void
443 gfc_set_sym_referenced (gfc_symbol * sym)
444 {
445   if (sym->attr.referenced)
446     return;
447
448   sym->attr.referenced = 1;
449
450   /* Remember which order dummy variables are accessed in.  */
451   if (sym->attr.dummy)
452     sym->dummy_order = next_dummy_order++;
453 }
454
455
456 /* Common subroutine called by attribute changing subroutines in order
457    to prevent them from changing a symbol that has been
458    use-associated.  Returns zero if it is OK to change the symbol,
459    nonzero if not.  */
460
461 static int
462 check_used (symbol_attribute * attr, locus * where)
463 {
464
465   if (attr->use_assoc == 0)
466     return 0;
467
468   if (where == NULL)
469     where = &gfc_current_locus;
470
471   gfc_error ("Cannot change attributes of USE-associated symbol at %L",
472              where);
473
474   return 1;
475 }
476
477
478 /* Used to prevent changing the attributes of a symbol after it has been
479    used.  This check is only done from dummy variable as only these can be
480    used in specification expressions.  Applying this to all symbols causes
481    error when we reach the body of a contained function.  */
482
483 static int
484 check_done (symbol_attribute * attr, locus * where)
485 {
486
487   if (!(attr->dummy && attr->referenced))
488     return 0;
489
490   if (where == NULL)
491     where = &gfc_current_locus;
492
493   gfc_error ("Cannot change attributes of symbol at %L"
494              " after it has been used", where);
495
496   return 1;
497 }
498
499
500 /* Generate an error because of a duplicate attribute.  */
501
502 static void
503 duplicate_attr (const char *attr, locus * where)
504 {
505
506   if (where == NULL)
507     where = &gfc_current_locus;
508
509   gfc_error ("Duplicate %s attribute specified at %L", attr, where);
510 }
511
512
513 try
514 gfc_add_allocatable (symbol_attribute * attr, locus * where)
515 {
516
517   if (check_used (attr, where) || check_done (attr, where))
518     return FAILURE;
519
520   if (attr->allocatable)
521     {
522       duplicate_attr ("ALLOCATABLE", where);
523       return FAILURE;
524     }
525
526   attr->allocatable = 1;
527   return check_conflict (attr, where);
528 }
529
530
531 try
532 gfc_add_dimension (symbol_attribute * attr, locus * where)
533 {
534
535   if (check_used (attr, where) || check_done (attr, where))
536     return FAILURE;
537
538   if (attr->dimension)
539     {
540       duplicate_attr ("DIMENSION", where);
541       return FAILURE;
542     }
543
544   attr->dimension = 1;
545   return check_conflict (attr, where);
546 }
547
548
549 try
550 gfc_add_external (symbol_attribute * attr, locus * where)
551 {
552
553   if (check_used (attr, where) || check_done (attr, where))
554     return FAILURE;
555
556   if (attr->external)
557     {
558       duplicate_attr ("EXTERNAL", where);
559       return FAILURE;
560     }
561
562   attr->external = 1;
563
564   return check_conflict (attr, where);
565 }
566
567
568 try
569 gfc_add_intrinsic (symbol_attribute * attr, locus * where)
570 {
571
572   if (check_used (attr, where) || check_done (attr, where))
573     return FAILURE;
574
575   if (attr->intrinsic)
576     {
577       duplicate_attr ("INTRINSIC", where);
578       return FAILURE;
579     }
580
581   attr->intrinsic = 1;
582
583   return check_conflict (attr, where);
584 }
585
586
587 try
588 gfc_add_optional (symbol_attribute * attr, locus * where)
589 {
590
591   if (check_used (attr, where) || check_done (attr, where))
592     return FAILURE;
593
594   if (attr->optional)
595     {
596       duplicate_attr ("OPTIONAL", where);
597       return FAILURE;
598     }
599
600   attr->optional = 1;
601   return check_conflict (attr, where);
602 }
603
604
605 try
606 gfc_add_pointer (symbol_attribute * attr, locus * where)
607 {
608
609   if (check_used (attr, where) || check_done (attr, where))
610     return FAILURE;
611
612   attr->pointer = 1;
613   return check_conflict (attr, where);
614 }
615
616
617 try
618 gfc_add_result (symbol_attribute * attr, locus * where)
619 {
620
621   if (check_used (attr, where) || check_done (attr, where))
622     return FAILURE;
623
624   attr->result = 1;
625   return check_conflict (attr, where);
626 }
627
628
629 try
630 gfc_add_save (symbol_attribute * attr, locus * where)
631 {
632
633   if (check_used (attr, where))
634     return FAILURE;
635
636   if (gfc_pure (NULL))
637     {
638       gfc_error
639         ("SAVE attribute at %L cannot be specified in a PURE procedure",
640          where);
641       return FAILURE;
642     }
643
644   if (attr->save)
645     {
646       duplicate_attr ("SAVE", where);
647       return FAILURE;
648     }
649
650   attr->save = 1;
651   return check_conflict (attr, where);
652 }
653
654
655 try
656 gfc_add_target (symbol_attribute * attr, locus * where)
657 {
658
659   if (check_used (attr, where) || check_done (attr, where))
660     return FAILURE;
661
662   if (attr->target)
663     {
664       duplicate_attr ("TARGET", where);
665       return FAILURE;
666     }
667
668   attr->target = 1;
669   return check_conflict (attr, where);
670 }
671
672
673 try
674 gfc_add_dummy (symbol_attribute * attr, locus * where)
675 {
676
677   if (check_used (attr, where))
678     return FAILURE;
679
680   /* Duplicate dummy arguments are allow due to ENTRY statements.  */
681   attr->dummy = 1;
682   return check_conflict (attr, where);
683 }
684
685
686 try
687 gfc_add_in_common (symbol_attribute * attr, locus * where)
688 {
689
690   if (check_used (attr, where) || check_done (attr, where))
691     return FAILURE;
692
693   /* Duplicate attribute already checked for.  */
694   attr->in_common = 1;
695   if (check_conflict (attr, where) == FAILURE)
696     return FAILURE;
697
698   if (attr->flavor == FL_VARIABLE)
699     return SUCCESS;
700
701   return gfc_add_flavor (attr, FL_VARIABLE, where);
702 }
703
704
705 try
706 gfc_add_data (symbol_attribute *attr, locus *where)
707 {
708
709   if (check_used (attr, where))
710     return FAILURE;
711
712   attr->data = 1;
713   return check_conflict (attr, where);
714 }
715
716
717 try
718 gfc_add_in_namelist (symbol_attribute * attr, locus * where)
719 {
720
721   attr->in_namelist = 1;
722   return check_conflict (attr, where);
723 }
724
725
726 try
727 gfc_add_sequence (symbol_attribute * attr, locus * where)
728 {
729
730   if (check_used (attr, where))
731     return FAILURE;
732
733   attr->sequence = 1;
734   return check_conflict (attr, where);
735 }
736
737
738 try
739 gfc_add_elemental (symbol_attribute * attr, locus * where)
740 {
741
742   if (check_used (attr, where) || check_done (attr, where))
743     return FAILURE;
744
745   attr->elemental = 1;
746   return check_conflict (attr, where);
747 }
748
749
750 try
751 gfc_add_pure (symbol_attribute * attr, locus * where)
752 {
753
754   if (check_used (attr, where) || check_done (attr, where))
755     return FAILURE;
756
757   attr->pure = 1;
758   return check_conflict (attr, where);
759 }
760
761
762 try
763 gfc_add_recursive (symbol_attribute * attr, locus * where)
764 {
765
766   if (check_used (attr, where) || check_done (attr, where))
767     return FAILURE;
768
769   attr->recursive = 1;
770   return check_conflict (attr, where);
771 }
772
773
774 try
775 gfc_add_entry (symbol_attribute * attr, locus * where)
776 {
777
778   if (check_used (attr, where))
779     return FAILURE;
780
781   if (attr->entry)
782     {
783       duplicate_attr ("ENTRY", where);
784       return FAILURE;
785     }
786
787   attr->entry = 1;
788   return check_conflict (attr, where);
789 }
790
791
792 try
793 gfc_add_function (symbol_attribute * attr, locus * where)
794 {
795
796   if (attr->flavor != FL_PROCEDURE
797       && gfc_add_flavor (attr, FL_PROCEDURE, where) == FAILURE)
798     return FAILURE;
799
800   attr->function = 1;
801   return check_conflict (attr, where);
802 }
803
804
805 try
806 gfc_add_subroutine (symbol_attribute * attr, locus * where)
807 {
808
809   if (attr->flavor != FL_PROCEDURE
810       && gfc_add_flavor (attr, FL_PROCEDURE, where) == FAILURE)
811     return FAILURE;
812
813   attr->subroutine = 1;
814   return check_conflict (attr, where);
815 }
816
817
818 try
819 gfc_add_generic (symbol_attribute * attr, locus * where)
820 {
821
822   if (attr->flavor != FL_PROCEDURE
823       && gfc_add_flavor (attr, FL_PROCEDURE, where) == FAILURE)
824     return FAILURE;
825
826   attr->generic = 1;
827   return check_conflict (attr, where);
828 }
829
830
831 /* Flavors are special because some flavors are not what fortran
832    considers attributes and can be reaffirmed multiple times.  */
833
834 try
835 gfc_add_flavor (symbol_attribute * attr, sym_flavor f, locus * where)
836 {
837
838   if ((f == FL_PROGRAM || f == FL_BLOCK_DATA || f == FL_MODULE
839        || f == FL_PARAMETER || f == FL_LABEL || f == FL_DERIVED
840        || f == FL_NAMELIST) && check_used (attr, where))
841     return FAILURE;
842
843   if (attr->flavor == f && f == FL_VARIABLE)
844     return SUCCESS;
845
846   if (attr->flavor != FL_UNKNOWN)
847     {
848       if (where == NULL)
849         where = &gfc_current_locus;
850
851       gfc_error ("%s attribute conflicts with %s attribute at %L",
852                  gfc_code2string (flavors, attr->flavor),
853                  gfc_code2string (flavors, f), where);
854
855       return FAILURE;
856     }
857
858   attr->flavor = f;
859
860   return check_conflict (attr, where);
861 }
862
863
864 try
865 gfc_add_procedure (symbol_attribute * attr, procedure_type t, locus * where)
866 {
867
868   if (check_used (attr, where) || check_done (attr, where))
869     return FAILURE;
870
871   if (attr->flavor != FL_PROCEDURE
872       && gfc_add_flavor (attr, FL_PROCEDURE, where) == FAILURE)
873     return FAILURE;
874
875   if (where == NULL)
876     where = &gfc_current_locus;
877
878   if (attr->proc != PROC_UNKNOWN)
879     {
880       gfc_error ("%s procedure at %L is already %s %s procedure",
881                  gfc_code2string (procedures, t), where,
882                  gfc_article (gfc_code2string (procedures, attr->proc)),
883                  gfc_code2string (procedures, attr->proc));
884
885       return FAILURE;
886     }
887
888   attr->proc = t;
889
890   /* Statement functions are always scalar and functions.  */
891   if (t == PROC_ST_FUNCTION
892       && ((!attr->function && gfc_add_function (attr, where) == FAILURE)
893           || attr->dimension))
894     return FAILURE;
895
896   return check_conflict (attr, where);
897 }
898
899
900 try
901 gfc_add_intent (symbol_attribute * attr, sym_intent intent, locus * where)
902 {
903
904   if (check_used (attr, where))
905     return FAILURE;
906
907   if (attr->intent == INTENT_UNKNOWN)
908     {
909       attr->intent = intent;
910       return check_conflict (attr, where);
911     }
912
913   if (where == NULL)
914     where = &gfc_current_locus;
915
916   gfc_error ("INTENT (%s) conflicts with INTENT(%s) at %L",
917              gfc_intent_string (attr->intent),
918              gfc_intent_string (intent), where);
919
920   return FAILURE;
921 }
922
923
924 /* No checks for use-association in public and private statements.  */
925
926 try
927 gfc_add_access (symbol_attribute * attr, gfc_access access, locus * where)
928 {
929
930   if (attr->access == ACCESS_UNKNOWN)
931     {
932       attr->access = access;
933       return check_conflict (attr, where);
934     }
935
936   if (where == NULL)
937     where = &gfc_current_locus;
938   gfc_error ("ACCESS specification at %L was already specified", where);
939
940   return FAILURE;
941 }
942
943
944 try
945 gfc_add_explicit_interface (gfc_symbol * sym, ifsrc source,
946                             gfc_formal_arglist * formal, locus * where)
947 {
948
949   if (check_used (&sym->attr, where))
950     return FAILURE;
951
952   if (where == NULL)
953     where = &gfc_current_locus;
954
955   if (sym->attr.if_source != IFSRC_UNKNOWN
956       && sym->attr.if_source != IFSRC_DECL)
957     {
958       gfc_error ("Symbol '%s' at %L already has an explicit interface",
959                  sym->name, where);
960       return FAILURE;
961     }
962
963   sym->formal = formal;
964   sym->attr.if_source = source;
965
966   return SUCCESS;
967 }
968
969
970 /* Add a type to a symbol.  */
971
972 try
973 gfc_add_type (gfc_symbol * sym, gfc_typespec * ts, locus * where)
974 {
975   sym_flavor flavor;
976
977 /* TODO: This is legal if it is reaffirming an implicit type.
978   if (check_done (&sym->attr, where))
979     return FAILURE;*/
980
981   if (where == NULL)
982     where = &gfc_current_locus;
983
984   if (sym->ts.type != BT_UNKNOWN)
985     {
986       gfc_error ("Symbol '%s' at %L already has basic type of %s", sym->name,
987                  where, gfc_basic_typename (sym->ts.type));
988       return FAILURE;
989     }
990
991   flavor = sym->attr.flavor;
992
993   if (flavor == FL_PROGRAM || flavor == FL_BLOCK_DATA || flavor == FL_MODULE
994       || flavor == FL_LABEL || (flavor == FL_PROCEDURE
995                                 && sym->attr.subroutine)
996       || flavor == FL_DERIVED || flavor == FL_NAMELIST)
997     {
998       gfc_error ("Symbol '%s' at %L cannot have a type", sym->name, where);
999       return FAILURE;
1000     }
1001
1002   sym->ts = *ts;
1003   return SUCCESS;
1004 }
1005
1006
1007 /* Clears all attributes.  */
1008
1009 void
1010 gfc_clear_attr (symbol_attribute * attr)
1011 {
1012   memset (attr, 0, sizeof(symbol_attribute));
1013 }
1014
1015
1016 /* Check for missing attributes in the new symbol.  Currently does
1017    nothing, but it's not clear that it is unnecessary yet.  */
1018
1019 try
1020 gfc_missing_attr (symbol_attribute * attr ATTRIBUTE_UNUSED,
1021                   locus * where ATTRIBUTE_UNUSED)
1022 {
1023
1024   return SUCCESS;
1025 }
1026
1027
1028 /* Copy an attribute to a symbol attribute, bit by bit.  Some
1029    attributes have a lot of side-effects but cannot be present given
1030    where we are called from, so we ignore some bits.  */
1031
1032 try
1033 gfc_copy_attr (symbol_attribute * dest, symbol_attribute * src, locus * where)
1034 {
1035
1036   if (src->allocatable && gfc_add_allocatable (dest, where) == FAILURE)
1037     goto fail;
1038
1039   if (src->dimension && gfc_add_dimension (dest, where) == FAILURE)
1040     goto fail;
1041   if (src->optional && gfc_add_optional (dest, where) == FAILURE)
1042     goto fail;
1043   if (src->pointer && gfc_add_pointer (dest, where) == FAILURE)
1044     goto fail;
1045   if (src->save && gfc_add_save (dest, where) == FAILURE)
1046     goto fail;
1047   if (src->target && gfc_add_target (dest, where) == FAILURE)
1048     goto fail;
1049   if (src->dummy && gfc_add_dummy (dest, where) == FAILURE)
1050     goto fail;
1051   if (src->result && gfc_add_result (dest, where) == FAILURE)
1052     goto fail;
1053   if (src->entry)
1054     dest->entry = 1;
1055
1056   if (src->in_namelist && gfc_add_in_namelist (dest, where) == FAILURE)
1057     goto fail;
1058
1059   if (src->in_common && gfc_add_in_common (dest, where) == FAILURE)
1060     goto fail;
1061
1062   if (src->generic && gfc_add_generic (dest, where) == FAILURE)
1063     goto fail;
1064   if (src->function && gfc_add_function (dest, where) == FAILURE)
1065     goto fail;
1066   if (src->subroutine && gfc_add_subroutine (dest, where) == FAILURE)
1067     goto fail;
1068
1069   if (src->sequence && gfc_add_sequence (dest, where) == FAILURE)
1070     goto fail;
1071   if (src->elemental && gfc_add_elemental (dest, where) == FAILURE)
1072     goto fail;
1073   if (src->pure && gfc_add_pure (dest, where) == FAILURE)
1074     goto fail;
1075   if (src->recursive && gfc_add_recursive (dest, where) == FAILURE)
1076     goto fail;
1077
1078   if (src->flavor != FL_UNKNOWN
1079       && gfc_add_flavor (dest, src->flavor, where) == FAILURE)
1080     goto fail;
1081
1082   if (src->intent != INTENT_UNKNOWN
1083       && gfc_add_intent (dest, src->intent, where) == FAILURE)
1084     goto fail;
1085
1086   if (src->access != ACCESS_UNKNOWN
1087       && gfc_add_access (dest, src->access, where) == FAILURE)
1088     goto fail;
1089
1090   if (gfc_missing_attr (dest, where) == FAILURE)
1091     goto fail;
1092
1093   /* The subroutines that set these bits also cause flavors to be set,
1094      and that has already happened in the original, so don't let to
1095      happen again.  */
1096   if (src->external)
1097     dest->external = 1;
1098   if (src->intrinsic)
1099     dest->intrinsic = 1;
1100
1101   return SUCCESS;
1102
1103 fail:
1104   return FAILURE;
1105 }
1106
1107
1108 /************** Component name management ************/
1109
1110 /* Component names of a derived type form their own little namespaces
1111    that are separate from all other spaces.  The space is composed of
1112    a singly linked list of gfc_component structures whose head is
1113    located in the parent symbol.  */
1114
1115
1116 /* Add a component name to a symbol.  The call fails if the name is
1117    already present.  On success, the component pointer is modified to
1118    point to the additional component structure.  */
1119
1120 try
1121 gfc_add_component (gfc_symbol * sym, const char *name, gfc_component ** component)
1122 {
1123   gfc_component *p, *tail;
1124
1125   tail = NULL;
1126
1127   for (p = sym->components; p; p = p->next)
1128     {
1129       if (strcmp (p->name, name) == 0)
1130         {
1131           gfc_error ("Component '%s' at %C already declared at %L",
1132                      name, &p->loc);
1133           return FAILURE;
1134         }
1135
1136       tail = p;
1137     }
1138
1139   /* Allocate new component */
1140   p = gfc_get_component ();
1141
1142   if (tail == NULL)
1143     sym->components = p;
1144   else
1145     tail->next = p;
1146
1147   strcpy (p->name, name);
1148   p->loc = gfc_current_locus;
1149
1150   *component = p;
1151   return SUCCESS;
1152 }
1153
1154
1155 /* Recursive function to switch derived types of all symbol in a
1156    namespace.  */
1157
1158 static void
1159 switch_types (gfc_symtree * st, gfc_symbol * from, gfc_symbol * to)
1160 {
1161   gfc_symbol *sym;
1162
1163   if (st == NULL)
1164     return;
1165
1166   sym = st->n.sym;
1167   if (sym->ts.type == BT_DERIVED && sym->ts.derived == from)
1168     sym->ts.derived = to;
1169
1170   switch_types (st->left, from, to);
1171   switch_types (st->right, from, to);
1172 }
1173
1174
1175 /* This subroutine is called when a derived type is used in order to
1176    make the final determination about which version to use.  The
1177    standard requires that a type be defined before it is 'used', but
1178    such types can appear in IMPLICIT statements before the actual
1179    definition.  'Using' in this context means declaring a variable to
1180    be that type or using the type constructor.
1181
1182    If a type is used and the components haven't been defined, then we
1183    have to have a derived type in a parent unit.  We find the node in
1184    the other namespace and point the symtree node in this namespace to
1185    that node.  Further reference to this name point to the correct
1186    node.  If we can't find the node in a parent namespace, then have
1187    an error.
1188
1189    This subroutine takes a pointer to a symbol node and returns a
1190    pointer to the translated node or NULL for an error.  Usually there
1191    is no translation and we return the node we were passed.  */
1192
1193 static gfc_symtree *
1194 gfc_use_ha_derived (gfc_symbol * sym)
1195 {
1196   gfc_symbol *s, *p;
1197   gfc_typespec *t;
1198   gfc_symtree *st;
1199   int i;
1200
1201   if (sym->ns->parent == NULL)
1202     goto bad;
1203
1204   if (gfc_find_symbol (sym->name, sym->ns->parent, 1, &s))
1205     {
1206       gfc_error ("Symbol '%s' at %C is ambiguous", sym->name);
1207       return NULL;
1208     }
1209
1210   if (s == NULL || s->attr.flavor != FL_DERIVED)
1211     goto bad;
1212
1213   /* Get rid of symbol sym, translating all references to s.  */
1214   for (i = 0; i < GFC_LETTERS; i++)
1215     {
1216       t = &sym->ns->default_type[i];
1217       if (t->derived == sym)
1218         t->derived = s;
1219     }
1220
1221   st = gfc_find_symtree (sym->ns->sym_root, sym->name);
1222   st->n.sym = s;
1223
1224   s->refs++;
1225
1226   /* Unlink from list of modified symbols.  */
1227   if (changed_syms == sym)
1228     changed_syms = sym->tlink;
1229   else
1230     for (p = changed_syms; p; p = p->tlink)
1231       if (p->tlink == sym)
1232         {
1233           p->tlink = sym->tlink;
1234           break;
1235         }
1236
1237   switch_types (sym->ns->sym_root, sym, s);
1238
1239   /* TODO: Also have to replace sym -> s in other lists like
1240      namelists, common lists and interface lists.  */
1241   gfc_free_symbol (sym);
1242
1243   return st;
1244
1245 bad:
1246   gfc_error ("Derived type '%s' at %C is being used before it is defined",
1247              sym->name);
1248   return NULL;
1249 }
1250
1251
1252 gfc_symbol *
1253 gfc_use_derived (gfc_symbol * sym)
1254 {
1255   gfc_symtree *st;
1256
1257   if (sym->components != NULL)
1258     return sym;                 /* Already defined */
1259
1260   st = gfc_use_ha_derived (sym);
1261   if (st)
1262     return st->n.sym;
1263   else
1264     return NULL;
1265 }
1266
1267
1268 /* Given a derived type node and a component name, try to locate the
1269    component structure.  Returns the NULL pointer if the component is
1270    not found or the components are private.  */
1271
1272 gfc_component *
1273 gfc_find_component (gfc_symbol * sym, const char *name)
1274 {
1275   gfc_component *p;
1276
1277   if (name == NULL)
1278     return NULL;
1279
1280   sym = gfc_use_derived (sym);
1281
1282   if (sym == NULL)
1283     return NULL;
1284
1285   for (p = sym->components; p; p = p->next)
1286     if (strcmp (p->name, name) == 0)
1287       break;
1288
1289   if (p == NULL)
1290     gfc_error ("'%s' at %C is not a member of the '%s' structure",
1291                name, sym->name);
1292   else
1293     {
1294       if (sym->attr.use_assoc && sym->component_access == ACCESS_PRIVATE)
1295         {
1296           gfc_error ("Component '%s' at %C is a PRIVATE component of '%s'",
1297                      name, sym->name);
1298           p = NULL;
1299         }
1300     }
1301
1302   return p;
1303 }
1304
1305
1306 /* Given a symbol, free all of the component structures and everything
1307    they point to.  */
1308
1309 static void
1310 free_components (gfc_component * p)
1311 {
1312   gfc_component *q;
1313
1314   for (; p; p = q)
1315     {
1316       q = p->next;
1317
1318       gfc_free_array_spec (p->as);
1319       gfc_free_expr (p->initializer);
1320
1321       gfc_free (p);
1322     }
1323 }
1324
1325
1326 /* Set component attributes from a standard symbol attribute
1327    structure.  */
1328
1329 void
1330 gfc_set_component_attr (gfc_component * c, symbol_attribute * attr)
1331 {
1332
1333   c->dimension = attr->dimension;
1334   c->pointer = attr->pointer;
1335 }
1336
1337
1338 /* Get a standard symbol attribute structure given the component
1339    structure.  */
1340
1341 void
1342 gfc_get_component_attr (symbol_attribute * attr, gfc_component * c)
1343 {
1344
1345   gfc_clear_attr (attr);
1346   attr->dimension = c->dimension;
1347   attr->pointer = c->pointer;
1348 }
1349
1350
1351 /******************** Statement label management ********************/
1352
1353 /* Free a single gfc_st_label structure, making sure the list is not
1354    messed up.  This function is called only when some parse error
1355    occurs.  */
1356
1357 void
1358 gfc_free_st_label (gfc_st_label * l)
1359 {
1360
1361   if (l == NULL)
1362     return;
1363
1364   if (l->prev)
1365     (l->prev->next = l->next);
1366
1367   if (l->next)
1368     (l->next->prev = l->prev);
1369
1370   if (l->format != NULL)
1371     gfc_free_expr (l->format);
1372   gfc_free (l);
1373 }
1374
1375 /* Free a whole list of gfc_st_label structures.  */
1376
1377 static void
1378 free_st_labels (gfc_st_label * l1)
1379 {
1380   gfc_st_label *l2;
1381
1382   for (; l1; l1 = l2)
1383     {
1384       l2 = l1->next;
1385       if (l1->format != NULL)
1386         gfc_free_expr (l1->format);
1387       gfc_free (l1);
1388     }
1389 }
1390
1391
1392 /* Given a label number, search for and return a pointer to the label
1393    structure, creating it if it does not exist.  */
1394
1395 gfc_st_label *
1396 gfc_get_st_label (int labelno)
1397 {
1398   gfc_st_label *lp;
1399
1400   /* First see if the label is already in this namespace.  */
1401   for (lp = gfc_current_ns->st_labels; lp; lp = lp->next)
1402     if (lp->value == labelno)
1403       break;
1404   if (lp != NULL)
1405     return lp;
1406
1407   lp = gfc_getmem (sizeof (gfc_st_label));
1408
1409   lp->value = labelno;
1410   lp->defined = ST_LABEL_UNKNOWN;
1411   lp->referenced = ST_LABEL_UNKNOWN;
1412
1413   lp->prev = NULL;
1414   lp->next = gfc_current_ns->st_labels;
1415   if (gfc_current_ns->st_labels)
1416     gfc_current_ns->st_labels->prev = lp;
1417   gfc_current_ns->st_labels = lp;
1418
1419   return lp;
1420 }
1421
1422
1423 /* Called when a statement with a statement label is about to be
1424    accepted.  We add the label to the list of the current namespace,
1425    making sure it hasn't been defined previously and referenced
1426    correctly.  */
1427
1428 void
1429 gfc_define_st_label (gfc_st_label * lp, gfc_sl_type type, locus * label_locus)
1430 {
1431   int labelno;
1432
1433   labelno = lp->value;
1434
1435   if (lp->defined != ST_LABEL_UNKNOWN)
1436     gfc_error ("Duplicate statement label %d at %L and %L", labelno,
1437                &lp->where, label_locus);
1438   else
1439     {
1440       lp->where = *label_locus;
1441
1442       switch (type)
1443         {
1444         case ST_LABEL_FORMAT:
1445           if (lp->referenced == ST_LABEL_TARGET)
1446             gfc_error ("Label %d at %C already referenced as branch target",
1447                        labelno);
1448           else
1449             lp->defined = ST_LABEL_FORMAT;
1450
1451           break;
1452
1453         case ST_LABEL_TARGET:
1454           if (lp->referenced == ST_LABEL_FORMAT)
1455             gfc_error ("Label %d at %C already referenced as a format label",
1456                        labelno);
1457           else
1458             lp->defined = ST_LABEL_TARGET;
1459
1460           break;
1461
1462         default:
1463           lp->defined = ST_LABEL_BAD_TARGET;
1464           lp->referenced = ST_LABEL_BAD_TARGET;
1465         }
1466     }
1467 }
1468
1469
1470 /* Reference a label.  Given a label and its type, see if that
1471    reference is consistent with what is known about that label,
1472    updating the unknown state.  Returns FAILURE if something goes
1473    wrong.  */
1474
1475 try
1476 gfc_reference_st_label (gfc_st_label * lp, gfc_sl_type type)
1477 {
1478   gfc_sl_type label_type;
1479   int labelno;
1480   try rc;
1481
1482   if (lp == NULL)
1483     return SUCCESS;
1484
1485   labelno = lp->value;
1486
1487   if (lp->defined != ST_LABEL_UNKNOWN)
1488     label_type = lp->defined;
1489   else
1490     {
1491       label_type = lp->referenced;
1492       lp->where = gfc_current_locus;
1493     }
1494
1495   if (label_type == ST_LABEL_FORMAT && type == ST_LABEL_TARGET)
1496     {
1497       gfc_error ("Label %d at %C previously used as a FORMAT label", labelno);
1498       rc = FAILURE;
1499       goto done;
1500     }
1501
1502   if ((label_type == ST_LABEL_TARGET || label_type == ST_LABEL_BAD_TARGET)
1503       && type == ST_LABEL_FORMAT)
1504     {
1505       gfc_error ("Label %d at %C previously used as branch target", labelno);
1506       rc = FAILURE;
1507       goto done;
1508     }
1509
1510   lp->referenced = type;
1511   rc = SUCCESS;
1512
1513 done:
1514   return rc;
1515 }
1516
1517
1518 /************** Symbol table management subroutines ****************/
1519
1520 /* Basic details: Fortran 95 requires a potentially unlimited number
1521    of distinct namespaces when compiling a program unit.  This case
1522    occurs during a compilation of internal subprograms because all of
1523    the internal subprograms must be read before we can start
1524    generating code for the host.
1525
1526    Given the tricky nature of the fortran grammar, we must be able to
1527    undo changes made to a symbol table if the current interpretation
1528    of a statement is found to be incorrect.  Whenever a symbol is
1529    looked up, we make a copy of it and link to it.  All of these
1530    symbols are kept in a singly linked list so that we can commit or
1531    undo the changes at a later time.
1532
1533    A symtree may point to a symbol node outside of its namespace.  In
1534    this case, that symbol has been used as a host associated variable
1535    at some previous time.  */
1536
1537 /* Allocate a new namespace structure.  */
1538
1539 gfc_namespace *
1540 gfc_get_namespace (gfc_namespace * parent)
1541 {
1542   gfc_namespace *ns;
1543   gfc_typespec *ts;
1544   gfc_intrinsic_op in;
1545   int i;
1546
1547   ns = gfc_getmem (sizeof (gfc_namespace));
1548   ns->sym_root = NULL;
1549   ns->uop_root = NULL;
1550   ns->default_access = ACCESS_UNKNOWN;
1551   ns->parent = parent;
1552
1553   for (in = GFC_INTRINSIC_BEGIN; in != GFC_INTRINSIC_END; in++)
1554     ns->operator_access[in] = ACCESS_UNKNOWN;
1555
1556   /* Initialize default implicit types.  */
1557   for (i = 'a'; i <= 'z'; i++)
1558     {
1559       ns->set_flag[i - 'a'] = 0;
1560       ts = &ns->default_type[i - 'a'];
1561
1562       if (ns->parent != NULL)
1563         {
1564           /* Copy parent settings */
1565           *ts = ns->parent->default_type[i - 'a'];
1566           continue;
1567         }
1568
1569       if (gfc_option.flag_implicit_none != 0)
1570         {
1571           gfc_clear_ts (ts);
1572           continue;
1573         }
1574
1575       if ('i' <= i && i <= 'n')
1576         {
1577           ts->type = BT_INTEGER;
1578           ts->kind = gfc_default_integer_kind;
1579         }
1580       else
1581         {
1582           ts->type = BT_REAL;
1583           ts->kind = gfc_default_real_kind;
1584         }
1585     }
1586
1587   ns->refs = 1;
1588
1589   return ns;
1590 }
1591
1592
1593 /* Comparison function for symtree nodes.  */
1594
1595 static int
1596 compare_symtree (void * _st1, void * _st2)
1597 {
1598   gfc_symtree *st1, *st2;
1599
1600   st1 = (gfc_symtree *) _st1;
1601   st2 = (gfc_symtree *) _st2;
1602
1603   return strcmp (st1->name, st2->name);
1604 }
1605
1606
1607 /* Allocate a new symtree node and associate it with the new symbol.  */
1608
1609 gfc_symtree *
1610 gfc_new_symtree (gfc_symtree ** root, const char *name)
1611 {
1612   gfc_symtree *st;
1613
1614   st = gfc_getmem (sizeof (gfc_symtree));
1615   strcpy (st->name, name);
1616
1617   gfc_insert_bbt (root, st, compare_symtree);
1618   return st;
1619 }
1620
1621
1622 /* Delete a symbol from the tree.  Does not free the symbol itself!  */
1623
1624 static void
1625 delete_symtree (gfc_symtree ** root, const char *name)
1626 {
1627   gfc_symtree st, *st0;
1628
1629   st0 = gfc_find_symtree (*root, name);
1630
1631   strcpy (st.name, name);
1632   gfc_delete_bbt (root, &st, compare_symtree);
1633
1634   gfc_free (st0);
1635 }
1636
1637
1638 /* Given a root symtree node and a name, try to find the symbol within
1639    the namespace.  Returns NULL if the symbol is not found.  */
1640
1641 gfc_symtree *
1642 gfc_find_symtree (gfc_symtree * st, const char *name)
1643 {
1644   int c;
1645
1646   while (st != NULL)
1647     {
1648       c = strcmp (name, st->name);
1649       if (c == 0)
1650         return st;
1651
1652       st = (c < 0) ? st->left : st->right;
1653     }
1654
1655   return NULL;
1656 }
1657
1658
1659 /* Given a name find a user operator node, creating it if it doesn't
1660    exist.  These are much simpler than symbols because they can't be
1661    ambiguous with one another.  */
1662
1663 gfc_user_op *
1664 gfc_get_uop (const char *name)
1665 {
1666   gfc_user_op *uop;
1667   gfc_symtree *st;
1668
1669   st = gfc_find_symtree (gfc_current_ns->uop_root, name);
1670   if (st != NULL)
1671     return st->n.uop;
1672
1673   st = gfc_new_symtree (&gfc_current_ns->uop_root, name);
1674
1675   uop = st->n.uop = gfc_getmem (sizeof (gfc_user_op));
1676   strcpy (uop->name, name);
1677   uop->access = ACCESS_UNKNOWN;
1678   uop->ns = gfc_current_ns;
1679
1680   return uop;
1681 }
1682
1683
1684 /* Given a name find the user operator node.  Returns NULL if it does
1685    not exist.  */
1686
1687 gfc_user_op *
1688 gfc_find_uop (const char *name, gfc_namespace * ns)
1689 {
1690   gfc_symtree *st;
1691
1692   if (ns == NULL)
1693     ns = gfc_current_ns;
1694
1695   st = gfc_find_symtree (ns->uop_root, name);
1696   return (st == NULL) ? NULL : st->n.uop;
1697 }
1698
1699
1700 /* Remove a gfc_symbol structure and everything it points to.  */
1701
1702 void
1703 gfc_free_symbol (gfc_symbol * sym)
1704 {
1705
1706   if (sym == NULL)
1707     return;
1708
1709   gfc_free_array_spec (sym->as);
1710
1711   free_components (sym->components);
1712
1713   gfc_free_expr (sym->value);
1714
1715   gfc_free_namelist (sym->namelist);
1716
1717   gfc_free_namespace (sym->formal_ns);
1718
1719   gfc_free_interface (sym->generic);
1720
1721   gfc_free_formal_arglist (sym->formal);
1722
1723   gfc_free (sym);
1724 }
1725
1726
1727 /* Allocate and initialize a new symbol node.  */
1728
1729 gfc_symbol *
1730 gfc_new_symbol (const char *name, gfc_namespace * ns)
1731 {
1732   gfc_symbol *p;
1733
1734   p = gfc_getmem (sizeof (gfc_symbol));
1735
1736   gfc_clear_ts (&p->ts);
1737   gfc_clear_attr (&p->attr);
1738   p->ns = ns;
1739
1740   p->declared_at = gfc_current_locus;
1741
1742   if (strlen (name) > GFC_MAX_SYMBOL_LEN)
1743     gfc_internal_error ("new_symbol(): Symbol name too long");
1744
1745   strcpy (p->name, name);
1746   return p;
1747 }
1748
1749
1750 /* Generate an error if a symbol is ambiguous.  */
1751
1752 static void
1753 ambiguous_symbol (const char *name, gfc_symtree * st)
1754 {
1755
1756   if (st->n.sym->module[0])
1757     gfc_error ("Name '%s' at %C is an ambiguous reference to '%s' "
1758                "from module '%s'", name, st->n.sym->name, st->n.sym->module);
1759   else
1760     gfc_error ("Name '%s' at %C is an ambiguous reference to '%s' "
1761                "from current program unit", name, st->n.sym->name);
1762 }
1763
1764
1765 /* Search for a symtree starting in the current namespace, resorting to
1766    any parent namespaces if requested by a nonzero parent_flag.
1767    Returns nonzero if the name is ambiguous.  */
1768
1769 int
1770 gfc_find_sym_tree (const char *name, gfc_namespace * ns, int parent_flag,
1771                    gfc_symtree ** result)
1772 {
1773   gfc_symtree *st;
1774
1775   if (ns == NULL)
1776     ns = gfc_current_ns;
1777
1778   do
1779     {
1780       st = gfc_find_symtree (ns->sym_root, name);
1781       if (st != NULL)
1782         {
1783           *result = st;
1784           if (st->ambiguous)
1785             {
1786               ambiguous_symbol (name, st);
1787               return 1;
1788             }
1789
1790           return 0;
1791         }
1792
1793       if (!parent_flag)
1794         break;
1795
1796       ns = ns->parent;
1797     }
1798   while (ns != NULL);
1799
1800   *result = NULL;
1801   return 0;
1802 }
1803
1804
1805 /* Same, but returns the symbol instead.  */
1806
1807 int
1808 gfc_find_symbol (const char *name, gfc_namespace * ns, int parent_flag,
1809                  gfc_symbol ** result)
1810 {
1811   gfc_symtree *st;
1812   int i;
1813
1814   i = gfc_find_sym_tree (name, ns, parent_flag, &st);
1815
1816   if (st == NULL)
1817     *result = NULL;
1818   else
1819     *result = st->n.sym;
1820
1821   return i;
1822 }
1823
1824
1825 /* Save symbol with the information necessary to back it out.  */
1826
1827 static void
1828 save_symbol_data (gfc_symbol * sym)
1829 {
1830
1831   if (sym->new || sym->old_symbol != NULL)
1832     return;
1833
1834   sym->old_symbol = gfc_getmem (sizeof (gfc_symbol));
1835   *(sym->old_symbol) = *sym;
1836
1837   sym->tlink = changed_syms;
1838   changed_syms = sym;
1839 }
1840
1841
1842 /* Given a name, find a symbol, or create it if it does not exist yet
1843    in the current namespace.  If the symbol is found we make sure that
1844    it's OK.
1845
1846    The integer return code indicates
1847      0   All OK
1848      1   The symbol name was ambiguous
1849      2   The name meant to be established was already host associated.
1850
1851    So if the return value is nonzero, then an error was issued.  */
1852
1853 int
1854 gfc_get_sym_tree (const char *name, gfc_namespace * ns, gfc_symtree ** result)
1855 {
1856   gfc_symtree *st;
1857   gfc_symbol *p;
1858
1859   /* This doesn't usually happen during resolution.  */
1860   if (ns == NULL)
1861     ns = gfc_current_ns;
1862
1863   /* Try to find the symbol in ns.  */
1864   st = gfc_find_symtree (ns->sym_root, name);
1865
1866   if (st == NULL)
1867     {
1868       /* If not there, create a new symbol.  */
1869       p = gfc_new_symbol (name, ns);
1870
1871       /* Add to the list of tentative symbols.  */
1872       p->old_symbol = NULL;
1873       p->tlink = changed_syms;
1874       p->mark = 1;
1875       p->new = 1;
1876       changed_syms = p;
1877
1878       st = gfc_new_symtree (&ns->sym_root, name);
1879       st->n.sym = p;
1880       p->refs++;
1881
1882     }
1883   else
1884     {
1885       /* Make sure the existing symbol is OK.  */
1886       if (st->ambiguous)
1887         {
1888           ambiguous_symbol (name, st);
1889           return 1;
1890         }
1891
1892       p = st->n.sym;
1893
1894       if (p->ns != ns && (!p->attr.function || ns->proc_name != p))
1895         {
1896           /* Symbol is from another namespace.  */
1897           gfc_error ("Symbol '%s' at %C has already been host associated",
1898                      name);
1899           return 2;
1900         }
1901
1902       p->mark = 1;
1903
1904       /* Copy in case this symbol is changed.  */
1905       save_symbol_data (p);
1906     }
1907
1908   *result = st;
1909   return 0;
1910 }
1911
1912
1913 int
1914 gfc_get_symbol (const char *name, gfc_namespace * ns, gfc_symbol ** result)
1915 {
1916   gfc_symtree *st;
1917   int i;
1918
1919
1920   i = gfc_get_sym_tree (name, ns, &st);
1921   if (i != 0)
1922     return i;
1923
1924   if (st)
1925     *result = st->n.sym;
1926   else
1927     *result = NULL;
1928   return i;
1929 }
1930
1931
1932 /* Subroutine that searches for a symbol, creating it if it doesn't
1933    exist, but tries to host-associate the symbol if possible.  */
1934
1935 int
1936 gfc_get_ha_sym_tree (const char *name, gfc_symtree ** result)
1937 {
1938   gfc_symtree *st;
1939   int i;
1940
1941   i = gfc_find_sym_tree (name, gfc_current_ns, 0, &st);
1942   if (st != NULL)
1943     {
1944       save_symbol_data (st->n.sym);
1945
1946       *result = st;
1947       return i;
1948     }
1949
1950   if (gfc_current_ns->parent != NULL)
1951     {
1952       i = gfc_find_sym_tree (name, gfc_current_ns->parent, 1, &st);
1953       if (i)
1954         return i;
1955
1956       if (st != NULL)
1957         {
1958           *result = st;
1959           return 0;
1960         }
1961     }
1962
1963   return gfc_get_sym_tree (name, gfc_current_ns, result);
1964 }
1965
1966
1967 int
1968 gfc_get_ha_symbol (const char *name, gfc_symbol ** result)
1969 {
1970   int i;
1971   gfc_symtree *st;
1972
1973   i = gfc_get_ha_sym_tree (name, &st);
1974
1975   if (st)
1976     *result = st->n.sym;
1977   else
1978     *result = NULL;
1979
1980   return i;
1981 }
1982
1983 /* Return true if both symbols could refer to the same data object.  Does
1984    not take account of aliasing due to equivalence statements.  */
1985
1986 int
1987 gfc_symbols_could_alias (gfc_symbol * lsym, gfc_symbol * rsym)
1988 {
1989   /* Aliasing isn't possible if the symbols have different base types.  */
1990   if (gfc_compare_types (&lsym->ts, &rsym->ts) == 0)
1991     return 0;
1992
1993   /* Pointers can point to other pointers, target objects and allocatable
1994      objects.  Two allocatable objects cannot share the same storage.  */
1995   if (lsym->attr.pointer
1996       && (rsym->attr.pointer || rsym->attr.allocatable || rsym->attr.target))
1997     return 1;
1998   if (lsym->attr.target && rsym->attr.pointer)
1999     return 1;
2000   if (lsym->attr.allocatable && rsym->attr.pointer)
2001     return 1;
2002
2003   return 0;
2004 }
2005
2006
2007 /* Undoes all the changes made to symbols in the current statement.
2008    This subroutine is made simpler due to the fact that attributes are
2009    never removed once added.  */
2010
2011 void
2012 gfc_undo_symbols (void)
2013 {
2014   gfc_symbol *p, *q, *old;
2015
2016   for (p = changed_syms; p; p = q)
2017     {
2018       q = p->tlink;
2019
2020       if (p->new)
2021         {
2022           /* Symbol was new.  */
2023           delete_symtree (&p->ns->sym_root, p->name);
2024
2025           p->refs--;
2026           if (p->refs < 0)
2027             gfc_internal_error ("gfc_undo_symbols(): Negative refs");
2028           if (p->refs == 0)
2029             gfc_free_symbol (p);
2030           continue;
2031         }
2032
2033       /* Restore previous state of symbol.  Just copy simple stuff.  */
2034       p->mark = 0;
2035       old = p->old_symbol;
2036
2037       p->ts.type = old->ts.type;
2038       p->ts.kind = old->ts.kind;
2039
2040       p->attr = old->attr;
2041
2042       if (p->value != old->value)
2043         {
2044           gfc_free_expr (old->value);
2045           p->value = NULL;
2046         }
2047
2048       if (p->as != old->as)
2049         {
2050           if (p->as)
2051             gfc_free_array_spec (p->as);
2052           p->as = old->as;
2053         }
2054
2055       p->generic = old->generic;
2056       p->component_access = old->component_access;
2057
2058       if (p->namelist != NULL && old->namelist == NULL)
2059         {
2060           gfc_free_namelist (p->namelist);
2061           p->namelist = NULL;
2062         }
2063       else
2064         {
2065
2066           if (p->namelist_tail != old->namelist_tail)
2067             {
2068               gfc_free_namelist (old->namelist_tail);
2069               old->namelist_tail->next = NULL;
2070             }
2071         }
2072
2073       p->namelist_tail = old->namelist_tail;
2074
2075       if (p->formal != old->formal)
2076         {
2077           gfc_free_formal_arglist (p->formal);
2078           p->formal = old->formal;
2079         }
2080
2081       gfc_free (p->old_symbol);
2082       p->old_symbol = NULL;
2083       p->tlink = NULL;
2084     }
2085
2086   changed_syms = NULL;
2087 }
2088
2089
2090 /* Makes the changes made in the current statement permanent-- gets
2091    rid of undo information.  */
2092
2093 void
2094 gfc_commit_symbols (void)
2095 {
2096   gfc_symbol *p, *q;
2097
2098   for (p = changed_syms; p; p = q)
2099     {
2100       q = p->tlink;
2101       p->tlink = NULL;
2102       p->mark = 0;
2103       p->new = 0;
2104
2105       if (p->old_symbol != NULL)
2106         {
2107           gfc_free (p->old_symbol);
2108           p->old_symbol = NULL;
2109         }
2110     }
2111
2112   changed_syms = NULL;
2113 }
2114
2115
2116 /* Recursive function that deletes an entire tree and all the common
2117    head structures it points to.  */
2118
2119 static void
2120 free_common_tree (gfc_symtree * common_tree)
2121 {
2122   if (common_tree == NULL)
2123     return;
2124
2125   free_common_tree (common_tree->left);
2126   free_common_tree (common_tree->right);
2127
2128   gfc_free (common_tree);
2129 }  
2130
2131
2132 /* Recursive function that deletes an entire tree and all the user
2133    operator nodes that it contains.  */
2134
2135 static void
2136 free_uop_tree (gfc_symtree * uop_tree)
2137 {
2138
2139   if (uop_tree == NULL)
2140     return;
2141
2142   free_uop_tree (uop_tree->left);
2143   free_uop_tree (uop_tree->right);
2144
2145   gfc_free_interface (uop_tree->n.uop->operator);
2146
2147   gfc_free (uop_tree->n.uop);
2148   gfc_free (uop_tree);
2149 }
2150
2151
2152 /* Recursive function that deletes an entire tree and all the symbols
2153    that it contains.  */
2154
2155 static void
2156 free_sym_tree (gfc_symtree * sym_tree)
2157 {
2158   gfc_namespace *ns;
2159   gfc_symbol *sym;
2160
2161   if (sym_tree == NULL)
2162     return;
2163
2164   free_sym_tree (sym_tree->left);
2165   free_sym_tree (sym_tree->right);
2166
2167   sym = sym_tree->n.sym;
2168
2169   sym->refs--;
2170   if (sym->refs < 0)
2171     gfc_internal_error ("free_sym_tree(): Negative refs");
2172
2173   if (sym->formal_ns != NULL && sym->refs == 1)
2174     {
2175       /* As formal_ns contains a reference to sym, delete formal_ns just
2176          before the deletion of sym.  */
2177       ns = sym->formal_ns;
2178       sym->formal_ns = NULL;
2179       gfc_free_namespace (ns);
2180     }
2181   else if (sym->refs == 0)
2182     {
2183       /* Go ahead and delete the symbol.  */
2184       gfc_free_symbol (sym);
2185     }
2186
2187   gfc_free (sym_tree);
2188 }
2189
2190
2191 /* Free a namespace structure and everything below it.  Interface
2192    lists associated with intrinsic operators are not freed.  These are
2193    taken care of when a specific name is freed.  */
2194
2195 void
2196 gfc_free_namespace (gfc_namespace * ns)
2197 {
2198   gfc_charlen *cl, *cl2;
2199   gfc_namespace *p, *q;
2200   gfc_intrinsic_op i;
2201
2202   if (ns == NULL)
2203     return;
2204
2205   ns->refs--;
2206   if (ns->refs > 0)
2207     return;
2208   gcc_assert (ns->refs == 0);
2209
2210   gfc_free_statements (ns->code);
2211
2212   free_sym_tree (ns->sym_root);
2213   free_uop_tree (ns->uop_root);
2214   free_common_tree (ns->common_root);
2215
2216   for (cl = ns->cl_list; cl; cl = cl2)
2217     {
2218       cl2 = cl->next;
2219       gfc_free_expr (cl->length);
2220       gfc_free (cl);
2221     }
2222
2223   free_st_labels (ns->st_labels);
2224
2225   gfc_free_equiv (ns->equiv);
2226
2227   for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
2228     gfc_free_interface (ns->operator[i]);
2229
2230   gfc_free_data (ns->data);
2231   p = ns->contained;
2232   gfc_free (ns);
2233
2234   /* Recursively free any contained namespaces.  */
2235   while (p != NULL)
2236     {
2237       q = p;
2238       p = p->sibling;
2239
2240       gfc_free_namespace (q);
2241     }
2242 }
2243
2244
2245 void
2246 gfc_symbol_init_2 (void)
2247 {
2248
2249   gfc_current_ns = gfc_get_namespace (NULL);
2250 }
2251
2252
2253 void
2254 gfc_symbol_done_2 (void)
2255 {
2256
2257   gfc_free_namespace (gfc_current_ns);
2258   gfc_current_ns = NULL;
2259 }
2260
2261
2262 /* Clear mark bits from symbol nodes associated with a symtree node.  */
2263
2264 static void
2265 clear_sym_mark (gfc_symtree * st)
2266 {
2267
2268   st->n.sym->mark = 0;
2269 }
2270
2271
2272 /* Recursively traverse the symtree nodes.  */
2273
2274 void
2275 gfc_traverse_symtree (gfc_symtree * st, void (*func) (gfc_symtree *))
2276 {
2277   if (st != NULL)
2278     {
2279       (*func) (st);
2280
2281       gfc_traverse_symtree (st->left, func);
2282       gfc_traverse_symtree (st->right, func);
2283     }
2284 }
2285
2286
2287 /* Recursive namespace traversal function.  */
2288
2289 static void
2290 traverse_ns (gfc_symtree * st, void (*func) (gfc_symbol *))
2291 {
2292
2293   if (st == NULL)
2294     return;
2295
2296   if (st->n.sym->mark == 0)
2297     (*func) (st->n.sym);
2298   st->n.sym->mark = 1;
2299
2300   traverse_ns (st->left, func);
2301   traverse_ns (st->right, func);
2302 }
2303
2304
2305 /* Call a given function for all symbols in the namespace.  We take
2306    care that each gfc_symbol node is called exactly once.  */
2307
2308 void
2309 gfc_traverse_ns (gfc_namespace * ns, void (*func) (gfc_symbol *))
2310 {
2311
2312   gfc_traverse_symtree (ns->sym_root, clear_sym_mark);
2313
2314   traverse_ns (ns->sym_root, func);
2315 }
2316
2317
2318 /* Given a symbol, mark it as SAVEd if it is allowed.  */
2319
2320 static void
2321 save_symbol (gfc_symbol * sym)
2322 {
2323
2324   if (sym->attr.use_assoc)
2325     return;
2326
2327   if (sym->attr.in_common
2328       || sym->attr.dummy
2329       || sym->attr.flavor != FL_VARIABLE)
2330     return;
2331
2332   gfc_add_save (&sym->attr, &sym->declared_at);
2333 }
2334
2335
2336 /* Mark those symbols which can be SAVEd as such.  */
2337
2338 void
2339 gfc_save_all (gfc_namespace * ns)
2340 {
2341
2342   gfc_traverse_ns (ns, save_symbol);
2343 }
2344
2345
2346 #ifdef GFC_DEBUG
2347 /* Make sure that no changes to symbols are pending.  */
2348
2349 void
2350 gfc_symbol_state(void) {
2351
2352   if (changed_syms != NULL)
2353     gfc_internal_error("Symbol changes still pending!");
2354 }
2355 #endif
2356
2357
2358 /************** Global symbol handling ************/
2359
2360
2361 /* Search a tree for the global symbol.  */
2362
2363 gfc_gsymbol *
2364 gfc_find_gsymbol (gfc_gsymbol *symbol, char *name)
2365 {
2366   gfc_gsymbol *s;
2367
2368   if (symbol == NULL)
2369     return NULL;
2370   if (strcmp (symbol->name, name) == 0)
2371     return symbol;
2372
2373   s = gfc_find_gsymbol (symbol->left, name);
2374   if (s != NULL)
2375     return s;
2376
2377   s = gfc_find_gsymbol (symbol->right, name);
2378   if (s != NULL)
2379     return s;
2380
2381   return NULL;
2382 }
2383
2384
2385 /* Compare two global symbols. Used for managing the BB tree.  */
2386
2387 static int
2388 gsym_compare (void * _s1, void * _s2)
2389 {
2390   gfc_gsymbol *s1, *s2;
2391
2392   s1 = (gfc_gsymbol *)_s1;
2393   s2 = (gfc_gsymbol *)_s2;
2394   return strcmp(s1->name, s2->name);
2395 }
2396
2397
2398 /* Get a global symbol, creating it if it doesn't exist.  */
2399
2400 gfc_gsymbol *
2401 gfc_get_gsymbol (char *name)
2402 {
2403   gfc_gsymbol *s;
2404
2405   s = gfc_find_gsymbol (gfc_gsym_root, name);
2406   if (s != NULL)
2407     return s;
2408
2409   s = gfc_getmem (sizeof (gfc_gsymbol));
2410   s->type = GSYM_UNKNOWN;
2411   strcpy (s->name, name);
2412
2413   gfc_insert_bbt (&gfc_gsym_root, s, gsym_compare);
2414
2415   return s;
2416 }