* config/i386/i386.c (ix86_data_alignment): Calculate max_align
[official-gcc.git] / gcc / fortran / symbol.c
blobdad7b3368a81b10b7ed3833961d5362a8471bbdf
1 /* Maintain binary trees of symbols.
2 Copyright (C) 2000-2014 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "flags.h"
26 #include "gfortran.h"
27 #include "parse.h"
28 #include "match.h"
29 #include "constructor.h"
32 /* Strings for all symbol attributes. We use these for dumping the
33 parse tree, in error messages, and also when reading and writing
34 modules. */
36 const mstring flavors[] =
38 minit ("UNKNOWN-FL", FL_UNKNOWN), minit ("PROGRAM", FL_PROGRAM),
39 minit ("BLOCK-DATA", FL_BLOCK_DATA), minit ("MODULE", FL_MODULE),
40 minit ("VARIABLE", FL_VARIABLE), minit ("PARAMETER", FL_PARAMETER),
41 minit ("LABEL", FL_LABEL), minit ("PROCEDURE", FL_PROCEDURE),
42 minit ("DERIVED", FL_DERIVED), minit ("NAMELIST", FL_NAMELIST),
43 minit (NULL, -1)
46 const mstring procedures[] =
48 minit ("UNKNOWN-PROC", PROC_UNKNOWN),
49 minit ("MODULE-PROC", PROC_MODULE),
50 minit ("INTERNAL-PROC", PROC_INTERNAL),
51 minit ("DUMMY-PROC", PROC_DUMMY),
52 minit ("INTRINSIC-PROC", PROC_INTRINSIC),
53 minit ("EXTERNAL-PROC", PROC_EXTERNAL),
54 minit ("STATEMENT-PROC", PROC_ST_FUNCTION),
55 minit (NULL, -1)
58 const mstring intents[] =
60 minit ("UNKNOWN-INTENT", INTENT_UNKNOWN),
61 minit ("IN", INTENT_IN),
62 minit ("OUT", INTENT_OUT),
63 minit ("INOUT", INTENT_INOUT),
64 minit (NULL, -1)
67 const mstring access_types[] =
69 minit ("UNKNOWN-ACCESS", ACCESS_UNKNOWN),
70 minit ("PUBLIC", ACCESS_PUBLIC),
71 minit ("PRIVATE", ACCESS_PRIVATE),
72 minit (NULL, -1)
75 const mstring ifsrc_types[] =
77 minit ("UNKNOWN", IFSRC_UNKNOWN),
78 minit ("DECL", IFSRC_DECL),
79 minit ("BODY", IFSRC_IFBODY)
82 const mstring save_status[] =
84 minit ("UNKNOWN", SAVE_NONE),
85 minit ("EXPLICIT-SAVE", SAVE_EXPLICIT),
86 minit ("IMPLICIT-SAVE", SAVE_IMPLICIT),
89 /* This is to make sure the backend generates setup code in the correct
90 order. */
92 static int next_dummy_order = 1;
95 gfc_namespace *gfc_current_ns;
96 gfc_namespace *gfc_global_ns_list;
98 gfc_gsymbol *gfc_gsym_root = NULL;
100 gfc_dt_list *gfc_derived_types;
102 static gfc_undo_change_set default_undo_chgset_var = { vNULL, vNULL, NULL };
103 static gfc_undo_change_set *latest_undo_chgset = &default_undo_chgset_var;
106 /*********** IMPLICIT NONE and IMPLICIT statement handlers ***********/
108 /* The following static variable indicates whether a particular element has
109 been explicitly set or not. */
111 static int new_flag[GFC_LETTERS];
114 /* Handle a correctly parsed IMPLICIT NONE. */
116 void
117 gfc_set_implicit_none (void)
119 int i;
121 if (gfc_current_ns->seen_implicit_none)
123 gfc_error ("Duplicate IMPLICIT NONE statement at %C");
124 return;
127 gfc_current_ns->seen_implicit_none = 1;
129 for (i = 0; i < GFC_LETTERS; i++)
131 gfc_clear_ts (&gfc_current_ns->default_type[i]);
132 gfc_current_ns->set_flag[i] = 1;
137 /* Reset the implicit range flags. */
139 void
140 gfc_clear_new_implicit (void)
142 int i;
144 for (i = 0; i < GFC_LETTERS; i++)
145 new_flag[i] = 0;
149 /* Prepare for a new implicit range. Sets flags in new_flag[]. */
151 bool
152 gfc_add_new_implicit_range (int c1, int c2)
154 int i;
156 c1 -= 'a';
157 c2 -= 'a';
159 for (i = c1; i <= c2; i++)
161 if (new_flag[i])
163 gfc_error ("Letter '%c' already set in IMPLICIT statement at %C",
164 i + 'A');
165 return false;
168 new_flag[i] = 1;
171 return true;
175 /* Add a matched implicit range for gfc_set_implicit(). Check if merging
176 the new implicit types back into the existing types will work. */
178 bool
179 gfc_merge_new_implicit (gfc_typespec *ts)
181 int i;
183 if (gfc_current_ns->seen_implicit_none)
185 gfc_error ("Cannot specify IMPLICIT at %C after IMPLICIT NONE");
186 return false;
189 for (i = 0; i < GFC_LETTERS; i++)
191 if (new_flag[i])
193 if (gfc_current_ns->set_flag[i])
195 gfc_error ("Letter %c already has an IMPLICIT type at %C",
196 i + 'A');
197 return false;
200 gfc_current_ns->default_type[i] = *ts;
201 gfc_current_ns->implicit_loc[i] = gfc_current_locus;
202 gfc_current_ns->set_flag[i] = 1;
205 return true;
209 /* Given a symbol, return a pointer to the typespec for its default type. */
211 gfc_typespec *
212 gfc_get_default_type (const char *name, gfc_namespace *ns)
214 char letter;
216 letter = name[0];
218 if (gfc_option.flag_allow_leading_underscore && letter == '_')
219 gfc_internal_error ("Option -fallow-leading-underscore is for use only by "
220 "gfortran developers, and should not be used for "
221 "implicitly typed variables");
223 if (letter < 'a' || letter > 'z')
224 gfc_internal_error ("gfc_get_default_type(): Bad symbol '%s'", name);
226 if (ns == NULL)
227 ns = gfc_current_ns;
229 return &ns->default_type[letter - 'a'];
233 /* Given a pointer to a symbol, set its type according to the first
234 letter of its name. Fails if the letter in question has no default
235 type. */
237 bool
238 gfc_set_default_type (gfc_symbol *sym, int error_flag, gfc_namespace *ns)
240 gfc_typespec *ts;
242 if (sym->ts.type != BT_UNKNOWN)
243 gfc_internal_error ("gfc_set_default_type(): symbol already has a type");
245 ts = gfc_get_default_type (sym->name, ns);
247 if (ts->type == BT_UNKNOWN)
249 if (error_flag && !sym->attr.untyped)
251 gfc_error ("Symbol '%s' at %L has no IMPLICIT type",
252 sym->name, &sym->declared_at);
253 sym->attr.untyped = 1; /* Ensure we only give an error once. */
256 return false;
259 sym->ts = *ts;
260 sym->attr.implicit_type = 1;
262 if (ts->type == BT_CHARACTER && ts->u.cl)
263 sym->ts.u.cl = gfc_new_charlen (sym->ns, ts->u.cl);
264 else if (ts->type == BT_CLASS
265 && !gfc_build_class_symbol (&sym->ts, &sym->attr, &sym->as, false))
266 return false;
268 if (sym->attr.is_bind_c == 1 && gfc_option.warn_c_binding_type)
270 /* BIND(C) variables should not be implicitly declared. */
271 gfc_warning_now ("Implicitly declared BIND(C) variable '%s' at %L may "
272 "not be C interoperable", sym->name, &sym->declared_at);
273 sym->ts.f90_type = sym->ts.type;
276 if (sym->attr.dummy != 0)
278 if (sym->ns->proc_name != NULL
279 && (sym->ns->proc_name->attr.subroutine != 0
280 || sym->ns->proc_name->attr.function != 0)
281 && sym->ns->proc_name->attr.is_bind_c != 0
282 && gfc_option.warn_c_binding_type)
284 /* Dummy args to a BIND(C) routine may not be interoperable if
285 they are implicitly typed. */
286 gfc_warning_now ("Implicitly declared variable '%s' at %L may not "
287 "be C interoperable but it is a dummy argument to "
288 "the BIND(C) procedure '%s' at %L", sym->name,
289 &(sym->declared_at), sym->ns->proc_name->name,
290 &(sym->ns->proc_name->declared_at));
291 sym->ts.f90_type = sym->ts.type;
295 return true;
299 /* This function is called from parse.c(parse_progunit) to check the
300 type of the function is not implicitly typed in the host namespace
301 and to implicitly type the function result, if necessary. */
303 void
304 gfc_check_function_type (gfc_namespace *ns)
306 gfc_symbol *proc = ns->proc_name;
308 if (!proc->attr.contained || proc->result->attr.implicit_type)
309 return;
311 if (proc->result->ts.type == BT_UNKNOWN && proc->result->ts.interface == NULL)
313 if (gfc_set_default_type (proc->result, 0, gfc_current_ns))
315 if (proc->result != proc)
317 proc->ts = proc->result->ts;
318 proc->as = gfc_copy_array_spec (proc->result->as);
319 proc->attr.dimension = proc->result->attr.dimension;
320 proc->attr.pointer = proc->result->attr.pointer;
321 proc->attr.allocatable = proc->result->attr.allocatable;
324 else if (!proc->result->attr.proc_pointer)
326 gfc_error ("Function result '%s' at %L has no IMPLICIT type",
327 proc->result->name, &proc->result->declared_at);
328 proc->result->attr.untyped = 1;
334 /******************** Symbol attribute stuff *********************/
336 /* This is a generic conflict-checker. We do this to avoid having a
337 single conflict in two places. */
339 #define conf(a, b) if (attr->a && attr->b) { a1 = a; a2 = b; goto conflict; }
340 #define conf2(a) if (attr->a) { a2 = a; goto conflict; }
341 #define conf_std(a, b, std) if (attr->a && attr->b)\
343 a1 = a;\
344 a2 = b;\
345 standard = std;\
346 goto conflict_std;\
349 static bool
350 check_conflict (symbol_attribute *attr, const char *name, locus *where)
352 static const char *dummy = "DUMMY", *save = "SAVE", *pointer = "POINTER",
353 *target = "TARGET", *external = "EXTERNAL", *intent = "INTENT",
354 *intent_in = "INTENT(IN)", *intrinsic = "INTRINSIC",
355 *intent_out = "INTENT(OUT)", *intent_inout = "INTENT(INOUT)",
356 *allocatable = "ALLOCATABLE", *elemental = "ELEMENTAL",
357 *privat = "PRIVATE", *recursive = "RECURSIVE",
358 *in_common = "COMMON", *result = "RESULT", *in_namelist = "NAMELIST",
359 *publik = "PUBLIC", *optional = "OPTIONAL", *entry = "ENTRY",
360 *function = "FUNCTION", *subroutine = "SUBROUTINE",
361 *dimension = "DIMENSION", *in_equivalence = "EQUIVALENCE",
362 *use_assoc = "USE ASSOCIATED", *cray_pointer = "CRAY POINTER",
363 *cray_pointee = "CRAY POINTEE", *data = "DATA", *value = "VALUE",
364 *volatile_ = "VOLATILE", *is_protected = "PROTECTED",
365 *is_bind_c = "BIND(C)", *procedure = "PROCEDURE",
366 *proc_pointer = "PROCEDURE POINTER", *abstract = "ABSTRACT",
367 *asynchronous = "ASYNCHRONOUS", *codimension = "CODIMENSION",
368 *contiguous = "CONTIGUOUS", *generic = "GENERIC";
369 static const char *threadprivate = "THREADPRIVATE";
371 const char *a1, *a2;
372 int standard;
374 if (where == NULL)
375 where = &gfc_current_locus;
377 if (attr->pointer && attr->intent != INTENT_UNKNOWN)
379 a1 = pointer;
380 a2 = intent;
381 standard = GFC_STD_F2003;
382 goto conflict_std;
385 if (attr->in_namelist && (attr->allocatable || attr->pointer))
387 a1 = in_namelist;
388 a2 = attr->allocatable ? allocatable : pointer;
389 standard = GFC_STD_F2003;
390 goto conflict_std;
393 /* Check for attributes not allowed in a BLOCK DATA. */
394 if (gfc_current_state () == COMP_BLOCK_DATA)
396 a1 = NULL;
398 if (attr->in_namelist)
399 a1 = in_namelist;
400 if (attr->allocatable)
401 a1 = allocatable;
402 if (attr->external)
403 a1 = external;
404 if (attr->optional)
405 a1 = optional;
406 if (attr->access == ACCESS_PRIVATE)
407 a1 = privat;
408 if (attr->access == ACCESS_PUBLIC)
409 a1 = publik;
410 if (attr->intent != INTENT_UNKNOWN)
411 a1 = intent;
413 if (a1 != NULL)
415 gfc_error
416 ("%s attribute not allowed in BLOCK DATA program unit at %L",
417 a1, where);
418 return false;
422 if (attr->save == SAVE_EXPLICIT)
424 conf (dummy, save);
425 conf (in_common, save);
426 conf (result, save);
428 switch (attr->flavor)
430 case FL_PROGRAM:
431 case FL_BLOCK_DATA:
432 case FL_MODULE:
433 case FL_LABEL:
434 case FL_DERIVED:
435 case FL_PARAMETER:
436 a1 = gfc_code2string (flavors, attr->flavor);
437 a2 = save;
438 goto conflict;
439 case FL_NAMELIST:
440 gfc_error ("Namelist group name at %L cannot have the "
441 "SAVE attribute", where);
442 return false;
443 break;
444 case FL_PROCEDURE:
445 /* Conflicts between SAVE and PROCEDURE will be checked at
446 resolution stage, see "resolve_fl_procedure". */
447 case FL_VARIABLE:
448 default:
449 break;
453 conf (dummy, entry);
454 conf (dummy, intrinsic);
455 conf (dummy, threadprivate);
456 conf (pointer, target);
457 conf (pointer, intrinsic);
458 conf (pointer, elemental);
459 conf (allocatable, elemental);
461 conf (target, external);
462 conf (target, intrinsic);
464 if (!attr->if_source)
465 conf (external, dimension); /* See Fortran 95's R504. */
467 conf (external, intrinsic);
468 conf (entry, intrinsic);
470 if ((attr->if_source == IFSRC_DECL && !attr->procedure) || attr->contained)
471 conf (external, subroutine);
473 if (attr->proc_pointer && !gfc_notify_std (GFC_STD_F2003,
474 "Procedure pointer at %C"))
475 return false;
477 conf (allocatable, pointer);
478 conf_std (allocatable, dummy, GFC_STD_F2003);
479 conf_std (allocatable, function, GFC_STD_F2003);
480 conf_std (allocatable, result, GFC_STD_F2003);
481 conf (elemental, recursive);
483 conf (in_common, dummy);
484 conf (in_common, allocatable);
485 conf (in_common, codimension);
486 conf (in_common, result);
488 conf (in_equivalence, use_assoc);
489 conf (in_equivalence, codimension);
490 conf (in_equivalence, dummy);
491 conf (in_equivalence, target);
492 conf (in_equivalence, pointer);
493 conf (in_equivalence, function);
494 conf (in_equivalence, result);
495 conf (in_equivalence, entry);
496 conf (in_equivalence, allocatable);
497 conf (in_equivalence, threadprivate);
499 conf (dummy, result);
500 conf (entry, result);
501 conf (generic, result);
503 conf (function, subroutine);
505 if (!function && !subroutine)
506 conf (is_bind_c, dummy);
508 conf (is_bind_c, cray_pointer);
509 conf (is_bind_c, cray_pointee);
510 conf (is_bind_c, codimension);
511 conf (is_bind_c, allocatable);
512 conf (is_bind_c, elemental);
514 /* Need to also get volatile attr, according to 5.1 of F2003 draft.
515 Parameter conflict caught below. Also, value cannot be specified
516 for a dummy procedure. */
518 /* Cray pointer/pointee conflicts. */
519 conf (cray_pointer, cray_pointee);
520 conf (cray_pointer, dimension);
521 conf (cray_pointer, codimension);
522 conf (cray_pointer, contiguous);
523 conf (cray_pointer, pointer);
524 conf (cray_pointer, target);
525 conf (cray_pointer, allocatable);
526 conf (cray_pointer, external);
527 conf (cray_pointer, intrinsic);
528 conf (cray_pointer, in_namelist);
529 conf (cray_pointer, function);
530 conf (cray_pointer, subroutine);
531 conf (cray_pointer, entry);
533 conf (cray_pointee, allocatable);
534 conf (cray_pointer, contiguous);
535 conf (cray_pointer, codimension);
536 conf (cray_pointee, intent);
537 conf (cray_pointee, optional);
538 conf (cray_pointee, dummy);
539 conf (cray_pointee, target);
540 conf (cray_pointee, intrinsic);
541 conf (cray_pointee, pointer);
542 conf (cray_pointee, entry);
543 conf (cray_pointee, in_common);
544 conf (cray_pointee, in_equivalence);
545 conf (cray_pointee, threadprivate);
547 conf (data, dummy);
548 conf (data, function);
549 conf (data, result);
550 conf (data, allocatable);
552 conf (value, pointer)
553 conf (value, allocatable)
554 conf (value, subroutine)
555 conf (value, function)
556 conf (value, volatile_)
557 conf (value, dimension)
558 conf (value, codimension)
559 conf (value, external)
561 conf (codimension, result)
563 if (attr->value
564 && (attr->intent == INTENT_OUT || attr->intent == INTENT_INOUT))
566 a1 = value;
567 a2 = attr->intent == INTENT_OUT ? intent_out : intent_inout;
568 goto conflict;
571 conf (is_protected, intrinsic)
572 conf (is_protected, in_common)
574 conf (asynchronous, intrinsic)
575 conf (asynchronous, external)
577 conf (volatile_, intrinsic)
578 conf (volatile_, external)
580 if (attr->volatile_ && attr->intent == INTENT_IN)
582 a1 = volatile_;
583 a2 = intent_in;
584 goto conflict;
587 conf (procedure, allocatable)
588 conf (procedure, dimension)
589 conf (procedure, codimension)
590 conf (procedure, intrinsic)
591 conf (procedure, target)
592 conf (procedure, value)
593 conf (procedure, volatile_)
594 conf (procedure, asynchronous)
595 conf (procedure, entry)
597 conf (proc_pointer, abstract)
599 a1 = gfc_code2string (flavors, attr->flavor);
601 if (attr->in_namelist
602 && attr->flavor != FL_VARIABLE
603 && attr->flavor != FL_PROCEDURE
604 && attr->flavor != FL_UNKNOWN)
606 a2 = in_namelist;
607 goto conflict;
610 switch (attr->flavor)
612 case FL_PROGRAM:
613 case FL_BLOCK_DATA:
614 case FL_MODULE:
615 case FL_LABEL:
616 conf2 (codimension);
617 conf2 (dimension);
618 conf2 (dummy);
619 conf2 (volatile_);
620 conf2 (asynchronous);
621 conf2 (contiguous);
622 conf2 (pointer);
623 conf2 (is_protected);
624 conf2 (target);
625 conf2 (external);
626 conf2 (intrinsic);
627 conf2 (allocatable);
628 conf2 (result);
629 conf2 (in_namelist);
630 conf2 (optional);
631 conf2 (function);
632 conf2 (subroutine);
633 conf2 (threadprivate);
635 if (attr->access == ACCESS_PUBLIC || attr->access == ACCESS_PRIVATE)
637 a2 = attr->access == ACCESS_PUBLIC ? publik : privat;
638 gfc_error ("%s attribute applied to %s %s at %L", a2, a1,
639 name, where);
640 return false;
643 if (attr->is_bind_c)
645 gfc_error_now ("BIND(C) applied to %s %s at %L", a1, name, where);
646 return false;
649 break;
651 case FL_VARIABLE:
652 break;
654 case FL_NAMELIST:
655 conf2 (result);
656 break;
658 case FL_PROCEDURE:
659 /* Conflicts with INTENT, SAVE and RESULT will be checked
660 at resolution stage, see "resolve_fl_procedure". */
662 if (attr->subroutine)
664 a1 = subroutine;
665 conf2 (target);
666 conf2 (allocatable);
667 conf2 (volatile_);
668 conf2 (asynchronous);
669 conf2 (in_namelist);
670 conf2 (codimension);
671 conf2 (dimension);
672 conf2 (function);
673 if (!attr->proc_pointer)
674 conf2 (threadprivate);
677 if (!attr->proc_pointer)
678 conf2 (in_common);
680 switch (attr->proc)
682 case PROC_ST_FUNCTION:
683 conf2 (dummy);
684 conf2 (target);
685 break;
687 case PROC_MODULE:
688 conf2 (dummy);
689 break;
691 case PROC_DUMMY:
692 conf2 (result);
693 conf2 (threadprivate);
694 break;
696 default:
697 break;
700 break;
702 case FL_DERIVED:
703 conf2 (dummy);
704 conf2 (pointer);
705 conf2 (target);
706 conf2 (external);
707 conf2 (intrinsic);
708 conf2 (allocatable);
709 conf2 (optional);
710 conf2 (entry);
711 conf2 (function);
712 conf2 (subroutine);
713 conf2 (threadprivate);
714 conf2 (result);
716 if (attr->intent != INTENT_UNKNOWN)
718 a2 = intent;
719 goto conflict;
721 break;
723 case FL_PARAMETER:
724 conf2 (external);
725 conf2 (intrinsic);
726 conf2 (optional);
727 conf2 (allocatable);
728 conf2 (function);
729 conf2 (subroutine);
730 conf2 (entry);
731 conf2 (contiguous);
732 conf2 (pointer);
733 conf2 (is_protected);
734 conf2 (target);
735 conf2 (dummy);
736 conf2 (in_common);
737 conf2 (value);
738 conf2 (volatile_);
739 conf2 (asynchronous);
740 conf2 (threadprivate);
741 conf2 (value);
742 conf2 (codimension);
743 conf2 (result);
744 if (!attr->is_iso_c)
745 conf2 (is_bind_c);
746 break;
748 default:
749 break;
752 return true;
754 conflict:
755 if (name == NULL)
756 gfc_error ("%s attribute conflicts with %s attribute at %L",
757 a1, a2, where);
758 else
759 gfc_error ("%s attribute conflicts with %s attribute in '%s' at %L",
760 a1, a2, name, where);
762 return false;
764 conflict_std:
765 if (name == NULL)
767 return gfc_notify_std (standard, "%s attribute "
768 "with %s attribute at %L", a1, a2,
769 where);
771 else
773 return gfc_notify_std (standard, "%s attribute "
774 "with %s attribute in '%s' at %L",
775 a1, a2, name, where);
779 #undef conf
780 #undef conf2
781 #undef conf_std
784 /* Mark a symbol as referenced. */
786 void
787 gfc_set_sym_referenced (gfc_symbol *sym)
790 if (sym->attr.referenced)
791 return;
793 sym->attr.referenced = 1;
795 /* Remember which order dummy variables are accessed in. */
796 if (sym->attr.dummy)
797 sym->dummy_order = next_dummy_order++;
801 /* Common subroutine called by attribute changing subroutines in order
802 to prevent them from changing a symbol that has been
803 use-associated. Returns zero if it is OK to change the symbol,
804 nonzero if not. */
806 static int
807 check_used (symbol_attribute *attr, const char *name, locus *where)
810 if (attr->use_assoc == 0)
811 return 0;
813 if (where == NULL)
814 where = &gfc_current_locus;
816 if (name == NULL)
817 gfc_error ("Cannot change attributes of USE-associated symbol at %L",
818 where);
819 else
820 gfc_error ("Cannot change attributes of USE-associated symbol %s at %L",
821 name, where);
823 return 1;
827 /* Generate an error because of a duplicate attribute. */
829 static void
830 duplicate_attr (const char *attr, locus *where)
833 if (where == NULL)
834 where = &gfc_current_locus;
836 gfc_error ("Duplicate %s attribute specified at %L", attr, where);
840 bool
841 gfc_add_ext_attribute (symbol_attribute *attr, ext_attr_id_t ext_attr,
842 locus *where ATTRIBUTE_UNUSED)
844 attr->ext_attr |= 1 << ext_attr;
845 return true;
849 /* Called from decl.c (attr_decl1) to check attributes, when declared
850 separately. */
852 bool
853 gfc_add_attribute (symbol_attribute *attr, locus *where)
855 if (check_used (attr, NULL, where))
856 return false;
858 return check_conflict (attr, NULL, where);
862 bool
863 gfc_add_allocatable (symbol_attribute *attr, locus *where)
866 if (check_used (attr, NULL, where))
867 return false;
869 if (attr->allocatable)
871 duplicate_attr ("ALLOCATABLE", where);
872 return false;
875 if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
876 && !gfc_find_state (COMP_INTERFACE))
878 gfc_error ("ALLOCATABLE specified outside of INTERFACE body at %L",
879 where);
880 return false;
883 attr->allocatable = 1;
884 return check_conflict (attr, NULL, where);
888 bool
889 gfc_add_codimension (symbol_attribute *attr, const char *name, locus *where)
892 if (check_used (attr, name, where))
893 return false;
895 if (attr->codimension)
897 duplicate_attr ("CODIMENSION", where);
898 return false;
901 if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
902 && !gfc_find_state (COMP_INTERFACE))
904 gfc_error ("CODIMENSION specified for '%s' outside its INTERFACE body "
905 "at %L", name, where);
906 return false;
909 attr->codimension = 1;
910 return check_conflict (attr, name, where);
914 bool
915 gfc_add_dimension (symbol_attribute *attr, const char *name, locus *where)
918 if (check_used (attr, name, where))
919 return false;
921 if (attr->dimension)
923 duplicate_attr ("DIMENSION", where);
924 return false;
927 if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
928 && !gfc_find_state (COMP_INTERFACE))
930 gfc_error ("DIMENSION specified for '%s' outside its INTERFACE body "
931 "at %L", name, where);
932 return false;
935 attr->dimension = 1;
936 return check_conflict (attr, name, where);
940 bool
941 gfc_add_contiguous (symbol_attribute *attr, const char *name, locus *where)
944 if (check_used (attr, name, where))
945 return false;
947 attr->contiguous = 1;
948 return check_conflict (attr, name, where);
952 bool
953 gfc_add_external (symbol_attribute *attr, locus *where)
956 if (check_used (attr, NULL, where))
957 return false;
959 if (attr->external)
961 duplicate_attr ("EXTERNAL", where);
962 return false;
965 if (attr->pointer && attr->if_source != IFSRC_IFBODY)
967 attr->pointer = 0;
968 attr->proc_pointer = 1;
971 attr->external = 1;
973 return check_conflict (attr, NULL, where);
977 bool
978 gfc_add_intrinsic (symbol_attribute *attr, locus *where)
981 if (check_used (attr, NULL, where))
982 return false;
984 if (attr->intrinsic)
986 duplicate_attr ("INTRINSIC", where);
987 return false;
990 attr->intrinsic = 1;
992 return check_conflict (attr, NULL, where);
996 bool
997 gfc_add_optional (symbol_attribute *attr, locus *where)
1000 if (check_used (attr, NULL, where))
1001 return false;
1003 if (attr->optional)
1005 duplicate_attr ("OPTIONAL", where);
1006 return false;
1009 attr->optional = 1;
1010 return check_conflict (attr, NULL, where);
1014 bool
1015 gfc_add_pointer (symbol_attribute *attr, locus *where)
1018 if (check_used (attr, NULL, where))
1019 return false;
1021 if (attr->pointer && !(attr->if_source == IFSRC_IFBODY
1022 && !gfc_find_state (COMP_INTERFACE)))
1024 duplicate_attr ("POINTER", where);
1025 return false;
1028 if (attr->procedure || (attr->external && attr->if_source != IFSRC_IFBODY)
1029 || (attr->if_source == IFSRC_IFBODY
1030 && !gfc_find_state (COMP_INTERFACE)))
1031 attr->proc_pointer = 1;
1032 else
1033 attr->pointer = 1;
1035 return check_conflict (attr, NULL, where);
1039 bool
1040 gfc_add_cray_pointer (symbol_attribute *attr, locus *where)
1043 if (check_used (attr, NULL, where))
1044 return false;
1046 attr->cray_pointer = 1;
1047 return check_conflict (attr, NULL, where);
1051 bool
1052 gfc_add_cray_pointee (symbol_attribute *attr, locus *where)
1055 if (check_used (attr, NULL, where))
1056 return false;
1058 if (attr->cray_pointee)
1060 gfc_error ("Cray Pointee at %L appears in multiple pointer()"
1061 " statements", where);
1062 return false;
1065 attr->cray_pointee = 1;
1066 return check_conflict (attr, NULL, where);
1070 bool
1071 gfc_add_protected (symbol_attribute *attr, const char *name, locus *where)
1073 if (check_used (attr, name, where))
1074 return false;
1076 if (attr->is_protected)
1078 if (!gfc_notify_std (GFC_STD_LEGACY,
1079 "Duplicate PROTECTED attribute specified at %L",
1080 where))
1081 return false;
1084 attr->is_protected = 1;
1085 return check_conflict (attr, name, where);
1089 bool
1090 gfc_add_result (symbol_attribute *attr, const char *name, locus *where)
1093 if (check_used (attr, name, where))
1094 return false;
1096 attr->result = 1;
1097 return check_conflict (attr, name, where);
1101 bool
1102 gfc_add_save (symbol_attribute *attr, save_state s, const char *name,
1103 locus *where)
1106 if (check_used (attr, name, where))
1107 return false;
1109 if (s == SAVE_EXPLICIT && gfc_pure (NULL))
1111 gfc_error
1112 ("SAVE attribute at %L cannot be specified in a PURE procedure",
1113 where);
1114 return false;
1117 if (s == SAVE_EXPLICIT && gfc_implicit_pure (NULL))
1118 gfc_current_ns->proc_name->attr.implicit_pure = 0;
1120 if (s == SAVE_EXPLICIT && attr->save == SAVE_EXPLICIT)
1122 if (!gfc_notify_std (GFC_STD_LEGACY,
1123 "Duplicate SAVE attribute specified at %L",
1124 where))
1125 return false;
1128 attr->save = s;
1129 return check_conflict (attr, name, where);
1133 bool
1134 gfc_add_value (symbol_attribute *attr, const char *name, locus *where)
1137 if (check_used (attr, name, where))
1138 return false;
1140 if (attr->value)
1142 if (!gfc_notify_std (GFC_STD_LEGACY,
1143 "Duplicate VALUE attribute specified at %L",
1144 where))
1145 return false;
1148 attr->value = 1;
1149 return check_conflict (attr, name, where);
1153 bool
1154 gfc_add_volatile (symbol_attribute *attr, const char *name, locus *where)
1156 /* No check_used needed as 11.2.1 of the F2003 standard allows
1157 that the local identifier made accessible by a use statement can be
1158 given a VOLATILE attribute - unless it is a coarray (F2008, C560). */
1160 if (attr->volatile_ && attr->volatile_ns == gfc_current_ns)
1161 if (!gfc_notify_std (GFC_STD_LEGACY,
1162 "Duplicate VOLATILE attribute specified at %L",
1163 where))
1164 return false;
1166 attr->volatile_ = 1;
1167 attr->volatile_ns = gfc_current_ns;
1168 return check_conflict (attr, name, where);
1172 bool
1173 gfc_add_asynchronous (symbol_attribute *attr, const char *name, locus *where)
1175 /* No check_used needed as 11.2.1 of the F2003 standard allows
1176 that the local identifier made accessible by a use statement can be
1177 given a ASYNCHRONOUS attribute. */
1179 if (attr->asynchronous && attr->asynchronous_ns == gfc_current_ns)
1180 if (!gfc_notify_std (GFC_STD_LEGACY,
1181 "Duplicate ASYNCHRONOUS attribute specified at %L",
1182 where))
1183 return false;
1185 attr->asynchronous = 1;
1186 attr->asynchronous_ns = gfc_current_ns;
1187 return check_conflict (attr, name, where);
1191 bool
1192 gfc_add_threadprivate (symbol_attribute *attr, const char *name, locus *where)
1195 if (check_used (attr, name, where))
1196 return false;
1198 if (attr->threadprivate)
1200 duplicate_attr ("THREADPRIVATE", where);
1201 return false;
1204 attr->threadprivate = 1;
1205 return check_conflict (attr, name, where);
1209 bool
1210 gfc_add_target (symbol_attribute *attr, locus *where)
1213 if (check_used (attr, NULL, where))
1214 return false;
1216 if (attr->target)
1218 duplicate_attr ("TARGET", where);
1219 return false;
1222 attr->target = 1;
1223 return check_conflict (attr, NULL, where);
1227 bool
1228 gfc_add_dummy (symbol_attribute *attr, const char *name, locus *where)
1231 if (check_used (attr, name, where))
1232 return false;
1234 /* Duplicate dummy arguments are allowed due to ENTRY statements. */
1235 attr->dummy = 1;
1236 return check_conflict (attr, name, where);
1240 bool
1241 gfc_add_in_common (symbol_attribute *attr, const char *name, locus *where)
1244 if (check_used (attr, name, where))
1245 return false;
1247 /* Duplicate attribute already checked for. */
1248 attr->in_common = 1;
1249 return check_conflict (attr, name, where);
1253 bool
1254 gfc_add_in_equivalence (symbol_attribute *attr, const char *name, locus *where)
1257 /* Duplicate attribute already checked for. */
1258 attr->in_equivalence = 1;
1259 if (!check_conflict (attr, name, where))
1260 return false;
1262 if (attr->flavor == FL_VARIABLE)
1263 return true;
1265 return gfc_add_flavor (attr, FL_VARIABLE, name, where);
1269 bool
1270 gfc_add_data (symbol_attribute *attr, const char *name, locus *where)
1273 if (check_used (attr, name, where))
1274 return false;
1276 attr->data = 1;
1277 return check_conflict (attr, name, where);
1281 bool
1282 gfc_add_in_namelist (symbol_attribute *attr, const char *name, locus *where)
1285 attr->in_namelist = 1;
1286 return check_conflict (attr, name, where);
1290 bool
1291 gfc_add_sequence (symbol_attribute *attr, const char *name, locus *where)
1294 if (check_used (attr, name, where))
1295 return false;
1297 attr->sequence = 1;
1298 return check_conflict (attr, name, where);
1302 bool
1303 gfc_add_elemental (symbol_attribute *attr, locus *where)
1306 if (check_used (attr, NULL, where))
1307 return false;
1309 if (attr->elemental)
1311 duplicate_attr ("ELEMENTAL", where);
1312 return false;
1315 attr->elemental = 1;
1316 return check_conflict (attr, NULL, where);
1320 bool
1321 gfc_add_pure (symbol_attribute *attr, locus *where)
1324 if (check_used (attr, NULL, where))
1325 return false;
1327 if (attr->pure)
1329 duplicate_attr ("PURE", where);
1330 return false;
1333 attr->pure = 1;
1334 return check_conflict (attr, NULL, where);
1338 bool
1339 gfc_add_recursive (symbol_attribute *attr, locus *where)
1342 if (check_used (attr, NULL, where))
1343 return false;
1345 if (attr->recursive)
1347 duplicate_attr ("RECURSIVE", where);
1348 return false;
1351 attr->recursive = 1;
1352 return check_conflict (attr, NULL, where);
1356 bool
1357 gfc_add_entry (symbol_attribute *attr, const char *name, locus *where)
1360 if (check_used (attr, name, where))
1361 return false;
1363 if (attr->entry)
1365 duplicate_attr ("ENTRY", where);
1366 return false;
1369 attr->entry = 1;
1370 return check_conflict (attr, name, where);
1374 bool
1375 gfc_add_function (symbol_attribute *attr, const char *name, locus *where)
1378 if (attr->flavor != FL_PROCEDURE
1379 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1380 return false;
1382 attr->function = 1;
1383 return check_conflict (attr, name, where);
1387 bool
1388 gfc_add_subroutine (symbol_attribute *attr, const char *name, locus *where)
1391 if (attr->flavor != FL_PROCEDURE
1392 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1393 return false;
1395 attr->subroutine = 1;
1396 return check_conflict (attr, name, where);
1400 bool
1401 gfc_add_generic (symbol_attribute *attr, const char *name, locus *where)
1404 if (attr->flavor != FL_PROCEDURE
1405 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1406 return false;
1408 attr->generic = 1;
1409 return check_conflict (attr, name, where);
1413 bool
1414 gfc_add_proc (symbol_attribute *attr, const char *name, locus *where)
1417 if (check_used (attr, NULL, where))
1418 return false;
1420 if (attr->flavor != FL_PROCEDURE
1421 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1422 return false;
1424 if (attr->procedure)
1426 duplicate_attr ("PROCEDURE", where);
1427 return false;
1430 attr->procedure = 1;
1432 return check_conflict (attr, NULL, where);
1436 bool
1437 gfc_add_abstract (symbol_attribute* attr, locus* where)
1439 if (attr->abstract)
1441 duplicate_attr ("ABSTRACT", where);
1442 return false;
1445 attr->abstract = 1;
1447 return check_conflict (attr, NULL, where);
1451 /* Flavors are special because some flavors are not what Fortran
1452 considers attributes and can be reaffirmed multiple times. */
1454 bool
1455 gfc_add_flavor (symbol_attribute *attr, sym_flavor f, const char *name,
1456 locus *where)
1459 if ((f == FL_PROGRAM || f == FL_BLOCK_DATA || f == FL_MODULE
1460 || f == FL_PARAMETER || f == FL_LABEL || f == FL_DERIVED
1461 || f == FL_NAMELIST) && check_used (attr, name, where))
1462 return false;
1464 if (attr->flavor == f && f == FL_VARIABLE)
1465 return true;
1467 if (attr->flavor != FL_UNKNOWN)
1469 if (where == NULL)
1470 where = &gfc_current_locus;
1472 if (name)
1473 gfc_error ("%s attribute of '%s' conflicts with %s attribute at %L",
1474 gfc_code2string (flavors, attr->flavor), name,
1475 gfc_code2string (flavors, f), where);
1476 else
1477 gfc_error ("%s attribute conflicts with %s attribute at %L",
1478 gfc_code2string (flavors, attr->flavor),
1479 gfc_code2string (flavors, f), where);
1481 return false;
1484 attr->flavor = f;
1486 return check_conflict (attr, name, where);
1490 bool
1491 gfc_add_procedure (symbol_attribute *attr, procedure_type t,
1492 const char *name, locus *where)
1495 if (check_used (attr, name, where))
1496 return false;
1498 if (attr->flavor != FL_PROCEDURE
1499 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1500 return false;
1502 if (where == NULL)
1503 where = &gfc_current_locus;
1505 if (attr->proc != PROC_UNKNOWN)
1507 gfc_error ("%s procedure at %L is already declared as %s procedure",
1508 gfc_code2string (procedures, t), where,
1509 gfc_code2string (procedures, attr->proc));
1511 return false;
1514 attr->proc = t;
1516 /* Statement functions are always scalar and functions. */
1517 if (t == PROC_ST_FUNCTION
1518 && ((!attr->function && !gfc_add_function (attr, name, where))
1519 || attr->dimension))
1520 return false;
1522 return check_conflict (attr, name, where);
1526 bool
1527 gfc_add_intent (symbol_attribute *attr, sym_intent intent, locus *where)
1530 if (check_used (attr, NULL, where))
1531 return false;
1533 if (attr->intent == INTENT_UNKNOWN)
1535 attr->intent = intent;
1536 return check_conflict (attr, NULL, where);
1539 if (where == NULL)
1540 where = &gfc_current_locus;
1542 gfc_error ("INTENT (%s) conflicts with INTENT(%s) at %L",
1543 gfc_intent_string (attr->intent),
1544 gfc_intent_string (intent), where);
1546 return false;
1550 /* No checks for use-association in public and private statements. */
1552 bool
1553 gfc_add_access (symbol_attribute *attr, gfc_access access,
1554 const char *name, locus *where)
1557 if (attr->access == ACCESS_UNKNOWN
1558 || (attr->use_assoc && attr->access != ACCESS_PRIVATE))
1560 attr->access = access;
1561 return check_conflict (attr, name, where);
1564 if (where == NULL)
1565 where = &gfc_current_locus;
1566 gfc_error ("ACCESS specification at %L was already specified", where);
1568 return false;
1572 /* Set the is_bind_c field for the given symbol_attribute. */
1574 bool
1575 gfc_add_is_bind_c (symbol_attribute *attr, const char *name, locus *where,
1576 int is_proc_lang_bind_spec)
1579 if (is_proc_lang_bind_spec == 0 && attr->flavor == FL_PROCEDURE)
1580 gfc_error_now ("BIND(C) attribute at %L can only be used for "
1581 "variables or common blocks", where);
1582 else if (attr->is_bind_c)
1583 gfc_error_now ("Duplicate BIND attribute specified at %L", where);
1584 else
1585 attr->is_bind_c = 1;
1587 if (where == NULL)
1588 where = &gfc_current_locus;
1590 if (!gfc_notify_std (GFC_STD_F2003, "BIND(C) at %L", where))
1591 return false;
1593 return check_conflict (attr, name, where);
1597 /* Set the extension field for the given symbol_attribute. */
1599 bool
1600 gfc_add_extension (symbol_attribute *attr, locus *where)
1602 if (where == NULL)
1603 where = &gfc_current_locus;
1605 if (attr->extension)
1606 gfc_error_now ("Duplicate EXTENDS attribute specified at %L", where);
1607 else
1608 attr->extension = 1;
1610 if (!gfc_notify_std (GFC_STD_F2003, "EXTENDS at %L", where))
1611 return false;
1613 return true;
1617 bool
1618 gfc_add_explicit_interface (gfc_symbol *sym, ifsrc source,
1619 gfc_formal_arglist * formal, locus *where)
1622 if (check_used (&sym->attr, sym->name, where))
1623 return false;
1625 if (where == NULL)
1626 where = &gfc_current_locus;
1628 if (sym->attr.if_source != IFSRC_UNKNOWN
1629 && sym->attr.if_source != IFSRC_DECL)
1631 gfc_error ("Symbol '%s' at %L already has an explicit interface",
1632 sym->name, where);
1633 return false;
1636 if (source == IFSRC_IFBODY && (sym->attr.dimension || sym->attr.allocatable))
1638 gfc_error ("'%s' at %L has attributes specified outside its INTERFACE "
1639 "body", sym->name, where);
1640 return false;
1643 sym->formal = formal;
1644 sym->attr.if_source = source;
1646 return true;
1650 /* Add a type to a symbol. */
1652 bool
1653 gfc_add_type (gfc_symbol *sym, gfc_typespec *ts, locus *where)
1655 sym_flavor flavor;
1656 bt type;
1658 if (where == NULL)
1659 where = &gfc_current_locus;
1661 if (sym->result)
1662 type = sym->result->ts.type;
1663 else
1664 type = sym->ts.type;
1666 if (sym->attr.result && type == BT_UNKNOWN && sym->ns->proc_name)
1667 type = sym->ns->proc_name->ts.type;
1669 if (type != BT_UNKNOWN && !(sym->attr.function && sym->attr.implicit_type))
1671 if (sym->attr.use_assoc)
1672 gfc_error ("Symbol '%s' at %L conflicts with symbol from module '%s', "
1673 "use-associated at %L", sym->name, where, sym->module,
1674 &sym->declared_at);
1675 else
1676 gfc_error ("Symbol '%s' at %L already has basic type of %s", sym->name,
1677 where, gfc_basic_typename (type));
1678 return false;
1681 if (sym->attr.procedure && sym->ts.interface)
1683 gfc_error ("Procedure '%s' at %L may not have basic type of %s",
1684 sym->name, where, gfc_basic_typename (ts->type));
1685 return false;
1688 flavor = sym->attr.flavor;
1690 if (flavor == FL_PROGRAM || flavor == FL_BLOCK_DATA || flavor == FL_MODULE
1691 || flavor == FL_LABEL
1692 || (flavor == FL_PROCEDURE && sym->attr.subroutine)
1693 || flavor == FL_DERIVED || flavor == FL_NAMELIST)
1695 gfc_error ("Symbol '%s' at %L cannot have a type", sym->name, where);
1696 return false;
1699 sym->ts = *ts;
1700 return true;
1704 /* Clears all attributes. */
1706 void
1707 gfc_clear_attr (symbol_attribute *attr)
1709 memset (attr, 0, sizeof (symbol_attribute));
1713 /* Check for missing attributes in the new symbol. Currently does
1714 nothing, but it's not clear that it is unnecessary yet. */
1716 bool
1717 gfc_missing_attr (symbol_attribute *attr ATTRIBUTE_UNUSED,
1718 locus *where ATTRIBUTE_UNUSED)
1721 return true;
1725 /* Copy an attribute to a symbol attribute, bit by bit. Some
1726 attributes have a lot of side-effects but cannot be present given
1727 where we are called from, so we ignore some bits. */
1729 bool
1730 gfc_copy_attr (symbol_attribute *dest, symbol_attribute *src, locus *where)
1732 int is_proc_lang_bind_spec;
1734 /* In line with the other attributes, we only add bits but do not remove
1735 them; cf. also PR 41034. */
1736 dest->ext_attr |= src->ext_attr;
1738 if (src->allocatable && !gfc_add_allocatable (dest, where))
1739 goto fail;
1741 if (src->dimension && !gfc_add_dimension (dest, NULL, where))
1742 goto fail;
1743 if (src->codimension && !gfc_add_codimension (dest, NULL, where))
1744 goto fail;
1745 if (src->contiguous && !gfc_add_contiguous (dest, NULL, where))
1746 goto fail;
1747 if (src->optional && !gfc_add_optional (dest, where))
1748 goto fail;
1749 if (src->pointer && !gfc_add_pointer (dest, where))
1750 goto fail;
1751 if (src->is_protected && !gfc_add_protected (dest, NULL, where))
1752 goto fail;
1753 if (src->save && !gfc_add_save (dest, src->save, NULL, where))
1754 goto fail;
1755 if (src->value && !gfc_add_value (dest, NULL, where))
1756 goto fail;
1757 if (src->volatile_ && !gfc_add_volatile (dest, NULL, where))
1758 goto fail;
1759 if (src->asynchronous && !gfc_add_asynchronous (dest, NULL, where))
1760 goto fail;
1761 if (src->threadprivate
1762 && !gfc_add_threadprivate (dest, NULL, where))
1763 goto fail;
1764 if (src->target && !gfc_add_target (dest, where))
1765 goto fail;
1766 if (src->dummy && !gfc_add_dummy (dest, NULL, where))
1767 goto fail;
1768 if (src->result && !gfc_add_result (dest, NULL, where))
1769 goto fail;
1770 if (src->entry)
1771 dest->entry = 1;
1773 if (src->in_namelist && !gfc_add_in_namelist (dest, NULL, where))
1774 goto fail;
1776 if (src->in_common && !gfc_add_in_common (dest, NULL, where))
1777 goto fail;
1779 if (src->generic && !gfc_add_generic (dest, NULL, where))
1780 goto fail;
1781 if (src->function && !gfc_add_function (dest, NULL, where))
1782 goto fail;
1783 if (src->subroutine && !gfc_add_subroutine (dest, NULL, where))
1784 goto fail;
1786 if (src->sequence && !gfc_add_sequence (dest, NULL, where))
1787 goto fail;
1788 if (src->elemental && !gfc_add_elemental (dest, where))
1789 goto fail;
1790 if (src->pure && !gfc_add_pure (dest, where))
1791 goto fail;
1792 if (src->recursive && !gfc_add_recursive (dest, where))
1793 goto fail;
1795 if (src->flavor != FL_UNKNOWN
1796 && !gfc_add_flavor (dest, src->flavor, NULL, where))
1797 goto fail;
1799 if (src->intent != INTENT_UNKNOWN
1800 && !gfc_add_intent (dest, src->intent, where))
1801 goto fail;
1803 if (src->access != ACCESS_UNKNOWN
1804 && !gfc_add_access (dest, src->access, NULL, where))
1805 goto fail;
1807 if (!gfc_missing_attr (dest, where))
1808 goto fail;
1810 if (src->cray_pointer && !gfc_add_cray_pointer (dest, where))
1811 goto fail;
1812 if (src->cray_pointee && !gfc_add_cray_pointee (dest, where))
1813 goto fail;
1815 is_proc_lang_bind_spec = (src->flavor == FL_PROCEDURE ? 1 : 0);
1816 if (src->is_bind_c
1817 && !gfc_add_is_bind_c (dest, NULL, where, is_proc_lang_bind_spec))
1818 return false;
1820 if (src->is_c_interop)
1821 dest->is_c_interop = 1;
1822 if (src->is_iso_c)
1823 dest->is_iso_c = 1;
1825 if (src->external && !gfc_add_external (dest, where))
1826 goto fail;
1827 if (src->intrinsic && !gfc_add_intrinsic (dest, where))
1828 goto fail;
1829 if (src->proc_pointer)
1830 dest->proc_pointer = 1;
1832 return true;
1834 fail:
1835 return false;
1839 /************** Component name management ************/
1841 /* Component names of a derived type form their own little namespaces
1842 that are separate from all other spaces. The space is composed of
1843 a singly linked list of gfc_component structures whose head is
1844 located in the parent symbol. */
1847 /* Add a component name to a symbol. The call fails if the name is
1848 already present. On success, the component pointer is modified to
1849 point to the additional component structure. */
1851 bool
1852 gfc_add_component (gfc_symbol *sym, const char *name,
1853 gfc_component **component)
1855 gfc_component *p, *tail;
1857 tail = NULL;
1859 for (p = sym->components; p; p = p->next)
1861 if (strcmp (p->name, name) == 0)
1863 gfc_error ("Component '%s' at %C already declared at %L",
1864 name, &p->loc);
1865 return false;
1868 tail = p;
1871 if (sym->attr.extension
1872 && gfc_find_component (sym->components->ts.u.derived, name, true, true))
1874 gfc_error ("Component '%s' at %C already in the parent type "
1875 "at %L", name, &sym->components->ts.u.derived->declared_at);
1876 return false;
1879 /* Allocate a new component. */
1880 p = gfc_get_component ();
1882 if (tail == NULL)
1883 sym->components = p;
1884 else
1885 tail->next = p;
1887 p->name = gfc_get_string (name);
1888 p->loc = gfc_current_locus;
1889 p->ts.type = BT_UNKNOWN;
1891 *component = p;
1892 return true;
1896 /* Recursive function to switch derived types of all symbol in a
1897 namespace. */
1899 static void
1900 switch_types (gfc_symtree *st, gfc_symbol *from, gfc_symbol *to)
1902 gfc_symbol *sym;
1904 if (st == NULL)
1905 return;
1907 sym = st->n.sym;
1908 if (sym->ts.type == BT_DERIVED && sym->ts.u.derived == from)
1909 sym->ts.u.derived = to;
1911 switch_types (st->left, from, to);
1912 switch_types (st->right, from, to);
1916 /* This subroutine is called when a derived type is used in order to
1917 make the final determination about which version to use. The
1918 standard requires that a type be defined before it is 'used', but
1919 such types can appear in IMPLICIT statements before the actual
1920 definition. 'Using' in this context means declaring a variable to
1921 be that type or using the type constructor.
1923 If a type is used and the components haven't been defined, then we
1924 have to have a derived type in a parent unit. We find the node in
1925 the other namespace and point the symtree node in this namespace to
1926 that node. Further reference to this name point to the correct
1927 node. If we can't find the node in a parent namespace, then we have
1928 an error.
1930 This subroutine takes a pointer to a symbol node and returns a
1931 pointer to the translated node or NULL for an error. Usually there
1932 is no translation and we return the node we were passed. */
1934 gfc_symbol *
1935 gfc_use_derived (gfc_symbol *sym)
1937 gfc_symbol *s;
1938 gfc_typespec *t;
1939 gfc_symtree *st;
1940 int i;
1942 if (!sym)
1943 return NULL;
1945 if (sym->attr.unlimited_polymorphic)
1946 return sym;
1948 if (sym->attr.generic)
1949 sym = gfc_find_dt_in_generic (sym);
1951 if (sym->components != NULL || sym->attr.zero_comp)
1952 return sym; /* Already defined. */
1954 if (sym->ns->parent == NULL)
1955 goto bad;
1957 if (gfc_find_symbol (sym->name, sym->ns->parent, 1, &s))
1959 gfc_error ("Symbol '%s' at %C is ambiguous", sym->name);
1960 return NULL;
1963 if (s == NULL || s->attr.flavor != FL_DERIVED)
1964 goto bad;
1966 /* Get rid of symbol sym, translating all references to s. */
1967 for (i = 0; i < GFC_LETTERS; i++)
1969 t = &sym->ns->default_type[i];
1970 if (t->u.derived == sym)
1971 t->u.derived = s;
1974 st = gfc_find_symtree (sym->ns->sym_root, sym->name);
1975 st->n.sym = s;
1977 s->refs++;
1979 /* Unlink from list of modified symbols. */
1980 gfc_commit_symbol (sym);
1982 switch_types (sym->ns->sym_root, sym, s);
1984 /* TODO: Also have to replace sym -> s in other lists like
1985 namelists, common lists and interface lists. */
1986 gfc_free_symbol (sym);
1988 return s;
1990 bad:
1991 gfc_error ("Derived type '%s' at %C is being used before it is defined",
1992 sym->name);
1993 return NULL;
1997 /* Given a derived type node and a component name, try to locate the
1998 component structure. Returns the NULL pointer if the component is
1999 not found or the components are private. If noaccess is set, no access
2000 checks are done. */
2002 gfc_component *
2003 gfc_find_component (gfc_symbol *sym, const char *name,
2004 bool noaccess, bool silent)
2006 gfc_component *p;
2008 if (name == NULL || sym == NULL)
2009 return NULL;
2011 sym = gfc_use_derived (sym);
2013 if (sym == NULL)
2014 return NULL;
2016 for (p = sym->components; p; p = p->next)
2017 if (strcmp (p->name, name) == 0)
2018 break;
2020 if (p && sym->attr.use_assoc && !noaccess)
2022 bool is_parent_comp = sym->attr.extension && (p == sym->components);
2023 if (p->attr.access == ACCESS_PRIVATE ||
2024 (p->attr.access != ACCESS_PUBLIC
2025 && sym->component_access == ACCESS_PRIVATE
2026 && !is_parent_comp))
2028 if (!silent)
2029 gfc_error ("Component '%s' at %C is a PRIVATE component of '%s'",
2030 name, sym->name);
2031 return NULL;
2035 if (p == NULL
2036 && sym->attr.extension
2037 && sym->components->ts.type == BT_DERIVED)
2039 p = gfc_find_component (sym->components->ts.u.derived, name,
2040 noaccess, silent);
2041 /* Do not overwrite the error. */
2042 if (p == NULL)
2043 return p;
2046 if (p == NULL && !silent)
2047 gfc_error ("'%s' at %C is not a member of the '%s' structure",
2048 name, sym->name);
2050 return p;
2054 /* Given a symbol, free all of the component structures and everything
2055 they point to. */
2057 static void
2058 free_components (gfc_component *p)
2060 gfc_component *q;
2062 for (; p; p = q)
2064 q = p->next;
2066 gfc_free_array_spec (p->as);
2067 gfc_free_expr (p->initializer);
2068 free (p->tb);
2070 free (p);
2075 /******************** Statement label management ********************/
2077 /* Comparison function for statement labels, used for managing the
2078 binary tree. */
2080 static int
2081 compare_st_labels (void *a1, void *b1)
2083 int a = ((gfc_st_label *) a1)->value;
2084 int b = ((gfc_st_label *) b1)->value;
2086 return (b - a);
2090 /* Free a single gfc_st_label structure, making sure the tree is not
2091 messed up. This function is called only when some parse error
2092 occurs. */
2094 void
2095 gfc_free_st_label (gfc_st_label *label)
2098 if (label == NULL)
2099 return;
2101 gfc_delete_bbt (&gfc_current_ns->st_labels, label, compare_st_labels);
2103 if (label->format != NULL)
2104 gfc_free_expr (label->format);
2106 free (label);
2110 /* Free a whole tree of gfc_st_label structures. */
2112 static void
2113 free_st_labels (gfc_st_label *label)
2116 if (label == NULL)
2117 return;
2119 free_st_labels (label->left);
2120 free_st_labels (label->right);
2122 if (label->format != NULL)
2123 gfc_free_expr (label->format);
2124 free (label);
2128 /* Given a label number, search for and return a pointer to the label
2129 structure, creating it if it does not exist. */
2131 gfc_st_label *
2132 gfc_get_st_label (int labelno)
2134 gfc_st_label *lp;
2135 gfc_namespace *ns;
2137 if (gfc_current_state () == COMP_DERIVED)
2138 ns = gfc_current_block ()->f2k_derived;
2139 else
2141 /* Find the namespace of the scoping unit:
2142 If we're in a BLOCK construct, jump to the parent namespace. */
2143 ns = gfc_current_ns;
2144 while (ns->proc_name && ns->proc_name->attr.flavor == FL_LABEL)
2145 ns = ns->parent;
2148 /* First see if the label is already in this namespace. */
2149 lp = ns->st_labels;
2150 while (lp)
2152 if (lp->value == labelno)
2153 return lp;
2155 if (lp->value < labelno)
2156 lp = lp->left;
2157 else
2158 lp = lp->right;
2161 lp = XCNEW (gfc_st_label);
2163 lp->value = labelno;
2164 lp->defined = ST_LABEL_UNKNOWN;
2165 lp->referenced = ST_LABEL_UNKNOWN;
2167 gfc_insert_bbt (&ns->st_labels, lp, compare_st_labels);
2169 return lp;
2173 /* Called when a statement with a statement label is about to be
2174 accepted. We add the label to the list of the current namespace,
2175 making sure it hasn't been defined previously and referenced
2176 correctly. */
2178 void
2179 gfc_define_st_label (gfc_st_label *lp, gfc_sl_type type, locus *label_locus)
2181 int labelno;
2183 labelno = lp->value;
2185 if (lp->defined != ST_LABEL_UNKNOWN)
2186 gfc_error ("Duplicate statement label %d at %L and %L", labelno,
2187 &lp->where, label_locus);
2188 else
2190 lp->where = *label_locus;
2192 switch (type)
2194 case ST_LABEL_FORMAT:
2195 if (lp->referenced == ST_LABEL_TARGET
2196 || lp->referenced == ST_LABEL_DO_TARGET)
2197 gfc_error ("Label %d at %C already referenced as branch target",
2198 labelno);
2199 else
2200 lp->defined = ST_LABEL_FORMAT;
2202 break;
2204 case ST_LABEL_TARGET:
2205 case ST_LABEL_DO_TARGET:
2206 if (lp->referenced == ST_LABEL_FORMAT)
2207 gfc_error ("Label %d at %C already referenced as a format label",
2208 labelno);
2209 else
2210 lp->defined = type;
2212 if (lp->referenced == ST_LABEL_DO_TARGET && type != ST_LABEL_DO_TARGET
2213 && !gfc_notify_std (GFC_STD_F95_OBS, "DO termination statement "
2214 "which is not END DO or CONTINUE with "
2215 "label %d at %C", labelno))
2216 return;
2217 break;
2219 default:
2220 lp->defined = ST_LABEL_BAD_TARGET;
2221 lp->referenced = ST_LABEL_BAD_TARGET;
2227 /* Reference a label. Given a label and its type, see if that
2228 reference is consistent with what is known about that label,
2229 updating the unknown state. Returns false if something goes
2230 wrong. */
2232 bool
2233 gfc_reference_st_label (gfc_st_label *lp, gfc_sl_type type)
2235 gfc_sl_type label_type;
2236 int labelno;
2237 bool rc;
2239 if (lp == NULL)
2240 return true;
2242 labelno = lp->value;
2244 if (lp->defined != ST_LABEL_UNKNOWN)
2245 label_type = lp->defined;
2246 else
2248 label_type = lp->referenced;
2249 lp->where = gfc_current_locus;
2252 if (label_type == ST_LABEL_FORMAT
2253 && (type == ST_LABEL_TARGET || type == ST_LABEL_DO_TARGET))
2255 gfc_error ("Label %d at %C previously used as a FORMAT label", labelno);
2256 rc = false;
2257 goto done;
2260 if ((label_type == ST_LABEL_TARGET || label_type == ST_LABEL_DO_TARGET
2261 || label_type == ST_LABEL_BAD_TARGET)
2262 && type == ST_LABEL_FORMAT)
2264 gfc_error ("Label %d at %C previously used as branch target", labelno);
2265 rc = false;
2266 goto done;
2269 if (lp->referenced == ST_LABEL_DO_TARGET && type == ST_LABEL_DO_TARGET
2270 && !gfc_notify_std (GFC_STD_F95_OBS, "Shared DO termination label %d "
2271 "at %C", labelno))
2272 return false;
2274 if (lp->referenced != ST_LABEL_DO_TARGET)
2275 lp->referenced = type;
2276 rc = true;
2278 done:
2279 return rc;
2283 /************** Symbol table management subroutines ****************/
2285 /* Basic details: Fortran 95 requires a potentially unlimited number
2286 of distinct namespaces when compiling a program unit. This case
2287 occurs during a compilation of internal subprograms because all of
2288 the internal subprograms must be read before we can start
2289 generating code for the host.
2291 Given the tricky nature of the Fortran grammar, we must be able to
2292 undo changes made to a symbol table if the current interpretation
2293 of a statement is found to be incorrect. Whenever a symbol is
2294 looked up, we make a copy of it and link to it. All of these
2295 symbols are kept in a vector so that we can commit or
2296 undo the changes at a later time.
2298 A symtree may point to a symbol node outside of its namespace. In
2299 this case, that symbol has been used as a host associated variable
2300 at some previous time. */
2302 /* Allocate a new namespace structure. Copies the implicit types from
2303 PARENT if PARENT_TYPES is set. */
2305 gfc_namespace *
2306 gfc_get_namespace (gfc_namespace *parent, int parent_types)
2308 gfc_namespace *ns;
2309 gfc_typespec *ts;
2310 int in;
2311 int i;
2313 ns = XCNEW (gfc_namespace);
2314 ns->sym_root = NULL;
2315 ns->uop_root = NULL;
2316 ns->tb_sym_root = NULL;
2317 ns->finalizers = NULL;
2318 ns->default_access = ACCESS_UNKNOWN;
2319 ns->parent = parent;
2321 for (in = GFC_INTRINSIC_BEGIN; in != GFC_INTRINSIC_END; in++)
2323 ns->operator_access[in] = ACCESS_UNKNOWN;
2324 ns->tb_op[in] = NULL;
2327 /* Initialize default implicit types. */
2328 for (i = 'a'; i <= 'z'; i++)
2330 ns->set_flag[i - 'a'] = 0;
2331 ts = &ns->default_type[i - 'a'];
2333 if (parent_types && ns->parent != NULL)
2335 /* Copy parent settings. */
2336 *ts = ns->parent->default_type[i - 'a'];
2337 continue;
2340 if (gfc_option.flag_implicit_none != 0)
2342 gfc_clear_ts (ts);
2343 continue;
2346 if ('i' <= i && i <= 'n')
2348 ts->type = BT_INTEGER;
2349 ts->kind = gfc_default_integer_kind;
2351 else
2353 ts->type = BT_REAL;
2354 ts->kind = gfc_default_real_kind;
2358 ns->refs = 1;
2360 return ns;
2364 /* Comparison function for symtree nodes. */
2366 static int
2367 compare_symtree (void *_st1, void *_st2)
2369 gfc_symtree *st1, *st2;
2371 st1 = (gfc_symtree *) _st1;
2372 st2 = (gfc_symtree *) _st2;
2374 return strcmp (st1->name, st2->name);
2378 /* Allocate a new symtree node and associate it with the new symbol. */
2380 gfc_symtree *
2381 gfc_new_symtree (gfc_symtree **root, const char *name)
2383 gfc_symtree *st;
2385 st = XCNEW (gfc_symtree);
2386 st->name = gfc_get_string (name);
2388 gfc_insert_bbt (root, st, compare_symtree);
2389 return st;
2393 /* Delete a symbol from the tree. Does not free the symbol itself! */
2395 void
2396 gfc_delete_symtree (gfc_symtree **root, const char *name)
2398 gfc_symtree st, *st0;
2400 st0 = gfc_find_symtree (*root, name);
2402 st.name = gfc_get_string (name);
2403 gfc_delete_bbt (root, &st, compare_symtree);
2405 free (st0);
2409 /* Given a root symtree node and a name, try to find the symbol within
2410 the namespace. Returns NULL if the symbol is not found. */
2412 gfc_symtree *
2413 gfc_find_symtree (gfc_symtree *st, const char *name)
2415 int c;
2417 while (st != NULL)
2419 c = strcmp (name, st->name);
2420 if (c == 0)
2421 return st;
2423 st = (c < 0) ? st->left : st->right;
2426 return NULL;
2430 /* Return a symtree node with a name that is guaranteed to be unique
2431 within the namespace and corresponds to an illegal fortran name. */
2433 gfc_symtree *
2434 gfc_get_unique_symtree (gfc_namespace *ns)
2436 char name[GFC_MAX_SYMBOL_LEN + 1];
2437 static int serial = 0;
2439 sprintf (name, "@%d", serial++);
2440 return gfc_new_symtree (&ns->sym_root, name);
2444 /* Given a name find a user operator node, creating it if it doesn't
2445 exist. These are much simpler than symbols because they can't be
2446 ambiguous with one another. */
2448 gfc_user_op *
2449 gfc_get_uop (const char *name)
2451 gfc_user_op *uop;
2452 gfc_symtree *st;
2454 st = gfc_find_symtree (gfc_current_ns->uop_root, name);
2455 if (st != NULL)
2456 return st->n.uop;
2458 st = gfc_new_symtree (&gfc_current_ns->uop_root, name);
2460 uop = st->n.uop = XCNEW (gfc_user_op);
2461 uop->name = gfc_get_string (name);
2462 uop->access = ACCESS_UNKNOWN;
2463 uop->ns = gfc_current_ns;
2465 return uop;
2469 /* Given a name find the user operator node. Returns NULL if it does
2470 not exist. */
2472 gfc_user_op *
2473 gfc_find_uop (const char *name, gfc_namespace *ns)
2475 gfc_symtree *st;
2477 if (ns == NULL)
2478 ns = gfc_current_ns;
2480 st = gfc_find_symtree (ns->uop_root, name);
2481 return (st == NULL) ? NULL : st->n.uop;
2485 /* Remove a gfc_symbol structure and everything it points to. */
2487 void
2488 gfc_free_symbol (gfc_symbol *sym)
2491 if (sym == NULL)
2492 return;
2494 gfc_free_array_spec (sym->as);
2496 free_components (sym->components);
2498 gfc_free_expr (sym->value);
2500 gfc_free_namelist (sym->namelist);
2502 if (sym->ns != sym->formal_ns)
2503 gfc_free_namespace (sym->formal_ns);
2505 if (!sym->attr.generic_copy)
2506 gfc_free_interface (sym->generic);
2508 gfc_free_formal_arglist (sym->formal);
2510 gfc_free_namespace (sym->f2k_derived);
2512 if (sym->common_block && sym->common_block->name[0] != '\0')
2514 sym->common_block->refs--;
2515 if (sym->common_block->refs == 0)
2516 free (sym->common_block);
2519 free (sym);
2523 /* Decrease the reference counter and free memory when we reach zero. */
2525 void
2526 gfc_release_symbol (gfc_symbol *sym)
2528 if (sym == NULL)
2529 return;
2531 if (sym->formal_ns != NULL && sym->refs == 2 && sym->formal_ns != sym->ns
2532 && (!sym->attr.entry || !sym->module))
2534 /* As formal_ns contains a reference to sym, delete formal_ns just
2535 before the deletion of sym. */
2536 gfc_namespace *ns = sym->formal_ns;
2537 sym->formal_ns = NULL;
2538 gfc_free_namespace (ns);
2541 sym->refs--;
2542 if (sym->refs > 0)
2543 return;
2545 gcc_assert (sym->refs == 0);
2546 gfc_free_symbol (sym);
2550 /* Allocate and initialize a new symbol node. */
2552 gfc_symbol *
2553 gfc_new_symbol (const char *name, gfc_namespace *ns)
2555 gfc_symbol *p;
2557 p = XCNEW (gfc_symbol);
2559 gfc_clear_ts (&p->ts);
2560 gfc_clear_attr (&p->attr);
2561 p->ns = ns;
2563 p->declared_at = gfc_current_locus;
2565 if (strlen (name) > GFC_MAX_SYMBOL_LEN)
2566 gfc_internal_error ("new_symbol(): Symbol name too long");
2568 p->name = gfc_get_string (name);
2570 /* Make sure flags for symbol being C bound are clear initially. */
2571 p->attr.is_bind_c = 0;
2572 p->attr.is_iso_c = 0;
2574 /* Clear the ptrs we may need. */
2575 p->common_block = NULL;
2576 p->f2k_derived = NULL;
2577 p->assoc = NULL;
2579 return p;
2583 /* Generate an error if a symbol is ambiguous. */
2585 static void
2586 ambiguous_symbol (const char *name, gfc_symtree *st)
2589 if (st->n.sym->module)
2590 gfc_error ("Name '%s' at %C is an ambiguous reference to '%s' "
2591 "from module '%s'", name, st->n.sym->name, st->n.sym->module);
2592 else
2593 gfc_error ("Name '%s' at %C is an ambiguous reference to '%s' "
2594 "from current program unit", name, st->n.sym->name);
2598 /* If we're in a SELECT TYPE block, check if the variable 'st' matches any
2599 selector on the stack. If yes, replace it by the corresponding temporary. */
2601 static void
2602 select_type_insert_tmp (gfc_symtree **st)
2604 gfc_select_type_stack *stack = select_type_stack;
2605 for (; stack; stack = stack->prev)
2606 if ((*st)->n.sym == stack->selector && stack->tmp)
2607 *st = stack->tmp;
2611 /* Look for a symtree in the current procedure -- that is, go up to
2612 parent namespaces but only if inside a BLOCK. Returns NULL if not found. */
2614 gfc_symtree*
2615 gfc_find_symtree_in_proc (const char* name, gfc_namespace* ns)
2617 while (ns)
2619 gfc_symtree* st = gfc_find_symtree (ns->sym_root, name);
2620 if (st)
2621 return st;
2623 if (!ns->construct_entities)
2624 break;
2625 ns = ns->parent;
2628 return NULL;
2632 /* Search for a symtree starting in the current namespace, resorting to
2633 any parent namespaces if requested by a nonzero parent_flag.
2634 Returns nonzero if the name is ambiguous. */
2637 gfc_find_sym_tree (const char *name, gfc_namespace *ns, int parent_flag,
2638 gfc_symtree **result)
2640 gfc_symtree *st;
2642 if (ns == NULL)
2643 ns = gfc_current_ns;
2647 st = gfc_find_symtree (ns->sym_root, name);
2648 if (st != NULL)
2650 select_type_insert_tmp (&st);
2652 *result = st;
2653 /* Ambiguous generic interfaces are permitted, as long
2654 as the specific interfaces are different. */
2655 if (st->ambiguous && !st->n.sym->attr.generic)
2657 ambiguous_symbol (name, st);
2658 return 1;
2661 return 0;
2664 if (!parent_flag)
2665 break;
2667 /* Don't escape an interface block. */
2668 if (ns && !ns->has_import_set
2669 && ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY)
2670 break;
2672 ns = ns->parent;
2674 while (ns != NULL);
2676 *result = NULL;
2677 return 0;
2681 /* Same, but returns the symbol instead. */
2684 gfc_find_symbol (const char *name, gfc_namespace *ns, int parent_flag,
2685 gfc_symbol **result)
2687 gfc_symtree *st;
2688 int i;
2690 i = gfc_find_sym_tree (name, ns, parent_flag, &st);
2692 if (st == NULL)
2693 *result = NULL;
2694 else
2695 *result = st->n.sym;
2697 return i;
2701 /* Tells whether there is only one set of changes in the stack. */
2703 static bool
2704 single_undo_checkpoint_p (void)
2706 if (latest_undo_chgset == &default_undo_chgset_var)
2708 gcc_assert (latest_undo_chgset->previous == NULL);
2709 return true;
2711 else
2713 gcc_assert (latest_undo_chgset->previous != NULL);
2714 return false;
2718 /* Save symbol with the information necessary to back it out. */
2720 static void
2721 save_symbol_data (gfc_symbol *sym)
2723 gfc_symbol *s;
2724 unsigned i;
2726 if (!single_undo_checkpoint_p ())
2728 /* If there is more than one change set, look for the symbol in the
2729 current one. If it is found there, we can reuse it. */
2730 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, s)
2731 if (s == sym)
2733 gcc_assert (sym->gfc_new || sym->old_symbol != NULL);
2734 return;
2737 else if (sym->gfc_new || sym->old_symbol != NULL)
2738 return;
2740 s = XCNEW (gfc_symbol);
2741 *s = *sym;
2742 sym->old_symbol = s;
2743 sym->gfc_new = 0;
2745 latest_undo_chgset->syms.safe_push (sym);
2749 /* Given a name, find a symbol, or create it if it does not exist yet
2750 in the current namespace. If the symbol is found we make sure that
2751 it's OK.
2753 The integer return code indicates
2754 0 All OK
2755 1 The symbol name was ambiguous
2756 2 The name meant to be established was already host associated.
2758 So if the return value is nonzero, then an error was issued. */
2761 gfc_get_sym_tree (const char *name, gfc_namespace *ns, gfc_symtree **result,
2762 bool allow_subroutine)
2764 gfc_symtree *st;
2765 gfc_symbol *p;
2767 /* This doesn't usually happen during resolution. */
2768 if (ns == NULL)
2769 ns = gfc_current_ns;
2771 /* Try to find the symbol in ns. */
2772 st = gfc_find_symtree (ns->sym_root, name);
2774 if (st == NULL)
2776 /* If not there, create a new symbol. */
2777 p = gfc_new_symbol (name, ns);
2779 /* Add to the list of tentative symbols. */
2780 p->old_symbol = NULL;
2781 p->mark = 1;
2782 p->gfc_new = 1;
2783 latest_undo_chgset->syms.safe_push (p);
2785 st = gfc_new_symtree (&ns->sym_root, name);
2786 st->n.sym = p;
2787 p->refs++;
2790 else
2792 /* Make sure the existing symbol is OK. Ambiguous
2793 generic interfaces are permitted, as long as the
2794 specific interfaces are different. */
2795 if (st->ambiguous && !st->n.sym->attr.generic)
2797 ambiguous_symbol (name, st);
2798 return 1;
2801 p = st->n.sym;
2802 if (p->ns != ns && (!p->attr.function || ns->proc_name != p)
2803 && !(allow_subroutine && p->attr.subroutine)
2804 && !(ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY
2805 && (ns->has_import_set || p->attr.imported)))
2807 /* Symbol is from another namespace. */
2808 gfc_error ("Symbol '%s' at %C has already been host associated",
2809 name);
2810 return 2;
2813 p->mark = 1;
2815 /* Copy in case this symbol is changed. */
2816 save_symbol_data (p);
2819 *result = st;
2820 return 0;
2825 gfc_get_symbol (const char *name, gfc_namespace *ns, gfc_symbol **result)
2827 gfc_symtree *st;
2828 int i;
2830 i = gfc_get_sym_tree (name, ns, &st, false);
2831 if (i != 0)
2832 return i;
2834 if (st)
2835 *result = st->n.sym;
2836 else
2837 *result = NULL;
2838 return i;
2842 /* Subroutine that searches for a symbol, creating it if it doesn't
2843 exist, but tries to host-associate the symbol if possible. */
2846 gfc_get_ha_sym_tree (const char *name, gfc_symtree **result)
2848 gfc_symtree *st;
2849 int i;
2851 i = gfc_find_sym_tree (name, gfc_current_ns, 0, &st);
2853 if (st != NULL)
2855 save_symbol_data (st->n.sym);
2856 *result = st;
2857 return i;
2860 i = gfc_find_sym_tree (name, gfc_current_ns, 1, &st);
2861 if (i)
2862 return i;
2864 if (st != NULL)
2866 *result = st;
2867 return 0;
2870 return gfc_get_sym_tree (name, gfc_current_ns, result, false);
2875 gfc_get_ha_symbol (const char *name, gfc_symbol **result)
2877 int i;
2878 gfc_symtree *st;
2880 i = gfc_get_ha_sym_tree (name, &st);
2882 if (st)
2883 *result = st->n.sym;
2884 else
2885 *result = NULL;
2887 return i;
2891 /* Search for the symtree belonging to a gfc_common_head; we cannot use
2892 head->name as the common_root symtree's name might be mangled. */
2894 static gfc_symtree *
2895 find_common_symtree (gfc_symtree *st, gfc_common_head *head)
2898 gfc_symtree *result;
2900 if (st == NULL)
2901 return NULL;
2903 if (st->n.common == head)
2904 return st;
2906 result = find_common_symtree (st->left, head);
2907 if (!result)
2908 result = find_common_symtree (st->right, head);
2910 return result;
2914 /* Clear the given storage, and make it the current change set for registering
2915 changed symbols. Its contents are freed after a call to
2916 gfc_restore_last_undo_checkpoint or gfc_drop_last_undo_checkpoint, but
2917 it is up to the caller to free the storage itself. It is usually a local
2918 variable, so there is nothing to do anyway. */
2920 void
2921 gfc_new_undo_checkpoint (gfc_undo_change_set &chg_syms)
2923 chg_syms.syms = vNULL;
2924 chg_syms.tbps = vNULL;
2925 chg_syms.previous = latest_undo_chgset;
2926 latest_undo_chgset = &chg_syms;
2930 /* Restore previous state of symbol. Just copy simple stuff. */
2932 static void
2933 restore_old_symbol (gfc_symbol *p)
2935 gfc_symbol *old;
2937 p->mark = 0;
2938 old = p->old_symbol;
2940 p->ts.type = old->ts.type;
2941 p->ts.kind = old->ts.kind;
2943 p->attr = old->attr;
2945 if (p->value != old->value)
2947 gcc_checking_assert (old->value == NULL);
2948 gfc_free_expr (p->value);
2949 p->value = NULL;
2952 if (p->as != old->as)
2954 if (p->as)
2955 gfc_free_array_spec (p->as);
2956 p->as = old->as;
2959 p->generic = old->generic;
2960 p->component_access = old->component_access;
2962 if (p->namelist != NULL && old->namelist == NULL)
2964 gfc_free_namelist (p->namelist);
2965 p->namelist = NULL;
2967 else
2969 if (p->namelist_tail != old->namelist_tail)
2971 gfc_free_namelist (old->namelist_tail->next);
2972 old->namelist_tail->next = NULL;
2976 p->namelist_tail = old->namelist_tail;
2978 if (p->formal != old->formal)
2980 gfc_free_formal_arglist (p->formal);
2981 p->formal = old->formal;
2984 p->old_symbol = old->old_symbol;
2985 free (old);
2989 /* Frees the internal data of a gfc_undo_change_set structure. Doesn't free
2990 the structure itself. */
2992 static void
2993 free_undo_change_set_data (gfc_undo_change_set &cs)
2995 cs.syms.release ();
2996 cs.tbps.release ();
3000 /* Given a change set pointer, free its target's contents and update it with
3001 the address of the previous change set. Note that only the contents are
3002 freed, not the target itself (the contents' container). It is not a problem
3003 as the latter will be a local variable usually. */
3005 static void
3006 pop_undo_change_set (gfc_undo_change_set *&cs)
3008 free_undo_change_set_data (*cs);
3009 cs = cs->previous;
3013 static void free_old_symbol (gfc_symbol *sym);
3016 /* Merges the current change set into the previous one. The changes themselves
3017 are left untouched; only one checkpoint is forgotten. */
3019 void
3020 gfc_drop_last_undo_checkpoint (void)
3022 gfc_symbol *s, *t;
3023 unsigned i, j;
3025 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, s)
3027 /* No need to loop in this case. */
3028 if (s->old_symbol == NULL)
3029 continue;
3031 /* Remove the duplicate symbols. */
3032 FOR_EACH_VEC_ELT (latest_undo_chgset->previous->syms, j, t)
3033 if (t == s)
3035 latest_undo_chgset->previous->syms.unordered_remove (j);
3037 /* S->OLD_SYMBOL is the backup symbol for S as it was at the
3038 last checkpoint. We drop that checkpoint, so S->OLD_SYMBOL
3039 shall contain from now on the backup symbol for S as it was
3040 at the checkpoint before. */
3041 if (s->old_symbol->gfc_new)
3043 gcc_assert (s->old_symbol->old_symbol == NULL);
3044 s->gfc_new = s->old_symbol->gfc_new;
3045 free_old_symbol (s);
3047 else
3048 restore_old_symbol (s->old_symbol);
3049 break;
3053 latest_undo_chgset->previous->syms.safe_splice (latest_undo_chgset->syms);
3054 latest_undo_chgset->previous->tbps.safe_splice (latest_undo_chgset->tbps);
3056 pop_undo_change_set (latest_undo_chgset);
3060 /* Undoes all the changes made to symbols since the previous checkpoint.
3061 This subroutine is made simpler due to the fact that attributes are
3062 never removed once added. */
3064 void
3065 gfc_restore_last_undo_checkpoint (void)
3067 gfc_symbol *p;
3068 unsigned i;
3070 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3072 if (p->gfc_new)
3074 /* Symbol was new. */
3075 if (p->attr.in_common && p->common_block && p->common_block->head)
3077 /* If the symbol was added to any common block, it
3078 needs to be removed to stop the resolver looking
3079 for a (possibly) dead symbol. */
3081 if (p->common_block->head == p && !p->common_next)
3083 gfc_symtree st, *st0;
3084 st0 = find_common_symtree (p->ns->common_root,
3085 p->common_block);
3086 if (st0)
3088 st.name = st0->name;
3089 gfc_delete_bbt (&p->ns->common_root, &st, compare_symtree);
3090 free (st0);
3094 if (p->common_block->head == p)
3095 p->common_block->head = p->common_next;
3096 else
3098 gfc_symbol *cparent, *csym;
3100 cparent = p->common_block->head;
3101 csym = cparent->common_next;
3103 while (csym != p)
3105 cparent = csym;
3106 csym = csym->common_next;
3109 gcc_assert(cparent->common_next == p);
3111 cparent->common_next = csym->common_next;
3115 /* The derived type is saved in the symtree with the first
3116 letter capitalized; the all lower-case version to the
3117 derived type contains its associated generic function. */
3118 if (p->attr.flavor == FL_DERIVED)
3119 gfc_delete_symtree (&p->ns->sym_root, gfc_get_string ("%c%s",
3120 (char) TOUPPER ((unsigned char) p->name[0]),
3121 &p->name[1]));
3122 else
3123 gfc_delete_symtree (&p->ns->sym_root, p->name);
3125 gfc_release_symbol (p);
3127 else
3128 restore_old_symbol (p);
3131 latest_undo_chgset->syms.truncate (0);
3132 latest_undo_chgset->tbps.truncate (0);
3134 if (!single_undo_checkpoint_p ())
3135 pop_undo_change_set (latest_undo_chgset);
3139 /* Makes sure that there is only one set of changes; in other words we haven't
3140 forgotten to pair a call to gfc_new_checkpoint with a call to either
3141 gfc_drop_last_undo_checkpoint or gfc_restore_last_undo_checkpoint. */
3143 static void
3144 enforce_single_undo_checkpoint (void)
3146 gcc_checking_assert (single_undo_checkpoint_p ());
3150 /* Undoes all the changes made to symbols in the current statement. */
3152 void
3153 gfc_undo_symbols (void)
3155 enforce_single_undo_checkpoint ();
3156 gfc_restore_last_undo_checkpoint ();
3160 /* Free sym->old_symbol. sym->old_symbol is mostly a shallow copy of sym; the
3161 components of old_symbol that might need deallocation are the "allocatables"
3162 that are restored in gfc_undo_symbols(), with two exceptions: namelist and
3163 namelist_tail. In case these differ between old_symbol and sym, it's just
3164 because sym->namelist has gotten a few more items. */
3166 static void
3167 free_old_symbol (gfc_symbol *sym)
3170 if (sym->old_symbol == NULL)
3171 return;
3173 if (sym->old_symbol->as != sym->as)
3174 gfc_free_array_spec (sym->old_symbol->as);
3176 if (sym->old_symbol->value != sym->value)
3177 gfc_free_expr (sym->old_symbol->value);
3179 if (sym->old_symbol->formal != sym->formal)
3180 gfc_free_formal_arglist (sym->old_symbol->formal);
3182 free (sym->old_symbol);
3183 sym->old_symbol = NULL;
3187 /* Makes the changes made in the current statement permanent-- gets
3188 rid of undo information. */
3190 void
3191 gfc_commit_symbols (void)
3193 gfc_symbol *p;
3194 gfc_typebound_proc *tbp;
3195 unsigned i;
3197 enforce_single_undo_checkpoint ();
3199 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3201 p->mark = 0;
3202 p->gfc_new = 0;
3203 free_old_symbol (p);
3205 latest_undo_chgset->syms.truncate (0);
3207 FOR_EACH_VEC_ELT (latest_undo_chgset->tbps, i, tbp)
3208 tbp->error = 0;
3209 latest_undo_chgset->tbps.truncate (0);
3213 /* Makes the changes made in one symbol permanent -- gets rid of undo
3214 information. */
3216 void
3217 gfc_commit_symbol (gfc_symbol *sym)
3219 gfc_symbol *p;
3220 unsigned i;
3222 enforce_single_undo_checkpoint ();
3224 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3225 if (p == sym)
3227 latest_undo_chgset->syms.unordered_remove (i);
3228 break;
3231 sym->mark = 0;
3232 sym->gfc_new = 0;
3234 free_old_symbol (sym);
3238 /* Recursively free trees containing type-bound procedures. */
3240 static void
3241 free_tb_tree (gfc_symtree *t)
3243 if (t == NULL)
3244 return;
3246 free_tb_tree (t->left);
3247 free_tb_tree (t->right);
3249 /* TODO: Free type-bound procedure structs themselves; probably needs some
3250 sort of ref-counting mechanism. */
3252 free (t);
3256 /* Recursive function that deletes an entire tree and all the common
3257 head structures it points to. */
3259 static void
3260 free_common_tree (gfc_symtree * common_tree)
3262 if (common_tree == NULL)
3263 return;
3265 free_common_tree (common_tree->left);
3266 free_common_tree (common_tree->right);
3268 free (common_tree);
3272 /* Recursive function that deletes an entire tree and all the user
3273 operator nodes that it contains. */
3275 static void
3276 free_uop_tree (gfc_symtree *uop_tree)
3278 if (uop_tree == NULL)
3279 return;
3281 free_uop_tree (uop_tree->left);
3282 free_uop_tree (uop_tree->right);
3284 gfc_free_interface (uop_tree->n.uop->op);
3285 free (uop_tree->n.uop);
3286 free (uop_tree);
3290 /* Recursive function that deletes an entire tree and all the symbols
3291 that it contains. */
3293 static void
3294 free_sym_tree (gfc_symtree *sym_tree)
3296 if (sym_tree == NULL)
3297 return;
3299 free_sym_tree (sym_tree->left);
3300 free_sym_tree (sym_tree->right);
3302 gfc_release_symbol (sym_tree->n.sym);
3303 free (sym_tree);
3307 /* Free the derived type list. */
3309 void
3310 gfc_free_dt_list (void)
3312 gfc_dt_list *dt, *n;
3314 for (dt = gfc_derived_types; dt; dt = n)
3316 n = dt->next;
3317 free (dt);
3320 gfc_derived_types = NULL;
3324 /* Free the gfc_equiv_info's. */
3326 static void
3327 gfc_free_equiv_infos (gfc_equiv_info *s)
3329 if (s == NULL)
3330 return;
3331 gfc_free_equiv_infos (s->next);
3332 free (s);
3336 /* Free the gfc_equiv_lists. */
3338 static void
3339 gfc_free_equiv_lists (gfc_equiv_list *l)
3341 if (l == NULL)
3342 return;
3343 gfc_free_equiv_lists (l->next);
3344 gfc_free_equiv_infos (l->equiv);
3345 free (l);
3349 /* Free a finalizer procedure list. */
3351 void
3352 gfc_free_finalizer (gfc_finalizer* el)
3354 if (el)
3356 gfc_release_symbol (el->proc_sym);
3357 free (el);
3361 static void
3362 gfc_free_finalizer_list (gfc_finalizer* list)
3364 while (list)
3366 gfc_finalizer* current = list;
3367 list = list->next;
3368 gfc_free_finalizer (current);
3373 /* Create a new gfc_charlen structure and add it to a namespace.
3374 If 'old_cl' is given, the newly created charlen will be a copy of it. */
3376 gfc_charlen*
3377 gfc_new_charlen (gfc_namespace *ns, gfc_charlen *old_cl)
3379 gfc_charlen *cl;
3380 cl = gfc_get_charlen ();
3382 /* Copy old_cl. */
3383 if (old_cl)
3385 /* Put into namespace, but don't allow reject_statement
3386 to free it if old_cl is given. */
3387 gfc_charlen **prev = &ns->cl_list;
3388 cl->next = ns->old_cl_list;
3389 while (*prev != ns->old_cl_list)
3390 prev = &(*prev)->next;
3391 *prev = cl;
3392 ns->old_cl_list = cl;
3393 cl->length = gfc_copy_expr (old_cl->length);
3394 cl->length_from_typespec = old_cl->length_from_typespec;
3395 cl->backend_decl = old_cl->backend_decl;
3396 cl->passed_length = old_cl->passed_length;
3397 cl->resolved = old_cl->resolved;
3399 else
3401 /* Put into namespace. */
3402 cl->next = ns->cl_list;
3403 ns->cl_list = cl;
3406 return cl;
3410 /* Free the charlen list from cl to end (end is not freed).
3411 Free the whole list if end is NULL. */
3413 void
3414 gfc_free_charlen (gfc_charlen *cl, gfc_charlen *end)
3416 gfc_charlen *cl2;
3418 for (; cl != end; cl = cl2)
3420 gcc_assert (cl);
3422 cl2 = cl->next;
3423 gfc_free_expr (cl->length);
3424 free (cl);
3429 /* Free entry list structs. */
3431 static void
3432 free_entry_list (gfc_entry_list *el)
3434 gfc_entry_list *next;
3436 if (el == NULL)
3437 return;
3439 next = el->next;
3440 free (el);
3441 free_entry_list (next);
3445 /* Free a namespace structure and everything below it. Interface
3446 lists associated with intrinsic operators are not freed. These are
3447 taken care of when a specific name is freed. */
3449 void
3450 gfc_free_namespace (gfc_namespace *ns)
3452 gfc_namespace *p, *q;
3453 int i;
3455 if (ns == NULL)
3456 return;
3458 ns->refs--;
3459 if (ns->refs > 0)
3460 return;
3461 gcc_assert (ns->refs == 0);
3463 gfc_free_statements (ns->code);
3465 free_sym_tree (ns->sym_root);
3466 free_uop_tree (ns->uop_root);
3467 free_common_tree (ns->common_root);
3468 free_tb_tree (ns->tb_sym_root);
3469 free_tb_tree (ns->tb_uop_root);
3470 gfc_free_finalizer_list (ns->finalizers);
3471 gfc_free_charlen (ns->cl_list, NULL);
3472 free_st_labels (ns->st_labels);
3474 free_entry_list (ns->entries);
3475 gfc_free_equiv (ns->equiv);
3476 gfc_free_equiv_lists (ns->equiv_lists);
3477 gfc_free_use_stmts (ns->use_stmts);
3479 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3480 gfc_free_interface (ns->op[i]);
3482 gfc_free_data (ns->data);
3483 p = ns->contained;
3484 free (ns);
3486 /* Recursively free any contained namespaces. */
3487 while (p != NULL)
3489 q = p;
3490 p = p->sibling;
3491 gfc_free_namespace (q);
3496 void
3497 gfc_symbol_init_2 (void)
3500 gfc_current_ns = gfc_get_namespace (NULL, 0);
3504 void
3505 gfc_symbol_done_2 (void)
3507 gfc_free_namespace (gfc_current_ns);
3508 gfc_current_ns = NULL;
3509 gfc_free_dt_list ();
3511 enforce_single_undo_checkpoint ();
3512 free_undo_change_set_data (*latest_undo_chgset);
3516 /* Count how many nodes a symtree has. */
3518 static unsigned
3519 count_st_nodes (const gfc_symtree *st)
3521 unsigned nodes;
3522 if (!st)
3523 return 0;
3525 nodes = count_st_nodes (st->left);
3526 nodes++;
3527 nodes += count_st_nodes (st->right);
3529 return nodes;
3533 /* Convert symtree tree into symtree vector. */
3535 static unsigned
3536 fill_st_vector (gfc_symtree *st, gfc_symtree **st_vec, unsigned node_cntr)
3538 if (!st)
3539 return node_cntr;
3541 node_cntr = fill_st_vector (st->left, st_vec, node_cntr);
3542 st_vec[node_cntr++] = st;
3543 node_cntr = fill_st_vector (st->right, st_vec, node_cntr);
3545 return node_cntr;
3549 /* Traverse namespace. As the functions might modify the symtree, we store the
3550 symtree as a vector and operate on this vector. Note: We assume that
3551 sym_func or st_func never deletes nodes from the symtree - only adding is
3552 allowed. Additionally, newly added nodes are not traversed. */
3554 static void
3555 do_traverse_symtree (gfc_symtree *st, void (*st_func) (gfc_symtree *),
3556 void (*sym_func) (gfc_symbol *))
3558 gfc_symtree **st_vec;
3559 unsigned nodes, i, node_cntr;
3561 gcc_assert ((st_func && !sym_func) || (!st_func && sym_func));
3562 nodes = count_st_nodes (st);
3563 st_vec = XALLOCAVEC (gfc_symtree *, nodes);
3564 node_cntr = 0;
3565 fill_st_vector (st, st_vec, node_cntr);
3567 if (sym_func)
3569 /* Clear marks. */
3570 for (i = 0; i < nodes; i++)
3571 st_vec[i]->n.sym->mark = 0;
3572 for (i = 0; i < nodes; i++)
3573 if (!st_vec[i]->n.sym->mark)
3575 (*sym_func) (st_vec[i]->n.sym);
3576 st_vec[i]->n.sym->mark = 1;
3579 else
3580 for (i = 0; i < nodes; i++)
3581 (*st_func) (st_vec[i]);
3585 /* Recursively traverse the symtree nodes. */
3587 void
3588 gfc_traverse_symtree (gfc_symtree *st, void (*st_func) (gfc_symtree *))
3590 do_traverse_symtree (st, st_func, NULL);
3594 /* Call a given function for all symbols in the namespace. We take
3595 care that each gfc_symbol node is called exactly once. */
3597 void
3598 gfc_traverse_ns (gfc_namespace *ns, void (*sym_func) (gfc_symbol *))
3600 do_traverse_symtree (ns->sym_root, NULL, sym_func);
3604 /* Return TRUE when name is the name of an intrinsic type. */
3606 bool
3607 gfc_is_intrinsic_typename (const char *name)
3609 if (strcmp (name, "integer") == 0
3610 || strcmp (name, "real") == 0
3611 || strcmp (name, "character") == 0
3612 || strcmp (name, "logical") == 0
3613 || strcmp (name, "complex") == 0
3614 || strcmp (name, "doubleprecision") == 0
3615 || strcmp (name, "doublecomplex") == 0)
3616 return true;
3617 else
3618 return false;
3622 /* Return TRUE if the symbol is an automatic variable. */
3624 static bool
3625 gfc_is_var_automatic (gfc_symbol *sym)
3627 /* Pointer and allocatable variables are never automatic. */
3628 if (sym->attr.pointer || sym->attr.allocatable)
3629 return false;
3630 /* Check for arrays with non-constant size. */
3631 if (sym->attr.dimension && sym->as
3632 && !gfc_is_compile_time_shape (sym->as))
3633 return true;
3634 /* Check for non-constant length character variables. */
3635 if (sym->ts.type == BT_CHARACTER
3636 && sym->ts.u.cl
3637 && !gfc_is_constant_expr (sym->ts.u.cl->length))
3638 return true;
3639 return false;
3642 /* Given a symbol, mark it as SAVEd if it is allowed. */
3644 static void
3645 save_symbol (gfc_symbol *sym)
3648 if (sym->attr.use_assoc)
3649 return;
3651 if (sym->attr.in_common
3652 || sym->attr.dummy
3653 || sym->attr.result
3654 || sym->attr.flavor != FL_VARIABLE)
3655 return;
3656 /* Automatic objects are not saved. */
3657 if (gfc_is_var_automatic (sym))
3658 return;
3659 gfc_add_save (&sym->attr, SAVE_EXPLICIT, sym->name, &sym->declared_at);
3663 /* Mark those symbols which can be SAVEd as such. */
3665 void
3666 gfc_save_all (gfc_namespace *ns)
3668 gfc_traverse_ns (ns, save_symbol);
3672 /* Make sure that no changes to symbols are pending. */
3674 void
3675 gfc_enforce_clean_symbol_state(void)
3677 enforce_single_undo_checkpoint ();
3678 gcc_assert (latest_undo_chgset->syms.is_empty ());
3682 /************** Global symbol handling ************/
3685 /* Search a tree for the global symbol. */
3687 gfc_gsymbol *
3688 gfc_find_gsymbol (gfc_gsymbol *symbol, const char *name)
3690 int c;
3692 if (symbol == NULL)
3693 return NULL;
3695 while (symbol)
3697 c = strcmp (name, symbol->name);
3698 if (!c)
3699 return symbol;
3701 symbol = (c < 0) ? symbol->left : symbol->right;
3704 return NULL;
3708 /* Compare two global symbols. Used for managing the BB tree. */
3710 static int
3711 gsym_compare (void *_s1, void *_s2)
3713 gfc_gsymbol *s1, *s2;
3715 s1 = (gfc_gsymbol *) _s1;
3716 s2 = (gfc_gsymbol *) _s2;
3717 return strcmp (s1->name, s2->name);
3721 /* Get a global symbol, creating it if it doesn't exist. */
3723 gfc_gsymbol *
3724 gfc_get_gsymbol (const char *name)
3726 gfc_gsymbol *s;
3728 s = gfc_find_gsymbol (gfc_gsym_root, name);
3729 if (s != NULL)
3730 return s;
3732 s = XCNEW (gfc_gsymbol);
3733 s->type = GSYM_UNKNOWN;
3734 s->name = gfc_get_string (name);
3736 gfc_insert_bbt (&gfc_gsym_root, s, gsym_compare);
3738 return s;
3742 static gfc_symbol *
3743 get_iso_c_binding_dt (int sym_id)
3745 gfc_dt_list *dt_list;
3747 dt_list = gfc_derived_types;
3749 /* Loop through the derived types in the name list, searching for
3750 the desired symbol from iso_c_binding. Search the parent namespaces
3751 if necessary and requested to (parent_flag). */
3752 while (dt_list != NULL)
3754 if (dt_list->derived->from_intmod != INTMOD_NONE
3755 && dt_list->derived->intmod_sym_id == sym_id)
3756 return dt_list->derived;
3758 dt_list = dt_list->next;
3761 return NULL;
3765 /* Verifies that the given derived type symbol, derived_sym, is interoperable
3766 with C. This is necessary for any derived type that is BIND(C) and for
3767 derived types that are parameters to functions that are BIND(C). All
3768 fields of the derived type are required to be interoperable, and are tested
3769 for such. If an error occurs, the errors are reported here, allowing for
3770 multiple errors to be handled for a single derived type. */
3772 bool
3773 verify_bind_c_derived_type (gfc_symbol *derived_sym)
3775 gfc_component *curr_comp = NULL;
3776 bool is_c_interop = false;
3777 bool retval = true;
3779 if (derived_sym == NULL)
3780 gfc_internal_error ("verify_bind_c_derived_type(): Given symbol is "
3781 "unexpectedly NULL");
3783 /* If we've already looked at this derived symbol, do not look at it again
3784 so we don't repeat warnings/errors. */
3785 if (derived_sym->ts.is_c_interop)
3786 return true;
3788 /* The derived type must have the BIND attribute to be interoperable
3789 J3/04-007, Section 15.2.3. */
3790 if (derived_sym->attr.is_bind_c != 1)
3792 derived_sym->ts.is_c_interop = 0;
3793 gfc_error_now ("Derived type '%s' declared at %L must have the BIND "
3794 "attribute to be C interoperable", derived_sym->name,
3795 &(derived_sym->declared_at));
3796 retval = false;
3799 curr_comp = derived_sym->components;
3801 /* Fortran 2003 allows an empty derived type. C99 appears to disallow an
3802 empty struct. Section 15.2 in Fortran 2003 states: "The following
3803 subclauses define the conditions under which a Fortran entity is
3804 interoperable. If a Fortran entity is interoperable, an equivalent
3805 entity may be defined by means of C and the Fortran entity is said
3806 to be interoperable with the C entity. There does not have to be such
3807 an interoperating C entity."
3809 if (curr_comp == NULL)
3811 gfc_warning ("Derived type '%s' with BIND(C) attribute at %L is empty, "
3812 "and may be inaccessible by the C companion processor",
3813 derived_sym->name, &(derived_sym->declared_at));
3814 derived_sym->ts.is_c_interop = 1;
3815 derived_sym->attr.is_bind_c = 1;
3816 return true;
3820 /* Initialize the derived type as being C interoperable.
3821 If we find an error in the components, this will be set false. */
3822 derived_sym->ts.is_c_interop = 1;
3824 /* Loop through the list of components to verify that the kind of
3825 each is a C interoperable type. */
3828 /* The components cannot be pointers (fortran sense).
3829 J3/04-007, Section 15.2.3, C1505. */
3830 if (curr_comp->attr.pointer != 0)
3832 gfc_error ("Component '%s' at %L cannot have the "
3833 "POINTER attribute because it is a member "
3834 "of the BIND(C) derived type '%s' at %L",
3835 curr_comp->name, &(curr_comp->loc),
3836 derived_sym->name, &(derived_sym->declared_at));
3837 retval = false;
3840 if (curr_comp->attr.proc_pointer != 0)
3842 gfc_error ("Procedure pointer component '%s' at %L cannot be a member"
3843 " of the BIND(C) derived type '%s' at %L", curr_comp->name,
3844 &curr_comp->loc, derived_sym->name,
3845 &derived_sym->declared_at);
3846 retval = false;
3849 /* The components cannot be allocatable.
3850 J3/04-007, Section 15.2.3, C1505. */
3851 if (curr_comp->attr.allocatable != 0)
3853 gfc_error ("Component '%s' at %L cannot have the "
3854 "ALLOCATABLE attribute because it is a member "
3855 "of the BIND(C) derived type '%s' at %L",
3856 curr_comp->name, &(curr_comp->loc),
3857 derived_sym->name, &(derived_sym->declared_at));
3858 retval = false;
3861 /* BIND(C) derived types must have interoperable components. */
3862 if (curr_comp->ts.type == BT_DERIVED
3863 && curr_comp->ts.u.derived->ts.is_iso_c != 1
3864 && curr_comp->ts.u.derived != derived_sym)
3866 /* This should be allowed; the draft says a derived-type can not
3867 have type parameters if it is has the BIND attribute. Type
3868 parameters seem to be for making parameterized derived types.
3869 There's no need to verify the type if it is c_ptr/c_funptr. */
3870 retval = verify_bind_c_derived_type (curr_comp->ts.u.derived);
3872 else
3874 /* Grab the typespec for the given component and test the kind. */
3875 is_c_interop = gfc_verify_c_interop (&(curr_comp->ts));
3877 if (!is_c_interop)
3879 /* Report warning and continue since not fatal. The
3880 draft does specify a constraint that requires all fields
3881 to interoperate, but if the user says real(4), etc., it
3882 may interoperate with *something* in C, but the compiler
3883 most likely won't know exactly what. Further, it may not
3884 interoperate with the same data type(s) in C if the user
3885 recompiles with different flags (e.g., -m32 and -m64 on
3886 x86_64 and using integer(4) to claim interop with a
3887 C_LONG). */
3888 if (derived_sym->attr.is_bind_c == 1
3889 && gfc_option.warn_c_binding_type)
3890 /* If the derived type is bind(c), all fields must be
3891 interop. */
3892 gfc_warning ("Component '%s' in derived type '%s' at %L "
3893 "may not be C interoperable, even though "
3894 "derived type '%s' is BIND(C)",
3895 curr_comp->name, derived_sym->name,
3896 &(curr_comp->loc), derived_sym->name);
3897 else if (gfc_option.warn_c_binding_type)
3898 /* If derived type is param to bind(c) routine, or to one
3899 of the iso_c_binding procs, it must be interoperable, so
3900 all fields must interop too. */
3901 gfc_warning ("Component '%s' in derived type '%s' at %L "
3902 "may not be C interoperable",
3903 curr_comp->name, derived_sym->name,
3904 &(curr_comp->loc));
3908 curr_comp = curr_comp->next;
3909 } while (curr_comp != NULL);
3912 /* Make sure we don't have conflicts with the attributes. */
3913 if (derived_sym->attr.access == ACCESS_PRIVATE)
3915 gfc_error ("Derived type '%s' at %L cannot be declared with both "
3916 "PRIVATE and BIND(C) attributes", derived_sym->name,
3917 &(derived_sym->declared_at));
3918 retval = false;
3921 if (derived_sym->attr.sequence != 0)
3923 gfc_error ("Derived type '%s' at %L cannot have the SEQUENCE "
3924 "attribute because it is BIND(C)", derived_sym->name,
3925 &(derived_sym->declared_at));
3926 retval = false;
3929 /* Mark the derived type as not being C interoperable if we found an
3930 error. If there were only warnings, proceed with the assumption
3931 it's interoperable. */
3932 if (!retval)
3933 derived_sym->ts.is_c_interop = 0;
3935 return retval;
3939 /* Generate symbols for the named constants c_null_ptr and c_null_funptr. */
3941 static bool
3942 gen_special_c_interop_ptr (gfc_symbol *tmp_sym, gfc_symtree *dt_symtree)
3944 gfc_constructor *c;
3946 gcc_assert (tmp_sym && dt_symtree && dt_symtree->n.sym);
3947 dt_symtree->n.sym->attr.referenced = 1;
3949 tmp_sym->attr.is_c_interop = 1;
3950 tmp_sym->attr.is_bind_c = 1;
3951 tmp_sym->ts.is_c_interop = 1;
3952 tmp_sym->ts.is_iso_c = 1;
3953 tmp_sym->ts.type = BT_DERIVED;
3954 tmp_sym->ts.f90_type = BT_VOID;
3955 tmp_sym->attr.flavor = FL_PARAMETER;
3956 tmp_sym->ts.u.derived = dt_symtree->n.sym;
3958 /* Set the c_address field of c_null_ptr and c_null_funptr to
3959 the value of NULL. */
3960 tmp_sym->value = gfc_get_expr ();
3961 tmp_sym->value->expr_type = EXPR_STRUCTURE;
3962 tmp_sym->value->ts.type = BT_DERIVED;
3963 tmp_sym->value->ts.f90_type = BT_VOID;
3964 tmp_sym->value->ts.u.derived = tmp_sym->ts.u.derived;
3965 gfc_constructor_append_expr (&tmp_sym->value->value.constructor, NULL, NULL);
3966 c = gfc_constructor_first (tmp_sym->value->value.constructor);
3967 c->expr = gfc_get_int_expr (gfc_index_integer_kind, NULL, 0);
3968 c->expr->ts.is_iso_c = 1;
3970 return true;
3974 /* Add a formal argument, gfc_formal_arglist, to the
3975 end of the given list of arguments. Set the reference to the
3976 provided symbol, param_sym, in the argument. */
3978 static void
3979 add_formal_arg (gfc_formal_arglist **head,
3980 gfc_formal_arglist **tail,
3981 gfc_formal_arglist *formal_arg,
3982 gfc_symbol *param_sym)
3984 /* Put in list, either as first arg or at the tail (curr arg). */
3985 if (*head == NULL)
3986 *head = *tail = formal_arg;
3987 else
3989 (*tail)->next = formal_arg;
3990 (*tail) = formal_arg;
3993 (*tail)->sym = param_sym;
3994 (*tail)->next = NULL;
3996 return;
4000 /* Add a procedure interface to the given symbol (i.e., store a
4001 reference to the list of formal arguments). */
4003 static void
4004 add_proc_interface (gfc_symbol *sym, ifsrc source, gfc_formal_arglist *formal)
4007 sym->formal = formal;
4008 sym->attr.if_source = source;
4012 /* Copy the formal args from an existing symbol, src, into a new
4013 symbol, dest. New formal args are created, and the description of
4014 each arg is set according to the existing ones. This function is
4015 used when creating procedure declaration variables from a procedure
4016 declaration statement (see match_proc_decl()) to create the formal
4017 args based on the args of a given named interface. */
4019 void
4020 gfc_copy_formal_args_intr (gfc_symbol *dest, gfc_intrinsic_sym *src)
4022 gfc_formal_arglist *head = NULL;
4023 gfc_formal_arglist *tail = NULL;
4024 gfc_formal_arglist *formal_arg = NULL;
4025 gfc_intrinsic_arg *curr_arg = NULL;
4026 gfc_formal_arglist *formal_prev = NULL;
4027 /* Save current namespace so we can change it for formal args. */
4028 gfc_namespace *parent_ns = gfc_current_ns;
4030 /* Create a new namespace, which will be the formal ns (namespace
4031 of the formal args). */
4032 gfc_current_ns = gfc_get_namespace (parent_ns, 0);
4033 gfc_current_ns->proc_name = dest;
4035 for (curr_arg = src->formal; curr_arg; curr_arg = curr_arg->next)
4037 formal_arg = gfc_get_formal_arglist ();
4038 gfc_get_symbol (curr_arg->name, gfc_current_ns, &(formal_arg->sym));
4040 /* May need to copy more info for the symbol. */
4041 formal_arg->sym->ts = curr_arg->ts;
4042 formal_arg->sym->attr.optional = curr_arg->optional;
4043 formal_arg->sym->attr.value = curr_arg->value;
4044 formal_arg->sym->attr.intent = curr_arg->intent;
4045 formal_arg->sym->attr.flavor = FL_VARIABLE;
4046 formal_arg->sym->attr.dummy = 1;
4048 if (formal_arg->sym->ts.type == BT_CHARACTER)
4049 formal_arg->sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4051 /* If this isn't the first arg, set up the next ptr. For the
4052 last arg built, the formal_arg->next will never get set to
4053 anything other than NULL. */
4054 if (formal_prev != NULL)
4055 formal_prev->next = formal_arg;
4056 else
4057 formal_arg->next = NULL;
4059 formal_prev = formal_arg;
4061 /* Add arg to list of formal args. */
4062 add_formal_arg (&head, &tail, formal_arg, formal_arg->sym);
4064 /* Validate changes. */
4065 gfc_commit_symbol (formal_arg->sym);
4068 /* Add the interface to the symbol. */
4069 add_proc_interface (dest, IFSRC_DECL, head);
4071 /* Store the formal namespace information. */
4072 if (dest->formal != NULL)
4073 /* The current ns should be that for the dest proc. */
4074 dest->formal_ns = gfc_current_ns;
4075 /* Restore the current namespace to what it was on entry. */
4076 gfc_current_ns = parent_ns;
4080 static int
4081 std_for_isocbinding_symbol (int id)
4083 switch (id)
4085 #define NAMED_INTCST(a,b,c,d) \
4086 case a:\
4087 return d;
4088 #include "iso-c-binding.def"
4089 #undef NAMED_INTCST
4091 #define NAMED_FUNCTION(a,b,c,d) \
4092 case a:\
4093 return d;
4094 #define NAMED_SUBROUTINE(a,b,c,d) \
4095 case a:\
4096 return d;
4097 #include "iso-c-binding.def"
4098 #undef NAMED_FUNCTION
4099 #undef NAMED_SUBROUTINE
4101 default:
4102 return GFC_STD_F2003;
4106 /* Generate the given set of C interoperable kind objects, or all
4107 interoperable kinds. This function will only be given kind objects
4108 for valid iso_c_binding defined types because this is verified when
4109 the 'use' statement is parsed. If the user gives an 'only' clause,
4110 the specific kinds are looked up; if they don't exist, an error is
4111 reported. If the user does not give an 'only' clause, all
4112 iso_c_binding symbols are generated. If a list of specific kinds
4113 is given, it must have a NULL in the first empty spot to mark the
4114 end of the list. For C_null_(fun)ptr, dt_symtree has to be set and
4115 point to the symtree for c_(fun)ptr. */
4117 gfc_symtree *
4118 generate_isocbinding_symbol (const char *mod_name, iso_c_binding_symbol s,
4119 const char *local_name, gfc_symtree *dt_symtree,
4120 bool hidden)
4122 const char *const name = (local_name && local_name[0])
4123 ? local_name : c_interop_kinds_table[s].name;
4124 gfc_symtree *tmp_symtree;
4125 gfc_symbol *tmp_sym = NULL;
4126 int index;
4128 if (gfc_notification_std (std_for_isocbinding_symbol (s)) == ERROR)
4129 return NULL;
4131 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
4132 if (hidden
4133 && (!tmp_symtree || !tmp_symtree->n.sym
4134 || tmp_symtree->n.sym->from_intmod != INTMOD_ISO_C_BINDING
4135 || tmp_symtree->n.sym->intmod_sym_id != s))
4136 tmp_symtree = NULL;
4138 /* Already exists in this scope so don't re-add it. */
4139 if (tmp_symtree != NULL && (tmp_sym = tmp_symtree->n.sym) != NULL
4140 && (!tmp_sym->attr.generic
4141 || (tmp_sym = gfc_find_dt_in_generic (tmp_sym)) != NULL)
4142 && tmp_sym->from_intmod == INTMOD_ISO_C_BINDING)
4144 if (tmp_sym->attr.flavor == FL_DERIVED
4145 && !get_iso_c_binding_dt (tmp_sym->intmod_sym_id))
4147 gfc_dt_list *dt_list;
4148 dt_list = gfc_get_dt_list ();
4149 dt_list->derived = tmp_sym;
4150 dt_list->next = gfc_derived_types;
4151 gfc_derived_types = dt_list;
4154 return tmp_symtree;
4157 /* Create the sym tree in the current ns. */
4158 if (hidden)
4160 tmp_symtree = gfc_get_unique_symtree (gfc_current_ns);
4161 tmp_sym = gfc_new_symbol (name, gfc_current_ns);
4163 /* Add to the list of tentative symbols. */
4164 latest_undo_chgset->syms.safe_push (tmp_sym);
4165 tmp_sym->old_symbol = NULL;
4166 tmp_sym->mark = 1;
4167 tmp_sym->gfc_new = 1;
4169 tmp_symtree->n.sym = tmp_sym;
4170 tmp_sym->refs++;
4172 else
4174 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
4175 gcc_assert (tmp_symtree);
4176 tmp_sym = tmp_symtree->n.sym;
4179 /* Say what module this symbol belongs to. */
4180 tmp_sym->module = gfc_get_string (mod_name);
4181 tmp_sym->from_intmod = INTMOD_ISO_C_BINDING;
4182 tmp_sym->intmod_sym_id = s;
4183 tmp_sym->attr.is_iso_c = 1;
4184 tmp_sym->attr.use_assoc = 1;
4186 gcc_assert (dt_symtree == NULL || s == ISOCBINDING_NULL_FUNPTR
4187 || s == ISOCBINDING_NULL_PTR);
4189 switch (s)
4192 #define NAMED_INTCST(a,b,c,d) case a :
4193 #define NAMED_REALCST(a,b,c,d) case a :
4194 #define NAMED_CMPXCST(a,b,c,d) case a :
4195 #define NAMED_LOGCST(a,b,c) case a :
4196 #define NAMED_CHARKNDCST(a,b,c) case a :
4197 #include "iso-c-binding.def"
4199 tmp_sym->value = gfc_get_int_expr (gfc_default_integer_kind, NULL,
4200 c_interop_kinds_table[s].value);
4202 /* Initialize an integer constant expression node. */
4203 tmp_sym->attr.flavor = FL_PARAMETER;
4204 tmp_sym->ts.type = BT_INTEGER;
4205 tmp_sym->ts.kind = gfc_default_integer_kind;
4207 /* Mark this type as a C interoperable one. */
4208 tmp_sym->ts.is_c_interop = 1;
4209 tmp_sym->ts.is_iso_c = 1;
4210 tmp_sym->value->ts.is_c_interop = 1;
4211 tmp_sym->value->ts.is_iso_c = 1;
4212 tmp_sym->attr.is_c_interop = 1;
4214 /* Tell what f90 type this c interop kind is valid. */
4215 tmp_sym->ts.f90_type = c_interop_kinds_table[s].f90_type;
4217 break;
4220 #define NAMED_CHARCST(a,b,c) case a :
4221 #include "iso-c-binding.def"
4223 /* Initialize an integer constant expression node for the
4224 length of the character. */
4225 tmp_sym->value = gfc_get_character_expr (gfc_default_character_kind,
4226 &gfc_current_locus, NULL, 1);
4227 tmp_sym->value->ts.is_c_interop = 1;
4228 tmp_sym->value->ts.is_iso_c = 1;
4229 tmp_sym->value->value.character.length = 1;
4230 tmp_sym->value->value.character.string[0]
4231 = (gfc_char_t) c_interop_kinds_table[s].value;
4232 tmp_sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4233 tmp_sym->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
4234 NULL, 1);
4236 /* May not need this in both attr and ts, but do need in
4237 attr for writing module file. */
4238 tmp_sym->attr.is_c_interop = 1;
4240 tmp_sym->attr.flavor = FL_PARAMETER;
4241 tmp_sym->ts.type = BT_CHARACTER;
4243 /* Need to set it to the C_CHAR kind. */
4244 tmp_sym->ts.kind = gfc_default_character_kind;
4246 /* Mark this type as a C interoperable one. */
4247 tmp_sym->ts.is_c_interop = 1;
4248 tmp_sym->ts.is_iso_c = 1;
4250 /* Tell what f90 type this c interop kind is valid. */
4251 tmp_sym->ts.f90_type = BT_CHARACTER;
4253 break;
4255 case ISOCBINDING_PTR:
4256 case ISOCBINDING_FUNPTR:
4258 gfc_symbol *dt_sym;
4259 gfc_dt_list **dt_list_ptr = NULL;
4260 gfc_component *tmp_comp = NULL;
4262 /* Generate real derived type. */
4263 if (hidden)
4264 dt_sym = tmp_sym;
4265 else
4267 const char *hidden_name;
4268 gfc_interface *intr, *head;
4270 hidden_name = gfc_get_string ("%c%s",
4271 (char) TOUPPER ((unsigned char)
4272 tmp_sym->name[0]),
4273 &tmp_sym->name[1]);
4274 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
4275 hidden_name);
4276 gcc_assert (tmp_symtree == NULL);
4277 gfc_get_sym_tree (hidden_name, gfc_current_ns, &tmp_symtree, false);
4278 dt_sym = tmp_symtree->n.sym;
4279 dt_sym->name = gfc_get_string (s == ISOCBINDING_PTR
4280 ? "c_ptr" : "c_funptr");
4282 /* Generate an artificial generic function. */
4283 head = tmp_sym->generic;
4284 intr = gfc_get_interface ();
4285 intr->sym = dt_sym;
4286 intr->where = gfc_current_locus;
4287 intr->next = head;
4288 tmp_sym->generic = intr;
4290 if (!tmp_sym->attr.generic
4291 && !gfc_add_generic (&tmp_sym->attr, tmp_sym->name, NULL))
4292 return NULL;
4294 if (!tmp_sym->attr.function
4295 && !gfc_add_function (&tmp_sym->attr, tmp_sym->name, NULL))
4296 return NULL;
4299 /* Say what module this symbol belongs to. */
4300 dt_sym->module = gfc_get_string (mod_name);
4301 dt_sym->from_intmod = INTMOD_ISO_C_BINDING;
4302 dt_sym->intmod_sym_id = s;
4303 dt_sym->attr.use_assoc = 1;
4305 /* Initialize an integer constant expression node. */
4306 dt_sym->attr.flavor = FL_DERIVED;
4307 dt_sym->ts.is_c_interop = 1;
4308 dt_sym->attr.is_c_interop = 1;
4309 dt_sym->attr.private_comp = 1;
4310 dt_sym->component_access = ACCESS_PRIVATE;
4311 dt_sym->ts.is_iso_c = 1;
4312 dt_sym->ts.type = BT_DERIVED;
4313 dt_sym->ts.f90_type = BT_VOID;
4315 /* A derived type must have the bind attribute to be
4316 interoperable (J3/04-007, Section 15.2.3), even though
4317 the binding label is not used. */
4318 dt_sym->attr.is_bind_c = 1;
4320 dt_sym->attr.referenced = 1;
4321 dt_sym->ts.u.derived = dt_sym;
4323 /* Add the symbol created for the derived type to the current ns. */
4324 dt_list_ptr = &(gfc_derived_types);
4325 while (*dt_list_ptr != NULL && (*dt_list_ptr)->next != NULL)
4326 dt_list_ptr = &((*dt_list_ptr)->next);
4328 /* There is already at least one derived type in the list, so append
4329 the one we're currently building for c_ptr or c_funptr. */
4330 if (*dt_list_ptr != NULL)
4331 dt_list_ptr = &((*dt_list_ptr)->next);
4332 (*dt_list_ptr) = gfc_get_dt_list ();
4333 (*dt_list_ptr)->derived = dt_sym;
4334 (*dt_list_ptr)->next = NULL;
4336 gfc_add_component (dt_sym, "c_address", &tmp_comp);
4337 if (tmp_comp == NULL)
4338 gcc_unreachable ();
4340 tmp_comp->ts.type = BT_INTEGER;
4342 /* Set this because the module will need to read/write this field. */
4343 tmp_comp->ts.f90_type = BT_INTEGER;
4345 /* The kinds for c_ptr and c_funptr are the same. */
4346 index = get_c_kind ("c_ptr", c_interop_kinds_table);
4347 tmp_comp->ts.kind = c_interop_kinds_table[index].value;
4348 tmp_comp->attr.access = ACCESS_PRIVATE;
4350 /* Mark the component as C interoperable. */
4351 tmp_comp->ts.is_c_interop = 1;
4354 break;
4356 case ISOCBINDING_NULL_PTR:
4357 case ISOCBINDING_NULL_FUNPTR:
4358 gen_special_c_interop_ptr (tmp_sym, dt_symtree);
4359 break;
4361 default:
4362 gcc_unreachable ();
4364 gfc_commit_symbol (tmp_sym);
4365 return tmp_symtree;
4369 /* Check that a symbol is already typed. If strict is not set, an untyped
4370 symbol is acceptable for non-standard-conforming mode. */
4372 bool
4373 gfc_check_symbol_typed (gfc_symbol* sym, gfc_namespace* ns,
4374 bool strict, locus where)
4376 gcc_assert (sym);
4378 if (gfc_matching_prefix)
4379 return true;
4381 /* Check for the type and try to give it an implicit one. */
4382 if (sym->ts.type == BT_UNKNOWN
4383 && !gfc_set_default_type (sym, 0, ns))
4385 if (strict)
4387 gfc_error ("Symbol '%s' is used before it is typed at %L",
4388 sym->name, &where);
4389 return false;
4392 if (!gfc_notify_std (GFC_STD_GNU, "Symbol '%s' is used before"
4393 " it is typed at %L", sym->name, &where))
4394 return false;
4397 /* Everything is ok. */
4398 return true;
4402 /* Construct a typebound-procedure structure. Those are stored in a tentative
4403 list and marked `error' until symbols are committed. */
4405 gfc_typebound_proc*
4406 gfc_get_typebound_proc (gfc_typebound_proc *tb0)
4408 gfc_typebound_proc *result;
4410 result = XCNEW (gfc_typebound_proc);
4411 if (tb0)
4412 *result = *tb0;
4413 result->error = 1;
4415 latest_undo_chgset->tbps.safe_push (result);
4417 return result;
4421 /* Get the super-type of a given derived type. */
4423 gfc_symbol*
4424 gfc_get_derived_super_type (gfc_symbol* derived)
4426 gcc_assert (derived);
4428 if (derived->attr.generic)
4429 derived = gfc_find_dt_in_generic (derived);
4431 if (!derived->attr.extension)
4432 return NULL;
4434 gcc_assert (derived->components);
4435 gcc_assert (derived->components->ts.type == BT_DERIVED);
4436 gcc_assert (derived->components->ts.u.derived);
4438 if (derived->components->ts.u.derived->attr.generic)
4439 return gfc_find_dt_in_generic (derived->components->ts.u.derived);
4441 return derived->components->ts.u.derived;
4445 /* Get the ultimate super-type of a given derived type. */
4447 gfc_symbol*
4448 gfc_get_ultimate_derived_super_type (gfc_symbol* derived)
4450 if (!derived->attr.extension)
4451 return NULL;
4453 derived = gfc_get_derived_super_type (derived);
4455 if (derived->attr.extension)
4456 return gfc_get_ultimate_derived_super_type (derived);
4457 else
4458 return derived;
4462 /* Check if a derived type t2 is an extension of (or equal to) a type t1. */
4464 bool
4465 gfc_type_is_extension_of (gfc_symbol *t1, gfc_symbol *t2)
4467 while (!gfc_compare_derived_types (t1, t2) && t2->attr.extension)
4468 t2 = gfc_get_derived_super_type (t2);
4469 return gfc_compare_derived_types (t1, t2);
4473 /* Check if two typespecs are type compatible (F03:5.1.1.2):
4474 If ts1 is nonpolymorphic, ts2 must be the same type.
4475 If ts1 is polymorphic (CLASS), ts2 must be an extension of ts1. */
4477 bool
4478 gfc_type_compatible (gfc_typespec *ts1, gfc_typespec *ts2)
4480 bool is_class1 = (ts1->type == BT_CLASS);
4481 bool is_class2 = (ts2->type == BT_CLASS);
4482 bool is_derived1 = (ts1->type == BT_DERIVED);
4483 bool is_derived2 = (ts2->type == BT_DERIVED);
4485 if (is_class1
4486 && ts1->u.derived->components
4487 && ts1->u.derived->components->ts.u.derived->attr.unlimited_polymorphic)
4488 return 1;
4490 if (!is_derived1 && !is_derived2 && !is_class1 && !is_class2)
4491 return (ts1->type == ts2->type);
4493 if (is_derived1 && is_derived2)
4494 return gfc_compare_derived_types (ts1->u.derived, ts2->u.derived);
4496 if (is_derived1 && is_class2)
4497 return gfc_compare_derived_types (ts1->u.derived,
4498 ts2->u.derived->components->ts.u.derived);
4499 if (is_class1 && is_derived2)
4500 return gfc_type_is_extension_of (ts1->u.derived->components->ts.u.derived,
4501 ts2->u.derived);
4502 else if (is_class1 && is_class2)
4503 return gfc_type_is_extension_of (ts1->u.derived->components->ts.u.derived,
4504 ts2->u.derived->components->ts.u.derived);
4505 else
4506 return 0;
4510 /* Find the parent-namespace of the current function. If we're inside
4511 BLOCK constructs, it may not be the current one. */
4513 gfc_namespace*
4514 gfc_find_proc_namespace (gfc_namespace* ns)
4516 while (ns->construct_entities)
4518 ns = ns->parent;
4519 gcc_assert (ns);
4522 return ns;
4526 /* Check if an associate-variable should be translated as an `implicit' pointer
4527 internally (if it is associated to a variable and not an array with
4528 descriptor). */
4530 bool
4531 gfc_is_associate_pointer (gfc_symbol* sym)
4533 if (!sym->assoc)
4534 return false;
4536 if (sym->ts.type == BT_CLASS)
4537 return true;
4539 if (!sym->assoc->variable)
4540 return false;
4542 if (sym->attr.dimension && sym->as->type != AS_EXPLICIT)
4543 return false;
4545 return true;
4549 gfc_symbol *
4550 gfc_find_dt_in_generic (gfc_symbol *sym)
4552 gfc_interface *intr = NULL;
4554 if (!sym || sym->attr.flavor == FL_DERIVED)
4555 return sym;
4557 if (sym->attr.generic)
4558 for (intr = sym->generic; intr; intr = intr->next)
4559 if (intr->sym->attr.flavor == FL_DERIVED)
4560 break;
4561 return intr ? intr->sym : NULL;
4565 /* Get the dummy arguments from a procedure symbol. If it has been declared
4566 via a PROCEDURE statement with a named interface, ts.interface will be set
4567 and the arguments need to be taken from there. */
4569 gfc_formal_arglist *
4570 gfc_sym_get_dummy_args (gfc_symbol *sym)
4572 gfc_formal_arglist *dummies;
4574 dummies = sym->formal;
4575 if (dummies == NULL && sym->ts.interface != NULL)
4576 dummies = sym->ts.interface->formal;
4578 return dummies;