1 /* Maintain binary trees of symbols.
2 Copyright (C) 2000-2018 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
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
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/>. */
24 #include "coretypes.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
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
),
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
),
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
),
68 const mstring access_types
[] =
70 minit ("UNKNOWN-ACCESS", ACCESS_UNKNOWN
),
71 minit ("PUBLIC", ACCESS_PUBLIC
),
72 minit ("PRIVATE", ACCESS_PRIVATE
),
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
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. */
127 gfc_set_implicit_none (bool type
, bool external
, locus
*loc
)
132 gfc_current_ns
->has_implicit_none_export
= 1;
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
);
145 gfc_clear_ts (&gfc_current_ns
->default_type
[i
]);
146 gfc_current_ns
->set_flag
[i
] = 1;
152 /* Reset the implicit range flags. */
155 gfc_clear_new_implicit (void)
159 for (i
= 0; i
< GFC_LETTERS
; i
++)
164 /* Prepare for a new implicit range. Sets flags in new_flag[]. */
167 gfc_add_new_implicit_range (int c1
, int c2
)
174 for (i
= c1
; i
<= c2
; i
++)
178 gfc_error ("Letter %qc already set in IMPLICIT statement at %C",
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. */
194 gfc_merge_new_implicit (gfc_typespec
*ts
)
198 if (gfc_current_ns
->seen_implicit_none
)
200 gfc_error ("Cannot specify IMPLICIT at %C after IMPLICIT NONE");
204 for (i
= 0; i
< GFC_LETTERS
; i
++)
208 if (gfc_current_ns
->set_flag
[i
])
210 gfc_error ("Letter %qc already has an IMPLICIT type at %C",
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;
224 /* Given a symbol, return a pointer to the typespec for its default type. */
227 gfc_get_default_type (const char *name
, gfc_namespace
*ns
)
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
);
244 return &ns
->default_type
[letter
- 'a'];
248 /* Recursively append candidate SYM to CANDIDATES. Store the number of
249 candidates in CANDIDATES_LEN. */
252 lookup_symbol_fuzzy_find_candidates (gfc_symtree
*sym
,
254 size_t &candidates_len
)
261 if (sym
->n
.sym
->ts
.type
!= BT_UNKNOWN
&& sym
->n
.sym
->ts
.type
!= BT_PROCEDURE
)
262 vec_push (candidates
, candidates_len
, sym
->name
);
265 lookup_symbol_fuzzy_find_candidates (p
, candidates
, candidates_len
);
269 lookup_symbol_fuzzy_find_candidates (p
, candidates
, candidates_len
);
273 /* Lookup symbol SYM_NAME fuzzily, taking names in SYMBOL into account. */
276 lookup_symbol_fuzzy (const char *sym_name
, gfc_symbol
*symbol
)
278 char **candidates
= NULL
;
279 size_t candidates_len
= 0;
280 lookup_symbol_fuzzy_find_candidates (symbol
->ns
->sym_root
, candidates
,
282 return gfc_closest_fuzzy_match (sym_name
, candidates
);
286 /* Given a pointer to a symbol, set its type according to the first
287 letter of its name. Fails if the letter in question has no default
291 gfc_set_default_type (gfc_symbol
*sym
, int error_flag
, gfc_namespace
*ns
)
295 if (sym
->ts
.type
!= BT_UNKNOWN
)
296 gfc_internal_error ("gfc_set_default_type(): symbol already has a type");
298 ts
= gfc_get_default_type (sym
->name
, ns
);
300 if (ts
->type
== BT_UNKNOWN
)
302 if (error_flag
&& !sym
->attr
.untyped
)
304 const char *guessed
= lookup_symbol_fuzzy (sym
->name
, sym
);
306 gfc_error ("Symbol %qs at %L has no IMPLICIT type"
307 "; did you mean %qs?",
308 sym
->name
, &sym
->declared_at
, guessed
);
310 gfc_error ("Symbol %qs at %L has no IMPLICIT type",
311 sym
->name
, &sym
->declared_at
);
312 sym
->attr
.untyped
= 1; /* Ensure we only give an error once. */
319 sym
->attr
.implicit_type
= 1;
321 if (ts
->type
== BT_CHARACTER
&& ts
->u
.cl
)
322 sym
->ts
.u
.cl
= gfc_new_charlen (sym
->ns
, ts
->u
.cl
);
323 else if (ts
->type
== BT_CLASS
324 && !gfc_build_class_symbol (&sym
->ts
, &sym
->attr
, &sym
->as
))
327 if (sym
->attr
.is_bind_c
== 1 && warn_c_binding_type
)
329 /* BIND(C) variables should not be implicitly declared. */
330 gfc_warning_now (OPT_Wc_binding_type
, "Implicitly declared BIND(C) "
331 "variable %qs at %L may not be C interoperable",
332 sym
->name
, &sym
->declared_at
);
333 sym
->ts
.f90_type
= sym
->ts
.type
;
336 if (sym
->attr
.dummy
!= 0)
338 if (sym
->ns
->proc_name
!= NULL
339 && (sym
->ns
->proc_name
->attr
.subroutine
!= 0
340 || sym
->ns
->proc_name
->attr
.function
!= 0)
341 && sym
->ns
->proc_name
->attr
.is_bind_c
!= 0
342 && warn_c_binding_type
)
344 /* Dummy args to a BIND(C) routine may not be interoperable if
345 they are implicitly typed. */
346 gfc_warning_now (OPT_Wc_binding_type
, "Implicitly declared variable "
347 "%qs at %L may not be C interoperable but it is a "
348 "dummy argument to the BIND(C) procedure %qs at %L",
349 sym
->name
, &(sym
->declared_at
),
350 sym
->ns
->proc_name
->name
,
351 &(sym
->ns
->proc_name
->declared_at
));
352 sym
->ts
.f90_type
= sym
->ts
.type
;
360 /* This function is called from parse.c(parse_progunit) to check the
361 type of the function is not implicitly typed in the host namespace
362 and to implicitly type the function result, if necessary. */
365 gfc_check_function_type (gfc_namespace
*ns
)
367 gfc_symbol
*proc
= ns
->proc_name
;
369 if (!proc
->attr
.contained
|| proc
->result
->attr
.implicit_type
)
372 if (proc
->result
->ts
.type
== BT_UNKNOWN
&& proc
->result
->ts
.interface
== NULL
)
374 if (gfc_set_default_type (proc
->result
, 0, gfc_current_ns
))
376 if (proc
->result
!= proc
)
378 proc
->ts
= proc
->result
->ts
;
379 proc
->as
= gfc_copy_array_spec (proc
->result
->as
);
380 proc
->attr
.dimension
= proc
->result
->attr
.dimension
;
381 proc
->attr
.pointer
= proc
->result
->attr
.pointer
;
382 proc
->attr
.allocatable
= proc
->result
->attr
.allocatable
;
385 else if (!proc
->result
->attr
.proc_pointer
)
387 gfc_error ("Function result %qs at %L has no IMPLICIT type",
388 proc
->result
->name
, &proc
->result
->declared_at
);
389 proc
->result
->attr
.untyped
= 1;
395 /******************** Symbol attribute stuff *********************/
397 /* This is a generic conflict-checker. We do this to avoid having a
398 single conflict in two places. */
400 #define conf(a, b) if (attr->a && attr->b) { a1 = a; a2 = b; goto conflict; }
401 #define conf2(a) if (attr->a) { a2 = a; goto conflict; }
402 #define conf_std(a, b, std) if (attr->a && attr->b)\
411 check_conflict (symbol_attribute
*attr
, const char *name
, locus
*where
)
413 static const char *dummy
= "DUMMY", *save
= "SAVE", *pointer
= "POINTER",
414 *target
= "TARGET", *external
= "EXTERNAL", *intent
= "INTENT",
415 *intent_in
= "INTENT(IN)", *intrinsic
= "INTRINSIC",
416 *intent_out
= "INTENT(OUT)", *intent_inout
= "INTENT(INOUT)",
417 *allocatable
= "ALLOCATABLE", *elemental
= "ELEMENTAL",
418 *privat
= "PRIVATE", *recursive
= "RECURSIVE",
419 *in_common
= "COMMON", *result
= "RESULT", *in_namelist
= "NAMELIST",
420 *publik
= "PUBLIC", *optional
= "OPTIONAL", *entry
= "ENTRY",
421 *function
= "FUNCTION", *subroutine
= "SUBROUTINE",
422 *dimension
= "DIMENSION", *in_equivalence
= "EQUIVALENCE",
423 *use_assoc
= "USE ASSOCIATED", *cray_pointer
= "CRAY POINTER",
424 *cray_pointee
= "CRAY POINTEE", *data
= "DATA", *value
= "VALUE",
425 *volatile_
= "VOLATILE", *is_protected
= "PROTECTED",
426 *is_bind_c
= "BIND(C)", *procedure
= "PROCEDURE",
427 *proc_pointer
= "PROCEDURE POINTER", *abstract
= "ABSTRACT",
428 *asynchronous
= "ASYNCHRONOUS", *codimension
= "CODIMENSION",
429 *contiguous
= "CONTIGUOUS", *generic
= "GENERIC", *automatic
= "AUTOMATIC",
430 *pdt_len
= "LEN", *pdt_kind
= "KIND";
431 static const char *threadprivate
= "THREADPRIVATE";
432 static const char *omp_declare_target
= "OMP DECLARE TARGET";
433 static const char *omp_declare_target_link
= "OMP DECLARE TARGET LINK";
434 static const char *oacc_declare_copyin
= "OACC DECLARE COPYIN";
435 static const char *oacc_declare_create
= "OACC DECLARE CREATE";
436 static const char *oacc_declare_deviceptr
= "OACC DECLARE DEVICEPTR";
437 static const char *oacc_declare_device_resident
=
438 "OACC DECLARE DEVICE_RESIDENT";
444 where
= &gfc_current_locus
;
446 if (attr
->pointer
&& attr
->intent
!= INTENT_UNKNOWN
)
450 standard
= GFC_STD_F2003
;
454 if (attr
->in_namelist
&& (attr
->allocatable
|| attr
->pointer
))
457 a2
= attr
->allocatable
? allocatable
: pointer
;
458 standard
= GFC_STD_F2003
;
462 /* Check for attributes not allowed in a BLOCK DATA. */
463 if (gfc_current_state () == COMP_BLOCK_DATA
)
467 if (attr
->in_namelist
)
469 if (attr
->allocatable
)
475 if (attr
->access
== ACCESS_PRIVATE
)
477 if (attr
->access
== ACCESS_PUBLIC
)
479 if (attr
->intent
!= INTENT_UNKNOWN
)
485 ("%s attribute not allowed in BLOCK DATA program unit at %L",
491 if (attr
->save
== SAVE_EXPLICIT
)
494 conf (in_common
, save
);
496 conf (automatic
, save
);
498 switch (attr
->flavor
)
506 a1
= gfc_code2string (flavors
, attr
->flavor
);
510 gfc_error ("Namelist group name at %L cannot have the "
511 "SAVE attribute", where
);
514 /* Conflicts between SAVE and PROCEDURE will be checked at
515 resolution stage, see "resolve_fl_procedure". */
522 /* The copying of procedure dummy arguments for module procedures in
523 a submodule occur whilst the current state is COMP_CONTAINS. It
524 is necessary, therefore, to let this through. */
526 && (attr
->function
|| attr
->subroutine
)
527 && gfc_current_state () == COMP_CONTAINS
528 && !(gfc_new_block
&& gfc_new_block
->abr_modproc_decl
))
529 gfc_error_now ("internal procedure %qs at %L conflicts with "
530 "DUMMY argument", name
, where
);
533 conf (dummy
, intrinsic
);
534 conf (dummy
, threadprivate
);
535 conf (dummy
, omp_declare_target
);
536 conf (dummy
, omp_declare_target_link
);
537 conf (pointer
, target
);
538 conf (pointer
, intrinsic
);
539 conf (pointer
, elemental
);
540 conf (pointer
, codimension
);
541 conf (allocatable
, elemental
);
543 conf (in_common
, automatic
);
544 conf (in_equivalence
, automatic
);
545 conf (result
, automatic
);
546 conf (use_assoc
, automatic
);
547 conf (dummy
, automatic
);
549 conf (target
, external
);
550 conf (target
, intrinsic
);
552 if (!attr
->if_source
)
553 conf (external
, dimension
); /* See Fortran 95's R504. */
555 conf (external
, intrinsic
);
556 conf (entry
, intrinsic
);
558 if ((attr
->if_source
== IFSRC_DECL
&& !attr
->procedure
) || attr
->contained
)
559 conf (external
, subroutine
);
561 if (attr
->proc_pointer
&& !gfc_notify_std (GFC_STD_F2003
,
562 "Procedure pointer at %C"))
565 conf (allocatable
, pointer
);
566 conf_std (allocatable
, dummy
, GFC_STD_F2003
);
567 conf_std (allocatable
, function
, GFC_STD_F2003
);
568 conf_std (allocatable
, result
, GFC_STD_F2003
);
569 conf (elemental
, recursive
);
571 conf (in_common
, dummy
);
572 conf (in_common
, allocatable
);
573 conf (in_common
, codimension
);
574 conf (in_common
, result
);
576 conf (in_equivalence
, use_assoc
);
577 conf (in_equivalence
, codimension
);
578 conf (in_equivalence
, dummy
);
579 conf (in_equivalence
, target
);
580 conf (in_equivalence
, pointer
);
581 conf (in_equivalence
, function
);
582 conf (in_equivalence
, result
);
583 conf (in_equivalence
, entry
);
584 conf (in_equivalence
, allocatable
);
585 conf (in_equivalence
, threadprivate
);
586 conf (in_equivalence
, omp_declare_target
);
587 conf (in_equivalence
, omp_declare_target_link
);
588 conf (in_equivalence
, oacc_declare_create
);
589 conf (in_equivalence
, oacc_declare_copyin
);
590 conf (in_equivalence
, oacc_declare_deviceptr
);
591 conf (in_equivalence
, oacc_declare_device_resident
);
592 conf (in_equivalence
, is_bind_c
);
594 conf (dummy
, result
);
595 conf (entry
, result
);
596 conf (generic
, result
);
597 conf (generic
, omp_declare_target
);
598 conf (generic
, omp_declare_target_link
);
600 conf (function
, subroutine
);
602 if (!function
&& !subroutine
)
603 conf (is_bind_c
, dummy
);
605 conf (is_bind_c
, cray_pointer
);
606 conf (is_bind_c
, cray_pointee
);
607 conf (is_bind_c
, codimension
);
608 conf (is_bind_c
, allocatable
);
609 conf (is_bind_c
, elemental
);
611 /* Need to also get volatile attr, according to 5.1 of F2003 draft.
612 Parameter conflict caught below. Also, value cannot be specified
613 for a dummy procedure. */
615 /* Cray pointer/pointee conflicts. */
616 conf (cray_pointer
, cray_pointee
);
617 conf (cray_pointer
, dimension
);
618 conf (cray_pointer
, codimension
);
619 conf (cray_pointer
, contiguous
);
620 conf (cray_pointer
, pointer
);
621 conf (cray_pointer
, target
);
622 conf (cray_pointer
, allocatable
);
623 conf (cray_pointer
, external
);
624 conf (cray_pointer
, intrinsic
);
625 conf (cray_pointer
, in_namelist
);
626 conf (cray_pointer
, function
);
627 conf (cray_pointer
, subroutine
);
628 conf (cray_pointer
, entry
);
630 conf (cray_pointee
, allocatable
);
631 conf (cray_pointee
, contiguous
);
632 conf (cray_pointee
, codimension
);
633 conf (cray_pointee
, intent
);
634 conf (cray_pointee
, optional
);
635 conf (cray_pointee
, dummy
);
636 conf (cray_pointee
, target
);
637 conf (cray_pointee
, intrinsic
);
638 conf (cray_pointee
, pointer
);
639 conf (cray_pointee
, entry
);
640 conf (cray_pointee
, in_common
);
641 conf (cray_pointee
, in_equivalence
);
642 conf (cray_pointee
, threadprivate
);
643 conf (cray_pointee
, omp_declare_target
);
644 conf (cray_pointee
, omp_declare_target_link
);
645 conf (cray_pointee
, oacc_declare_create
);
646 conf (cray_pointee
, oacc_declare_copyin
);
647 conf (cray_pointee
, oacc_declare_deviceptr
);
648 conf (cray_pointee
, oacc_declare_device_resident
);
651 conf (data
, function
);
653 conf (data
, allocatable
);
655 conf (value
, pointer
)
656 conf (value
, allocatable
)
657 conf (value
, subroutine
)
658 conf (value
, function
)
659 conf (value
, volatile_
)
660 conf (value
, dimension
)
661 conf (value
, codimension
)
662 conf (value
, external
)
664 conf (codimension
, result
)
667 && (attr
->intent
== INTENT_OUT
|| attr
->intent
== INTENT_INOUT
))
670 a2
= attr
->intent
== INTENT_OUT
? intent_out
: intent_inout
;
674 conf (is_protected
, intrinsic
)
675 conf (is_protected
, in_common
)
677 conf (asynchronous
, intrinsic
)
678 conf (asynchronous
, external
)
680 conf (volatile_
, intrinsic
)
681 conf (volatile_
, external
)
683 if (attr
->volatile_
&& attr
->intent
== INTENT_IN
)
690 conf (procedure
, allocatable
)
691 conf (procedure
, dimension
)
692 conf (procedure
, codimension
)
693 conf (procedure
, intrinsic
)
694 conf (procedure
, target
)
695 conf (procedure
, value
)
696 conf (procedure
, volatile_
)
697 conf (procedure
, asynchronous
)
698 conf (procedure
, entry
)
700 conf (proc_pointer
, abstract
)
701 conf (proc_pointer
, omp_declare_target
)
702 conf (proc_pointer
, omp_declare_target_link
)
704 conf (entry
, omp_declare_target
)
705 conf (entry
, omp_declare_target_link
)
706 conf (entry
, oacc_declare_create
)
707 conf (entry
, oacc_declare_copyin
)
708 conf (entry
, oacc_declare_deviceptr
)
709 conf (entry
, oacc_declare_device_resident
)
711 conf (pdt_kind
, allocatable
)
712 conf (pdt_kind
, pointer
)
713 conf (pdt_kind
, dimension
)
714 conf (pdt_kind
, codimension
)
716 conf (pdt_len
, allocatable
)
717 conf (pdt_len
, pointer
)
718 conf (pdt_len
, dimension
)
719 conf (pdt_len
, codimension
)
721 if (attr
->access
== ACCESS_PRIVATE
)
728 a1
= gfc_code2string (flavors
, attr
->flavor
);
730 if (attr
->in_namelist
731 && attr
->flavor
!= FL_VARIABLE
732 && attr
->flavor
!= FL_PROCEDURE
733 && attr
->flavor
!= FL_UNKNOWN
)
739 switch (attr
->flavor
)
749 conf2 (asynchronous
);
752 conf2 (is_protected
);
762 conf2 (threadprivate
);
763 conf2 (omp_declare_target
);
764 conf2 (omp_declare_target_link
);
765 conf2 (oacc_declare_create
);
766 conf2 (oacc_declare_copyin
);
767 conf2 (oacc_declare_deviceptr
);
768 conf2 (oacc_declare_device_resident
);
770 if (attr
->access
== ACCESS_PUBLIC
|| attr
->access
== ACCESS_PRIVATE
)
772 a2
= attr
->access
== ACCESS_PUBLIC
? publik
: privat
;
773 gfc_error ("%s attribute applied to %s %s at %L", a2
, a1
,
780 gfc_error_now ("BIND(C) applied to %s %s at %L", a1
, name
, where
);
794 /* Conflicts with INTENT, SAVE and RESULT will be checked
795 at resolution stage, see "resolve_fl_procedure". */
797 if (attr
->subroutine
)
803 conf2 (asynchronous
);
808 if (!attr
->proc_pointer
)
809 conf2 (threadprivate
);
812 if (!attr
->proc_pointer
)
815 conf2 (omp_declare_target_link
);
819 case PROC_ST_FUNCTION
:
830 conf2 (threadprivate
);
850 conf2 (threadprivate
);
852 conf2 (omp_declare_target
);
853 conf2 (omp_declare_target_link
);
854 conf2 (oacc_declare_create
);
855 conf2 (oacc_declare_copyin
);
856 conf2 (oacc_declare_deviceptr
);
857 conf2 (oacc_declare_device_resident
);
859 if (attr
->intent
!= INTENT_UNKNOWN
)
876 conf2 (is_protected
);
882 conf2 (asynchronous
);
883 conf2 (threadprivate
);
899 gfc_error ("%s attribute conflicts with %s attribute at %L",
902 gfc_error ("%s attribute conflicts with %s attribute in %qs at %L",
903 a1
, a2
, name
, where
);
910 return gfc_notify_std (standard
, "%s attribute conflicts "
911 "with %s attribute at %L", a1
, a2
,
916 return gfc_notify_std (standard
, "%s attribute conflicts "
917 "with %s attribute in %qs at %L",
918 a1
, a2
, name
, where
);
927 /* Mark a symbol as referenced. */
930 gfc_set_sym_referenced (gfc_symbol
*sym
)
933 if (sym
->attr
.referenced
)
936 sym
->attr
.referenced
= 1;
938 /* Remember which order dummy variables are accessed in. */
940 sym
->dummy_order
= next_dummy_order
++;
944 /* Common subroutine called by attribute changing subroutines in order
945 to prevent them from changing a symbol that has been
946 use-associated. Returns zero if it is OK to change the symbol,
950 check_used (symbol_attribute
*attr
, const char *name
, locus
*where
)
953 if (attr
->use_assoc
== 0)
957 where
= &gfc_current_locus
;
960 gfc_error ("Cannot change attributes of USE-associated symbol at %L",
963 gfc_error ("Cannot change attributes of USE-associated symbol %s at %L",
970 /* Generate an error because of a duplicate attribute. */
973 duplicate_attr (const char *attr
, locus
*where
)
977 where
= &gfc_current_locus
;
979 gfc_error ("Duplicate %s attribute specified at %L", attr
, where
);
984 gfc_add_ext_attribute (symbol_attribute
*attr
, ext_attr_id_t ext_attr
,
985 locus
*where ATTRIBUTE_UNUSED
)
987 attr
->ext_attr
|= 1 << ext_attr
;
992 /* Called from decl.c (attr_decl1) to check attributes, when declared
996 gfc_add_attribute (symbol_attribute
*attr
, locus
*where
)
998 if (check_used (attr
, NULL
, where
))
1001 return check_conflict (attr
, NULL
, where
);
1006 gfc_add_allocatable (symbol_attribute
*attr
, locus
*where
)
1009 if (check_used (attr
, NULL
, where
))
1012 if (attr
->allocatable
)
1014 duplicate_attr ("ALLOCATABLE", where
);
1018 if (attr
->flavor
== FL_PROCEDURE
&& attr
->if_source
== IFSRC_IFBODY
1019 && !gfc_find_state (COMP_INTERFACE
))
1021 gfc_error ("ALLOCATABLE specified outside of INTERFACE body at %L",
1026 attr
->allocatable
= 1;
1027 return check_conflict (attr
, NULL
, where
);
1032 gfc_add_automatic (symbol_attribute
*attr
, const char *name
, locus
*where
)
1034 if (check_used (attr
, name
, where
))
1037 if (attr
->automatic
&& !gfc_notify_std (GFC_STD_LEGACY
,
1038 "Duplicate AUTOMATIC attribute specified at %L", where
))
1041 attr
->automatic
= 1;
1042 return check_conflict (attr
, name
, where
);
1047 gfc_add_codimension (symbol_attribute
*attr
, const char *name
, locus
*where
)
1050 if (check_used (attr
, name
, where
))
1053 if (attr
->codimension
)
1055 duplicate_attr ("CODIMENSION", where
);
1059 if (attr
->flavor
== FL_PROCEDURE
&& attr
->if_source
== IFSRC_IFBODY
1060 && !gfc_find_state (COMP_INTERFACE
))
1062 gfc_error ("CODIMENSION specified for %qs outside its INTERFACE body "
1063 "at %L", name
, where
);
1067 attr
->codimension
= 1;
1068 return check_conflict (attr
, name
, where
);
1073 gfc_add_dimension (symbol_attribute
*attr
, const char *name
, locus
*where
)
1076 if (check_used (attr
, name
, where
))
1079 if (attr
->dimension
)
1081 duplicate_attr ("DIMENSION", where
);
1085 if (attr
->flavor
== FL_PROCEDURE
&& attr
->if_source
== IFSRC_IFBODY
1086 && !gfc_find_state (COMP_INTERFACE
))
1088 gfc_error ("DIMENSION specified for %qs outside its INTERFACE body "
1089 "at %L", name
, where
);
1093 attr
->dimension
= 1;
1094 return check_conflict (attr
, name
, where
);
1099 gfc_add_contiguous (symbol_attribute
*attr
, const char *name
, locus
*where
)
1102 if (check_used (attr
, name
, where
))
1105 attr
->contiguous
= 1;
1106 return check_conflict (attr
, name
, where
);
1111 gfc_add_external (symbol_attribute
*attr
, locus
*where
)
1114 if (check_used (attr
, NULL
, where
))
1119 duplicate_attr ("EXTERNAL", where
);
1123 if (attr
->pointer
&& attr
->if_source
!= IFSRC_IFBODY
)
1126 attr
->proc_pointer
= 1;
1131 return check_conflict (attr
, NULL
, where
);
1136 gfc_add_intrinsic (symbol_attribute
*attr
, locus
*where
)
1139 if (check_used (attr
, NULL
, where
))
1142 if (attr
->intrinsic
)
1144 duplicate_attr ("INTRINSIC", where
);
1148 attr
->intrinsic
= 1;
1150 return check_conflict (attr
, NULL
, where
);
1155 gfc_add_optional (symbol_attribute
*attr
, locus
*where
)
1158 if (check_used (attr
, NULL
, where
))
1163 duplicate_attr ("OPTIONAL", where
);
1168 return check_conflict (attr
, NULL
, where
);
1172 gfc_add_kind (symbol_attribute
*attr
, locus
*where
)
1176 duplicate_attr ("KIND", where
);
1181 return check_conflict (attr
, NULL
, where
);
1185 gfc_add_len (symbol_attribute
*attr
, locus
*where
)
1189 duplicate_attr ("LEN", where
);
1194 return check_conflict (attr
, NULL
, where
);
1199 gfc_add_pointer (symbol_attribute
*attr
, locus
*where
)
1202 if (check_used (attr
, NULL
, where
))
1205 if (attr
->pointer
&& !(attr
->if_source
== IFSRC_IFBODY
1206 && !gfc_find_state (COMP_INTERFACE
)))
1208 duplicate_attr ("POINTER", where
);
1212 if (attr
->procedure
|| (attr
->external
&& attr
->if_source
!= IFSRC_IFBODY
)
1213 || (attr
->if_source
== IFSRC_IFBODY
1214 && !gfc_find_state (COMP_INTERFACE
)))
1215 attr
->proc_pointer
= 1;
1219 return check_conflict (attr
, NULL
, where
);
1224 gfc_add_cray_pointer (symbol_attribute
*attr
, locus
*where
)
1227 if (check_used (attr
, NULL
, where
))
1230 attr
->cray_pointer
= 1;
1231 return check_conflict (attr
, NULL
, where
);
1236 gfc_add_cray_pointee (symbol_attribute
*attr
, locus
*where
)
1239 if (check_used (attr
, NULL
, where
))
1242 if (attr
->cray_pointee
)
1244 gfc_error ("Cray Pointee at %L appears in multiple pointer()"
1245 " statements", where
);
1249 attr
->cray_pointee
= 1;
1250 return check_conflict (attr
, NULL
, where
);
1255 gfc_add_protected (symbol_attribute
*attr
, const char *name
, locus
*where
)
1257 if (check_used (attr
, name
, where
))
1260 if (attr
->is_protected
)
1262 if (!gfc_notify_std (GFC_STD_LEGACY
,
1263 "Duplicate PROTECTED attribute specified at %L",
1268 attr
->is_protected
= 1;
1269 return check_conflict (attr
, name
, where
);
1274 gfc_add_result (symbol_attribute
*attr
, const char *name
, locus
*where
)
1277 if (check_used (attr
, name
, where
))
1281 return check_conflict (attr
, name
, where
);
1286 gfc_add_save (symbol_attribute
*attr
, save_state s
, const char *name
,
1290 if (check_used (attr
, name
, where
))
1293 if (s
== SAVE_EXPLICIT
&& gfc_pure (NULL
))
1296 ("SAVE attribute at %L cannot be specified in a PURE procedure",
1301 if (s
== SAVE_EXPLICIT
)
1302 gfc_unset_implicit_pure (NULL
);
1304 if (s
== SAVE_EXPLICIT
&& attr
->save
== SAVE_EXPLICIT
)
1306 if (!gfc_notify_std (GFC_STD_LEGACY
,
1307 "Duplicate SAVE attribute specified at %L",
1313 return check_conflict (attr
, name
, where
);
1318 gfc_add_value (symbol_attribute
*attr
, const char *name
, locus
*where
)
1321 if (check_used (attr
, name
, where
))
1326 if (!gfc_notify_std (GFC_STD_LEGACY
,
1327 "Duplicate VALUE attribute specified at %L",
1333 return check_conflict (attr
, name
, where
);
1338 gfc_add_volatile (symbol_attribute
*attr
, const char *name
, locus
*where
)
1340 /* No check_used needed as 11.2.1 of the F2003 standard allows
1341 that the local identifier made accessible by a use statement can be
1342 given a VOLATILE attribute - unless it is a coarray (F2008, C560). */
1344 if (attr
->volatile_
&& attr
->volatile_ns
== gfc_current_ns
)
1345 if (!gfc_notify_std (GFC_STD_LEGACY
,
1346 "Duplicate VOLATILE attribute specified at %L",
1350 attr
->volatile_
= 1;
1351 attr
->volatile_ns
= gfc_current_ns
;
1352 return check_conflict (attr
, name
, where
);
1357 gfc_add_asynchronous (symbol_attribute
*attr
, const char *name
, locus
*where
)
1359 /* No check_used needed as 11.2.1 of the F2003 standard allows
1360 that the local identifier made accessible by a use statement can be
1361 given a ASYNCHRONOUS attribute. */
1363 if (attr
->asynchronous
&& attr
->asynchronous_ns
== gfc_current_ns
)
1364 if (!gfc_notify_std (GFC_STD_LEGACY
,
1365 "Duplicate ASYNCHRONOUS attribute specified at %L",
1369 attr
->asynchronous
= 1;
1370 attr
->asynchronous_ns
= gfc_current_ns
;
1371 return check_conflict (attr
, name
, where
);
1376 gfc_add_threadprivate (symbol_attribute
*attr
, const char *name
, locus
*where
)
1379 if (check_used (attr
, name
, where
))
1382 if (attr
->threadprivate
)
1384 duplicate_attr ("THREADPRIVATE", where
);
1388 attr
->threadprivate
= 1;
1389 return check_conflict (attr
, name
, where
);
1394 gfc_add_omp_declare_target (symbol_attribute
*attr
, const char *name
,
1398 if (check_used (attr
, name
, where
))
1401 if (attr
->omp_declare_target
)
1404 attr
->omp_declare_target
= 1;
1405 return check_conflict (attr
, name
, where
);
1410 gfc_add_omp_declare_target_link (symbol_attribute
*attr
, const char *name
,
1414 if (check_used (attr
, name
, where
))
1417 if (attr
->omp_declare_target_link
)
1420 attr
->omp_declare_target_link
= 1;
1421 return check_conflict (attr
, name
, where
);
1426 gfc_add_oacc_declare_create (symbol_attribute
*attr
, const char *name
,
1429 if (check_used (attr
, name
, where
))
1432 if (attr
->oacc_declare_create
)
1435 attr
->oacc_declare_create
= 1;
1436 return check_conflict (attr
, name
, where
);
1441 gfc_add_oacc_declare_copyin (symbol_attribute
*attr
, const char *name
,
1444 if (check_used (attr
, name
, where
))
1447 if (attr
->oacc_declare_copyin
)
1450 attr
->oacc_declare_copyin
= 1;
1451 return check_conflict (attr
, name
, where
);
1456 gfc_add_oacc_declare_deviceptr (symbol_attribute
*attr
, const char *name
,
1459 if (check_used (attr
, name
, where
))
1462 if (attr
->oacc_declare_deviceptr
)
1465 attr
->oacc_declare_deviceptr
= 1;
1466 return check_conflict (attr
, name
, where
);
1471 gfc_add_oacc_declare_device_resident (symbol_attribute
*attr
, const char *name
,
1474 if (check_used (attr
, name
, where
))
1477 if (attr
->oacc_declare_device_resident
)
1480 attr
->oacc_declare_device_resident
= 1;
1481 return check_conflict (attr
, name
, where
);
1486 gfc_add_target (symbol_attribute
*attr
, locus
*where
)
1489 if (check_used (attr
, NULL
, where
))
1494 duplicate_attr ("TARGET", where
);
1499 return check_conflict (attr
, NULL
, where
);
1504 gfc_add_dummy (symbol_attribute
*attr
, const char *name
, locus
*where
)
1507 if (check_used (attr
, name
, where
))
1510 /* Duplicate dummy arguments are allowed due to ENTRY statements. */
1512 return check_conflict (attr
, name
, where
);
1517 gfc_add_in_common (symbol_attribute
*attr
, const char *name
, locus
*where
)
1520 if (check_used (attr
, name
, where
))
1523 /* Duplicate attribute already checked for. */
1524 attr
->in_common
= 1;
1525 return check_conflict (attr
, name
, where
);
1530 gfc_add_in_equivalence (symbol_attribute
*attr
, const char *name
, locus
*where
)
1533 /* Duplicate attribute already checked for. */
1534 attr
->in_equivalence
= 1;
1535 if (!check_conflict (attr
, name
, where
))
1538 if (attr
->flavor
== FL_VARIABLE
)
1541 return gfc_add_flavor (attr
, FL_VARIABLE
, name
, where
);
1546 gfc_add_data (symbol_attribute
*attr
, const char *name
, locus
*where
)
1549 if (check_used (attr
, name
, where
))
1553 return check_conflict (attr
, name
, where
);
1558 gfc_add_in_namelist (symbol_attribute
*attr
, const char *name
, locus
*where
)
1561 attr
->in_namelist
= 1;
1562 return check_conflict (attr
, name
, where
);
1567 gfc_add_sequence (symbol_attribute
*attr
, const char *name
, locus
*where
)
1570 if (check_used (attr
, name
, where
))
1574 return check_conflict (attr
, name
, where
);
1579 gfc_add_elemental (symbol_attribute
*attr
, locus
*where
)
1582 if (check_used (attr
, NULL
, where
))
1585 if (attr
->elemental
)
1587 duplicate_attr ("ELEMENTAL", where
);
1591 attr
->elemental
= 1;
1592 return check_conflict (attr
, NULL
, where
);
1597 gfc_add_pure (symbol_attribute
*attr
, locus
*where
)
1600 if (check_used (attr
, NULL
, where
))
1605 duplicate_attr ("PURE", where
);
1610 return check_conflict (attr
, NULL
, where
);
1615 gfc_add_recursive (symbol_attribute
*attr
, locus
*where
)
1618 if (check_used (attr
, NULL
, where
))
1621 if (attr
->recursive
)
1623 duplicate_attr ("RECURSIVE", where
);
1627 attr
->recursive
= 1;
1628 return check_conflict (attr
, NULL
, where
);
1633 gfc_add_entry (symbol_attribute
*attr
, const char *name
, locus
*where
)
1636 if (check_used (attr
, name
, where
))
1641 duplicate_attr ("ENTRY", where
);
1646 return check_conflict (attr
, name
, where
);
1651 gfc_add_function (symbol_attribute
*attr
, const char *name
, locus
*where
)
1654 if (attr
->flavor
!= FL_PROCEDURE
1655 && !gfc_add_flavor (attr
, FL_PROCEDURE
, name
, where
))
1659 return check_conflict (attr
, name
, where
);
1664 gfc_add_subroutine (symbol_attribute
*attr
, const char *name
, locus
*where
)
1667 if (attr
->flavor
!= FL_PROCEDURE
1668 && !gfc_add_flavor (attr
, FL_PROCEDURE
, name
, where
))
1671 attr
->subroutine
= 1;
1672 return check_conflict (attr
, name
, where
);
1677 gfc_add_generic (symbol_attribute
*attr
, const char *name
, locus
*where
)
1680 if (attr
->flavor
!= FL_PROCEDURE
1681 && !gfc_add_flavor (attr
, FL_PROCEDURE
, name
, where
))
1685 return check_conflict (attr
, name
, where
);
1690 gfc_add_proc (symbol_attribute
*attr
, const char *name
, locus
*where
)
1693 if (check_used (attr
, NULL
, where
))
1696 if (attr
->flavor
!= FL_PROCEDURE
1697 && !gfc_add_flavor (attr
, FL_PROCEDURE
, name
, where
))
1700 if (attr
->procedure
)
1702 duplicate_attr ("PROCEDURE", where
);
1706 attr
->procedure
= 1;
1708 return check_conflict (attr
, NULL
, where
);
1713 gfc_add_abstract (symbol_attribute
* attr
, locus
* where
)
1717 duplicate_attr ("ABSTRACT", where
);
1723 return check_conflict (attr
, NULL
, where
);
1727 /* Flavors are special because some flavors are not what Fortran
1728 considers attributes and can be reaffirmed multiple times. */
1731 gfc_add_flavor (symbol_attribute
*attr
, sym_flavor f
, const char *name
,
1735 if ((f
== FL_PROGRAM
|| f
== FL_BLOCK_DATA
|| f
== FL_MODULE
1736 || f
== FL_PARAMETER
|| f
== FL_LABEL
|| gfc_fl_struct(f
)
1737 || f
== FL_NAMELIST
) && check_used (attr
, name
, where
))
1740 if (attr
->flavor
== f
&& f
== FL_VARIABLE
)
1743 /* Copying a procedure dummy argument for a module procedure in a
1744 submodule results in the flavor being copied and would result in
1745 an error without this. */
1746 if (gfc_new_block
&& gfc_new_block
->abr_modproc_decl
1747 && attr
->flavor
== f
&& f
== FL_PROCEDURE
)
1750 if (attr
->flavor
!= FL_UNKNOWN
)
1753 where
= &gfc_current_locus
;
1756 gfc_error ("%s attribute of %qs conflicts with %s attribute at %L",
1757 gfc_code2string (flavors
, attr
->flavor
), name
,
1758 gfc_code2string (flavors
, f
), where
);
1760 gfc_error ("%s attribute conflicts with %s attribute at %L",
1761 gfc_code2string (flavors
, attr
->flavor
),
1762 gfc_code2string (flavors
, f
), where
);
1769 return check_conflict (attr
, name
, where
);
1774 gfc_add_procedure (symbol_attribute
*attr
, procedure_type t
,
1775 const char *name
, locus
*where
)
1778 if (check_used (attr
, name
, where
))
1781 if (attr
->flavor
!= FL_PROCEDURE
1782 && !gfc_add_flavor (attr
, FL_PROCEDURE
, name
, where
))
1786 where
= &gfc_current_locus
;
1788 if (attr
->proc
!= PROC_UNKNOWN
&& !attr
->module_procedure
)
1790 if (attr
->proc
== PROC_ST_FUNCTION
&& t
== PROC_INTERNAL
1791 && !gfc_notification_std (GFC_STD_F2008
))
1792 gfc_error ("%s procedure at %L is already declared as %s "
1793 "procedure. \nF2008: A pointer function assignment "
1794 "is ambiguous if it is the first executable statement "
1795 "after the specification block. Please add any other "
1796 "kind of executable statement before it. FIXME",
1797 gfc_code2string (procedures
, t
), where
,
1798 gfc_code2string (procedures
, attr
->proc
));
1800 gfc_error ("%s procedure at %L is already declared as %s "
1801 "procedure", gfc_code2string (procedures
, t
), where
,
1802 gfc_code2string (procedures
, attr
->proc
));
1809 /* Statement functions are always scalar and functions. */
1810 if (t
== PROC_ST_FUNCTION
1811 && ((!attr
->function
&& !gfc_add_function (attr
, name
, where
))
1812 || attr
->dimension
))
1815 return check_conflict (attr
, name
, where
);
1820 gfc_add_intent (symbol_attribute
*attr
, sym_intent intent
, locus
*where
)
1823 if (check_used (attr
, NULL
, where
))
1826 if (attr
->intent
== INTENT_UNKNOWN
)
1828 attr
->intent
= intent
;
1829 return check_conflict (attr
, NULL
, where
);
1833 where
= &gfc_current_locus
;
1835 gfc_error ("INTENT (%s) conflicts with INTENT(%s) at %L",
1836 gfc_intent_string (attr
->intent
),
1837 gfc_intent_string (intent
), where
);
1843 /* No checks for use-association in public and private statements. */
1846 gfc_add_access (symbol_attribute
*attr
, gfc_access access
,
1847 const char *name
, locus
*where
)
1850 if (attr
->access
== ACCESS_UNKNOWN
1851 || (attr
->use_assoc
&& attr
->access
!= ACCESS_PRIVATE
))
1853 attr
->access
= access
;
1854 return check_conflict (attr
, name
, where
);
1858 where
= &gfc_current_locus
;
1859 gfc_error ("ACCESS specification at %L was already specified", where
);
1865 /* Set the is_bind_c field for the given symbol_attribute. */
1868 gfc_add_is_bind_c (symbol_attribute
*attr
, const char *name
, locus
*where
,
1869 int is_proc_lang_bind_spec
)
1872 if (is_proc_lang_bind_spec
== 0 && attr
->flavor
== FL_PROCEDURE
)
1873 gfc_error_now ("BIND(C) attribute at %L can only be used for "
1874 "variables or common blocks", where
);
1875 else if (attr
->is_bind_c
)
1876 gfc_error_now ("Duplicate BIND attribute specified at %L", where
);
1878 attr
->is_bind_c
= 1;
1881 where
= &gfc_current_locus
;
1883 if (!gfc_notify_std (GFC_STD_F2003
, "BIND(C) at %L", where
))
1886 return check_conflict (attr
, name
, where
);
1890 /* Set the extension field for the given symbol_attribute. */
1893 gfc_add_extension (symbol_attribute
*attr
, locus
*where
)
1896 where
= &gfc_current_locus
;
1898 if (attr
->extension
)
1899 gfc_error_now ("Duplicate EXTENDS attribute specified at %L", where
);
1901 attr
->extension
= 1;
1903 if (!gfc_notify_std (GFC_STD_F2003
, "EXTENDS at %L", where
))
1911 gfc_add_explicit_interface (gfc_symbol
*sym
, ifsrc source
,
1912 gfc_formal_arglist
* formal
, locus
*where
)
1914 if (check_used (&sym
->attr
, sym
->name
, where
))
1917 /* Skip the following checks in the case of a module_procedures in a
1918 submodule since they will manifestly fail. */
1919 if (sym
->attr
.module_procedure
== 1
1920 && source
== IFSRC_DECL
)
1924 where
= &gfc_current_locus
;
1926 if (sym
->attr
.if_source
!= IFSRC_UNKNOWN
1927 && sym
->attr
.if_source
!= IFSRC_DECL
)
1929 gfc_error ("Symbol %qs at %L already has an explicit interface",
1934 if (source
== IFSRC_IFBODY
&& (sym
->attr
.dimension
|| sym
->attr
.allocatable
))
1936 gfc_error ("%qs at %L has attributes specified outside its INTERFACE "
1937 "body", sym
->name
, where
);
1942 sym
->formal
= formal
;
1943 sym
->attr
.if_source
= source
;
1949 /* Add a type to a symbol. */
1952 gfc_add_type (gfc_symbol
*sym
, gfc_typespec
*ts
, locus
*where
)
1958 where
= &gfc_current_locus
;
1961 type
= sym
->result
->ts
.type
;
1963 type
= sym
->ts
.type
;
1965 if (sym
->attr
.result
&& type
== BT_UNKNOWN
&& sym
->ns
->proc_name
)
1966 type
= sym
->ns
->proc_name
->ts
.type
;
1968 if (type
!= BT_UNKNOWN
&& !(sym
->attr
.function
&& sym
->attr
.implicit_type
)
1969 && !(gfc_state_stack
->previous
&& gfc_state_stack
->previous
->previous
1970 && gfc_state_stack
->previous
->previous
->state
== COMP_SUBMODULE
)
1971 && !sym
->attr
.module_procedure
)
1973 if (sym
->attr
.use_assoc
)
1974 gfc_error ("Symbol %qs at %L conflicts with symbol from module %qs, "
1975 "use-associated at %L", sym
->name
, where
, sym
->module
,
1978 gfc_error ("Symbol %qs at %L already has basic type of %s", sym
->name
,
1979 where
, gfc_basic_typename (type
));
1983 if (sym
->attr
.procedure
&& sym
->ts
.interface
)
1985 gfc_error ("Procedure %qs at %L may not have basic type of %s",
1986 sym
->name
, where
, gfc_basic_typename (ts
->type
));
1990 flavor
= sym
->attr
.flavor
;
1992 if (flavor
== FL_PROGRAM
|| flavor
== FL_BLOCK_DATA
|| flavor
== FL_MODULE
1993 || flavor
== FL_LABEL
1994 || (flavor
== FL_PROCEDURE
&& sym
->attr
.subroutine
)
1995 || flavor
== FL_DERIVED
|| flavor
== FL_NAMELIST
)
1997 gfc_error ("Symbol %qs at %L cannot have a type", sym
->name
, where
);
2006 /* Clears all attributes. */
2009 gfc_clear_attr (symbol_attribute
*attr
)
2011 memset (attr
, 0, sizeof (symbol_attribute
));
2015 /* Check for missing attributes in the new symbol. Currently does
2016 nothing, but it's not clear that it is unnecessary yet. */
2019 gfc_missing_attr (symbol_attribute
*attr ATTRIBUTE_UNUSED
,
2020 locus
*where ATTRIBUTE_UNUSED
)
2027 /* Copy an attribute to a symbol attribute, bit by bit. Some
2028 attributes have a lot of side-effects but cannot be present given
2029 where we are called from, so we ignore some bits. */
2032 gfc_copy_attr (symbol_attribute
*dest
, symbol_attribute
*src
, locus
*where
)
2034 int is_proc_lang_bind_spec
;
2036 /* In line with the other attributes, we only add bits but do not remove
2037 them; cf. also PR 41034. */
2038 dest
->ext_attr
|= src
->ext_attr
;
2040 if (src
->allocatable
&& !gfc_add_allocatable (dest
, where
))
2043 if (src
->automatic
&& !gfc_add_automatic (dest
, NULL
, where
))
2045 if (src
->dimension
&& !gfc_add_dimension (dest
, NULL
, where
))
2047 if (src
->codimension
&& !gfc_add_codimension (dest
, NULL
, where
))
2049 if (src
->contiguous
&& !gfc_add_contiguous (dest
, NULL
, where
))
2051 if (src
->optional
&& !gfc_add_optional (dest
, where
))
2053 if (src
->pointer
&& !gfc_add_pointer (dest
, where
))
2055 if (src
->is_protected
&& !gfc_add_protected (dest
, NULL
, where
))
2057 if (src
->save
&& !gfc_add_save (dest
, src
->save
, NULL
, where
))
2059 if (src
->value
&& !gfc_add_value (dest
, NULL
, where
))
2061 if (src
->volatile_
&& !gfc_add_volatile (dest
, NULL
, where
))
2063 if (src
->asynchronous
&& !gfc_add_asynchronous (dest
, NULL
, where
))
2065 if (src
->threadprivate
2066 && !gfc_add_threadprivate (dest
, NULL
, where
))
2068 if (src
->omp_declare_target
2069 && !gfc_add_omp_declare_target (dest
, NULL
, where
))
2071 if (src
->omp_declare_target_link
2072 && !gfc_add_omp_declare_target_link (dest
, NULL
, where
))
2074 if (src
->oacc_declare_create
2075 && !gfc_add_oacc_declare_create (dest
, NULL
, where
))
2077 if (src
->oacc_declare_copyin
2078 && !gfc_add_oacc_declare_copyin (dest
, NULL
, where
))
2080 if (src
->oacc_declare_deviceptr
2081 && !gfc_add_oacc_declare_deviceptr (dest
, NULL
, where
))
2083 if (src
->oacc_declare_device_resident
2084 && !gfc_add_oacc_declare_device_resident (dest
, NULL
, where
))
2086 if (src
->target
&& !gfc_add_target (dest
, where
))
2088 if (src
->dummy
&& !gfc_add_dummy (dest
, NULL
, where
))
2090 if (src
->result
&& !gfc_add_result (dest
, NULL
, where
))
2095 if (src
->in_namelist
&& !gfc_add_in_namelist (dest
, NULL
, where
))
2098 if (src
->in_common
&& !gfc_add_in_common (dest
, NULL
, where
))
2101 if (src
->generic
&& !gfc_add_generic (dest
, NULL
, where
))
2103 if (src
->function
&& !gfc_add_function (dest
, NULL
, where
))
2105 if (src
->subroutine
&& !gfc_add_subroutine (dest
, NULL
, where
))
2108 if (src
->sequence
&& !gfc_add_sequence (dest
, NULL
, where
))
2110 if (src
->elemental
&& !gfc_add_elemental (dest
, where
))
2112 if (src
->pure
&& !gfc_add_pure (dest
, where
))
2114 if (src
->recursive
&& !gfc_add_recursive (dest
, where
))
2117 if (src
->flavor
!= FL_UNKNOWN
2118 && !gfc_add_flavor (dest
, src
->flavor
, NULL
, where
))
2121 if (src
->intent
!= INTENT_UNKNOWN
2122 && !gfc_add_intent (dest
, src
->intent
, where
))
2125 if (src
->access
!= ACCESS_UNKNOWN
2126 && !gfc_add_access (dest
, src
->access
, NULL
, where
))
2129 if (!gfc_missing_attr (dest
, where
))
2132 if (src
->cray_pointer
&& !gfc_add_cray_pointer (dest
, where
))
2134 if (src
->cray_pointee
&& !gfc_add_cray_pointee (dest
, where
))
2137 is_proc_lang_bind_spec
= (src
->flavor
== FL_PROCEDURE
? 1 : 0);
2139 && !gfc_add_is_bind_c (dest
, NULL
, where
, is_proc_lang_bind_spec
))
2142 if (src
->is_c_interop
)
2143 dest
->is_c_interop
= 1;
2147 if (src
->external
&& !gfc_add_external (dest
, where
))
2149 if (src
->intrinsic
&& !gfc_add_intrinsic (dest
, where
))
2151 if (src
->proc_pointer
)
2152 dest
->proc_pointer
= 1;
2161 /* A function to generate a dummy argument symbol using that from the
2162 interface declaration. Can be used for the result symbol as well if
2166 gfc_copy_dummy_sym (gfc_symbol
**dsym
, gfc_symbol
*sym
, int result
)
2170 rc
= gfc_get_symbol (sym
->name
, NULL
, dsym
);
2174 if (!gfc_add_type (*dsym
, &(sym
->ts
), &gfc_current_locus
))
2177 if (!gfc_copy_attr (&(*dsym
)->attr
, &(sym
->attr
),
2178 &gfc_current_locus
))
2181 if ((*dsym
)->attr
.dimension
)
2182 (*dsym
)->as
= gfc_copy_array_spec (sym
->as
);
2184 (*dsym
)->attr
.class_ok
= sym
->attr
.class_ok
;
2186 if ((*dsym
) != NULL
&& !result
2187 && (!gfc_add_dummy(&(*dsym
)->attr
, (*dsym
)->name
, NULL
)
2188 || !gfc_missing_attr (&(*dsym
)->attr
, NULL
)))
2190 else if ((*dsym
) != NULL
&& result
2191 && (!gfc_add_result(&(*dsym
)->attr
, (*dsym
)->name
, NULL
)
2192 || !gfc_missing_attr (&(*dsym
)->attr
, NULL
)))
2199 /************** Component name management ************/
2201 /* Component names of a derived type form their own little namespaces
2202 that are separate from all other spaces. The space is composed of
2203 a singly linked list of gfc_component structures whose head is
2204 located in the parent symbol. */
2207 /* Add a component name to a symbol. The call fails if the name is
2208 already present. On success, the component pointer is modified to
2209 point to the additional component structure. */
2212 gfc_add_component (gfc_symbol
*sym
, const char *name
,
2213 gfc_component
**component
)
2215 gfc_component
*p
, *tail
;
2217 /* Check for existing components with the same name, but not for union
2218 components or containers. Unions and maps are anonymous so they have
2219 unique internal names which will never conflict.
2220 Don't use gfc_find_component here because it calls gfc_use_derived,
2221 but the derived type may not be fully defined yet. */
2224 for (p
= sym
->components
; p
; p
= p
->next
)
2226 if (strcmp (p
->name
, name
) == 0)
2228 gfc_error ("Component %qs at %C already declared at %L",
2236 if (sym
->attr
.extension
2237 && gfc_find_component (sym
->components
->ts
.u
.derived
,
2238 name
, true, true, NULL
))
2240 gfc_error ("Component %qs at %C already in the parent type "
2241 "at %L", name
, &sym
->components
->ts
.u
.derived
->declared_at
);
2245 /* Allocate a new component. */
2246 p
= gfc_get_component ();
2249 sym
->components
= p
;
2253 p
->name
= gfc_get_string ("%s", name
);
2254 p
->loc
= gfc_current_locus
;
2255 p
->ts
.type
= BT_UNKNOWN
;
2262 /* Recursive function to switch derived types of all symbol in a
2266 switch_types (gfc_symtree
*st
, gfc_symbol
*from
, gfc_symbol
*to
)
2274 if (sym
->ts
.type
== BT_DERIVED
&& sym
->ts
.u
.derived
== from
)
2275 sym
->ts
.u
.derived
= to
;
2277 switch_types (st
->left
, from
, to
);
2278 switch_types (st
->right
, from
, to
);
2282 /* This subroutine is called when a derived type is used in order to
2283 make the final determination about which version to use. The
2284 standard requires that a type be defined before it is 'used', but
2285 such types can appear in IMPLICIT statements before the actual
2286 definition. 'Using' in this context means declaring a variable to
2287 be that type or using the type constructor.
2289 If a type is used and the components haven't been defined, then we
2290 have to have a derived type in a parent unit. We find the node in
2291 the other namespace and point the symtree node in this namespace to
2292 that node. Further reference to this name point to the correct
2293 node. If we can't find the node in a parent namespace, then we have
2296 This subroutine takes a pointer to a symbol node and returns a
2297 pointer to the translated node or NULL for an error. Usually there
2298 is no translation and we return the node we were passed. */
2301 gfc_use_derived (gfc_symbol
*sym
)
2311 if (sym
->attr
.unlimited_polymorphic
)
2314 if (sym
->attr
.generic
)
2315 sym
= gfc_find_dt_in_generic (sym
);
2317 if (sym
->components
!= NULL
|| sym
->attr
.zero_comp
)
2318 return sym
; /* Already defined. */
2320 if (sym
->ns
->parent
== NULL
)
2323 if (gfc_find_symbol (sym
->name
, sym
->ns
->parent
, 1, &s
))
2325 gfc_error ("Symbol %qs at %C is ambiguous", sym
->name
);
2329 if (s
== NULL
|| !gfc_fl_struct (s
->attr
.flavor
))
2332 /* Get rid of symbol sym, translating all references to s. */
2333 for (i
= 0; i
< GFC_LETTERS
; i
++)
2335 t
= &sym
->ns
->default_type
[i
];
2336 if (t
->u
.derived
== sym
)
2340 st
= gfc_find_symtree (sym
->ns
->sym_root
, sym
->name
);
2345 /* Unlink from list of modified symbols. */
2346 gfc_commit_symbol (sym
);
2348 switch_types (sym
->ns
->sym_root
, sym
, s
);
2350 /* TODO: Also have to replace sym -> s in other lists like
2351 namelists, common lists and interface lists. */
2352 gfc_free_symbol (sym
);
2357 gfc_error ("Derived type %qs at %C is being used before it is defined",
2363 /* Find the component with the given name in the union type symbol.
2364 If ref is not NULL it will be set to the chain of components through which
2365 the component can actually be accessed. This is necessary for unions because
2366 intermediate structures may be maps, nested structures, or other unions,
2367 all of which may (or must) be 'anonymous' to user code. */
2369 static gfc_component
*
2370 find_union_component (gfc_symbol
*un
, const char *name
,
2371 bool noaccess
, gfc_ref
**ref
)
2373 gfc_component
*m
, *check
;
2374 gfc_ref
*sref
, *tmp
;
2376 for (m
= un
->components
; m
; m
= m
->next
)
2378 check
= gfc_find_component (m
->ts
.u
.derived
, name
, noaccess
, true, &tmp
);
2382 /* Found component somewhere in m; chain the refs together. */
2386 sref
= gfc_get_ref ();
2387 sref
->type
= REF_COMPONENT
;
2388 sref
->u
.c
.component
= m
;
2389 sref
->u
.c
.sym
= m
->ts
.u
.derived
;
2394 /* Other checks (such as access) were done in the recursive calls. */
2401 /* Recursively append candidate COMPONENT structures to CANDIDATES. Store
2402 the number of total candidates in CANDIDATES_LEN. */
2405 lookup_component_fuzzy_find_candidates (gfc_component
*component
,
2407 size_t &candidates_len
)
2409 for (gfc_component
*p
= component
; p
; p
= p
->next
)
2410 vec_push (candidates
, candidates_len
, p
->name
);
2414 /* Lookup component MEMBER fuzzily, taking names in COMPONENT into account. */
2417 lookup_component_fuzzy (const char *member
, gfc_component
*component
)
2419 char **candidates
= NULL
;
2420 size_t candidates_len
= 0;
2421 lookup_component_fuzzy_find_candidates (component
, candidates
,
2423 return gfc_closest_fuzzy_match (member
, candidates
);
2427 /* Given a derived type node and a component name, try to locate the
2428 component structure. Returns the NULL pointer if the component is
2429 not found or the components are private. If noaccess is set, no access
2430 checks are done. If silent is set, an error will not be generated if
2431 the component cannot be found or accessed.
2433 If ref is not NULL, *ref is set to represent the chain of components
2434 required to get to the ultimate component.
2436 If the component is simply a direct subcomponent, or is inherited from a
2437 parent derived type in the given derived type, this is a single ref with its
2438 component set to the returned component.
2440 Otherwise, *ref is constructed as a chain of subcomponents. This occurs
2441 when the component is found through an implicit chain of nested union and
2442 map components. Unions and maps are "anonymous" substructures in FORTRAN
2443 which cannot be explicitly referenced, but the reference chain must be
2444 considered as in C for backend translation to correctly compute layouts.
2445 (For example, x.a may refer to x->(UNION)->(MAP)->(UNION)->(MAP)->a). */
2448 gfc_find_component (gfc_symbol
*sym
, const char *name
,
2449 bool noaccess
, bool silent
, gfc_ref
**ref
)
2451 gfc_component
*p
, *check
;
2452 gfc_ref
*sref
= NULL
, *tmp
= NULL
;
2454 if (name
== NULL
|| sym
== NULL
)
2457 if (sym
->attr
.flavor
== FL_DERIVED
)
2458 sym
= gfc_use_derived (sym
);
2460 gcc_assert (gfc_fl_struct (sym
->attr
.flavor
));
2465 /* Handle UNIONs specially - mutually recursive with gfc_find_component. */
2466 if (sym
->attr
.flavor
== FL_UNION
)
2467 return find_union_component (sym
, name
, noaccess
, ref
);
2469 if (ref
) *ref
= NULL
;
2470 for (p
= sym
->components
; p
; p
= p
->next
)
2472 /* Nest search into union's maps. */
2473 if (p
->ts
.type
== BT_UNION
)
2475 check
= find_union_component (p
->ts
.u
.derived
, name
, noaccess
, &tmp
);
2481 sref
= gfc_get_ref ();
2482 sref
->type
= REF_COMPONENT
;
2483 sref
->u
.c
.component
= p
;
2484 sref
->u
.c
.sym
= p
->ts
.u
.derived
;
2491 else if (strcmp (p
->name
, name
) == 0)
2497 if (p
&& sym
->attr
.use_assoc
&& !noaccess
)
2499 bool is_parent_comp
= sym
->attr
.extension
&& (p
== sym
->components
);
2500 if (p
->attr
.access
== ACCESS_PRIVATE
||
2501 (p
->attr
.access
!= ACCESS_PUBLIC
2502 && sym
->component_access
== ACCESS_PRIVATE
2503 && !is_parent_comp
))
2506 gfc_error ("Component %qs at %C is a PRIVATE component of %qs",
2513 && sym
->attr
.extension
2514 && sym
->components
->ts
.type
== BT_DERIVED
)
2516 p
= gfc_find_component (sym
->components
->ts
.u
.derived
, name
,
2517 noaccess
, silent
, ref
);
2518 /* Do not overwrite the error. */
2523 if (p
== NULL
&& !silent
)
2525 const char *guessed
= lookup_component_fuzzy (name
, sym
->components
);
2527 gfc_error ("%qs at %C is not a member of the %qs structure"
2528 "; did you mean %qs?",
2529 name
, sym
->name
, guessed
);
2531 gfc_error ("%qs at %C is not a member of the %qs structure",
2535 /* Component was found; build the ultimate component reference. */
2536 if (p
!= NULL
&& ref
)
2538 tmp
= gfc_get_ref ();
2539 tmp
->type
= REF_COMPONENT
;
2540 tmp
->u
.c
.component
= p
;
2542 /* Link the final component ref to the end of the chain of subrefs. */
2546 for (; sref
->next
; sref
= sref
->next
)
2558 /* Given a symbol, free all of the component structures and everything
2562 free_components (gfc_component
*p
)
2570 gfc_free_array_spec (p
->as
);
2571 gfc_free_expr (p
->initializer
);
2573 gfc_free_expr (p
->kind_expr
);
2575 gfc_free_actual_arglist (p
->param_list
);
2583 /******************** Statement label management ********************/
2585 /* Comparison function for statement labels, used for managing the
2589 compare_st_labels (void *a1
, void *b1
)
2591 int a
= ((gfc_st_label
*) a1
)->value
;
2592 int b
= ((gfc_st_label
*) b1
)->value
;
2598 /* Free a single gfc_st_label structure, making sure the tree is not
2599 messed up. This function is called only when some parse error
2603 gfc_free_st_label (gfc_st_label
*label
)
2609 gfc_delete_bbt (&label
->ns
->st_labels
, label
, compare_st_labels
);
2611 if (label
->format
!= NULL
)
2612 gfc_free_expr (label
->format
);
2618 /* Free a whole tree of gfc_st_label structures. */
2621 free_st_labels (gfc_st_label
*label
)
2627 free_st_labels (label
->left
);
2628 free_st_labels (label
->right
);
2630 if (label
->format
!= NULL
)
2631 gfc_free_expr (label
->format
);
2636 /* Given a label number, search for and return a pointer to the label
2637 structure, creating it if it does not exist. */
2640 gfc_get_st_label (int labelno
)
2645 if (gfc_current_state () == COMP_DERIVED
)
2646 ns
= gfc_current_block ()->f2k_derived
;
2649 /* Find the namespace of the scoping unit:
2650 If we're in a BLOCK construct, jump to the parent namespace. */
2651 ns
= gfc_current_ns
;
2652 while (ns
->proc_name
&& ns
->proc_name
->attr
.flavor
== FL_LABEL
)
2656 /* First see if the label is already in this namespace. */
2660 if (lp
->value
== labelno
)
2663 if (lp
->value
< labelno
)
2669 lp
= XCNEW (gfc_st_label
);
2671 lp
->value
= labelno
;
2672 lp
->defined
= ST_LABEL_UNKNOWN
;
2673 lp
->referenced
= ST_LABEL_UNKNOWN
;
2676 gfc_insert_bbt (&ns
->st_labels
, lp
, compare_st_labels
);
2682 /* Called when a statement with a statement label is about to be
2683 accepted. We add the label to the list of the current namespace,
2684 making sure it hasn't been defined previously and referenced
2688 gfc_define_st_label (gfc_st_label
*lp
, gfc_sl_type type
, locus
*label_locus
)
2692 labelno
= lp
->value
;
2694 if (lp
->defined
!= ST_LABEL_UNKNOWN
)
2695 gfc_error ("Duplicate statement label %d at %L and %L", labelno
,
2696 &lp
->where
, label_locus
);
2699 lp
->where
= *label_locus
;
2703 case ST_LABEL_FORMAT
:
2704 if (lp
->referenced
== ST_LABEL_TARGET
2705 || lp
->referenced
== ST_LABEL_DO_TARGET
)
2706 gfc_error ("Label %d at %C already referenced as branch target",
2709 lp
->defined
= ST_LABEL_FORMAT
;
2713 case ST_LABEL_TARGET
:
2714 case ST_LABEL_DO_TARGET
:
2715 if (lp
->referenced
== ST_LABEL_FORMAT
)
2716 gfc_error ("Label %d at %C already referenced as a format label",
2721 if (lp
->referenced
== ST_LABEL_DO_TARGET
&& type
!= ST_LABEL_DO_TARGET
2722 && !gfc_notify_std (GFC_STD_F95_OBS
, "DO termination statement "
2723 "which is not END DO or CONTINUE with "
2724 "label %d at %C", labelno
))
2729 lp
->defined
= ST_LABEL_BAD_TARGET
;
2730 lp
->referenced
= ST_LABEL_BAD_TARGET
;
2736 /* Reference a label. Given a label and its type, see if that
2737 reference is consistent with what is known about that label,
2738 updating the unknown state. Returns false if something goes
2742 gfc_reference_st_label (gfc_st_label
*lp
, gfc_sl_type type
)
2744 gfc_sl_type label_type
;
2751 labelno
= lp
->value
;
2753 if (lp
->defined
!= ST_LABEL_UNKNOWN
)
2754 label_type
= lp
->defined
;
2757 label_type
= lp
->referenced
;
2758 lp
->where
= gfc_current_locus
;
2761 if (label_type
== ST_LABEL_FORMAT
2762 && (type
== ST_LABEL_TARGET
|| type
== ST_LABEL_DO_TARGET
))
2764 gfc_error ("Label %d at %C previously used as a FORMAT label", labelno
);
2769 if ((label_type
== ST_LABEL_TARGET
|| label_type
== ST_LABEL_DO_TARGET
2770 || label_type
== ST_LABEL_BAD_TARGET
)
2771 && type
== ST_LABEL_FORMAT
)
2773 gfc_error ("Label %d at %C previously used as branch target", labelno
);
2778 if (lp
->referenced
== ST_LABEL_DO_TARGET
&& type
== ST_LABEL_DO_TARGET
2779 && !gfc_notify_std (GFC_STD_F95_OBS
, "Shared DO termination label %d "
2783 if (lp
->referenced
!= ST_LABEL_DO_TARGET
)
2784 lp
->referenced
= type
;
2792 /************** Symbol table management subroutines ****************/
2794 /* Basic details: Fortran 95 requires a potentially unlimited number
2795 of distinct namespaces when compiling a program unit. This case
2796 occurs during a compilation of internal subprograms because all of
2797 the internal subprograms must be read before we can start
2798 generating code for the host.
2800 Given the tricky nature of the Fortran grammar, we must be able to
2801 undo changes made to a symbol table if the current interpretation
2802 of a statement is found to be incorrect. Whenever a symbol is
2803 looked up, we make a copy of it and link to it. All of these
2804 symbols are kept in a vector so that we can commit or
2805 undo the changes at a later time.
2807 A symtree may point to a symbol node outside of its namespace. In
2808 this case, that symbol has been used as a host associated variable
2809 at some previous time. */
2811 /* Allocate a new namespace structure. Copies the implicit types from
2812 PARENT if PARENT_TYPES is set. */
2815 gfc_get_namespace (gfc_namespace
*parent
, int parent_types
)
2822 ns
= XCNEW (gfc_namespace
);
2823 ns
->sym_root
= NULL
;
2824 ns
->uop_root
= NULL
;
2825 ns
->tb_sym_root
= NULL
;
2826 ns
->finalizers
= NULL
;
2827 ns
->default_access
= ACCESS_UNKNOWN
;
2828 ns
->parent
= parent
;
2830 for (in
= GFC_INTRINSIC_BEGIN
; in
!= GFC_INTRINSIC_END
; in
++)
2832 ns
->operator_access
[in
] = ACCESS_UNKNOWN
;
2833 ns
->tb_op
[in
] = NULL
;
2836 /* Initialize default implicit types. */
2837 for (i
= 'a'; i
<= 'z'; i
++)
2839 ns
->set_flag
[i
- 'a'] = 0;
2840 ts
= &ns
->default_type
[i
- 'a'];
2842 if (parent_types
&& ns
->parent
!= NULL
)
2844 /* Copy parent settings. */
2845 *ts
= ns
->parent
->default_type
[i
- 'a'];
2849 if (flag_implicit_none
!= 0)
2855 if ('i' <= i
&& i
<= 'n')
2857 ts
->type
= BT_INTEGER
;
2858 ts
->kind
= gfc_default_integer_kind
;
2863 ts
->kind
= gfc_default_real_kind
;
2867 if (parent_types
&& ns
->parent
!= NULL
)
2868 ns
->has_implicit_none_export
= ns
->parent
->has_implicit_none_export
;
2876 /* Comparison function for symtree nodes. */
2879 compare_symtree (void *_st1
, void *_st2
)
2881 gfc_symtree
*st1
, *st2
;
2883 st1
= (gfc_symtree
*) _st1
;
2884 st2
= (gfc_symtree
*) _st2
;
2886 return strcmp (st1
->name
, st2
->name
);
2890 /* Allocate a new symtree node and associate it with the new symbol. */
2893 gfc_new_symtree (gfc_symtree
**root
, const char *name
)
2897 st
= XCNEW (gfc_symtree
);
2898 st
->name
= gfc_get_string ("%s", name
);
2900 gfc_insert_bbt (root
, st
, compare_symtree
);
2905 /* Delete a symbol from the tree. Does not free the symbol itself! */
2908 gfc_delete_symtree (gfc_symtree
**root
, const char *name
)
2910 gfc_symtree st
, *st0
;
2913 /* Submodules are marked as mod.submod. When freeing a submodule
2914 symbol, the symtree only has "submod", so adjust that here. */
2916 p
= strrchr(name
, '.');
2922 st0
= gfc_find_symtree (*root
, p
);
2924 st
.name
= gfc_get_string ("%s", p
);
2925 gfc_delete_bbt (root
, &st
, compare_symtree
);
2931 /* Given a root symtree node and a name, try to find the symbol within
2932 the namespace. Returns NULL if the symbol is not found. */
2935 gfc_find_symtree (gfc_symtree
*st
, const char *name
)
2941 c
= strcmp (name
, st
->name
);
2945 st
= (c
< 0) ? st
->left
: st
->right
;
2952 /* Return a symtree node with a name that is guaranteed to be unique
2953 within the namespace and corresponds to an illegal fortran name. */
2956 gfc_get_unique_symtree (gfc_namespace
*ns
)
2958 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
2959 static int serial
= 0;
2961 sprintf (name
, "@%d", serial
++);
2962 return gfc_new_symtree (&ns
->sym_root
, name
);
2966 /* Given a name find a user operator node, creating it if it doesn't
2967 exist. These are much simpler than symbols because they can't be
2968 ambiguous with one another. */
2971 gfc_get_uop (const char *name
)
2975 gfc_namespace
*ns
= gfc_current_ns
;
2979 st
= gfc_find_symtree (ns
->uop_root
, name
);
2983 st
= gfc_new_symtree (&ns
->uop_root
, name
);
2985 uop
= st
->n
.uop
= XCNEW (gfc_user_op
);
2986 uop
->name
= gfc_get_string ("%s", name
);
2987 uop
->access
= ACCESS_UNKNOWN
;
2994 /* Given a name find the user operator node. Returns NULL if it does
2998 gfc_find_uop (const char *name
, gfc_namespace
*ns
)
3003 ns
= gfc_current_ns
;
3005 st
= gfc_find_symtree (ns
->uop_root
, name
);
3006 return (st
== NULL
) ? NULL
: st
->n
.uop
;
3010 /* Update a symbol's common_block field, and take care of the associated
3011 memory management. */
3014 set_symbol_common_block (gfc_symbol
*sym
, gfc_common_head
*common_block
)
3016 if (sym
->common_block
== common_block
)
3019 if (sym
->common_block
&& sym
->common_block
->name
[0] != '\0')
3021 sym
->common_block
->refs
--;
3022 if (sym
->common_block
->refs
== 0)
3023 free (sym
->common_block
);
3025 sym
->common_block
= common_block
;
3029 /* Remove a gfc_symbol structure and everything it points to. */
3032 gfc_free_symbol (gfc_symbol
*sym
)
3038 gfc_free_array_spec (sym
->as
);
3040 free_components (sym
->components
);
3042 gfc_free_expr (sym
->value
);
3044 gfc_free_namelist (sym
->namelist
);
3046 if (sym
->ns
!= sym
->formal_ns
)
3047 gfc_free_namespace (sym
->formal_ns
);
3049 if (!sym
->attr
.generic_copy
)
3050 gfc_free_interface (sym
->generic
);
3052 gfc_free_formal_arglist (sym
->formal
);
3054 gfc_free_namespace (sym
->f2k_derived
);
3056 set_symbol_common_block (sym
, NULL
);
3058 if (sym
->param_list
)
3059 gfc_free_actual_arglist (sym
->param_list
);
3065 /* Decrease the reference counter and free memory when we reach zero. */
3068 gfc_release_symbol (gfc_symbol
*sym
)
3073 if (sym
->formal_ns
!= NULL
&& sym
->refs
== 2 && sym
->formal_ns
!= sym
->ns
3074 && (!sym
->attr
.entry
|| !sym
->module
))
3076 /* As formal_ns contains a reference to sym, delete formal_ns just
3077 before the deletion of sym. */
3078 gfc_namespace
*ns
= sym
->formal_ns
;
3079 sym
->formal_ns
= NULL
;
3080 gfc_free_namespace (ns
);
3087 gcc_assert (sym
->refs
== 0);
3088 gfc_free_symbol (sym
);
3092 /* Allocate and initialize a new symbol node. */
3095 gfc_new_symbol (const char *name
, gfc_namespace
*ns
)
3099 p
= XCNEW (gfc_symbol
);
3101 gfc_clear_ts (&p
->ts
);
3102 gfc_clear_attr (&p
->attr
);
3105 p
->declared_at
= gfc_current_locus
;
3107 if (strlen (name
) > GFC_MAX_SYMBOL_LEN
)
3108 gfc_internal_error ("new_symbol(): Symbol name too long");
3110 p
->name
= gfc_get_string ("%s", name
);
3112 /* Make sure flags for symbol being C bound are clear initially. */
3113 p
->attr
.is_bind_c
= 0;
3114 p
->attr
.is_iso_c
= 0;
3116 /* Clear the ptrs we may need. */
3117 p
->common_block
= NULL
;
3118 p
->f2k_derived
= NULL
;
3120 p
->fn_result_spec
= 0;
3126 /* Generate an error if a symbol is ambiguous. */
3129 ambiguous_symbol (const char *name
, gfc_symtree
*st
)
3132 if (st
->n
.sym
->module
)
3133 gfc_error ("Name %qs at %C is an ambiguous reference to %qs "
3134 "from module %qs", name
, st
->n
.sym
->name
, st
->n
.sym
->module
);
3136 gfc_error ("Name %qs at %C is an ambiguous reference to %qs "
3137 "from current program unit", name
, st
->n
.sym
->name
);
3141 /* If we're in a SELECT TYPE block, check if the variable 'st' matches any
3142 selector on the stack. If yes, replace it by the corresponding temporary. */
3145 select_type_insert_tmp (gfc_symtree
**st
)
3147 gfc_select_type_stack
*stack
= select_type_stack
;
3148 for (; stack
; stack
= stack
->prev
)
3149 if ((*st
)->n
.sym
== stack
->selector
&& stack
->tmp
)
3152 select_type_insert_tmp (st
);
3158 /* Look for a symtree in the current procedure -- that is, go up to
3159 parent namespaces but only if inside a BLOCK. Returns NULL if not found. */
3162 gfc_find_symtree_in_proc (const char* name
, gfc_namespace
* ns
)
3166 gfc_symtree
* st
= gfc_find_symtree (ns
->sym_root
, name
);
3170 if (!ns
->construct_entities
)
3179 /* Search for a symtree starting in the current namespace, resorting to
3180 any parent namespaces if requested by a nonzero parent_flag.
3181 Returns nonzero if the name is ambiguous. */
3184 gfc_find_sym_tree (const char *name
, gfc_namespace
*ns
, int parent_flag
,
3185 gfc_symtree
**result
)
3190 ns
= gfc_current_ns
;
3194 st
= gfc_find_symtree (ns
->sym_root
, name
);
3197 select_type_insert_tmp (&st
);
3200 /* Ambiguous generic interfaces are permitted, as long
3201 as the specific interfaces are different. */
3202 if (st
->ambiguous
&& !st
->n
.sym
->attr
.generic
)
3204 ambiguous_symbol (name
, st
);
3214 /* Don't escape an interface block. */
3215 if (ns
&& !ns
->has_import_set
3216 && ns
->proc_name
&& ns
->proc_name
->attr
.if_source
== IFSRC_IFBODY
)
3223 if (gfc_current_state() == COMP_DERIVED
3224 && gfc_current_block ()->attr
.pdt_template
)
3226 gfc_symbol
*der
= gfc_current_block ();
3227 for (; der
; der
= gfc_get_derived_super_type (der
))
3229 if (der
->f2k_derived
&& der
->f2k_derived
->sym_root
)
3231 st
= gfc_find_symtree (der
->f2k_derived
->sym_root
, name
);
3246 /* Same, but returns the symbol instead. */
3249 gfc_find_symbol (const char *name
, gfc_namespace
*ns
, int parent_flag
,
3250 gfc_symbol
**result
)
3255 i
= gfc_find_sym_tree (name
, ns
, parent_flag
, &st
);
3260 *result
= st
->n
.sym
;
3266 /* Tells whether there is only one set of changes in the stack. */
3269 single_undo_checkpoint_p (void)
3271 if (latest_undo_chgset
== &default_undo_chgset_var
)
3273 gcc_assert (latest_undo_chgset
->previous
== NULL
);
3278 gcc_assert (latest_undo_chgset
->previous
!= NULL
);
3283 /* Save symbol with the information necessary to back it out. */
3286 gfc_save_symbol_data (gfc_symbol
*sym
)
3291 if (!single_undo_checkpoint_p ())
3293 /* If there is more than one change set, look for the symbol in the
3294 current one. If it is found there, we can reuse it. */
3295 FOR_EACH_VEC_ELT (latest_undo_chgset
->syms
, i
, s
)
3298 gcc_assert (sym
->gfc_new
|| sym
->old_symbol
!= NULL
);
3302 else if (sym
->gfc_new
|| sym
->old_symbol
!= NULL
)
3305 s
= XCNEW (gfc_symbol
);
3307 sym
->old_symbol
= s
;
3310 latest_undo_chgset
->syms
.safe_push (sym
);
3314 /* Given a name, find a symbol, or create it if it does not exist yet
3315 in the current namespace. If the symbol is found we make sure that
3318 The integer return code indicates
3320 1 The symbol name was ambiguous
3321 2 The name meant to be established was already host associated.
3323 So if the return value is nonzero, then an error was issued. */
3326 gfc_get_sym_tree (const char *name
, gfc_namespace
*ns
, gfc_symtree
**result
,
3327 bool allow_subroutine
)
3332 /* This doesn't usually happen during resolution. */
3334 ns
= gfc_current_ns
;
3336 /* Try to find the symbol in ns. */
3337 st
= gfc_find_symtree (ns
->sym_root
, name
);
3339 if (st
== NULL
&& ns
->omp_udr_ns
)
3342 st
= gfc_find_symtree (ns
->sym_root
, name
);
3347 /* If not there, create a new symbol. */
3348 p
= gfc_new_symbol (name
, ns
);
3350 /* Add to the list of tentative symbols. */
3351 p
->old_symbol
= NULL
;
3354 latest_undo_chgset
->syms
.safe_push (p
);
3356 st
= gfc_new_symtree (&ns
->sym_root
, name
);
3363 /* Make sure the existing symbol is OK. Ambiguous
3364 generic interfaces are permitted, as long as the
3365 specific interfaces are different. */
3366 if (st
->ambiguous
&& !st
->n
.sym
->attr
.generic
)
3368 ambiguous_symbol (name
, st
);
3373 if (p
->ns
!= ns
&& (!p
->attr
.function
|| ns
->proc_name
!= p
)
3374 && !(allow_subroutine
&& p
->attr
.subroutine
)
3375 && !(ns
->proc_name
&& ns
->proc_name
->attr
.if_source
== IFSRC_IFBODY
3376 && (ns
->has_import_set
|| p
->attr
.imported
)))
3378 /* Symbol is from another namespace. */
3379 gfc_error ("Symbol %qs at %C has already been host associated",
3386 /* Copy in case this symbol is changed. */
3387 gfc_save_symbol_data (p
);
3396 gfc_get_symbol (const char *name
, gfc_namespace
*ns
, gfc_symbol
**result
)
3401 i
= gfc_get_sym_tree (name
, ns
, &st
, false);
3406 *result
= st
->n
.sym
;
3413 /* Subroutine that searches for a symbol, creating it if it doesn't
3414 exist, but tries to host-associate the symbol if possible. */
3417 gfc_get_ha_sym_tree (const char *name
, gfc_symtree
**result
)
3422 i
= gfc_find_sym_tree (name
, gfc_current_ns
, 0, &st
);
3426 gfc_save_symbol_data (st
->n
.sym
);
3431 i
= gfc_find_sym_tree (name
, gfc_current_ns
, 1, &st
);
3441 return gfc_get_sym_tree (name
, gfc_current_ns
, result
, false);
3446 gfc_get_ha_symbol (const char *name
, gfc_symbol
**result
)
3451 i
= gfc_get_ha_sym_tree (name
, &st
);
3454 *result
= st
->n
.sym
;
3462 /* Search for the symtree belonging to a gfc_common_head; we cannot use
3463 head->name as the common_root symtree's name might be mangled. */
3465 static gfc_symtree
*
3466 find_common_symtree (gfc_symtree
*st
, gfc_common_head
*head
)
3469 gfc_symtree
*result
;
3474 if (st
->n
.common
== head
)
3477 result
= find_common_symtree (st
->left
, head
);
3479 result
= find_common_symtree (st
->right
, head
);
3485 /* Clear the given storage, and make it the current change set for registering
3486 changed symbols. Its contents are freed after a call to
3487 gfc_restore_last_undo_checkpoint or gfc_drop_last_undo_checkpoint, but
3488 it is up to the caller to free the storage itself. It is usually a local
3489 variable, so there is nothing to do anyway. */
3492 gfc_new_undo_checkpoint (gfc_undo_change_set
&chg_syms
)
3494 chg_syms
.syms
= vNULL
;
3495 chg_syms
.tbps
= vNULL
;
3496 chg_syms
.previous
= latest_undo_chgset
;
3497 latest_undo_chgset
= &chg_syms
;
3501 /* Restore previous state of symbol. Just copy simple stuff. */
3504 restore_old_symbol (gfc_symbol
*p
)
3509 old
= p
->old_symbol
;
3511 p
->ts
.type
= old
->ts
.type
;
3512 p
->ts
.kind
= old
->ts
.kind
;
3514 p
->attr
= old
->attr
;
3516 if (p
->value
!= old
->value
)
3518 gcc_checking_assert (old
->value
== NULL
);
3519 gfc_free_expr (p
->value
);
3523 if (p
->as
!= old
->as
)
3526 gfc_free_array_spec (p
->as
);
3530 p
->generic
= old
->generic
;
3531 p
->component_access
= old
->component_access
;
3533 if (p
->namelist
!= NULL
&& old
->namelist
== NULL
)
3535 gfc_free_namelist (p
->namelist
);
3540 if (p
->namelist_tail
!= old
->namelist_tail
)
3542 gfc_free_namelist (old
->namelist_tail
->next
);
3543 old
->namelist_tail
->next
= NULL
;
3547 p
->namelist_tail
= old
->namelist_tail
;
3549 if (p
->formal
!= old
->formal
)
3551 gfc_free_formal_arglist (p
->formal
);
3552 p
->formal
= old
->formal
;
3555 set_symbol_common_block (p
, old
->common_block
);
3556 p
->common_head
= old
->common_head
;
3558 p
->old_symbol
= old
->old_symbol
;
3563 /* Frees the internal data of a gfc_undo_change_set structure. Doesn't free
3564 the structure itself. */
3567 free_undo_change_set_data (gfc_undo_change_set
&cs
)
3574 /* Given a change set pointer, free its target's contents and update it with
3575 the address of the previous change set. Note that only the contents are
3576 freed, not the target itself (the contents' container). It is not a problem
3577 as the latter will be a local variable usually. */
3580 pop_undo_change_set (gfc_undo_change_set
*&cs
)
3582 free_undo_change_set_data (*cs
);
3587 static void free_old_symbol (gfc_symbol
*sym
);
3590 /* Merges the current change set into the previous one. The changes themselves
3591 are left untouched; only one checkpoint is forgotten. */
3594 gfc_drop_last_undo_checkpoint (void)
3599 FOR_EACH_VEC_ELT (latest_undo_chgset
->syms
, i
, s
)
3601 /* No need to loop in this case. */
3602 if (s
->old_symbol
== NULL
)
3605 /* Remove the duplicate symbols. */
3606 FOR_EACH_VEC_ELT (latest_undo_chgset
->previous
->syms
, j
, t
)
3609 latest_undo_chgset
->previous
->syms
.unordered_remove (j
);
3611 /* S->OLD_SYMBOL is the backup symbol for S as it was at the
3612 last checkpoint. We drop that checkpoint, so S->OLD_SYMBOL
3613 shall contain from now on the backup symbol for S as it was
3614 at the checkpoint before. */
3615 if (s
->old_symbol
->gfc_new
)
3617 gcc_assert (s
->old_symbol
->old_symbol
== NULL
);
3618 s
->gfc_new
= s
->old_symbol
->gfc_new
;
3619 free_old_symbol (s
);
3622 restore_old_symbol (s
->old_symbol
);
3627 latest_undo_chgset
->previous
->syms
.safe_splice (latest_undo_chgset
->syms
);
3628 latest_undo_chgset
->previous
->tbps
.safe_splice (latest_undo_chgset
->tbps
);
3630 pop_undo_change_set (latest_undo_chgset
);
3634 /* Undoes all the changes made to symbols since the previous checkpoint.
3635 This subroutine is made simpler due to the fact that attributes are
3636 never removed once added. */
3639 gfc_restore_last_undo_checkpoint (void)
3644 FOR_EACH_VEC_ELT (latest_undo_chgset
->syms
, i
, p
)
3646 /* Symbol in a common block was new. Or was old and just put in common */
3648 && (p
->gfc_new
|| !p
->old_symbol
->common_block
))
3650 /* If the symbol was added to any common block, it
3651 needs to be removed to stop the resolver looking
3652 for a (possibly) dead symbol. */
3653 if (p
->common_block
->head
== p
&& !p
->common_next
)
3655 gfc_symtree st
, *st0
;
3656 st0
= find_common_symtree (p
->ns
->common_root
,
3660 st
.name
= st0
->name
;
3661 gfc_delete_bbt (&p
->ns
->common_root
, &st
, compare_symtree
);
3666 if (p
->common_block
->head
== p
)
3667 p
->common_block
->head
= p
->common_next
;
3670 gfc_symbol
*cparent
, *csym
;
3672 cparent
= p
->common_block
->head
;
3673 csym
= cparent
->common_next
;
3678 csym
= csym
->common_next
;
3681 gcc_assert(cparent
->common_next
== p
);
3682 cparent
->common_next
= csym
->common_next
;
3684 p
->common_next
= NULL
;
3688 /* The derived type is saved in the symtree with the first
3689 letter capitalized; the all lower-case version to the
3690 derived type contains its associated generic function. */
3691 if (gfc_fl_struct (p
->attr
.flavor
))
3692 gfc_delete_symtree (&p
->ns
->sym_root
,gfc_dt_upper_string (p
->name
));
3694 gfc_delete_symtree (&p
->ns
->sym_root
, p
->name
);
3696 gfc_release_symbol (p
);
3699 restore_old_symbol (p
);
3702 latest_undo_chgset
->syms
.truncate (0);
3703 latest_undo_chgset
->tbps
.truncate (0);
3705 if (!single_undo_checkpoint_p ())
3706 pop_undo_change_set (latest_undo_chgset
);
3710 /* Makes sure that there is only one set of changes; in other words we haven't
3711 forgotten to pair a call to gfc_new_checkpoint with a call to either
3712 gfc_drop_last_undo_checkpoint or gfc_restore_last_undo_checkpoint. */
3715 enforce_single_undo_checkpoint (void)
3717 gcc_checking_assert (single_undo_checkpoint_p ());
3721 /* Undoes all the changes made to symbols in the current statement. */
3724 gfc_undo_symbols (void)
3726 enforce_single_undo_checkpoint ();
3727 gfc_restore_last_undo_checkpoint ();
3731 /* Free sym->old_symbol. sym->old_symbol is mostly a shallow copy of sym; the
3732 components of old_symbol that might need deallocation are the "allocatables"
3733 that are restored in gfc_undo_symbols(), with two exceptions: namelist and
3734 namelist_tail. In case these differ between old_symbol and sym, it's just
3735 because sym->namelist has gotten a few more items. */
3738 free_old_symbol (gfc_symbol
*sym
)
3741 if (sym
->old_symbol
== NULL
)
3744 if (sym
->old_symbol
->as
!= sym
->as
)
3745 gfc_free_array_spec (sym
->old_symbol
->as
);
3747 if (sym
->old_symbol
->value
!= sym
->value
)
3748 gfc_free_expr (sym
->old_symbol
->value
);
3750 if (sym
->old_symbol
->formal
!= sym
->formal
)
3751 gfc_free_formal_arglist (sym
->old_symbol
->formal
);
3753 free (sym
->old_symbol
);
3754 sym
->old_symbol
= NULL
;
3758 /* Makes the changes made in the current statement permanent-- gets
3759 rid of undo information. */
3762 gfc_commit_symbols (void)
3765 gfc_typebound_proc
*tbp
;
3768 enforce_single_undo_checkpoint ();
3770 FOR_EACH_VEC_ELT (latest_undo_chgset
->syms
, i
, p
)
3774 free_old_symbol (p
);
3776 latest_undo_chgset
->syms
.truncate (0);
3778 FOR_EACH_VEC_ELT (latest_undo_chgset
->tbps
, i
, tbp
)
3780 latest_undo_chgset
->tbps
.truncate (0);
3784 /* Makes the changes made in one symbol permanent -- gets rid of undo
3788 gfc_commit_symbol (gfc_symbol
*sym
)
3793 enforce_single_undo_checkpoint ();
3795 FOR_EACH_VEC_ELT (latest_undo_chgset
->syms
, i
, p
)
3798 latest_undo_chgset
->syms
.unordered_remove (i
);
3805 free_old_symbol (sym
);
3809 /* Recursively free trees containing type-bound procedures. */
3812 free_tb_tree (gfc_symtree
*t
)
3817 free_tb_tree (t
->left
);
3818 free_tb_tree (t
->right
);
3820 /* TODO: Free type-bound procedure structs themselves; probably needs some
3821 sort of ref-counting mechanism. */
3827 /* Recursive function that deletes an entire tree and all the common
3828 head structures it points to. */
3831 free_common_tree (gfc_symtree
* common_tree
)
3833 if (common_tree
== NULL
)
3836 free_common_tree (common_tree
->left
);
3837 free_common_tree (common_tree
->right
);
3843 /* Recursive function that deletes an entire tree and all the common
3844 head structures it points to. */
3847 free_omp_udr_tree (gfc_symtree
* omp_udr_tree
)
3849 if (omp_udr_tree
== NULL
)
3852 free_omp_udr_tree (omp_udr_tree
->left
);
3853 free_omp_udr_tree (omp_udr_tree
->right
);
3855 gfc_free_omp_udr (omp_udr_tree
->n
.omp_udr
);
3856 free (omp_udr_tree
);
3860 /* Recursive function that deletes an entire tree and all the user
3861 operator nodes that it contains. */
3864 free_uop_tree (gfc_symtree
*uop_tree
)
3866 if (uop_tree
== NULL
)
3869 free_uop_tree (uop_tree
->left
);
3870 free_uop_tree (uop_tree
->right
);
3872 gfc_free_interface (uop_tree
->n
.uop
->op
);
3873 free (uop_tree
->n
.uop
);
3878 /* Recursive function that deletes an entire tree and all the symbols
3879 that it contains. */
3882 free_sym_tree (gfc_symtree
*sym_tree
)
3884 if (sym_tree
== NULL
)
3887 free_sym_tree (sym_tree
->left
);
3888 free_sym_tree (sym_tree
->right
);
3890 gfc_release_symbol (sym_tree
->n
.sym
);
3895 /* Free the derived type list. */
3898 gfc_free_dt_list (void)
3900 gfc_dt_list
*dt
, *n
;
3902 for (dt
= gfc_derived_types
; dt
; dt
= n
)
3908 gfc_derived_types
= NULL
;
3912 /* Free the gfc_equiv_info's. */
3915 gfc_free_equiv_infos (gfc_equiv_info
*s
)
3919 gfc_free_equiv_infos (s
->next
);
3924 /* Free the gfc_equiv_lists. */
3927 gfc_free_equiv_lists (gfc_equiv_list
*l
)
3931 gfc_free_equiv_lists (l
->next
);
3932 gfc_free_equiv_infos (l
->equiv
);
3937 /* Free a finalizer procedure list. */
3940 gfc_free_finalizer (gfc_finalizer
* el
)
3944 gfc_release_symbol (el
->proc_sym
);
3950 gfc_free_finalizer_list (gfc_finalizer
* list
)
3954 gfc_finalizer
* current
= list
;
3956 gfc_free_finalizer (current
);
3961 /* Create a new gfc_charlen structure and add it to a namespace.
3962 If 'old_cl' is given, the newly created charlen will be a copy of it. */
3965 gfc_new_charlen (gfc_namespace
*ns
, gfc_charlen
*old_cl
)
3969 cl
= gfc_get_charlen ();
3974 cl
->length
= gfc_copy_expr (old_cl
->length
);
3975 cl
->length_from_typespec
= old_cl
->length_from_typespec
;
3976 cl
->backend_decl
= old_cl
->backend_decl
;
3977 cl
->passed_length
= old_cl
->passed_length
;
3978 cl
->resolved
= old_cl
->resolved
;
3981 /* Put into namespace. */
3982 cl
->next
= ns
->cl_list
;
3989 /* Free the charlen list from cl to end (end is not freed).
3990 Free the whole list if end is NULL. */
3993 gfc_free_charlen (gfc_charlen
*cl
, gfc_charlen
*end
)
3997 for (; cl
!= end
; cl
= cl2
)
4002 gfc_free_expr (cl
->length
);
4008 /* Free entry list structs. */
4011 free_entry_list (gfc_entry_list
*el
)
4013 gfc_entry_list
*next
;
4020 free_entry_list (next
);
4024 /* Free a namespace structure and everything below it. Interface
4025 lists associated with intrinsic operators are not freed. These are
4026 taken care of when a specific name is freed. */
4029 gfc_free_namespace (gfc_namespace
*ns
)
4031 gfc_namespace
*p
, *q
;
4041 gcc_assert (ns
->refs
== 0);
4043 gfc_free_statements (ns
->code
);
4045 free_sym_tree (ns
->sym_root
);
4046 free_uop_tree (ns
->uop_root
);
4047 free_common_tree (ns
->common_root
);
4048 free_omp_udr_tree (ns
->omp_udr_root
);
4049 free_tb_tree (ns
->tb_sym_root
);
4050 free_tb_tree (ns
->tb_uop_root
);
4051 gfc_free_finalizer_list (ns
->finalizers
);
4052 gfc_free_omp_declare_simd_list (ns
->omp_declare_simd
);
4053 gfc_free_charlen (ns
->cl_list
, NULL
);
4054 free_st_labels (ns
->st_labels
);
4056 free_entry_list (ns
->entries
);
4057 gfc_free_equiv (ns
->equiv
);
4058 gfc_free_equiv_lists (ns
->equiv_lists
);
4059 gfc_free_use_stmts (ns
->use_stmts
);
4061 for (i
= GFC_INTRINSIC_BEGIN
; i
!= GFC_INTRINSIC_END
; i
++)
4062 gfc_free_interface (ns
->op
[i
]);
4064 gfc_free_data (ns
->data
);
4068 /* Recursively free any contained namespaces. */
4073 gfc_free_namespace (q
);
4079 gfc_symbol_init_2 (void)
4082 gfc_current_ns
= gfc_get_namespace (NULL
, 0);
4087 gfc_symbol_done_2 (void)
4089 gfc_free_namespace (gfc_current_ns
);
4090 gfc_current_ns
= NULL
;
4091 gfc_free_dt_list ();
4093 enforce_single_undo_checkpoint ();
4094 free_undo_change_set_data (*latest_undo_chgset
);
4098 /* Count how many nodes a symtree has. */
4101 count_st_nodes (const gfc_symtree
*st
)
4107 nodes
= count_st_nodes (st
->left
);
4109 nodes
+= count_st_nodes (st
->right
);
4115 /* Convert symtree tree into symtree vector. */
4118 fill_st_vector (gfc_symtree
*st
, gfc_symtree
**st_vec
, unsigned node_cntr
)
4123 node_cntr
= fill_st_vector (st
->left
, st_vec
, node_cntr
);
4124 st_vec
[node_cntr
++] = st
;
4125 node_cntr
= fill_st_vector (st
->right
, st_vec
, node_cntr
);
4131 /* Traverse namespace. As the functions might modify the symtree, we store the
4132 symtree as a vector and operate on this vector. Note: We assume that
4133 sym_func or st_func never deletes nodes from the symtree - only adding is
4134 allowed. Additionally, newly added nodes are not traversed. */
4137 do_traverse_symtree (gfc_symtree
*st
, void (*st_func
) (gfc_symtree
*),
4138 void (*sym_func
) (gfc_symbol
*))
4140 gfc_symtree
**st_vec
;
4141 unsigned nodes
, i
, node_cntr
;
4143 gcc_assert ((st_func
&& !sym_func
) || (!st_func
&& sym_func
));
4144 nodes
= count_st_nodes (st
);
4145 st_vec
= XALLOCAVEC (gfc_symtree
*, nodes
);
4147 fill_st_vector (st
, st_vec
, node_cntr
);
4152 for (i
= 0; i
< nodes
; i
++)
4153 st_vec
[i
]->n
.sym
->mark
= 0;
4154 for (i
= 0; i
< nodes
; i
++)
4155 if (!st_vec
[i
]->n
.sym
->mark
)
4157 (*sym_func
) (st_vec
[i
]->n
.sym
);
4158 st_vec
[i
]->n
.sym
->mark
= 1;
4162 for (i
= 0; i
< nodes
; i
++)
4163 (*st_func
) (st_vec
[i
]);
4167 /* Recursively traverse the symtree nodes. */
4170 gfc_traverse_symtree (gfc_symtree
*st
, void (*st_func
) (gfc_symtree
*))
4172 do_traverse_symtree (st
, st_func
, NULL
);
4176 /* Call a given function for all symbols in the namespace. We take
4177 care that each gfc_symbol node is called exactly once. */
4180 gfc_traverse_ns (gfc_namespace
*ns
, void (*sym_func
) (gfc_symbol
*))
4182 do_traverse_symtree (ns
->sym_root
, NULL
, sym_func
);
4186 /* Return TRUE when name is the name of an intrinsic type. */
4189 gfc_is_intrinsic_typename (const char *name
)
4191 if (strcmp (name
, "integer") == 0
4192 || strcmp (name
, "real") == 0
4193 || strcmp (name
, "character") == 0
4194 || strcmp (name
, "logical") == 0
4195 || strcmp (name
, "complex") == 0
4196 || strcmp (name
, "doubleprecision") == 0
4197 || strcmp (name
, "doublecomplex") == 0)
4204 /* Return TRUE if the symbol is an automatic variable. */
4207 gfc_is_var_automatic (gfc_symbol
*sym
)
4209 /* Pointer and allocatable variables are never automatic. */
4210 if (sym
->attr
.pointer
|| sym
->attr
.allocatable
)
4212 /* Check for arrays with non-constant size. */
4213 if (sym
->attr
.dimension
&& sym
->as
4214 && !gfc_is_compile_time_shape (sym
->as
))
4216 /* Check for non-constant length character variables. */
4217 if (sym
->ts
.type
== BT_CHARACTER
4219 && !gfc_is_constant_expr (sym
->ts
.u
.cl
->length
))
4221 /* Variables with explicit AUTOMATIC attribute. */
4222 if (sym
->attr
.automatic
)
4228 /* Given a symbol, mark it as SAVEd if it is allowed. */
4231 save_symbol (gfc_symbol
*sym
)
4234 if (sym
->attr
.use_assoc
)
4237 if (sym
->attr
.in_common
4240 || sym
->attr
.flavor
!= FL_VARIABLE
)
4242 /* Automatic objects are not saved. */
4243 if (gfc_is_var_automatic (sym
))
4245 gfc_add_save (&sym
->attr
, SAVE_EXPLICIT
, sym
->name
, &sym
->declared_at
);
4249 /* Mark those symbols which can be SAVEd as such. */
4252 gfc_save_all (gfc_namespace
*ns
)
4254 gfc_traverse_ns (ns
, save_symbol
);
4258 /* Make sure that no changes to symbols are pending. */
4261 gfc_enforce_clean_symbol_state(void)
4263 enforce_single_undo_checkpoint ();
4264 gcc_assert (latest_undo_chgset
->syms
.is_empty ());
4268 /************** Global symbol handling ************/
4271 /* Search a tree for the global symbol. */
4274 gfc_find_gsymbol (gfc_gsymbol
*symbol
, const char *name
)
4283 c
= strcmp (name
, symbol
->name
);
4287 symbol
= (c
< 0) ? symbol
->left
: symbol
->right
;
4294 /* Case insensitive search a tree for the global symbol. */
4297 gfc_find_case_gsymbol (gfc_gsymbol
*symbol
, const char *name
)
4306 c
= strcasecmp (name
, symbol
->name
);
4310 symbol
= (c
< 0) ? symbol
->left
: symbol
->right
;
4317 /* Compare two global symbols. Used for managing the BB tree. */
4320 gsym_compare (void *_s1
, void *_s2
)
4322 gfc_gsymbol
*s1
, *s2
;
4324 s1
= (gfc_gsymbol
*) _s1
;
4325 s2
= (gfc_gsymbol
*) _s2
;
4326 return strcmp (s1
->name
, s2
->name
);
4330 /* Get a global symbol, creating it if it doesn't exist. */
4333 gfc_get_gsymbol (const char *name
)
4337 s
= gfc_find_gsymbol (gfc_gsym_root
, name
);
4341 s
= XCNEW (gfc_gsymbol
);
4342 s
->type
= GSYM_UNKNOWN
;
4343 s
->name
= gfc_get_string ("%s", name
);
4345 gfc_insert_bbt (&gfc_gsym_root
, s
, gsym_compare
);
4352 get_iso_c_binding_dt (int sym_id
)
4354 gfc_dt_list
*dt_list
;
4356 dt_list
= gfc_derived_types
;
4358 /* Loop through the derived types in the name list, searching for
4359 the desired symbol from iso_c_binding. Search the parent namespaces
4360 if necessary and requested to (parent_flag). */
4361 while (dt_list
!= NULL
)
4363 if (dt_list
->derived
->from_intmod
!= INTMOD_NONE
4364 && dt_list
->derived
->intmod_sym_id
== sym_id
)
4365 return dt_list
->derived
;
4367 dt_list
= dt_list
->next
;
4374 /* Verifies that the given derived type symbol, derived_sym, is interoperable
4375 with C. This is necessary for any derived type that is BIND(C) and for
4376 derived types that are parameters to functions that are BIND(C). All
4377 fields of the derived type are required to be interoperable, and are tested
4378 for such. If an error occurs, the errors are reported here, allowing for
4379 multiple errors to be handled for a single derived type. */
4382 verify_bind_c_derived_type (gfc_symbol
*derived_sym
)
4384 gfc_component
*curr_comp
= NULL
;
4385 bool is_c_interop
= false;
4388 if (derived_sym
== NULL
)
4389 gfc_internal_error ("verify_bind_c_derived_type(): Given symbol is "
4390 "unexpectedly NULL");
4392 /* If we've already looked at this derived symbol, do not look at it again
4393 so we don't repeat warnings/errors. */
4394 if (derived_sym
->ts
.is_c_interop
)
4397 /* The derived type must have the BIND attribute to be interoperable
4398 J3/04-007, Section 15.2.3. */
4399 if (derived_sym
->attr
.is_bind_c
!= 1)
4401 derived_sym
->ts
.is_c_interop
= 0;
4402 gfc_error_now ("Derived type %qs declared at %L must have the BIND "
4403 "attribute to be C interoperable", derived_sym
->name
,
4404 &(derived_sym
->declared_at
));
4408 curr_comp
= derived_sym
->components
;
4410 /* Fortran 2003 allows an empty derived type. C99 appears to disallow an
4411 empty struct. Section 15.2 in Fortran 2003 states: "The following
4412 subclauses define the conditions under which a Fortran entity is
4413 interoperable. If a Fortran entity is interoperable, an equivalent
4414 entity may be defined by means of C and the Fortran entity is said
4415 to be interoperable with the C entity. There does not have to be such
4416 an interoperating C entity."
4418 if (curr_comp
== NULL
)
4420 gfc_warning (0, "Derived type %qs with BIND(C) attribute at %L is empty, "
4421 "and may be inaccessible by the C companion processor",
4422 derived_sym
->name
, &(derived_sym
->declared_at
));
4423 derived_sym
->ts
.is_c_interop
= 1;
4424 derived_sym
->attr
.is_bind_c
= 1;
4429 /* Initialize the derived type as being C interoperable.
4430 If we find an error in the components, this will be set false. */
4431 derived_sym
->ts
.is_c_interop
= 1;
4433 /* Loop through the list of components to verify that the kind of
4434 each is a C interoperable type. */
4437 /* The components cannot be pointers (fortran sense).
4438 J3/04-007, Section 15.2.3, C1505. */
4439 if (curr_comp
->attr
.pointer
!= 0)
4441 gfc_error ("Component %qs at %L cannot have the "
4442 "POINTER attribute because it is a member "
4443 "of the BIND(C) derived type %qs at %L",
4444 curr_comp
->name
, &(curr_comp
->loc
),
4445 derived_sym
->name
, &(derived_sym
->declared_at
));
4449 if (curr_comp
->attr
.proc_pointer
!= 0)
4451 gfc_error ("Procedure pointer component %qs at %L cannot be a member"
4452 " of the BIND(C) derived type %qs at %L", curr_comp
->name
,
4453 &curr_comp
->loc
, derived_sym
->name
,
4454 &derived_sym
->declared_at
);
4458 /* The components cannot be allocatable.
4459 J3/04-007, Section 15.2.3, C1505. */
4460 if (curr_comp
->attr
.allocatable
!= 0)
4462 gfc_error ("Component %qs at %L cannot have the "
4463 "ALLOCATABLE attribute because it is a member "
4464 "of the BIND(C) derived type %qs at %L",
4465 curr_comp
->name
, &(curr_comp
->loc
),
4466 derived_sym
->name
, &(derived_sym
->declared_at
));
4470 /* BIND(C) derived types must have interoperable components. */
4471 if (curr_comp
->ts
.type
== BT_DERIVED
4472 && curr_comp
->ts
.u
.derived
->ts
.is_iso_c
!= 1
4473 && curr_comp
->ts
.u
.derived
!= derived_sym
)
4475 /* This should be allowed; the draft says a derived-type can not
4476 have type parameters if it is has the BIND attribute. Type
4477 parameters seem to be for making parameterized derived types.
4478 There's no need to verify the type if it is c_ptr/c_funptr. */
4479 retval
= verify_bind_c_derived_type (curr_comp
->ts
.u
.derived
);
4483 /* Grab the typespec for the given component and test the kind. */
4484 is_c_interop
= gfc_verify_c_interop (&(curr_comp
->ts
));
4488 /* Report warning and continue since not fatal. The
4489 draft does specify a constraint that requires all fields
4490 to interoperate, but if the user says real(4), etc., it
4491 may interoperate with *something* in C, but the compiler
4492 most likely won't know exactly what. Further, it may not
4493 interoperate with the same data type(s) in C if the user
4494 recompiles with different flags (e.g., -m32 and -m64 on
4495 x86_64 and using integer(4) to claim interop with a
4497 if (derived_sym
->attr
.is_bind_c
== 1 && warn_c_binding_type
)
4498 /* If the derived type is bind(c), all fields must be
4500 gfc_warning (OPT_Wc_binding_type
,
4501 "Component %qs in derived type %qs at %L "
4502 "may not be C interoperable, even though "
4503 "derived type %qs is BIND(C)",
4504 curr_comp
->name
, derived_sym
->name
,
4505 &(curr_comp
->loc
), derived_sym
->name
);
4506 else if (warn_c_binding_type
)
4507 /* If derived type is param to bind(c) routine, or to one
4508 of the iso_c_binding procs, it must be interoperable, so
4509 all fields must interop too. */
4510 gfc_warning (OPT_Wc_binding_type
,
4511 "Component %qs in derived type %qs at %L "
4512 "may not be C interoperable",
4513 curr_comp
->name
, derived_sym
->name
,
4518 curr_comp
= curr_comp
->next
;
4519 } while (curr_comp
!= NULL
);
4522 /* Make sure we don't have conflicts with the attributes. */
4523 if (derived_sym
->attr
.access
== ACCESS_PRIVATE
)
4525 gfc_error ("Derived type %qs at %L cannot be declared with both "
4526 "PRIVATE and BIND(C) attributes", derived_sym
->name
,
4527 &(derived_sym
->declared_at
));
4531 if (derived_sym
->attr
.sequence
!= 0)
4533 gfc_error ("Derived type %qs at %L cannot have the SEQUENCE "
4534 "attribute because it is BIND(C)", derived_sym
->name
,
4535 &(derived_sym
->declared_at
));
4539 /* Mark the derived type as not being C interoperable if we found an
4540 error. If there were only warnings, proceed with the assumption
4541 it's interoperable. */
4543 derived_sym
->ts
.is_c_interop
= 0;
4549 /* Generate symbols for the named constants c_null_ptr and c_null_funptr. */
4552 gen_special_c_interop_ptr (gfc_symbol
*tmp_sym
, gfc_symtree
*dt_symtree
)
4556 gcc_assert (tmp_sym
&& dt_symtree
&& dt_symtree
->n
.sym
);
4557 dt_symtree
->n
.sym
->attr
.referenced
= 1;
4559 tmp_sym
->attr
.is_c_interop
= 1;
4560 tmp_sym
->attr
.is_bind_c
= 1;
4561 tmp_sym
->ts
.is_c_interop
= 1;
4562 tmp_sym
->ts
.is_iso_c
= 1;
4563 tmp_sym
->ts
.type
= BT_DERIVED
;
4564 tmp_sym
->ts
.f90_type
= BT_VOID
;
4565 tmp_sym
->attr
.flavor
= FL_PARAMETER
;
4566 tmp_sym
->ts
.u
.derived
= dt_symtree
->n
.sym
;
4568 /* Set the c_address field of c_null_ptr and c_null_funptr to
4569 the value of NULL. */
4570 tmp_sym
->value
= gfc_get_expr ();
4571 tmp_sym
->value
->expr_type
= EXPR_STRUCTURE
;
4572 tmp_sym
->value
->ts
.type
= BT_DERIVED
;
4573 tmp_sym
->value
->ts
.f90_type
= BT_VOID
;
4574 tmp_sym
->value
->ts
.u
.derived
= tmp_sym
->ts
.u
.derived
;
4575 gfc_constructor_append_expr (&tmp_sym
->value
->value
.constructor
, NULL
, NULL
);
4576 c
= gfc_constructor_first (tmp_sym
->value
->value
.constructor
);
4577 c
->expr
= gfc_get_int_expr (gfc_index_integer_kind
, NULL
, 0);
4578 c
->expr
->ts
.is_iso_c
= 1;
4584 /* Add a formal argument, gfc_formal_arglist, to the
4585 end of the given list of arguments. Set the reference to the
4586 provided symbol, param_sym, in the argument. */
4589 add_formal_arg (gfc_formal_arglist
**head
,
4590 gfc_formal_arglist
**tail
,
4591 gfc_formal_arglist
*formal_arg
,
4592 gfc_symbol
*param_sym
)
4594 /* Put in list, either as first arg or at the tail (curr arg). */
4596 *head
= *tail
= formal_arg
;
4599 (*tail
)->next
= formal_arg
;
4600 (*tail
) = formal_arg
;
4603 (*tail
)->sym
= param_sym
;
4604 (*tail
)->next
= NULL
;
4610 /* Add a procedure interface to the given symbol (i.e., store a
4611 reference to the list of formal arguments). */
4614 add_proc_interface (gfc_symbol
*sym
, ifsrc source
, gfc_formal_arglist
*formal
)
4617 sym
->formal
= formal
;
4618 sym
->attr
.if_source
= source
;
4622 /* Copy the formal args from an existing symbol, src, into a new
4623 symbol, dest. New formal args are created, and the description of
4624 each arg is set according to the existing ones. This function is
4625 used when creating procedure declaration variables from a procedure
4626 declaration statement (see match_proc_decl()) to create the formal
4627 args based on the args of a given named interface.
4629 When an actual argument list is provided, skip the absent arguments.
4630 To be used together with gfc_se->ignore_optional. */
4633 gfc_copy_formal_args_intr (gfc_symbol
*dest
, gfc_intrinsic_sym
*src
,
4634 gfc_actual_arglist
*actual
)
4636 gfc_formal_arglist
*head
= NULL
;
4637 gfc_formal_arglist
*tail
= NULL
;
4638 gfc_formal_arglist
*formal_arg
= NULL
;
4639 gfc_intrinsic_arg
*curr_arg
= NULL
;
4640 gfc_formal_arglist
*formal_prev
= NULL
;
4641 gfc_actual_arglist
*act_arg
= actual
;
4642 /* Save current namespace so we can change it for formal args. */
4643 gfc_namespace
*parent_ns
= gfc_current_ns
;
4645 /* Create a new namespace, which will be the formal ns (namespace
4646 of the formal args). */
4647 gfc_current_ns
= gfc_get_namespace (parent_ns
, 0);
4648 gfc_current_ns
->proc_name
= dest
;
4650 for (curr_arg
= src
->formal
; curr_arg
; curr_arg
= curr_arg
->next
)
4652 /* Skip absent arguments. */
4655 gcc_assert (act_arg
!= NULL
);
4656 if (act_arg
->expr
== NULL
)
4658 act_arg
= act_arg
->next
;
4661 act_arg
= act_arg
->next
;
4663 formal_arg
= gfc_get_formal_arglist ();
4664 gfc_get_symbol (curr_arg
->name
, gfc_current_ns
, &(formal_arg
->sym
));
4666 /* May need to copy more info for the symbol. */
4667 formal_arg
->sym
->ts
= curr_arg
->ts
;
4668 formal_arg
->sym
->attr
.optional
= curr_arg
->optional
;
4669 formal_arg
->sym
->attr
.value
= curr_arg
->value
;
4670 formal_arg
->sym
->attr
.intent
= curr_arg
->intent
;
4671 formal_arg
->sym
->attr
.flavor
= FL_VARIABLE
;
4672 formal_arg
->sym
->attr
.dummy
= 1;
4674 if (formal_arg
->sym
->ts
.type
== BT_CHARACTER
)
4675 formal_arg
->sym
->ts
.u
.cl
= gfc_new_charlen (gfc_current_ns
, NULL
);
4677 /* If this isn't the first arg, set up the next ptr. For the
4678 last arg built, the formal_arg->next will never get set to
4679 anything other than NULL. */
4680 if (formal_prev
!= NULL
)
4681 formal_prev
->next
= formal_arg
;
4683 formal_arg
->next
= NULL
;
4685 formal_prev
= formal_arg
;
4687 /* Add arg to list of formal args. */
4688 add_formal_arg (&head
, &tail
, formal_arg
, formal_arg
->sym
);
4690 /* Validate changes. */
4691 gfc_commit_symbol (formal_arg
->sym
);
4694 /* Add the interface to the symbol. */
4695 add_proc_interface (dest
, IFSRC_DECL
, head
);
4697 /* Store the formal namespace information. */
4698 if (dest
->formal
!= NULL
)
4699 /* The current ns should be that for the dest proc. */
4700 dest
->formal_ns
= gfc_current_ns
;
4701 /* Restore the current namespace to what it was on entry. */
4702 gfc_current_ns
= parent_ns
;
4707 std_for_isocbinding_symbol (int id
)
4711 #define NAMED_INTCST(a,b,c,d) \
4714 #include "iso-c-binding.def"
4717 #define NAMED_FUNCTION(a,b,c,d) \
4720 #define NAMED_SUBROUTINE(a,b,c,d) \
4723 #include "iso-c-binding.def"
4724 #undef NAMED_FUNCTION
4725 #undef NAMED_SUBROUTINE
4728 return GFC_STD_F2003
;
4732 /* Generate the given set of C interoperable kind objects, or all
4733 interoperable kinds. This function will only be given kind objects
4734 for valid iso_c_binding defined types because this is verified when
4735 the 'use' statement is parsed. If the user gives an 'only' clause,
4736 the specific kinds are looked up; if they don't exist, an error is
4737 reported. If the user does not give an 'only' clause, all
4738 iso_c_binding symbols are generated. If a list of specific kinds
4739 is given, it must have a NULL in the first empty spot to mark the
4740 end of the list. For C_null_(fun)ptr, dt_symtree has to be set and
4741 point to the symtree for c_(fun)ptr. */
4744 generate_isocbinding_symbol (const char *mod_name
, iso_c_binding_symbol s
,
4745 const char *local_name
, gfc_symtree
*dt_symtree
,
4748 const char *const name
= (local_name
&& local_name
[0])
4749 ? local_name
: c_interop_kinds_table
[s
].name
;
4750 gfc_symtree
*tmp_symtree
;
4751 gfc_symbol
*tmp_sym
= NULL
;
4754 if (gfc_notification_std (std_for_isocbinding_symbol (s
)) == ERROR
)
4757 tmp_symtree
= gfc_find_symtree (gfc_current_ns
->sym_root
, name
);
4759 && (!tmp_symtree
|| !tmp_symtree
->n
.sym
4760 || tmp_symtree
->n
.sym
->from_intmod
!= INTMOD_ISO_C_BINDING
4761 || tmp_symtree
->n
.sym
->intmod_sym_id
!= s
))
4764 /* Already exists in this scope so don't re-add it. */
4765 if (tmp_symtree
!= NULL
&& (tmp_sym
= tmp_symtree
->n
.sym
) != NULL
4766 && (!tmp_sym
->attr
.generic
4767 || (tmp_sym
= gfc_find_dt_in_generic (tmp_sym
)) != NULL
)
4768 && tmp_sym
->from_intmod
== INTMOD_ISO_C_BINDING
)
4770 if (tmp_sym
->attr
.flavor
== FL_DERIVED
4771 && !get_iso_c_binding_dt (tmp_sym
->intmod_sym_id
))
4773 gfc_dt_list
*dt_list
;
4774 dt_list
= gfc_get_dt_list ();
4775 dt_list
->derived
= tmp_sym
;
4776 dt_list
->next
= gfc_derived_types
;
4777 gfc_derived_types
= dt_list
;
4783 /* Create the sym tree in the current ns. */
4786 tmp_symtree
= gfc_get_unique_symtree (gfc_current_ns
);
4787 tmp_sym
= gfc_new_symbol (name
, gfc_current_ns
);
4789 /* Add to the list of tentative symbols. */
4790 latest_undo_chgset
->syms
.safe_push (tmp_sym
);
4791 tmp_sym
->old_symbol
= NULL
;
4793 tmp_sym
->gfc_new
= 1;
4795 tmp_symtree
->n
.sym
= tmp_sym
;
4800 gfc_get_sym_tree (name
, gfc_current_ns
, &tmp_symtree
, false);
4801 gcc_assert (tmp_symtree
);
4802 tmp_sym
= tmp_symtree
->n
.sym
;
4805 /* Say what module this symbol belongs to. */
4806 tmp_sym
->module
= gfc_get_string ("%s", mod_name
);
4807 tmp_sym
->from_intmod
= INTMOD_ISO_C_BINDING
;
4808 tmp_sym
->intmod_sym_id
= s
;
4809 tmp_sym
->attr
.is_iso_c
= 1;
4810 tmp_sym
->attr
.use_assoc
= 1;
4812 gcc_assert (dt_symtree
== NULL
|| s
== ISOCBINDING_NULL_FUNPTR
4813 || s
== ISOCBINDING_NULL_PTR
);
4818 #define NAMED_INTCST(a,b,c,d) case a :
4819 #define NAMED_REALCST(a,b,c,d) case a :
4820 #define NAMED_CMPXCST(a,b,c,d) case a :
4821 #define NAMED_LOGCST(a,b,c) case a :
4822 #define NAMED_CHARKNDCST(a,b,c) case a :
4823 #include "iso-c-binding.def"
4825 tmp_sym
->value
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
,
4826 c_interop_kinds_table
[s
].value
);
4828 /* Initialize an integer constant expression node. */
4829 tmp_sym
->attr
.flavor
= FL_PARAMETER
;
4830 tmp_sym
->ts
.type
= BT_INTEGER
;
4831 tmp_sym
->ts
.kind
= gfc_default_integer_kind
;
4833 /* Mark this type as a C interoperable one. */
4834 tmp_sym
->ts
.is_c_interop
= 1;
4835 tmp_sym
->ts
.is_iso_c
= 1;
4836 tmp_sym
->value
->ts
.is_c_interop
= 1;
4837 tmp_sym
->value
->ts
.is_iso_c
= 1;
4838 tmp_sym
->attr
.is_c_interop
= 1;
4840 /* Tell what f90 type this c interop kind is valid. */
4841 tmp_sym
->ts
.f90_type
= c_interop_kinds_table
[s
].f90_type
;
4846 #define NAMED_CHARCST(a,b,c) case a :
4847 #include "iso-c-binding.def"
4849 /* Initialize an integer constant expression node for the
4850 length of the character. */
4851 tmp_sym
->value
= gfc_get_character_expr (gfc_default_character_kind
,
4852 &gfc_current_locus
, NULL
, 1);
4853 tmp_sym
->value
->ts
.is_c_interop
= 1;
4854 tmp_sym
->value
->ts
.is_iso_c
= 1;
4855 tmp_sym
->value
->value
.character
.length
= 1;
4856 tmp_sym
->value
->value
.character
.string
[0]
4857 = (gfc_char_t
) c_interop_kinds_table
[s
].value
;
4858 tmp_sym
->ts
.u
.cl
= gfc_new_charlen (gfc_current_ns
, NULL
);
4859 tmp_sym
->ts
.u
.cl
->length
= gfc_get_int_expr (gfc_charlen_int_kind
,
4862 /* May not need this in both attr and ts, but do need in
4863 attr for writing module file. */
4864 tmp_sym
->attr
.is_c_interop
= 1;
4866 tmp_sym
->attr
.flavor
= FL_PARAMETER
;
4867 tmp_sym
->ts
.type
= BT_CHARACTER
;
4869 /* Need to set it to the C_CHAR kind. */
4870 tmp_sym
->ts
.kind
= gfc_default_character_kind
;
4872 /* Mark this type as a C interoperable one. */
4873 tmp_sym
->ts
.is_c_interop
= 1;
4874 tmp_sym
->ts
.is_iso_c
= 1;
4876 /* Tell what f90 type this c interop kind is valid. */
4877 tmp_sym
->ts
.f90_type
= BT_CHARACTER
;
4881 case ISOCBINDING_PTR
:
4882 case ISOCBINDING_FUNPTR
:
4885 gfc_dt_list
**dt_list_ptr
= NULL
;
4886 gfc_component
*tmp_comp
= NULL
;
4888 /* Generate real derived type. */
4893 const char *hidden_name
;
4894 gfc_interface
*intr
, *head
;
4896 hidden_name
= gfc_dt_upper_string (tmp_sym
->name
);
4897 tmp_symtree
= gfc_find_symtree (gfc_current_ns
->sym_root
,
4899 gcc_assert (tmp_symtree
== NULL
);
4900 gfc_get_sym_tree (hidden_name
, gfc_current_ns
, &tmp_symtree
, false);
4901 dt_sym
= tmp_symtree
->n
.sym
;
4902 dt_sym
->name
= gfc_get_string (s
== ISOCBINDING_PTR
4903 ? "c_ptr" : "c_funptr");
4905 /* Generate an artificial generic function. */
4906 head
= tmp_sym
->generic
;
4907 intr
= gfc_get_interface ();
4909 intr
->where
= gfc_current_locus
;
4911 tmp_sym
->generic
= intr
;
4913 if (!tmp_sym
->attr
.generic
4914 && !gfc_add_generic (&tmp_sym
->attr
, tmp_sym
->name
, NULL
))
4917 if (!tmp_sym
->attr
.function
4918 && !gfc_add_function (&tmp_sym
->attr
, tmp_sym
->name
, NULL
))
4922 /* Say what module this symbol belongs to. */
4923 dt_sym
->module
= gfc_get_string ("%s", mod_name
);
4924 dt_sym
->from_intmod
= INTMOD_ISO_C_BINDING
;
4925 dt_sym
->intmod_sym_id
= s
;
4926 dt_sym
->attr
.use_assoc
= 1;
4928 /* Initialize an integer constant expression node. */
4929 dt_sym
->attr
.flavor
= FL_DERIVED
;
4930 dt_sym
->ts
.is_c_interop
= 1;
4931 dt_sym
->attr
.is_c_interop
= 1;
4932 dt_sym
->attr
.private_comp
= 1;
4933 dt_sym
->component_access
= ACCESS_PRIVATE
;
4934 dt_sym
->ts
.is_iso_c
= 1;
4935 dt_sym
->ts
.type
= BT_DERIVED
;
4936 dt_sym
->ts
.f90_type
= BT_VOID
;
4938 /* A derived type must have the bind attribute to be
4939 interoperable (J3/04-007, Section 15.2.3), even though
4940 the binding label is not used. */
4941 dt_sym
->attr
.is_bind_c
= 1;
4943 dt_sym
->attr
.referenced
= 1;
4944 dt_sym
->ts
.u
.derived
= dt_sym
;
4946 /* Add the symbol created for the derived type to the current ns. */
4947 dt_list_ptr
= &(gfc_derived_types
);
4948 while (*dt_list_ptr
!= NULL
&& (*dt_list_ptr
)->next
!= NULL
)
4949 dt_list_ptr
= &((*dt_list_ptr
)->next
);
4951 /* There is already at least one derived type in the list, so append
4952 the one we're currently building for c_ptr or c_funptr. */
4953 if (*dt_list_ptr
!= NULL
)
4954 dt_list_ptr
= &((*dt_list_ptr
)->next
);
4955 (*dt_list_ptr
) = gfc_get_dt_list ();
4956 (*dt_list_ptr
)->derived
= dt_sym
;
4957 (*dt_list_ptr
)->next
= NULL
;
4959 gfc_add_component (dt_sym
, "c_address", &tmp_comp
);
4960 if (tmp_comp
== NULL
)
4963 tmp_comp
->ts
.type
= BT_INTEGER
;
4965 /* Set this because the module will need to read/write this field. */
4966 tmp_comp
->ts
.f90_type
= BT_INTEGER
;
4968 /* The kinds for c_ptr and c_funptr are the same. */
4969 index
= get_c_kind ("c_ptr", c_interop_kinds_table
);
4970 tmp_comp
->ts
.kind
= c_interop_kinds_table
[index
].value
;
4971 tmp_comp
->attr
.access
= ACCESS_PRIVATE
;
4973 /* Mark the component as C interoperable. */
4974 tmp_comp
->ts
.is_c_interop
= 1;
4979 case ISOCBINDING_NULL_PTR
:
4980 case ISOCBINDING_NULL_FUNPTR
:
4981 gen_special_c_interop_ptr (tmp_sym
, dt_symtree
);
4987 gfc_commit_symbol (tmp_sym
);
4992 /* Check that a symbol is already typed. If strict is not set, an untyped
4993 symbol is acceptable for non-standard-conforming mode. */
4996 gfc_check_symbol_typed (gfc_symbol
* sym
, gfc_namespace
* ns
,
4997 bool strict
, locus where
)
5001 if (gfc_matching_prefix
)
5004 /* Check for the type and try to give it an implicit one. */
5005 if (sym
->ts
.type
== BT_UNKNOWN
5006 && !gfc_set_default_type (sym
, 0, ns
))
5010 gfc_error ("Symbol %qs is used before it is typed at %L",
5015 if (!gfc_notify_std (GFC_STD_GNU
, "Symbol %qs is used before"
5016 " it is typed at %L", sym
->name
, &where
))
5020 /* Everything is ok. */
5025 /* Construct a typebound-procedure structure. Those are stored in a tentative
5026 list and marked `error' until symbols are committed. */
5029 gfc_get_typebound_proc (gfc_typebound_proc
*tb0
)
5031 gfc_typebound_proc
*result
;
5033 result
= XCNEW (gfc_typebound_proc
);
5038 latest_undo_chgset
->tbps
.safe_push (result
);
5044 /* Get the super-type of a given derived type. */
5047 gfc_get_derived_super_type (gfc_symbol
* derived
)
5049 gcc_assert (derived
);
5051 if (derived
->attr
.generic
)
5052 derived
= gfc_find_dt_in_generic (derived
);
5054 if (!derived
->attr
.extension
)
5057 gcc_assert (derived
->components
);
5058 gcc_assert (derived
->components
->ts
.type
== BT_DERIVED
);
5059 gcc_assert (derived
->components
->ts
.u
.derived
);
5061 if (derived
->components
->ts
.u
.derived
->attr
.generic
)
5062 return gfc_find_dt_in_generic (derived
->components
->ts
.u
.derived
);
5064 return derived
->components
->ts
.u
.derived
;
5068 /* Get the ultimate super-type of a given derived type. */
5071 gfc_get_ultimate_derived_super_type (gfc_symbol
* derived
)
5073 if (!derived
->attr
.extension
)
5076 derived
= gfc_get_derived_super_type (derived
);
5078 if (derived
->attr
.extension
)
5079 return gfc_get_ultimate_derived_super_type (derived
);
5085 /* Check if a derived type t2 is an extension of (or equal to) a type t1. */
5088 gfc_type_is_extension_of (gfc_symbol
*t1
, gfc_symbol
*t2
)
5090 while (!gfc_compare_derived_types (t1
, t2
) && t2
->attr
.extension
)
5091 t2
= gfc_get_derived_super_type (t2
);
5092 return gfc_compare_derived_types (t1
, t2
);
5096 /* Check if two typespecs are type compatible (F03:5.1.1.2):
5097 If ts1 is nonpolymorphic, ts2 must be the same type.
5098 If ts1 is polymorphic (CLASS), ts2 must be an extension of ts1. */
5101 gfc_type_compatible (gfc_typespec
*ts1
, gfc_typespec
*ts2
)
5103 bool is_class1
= (ts1
->type
== BT_CLASS
);
5104 bool is_class2
= (ts2
->type
== BT_CLASS
);
5105 bool is_derived1
= (ts1
->type
== BT_DERIVED
);
5106 bool is_derived2
= (ts2
->type
== BT_DERIVED
);
5107 bool is_union1
= (ts1
->type
== BT_UNION
);
5108 bool is_union2
= (ts2
->type
== BT_UNION
);
5111 && ts1
->u
.derived
->components
5112 && ((ts1
->u
.derived
->attr
.is_class
5113 && ts1
->u
.derived
->components
->ts
.u
.derived
->attr
5114 .unlimited_polymorphic
)
5115 || ts1
->u
.derived
->attr
.unlimited_polymorphic
))
5118 if (!is_derived1
&& !is_derived2
&& !is_class1
&& !is_class2
5119 && !is_union1
&& !is_union2
)
5120 return (ts1
->type
== ts2
->type
);
5122 if ((is_derived1
&& is_derived2
) || (is_union1
&& is_union2
))
5123 return gfc_compare_derived_types (ts1
->u
.derived
, ts2
->u
.derived
);
5125 if (is_derived1
&& is_class2
)
5126 return gfc_compare_derived_types (ts1
->u
.derived
,
5127 ts2
->u
.derived
->attr
.is_class
?
5128 ts2
->u
.derived
->components
->ts
.u
.derived
5130 if (is_class1
&& is_derived2
)
5131 return gfc_type_is_extension_of (ts1
->u
.derived
->attr
.is_class
?
5132 ts1
->u
.derived
->components
->ts
.u
.derived
5135 else if (is_class1
&& is_class2
)
5136 return gfc_type_is_extension_of (ts1
->u
.derived
->attr
.is_class
?
5137 ts1
->u
.derived
->components
->ts
.u
.derived
5139 ts2
->u
.derived
->attr
.is_class
?
5140 ts2
->u
.derived
->components
->ts
.u
.derived
5147 /* Find the parent-namespace of the current function. If we're inside
5148 BLOCK constructs, it may not be the current one. */
5151 gfc_find_proc_namespace (gfc_namespace
* ns
)
5153 while (ns
->construct_entities
)
5163 /* Check if an associate-variable should be translated as an `implicit' pointer
5164 internally (if it is associated to a variable and not an array with
5168 gfc_is_associate_pointer (gfc_symbol
* sym
)
5173 if (sym
->ts
.type
== BT_CLASS
)
5176 if (sym
->ts
.type
== BT_CHARACTER
5178 && sym
->assoc
->target
5179 && sym
->assoc
->target
->expr_type
== EXPR_FUNCTION
)
5182 if (!sym
->assoc
->variable
)
5185 if (sym
->attr
.dimension
&& sym
->as
->type
!= AS_EXPLICIT
)
5193 gfc_find_dt_in_generic (gfc_symbol
*sym
)
5195 gfc_interface
*intr
= NULL
;
5197 if (!sym
|| gfc_fl_struct (sym
->attr
.flavor
))
5200 if (sym
->attr
.generic
)
5201 for (intr
= sym
->generic
; intr
; intr
= intr
->next
)
5202 if (gfc_fl_struct (intr
->sym
->attr
.flavor
))
5204 return intr
? intr
->sym
: NULL
;
5208 /* Get the dummy arguments from a procedure symbol. If it has been declared
5209 via a PROCEDURE statement with a named interface, ts.interface will be set
5210 and the arguments need to be taken from there. */
5212 gfc_formal_arglist
*
5213 gfc_sym_get_dummy_args (gfc_symbol
*sym
)
5215 gfc_formal_arglist
*dummies
;
5217 dummies
= sym
->formal
;
5218 if (dummies
== NULL
&& sym
->ts
.interface
!= NULL
)
5219 dummies
= sym
->ts
.interface
->formal
;