1 /* Maintain binary trees of symbols.
2 Copyright (C) 2000-2017 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
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 /* Given a pointer to a symbol, set its type according to the first
249 letter of its name. Fails if the letter in question has no default
253 gfc_set_default_type (gfc_symbol
*sym
, int error_flag
, gfc_namespace
*ns
)
257 if (sym
->ts
.type
!= BT_UNKNOWN
)
258 gfc_internal_error ("gfc_set_default_type(): symbol already has a type");
260 ts
= gfc_get_default_type (sym
->name
, ns
);
262 if (ts
->type
== BT_UNKNOWN
)
264 if (error_flag
&& !sym
->attr
.untyped
)
266 gfc_error ("Symbol %qs at %L has no IMPLICIT type",
267 sym
->name
, &sym
->declared_at
);
268 sym
->attr
.untyped
= 1; /* Ensure we only give an error once. */
275 sym
->attr
.implicit_type
= 1;
277 if (ts
->type
== BT_CHARACTER
&& ts
->u
.cl
)
278 sym
->ts
.u
.cl
= gfc_new_charlen (sym
->ns
, ts
->u
.cl
);
279 else if (ts
->type
== BT_CLASS
280 && !gfc_build_class_symbol (&sym
->ts
, &sym
->attr
, &sym
->as
))
283 if (sym
->attr
.is_bind_c
== 1 && warn_c_binding_type
)
285 /* BIND(C) variables should not be implicitly declared. */
286 gfc_warning_now (OPT_Wc_binding_type
, "Implicitly declared BIND(C) "
287 "variable %qs at %L may not be C interoperable",
288 sym
->name
, &sym
->declared_at
);
289 sym
->ts
.f90_type
= sym
->ts
.type
;
292 if (sym
->attr
.dummy
!= 0)
294 if (sym
->ns
->proc_name
!= NULL
295 && (sym
->ns
->proc_name
->attr
.subroutine
!= 0
296 || sym
->ns
->proc_name
->attr
.function
!= 0)
297 && sym
->ns
->proc_name
->attr
.is_bind_c
!= 0
298 && warn_c_binding_type
)
300 /* Dummy args to a BIND(C) routine may not be interoperable if
301 they are implicitly typed. */
302 gfc_warning_now (OPT_Wc_binding_type
, "Implicitly declared variable "
303 "%qs at %L may not be C interoperable but it is a "
304 "dummy argument to the BIND(C) procedure %qs at %L",
305 sym
->name
, &(sym
->declared_at
),
306 sym
->ns
->proc_name
->name
,
307 &(sym
->ns
->proc_name
->declared_at
));
308 sym
->ts
.f90_type
= sym
->ts
.type
;
316 /* This function is called from parse.c(parse_progunit) to check the
317 type of the function is not implicitly typed in the host namespace
318 and to implicitly type the function result, if necessary. */
321 gfc_check_function_type (gfc_namespace
*ns
)
323 gfc_symbol
*proc
= ns
->proc_name
;
325 if (!proc
->attr
.contained
|| proc
->result
->attr
.implicit_type
)
328 if (proc
->result
->ts
.type
== BT_UNKNOWN
&& proc
->result
->ts
.interface
== NULL
)
330 if (gfc_set_default_type (proc
->result
, 0, gfc_current_ns
))
332 if (proc
->result
!= proc
)
334 proc
->ts
= proc
->result
->ts
;
335 proc
->as
= gfc_copy_array_spec (proc
->result
->as
);
336 proc
->attr
.dimension
= proc
->result
->attr
.dimension
;
337 proc
->attr
.pointer
= proc
->result
->attr
.pointer
;
338 proc
->attr
.allocatable
= proc
->result
->attr
.allocatable
;
341 else if (!proc
->result
->attr
.proc_pointer
)
343 gfc_error ("Function result %qs at %L has no IMPLICIT type",
344 proc
->result
->name
, &proc
->result
->declared_at
);
345 proc
->result
->attr
.untyped
= 1;
351 /******************** Symbol attribute stuff *********************/
353 /* This is a generic conflict-checker. We do this to avoid having a
354 single conflict in two places. */
356 #define conf(a, b) if (attr->a && attr->b) { a1 = a; a2 = b; goto conflict; }
357 #define conf2(a) if (attr->a) { a2 = a; goto conflict; }
358 #define conf_std(a, b, std) if (attr->a && attr->b)\
367 check_conflict (symbol_attribute
*attr
, const char *name
, locus
*where
)
369 static const char *dummy
= "DUMMY", *save
= "SAVE", *pointer
= "POINTER",
370 *target
= "TARGET", *external
= "EXTERNAL", *intent
= "INTENT",
371 *intent_in
= "INTENT(IN)", *intrinsic
= "INTRINSIC",
372 *intent_out
= "INTENT(OUT)", *intent_inout
= "INTENT(INOUT)",
373 *allocatable
= "ALLOCATABLE", *elemental
= "ELEMENTAL",
374 *privat
= "PRIVATE", *recursive
= "RECURSIVE",
375 *in_common
= "COMMON", *result
= "RESULT", *in_namelist
= "NAMELIST",
376 *publik
= "PUBLIC", *optional
= "OPTIONAL", *entry
= "ENTRY",
377 *function
= "FUNCTION", *subroutine
= "SUBROUTINE",
378 *dimension
= "DIMENSION", *in_equivalence
= "EQUIVALENCE",
379 *use_assoc
= "USE ASSOCIATED", *cray_pointer
= "CRAY POINTER",
380 *cray_pointee
= "CRAY POINTEE", *data
= "DATA", *value
= "VALUE",
381 *volatile_
= "VOLATILE", *is_protected
= "PROTECTED",
382 *is_bind_c
= "BIND(C)", *procedure
= "PROCEDURE",
383 *proc_pointer
= "PROCEDURE POINTER", *abstract
= "ABSTRACT",
384 *asynchronous
= "ASYNCHRONOUS", *codimension
= "CODIMENSION",
385 *contiguous
= "CONTIGUOUS", *generic
= "GENERIC", *automatic
= "AUTOMATIC";
386 static const char *threadprivate
= "THREADPRIVATE";
387 static const char *omp_declare_target
= "OMP DECLARE TARGET";
388 static const char *omp_declare_target_link
= "OMP DECLARE TARGET LINK";
389 static const char *oacc_declare_copyin
= "OACC DECLARE COPYIN";
390 static const char *oacc_declare_create
= "OACC DECLARE CREATE";
391 static const char *oacc_declare_deviceptr
= "OACC DECLARE DEVICEPTR";
392 static const char *oacc_declare_device_resident
=
393 "OACC DECLARE DEVICE_RESIDENT";
399 where
= &gfc_current_locus
;
401 if (attr
->pointer
&& attr
->intent
!= INTENT_UNKNOWN
)
405 standard
= GFC_STD_F2003
;
409 if (attr
->in_namelist
&& (attr
->allocatable
|| attr
->pointer
))
412 a2
= attr
->allocatable
? allocatable
: pointer
;
413 standard
= GFC_STD_F2003
;
417 /* Check for attributes not allowed in a BLOCK DATA. */
418 if (gfc_current_state () == COMP_BLOCK_DATA
)
422 if (attr
->in_namelist
)
424 if (attr
->allocatable
)
430 if (attr
->access
== ACCESS_PRIVATE
)
432 if (attr
->access
== ACCESS_PUBLIC
)
434 if (attr
->intent
!= INTENT_UNKNOWN
)
440 ("%s attribute not allowed in BLOCK DATA program unit at %L",
446 if (attr
->save
== SAVE_EXPLICIT
)
449 conf (in_common
, save
);
451 conf (automatic
, save
);
453 switch (attr
->flavor
)
461 a1
= gfc_code2string (flavors
, attr
->flavor
);
465 gfc_error ("Namelist group name at %L cannot have the "
466 "SAVE attribute", where
);
469 /* Conflicts between SAVE and PROCEDURE will be checked at
470 resolution stage, see "resolve_fl_procedure". */
477 /* The copying of procedure dummy arguments for module procedures in
478 a submodule occur whilst the current state is COMP_CONTAINS. It
479 is necessary, therefore, to let this through. */
481 && (attr
->function
|| attr
->subroutine
)
482 && gfc_current_state () == COMP_CONTAINS
483 && !(gfc_new_block
&& gfc_new_block
->abr_modproc_decl
))
484 gfc_error_now ("internal procedure %qs at %L conflicts with "
485 "DUMMY argument", name
, where
);
488 conf (dummy
, intrinsic
);
489 conf (dummy
, threadprivate
);
490 conf (dummy
, omp_declare_target
);
491 conf (dummy
, omp_declare_target_link
);
492 conf (pointer
, target
);
493 conf (pointer
, intrinsic
);
494 conf (pointer
, elemental
);
495 conf (pointer
, codimension
);
496 conf (allocatable
, elemental
);
498 conf (in_common
, automatic
);
499 conf (in_equivalence
, automatic
);
500 conf (result
, automatic
);
501 conf (use_assoc
, automatic
);
502 conf (dummy
, automatic
);
504 conf (target
, external
);
505 conf (target
, intrinsic
);
507 if (!attr
->if_source
)
508 conf (external
, dimension
); /* See Fortran 95's R504. */
510 conf (external
, intrinsic
);
511 conf (entry
, intrinsic
);
513 if ((attr
->if_source
== IFSRC_DECL
&& !attr
->procedure
) || attr
->contained
)
514 conf (external
, subroutine
);
516 if (attr
->proc_pointer
&& !gfc_notify_std (GFC_STD_F2003
,
517 "Procedure pointer at %C"))
520 conf (allocatable
, pointer
);
521 conf_std (allocatable
, dummy
, GFC_STD_F2003
);
522 conf_std (allocatable
, function
, GFC_STD_F2003
);
523 conf_std (allocatable
, result
, GFC_STD_F2003
);
524 conf (elemental
, recursive
);
526 conf (in_common
, dummy
);
527 conf (in_common
, allocatable
);
528 conf (in_common
, codimension
);
529 conf (in_common
, result
);
531 conf (in_equivalence
, use_assoc
);
532 conf (in_equivalence
, codimension
);
533 conf (in_equivalence
, dummy
);
534 conf (in_equivalence
, target
);
535 conf (in_equivalence
, pointer
);
536 conf (in_equivalence
, function
);
537 conf (in_equivalence
, result
);
538 conf (in_equivalence
, entry
);
539 conf (in_equivalence
, allocatable
);
540 conf (in_equivalence
, threadprivate
);
541 conf (in_equivalence
, omp_declare_target
);
542 conf (in_equivalence
, omp_declare_target_link
);
543 conf (in_equivalence
, oacc_declare_create
);
544 conf (in_equivalence
, oacc_declare_copyin
);
545 conf (in_equivalence
, oacc_declare_deviceptr
);
546 conf (in_equivalence
, oacc_declare_device_resident
);
547 conf (in_equivalence
, is_bind_c
);
549 conf (dummy
, result
);
550 conf (entry
, result
);
551 conf (generic
, result
);
552 conf (generic
, omp_declare_target
);
553 conf (generic
, omp_declare_target_link
);
555 conf (function
, subroutine
);
557 if (!function
&& !subroutine
)
558 conf (is_bind_c
, dummy
);
560 conf (is_bind_c
, cray_pointer
);
561 conf (is_bind_c
, cray_pointee
);
562 conf (is_bind_c
, codimension
);
563 conf (is_bind_c
, allocatable
);
564 conf (is_bind_c
, elemental
);
566 /* Need to also get volatile attr, according to 5.1 of F2003 draft.
567 Parameter conflict caught below. Also, value cannot be specified
568 for a dummy procedure. */
570 /* Cray pointer/pointee conflicts. */
571 conf (cray_pointer
, cray_pointee
);
572 conf (cray_pointer
, dimension
);
573 conf (cray_pointer
, codimension
);
574 conf (cray_pointer
, contiguous
);
575 conf (cray_pointer
, pointer
);
576 conf (cray_pointer
, target
);
577 conf (cray_pointer
, allocatable
);
578 conf (cray_pointer
, external
);
579 conf (cray_pointer
, intrinsic
);
580 conf (cray_pointer
, in_namelist
);
581 conf (cray_pointer
, function
);
582 conf (cray_pointer
, subroutine
);
583 conf (cray_pointer
, entry
);
585 conf (cray_pointee
, allocatable
);
586 conf (cray_pointee
, contiguous
);
587 conf (cray_pointee
, codimension
);
588 conf (cray_pointee
, intent
);
589 conf (cray_pointee
, optional
);
590 conf (cray_pointee
, dummy
);
591 conf (cray_pointee
, target
);
592 conf (cray_pointee
, intrinsic
);
593 conf (cray_pointee
, pointer
);
594 conf (cray_pointee
, entry
);
595 conf (cray_pointee
, in_common
);
596 conf (cray_pointee
, in_equivalence
);
597 conf (cray_pointee
, threadprivate
);
598 conf (cray_pointee
, omp_declare_target
);
599 conf (cray_pointee
, omp_declare_target_link
);
600 conf (cray_pointee
, oacc_declare_create
);
601 conf (cray_pointee
, oacc_declare_copyin
);
602 conf (cray_pointee
, oacc_declare_deviceptr
);
603 conf (cray_pointee
, oacc_declare_device_resident
);
606 conf (data
, function
);
608 conf (data
, allocatable
);
610 conf (value
, pointer
)
611 conf (value
, allocatable
)
612 conf (value
, subroutine
)
613 conf (value
, function
)
614 conf (value
, volatile_
)
615 conf (value
, dimension
)
616 conf (value
, codimension
)
617 conf (value
, external
)
619 conf (codimension
, result
)
622 && (attr
->intent
== INTENT_OUT
|| attr
->intent
== INTENT_INOUT
))
625 a2
= attr
->intent
== INTENT_OUT
? intent_out
: intent_inout
;
629 conf (is_protected
, intrinsic
)
630 conf (is_protected
, in_common
)
632 conf (asynchronous
, intrinsic
)
633 conf (asynchronous
, external
)
635 conf (volatile_
, intrinsic
)
636 conf (volatile_
, external
)
638 if (attr
->volatile_
&& attr
->intent
== INTENT_IN
)
645 conf (procedure
, allocatable
)
646 conf (procedure
, dimension
)
647 conf (procedure
, codimension
)
648 conf (procedure
, intrinsic
)
649 conf (procedure
, target
)
650 conf (procedure
, value
)
651 conf (procedure
, volatile_
)
652 conf (procedure
, asynchronous
)
653 conf (procedure
, entry
)
655 conf (proc_pointer
, abstract
)
656 conf (proc_pointer
, omp_declare_target
)
657 conf (proc_pointer
, omp_declare_target_link
)
659 conf (entry
, omp_declare_target
)
660 conf (entry
, omp_declare_target_link
)
661 conf (entry
, oacc_declare_create
)
662 conf (entry
, oacc_declare_copyin
)
663 conf (entry
, oacc_declare_deviceptr
)
664 conf (entry
, oacc_declare_device_resident
)
666 a1
= gfc_code2string (flavors
, attr
->flavor
);
668 if (attr
->in_namelist
669 && attr
->flavor
!= FL_VARIABLE
670 && attr
->flavor
!= FL_PROCEDURE
671 && attr
->flavor
!= FL_UNKNOWN
)
677 switch (attr
->flavor
)
687 conf2 (asynchronous
);
690 conf2 (is_protected
);
700 conf2 (threadprivate
);
701 conf2 (omp_declare_target
);
702 conf2 (omp_declare_target_link
);
703 conf2 (oacc_declare_create
);
704 conf2 (oacc_declare_copyin
);
705 conf2 (oacc_declare_deviceptr
);
706 conf2 (oacc_declare_device_resident
);
708 if (attr
->access
== ACCESS_PUBLIC
|| attr
->access
== ACCESS_PRIVATE
)
710 a2
= attr
->access
== ACCESS_PUBLIC
? publik
: privat
;
711 gfc_error ("%s attribute applied to %s %s at %L", a2
, a1
,
718 gfc_error_now ("BIND(C) applied to %s %s at %L", a1
, name
, where
);
732 /* Conflicts with INTENT, SAVE and RESULT will be checked
733 at resolution stage, see "resolve_fl_procedure". */
735 if (attr
->subroutine
)
741 conf2 (asynchronous
);
746 if (!attr
->proc_pointer
)
747 conf2 (threadprivate
);
750 if (!attr
->proc_pointer
)
753 conf2 (omp_declare_target_link
);
757 case PROC_ST_FUNCTION
:
768 conf2 (threadprivate
);
788 conf2 (threadprivate
);
790 conf2 (omp_declare_target
);
791 conf2 (omp_declare_target_link
);
792 conf2 (oacc_declare_create
);
793 conf2 (oacc_declare_copyin
);
794 conf2 (oacc_declare_deviceptr
);
795 conf2 (oacc_declare_device_resident
);
797 if (attr
->intent
!= INTENT_UNKNOWN
)
814 conf2 (is_protected
);
820 conf2 (asynchronous
);
821 conf2 (threadprivate
);
837 gfc_error ("%s attribute conflicts with %s attribute at %L",
840 gfc_error ("%s attribute conflicts with %s attribute in %qs at %L",
841 a1
, a2
, name
, where
);
848 return gfc_notify_std (standard
, "%s attribute "
849 "with %s attribute at %L", a1
, a2
,
854 return gfc_notify_std (standard
, "%s attribute "
855 "with %s attribute in %qs at %L",
856 a1
, a2
, name
, where
);
865 /* Mark a symbol as referenced. */
868 gfc_set_sym_referenced (gfc_symbol
*sym
)
871 if (sym
->attr
.referenced
)
874 sym
->attr
.referenced
= 1;
876 /* Remember which order dummy variables are accessed in. */
878 sym
->dummy_order
= next_dummy_order
++;
882 /* Common subroutine called by attribute changing subroutines in order
883 to prevent them from changing a symbol that has been
884 use-associated. Returns zero if it is OK to change the symbol,
888 check_used (symbol_attribute
*attr
, const char *name
, locus
*where
)
891 if (attr
->use_assoc
== 0)
895 where
= &gfc_current_locus
;
898 gfc_error ("Cannot change attributes of USE-associated symbol at %L",
901 gfc_error ("Cannot change attributes of USE-associated symbol %s at %L",
908 /* Generate an error because of a duplicate attribute. */
911 duplicate_attr (const char *attr
, locus
*where
)
915 where
= &gfc_current_locus
;
917 gfc_error ("Duplicate %s attribute specified at %L", attr
, where
);
922 gfc_add_ext_attribute (symbol_attribute
*attr
, ext_attr_id_t ext_attr
,
923 locus
*where ATTRIBUTE_UNUSED
)
925 attr
->ext_attr
|= 1 << ext_attr
;
930 /* Called from decl.c (attr_decl1) to check attributes, when declared
934 gfc_add_attribute (symbol_attribute
*attr
, locus
*where
)
936 if (check_used (attr
, NULL
, where
))
939 return check_conflict (attr
, NULL
, where
);
944 gfc_add_allocatable (symbol_attribute
*attr
, locus
*where
)
947 if (check_used (attr
, NULL
, where
))
950 if (attr
->allocatable
)
952 duplicate_attr ("ALLOCATABLE", where
);
956 if (attr
->flavor
== FL_PROCEDURE
&& attr
->if_source
== IFSRC_IFBODY
957 && !gfc_find_state (COMP_INTERFACE
))
959 gfc_error ("ALLOCATABLE specified outside of INTERFACE body at %L",
964 attr
->allocatable
= 1;
965 return check_conflict (attr
, NULL
, where
);
970 gfc_add_automatic (symbol_attribute
*attr
, const char *name
, locus
*where
)
972 if (check_used (attr
, name
, where
))
975 if (attr
->automatic
&& !gfc_notify_std (GFC_STD_LEGACY
,
976 "Duplicate AUTOMATIC attribute specified at %L", where
))
980 return check_conflict (attr
, name
, where
);
985 gfc_add_codimension (symbol_attribute
*attr
, const char *name
, locus
*where
)
988 if (check_used (attr
, name
, where
))
991 if (attr
->codimension
)
993 duplicate_attr ("CODIMENSION", where
);
997 if (attr
->flavor
== FL_PROCEDURE
&& attr
->if_source
== IFSRC_IFBODY
998 && !gfc_find_state (COMP_INTERFACE
))
1000 gfc_error ("CODIMENSION specified for %qs outside its INTERFACE body "
1001 "at %L", name
, where
);
1005 attr
->codimension
= 1;
1006 return check_conflict (attr
, name
, where
);
1011 gfc_add_dimension (symbol_attribute
*attr
, const char *name
, locus
*where
)
1014 if (check_used (attr
, name
, where
))
1017 if (attr
->dimension
)
1019 duplicate_attr ("DIMENSION", where
);
1023 if (attr
->flavor
== FL_PROCEDURE
&& attr
->if_source
== IFSRC_IFBODY
1024 && !gfc_find_state (COMP_INTERFACE
))
1026 gfc_error ("DIMENSION specified for %qs outside its INTERFACE body "
1027 "at %L", name
, where
);
1031 attr
->dimension
= 1;
1032 return check_conflict (attr
, name
, where
);
1037 gfc_add_contiguous (symbol_attribute
*attr
, const char *name
, locus
*where
)
1040 if (check_used (attr
, name
, where
))
1043 attr
->contiguous
= 1;
1044 return check_conflict (attr
, name
, where
);
1049 gfc_add_external (symbol_attribute
*attr
, locus
*where
)
1052 if (check_used (attr
, NULL
, where
))
1057 duplicate_attr ("EXTERNAL", where
);
1061 if (attr
->pointer
&& attr
->if_source
!= IFSRC_IFBODY
)
1064 attr
->proc_pointer
= 1;
1069 return check_conflict (attr
, NULL
, where
);
1074 gfc_add_intrinsic (symbol_attribute
*attr
, locus
*where
)
1077 if (check_used (attr
, NULL
, where
))
1080 if (attr
->intrinsic
)
1082 duplicate_attr ("INTRINSIC", where
);
1086 attr
->intrinsic
= 1;
1088 return check_conflict (attr
, NULL
, where
);
1093 gfc_add_optional (symbol_attribute
*attr
, locus
*where
)
1096 if (check_used (attr
, NULL
, where
))
1101 duplicate_attr ("OPTIONAL", where
);
1106 return check_conflict (attr
, NULL
, where
);
1111 gfc_add_pointer (symbol_attribute
*attr
, locus
*where
)
1114 if (check_used (attr
, NULL
, where
))
1117 if (attr
->pointer
&& !(attr
->if_source
== IFSRC_IFBODY
1118 && !gfc_find_state (COMP_INTERFACE
)))
1120 duplicate_attr ("POINTER", where
);
1124 if (attr
->procedure
|| (attr
->external
&& attr
->if_source
!= IFSRC_IFBODY
)
1125 || (attr
->if_source
== IFSRC_IFBODY
1126 && !gfc_find_state (COMP_INTERFACE
)))
1127 attr
->proc_pointer
= 1;
1131 return check_conflict (attr
, NULL
, where
);
1136 gfc_add_cray_pointer (symbol_attribute
*attr
, locus
*where
)
1139 if (check_used (attr
, NULL
, where
))
1142 attr
->cray_pointer
= 1;
1143 return check_conflict (attr
, NULL
, where
);
1148 gfc_add_cray_pointee (symbol_attribute
*attr
, locus
*where
)
1151 if (check_used (attr
, NULL
, where
))
1154 if (attr
->cray_pointee
)
1156 gfc_error ("Cray Pointee at %L appears in multiple pointer()"
1157 " statements", where
);
1161 attr
->cray_pointee
= 1;
1162 return check_conflict (attr
, NULL
, where
);
1167 gfc_add_protected (symbol_attribute
*attr
, const char *name
, locus
*where
)
1169 if (check_used (attr
, name
, where
))
1172 if (attr
->is_protected
)
1174 if (!gfc_notify_std (GFC_STD_LEGACY
,
1175 "Duplicate PROTECTED attribute specified at %L",
1180 attr
->is_protected
= 1;
1181 return check_conflict (attr
, name
, where
);
1186 gfc_add_result (symbol_attribute
*attr
, const char *name
, locus
*where
)
1189 if (check_used (attr
, name
, where
))
1193 return check_conflict (attr
, name
, where
);
1198 gfc_add_save (symbol_attribute
*attr
, save_state s
, const char *name
,
1202 if (check_used (attr
, name
, where
))
1205 if (s
== SAVE_EXPLICIT
&& gfc_pure (NULL
))
1208 ("SAVE attribute at %L cannot be specified in a PURE procedure",
1213 if (s
== SAVE_EXPLICIT
)
1214 gfc_unset_implicit_pure (NULL
);
1216 if (s
== SAVE_EXPLICIT
&& attr
->save
== SAVE_EXPLICIT
)
1218 if (!gfc_notify_std (GFC_STD_LEGACY
,
1219 "Duplicate SAVE attribute specified at %L",
1225 return check_conflict (attr
, name
, where
);
1230 gfc_add_value (symbol_attribute
*attr
, const char *name
, locus
*where
)
1233 if (check_used (attr
, name
, where
))
1238 if (!gfc_notify_std (GFC_STD_LEGACY
,
1239 "Duplicate VALUE attribute specified at %L",
1245 return check_conflict (attr
, name
, where
);
1250 gfc_add_volatile (symbol_attribute
*attr
, const char *name
, locus
*where
)
1252 /* No check_used needed as 11.2.1 of the F2003 standard allows
1253 that the local identifier made accessible by a use statement can be
1254 given a VOLATILE attribute - unless it is a coarray (F2008, C560). */
1256 if (attr
->volatile_
&& attr
->volatile_ns
== gfc_current_ns
)
1257 if (!gfc_notify_std (GFC_STD_LEGACY
,
1258 "Duplicate VOLATILE attribute specified at %L",
1262 attr
->volatile_
= 1;
1263 attr
->volatile_ns
= gfc_current_ns
;
1264 return check_conflict (attr
, name
, where
);
1269 gfc_add_asynchronous (symbol_attribute
*attr
, const char *name
, locus
*where
)
1271 /* No check_used needed as 11.2.1 of the F2003 standard allows
1272 that the local identifier made accessible by a use statement can be
1273 given a ASYNCHRONOUS attribute. */
1275 if (attr
->asynchronous
&& attr
->asynchronous_ns
== gfc_current_ns
)
1276 if (!gfc_notify_std (GFC_STD_LEGACY
,
1277 "Duplicate ASYNCHRONOUS attribute specified at %L",
1281 attr
->asynchronous
= 1;
1282 attr
->asynchronous_ns
= gfc_current_ns
;
1283 return check_conflict (attr
, name
, where
);
1288 gfc_add_threadprivate (symbol_attribute
*attr
, const char *name
, locus
*where
)
1291 if (check_used (attr
, name
, where
))
1294 if (attr
->threadprivate
)
1296 duplicate_attr ("THREADPRIVATE", where
);
1300 attr
->threadprivate
= 1;
1301 return check_conflict (attr
, name
, where
);
1306 gfc_add_omp_declare_target (symbol_attribute
*attr
, const char *name
,
1310 if (check_used (attr
, name
, where
))
1313 if (attr
->omp_declare_target
)
1316 attr
->omp_declare_target
= 1;
1317 return check_conflict (attr
, name
, where
);
1322 gfc_add_omp_declare_target_link (symbol_attribute
*attr
, const char *name
,
1326 if (check_used (attr
, name
, where
))
1329 if (attr
->omp_declare_target_link
)
1332 attr
->omp_declare_target_link
= 1;
1333 return check_conflict (attr
, name
, where
);
1338 gfc_add_oacc_declare_create (symbol_attribute
*attr
, const char *name
,
1341 if (check_used (attr
, name
, where
))
1344 if (attr
->oacc_declare_create
)
1347 attr
->oacc_declare_create
= 1;
1348 return check_conflict (attr
, name
, where
);
1353 gfc_add_oacc_declare_copyin (symbol_attribute
*attr
, const char *name
,
1356 if (check_used (attr
, name
, where
))
1359 if (attr
->oacc_declare_copyin
)
1362 attr
->oacc_declare_copyin
= 1;
1363 return check_conflict (attr
, name
, where
);
1368 gfc_add_oacc_declare_deviceptr (symbol_attribute
*attr
, const char *name
,
1371 if (check_used (attr
, name
, where
))
1374 if (attr
->oacc_declare_deviceptr
)
1377 attr
->oacc_declare_deviceptr
= 1;
1378 return check_conflict (attr
, name
, where
);
1383 gfc_add_oacc_declare_device_resident (symbol_attribute
*attr
, const char *name
,
1386 if (check_used (attr
, name
, where
))
1389 if (attr
->oacc_declare_device_resident
)
1392 attr
->oacc_declare_device_resident
= 1;
1393 return check_conflict (attr
, name
, where
);
1398 gfc_add_target (symbol_attribute
*attr
, locus
*where
)
1401 if (check_used (attr
, NULL
, where
))
1406 duplicate_attr ("TARGET", where
);
1411 return check_conflict (attr
, NULL
, where
);
1416 gfc_add_dummy (symbol_attribute
*attr
, const char *name
, locus
*where
)
1419 if (check_used (attr
, name
, where
))
1422 /* Duplicate dummy arguments are allowed due to ENTRY statements. */
1424 return check_conflict (attr
, name
, where
);
1429 gfc_add_in_common (symbol_attribute
*attr
, const char *name
, locus
*where
)
1432 if (check_used (attr
, name
, where
))
1435 /* Duplicate attribute already checked for. */
1436 attr
->in_common
= 1;
1437 return check_conflict (attr
, name
, where
);
1442 gfc_add_in_equivalence (symbol_attribute
*attr
, const char *name
, locus
*where
)
1445 /* Duplicate attribute already checked for. */
1446 attr
->in_equivalence
= 1;
1447 if (!check_conflict (attr
, name
, where
))
1450 if (attr
->flavor
== FL_VARIABLE
)
1453 return gfc_add_flavor (attr
, FL_VARIABLE
, name
, where
);
1458 gfc_add_data (symbol_attribute
*attr
, const char *name
, locus
*where
)
1461 if (check_used (attr
, name
, where
))
1465 return check_conflict (attr
, name
, where
);
1470 gfc_add_in_namelist (symbol_attribute
*attr
, const char *name
, locus
*where
)
1473 attr
->in_namelist
= 1;
1474 return check_conflict (attr
, name
, where
);
1479 gfc_add_sequence (symbol_attribute
*attr
, const char *name
, locus
*where
)
1482 if (check_used (attr
, name
, where
))
1486 return check_conflict (attr
, name
, where
);
1491 gfc_add_elemental (symbol_attribute
*attr
, locus
*where
)
1494 if (check_used (attr
, NULL
, where
))
1497 if (attr
->elemental
)
1499 duplicate_attr ("ELEMENTAL", where
);
1503 attr
->elemental
= 1;
1504 return check_conflict (attr
, NULL
, where
);
1509 gfc_add_pure (symbol_attribute
*attr
, locus
*where
)
1512 if (check_used (attr
, NULL
, where
))
1517 duplicate_attr ("PURE", where
);
1522 return check_conflict (attr
, NULL
, where
);
1527 gfc_add_recursive (symbol_attribute
*attr
, locus
*where
)
1530 if (check_used (attr
, NULL
, where
))
1533 if (attr
->recursive
)
1535 duplicate_attr ("RECURSIVE", where
);
1539 attr
->recursive
= 1;
1540 return check_conflict (attr
, NULL
, where
);
1545 gfc_add_entry (symbol_attribute
*attr
, const char *name
, locus
*where
)
1548 if (check_used (attr
, name
, where
))
1553 duplicate_attr ("ENTRY", where
);
1558 return check_conflict (attr
, name
, where
);
1563 gfc_add_function (symbol_attribute
*attr
, const char *name
, locus
*where
)
1566 if (attr
->flavor
!= FL_PROCEDURE
1567 && !gfc_add_flavor (attr
, FL_PROCEDURE
, name
, where
))
1571 return check_conflict (attr
, name
, where
);
1576 gfc_add_subroutine (symbol_attribute
*attr
, const char *name
, locus
*where
)
1579 if (attr
->flavor
!= FL_PROCEDURE
1580 && !gfc_add_flavor (attr
, FL_PROCEDURE
, name
, where
))
1583 attr
->subroutine
= 1;
1584 return check_conflict (attr
, name
, where
);
1589 gfc_add_generic (symbol_attribute
*attr
, const char *name
, locus
*where
)
1592 if (attr
->flavor
!= FL_PROCEDURE
1593 && !gfc_add_flavor (attr
, FL_PROCEDURE
, name
, where
))
1597 return check_conflict (attr
, name
, where
);
1602 gfc_add_proc (symbol_attribute
*attr
, const char *name
, locus
*where
)
1605 if (check_used (attr
, NULL
, where
))
1608 if (attr
->flavor
!= FL_PROCEDURE
1609 && !gfc_add_flavor (attr
, FL_PROCEDURE
, name
, where
))
1612 if (attr
->procedure
)
1614 duplicate_attr ("PROCEDURE", where
);
1618 attr
->procedure
= 1;
1620 return check_conflict (attr
, NULL
, where
);
1625 gfc_add_abstract (symbol_attribute
* attr
, locus
* where
)
1629 duplicate_attr ("ABSTRACT", where
);
1635 return check_conflict (attr
, NULL
, where
);
1639 /* Flavors are special because some flavors are not what Fortran
1640 considers attributes and can be reaffirmed multiple times. */
1643 gfc_add_flavor (symbol_attribute
*attr
, sym_flavor f
, const char *name
,
1647 if ((f
== FL_PROGRAM
|| f
== FL_BLOCK_DATA
|| f
== FL_MODULE
1648 || f
== FL_PARAMETER
|| f
== FL_LABEL
|| gfc_fl_struct(f
)
1649 || f
== FL_NAMELIST
) && check_used (attr
, name
, where
))
1652 if (attr
->flavor
== f
&& f
== FL_VARIABLE
)
1655 /* Copying a procedure dummy argument for a module procedure in a
1656 submodule results in the flavor being copied and would result in
1657 an error without this. */
1658 if (gfc_new_block
&& gfc_new_block
->abr_modproc_decl
1659 && attr
->flavor
== f
&& f
== FL_PROCEDURE
)
1662 if (attr
->flavor
!= FL_UNKNOWN
)
1665 where
= &gfc_current_locus
;
1668 gfc_error ("%s attribute of %qs conflicts with %s attribute at %L",
1669 gfc_code2string (flavors
, attr
->flavor
), name
,
1670 gfc_code2string (flavors
, f
), where
);
1672 gfc_error ("%s attribute conflicts with %s attribute at %L",
1673 gfc_code2string (flavors
, attr
->flavor
),
1674 gfc_code2string (flavors
, f
), where
);
1681 return check_conflict (attr
, name
, where
);
1686 gfc_add_procedure (symbol_attribute
*attr
, procedure_type t
,
1687 const char *name
, locus
*where
)
1690 if (check_used (attr
, name
, where
))
1693 if (attr
->flavor
!= FL_PROCEDURE
1694 && !gfc_add_flavor (attr
, FL_PROCEDURE
, name
, where
))
1698 where
= &gfc_current_locus
;
1700 if (attr
->proc
!= PROC_UNKNOWN
&& !attr
->module_procedure
)
1702 if (attr
->proc
== PROC_ST_FUNCTION
&& t
== PROC_INTERNAL
1703 && !gfc_notification_std (GFC_STD_F2008
))
1704 gfc_error ("%s procedure at %L is already declared as %s "
1705 "procedure. \nF2008: A pointer function assignment "
1706 "is ambiguous if it is the first executable statement "
1707 "after the specification block. Please add any other "
1708 "kind of executable statement before it. FIXME",
1709 gfc_code2string (procedures
, t
), where
,
1710 gfc_code2string (procedures
, attr
->proc
));
1712 gfc_error ("%s procedure at %L is already declared as %s "
1713 "procedure", gfc_code2string (procedures
, t
), where
,
1714 gfc_code2string (procedures
, attr
->proc
));
1721 /* Statement functions are always scalar and functions. */
1722 if (t
== PROC_ST_FUNCTION
1723 && ((!attr
->function
&& !gfc_add_function (attr
, name
, where
))
1724 || attr
->dimension
))
1727 return check_conflict (attr
, name
, where
);
1732 gfc_add_intent (symbol_attribute
*attr
, sym_intent intent
, locus
*where
)
1735 if (check_used (attr
, NULL
, where
))
1738 if (attr
->intent
== INTENT_UNKNOWN
)
1740 attr
->intent
= intent
;
1741 return check_conflict (attr
, NULL
, where
);
1745 where
= &gfc_current_locus
;
1747 gfc_error ("INTENT (%s) conflicts with INTENT(%s) at %L",
1748 gfc_intent_string (attr
->intent
),
1749 gfc_intent_string (intent
), where
);
1755 /* No checks for use-association in public and private statements. */
1758 gfc_add_access (symbol_attribute
*attr
, gfc_access access
,
1759 const char *name
, locus
*where
)
1762 if (attr
->access
== ACCESS_UNKNOWN
1763 || (attr
->use_assoc
&& attr
->access
!= ACCESS_PRIVATE
))
1765 attr
->access
= access
;
1766 return check_conflict (attr
, name
, where
);
1770 where
= &gfc_current_locus
;
1771 gfc_error ("ACCESS specification at %L was already specified", where
);
1777 /* Set the is_bind_c field for the given symbol_attribute. */
1780 gfc_add_is_bind_c (symbol_attribute
*attr
, const char *name
, locus
*where
,
1781 int is_proc_lang_bind_spec
)
1784 if (is_proc_lang_bind_spec
== 0 && attr
->flavor
== FL_PROCEDURE
)
1785 gfc_error_now ("BIND(C) attribute at %L can only be used for "
1786 "variables or common blocks", where
);
1787 else if (attr
->is_bind_c
)
1788 gfc_error_now ("Duplicate BIND attribute specified at %L", where
);
1790 attr
->is_bind_c
= 1;
1793 where
= &gfc_current_locus
;
1795 if (!gfc_notify_std (GFC_STD_F2003
, "BIND(C) at %L", where
))
1798 return check_conflict (attr
, name
, where
);
1802 /* Set the extension field for the given symbol_attribute. */
1805 gfc_add_extension (symbol_attribute
*attr
, locus
*where
)
1808 where
= &gfc_current_locus
;
1810 if (attr
->extension
)
1811 gfc_error_now ("Duplicate EXTENDS attribute specified at %L", where
);
1813 attr
->extension
= 1;
1815 if (!gfc_notify_std (GFC_STD_F2003
, "EXTENDS at %L", where
))
1823 gfc_add_explicit_interface (gfc_symbol
*sym
, ifsrc source
,
1824 gfc_formal_arglist
* formal
, locus
*where
)
1826 if (check_used (&sym
->attr
, sym
->name
, where
))
1829 /* Skip the following checks in the case of a module_procedures in a
1830 submodule since they will manifestly fail. */
1831 if (sym
->attr
.module_procedure
== 1
1832 && source
== IFSRC_DECL
)
1836 where
= &gfc_current_locus
;
1838 if (sym
->attr
.if_source
!= IFSRC_UNKNOWN
1839 && sym
->attr
.if_source
!= IFSRC_DECL
)
1841 gfc_error ("Symbol %qs at %L already has an explicit interface",
1846 if (source
== IFSRC_IFBODY
&& (sym
->attr
.dimension
|| sym
->attr
.allocatable
))
1848 gfc_error ("%qs at %L has attributes specified outside its INTERFACE "
1849 "body", sym
->name
, where
);
1854 sym
->formal
= formal
;
1855 sym
->attr
.if_source
= source
;
1861 /* Add a type to a symbol. */
1864 gfc_add_type (gfc_symbol
*sym
, gfc_typespec
*ts
, locus
*where
)
1870 where
= &gfc_current_locus
;
1873 type
= sym
->result
->ts
.type
;
1875 type
= sym
->ts
.type
;
1877 if (sym
->attr
.result
&& type
== BT_UNKNOWN
&& sym
->ns
->proc_name
)
1878 type
= sym
->ns
->proc_name
->ts
.type
;
1880 if (type
!= BT_UNKNOWN
&& !(sym
->attr
.function
&& sym
->attr
.implicit_type
)
1881 && !(gfc_state_stack
->previous
&& gfc_state_stack
->previous
->previous
1882 && gfc_state_stack
->previous
->previous
->state
== COMP_SUBMODULE
)
1883 && !sym
->attr
.module_procedure
)
1885 if (sym
->attr
.use_assoc
)
1886 gfc_error ("Symbol %qs at %L conflicts with symbol from module %qs, "
1887 "use-associated at %L", sym
->name
, where
, sym
->module
,
1890 gfc_error ("Symbol %qs at %L already has basic type of %s", sym
->name
,
1891 where
, gfc_basic_typename (type
));
1895 if (sym
->attr
.procedure
&& sym
->ts
.interface
)
1897 gfc_error ("Procedure %qs at %L may not have basic type of %s",
1898 sym
->name
, where
, gfc_basic_typename (ts
->type
));
1902 flavor
= sym
->attr
.flavor
;
1904 if (flavor
== FL_PROGRAM
|| flavor
== FL_BLOCK_DATA
|| flavor
== FL_MODULE
1905 || flavor
== FL_LABEL
1906 || (flavor
== FL_PROCEDURE
&& sym
->attr
.subroutine
)
1907 || flavor
== FL_DERIVED
|| flavor
== FL_NAMELIST
)
1909 gfc_error ("Symbol %qs at %L cannot have a type", sym
->name
, where
);
1918 /* Clears all attributes. */
1921 gfc_clear_attr (symbol_attribute
*attr
)
1923 memset (attr
, 0, sizeof (symbol_attribute
));
1927 /* Check for missing attributes in the new symbol. Currently does
1928 nothing, but it's not clear that it is unnecessary yet. */
1931 gfc_missing_attr (symbol_attribute
*attr ATTRIBUTE_UNUSED
,
1932 locus
*where ATTRIBUTE_UNUSED
)
1939 /* Copy an attribute to a symbol attribute, bit by bit. Some
1940 attributes have a lot of side-effects but cannot be present given
1941 where we are called from, so we ignore some bits. */
1944 gfc_copy_attr (symbol_attribute
*dest
, symbol_attribute
*src
, locus
*where
)
1946 int is_proc_lang_bind_spec
;
1948 /* In line with the other attributes, we only add bits but do not remove
1949 them; cf. also PR 41034. */
1950 dest
->ext_attr
|= src
->ext_attr
;
1952 if (src
->allocatable
&& !gfc_add_allocatable (dest
, where
))
1955 if (src
->automatic
&& !gfc_add_automatic (dest
, NULL
, where
))
1957 if (src
->dimension
&& !gfc_add_dimension (dest
, NULL
, where
))
1959 if (src
->codimension
&& !gfc_add_codimension (dest
, NULL
, where
))
1961 if (src
->contiguous
&& !gfc_add_contiguous (dest
, NULL
, where
))
1963 if (src
->optional
&& !gfc_add_optional (dest
, where
))
1965 if (src
->pointer
&& !gfc_add_pointer (dest
, where
))
1967 if (src
->is_protected
&& !gfc_add_protected (dest
, NULL
, where
))
1969 if (src
->save
&& !gfc_add_save (dest
, src
->save
, NULL
, where
))
1971 if (src
->value
&& !gfc_add_value (dest
, NULL
, where
))
1973 if (src
->volatile_
&& !gfc_add_volatile (dest
, NULL
, where
))
1975 if (src
->asynchronous
&& !gfc_add_asynchronous (dest
, NULL
, where
))
1977 if (src
->threadprivate
1978 && !gfc_add_threadprivate (dest
, NULL
, where
))
1980 if (src
->omp_declare_target
1981 && !gfc_add_omp_declare_target (dest
, NULL
, where
))
1983 if (src
->omp_declare_target_link
1984 && !gfc_add_omp_declare_target_link (dest
, NULL
, where
))
1986 if (src
->oacc_declare_create
1987 && !gfc_add_oacc_declare_create (dest
, NULL
, where
))
1989 if (src
->oacc_declare_copyin
1990 && !gfc_add_oacc_declare_copyin (dest
, NULL
, where
))
1992 if (src
->oacc_declare_deviceptr
1993 && !gfc_add_oacc_declare_deviceptr (dest
, NULL
, where
))
1995 if (src
->oacc_declare_device_resident
1996 && !gfc_add_oacc_declare_device_resident (dest
, NULL
, where
))
1998 if (src
->target
&& !gfc_add_target (dest
, where
))
2000 if (src
->dummy
&& !gfc_add_dummy (dest
, NULL
, where
))
2002 if (src
->result
&& !gfc_add_result (dest
, NULL
, where
))
2007 if (src
->in_namelist
&& !gfc_add_in_namelist (dest
, NULL
, where
))
2010 if (src
->in_common
&& !gfc_add_in_common (dest
, NULL
, where
))
2013 if (src
->generic
&& !gfc_add_generic (dest
, NULL
, where
))
2015 if (src
->function
&& !gfc_add_function (dest
, NULL
, where
))
2017 if (src
->subroutine
&& !gfc_add_subroutine (dest
, NULL
, where
))
2020 if (src
->sequence
&& !gfc_add_sequence (dest
, NULL
, where
))
2022 if (src
->elemental
&& !gfc_add_elemental (dest
, where
))
2024 if (src
->pure
&& !gfc_add_pure (dest
, where
))
2026 if (src
->recursive
&& !gfc_add_recursive (dest
, where
))
2029 if (src
->flavor
!= FL_UNKNOWN
2030 && !gfc_add_flavor (dest
, src
->flavor
, NULL
, where
))
2033 if (src
->intent
!= INTENT_UNKNOWN
2034 && !gfc_add_intent (dest
, src
->intent
, where
))
2037 if (src
->access
!= ACCESS_UNKNOWN
2038 && !gfc_add_access (dest
, src
->access
, NULL
, where
))
2041 if (!gfc_missing_attr (dest
, where
))
2044 if (src
->cray_pointer
&& !gfc_add_cray_pointer (dest
, where
))
2046 if (src
->cray_pointee
&& !gfc_add_cray_pointee (dest
, where
))
2049 is_proc_lang_bind_spec
= (src
->flavor
== FL_PROCEDURE
? 1 : 0);
2051 && !gfc_add_is_bind_c (dest
, NULL
, where
, is_proc_lang_bind_spec
))
2054 if (src
->is_c_interop
)
2055 dest
->is_c_interop
= 1;
2059 if (src
->external
&& !gfc_add_external (dest
, where
))
2061 if (src
->intrinsic
&& !gfc_add_intrinsic (dest
, where
))
2063 if (src
->proc_pointer
)
2064 dest
->proc_pointer
= 1;
2073 /* A function to generate a dummy argument symbol using that from the
2074 interface declaration. Can be used for the result symbol as well if
2078 gfc_copy_dummy_sym (gfc_symbol
**dsym
, gfc_symbol
*sym
, int result
)
2082 rc
= gfc_get_symbol (sym
->name
, NULL
, dsym
);
2086 if (!gfc_add_type (*dsym
, &(sym
->ts
), &gfc_current_locus
))
2089 if (!gfc_copy_attr (&(*dsym
)->attr
, &(sym
->attr
),
2090 &gfc_current_locus
))
2093 if ((*dsym
)->attr
.dimension
)
2094 (*dsym
)->as
= gfc_copy_array_spec (sym
->as
);
2096 (*dsym
)->attr
.class_ok
= sym
->attr
.class_ok
;
2098 if ((*dsym
) != NULL
&& !result
2099 && (!gfc_add_dummy(&(*dsym
)->attr
, (*dsym
)->name
, NULL
)
2100 || !gfc_missing_attr (&(*dsym
)->attr
, NULL
)))
2102 else if ((*dsym
) != NULL
&& result
2103 && (!gfc_add_result(&(*dsym
)->attr
, (*dsym
)->name
, NULL
)
2104 || !gfc_missing_attr (&(*dsym
)->attr
, NULL
)))
2111 /************** Component name management ************/
2113 /* Component names of a derived type form their own little namespaces
2114 that are separate from all other spaces. The space is composed of
2115 a singly linked list of gfc_component structures whose head is
2116 located in the parent symbol. */
2119 /* Add a component name to a symbol. The call fails if the name is
2120 already present. On success, the component pointer is modified to
2121 point to the additional component structure. */
2124 gfc_add_component (gfc_symbol
*sym
, const char *name
,
2125 gfc_component
**component
)
2127 gfc_component
*p
, *tail
;
2129 /* Check for existing components with the same name, but not for union
2130 components or containers. Unions and maps are anonymous so they have
2131 unique internal names which will never conflict.
2132 Don't use gfc_find_component here because it calls gfc_use_derived,
2133 but the derived type may not be fully defined yet. */
2136 for (p
= sym
->components
; p
; p
= p
->next
)
2138 if (strcmp (p
->name
, name
) == 0)
2140 gfc_error ("Component %qs at %C already declared at %L",
2148 if (sym
->attr
.extension
2149 && gfc_find_component (sym
->components
->ts
.u
.derived
,
2150 name
, true, true, NULL
))
2152 gfc_error ("Component %qs at %C already in the parent type "
2153 "at %L", name
, &sym
->components
->ts
.u
.derived
->declared_at
);
2157 /* Allocate a new component. */
2158 p
= gfc_get_component ();
2161 sym
->components
= p
;
2165 p
->name
= gfc_get_string ("%s", name
);
2166 p
->loc
= gfc_current_locus
;
2167 p
->ts
.type
= BT_UNKNOWN
;
2174 /* Recursive function to switch derived types of all symbol in a
2178 switch_types (gfc_symtree
*st
, gfc_symbol
*from
, gfc_symbol
*to
)
2186 if (sym
->ts
.type
== BT_DERIVED
&& sym
->ts
.u
.derived
== from
)
2187 sym
->ts
.u
.derived
= to
;
2189 switch_types (st
->left
, from
, to
);
2190 switch_types (st
->right
, from
, to
);
2194 /* This subroutine is called when a derived type is used in order to
2195 make the final determination about which version to use. The
2196 standard requires that a type be defined before it is 'used', but
2197 such types can appear in IMPLICIT statements before the actual
2198 definition. 'Using' in this context means declaring a variable to
2199 be that type or using the type constructor.
2201 If a type is used and the components haven't been defined, then we
2202 have to have a derived type in a parent unit. We find the node in
2203 the other namespace and point the symtree node in this namespace to
2204 that node. Further reference to this name point to the correct
2205 node. If we can't find the node in a parent namespace, then we have
2208 This subroutine takes a pointer to a symbol node and returns a
2209 pointer to the translated node or NULL for an error. Usually there
2210 is no translation and we return the node we were passed. */
2213 gfc_use_derived (gfc_symbol
*sym
)
2223 if (sym
->attr
.unlimited_polymorphic
)
2226 if (sym
->attr
.generic
)
2227 sym
= gfc_find_dt_in_generic (sym
);
2229 if (sym
->components
!= NULL
|| sym
->attr
.zero_comp
)
2230 return sym
; /* Already defined. */
2232 if (sym
->ns
->parent
== NULL
)
2235 if (gfc_find_symbol (sym
->name
, sym
->ns
->parent
, 1, &s
))
2237 gfc_error ("Symbol %qs at %C is ambiguous", sym
->name
);
2241 if (s
== NULL
|| !gfc_fl_struct (s
->attr
.flavor
))
2244 /* Get rid of symbol sym, translating all references to s. */
2245 for (i
= 0; i
< GFC_LETTERS
; i
++)
2247 t
= &sym
->ns
->default_type
[i
];
2248 if (t
->u
.derived
== sym
)
2252 st
= gfc_find_symtree (sym
->ns
->sym_root
, sym
->name
);
2257 /* Unlink from list of modified symbols. */
2258 gfc_commit_symbol (sym
);
2260 switch_types (sym
->ns
->sym_root
, sym
, s
);
2262 /* TODO: Also have to replace sym -> s in other lists like
2263 namelists, common lists and interface lists. */
2264 gfc_free_symbol (sym
);
2269 gfc_error ("Derived type %qs at %C is being used before it is defined",
2275 /* Find the component with the given name in the union type symbol.
2276 If ref is not NULL it will be set to the chain of components through which
2277 the component can actually be accessed. This is necessary for unions because
2278 intermediate structures may be maps, nested structures, or other unions,
2279 all of which may (or must) be 'anonymous' to user code. */
2281 static gfc_component
*
2282 find_union_component (gfc_symbol
*un
, const char *name
,
2283 bool noaccess
, gfc_ref
**ref
)
2285 gfc_component
*m
, *check
;
2286 gfc_ref
*sref
, *tmp
;
2288 for (m
= un
->components
; m
; m
= m
->next
)
2290 check
= gfc_find_component (m
->ts
.u
.derived
, name
, noaccess
, true, &tmp
);
2294 /* Found component somewhere in m; chain the refs together. */
2298 sref
= gfc_get_ref ();
2299 sref
->type
= REF_COMPONENT
;
2300 sref
->u
.c
.component
= m
;
2301 sref
->u
.c
.sym
= m
->ts
.u
.derived
;
2306 /* Other checks (such as access) were done in the recursive calls. */
2313 /* Given a derived type node and a component name, try to locate the
2314 component structure. Returns the NULL pointer if the component is
2315 not found or the components are private. If noaccess is set, no access
2316 checks are done. If silent is set, an error will not be generated if
2317 the component cannot be found or accessed.
2319 If ref is not NULL, *ref is set to represent the chain of components
2320 required to get to the ultimate component.
2322 If the component is simply a direct subcomponent, or is inherited from a
2323 parent derived type in the given derived type, this is a single ref with its
2324 component set to the returned component.
2326 Otherwise, *ref is constructed as a chain of subcomponents. This occurs
2327 when the component is found through an implicit chain of nested union and
2328 map components. Unions and maps are "anonymous" substructures in FORTRAN
2329 which cannot be explicitly referenced, but the reference chain must be
2330 considered as in C for backend translation to correctly compute layouts.
2331 (For example, x.a may refer to x->(UNION)->(MAP)->(UNION)->(MAP)->a). */
2334 gfc_find_component (gfc_symbol
*sym
, const char *name
,
2335 bool noaccess
, bool silent
, gfc_ref
**ref
)
2337 gfc_component
*p
, *check
;
2338 gfc_ref
*sref
= NULL
, *tmp
= NULL
;
2340 if (name
== NULL
|| sym
== NULL
)
2343 if (sym
->attr
.flavor
== FL_DERIVED
)
2344 sym
= gfc_use_derived (sym
);
2346 gcc_assert (gfc_fl_struct (sym
->attr
.flavor
));
2351 /* Handle UNIONs specially - mutually recursive with gfc_find_component. */
2352 if (sym
->attr
.flavor
== FL_UNION
)
2353 return find_union_component (sym
, name
, noaccess
, ref
);
2355 if (ref
) *ref
= NULL
;
2356 for (p
= sym
->components
; p
; p
= p
->next
)
2358 /* Nest search into union's maps. */
2359 if (p
->ts
.type
== BT_UNION
)
2361 check
= find_union_component (p
->ts
.u
.derived
, name
, noaccess
, &tmp
);
2367 sref
= gfc_get_ref ();
2368 sref
->type
= REF_COMPONENT
;
2369 sref
->u
.c
.component
= p
;
2370 sref
->u
.c
.sym
= p
->ts
.u
.derived
;
2377 else if (strcmp (p
->name
, name
) == 0)
2383 if (p
&& sym
->attr
.use_assoc
&& !noaccess
)
2385 bool is_parent_comp
= sym
->attr
.extension
&& (p
== sym
->components
);
2386 if (p
->attr
.access
== ACCESS_PRIVATE
||
2387 (p
->attr
.access
!= ACCESS_PUBLIC
2388 && sym
->component_access
== ACCESS_PRIVATE
2389 && !is_parent_comp
))
2392 gfc_error ("Component %qs at %C is a PRIVATE component of %qs",
2399 && sym
->attr
.extension
2400 && sym
->components
->ts
.type
== BT_DERIVED
)
2402 p
= gfc_find_component (sym
->components
->ts
.u
.derived
, name
,
2403 noaccess
, silent
, ref
);
2404 /* Do not overwrite the error. */
2409 if (p
== NULL
&& !silent
)
2410 gfc_error ("%qs at %C is not a member of the %qs structure",
2413 /* Component was found; build the ultimate component reference. */
2414 if (p
!= NULL
&& ref
)
2416 tmp
= gfc_get_ref ();
2417 tmp
->type
= REF_COMPONENT
;
2418 tmp
->u
.c
.component
= p
;
2420 /* Link the final component ref to the end of the chain of subrefs. */
2424 for (; sref
->next
; sref
= sref
->next
)
2436 /* Given a symbol, free all of the component structures and everything
2440 free_components (gfc_component
*p
)
2448 gfc_free_array_spec (p
->as
);
2449 gfc_free_expr (p
->initializer
);
2457 /******************** Statement label management ********************/
2459 /* Comparison function for statement labels, used for managing the
2463 compare_st_labels (void *a1
, void *b1
)
2465 int a
= ((gfc_st_label
*) a1
)->value
;
2466 int b
= ((gfc_st_label
*) b1
)->value
;
2472 /* Free a single gfc_st_label structure, making sure the tree is not
2473 messed up. This function is called only when some parse error
2477 gfc_free_st_label (gfc_st_label
*label
)
2483 gfc_delete_bbt (&label
->ns
->st_labels
, label
, compare_st_labels
);
2485 if (label
->format
!= NULL
)
2486 gfc_free_expr (label
->format
);
2492 /* Free a whole tree of gfc_st_label structures. */
2495 free_st_labels (gfc_st_label
*label
)
2501 free_st_labels (label
->left
);
2502 free_st_labels (label
->right
);
2504 if (label
->format
!= NULL
)
2505 gfc_free_expr (label
->format
);
2510 /* Given a label number, search for and return a pointer to the label
2511 structure, creating it if it does not exist. */
2514 gfc_get_st_label (int labelno
)
2519 if (gfc_current_state () == COMP_DERIVED
)
2520 ns
= gfc_current_block ()->f2k_derived
;
2523 /* Find the namespace of the scoping unit:
2524 If we're in a BLOCK construct, jump to the parent namespace. */
2525 ns
= gfc_current_ns
;
2526 while (ns
->proc_name
&& ns
->proc_name
->attr
.flavor
== FL_LABEL
)
2530 /* First see if the label is already in this namespace. */
2534 if (lp
->value
== labelno
)
2537 if (lp
->value
< labelno
)
2543 lp
= XCNEW (gfc_st_label
);
2545 lp
->value
= labelno
;
2546 lp
->defined
= ST_LABEL_UNKNOWN
;
2547 lp
->referenced
= ST_LABEL_UNKNOWN
;
2550 gfc_insert_bbt (&ns
->st_labels
, lp
, compare_st_labels
);
2556 /* Called when a statement with a statement label is about to be
2557 accepted. We add the label to the list of the current namespace,
2558 making sure it hasn't been defined previously and referenced
2562 gfc_define_st_label (gfc_st_label
*lp
, gfc_sl_type type
, locus
*label_locus
)
2566 labelno
= lp
->value
;
2568 if (lp
->defined
!= ST_LABEL_UNKNOWN
)
2569 gfc_error ("Duplicate statement label %d at %L and %L", labelno
,
2570 &lp
->where
, label_locus
);
2573 lp
->where
= *label_locus
;
2577 case ST_LABEL_FORMAT
:
2578 if (lp
->referenced
== ST_LABEL_TARGET
2579 || lp
->referenced
== ST_LABEL_DO_TARGET
)
2580 gfc_error ("Label %d at %C already referenced as branch target",
2583 lp
->defined
= ST_LABEL_FORMAT
;
2587 case ST_LABEL_TARGET
:
2588 case ST_LABEL_DO_TARGET
:
2589 if (lp
->referenced
== ST_LABEL_FORMAT
)
2590 gfc_error ("Label %d at %C already referenced as a format label",
2595 if (lp
->referenced
== ST_LABEL_DO_TARGET
&& type
!= ST_LABEL_DO_TARGET
2596 && !gfc_notify_std (GFC_STD_F95_OBS
, "DO termination statement "
2597 "which is not END DO or CONTINUE with "
2598 "label %d at %C", labelno
))
2603 lp
->defined
= ST_LABEL_BAD_TARGET
;
2604 lp
->referenced
= ST_LABEL_BAD_TARGET
;
2610 /* Reference a label. Given a label and its type, see if that
2611 reference is consistent with what is known about that label,
2612 updating the unknown state. Returns false if something goes
2616 gfc_reference_st_label (gfc_st_label
*lp
, gfc_sl_type type
)
2618 gfc_sl_type label_type
;
2625 labelno
= lp
->value
;
2627 if (lp
->defined
!= ST_LABEL_UNKNOWN
)
2628 label_type
= lp
->defined
;
2631 label_type
= lp
->referenced
;
2632 lp
->where
= gfc_current_locus
;
2635 if (label_type
== ST_LABEL_FORMAT
2636 && (type
== ST_LABEL_TARGET
|| type
== ST_LABEL_DO_TARGET
))
2638 gfc_error ("Label %d at %C previously used as a FORMAT label", labelno
);
2643 if ((label_type
== ST_LABEL_TARGET
|| label_type
== ST_LABEL_DO_TARGET
2644 || label_type
== ST_LABEL_BAD_TARGET
)
2645 && type
== ST_LABEL_FORMAT
)
2647 gfc_error ("Label %d at %C previously used as branch target", labelno
);
2652 if (lp
->referenced
== ST_LABEL_DO_TARGET
&& type
== ST_LABEL_DO_TARGET
2653 && !gfc_notify_std (GFC_STD_F95_OBS
, "Shared DO termination label %d "
2657 if (lp
->referenced
!= ST_LABEL_DO_TARGET
)
2658 lp
->referenced
= type
;
2666 /************** Symbol table management subroutines ****************/
2668 /* Basic details: Fortran 95 requires a potentially unlimited number
2669 of distinct namespaces when compiling a program unit. This case
2670 occurs during a compilation of internal subprograms because all of
2671 the internal subprograms must be read before we can start
2672 generating code for the host.
2674 Given the tricky nature of the Fortran grammar, we must be able to
2675 undo changes made to a symbol table if the current interpretation
2676 of a statement is found to be incorrect. Whenever a symbol is
2677 looked up, we make a copy of it and link to it. All of these
2678 symbols are kept in a vector so that we can commit or
2679 undo the changes at a later time.
2681 A symtree may point to a symbol node outside of its namespace. In
2682 this case, that symbol has been used as a host associated variable
2683 at some previous time. */
2685 /* Allocate a new namespace structure. Copies the implicit types from
2686 PARENT if PARENT_TYPES is set. */
2689 gfc_get_namespace (gfc_namespace
*parent
, int parent_types
)
2696 ns
= XCNEW (gfc_namespace
);
2697 ns
->sym_root
= NULL
;
2698 ns
->uop_root
= NULL
;
2699 ns
->tb_sym_root
= NULL
;
2700 ns
->finalizers
= NULL
;
2701 ns
->default_access
= ACCESS_UNKNOWN
;
2702 ns
->parent
= parent
;
2704 for (in
= GFC_INTRINSIC_BEGIN
; in
!= GFC_INTRINSIC_END
; in
++)
2706 ns
->operator_access
[in
] = ACCESS_UNKNOWN
;
2707 ns
->tb_op
[in
] = NULL
;
2710 /* Initialize default implicit types. */
2711 for (i
= 'a'; i
<= 'z'; i
++)
2713 ns
->set_flag
[i
- 'a'] = 0;
2714 ts
= &ns
->default_type
[i
- 'a'];
2716 if (parent_types
&& ns
->parent
!= NULL
)
2718 /* Copy parent settings. */
2719 *ts
= ns
->parent
->default_type
[i
- 'a'];
2723 if (flag_implicit_none
!= 0)
2729 if ('i' <= i
&& i
<= 'n')
2731 ts
->type
= BT_INTEGER
;
2732 ts
->kind
= gfc_default_integer_kind
;
2737 ts
->kind
= gfc_default_real_kind
;
2741 if (parent_types
&& ns
->parent
!= NULL
)
2742 ns
->has_implicit_none_export
= ns
->parent
->has_implicit_none_export
;
2750 /* Comparison function for symtree nodes. */
2753 compare_symtree (void *_st1
, void *_st2
)
2755 gfc_symtree
*st1
, *st2
;
2757 st1
= (gfc_symtree
*) _st1
;
2758 st2
= (gfc_symtree
*) _st2
;
2760 return strcmp (st1
->name
, st2
->name
);
2764 /* Allocate a new symtree node and associate it with the new symbol. */
2767 gfc_new_symtree (gfc_symtree
**root
, const char *name
)
2771 st
= XCNEW (gfc_symtree
);
2772 st
->name
= gfc_get_string ("%s", name
);
2774 gfc_insert_bbt (root
, st
, compare_symtree
);
2779 /* Delete a symbol from the tree. Does not free the symbol itself! */
2782 gfc_delete_symtree (gfc_symtree
**root
, const char *name
)
2784 gfc_symtree st
, *st0
;
2787 /* Submodules are marked as mod.submod. When freeing a submodule
2788 symbol, the symtree only has "submod", so adjust that here. */
2790 p
= strrchr(name
, '.');
2796 st0
= gfc_find_symtree (*root
, p
);
2798 st
.name
= gfc_get_string ("%s", p
);
2799 gfc_delete_bbt (root
, &st
, compare_symtree
);
2805 /* Given a root symtree node and a name, try to find the symbol within
2806 the namespace. Returns NULL if the symbol is not found. */
2809 gfc_find_symtree (gfc_symtree
*st
, const char *name
)
2815 c
= strcmp (name
, st
->name
);
2819 st
= (c
< 0) ? st
->left
: st
->right
;
2826 /* Return a symtree node with a name that is guaranteed to be unique
2827 within the namespace and corresponds to an illegal fortran name. */
2830 gfc_get_unique_symtree (gfc_namespace
*ns
)
2832 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
2833 static int serial
= 0;
2835 sprintf (name
, "@%d", serial
++);
2836 return gfc_new_symtree (&ns
->sym_root
, name
);
2840 /* Given a name find a user operator node, creating it if it doesn't
2841 exist. These are much simpler than symbols because they can't be
2842 ambiguous with one another. */
2845 gfc_get_uop (const char *name
)
2849 gfc_namespace
*ns
= gfc_current_ns
;
2853 st
= gfc_find_symtree (ns
->uop_root
, name
);
2857 st
= gfc_new_symtree (&ns
->uop_root
, name
);
2859 uop
= st
->n
.uop
= XCNEW (gfc_user_op
);
2860 uop
->name
= gfc_get_string ("%s", name
);
2861 uop
->access
= ACCESS_UNKNOWN
;
2868 /* Given a name find the user operator node. Returns NULL if it does
2872 gfc_find_uop (const char *name
, gfc_namespace
*ns
)
2877 ns
= gfc_current_ns
;
2879 st
= gfc_find_symtree (ns
->uop_root
, name
);
2880 return (st
== NULL
) ? NULL
: st
->n
.uop
;
2884 /* Update a symbol's common_block field, and take care of the associated
2885 memory management. */
2888 set_symbol_common_block (gfc_symbol
*sym
, gfc_common_head
*common_block
)
2890 if (sym
->common_block
== common_block
)
2893 if (sym
->common_block
&& sym
->common_block
->name
[0] != '\0')
2895 sym
->common_block
->refs
--;
2896 if (sym
->common_block
->refs
== 0)
2897 free (sym
->common_block
);
2899 sym
->common_block
= common_block
;
2903 /* Remove a gfc_symbol structure and everything it points to. */
2906 gfc_free_symbol (gfc_symbol
*sym
)
2912 gfc_free_array_spec (sym
->as
);
2914 free_components (sym
->components
);
2916 gfc_free_expr (sym
->value
);
2918 gfc_free_namelist (sym
->namelist
);
2920 if (sym
->ns
!= sym
->formal_ns
)
2921 gfc_free_namespace (sym
->formal_ns
);
2923 if (!sym
->attr
.generic_copy
)
2924 gfc_free_interface (sym
->generic
);
2926 gfc_free_formal_arglist (sym
->formal
);
2928 gfc_free_namespace (sym
->f2k_derived
);
2930 set_symbol_common_block (sym
, NULL
);
2936 /* Decrease the reference counter and free memory when we reach zero. */
2939 gfc_release_symbol (gfc_symbol
*sym
)
2944 if (sym
->formal_ns
!= NULL
&& sym
->refs
== 2 && sym
->formal_ns
!= sym
->ns
2945 && (!sym
->attr
.entry
|| !sym
->module
))
2947 /* As formal_ns contains a reference to sym, delete formal_ns just
2948 before the deletion of sym. */
2949 gfc_namespace
*ns
= sym
->formal_ns
;
2950 sym
->formal_ns
= NULL
;
2951 gfc_free_namespace (ns
);
2958 gcc_assert (sym
->refs
== 0);
2959 gfc_free_symbol (sym
);
2963 /* Allocate and initialize a new symbol node. */
2966 gfc_new_symbol (const char *name
, gfc_namespace
*ns
)
2970 p
= XCNEW (gfc_symbol
);
2972 gfc_clear_ts (&p
->ts
);
2973 gfc_clear_attr (&p
->attr
);
2976 p
->declared_at
= gfc_current_locus
;
2978 if (strlen (name
) > GFC_MAX_SYMBOL_LEN
)
2979 gfc_internal_error ("new_symbol(): Symbol name too long");
2981 p
->name
= gfc_get_string ("%s", name
);
2983 /* Make sure flags for symbol being C bound are clear initially. */
2984 p
->attr
.is_bind_c
= 0;
2985 p
->attr
.is_iso_c
= 0;
2987 /* Clear the ptrs we may need. */
2988 p
->common_block
= NULL
;
2989 p
->f2k_derived
= NULL
;
2991 p
->fn_result_spec
= 0;
2997 /* Generate an error if a symbol is ambiguous. */
3000 ambiguous_symbol (const char *name
, gfc_symtree
*st
)
3003 if (st
->n
.sym
->module
)
3004 gfc_error ("Name %qs at %C is an ambiguous reference to %qs "
3005 "from module %qs", name
, st
->n
.sym
->name
, st
->n
.sym
->module
);
3007 gfc_error ("Name %qs at %C is an ambiguous reference to %qs "
3008 "from current program unit", name
, st
->n
.sym
->name
);
3012 /* If we're in a SELECT TYPE block, check if the variable 'st' matches any
3013 selector on the stack. If yes, replace it by the corresponding temporary. */
3016 select_type_insert_tmp (gfc_symtree
**st
)
3018 gfc_select_type_stack
*stack
= select_type_stack
;
3019 for (; stack
; stack
= stack
->prev
)
3020 if ((*st
)->n
.sym
== stack
->selector
&& stack
->tmp
)
3023 select_type_insert_tmp (st
);
3029 /* Look for a symtree in the current procedure -- that is, go up to
3030 parent namespaces but only if inside a BLOCK. Returns NULL if not found. */
3033 gfc_find_symtree_in_proc (const char* name
, gfc_namespace
* ns
)
3037 gfc_symtree
* st
= gfc_find_symtree (ns
->sym_root
, name
);
3041 if (!ns
->construct_entities
)
3050 /* Search for a symtree starting in the current namespace, resorting to
3051 any parent namespaces if requested by a nonzero parent_flag.
3052 Returns nonzero if the name is ambiguous. */
3055 gfc_find_sym_tree (const char *name
, gfc_namespace
*ns
, int parent_flag
,
3056 gfc_symtree
**result
)
3061 ns
= gfc_current_ns
;
3065 st
= gfc_find_symtree (ns
->sym_root
, name
);
3068 select_type_insert_tmp (&st
);
3071 /* Ambiguous generic interfaces are permitted, as long
3072 as the specific interfaces are different. */
3073 if (st
->ambiguous
&& !st
->n
.sym
->attr
.generic
)
3075 ambiguous_symbol (name
, st
);
3085 /* Don't escape an interface block. */
3086 if (ns
&& !ns
->has_import_set
3087 && ns
->proc_name
&& ns
->proc_name
->attr
.if_source
== IFSRC_IFBODY
)
3099 /* Same, but returns the symbol instead. */
3102 gfc_find_symbol (const char *name
, gfc_namespace
*ns
, int parent_flag
,
3103 gfc_symbol
**result
)
3108 i
= gfc_find_sym_tree (name
, ns
, parent_flag
, &st
);
3113 *result
= st
->n
.sym
;
3119 /* Tells whether there is only one set of changes in the stack. */
3122 single_undo_checkpoint_p (void)
3124 if (latest_undo_chgset
== &default_undo_chgset_var
)
3126 gcc_assert (latest_undo_chgset
->previous
== NULL
);
3131 gcc_assert (latest_undo_chgset
->previous
!= NULL
);
3136 /* Save symbol with the information necessary to back it out. */
3139 gfc_save_symbol_data (gfc_symbol
*sym
)
3144 if (!single_undo_checkpoint_p ())
3146 /* If there is more than one change set, look for the symbol in the
3147 current one. If it is found there, we can reuse it. */
3148 FOR_EACH_VEC_ELT (latest_undo_chgset
->syms
, i
, s
)
3151 gcc_assert (sym
->gfc_new
|| sym
->old_symbol
!= NULL
);
3155 else if (sym
->gfc_new
|| sym
->old_symbol
!= NULL
)
3158 s
= XCNEW (gfc_symbol
);
3160 sym
->old_symbol
= s
;
3163 latest_undo_chgset
->syms
.safe_push (sym
);
3167 /* Given a name, find a symbol, or create it if it does not exist yet
3168 in the current namespace. If the symbol is found we make sure that
3171 The integer return code indicates
3173 1 The symbol name was ambiguous
3174 2 The name meant to be established was already host associated.
3176 So if the return value is nonzero, then an error was issued. */
3179 gfc_get_sym_tree (const char *name
, gfc_namespace
*ns
, gfc_symtree
**result
,
3180 bool allow_subroutine
)
3185 /* This doesn't usually happen during resolution. */
3187 ns
= gfc_current_ns
;
3189 /* Try to find the symbol in ns. */
3190 st
= gfc_find_symtree (ns
->sym_root
, name
);
3192 if (st
== NULL
&& ns
->omp_udr_ns
)
3195 st
= gfc_find_symtree (ns
->sym_root
, name
);
3200 /* If not there, create a new symbol. */
3201 p
= gfc_new_symbol (name
, ns
);
3203 /* Add to the list of tentative symbols. */
3204 p
->old_symbol
= NULL
;
3207 latest_undo_chgset
->syms
.safe_push (p
);
3209 st
= gfc_new_symtree (&ns
->sym_root
, name
);
3216 /* Make sure the existing symbol is OK. Ambiguous
3217 generic interfaces are permitted, as long as the
3218 specific interfaces are different. */
3219 if (st
->ambiguous
&& !st
->n
.sym
->attr
.generic
)
3221 ambiguous_symbol (name
, st
);
3226 if (p
->ns
!= ns
&& (!p
->attr
.function
|| ns
->proc_name
!= p
)
3227 && !(allow_subroutine
&& p
->attr
.subroutine
)
3228 && !(ns
->proc_name
&& ns
->proc_name
->attr
.if_source
== IFSRC_IFBODY
3229 && (ns
->has_import_set
|| p
->attr
.imported
)))
3231 /* Symbol is from another namespace. */
3232 gfc_error ("Symbol %qs at %C has already been host associated",
3239 /* Copy in case this symbol is changed. */
3240 gfc_save_symbol_data (p
);
3249 gfc_get_symbol (const char *name
, gfc_namespace
*ns
, gfc_symbol
**result
)
3254 i
= gfc_get_sym_tree (name
, ns
, &st
, false);
3259 *result
= st
->n
.sym
;
3266 /* Subroutine that searches for a symbol, creating it if it doesn't
3267 exist, but tries to host-associate the symbol if possible. */
3270 gfc_get_ha_sym_tree (const char *name
, gfc_symtree
**result
)
3275 i
= gfc_find_sym_tree (name
, gfc_current_ns
, 0, &st
);
3279 gfc_save_symbol_data (st
->n
.sym
);
3284 i
= gfc_find_sym_tree (name
, gfc_current_ns
, 1, &st
);
3294 return gfc_get_sym_tree (name
, gfc_current_ns
, result
, false);
3299 gfc_get_ha_symbol (const char *name
, gfc_symbol
**result
)
3304 i
= gfc_get_ha_sym_tree (name
, &st
);
3307 *result
= st
->n
.sym
;
3315 /* Search for the symtree belonging to a gfc_common_head; we cannot use
3316 head->name as the common_root symtree's name might be mangled. */
3318 static gfc_symtree
*
3319 find_common_symtree (gfc_symtree
*st
, gfc_common_head
*head
)
3322 gfc_symtree
*result
;
3327 if (st
->n
.common
== head
)
3330 result
= find_common_symtree (st
->left
, head
);
3332 result
= find_common_symtree (st
->right
, head
);
3338 /* Clear the given storage, and make it the current change set for registering
3339 changed symbols. Its contents are freed after a call to
3340 gfc_restore_last_undo_checkpoint or gfc_drop_last_undo_checkpoint, but
3341 it is up to the caller to free the storage itself. It is usually a local
3342 variable, so there is nothing to do anyway. */
3345 gfc_new_undo_checkpoint (gfc_undo_change_set
&chg_syms
)
3347 chg_syms
.syms
= vNULL
;
3348 chg_syms
.tbps
= vNULL
;
3349 chg_syms
.previous
= latest_undo_chgset
;
3350 latest_undo_chgset
= &chg_syms
;
3354 /* Restore previous state of symbol. Just copy simple stuff. */
3357 restore_old_symbol (gfc_symbol
*p
)
3362 old
= p
->old_symbol
;
3364 p
->ts
.type
= old
->ts
.type
;
3365 p
->ts
.kind
= old
->ts
.kind
;
3367 p
->attr
= old
->attr
;
3369 if (p
->value
!= old
->value
)
3371 gcc_checking_assert (old
->value
== NULL
);
3372 gfc_free_expr (p
->value
);
3376 if (p
->as
!= old
->as
)
3379 gfc_free_array_spec (p
->as
);
3383 p
->generic
= old
->generic
;
3384 p
->component_access
= old
->component_access
;
3386 if (p
->namelist
!= NULL
&& old
->namelist
== NULL
)
3388 gfc_free_namelist (p
->namelist
);
3393 if (p
->namelist_tail
!= old
->namelist_tail
)
3395 gfc_free_namelist (old
->namelist_tail
->next
);
3396 old
->namelist_tail
->next
= NULL
;
3400 p
->namelist_tail
= old
->namelist_tail
;
3402 if (p
->formal
!= old
->formal
)
3404 gfc_free_formal_arglist (p
->formal
);
3405 p
->formal
= old
->formal
;
3408 set_symbol_common_block (p
, old
->common_block
);
3409 p
->common_head
= old
->common_head
;
3411 p
->old_symbol
= old
->old_symbol
;
3416 /* Frees the internal data of a gfc_undo_change_set structure. Doesn't free
3417 the structure itself. */
3420 free_undo_change_set_data (gfc_undo_change_set
&cs
)
3427 /* Given a change set pointer, free its target's contents and update it with
3428 the address of the previous change set. Note that only the contents are
3429 freed, not the target itself (the contents' container). It is not a problem
3430 as the latter will be a local variable usually. */
3433 pop_undo_change_set (gfc_undo_change_set
*&cs
)
3435 free_undo_change_set_data (*cs
);
3440 static void free_old_symbol (gfc_symbol
*sym
);
3443 /* Merges the current change set into the previous one. The changes themselves
3444 are left untouched; only one checkpoint is forgotten. */
3447 gfc_drop_last_undo_checkpoint (void)
3452 FOR_EACH_VEC_ELT (latest_undo_chgset
->syms
, i
, s
)
3454 /* No need to loop in this case. */
3455 if (s
->old_symbol
== NULL
)
3458 /* Remove the duplicate symbols. */
3459 FOR_EACH_VEC_ELT (latest_undo_chgset
->previous
->syms
, j
, t
)
3462 latest_undo_chgset
->previous
->syms
.unordered_remove (j
);
3464 /* S->OLD_SYMBOL is the backup symbol for S as it was at the
3465 last checkpoint. We drop that checkpoint, so S->OLD_SYMBOL
3466 shall contain from now on the backup symbol for S as it was
3467 at the checkpoint before. */
3468 if (s
->old_symbol
->gfc_new
)
3470 gcc_assert (s
->old_symbol
->old_symbol
== NULL
);
3471 s
->gfc_new
= s
->old_symbol
->gfc_new
;
3472 free_old_symbol (s
);
3475 restore_old_symbol (s
->old_symbol
);
3480 latest_undo_chgset
->previous
->syms
.safe_splice (latest_undo_chgset
->syms
);
3481 latest_undo_chgset
->previous
->tbps
.safe_splice (latest_undo_chgset
->tbps
);
3483 pop_undo_change_set (latest_undo_chgset
);
3487 /* Undoes all the changes made to symbols since the previous checkpoint.
3488 This subroutine is made simpler due to the fact that attributes are
3489 never removed once added. */
3492 gfc_restore_last_undo_checkpoint (void)
3497 FOR_EACH_VEC_ELT (latest_undo_chgset
->syms
, i
, p
)
3499 /* Symbol in a common block was new. Or was old and just put in common */
3501 && (p
->gfc_new
|| !p
->old_symbol
->common_block
))
3503 /* If the symbol was added to any common block, it
3504 needs to be removed to stop the resolver looking
3505 for a (possibly) dead symbol. */
3506 if (p
->common_block
->head
== p
&& !p
->common_next
)
3508 gfc_symtree st
, *st0
;
3509 st0
= find_common_symtree (p
->ns
->common_root
,
3513 st
.name
= st0
->name
;
3514 gfc_delete_bbt (&p
->ns
->common_root
, &st
, compare_symtree
);
3519 if (p
->common_block
->head
== p
)
3520 p
->common_block
->head
= p
->common_next
;
3523 gfc_symbol
*cparent
, *csym
;
3525 cparent
= p
->common_block
->head
;
3526 csym
= cparent
->common_next
;
3531 csym
= csym
->common_next
;
3534 gcc_assert(cparent
->common_next
== p
);
3535 cparent
->common_next
= csym
->common_next
;
3537 p
->common_next
= NULL
;
3541 /* The derived type is saved in the symtree with the first
3542 letter capitalized; the all lower-case version to the
3543 derived type contains its associated generic function. */
3544 if (gfc_fl_struct (p
->attr
.flavor
))
3545 gfc_delete_symtree (&p
->ns
->sym_root
,gfc_dt_upper_string (p
->name
));
3547 gfc_delete_symtree (&p
->ns
->sym_root
, p
->name
);
3549 gfc_release_symbol (p
);
3552 restore_old_symbol (p
);
3555 latest_undo_chgset
->syms
.truncate (0);
3556 latest_undo_chgset
->tbps
.truncate (0);
3558 if (!single_undo_checkpoint_p ())
3559 pop_undo_change_set (latest_undo_chgset
);
3563 /* Makes sure that there is only one set of changes; in other words we haven't
3564 forgotten to pair a call to gfc_new_checkpoint with a call to either
3565 gfc_drop_last_undo_checkpoint or gfc_restore_last_undo_checkpoint. */
3568 enforce_single_undo_checkpoint (void)
3570 gcc_checking_assert (single_undo_checkpoint_p ());
3574 /* Undoes all the changes made to symbols in the current statement. */
3577 gfc_undo_symbols (void)
3579 enforce_single_undo_checkpoint ();
3580 gfc_restore_last_undo_checkpoint ();
3584 /* Free sym->old_symbol. sym->old_symbol is mostly a shallow copy of sym; the
3585 components of old_symbol that might need deallocation are the "allocatables"
3586 that are restored in gfc_undo_symbols(), with two exceptions: namelist and
3587 namelist_tail. In case these differ between old_symbol and sym, it's just
3588 because sym->namelist has gotten a few more items. */
3591 free_old_symbol (gfc_symbol
*sym
)
3594 if (sym
->old_symbol
== NULL
)
3597 if (sym
->old_symbol
->as
!= sym
->as
)
3598 gfc_free_array_spec (sym
->old_symbol
->as
);
3600 if (sym
->old_symbol
->value
!= sym
->value
)
3601 gfc_free_expr (sym
->old_symbol
->value
);
3603 if (sym
->old_symbol
->formal
!= sym
->formal
)
3604 gfc_free_formal_arglist (sym
->old_symbol
->formal
);
3606 free (sym
->old_symbol
);
3607 sym
->old_symbol
= NULL
;
3611 /* Makes the changes made in the current statement permanent-- gets
3612 rid of undo information. */
3615 gfc_commit_symbols (void)
3618 gfc_typebound_proc
*tbp
;
3621 enforce_single_undo_checkpoint ();
3623 FOR_EACH_VEC_ELT (latest_undo_chgset
->syms
, i
, p
)
3627 free_old_symbol (p
);
3629 latest_undo_chgset
->syms
.truncate (0);
3631 FOR_EACH_VEC_ELT (latest_undo_chgset
->tbps
, i
, tbp
)
3633 latest_undo_chgset
->tbps
.truncate (0);
3637 /* Makes the changes made in one symbol permanent -- gets rid of undo
3641 gfc_commit_symbol (gfc_symbol
*sym
)
3646 enforce_single_undo_checkpoint ();
3648 FOR_EACH_VEC_ELT (latest_undo_chgset
->syms
, i
, p
)
3651 latest_undo_chgset
->syms
.unordered_remove (i
);
3658 free_old_symbol (sym
);
3662 /* Recursively free trees containing type-bound procedures. */
3665 free_tb_tree (gfc_symtree
*t
)
3670 free_tb_tree (t
->left
);
3671 free_tb_tree (t
->right
);
3673 /* TODO: Free type-bound procedure structs themselves; probably needs some
3674 sort of ref-counting mechanism. */
3680 /* Recursive function that deletes an entire tree and all the common
3681 head structures it points to. */
3684 free_common_tree (gfc_symtree
* common_tree
)
3686 if (common_tree
== NULL
)
3689 free_common_tree (common_tree
->left
);
3690 free_common_tree (common_tree
->right
);
3696 /* Recursive function that deletes an entire tree and all the common
3697 head structures it points to. */
3700 free_omp_udr_tree (gfc_symtree
* omp_udr_tree
)
3702 if (omp_udr_tree
== NULL
)
3705 free_omp_udr_tree (omp_udr_tree
->left
);
3706 free_omp_udr_tree (omp_udr_tree
->right
);
3708 gfc_free_omp_udr (omp_udr_tree
->n
.omp_udr
);
3709 free (omp_udr_tree
);
3713 /* Recursive function that deletes an entire tree and all the user
3714 operator nodes that it contains. */
3717 free_uop_tree (gfc_symtree
*uop_tree
)
3719 if (uop_tree
== NULL
)
3722 free_uop_tree (uop_tree
->left
);
3723 free_uop_tree (uop_tree
->right
);
3725 gfc_free_interface (uop_tree
->n
.uop
->op
);
3726 free (uop_tree
->n
.uop
);
3731 /* Recursive function that deletes an entire tree and all the symbols
3732 that it contains. */
3735 free_sym_tree (gfc_symtree
*sym_tree
)
3737 if (sym_tree
== NULL
)
3740 free_sym_tree (sym_tree
->left
);
3741 free_sym_tree (sym_tree
->right
);
3743 gfc_release_symbol (sym_tree
->n
.sym
);
3748 /* Free the derived type list. */
3751 gfc_free_dt_list (void)
3753 gfc_dt_list
*dt
, *n
;
3755 for (dt
= gfc_derived_types
; dt
; dt
= n
)
3761 gfc_derived_types
= NULL
;
3765 /* Free the gfc_equiv_info's. */
3768 gfc_free_equiv_infos (gfc_equiv_info
*s
)
3772 gfc_free_equiv_infos (s
->next
);
3777 /* Free the gfc_equiv_lists. */
3780 gfc_free_equiv_lists (gfc_equiv_list
*l
)
3784 gfc_free_equiv_lists (l
->next
);
3785 gfc_free_equiv_infos (l
->equiv
);
3790 /* Free a finalizer procedure list. */
3793 gfc_free_finalizer (gfc_finalizer
* el
)
3797 gfc_release_symbol (el
->proc_sym
);
3803 gfc_free_finalizer_list (gfc_finalizer
* list
)
3807 gfc_finalizer
* current
= list
;
3809 gfc_free_finalizer (current
);
3814 /* Create a new gfc_charlen structure and add it to a namespace.
3815 If 'old_cl' is given, the newly created charlen will be a copy of it. */
3818 gfc_new_charlen (gfc_namespace
*ns
, gfc_charlen
*old_cl
)
3822 cl
= gfc_get_charlen ();
3827 cl
->length
= gfc_copy_expr (old_cl
->length
);
3828 cl
->length_from_typespec
= old_cl
->length_from_typespec
;
3829 cl
->backend_decl
= old_cl
->backend_decl
;
3830 cl
->passed_length
= old_cl
->passed_length
;
3831 cl
->resolved
= old_cl
->resolved
;
3834 /* Put into namespace. */
3835 cl
->next
= ns
->cl_list
;
3842 /* Free the charlen list from cl to end (end is not freed).
3843 Free the whole list if end is NULL. */
3846 gfc_free_charlen (gfc_charlen
*cl
, gfc_charlen
*end
)
3850 for (; cl
!= end
; cl
= cl2
)
3855 gfc_free_expr (cl
->length
);
3861 /* Free entry list structs. */
3864 free_entry_list (gfc_entry_list
*el
)
3866 gfc_entry_list
*next
;
3873 free_entry_list (next
);
3877 /* Free a namespace structure and everything below it. Interface
3878 lists associated with intrinsic operators are not freed. These are
3879 taken care of when a specific name is freed. */
3882 gfc_free_namespace (gfc_namespace
*ns
)
3884 gfc_namespace
*p
, *q
;
3893 gcc_assert (ns
->refs
== 0);
3895 gfc_free_statements (ns
->code
);
3897 free_sym_tree (ns
->sym_root
);
3898 free_uop_tree (ns
->uop_root
);
3899 free_common_tree (ns
->common_root
);
3900 free_omp_udr_tree (ns
->omp_udr_root
);
3901 free_tb_tree (ns
->tb_sym_root
);
3902 free_tb_tree (ns
->tb_uop_root
);
3903 gfc_free_finalizer_list (ns
->finalizers
);
3904 gfc_free_omp_declare_simd_list (ns
->omp_declare_simd
);
3905 gfc_free_charlen (ns
->cl_list
, NULL
);
3906 free_st_labels (ns
->st_labels
);
3908 free_entry_list (ns
->entries
);
3909 gfc_free_equiv (ns
->equiv
);
3910 gfc_free_equiv_lists (ns
->equiv_lists
);
3911 gfc_free_use_stmts (ns
->use_stmts
);
3913 for (i
= GFC_INTRINSIC_BEGIN
; i
!= GFC_INTRINSIC_END
; i
++)
3914 gfc_free_interface (ns
->op
[i
]);
3916 gfc_free_data (ns
->data
);
3920 /* Recursively free any contained namespaces. */
3925 gfc_free_namespace (q
);
3931 gfc_symbol_init_2 (void)
3934 gfc_current_ns
= gfc_get_namespace (NULL
, 0);
3939 gfc_symbol_done_2 (void)
3941 gfc_free_namespace (gfc_current_ns
);
3942 gfc_current_ns
= NULL
;
3943 gfc_free_dt_list ();
3945 enforce_single_undo_checkpoint ();
3946 free_undo_change_set_data (*latest_undo_chgset
);
3950 /* Count how many nodes a symtree has. */
3953 count_st_nodes (const gfc_symtree
*st
)
3959 nodes
= count_st_nodes (st
->left
);
3961 nodes
+= count_st_nodes (st
->right
);
3967 /* Convert symtree tree into symtree vector. */
3970 fill_st_vector (gfc_symtree
*st
, gfc_symtree
**st_vec
, unsigned node_cntr
)
3975 node_cntr
= fill_st_vector (st
->left
, st_vec
, node_cntr
);
3976 st_vec
[node_cntr
++] = st
;
3977 node_cntr
= fill_st_vector (st
->right
, st_vec
, node_cntr
);
3983 /* Traverse namespace. As the functions might modify the symtree, we store the
3984 symtree as a vector and operate on this vector. Note: We assume that
3985 sym_func or st_func never deletes nodes from the symtree - only adding is
3986 allowed. Additionally, newly added nodes are not traversed. */
3989 do_traverse_symtree (gfc_symtree
*st
, void (*st_func
) (gfc_symtree
*),
3990 void (*sym_func
) (gfc_symbol
*))
3992 gfc_symtree
**st_vec
;
3993 unsigned nodes
, i
, node_cntr
;
3995 gcc_assert ((st_func
&& !sym_func
) || (!st_func
&& sym_func
));
3996 nodes
= count_st_nodes (st
);
3997 st_vec
= XALLOCAVEC (gfc_symtree
*, nodes
);
3999 fill_st_vector (st
, st_vec
, node_cntr
);
4004 for (i
= 0; i
< nodes
; i
++)
4005 st_vec
[i
]->n
.sym
->mark
= 0;
4006 for (i
= 0; i
< nodes
; i
++)
4007 if (!st_vec
[i
]->n
.sym
->mark
)
4009 (*sym_func
) (st_vec
[i
]->n
.sym
);
4010 st_vec
[i
]->n
.sym
->mark
= 1;
4014 for (i
= 0; i
< nodes
; i
++)
4015 (*st_func
) (st_vec
[i
]);
4019 /* Recursively traverse the symtree nodes. */
4022 gfc_traverse_symtree (gfc_symtree
*st
, void (*st_func
) (gfc_symtree
*))
4024 do_traverse_symtree (st
, st_func
, NULL
);
4028 /* Call a given function for all symbols in the namespace. We take
4029 care that each gfc_symbol node is called exactly once. */
4032 gfc_traverse_ns (gfc_namespace
*ns
, void (*sym_func
) (gfc_symbol
*))
4034 do_traverse_symtree (ns
->sym_root
, NULL
, sym_func
);
4038 /* Return TRUE when name is the name of an intrinsic type. */
4041 gfc_is_intrinsic_typename (const char *name
)
4043 if (strcmp (name
, "integer") == 0
4044 || strcmp (name
, "real") == 0
4045 || strcmp (name
, "character") == 0
4046 || strcmp (name
, "logical") == 0
4047 || strcmp (name
, "complex") == 0
4048 || strcmp (name
, "doubleprecision") == 0
4049 || strcmp (name
, "doublecomplex") == 0)
4056 /* Return TRUE if the symbol is an automatic variable. */
4059 gfc_is_var_automatic (gfc_symbol
*sym
)
4061 /* Pointer and allocatable variables are never automatic. */
4062 if (sym
->attr
.pointer
|| sym
->attr
.allocatable
)
4064 /* Check for arrays with non-constant size. */
4065 if (sym
->attr
.dimension
&& sym
->as
4066 && !gfc_is_compile_time_shape (sym
->as
))
4068 /* Check for non-constant length character variables. */
4069 if (sym
->ts
.type
== BT_CHARACTER
4071 && !gfc_is_constant_expr (sym
->ts
.u
.cl
->length
))
4073 /* Variables with explicit AUTOMATIC attribute. */
4074 if (sym
->attr
.automatic
)
4080 /* Given a symbol, mark it as SAVEd if it is allowed. */
4083 save_symbol (gfc_symbol
*sym
)
4086 if (sym
->attr
.use_assoc
)
4089 if (sym
->attr
.in_common
4092 || sym
->attr
.flavor
!= FL_VARIABLE
)
4094 /* Automatic objects are not saved. */
4095 if (gfc_is_var_automatic (sym
))
4097 gfc_add_save (&sym
->attr
, SAVE_EXPLICIT
, sym
->name
, &sym
->declared_at
);
4101 /* Mark those symbols which can be SAVEd as such. */
4104 gfc_save_all (gfc_namespace
*ns
)
4106 gfc_traverse_ns (ns
, save_symbol
);
4110 /* Make sure that no changes to symbols are pending. */
4113 gfc_enforce_clean_symbol_state(void)
4115 enforce_single_undo_checkpoint ();
4116 gcc_assert (latest_undo_chgset
->syms
.is_empty ());
4120 /************** Global symbol handling ************/
4123 /* Search a tree for the global symbol. */
4126 gfc_find_gsymbol (gfc_gsymbol
*symbol
, const char *name
)
4135 c
= strcmp (name
, symbol
->name
);
4139 symbol
= (c
< 0) ? symbol
->left
: symbol
->right
;
4146 /* Compare two global symbols. Used for managing the BB tree. */
4149 gsym_compare (void *_s1
, void *_s2
)
4151 gfc_gsymbol
*s1
, *s2
;
4153 s1
= (gfc_gsymbol
*) _s1
;
4154 s2
= (gfc_gsymbol
*) _s2
;
4155 return strcmp (s1
->name
, s2
->name
);
4159 /* Get a global symbol, creating it if it doesn't exist. */
4162 gfc_get_gsymbol (const char *name
)
4166 s
= gfc_find_gsymbol (gfc_gsym_root
, name
);
4170 s
= XCNEW (gfc_gsymbol
);
4171 s
->type
= GSYM_UNKNOWN
;
4172 s
->name
= gfc_get_string ("%s", name
);
4174 gfc_insert_bbt (&gfc_gsym_root
, s
, gsym_compare
);
4181 get_iso_c_binding_dt (int sym_id
)
4183 gfc_dt_list
*dt_list
;
4185 dt_list
= gfc_derived_types
;
4187 /* Loop through the derived types in the name list, searching for
4188 the desired symbol from iso_c_binding. Search the parent namespaces
4189 if necessary and requested to (parent_flag). */
4190 while (dt_list
!= NULL
)
4192 if (dt_list
->derived
->from_intmod
!= INTMOD_NONE
4193 && dt_list
->derived
->intmod_sym_id
== sym_id
)
4194 return dt_list
->derived
;
4196 dt_list
= dt_list
->next
;
4203 /* Verifies that the given derived type symbol, derived_sym, is interoperable
4204 with C. This is necessary for any derived type that is BIND(C) and for
4205 derived types that are parameters to functions that are BIND(C). All
4206 fields of the derived type are required to be interoperable, and are tested
4207 for such. If an error occurs, the errors are reported here, allowing for
4208 multiple errors to be handled for a single derived type. */
4211 verify_bind_c_derived_type (gfc_symbol
*derived_sym
)
4213 gfc_component
*curr_comp
= NULL
;
4214 bool is_c_interop
= false;
4217 if (derived_sym
== NULL
)
4218 gfc_internal_error ("verify_bind_c_derived_type(): Given symbol is "
4219 "unexpectedly NULL");
4221 /* If we've already looked at this derived symbol, do not look at it again
4222 so we don't repeat warnings/errors. */
4223 if (derived_sym
->ts
.is_c_interop
)
4226 /* The derived type must have the BIND attribute to be interoperable
4227 J3/04-007, Section 15.2.3. */
4228 if (derived_sym
->attr
.is_bind_c
!= 1)
4230 derived_sym
->ts
.is_c_interop
= 0;
4231 gfc_error_now ("Derived type %qs declared at %L must have the BIND "
4232 "attribute to be C interoperable", derived_sym
->name
,
4233 &(derived_sym
->declared_at
));
4237 curr_comp
= derived_sym
->components
;
4239 /* Fortran 2003 allows an empty derived type. C99 appears to disallow an
4240 empty struct. Section 15.2 in Fortran 2003 states: "The following
4241 subclauses define the conditions under which a Fortran entity is
4242 interoperable. If a Fortran entity is interoperable, an equivalent
4243 entity may be defined by means of C and the Fortran entity is said
4244 to be interoperable with the C entity. There does not have to be such
4245 an interoperating C entity."
4247 if (curr_comp
== NULL
)
4249 gfc_warning (0, "Derived type %qs with BIND(C) attribute at %L is empty, "
4250 "and may be inaccessible by the C companion processor",
4251 derived_sym
->name
, &(derived_sym
->declared_at
));
4252 derived_sym
->ts
.is_c_interop
= 1;
4253 derived_sym
->attr
.is_bind_c
= 1;
4258 /* Initialize the derived type as being C interoperable.
4259 If we find an error in the components, this will be set false. */
4260 derived_sym
->ts
.is_c_interop
= 1;
4262 /* Loop through the list of components to verify that the kind of
4263 each is a C interoperable type. */
4266 /* The components cannot be pointers (fortran sense).
4267 J3/04-007, Section 15.2.3, C1505. */
4268 if (curr_comp
->attr
.pointer
!= 0)
4270 gfc_error ("Component %qs at %L cannot have the "
4271 "POINTER attribute because it is a member "
4272 "of the BIND(C) derived type %qs at %L",
4273 curr_comp
->name
, &(curr_comp
->loc
),
4274 derived_sym
->name
, &(derived_sym
->declared_at
));
4278 if (curr_comp
->attr
.proc_pointer
!= 0)
4280 gfc_error ("Procedure pointer component %qs at %L cannot be a member"
4281 " of the BIND(C) derived type %qs at %L", curr_comp
->name
,
4282 &curr_comp
->loc
, derived_sym
->name
,
4283 &derived_sym
->declared_at
);
4287 /* The components cannot be allocatable.
4288 J3/04-007, Section 15.2.3, C1505. */
4289 if (curr_comp
->attr
.allocatable
!= 0)
4291 gfc_error ("Component %qs at %L cannot have the "
4292 "ALLOCATABLE attribute because it is a member "
4293 "of the BIND(C) derived type %qs at %L",
4294 curr_comp
->name
, &(curr_comp
->loc
),
4295 derived_sym
->name
, &(derived_sym
->declared_at
));
4299 /* BIND(C) derived types must have interoperable components. */
4300 if (curr_comp
->ts
.type
== BT_DERIVED
4301 && curr_comp
->ts
.u
.derived
->ts
.is_iso_c
!= 1
4302 && curr_comp
->ts
.u
.derived
!= derived_sym
)
4304 /* This should be allowed; the draft says a derived-type can not
4305 have type parameters if it is has the BIND attribute. Type
4306 parameters seem to be for making parameterized derived types.
4307 There's no need to verify the type if it is c_ptr/c_funptr. */
4308 retval
= verify_bind_c_derived_type (curr_comp
->ts
.u
.derived
);
4312 /* Grab the typespec for the given component and test the kind. */
4313 is_c_interop
= gfc_verify_c_interop (&(curr_comp
->ts
));
4317 /* Report warning and continue since not fatal. The
4318 draft does specify a constraint that requires all fields
4319 to interoperate, but if the user says real(4), etc., it
4320 may interoperate with *something* in C, but the compiler
4321 most likely won't know exactly what. Further, it may not
4322 interoperate with the same data type(s) in C if the user
4323 recompiles with different flags (e.g., -m32 and -m64 on
4324 x86_64 and using integer(4) to claim interop with a
4326 if (derived_sym
->attr
.is_bind_c
== 1 && warn_c_binding_type
)
4327 /* If the derived type is bind(c), all fields must be
4329 gfc_warning (OPT_Wc_binding_type
,
4330 "Component %qs in derived type %qs at %L "
4331 "may not be C interoperable, even though "
4332 "derived type %qs is BIND(C)",
4333 curr_comp
->name
, derived_sym
->name
,
4334 &(curr_comp
->loc
), derived_sym
->name
);
4335 else if (warn_c_binding_type
)
4336 /* If derived type is param to bind(c) routine, or to one
4337 of the iso_c_binding procs, it must be interoperable, so
4338 all fields must interop too. */
4339 gfc_warning (OPT_Wc_binding_type
,
4340 "Component %qs in derived type %qs at %L "
4341 "may not be C interoperable",
4342 curr_comp
->name
, derived_sym
->name
,
4347 curr_comp
= curr_comp
->next
;
4348 } while (curr_comp
!= NULL
);
4351 /* Make sure we don't have conflicts with the attributes. */
4352 if (derived_sym
->attr
.access
== ACCESS_PRIVATE
)
4354 gfc_error ("Derived type %qs at %L cannot be declared with both "
4355 "PRIVATE and BIND(C) attributes", derived_sym
->name
,
4356 &(derived_sym
->declared_at
));
4360 if (derived_sym
->attr
.sequence
!= 0)
4362 gfc_error ("Derived type %qs at %L cannot have the SEQUENCE "
4363 "attribute because it is BIND(C)", derived_sym
->name
,
4364 &(derived_sym
->declared_at
));
4368 /* Mark the derived type as not being C interoperable if we found an
4369 error. If there were only warnings, proceed with the assumption
4370 it's interoperable. */
4372 derived_sym
->ts
.is_c_interop
= 0;
4378 /* Generate symbols for the named constants c_null_ptr and c_null_funptr. */
4381 gen_special_c_interop_ptr (gfc_symbol
*tmp_sym
, gfc_symtree
*dt_symtree
)
4385 gcc_assert (tmp_sym
&& dt_symtree
&& dt_symtree
->n
.sym
);
4386 dt_symtree
->n
.sym
->attr
.referenced
= 1;
4388 tmp_sym
->attr
.is_c_interop
= 1;
4389 tmp_sym
->attr
.is_bind_c
= 1;
4390 tmp_sym
->ts
.is_c_interop
= 1;
4391 tmp_sym
->ts
.is_iso_c
= 1;
4392 tmp_sym
->ts
.type
= BT_DERIVED
;
4393 tmp_sym
->ts
.f90_type
= BT_VOID
;
4394 tmp_sym
->attr
.flavor
= FL_PARAMETER
;
4395 tmp_sym
->ts
.u
.derived
= dt_symtree
->n
.sym
;
4397 /* Set the c_address field of c_null_ptr and c_null_funptr to
4398 the value of NULL. */
4399 tmp_sym
->value
= gfc_get_expr ();
4400 tmp_sym
->value
->expr_type
= EXPR_STRUCTURE
;
4401 tmp_sym
->value
->ts
.type
= BT_DERIVED
;
4402 tmp_sym
->value
->ts
.f90_type
= BT_VOID
;
4403 tmp_sym
->value
->ts
.u
.derived
= tmp_sym
->ts
.u
.derived
;
4404 gfc_constructor_append_expr (&tmp_sym
->value
->value
.constructor
, NULL
, NULL
);
4405 c
= gfc_constructor_first (tmp_sym
->value
->value
.constructor
);
4406 c
->expr
= gfc_get_int_expr (gfc_index_integer_kind
, NULL
, 0);
4407 c
->expr
->ts
.is_iso_c
= 1;
4413 /* Add a formal argument, gfc_formal_arglist, to the
4414 end of the given list of arguments. Set the reference to the
4415 provided symbol, param_sym, in the argument. */
4418 add_formal_arg (gfc_formal_arglist
**head
,
4419 gfc_formal_arglist
**tail
,
4420 gfc_formal_arglist
*formal_arg
,
4421 gfc_symbol
*param_sym
)
4423 /* Put in list, either as first arg or at the tail (curr arg). */
4425 *head
= *tail
= formal_arg
;
4428 (*tail
)->next
= formal_arg
;
4429 (*tail
) = formal_arg
;
4432 (*tail
)->sym
= param_sym
;
4433 (*tail
)->next
= NULL
;
4439 /* Add a procedure interface to the given symbol (i.e., store a
4440 reference to the list of formal arguments). */
4443 add_proc_interface (gfc_symbol
*sym
, ifsrc source
, gfc_formal_arglist
*formal
)
4446 sym
->formal
= formal
;
4447 sym
->attr
.if_source
= source
;
4451 /* Copy the formal args from an existing symbol, src, into a new
4452 symbol, dest. New formal args are created, and the description of
4453 each arg is set according to the existing ones. This function is
4454 used when creating procedure declaration variables from a procedure
4455 declaration statement (see match_proc_decl()) to create the formal
4456 args based on the args of a given named interface.
4458 When an actual argument list is provided, skip the absent arguments.
4459 To be used together with gfc_se->ignore_optional. */
4462 gfc_copy_formal_args_intr (gfc_symbol
*dest
, gfc_intrinsic_sym
*src
,
4463 gfc_actual_arglist
*actual
)
4465 gfc_formal_arglist
*head
= NULL
;
4466 gfc_formal_arglist
*tail
= NULL
;
4467 gfc_formal_arglist
*formal_arg
= NULL
;
4468 gfc_intrinsic_arg
*curr_arg
= NULL
;
4469 gfc_formal_arglist
*formal_prev
= NULL
;
4470 gfc_actual_arglist
*act_arg
= actual
;
4471 /* Save current namespace so we can change it for formal args. */
4472 gfc_namespace
*parent_ns
= gfc_current_ns
;
4474 /* Create a new namespace, which will be the formal ns (namespace
4475 of the formal args). */
4476 gfc_current_ns
= gfc_get_namespace (parent_ns
, 0);
4477 gfc_current_ns
->proc_name
= dest
;
4479 for (curr_arg
= src
->formal
; curr_arg
; curr_arg
= curr_arg
->next
)
4481 /* Skip absent arguments. */
4484 gcc_assert (act_arg
!= NULL
);
4485 if (act_arg
->expr
== NULL
)
4487 act_arg
= act_arg
->next
;
4490 act_arg
= act_arg
->next
;
4492 formal_arg
= gfc_get_formal_arglist ();
4493 gfc_get_symbol (curr_arg
->name
, gfc_current_ns
, &(formal_arg
->sym
));
4495 /* May need to copy more info for the symbol. */
4496 formal_arg
->sym
->ts
= curr_arg
->ts
;
4497 formal_arg
->sym
->attr
.optional
= curr_arg
->optional
;
4498 formal_arg
->sym
->attr
.value
= curr_arg
->value
;
4499 formal_arg
->sym
->attr
.intent
= curr_arg
->intent
;
4500 formal_arg
->sym
->attr
.flavor
= FL_VARIABLE
;
4501 formal_arg
->sym
->attr
.dummy
= 1;
4503 if (formal_arg
->sym
->ts
.type
== BT_CHARACTER
)
4504 formal_arg
->sym
->ts
.u
.cl
= gfc_new_charlen (gfc_current_ns
, NULL
);
4506 /* If this isn't the first arg, set up the next ptr. For the
4507 last arg built, the formal_arg->next will never get set to
4508 anything other than NULL. */
4509 if (formal_prev
!= NULL
)
4510 formal_prev
->next
= formal_arg
;
4512 formal_arg
->next
= NULL
;
4514 formal_prev
= formal_arg
;
4516 /* Add arg to list of formal args. */
4517 add_formal_arg (&head
, &tail
, formal_arg
, formal_arg
->sym
);
4519 /* Validate changes. */
4520 gfc_commit_symbol (formal_arg
->sym
);
4523 /* Add the interface to the symbol. */
4524 add_proc_interface (dest
, IFSRC_DECL
, head
);
4526 /* Store the formal namespace information. */
4527 if (dest
->formal
!= NULL
)
4528 /* The current ns should be that for the dest proc. */
4529 dest
->formal_ns
= gfc_current_ns
;
4530 /* Restore the current namespace to what it was on entry. */
4531 gfc_current_ns
= parent_ns
;
4536 std_for_isocbinding_symbol (int id
)
4540 #define NAMED_INTCST(a,b,c,d) \
4543 #include "iso-c-binding.def"
4546 #define NAMED_FUNCTION(a,b,c,d) \
4549 #define NAMED_SUBROUTINE(a,b,c,d) \
4552 #include "iso-c-binding.def"
4553 #undef NAMED_FUNCTION
4554 #undef NAMED_SUBROUTINE
4557 return GFC_STD_F2003
;
4561 /* Generate the given set of C interoperable kind objects, or all
4562 interoperable kinds. This function will only be given kind objects
4563 for valid iso_c_binding defined types because this is verified when
4564 the 'use' statement is parsed. If the user gives an 'only' clause,
4565 the specific kinds are looked up; if they don't exist, an error is
4566 reported. If the user does not give an 'only' clause, all
4567 iso_c_binding symbols are generated. If a list of specific kinds
4568 is given, it must have a NULL in the first empty spot to mark the
4569 end of the list. For C_null_(fun)ptr, dt_symtree has to be set and
4570 point to the symtree for c_(fun)ptr. */
4573 generate_isocbinding_symbol (const char *mod_name
, iso_c_binding_symbol s
,
4574 const char *local_name
, gfc_symtree
*dt_symtree
,
4577 const char *const name
= (local_name
&& local_name
[0])
4578 ? local_name
: c_interop_kinds_table
[s
].name
;
4579 gfc_symtree
*tmp_symtree
;
4580 gfc_symbol
*tmp_sym
= NULL
;
4583 if (gfc_notification_std (std_for_isocbinding_symbol (s
)) == ERROR
)
4586 tmp_symtree
= gfc_find_symtree (gfc_current_ns
->sym_root
, name
);
4588 && (!tmp_symtree
|| !tmp_symtree
->n
.sym
4589 || tmp_symtree
->n
.sym
->from_intmod
!= INTMOD_ISO_C_BINDING
4590 || tmp_symtree
->n
.sym
->intmod_sym_id
!= s
))
4593 /* Already exists in this scope so don't re-add it. */
4594 if (tmp_symtree
!= NULL
&& (tmp_sym
= tmp_symtree
->n
.sym
) != NULL
4595 && (!tmp_sym
->attr
.generic
4596 || (tmp_sym
= gfc_find_dt_in_generic (tmp_sym
)) != NULL
)
4597 && tmp_sym
->from_intmod
== INTMOD_ISO_C_BINDING
)
4599 if (tmp_sym
->attr
.flavor
== FL_DERIVED
4600 && !get_iso_c_binding_dt (tmp_sym
->intmod_sym_id
))
4602 gfc_dt_list
*dt_list
;
4603 dt_list
= gfc_get_dt_list ();
4604 dt_list
->derived
= tmp_sym
;
4605 dt_list
->next
= gfc_derived_types
;
4606 gfc_derived_types
= dt_list
;
4612 /* Create the sym tree in the current ns. */
4615 tmp_symtree
= gfc_get_unique_symtree (gfc_current_ns
);
4616 tmp_sym
= gfc_new_symbol (name
, gfc_current_ns
);
4618 /* Add to the list of tentative symbols. */
4619 latest_undo_chgset
->syms
.safe_push (tmp_sym
);
4620 tmp_sym
->old_symbol
= NULL
;
4622 tmp_sym
->gfc_new
= 1;
4624 tmp_symtree
->n
.sym
= tmp_sym
;
4629 gfc_get_sym_tree (name
, gfc_current_ns
, &tmp_symtree
, false);
4630 gcc_assert (tmp_symtree
);
4631 tmp_sym
= tmp_symtree
->n
.sym
;
4634 /* Say what module this symbol belongs to. */
4635 tmp_sym
->module
= gfc_get_string ("%s", mod_name
);
4636 tmp_sym
->from_intmod
= INTMOD_ISO_C_BINDING
;
4637 tmp_sym
->intmod_sym_id
= s
;
4638 tmp_sym
->attr
.is_iso_c
= 1;
4639 tmp_sym
->attr
.use_assoc
= 1;
4641 gcc_assert (dt_symtree
== NULL
|| s
== ISOCBINDING_NULL_FUNPTR
4642 || s
== ISOCBINDING_NULL_PTR
);
4647 #define NAMED_INTCST(a,b,c,d) case a :
4648 #define NAMED_REALCST(a,b,c,d) case a :
4649 #define NAMED_CMPXCST(a,b,c,d) case a :
4650 #define NAMED_LOGCST(a,b,c) case a :
4651 #define NAMED_CHARKNDCST(a,b,c) case a :
4652 #include "iso-c-binding.def"
4654 tmp_sym
->value
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
,
4655 c_interop_kinds_table
[s
].value
);
4657 /* Initialize an integer constant expression node. */
4658 tmp_sym
->attr
.flavor
= FL_PARAMETER
;
4659 tmp_sym
->ts
.type
= BT_INTEGER
;
4660 tmp_sym
->ts
.kind
= gfc_default_integer_kind
;
4662 /* Mark this type as a C interoperable one. */
4663 tmp_sym
->ts
.is_c_interop
= 1;
4664 tmp_sym
->ts
.is_iso_c
= 1;
4665 tmp_sym
->value
->ts
.is_c_interop
= 1;
4666 tmp_sym
->value
->ts
.is_iso_c
= 1;
4667 tmp_sym
->attr
.is_c_interop
= 1;
4669 /* Tell what f90 type this c interop kind is valid. */
4670 tmp_sym
->ts
.f90_type
= c_interop_kinds_table
[s
].f90_type
;
4675 #define NAMED_CHARCST(a,b,c) case a :
4676 #include "iso-c-binding.def"
4678 /* Initialize an integer constant expression node for the
4679 length of the character. */
4680 tmp_sym
->value
= gfc_get_character_expr (gfc_default_character_kind
,
4681 &gfc_current_locus
, NULL
, 1);
4682 tmp_sym
->value
->ts
.is_c_interop
= 1;
4683 tmp_sym
->value
->ts
.is_iso_c
= 1;
4684 tmp_sym
->value
->value
.character
.length
= 1;
4685 tmp_sym
->value
->value
.character
.string
[0]
4686 = (gfc_char_t
) c_interop_kinds_table
[s
].value
;
4687 tmp_sym
->ts
.u
.cl
= gfc_new_charlen (gfc_current_ns
, NULL
);
4688 tmp_sym
->ts
.u
.cl
->length
= gfc_get_int_expr (gfc_default_integer_kind
,
4691 /* May not need this in both attr and ts, but do need in
4692 attr for writing module file. */
4693 tmp_sym
->attr
.is_c_interop
= 1;
4695 tmp_sym
->attr
.flavor
= FL_PARAMETER
;
4696 tmp_sym
->ts
.type
= BT_CHARACTER
;
4698 /* Need to set it to the C_CHAR kind. */
4699 tmp_sym
->ts
.kind
= gfc_default_character_kind
;
4701 /* Mark this type as a C interoperable one. */
4702 tmp_sym
->ts
.is_c_interop
= 1;
4703 tmp_sym
->ts
.is_iso_c
= 1;
4705 /* Tell what f90 type this c interop kind is valid. */
4706 tmp_sym
->ts
.f90_type
= BT_CHARACTER
;
4710 case ISOCBINDING_PTR
:
4711 case ISOCBINDING_FUNPTR
:
4714 gfc_dt_list
**dt_list_ptr
= NULL
;
4715 gfc_component
*tmp_comp
= NULL
;
4717 /* Generate real derived type. */
4722 const char *hidden_name
;
4723 gfc_interface
*intr
, *head
;
4725 hidden_name
= gfc_dt_upper_string (tmp_sym
->name
);
4726 tmp_symtree
= gfc_find_symtree (gfc_current_ns
->sym_root
,
4728 gcc_assert (tmp_symtree
== NULL
);
4729 gfc_get_sym_tree (hidden_name
, gfc_current_ns
, &tmp_symtree
, false);
4730 dt_sym
= tmp_symtree
->n
.sym
;
4731 dt_sym
->name
= gfc_get_string (s
== ISOCBINDING_PTR
4732 ? "c_ptr" : "c_funptr");
4734 /* Generate an artificial generic function. */
4735 head
= tmp_sym
->generic
;
4736 intr
= gfc_get_interface ();
4738 intr
->where
= gfc_current_locus
;
4740 tmp_sym
->generic
= intr
;
4742 if (!tmp_sym
->attr
.generic
4743 && !gfc_add_generic (&tmp_sym
->attr
, tmp_sym
->name
, NULL
))
4746 if (!tmp_sym
->attr
.function
4747 && !gfc_add_function (&tmp_sym
->attr
, tmp_sym
->name
, NULL
))
4751 /* Say what module this symbol belongs to. */
4752 dt_sym
->module
= gfc_get_string ("%s", mod_name
);
4753 dt_sym
->from_intmod
= INTMOD_ISO_C_BINDING
;
4754 dt_sym
->intmod_sym_id
= s
;
4755 dt_sym
->attr
.use_assoc
= 1;
4757 /* Initialize an integer constant expression node. */
4758 dt_sym
->attr
.flavor
= FL_DERIVED
;
4759 dt_sym
->ts
.is_c_interop
= 1;
4760 dt_sym
->attr
.is_c_interop
= 1;
4761 dt_sym
->attr
.private_comp
= 1;
4762 dt_sym
->component_access
= ACCESS_PRIVATE
;
4763 dt_sym
->ts
.is_iso_c
= 1;
4764 dt_sym
->ts
.type
= BT_DERIVED
;
4765 dt_sym
->ts
.f90_type
= BT_VOID
;
4767 /* A derived type must have the bind attribute to be
4768 interoperable (J3/04-007, Section 15.2.3), even though
4769 the binding label is not used. */
4770 dt_sym
->attr
.is_bind_c
= 1;
4772 dt_sym
->attr
.referenced
= 1;
4773 dt_sym
->ts
.u
.derived
= dt_sym
;
4775 /* Add the symbol created for the derived type to the current ns. */
4776 dt_list_ptr
= &(gfc_derived_types
);
4777 while (*dt_list_ptr
!= NULL
&& (*dt_list_ptr
)->next
!= NULL
)
4778 dt_list_ptr
= &((*dt_list_ptr
)->next
);
4780 /* There is already at least one derived type in the list, so append
4781 the one we're currently building for c_ptr or c_funptr. */
4782 if (*dt_list_ptr
!= NULL
)
4783 dt_list_ptr
= &((*dt_list_ptr
)->next
);
4784 (*dt_list_ptr
) = gfc_get_dt_list ();
4785 (*dt_list_ptr
)->derived
= dt_sym
;
4786 (*dt_list_ptr
)->next
= NULL
;
4788 gfc_add_component (dt_sym
, "c_address", &tmp_comp
);
4789 if (tmp_comp
== NULL
)
4792 tmp_comp
->ts
.type
= BT_INTEGER
;
4794 /* Set this because the module will need to read/write this field. */
4795 tmp_comp
->ts
.f90_type
= BT_INTEGER
;
4797 /* The kinds for c_ptr and c_funptr are the same. */
4798 index
= get_c_kind ("c_ptr", c_interop_kinds_table
);
4799 tmp_comp
->ts
.kind
= c_interop_kinds_table
[index
].value
;
4800 tmp_comp
->attr
.access
= ACCESS_PRIVATE
;
4802 /* Mark the component as C interoperable. */
4803 tmp_comp
->ts
.is_c_interop
= 1;
4808 case ISOCBINDING_NULL_PTR
:
4809 case ISOCBINDING_NULL_FUNPTR
:
4810 gen_special_c_interop_ptr (tmp_sym
, dt_symtree
);
4816 gfc_commit_symbol (tmp_sym
);
4821 /* Check that a symbol is already typed. If strict is not set, an untyped
4822 symbol is acceptable for non-standard-conforming mode. */
4825 gfc_check_symbol_typed (gfc_symbol
* sym
, gfc_namespace
* ns
,
4826 bool strict
, locus where
)
4830 if (gfc_matching_prefix
)
4833 /* Check for the type and try to give it an implicit one. */
4834 if (sym
->ts
.type
== BT_UNKNOWN
4835 && !gfc_set_default_type (sym
, 0, ns
))
4839 gfc_error ("Symbol %qs is used before it is typed at %L",
4844 if (!gfc_notify_std (GFC_STD_GNU
, "Symbol %qs is used before"
4845 " it is typed at %L", sym
->name
, &where
))
4849 /* Everything is ok. */
4854 /* Construct a typebound-procedure structure. Those are stored in a tentative
4855 list and marked `error' until symbols are committed. */
4858 gfc_get_typebound_proc (gfc_typebound_proc
*tb0
)
4860 gfc_typebound_proc
*result
;
4862 result
= XCNEW (gfc_typebound_proc
);
4867 latest_undo_chgset
->tbps
.safe_push (result
);
4873 /* Get the super-type of a given derived type. */
4876 gfc_get_derived_super_type (gfc_symbol
* derived
)
4878 gcc_assert (derived
);
4880 if (derived
->attr
.generic
)
4881 derived
= gfc_find_dt_in_generic (derived
);
4883 if (!derived
->attr
.extension
)
4886 gcc_assert (derived
->components
);
4887 gcc_assert (derived
->components
->ts
.type
== BT_DERIVED
);
4888 gcc_assert (derived
->components
->ts
.u
.derived
);
4890 if (derived
->components
->ts
.u
.derived
->attr
.generic
)
4891 return gfc_find_dt_in_generic (derived
->components
->ts
.u
.derived
);
4893 return derived
->components
->ts
.u
.derived
;
4897 /* Get the ultimate super-type of a given derived type. */
4900 gfc_get_ultimate_derived_super_type (gfc_symbol
* derived
)
4902 if (!derived
->attr
.extension
)
4905 derived
= gfc_get_derived_super_type (derived
);
4907 if (derived
->attr
.extension
)
4908 return gfc_get_ultimate_derived_super_type (derived
);
4914 /* Check if a derived type t2 is an extension of (or equal to) a type t1. */
4917 gfc_type_is_extension_of (gfc_symbol
*t1
, gfc_symbol
*t2
)
4919 while (!gfc_compare_derived_types (t1
, t2
) && t2
->attr
.extension
)
4920 t2
= gfc_get_derived_super_type (t2
);
4921 return gfc_compare_derived_types (t1
, t2
);
4925 /* Check if two typespecs are type compatible (F03:5.1.1.2):
4926 If ts1 is nonpolymorphic, ts2 must be the same type.
4927 If ts1 is polymorphic (CLASS), ts2 must be an extension of ts1. */
4930 gfc_type_compatible (gfc_typespec
*ts1
, gfc_typespec
*ts2
)
4932 bool is_class1
= (ts1
->type
== BT_CLASS
);
4933 bool is_class2
= (ts2
->type
== BT_CLASS
);
4934 bool is_derived1
= (ts1
->type
== BT_DERIVED
);
4935 bool is_derived2
= (ts2
->type
== BT_DERIVED
);
4936 bool is_union1
= (ts1
->type
== BT_UNION
);
4937 bool is_union2
= (ts2
->type
== BT_UNION
);
4940 && ts1
->u
.derived
->components
4941 && ((ts1
->u
.derived
->attr
.is_class
4942 && ts1
->u
.derived
->components
->ts
.u
.derived
->attr
4943 .unlimited_polymorphic
)
4944 || ts1
->u
.derived
->attr
.unlimited_polymorphic
))
4947 if (!is_derived1
&& !is_derived2
&& !is_class1
&& !is_class2
4948 && !is_union1
&& !is_union2
)
4949 return (ts1
->type
== ts2
->type
);
4951 if ((is_derived1
&& is_derived2
) || (is_union1
&& is_union2
))
4952 return gfc_compare_derived_types (ts1
->u
.derived
, ts2
->u
.derived
);
4954 if (is_derived1
&& is_class2
)
4955 return gfc_compare_derived_types (ts1
->u
.derived
,
4956 ts2
->u
.derived
->attr
.is_class
?
4957 ts2
->u
.derived
->components
->ts
.u
.derived
4959 if (is_class1
&& is_derived2
)
4960 return gfc_type_is_extension_of (ts1
->u
.derived
->attr
.is_class
?
4961 ts1
->u
.derived
->components
->ts
.u
.derived
4964 else if (is_class1
&& is_class2
)
4965 return gfc_type_is_extension_of (ts1
->u
.derived
->attr
.is_class
?
4966 ts1
->u
.derived
->components
->ts
.u
.derived
4968 ts2
->u
.derived
->attr
.is_class
?
4969 ts2
->u
.derived
->components
->ts
.u
.derived
4976 /* Find the parent-namespace of the current function. If we're inside
4977 BLOCK constructs, it may not be the current one. */
4980 gfc_find_proc_namespace (gfc_namespace
* ns
)
4982 while (ns
->construct_entities
)
4992 /* Check if an associate-variable should be translated as an `implicit' pointer
4993 internally (if it is associated to a variable and not an array with
4997 gfc_is_associate_pointer (gfc_symbol
* sym
)
5002 if (sym
->ts
.type
== BT_CLASS
)
5005 if (!sym
->assoc
->variable
)
5008 if (sym
->attr
.dimension
&& sym
->as
->type
!= AS_EXPLICIT
)
5016 gfc_find_dt_in_generic (gfc_symbol
*sym
)
5018 gfc_interface
*intr
= NULL
;
5020 if (!sym
|| gfc_fl_struct (sym
->attr
.flavor
))
5023 if (sym
->attr
.generic
)
5024 for (intr
= sym
->generic
; intr
; intr
= intr
->next
)
5025 if (gfc_fl_struct (intr
->sym
->attr
.flavor
))
5027 return intr
? intr
->sym
: NULL
;
5031 /* Get the dummy arguments from a procedure symbol. If it has been declared
5032 via a PROCEDURE statement with a named interface, ts.interface will be set
5033 and the arguments need to be taken from there. */
5035 gfc_formal_arglist
*
5036 gfc_sym_get_dummy_args (gfc_symbol
*sym
)
5038 gfc_formal_arglist
*dummies
;
5040 dummies
= sym
->formal
;
5041 if (dummies
== NULL
&& sym
->ts
.interface
!= NULL
)
5042 dummies
= sym
->ts
.interface
->formal
;