* arm.c (FL_WBUF): Define.
[official-gcc.git] / gcc / fortran / symbol.c
blob26e3f003442b0961d2b877e496fa695d1a9dc82d
1 /* Maintain binary trees of symbols.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
3 Inc.
4 Contributed by Andy Vaught
6 This file is part of GCC.
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.
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.
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. */
24 #include "config.h"
25 #include "system.h"
26 #include "gfortran.h"
27 #include "parse.h"
29 /* Strings for all symbol attributes. We use these for dumping the
30 parse tree, in error messages, and also when reading and writing
31 modules. */
33 const mstring flavors[] =
35 minit ("UNKNOWN-FL", FL_UNKNOWN), minit ("PROGRAM", FL_PROGRAM),
36 minit ("BLOCK-DATA", FL_BLOCK_DATA), minit ("MODULE", FL_MODULE),
37 minit ("VARIABLE", FL_VARIABLE), minit ("PARAMETER", FL_PARAMETER),
38 minit ("LABEL", FL_LABEL), minit ("PROCEDURE", FL_PROCEDURE),
39 minit ("DERIVED", FL_DERIVED), minit ("NAMELIST", FL_NAMELIST),
40 minit (NULL, -1)
43 const mstring procedures[] =
45 minit ("UNKNOWN-PROC", PROC_UNKNOWN),
46 minit ("MODULE-PROC", PROC_MODULE),
47 minit ("INTERNAL-PROC", PROC_INTERNAL),
48 minit ("DUMMY-PROC", PROC_DUMMY),
49 minit ("INTRINSIC-PROC", PROC_INTRINSIC),
50 minit ("EXTERNAL-PROC", PROC_EXTERNAL),
51 minit ("STATEMENT-PROC", PROC_ST_FUNCTION),
52 minit (NULL, -1)
55 const mstring intents[] =
57 minit ("UNKNOWN-INTENT", INTENT_UNKNOWN),
58 minit ("IN", INTENT_IN),
59 minit ("OUT", INTENT_OUT),
60 minit ("INOUT", INTENT_INOUT),
61 minit (NULL, -1)
64 const mstring access_types[] =
66 minit ("UNKNOWN-ACCESS", ACCESS_UNKNOWN),
67 minit ("PUBLIC", ACCESS_PUBLIC),
68 minit ("PRIVATE", ACCESS_PRIVATE),
69 minit (NULL, -1)
72 const mstring ifsrc_types[] =
74 minit ("UNKNOWN", IFSRC_UNKNOWN),
75 minit ("DECL", IFSRC_DECL),
76 minit ("BODY", IFSRC_IFBODY),
77 minit ("USAGE", IFSRC_USAGE)
81 /* This is to make sure the backend generates setup code in the correct
82 order. */
84 static int next_dummy_order = 1;
87 gfc_namespace *gfc_current_ns;
89 gfc_gsymbol *gfc_gsym_root = NULL;
91 static gfc_symbol *changed_syms = NULL;
94 /*********** IMPLICIT NONE and IMPLICIT statement handlers ***********/
96 /* The following static variable indicates whether a particular element has
97 been explicitly set or not. */
99 static int new_flag[GFC_LETTERS];
102 /* Handle a correctly parsed IMPLICIT NONE. */
104 void
105 gfc_set_implicit_none (void)
107 int i;
109 for (i = 0; i < GFC_LETTERS; i++)
111 gfc_clear_ts (&gfc_current_ns->default_type[i]);
112 gfc_current_ns->set_flag[i] = 1;
117 /* Reset the implicit range flags. */
119 void
120 gfc_clear_new_implicit (void)
122 int i;
124 for (i = 0; i < GFC_LETTERS; i++)
125 new_flag[i] = 0;
129 /* Prepare for a new implicit range. Sets flags in new_flag[]. */
132 gfc_add_new_implicit_range (int c1, int c2)
134 int i;
136 c1 -= 'a';
137 c2 -= 'a';
139 for (i = c1; i <= c2; i++)
141 if (new_flag[i])
143 gfc_error ("Letter '%c' already set in IMPLICIT statement at %C",
144 i + 'A');
145 return FAILURE;
148 new_flag[i] = 1;
151 return SUCCESS;
155 /* Add a matched implicit range for gfc_set_implicit(). Check if merging
156 the new implicit types back into the existing types will work. */
159 gfc_merge_new_implicit (gfc_typespec * ts)
161 int i;
163 for (i = 0; i < GFC_LETTERS; i++)
165 if (new_flag[i])
168 if (gfc_current_ns->set_flag[i])
170 gfc_error ("Letter %c already has an IMPLICIT type at %C",
171 i + 'A');
172 return FAILURE;
174 gfc_current_ns->default_type[i] = *ts;
175 gfc_current_ns->set_flag[i] = 1;
178 return SUCCESS;
182 /* Given a symbol, return a pointer to the typespec for its default type. */
184 gfc_typespec *
185 gfc_get_default_type (gfc_symbol * sym, gfc_namespace * ns)
187 char letter;
189 letter = sym->name[0];
190 if (letter < 'a' || letter > 'z')
191 gfc_internal_error ("gfc_get_default_type(): Bad symbol");
193 if (ns == NULL)
194 ns = gfc_current_ns;
196 return &ns->default_type[letter - 'a'];
200 /* Given a pointer to a symbol, set its type according to the first
201 letter of its name. Fails if the letter in question has no default
202 type. */
205 gfc_set_default_type (gfc_symbol * sym, int error_flag, gfc_namespace * ns)
207 gfc_typespec *ts;
209 if (sym->ts.type != BT_UNKNOWN)
210 gfc_internal_error ("gfc_set_default_type(): symbol already has a type");
212 ts = gfc_get_default_type (sym, ns);
214 if (ts->type == BT_UNKNOWN)
216 if (error_flag && !sym->attr.untyped)
218 gfc_error ("Symbol '%s' at %L has no IMPLICIT type",
219 sym->name, &sym->declared_at);
220 sym->attr.untyped = 1; /* Ensure we only give an error once. */
223 return FAILURE;
226 sym->ts = *ts;
227 sym->attr.implicit_type = 1;
229 return SUCCESS;
233 /******************** Symbol attribute stuff *********************/
235 /* This is a generic conflict-checker. We do this to avoid having a
236 single conflict in two places. */
238 #define conf(a, b) if (attr->a && attr->b) { a1 = a; a2 = b; goto conflict; }
239 #define conf2(a) if (attr->a) { a2 = a; goto conflict; }
241 static try
242 check_conflict (symbol_attribute * attr, const char * name, locus * where)
244 static const char *dummy = "DUMMY", *save = "SAVE", *pointer = "POINTER",
245 *target = "TARGET", *external = "EXTERNAL", *intent = "INTENT",
246 *intrinsic = "INTRINSIC", *allocatable = "ALLOCATABLE",
247 *elemental = "ELEMENTAL", *private = "PRIVATE", *recursive = "RECURSIVE",
248 *in_common = "COMMON", *result = "RESULT", *in_namelist = "NAMELIST",
249 *public = "PUBLIC", *optional = "OPTIONAL", *entry = "ENTRY",
250 *function = "FUNCTION", *subroutine = "SUBROUTINE",
251 *dimension = "DIMENSION";
253 const char *a1, *a2;
255 if (where == NULL)
256 where = &gfc_current_locus;
258 if (attr->pointer && attr->intent != INTENT_UNKNOWN)
260 a1 = pointer;
261 a2 = intent;
262 goto conflict;
265 /* Check for attributes not allowed in a BLOCK DATA. */
266 if (gfc_current_state () == COMP_BLOCK_DATA)
268 a1 = NULL;
270 if (attr->allocatable)
271 a1 = allocatable;
272 if (attr->external)
273 a1 = external;
274 if (attr->optional)
275 a1 = optional;
276 if (attr->access == ACCESS_PRIVATE)
277 a1 = private;
278 if (attr->access == ACCESS_PUBLIC)
279 a1 = public;
280 if (attr->intent != INTENT_UNKNOWN)
281 a1 = intent;
283 if (a1 != NULL)
285 gfc_error
286 ("%s attribute not allowed in BLOCK DATA program unit at %L", a1,
287 where);
288 return FAILURE;
292 conf (dummy, save);
293 conf (pointer, target);
294 conf (pointer, external);
295 conf (pointer, intrinsic);
296 conf (target, external);
297 conf (target, intrinsic);
298 conf (external, dimension); /* See Fortran 95's R504. */
300 conf (external, intrinsic);
301 conf (allocatable, pointer);
302 conf (allocatable, dummy); /* TODO: Allowed in Fortran 200x. */
303 conf (allocatable, function); /* TODO: Allowed in Fortran 200x. */
304 conf (allocatable, result); /* TODO: Allowed in Fortran 200x. */
305 conf (elemental, recursive);
307 conf (in_common, dummy);
308 conf (in_common, allocatable);
309 conf (in_common, result);
310 conf (dummy, result);
312 conf (in_namelist, pointer);
313 conf (in_namelist, allocatable);
315 conf (entry, result);
317 conf (function, subroutine);
319 a1 = gfc_code2string (flavors, attr->flavor);
321 if (attr->in_namelist
322 && attr->flavor != FL_VARIABLE
323 && attr->flavor != FL_UNKNOWN)
326 a2 = in_namelist;
327 goto conflict;
330 switch (attr->flavor)
332 case FL_PROGRAM:
333 case FL_BLOCK_DATA:
334 case FL_MODULE:
335 case FL_LABEL:
336 conf2 (dummy);
337 conf2 (save);
338 conf2 (pointer);
339 conf2 (target);
340 conf2 (external);
341 conf2 (intrinsic);
342 conf2 (allocatable);
343 conf2 (result);
344 conf2 (in_namelist);
345 conf2 (optional);
346 conf2 (function);
347 conf2 (subroutine);
348 break;
350 case FL_VARIABLE:
351 case FL_NAMELIST:
352 break;
354 case FL_PROCEDURE:
355 conf2 (intent);
357 if (attr->subroutine)
359 conf2(save);
360 conf2(pointer);
361 conf2(target);
362 conf2(allocatable);
363 conf2(result);
364 conf2(in_namelist);
365 conf2(function);
368 switch (attr->proc)
370 case PROC_ST_FUNCTION:
371 conf2 (in_common);
372 conf2 (dummy);
373 break;
375 case PROC_MODULE:
376 conf2 (dummy);
377 break;
379 case PROC_DUMMY:
380 conf2 (result);
381 conf2 (in_common);
382 conf2 (save);
383 break;
385 default:
386 break;
389 break;
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);
404 if (attr->intent != INTENT_UNKNOWN)
406 a2 = intent;
407 goto conflict;
409 break;
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;
425 default:
426 break;
429 return SUCCESS;
431 conflict:
432 if (name == NULL)
433 gfc_error ("%s attribute conflicts with %s attribute at %L",
434 a1, a2, where);
435 else
436 gfc_error ("%s attribute conflicts with %s attribute in '%s' at %L",
437 a1, a2, name, where);
439 return FAILURE;
442 #undef conf
443 #undef conf2
446 /* Mark a symbol as referenced. */
448 void
449 gfc_set_sym_referenced (gfc_symbol * sym)
451 if (sym->attr.referenced)
452 return;
454 sym->attr.referenced = 1;
456 /* Remember which order dummy variables are accessed in. */
457 if (sym->attr.dummy)
458 sym->dummy_order = next_dummy_order++;
462 /* Common subroutine called by attribute changing subroutines in order
463 to prevent them from changing a symbol that has been
464 use-associated. Returns zero if it is OK to change the symbol,
465 nonzero if not. */
467 static int
468 check_used (symbol_attribute * attr, const char * name, locus * where)
471 if (attr->use_assoc == 0)
472 return 0;
474 if (where == NULL)
475 where = &gfc_current_locus;
477 if (name == NULL)
478 gfc_error ("Cannot change attributes of USE-associated symbol at %L",
479 where);
480 else
481 gfc_error ("Cannot change attributes of USE-associated symbol %s at %L",
482 name, where);
484 return 1;
488 /* Used to prevent changing the attributes of a symbol after it has been
489 used. This check is only done for dummy variables as only these can be
490 used in specification expressions. Applying this to all symbols causes
491 an error when we reach the body of a contained function. */
493 static int
494 check_done (symbol_attribute * attr, locus * where)
497 if (!(attr->dummy && attr->referenced))
498 return 0;
500 if (where == NULL)
501 where = &gfc_current_locus;
503 gfc_error ("Cannot change attributes of symbol at %L"
504 " after it has been used", where);
506 return 1;
510 /* Generate an error because of a duplicate attribute. */
512 static void
513 duplicate_attr (const char *attr, locus * where)
516 if (where == NULL)
517 where = &gfc_current_locus;
519 gfc_error ("Duplicate %s attribute specified at %L", attr, where);
524 gfc_add_allocatable (symbol_attribute * attr, locus * where)
527 if (check_used (attr, NULL, where) || check_done (attr, where))
528 return FAILURE;
530 if (attr->allocatable)
532 duplicate_attr ("ALLOCATABLE", where);
533 return FAILURE;
536 attr->allocatable = 1;
537 return check_conflict (attr, NULL, where);
542 gfc_add_dimension (symbol_attribute * attr, const char *name, locus * where)
545 if (check_used (attr, name, where) || check_done (attr, where))
546 return FAILURE;
548 if (attr->dimension)
550 duplicate_attr ("DIMENSION", where);
551 return FAILURE;
554 attr->dimension = 1;
555 return check_conflict (attr, name, where);
560 gfc_add_external (symbol_attribute * attr, locus * where)
563 if (check_used (attr, NULL, where) || check_done (attr, where))
564 return FAILURE;
566 if (attr->external)
568 duplicate_attr ("EXTERNAL", where);
569 return FAILURE;
572 attr->external = 1;
574 return check_conflict (attr, NULL, where);
579 gfc_add_intrinsic (symbol_attribute * attr, locus * where)
582 if (check_used (attr, NULL, where) || check_done (attr, where))
583 return FAILURE;
585 if (attr->intrinsic)
587 duplicate_attr ("INTRINSIC", where);
588 return FAILURE;
591 attr->intrinsic = 1;
593 return check_conflict (attr, NULL, where);
598 gfc_add_optional (symbol_attribute * attr, locus * where)
601 if (check_used (attr, NULL, where) || check_done (attr, where))
602 return FAILURE;
604 if (attr->optional)
606 duplicate_attr ("OPTIONAL", where);
607 return FAILURE;
610 attr->optional = 1;
611 return check_conflict (attr, NULL, where);
616 gfc_add_pointer (symbol_attribute * attr, locus * where)
619 if (check_used (attr, NULL, where) || check_done (attr, where))
620 return FAILURE;
622 attr->pointer = 1;
623 return check_conflict (attr, NULL, where);
628 gfc_add_result (symbol_attribute * attr, const char *name, locus * where)
631 if (check_used (attr, name, where) || check_done (attr, where))
632 return FAILURE;
634 attr->result = 1;
635 return check_conflict (attr, name, where);
640 gfc_add_save (symbol_attribute * attr, const char *name, locus * where)
643 if (check_used (attr, name, where))
644 return FAILURE;
646 if (gfc_pure (NULL))
648 gfc_error
649 ("SAVE attribute at %L cannot be specified in a PURE procedure",
650 where);
651 return FAILURE;
654 if (attr->save)
656 duplicate_attr ("SAVE", where);
657 return FAILURE;
660 attr->save = 1;
661 return check_conflict (attr, name, where);
666 gfc_add_target (symbol_attribute * attr, locus * where)
669 if (check_used (attr, NULL, where) || check_done (attr, where))
670 return FAILURE;
672 if (attr->target)
674 duplicate_attr ("TARGET", where);
675 return FAILURE;
678 attr->target = 1;
679 return check_conflict (attr, NULL, where);
684 gfc_add_dummy (symbol_attribute * attr, const char *name, locus * where)
687 if (check_used (attr, name, where))
688 return FAILURE;
690 /* Duplicate dummy arguments are allowed due to ENTRY statements. */
691 attr->dummy = 1;
692 return check_conflict (attr, name, where);
697 gfc_add_in_common (symbol_attribute * attr, const char *name, locus * where)
700 if (check_used (attr, name, where) || check_done (attr, where))
701 return FAILURE;
703 /* Duplicate attribute already checked for. */
704 attr->in_common = 1;
705 if (check_conflict (attr, name, where) == FAILURE)
706 return FAILURE;
708 if (attr->flavor == FL_VARIABLE)
709 return SUCCESS;
711 return gfc_add_flavor (attr, FL_VARIABLE, name, where);
716 gfc_add_data (symbol_attribute *attr, const char *name, locus *where)
719 if (check_used (attr, name, where))
720 return FAILURE;
722 attr->data = 1;
723 return check_conflict (attr, name, where);
728 gfc_add_in_namelist (symbol_attribute * attr, const char *name,
729 locus * where)
732 attr->in_namelist = 1;
733 return check_conflict (attr, name, where);
738 gfc_add_sequence (symbol_attribute * attr, const char *name, locus * where)
741 if (check_used (attr, name, where))
742 return FAILURE;
744 attr->sequence = 1;
745 return check_conflict (attr, name, where);
750 gfc_add_elemental (symbol_attribute * attr, locus * where)
753 if (check_used (attr, NULL, where) || check_done (attr, where))
754 return FAILURE;
756 attr->elemental = 1;
757 return check_conflict (attr, NULL, where);
762 gfc_add_pure (symbol_attribute * attr, locus * where)
765 if (check_used (attr, NULL, where) || check_done (attr, where))
766 return FAILURE;
768 attr->pure = 1;
769 return check_conflict (attr, NULL, where);
774 gfc_add_recursive (symbol_attribute * attr, locus * where)
777 if (check_used (attr, NULL, where) || check_done (attr, where))
778 return FAILURE;
780 attr->recursive = 1;
781 return check_conflict (attr, NULL, where);
786 gfc_add_entry (symbol_attribute * attr, const char *name, locus * where)
789 if (check_used (attr, name, where))
790 return FAILURE;
792 if (attr->entry)
794 duplicate_attr ("ENTRY", where);
795 return FAILURE;
798 attr->entry = 1;
799 return check_conflict (attr, name, where);
804 gfc_add_function (symbol_attribute * attr, const char *name, locus * where)
807 if (attr->flavor != FL_PROCEDURE
808 && gfc_add_flavor (attr, FL_PROCEDURE, name, where) == FAILURE)
809 return FAILURE;
811 attr->function = 1;
812 return check_conflict (attr, name, where);
817 gfc_add_subroutine (symbol_attribute * attr, const char *name, locus * where)
820 if (attr->flavor != FL_PROCEDURE
821 && gfc_add_flavor (attr, FL_PROCEDURE, name, where) == FAILURE)
822 return FAILURE;
824 attr->subroutine = 1;
825 return check_conflict (attr, name, where);
830 gfc_add_generic (symbol_attribute * attr, const char *name, locus * where)
833 if (attr->flavor != FL_PROCEDURE
834 && gfc_add_flavor (attr, FL_PROCEDURE, name, where) == FAILURE)
835 return FAILURE;
837 attr->generic = 1;
838 return check_conflict (attr, name, where);
842 /* Flavors are special because some flavors are not what Fortran
843 considers attributes and can be reaffirmed multiple times. */
846 gfc_add_flavor (symbol_attribute * attr, sym_flavor f, const char *name,
847 locus * where)
850 if ((f == FL_PROGRAM || f == FL_BLOCK_DATA || f == FL_MODULE
851 || f == FL_PARAMETER || f == FL_LABEL || f == FL_DERIVED
852 || f == FL_NAMELIST) && check_used (attr, name, where))
853 return FAILURE;
855 if (attr->flavor == f && f == FL_VARIABLE)
856 return SUCCESS;
858 if (attr->flavor != FL_UNKNOWN)
860 if (where == NULL)
861 where = &gfc_current_locus;
863 gfc_error ("%s attribute conflicts with %s attribute at %L",
864 gfc_code2string (flavors, attr->flavor),
865 gfc_code2string (flavors, f), where);
867 return FAILURE;
870 attr->flavor = f;
872 return check_conflict (attr, name, where);
877 gfc_add_procedure (symbol_attribute * attr, procedure_type t,
878 const char *name, locus * where)
881 if (check_used (attr, name, where) || check_done (attr, where))
882 return FAILURE;
884 if (attr->flavor != FL_PROCEDURE
885 && gfc_add_flavor (attr, FL_PROCEDURE, name, where) == FAILURE)
886 return FAILURE;
888 if (where == NULL)
889 where = &gfc_current_locus;
891 if (attr->proc != PROC_UNKNOWN)
893 gfc_error ("%s procedure at %L is already %s %s procedure",
894 gfc_code2string (procedures, t), where,
895 gfc_article (gfc_code2string (procedures, attr->proc)),
896 gfc_code2string (procedures, attr->proc));
898 return FAILURE;
901 attr->proc = t;
903 /* Statement functions are always scalar and functions. */
904 if (t == PROC_ST_FUNCTION
905 && ((!attr->function && gfc_add_function (attr, name, where) == FAILURE)
906 || attr->dimension))
907 return FAILURE;
909 return check_conflict (attr, name, where);
914 gfc_add_intent (symbol_attribute * attr, sym_intent intent, locus * where)
917 if (check_used (attr, NULL, where))
918 return FAILURE;
920 if (attr->intent == INTENT_UNKNOWN)
922 attr->intent = intent;
923 return check_conflict (attr, NULL, where);
926 if (where == NULL)
927 where = &gfc_current_locus;
929 gfc_error ("INTENT (%s) conflicts with INTENT(%s) at %L",
930 gfc_intent_string (attr->intent),
931 gfc_intent_string (intent), where);
933 return FAILURE;
937 /* No checks for use-association in public and private statements. */
940 gfc_add_access (symbol_attribute * attr, gfc_access access,
941 const char *name, locus * where)
944 if (attr->access == ACCESS_UNKNOWN)
946 attr->access = access;
947 return check_conflict (attr, name, where);
950 if (where == NULL)
951 where = &gfc_current_locus;
952 gfc_error ("ACCESS specification at %L was already specified", where);
954 return FAILURE;
959 gfc_add_explicit_interface (gfc_symbol * sym, ifsrc source,
960 gfc_formal_arglist * formal, locus * where)
963 if (check_used (&sym->attr, sym->name, where))
964 return FAILURE;
966 if (where == NULL)
967 where = &gfc_current_locus;
969 if (sym->attr.if_source != IFSRC_UNKNOWN
970 && sym->attr.if_source != IFSRC_DECL)
972 gfc_error ("Symbol '%s' at %L already has an explicit interface",
973 sym->name, where);
974 return FAILURE;
977 sym->formal = formal;
978 sym->attr.if_source = source;
980 return SUCCESS;
984 /* Add a type to a symbol. */
987 gfc_add_type (gfc_symbol * sym, gfc_typespec * ts, locus * where)
989 sym_flavor flavor;
991 /* TODO: This is legal if it is reaffirming an implicit type.
992 if (check_done (&sym->attr, where))
993 return FAILURE;*/
995 if (where == NULL)
996 where = &gfc_current_locus;
998 if (sym->ts.type != BT_UNKNOWN)
1000 gfc_error ("Symbol '%s' at %L already has basic type of %s", sym->name,
1001 where, gfc_basic_typename (sym->ts.type));
1002 return FAILURE;
1005 flavor = sym->attr.flavor;
1007 if (flavor == FL_PROGRAM || flavor == FL_BLOCK_DATA || flavor == FL_MODULE
1008 || flavor == FL_LABEL || (flavor == FL_PROCEDURE
1009 && sym->attr.subroutine)
1010 || flavor == FL_DERIVED || flavor == FL_NAMELIST)
1012 gfc_error ("Symbol '%s' at %L cannot have a type", sym->name, where);
1013 return FAILURE;
1016 sym->ts = *ts;
1017 return SUCCESS;
1021 /* Clears all attributes. */
1023 void
1024 gfc_clear_attr (symbol_attribute * attr)
1026 memset (attr, 0, sizeof(symbol_attribute));
1030 /* Check for missing attributes in the new symbol. Currently does
1031 nothing, but it's not clear that it is unnecessary yet. */
1034 gfc_missing_attr (symbol_attribute * attr ATTRIBUTE_UNUSED,
1035 locus * where ATTRIBUTE_UNUSED)
1038 return SUCCESS;
1042 /* Copy an attribute to a symbol attribute, bit by bit. Some
1043 attributes have a lot of side-effects but cannot be present given
1044 where we are called from, so we ignore some bits. */
1047 gfc_copy_attr (symbol_attribute * dest, symbol_attribute * src, locus * where)
1050 if (src->allocatable && gfc_add_allocatable (dest, where) == FAILURE)
1051 goto fail;
1053 if (src->dimension && gfc_add_dimension (dest, NULL, where) == FAILURE)
1054 goto fail;
1055 if (src->optional && gfc_add_optional (dest, where) == FAILURE)
1056 goto fail;
1057 if (src->pointer && gfc_add_pointer (dest, where) == FAILURE)
1058 goto fail;
1059 if (src->save && gfc_add_save (dest, NULL, where) == FAILURE)
1060 goto fail;
1061 if (src->target && gfc_add_target (dest, where) == FAILURE)
1062 goto fail;
1063 if (src->dummy && gfc_add_dummy (dest, NULL, where) == FAILURE)
1064 goto fail;
1065 if (src->result && gfc_add_result (dest, NULL, where) == FAILURE)
1066 goto fail;
1067 if (src->entry)
1068 dest->entry = 1;
1070 if (src->in_namelist && gfc_add_in_namelist (dest, NULL, where) == FAILURE)
1071 goto fail;
1073 if (src->in_common && gfc_add_in_common (dest, NULL, where) == FAILURE)
1074 goto fail;
1076 if (src->generic && gfc_add_generic (dest, NULL, where) == FAILURE)
1077 goto fail;
1078 if (src->function && gfc_add_function (dest, NULL, where) == FAILURE)
1079 goto fail;
1080 if (src->subroutine && gfc_add_subroutine (dest, NULL, where) == FAILURE)
1081 goto fail;
1083 if (src->sequence && gfc_add_sequence (dest, NULL, where) == FAILURE)
1084 goto fail;
1085 if (src->elemental && gfc_add_elemental (dest, where) == FAILURE)
1086 goto fail;
1087 if (src->pure && gfc_add_pure (dest, where) == FAILURE)
1088 goto fail;
1089 if (src->recursive && gfc_add_recursive (dest, where) == FAILURE)
1090 goto fail;
1092 if (src->flavor != FL_UNKNOWN
1093 && gfc_add_flavor (dest, src->flavor, NULL, where) == FAILURE)
1094 goto fail;
1096 if (src->intent != INTENT_UNKNOWN
1097 && gfc_add_intent (dest, src->intent, where) == FAILURE)
1098 goto fail;
1100 if (src->access != ACCESS_UNKNOWN
1101 && gfc_add_access (dest, src->access, NULL, where) == FAILURE)
1102 goto fail;
1104 if (gfc_missing_attr (dest, where) == FAILURE)
1105 goto fail;
1107 /* The subroutines that set these bits also cause flavors to be set,
1108 and that has already happened in the original, so don't let it
1109 happen again. */
1110 if (src->external)
1111 dest->external = 1;
1112 if (src->intrinsic)
1113 dest->intrinsic = 1;
1115 return SUCCESS;
1117 fail:
1118 return FAILURE;
1122 /************** Component name management ************/
1124 /* Component names of a derived type form their own little namespaces
1125 that are separate from all other spaces. The space is composed of
1126 a singly linked list of gfc_component structures whose head is
1127 located in the parent symbol. */
1130 /* Add a component name to a symbol. The call fails if the name is
1131 already present. On success, the component pointer is modified to
1132 point to the additional component structure. */
1135 gfc_add_component (gfc_symbol * sym, const char *name, gfc_component ** component)
1137 gfc_component *p, *tail;
1139 tail = NULL;
1141 for (p = sym->components; p; p = p->next)
1143 if (strcmp (p->name, name) == 0)
1145 gfc_error ("Component '%s' at %C already declared at %L",
1146 name, &p->loc);
1147 return FAILURE;
1150 tail = p;
1153 /* Allocate a new component. */
1154 p = gfc_get_component ();
1156 if (tail == NULL)
1157 sym->components = p;
1158 else
1159 tail->next = p;
1161 p->name = gfc_get_string (name);
1162 p->loc = gfc_current_locus;
1164 *component = p;
1165 return SUCCESS;
1169 /* Recursive function to switch derived types of all symbol in a
1170 namespace. */
1172 static void
1173 switch_types (gfc_symtree * st, gfc_symbol * from, gfc_symbol * to)
1175 gfc_symbol *sym;
1177 if (st == NULL)
1178 return;
1180 sym = st->n.sym;
1181 if (sym->ts.type == BT_DERIVED && sym->ts.derived == from)
1182 sym->ts.derived = to;
1184 switch_types (st->left, from, to);
1185 switch_types (st->right, from, to);
1189 /* This subroutine is called when a derived type is used in order to
1190 make the final determination about which version to use. The
1191 standard requires that a type be defined before it is 'used', but
1192 such types can appear in IMPLICIT statements before the actual
1193 definition. 'Using' in this context means declaring a variable to
1194 be that type or using the type constructor.
1196 If a type is used and the components haven't been defined, then we
1197 have to have a derived type in a parent unit. We find the node in
1198 the other namespace and point the symtree node in this namespace to
1199 that node. Further reference to this name point to the correct
1200 node. If we can't find the node in a parent namespace, then we have
1201 an error.
1203 This subroutine takes a pointer to a symbol node and returns a
1204 pointer to the translated node or NULL for an error. Usually there
1205 is no translation and we return the node we were passed. */
1207 gfc_symbol *
1208 gfc_use_derived (gfc_symbol * sym)
1210 gfc_symbol *s, *p;
1211 gfc_typespec *t;
1212 gfc_symtree *st;
1213 int i;
1215 if (sym->components != NULL)
1216 return sym; /* Already defined. */
1218 if (sym->ns->parent == NULL)
1219 goto bad;
1221 if (gfc_find_symbol (sym->name, sym->ns->parent, 1, &s))
1223 gfc_error ("Symbol '%s' at %C is ambiguous", sym->name);
1224 return NULL;
1227 if (s == NULL || s->attr.flavor != FL_DERIVED)
1228 goto bad;
1230 /* Get rid of symbol sym, translating all references to s. */
1231 for (i = 0; i < GFC_LETTERS; i++)
1233 t = &sym->ns->default_type[i];
1234 if (t->derived == sym)
1235 t->derived = s;
1238 st = gfc_find_symtree (sym->ns->sym_root, sym->name);
1239 st->n.sym = s;
1241 s->refs++;
1243 /* Unlink from list of modified symbols. */
1244 if (changed_syms == sym)
1245 changed_syms = sym->tlink;
1246 else
1247 for (p = changed_syms; p; p = p->tlink)
1248 if (p->tlink == sym)
1250 p->tlink = sym->tlink;
1251 break;
1254 switch_types (sym->ns->sym_root, sym, s);
1256 /* TODO: Also have to replace sym -> s in other lists like
1257 namelists, common lists and interface lists. */
1258 gfc_free_symbol (sym);
1260 return s;
1262 bad:
1263 gfc_error ("Derived type '%s' at %C is being used before it is defined",
1264 sym->name);
1265 return NULL;
1269 /* Given a derived type node and a component name, try to locate the
1270 component structure. Returns the NULL pointer if the component is
1271 not found or the components are private. */
1273 gfc_component *
1274 gfc_find_component (gfc_symbol * sym, const char *name)
1276 gfc_component *p;
1278 if (name == NULL)
1279 return NULL;
1281 sym = gfc_use_derived (sym);
1283 if (sym == NULL)
1284 return NULL;
1286 for (p = sym->components; p; p = p->next)
1287 if (strcmp (p->name, name) == 0)
1288 break;
1290 if (p == NULL)
1291 gfc_error ("'%s' at %C is not a member of the '%s' structure",
1292 name, sym->name);
1293 else
1295 if (sym->attr.use_assoc && sym->component_access == ACCESS_PRIVATE)
1297 gfc_error ("Component '%s' at %C is a PRIVATE component of '%s'",
1298 name, sym->name);
1299 p = NULL;
1303 return p;
1307 /* Given a symbol, free all of the component structures and everything
1308 they point to. */
1310 static void
1311 free_components (gfc_component * p)
1313 gfc_component *q;
1315 for (; p; p = q)
1317 q = p->next;
1319 gfc_free_array_spec (p->as);
1320 gfc_free_expr (p->initializer);
1322 gfc_free (p);
1327 /* Set component attributes from a standard symbol attribute
1328 structure. */
1330 void
1331 gfc_set_component_attr (gfc_component * c, symbol_attribute * attr)
1334 c->dimension = attr->dimension;
1335 c->pointer = attr->pointer;
1339 /* Get a standard symbol attribute structure given the component
1340 structure. */
1342 void
1343 gfc_get_component_attr (symbol_attribute * attr, gfc_component * c)
1346 gfc_clear_attr (attr);
1347 attr->dimension = c->dimension;
1348 attr->pointer = c->pointer;
1352 /******************** Statement label management ********************/
1354 /* Free a single gfc_st_label structure, making sure the list is not
1355 messed up. This function is called only when some parse error
1356 occurs. */
1358 void
1359 gfc_free_st_label (gfc_st_label * l)
1362 if (l == NULL)
1363 return;
1365 if (l->prev)
1366 (l->prev->next = l->next);
1368 if (l->next)
1369 (l->next->prev = l->prev);
1371 if (l->format != NULL)
1372 gfc_free_expr (l->format);
1373 gfc_free (l);
1376 /* Free a whole list of gfc_st_label structures. */
1378 static void
1379 free_st_labels (gfc_st_label * l1)
1381 gfc_st_label *l2;
1383 for (; l1; l1 = l2)
1385 l2 = l1->next;
1386 if (l1->format != NULL)
1387 gfc_free_expr (l1->format);
1388 gfc_free (l1);
1393 /* Given a label number, search for and return a pointer to the label
1394 structure, creating it if it does not exist. */
1396 gfc_st_label *
1397 gfc_get_st_label (int labelno)
1399 gfc_st_label *lp;
1401 /* First see if the label is already in this namespace. */
1402 for (lp = gfc_current_ns->st_labels; lp; lp = lp->next)
1403 if (lp->value == labelno)
1404 break;
1405 if (lp != NULL)
1406 return lp;
1408 lp = gfc_getmem (sizeof (gfc_st_label));
1410 lp->value = labelno;
1411 lp->defined = ST_LABEL_UNKNOWN;
1412 lp->referenced = ST_LABEL_UNKNOWN;
1414 lp->prev = NULL;
1415 lp->next = gfc_current_ns->st_labels;
1416 if (gfc_current_ns->st_labels)
1417 gfc_current_ns->st_labels->prev = lp;
1418 gfc_current_ns->st_labels = lp;
1420 return lp;
1424 /* Called when a statement with a statement label is about to be
1425 accepted. We add the label to the list of the current namespace,
1426 making sure it hasn't been defined previously and referenced
1427 correctly. */
1429 void
1430 gfc_define_st_label (gfc_st_label * lp, gfc_sl_type type, locus * label_locus)
1432 int labelno;
1434 labelno = lp->value;
1436 if (lp->defined != ST_LABEL_UNKNOWN)
1437 gfc_error ("Duplicate statement label %d at %L and %L", labelno,
1438 &lp->where, label_locus);
1439 else
1441 lp->where = *label_locus;
1443 switch (type)
1445 case ST_LABEL_FORMAT:
1446 if (lp->referenced == ST_LABEL_TARGET)
1447 gfc_error ("Label %d at %C already referenced as branch target",
1448 labelno);
1449 else
1450 lp->defined = ST_LABEL_FORMAT;
1452 break;
1454 case ST_LABEL_TARGET:
1455 if (lp->referenced == ST_LABEL_FORMAT)
1456 gfc_error ("Label %d at %C already referenced as a format label",
1457 labelno);
1458 else
1459 lp->defined = ST_LABEL_TARGET;
1461 break;
1463 default:
1464 lp->defined = ST_LABEL_BAD_TARGET;
1465 lp->referenced = ST_LABEL_BAD_TARGET;
1471 /* Reference a label. Given a label and its type, see if that
1472 reference is consistent with what is known about that label,
1473 updating the unknown state. Returns FAILURE if something goes
1474 wrong. */
1477 gfc_reference_st_label (gfc_st_label * lp, gfc_sl_type type)
1479 gfc_sl_type label_type;
1480 int labelno;
1481 try rc;
1483 if (lp == NULL)
1484 return SUCCESS;
1486 labelno = lp->value;
1488 if (lp->defined != ST_LABEL_UNKNOWN)
1489 label_type = lp->defined;
1490 else
1492 label_type = lp->referenced;
1493 lp->where = gfc_current_locus;
1496 if (label_type == ST_LABEL_FORMAT && type == ST_LABEL_TARGET)
1498 gfc_error ("Label %d at %C previously used as a FORMAT label", labelno);
1499 rc = FAILURE;
1500 goto done;
1503 if ((label_type == ST_LABEL_TARGET || label_type == ST_LABEL_BAD_TARGET)
1504 && type == ST_LABEL_FORMAT)
1506 gfc_error ("Label %d at %C previously used as branch target", labelno);
1507 rc = FAILURE;
1508 goto done;
1511 lp->referenced = type;
1512 rc = SUCCESS;
1514 done:
1515 return rc;
1519 /************** Symbol table management subroutines ****************/
1521 /* Basic details: Fortran 95 requires a potentially unlimited number
1522 of distinct namespaces when compiling a program unit. This case
1523 occurs during a compilation of internal subprograms because all of
1524 the internal subprograms must be read before we can start
1525 generating code for the host.
1527 Given the tricky nature of the Fortran grammar, we must be able to
1528 undo changes made to a symbol table if the current interpretation
1529 of a statement is found to be incorrect. Whenever a symbol is
1530 looked up, we make a copy of it and link to it. All of these
1531 symbols are kept in a singly linked list so that we can commit or
1532 undo the changes at a later time.
1534 A symtree may point to a symbol node outside of its namespace. In
1535 this case, that symbol has been used as a host associated variable
1536 at some previous time. */
1538 /* Allocate a new namespace structure. Copies the implicit types from
1539 PARENT if PARENT_TYPES is set. */
1541 gfc_namespace *
1542 gfc_get_namespace (gfc_namespace * parent, int parent_types)
1544 gfc_namespace *ns;
1545 gfc_typespec *ts;
1546 gfc_intrinsic_op in;
1547 int i;
1549 ns = gfc_getmem (sizeof (gfc_namespace));
1550 ns->sym_root = NULL;
1551 ns->uop_root = NULL;
1552 ns->default_access = ACCESS_UNKNOWN;
1553 ns->parent = parent;
1555 for (in = GFC_INTRINSIC_BEGIN; in != GFC_INTRINSIC_END; in++)
1556 ns->operator_access[in] = ACCESS_UNKNOWN;
1558 /* Initialize default implicit types. */
1559 for (i = 'a'; i <= 'z'; i++)
1561 ns->set_flag[i - 'a'] = 0;
1562 ts = &ns->default_type[i - 'a'];
1564 if (parent_types && ns->parent != NULL)
1566 /* Copy parent settings */
1567 *ts = ns->parent->default_type[i - 'a'];
1568 continue;
1571 if (gfc_option.flag_implicit_none != 0)
1573 gfc_clear_ts (ts);
1574 continue;
1577 if ('i' <= i && i <= 'n')
1579 ts->type = BT_INTEGER;
1580 ts->kind = gfc_default_integer_kind;
1582 else
1584 ts->type = BT_REAL;
1585 ts->kind = gfc_default_real_kind;
1589 ns->refs = 1;
1591 return ns;
1595 /* Comparison function for symtree nodes. */
1597 static int
1598 compare_symtree (void * _st1, void * _st2)
1600 gfc_symtree *st1, *st2;
1602 st1 = (gfc_symtree *) _st1;
1603 st2 = (gfc_symtree *) _st2;
1605 return strcmp (st1->name, st2->name);
1609 /* Allocate a new symtree node and associate it with the new symbol. */
1611 gfc_symtree *
1612 gfc_new_symtree (gfc_symtree ** root, const char *name)
1614 gfc_symtree *st;
1616 st = gfc_getmem (sizeof (gfc_symtree));
1617 st->name = gfc_get_string (name);
1619 gfc_insert_bbt (root, st, compare_symtree);
1620 return st;
1624 /* Delete a symbol from the tree. Does not free the symbol itself! */
1626 static void
1627 delete_symtree (gfc_symtree ** root, const char *name)
1629 gfc_symtree st, *st0;
1631 st0 = gfc_find_symtree (*root, name);
1633 st.name = gfc_get_string (name);
1634 gfc_delete_bbt (root, &st, compare_symtree);
1636 gfc_free (st0);
1640 /* Given a root symtree node and a name, try to find the symbol within
1641 the namespace. Returns NULL if the symbol is not found. */
1643 gfc_symtree *
1644 gfc_find_symtree (gfc_symtree * st, const char *name)
1646 int c;
1648 while (st != NULL)
1650 c = strcmp (name, st->name);
1651 if (c == 0)
1652 return st;
1654 st = (c < 0) ? st->left : st->right;
1657 return NULL;
1661 /* Given a name find a user operator node, creating it if it doesn't
1662 exist. These are much simpler than symbols because they can't be
1663 ambiguous with one another. */
1665 gfc_user_op *
1666 gfc_get_uop (const char *name)
1668 gfc_user_op *uop;
1669 gfc_symtree *st;
1671 st = gfc_find_symtree (gfc_current_ns->uop_root, name);
1672 if (st != NULL)
1673 return st->n.uop;
1675 st = gfc_new_symtree (&gfc_current_ns->uop_root, name);
1677 uop = st->n.uop = gfc_getmem (sizeof (gfc_user_op));
1678 uop->name = gfc_get_string (name);
1679 uop->access = ACCESS_UNKNOWN;
1680 uop->ns = gfc_current_ns;
1682 return uop;
1686 /* Given a name find the user operator node. Returns NULL if it does
1687 not exist. */
1689 gfc_user_op *
1690 gfc_find_uop (const char *name, gfc_namespace * ns)
1692 gfc_symtree *st;
1694 if (ns == NULL)
1695 ns = gfc_current_ns;
1697 st = gfc_find_symtree (ns->uop_root, name);
1698 return (st == NULL) ? NULL : st->n.uop;
1702 /* Remove a gfc_symbol structure and everything it points to. */
1704 void
1705 gfc_free_symbol (gfc_symbol * sym)
1708 if (sym == NULL)
1709 return;
1711 gfc_free_array_spec (sym->as);
1713 free_components (sym->components);
1715 gfc_free_expr (sym->value);
1717 gfc_free_namelist (sym->namelist);
1719 gfc_free_namespace (sym->formal_ns);
1721 gfc_free_interface (sym->generic);
1723 gfc_free_formal_arglist (sym->formal);
1725 gfc_free (sym);
1729 /* Allocate and initialize a new symbol node. */
1731 gfc_symbol *
1732 gfc_new_symbol (const char *name, gfc_namespace * ns)
1734 gfc_symbol *p;
1736 p = gfc_getmem (sizeof (gfc_symbol));
1738 gfc_clear_ts (&p->ts);
1739 gfc_clear_attr (&p->attr);
1740 p->ns = ns;
1742 p->declared_at = gfc_current_locus;
1744 if (strlen (name) > GFC_MAX_SYMBOL_LEN)
1745 gfc_internal_error ("new_symbol(): Symbol name too long");
1747 p->name = gfc_get_string (name);
1748 return p;
1752 /* Generate an error if a symbol is ambiguous. */
1754 static void
1755 ambiguous_symbol (const char *name, gfc_symtree * st)
1758 if (st->n.sym->module)
1759 gfc_error ("Name '%s' at %C is an ambiguous reference to '%s' "
1760 "from module '%s'", name, st->n.sym->name, st->n.sym->module);
1761 else
1762 gfc_error ("Name '%s' at %C is an ambiguous reference to '%s' "
1763 "from current program unit", name, st->n.sym->name);
1767 /* Search for a symtree starting in the current namespace, resorting to
1768 any parent namespaces if requested by a nonzero parent_flag.
1769 Returns nonzero if the name is ambiguous. */
1772 gfc_find_sym_tree (const char *name, gfc_namespace * ns, int parent_flag,
1773 gfc_symtree ** result)
1775 gfc_symtree *st;
1777 if (ns == NULL)
1778 ns = gfc_current_ns;
1782 st = gfc_find_symtree (ns->sym_root, name);
1783 if (st != NULL)
1785 *result = st;
1786 if (st->ambiguous)
1788 ambiguous_symbol (name, st);
1789 return 1;
1792 return 0;
1795 if (!parent_flag)
1796 break;
1798 ns = ns->parent;
1800 while (ns != NULL);
1802 *result = NULL;
1803 return 0;
1807 /* Same, but returns the symbol instead. */
1810 gfc_find_symbol (const char *name, gfc_namespace * ns, int parent_flag,
1811 gfc_symbol ** result)
1813 gfc_symtree *st;
1814 int i;
1816 i = gfc_find_sym_tree (name, ns, parent_flag, &st);
1818 if (st == NULL)
1819 *result = NULL;
1820 else
1821 *result = st->n.sym;
1823 return i;
1827 /* Save symbol with the information necessary to back it out. */
1829 static void
1830 save_symbol_data (gfc_symbol * sym)
1833 if (sym->new || sym->old_symbol != NULL)
1834 return;
1836 sym->old_symbol = gfc_getmem (sizeof (gfc_symbol));
1837 *(sym->old_symbol) = *sym;
1839 sym->tlink = changed_syms;
1840 changed_syms = sym;
1844 /* Given a name, find a symbol, or create it if it does not exist yet
1845 in the current namespace. If the symbol is found we make sure that
1846 it's OK.
1848 The integer return code indicates
1849 0 All OK
1850 1 The symbol name was ambiguous
1851 2 The name meant to be established was already host associated.
1853 So if the return value is nonzero, then an error was issued. */
1856 gfc_get_sym_tree (const char *name, gfc_namespace * ns, gfc_symtree ** result)
1858 gfc_symtree *st;
1859 gfc_symbol *p;
1861 /* This doesn't usually happen during resolution. */
1862 if (ns == NULL)
1863 ns = gfc_current_ns;
1865 /* Try to find the symbol in ns. */
1866 st = gfc_find_symtree (ns->sym_root, name);
1868 if (st == NULL)
1870 /* If not there, create a new symbol. */
1871 p = gfc_new_symbol (name, ns);
1873 /* Add to the list of tentative symbols. */
1874 p->old_symbol = NULL;
1875 p->tlink = changed_syms;
1876 p->mark = 1;
1877 p->new = 1;
1878 changed_syms = p;
1880 st = gfc_new_symtree (&ns->sym_root, name);
1881 st->n.sym = p;
1882 p->refs++;
1885 else
1887 /* Make sure the existing symbol is OK. */
1888 if (st->ambiguous)
1890 ambiguous_symbol (name, st);
1891 return 1;
1894 p = st->n.sym;
1896 if (p->ns != ns && (!p->attr.function || ns->proc_name != p))
1898 /* Symbol is from another namespace. */
1899 gfc_error ("Symbol '%s' at %C has already been host associated",
1900 name);
1901 return 2;
1904 p->mark = 1;
1906 /* Copy in case this symbol is changed. */
1907 save_symbol_data (p);
1910 *result = st;
1911 return 0;
1916 gfc_get_symbol (const char *name, gfc_namespace * ns, gfc_symbol ** result)
1918 gfc_symtree *st;
1919 int i;
1922 i = gfc_get_sym_tree (name, ns, &st);
1923 if (i != 0)
1924 return i;
1926 if (st)
1927 *result = st->n.sym;
1928 else
1929 *result = NULL;
1930 return i;
1934 /* Subroutine that searches for a symbol, creating it if it doesn't
1935 exist, but tries to host-associate the symbol if possible. */
1938 gfc_get_ha_sym_tree (const char *name, gfc_symtree ** result)
1940 gfc_symtree *st;
1941 int i;
1943 i = gfc_find_sym_tree (name, gfc_current_ns, 0, &st);
1944 if (st != NULL)
1946 save_symbol_data (st->n.sym);
1948 *result = st;
1949 return i;
1952 if (gfc_current_ns->parent != NULL)
1954 i = gfc_find_sym_tree (name, gfc_current_ns->parent, 1, &st);
1955 if (i)
1956 return i;
1958 if (st != NULL)
1960 *result = st;
1961 return 0;
1965 return gfc_get_sym_tree (name, gfc_current_ns, result);
1970 gfc_get_ha_symbol (const char *name, gfc_symbol ** result)
1972 int i;
1973 gfc_symtree *st;
1975 i = gfc_get_ha_sym_tree (name, &st);
1977 if (st)
1978 *result = st->n.sym;
1979 else
1980 *result = NULL;
1982 return i;
1985 /* Return true if both symbols could refer to the same data object. Does
1986 not take account of aliasing due to equivalence statements. */
1989 gfc_symbols_could_alias (gfc_symbol * lsym, gfc_symbol * rsym)
1991 /* Aliasing isn't possible if the symbols have different base types. */
1992 if (gfc_compare_types (&lsym->ts, &rsym->ts) == 0)
1993 return 0;
1995 /* Pointers can point to other pointers, target objects and allocatable
1996 objects. Two allocatable objects cannot share the same storage. */
1997 if (lsym->attr.pointer
1998 && (rsym->attr.pointer || rsym->attr.allocatable || rsym->attr.target))
1999 return 1;
2000 if (lsym->attr.target && rsym->attr.pointer)
2001 return 1;
2002 if (lsym->attr.allocatable && rsym->attr.pointer)
2003 return 1;
2005 return 0;
2009 /* Undoes all the changes made to symbols in the current statement.
2010 This subroutine is made simpler due to the fact that attributes are
2011 never removed once added. */
2013 void
2014 gfc_undo_symbols (void)
2016 gfc_symbol *p, *q, *old;
2018 for (p = changed_syms; p; p = q)
2020 q = p->tlink;
2022 if (p->new)
2024 /* Symbol was new. */
2025 delete_symtree (&p->ns->sym_root, p->name);
2027 p->refs--;
2028 if (p->refs < 0)
2029 gfc_internal_error ("gfc_undo_symbols(): Negative refs");
2030 if (p->refs == 0)
2031 gfc_free_symbol (p);
2032 continue;
2035 /* Restore previous state of symbol. Just copy simple stuff. */
2036 p->mark = 0;
2037 old = p->old_symbol;
2039 p->ts.type = old->ts.type;
2040 p->ts.kind = old->ts.kind;
2042 p->attr = old->attr;
2044 if (p->value != old->value)
2046 gfc_free_expr (old->value);
2047 p->value = NULL;
2050 if (p->as != old->as)
2052 if (p->as)
2053 gfc_free_array_spec (p->as);
2054 p->as = old->as;
2057 p->generic = old->generic;
2058 p->component_access = old->component_access;
2060 if (p->namelist != NULL && old->namelist == NULL)
2062 gfc_free_namelist (p->namelist);
2063 p->namelist = NULL;
2065 else
2068 if (p->namelist_tail != old->namelist_tail)
2070 gfc_free_namelist (old->namelist_tail);
2071 old->namelist_tail->next = NULL;
2075 p->namelist_tail = old->namelist_tail;
2077 if (p->formal != old->formal)
2079 gfc_free_formal_arglist (p->formal);
2080 p->formal = old->formal;
2083 gfc_free (p->old_symbol);
2084 p->old_symbol = NULL;
2085 p->tlink = NULL;
2088 changed_syms = NULL;
2092 /* Makes the changes made in the current statement permanent-- gets
2093 rid of undo information. */
2095 void
2096 gfc_commit_symbols (void)
2098 gfc_symbol *p, *q;
2100 for (p = changed_syms; p; p = q)
2102 q = p->tlink;
2103 p->tlink = NULL;
2104 p->mark = 0;
2105 p->new = 0;
2107 if (p->old_symbol != NULL)
2109 gfc_free (p->old_symbol);
2110 p->old_symbol = NULL;
2114 changed_syms = NULL;
2118 /* Recursive function that deletes an entire tree and all the common
2119 head structures it points to. */
2121 static void
2122 free_common_tree (gfc_symtree * common_tree)
2124 if (common_tree == NULL)
2125 return;
2127 free_common_tree (common_tree->left);
2128 free_common_tree (common_tree->right);
2130 gfc_free (common_tree);
2134 /* Recursive function that deletes an entire tree and all the user
2135 operator nodes that it contains. */
2137 static void
2138 free_uop_tree (gfc_symtree * uop_tree)
2141 if (uop_tree == NULL)
2142 return;
2144 free_uop_tree (uop_tree->left);
2145 free_uop_tree (uop_tree->right);
2147 gfc_free_interface (uop_tree->n.uop->operator);
2149 gfc_free (uop_tree->n.uop);
2150 gfc_free (uop_tree);
2154 /* Recursive function that deletes an entire tree and all the symbols
2155 that it contains. */
2157 static void
2158 free_sym_tree (gfc_symtree * sym_tree)
2160 gfc_namespace *ns;
2161 gfc_symbol *sym;
2163 if (sym_tree == NULL)
2164 return;
2166 free_sym_tree (sym_tree->left);
2167 free_sym_tree (sym_tree->right);
2169 sym = sym_tree->n.sym;
2171 sym->refs--;
2172 if (sym->refs < 0)
2173 gfc_internal_error ("free_sym_tree(): Negative refs");
2175 if (sym->formal_ns != NULL && sym->refs == 1)
2177 /* As formal_ns contains a reference to sym, delete formal_ns just
2178 before the deletion of sym. */
2179 ns = sym->formal_ns;
2180 sym->formal_ns = NULL;
2181 gfc_free_namespace (ns);
2183 else if (sym->refs == 0)
2185 /* Go ahead and delete the symbol. */
2186 gfc_free_symbol (sym);
2189 gfc_free (sym_tree);
2193 /* Free a namespace structure and everything below it. Interface
2194 lists associated with intrinsic operators are not freed. These are
2195 taken care of when a specific name is freed. */
2197 void
2198 gfc_free_namespace (gfc_namespace * ns)
2200 gfc_charlen *cl, *cl2;
2201 gfc_namespace *p, *q;
2202 gfc_intrinsic_op i;
2204 if (ns == NULL)
2205 return;
2207 ns->refs--;
2208 if (ns->refs > 0)
2209 return;
2210 gcc_assert (ns->refs == 0);
2212 gfc_free_statements (ns->code);
2214 free_sym_tree (ns->sym_root);
2215 free_uop_tree (ns->uop_root);
2216 free_common_tree (ns->common_root);
2218 for (cl = ns->cl_list; cl; cl = cl2)
2220 cl2 = cl->next;
2221 gfc_free_expr (cl->length);
2222 gfc_free (cl);
2225 free_st_labels (ns->st_labels);
2227 gfc_free_equiv (ns->equiv);
2229 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
2230 gfc_free_interface (ns->operator[i]);
2232 gfc_free_data (ns->data);
2233 p = ns->contained;
2234 gfc_free (ns);
2236 /* Recursively free any contained namespaces. */
2237 while (p != NULL)
2239 q = p;
2240 p = p->sibling;
2242 gfc_free_namespace (q);
2247 void
2248 gfc_symbol_init_2 (void)
2251 gfc_current_ns = gfc_get_namespace (NULL, 0);
2255 void
2256 gfc_symbol_done_2 (void)
2259 gfc_free_namespace (gfc_current_ns);
2260 gfc_current_ns = NULL;
2264 /* Clear mark bits from symbol nodes associated with a symtree node. */
2266 static void
2267 clear_sym_mark (gfc_symtree * st)
2270 st->n.sym->mark = 0;
2274 /* Recursively traverse the symtree nodes. */
2276 void
2277 gfc_traverse_symtree (gfc_symtree * st, void (*func) (gfc_symtree *))
2279 if (st != NULL)
2281 (*func) (st);
2283 gfc_traverse_symtree (st->left, func);
2284 gfc_traverse_symtree (st->right, func);
2289 /* Recursive namespace traversal function. */
2291 static void
2292 traverse_ns (gfc_symtree * st, void (*func) (gfc_symbol *))
2295 if (st == NULL)
2296 return;
2298 if (st->n.sym->mark == 0)
2299 (*func) (st->n.sym);
2300 st->n.sym->mark = 1;
2302 traverse_ns (st->left, func);
2303 traverse_ns (st->right, func);
2307 /* Call a given function for all symbols in the namespace. We take
2308 care that each gfc_symbol node is called exactly once. */
2310 void
2311 gfc_traverse_ns (gfc_namespace * ns, void (*func) (gfc_symbol *))
2314 gfc_traverse_symtree (ns->sym_root, clear_sym_mark);
2316 traverse_ns (ns->sym_root, func);
2320 /* Given a symbol, mark it as SAVEd if it is allowed. */
2322 static void
2323 save_symbol (gfc_symbol * sym)
2326 if (sym->attr.use_assoc)
2327 return;
2329 if (sym->attr.in_common
2330 || sym->attr.dummy
2331 || sym->attr.flavor != FL_VARIABLE)
2332 return;
2334 gfc_add_save (&sym->attr, sym->name, &sym->declared_at);
2338 /* Mark those symbols which can be SAVEd as such. */
2340 void
2341 gfc_save_all (gfc_namespace * ns)
2344 gfc_traverse_ns (ns, save_symbol);
2348 #ifdef GFC_DEBUG
2349 /* Make sure that no changes to symbols are pending. */
2351 void
2352 gfc_symbol_state(void) {
2354 if (changed_syms != NULL)
2355 gfc_internal_error("Symbol changes still pending!");
2357 #endif
2360 /************** Global symbol handling ************/
2363 /* Search a tree for the global symbol. */
2365 gfc_gsymbol *
2366 gfc_find_gsymbol (gfc_gsymbol *symbol, const char *name)
2368 gfc_gsymbol *s;
2370 if (symbol == NULL)
2371 return NULL;
2372 if (strcmp (symbol->name, name) == 0)
2373 return symbol;
2375 s = gfc_find_gsymbol (symbol->left, name);
2376 if (s != NULL)
2377 return s;
2379 s = gfc_find_gsymbol (symbol->right, name);
2380 if (s != NULL)
2381 return s;
2383 return NULL;
2387 /* Compare two global symbols. Used for managing the BB tree. */
2389 static int
2390 gsym_compare (void * _s1, void * _s2)
2392 gfc_gsymbol *s1, *s2;
2394 s1 = (gfc_gsymbol *)_s1;
2395 s2 = (gfc_gsymbol *)_s2;
2396 return strcmp(s1->name, s2->name);
2400 /* Get a global symbol, creating it if it doesn't exist. */
2402 gfc_gsymbol *
2403 gfc_get_gsymbol (const char *name)
2405 gfc_gsymbol *s;
2407 s = gfc_find_gsymbol (gfc_gsym_root, name);
2408 if (s != NULL)
2409 return s;
2411 s = gfc_getmem (sizeof (gfc_gsymbol));
2412 s->type = GSYM_UNKNOWN;
2413 strcpy (s->name, name);
2415 gfc_insert_bbt (&gfc_gsym_root, s, gsym_compare);
2417 return s;