PR libstdc++/80251
[official-gcc.git] / gcc / fortran / symbol.c
blob6226bca7bec11c7daf662fca8e3083fae19933ad
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 "
849 "with %s attribute at %L", a1, a2,
850 where);
852 else
854 return gfc_notify_std (standard, "%s attribute "
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;
2786 st0 = gfc_find_symtree (*root, name);
2788 st.name = gfc_get_string ("%s", name);
2789 gfc_delete_bbt (root, &st, compare_symtree);
2791 free (st0);
2795 /* Given a root symtree node and a name, try to find the symbol within
2796 the namespace. Returns NULL if the symbol is not found. */
2798 gfc_symtree *
2799 gfc_find_symtree (gfc_symtree *st, const char *name)
2801 int c;
2803 while (st != NULL)
2805 c = strcmp (name, st->name);
2806 if (c == 0)
2807 return st;
2809 st = (c < 0) ? st->left : st->right;
2812 return NULL;
2816 /* Return a symtree node with a name that is guaranteed to be unique
2817 within the namespace and corresponds to an illegal fortran name. */
2819 gfc_symtree *
2820 gfc_get_unique_symtree (gfc_namespace *ns)
2822 char name[GFC_MAX_SYMBOL_LEN + 1];
2823 static int serial = 0;
2825 sprintf (name, "@%d", serial++);
2826 return gfc_new_symtree (&ns->sym_root, name);
2830 /* Given a name find a user operator node, creating it if it doesn't
2831 exist. These are much simpler than symbols because they can't be
2832 ambiguous with one another. */
2834 gfc_user_op *
2835 gfc_get_uop (const char *name)
2837 gfc_user_op *uop;
2838 gfc_symtree *st;
2839 gfc_namespace *ns = gfc_current_ns;
2841 if (ns->omp_udr_ns)
2842 ns = ns->parent;
2843 st = gfc_find_symtree (ns->uop_root, name);
2844 if (st != NULL)
2845 return st->n.uop;
2847 st = gfc_new_symtree (&ns->uop_root, name);
2849 uop = st->n.uop = XCNEW (gfc_user_op);
2850 uop->name = gfc_get_string ("%s", name);
2851 uop->access = ACCESS_UNKNOWN;
2852 uop->ns = ns;
2854 return uop;
2858 /* Given a name find the user operator node. Returns NULL if it does
2859 not exist. */
2861 gfc_user_op *
2862 gfc_find_uop (const char *name, gfc_namespace *ns)
2864 gfc_symtree *st;
2866 if (ns == NULL)
2867 ns = gfc_current_ns;
2869 st = gfc_find_symtree (ns->uop_root, name);
2870 return (st == NULL) ? NULL : st->n.uop;
2874 /* Update a symbol's common_block field, and take care of the associated
2875 memory management. */
2877 static void
2878 set_symbol_common_block (gfc_symbol *sym, gfc_common_head *common_block)
2880 if (sym->common_block == common_block)
2881 return;
2883 if (sym->common_block && sym->common_block->name[0] != '\0')
2885 sym->common_block->refs--;
2886 if (sym->common_block->refs == 0)
2887 free (sym->common_block);
2889 sym->common_block = common_block;
2893 /* Remove a gfc_symbol structure and everything it points to. */
2895 void
2896 gfc_free_symbol (gfc_symbol *sym)
2899 if (sym == NULL)
2900 return;
2902 gfc_free_array_spec (sym->as);
2904 free_components (sym->components);
2906 gfc_free_expr (sym->value);
2908 gfc_free_namelist (sym->namelist);
2910 if (sym->ns != sym->formal_ns)
2911 gfc_free_namespace (sym->formal_ns);
2913 if (!sym->attr.generic_copy)
2914 gfc_free_interface (sym->generic);
2916 gfc_free_formal_arglist (sym->formal);
2918 gfc_free_namespace (sym->f2k_derived);
2920 set_symbol_common_block (sym, NULL);
2922 free (sym);
2926 /* Decrease the reference counter and free memory when we reach zero. */
2928 void
2929 gfc_release_symbol (gfc_symbol *sym)
2931 if (sym == NULL)
2932 return;
2934 if (sym->formal_ns != NULL && sym->refs == 2 && sym->formal_ns != sym->ns
2935 && (!sym->attr.entry || !sym->module))
2937 /* As formal_ns contains a reference to sym, delete formal_ns just
2938 before the deletion of sym. */
2939 gfc_namespace *ns = sym->formal_ns;
2940 sym->formal_ns = NULL;
2941 gfc_free_namespace (ns);
2944 sym->refs--;
2945 if (sym->refs > 0)
2946 return;
2948 gcc_assert (sym->refs == 0);
2949 gfc_free_symbol (sym);
2953 /* Allocate and initialize a new symbol node. */
2955 gfc_symbol *
2956 gfc_new_symbol (const char *name, gfc_namespace *ns)
2958 gfc_symbol *p;
2960 p = XCNEW (gfc_symbol);
2962 gfc_clear_ts (&p->ts);
2963 gfc_clear_attr (&p->attr);
2964 p->ns = ns;
2966 p->declared_at = gfc_current_locus;
2968 if (strlen (name) > GFC_MAX_SYMBOL_LEN)
2969 gfc_internal_error ("new_symbol(): Symbol name too long");
2971 p->name = gfc_get_string ("%s", name);
2973 /* Make sure flags for symbol being C bound are clear initially. */
2974 p->attr.is_bind_c = 0;
2975 p->attr.is_iso_c = 0;
2977 /* Clear the ptrs we may need. */
2978 p->common_block = NULL;
2979 p->f2k_derived = NULL;
2980 p->assoc = NULL;
2981 p->fn_result_spec = 0;
2983 return p;
2987 /* Generate an error if a symbol is ambiguous. */
2989 static void
2990 ambiguous_symbol (const char *name, gfc_symtree *st)
2993 if (st->n.sym->module)
2994 gfc_error ("Name %qs at %C is an ambiguous reference to %qs "
2995 "from module %qs", name, st->n.sym->name, st->n.sym->module);
2996 else
2997 gfc_error ("Name %qs at %C is an ambiguous reference to %qs "
2998 "from current program unit", name, st->n.sym->name);
3002 /* If we're in a SELECT TYPE block, check if the variable 'st' matches any
3003 selector on the stack. If yes, replace it by the corresponding temporary. */
3005 static void
3006 select_type_insert_tmp (gfc_symtree **st)
3008 gfc_select_type_stack *stack = select_type_stack;
3009 for (; stack; stack = stack->prev)
3010 if ((*st)->n.sym == stack->selector && stack->tmp)
3012 *st = stack->tmp;
3013 select_type_insert_tmp (st);
3014 return;
3019 /* Look for a symtree in the current procedure -- that is, go up to
3020 parent namespaces but only if inside a BLOCK. Returns NULL if not found. */
3022 gfc_symtree*
3023 gfc_find_symtree_in_proc (const char* name, gfc_namespace* ns)
3025 while (ns)
3027 gfc_symtree* st = gfc_find_symtree (ns->sym_root, name);
3028 if (st)
3029 return st;
3031 if (!ns->construct_entities)
3032 break;
3033 ns = ns->parent;
3036 return NULL;
3040 /* Search for a symtree starting in the current namespace, resorting to
3041 any parent namespaces if requested by a nonzero parent_flag.
3042 Returns nonzero if the name is ambiguous. */
3045 gfc_find_sym_tree (const char *name, gfc_namespace *ns, int parent_flag,
3046 gfc_symtree **result)
3048 gfc_symtree *st;
3050 if (ns == NULL)
3051 ns = gfc_current_ns;
3055 st = gfc_find_symtree (ns->sym_root, name);
3056 if (st != NULL)
3058 select_type_insert_tmp (&st);
3060 *result = st;
3061 /* Ambiguous generic interfaces are permitted, as long
3062 as the specific interfaces are different. */
3063 if (st->ambiguous && !st->n.sym->attr.generic)
3065 ambiguous_symbol (name, st);
3066 return 1;
3069 return 0;
3072 if (!parent_flag)
3073 break;
3075 /* Don't escape an interface block. */
3076 if (ns && !ns->has_import_set
3077 && ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY)
3078 break;
3080 ns = ns->parent;
3082 while (ns != NULL);
3084 *result = NULL;
3085 return 0;
3089 /* Same, but returns the symbol instead. */
3092 gfc_find_symbol (const char *name, gfc_namespace *ns, int parent_flag,
3093 gfc_symbol **result)
3095 gfc_symtree *st;
3096 int i;
3098 i = gfc_find_sym_tree (name, ns, parent_flag, &st);
3100 if (st == NULL)
3101 *result = NULL;
3102 else
3103 *result = st->n.sym;
3105 return i;
3109 /* Tells whether there is only one set of changes in the stack. */
3111 static bool
3112 single_undo_checkpoint_p (void)
3114 if (latest_undo_chgset == &default_undo_chgset_var)
3116 gcc_assert (latest_undo_chgset->previous == NULL);
3117 return true;
3119 else
3121 gcc_assert (latest_undo_chgset->previous != NULL);
3122 return false;
3126 /* Save symbol with the information necessary to back it out. */
3128 void
3129 gfc_save_symbol_data (gfc_symbol *sym)
3131 gfc_symbol *s;
3132 unsigned i;
3134 if (!single_undo_checkpoint_p ())
3136 /* If there is more than one change set, look for the symbol in the
3137 current one. If it is found there, we can reuse it. */
3138 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, s)
3139 if (s == sym)
3141 gcc_assert (sym->gfc_new || sym->old_symbol != NULL);
3142 return;
3145 else if (sym->gfc_new || sym->old_symbol != NULL)
3146 return;
3148 s = XCNEW (gfc_symbol);
3149 *s = *sym;
3150 sym->old_symbol = s;
3151 sym->gfc_new = 0;
3153 latest_undo_chgset->syms.safe_push (sym);
3157 /* Given a name, find a symbol, or create it if it does not exist yet
3158 in the current namespace. If the symbol is found we make sure that
3159 it's OK.
3161 The integer return code indicates
3162 0 All OK
3163 1 The symbol name was ambiguous
3164 2 The name meant to be established was already host associated.
3166 So if the return value is nonzero, then an error was issued. */
3169 gfc_get_sym_tree (const char *name, gfc_namespace *ns, gfc_symtree **result,
3170 bool allow_subroutine)
3172 gfc_symtree *st;
3173 gfc_symbol *p;
3175 /* This doesn't usually happen during resolution. */
3176 if (ns == NULL)
3177 ns = gfc_current_ns;
3179 /* Try to find the symbol in ns. */
3180 st = gfc_find_symtree (ns->sym_root, name);
3182 if (st == NULL && ns->omp_udr_ns)
3184 ns = ns->parent;
3185 st = gfc_find_symtree (ns->sym_root, name);
3188 if (st == NULL)
3190 /* If not there, create a new symbol. */
3191 p = gfc_new_symbol (name, ns);
3193 /* Add to the list of tentative symbols. */
3194 p->old_symbol = NULL;
3195 p->mark = 1;
3196 p->gfc_new = 1;
3197 latest_undo_chgset->syms.safe_push (p);
3199 st = gfc_new_symtree (&ns->sym_root, name);
3200 st->n.sym = p;
3201 p->refs++;
3204 else
3206 /* Make sure the existing symbol is OK. Ambiguous
3207 generic interfaces are permitted, as long as the
3208 specific interfaces are different. */
3209 if (st->ambiguous && !st->n.sym->attr.generic)
3211 ambiguous_symbol (name, st);
3212 return 1;
3215 p = st->n.sym;
3216 if (p->ns != ns && (!p->attr.function || ns->proc_name != p)
3217 && !(allow_subroutine && p->attr.subroutine)
3218 && !(ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY
3219 && (ns->has_import_set || p->attr.imported)))
3221 /* Symbol is from another namespace. */
3222 gfc_error ("Symbol %qs at %C has already been host associated",
3223 name);
3224 return 2;
3227 p->mark = 1;
3229 /* Copy in case this symbol is changed. */
3230 gfc_save_symbol_data (p);
3233 *result = st;
3234 return 0;
3239 gfc_get_symbol (const char *name, gfc_namespace *ns, gfc_symbol **result)
3241 gfc_symtree *st;
3242 int i;
3244 i = gfc_get_sym_tree (name, ns, &st, false);
3245 if (i != 0)
3246 return i;
3248 if (st)
3249 *result = st->n.sym;
3250 else
3251 *result = NULL;
3252 return i;
3256 /* Subroutine that searches for a symbol, creating it if it doesn't
3257 exist, but tries to host-associate the symbol if possible. */
3260 gfc_get_ha_sym_tree (const char *name, gfc_symtree **result)
3262 gfc_symtree *st;
3263 int i;
3265 i = gfc_find_sym_tree (name, gfc_current_ns, 0, &st);
3267 if (st != NULL)
3269 gfc_save_symbol_data (st->n.sym);
3270 *result = st;
3271 return i;
3274 i = gfc_find_sym_tree (name, gfc_current_ns, 1, &st);
3275 if (i)
3276 return i;
3278 if (st != NULL)
3280 *result = st;
3281 return 0;
3284 return gfc_get_sym_tree (name, gfc_current_ns, result, false);
3289 gfc_get_ha_symbol (const char *name, gfc_symbol **result)
3291 int i;
3292 gfc_symtree *st;
3294 i = gfc_get_ha_sym_tree (name, &st);
3296 if (st)
3297 *result = st->n.sym;
3298 else
3299 *result = NULL;
3301 return i;
3305 /* Search for the symtree belonging to a gfc_common_head; we cannot use
3306 head->name as the common_root symtree's name might be mangled. */
3308 static gfc_symtree *
3309 find_common_symtree (gfc_symtree *st, gfc_common_head *head)
3312 gfc_symtree *result;
3314 if (st == NULL)
3315 return NULL;
3317 if (st->n.common == head)
3318 return st;
3320 result = find_common_symtree (st->left, head);
3321 if (!result)
3322 result = find_common_symtree (st->right, head);
3324 return result;
3328 /* Clear the given storage, and make it the current change set for registering
3329 changed symbols. Its contents are freed after a call to
3330 gfc_restore_last_undo_checkpoint or gfc_drop_last_undo_checkpoint, but
3331 it is up to the caller to free the storage itself. It is usually a local
3332 variable, so there is nothing to do anyway. */
3334 void
3335 gfc_new_undo_checkpoint (gfc_undo_change_set &chg_syms)
3337 chg_syms.syms = vNULL;
3338 chg_syms.tbps = vNULL;
3339 chg_syms.previous = latest_undo_chgset;
3340 latest_undo_chgset = &chg_syms;
3344 /* Restore previous state of symbol. Just copy simple stuff. */
3346 static void
3347 restore_old_symbol (gfc_symbol *p)
3349 gfc_symbol *old;
3351 p->mark = 0;
3352 old = p->old_symbol;
3354 p->ts.type = old->ts.type;
3355 p->ts.kind = old->ts.kind;
3357 p->attr = old->attr;
3359 if (p->value != old->value)
3361 gcc_checking_assert (old->value == NULL);
3362 gfc_free_expr (p->value);
3363 p->value = NULL;
3366 if (p->as != old->as)
3368 if (p->as)
3369 gfc_free_array_spec (p->as);
3370 p->as = old->as;
3373 p->generic = old->generic;
3374 p->component_access = old->component_access;
3376 if (p->namelist != NULL && old->namelist == NULL)
3378 gfc_free_namelist (p->namelist);
3379 p->namelist = NULL;
3381 else
3383 if (p->namelist_tail != old->namelist_tail)
3385 gfc_free_namelist (old->namelist_tail->next);
3386 old->namelist_tail->next = NULL;
3390 p->namelist_tail = old->namelist_tail;
3392 if (p->formal != old->formal)
3394 gfc_free_formal_arglist (p->formal);
3395 p->formal = old->formal;
3398 set_symbol_common_block (p, old->common_block);
3399 p->common_head = old->common_head;
3401 p->old_symbol = old->old_symbol;
3402 free (old);
3406 /* Frees the internal data of a gfc_undo_change_set structure. Doesn't free
3407 the structure itself. */
3409 static void
3410 free_undo_change_set_data (gfc_undo_change_set &cs)
3412 cs.syms.release ();
3413 cs.tbps.release ();
3417 /* Given a change set pointer, free its target's contents and update it with
3418 the address of the previous change set. Note that only the contents are
3419 freed, not the target itself (the contents' container). It is not a problem
3420 as the latter will be a local variable usually. */
3422 static void
3423 pop_undo_change_set (gfc_undo_change_set *&cs)
3425 free_undo_change_set_data (*cs);
3426 cs = cs->previous;
3430 static void free_old_symbol (gfc_symbol *sym);
3433 /* Merges the current change set into the previous one. The changes themselves
3434 are left untouched; only one checkpoint is forgotten. */
3436 void
3437 gfc_drop_last_undo_checkpoint (void)
3439 gfc_symbol *s, *t;
3440 unsigned i, j;
3442 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, s)
3444 /* No need to loop in this case. */
3445 if (s->old_symbol == NULL)
3446 continue;
3448 /* Remove the duplicate symbols. */
3449 FOR_EACH_VEC_ELT (latest_undo_chgset->previous->syms, j, t)
3450 if (t == s)
3452 latest_undo_chgset->previous->syms.unordered_remove (j);
3454 /* S->OLD_SYMBOL is the backup symbol for S as it was at the
3455 last checkpoint. We drop that checkpoint, so S->OLD_SYMBOL
3456 shall contain from now on the backup symbol for S as it was
3457 at the checkpoint before. */
3458 if (s->old_symbol->gfc_new)
3460 gcc_assert (s->old_symbol->old_symbol == NULL);
3461 s->gfc_new = s->old_symbol->gfc_new;
3462 free_old_symbol (s);
3464 else
3465 restore_old_symbol (s->old_symbol);
3466 break;
3470 latest_undo_chgset->previous->syms.safe_splice (latest_undo_chgset->syms);
3471 latest_undo_chgset->previous->tbps.safe_splice (latest_undo_chgset->tbps);
3473 pop_undo_change_set (latest_undo_chgset);
3477 /* Undoes all the changes made to symbols since the previous checkpoint.
3478 This subroutine is made simpler due to the fact that attributes are
3479 never removed once added. */
3481 void
3482 gfc_restore_last_undo_checkpoint (void)
3484 gfc_symbol *p;
3485 unsigned i;
3487 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3489 /* Symbol in a common block was new. Or was old and just put in common */
3490 if (p->common_block
3491 && (p->gfc_new || !p->old_symbol->common_block))
3493 /* If the symbol was added to any common block, it
3494 needs to be removed to stop the resolver looking
3495 for a (possibly) dead symbol. */
3496 if (p->common_block->head == p && !p->common_next)
3498 gfc_symtree st, *st0;
3499 st0 = find_common_symtree (p->ns->common_root,
3500 p->common_block);
3501 if (st0)
3503 st.name = st0->name;
3504 gfc_delete_bbt (&p->ns->common_root, &st, compare_symtree);
3505 free (st0);
3509 if (p->common_block->head == p)
3510 p->common_block->head = p->common_next;
3511 else
3513 gfc_symbol *cparent, *csym;
3515 cparent = p->common_block->head;
3516 csym = cparent->common_next;
3518 while (csym != p)
3520 cparent = csym;
3521 csym = csym->common_next;
3524 gcc_assert(cparent->common_next == p);
3525 cparent->common_next = csym->common_next;
3527 p->common_next = NULL;
3529 if (p->gfc_new)
3531 /* The derived type is saved in the symtree with the first
3532 letter capitalized; the all lower-case version to the
3533 derived type contains its associated generic function. */
3534 if (gfc_fl_struct (p->attr.flavor))
3535 gfc_delete_symtree (&p->ns->sym_root,gfc_dt_upper_string (p->name));
3536 else
3537 gfc_delete_symtree (&p->ns->sym_root, p->name);
3539 gfc_release_symbol (p);
3541 else
3542 restore_old_symbol (p);
3545 latest_undo_chgset->syms.truncate (0);
3546 latest_undo_chgset->tbps.truncate (0);
3548 if (!single_undo_checkpoint_p ())
3549 pop_undo_change_set (latest_undo_chgset);
3553 /* Makes sure that there is only one set of changes; in other words we haven't
3554 forgotten to pair a call to gfc_new_checkpoint with a call to either
3555 gfc_drop_last_undo_checkpoint or gfc_restore_last_undo_checkpoint. */
3557 static void
3558 enforce_single_undo_checkpoint (void)
3560 gcc_checking_assert (single_undo_checkpoint_p ());
3564 /* Undoes all the changes made to symbols in the current statement. */
3566 void
3567 gfc_undo_symbols (void)
3569 enforce_single_undo_checkpoint ();
3570 gfc_restore_last_undo_checkpoint ();
3574 /* Free sym->old_symbol. sym->old_symbol is mostly a shallow copy of sym; the
3575 components of old_symbol that might need deallocation are the "allocatables"
3576 that are restored in gfc_undo_symbols(), with two exceptions: namelist and
3577 namelist_tail. In case these differ between old_symbol and sym, it's just
3578 because sym->namelist has gotten a few more items. */
3580 static void
3581 free_old_symbol (gfc_symbol *sym)
3584 if (sym->old_symbol == NULL)
3585 return;
3587 if (sym->old_symbol->as != sym->as)
3588 gfc_free_array_spec (sym->old_symbol->as);
3590 if (sym->old_symbol->value != sym->value)
3591 gfc_free_expr (sym->old_symbol->value);
3593 if (sym->old_symbol->formal != sym->formal)
3594 gfc_free_formal_arglist (sym->old_symbol->formal);
3596 free (sym->old_symbol);
3597 sym->old_symbol = NULL;
3601 /* Makes the changes made in the current statement permanent-- gets
3602 rid of undo information. */
3604 void
3605 gfc_commit_symbols (void)
3607 gfc_symbol *p;
3608 gfc_typebound_proc *tbp;
3609 unsigned i;
3611 enforce_single_undo_checkpoint ();
3613 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3615 p->mark = 0;
3616 p->gfc_new = 0;
3617 free_old_symbol (p);
3619 latest_undo_chgset->syms.truncate (0);
3621 FOR_EACH_VEC_ELT (latest_undo_chgset->tbps, i, tbp)
3622 tbp->error = 0;
3623 latest_undo_chgset->tbps.truncate (0);
3627 /* Makes the changes made in one symbol permanent -- gets rid of undo
3628 information. */
3630 void
3631 gfc_commit_symbol (gfc_symbol *sym)
3633 gfc_symbol *p;
3634 unsigned i;
3636 enforce_single_undo_checkpoint ();
3638 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3639 if (p == sym)
3641 latest_undo_chgset->syms.unordered_remove (i);
3642 break;
3645 sym->mark = 0;
3646 sym->gfc_new = 0;
3648 free_old_symbol (sym);
3652 /* Recursively free trees containing type-bound procedures. */
3654 static void
3655 free_tb_tree (gfc_symtree *t)
3657 if (t == NULL)
3658 return;
3660 free_tb_tree (t->left);
3661 free_tb_tree (t->right);
3663 /* TODO: Free type-bound procedure structs themselves; probably needs some
3664 sort of ref-counting mechanism. */
3666 free (t);
3670 /* Recursive function that deletes an entire tree and all the common
3671 head structures it points to. */
3673 static void
3674 free_common_tree (gfc_symtree * common_tree)
3676 if (common_tree == NULL)
3677 return;
3679 free_common_tree (common_tree->left);
3680 free_common_tree (common_tree->right);
3682 free (common_tree);
3686 /* Recursive function that deletes an entire tree and all the common
3687 head structures it points to. */
3689 static void
3690 free_omp_udr_tree (gfc_symtree * omp_udr_tree)
3692 if (omp_udr_tree == NULL)
3693 return;
3695 free_omp_udr_tree (omp_udr_tree->left);
3696 free_omp_udr_tree (omp_udr_tree->right);
3698 gfc_free_omp_udr (omp_udr_tree->n.omp_udr);
3699 free (omp_udr_tree);
3703 /* Recursive function that deletes an entire tree and all the user
3704 operator nodes that it contains. */
3706 static void
3707 free_uop_tree (gfc_symtree *uop_tree)
3709 if (uop_tree == NULL)
3710 return;
3712 free_uop_tree (uop_tree->left);
3713 free_uop_tree (uop_tree->right);
3715 gfc_free_interface (uop_tree->n.uop->op);
3716 free (uop_tree->n.uop);
3717 free (uop_tree);
3721 /* Recursive function that deletes an entire tree and all the symbols
3722 that it contains. */
3724 static void
3725 free_sym_tree (gfc_symtree *sym_tree)
3727 if (sym_tree == NULL)
3728 return;
3730 free_sym_tree (sym_tree->left);
3731 free_sym_tree (sym_tree->right);
3733 gfc_release_symbol (sym_tree->n.sym);
3734 free (sym_tree);
3738 /* Free the derived type list. */
3740 void
3741 gfc_free_dt_list (void)
3743 gfc_dt_list *dt, *n;
3745 for (dt = gfc_derived_types; dt; dt = n)
3747 n = dt->next;
3748 free (dt);
3751 gfc_derived_types = NULL;
3755 /* Free the gfc_equiv_info's. */
3757 static void
3758 gfc_free_equiv_infos (gfc_equiv_info *s)
3760 if (s == NULL)
3761 return;
3762 gfc_free_equiv_infos (s->next);
3763 free (s);
3767 /* Free the gfc_equiv_lists. */
3769 static void
3770 gfc_free_equiv_lists (gfc_equiv_list *l)
3772 if (l == NULL)
3773 return;
3774 gfc_free_equiv_lists (l->next);
3775 gfc_free_equiv_infos (l->equiv);
3776 free (l);
3780 /* Free a finalizer procedure list. */
3782 void
3783 gfc_free_finalizer (gfc_finalizer* el)
3785 if (el)
3787 gfc_release_symbol (el->proc_sym);
3788 free (el);
3792 static void
3793 gfc_free_finalizer_list (gfc_finalizer* list)
3795 while (list)
3797 gfc_finalizer* current = list;
3798 list = list->next;
3799 gfc_free_finalizer (current);
3804 /* Create a new gfc_charlen structure and add it to a namespace.
3805 If 'old_cl' is given, the newly created charlen will be a copy of it. */
3807 gfc_charlen*
3808 gfc_new_charlen (gfc_namespace *ns, gfc_charlen *old_cl)
3810 gfc_charlen *cl;
3812 cl = gfc_get_charlen ();
3814 /* Copy old_cl. */
3815 if (old_cl)
3817 cl->length = gfc_copy_expr (old_cl->length);
3818 cl->length_from_typespec = old_cl->length_from_typespec;
3819 cl->backend_decl = old_cl->backend_decl;
3820 cl->passed_length = old_cl->passed_length;
3821 cl->resolved = old_cl->resolved;
3824 /* Put into namespace. */
3825 cl->next = ns->cl_list;
3826 ns->cl_list = cl;
3828 return cl;
3832 /* Free the charlen list from cl to end (end is not freed).
3833 Free the whole list if end is NULL. */
3835 void
3836 gfc_free_charlen (gfc_charlen *cl, gfc_charlen *end)
3838 gfc_charlen *cl2;
3840 for (; cl != end; cl = cl2)
3842 gcc_assert (cl);
3844 cl2 = cl->next;
3845 gfc_free_expr (cl->length);
3846 free (cl);
3851 /* Free entry list structs. */
3853 static void
3854 free_entry_list (gfc_entry_list *el)
3856 gfc_entry_list *next;
3858 if (el == NULL)
3859 return;
3861 next = el->next;
3862 free (el);
3863 free_entry_list (next);
3867 /* Free a namespace structure and everything below it. Interface
3868 lists associated with intrinsic operators are not freed. These are
3869 taken care of when a specific name is freed. */
3871 void
3872 gfc_free_namespace (gfc_namespace *ns)
3874 gfc_namespace *p, *q;
3875 int i;
3877 if (ns == NULL)
3878 return;
3880 ns->refs--;
3881 if (ns->refs > 0)
3882 return;
3883 gcc_assert (ns->refs == 0);
3885 gfc_free_statements (ns->code);
3887 free_sym_tree (ns->sym_root);
3888 free_uop_tree (ns->uop_root);
3889 free_common_tree (ns->common_root);
3890 free_omp_udr_tree (ns->omp_udr_root);
3891 free_tb_tree (ns->tb_sym_root);
3892 free_tb_tree (ns->tb_uop_root);
3893 gfc_free_finalizer_list (ns->finalizers);
3894 gfc_free_omp_declare_simd_list (ns->omp_declare_simd);
3895 gfc_free_charlen (ns->cl_list, NULL);
3896 free_st_labels (ns->st_labels);
3898 free_entry_list (ns->entries);
3899 gfc_free_equiv (ns->equiv);
3900 gfc_free_equiv_lists (ns->equiv_lists);
3901 gfc_free_use_stmts (ns->use_stmts);
3903 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3904 gfc_free_interface (ns->op[i]);
3906 gfc_free_data (ns->data);
3907 p = ns->contained;
3908 free (ns);
3910 /* Recursively free any contained namespaces. */
3911 while (p != NULL)
3913 q = p;
3914 p = p->sibling;
3915 gfc_free_namespace (q);
3920 void
3921 gfc_symbol_init_2 (void)
3924 gfc_current_ns = gfc_get_namespace (NULL, 0);
3928 void
3929 gfc_symbol_done_2 (void)
3931 gfc_free_namespace (gfc_current_ns);
3932 gfc_current_ns = NULL;
3933 gfc_free_dt_list ();
3935 enforce_single_undo_checkpoint ();
3936 free_undo_change_set_data (*latest_undo_chgset);
3940 /* Count how many nodes a symtree has. */
3942 static unsigned
3943 count_st_nodes (const gfc_symtree *st)
3945 unsigned nodes;
3946 if (!st)
3947 return 0;
3949 nodes = count_st_nodes (st->left);
3950 nodes++;
3951 nodes += count_st_nodes (st->right);
3953 return nodes;
3957 /* Convert symtree tree into symtree vector. */
3959 static unsigned
3960 fill_st_vector (gfc_symtree *st, gfc_symtree **st_vec, unsigned node_cntr)
3962 if (!st)
3963 return node_cntr;
3965 node_cntr = fill_st_vector (st->left, st_vec, node_cntr);
3966 st_vec[node_cntr++] = st;
3967 node_cntr = fill_st_vector (st->right, st_vec, node_cntr);
3969 return node_cntr;
3973 /* Traverse namespace. As the functions might modify the symtree, we store the
3974 symtree as a vector and operate on this vector. Note: We assume that
3975 sym_func or st_func never deletes nodes from the symtree - only adding is
3976 allowed. Additionally, newly added nodes are not traversed. */
3978 static void
3979 do_traverse_symtree (gfc_symtree *st, void (*st_func) (gfc_symtree *),
3980 void (*sym_func) (gfc_symbol *))
3982 gfc_symtree **st_vec;
3983 unsigned nodes, i, node_cntr;
3985 gcc_assert ((st_func && !sym_func) || (!st_func && sym_func));
3986 nodes = count_st_nodes (st);
3987 st_vec = XALLOCAVEC (gfc_symtree *, nodes);
3988 node_cntr = 0;
3989 fill_st_vector (st, st_vec, node_cntr);
3991 if (sym_func)
3993 /* Clear marks. */
3994 for (i = 0; i < nodes; i++)
3995 st_vec[i]->n.sym->mark = 0;
3996 for (i = 0; i < nodes; i++)
3997 if (!st_vec[i]->n.sym->mark)
3999 (*sym_func) (st_vec[i]->n.sym);
4000 st_vec[i]->n.sym->mark = 1;
4003 else
4004 for (i = 0; i < nodes; i++)
4005 (*st_func) (st_vec[i]);
4009 /* Recursively traverse the symtree nodes. */
4011 void
4012 gfc_traverse_symtree (gfc_symtree *st, void (*st_func) (gfc_symtree *))
4014 do_traverse_symtree (st, st_func, NULL);
4018 /* Call a given function for all symbols in the namespace. We take
4019 care that each gfc_symbol node is called exactly once. */
4021 void
4022 gfc_traverse_ns (gfc_namespace *ns, void (*sym_func) (gfc_symbol *))
4024 do_traverse_symtree (ns->sym_root, NULL, sym_func);
4028 /* Return TRUE when name is the name of an intrinsic type. */
4030 bool
4031 gfc_is_intrinsic_typename (const char *name)
4033 if (strcmp (name, "integer") == 0
4034 || strcmp (name, "real") == 0
4035 || strcmp (name, "character") == 0
4036 || strcmp (name, "logical") == 0
4037 || strcmp (name, "complex") == 0
4038 || strcmp (name, "doubleprecision") == 0
4039 || strcmp (name, "doublecomplex") == 0)
4040 return true;
4041 else
4042 return false;
4046 /* Return TRUE if the symbol is an automatic variable. */
4048 static bool
4049 gfc_is_var_automatic (gfc_symbol *sym)
4051 /* Pointer and allocatable variables are never automatic. */
4052 if (sym->attr.pointer || sym->attr.allocatable)
4053 return false;
4054 /* Check for arrays with non-constant size. */
4055 if (sym->attr.dimension && sym->as
4056 && !gfc_is_compile_time_shape (sym->as))
4057 return true;
4058 /* Check for non-constant length character variables. */
4059 if (sym->ts.type == BT_CHARACTER
4060 && sym->ts.u.cl
4061 && !gfc_is_constant_expr (sym->ts.u.cl->length))
4062 return true;
4063 /* Variables with explicit AUTOMATIC attribute. */
4064 if (sym->attr.automatic)
4065 return true;
4067 return false;
4070 /* Given a symbol, mark it as SAVEd if it is allowed. */
4072 static void
4073 save_symbol (gfc_symbol *sym)
4076 if (sym->attr.use_assoc)
4077 return;
4079 if (sym->attr.in_common
4080 || sym->attr.dummy
4081 || sym->attr.result
4082 || sym->attr.flavor != FL_VARIABLE)
4083 return;
4084 /* Automatic objects are not saved. */
4085 if (gfc_is_var_automatic (sym))
4086 return;
4087 gfc_add_save (&sym->attr, SAVE_EXPLICIT, sym->name, &sym->declared_at);
4091 /* Mark those symbols which can be SAVEd as such. */
4093 void
4094 gfc_save_all (gfc_namespace *ns)
4096 gfc_traverse_ns (ns, save_symbol);
4100 /* Make sure that no changes to symbols are pending. */
4102 void
4103 gfc_enforce_clean_symbol_state(void)
4105 enforce_single_undo_checkpoint ();
4106 gcc_assert (latest_undo_chgset->syms.is_empty ());
4110 /************** Global symbol handling ************/
4113 /* Search a tree for the global symbol. */
4115 gfc_gsymbol *
4116 gfc_find_gsymbol (gfc_gsymbol *symbol, const char *name)
4118 int c;
4120 if (symbol == NULL)
4121 return NULL;
4123 while (symbol)
4125 c = strcmp (name, symbol->name);
4126 if (!c)
4127 return symbol;
4129 symbol = (c < 0) ? symbol->left : symbol->right;
4132 return NULL;
4136 /* Compare two global symbols. Used for managing the BB tree. */
4138 static int
4139 gsym_compare (void *_s1, void *_s2)
4141 gfc_gsymbol *s1, *s2;
4143 s1 = (gfc_gsymbol *) _s1;
4144 s2 = (gfc_gsymbol *) _s2;
4145 return strcmp (s1->name, s2->name);
4149 /* Get a global symbol, creating it if it doesn't exist. */
4151 gfc_gsymbol *
4152 gfc_get_gsymbol (const char *name)
4154 gfc_gsymbol *s;
4156 s = gfc_find_gsymbol (gfc_gsym_root, name);
4157 if (s != NULL)
4158 return s;
4160 s = XCNEW (gfc_gsymbol);
4161 s->type = GSYM_UNKNOWN;
4162 s->name = gfc_get_string ("%s", name);
4164 gfc_insert_bbt (&gfc_gsym_root, s, gsym_compare);
4166 return s;
4170 static gfc_symbol *
4171 get_iso_c_binding_dt (int sym_id)
4173 gfc_dt_list *dt_list;
4175 dt_list = gfc_derived_types;
4177 /* Loop through the derived types in the name list, searching for
4178 the desired symbol from iso_c_binding. Search the parent namespaces
4179 if necessary and requested to (parent_flag). */
4180 while (dt_list != NULL)
4182 if (dt_list->derived->from_intmod != INTMOD_NONE
4183 && dt_list->derived->intmod_sym_id == sym_id)
4184 return dt_list->derived;
4186 dt_list = dt_list->next;
4189 return NULL;
4193 /* Verifies that the given derived type symbol, derived_sym, is interoperable
4194 with C. This is necessary for any derived type that is BIND(C) and for
4195 derived types that are parameters to functions that are BIND(C). All
4196 fields of the derived type are required to be interoperable, and are tested
4197 for such. If an error occurs, the errors are reported here, allowing for
4198 multiple errors to be handled for a single derived type. */
4200 bool
4201 verify_bind_c_derived_type (gfc_symbol *derived_sym)
4203 gfc_component *curr_comp = NULL;
4204 bool is_c_interop = false;
4205 bool retval = true;
4207 if (derived_sym == NULL)
4208 gfc_internal_error ("verify_bind_c_derived_type(): Given symbol is "
4209 "unexpectedly NULL");
4211 /* If we've already looked at this derived symbol, do not look at it again
4212 so we don't repeat warnings/errors. */
4213 if (derived_sym->ts.is_c_interop)
4214 return true;
4216 /* The derived type must have the BIND attribute to be interoperable
4217 J3/04-007, Section 15.2.3. */
4218 if (derived_sym->attr.is_bind_c != 1)
4220 derived_sym->ts.is_c_interop = 0;
4221 gfc_error_now ("Derived type %qs declared at %L must have the BIND "
4222 "attribute to be C interoperable", derived_sym->name,
4223 &(derived_sym->declared_at));
4224 retval = false;
4227 curr_comp = derived_sym->components;
4229 /* Fortran 2003 allows an empty derived type. C99 appears to disallow an
4230 empty struct. Section 15.2 in Fortran 2003 states: "The following
4231 subclauses define the conditions under which a Fortran entity is
4232 interoperable. If a Fortran entity is interoperable, an equivalent
4233 entity may be defined by means of C and the Fortran entity is said
4234 to be interoperable with the C entity. There does not have to be such
4235 an interoperating C entity."
4237 if (curr_comp == NULL)
4239 gfc_warning (0, "Derived type %qs with BIND(C) attribute at %L is empty, "
4240 "and may be inaccessible by the C companion processor",
4241 derived_sym->name, &(derived_sym->declared_at));
4242 derived_sym->ts.is_c_interop = 1;
4243 derived_sym->attr.is_bind_c = 1;
4244 return true;
4248 /* Initialize the derived type as being C interoperable.
4249 If we find an error in the components, this will be set false. */
4250 derived_sym->ts.is_c_interop = 1;
4252 /* Loop through the list of components to verify that the kind of
4253 each is a C interoperable type. */
4256 /* The components cannot be pointers (fortran sense).
4257 J3/04-007, Section 15.2.3, C1505. */
4258 if (curr_comp->attr.pointer != 0)
4260 gfc_error ("Component %qs at %L cannot have the "
4261 "POINTER attribute because it is a member "
4262 "of the BIND(C) derived type %qs at %L",
4263 curr_comp->name, &(curr_comp->loc),
4264 derived_sym->name, &(derived_sym->declared_at));
4265 retval = false;
4268 if (curr_comp->attr.proc_pointer != 0)
4270 gfc_error ("Procedure pointer component %qs at %L cannot be a member"
4271 " of the BIND(C) derived type %qs at %L", curr_comp->name,
4272 &curr_comp->loc, derived_sym->name,
4273 &derived_sym->declared_at);
4274 retval = false;
4277 /* The components cannot be allocatable.
4278 J3/04-007, Section 15.2.3, C1505. */
4279 if (curr_comp->attr.allocatable != 0)
4281 gfc_error ("Component %qs at %L cannot have the "
4282 "ALLOCATABLE attribute because it is a member "
4283 "of the BIND(C) derived type %qs at %L",
4284 curr_comp->name, &(curr_comp->loc),
4285 derived_sym->name, &(derived_sym->declared_at));
4286 retval = false;
4289 /* BIND(C) derived types must have interoperable components. */
4290 if (curr_comp->ts.type == BT_DERIVED
4291 && curr_comp->ts.u.derived->ts.is_iso_c != 1
4292 && curr_comp->ts.u.derived != derived_sym)
4294 /* This should be allowed; the draft says a derived-type can not
4295 have type parameters if it is has the BIND attribute. Type
4296 parameters seem to be for making parameterized derived types.
4297 There's no need to verify the type if it is c_ptr/c_funptr. */
4298 retval = verify_bind_c_derived_type (curr_comp->ts.u.derived);
4300 else
4302 /* Grab the typespec for the given component and test the kind. */
4303 is_c_interop = gfc_verify_c_interop (&(curr_comp->ts));
4305 if (!is_c_interop)
4307 /* Report warning and continue since not fatal. The
4308 draft does specify a constraint that requires all fields
4309 to interoperate, but if the user says real(4), etc., it
4310 may interoperate with *something* in C, but the compiler
4311 most likely won't know exactly what. Further, it may not
4312 interoperate with the same data type(s) in C if the user
4313 recompiles with different flags (e.g., -m32 and -m64 on
4314 x86_64 and using integer(4) to claim interop with a
4315 C_LONG). */
4316 if (derived_sym->attr.is_bind_c == 1 && warn_c_binding_type)
4317 /* If the derived type is bind(c), all fields must be
4318 interop. */
4319 gfc_warning (OPT_Wc_binding_type,
4320 "Component %qs in derived type %qs at %L "
4321 "may not be C interoperable, even though "
4322 "derived type %qs is BIND(C)",
4323 curr_comp->name, derived_sym->name,
4324 &(curr_comp->loc), derived_sym->name);
4325 else if (warn_c_binding_type)
4326 /* If derived type is param to bind(c) routine, or to one
4327 of the iso_c_binding procs, it must be interoperable, so
4328 all fields must interop too. */
4329 gfc_warning (OPT_Wc_binding_type,
4330 "Component %qs in derived type %qs at %L "
4331 "may not be C interoperable",
4332 curr_comp->name, derived_sym->name,
4333 &(curr_comp->loc));
4337 curr_comp = curr_comp->next;
4338 } while (curr_comp != NULL);
4341 /* Make sure we don't have conflicts with the attributes. */
4342 if (derived_sym->attr.access == ACCESS_PRIVATE)
4344 gfc_error ("Derived type %qs at %L cannot be declared with both "
4345 "PRIVATE and BIND(C) attributes", derived_sym->name,
4346 &(derived_sym->declared_at));
4347 retval = false;
4350 if (derived_sym->attr.sequence != 0)
4352 gfc_error ("Derived type %qs at %L cannot have the SEQUENCE "
4353 "attribute because it is BIND(C)", derived_sym->name,
4354 &(derived_sym->declared_at));
4355 retval = false;
4358 /* Mark the derived type as not being C interoperable if we found an
4359 error. If there were only warnings, proceed with the assumption
4360 it's interoperable. */
4361 if (!retval)
4362 derived_sym->ts.is_c_interop = 0;
4364 return retval;
4368 /* Generate symbols for the named constants c_null_ptr and c_null_funptr. */
4370 static bool
4371 gen_special_c_interop_ptr (gfc_symbol *tmp_sym, gfc_symtree *dt_symtree)
4373 gfc_constructor *c;
4375 gcc_assert (tmp_sym && dt_symtree && dt_symtree->n.sym);
4376 dt_symtree->n.sym->attr.referenced = 1;
4378 tmp_sym->attr.is_c_interop = 1;
4379 tmp_sym->attr.is_bind_c = 1;
4380 tmp_sym->ts.is_c_interop = 1;
4381 tmp_sym->ts.is_iso_c = 1;
4382 tmp_sym->ts.type = BT_DERIVED;
4383 tmp_sym->ts.f90_type = BT_VOID;
4384 tmp_sym->attr.flavor = FL_PARAMETER;
4385 tmp_sym->ts.u.derived = dt_symtree->n.sym;
4387 /* Set the c_address field of c_null_ptr and c_null_funptr to
4388 the value of NULL. */
4389 tmp_sym->value = gfc_get_expr ();
4390 tmp_sym->value->expr_type = EXPR_STRUCTURE;
4391 tmp_sym->value->ts.type = BT_DERIVED;
4392 tmp_sym->value->ts.f90_type = BT_VOID;
4393 tmp_sym->value->ts.u.derived = tmp_sym->ts.u.derived;
4394 gfc_constructor_append_expr (&tmp_sym->value->value.constructor, NULL, NULL);
4395 c = gfc_constructor_first (tmp_sym->value->value.constructor);
4396 c->expr = gfc_get_int_expr (gfc_index_integer_kind, NULL, 0);
4397 c->expr->ts.is_iso_c = 1;
4399 return true;
4403 /* Add a formal argument, gfc_formal_arglist, to the
4404 end of the given list of arguments. Set the reference to the
4405 provided symbol, param_sym, in the argument. */
4407 static void
4408 add_formal_arg (gfc_formal_arglist **head,
4409 gfc_formal_arglist **tail,
4410 gfc_formal_arglist *formal_arg,
4411 gfc_symbol *param_sym)
4413 /* Put in list, either as first arg or at the tail (curr arg). */
4414 if (*head == NULL)
4415 *head = *tail = formal_arg;
4416 else
4418 (*tail)->next = formal_arg;
4419 (*tail) = formal_arg;
4422 (*tail)->sym = param_sym;
4423 (*tail)->next = NULL;
4425 return;
4429 /* Add a procedure interface to the given symbol (i.e., store a
4430 reference to the list of formal arguments). */
4432 static void
4433 add_proc_interface (gfc_symbol *sym, ifsrc source, gfc_formal_arglist *formal)
4436 sym->formal = formal;
4437 sym->attr.if_source = source;
4441 /* Copy the formal args from an existing symbol, src, into a new
4442 symbol, dest. New formal args are created, and the description of
4443 each arg is set according to the existing ones. This function is
4444 used when creating procedure declaration variables from a procedure
4445 declaration statement (see match_proc_decl()) to create the formal
4446 args based on the args of a given named interface.
4448 When an actual argument list is provided, skip the absent arguments.
4449 To be used together with gfc_se->ignore_optional. */
4451 void
4452 gfc_copy_formal_args_intr (gfc_symbol *dest, gfc_intrinsic_sym *src,
4453 gfc_actual_arglist *actual)
4455 gfc_formal_arglist *head = NULL;
4456 gfc_formal_arglist *tail = NULL;
4457 gfc_formal_arglist *formal_arg = NULL;
4458 gfc_intrinsic_arg *curr_arg = NULL;
4459 gfc_formal_arglist *formal_prev = NULL;
4460 gfc_actual_arglist *act_arg = actual;
4461 /* Save current namespace so we can change it for formal args. */
4462 gfc_namespace *parent_ns = gfc_current_ns;
4464 /* Create a new namespace, which will be the formal ns (namespace
4465 of the formal args). */
4466 gfc_current_ns = gfc_get_namespace (parent_ns, 0);
4467 gfc_current_ns->proc_name = dest;
4469 for (curr_arg = src->formal; curr_arg; curr_arg = curr_arg->next)
4471 /* Skip absent arguments. */
4472 if (actual)
4474 gcc_assert (act_arg != NULL);
4475 if (act_arg->expr == NULL)
4477 act_arg = act_arg->next;
4478 continue;
4480 act_arg = act_arg->next;
4482 formal_arg = gfc_get_formal_arglist ();
4483 gfc_get_symbol (curr_arg->name, gfc_current_ns, &(formal_arg->sym));
4485 /* May need to copy more info for the symbol. */
4486 formal_arg->sym->ts = curr_arg->ts;
4487 formal_arg->sym->attr.optional = curr_arg->optional;
4488 formal_arg->sym->attr.value = curr_arg->value;
4489 formal_arg->sym->attr.intent = curr_arg->intent;
4490 formal_arg->sym->attr.flavor = FL_VARIABLE;
4491 formal_arg->sym->attr.dummy = 1;
4493 if (formal_arg->sym->ts.type == BT_CHARACTER)
4494 formal_arg->sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4496 /* If this isn't the first arg, set up the next ptr. For the
4497 last arg built, the formal_arg->next will never get set to
4498 anything other than NULL. */
4499 if (formal_prev != NULL)
4500 formal_prev->next = formal_arg;
4501 else
4502 formal_arg->next = NULL;
4504 formal_prev = formal_arg;
4506 /* Add arg to list of formal args. */
4507 add_formal_arg (&head, &tail, formal_arg, formal_arg->sym);
4509 /* Validate changes. */
4510 gfc_commit_symbol (formal_arg->sym);
4513 /* Add the interface to the symbol. */
4514 add_proc_interface (dest, IFSRC_DECL, head);
4516 /* Store the formal namespace information. */
4517 if (dest->formal != NULL)
4518 /* The current ns should be that for the dest proc. */
4519 dest->formal_ns = gfc_current_ns;
4520 /* Restore the current namespace to what it was on entry. */
4521 gfc_current_ns = parent_ns;
4525 static int
4526 std_for_isocbinding_symbol (int id)
4528 switch (id)
4530 #define NAMED_INTCST(a,b,c,d) \
4531 case a:\
4532 return d;
4533 #include "iso-c-binding.def"
4534 #undef NAMED_INTCST
4536 #define NAMED_FUNCTION(a,b,c,d) \
4537 case a:\
4538 return d;
4539 #define NAMED_SUBROUTINE(a,b,c,d) \
4540 case a:\
4541 return d;
4542 #include "iso-c-binding.def"
4543 #undef NAMED_FUNCTION
4544 #undef NAMED_SUBROUTINE
4546 default:
4547 return GFC_STD_F2003;
4551 /* Generate the given set of C interoperable kind objects, or all
4552 interoperable kinds. This function will only be given kind objects
4553 for valid iso_c_binding defined types because this is verified when
4554 the 'use' statement is parsed. If the user gives an 'only' clause,
4555 the specific kinds are looked up; if they don't exist, an error is
4556 reported. If the user does not give an 'only' clause, all
4557 iso_c_binding symbols are generated. If a list of specific kinds
4558 is given, it must have a NULL in the first empty spot to mark the
4559 end of the list. For C_null_(fun)ptr, dt_symtree has to be set and
4560 point to the symtree for c_(fun)ptr. */
4562 gfc_symtree *
4563 generate_isocbinding_symbol (const char *mod_name, iso_c_binding_symbol s,
4564 const char *local_name, gfc_symtree *dt_symtree,
4565 bool hidden)
4567 const char *const name = (local_name && local_name[0])
4568 ? local_name : c_interop_kinds_table[s].name;
4569 gfc_symtree *tmp_symtree;
4570 gfc_symbol *tmp_sym = NULL;
4571 int index;
4573 if (gfc_notification_std (std_for_isocbinding_symbol (s)) == ERROR)
4574 return NULL;
4576 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
4577 if (hidden
4578 && (!tmp_symtree || !tmp_symtree->n.sym
4579 || tmp_symtree->n.sym->from_intmod != INTMOD_ISO_C_BINDING
4580 || tmp_symtree->n.sym->intmod_sym_id != s))
4581 tmp_symtree = NULL;
4583 /* Already exists in this scope so don't re-add it. */
4584 if (tmp_symtree != NULL && (tmp_sym = tmp_symtree->n.sym) != NULL
4585 && (!tmp_sym->attr.generic
4586 || (tmp_sym = gfc_find_dt_in_generic (tmp_sym)) != NULL)
4587 && tmp_sym->from_intmod == INTMOD_ISO_C_BINDING)
4589 if (tmp_sym->attr.flavor == FL_DERIVED
4590 && !get_iso_c_binding_dt (tmp_sym->intmod_sym_id))
4592 gfc_dt_list *dt_list;
4593 dt_list = gfc_get_dt_list ();
4594 dt_list->derived = tmp_sym;
4595 dt_list->next = gfc_derived_types;
4596 gfc_derived_types = dt_list;
4599 return tmp_symtree;
4602 /* Create the sym tree in the current ns. */
4603 if (hidden)
4605 tmp_symtree = gfc_get_unique_symtree (gfc_current_ns);
4606 tmp_sym = gfc_new_symbol (name, gfc_current_ns);
4608 /* Add to the list of tentative symbols. */
4609 latest_undo_chgset->syms.safe_push (tmp_sym);
4610 tmp_sym->old_symbol = NULL;
4611 tmp_sym->mark = 1;
4612 tmp_sym->gfc_new = 1;
4614 tmp_symtree->n.sym = tmp_sym;
4615 tmp_sym->refs++;
4617 else
4619 gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
4620 gcc_assert (tmp_symtree);
4621 tmp_sym = tmp_symtree->n.sym;
4624 /* Say what module this symbol belongs to. */
4625 tmp_sym->module = gfc_get_string ("%s", mod_name);
4626 tmp_sym->from_intmod = INTMOD_ISO_C_BINDING;
4627 tmp_sym->intmod_sym_id = s;
4628 tmp_sym->attr.is_iso_c = 1;
4629 tmp_sym->attr.use_assoc = 1;
4631 gcc_assert (dt_symtree == NULL || s == ISOCBINDING_NULL_FUNPTR
4632 || s == ISOCBINDING_NULL_PTR);
4634 switch (s)
4637 #define NAMED_INTCST(a,b,c,d) case a :
4638 #define NAMED_REALCST(a,b,c,d) case a :
4639 #define NAMED_CMPXCST(a,b,c,d) case a :
4640 #define NAMED_LOGCST(a,b,c) case a :
4641 #define NAMED_CHARKNDCST(a,b,c) case a :
4642 #include "iso-c-binding.def"
4644 tmp_sym->value = gfc_get_int_expr (gfc_default_integer_kind, NULL,
4645 c_interop_kinds_table[s].value);
4647 /* Initialize an integer constant expression node. */
4648 tmp_sym->attr.flavor = FL_PARAMETER;
4649 tmp_sym->ts.type = BT_INTEGER;
4650 tmp_sym->ts.kind = gfc_default_integer_kind;
4652 /* Mark this type as a C interoperable one. */
4653 tmp_sym->ts.is_c_interop = 1;
4654 tmp_sym->ts.is_iso_c = 1;
4655 tmp_sym->value->ts.is_c_interop = 1;
4656 tmp_sym->value->ts.is_iso_c = 1;
4657 tmp_sym->attr.is_c_interop = 1;
4659 /* Tell what f90 type this c interop kind is valid. */
4660 tmp_sym->ts.f90_type = c_interop_kinds_table[s].f90_type;
4662 break;
4665 #define NAMED_CHARCST(a,b,c) case a :
4666 #include "iso-c-binding.def"
4668 /* Initialize an integer constant expression node for the
4669 length of the character. */
4670 tmp_sym->value = gfc_get_character_expr (gfc_default_character_kind,
4671 &gfc_current_locus, NULL, 1);
4672 tmp_sym->value->ts.is_c_interop = 1;
4673 tmp_sym->value->ts.is_iso_c = 1;
4674 tmp_sym->value->value.character.length = 1;
4675 tmp_sym->value->value.character.string[0]
4676 = (gfc_char_t) c_interop_kinds_table[s].value;
4677 tmp_sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
4678 tmp_sym->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
4679 NULL, 1);
4681 /* May not need this in both attr and ts, but do need in
4682 attr for writing module file. */
4683 tmp_sym->attr.is_c_interop = 1;
4685 tmp_sym->attr.flavor = FL_PARAMETER;
4686 tmp_sym->ts.type = BT_CHARACTER;
4688 /* Need to set it to the C_CHAR kind. */
4689 tmp_sym->ts.kind = gfc_default_character_kind;
4691 /* Mark this type as a C interoperable one. */
4692 tmp_sym->ts.is_c_interop = 1;
4693 tmp_sym->ts.is_iso_c = 1;
4695 /* Tell what f90 type this c interop kind is valid. */
4696 tmp_sym->ts.f90_type = BT_CHARACTER;
4698 break;
4700 case ISOCBINDING_PTR:
4701 case ISOCBINDING_FUNPTR:
4703 gfc_symbol *dt_sym;
4704 gfc_dt_list **dt_list_ptr = NULL;
4705 gfc_component *tmp_comp = NULL;
4707 /* Generate real derived type. */
4708 if (hidden)
4709 dt_sym = tmp_sym;
4710 else
4712 const char *hidden_name;
4713 gfc_interface *intr, *head;
4715 hidden_name = gfc_dt_upper_string (tmp_sym->name);
4716 tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
4717 hidden_name);
4718 gcc_assert (tmp_symtree == NULL);
4719 gfc_get_sym_tree (hidden_name, gfc_current_ns, &tmp_symtree, false);
4720 dt_sym = tmp_symtree->n.sym;
4721 dt_sym->name = gfc_get_string (s == ISOCBINDING_PTR
4722 ? "c_ptr" : "c_funptr");
4724 /* Generate an artificial generic function. */
4725 head = tmp_sym->generic;
4726 intr = gfc_get_interface ();
4727 intr->sym = dt_sym;
4728 intr->where = gfc_current_locus;
4729 intr->next = head;
4730 tmp_sym->generic = intr;
4732 if (!tmp_sym->attr.generic
4733 && !gfc_add_generic (&tmp_sym->attr, tmp_sym->name, NULL))
4734 return NULL;
4736 if (!tmp_sym->attr.function
4737 && !gfc_add_function (&tmp_sym->attr, tmp_sym->name, NULL))
4738 return NULL;
4741 /* Say what module this symbol belongs to. */
4742 dt_sym->module = gfc_get_string ("%s", mod_name);
4743 dt_sym->from_intmod = INTMOD_ISO_C_BINDING;
4744 dt_sym->intmod_sym_id = s;
4745 dt_sym->attr.use_assoc = 1;
4747 /* Initialize an integer constant expression node. */
4748 dt_sym->attr.flavor = FL_DERIVED;
4749 dt_sym->ts.is_c_interop = 1;
4750 dt_sym->attr.is_c_interop = 1;
4751 dt_sym->attr.private_comp = 1;
4752 dt_sym->component_access = ACCESS_PRIVATE;
4753 dt_sym->ts.is_iso_c = 1;
4754 dt_sym->ts.type = BT_DERIVED;
4755 dt_sym->ts.f90_type = BT_VOID;
4757 /* A derived type must have the bind attribute to be
4758 interoperable (J3/04-007, Section 15.2.3), even though
4759 the binding label is not used. */
4760 dt_sym->attr.is_bind_c = 1;
4762 dt_sym->attr.referenced = 1;
4763 dt_sym->ts.u.derived = dt_sym;
4765 /* Add the symbol created for the derived type to the current ns. */
4766 dt_list_ptr = &(gfc_derived_types);
4767 while (*dt_list_ptr != NULL && (*dt_list_ptr)->next != NULL)
4768 dt_list_ptr = &((*dt_list_ptr)->next);
4770 /* There is already at least one derived type in the list, so append
4771 the one we're currently building for c_ptr or c_funptr. */
4772 if (*dt_list_ptr != NULL)
4773 dt_list_ptr = &((*dt_list_ptr)->next);
4774 (*dt_list_ptr) = gfc_get_dt_list ();
4775 (*dt_list_ptr)->derived = dt_sym;
4776 (*dt_list_ptr)->next = NULL;
4778 gfc_add_component (dt_sym, "c_address", &tmp_comp);
4779 if (tmp_comp == NULL)
4780 gcc_unreachable ();
4782 tmp_comp->ts.type = BT_INTEGER;
4784 /* Set this because the module will need to read/write this field. */
4785 tmp_comp->ts.f90_type = BT_INTEGER;
4787 /* The kinds for c_ptr and c_funptr are the same. */
4788 index = get_c_kind ("c_ptr", c_interop_kinds_table);
4789 tmp_comp->ts.kind = c_interop_kinds_table[index].value;
4790 tmp_comp->attr.access = ACCESS_PRIVATE;
4792 /* Mark the component as C interoperable. */
4793 tmp_comp->ts.is_c_interop = 1;
4796 break;
4798 case ISOCBINDING_NULL_PTR:
4799 case ISOCBINDING_NULL_FUNPTR:
4800 gen_special_c_interop_ptr (tmp_sym, dt_symtree);
4801 break;
4803 default:
4804 gcc_unreachable ();
4806 gfc_commit_symbol (tmp_sym);
4807 return tmp_symtree;
4811 /* Check that a symbol is already typed. If strict is not set, an untyped
4812 symbol is acceptable for non-standard-conforming mode. */
4814 bool
4815 gfc_check_symbol_typed (gfc_symbol* sym, gfc_namespace* ns,
4816 bool strict, locus where)
4818 gcc_assert (sym);
4820 if (gfc_matching_prefix)
4821 return true;
4823 /* Check for the type and try to give it an implicit one. */
4824 if (sym->ts.type == BT_UNKNOWN
4825 && !gfc_set_default_type (sym, 0, ns))
4827 if (strict)
4829 gfc_error ("Symbol %qs is used before it is typed at %L",
4830 sym->name, &where);
4831 return false;
4834 if (!gfc_notify_std (GFC_STD_GNU, "Symbol %qs is used before"
4835 " it is typed at %L", sym->name, &where))
4836 return false;
4839 /* Everything is ok. */
4840 return true;
4844 /* Construct a typebound-procedure structure. Those are stored in a tentative
4845 list and marked `error' until symbols are committed. */
4847 gfc_typebound_proc*
4848 gfc_get_typebound_proc (gfc_typebound_proc *tb0)
4850 gfc_typebound_proc *result;
4852 result = XCNEW (gfc_typebound_proc);
4853 if (tb0)
4854 *result = *tb0;
4855 result->error = 1;
4857 latest_undo_chgset->tbps.safe_push (result);
4859 return result;
4863 /* Get the super-type of a given derived type. */
4865 gfc_symbol*
4866 gfc_get_derived_super_type (gfc_symbol* derived)
4868 gcc_assert (derived);
4870 if (derived->attr.generic)
4871 derived = gfc_find_dt_in_generic (derived);
4873 if (!derived->attr.extension)
4874 return NULL;
4876 gcc_assert (derived->components);
4877 gcc_assert (derived->components->ts.type == BT_DERIVED);
4878 gcc_assert (derived->components->ts.u.derived);
4880 if (derived->components->ts.u.derived->attr.generic)
4881 return gfc_find_dt_in_generic (derived->components->ts.u.derived);
4883 return derived->components->ts.u.derived;
4887 /* Get the ultimate super-type of a given derived type. */
4889 gfc_symbol*
4890 gfc_get_ultimate_derived_super_type (gfc_symbol* derived)
4892 if (!derived->attr.extension)
4893 return NULL;
4895 derived = gfc_get_derived_super_type (derived);
4897 if (derived->attr.extension)
4898 return gfc_get_ultimate_derived_super_type (derived);
4899 else
4900 return derived;
4904 /* Check if a derived type t2 is an extension of (or equal to) a type t1. */
4906 bool
4907 gfc_type_is_extension_of (gfc_symbol *t1, gfc_symbol *t2)
4909 while (!gfc_compare_derived_types (t1, t2) && t2->attr.extension)
4910 t2 = gfc_get_derived_super_type (t2);
4911 return gfc_compare_derived_types (t1, t2);
4915 /* Check if two typespecs are type compatible (F03:5.1.1.2):
4916 If ts1 is nonpolymorphic, ts2 must be the same type.
4917 If ts1 is polymorphic (CLASS), ts2 must be an extension of ts1. */
4919 bool
4920 gfc_type_compatible (gfc_typespec *ts1, gfc_typespec *ts2)
4922 bool is_class1 = (ts1->type == BT_CLASS);
4923 bool is_class2 = (ts2->type == BT_CLASS);
4924 bool is_derived1 = (ts1->type == BT_DERIVED);
4925 bool is_derived2 = (ts2->type == BT_DERIVED);
4926 bool is_union1 = (ts1->type == BT_UNION);
4927 bool is_union2 = (ts2->type == BT_UNION);
4929 if (is_class1
4930 && ts1->u.derived->components
4931 && ((ts1->u.derived->attr.is_class
4932 && ts1->u.derived->components->ts.u.derived->attr
4933 .unlimited_polymorphic)
4934 || ts1->u.derived->attr.unlimited_polymorphic))
4935 return 1;
4937 if (!is_derived1 && !is_derived2 && !is_class1 && !is_class2
4938 && !is_union1 && !is_union2)
4939 return (ts1->type == ts2->type);
4941 if ((is_derived1 && is_derived2) || (is_union1 && is_union2))
4942 return gfc_compare_derived_types (ts1->u.derived, ts2->u.derived);
4944 if (is_derived1 && is_class2)
4945 return gfc_compare_derived_types (ts1->u.derived,
4946 ts2->u.derived->attr.is_class ?
4947 ts2->u.derived->components->ts.u.derived
4948 : ts2->u.derived);
4949 if (is_class1 && is_derived2)
4950 return gfc_type_is_extension_of (ts1->u.derived->attr.is_class ?
4951 ts1->u.derived->components->ts.u.derived
4952 : ts1->u.derived,
4953 ts2->u.derived);
4954 else if (is_class1 && is_class2)
4955 return gfc_type_is_extension_of (ts1->u.derived->attr.is_class ?
4956 ts1->u.derived->components->ts.u.derived
4957 : ts1->u.derived,
4958 ts2->u.derived->attr.is_class ?
4959 ts2->u.derived->components->ts.u.derived
4960 : ts2->u.derived);
4961 else
4962 return 0;
4966 /* Find the parent-namespace of the current function. If we're inside
4967 BLOCK constructs, it may not be the current one. */
4969 gfc_namespace*
4970 gfc_find_proc_namespace (gfc_namespace* ns)
4972 while (ns->construct_entities)
4974 ns = ns->parent;
4975 gcc_assert (ns);
4978 return ns;
4982 /* Check if an associate-variable should be translated as an `implicit' pointer
4983 internally (if it is associated to a variable and not an array with
4984 descriptor). */
4986 bool
4987 gfc_is_associate_pointer (gfc_symbol* sym)
4989 if (!sym->assoc)
4990 return false;
4992 if (sym->ts.type == BT_CLASS)
4993 return true;
4995 if (!sym->assoc->variable)
4996 return false;
4998 if (sym->attr.dimension && sym->as->type != AS_EXPLICIT)
4999 return false;
5001 return true;
5005 gfc_symbol *
5006 gfc_find_dt_in_generic (gfc_symbol *sym)
5008 gfc_interface *intr = NULL;
5010 if (!sym || gfc_fl_struct (sym->attr.flavor))
5011 return sym;
5013 if (sym->attr.generic)
5014 for (intr = sym->generic; intr; intr = intr->next)
5015 if (gfc_fl_struct (intr->sym->attr.flavor))
5016 break;
5017 return intr ? intr->sym : NULL;
5021 /* Get the dummy arguments from a procedure symbol. If it has been declared
5022 via a PROCEDURE statement with a named interface, ts.interface will be set
5023 and the arguments need to be taken from there. */
5025 gfc_formal_arglist *
5026 gfc_sym_get_dummy_args (gfc_symbol *sym)
5028 gfc_formal_arglist *dummies;
5030 dummies = sym->formal;
5031 if (dummies == NULL && sym->ts.interface != NULL)
5032 dummies = sym->ts.interface->formal;
5034 return dummies;