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