* tree-loop-distribution.c (struct partition): New field recording
[official-gcc.git] / gcc / fortran / symbol.c
blob3bc2b34768f88685f236b8e0846aec4d710ba7b8
1 /* Maintain binary trees of symbols.
2 Copyright (C) 2000-2017 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 "options.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 ("UNION", FL_UNION), minit ("STRUCTURE", FL_STRUCT),
44 minit (NULL, -1)
47 const mstring procedures[] =
49 minit ("UNKNOWN-PROC", PROC_UNKNOWN),
50 minit ("MODULE-PROC", PROC_MODULE),
51 minit ("INTERNAL-PROC", PROC_INTERNAL),
52 minit ("DUMMY-PROC", PROC_DUMMY),
53 minit ("INTRINSIC-PROC", PROC_INTRINSIC),
54 minit ("EXTERNAL-PROC", PROC_EXTERNAL),
55 minit ("STATEMENT-PROC", PROC_ST_FUNCTION),
56 minit (NULL, -1)
59 const mstring intents[] =
61 minit ("UNKNOWN-INTENT", INTENT_UNKNOWN),
62 minit ("IN", INTENT_IN),
63 minit ("OUT", INTENT_OUT),
64 minit ("INOUT", INTENT_INOUT),
65 minit (NULL, -1)
68 const mstring access_types[] =
70 minit ("UNKNOWN-ACCESS", ACCESS_UNKNOWN),
71 minit ("PUBLIC", ACCESS_PUBLIC),
72 minit ("PRIVATE", ACCESS_PRIVATE),
73 minit (NULL, -1)
76 const mstring ifsrc_types[] =
78 minit ("UNKNOWN", IFSRC_UNKNOWN),
79 minit ("DECL", IFSRC_DECL),
80 minit ("BODY", IFSRC_IFBODY)
83 const mstring save_status[] =
85 minit ("UNKNOWN", SAVE_NONE),
86 minit ("EXPLICIT-SAVE", SAVE_EXPLICIT),
87 minit ("IMPLICIT-SAVE", SAVE_IMPLICIT),
90 /* Set the mstrings for DTIO procedure names. */
91 const mstring dtio_procs[] =
93 minit ("_dtio_formatted_read", DTIO_RF),
94 minit ("_dtio_formatted_write", DTIO_WF),
95 minit ("_dtio_unformatted_read", DTIO_RUF),
96 minit ("_dtio_unformatted_write", DTIO_WUF),
99 /* This is to make sure the backend generates setup code in the correct
100 order. */
102 static int next_dummy_order = 1;
105 gfc_namespace *gfc_current_ns;
106 gfc_namespace *gfc_global_ns_list;
108 gfc_gsymbol *gfc_gsym_root = NULL;
110 gfc_dt_list *gfc_derived_types;
112 static gfc_undo_change_set default_undo_chgset_var = { vNULL, vNULL, NULL };
113 static gfc_undo_change_set *latest_undo_chgset = &default_undo_chgset_var;
116 /*********** IMPLICIT NONE and IMPLICIT statement handlers ***********/
118 /* The following static variable indicates whether a particular element has
119 been explicitly set or not. */
121 static int new_flag[GFC_LETTERS];
124 /* Handle a correctly parsed IMPLICIT NONE. */
126 void
127 gfc_set_implicit_none (bool type, bool external, locus *loc)
129 int i;
131 if (external)
132 gfc_current_ns->has_implicit_none_export = 1;
134 if (type)
136 gfc_current_ns->seen_implicit_none = 1;
137 for (i = 0; i < GFC_LETTERS; i++)
139 if (gfc_current_ns->set_flag[i])
141 gfc_error_now ("IMPLICIT NONE (type) statement at %L following an "
142 "IMPLICIT statement", loc);
143 return;
145 gfc_clear_ts (&gfc_current_ns->default_type[i]);
146 gfc_current_ns->set_flag[i] = 1;
152 /* Reset the implicit range flags. */
154 void
155 gfc_clear_new_implicit (void)
157 int i;
159 for (i = 0; i < GFC_LETTERS; i++)
160 new_flag[i] = 0;
164 /* Prepare for a new implicit range. Sets flags in new_flag[]. */
166 bool
167 gfc_add_new_implicit_range (int c1, int c2)
169 int i;
171 c1 -= 'a';
172 c2 -= 'a';
174 for (i = c1; i <= c2; i++)
176 if (new_flag[i])
178 gfc_error ("Letter %qc already set in IMPLICIT statement at %C",
179 i + 'A');
180 return false;
183 new_flag[i] = 1;
186 return true;
190 /* Add a matched implicit range for gfc_set_implicit(). Check if merging
191 the new implicit types back into the existing types will work. */
193 bool
194 gfc_merge_new_implicit (gfc_typespec *ts)
196 int i;
198 if (gfc_current_ns->seen_implicit_none)
200 gfc_error ("Cannot specify IMPLICIT at %C after IMPLICIT NONE");
201 return false;
204 for (i = 0; i < GFC_LETTERS; i++)
206 if (new_flag[i])
208 if (gfc_current_ns->set_flag[i])
210 gfc_error ("Letter %qc already has an IMPLICIT type at %C",
211 i + 'A');
212 return false;
215 gfc_current_ns->default_type[i] = *ts;
216 gfc_current_ns->implicit_loc[i] = gfc_current_locus;
217 gfc_current_ns->set_flag[i] = 1;
220 return true;
224 /* Given a symbol, return a pointer to the typespec for its default type. */
226 gfc_typespec *
227 gfc_get_default_type (const char *name, gfc_namespace *ns)
229 char letter;
231 letter = name[0];
233 if (flag_allow_leading_underscore && letter == '_')
234 gfc_fatal_error ("Option %<-fallow-leading-underscore%> is for use only by "
235 "gfortran developers, and should not be used for "
236 "implicitly typed variables");
238 if (letter < 'a' || letter > 'z')
239 gfc_internal_error ("gfc_get_default_type(): Bad symbol %qs", name);
241 if (ns == NULL)
242 ns = gfc_current_ns;
244 return &ns->default_type[letter - 'a'];
248 /* Given a pointer to a symbol, set its type according to the first
249 letter of its name. Fails if the letter in question has no default
250 type. */
252 bool
253 gfc_set_default_type (gfc_symbol *sym, int error_flag, gfc_namespace *ns)
255 gfc_typespec *ts;
257 if (sym->ts.type != BT_UNKNOWN)
258 gfc_internal_error ("gfc_set_default_type(): symbol already has a type");
260 ts = gfc_get_default_type (sym->name, ns);
262 if (ts->type == BT_UNKNOWN)
264 if (error_flag && !sym->attr.untyped)
266 gfc_error ("Symbol %qs at %L has no IMPLICIT type",
267 sym->name, &sym->declared_at);
268 sym->attr.untyped = 1; /* Ensure we only give an error once. */
271 return false;
274 sym->ts = *ts;
275 sym->attr.implicit_type = 1;
277 if (ts->type == BT_CHARACTER && ts->u.cl)
278 sym->ts.u.cl = gfc_new_charlen (sym->ns, ts->u.cl);
279 else if (ts->type == BT_CLASS
280 && !gfc_build_class_symbol (&sym->ts, &sym->attr, &sym->as))
281 return false;
283 if (sym->attr.is_bind_c == 1 && warn_c_binding_type)
285 /* BIND(C) variables should not be implicitly declared. */
286 gfc_warning_now (OPT_Wc_binding_type, "Implicitly declared BIND(C) "
287 "variable %qs at %L may not be C interoperable",
288 sym->name, &sym->declared_at);
289 sym->ts.f90_type = sym->ts.type;
292 if (sym->attr.dummy != 0)
294 if (sym->ns->proc_name != NULL
295 && (sym->ns->proc_name->attr.subroutine != 0
296 || sym->ns->proc_name->attr.function != 0)
297 && sym->ns->proc_name->attr.is_bind_c != 0
298 && warn_c_binding_type)
300 /* Dummy args to a BIND(C) routine may not be interoperable if
301 they are implicitly typed. */
302 gfc_warning_now (OPT_Wc_binding_type, "Implicitly declared variable "
303 "%qs at %L may not be C interoperable but it is a "
304 "dummy argument to the BIND(C) procedure %qs at %L",
305 sym->name, &(sym->declared_at),
306 sym->ns->proc_name->name,
307 &(sym->ns->proc_name->declared_at));
308 sym->ts.f90_type = sym->ts.type;
312 return true;
316 /* This function is called from parse.c(parse_progunit) to check the
317 type of the function is not implicitly typed in the host namespace
318 and to implicitly type the function result, if necessary. */
320 void
321 gfc_check_function_type (gfc_namespace *ns)
323 gfc_symbol *proc = ns->proc_name;
325 if (!proc->attr.contained || proc->result->attr.implicit_type)
326 return;
328 if (proc->result->ts.type == BT_UNKNOWN && proc->result->ts.interface == NULL)
330 if (gfc_set_default_type (proc->result, 0, gfc_current_ns))
332 if (proc->result != proc)
334 proc->ts = proc->result->ts;
335 proc->as = gfc_copy_array_spec (proc->result->as);
336 proc->attr.dimension = proc->result->attr.dimension;
337 proc->attr.pointer = proc->result->attr.pointer;
338 proc->attr.allocatable = proc->result->attr.allocatable;
341 else if (!proc->result->attr.proc_pointer)
343 gfc_error ("Function result %qs at %L has no IMPLICIT type",
344 proc->result->name, &proc->result->declared_at);
345 proc->result->attr.untyped = 1;
351 /******************** Symbol attribute stuff *********************/
353 /* This is a generic conflict-checker. We do this to avoid having a
354 single conflict in two places. */
356 #define conf(a, b) if (attr->a && attr->b) { a1 = a; a2 = b; goto conflict; }
357 #define conf2(a) if (attr->a) { a2 = a; goto conflict; }
358 #define conf_std(a, b, std) if (attr->a && attr->b)\
360 a1 = a;\
361 a2 = b;\
362 standard = std;\
363 goto conflict_std;\
366 static bool
367 check_conflict (symbol_attribute *attr, const char *name, locus *where)
369 static const char *dummy = "DUMMY", *save = "SAVE", *pointer = "POINTER",
370 *target = "TARGET", *external = "EXTERNAL", *intent = "INTENT",
371 *intent_in = "INTENT(IN)", *intrinsic = "INTRINSIC",
372 *intent_out = "INTENT(OUT)", *intent_inout = "INTENT(INOUT)",
373 *allocatable = "ALLOCATABLE", *elemental = "ELEMENTAL",
374 *privat = "PRIVATE", *recursive = "RECURSIVE",
375 *in_common = "COMMON", *result = "RESULT", *in_namelist = "NAMELIST",
376 *publik = "PUBLIC", *optional = "OPTIONAL", *entry = "ENTRY",
377 *function = "FUNCTION", *subroutine = "SUBROUTINE",
378 *dimension = "DIMENSION", *in_equivalence = "EQUIVALENCE",
379 *use_assoc = "USE ASSOCIATED", *cray_pointer = "CRAY POINTER",
380 *cray_pointee = "CRAY POINTEE", *data = "DATA", *value = "VALUE",
381 *volatile_ = "VOLATILE", *is_protected = "PROTECTED",
382 *is_bind_c = "BIND(C)", *procedure = "PROCEDURE",
383 *proc_pointer = "PROCEDURE POINTER", *abstract = "ABSTRACT",
384 *asynchronous = "ASYNCHRONOUS", *codimension = "CODIMENSION",
385 *contiguous = "CONTIGUOUS", *generic = "GENERIC", *automatic = "AUTOMATIC";
386 static const char *threadprivate = "THREADPRIVATE";
387 static const char *omp_declare_target = "OMP DECLARE TARGET";
388 static const char *omp_declare_target_link = "OMP DECLARE TARGET LINK";
389 static const char *oacc_declare_copyin = "OACC DECLARE COPYIN";
390 static const char *oacc_declare_create = "OACC DECLARE CREATE";
391 static const char *oacc_declare_deviceptr = "OACC DECLARE DEVICEPTR";
392 static const char *oacc_declare_device_resident =
393 "OACC DECLARE DEVICE_RESIDENT";
395 const char *a1, *a2;
396 int standard;
398 if (where == NULL)
399 where = &gfc_current_locus;
401 if (attr->pointer && attr->intent != INTENT_UNKNOWN)
403 a1 = pointer;
404 a2 = intent;
405 standard = GFC_STD_F2003;
406 goto conflict_std;
409 if (attr->in_namelist && (attr->allocatable || attr->pointer))
411 a1 = in_namelist;
412 a2 = attr->allocatable ? allocatable : pointer;
413 standard = GFC_STD_F2003;
414 goto conflict_std;
417 /* Check for attributes not allowed in a BLOCK DATA. */
418 if (gfc_current_state () == COMP_BLOCK_DATA)
420 a1 = NULL;
422 if (attr->in_namelist)
423 a1 = in_namelist;
424 if (attr->allocatable)
425 a1 = allocatable;
426 if (attr->external)
427 a1 = external;
428 if (attr->optional)
429 a1 = optional;
430 if (attr->access == ACCESS_PRIVATE)
431 a1 = privat;
432 if (attr->access == ACCESS_PUBLIC)
433 a1 = publik;
434 if (attr->intent != INTENT_UNKNOWN)
435 a1 = intent;
437 if (a1 != NULL)
439 gfc_error
440 ("%s attribute not allowed in BLOCK DATA program unit at %L",
441 a1, where);
442 return false;
446 if (attr->save == SAVE_EXPLICIT)
448 conf (dummy, save);
449 conf (in_common, save);
450 conf (result, save);
451 conf (automatic, save);
453 switch (attr->flavor)
455 case FL_PROGRAM:
456 case FL_BLOCK_DATA:
457 case FL_MODULE:
458 case FL_LABEL:
459 case_fl_struct:
460 case FL_PARAMETER:
461 a1 = gfc_code2string (flavors, attr->flavor);
462 a2 = save;
463 goto conflict;
464 case FL_NAMELIST:
465 gfc_error ("Namelist group name at %L cannot have the "
466 "SAVE attribute", where);
467 return false;
468 case FL_PROCEDURE:
469 /* Conflicts between SAVE and PROCEDURE will be checked at
470 resolution stage, see "resolve_fl_procedure". */
471 case FL_VARIABLE:
472 default:
473 break;
477 /* The copying of procedure dummy arguments for module procedures in
478 a submodule occur whilst the current state is COMP_CONTAINS. It
479 is necessary, therefore, to let this through. */
480 if (attr->dummy
481 && (attr->function || attr->subroutine)
482 && gfc_current_state () == COMP_CONTAINS
483 && !(gfc_new_block && gfc_new_block->abr_modproc_decl))
484 gfc_error_now ("internal procedure %qs at %L conflicts with "
485 "DUMMY argument", name, where);
487 conf (dummy, entry);
488 conf (dummy, intrinsic);
489 conf (dummy, threadprivate);
490 conf (dummy, omp_declare_target);
491 conf (dummy, omp_declare_target_link);
492 conf (pointer, target);
493 conf (pointer, intrinsic);
494 conf (pointer, elemental);
495 conf (pointer, codimension);
496 conf (allocatable, elemental);
498 conf (in_common, automatic);
499 conf (in_equivalence, automatic);
500 conf (result, automatic);
501 conf (use_assoc, automatic);
502 conf (dummy, automatic);
504 conf (target, external);
505 conf (target, intrinsic);
507 if (!attr->if_source)
508 conf (external, dimension); /* See Fortran 95's R504. */
510 conf (external, intrinsic);
511 conf (entry, intrinsic);
513 if ((attr->if_source == IFSRC_DECL && !attr->procedure) || attr->contained)
514 conf (external, subroutine);
516 if (attr->proc_pointer && !gfc_notify_std (GFC_STD_F2003,
517 "Procedure pointer at %C"))
518 return false;
520 conf (allocatable, pointer);
521 conf_std (allocatable, dummy, GFC_STD_F2003);
522 conf_std (allocatable, function, GFC_STD_F2003);
523 conf_std (allocatable, result, GFC_STD_F2003);
524 conf (elemental, recursive);
526 conf (in_common, dummy);
527 conf (in_common, allocatable);
528 conf (in_common, codimension);
529 conf (in_common, result);
531 conf (in_equivalence, use_assoc);
532 conf (in_equivalence, codimension);
533 conf (in_equivalence, dummy);
534 conf (in_equivalence, target);
535 conf (in_equivalence, pointer);
536 conf (in_equivalence, function);
537 conf (in_equivalence, result);
538 conf (in_equivalence, entry);
539 conf (in_equivalence, allocatable);
540 conf (in_equivalence, threadprivate);
541 conf (in_equivalence, omp_declare_target);
542 conf (in_equivalence, omp_declare_target_link);
543 conf (in_equivalence, oacc_declare_create);
544 conf (in_equivalence, oacc_declare_copyin);
545 conf (in_equivalence, oacc_declare_deviceptr);
546 conf (in_equivalence, oacc_declare_device_resident);
547 conf (in_equivalence, is_bind_c);
549 conf (dummy, result);
550 conf (entry, result);
551 conf (generic, result);
552 conf (generic, omp_declare_target);
553 conf (generic, omp_declare_target_link);
555 conf (function, subroutine);
557 if (!function && !subroutine)
558 conf (is_bind_c, dummy);
560 conf (is_bind_c, cray_pointer);
561 conf (is_bind_c, cray_pointee);
562 conf (is_bind_c, codimension);
563 conf (is_bind_c, allocatable);
564 conf (is_bind_c, elemental);
566 /* Need to also get volatile attr, according to 5.1 of F2003 draft.
567 Parameter conflict caught below. Also, value cannot be specified
568 for a dummy procedure. */
570 /* Cray pointer/pointee conflicts. */
571 conf (cray_pointer, cray_pointee);
572 conf (cray_pointer, dimension);
573 conf (cray_pointer, codimension);
574 conf (cray_pointer, contiguous);
575 conf (cray_pointer, pointer);
576 conf (cray_pointer, target);
577 conf (cray_pointer, allocatable);
578 conf (cray_pointer, external);
579 conf (cray_pointer, intrinsic);
580 conf (cray_pointer, in_namelist);
581 conf (cray_pointer, function);
582 conf (cray_pointer, subroutine);
583 conf (cray_pointer, entry);
585 conf (cray_pointee, allocatable);
586 conf (cray_pointee, contiguous);
587 conf (cray_pointee, codimension);
588 conf (cray_pointee, intent);
589 conf (cray_pointee, optional);
590 conf (cray_pointee, dummy);
591 conf (cray_pointee, target);
592 conf (cray_pointee, intrinsic);
593 conf (cray_pointee, pointer);
594 conf (cray_pointee, entry);
595 conf (cray_pointee, in_common);
596 conf (cray_pointee, in_equivalence);
597 conf (cray_pointee, threadprivate);
598 conf (cray_pointee, omp_declare_target);
599 conf (cray_pointee, omp_declare_target_link);
600 conf (cray_pointee, oacc_declare_create);
601 conf (cray_pointee, oacc_declare_copyin);
602 conf (cray_pointee, oacc_declare_deviceptr);
603 conf (cray_pointee, oacc_declare_device_resident);
605 conf (data, dummy);
606 conf (data, function);
607 conf (data, result);
608 conf (data, allocatable);
610 conf (value, pointer)
611 conf (value, allocatable)
612 conf (value, subroutine)
613 conf (value, function)
614 conf (value, volatile_)
615 conf (value, dimension)
616 conf (value, codimension)
617 conf (value, external)
619 conf (codimension, result)
621 if (attr->value
622 && (attr->intent == INTENT_OUT || attr->intent == INTENT_INOUT))
624 a1 = value;
625 a2 = attr->intent == INTENT_OUT ? intent_out : intent_inout;
626 goto conflict;
629 conf (is_protected, intrinsic)
630 conf (is_protected, in_common)
632 conf (asynchronous, intrinsic)
633 conf (asynchronous, external)
635 conf (volatile_, intrinsic)
636 conf (volatile_, external)
638 if (attr->volatile_ && attr->intent == INTENT_IN)
640 a1 = volatile_;
641 a2 = intent_in;
642 goto conflict;
645 conf (procedure, allocatable)
646 conf (procedure, dimension)
647 conf (procedure, codimension)
648 conf (procedure, intrinsic)
649 conf (procedure, target)
650 conf (procedure, value)
651 conf (procedure, volatile_)
652 conf (procedure, asynchronous)
653 conf (procedure, entry)
655 conf (proc_pointer, abstract)
656 conf (proc_pointer, omp_declare_target)
657 conf (proc_pointer, omp_declare_target_link)
659 conf (entry, omp_declare_target)
660 conf (entry, omp_declare_target_link)
661 conf (entry, oacc_declare_create)
662 conf (entry, oacc_declare_copyin)
663 conf (entry, oacc_declare_deviceptr)
664 conf (entry, oacc_declare_device_resident)
666 a1 = gfc_code2string (flavors, attr->flavor);
668 if (attr->in_namelist
669 && attr->flavor != FL_VARIABLE
670 && attr->flavor != FL_PROCEDURE
671 && attr->flavor != FL_UNKNOWN)
673 a2 = in_namelist;
674 goto conflict;
677 switch (attr->flavor)
679 case FL_PROGRAM:
680 case FL_BLOCK_DATA:
681 case FL_MODULE:
682 case FL_LABEL:
683 conf2 (codimension);
684 conf2 (dimension);
685 conf2 (dummy);
686 conf2 (volatile_);
687 conf2 (asynchronous);
688 conf2 (contiguous);
689 conf2 (pointer);
690 conf2 (is_protected);
691 conf2 (target);
692 conf2 (external);
693 conf2 (intrinsic);
694 conf2 (allocatable);
695 conf2 (result);
696 conf2 (in_namelist);
697 conf2 (optional);
698 conf2 (function);
699 conf2 (subroutine);
700 conf2 (threadprivate);
701 conf2 (omp_declare_target);
702 conf2 (omp_declare_target_link);
703 conf2 (oacc_declare_create);
704 conf2 (oacc_declare_copyin);
705 conf2 (oacc_declare_deviceptr);
706 conf2 (oacc_declare_device_resident);
708 if (attr->access == ACCESS_PUBLIC || attr->access == ACCESS_PRIVATE)
710 a2 = attr->access == ACCESS_PUBLIC ? publik : privat;
711 gfc_error ("%s attribute applied to %s %s at %L", a2, a1,
712 name, where);
713 return false;
716 if (attr->is_bind_c)
718 gfc_error_now ("BIND(C) applied to %s %s at %L", a1, name, where);
719 return false;
722 break;
724 case FL_VARIABLE:
725 break;
727 case FL_NAMELIST:
728 conf2 (result);
729 break;
731 case FL_PROCEDURE:
732 /* Conflicts with INTENT, SAVE and RESULT will be checked
733 at resolution stage, see "resolve_fl_procedure". */
735 if (attr->subroutine)
737 a1 = subroutine;
738 conf2 (target);
739 conf2 (allocatable);
740 conf2 (volatile_);
741 conf2 (asynchronous);
742 conf2 (in_namelist);
743 conf2 (codimension);
744 conf2 (dimension);
745 conf2 (function);
746 if (!attr->proc_pointer)
747 conf2 (threadprivate);
750 if (!attr->proc_pointer)
751 conf2 (in_common);
753 conf2 (omp_declare_target_link);
755 switch (attr->proc)
757 case PROC_ST_FUNCTION:
758 conf2 (dummy);
759 conf2 (target);
760 break;
762 case PROC_MODULE:
763 conf2 (dummy);
764 break;
766 case PROC_DUMMY:
767 conf2 (result);
768 conf2 (threadprivate);
769 break;
771 default:
772 break;
775 break;
777 case_fl_struct:
778 conf2 (dummy);
779 conf2 (pointer);
780 conf2 (target);
781 conf2 (external);
782 conf2 (intrinsic);
783 conf2 (allocatable);
784 conf2 (optional);
785 conf2 (entry);
786 conf2 (function);
787 conf2 (subroutine);
788 conf2 (threadprivate);
789 conf2 (result);
790 conf2 (omp_declare_target);
791 conf2 (omp_declare_target_link);
792 conf2 (oacc_declare_create);
793 conf2 (oacc_declare_copyin);
794 conf2 (oacc_declare_deviceptr);
795 conf2 (oacc_declare_device_resident);
797 if (attr->intent != INTENT_UNKNOWN)
799 a2 = intent;
800 goto conflict;
802 break;
804 case FL_PARAMETER:
805 conf2 (external);
806 conf2 (intrinsic);
807 conf2 (optional);
808 conf2 (allocatable);
809 conf2 (function);
810 conf2 (subroutine);
811 conf2 (entry);
812 conf2 (contiguous);
813 conf2 (pointer);
814 conf2 (is_protected);
815 conf2 (target);
816 conf2 (dummy);
817 conf2 (in_common);
818 conf2 (value);
819 conf2 (volatile_);
820 conf2 (asynchronous);
821 conf2 (threadprivate);
822 conf2 (value);
823 conf2 (codimension);
824 conf2 (result);
825 if (!attr->is_iso_c)
826 conf2 (is_bind_c);
827 break;
829 default:
830 break;
833 return true;
835 conflict:
836 if (name == NULL)
837 gfc_error ("%s attribute conflicts with %s attribute at %L",
838 a1, a2, where);
839 else
840 gfc_error ("%s attribute conflicts with %s attribute in %qs at %L",
841 a1, a2, name, where);
843 return false;
845 conflict_std:
846 if (name == NULL)
848 return gfc_notify_std (standard, "%s attribute conflicts "
849 "with %s attribute at %L", a1, a2,
850 where);
852 else
854 return gfc_notify_std (standard, "%s attribute conflicts "
855 "with %s attribute in %qs at %L",
856 a1, a2, name, where);
860 #undef conf
861 #undef conf2
862 #undef conf_std
865 /* Mark a symbol as referenced. */
867 void
868 gfc_set_sym_referenced (gfc_symbol *sym)
871 if (sym->attr.referenced)
872 return;
874 sym->attr.referenced = 1;
876 /* Remember which order dummy variables are accessed in. */
877 if (sym->attr.dummy)
878 sym->dummy_order = next_dummy_order++;
882 /* Common subroutine called by attribute changing subroutines in order
883 to prevent them from changing a symbol that has been
884 use-associated. Returns zero if it is OK to change the symbol,
885 nonzero if not. */
887 static int
888 check_used (symbol_attribute *attr, const char *name, locus *where)
891 if (attr->use_assoc == 0)
892 return 0;
894 if (where == NULL)
895 where = &gfc_current_locus;
897 if (name == NULL)
898 gfc_error ("Cannot change attributes of USE-associated symbol at %L",
899 where);
900 else
901 gfc_error ("Cannot change attributes of USE-associated symbol %s at %L",
902 name, where);
904 return 1;
908 /* Generate an error because of a duplicate attribute. */
910 static void
911 duplicate_attr (const char *attr, locus *where)
914 if (where == NULL)
915 where = &gfc_current_locus;
917 gfc_error ("Duplicate %s attribute specified at %L", attr, where);
921 bool
922 gfc_add_ext_attribute (symbol_attribute *attr, ext_attr_id_t ext_attr,
923 locus *where ATTRIBUTE_UNUSED)
925 attr->ext_attr |= 1 << ext_attr;
926 return true;
930 /* Called from decl.c (attr_decl1) to check attributes, when declared
931 separately. */
933 bool
934 gfc_add_attribute (symbol_attribute *attr, locus *where)
936 if (check_used (attr, NULL, where))
937 return false;
939 return check_conflict (attr, NULL, where);
943 bool
944 gfc_add_allocatable (symbol_attribute *attr, locus *where)
947 if (check_used (attr, NULL, where))
948 return false;
950 if (attr->allocatable)
952 duplicate_attr ("ALLOCATABLE", where);
953 return false;
956 if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
957 && !gfc_find_state (COMP_INTERFACE))
959 gfc_error ("ALLOCATABLE specified outside of INTERFACE body at %L",
960 where);
961 return false;
964 attr->allocatable = 1;
965 return check_conflict (attr, NULL, where);
969 bool
970 gfc_add_automatic (symbol_attribute *attr, const char *name, locus *where)
972 if (check_used (attr, name, where))
973 return false;
975 if (attr->automatic && !gfc_notify_std (GFC_STD_LEGACY,
976 "Duplicate AUTOMATIC attribute specified at %L", where))
977 return false;
979 attr->automatic = 1;
980 return check_conflict (attr, name, where);
984 bool
985 gfc_add_codimension (symbol_attribute *attr, const char *name, locus *where)
988 if (check_used (attr, name, where))
989 return false;
991 if (attr->codimension)
993 duplicate_attr ("CODIMENSION", where);
994 return false;
997 if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
998 && !gfc_find_state (COMP_INTERFACE))
1000 gfc_error ("CODIMENSION specified for %qs outside its INTERFACE body "
1001 "at %L", name, where);
1002 return false;
1005 attr->codimension = 1;
1006 return check_conflict (attr, name, where);
1010 bool
1011 gfc_add_dimension (symbol_attribute *attr, const char *name, locus *where)
1014 if (check_used (attr, name, where))
1015 return false;
1017 if (attr->dimension)
1019 duplicate_attr ("DIMENSION", where);
1020 return false;
1023 if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
1024 && !gfc_find_state (COMP_INTERFACE))
1026 gfc_error ("DIMENSION specified for %qs outside its INTERFACE body "
1027 "at %L", name, where);
1028 return false;
1031 attr->dimension = 1;
1032 return check_conflict (attr, name, where);
1036 bool
1037 gfc_add_contiguous (symbol_attribute *attr, const char *name, locus *where)
1040 if (check_used (attr, name, where))
1041 return false;
1043 attr->contiguous = 1;
1044 return check_conflict (attr, name, where);
1048 bool
1049 gfc_add_external (symbol_attribute *attr, locus *where)
1052 if (check_used (attr, NULL, where))
1053 return false;
1055 if (attr->external)
1057 duplicate_attr ("EXTERNAL", where);
1058 return false;
1061 if (attr->pointer && attr->if_source != IFSRC_IFBODY)
1063 attr->pointer = 0;
1064 attr->proc_pointer = 1;
1067 attr->external = 1;
1069 return check_conflict (attr, NULL, where);
1073 bool
1074 gfc_add_intrinsic (symbol_attribute *attr, locus *where)
1077 if (check_used (attr, NULL, where))
1078 return false;
1080 if (attr->intrinsic)
1082 duplicate_attr ("INTRINSIC", where);
1083 return false;
1086 attr->intrinsic = 1;
1088 return check_conflict (attr, NULL, where);
1092 bool
1093 gfc_add_optional (symbol_attribute *attr, locus *where)
1096 if (check_used (attr, NULL, where))
1097 return false;
1099 if (attr->optional)
1101 duplicate_attr ("OPTIONAL", where);
1102 return false;
1105 attr->optional = 1;
1106 return check_conflict (attr, NULL, where);
1110 bool
1111 gfc_add_pointer (symbol_attribute *attr, locus *where)
1114 if (check_used (attr, NULL, where))
1115 return false;
1117 if (attr->pointer && !(attr->if_source == IFSRC_IFBODY
1118 && !gfc_find_state (COMP_INTERFACE)))
1120 duplicate_attr ("POINTER", where);
1121 return false;
1124 if (attr->procedure || (attr->external && attr->if_source != IFSRC_IFBODY)
1125 || (attr->if_source == IFSRC_IFBODY
1126 && !gfc_find_state (COMP_INTERFACE)))
1127 attr->proc_pointer = 1;
1128 else
1129 attr->pointer = 1;
1131 return check_conflict (attr, NULL, where);
1135 bool
1136 gfc_add_cray_pointer (symbol_attribute *attr, locus *where)
1139 if (check_used (attr, NULL, where))
1140 return false;
1142 attr->cray_pointer = 1;
1143 return check_conflict (attr, NULL, where);
1147 bool
1148 gfc_add_cray_pointee (symbol_attribute *attr, locus *where)
1151 if (check_used (attr, NULL, where))
1152 return false;
1154 if (attr->cray_pointee)
1156 gfc_error ("Cray Pointee at %L appears in multiple pointer()"
1157 " statements", where);
1158 return false;
1161 attr->cray_pointee = 1;
1162 return check_conflict (attr, NULL, where);
1166 bool
1167 gfc_add_protected (symbol_attribute *attr, const char *name, locus *where)
1169 if (check_used (attr, name, where))
1170 return false;
1172 if (attr->is_protected)
1174 if (!gfc_notify_std (GFC_STD_LEGACY,
1175 "Duplicate PROTECTED attribute specified at %L",
1176 where))
1177 return false;
1180 attr->is_protected = 1;
1181 return check_conflict (attr, name, where);
1185 bool
1186 gfc_add_result (symbol_attribute *attr, const char *name, locus *where)
1189 if (check_used (attr, name, where))
1190 return false;
1192 attr->result = 1;
1193 return check_conflict (attr, name, where);
1197 bool
1198 gfc_add_save (symbol_attribute *attr, save_state s, const char *name,
1199 locus *where)
1202 if (check_used (attr, name, where))
1203 return false;
1205 if (s == SAVE_EXPLICIT && gfc_pure (NULL))
1207 gfc_error
1208 ("SAVE attribute at %L cannot be specified in a PURE procedure",
1209 where);
1210 return false;
1213 if (s == SAVE_EXPLICIT)
1214 gfc_unset_implicit_pure (NULL);
1216 if (s == SAVE_EXPLICIT && attr->save == SAVE_EXPLICIT)
1218 if (!gfc_notify_std (GFC_STD_LEGACY,
1219 "Duplicate SAVE attribute specified at %L",
1220 where))
1221 return false;
1224 attr->save = s;
1225 return check_conflict (attr, name, where);
1229 bool
1230 gfc_add_value (symbol_attribute *attr, const char *name, locus *where)
1233 if (check_used (attr, name, where))
1234 return false;
1236 if (attr->value)
1238 if (!gfc_notify_std (GFC_STD_LEGACY,
1239 "Duplicate VALUE attribute specified at %L",
1240 where))
1241 return false;
1244 attr->value = 1;
1245 return check_conflict (attr, name, where);
1249 bool
1250 gfc_add_volatile (symbol_attribute *attr, const char *name, locus *where)
1252 /* No check_used needed as 11.2.1 of the F2003 standard allows
1253 that the local identifier made accessible by a use statement can be
1254 given a VOLATILE attribute - unless it is a coarray (F2008, C560). */
1256 if (attr->volatile_ && attr->volatile_ns == gfc_current_ns)
1257 if (!gfc_notify_std (GFC_STD_LEGACY,
1258 "Duplicate VOLATILE attribute specified at %L",
1259 where))
1260 return false;
1262 attr->volatile_ = 1;
1263 attr->volatile_ns = gfc_current_ns;
1264 return check_conflict (attr, name, where);
1268 bool
1269 gfc_add_asynchronous (symbol_attribute *attr, const char *name, locus *where)
1271 /* No check_used needed as 11.2.1 of the F2003 standard allows
1272 that the local identifier made accessible by a use statement can be
1273 given a ASYNCHRONOUS attribute. */
1275 if (attr->asynchronous && attr->asynchronous_ns == gfc_current_ns)
1276 if (!gfc_notify_std (GFC_STD_LEGACY,
1277 "Duplicate ASYNCHRONOUS attribute specified at %L",
1278 where))
1279 return false;
1281 attr->asynchronous = 1;
1282 attr->asynchronous_ns = gfc_current_ns;
1283 return check_conflict (attr, name, where);
1287 bool
1288 gfc_add_threadprivate (symbol_attribute *attr, const char *name, locus *where)
1291 if (check_used (attr, name, where))
1292 return false;
1294 if (attr->threadprivate)
1296 duplicate_attr ("THREADPRIVATE", where);
1297 return false;
1300 attr->threadprivate = 1;
1301 return check_conflict (attr, name, where);
1305 bool
1306 gfc_add_omp_declare_target (symbol_attribute *attr, const char *name,
1307 locus *where)
1310 if (check_used (attr, name, where))
1311 return false;
1313 if (attr->omp_declare_target)
1314 return true;
1316 attr->omp_declare_target = 1;
1317 return check_conflict (attr, name, where);
1321 bool
1322 gfc_add_omp_declare_target_link (symbol_attribute *attr, const char *name,
1323 locus *where)
1326 if (check_used (attr, name, where))
1327 return false;
1329 if (attr->omp_declare_target_link)
1330 return true;
1332 attr->omp_declare_target_link = 1;
1333 return check_conflict (attr, name, where);
1337 bool
1338 gfc_add_oacc_declare_create (symbol_attribute *attr, const char *name,
1339 locus *where)
1341 if (check_used (attr, name, where))
1342 return false;
1344 if (attr->oacc_declare_create)
1345 return true;
1347 attr->oacc_declare_create = 1;
1348 return check_conflict (attr, name, where);
1352 bool
1353 gfc_add_oacc_declare_copyin (symbol_attribute *attr, const char *name,
1354 locus *where)
1356 if (check_used (attr, name, where))
1357 return false;
1359 if (attr->oacc_declare_copyin)
1360 return true;
1362 attr->oacc_declare_copyin = 1;
1363 return check_conflict (attr, name, where);
1367 bool
1368 gfc_add_oacc_declare_deviceptr (symbol_attribute *attr, const char *name,
1369 locus *where)
1371 if (check_used (attr, name, where))
1372 return false;
1374 if (attr->oacc_declare_deviceptr)
1375 return true;
1377 attr->oacc_declare_deviceptr = 1;
1378 return check_conflict (attr, name, where);
1382 bool
1383 gfc_add_oacc_declare_device_resident (symbol_attribute *attr, const char *name,
1384 locus *where)
1386 if (check_used (attr, name, where))
1387 return false;
1389 if (attr->oacc_declare_device_resident)
1390 return true;
1392 attr->oacc_declare_device_resident = 1;
1393 return check_conflict (attr, name, where);
1397 bool
1398 gfc_add_target (symbol_attribute *attr, locus *where)
1401 if (check_used (attr, NULL, where))
1402 return false;
1404 if (attr->target)
1406 duplicate_attr ("TARGET", where);
1407 return false;
1410 attr->target = 1;
1411 return check_conflict (attr, NULL, where);
1415 bool
1416 gfc_add_dummy (symbol_attribute *attr, const char *name, locus *where)
1419 if (check_used (attr, name, where))
1420 return false;
1422 /* Duplicate dummy arguments are allowed due to ENTRY statements. */
1423 attr->dummy = 1;
1424 return check_conflict (attr, name, where);
1428 bool
1429 gfc_add_in_common (symbol_attribute *attr, const char *name, locus *where)
1432 if (check_used (attr, name, where))
1433 return false;
1435 /* Duplicate attribute already checked for. */
1436 attr->in_common = 1;
1437 return check_conflict (attr, name, where);
1441 bool
1442 gfc_add_in_equivalence (symbol_attribute *attr, const char *name, locus *where)
1445 /* Duplicate attribute already checked for. */
1446 attr->in_equivalence = 1;
1447 if (!check_conflict (attr, name, where))
1448 return false;
1450 if (attr->flavor == FL_VARIABLE)
1451 return true;
1453 return gfc_add_flavor (attr, FL_VARIABLE, name, where);
1457 bool
1458 gfc_add_data (symbol_attribute *attr, const char *name, locus *where)
1461 if (check_used (attr, name, where))
1462 return false;
1464 attr->data = 1;
1465 return check_conflict (attr, name, where);
1469 bool
1470 gfc_add_in_namelist (symbol_attribute *attr, const char *name, locus *where)
1473 attr->in_namelist = 1;
1474 return check_conflict (attr, name, where);
1478 bool
1479 gfc_add_sequence (symbol_attribute *attr, const char *name, locus *where)
1482 if (check_used (attr, name, where))
1483 return false;
1485 attr->sequence = 1;
1486 return check_conflict (attr, name, where);
1490 bool
1491 gfc_add_elemental (symbol_attribute *attr, locus *where)
1494 if (check_used (attr, NULL, where))
1495 return false;
1497 if (attr->elemental)
1499 duplicate_attr ("ELEMENTAL", where);
1500 return false;
1503 attr->elemental = 1;
1504 return check_conflict (attr, NULL, where);
1508 bool
1509 gfc_add_pure (symbol_attribute *attr, locus *where)
1512 if (check_used (attr, NULL, where))
1513 return false;
1515 if (attr->pure)
1517 duplicate_attr ("PURE", where);
1518 return false;
1521 attr->pure = 1;
1522 return check_conflict (attr, NULL, where);
1526 bool
1527 gfc_add_recursive (symbol_attribute *attr, locus *where)
1530 if (check_used (attr, NULL, where))
1531 return false;
1533 if (attr->recursive)
1535 duplicate_attr ("RECURSIVE", where);
1536 return false;
1539 attr->recursive = 1;
1540 return check_conflict (attr, NULL, where);
1544 bool
1545 gfc_add_entry (symbol_attribute *attr, const char *name, locus *where)
1548 if (check_used (attr, name, where))
1549 return false;
1551 if (attr->entry)
1553 duplicate_attr ("ENTRY", where);
1554 return false;
1557 attr->entry = 1;
1558 return check_conflict (attr, name, where);
1562 bool
1563 gfc_add_function (symbol_attribute *attr, const char *name, locus *where)
1566 if (attr->flavor != FL_PROCEDURE
1567 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1568 return false;
1570 attr->function = 1;
1571 return check_conflict (attr, name, where);
1575 bool
1576 gfc_add_subroutine (symbol_attribute *attr, const char *name, locus *where)
1579 if (attr->flavor != FL_PROCEDURE
1580 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1581 return false;
1583 attr->subroutine = 1;
1584 return check_conflict (attr, name, where);
1588 bool
1589 gfc_add_generic (symbol_attribute *attr, const char *name, locus *where)
1592 if (attr->flavor != FL_PROCEDURE
1593 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1594 return false;
1596 attr->generic = 1;
1597 return check_conflict (attr, name, where);
1601 bool
1602 gfc_add_proc (symbol_attribute *attr, const char *name, locus *where)
1605 if (check_used (attr, NULL, where))
1606 return false;
1608 if (attr->flavor != FL_PROCEDURE
1609 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1610 return false;
1612 if (attr->procedure)
1614 duplicate_attr ("PROCEDURE", where);
1615 return false;
1618 attr->procedure = 1;
1620 return check_conflict (attr, NULL, where);
1624 bool
1625 gfc_add_abstract (symbol_attribute* attr, locus* where)
1627 if (attr->abstract)
1629 duplicate_attr ("ABSTRACT", where);
1630 return false;
1633 attr->abstract = 1;
1635 return check_conflict (attr, NULL, where);
1639 /* Flavors are special because some flavors are not what Fortran
1640 considers attributes and can be reaffirmed multiple times. */
1642 bool
1643 gfc_add_flavor (symbol_attribute *attr, sym_flavor f, const char *name,
1644 locus *where)
1647 if ((f == FL_PROGRAM || f == FL_BLOCK_DATA || f == FL_MODULE
1648 || f == FL_PARAMETER || f == FL_LABEL || gfc_fl_struct(f)
1649 || f == FL_NAMELIST) && check_used (attr, name, where))
1650 return false;
1652 if (attr->flavor == f && f == FL_VARIABLE)
1653 return true;
1655 /* Copying a procedure dummy argument for a module procedure in a
1656 submodule results in the flavor being copied and would result in
1657 an error without this. */
1658 if (gfc_new_block && gfc_new_block->abr_modproc_decl
1659 && attr->flavor == f && f == FL_PROCEDURE)
1660 return true;
1662 if (attr->flavor != FL_UNKNOWN)
1664 if (where == NULL)
1665 where = &gfc_current_locus;
1667 if (name)
1668 gfc_error ("%s attribute of %qs conflicts with %s attribute at %L",
1669 gfc_code2string (flavors, attr->flavor), name,
1670 gfc_code2string (flavors, f), where);
1671 else
1672 gfc_error ("%s attribute conflicts with %s attribute at %L",
1673 gfc_code2string (flavors, attr->flavor),
1674 gfc_code2string (flavors, f), where);
1676 return false;
1679 attr->flavor = f;
1681 return check_conflict (attr, name, where);
1685 bool
1686 gfc_add_procedure (symbol_attribute *attr, procedure_type t,
1687 const char *name, locus *where)
1690 if (check_used (attr, name, where))
1691 return false;
1693 if (attr->flavor != FL_PROCEDURE
1694 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1695 return false;
1697 if (where == NULL)
1698 where = &gfc_current_locus;
1700 if (attr->proc != PROC_UNKNOWN && !attr->module_procedure)
1702 if (attr->proc == PROC_ST_FUNCTION && t == PROC_INTERNAL
1703 && !gfc_notification_std (GFC_STD_F2008))
1704 gfc_error ("%s procedure at %L is already declared as %s "
1705 "procedure. \nF2008: A pointer function assignment "
1706 "is ambiguous if it is the first executable statement "
1707 "after the specification block. Please add any other "
1708 "kind of executable statement before it. FIXME",
1709 gfc_code2string (procedures, t), where,
1710 gfc_code2string (procedures, attr->proc));
1711 else
1712 gfc_error ("%s procedure at %L is already declared as %s "
1713 "procedure", gfc_code2string (procedures, t), where,
1714 gfc_code2string (procedures, attr->proc));
1716 return false;
1719 attr->proc = t;
1721 /* Statement functions are always scalar and functions. */
1722 if (t == PROC_ST_FUNCTION
1723 && ((!attr->function && !gfc_add_function (attr, name, where))
1724 || attr->dimension))
1725 return false;
1727 return check_conflict (attr, name, where);
1731 bool
1732 gfc_add_intent (symbol_attribute *attr, sym_intent intent, locus *where)
1735 if (check_used (attr, NULL, where))
1736 return false;
1738 if (attr->intent == INTENT_UNKNOWN)
1740 attr->intent = intent;
1741 return check_conflict (attr, NULL, where);
1744 if (where == NULL)
1745 where = &gfc_current_locus;
1747 gfc_error ("INTENT (%s) conflicts with INTENT(%s) at %L",
1748 gfc_intent_string (attr->intent),
1749 gfc_intent_string (intent), where);
1751 return false;
1755 /* No checks for use-association in public and private statements. */
1757 bool
1758 gfc_add_access (symbol_attribute *attr, gfc_access access,
1759 const char *name, locus *where)
1762 if (attr->access == ACCESS_UNKNOWN
1763 || (attr->use_assoc && attr->access != ACCESS_PRIVATE))
1765 attr->access = access;
1766 return check_conflict (attr, name, where);
1769 if (where == NULL)
1770 where = &gfc_current_locus;
1771 gfc_error ("ACCESS specification at %L was already specified", where);
1773 return false;
1777 /* Set the is_bind_c field for the given symbol_attribute. */
1779 bool
1780 gfc_add_is_bind_c (symbol_attribute *attr, const char *name, locus *where,
1781 int is_proc_lang_bind_spec)
1784 if (is_proc_lang_bind_spec == 0 && attr->flavor == FL_PROCEDURE)
1785 gfc_error_now ("BIND(C) attribute at %L can only be used for "
1786 "variables or common blocks", where);
1787 else if (attr->is_bind_c)
1788 gfc_error_now ("Duplicate BIND attribute specified at %L", where);
1789 else
1790 attr->is_bind_c = 1;
1792 if (where == NULL)
1793 where = &gfc_current_locus;
1795 if (!gfc_notify_std (GFC_STD_F2003, "BIND(C) at %L", where))
1796 return false;
1798 return check_conflict (attr, name, where);
1802 /* Set the extension field for the given symbol_attribute. */
1804 bool
1805 gfc_add_extension (symbol_attribute *attr, locus *where)
1807 if (where == NULL)
1808 where = &gfc_current_locus;
1810 if (attr->extension)
1811 gfc_error_now ("Duplicate EXTENDS attribute specified at %L", where);
1812 else
1813 attr->extension = 1;
1815 if (!gfc_notify_std (GFC_STD_F2003, "EXTENDS at %L", where))
1816 return false;
1818 return true;
1822 bool
1823 gfc_add_explicit_interface (gfc_symbol *sym, ifsrc source,
1824 gfc_formal_arglist * formal, locus *where)
1826 if (check_used (&sym->attr, sym->name, where))
1827 return false;
1829 /* Skip the following checks in the case of a module_procedures in a
1830 submodule since they will manifestly fail. */
1831 if (sym->attr.module_procedure == 1
1832 && source == IFSRC_DECL)
1833 goto finish;
1835 if (where == NULL)
1836 where = &gfc_current_locus;
1838 if (sym->attr.if_source != IFSRC_UNKNOWN
1839 && sym->attr.if_source != IFSRC_DECL)
1841 gfc_error ("Symbol %qs at %L already has an explicit interface",
1842 sym->name, where);
1843 return false;
1846 if (source == IFSRC_IFBODY && (sym->attr.dimension || sym->attr.allocatable))
1848 gfc_error ("%qs at %L has attributes specified outside its INTERFACE "
1849 "body", sym->name, where);
1850 return false;
1853 finish:
1854 sym->formal = formal;
1855 sym->attr.if_source = source;
1857 return true;
1861 /* Add a type to a symbol. */
1863 bool
1864 gfc_add_type (gfc_symbol *sym, gfc_typespec *ts, locus *where)
1866 sym_flavor flavor;
1867 bt type;
1869 if (where == NULL)
1870 where = &gfc_current_locus;
1872 if (sym->result)
1873 type = sym->result->ts.type;
1874 else
1875 type = sym->ts.type;
1877 if (sym->attr.result && type == BT_UNKNOWN && sym->ns->proc_name)
1878 type = sym->ns->proc_name->ts.type;
1880 if (type != BT_UNKNOWN && !(sym->attr.function && sym->attr.implicit_type)
1881 && !(gfc_state_stack->previous && gfc_state_stack->previous->previous
1882 && gfc_state_stack->previous->previous->state == COMP_SUBMODULE)
1883 && !sym->attr.module_procedure)
1885 if (sym->attr.use_assoc)
1886 gfc_error ("Symbol %qs at %L conflicts with symbol from module %qs, "
1887 "use-associated at %L", sym->name, where, sym->module,
1888 &sym->declared_at);
1889 else
1890 gfc_error ("Symbol %qs at %L already has basic type of %s", sym->name,
1891 where, gfc_basic_typename (type));
1892 return false;
1895 if (sym->attr.procedure && sym->ts.interface)
1897 gfc_error ("Procedure %qs at %L may not have basic type of %s",
1898 sym->name, where, gfc_basic_typename (ts->type));
1899 return false;
1902 flavor = sym->attr.flavor;
1904 if (flavor == FL_PROGRAM || flavor == FL_BLOCK_DATA || flavor == FL_MODULE
1905 || flavor == FL_LABEL
1906 || (flavor == FL_PROCEDURE && sym->attr.subroutine)
1907 || flavor == FL_DERIVED || flavor == FL_NAMELIST)
1909 gfc_error ("Symbol %qs at %L cannot have a type", sym->name, where);
1910 return false;
1913 sym->ts = *ts;
1914 return true;
1918 /* Clears all attributes. */
1920 void
1921 gfc_clear_attr (symbol_attribute *attr)
1923 memset (attr, 0, sizeof (symbol_attribute));
1927 /* Check for missing attributes in the new symbol. Currently does
1928 nothing, but it's not clear that it is unnecessary yet. */
1930 bool
1931 gfc_missing_attr (symbol_attribute *attr ATTRIBUTE_UNUSED,
1932 locus *where ATTRIBUTE_UNUSED)
1935 return true;
1939 /* Copy an attribute to a symbol attribute, bit by bit. Some
1940 attributes have a lot of side-effects but cannot be present given
1941 where we are called from, so we ignore some bits. */
1943 bool
1944 gfc_copy_attr (symbol_attribute *dest, symbol_attribute *src, locus *where)
1946 int is_proc_lang_bind_spec;
1948 /* In line with the other attributes, we only add bits but do not remove
1949 them; cf. also PR 41034. */
1950 dest->ext_attr |= src->ext_attr;
1952 if (src->allocatable && !gfc_add_allocatable (dest, where))
1953 goto fail;
1955 if (src->automatic && !gfc_add_automatic (dest, NULL, where))
1956 goto fail;
1957 if (src->dimension && !gfc_add_dimension (dest, NULL, where))
1958 goto fail;
1959 if (src->codimension && !gfc_add_codimension (dest, NULL, where))
1960 goto fail;
1961 if (src->contiguous && !gfc_add_contiguous (dest, NULL, where))
1962 goto fail;
1963 if (src->optional && !gfc_add_optional (dest, where))
1964 goto fail;
1965 if (src->pointer && !gfc_add_pointer (dest, where))
1966 goto fail;
1967 if (src->is_protected && !gfc_add_protected (dest, NULL, where))
1968 goto fail;
1969 if (src->save && !gfc_add_save (dest, src->save, NULL, where))
1970 goto fail;
1971 if (src->value && !gfc_add_value (dest, NULL, where))
1972 goto fail;
1973 if (src->volatile_ && !gfc_add_volatile (dest, NULL, where))
1974 goto fail;
1975 if (src->asynchronous && !gfc_add_asynchronous (dest, NULL, where))
1976 goto fail;
1977 if (src->threadprivate
1978 && !gfc_add_threadprivate (dest, NULL, where))
1979 goto fail;
1980 if (src->omp_declare_target
1981 && !gfc_add_omp_declare_target (dest, NULL, where))
1982 goto fail;
1983 if (src->omp_declare_target_link
1984 && !gfc_add_omp_declare_target_link (dest, NULL, where))
1985 goto fail;
1986 if (src->oacc_declare_create
1987 && !gfc_add_oacc_declare_create (dest, NULL, where))
1988 goto fail;
1989 if (src->oacc_declare_copyin
1990 && !gfc_add_oacc_declare_copyin (dest, NULL, where))
1991 goto fail;
1992 if (src->oacc_declare_deviceptr
1993 && !gfc_add_oacc_declare_deviceptr (dest, NULL, where))
1994 goto fail;
1995 if (src->oacc_declare_device_resident
1996 && !gfc_add_oacc_declare_device_resident (dest, NULL, where))
1997 goto fail;
1998 if (src->target && !gfc_add_target (dest, where))
1999 goto fail;
2000 if (src->dummy && !gfc_add_dummy (dest, NULL, where))
2001 goto fail;
2002 if (src->result && !gfc_add_result (dest, NULL, where))
2003 goto fail;
2004 if (src->entry)
2005 dest->entry = 1;
2007 if (src->in_namelist && !gfc_add_in_namelist (dest, NULL, where))
2008 goto fail;
2010 if (src->in_common && !gfc_add_in_common (dest, NULL, where))
2011 goto fail;
2013 if (src->generic && !gfc_add_generic (dest, NULL, where))
2014 goto fail;
2015 if (src->function && !gfc_add_function (dest, NULL, where))
2016 goto fail;
2017 if (src->subroutine && !gfc_add_subroutine (dest, NULL, where))
2018 goto fail;
2020 if (src->sequence && !gfc_add_sequence (dest, NULL, where))
2021 goto fail;
2022 if (src->elemental && !gfc_add_elemental (dest, where))
2023 goto fail;
2024 if (src->pure && !gfc_add_pure (dest, where))
2025 goto fail;
2026 if (src->recursive && !gfc_add_recursive (dest, where))
2027 goto fail;
2029 if (src->flavor != FL_UNKNOWN
2030 && !gfc_add_flavor (dest, src->flavor, NULL, where))
2031 goto fail;
2033 if (src->intent != INTENT_UNKNOWN
2034 && !gfc_add_intent (dest, src->intent, where))
2035 goto fail;
2037 if (src->access != ACCESS_UNKNOWN
2038 && !gfc_add_access (dest, src->access, NULL, where))
2039 goto fail;
2041 if (!gfc_missing_attr (dest, where))
2042 goto fail;
2044 if (src->cray_pointer && !gfc_add_cray_pointer (dest, where))
2045 goto fail;
2046 if (src->cray_pointee && !gfc_add_cray_pointee (dest, where))
2047 goto fail;
2049 is_proc_lang_bind_spec = (src->flavor == FL_PROCEDURE ? 1 : 0);
2050 if (src->is_bind_c
2051 && !gfc_add_is_bind_c (dest, NULL, where, is_proc_lang_bind_spec))
2052 return false;
2054 if (src->is_c_interop)
2055 dest->is_c_interop = 1;
2056 if (src->is_iso_c)
2057 dest->is_iso_c = 1;
2059 if (src->external && !gfc_add_external (dest, where))
2060 goto fail;
2061 if (src->intrinsic && !gfc_add_intrinsic (dest, where))
2062 goto fail;
2063 if (src->proc_pointer)
2064 dest->proc_pointer = 1;
2066 return true;
2068 fail:
2069 return false;
2073 /* A function to generate a dummy argument symbol using that from the
2074 interface declaration. Can be used for the result symbol as well if
2075 the flag is set. */
2078 gfc_copy_dummy_sym (gfc_symbol **dsym, gfc_symbol *sym, int result)
2080 int rc;
2082 rc = gfc_get_symbol (sym->name, NULL, dsym);
2083 if (rc)
2084 return rc;
2086 if (!gfc_add_type (*dsym, &(sym->ts), &gfc_current_locus))
2087 return 1;
2089 if (!gfc_copy_attr (&(*dsym)->attr, &(sym->attr),
2090 &gfc_current_locus))
2091 return 1;
2093 if ((*dsym)->attr.dimension)
2094 (*dsym)->as = gfc_copy_array_spec (sym->as);
2096 (*dsym)->attr.class_ok = sym->attr.class_ok;
2098 if ((*dsym) != NULL && !result
2099 && (!gfc_add_dummy(&(*dsym)->attr, (*dsym)->name, NULL)
2100 || !gfc_missing_attr (&(*dsym)->attr, NULL)))
2101 return 1;
2102 else if ((*dsym) != NULL && result
2103 && (!gfc_add_result(&(*dsym)->attr, (*dsym)->name, NULL)
2104 || !gfc_missing_attr (&(*dsym)->attr, NULL)))
2105 return 1;
2107 return 0;
2111 /************** Component name management ************/
2113 /* Component names of a derived type form their own little namespaces
2114 that are separate from all other spaces. The space is composed of
2115 a singly linked list of gfc_component structures whose head is
2116 located in the parent symbol. */
2119 /* Add a component name to a symbol. The call fails if the name is
2120 already present. On success, the component pointer is modified to
2121 point to the additional component structure. */
2123 bool
2124 gfc_add_component (gfc_symbol *sym, const char *name,
2125 gfc_component **component)
2127 gfc_component *p, *tail;
2129 /* Check for existing components with the same name, but not for union
2130 components or containers. Unions and maps are anonymous so they have
2131 unique internal names which will never conflict.
2132 Don't use gfc_find_component here because it calls gfc_use_derived,
2133 but the derived type may not be fully defined yet. */
2134 tail = NULL;
2136 for (p = sym->components; p; p = p->next)
2138 if (strcmp (p->name, name) == 0)
2140 gfc_error ("Component %qs at %C already declared at %L",
2141 name, &p->loc);
2142 return false;
2145 tail = p;
2148 if (sym->attr.extension
2149 && gfc_find_component (sym->components->ts.u.derived,
2150 name, true, true, NULL))
2152 gfc_error ("Component %qs at %C already in the parent type "
2153 "at %L", name, &sym->components->ts.u.derived->declared_at);
2154 return false;
2157 /* Allocate a new component. */
2158 p = gfc_get_component ();
2160 if (tail == NULL)
2161 sym->components = p;
2162 else
2163 tail->next = p;
2165 p->name = gfc_get_string ("%s", name);
2166 p->loc = gfc_current_locus;
2167 p->ts.type = BT_UNKNOWN;
2169 *component = p;
2170 return true;
2174 /* Recursive function to switch derived types of all symbol in a
2175 namespace. */
2177 static void
2178 switch_types (gfc_symtree *st, gfc_symbol *from, gfc_symbol *to)
2180 gfc_symbol *sym;
2182 if (st == NULL)
2183 return;
2185 sym = st->n.sym;
2186 if (sym->ts.type == BT_DERIVED && sym->ts.u.derived == from)
2187 sym->ts.u.derived = to;
2189 switch_types (st->left, from, to);
2190 switch_types (st->right, from, to);
2194 /* This subroutine is called when a derived type is used in order to
2195 make the final determination about which version to use. The
2196 standard requires that a type be defined before it is 'used', but
2197 such types can appear in IMPLICIT statements before the actual
2198 definition. 'Using' in this context means declaring a variable to
2199 be that type or using the type constructor.
2201 If a type is used and the components haven't been defined, then we
2202 have to have a derived type in a parent unit. We find the node in
2203 the other namespace and point the symtree node in this namespace to
2204 that node. Further reference to this name point to the correct
2205 node. If we can't find the node in a parent namespace, then we have
2206 an error.
2208 This subroutine takes a pointer to a symbol node and returns a
2209 pointer to the translated node or NULL for an error. Usually there
2210 is no translation and we return the node we were passed. */
2212 gfc_symbol *
2213 gfc_use_derived (gfc_symbol *sym)
2215 gfc_symbol *s;
2216 gfc_typespec *t;
2217 gfc_symtree *st;
2218 int i;
2220 if (!sym)
2221 return NULL;
2223 if (sym->attr.unlimited_polymorphic)
2224 return sym;
2226 if (sym->attr.generic)
2227 sym = gfc_find_dt_in_generic (sym);
2229 if (sym->components != NULL || sym->attr.zero_comp)
2230 return sym; /* Already defined. */
2232 if (sym->ns->parent == NULL)
2233 goto bad;
2235 if (gfc_find_symbol (sym->name, sym->ns->parent, 1, &s))
2237 gfc_error ("Symbol %qs at %C is ambiguous", sym->name);
2238 return NULL;
2241 if (s == NULL || !gfc_fl_struct (s->attr.flavor))
2242 goto bad;
2244 /* Get rid of symbol sym, translating all references to s. */
2245 for (i = 0; i < GFC_LETTERS; i++)
2247 t = &sym->ns->default_type[i];
2248 if (t->u.derived == sym)
2249 t->u.derived = s;
2252 st = gfc_find_symtree (sym->ns->sym_root, sym->name);
2253 st->n.sym = s;
2255 s->refs++;
2257 /* Unlink from list of modified symbols. */
2258 gfc_commit_symbol (sym);
2260 switch_types (sym->ns->sym_root, sym, s);
2262 /* TODO: Also have to replace sym -> s in other lists like
2263 namelists, common lists and interface lists. */
2264 gfc_free_symbol (sym);
2266 return s;
2268 bad:
2269 gfc_error ("Derived type %qs at %C is being used before it is defined",
2270 sym->name);
2271 return NULL;
2275 /* Find the component with the given name in the union type symbol.
2276 If ref is not NULL it will be set to the chain of components through which
2277 the component can actually be accessed. This is necessary for unions because
2278 intermediate structures may be maps, nested structures, or other unions,
2279 all of which may (or must) be 'anonymous' to user code. */
2281 static gfc_component *
2282 find_union_component (gfc_symbol *un, const char *name,
2283 bool noaccess, gfc_ref **ref)
2285 gfc_component *m, *check;
2286 gfc_ref *sref, *tmp;
2288 for (m = un->components; m; m = m->next)
2290 check = gfc_find_component (m->ts.u.derived, name, noaccess, true, &tmp);
2291 if (check == NULL)
2292 continue;
2294 /* Found component somewhere in m; chain the refs together. */
2295 if (ref)
2297 /* Map ref. */
2298 sref = gfc_get_ref ();
2299 sref->type = REF_COMPONENT;
2300 sref->u.c.component = m;
2301 sref->u.c.sym = m->ts.u.derived;
2302 sref->next = tmp;
2304 *ref = sref;
2306 /* Other checks (such as access) were done in the recursive calls. */
2307 return check;
2309 return NULL;
2313 /* Given a derived type node and a component name, try to locate the
2314 component structure. Returns the NULL pointer if the component is
2315 not found or the components are private. If noaccess is set, no access
2316 checks are done. If silent is set, an error will not be generated if
2317 the component cannot be found or accessed.
2319 If ref is not NULL, *ref is set to represent the chain of components
2320 required to get to the ultimate component.
2322 If the component is simply a direct subcomponent, or is inherited from a
2323 parent derived type in the given derived type, this is a single ref with its
2324 component set to the returned component.
2326 Otherwise, *ref is constructed as a chain of subcomponents. This occurs
2327 when the component is found through an implicit chain of nested union and
2328 map components. Unions and maps are "anonymous" substructures in FORTRAN
2329 which cannot be explicitly referenced, but the reference chain must be
2330 considered as in C for backend translation to correctly compute layouts.
2331 (For example, x.a may refer to x->(UNION)->(MAP)->(UNION)->(MAP)->a). */
2333 gfc_component *
2334 gfc_find_component (gfc_symbol *sym, const char *name,
2335 bool noaccess, bool silent, gfc_ref **ref)
2337 gfc_component *p, *check;
2338 gfc_ref *sref = NULL, *tmp = NULL;
2340 if (name == NULL || sym == NULL)
2341 return NULL;
2343 if (sym->attr.flavor == FL_DERIVED)
2344 sym = gfc_use_derived (sym);
2345 else
2346 gcc_assert (gfc_fl_struct (sym->attr.flavor));
2348 if (sym == NULL)
2349 return NULL;
2351 /* Handle UNIONs specially - mutually recursive with gfc_find_component. */
2352 if (sym->attr.flavor == FL_UNION)
2353 return find_union_component (sym, name, noaccess, ref);
2355 if (ref) *ref = NULL;
2356 for (p = sym->components; p; p = p->next)
2358 /* Nest search into union's maps. */
2359 if (p->ts.type == BT_UNION)
2361 check = find_union_component (p->ts.u.derived, name, noaccess, &tmp);
2362 if (check != NULL)
2364 /* Union ref. */
2365 if (ref)
2367 sref = gfc_get_ref ();
2368 sref->type = REF_COMPONENT;
2369 sref->u.c.component = p;
2370 sref->u.c.sym = p->ts.u.derived;
2371 sref->next = tmp;
2372 *ref = sref;
2374 return check;
2377 else if (strcmp (p->name, name) == 0)
2378 break;
2380 continue;
2383 if (p && sym->attr.use_assoc && !noaccess)
2385 bool is_parent_comp = sym->attr.extension && (p == sym->components);
2386 if (p->attr.access == ACCESS_PRIVATE ||
2387 (p->attr.access != ACCESS_PUBLIC
2388 && sym->component_access == ACCESS_PRIVATE
2389 && !is_parent_comp))
2391 if (!silent)
2392 gfc_error ("Component %qs at %C is a PRIVATE component of %qs",
2393 name, sym->name);
2394 return NULL;
2398 if (p == NULL
2399 && sym->attr.extension
2400 && sym->components->ts.type == BT_DERIVED)
2402 p = gfc_find_component (sym->components->ts.u.derived, name,
2403 noaccess, silent, ref);
2404 /* Do not overwrite the error. */
2405 if (p == NULL)
2406 return p;
2409 if (p == NULL && !silent)
2410 gfc_error ("%qs at %C is not a member of the %qs structure",
2411 name, sym->name);
2413 /* Component was found; build the ultimate component reference. */
2414 if (p != NULL && ref)
2416 tmp = gfc_get_ref ();
2417 tmp->type = REF_COMPONENT;
2418 tmp->u.c.component = p;
2419 tmp->u.c.sym = sym;
2420 /* Link the final component ref to the end of the chain of subrefs. */
2421 if (sref)
2423 *ref = sref;
2424 for (; sref->next; sref = sref->next)
2426 sref->next = tmp;
2428 else
2429 *ref = tmp;
2432 return p;
2436 /* Given a symbol, free all of the component structures and everything
2437 they point to. */
2439 static void
2440 free_components (gfc_component *p)
2442 gfc_component *q;
2444 for (; p; p = q)
2446 q = p->next;
2448 gfc_free_array_spec (p->as);
2449 gfc_free_expr (p->initializer);
2450 free (p->tb);
2452 free (p);
2457 /******************** Statement label management ********************/
2459 /* Comparison function for statement labels, used for managing the
2460 binary tree. */
2462 static int
2463 compare_st_labels (void *a1, void *b1)
2465 int a = ((gfc_st_label *) a1)->value;
2466 int b = ((gfc_st_label *) b1)->value;
2468 return (b - a);
2472 /* Free a single gfc_st_label structure, making sure the tree is not
2473 messed up. This function is called only when some parse error
2474 occurs. */
2476 void
2477 gfc_free_st_label (gfc_st_label *label)
2480 if (label == NULL)
2481 return;
2483 gfc_delete_bbt (&label->ns->st_labels, label, compare_st_labels);
2485 if (label->format != NULL)
2486 gfc_free_expr (label->format);
2488 free (label);
2492 /* Free a whole tree of gfc_st_label structures. */
2494 static void
2495 free_st_labels (gfc_st_label *label)
2498 if (label == NULL)
2499 return;
2501 free_st_labels (label->left);
2502 free_st_labels (label->right);
2504 if (label->format != NULL)
2505 gfc_free_expr (label->format);
2506 free (label);
2510 /* Given a label number, search for and return a pointer to the label
2511 structure, creating it if it does not exist. */
2513 gfc_st_label *
2514 gfc_get_st_label (int labelno)
2516 gfc_st_label *lp;
2517 gfc_namespace *ns;
2519 if (gfc_current_state () == COMP_DERIVED)
2520 ns = gfc_current_block ()->f2k_derived;
2521 else
2523 /* Find the namespace of the scoping unit:
2524 If we're in a BLOCK construct, jump to the parent namespace. */
2525 ns = gfc_current_ns;
2526 while (ns->proc_name && ns->proc_name->attr.flavor == FL_LABEL)
2527 ns = ns->parent;
2530 /* First see if the label is already in this namespace. */
2531 lp = ns->st_labels;
2532 while (lp)
2534 if (lp->value == labelno)
2535 return lp;
2537 if (lp->value < labelno)
2538 lp = lp->left;
2539 else
2540 lp = lp->right;
2543 lp = XCNEW (gfc_st_label);
2545 lp->value = labelno;
2546 lp->defined = ST_LABEL_UNKNOWN;
2547 lp->referenced = ST_LABEL_UNKNOWN;
2548 lp->ns = ns;
2550 gfc_insert_bbt (&ns->st_labels, lp, compare_st_labels);
2552 return lp;
2556 /* Called when a statement with a statement label is about to be
2557 accepted. We add the label to the list of the current namespace,
2558 making sure it hasn't been defined previously and referenced
2559 correctly. */
2561 void
2562 gfc_define_st_label (gfc_st_label *lp, gfc_sl_type type, locus *label_locus)
2564 int labelno;
2566 labelno = lp->value;
2568 if (lp->defined != ST_LABEL_UNKNOWN)
2569 gfc_error ("Duplicate statement label %d at %L and %L", labelno,
2570 &lp->where, label_locus);
2571 else
2573 lp->where = *label_locus;
2575 switch (type)
2577 case ST_LABEL_FORMAT:
2578 if (lp->referenced == ST_LABEL_TARGET
2579 || lp->referenced == ST_LABEL_DO_TARGET)
2580 gfc_error ("Label %d at %C already referenced as branch target",
2581 labelno);
2582 else
2583 lp->defined = ST_LABEL_FORMAT;
2585 break;
2587 case ST_LABEL_TARGET:
2588 case ST_LABEL_DO_TARGET:
2589 if (lp->referenced == ST_LABEL_FORMAT)
2590 gfc_error ("Label %d at %C already referenced as a format label",
2591 labelno);
2592 else
2593 lp->defined = type;
2595 if (lp->referenced == ST_LABEL_DO_TARGET && type != ST_LABEL_DO_TARGET
2596 && !gfc_notify_std (GFC_STD_F95_OBS, "DO termination statement "
2597 "which is not END DO or CONTINUE with "
2598 "label %d at %C", labelno))
2599 return;
2600 break;
2602 default:
2603 lp->defined = ST_LABEL_BAD_TARGET;
2604 lp->referenced = ST_LABEL_BAD_TARGET;
2610 /* Reference a label. Given a label and its type, see if that
2611 reference is consistent with what is known about that label,
2612 updating the unknown state. Returns false if something goes
2613 wrong. */
2615 bool
2616 gfc_reference_st_label (gfc_st_label *lp, gfc_sl_type type)
2618 gfc_sl_type label_type;
2619 int labelno;
2620 bool rc;
2622 if (lp == NULL)
2623 return true;
2625 labelno = lp->value;
2627 if (lp->defined != ST_LABEL_UNKNOWN)
2628 label_type = lp->defined;
2629 else
2631 label_type = lp->referenced;
2632 lp->where = gfc_current_locus;
2635 if (label_type == ST_LABEL_FORMAT
2636 && (type == ST_LABEL_TARGET || type == ST_LABEL_DO_TARGET))
2638 gfc_error ("Label %d at %C previously used as a FORMAT label", labelno);
2639 rc = false;
2640 goto done;
2643 if ((label_type == ST_LABEL_TARGET || label_type == ST_LABEL_DO_TARGET
2644 || label_type == ST_LABEL_BAD_TARGET)
2645 && type == ST_LABEL_FORMAT)
2647 gfc_error ("Label %d at %C previously used as branch target", labelno);
2648 rc = false;
2649 goto done;
2652 if (lp->referenced == ST_LABEL_DO_TARGET && type == ST_LABEL_DO_TARGET
2653 && !gfc_notify_std (GFC_STD_F95_OBS, "Shared DO termination label %d "
2654 "at %C", labelno))
2655 return false;
2657 if (lp->referenced != ST_LABEL_DO_TARGET)
2658 lp->referenced = type;
2659 rc = true;
2661 done:
2662 return rc;
2666 /************** Symbol table management subroutines ****************/
2668 /* Basic details: Fortran 95 requires a potentially unlimited number
2669 of distinct namespaces when compiling a program unit. This case
2670 occurs during a compilation of internal subprograms because all of
2671 the internal subprograms must be read before we can start
2672 generating code for the host.
2674 Given the tricky nature of the Fortran grammar, we must be able to
2675 undo changes made to a symbol table if the current interpretation
2676 of a statement is found to be incorrect. Whenever a symbol is
2677 looked up, we make a copy of it and link to it. All of these
2678 symbols are kept in a vector so that we can commit or
2679 undo the changes at a later time.
2681 A symtree may point to a symbol node outside of its namespace. In
2682 this case, that symbol has been used as a host associated variable
2683 at some previous time. */
2685 /* Allocate a new namespace structure. Copies the implicit types from
2686 PARENT if PARENT_TYPES is set. */
2688 gfc_namespace *
2689 gfc_get_namespace (gfc_namespace *parent, int parent_types)
2691 gfc_namespace *ns;
2692 gfc_typespec *ts;
2693 int in;
2694 int i;
2696 ns = XCNEW (gfc_namespace);
2697 ns->sym_root = NULL;
2698 ns->uop_root = NULL;
2699 ns->tb_sym_root = NULL;
2700 ns->finalizers = NULL;
2701 ns->default_access = ACCESS_UNKNOWN;
2702 ns->parent = parent;
2704 for (in = GFC_INTRINSIC_BEGIN; in != GFC_INTRINSIC_END; in++)
2706 ns->operator_access[in] = ACCESS_UNKNOWN;
2707 ns->tb_op[in] = NULL;
2710 /* Initialize default implicit types. */
2711 for (i = 'a'; i <= 'z'; i++)
2713 ns->set_flag[i - 'a'] = 0;
2714 ts = &ns->default_type[i - 'a'];
2716 if (parent_types && ns->parent != NULL)
2718 /* Copy parent settings. */
2719 *ts = ns->parent->default_type[i - 'a'];
2720 continue;
2723 if (flag_implicit_none != 0)
2725 gfc_clear_ts (ts);
2726 continue;
2729 if ('i' <= i && i <= 'n')
2731 ts->type = BT_INTEGER;
2732 ts->kind = gfc_default_integer_kind;
2734 else
2736 ts->type = BT_REAL;
2737 ts->kind = gfc_default_real_kind;
2741 if (parent_types && ns->parent != NULL)
2742 ns->has_implicit_none_export = ns->parent->has_implicit_none_export;
2744 ns->refs = 1;
2746 return ns;
2750 /* Comparison function for symtree nodes. */
2752 static int
2753 compare_symtree (void *_st1, void *_st2)
2755 gfc_symtree *st1, *st2;
2757 st1 = (gfc_symtree *) _st1;
2758 st2 = (gfc_symtree *) _st2;
2760 return strcmp (st1->name, st2->name);
2764 /* Allocate a new symtree node and associate it with the new symbol. */
2766 gfc_symtree *
2767 gfc_new_symtree (gfc_symtree **root, const char *name)
2769 gfc_symtree *st;
2771 st = XCNEW (gfc_symtree);
2772 st->name = gfc_get_string ("%s", name);
2774 gfc_insert_bbt (root, st, compare_symtree);
2775 return st;
2779 /* Delete a symbol from the tree. Does not free the symbol itself! */
2781 void
2782 gfc_delete_symtree (gfc_symtree **root, const char *name)
2784 gfc_symtree st, *st0;
2785 const char *p;
2787 /* Submodules are marked as mod.submod. When freeing a submodule
2788 symbol, the symtree only has "submod", so adjust that here. */
2790 p = strrchr(name, '.');
2791 if (p)
2792 p++;
2793 else
2794 p = name;
2796 st0 = gfc_find_symtree (*root, p);
2798 st.name = gfc_get_string ("%s", p);
2799 gfc_delete_bbt (root, &st, compare_symtree);
2801 free (st0);
2805 /* Given a root symtree node and a name, try to find the symbol within
2806 the namespace. Returns NULL if the symbol is not found. */
2808 gfc_symtree *
2809 gfc_find_symtree (gfc_symtree *st, const char *name)
2811 int c;
2813 while (st != NULL)
2815 c = strcmp (name, st->name);
2816 if (c == 0)
2817 return st;
2819 st = (c < 0) ? st->left : st->right;
2822 return NULL;
2826 /* Return a symtree node with a name that is guaranteed to be unique
2827 within the namespace and corresponds to an illegal fortran name. */
2829 gfc_symtree *
2830 gfc_get_unique_symtree (gfc_namespace *ns)
2832 char name[GFC_MAX_SYMBOL_LEN + 1];
2833 static int serial = 0;
2835 sprintf (name, "@%d", serial++);
2836 return gfc_new_symtree (&ns->sym_root, name);
2840 /* Given a name find a user operator node, creating it if it doesn't
2841 exist. These are much simpler than symbols because they can't be
2842 ambiguous with one another. */
2844 gfc_user_op *
2845 gfc_get_uop (const char *name)
2847 gfc_user_op *uop;
2848 gfc_symtree *st;
2849 gfc_namespace *ns = gfc_current_ns;
2851 if (ns->omp_udr_ns)
2852 ns = ns->parent;
2853 st = gfc_find_symtree (ns->uop_root, name);
2854 if (st != NULL)
2855 return st->n.uop;
2857 st = gfc_new_symtree (&ns->uop_root, name);
2859 uop = st->n.uop = XCNEW (gfc_user_op);
2860 uop->name = gfc_get_string ("%s", name);
2861 uop->access = ACCESS_UNKNOWN;
2862 uop->ns = ns;
2864 return uop;
2868 /* Given a name find the user operator node. Returns NULL if it does
2869 not exist. */
2871 gfc_user_op *
2872 gfc_find_uop (const char *name, gfc_namespace *ns)
2874 gfc_symtree *st;
2876 if (ns == NULL)
2877 ns = gfc_current_ns;
2879 st = gfc_find_symtree (ns->uop_root, name);
2880 return (st == NULL) ? NULL : st->n.uop;
2884 /* Update a symbol's common_block field, and take care of the associated
2885 memory management. */
2887 static void
2888 set_symbol_common_block (gfc_symbol *sym, gfc_common_head *common_block)
2890 if (sym->common_block == common_block)
2891 return;
2893 if (sym->common_block && sym->common_block->name[0] != '\0')
2895 sym->common_block->refs--;
2896 if (sym->common_block->refs == 0)
2897 free (sym->common_block);
2899 sym->common_block = common_block;
2903 /* Remove a gfc_symbol structure and everything it points to. */
2905 void
2906 gfc_free_symbol (gfc_symbol *sym)
2909 if (sym == NULL)
2910 return;
2912 gfc_free_array_spec (sym->as);
2914 free_components (sym->components);
2916 gfc_free_expr (sym->value);
2918 gfc_free_namelist (sym->namelist);
2920 if (sym->ns != sym->formal_ns)
2921 gfc_free_namespace (sym->formal_ns);
2923 if (!sym->attr.generic_copy)
2924 gfc_free_interface (sym->generic);
2926 gfc_free_formal_arglist (sym->formal);
2928 gfc_free_namespace (sym->f2k_derived);
2930 set_symbol_common_block (sym, NULL);
2932 free (sym);
2936 /* Decrease the reference counter and free memory when we reach zero. */
2938 void
2939 gfc_release_symbol (gfc_symbol *sym)
2941 if (sym == NULL)
2942 return;
2944 if (sym->formal_ns != NULL && sym->refs == 2 && sym->formal_ns != sym->ns
2945 && (!sym->attr.entry || !sym->module))
2947 /* As formal_ns contains a reference to sym, delete formal_ns just
2948 before the deletion of sym. */
2949 gfc_namespace *ns = sym->formal_ns;
2950 sym->formal_ns = NULL;
2951 gfc_free_namespace (ns);
2954 sym->refs--;
2955 if (sym->refs > 0)
2956 return;
2958 gcc_assert (sym->refs == 0);
2959 gfc_free_symbol (sym);
2963 /* Allocate and initialize a new symbol node. */
2965 gfc_symbol *
2966 gfc_new_symbol (const char *name, gfc_namespace *ns)
2968 gfc_symbol *p;
2970 p = XCNEW (gfc_symbol);
2972 gfc_clear_ts (&p->ts);
2973 gfc_clear_attr (&p->attr);
2974 p->ns = ns;
2976 p->declared_at = gfc_current_locus;
2978 if (strlen (name) > GFC_MAX_SYMBOL_LEN)
2979 gfc_internal_error ("new_symbol(): Symbol name too long");
2981 p->name = gfc_get_string ("%s", name);
2983 /* Make sure flags for symbol being C bound are clear initially. */
2984 p->attr.is_bind_c = 0;
2985 p->attr.is_iso_c = 0;
2987 /* Clear the ptrs we may need. */
2988 p->common_block = NULL;
2989 p->f2k_derived = NULL;
2990 p->assoc = NULL;
2991 p->fn_result_spec = 0;
2993 return p;
2997 /* Generate an error if a symbol is ambiguous. */
2999 static void
3000 ambiguous_symbol (const char *name, gfc_symtree *st)
3003 if (st->n.sym->module)
3004 gfc_error ("Name %qs at %C is an ambiguous reference to %qs "
3005 "from module %qs", name, st->n.sym->name, st->n.sym->module);
3006 else
3007 gfc_error ("Name %qs at %C is an ambiguous reference to %qs "
3008 "from current program unit", name, st->n.sym->name);
3012 /* If we're in a SELECT TYPE block, check if the variable 'st' matches any
3013 selector on the stack. If yes, replace it by the corresponding temporary. */
3015 static void
3016 select_type_insert_tmp (gfc_symtree **st)
3018 gfc_select_type_stack *stack = select_type_stack;
3019 for (; stack; stack = stack->prev)
3020 if ((*st)->n.sym == stack->selector && stack->tmp)
3022 *st = stack->tmp;
3023 select_type_insert_tmp (st);
3024 return;
3029 /* Look for a symtree in the current procedure -- that is, go up to
3030 parent namespaces but only if inside a BLOCK. Returns NULL if not found. */
3032 gfc_symtree*
3033 gfc_find_symtree_in_proc (const char* name, gfc_namespace* ns)
3035 while (ns)
3037 gfc_symtree* st = gfc_find_symtree (ns->sym_root, name);
3038 if (st)
3039 return st;
3041 if (!ns->construct_entities)
3042 break;
3043 ns = ns->parent;
3046 return NULL;
3050 /* Search for a symtree starting in the current namespace, resorting to
3051 any parent namespaces if requested by a nonzero parent_flag.
3052 Returns nonzero if the name is ambiguous. */
3055 gfc_find_sym_tree (const char *name, gfc_namespace *ns, int parent_flag,
3056 gfc_symtree **result)
3058 gfc_symtree *st;
3060 if (ns == NULL)
3061 ns = gfc_current_ns;
3065 st = gfc_find_symtree (ns->sym_root, name);
3066 if (st != NULL)
3068 select_type_insert_tmp (&st);
3070 *result = st;
3071 /* Ambiguous generic interfaces are permitted, as long
3072 as the specific interfaces are different. */
3073 if (st->ambiguous && !st->n.sym->attr.generic)
3075 ambiguous_symbol (name, st);
3076 return 1;
3079 return 0;
3082 if (!parent_flag)
3083 break;
3085 /* Don't escape an interface block. */
3086 if (ns && !ns->has_import_set
3087 && ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY)
3088 break;
3090 ns = ns->parent;
3092 while (ns != NULL);
3094 *result = NULL;
3095 return 0;
3099 /* Same, but returns the symbol instead. */
3102 gfc_find_symbol (const char *name, gfc_namespace *ns, int parent_flag,
3103 gfc_symbol **result)
3105 gfc_symtree *st;
3106 int i;
3108 i = gfc_find_sym_tree (name, ns, parent_flag, &st);
3110 if (st == NULL)
3111 *result = NULL;
3112 else
3113 *result = st->n.sym;
3115 return i;
3119 /* Tells whether there is only one set of changes in the stack. */
3121 static bool
3122 single_undo_checkpoint_p (void)
3124 if (latest_undo_chgset == &default_undo_chgset_var)
3126 gcc_assert (latest_undo_chgset->previous == NULL);
3127 return true;
3129 else
3131 gcc_assert (latest_undo_chgset->previous != NULL);
3132 return false;
3136 /* Save symbol with the information necessary to back it out. */
3138 void
3139 gfc_save_symbol_data (gfc_symbol *sym)
3141 gfc_symbol *s;
3142 unsigned i;
3144 if (!single_undo_checkpoint_p ())
3146 /* If there is more than one change set, look for the symbol in the
3147 current one. If it is found there, we can reuse it. */
3148 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, s)
3149 if (s == sym)
3151 gcc_assert (sym->gfc_new || sym->old_symbol != NULL);
3152 return;
3155 else if (sym->gfc_new || sym->old_symbol != NULL)
3156 return;
3158 s = XCNEW (gfc_symbol);
3159 *s = *sym;
3160 sym->old_symbol = s;
3161 sym->gfc_new = 0;
3163 latest_undo_chgset->syms.safe_push (sym);
3167 /* Given a name, find a symbol, or create it if it does not exist yet
3168 in the current namespace. If the symbol is found we make sure that
3169 it's OK.
3171 The integer return code indicates
3172 0 All OK
3173 1 The symbol name was ambiguous
3174 2 The name meant to be established was already host associated.
3176 So if the return value is nonzero, then an error was issued. */
3179 gfc_get_sym_tree (const char *name, gfc_namespace *ns, gfc_symtree **result,
3180 bool allow_subroutine)
3182 gfc_symtree *st;
3183 gfc_symbol *p;
3185 /* This doesn't usually happen during resolution. */
3186 if (ns == NULL)
3187 ns = gfc_current_ns;
3189 /* Try to find the symbol in ns. */
3190 st = gfc_find_symtree (ns->sym_root, name);
3192 if (st == NULL && ns->omp_udr_ns)
3194 ns = ns->parent;
3195 st = gfc_find_symtree (ns->sym_root, name);
3198 if (st == NULL)
3200 /* If not there, create a new symbol. */
3201 p = gfc_new_symbol (name, ns);
3203 /* Add to the list of tentative symbols. */
3204 p->old_symbol = NULL;
3205 p->mark = 1;
3206 p->gfc_new = 1;
3207 latest_undo_chgset->syms.safe_push (p);
3209 st = gfc_new_symtree (&ns->sym_root, name);
3210 st->n.sym = p;
3211 p->refs++;
3214 else
3216 /* Make sure the existing symbol is OK. Ambiguous
3217 generic interfaces are permitted, as long as the
3218 specific interfaces are different. */
3219 if (st->ambiguous && !st->n.sym->attr.generic)
3221 ambiguous_symbol (name, st);
3222 return 1;
3225 p = st->n.sym;
3226 if (p->ns != ns && (!p->attr.function || ns->proc_name != p)
3227 && !(allow_subroutine && p->attr.subroutine)
3228 && !(ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY
3229 && (ns->has_import_set || p->attr.imported)))
3231 /* Symbol is from another namespace. */
3232 gfc_error ("Symbol %qs at %C has already been host associated",
3233 name);
3234 return 2;
3237 p->mark = 1;
3239 /* Copy in case this symbol is changed. */
3240 gfc_save_symbol_data (p);
3243 *result = st;
3244 return 0;
3249 gfc_get_symbol (const char *name, gfc_namespace *ns, gfc_symbol **result)
3251 gfc_symtree *st;
3252 int i;
3254 i = gfc_get_sym_tree (name, ns, &st, false);
3255 if (i != 0)
3256 return i;
3258 if (st)
3259 *result = st->n.sym;
3260 else
3261 *result = NULL;
3262 return i;
3266 /* Subroutine that searches for a symbol, creating it if it doesn't
3267 exist, but tries to host-associate the symbol if possible. */
3270 gfc_get_ha_sym_tree (const char *name, gfc_symtree **result)
3272 gfc_symtree *st;
3273 int i;
3275 i = gfc_find_sym_tree (name, gfc_current_ns, 0, &st);
3277 if (st != NULL)
3279 gfc_save_symbol_data (st->n.sym);
3280 *result = st;
3281 return i;
3284 i = gfc_find_sym_tree (name, gfc_current_ns, 1, &st);
3285 if (i)
3286 return i;
3288 if (st != NULL)
3290 *result = st;
3291 return 0;
3294 return gfc_get_sym_tree (name, gfc_current_ns, result, false);
3299 gfc_get_ha_symbol (const char *name, gfc_symbol **result)
3301 int i;
3302 gfc_symtree *st;
3304 i = gfc_get_ha_sym_tree (name, &st);
3306 if (st)
3307 *result = st->n.sym;
3308 else
3309 *result = NULL;
3311 return i;
3315 /* Search for the symtree belonging to a gfc_common_head; we cannot use
3316 head->name as the common_root symtree's name might be mangled. */
3318 static gfc_symtree *
3319 find_common_symtree (gfc_symtree *st, gfc_common_head *head)
3322 gfc_symtree *result;
3324 if (st == NULL)
3325 return NULL;
3327 if (st->n.common == head)
3328 return st;
3330 result = find_common_symtree (st->left, head);
3331 if (!result)
3332 result = find_common_symtree (st->right, head);
3334 return result;
3338 /* Clear the given storage, and make it the current change set for registering
3339 changed symbols. Its contents are freed after a call to
3340 gfc_restore_last_undo_checkpoint or gfc_drop_last_undo_checkpoint, but
3341 it is up to the caller to free the storage itself. It is usually a local
3342 variable, so there is nothing to do anyway. */
3344 void
3345 gfc_new_undo_checkpoint (gfc_undo_change_set &chg_syms)
3347 chg_syms.syms = vNULL;
3348 chg_syms.tbps = vNULL;
3349 chg_syms.previous = latest_undo_chgset;
3350 latest_undo_chgset = &chg_syms;
3354 /* Restore previous state of symbol. Just copy simple stuff. */
3356 static void
3357 restore_old_symbol (gfc_symbol *p)
3359 gfc_symbol *old;
3361 p->mark = 0;
3362 old = p->old_symbol;
3364 p->ts.type = old->ts.type;
3365 p->ts.kind = old->ts.kind;
3367 p->attr = old->attr;
3369 if (p->value != old->value)
3371 gcc_checking_assert (old->value == NULL);
3372 gfc_free_expr (p->value);
3373 p->value = NULL;
3376 if (p->as != old->as)
3378 if (p->as)
3379 gfc_free_array_spec (p->as);
3380 p->as = old->as;
3383 p->generic = old->generic;
3384 p->component_access = old->component_access;
3386 if (p->namelist != NULL && old->namelist == NULL)
3388 gfc_free_namelist (p->namelist);
3389 p->namelist = NULL;
3391 else
3393 if (p->namelist_tail != old->namelist_tail)
3395 gfc_free_namelist (old->namelist_tail->next);
3396 old->namelist_tail->next = NULL;
3400 p->namelist_tail = old->namelist_tail;
3402 if (p->formal != old->formal)
3404 gfc_free_formal_arglist (p->formal);
3405 p->formal = old->formal;
3408 set_symbol_common_block (p, old->common_block);
3409 p->common_head = old->common_head;
3411 p->old_symbol = old->old_symbol;
3412 free (old);
3416 /* Frees the internal data of a gfc_undo_change_set structure. Doesn't free
3417 the structure itself. */
3419 static void
3420 free_undo_change_set_data (gfc_undo_change_set &cs)
3422 cs.syms.release ();
3423 cs.tbps.release ();
3427 /* Given a change set pointer, free its target's contents and update it with
3428 the address of the previous change set. Note that only the contents are
3429 freed, not the target itself (the contents' container). It is not a problem
3430 as the latter will be a local variable usually. */
3432 static void
3433 pop_undo_change_set (gfc_undo_change_set *&cs)
3435 free_undo_change_set_data (*cs);
3436 cs = cs->previous;
3440 static void free_old_symbol (gfc_symbol *sym);
3443 /* Merges the current change set into the previous one. The changes themselves
3444 are left untouched; only one checkpoint is forgotten. */
3446 void
3447 gfc_drop_last_undo_checkpoint (void)
3449 gfc_symbol *s, *t;
3450 unsigned i, j;
3452 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, s)
3454 /* No need to loop in this case. */
3455 if (s->old_symbol == NULL)
3456 continue;
3458 /* Remove the duplicate symbols. */
3459 FOR_EACH_VEC_ELT (latest_undo_chgset->previous->syms, j, t)
3460 if (t == s)
3462 latest_undo_chgset->previous->syms.unordered_remove (j);
3464 /* S->OLD_SYMBOL is the backup symbol for S as it was at the
3465 last checkpoint. We drop that checkpoint, so S->OLD_SYMBOL
3466 shall contain from now on the backup symbol for S as it was
3467 at the checkpoint before. */
3468 if (s->old_symbol->gfc_new)
3470 gcc_assert (s->old_symbol->old_symbol == NULL);
3471 s->gfc_new = s->old_symbol->gfc_new;
3472 free_old_symbol (s);
3474 else
3475 restore_old_symbol (s->old_symbol);
3476 break;
3480 latest_undo_chgset->previous->syms.safe_splice (latest_undo_chgset->syms);
3481 latest_undo_chgset->previous->tbps.safe_splice (latest_undo_chgset->tbps);
3483 pop_undo_change_set (latest_undo_chgset);
3487 /* Undoes all the changes made to symbols since the previous checkpoint.
3488 This subroutine is made simpler due to the fact that attributes are
3489 never removed once added. */
3491 void
3492 gfc_restore_last_undo_checkpoint (void)
3494 gfc_symbol *p;
3495 unsigned i;
3497 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3499 /* Symbol in a common block was new. Or was old and just put in common */
3500 if (p->common_block
3501 && (p->gfc_new || !p->old_symbol->common_block))
3503 /* If the symbol was added to any common block, it
3504 needs to be removed to stop the resolver looking
3505 for a (possibly) dead symbol. */
3506 if (p->common_block->head == p && !p->common_next)
3508 gfc_symtree st, *st0;
3509 st0 = find_common_symtree (p->ns->common_root,
3510 p->common_block);
3511 if (st0)
3513 st.name = st0->name;
3514 gfc_delete_bbt (&p->ns->common_root, &st, compare_symtree);
3515 free (st0);
3519 if (p->common_block->head == p)
3520 p->common_block->head = p->common_next;
3521 else
3523 gfc_symbol *cparent, *csym;
3525 cparent = p->common_block->head;
3526 csym = cparent->common_next;
3528 while (csym != p)
3530 cparent = csym;
3531 csym = csym->common_next;
3534 gcc_assert(cparent->common_next == p);
3535 cparent->common_next = csym->common_next;
3537 p->common_next = NULL;
3539 if (p->gfc_new)
3541 /* The derived type is saved in the symtree with the first
3542 letter capitalized; the all lower-case version to the
3543 derived type contains its associated generic function. */
3544 if (gfc_fl_struct (p->attr.flavor))
3545 gfc_delete_symtree (&p->ns->sym_root,gfc_dt_upper_string (p->name));
3546 else
3547 gfc_delete_symtree (&p->ns->sym_root, p->name);
3549 gfc_release_symbol (p);
3551 else
3552 restore_old_symbol (p);
3555 latest_undo_chgset->syms.truncate (0);
3556 latest_undo_chgset->tbps.truncate (0);
3558 if (!single_undo_checkpoint_p ())
3559 pop_undo_change_set (latest_undo_chgset);
3563 /* Makes sure that there is only one set of changes; in other words we haven't
3564 forgotten to pair a call to gfc_new_checkpoint with a call to either
3565 gfc_drop_last_undo_checkpoint or gfc_restore_last_undo_checkpoint. */
3567 static void
3568 enforce_single_undo_checkpoint (void)
3570 gcc_checking_assert (single_undo_checkpoint_p ());
3574 /* Undoes all the changes made to symbols in the current statement. */
3576 void
3577 gfc_undo_symbols (void)
3579 enforce_single_undo_checkpoint ();
3580 gfc_restore_last_undo_checkpoint ();
3584 /* Free sym->old_symbol. sym->old_symbol is mostly a shallow copy of sym; the
3585 components of old_symbol that might need deallocation are the "allocatables"
3586 that are restored in gfc_undo_symbols(), with two exceptions: namelist and
3587 namelist_tail. In case these differ between old_symbol and sym, it's just
3588 because sym->namelist has gotten a few more items. */
3590 static void
3591 free_old_symbol (gfc_symbol *sym)
3594 if (sym->old_symbol == NULL)
3595 return;
3597 if (sym->old_symbol->as != sym->as)
3598 gfc_free_array_spec (sym->old_symbol->as);
3600 if (sym->old_symbol->value != sym->value)
3601 gfc_free_expr (sym->old_symbol->value);
3603 if (sym->old_symbol->formal != sym->formal)
3604 gfc_free_formal_arglist (sym->old_symbol->formal);
3606 free (sym->old_symbol);
3607 sym->old_symbol = NULL;
3611 /* Makes the changes made in the current statement permanent-- gets
3612 rid of undo information. */
3614 void
3615 gfc_commit_symbols (void)
3617 gfc_symbol *p;
3618 gfc_typebound_proc *tbp;
3619 unsigned i;
3621 enforce_single_undo_checkpoint ();
3623 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3625 p->mark = 0;
3626 p->gfc_new = 0;
3627 free_old_symbol (p);
3629 latest_undo_chgset->syms.truncate (0);
3631 FOR_EACH_VEC_ELT (latest_undo_chgset->tbps, i, tbp)
3632 tbp->error = 0;
3633 latest_undo_chgset->tbps.truncate (0);
3637 /* Makes the changes made in one symbol permanent -- gets rid of undo
3638 information. */
3640 void
3641 gfc_commit_symbol (gfc_symbol *sym)
3643 gfc_symbol *p;
3644 unsigned i;
3646 enforce_single_undo_checkpoint ();
3648 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3649 if (p == sym)
3651 latest_undo_chgset->syms.unordered_remove (i);
3652 break;
3655 sym->mark = 0;
3656 sym->gfc_new = 0;
3658 free_old_symbol (sym);
3662 /* Recursively free trees containing type-bound procedures. */
3664 static void
3665 free_tb_tree (gfc_symtree *t)
3667 if (t == NULL)
3668 return;
3670 free_tb_tree (t->left);
3671 free_tb_tree (t->right);
3673 /* TODO: Free type-bound procedure structs themselves; probably needs some
3674 sort of ref-counting mechanism. */
3676 free (t);
3680 /* Recursive function that deletes an entire tree and all the common
3681 head structures it points to. */
3683 static void
3684 free_common_tree (gfc_symtree * common_tree)
3686 if (common_tree == NULL)
3687 return;
3689 free_common_tree (common_tree->left);
3690 free_common_tree (common_tree->right);
3692 free (common_tree);
3696 /* Recursive function that deletes an entire tree and all the common
3697 head structures it points to. */
3699 static void
3700 free_omp_udr_tree (gfc_symtree * omp_udr_tree)
3702 if (omp_udr_tree == NULL)
3703 return;
3705 free_omp_udr_tree (omp_udr_tree->left);
3706 free_omp_udr_tree (omp_udr_tree->right);
3708 gfc_free_omp_udr (omp_udr_tree->n.omp_udr);
3709 free (omp_udr_tree);
3713 /* Recursive function that deletes an entire tree and all the user
3714 operator nodes that it contains. */
3716 static void
3717 free_uop_tree (gfc_symtree *uop_tree)
3719 if (uop_tree == NULL)
3720 return;
3722 free_uop_tree (uop_tree->left);
3723 free_uop_tree (uop_tree->right);
3725 gfc_free_interface (uop_tree->n.uop->op);
3726 free (uop_tree->n.uop);
3727 free (uop_tree);
3731 /* Recursive function that deletes an entire tree and all the symbols
3732 that it contains. */
3734 static void
3735 free_sym_tree (gfc_symtree *sym_tree)
3737 if (sym_tree == NULL)
3738 return;
3740 free_sym_tree (sym_tree->left);
3741 free_sym_tree (sym_tree->right);
3743 gfc_release_symbol (sym_tree->n.sym);
3744 free (sym_tree);
3748 /* Free the derived type list. */
3750 void
3751 gfc_free_dt_list (void)
3753 gfc_dt_list *dt, *n;
3755 for (dt = gfc_derived_types; dt; dt = n)
3757 n = dt->next;
3758 free (dt);
3761 gfc_derived_types = NULL;
3765 /* Free the gfc_equiv_info's. */
3767 static void
3768 gfc_free_equiv_infos (gfc_equiv_info *s)
3770 if (s == NULL)
3771 return;
3772 gfc_free_equiv_infos (s->next);
3773 free (s);
3777 /* Free the gfc_equiv_lists. */
3779 static void
3780 gfc_free_equiv_lists (gfc_equiv_list *l)
3782 if (l == NULL)
3783 return;
3784 gfc_free_equiv_lists (l->next);
3785 gfc_free_equiv_infos (l->equiv);
3786 free (l);
3790 /* Free a finalizer procedure list. */
3792 void
3793 gfc_free_finalizer (gfc_finalizer* el)
3795 if (el)
3797 gfc_release_symbol (el->proc_sym);
3798 free (el);
3802 static void
3803 gfc_free_finalizer_list (gfc_finalizer* list)
3805 while (list)
3807 gfc_finalizer* current = list;
3808 list = list->next;
3809 gfc_free_finalizer (current);
3814 /* Create a new gfc_charlen structure and add it to a namespace.
3815 If 'old_cl' is given, the newly created charlen will be a copy of it. */
3817 gfc_charlen*
3818 gfc_new_charlen (gfc_namespace *ns, gfc_charlen *old_cl)
3820 gfc_charlen *cl;
3822 cl = gfc_get_charlen ();
3824 /* Copy old_cl. */
3825 if (old_cl)
3827 cl->length = gfc_copy_expr (old_cl->length);
3828 cl->length_from_typespec = old_cl->length_from_typespec;
3829 cl->backend_decl = old_cl->backend_decl;
3830 cl->passed_length = old_cl->passed_length;
3831 cl->resolved = old_cl->resolved;
3834 /* Put into namespace. */
3835 cl->next = ns->cl_list;
3836 ns->cl_list = cl;
3838 return cl;
3842 /* Free the charlen list from cl to end (end is not freed).
3843 Free the whole list if end is NULL. */
3845 void
3846 gfc_free_charlen (gfc_charlen *cl, gfc_charlen *end)
3848 gfc_charlen *cl2;
3850 for (; cl != end; cl = cl2)
3852 gcc_assert (cl);
3854 cl2 = cl->next;
3855 gfc_free_expr (cl->length);
3856 free (cl);
3861 /* Free entry list structs. */
3863 static void
3864 free_entry_list (gfc_entry_list *el)
3866 gfc_entry_list *next;
3868 if (el == NULL)
3869 return;
3871 next = el->next;
3872 free (el);
3873 free_entry_list (next);
3877 /* Free a namespace structure and everything below it. Interface
3878 lists associated with intrinsic operators are not freed. These are
3879 taken care of when a specific name is freed. */
3881 void
3882 gfc_free_namespace (gfc_namespace *ns)
3884 gfc_namespace *p, *q;
3885 int i;
3887 if (ns == NULL)
3888 return;
3890 ns->refs--;
3891 if (ns->refs > 0)
3892 return;
3893 gcc_assert (ns->refs == 0);
3895 gfc_free_statements (ns->code);
3897 free_sym_tree (ns->sym_root);
3898 free_uop_tree (ns->uop_root);
3899 free_common_tree (ns->common_root);
3900 free_omp_udr_tree (ns->omp_udr_root);
3901 free_tb_tree (ns->tb_sym_root);
3902 free_tb_tree (ns->tb_uop_root);
3903 gfc_free_finalizer_list (ns->finalizers);
3904 gfc_free_omp_declare_simd_list (ns->omp_declare_simd);
3905 gfc_free_charlen (ns->cl_list, NULL);
3906 free_st_labels (ns->st_labels);
3908 free_entry_list (ns->entries);
3909 gfc_free_equiv (ns->equiv);
3910 gfc_free_equiv_lists (ns->equiv_lists);
3911 gfc_free_use_stmts (ns->use_stmts);
3913 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3914 gfc_free_interface (ns->op[i]);
3916 gfc_free_data (ns->data);
3917 p = ns->contained;
3918 free (ns);
3920 /* Recursively free any contained namespaces. */
3921 while (p != NULL)
3923 q = p;
3924 p = p->sibling;
3925 gfc_free_namespace (q);
3930 void
3931 gfc_symbol_init_2 (void)
3934 gfc_current_ns = gfc_get_namespace (NULL, 0);
3938 void
3939 gfc_symbol_done_2 (void)
3941 gfc_free_namespace (gfc_current_ns);
3942 gfc_current_ns = NULL;
3943 gfc_free_dt_list ();
3945 enforce_single_undo_checkpoint ();
3946 free_undo_change_set_data (*latest_undo_chgset);
3950 /* Count how many nodes a symtree has. */
3952 static unsigned
3953 count_st_nodes (const gfc_symtree *st)
3955 unsigned nodes;
3956 if (!st)
3957 return 0;
3959 nodes = count_st_nodes (st->left);
3960 nodes++;
3961 nodes += count_st_nodes (st->right);
3963 return nodes;
3967 /* Convert symtree tree into symtree vector. */
3969 static unsigned
3970 fill_st_vector (gfc_symtree *st, gfc_symtree **st_vec, unsigned node_cntr)
3972 if (!st)
3973 return node_cntr;
3975 node_cntr = fill_st_vector (st->left, st_vec, node_cntr);
3976 st_vec[node_cntr++] = st;
3977 node_cntr = fill_st_vector (st->right, st_vec, node_cntr);
3979 return node_cntr;
3983 /* Traverse namespace. As the functions might modify the symtree, we store the
3984 symtree as a vector and operate on this vector. Note: We assume that
3985 sym_func or st_func never deletes nodes from the symtree - only adding is
3986 allowed. Additionally, newly added nodes are not traversed. */
3988 static void
3989 do_traverse_symtree (gfc_symtree *st, void (*st_func) (gfc_symtree *),
3990 void (*sym_func) (gfc_symbol *))
3992 gfc_symtree **st_vec;
3993 unsigned nodes, i, node_cntr;
3995 gcc_assert ((st_func && !sym_func) || (!st_func && sym_func));
3996 nodes = count_st_nodes (st);
3997 st_vec = XALLOCAVEC (gfc_symtree *, nodes);
3998 node_cntr = 0;
3999 fill_st_vector (st, st_vec, node_cntr);
4001 if (sym_func)
4003 /* Clear marks. */
4004 for (i = 0; i < nodes; i++)
4005 st_vec[i]->n.sym->mark = 0;
4006 for (i = 0; i < nodes; i++)
4007 if (!st_vec[i]->n.sym->mark)
4009 (*sym_func) (st_vec[i]->n.sym);
4010 st_vec[i]->n.sym->mark = 1;
4013 else
4014 for (i = 0; i < nodes; i++)
4015 (*st_func) (st_vec[i]);
4019 /* Recursively traverse the symtree nodes. */
4021 void
4022 gfc_traverse_symtree (gfc_symtree *st, void (*st_func) (gfc_symtree *))
4024 do_traverse_symtree (st, st_func, NULL);
4028 /* Call a given function for all symbols in the namespace. We take
4029 care that each gfc_symbol node is called exactly once. */
4031 void
4032 gfc_traverse_ns (gfc_namespace *ns, void (*sym_func) (gfc_symbol *))
4034 do_traverse_symtree (ns->sym_root, NULL, sym_func);
4038 /* Return TRUE when name is the name of an intrinsic type. */
4040 bool
4041 gfc_is_intrinsic_typename (const char *name)
4043 if (strcmp (name, "integer") == 0
4044 || strcmp (name, "real") == 0
4045 || strcmp (name, "character") == 0
4046 || strcmp (name, "logical") == 0
4047 || strcmp (name, "complex") == 0
4048 || strcmp (name, "doubleprecision") == 0
4049 || strcmp (name, "doublecomplex") == 0)
4050 return true;
4051 else
4052 return false;
4056 /* Return TRUE if the symbol is an automatic variable. */
4058 static bool
4059 gfc_is_var_automatic (gfc_symbol *sym)
4061 /* Pointer and allocatable variables are never automatic. */
4062 if (sym->attr.pointer || sym->attr.allocatable)
4063 return false;
4064 /* Check for arrays with non-constant size. */
4065 if (sym->attr.dimension && sym->as
4066 && !gfc_is_compile_time_shape (sym->as))
4067 return true;
4068 /* Check for non-constant length character variables. */
4069 if (sym->ts.type == BT_CHARACTER
4070 && sym->ts.u.cl
4071 && !gfc_is_constant_expr (sym->ts.u.cl->length))
4072 return true;
4073 /* Variables with explicit AUTOMATIC attribute. */
4074 if (sym->attr.automatic)
4075 return true;
4077 return false;
4080 /* Given a symbol, mark it as SAVEd if it is allowed. */
4082 static void
4083 save_symbol (gfc_symbol *sym)
4086 if (sym->attr.use_assoc)
4087 return;
4089 if (sym->attr.in_common
4090 || sym->attr.dummy
4091 || sym->attr.result
4092 || sym->attr.flavor != FL_VARIABLE)
4093 return;
4094 /* Automatic objects are not saved. */
4095 if (gfc_is_var_automatic (sym))
4096 return;
4097 gfc_add_save (&sym->attr, SAVE_EXPLICIT, sym->name, &sym->declared_at);
4101 /* Mark those symbols which can be SAVEd as such. */
4103 void
4104 gfc_save_all (gfc_namespace *ns)
4106 gfc_traverse_ns (ns, save_symbol);
4110 /* Make sure that no changes to symbols are pending. */
4112 void
4113 gfc_enforce_clean_symbol_state(void)
4115 enforce_single_undo_checkpoint ();
4116 gcc_assert (latest_undo_chgset->syms.is_empty ());
4120 /************** Global symbol handling ************/
4123 /* Search a tree for the global symbol. */
4125 gfc_gsymbol *
4126 gfc_find_gsymbol (gfc_gsymbol *symbol, const char *name)
4128 int c;
4130 if (symbol == NULL)
4131 return NULL;
4133 while (symbol)
4135 c = strcmp (name, symbol->name);
4136 if (!c)
4137 return symbol;
4139 symbol = (c < 0) ? symbol->left : symbol->right;
4142 return NULL;
4146 /* Compare two global symbols. Used for managing the BB tree. */
4148 static int
4149 gsym_compare (void *_s1, void *_s2)
4151 gfc_gsymbol *s1, *s2;
4153 s1 = (gfc_gsymbol *) _s1;
4154 s2 = (gfc_gsymbol *) _s2;
4155 return strcmp (s1->name, s2->name);
4159 /* Get a global symbol, creating it if it doesn't exist. */
4161 gfc_gsymbol *
4162 gfc_get_gsymbol (const char *name)
4164 gfc_gsymbol *s;
4166 s = gfc_find_gsymbol (gfc_gsym_root, name);
4167 if (s != NULL)
4168 return s;
4170 s = XCNEW (gfc_gsymbol);
4171 s->type = GSYM_UNKNOWN;
4172 s->name = gfc_get_string ("%s", name);
4174 gfc_insert_bbt (&gfc_gsym_root, s, gsym_compare);
4176 return s;
4180 static gfc_symbol *
4181 get_iso_c_binding_dt (int sym_id)
4183 gfc_dt_list *dt_list;
4185 dt_list = gfc_derived_types;
4187 /* Loop through the derived types in the name list, searching for
4188 the desired symbol from iso_c_binding. Search the parent namespaces
4189 if necessary and requested to (parent_flag). */
4190 while (dt_list != NULL)
4192 if (dt_list->derived->from_intmod != INTMOD_NONE
4193 && dt_list->derived->intmod_sym_id == sym_id)
4194 return dt_list->derived;
4196 dt_list = dt_list->next;
4199 return NULL;
4203 /* Verifies that the given derived type symbol, derived_sym, is interoperable
4204 with C. This is necessary for any derived type that is BIND(C) and for
4205 derived types that are parameters to functions that are BIND(C). All
4206 fields of the derived type are required to be interoperable, and are tested
4207 for such. If an error occurs, the errors are reported here, allowing for
4208 multiple errors to be handled for a single derived type. */
4210 bool
4211 verify_bind_c_derived_type (gfc_symbol *derived_sym)
4213 gfc_component *curr_comp = NULL;
4214 bool is_c_interop = false;
4215 bool retval = true;
4217 if (derived_sym == NULL)
4218 gfc_internal_error ("verify_bind_c_derived_type(): Given symbol is "
4219 "unexpectedly NULL");
4221 /* If we've already looked at this derived symbol, do not look at it again
4222 so we don't repeat warnings/errors. */
4223 if (derived_sym->ts.is_c_interop)
4224 return true;
4226 /* The derived type must have the BIND attribute to be interoperable
4227 J3/04-007, Section 15.2.3. */
4228 if (derived_sym->attr.is_bind_c != 1)
4230 derived_sym->ts.is_c_interop = 0;
4231 gfc_error_now ("Derived type %qs declared at %L must have the BIND "
4232 "attribute to be C interoperable", derived_sym->name,
4233 &(derived_sym->declared_at));
4234 retval = false;
4237 curr_comp = derived_sym->components;
4239 /* Fortran 2003 allows an empty derived type. C99 appears to disallow an
4240 empty struct. Section 15.2 in Fortran 2003 states: "The following
4241 subclauses define the conditions under which a Fortran entity is
4242 interoperable. If a Fortran entity is interoperable, an equivalent
4243 entity may be defined by means of C and the Fortran entity is said
4244 to be interoperable with the C entity. There does not have to be such
4245 an interoperating C entity."
4247 if (curr_comp == NULL)
4249 gfc_warning (0, "Derived type %qs with BIND(C) attribute at %L is empty, "
4250 "and may be inaccessible by the C companion processor",
4251 derived_sym->name, &(derived_sym->declared_at));
4252 derived_sym->ts.is_c_interop = 1;
4253 derived_sym->attr.is_bind_c = 1;
4254 return true;
4258 /* Initialize the derived type as being C interoperable.
4259 If we find an error in the components, this will be set false. */
4260 derived_sym->ts.is_c_interop = 1;
4262 /* Loop through the list of components to verify that the kind of
4263 each is a C interoperable type. */
4266 /* The components cannot be pointers (fortran sense).
4267 J3/04-007, Section 15.2.3, C1505. */
4268 if (curr_comp->attr.pointer != 0)
4270 gfc_error ("Component %qs at %L cannot have the "
4271 "POINTER attribute because it is a member "
4272 "of the BIND(C) derived type %qs at %L",
4273 curr_comp->name, &(curr_comp->loc),
4274 derived_sym->name, &(derived_sym->declared_at));
4275 retval = false;
4278 if (curr_comp->attr.proc_pointer != 0)
4280 gfc_error ("Procedure pointer component %qs at %L cannot be a member"
4281 " of the BIND(C) derived type %qs at %L", curr_comp->name,
4282 &curr_comp->loc, derived_sym->name,
4283 &derived_sym->declared_at);
4284 retval = false;
4287 /* The components cannot be allocatable.
4288 J3/04-007, Section 15.2.3, C1505. */
4289 if (curr_comp->attr.allocatable != 0)
4291 gfc_error ("Component %qs at %L cannot have the "
4292 "ALLOCATABLE attribute because it is a member "
4293 "of the BIND(C) derived type %qs at %L",
4294 curr_comp->name, &(curr_comp->loc),
4295 derived_sym->name, &(derived_sym->declared_at));
4296 retval = false;
4299 /* BIND(C) derived types must have interoperable components. */
4300 if (curr_comp->ts.type == BT_DERIVED
4301 && curr_comp->ts.u.derived->ts.is_iso_c != 1
4302 && curr_comp->ts.u.derived != derived_sym)
4304 /* This should be allowed; the draft says a derived-type can not
4305 have type parameters if it is has the BIND attribute. Type
4306 parameters seem to be for making parameterized derived types.
4307 There's no need to verify the type if it is c_ptr/c_funptr. */
4308 retval = verify_bind_c_derived_type (curr_comp->ts.u.derived);
4310 else
4312 /* Grab the typespec for the given component and test the kind. */
4313 is_c_interop = gfc_verify_c_interop (&(curr_comp->ts));
4315 if (!is_c_interop)
4317 /* Report warning and continue since not fatal. The
4318 draft does specify a constraint that requires all fields
4319 to interoperate, but if the user says real(4), etc., it
4320 may interoperate with *something* in C, but the compiler
4321 most likely won't know exactly what. Further, it may not
4322 interoperate with the same data type(s) in C if the user
4323 recompiles with different flags (e.g., -m32 and -m64 on
4324 x86_64 and using integer(4) to claim interop with a
4325 C_LONG). */
4326 if (derived_sym->attr.is_bind_c == 1 && warn_c_binding_type)
4327 /* If the derived type is bind(c), all fields must be
4328 interop. */
4329 gfc_warning (OPT_Wc_binding_type,
4330 "Component %qs in derived type %qs at %L "
4331 "may not be C interoperable, even though "
4332 "derived type %qs is BIND(C)",
4333 curr_comp->name, derived_sym->name,
4334 &(curr_comp->loc), derived_sym->name);
4335 else if (warn_c_binding_type)
4336 /* If derived type is param to bind(c) routine, or to one
4337 of the iso_c_binding procs, it must be interoperable, so
4338 all fields must interop too. */
4339 gfc_warning (OPT_Wc_binding_type,
4340 "Component %qs in derived type %qs at %L "
4341 "may not be C interoperable",
4342 curr_comp->name, derived_sym->name,
4343 &(curr_comp->loc));
4347 curr_comp = curr_comp->next;
4348 } while (curr_comp != NULL);
4351 /* Make sure we don't have conflicts with the attributes. */
4352 if (derived_sym->attr.access == ACCESS_PRIVATE)
4354 gfc_error ("Derived type %qs at %L cannot be declared with both "
4355 "PRIVATE and BIND(C) attributes", derived_sym->name,
4356 &(derived_sym->declared_at));
4357 retval = false;
4360 if (derived_sym->attr.sequence != 0)
4362 gfc_error ("Derived type %qs at %L cannot have the SEQUENCE "
4363 "attribute because it is BIND(C)", derived_sym->name,
4364 &(derived_sym->declared_at));
4365 retval = false;
4368 /* Mark the derived type as not being C interoperable if we found an
4369 error. If there were only warnings, proceed with the assumption
4370 it's interoperable. */
4371 if (!retval)
4372 derived_sym->ts.is_c_interop = 0;
4374 return retval;
4378 /* Generate symbols for the named constants c_null_ptr and c_null_funptr. */
4380 static bool
4381 gen_special_c_interop_ptr (gfc_symbol *tmp_sym, gfc_symtree *dt_symtree)
4383 gfc_constructor *c;
4385 gcc_assert (tmp_sym && dt_symtree && dt_symtree->n.sym);
4386 dt_symtree->n.sym->attr.referenced = 1;
4388 tmp_sym->attr.is_c_interop = 1;
4389 tmp_sym->attr.is_bind_c = 1;
4390 tmp_sym->ts.is_c_interop = 1;
4391 tmp_sym->ts.is_iso_c = 1;
4392 tmp_sym->ts.type = BT_DERIVED;
4393 tmp_sym->ts.f90_type = BT_VOID;
4394 tmp_sym->attr.flavor = FL_PARAMETER;
4395 tmp_sym->ts.u.derived = dt_symtree->n.sym;
4397 /* Set the c_address field of c_null_ptr and c_null_funptr to
4398 the value of NULL. */
4399 tmp_sym->value = gfc_get_expr ();
4400 tmp_sym->value->expr_type = EXPR_STRUCTURE;
4401 tmp_sym->value->ts.type = BT_DERIVED;
4402 tmp_sym->value->ts.f90_type = BT_VOID;
4403 tmp_sym->value->ts.u.derived = tmp_sym->ts.u.derived;
4404 gfc_constructor_append_expr (&tmp_sym->value->value.constructor, NULL, NULL);
4405 c = gfc_constructor_first (tmp_sym->value->value.constructor);
4406 c->expr = gfc_get_int_expr (gfc_index_integer_kind, NULL, 0);
4407 c->expr->ts.is_iso_c = 1;
4409 return true;
4413 /* Add a formal argument, gfc_formal_arglist, to the
4414 end of the given list of arguments. Set the reference to the
4415 provided symbol, param_sym, in the argument. */
4417 static void
4418 add_formal_arg (gfc_formal_arglist **head,
4419 gfc_formal_arglist **tail,
4420 gfc_formal_arglist *formal_arg,
4421 gfc_symbol *param_sym)
4423 /* Put in list, either as first arg or at the tail (curr arg). */
4424 if (*head == NULL)
4425 *head = *tail = formal_arg;
4426 else
4428 (*tail)->next = formal_arg;
4429 (*tail) = formal_arg;
4432 (*tail)->sym = param_sym;
4433 (*tail)->next = NULL;
4435 return;
4439 /* Add a procedure interface to the given symbol (i.e., store a
4440 reference to the list of formal arguments). */
4442 static void
4443 add_proc_interface (gfc_symbol *sym, ifsrc source, gfc_formal_arglist *formal)
4446 sym->formal = formal;
4447 sym->attr.if_source = source;
4451 /* Copy the formal args from an existing symbol, src, into a new
4452 symbol, dest. New formal args are created, and the description of
4453 each arg is set according to the existing ones. This function is
4454 used when creating procedure declaration variables from a procedure
4455 declaration statement (see match_proc_decl()) to create the formal
4456 args based on the args of a given named interface.
4458 When an actual argument list is provided, skip the absent arguments.
4459 To be used together with gfc_se->ignore_optional. */
4461 void
4462 gfc_copy_formal_args_intr (gfc_symbol *dest, gfc_intrinsic_sym *src,
4463 gfc_actual_arglist *actual)
4465 gfc_formal_arglist *head = NULL;
4466 gfc_formal_arglist *tail = NULL;
4467 gfc_formal_arglist *formal_arg = NULL;
4468 gfc_intrinsic_arg *curr_arg = NULL;
4469 gfc_formal_arglist *formal_prev = NULL;
4470 gfc_actual_arglist *act_arg = actual;
4471 /* Save current namespace so we can change it for formal args. */
4472 gfc_namespace *parent_ns = gfc_current_ns;
4474 /* Create a new namespace, which will be the formal ns (namespace
4475 of the formal args). */
4476 gfc_current_ns = gfc_get_namespace (parent_ns, 0);
4477 gfc_current_ns->proc_name = dest;
4479 for (curr_arg = src->formal; curr_arg; curr_arg = curr_arg->next)
4481 /* Skip absent arguments. */
4482 if (actual)
4484 gcc_assert (act_arg != NULL);
4485 if (act_arg->expr == NULL)
4487 act_arg = act_arg->next;
4488 continue;
4490 act_arg = act_arg->next;
4492 formal_arg = gfc_get_formal_arglist ();
4493 gfc_get_symbol (curr_arg->name, gfc_current_ns, &(formal_arg->sym));
4495 /* May need to copy more info for the symbol. */
4496 formal_arg->sym->ts = curr_arg->ts;
4497 formal_arg->sym->attr.optional = curr_arg->optional;
4498 formal_arg->sym->attr.value = curr_arg->value;
4499 formal_arg->sym->attr.intent = curr_arg->intent;
4500 formal_arg->sym->attr.flavor = FL_VARIABLE;
4501 formal_arg->sym->attr.dummy = 1;
4503 if (formal_arg->sym->ts.type == BT_CHARACTER)
4504 formal_arg->sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4506 /* If this isn't the first arg, set up the next ptr. For the
4507 last arg built, the formal_arg->next will never get set to
4508 anything other than NULL. */
4509 if (formal_prev != NULL)
4510 formal_prev->next = formal_arg;
4511 else
4512 formal_arg->next = NULL;
4514 formal_prev = formal_arg;
4516 /* Add arg to list of formal args. */
4517 add_formal_arg (&head, &tail, formal_arg, formal_arg->sym);
4519 /* Validate changes. */
4520 gfc_commit_symbol (formal_arg->sym);
4523 /* Add the interface to the symbol. */
4524 add_proc_interface (dest, IFSRC_DECL, head);
4526 /* Store the formal namespace information. */
4527 if (dest->formal != NULL)
4528 /* The current ns should be that for the dest proc. */
4529 dest->formal_ns = gfc_current_ns;
4530 /* Restore the current namespace to what it was on entry. */
4531 gfc_current_ns = parent_ns;
4535 static int
4536 std_for_isocbinding_symbol (int id)
4538 switch (id)
4540 #define NAMED_INTCST(a,b,c,d) \
4541 case a:\
4542 return d;
4543 #include "iso-c-binding.def"
4544 #undef NAMED_INTCST
4546 #define NAMED_FUNCTION(a,b,c,d) \
4547 case a:\
4548 return d;
4549 #define NAMED_SUBROUTINE(a,b,c,d) \
4550 case a:\
4551 return d;
4552 #include "iso-c-binding.def"
4553 #undef NAMED_FUNCTION
4554 #undef NAMED_SUBROUTINE
4556 default:
4557 return GFC_STD_F2003;
4561 /* Generate the given set of C interoperable kind objects, or all
4562 interoperable kinds. This function will only be given kind objects
4563 for valid iso_c_binding defined types because this is verified when
4564 the 'use' statement is parsed. If the user gives an 'only' clause,
4565 the specific kinds are looked up; if they don't exist, an error is
4566 reported. If the user does not give an 'only' clause, all
4567 iso_c_binding symbols are generated. If a list of specific kinds
4568 is given, it must have a NULL in the first empty spot to mark the
4569 end of the list. For C_null_(fun)ptr, dt_symtree has to be set and
4570 point to the symtree for c_(fun)ptr. */
4572 gfc_symtree *
4573 generate_isocbinding_symbol (const char *mod_name, iso_c_binding_symbol s,
4574 const char *local_name, gfc_symtree *dt_symtree,
4575 bool hidden)
4577 const char *const name = (local_name && local_name[0])
4578 ? local_name : c_interop_kinds_table[s].name;
4579 gfc_symtree *tmp_symtree;
4580 gfc_symbol *tmp_sym = NULL;
4581 int index;
4583 if (gfc_notification_std (std_for_isocbinding_symbol (s)) == ERROR)
4584 return NULL;
4586 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
4587 if (hidden
4588 && (!tmp_symtree || !tmp_symtree->n.sym
4589 || tmp_symtree->n.sym->from_intmod != INTMOD_ISO_C_BINDING
4590 || tmp_symtree->n.sym->intmod_sym_id != s))
4591 tmp_symtree = NULL;
4593 /* Already exists in this scope so don't re-add it. */
4594 if (tmp_symtree != NULL && (tmp_sym = tmp_symtree->n.sym) != NULL
4595 && (!tmp_sym->attr.generic
4596 || (tmp_sym = gfc_find_dt_in_generic (tmp_sym)) != NULL)
4597 && tmp_sym->from_intmod == INTMOD_ISO_C_BINDING)
4599 if (tmp_sym->attr.flavor == FL_DERIVED
4600 && !get_iso_c_binding_dt (tmp_sym->intmod_sym_id))
4602 gfc_dt_list *dt_list;
4603 dt_list = gfc_get_dt_list ();
4604 dt_list->derived = tmp_sym;
4605 dt_list->next = gfc_derived_types;
4606 gfc_derived_types = dt_list;
4609 return tmp_symtree;
4612 /* Create the sym tree in the current ns. */
4613 if (hidden)
4615 tmp_symtree = gfc_get_unique_symtree (gfc_current_ns);
4616 tmp_sym = gfc_new_symbol (name, gfc_current_ns);
4618 /* Add to the list of tentative symbols. */
4619 latest_undo_chgset->syms.safe_push (tmp_sym);
4620 tmp_sym->old_symbol = NULL;
4621 tmp_sym->mark = 1;
4622 tmp_sym->gfc_new = 1;
4624 tmp_symtree->n.sym = tmp_sym;
4625 tmp_sym->refs++;
4627 else
4629 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
4630 gcc_assert (tmp_symtree);
4631 tmp_sym = tmp_symtree->n.sym;
4634 /* Say what module this symbol belongs to. */
4635 tmp_sym->module = gfc_get_string ("%s", mod_name);
4636 tmp_sym->from_intmod = INTMOD_ISO_C_BINDING;
4637 tmp_sym->intmod_sym_id = s;
4638 tmp_sym->attr.is_iso_c = 1;
4639 tmp_sym->attr.use_assoc = 1;
4641 gcc_assert (dt_symtree == NULL || s == ISOCBINDING_NULL_FUNPTR
4642 || s == ISOCBINDING_NULL_PTR);
4644 switch (s)
4647 #define NAMED_INTCST(a,b,c,d) case a :
4648 #define NAMED_REALCST(a,b,c,d) case a :
4649 #define NAMED_CMPXCST(a,b,c,d) case a :
4650 #define NAMED_LOGCST(a,b,c) case a :
4651 #define NAMED_CHARKNDCST(a,b,c) case a :
4652 #include "iso-c-binding.def"
4654 tmp_sym->value = gfc_get_int_expr (gfc_default_integer_kind, NULL,
4655 c_interop_kinds_table[s].value);
4657 /* Initialize an integer constant expression node. */
4658 tmp_sym->attr.flavor = FL_PARAMETER;
4659 tmp_sym->ts.type = BT_INTEGER;
4660 tmp_sym->ts.kind = gfc_default_integer_kind;
4662 /* Mark this type as a C interoperable one. */
4663 tmp_sym->ts.is_c_interop = 1;
4664 tmp_sym->ts.is_iso_c = 1;
4665 tmp_sym->value->ts.is_c_interop = 1;
4666 tmp_sym->value->ts.is_iso_c = 1;
4667 tmp_sym->attr.is_c_interop = 1;
4669 /* Tell what f90 type this c interop kind is valid. */
4670 tmp_sym->ts.f90_type = c_interop_kinds_table[s].f90_type;
4672 break;
4675 #define NAMED_CHARCST(a,b,c) case a :
4676 #include "iso-c-binding.def"
4678 /* Initialize an integer constant expression node for the
4679 length of the character. */
4680 tmp_sym->value = gfc_get_character_expr (gfc_default_character_kind,
4681 &gfc_current_locus, NULL, 1);
4682 tmp_sym->value->ts.is_c_interop = 1;
4683 tmp_sym->value->ts.is_iso_c = 1;
4684 tmp_sym->value->value.character.length = 1;
4685 tmp_sym->value->value.character.string[0]
4686 = (gfc_char_t) c_interop_kinds_table[s].value;
4687 tmp_sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4688 tmp_sym->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
4689 NULL, 1);
4691 /* May not need this in both attr and ts, but do need in
4692 attr for writing module file. */
4693 tmp_sym->attr.is_c_interop = 1;
4695 tmp_sym->attr.flavor = FL_PARAMETER;
4696 tmp_sym->ts.type = BT_CHARACTER;
4698 /* Need to set it to the C_CHAR kind. */
4699 tmp_sym->ts.kind = gfc_default_character_kind;
4701 /* Mark this type as a C interoperable one. */
4702 tmp_sym->ts.is_c_interop = 1;
4703 tmp_sym->ts.is_iso_c = 1;
4705 /* Tell what f90 type this c interop kind is valid. */
4706 tmp_sym->ts.f90_type = BT_CHARACTER;
4708 break;
4710 case ISOCBINDING_PTR:
4711 case ISOCBINDING_FUNPTR:
4713 gfc_symbol *dt_sym;
4714 gfc_dt_list **dt_list_ptr = NULL;
4715 gfc_component *tmp_comp = NULL;
4717 /* Generate real derived type. */
4718 if (hidden)
4719 dt_sym = tmp_sym;
4720 else
4722 const char *hidden_name;
4723 gfc_interface *intr, *head;
4725 hidden_name = gfc_dt_upper_string (tmp_sym->name);
4726 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
4727 hidden_name);
4728 gcc_assert (tmp_symtree == NULL);
4729 gfc_get_sym_tree (hidden_name, gfc_current_ns, &tmp_symtree, false);
4730 dt_sym = tmp_symtree->n.sym;
4731 dt_sym->name = gfc_get_string (s == ISOCBINDING_PTR
4732 ? "c_ptr" : "c_funptr");
4734 /* Generate an artificial generic function. */
4735 head = tmp_sym->generic;
4736 intr = gfc_get_interface ();
4737 intr->sym = dt_sym;
4738 intr->where = gfc_current_locus;
4739 intr->next = head;
4740 tmp_sym->generic = intr;
4742 if (!tmp_sym->attr.generic
4743 && !gfc_add_generic (&tmp_sym->attr, tmp_sym->name, NULL))
4744 return NULL;
4746 if (!tmp_sym->attr.function
4747 && !gfc_add_function (&tmp_sym->attr, tmp_sym->name, NULL))
4748 return NULL;
4751 /* Say what module this symbol belongs to. */
4752 dt_sym->module = gfc_get_string ("%s", mod_name);
4753 dt_sym->from_intmod = INTMOD_ISO_C_BINDING;
4754 dt_sym->intmod_sym_id = s;
4755 dt_sym->attr.use_assoc = 1;
4757 /* Initialize an integer constant expression node. */
4758 dt_sym->attr.flavor = FL_DERIVED;
4759 dt_sym->ts.is_c_interop = 1;
4760 dt_sym->attr.is_c_interop = 1;
4761 dt_sym->attr.private_comp = 1;
4762 dt_sym->component_access = ACCESS_PRIVATE;
4763 dt_sym->ts.is_iso_c = 1;
4764 dt_sym->ts.type = BT_DERIVED;
4765 dt_sym->ts.f90_type = BT_VOID;
4767 /* A derived type must have the bind attribute to be
4768 interoperable (J3/04-007, Section 15.2.3), even though
4769 the binding label is not used. */
4770 dt_sym->attr.is_bind_c = 1;
4772 dt_sym->attr.referenced = 1;
4773 dt_sym->ts.u.derived = dt_sym;
4775 /* Add the symbol created for the derived type to the current ns. */
4776 dt_list_ptr = &(gfc_derived_types);
4777 while (*dt_list_ptr != NULL && (*dt_list_ptr)->next != NULL)
4778 dt_list_ptr = &((*dt_list_ptr)->next);
4780 /* There is already at least one derived type in the list, so append
4781 the one we're currently building for c_ptr or c_funptr. */
4782 if (*dt_list_ptr != NULL)
4783 dt_list_ptr = &((*dt_list_ptr)->next);
4784 (*dt_list_ptr) = gfc_get_dt_list ();
4785 (*dt_list_ptr)->derived = dt_sym;
4786 (*dt_list_ptr)->next = NULL;
4788 gfc_add_component (dt_sym, "c_address", &tmp_comp);
4789 if (tmp_comp == NULL)
4790 gcc_unreachable ();
4792 tmp_comp->ts.type = BT_INTEGER;
4794 /* Set this because the module will need to read/write this field. */
4795 tmp_comp->ts.f90_type = BT_INTEGER;
4797 /* The kinds for c_ptr and c_funptr are the same. */
4798 index = get_c_kind ("c_ptr", c_interop_kinds_table);
4799 tmp_comp->ts.kind = c_interop_kinds_table[index].value;
4800 tmp_comp->attr.access = ACCESS_PRIVATE;
4802 /* Mark the component as C interoperable. */
4803 tmp_comp->ts.is_c_interop = 1;
4806 break;
4808 case ISOCBINDING_NULL_PTR:
4809 case ISOCBINDING_NULL_FUNPTR:
4810 gen_special_c_interop_ptr (tmp_sym, dt_symtree);
4811 break;
4813 default:
4814 gcc_unreachable ();
4816 gfc_commit_symbol (tmp_sym);
4817 return tmp_symtree;
4821 /* Check that a symbol is already typed. If strict is not set, an untyped
4822 symbol is acceptable for non-standard-conforming mode. */
4824 bool
4825 gfc_check_symbol_typed (gfc_symbol* sym, gfc_namespace* ns,
4826 bool strict, locus where)
4828 gcc_assert (sym);
4830 if (gfc_matching_prefix)
4831 return true;
4833 /* Check for the type and try to give it an implicit one. */
4834 if (sym->ts.type == BT_UNKNOWN
4835 && !gfc_set_default_type (sym, 0, ns))
4837 if (strict)
4839 gfc_error ("Symbol %qs is used before it is typed at %L",
4840 sym->name, &where);
4841 return false;
4844 if (!gfc_notify_std (GFC_STD_GNU, "Symbol %qs is used before"
4845 " it is typed at %L", sym->name, &where))
4846 return false;
4849 /* Everything is ok. */
4850 return true;
4854 /* Construct a typebound-procedure structure. Those are stored in a tentative
4855 list and marked `error' until symbols are committed. */
4857 gfc_typebound_proc*
4858 gfc_get_typebound_proc (gfc_typebound_proc *tb0)
4860 gfc_typebound_proc *result;
4862 result = XCNEW (gfc_typebound_proc);
4863 if (tb0)
4864 *result = *tb0;
4865 result->error = 1;
4867 latest_undo_chgset->tbps.safe_push (result);
4869 return result;
4873 /* Get the super-type of a given derived type. */
4875 gfc_symbol*
4876 gfc_get_derived_super_type (gfc_symbol* derived)
4878 gcc_assert (derived);
4880 if (derived->attr.generic)
4881 derived = gfc_find_dt_in_generic (derived);
4883 if (!derived->attr.extension)
4884 return NULL;
4886 gcc_assert (derived->components);
4887 gcc_assert (derived->components->ts.type == BT_DERIVED);
4888 gcc_assert (derived->components->ts.u.derived);
4890 if (derived->components->ts.u.derived->attr.generic)
4891 return gfc_find_dt_in_generic (derived->components->ts.u.derived);
4893 return derived->components->ts.u.derived;
4897 /* Get the ultimate super-type of a given derived type. */
4899 gfc_symbol*
4900 gfc_get_ultimate_derived_super_type (gfc_symbol* derived)
4902 if (!derived->attr.extension)
4903 return NULL;
4905 derived = gfc_get_derived_super_type (derived);
4907 if (derived->attr.extension)
4908 return gfc_get_ultimate_derived_super_type (derived);
4909 else
4910 return derived;
4914 /* Check if a derived type t2 is an extension of (or equal to) a type t1. */
4916 bool
4917 gfc_type_is_extension_of (gfc_symbol *t1, gfc_symbol *t2)
4919 while (!gfc_compare_derived_types (t1, t2) && t2->attr.extension)
4920 t2 = gfc_get_derived_super_type (t2);
4921 return gfc_compare_derived_types (t1, t2);
4925 /* Check if two typespecs are type compatible (F03:5.1.1.2):
4926 If ts1 is nonpolymorphic, ts2 must be the same type.
4927 If ts1 is polymorphic (CLASS), ts2 must be an extension of ts1. */
4929 bool
4930 gfc_type_compatible (gfc_typespec *ts1, gfc_typespec *ts2)
4932 bool is_class1 = (ts1->type == BT_CLASS);
4933 bool is_class2 = (ts2->type == BT_CLASS);
4934 bool is_derived1 = (ts1->type == BT_DERIVED);
4935 bool is_derived2 = (ts2->type == BT_DERIVED);
4936 bool is_union1 = (ts1->type == BT_UNION);
4937 bool is_union2 = (ts2->type == BT_UNION);
4939 if (is_class1
4940 && ts1->u.derived->components
4941 && ((ts1->u.derived->attr.is_class
4942 && ts1->u.derived->components->ts.u.derived->attr
4943 .unlimited_polymorphic)
4944 || ts1->u.derived->attr.unlimited_polymorphic))
4945 return 1;
4947 if (!is_derived1 && !is_derived2 && !is_class1 && !is_class2
4948 && !is_union1 && !is_union2)
4949 return (ts1->type == ts2->type);
4951 if ((is_derived1 && is_derived2) || (is_union1 && is_union2))
4952 return gfc_compare_derived_types (ts1->u.derived, ts2->u.derived);
4954 if (is_derived1 && is_class2)
4955 return gfc_compare_derived_types (ts1->u.derived,
4956 ts2->u.derived->attr.is_class ?
4957 ts2->u.derived->components->ts.u.derived
4958 : ts2->u.derived);
4959 if (is_class1 && is_derived2)
4960 return gfc_type_is_extension_of (ts1->u.derived->attr.is_class ?
4961 ts1->u.derived->components->ts.u.derived
4962 : ts1->u.derived,
4963 ts2->u.derived);
4964 else if (is_class1 && is_class2)
4965 return gfc_type_is_extension_of (ts1->u.derived->attr.is_class ?
4966 ts1->u.derived->components->ts.u.derived
4967 : ts1->u.derived,
4968 ts2->u.derived->attr.is_class ?
4969 ts2->u.derived->components->ts.u.derived
4970 : ts2->u.derived);
4971 else
4972 return 0;
4976 /* Find the parent-namespace of the current function. If we're inside
4977 BLOCK constructs, it may not be the current one. */
4979 gfc_namespace*
4980 gfc_find_proc_namespace (gfc_namespace* ns)
4982 while (ns->construct_entities)
4984 ns = ns->parent;
4985 gcc_assert (ns);
4988 return ns;
4992 /* Check if an associate-variable should be translated as an `implicit' pointer
4993 internally (if it is associated to a variable and not an array with
4994 descriptor). */
4996 bool
4997 gfc_is_associate_pointer (gfc_symbol* sym)
4999 if (!sym->assoc)
5000 return false;
5002 if (sym->ts.type == BT_CLASS)
5003 return true;
5005 if (!sym->assoc->variable)
5006 return false;
5008 if (sym->attr.dimension && sym->as->type != AS_EXPLICIT)
5009 return false;
5011 return true;
5015 gfc_symbol *
5016 gfc_find_dt_in_generic (gfc_symbol *sym)
5018 gfc_interface *intr = NULL;
5020 if (!sym || gfc_fl_struct (sym->attr.flavor))
5021 return sym;
5023 if (sym->attr.generic)
5024 for (intr = sym->generic; intr; intr = intr->next)
5025 if (gfc_fl_struct (intr->sym->attr.flavor))
5026 break;
5027 return intr ? intr->sym : NULL;
5031 /* Get the dummy arguments from a procedure symbol. If it has been declared
5032 via a PROCEDURE statement with a named interface, ts.interface will be set
5033 and the arguments need to be taken from there. */
5035 gfc_formal_arglist *
5036 gfc_sym_get_dummy_args (gfc_symbol *sym)
5038 gfc_formal_arglist *dummies;
5040 dummies = sym->formal;
5041 if (dummies == NULL && sym->ts.interface != NULL)
5042 dummies = sym->ts.interface->formal;
5044 return dummies;