1/* Maintain binary trees of symbols.
2 Copyright (C) 2000-2023 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21
22#include "config.h"
23#include "system.h"
24#include "coretypes.h"
25#include "options.h"
26#include "gfortran.h"
27#include "parse.h"
28#include "match.h"
29#include "constructor.h"
30
31
32/* Strings for all symbol attributes. We use these for dumping the
33 parse tree, in error messages, and also when reading and writing
34 modules. */
35
36const mstring flavors[] =
37{
38 minit ("UNKNOWN-FL", FL_UNKNOWN), minit ("PROGRAM", FL_PROGRAM),
39 minit ("BLOCK-DATA", FL_BLOCK_DATA), minit ("MODULE", FL_MODULE),
40 minit ("VARIABLE", FL_VARIABLE), minit ("PARAMETER", FL_PARAMETER),
41 minit ("LABEL", FL_LABEL), minit ("PROCEDURE", FL_PROCEDURE),
42 minit ("DERIVED", FL_DERIVED), minit ("NAMELIST", FL_NAMELIST),
43 minit ("UNION", FL_UNION), minit ("STRUCTURE", FL_STRUCT),
44 minit (NULL, -1)
45};
46
47const mstring procedures[] =
48{
49 minit ("UNKNOWN-PROC", PROC_UNKNOWN),
50 minit ("MODULE-PROC", PROC_MODULE),
51 minit ("INTERNAL-PROC", PROC_INTERNAL),
52 minit ("DUMMY-PROC", PROC_DUMMY),
53 minit ("INTRINSIC-PROC", PROC_INTRINSIC),
54 minit ("EXTERNAL-PROC", PROC_EXTERNAL),
55 minit ("STATEMENT-PROC", PROC_ST_FUNCTION),
56 minit (NULL, -1)
57};
58
59const mstring intents[] =
60{
61 minit ("UNKNOWN-INTENT", INTENT_UNKNOWN),
62 minit ("IN", INTENT_IN),
63 minit ("OUT", INTENT_OUT),
64 minit ("INOUT", INTENT_INOUT),
65 minit (NULL, -1)
66};
67
68const mstring access_types[] =
69{
70 minit ("UNKNOWN-ACCESS", ACCESS_UNKNOWN),
71 minit ("PUBLIC", ACCESS_PUBLIC),
72 minit ("PRIVATE", ACCESS_PRIVATE),
73 minit (NULL, -1)
74};
75
76const mstring ifsrc_types[] =
77{
78 minit ("UNKNOWN", IFSRC_UNKNOWN),
79 minit ("DECL", IFSRC_DECL),
80 minit ("BODY", IFSRC_IFBODY)
81};
82
83const mstring save_status[] =
84{
85 minit ("UNKNOWN", SAVE_NONE),
86 minit ("EXPLICIT-SAVE", SAVE_EXPLICIT),
87 minit ("IMPLICIT-SAVE", SAVE_IMPLICIT),
88};
89
90/* Set the mstrings for DTIO procedure names. */
91const mstring dtio_procs[] =
92{
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),
97};
98
99/* This is to make sure the backend generates setup code in the correct
100 order. */
101
102static int next_dummy_order = 1;
103
104
105gfc_namespace *gfc_current_ns;
106gfc_namespace *gfc_global_ns_list;
107
108gfc_gsymbol *gfc_gsym_root = NULL;
109
110gfc_symbol *gfc_derived_types;
111
112static gfc_undo_change_set default_undo_chgset_var = { .syms: vNULL, .tbps: vNULL, NULL };
113static gfc_undo_change_set *latest_undo_chgset = &default_undo_chgset_var;
114
115
116/*********** IMPLICIT NONE and IMPLICIT statement handlers ***********/
117
118/* The following static variable indicates whether a particular element has
119 been explicitly set or not. */
120
121static int new_flag[GFC_LETTERS];
122
123
124/* Handle a correctly parsed IMPLICIT NONE. */
125
126void
127gfc_set_implicit_none (bool type, bool external, locus *loc)
128{
129 int i;
130
131 if (external)
132 gfc_current_ns->has_implicit_none_export = 1;
133
134 if (type)
135 {
136 gfc_current_ns->seen_implicit_none = 1;
137 for (i = 0; i < GFC_LETTERS; i++)
138 {
139 if (gfc_current_ns->set_flag[i])
140 {
141 gfc_error_now ("IMPLICIT NONE (type) statement at %L following an "
142 "IMPLICIT statement", loc);
143 return;
144 }
145 gfc_clear_ts (&gfc_current_ns->default_type[i]);
146 gfc_current_ns->set_flag[i] = 1;
147 }
148 }
149}
150
151
152/* Reset the implicit range flags. */
153
154void
155gfc_clear_new_implicit (void)
156{
157 int i;
158
159 for (i = 0; i < GFC_LETTERS; i++)
160 new_flag[i] = 0;
161}
162
163
164/* Prepare for a new implicit range. Sets flags in new_flag[]. */
165
166bool
167gfc_add_new_implicit_range (int c1, int c2)
168{
169 int i;
170
171 c1 -= 'a';
172 c2 -= 'a';
173
174 for (i = c1; i <= c2; i++)
175 {
176 if (new_flag[i])
177 {
178 gfc_error ("Letter %qc already set in IMPLICIT statement at %C",
179 i + 'A');
180 return false;
181 }
182
183 new_flag[i] = 1;
184 }
185
186 return true;
187}
188
189
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. */
192
193bool
194gfc_merge_new_implicit (gfc_typespec *ts)
195{
196 int i;
197
198 if (gfc_current_ns->seen_implicit_none)
199 {
200 gfc_error ("Cannot specify IMPLICIT at %C after IMPLICIT NONE");
201 return false;
202 }
203
204 for (i = 0; i < GFC_LETTERS; i++)
205 {
206 if (new_flag[i])
207 {
208 if (gfc_current_ns->set_flag[i])
209 {
210 gfc_error ("Letter %qc already has an IMPLICIT type at %C",
211 i + 'A');
212 return false;
213 }
214
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;
218 }
219 }
220 return true;
221}
222
223
224/* Given a symbol, return a pointer to the typespec for its default type. */
225
226gfc_typespec *
227gfc_get_default_type (const char *name, gfc_namespace *ns)
228{
229 char letter;
230
231 letter = name[0];
232
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");
237
238 if (letter < 'a' || letter > 'z')
239 gfc_internal_error ("gfc_get_default_type(): Bad symbol %qs", name);
240
241 if (ns == NULL)
242 ns = gfc_current_ns;
243
244 return &ns->default_type[letter - 'a'];
245}
246
247
248/* Recursively append candidate SYM to CANDIDATES. Store the number of
249 candidates in CANDIDATES_LEN. */
250
251static void
252lookup_symbol_fuzzy_find_candidates (gfc_symtree *sym,
253 char **&candidates,
254 size_t &candidates_len)
255{
256 gfc_symtree *p;
257
258 if (sym == NULL)
259 return;
260
261 if (sym->n.sym->ts.type != BT_UNKNOWN && sym->n.sym->ts.type != BT_PROCEDURE)
262 vec_push (optr&: candidates, osz&: candidates_len, elt: sym->name);
263 p = sym->left;
264 if (p)
265 lookup_symbol_fuzzy_find_candidates (sym: p, candidates, candidates_len);
266
267 p = sym->right;
268 if (p)
269 lookup_symbol_fuzzy_find_candidates (sym: p, candidates, candidates_len);
270}
271
272
273/* Lookup symbol SYM_NAME fuzzily, taking names in SYMBOL into account. */
274
275static const char*
276lookup_symbol_fuzzy (const char *sym_name, gfc_symbol *symbol)
277{
278 char **candidates = NULL;
279 size_t candidates_len = 0;
280 lookup_symbol_fuzzy_find_candidates (sym: symbol->ns->sym_root, candidates,
281 candidates_len);
282 return gfc_closest_fuzzy_match (sym_name, candidates);
283}
284
285
286/* Given a pointer to a symbol, set its type according to the first
287 letter of its name. Fails if the letter in question has no default
288 type. */
289
290bool
291gfc_set_default_type (gfc_symbol *sym, int error_flag, gfc_namespace *ns)
292{
293 gfc_typespec *ts;
294
295 if (sym->ts.type != BT_UNKNOWN)
296 gfc_internal_error ("gfc_set_default_type(): symbol already has a type");
297
298 ts = gfc_get_default_type (name: sym->name, ns);
299
300 if (ts->type == BT_UNKNOWN)
301 {
302 if (error_flag && !sym->attr.untyped && !gfc_query_suppress_errors ())
303 {
304 const char *guessed = lookup_symbol_fuzzy (sym_name: sym->name, symbol: sym);
305 if (guessed)
306 gfc_error ("Symbol %qs at %L has no IMPLICIT type"
307 "; did you mean %qs?",
308 sym->name, &sym->declared_at, guessed);
309 else
310 gfc_error ("Symbol %qs at %L has no IMPLICIT type",
311 sym->name, &sym->declared_at);
312 sym->attr.untyped = 1; /* Ensure we only give an error once. */
313 }
314
315 return false;
316 }
317
318 sym->ts = *ts;
319 sym->attr.implicit_type = 1;
320
321 if (ts->type == BT_CHARACTER && ts->u.cl)
322 sym->ts.u.cl = gfc_new_charlen (sym->ns, ts->u.cl);
323 else if (ts->type == BT_CLASS
324 && !gfc_build_class_symbol (&sym->ts, &sym->attr, &sym->as))
325 return false;
326
327 if (sym->attr.is_bind_c == 1 && warn_c_binding_type)
328 {
329 /* BIND(C) variables should not be implicitly declared. */
330 gfc_warning_now (opt: OPT_Wc_binding_type, "Implicitly declared BIND(C) "
331 "variable %qs at %L may not be C interoperable",
332 sym->name, &sym->declared_at);
333 sym->ts.f90_type = sym->ts.type;
334 }
335
336 if (sym->attr.dummy != 0)
337 {
338 if (sym->ns->proc_name != NULL
339 && (sym->ns->proc_name->attr.subroutine != 0
340 || sym->ns->proc_name->attr.function != 0)
341 && sym->ns->proc_name->attr.is_bind_c != 0
342 && warn_c_binding_type)
343 {
344 /* Dummy args to a BIND(C) routine may not be interoperable if
345 they are implicitly typed. */
346 gfc_warning_now (opt: OPT_Wc_binding_type, "Implicitly declared variable "
347 "%qs at %L may not be C interoperable but it is a "
348 "dummy argument to the BIND(C) procedure %qs at %L",
349 sym->name, &(sym->declared_at),
350 sym->ns->proc_name->name,
351 &(sym->ns->proc_name->declared_at));
352 sym->ts.f90_type = sym->ts.type;
353 }
354 }
355
356 return true;
357}
358
359
360/* This function is called from parse.cc(parse_progunit) to check the
361 type of the function is not implicitly typed in the host namespace
362 and to implicitly type the function result, if necessary. */
363
364void
365gfc_check_function_type (gfc_namespace *ns)
366{
367 gfc_symbol *proc = ns->proc_name;
368
369 if (!proc->attr.contained || proc->result->attr.implicit_type)
370 return;
371
372 if (proc->result->ts.type == BT_UNKNOWN && proc->result->ts.interface == NULL)
373 {
374 if (gfc_set_default_type (sym: proc->result, error_flag: 0, ns: gfc_current_ns))
375 {
376 if (proc->result != proc)
377 {
378 proc->ts = proc->result->ts;
379 proc->as = gfc_copy_array_spec (proc->result->as);
380 proc->attr.dimension = proc->result->attr.dimension;
381 proc->attr.pointer = proc->result->attr.pointer;
382 proc->attr.allocatable = proc->result->attr.allocatable;
383 }
384 }
385 else if (!proc->result->attr.proc_pointer)
386 {
387 gfc_error ("Function result %qs at %L has no IMPLICIT type",
388 proc->result->name, &proc->result->declared_at);
389 proc->result->attr.untyped = 1;
390 }
391 }
392}
393
394
395/******************** Symbol attribute stuff *********************/
396
397/* This is a generic conflict-checker. We do this to avoid having a
398 single conflict in two places. */
399
400#define conf(a, b) if (attr->a && attr->b) { a1 = a; a2 = b; goto conflict; }
401#define conf2(a) if (attr->a) { a2 = a; goto conflict; }
402#define conf_std(a, b, std) if (attr->a && attr->b)\
403 {\
404 a1 = a;\
405 a2 = b;\
406 standard = std;\
407 goto conflict_std;\
408 }
409
410bool
411gfc_check_conflict (symbol_attribute *attr, const char *name, locus *where)
412{
413 static const char *dummy = "DUMMY", *save = "SAVE", *pointer = "POINTER",
414 *target = "TARGET", *external = "EXTERNAL", *intent = "INTENT",
415 *intent_in = "INTENT(IN)", *intrinsic = "INTRINSIC",
416 *intent_out = "INTENT(OUT)", *intent_inout = "INTENT(INOUT)",
417 *allocatable = "ALLOCATABLE", *elemental = "ELEMENTAL",
418 *privat = "PRIVATE", *recursive = "RECURSIVE",
419 *in_common = "COMMON", *result = "RESULT", *in_namelist = "NAMELIST",
420 *publik = "PUBLIC", *optional = "OPTIONAL", *entry = "ENTRY",
421 *function = "FUNCTION", *subroutine = "SUBROUTINE",
422 *dimension = "DIMENSION", *in_equivalence = "EQUIVALENCE",
423 *use_assoc = "USE ASSOCIATED", *cray_pointer = "CRAY POINTER",
424 *cray_pointee = "CRAY POINTEE", *data = "DATA", *value = "VALUE",
425 *volatile_ = "VOLATILE", *is_protected = "PROTECTED",
426 *is_bind_c = "BIND(C)", *procedure = "PROCEDURE",
427 *proc_pointer = "PROCEDURE POINTER", *abstract = "ABSTRACT",
428 *asynchronous = "ASYNCHRONOUS", *codimension = "CODIMENSION",
429 *contiguous = "CONTIGUOUS", *generic = "GENERIC", *automatic = "AUTOMATIC",
430 *pdt_len = "LEN", *pdt_kind = "KIND";
431 static const char *threadprivate = "THREADPRIVATE";
432 static const char *omp_declare_target = "OMP DECLARE TARGET";
433 static const char *omp_declare_target_link = "OMP DECLARE TARGET LINK";
434 static const char *oacc_declare_copyin = "OACC DECLARE COPYIN";
435 static const char *oacc_declare_create = "OACC DECLARE CREATE";
436 static const char *oacc_declare_deviceptr = "OACC DECLARE DEVICEPTR";
437 static const char *oacc_declare_device_resident =
438 "OACC DECLARE DEVICE_RESIDENT";
439
440 const char *a1, *a2;
441 int standard;
442
443 if (attr->artificial)
444 return true;
445
446 if (where == NULL)
447 where = &gfc_current_locus;
448
449 if (attr->pointer && attr->intent != INTENT_UNKNOWN)
450 {
451 a1 = pointer;
452 a2 = intent;
453 standard = GFC_STD_F2003;
454 goto conflict_std;
455 }
456
457 if (attr->in_namelist && (attr->allocatable || attr->pointer))
458 {
459 a1 = in_namelist;
460 a2 = attr->allocatable ? allocatable : pointer;
461 standard = GFC_STD_F2003;
462 goto conflict_std;
463 }
464
465 /* Check for attributes not allowed in a BLOCK DATA. */
466 if (gfc_current_state () == COMP_BLOCK_DATA)
467 {
468 a1 = NULL;
469
470 if (attr->in_namelist)
471 a1 = in_namelist;
472 if (attr->allocatable)
473 a1 = allocatable;
474 if (attr->external)
475 a1 = external;
476 if (attr->optional)
477 a1 = optional;
478 if (attr->access == ACCESS_PRIVATE)
479 a1 = privat;
480 if (attr->access == ACCESS_PUBLIC)
481 a1 = publik;
482 if (attr->intent != INTENT_UNKNOWN)
483 a1 = intent;
484
485 if (a1 != NULL)
486 {
487 gfc_error
488 ("%s attribute not allowed in BLOCK DATA program unit at %L",
489 a1, where);
490 return false;
491 }
492 }
493
494 if (attr->save == SAVE_EXPLICIT)
495 {
496 conf (dummy, save);
497 conf (in_common, save);
498 conf (result, save);
499 conf (automatic, save);
500
501 switch (attr->flavor)
502 {
503 case FL_PROGRAM:
504 case FL_BLOCK_DATA:
505 case FL_MODULE:
506 case FL_LABEL:
507 case_fl_struct:
508 case FL_PARAMETER:
509 a1 = gfc_code2string (flavors, attr->flavor);
510 a2 = save;
511 goto conflict;
512 case FL_NAMELIST:
513 gfc_error ("Namelist group name at %L cannot have the "
514 "SAVE attribute", where);
515 return false;
516 case FL_PROCEDURE:
517 /* Conflicts between SAVE and PROCEDURE will be checked at
518 resolution stage, see "resolve_fl_procedure". */
519 case FL_VARIABLE:
520 default:
521 break;
522 }
523 }
524
525 /* The copying of procedure dummy arguments for module procedures in
526 a submodule occur whilst the current state is COMP_CONTAINS. It
527 is necessary, therefore, to let this through. */
528 if (name && attr->dummy
529 && (attr->function || attr->subroutine)
530 && gfc_current_state () == COMP_CONTAINS
531 && !(gfc_new_block && gfc_new_block->abr_modproc_decl))
532 gfc_error_now ("internal procedure %qs at %L conflicts with "
533 "DUMMY argument", name, where);
534
535 conf (dummy, entry);
536 conf (dummy, intrinsic);
537 conf (dummy, threadprivate);
538 conf (dummy, omp_declare_target);
539 conf (dummy, omp_declare_target_link);
540 conf (pointer, target);
541 conf (pointer, intrinsic);
542 conf (pointer, elemental);
543 conf (pointer, codimension);
544 conf (allocatable, elemental);
545
546 conf (in_common, automatic);
547 conf (result, automatic);
548 conf (use_assoc, automatic);
549 conf (dummy, automatic);
550
551 conf (target, external);
552 conf (target, intrinsic);
553
554 if (!attr->if_source)
555 conf (external, dimension); /* See Fortran 95's R504. */
556
557 conf (external, intrinsic);
558 conf (entry, intrinsic);
559 conf (abstract, intrinsic);
560
561 if ((attr->if_source == IFSRC_DECL && !attr->procedure) || attr->contained)
562 conf (external, subroutine);
563
564 if (attr->proc_pointer && !gfc_notify_std (GFC_STD_F2003,
565 "Procedure pointer at %C"))
566 return false;
567
568 conf (allocatable, pointer);
569 conf_std (allocatable, dummy, GFC_STD_F2003);
570 conf_std (allocatable, function, GFC_STD_F2003);
571 conf_std (allocatable, result, GFC_STD_F2003);
572 conf_std (elemental, recursive, GFC_STD_F2018);
573
574 conf (in_common, dummy);
575 conf (in_common, allocatable);
576 conf (in_common, codimension);
577 conf (in_common, result);
578
579 conf (in_equivalence, use_assoc);
580 conf (in_equivalence, codimension);
581 conf (in_equivalence, dummy);
582 conf (in_equivalence, target);
583 conf (in_equivalence, pointer);
584 conf (in_equivalence, function);
585 conf (in_equivalence, result);
586 conf (in_equivalence, entry);
587 conf (in_equivalence, allocatable);
588 conf (in_equivalence, threadprivate);
589 conf (in_equivalence, omp_declare_target);
590 conf (in_equivalence, omp_declare_target_link);
591 conf (in_equivalence, oacc_declare_create);
592 conf (in_equivalence, oacc_declare_copyin);
593 conf (in_equivalence, oacc_declare_deviceptr);
594 conf (in_equivalence, oacc_declare_device_resident);
595 conf (in_equivalence, is_bind_c);
596
597 conf (dummy, result);
598 conf (entry, result);
599 conf (generic, result);
600 conf (generic, omp_declare_target);
601 conf (generic, omp_declare_target_link);
602
603 conf (function, subroutine);
604
605 if (!function && !subroutine)
606 conf (is_bind_c, dummy);
607
608 conf (is_bind_c, cray_pointer);
609 conf (is_bind_c, cray_pointee);
610 conf (is_bind_c, codimension);
611 conf (is_bind_c, allocatable);
612 conf (is_bind_c, elemental);
613
614 /* Need to also get volatile attr, according to 5.1 of F2003 draft.
615 Parameter conflict caught below. Also, value cannot be specified
616 for a dummy procedure. */
617
618 /* Cray pointer/pointee conflicts. */
619 conf (cray_pointer, cray_pointee);
620 conf (cray_pointer, dimension);
621 conf (cray_pointer, codimension);
622 conf (cray_pointer, contiguous);
623 conf (cray_pointer, pointer);
624 conf (cray_pointer, target);
625 conf (cray_pointer, allocatable);
626 conf (cray_pointer, external);
627 conf (cray_pointer, intrinsic);
628 conf (cray_pointer, in_namelist);
629 conf (cray_pointer, function);
630 conf (cray_pointer, subroutine);
631 conf (cray_pointer, entry);
632
633 conf (cray_pointee, allocatable);
634 conf (cray_pointee, contiguous);
635 conf (cray_pointee, codimension);
636 conf (cray_pointee, intent);
637 conf (cray_pointee, optional);
638 conf (cray_pointee, dummy);
639 conf (cray_pointee, target);
640 conf (cray_pointee, intrinsic);
641 conf (cray_pointee, pointer);
642 conf (cray_pointee, entry);
643 conf (cray_pointee, in_common);
644 conf (cray_pointee, in_equivalence);
645 conf (cray_pointee, threadprivate);
646 conf (cray_pointee, omp_declare_target);
647 conf (cray_pointee, omp_declare_target_link);
648 conf (cray_pointee, oacc_declare_create);
649 conf (cray_pointee, oacc_declare_copyin);
650 conf (cray_pointee, oacc_declare_deviceptr);
651 conf (cray_pointee, oacc_declare_device_resident);
652
653 conf (data, dummy);
654 conf (data, function);
655 conf (data, result);
656 conf (data, allocatable);
657
658 conf (value, pointer)
659 conf (value, allocatable)
660 conf (value, subroutine)
661 conf (value, function)
662 conf (value, volatile_)
663 conf (value, dimension)
664 conf (value, codimension)
665 conf (value, external)
666
667 conf (codimension, result)
668
669 if (attr->value
670 && (attr->intent == INTENT_OUT || attr->intent == INTENT_INOUT))
671 {
672 a1 = value;
673 a2 = attr->intent == INTENT_OUT ? intent_out : intent_inout;
674 goto conflict;
675 }
676
677 conf (is_protected, intrinsic)
678 conf (is_protected, in_common)
679
680 conf (asynchronous, intrinsic)
681 conf (asynchronous, external)
682
683 conf (volatile_, intrinsic)
684 conf (volatile_, external)
685
686 if (attr->volatile_ && attr->intent == INTENT_IN)
687 {
688 a1 = volatile_;
689 a2 = intent_in;
690 goto conflict;
691 }
692
693 conf (procedure, allocatable)
694 conf (procedure, dimension)
695 conf (procedure, codimension)
696 conf (procedure, intrinsic)
697 conf (procedure, target)
698 conf (procedure, value)
699 conf (procedure, volatile_)
700 conf (procedure, asynchronous)
701 conf (procedure, entry)
702
703 conf (proc_pointer, abstract)
704 conf (proc_pointer, omp_declare_target)
705 conf (proc_pointer, omp_declare_target_link)
706
707 conf (entry, omp_declare_target)
708 conf (entry, omp_declare_target_link)
709 conf (entry, oacc_declare_create)
710 conf (entry, oacc_declare_copyin)
711 conf (entry, oacc_declare_deviceptr)
712 conf (entry, oacc_declare_device_resident)
713
714 conf (pdt_kind, allocatable)
715 conf (pdt_kind, pointer)
716 conf (pdt_kind, dimension)
717 conf (pdt_kind, codimension)
718
719 conf (pdt_len, allocatable)
720 conf (pdt_len, pointer)
721 conf (pdt_len, dimension)
722 conf (pdt_len, codimension)
723 conf (pdt_len, pdt_kind)
724
725 if (attr->access == ACCESS_PRIVATE)
726 {
727 a1 = privat;
728 conf2 (pdt_kind);
729 conf2 (pdt_len);
730 }
731
732 a1 = gfc_code2string (flavors, attr->flavor);
733
734 if (attr->in_namelist
735 && attr->flavor != FL_VARIABLE
736 && attr->flavor != FL_PROCEDURE
737 && attr->flavor != FL_UNKNOWN)
738 {
739 a2 = in_namelist;
740 goto conflict;
741 }
742
743 switch (attr->flavor)
744 {
745 case FL_PROGRAM:
746 case FL_BLOCK_DATA:
747 case FL_MODULE:
748 case FL_LABEL:
749 conf2 (codimension);
750 conf2 (dimension);
751 conf2 (dummy);
752 conf2 (volatile_);
753 conf2 (asynchronous);
754 conf2 (contiguous);
755 conf2 (pointer);
756 conf2 (is_protected);
757 conf2 (target);
758 conf2 (external);
759 conf2 (intrinsic);
760 conf2 (allocatable);
761 conf2 (result);
762 conf2 (in_namelist);
763 conf2 (optional);
764 conf2 (function);
765 conf2 (subroutine);
766 conf2 (threadprivate);
767 conf2 (omp_declare_target);
768 conf2 (omp_declare_target_link);
769 conf2 (oacc_declare_create);
770 conf2 (oacc_declare_copyin);
771 conf2 (oacc_declare_deviceptr);
772 conf2 (oacc_declare_device_resident);
773
774 if (attr->access == ACCESS_PUBLIC || attr->access == ACCESS_PRIVATE)
775 {
776 a2 = attr->access == ACCESS_PUBLIC ? publik : privat;
777 gfc_error ("%s attribute applied to %s %s at %L", a2, a1,
778 name, where);
779 return false;
780 }
781
782 if (attr->is_bind_c)
783 {
784 gfc_error_now ("BIND(C) applied to %s %s at %L", a1, name, where);
785 return false;
786 }
787
788 break;
789
790 case FL_VARIABLE:
791 break;
792
793 case FL_NAMELIST:
794 conf2 (result);
795 break;
796
797 case FL_PROCEDURE:
798 /* Conflicts with INTENT, SAVE and RESULT will be checked
799 at resolution stage, see "resolve_fl_procedure". */
800
801 if (attr->subroutine)
802 {
803 a1 = subroutine;
804 conf2 (target);
805 conf2 (allocatable);
806 conf2 (volatile_);
807 conf2 (asynchronous);
808 conf2 (in_namelist);
809 conf2 (codimension);
810 conf2 (dimension);
811 conf2 (function);
812 if (!attr->proc_pointer)
813 conf2 (threadprivate);
814 }
815
816 /* Procedure pointers in COMMON blocks are allowed in F03,
817 * but forbidden per F08:C5100. */
818 if (!attr->proc_pointer || (gfc_option.allow_std & GFC_STD_F2008))
819 conf2 (in_common);
820
821 conf2 (omp_declare_target_link);
822
823 switch (attr->proc)
824 {
825 case PROC_ST_FUNCTION:
826 conf2 (dummy);
827 conf2 (target);
828 break;
829
830 case PROC_MODULE:
831 conf2 (dummy);
832 break;
833
834 case PROC_DUMMY:
835 conf2 (result);
836 conf2 (threadprivate);
837 break;
838
839 default:
840 break;
841 }
842
843 break;
844
845 case_fl_struct:
846 conf2 (dummy);
847 conf2 (pointer);
848 conf2 (target);
849 conf2 (external);
850 conf2 (intrinsic);
851 conf2 (allocatable);
852 conf2 (optional);
853 conf2 (entry);
854 conf2 (function);
855 conf2 (subroutine);
856 conf2 (threadprivate);
857 conf2 (result);
858 conf2 (omp_declare_target);
859 conf2 (omp_declare_target_link);
860 conf2 (oacc_declare_create);
861 conf2 (oacc_declare_copyin);
862 conf2 (oacc_declare_deviceptr);
863 conf2 (oacc_declare_device_resident);
864
865 if (attr->intent != INTENT_UNKNOWN)
866 {
867 a2 = intent;
868 goto conflict;
869 }
870 break;
871
872 case FL_PARAMETER:
873 conf2 (external);
874 conf2 (intrinsic);
875 conf2 (optional);
876 conf2 (allocatable);
877 conf2 (function);
878 conf2 (subroutine);
879 conf2 (entry);
880 conf2 (contiguous);
881 conf2 (pointer);
882 conf2 (is_protected);
883 conf2 (target);
884 conf2 (dummy);
885 conf2 (in_common);
886 conf2 (value);
887 conf2 (volatile_);
888 conf2 (asynchronous);
889 conf2 (threadprivate);
890 conf2 (value);
891 conf2 (codimension);
892 conf2 (result);
893 if (!attr->is_iso_c)
894 conf2 (is_bind_c);
895 break;
896
897 default:
898 break;
899 }
900
901 return true;
902
903conflict:
904 if (name == NULL)
905 gfc_error ("%s attribute conflicts with %s attribute at %L",
906 a1, a2, where);
907 else
908 gfc_error ("%s attribute conflicts with %s attribute in %qs at %L",
909 a1, a2, name, where);
910
911 return false;
912
913conflict_std:
914 if (name == NULL)
915 {
916 return gfc_notify_std (standard, "%s attribute conflicts "
917 "with %s attribute at %L", a1, a2,
918 where);
919 }
920 else
921 {
922 return gfc_notify_std (standard, "%s attribute conflicts "
923 "with %s attribute in %qs at %L",
924 a1, a2, name, where);
925 }
926}
927
928#undef conf
929#undef conf2
930#undef conf_std
931
932
933/* Mark a symbol as referenced. */
934
935void
936gfc_set_sym_referenced (gfc_symbol *sym)
937{
938
939 if (sym->attr.referenced)
940 return;
941
942 sym->attr.referenced = 1;
943
944 /* Remember which order dummy variables are accessed in. */
945 if (sym->attr.dummy)
946 sym->dummy_order = next_dummy_order++;
947}
948
949
950/* Common subroutine called by attribute changing subroutines in order
951 to prevent them from changing a symbol that has been
952 use-associated. Returns zero if it is OK to change the symbol,
953 nonzero if not. */
954
955static int
956check_used (symbol_attribute *attr, const char *name, locus *where)
957{
958
959 if (attr->use_assoc == 0)
960 return 0;
961
962 if (where == NULL)
963 where = &gfc_current_locus;
964
965 if (name == NULL)
966 gfc_error ("Cannot change attributes of USE-associated symbol at %L",
967 where);
968 else
969 gfc_error ("Cannot change attributes of USE-associated symbol %s at %L",
970 name, where);
971
972 return 1;
973}
974
975
976/* Generate an error because of a duplicate attribute. */
977
978static void
979duplicate_attr (const char *attr, locus *where)
980{
981
982 if (where == NULL)
983 where = &gfc_current_locus;
984
985 gfc_error ("Duplicate %s attribute specified at %L", attr, where);
986}
987
988
989bool
990gfc_add_ext_attribute (symbol_attribute *attr, ext_attr_id_t ext_attr,
991 locus *where ATTRIBUTE_UNUSED)
992{
993 attr->ext_attr |= 1 << ext_attr;
994 return true;
995}
996
997
998/* Called from decl.cc (attr_decl1) to check attributes, when declared
999 separately. */
1000
1001bool
1002gfc_add_attribute (symbol_attribute *attr, locus *where)
1003{
1004 if (check_used (attr, NULL, where))
1005 return false;
1006
1007 return gfc_check_conflict (attr, NULL, where);
1008}
1009
1010
1011bool
1012gfc_add_allocatable (symbol_attribute *attr, locus *where)
1013{
1014
1015 if (check_used (attr, NULL, where))
1016 return false;
1017
1018 if (attr->allocatable && ! gfc_submodule_procedure(attr))
1019 {
1020 duplicate_attr (attr: "ALLOCATABLE", where);
1021 return false;
1022 }
1023
1024 if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
1025 && !gfc_find_state (COMP_INTERFACE))
1026 {
1027 gfc_error ("ALLOCATABLE specified outside of INTERFACE body at %L",
1028 where);
1029 return false;
1030 }
1031
1032 attr->allocatable = 1;
1033 return gfc_check_conflict (attr, NULL, where);
1034}
1035
1036
1037bool
1038gfc_add_automatic (symbol_attribute *attr, const char *name, locus *where)
1039{
1040 if (check_used (attr, name, where))
1041 return false;
1042
1043 if (attr->automatic && !gfc_notify_std (GFC_STD_LEGACY,
1044 "Duplicate AUTOMATIC attribute specified at %L", where))
1045 return false;
1046
1047 attr->automatic = 1;
1048 return gfc_check_conflict (attr, name, where);
1049}
1050
1051
1052bool
1053gfc_add_codimension (symbol_attribute *attr, const char *name, locus *where)
1054{
1055
1056 if (check_used (attr, name, where))
1057 return false;
1058
1059 if (attr->codimension)
1060 {
1061 duplicate_attr (attr: "CODIMENSION", where);
1062 return false;
1063 }
1064
1065 if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
1066 && !gfc_find_state (COMP_INTERFACE))
1067 {
1068 gfc_error ("CODIMENSION specified for %qs outside its INTERFACE body "
1069 "at %L", name, where);
1070 return false;
1071 }
1072
1073 attr->codimension = 1;
1074 return gfc_check_conflict (attr, name, where);
1075}
1076
1077
1078bool
1079gfc_add_dimension (symbol_attribute *attr, const char *name, locus *where)
1080{
1081
1082 if (check_used (attr, name, where))
1083 return false;
1084
1085 if (attr->dimension && ! gfc_submodule_procedure(attr))
1086 {
1087 duplicate_attr (attr: "DIMENSION", where);
1088 return false;
1089 }
1090
1091 if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
1092 && !gfc_find_state (COMP_INTERFACE))
1093 {
1094 gfc_error ("DIMENSION specified for %qs outside its INTERFACE body "
1095 "at %L", name, where);
1096 return false;
1097 }
1098
1099 attr->dimension = 1;
1100 return gfc_check_conflict (attr, name, where);
1101}
1102
1103
1104bool
1105gfc_add_contiguous (symbol_attribute *attr, const char *name, locus *where)
1106{
1107
1108 if (check_used (attr, name, where))
1109 return false;
1110
1111 if (attr->contiguous)
1112 {
1113 duplicate_attr (attr: "CONTIGUOUS", where);
1114 return false;
1115 }
1116
1117 attr->contiguous = 1;
1118 return gfc_check_conflict (attr, name, where);
1119}
1120
1121
1122bool
1123gfc_add_external (symbol_attribute *attr, locus *where)
1124{
1125
1126 if (check_used (attr, NULL, where))
1127 return false;
1128
1129 if (attr->external)
1130 {
1131 duplicate_attr (attr: "EXTERNAL", where);
1132 return false;
1133 }
1134
1135 if (attr->pointer && attr->if_source != IFSRC_IFBODY)
1136 {
1137 attr->pointer = 0;
1138 attr->proc_pointer = 1;
1139 }
1140
1141 attr->external = 1;
1142
1143 return gfc_check_conflict (attr, NULL, where);
1144}
1145
1146
1147bool
1148gfc_add_intrinsic (symbol_attribute *attr, locus *where)
1149{
1150
1151 if (check_used (attr, NULL, where))
1152 return false;
1153
1154 if (attr->intrinsic)
1155 {
1156 duplicate_attr (attr: "INTRINSIC", where);
1157 return false;
1158 }
1159
1160 attr->intrinsic = 1;
1161
1162 return gfc_check_conflict (attr, NULL, where);
1163}
1164
1165
1166bool
1167gfc_add_optional (symbol_attribute *attr, locus *where)
1168{
1169
1170 if (check_used (attr, NULL, where))
1171 return false;
1172
1173 if (attr->optional)
1174 {
1175 duplicate_attr (attr: "OPTIONAL", where);
1176 return false;
1177 }
1178
1179 attr->optional = 1;
1180 return gfc_check_conflict (attr, NULL, where);
1181}
1182
1183bool
1184gfc_add_kind (symbol_attribute *attr, locus *where)
1185{
1186 if (attr->pdt_kind)
1187 {
1188 duplicate_attr (attr: "KIND", where);
1189 return false;
1190 }
1191
1192 attr->pdt_kind = 1;
1193 return gfc_check_conflict (attr, NULL, where);
1194}
1195
1196bool
1197gfc_add_len (symbol_attribute *attr, locus *where)
1198{
1199 if (attr->pdt_len)
1200 {
1201 duplicate_attr (attr: "LEN", where);
1202 return false;
1203 }
1204
1205 attr->pdt_len = 1;
1206 return gfc_check_conflict (attr, NULL, where);
1207}
1208
1209
1210bool
1211gfc_add_pointer (symbol_attribute *attr, locus *where)
1212{
1213
1214 if (check_used (attr, NULL, where))
1215 return false;
1216
1217 if (attr->pointer && !(attr->if_source == IFSRC_IFBODY
1218 && !gfc_find_state (COMP_INTERFACE))
1219 && ! gfc_submodule_procedure(attr))
1220 {
1221 duplicate_attr (attr: "POINTER", where);
1222 return false;
1223 }
1224
1225 if (attr->procedure || (attr->external && attr->if_source != IFSRC_IFBODY)
1226 || (attr->if_source == IFSRC_IFBODY
1227 && !gfc_find_state (COMP_INTERFACE)))
1228 attr->proc_pointer = 1;
1229 else
1230 attr->pointer = 1;
1231
1232 return gfc_check_conflict (attr, NULL, where);
1233}
1234
1235
1236bool
1237gfc_add_cray_pointer (symbol_attribute *attr, locus *where)
1238{
1239
1240 if (check_used (attr, NULL, where))
1241 return false;
1242
1243 attr->cray_pointer = 1;
1244 return gfc_check_conflict (attr, NULL, where);
1245}
1246
1247
1248bool
1249gfc_add_cray_pointee (symbol_attribute *attr, locus *where)
1250{
1251
1252 if (check_used (attr, NULL, where))
1253 return false;
1254
1255 if (attr->cray_pointee)
1256 {
1257 gfc_error ("Cray Pointee at %L appears in multiple pointer()"
1258 " statements", where);
1259 return false;
1260 }
1261
1262 attr->cray_pointee = 1;
1263 return gfc_check_conflict (attr, NULL, where);
1264}
1265
1266
1267bool
1268gfc_add_protected (symbol_attribute *attr, const char *name, locus *where)
1269{
1270 if (check_used (attr, name, where))
1271 return false;
1272
1273 if (attr->is_protected)
1274 {
1275 if (!gfc_notify_std (GFC_STD_LEGACY,
1276 "Duplicate PROTECTED attribute specified at %L",
1277 where))
1278 return false;
1279 }
1280
1281 attr->is_protected = 1;
1282 return gfc_check_conflict (attr, name, where);
1283}
1284
1285
1286bool
1287gfc_add_result (symbol_attribute *attr, const char *name, locus *where)
1288{
1289
1290 if (check_used (attr, name, where))
1291 return false;
1292
1293 attr->result = 1;
1294 return gfc_check_conflict (attr, name, where);
1295}
1296
1297
1298bool
1299gfc_add_save (symbol_attribute *attr, save_state s, const char *name,
1300 locus *where)
1301{
1302
1303 if (check_used (attr, name, where))
1304 return false;
1305
1306 if (s == SAVE_EXPLICIT && gfc_pure (NULL))
1307 {
1308 gfc_error
1309 ("SAVE attribute at %L cannot be specified in a PURE procedure",
1310 where);
1311 return false;
1312 }
1313
1314 if (s == SAVE_EXPLICIT)
1315 gfc_unset_implicit_pure (NULL);
1316
1317 if (s == SAVE_EXPLICIT && attr->save == SAVE_EXPLICIT
1318 && (flag_automatic || pedantic))
1319 {
1320 if (!gfc_notify_std (GFC_STD_LEGACY,
1321 "Duplicate SAVE attribute specified at %L",
1322 where))
1323 return false;
1324 }
1325
1326 attr->save = s;
1327 return gfc_check_conflict (attr, name, where);
1328}
1329
1330
1331bool
1332gfc_add_value (symbol_attribute *attr, const char *name, locus *where)
1333{
1334
1335 if (check_used (attr, name, where))
1336 return false;
1337
1338 if (attr->value)
1339 {
1340 if (!gfc_notify_std (GFC_STD_LEGACY,
1341 "Duplicate VALUE attribute specified at %L",
1342 where))
1343 return false;
1344 }
1345
1346 attr->value = 1;
1347 return gfc_check_conflict (attr, name, where);
1348}
1349
1350
1351bool
1352gfc_add_volatile (symbol_attribute *attr, const char *name, locus *where)
1353{
1354 /* No check_used needed as 11.2.1 of the F2003 standard allows
1355 that the local identifier made accessible by a use statement can be
1356 given a VOLATILE attribute - unless it is a coarray (F2008, C560). */
1357
1358 if (attr->volatile_ && attr->volatile_ns == gfc_current_ns)
1359 if (!gfc_notify_std (GFC_STD_LEGACY,
1360 "Duplicate VOLATILE attribute specified at %L",
1361 where))
1362 return false;
1363
1364 /* F2008: C1282 A designator of a variable with the VOLATILE attribute
1365 shall not appear in a pure subprogram.
1366
1367 F2018: C1588 A local variable of a pure subprogram, or of a BLOCK
1368 construct within a pure subprogram, shall not have the SAVE or
1369 VOLATILE attribute. */
1370 if (gfc_pure (NULL))
1371 {
1372 gfc_error ("VOLATILE attribute at %L cannot be specified in a "
1373 "PURE procedure", where);
1374 return false;
1375 }
1376
1377
1378 attr->volatile_ = 1;
1379 attr->volatile_ns = gfc_current_ns;
1380 return gfc_check_conflict (attr, name, where);
1381}
1382
1383
1384bool
1385gfc_add_asynchronous (symbol_attribute *attr, const char *name, locus *where)
1386{
1387 /* No check_used needed as 11.2.1 of the F2003 standard allows
1388 that the local identifier made accessible by a use statement can be
1389 given a ASYNCHRONOUS attribute. */
1390
1391 if (attr->asynchronous && attr->asynchronous_ns == gfc_current_ns)
1392 if (!gfc_notify_std (GFC_STD_LEGACY,
1393 "Duplicate ASYNCHRONOUS attribute specified at %L",
1394 where))
1395 return false;
1396
1397 attr->asynchronous = 1;
1398 attr->asynchronous_ns = gfc_current_ns;
1399 return gfc_check_conflict (attr, name, where);
1400}
1401
1402
1403bool
1404gfc_add_threadprivate (symbol_attribute *attr, const char *name, locus *where)
1405{
1406
1407 if (check_used (attr, name, where))
1408 return false;
1409
1410 if (attr->threadprivate)
1411 {
1412 duplicate_attr (attr: "THREADPRIVATE", where);
1413 return false;
1414 }
1415
1416 attr->threadprivate = 1;
1417 return gfc_check_conflict (attr, name, where);
1418}
1419
1420
1421bool
1422gfc_add_omp_declare_target (symbol_attribute *attr, const char *name,
1423 locus *where)
1424{
1425
1426 if (check_used (attr, name, where))
1427 return false;
1428
1429 if (attr->omp_declare_target)
1430 return true;
1431
1432 attr->omp_declare_target = 1;
1433 return gfc_check_conflict (attr, name, where);
1434}
1435
1436
1437bool
1438gfc_add_omp_declare_target_link (symbol_attribute *attr, const char *name,
1439 locus *where)
1440{
1441
1442 if (check_used (attr, name, where))
1443 return false;
1444
1445 if (attr->omp_declare_target_link)
1446 return true;
1447
1448 attr->omp_declare_target_link = 1;
1449 return gfc_check_conflict (attr, name, where);
1450}
1451
1452
1453bool
1454gfc_add_oacc_declare_create (symbol_attribute *attr, const char *name,
1455 locus *where)
1456{
1457 if (check_used (attr, name, where))
1458 return false;
1459
1460 if (attr->oacc_declare_create)
1461 return true;
1462
1463 attr->oacc_declare_create = 1;
1464 return gfc_check_conflict (attr, name, where);
1465}
1466
1467
1468bool
1469gfc_add_oacc_declare_copyin (symbol_attribute *attr, const char *name,
1470 locus *where)
1471{
1472 if (check_used (attr, name, where))
1473 return false;
1474
1475 if (attr->oacc_declare_copyin)
1476 return true;
1477
1478 attr->oacc_declare_copyin = 1;
1479 return gfc_check_conflict (attr, name, where);
1480}
1481
1482
1483bool
1484gfc_add_oacc_declare_deviceptr (symbol_attribute *attr, const char *name,
1485 locus *where)
1486{
1487 if (check_used (attr, name, where))
1488 return false;
1489
1490 if (attr->oacc_declare_deviceptr)
1491 return true;
1492
1493 attr->oacc_declare_deviceptr = 1;
1494 return gfc_check_conflict (attr, name, where);
1495}
1496
1497
1498bool
1499gfc_add_oacc_declare_device_resident (symbol_attribute *attr, const char *name,
1500 locus *where)
1501{
1502 if (check_used (attr, name, where))
1503 return false;
1504
1505 if (attr->oacc_declare_device_resident)
1506 return true;
1507
1508 attr->oacc_declare_device_resident = 1;
1509 return gfc_check_conflict (attr, name, where);
1510}
1511
1512
1513bool
1514gfc_add_target (symbol_attribute *attr, locus *where)
1515{
1516
1517 if (check_used (attr, NULL, where))
1518 return false;
1519
1520 if (attr->target)
1521 {
1522 duplicate_attr (attr: "TARGET", where);
1523 return false;
1524 }
1525
1526 attr->target = 1;
1527 return gfc_check_conflict (attr, NULL, where);
1528}
1529
1530
1531bool
1532gfc_add_dummy (symbol_attribute *attr, const char *name, locus *where)
1533{
1534
1535 if (check_used (attr, name, where))
1536 return false;
1537
1538 /* Duplicate dummy arguments are allowed due to ENTRY statements. */
1539 attr->dummy = 1;
1540 return gfc_check_conflict (attr, name, where);
1541}
1542
1543
1544bool
1545gfc_add_in_common (symbol_attribute *attr, const char *name, locus *where)
1546{
1547
1548 if (check_used (attr, name, where))
1549 return false;
1550
1551 /* Duplicate attribute already checked for. */
1552 attr->in_common = 1;
1553 return gfc_check_conflict (attr, name, where);
1554}
1555
1556
1557bool
1558gfc_add_in_equivalence (symbol_attribute *attr, const char *name, locus *where)
1559{
1560
1561 /* Duplicate attribute already checked for. */
1562 attr->in_equivalence = 1;
1563 if (!gfc_check_conflict (attr, name, where))
1564 return false;
1565
1566 if (attr->flavor == FL_VARIABLE)
1567 return true;
1568
1569 return gfc_add_flavor (attr, FL_VARIABLE, name, where);
1570}
1571
1572
1573bool
1574gfc_add_data (symbol_attribute *attr, const char *name, locus *where)
1575{
1576
1577 if (check_used (attr, name, where))
1578 return false;
1579
1580 attr->data = 1;
1581 return gfc_check_conflict (attr, name, where);
1582}
1583
1584
1585bool
1586gfc_add_in_namelist (symbol_attribute *attr, const char *name, locus *where)
1587{
1588
1589 attr->in_namelist = 1;
1590 return gfc_check_conflict (attr, name, where);
1591}
1592
1593
1594bool
1595gfc_add_sequence (symbol_attribute *attr, const char *name, locus *where)
1596{
1597
1598 if (check_used (attr, name, where))
1599 return false;
1600
1601 attr->sequence = 1;
1602 return gfc_check_conflict (attr, name, where);
1603}
1604
1605
1606bool
1607gfc_add_elemental (symbol_attribute *attr, locus *where)
1608{
1609
1610 if (check_used (attr, NULL, where))
1611 return false;
1612
1613 if (attr->elemental)
1614 {
1615 duplicate_attr (attr: "ELEMENTAL", where);
1616 return false;
1617 }
1618
1619 attr->elemental = 1;
1620 return gfc_check_conflict (attr, NULL, where);
1621}
1622
1623
1624bool
1625gfc_add_pure (symbol_attribute *attr, locus *where)
1626{
1627
1628 if (check_used (attr, NULL, where))
1629 return false;
1630
1631 if (attr->pure)
1632 {
1633 duplicate_attr (attr: "PURE", where);
1634 return false;
1635 }
1636
1637 attr->pure = 1;
1638 return gfc_check_conflict (attr, NULL, where);
1639}
1640
1641
1642bool
1643gfc_add_recursive (symbol_attribute *attr, locus *where)
1644{
1645
1646 if (check_used (attr, NULL, where))
1647 return false;
1648
1649 if (attr->recursive)
1650 {
1651 duplicate_attr (attr: "RECURSIVE", where);
1652 return false;
1653 }
1654
1655 attr->recursive = 1;
1656 return gfc_check_conflict (attr, NULL, where);
1657}
1658
1659
1660bool
1661gfc_add_entry (symbol_attribute *attr, const char *name, locus *where)
1662{
1663
1664 if (check_used (attr, name, where))
1665 return false;
1666
1667 if (attr->entry)
1668 {
1669 duplicate_attr (attr: "ENTRY", where);
1670 return false;
1671 }
1672
1673 attr->entry = 1;
1674 return gfc_check_conflict (attr, name, where);
1675}
1676
1677
1678bool
1679gfc_add_function (symbol_attribute *attr, const char *name, locus *where)
1680{
1681
1682 if (attr->flavor != FL_PROCEDURE
1683 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1684 return false;
1685
1686 attr->function = 1;
1687 return gfc_check_conflict (attr, name, where);
1688}
1689
1690
1691bool
1692gfc_add_subroutine (symbol_attribute *attr, const char *name, locus *where)
1693{
1694
1695 if (attr->flavor != FL_PROCEDURE
1696 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1697 return false;
1698
1699 attr->subroutine = 1;
1700
1701 /* If we are looking at a BLOCK DATA statement and we encounter a
1702 name with a leading underscore (which must be
1703 compiler-generated), do not check. See PR 84394. */
1704
1705 if (name && *name != '_' && gfc_current_state () != COMP_BLOCK_DATA)
1706 return gfc_check_conflict (attr, name, where);
1707 else
1708 return true;
1709}
1710
1711
1712bool
1713gfc_add_generic (symbol_attribute *attr, const char *name, locus *where)
1714{
1715
1716 if (attr->flavor != FL_PROCEDURE
1717 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1718 return false;
1719
1720 attr->generic = 1;
1721 return gfc_check_conflict (attr, name, where);
1722}
1723
1724
1725bool
1726gfc_add_proc (symbol_attribute *attr, const char *name, locus *where)
1727{
1728
1729 if (check_used (attr, NULL, where))
1730 return false;
1731
1732 if (attr->flavor != FL_PROCEDURE
1733 && !gfc_add_flavor (attr, FL_PROCEDURE, name, where))
1734 return false;
1735
1736 if (attr->procedure)
1737 {
1738 duplicate_attr (attr: "PROCEDURE", where);
1739 return false;
1740 }
1741
1742 attr->procedure = 1;
1743
1744 return gfc_check_conflict (attr, NULL, where);
1745}
1746
1747
1748bool
1749gfc_add_abstract (symbol_attribute* attr, locus* where)
1750{
1751 if (attr->abstract)
1752 {
1753 duplicate_attr (attr: "ABSTRACT", where);
1754 return false;
1755 }
1756
1757 attr->abstract = 1;
1758
1759 return gfc_check_conflict (attr, NULL, where);
1760}
1761
1762
1763/* Flavors are special because some flavors are not what Fortran
1764 considers attributes and can be reaffirmed multiple times. */
1765
1766bool
1767gfc_add_flavor (symbol_attribute *attr, sym_flavor f, const char *name,
1768 locus *where)
1769{
1770
1771 if ((f == FL_PROGRAM || f == FL_BLOCK_DATA || f == FL_MODULE
1772 || f == FL_PARAMETER || f == FL_LABEL || gfc_fl_struct(f)
1773 || f == FL_NAMELIST) && check_used (attr, name, where))
1774 return false;
1775
1776 if (attr->flavor == f && f == FL_VARIABLE)
1777 return true;
1778
1779 /* Copying a procedure dummy argument for a module procedure in a
1780 submodule results in the flavor being copied and would result in
1781 an error without this. */
1782 if (attr->flavor == f && f == FL_PROCEDURE
1783 && gfc_new_block && gfc_new_block->abr_modproc_decl)
1784 return true;
1785
1786 if (attr->flavor != FL_UNKNOWN)
1787 {
1788 if (where == NULL)
1789 where = &gfc_current_locus;
1790
1791 if (name)
1792 gfc_error ("%s attribute of %qs conflicts with %s attribute at %L",
1793 gfc_code2string (flavors, attr->flavor), name,
1794 gfc_code2string (flavors, f), where);
1795 else
1796 gfc_error ("%s attribute conflicts with %s attribute at %L",
1797 gfc_code2string (flavors, attr->flavor),
1798 gfc_code2string (flavors, f), where);
1799
1800 return false;
1801 }
1802
1803 attr->flavor = f;
1804
1805 return gfc_check_conflict (attr, name, where);
1806}
1807
1808
1809bool
1810gfc_add_procedure (symbol_attribute *attr, procedure_type t,
1811 const char *name, locus *where)
1812{
1813
1814 if (check_used (attr, name, where))
1815 return false;
1816
1817 if (attr->flavor != FL_PROCEDURE
1818 && !gfc_add_flavor (attr, f: FL_PROCEDURE, name, where))
1819 return false;
1820
1821 if (where == NULL)
1822 where = &gfc_current_locus;
1823
1824 if (attr->proc != PROC_UNKNOWN && !attr->module_procedure
1825 && attr->access == ACCESS_UNKNOWN)
1826 {
1827 if (attr->proc == PROC_ST_FUNCTION && t == PROC_INTERNAL
1828 && !gfc_notification_std (GFC_STD_F2008))
1829 gfc_error ("%s procedure at %L is already declared as %s "
1830 "procedure. \nF2008: A pointer function assignment "
1831 "is ambiguous if it is the first executable statement "
1832 "after the specification block. Please add any other "
1833 "kind of executable statement before it. FIXME",
1834 gfc_code2string (procedures, t), where,
1835 gfc_code2string (procedures, attr->proc));
1836 else
1837 gfc_error ("%s procedure at %L is already declared as %s "
1838 "procedure", gfc_code2string (procedures, t), where,
1839 gfc_code2string (procedures, attr->proc));
1840
1841 return false;
1842 }
1843
1844 attr->proc = t;
1845
1846 /* Statement functions are always scalar and functions. */
1847 if (t == PROC_ST_FUNCTION
1848 && ((!attr->function && !gfc_add_function (attr, name, where))
1849 || attr->dimension))
1850 return false;
1851
1852 return gfc_check_conflict (attr, name, where);
1853}
1854
1855
1856bool
1857gfc_add_intent (symbol_attribute *attr, sym_intent intent, locus *where)
1858{
1859
1860 if (check_used (attr, NULL, where))
1861 return false;
1862
1863 if (attr->intent == INTENT_UNKNOWN)
1864 {
1865 attr->intent = intent;
1866 return gfc_check_conflict (attr, NULL, where);
1867 }
1868
1869 if (where == NULL)
1870 where = &gfc_current_locus;
1871
1872 gfc_error ("INTENT (%s) conflicts with INTENT(%s) at %L",
1873 gfc_intent_string (attr->intent),
1874 gfc_intent_string (intent), where);
1875
1876 return false;
1877}
1878
1879
1880/* No checks for use-association in public and private statements. */
1881
1882bool
1883gfc_add_access (symbol_attribute *attr, gfc_access access,
1884 const char *name, locus *where)
1885{
1886
1887 if (attr->access == ACCESS_UNKNOWN
1888 || (attr->use_assoc && attr->access != ACCESS_PRIVATE))
1889 {
1890 attr->access = access;
1891 return gfc_check_conflict (attr, name, where);
1892 }
1893
1894 if (where == NULL)
1895 where = &gfc_current_locus;
1896 gfc_error ("ACCESS specification at %L was already specified", where);
1897
1898 return false;
1899}
1900
1901
1902/* Set the is_bind_c field for the given symbol_attribute. */
1903
1904bool
1905gfc_add_is_bind_c (symbol_attribute *attr, const char *name, locus *where,
1906 int is_proc_lang_bind_spec)
1907{
1908
1909 if (is_proc_lang_bind_spec == 0 && attr->flavor == FL_PROCEDURE)
1910 gfc_error_now ("BIND(C) attribute at %L can only be used for "
1911 "variables or common blocks", where);
1912 else if (attr->is_bind_c)
1913 gfc_error_now ("Duplicate BIND attribute specified at %L", where);
1914 else
1915 attr->is_bind_c = 1;
1916
1917 if (where == NULL)
1918 where = &gfc_current_locus;
1919
1920 if (!gfc_notify_std (GFC_STD_F2003, "BIND(C) at %L", where))
1921 return false;
1922
1923 return gfc_check_conflict (attr, name, where);
1924}
1925
1926
1927/* Set the extension field for the given symbol_attribute. */
1928
1929bool
1930gfc_add_extension (symbol_attribute *attr, locus *where)
1931{
1932 if (where == NULL)
1933 where = &gfc_current_locus;
1934
1935 if (attr->extension)
1936 gfc_error_now ("Duplicate EXTENDS attribute specified at %L", where);
1937 else
1938 attr->extension = 1;
1939
1940 if (!gfc_notify_std (GFC_STD_F2003, "EXTENDS at %L", where))
1941 return false;
1942
1943 return true;
1944}
1945
1946
1947bool
1948gfc_add_explicit_interface (gfc_symbol *sym, ifsrc source,
1949 gfc_formal_arglist * formal, locus *where)
1950{
1951 if (check_used (attr: &sym->attr, name: sym->name, where))
1952 return false;
1953
1954 /* Skip the following checks in the case of a module_procedures in a
1955 submodule since they will manifestly fail. */
1956 if (sym->attr.module_procedure == 1
1957 && source == IFSRC_DECL)
1958 goto finish;
1959
1960 if (where == NULL)
1961 where = &gfc_current_locus;
1962
1963 if (sym->attr.if_source != IFSRC_UNKNOWN
1964 && sym->attr.if_source != IFSRC_DECL)
1965 {
1966 gfc_error ("Symbol %qs at %L already has an explicit interface",
1967 sym->name, where);
1968 return false;
1969 }
1970
1971 if (source == IFSRC_IFBODY && (sym->attr.dimension || sym->attr.allocatable))
1972 {
1973 gfc_error ("%qs at %L has attributes specified outside its INTERFACE "
1974 "body", sym->name, where);
1975 return false;
1976 }
1977
1978finish:
1979 sym->formal = formal;
1980 sym->attr.if_source = source;
1981
1982 return true;
1983}
1984
1985
1986/* Add a type to a symbol. */
1987
1988bool
1989gfc_add_type (gfc_symbol *sym, gfc_typespec *ts, locus *where)
1990{
1991 sym_flavor flavor;
1992 bt type;
1993
1994 if (where == NULL)
1995 where = &gfc_current_locus;
1996
1997 if (sym->result)
1998 type = sym->result->ts.type;
1999 else
2000 type = sym->ts.type;
2001
2002 if (sym->attr.result && type == BT_UNKNOWN && sym->ns->proc_name)
2003 type = sym->ns->proc_name->ts.type;
2004
2005 if (type != BT_UNKNOWN && !(sym->attr.function && sym->attr.implicit_type)
2006 && !(gfc_state_stack->previous && gfc_state_stack->previous->previous
2007 && gfc_state_stack->previous->previous->state == COMP_SUBMODULE)
2008 && !sym->attr.module_procedure)
2009 {
2010 if (sym->attr.use_assoc)
2011 gfc_error ("Symbol %qs at %L conflicts with symbol from module %qs, "
2012 "use-associated at %L", sym->name, where, sym->module,
2013 &sym->declared_at);
2014 else if (sym->attr.function && sym->attr.result)
2015 gfc_error ("Symbol %qs at %L already has basic type of %s",
2016 sym->ns->proc_name->name, where, gfc_basic_typename (type));
2017 else
2018 gfc_error ("Symbol %qs at %L already has basic type of %s", sym->name,
2019 where, gfc_basic_typename (type));
2020 return false;
2021 }
2022
2023 if (sym->attr.procedure && sym->ts.interface)
2024 {
2025 gfc_error ("Procedure %qs at %L may not have basic type of %s",
2026 sym->name, where, gfc_basic_typename (ts->type));
2027 return false;
2028 }
2029
2030 flavor = sym->attr.flavor;
2031
2032 if (flavor == FL_PROGRAM || flavor == FL_BLOCK_DATA || flavor == FL_MODULE
2033 || flavor == FL_LABEL
2034 || (flavor == FL_PROCEDURE && sym->attr.subroutine)
2035 || flavor == FL_DERIVED || flavor == FL_NAMELIST)
2036 {
2037 gfc_error ("Symbol %qs at %L cannot have a type",
2038 sym->ns->proc_name ? sym->ns->proc_name->name : sym->name,
2039 where);
2040 return false;
2041 }
2042
2043 sym->ts = *ts;
2044 return true;
2045}
2046
2047
2048/* Clears all attributes. */
2049
2050void
2051gfc_clear_attr (symbol_attribute *attr)
2052{
2053 memset (s: attr, c: 0, n: sizeof (symbol_attribute));
2054}
2055
2056
2057/* Check for missing attributes in the new symbol. Currently does
2058 nothing, but it's not clear that it is unnecessary yet. */
2059
2060bool
2061gfc_missing_attr (symbol_attribute *attr ATTRIBUTE_UNUSED,
2062 locus *where ATTRIBUTE_UNUSED)
2063{
2064
2065 return true;
2066}
2067
2068
2069/* Copy an attribute to a symbol attribute, bit by bit. Some
2070 attributes have a lot of side-effects but cannot be present given
2071 where we are called from, so we ignore some bits. */
2072
2073bool
2074gfc_copy_attr (symbol_attribute *dest, symbol_attribute *src, locus *where)
2075{
2076 int is_proc_lang_bind_spec;
2077
2078 /* In line with the other attributes, we only add bits but do not remove
2079 them; cf. also PR 41034. */
2080 dest->ext_attr |= src->ext_attr;
2081
2082 if (src->allocatable && !gfc_add_allocatable (attr: dest, where))
2083 goto fail;
2084
2085 if (src->automatic && !gfc_add_automatic (attr: dest, NULL, where))
2086 goto fail;
2087 if (src->dimension && !gfc_add_dimension (attr: dest, NULL, where))
2088 goto fail;
2089 if (src->codimension && !gfc_add_codimension (attr: dest, NULL, where))
2090 goto fail;
2091 if (src->contiguous && !gfc_add_contiguous (attr: dest, NULL, where))
2092 goto fail;
2093 if (src->optional && !gfc_add_optional (attr: dest, where))
2094 goto fail;
2095 if (src->pointer && !gfc_add_pointer (attr: dest, where))
2096 goto fail;
2097 if (src->is_protected && !gfc_add_protected (attr: dest, NULL, where))
2098 goto fail;
2099 if (src->save && !gfc_add_save (attr: dest, s: src->save, NULL, where))
2100 goto fail;
2101 if (src->value && !gfc_add_value (attr: dest, NULL, where))
2102 goto fail;
2103 if (src->volatile_ && !gfc_add_volatile (attr: dest, NULL, where))
2104 goto fail;
2105 if (src->asynchronous && !gfc_add_asynchronous (attr: dest, NULL, where))
2106 goto fail;
2107 if (src->threadprivate
2108 && !gfc_add_threadprivate (attr: dest, NULL, where))
2109 goto fail;
2110 if (src->omp_declare_target
2111 && !gfc_add_omp_declare_target (attr: dest, NULL, where))
2112 goto fail;
2113 if (src->omp_declare_target_link
2114 && !gfc_add_omp_declare_target_link (attr: dest, NULL, where))
2115 goto fail;
2116 if (src->oacc_declare_create
2117 && !gfc_add_oacc_declare_create (attr: dest, NULL, where))
2118 goto fail;
2119 if (src->oacc_declare_copyin
2120 && !gfc_add_oacc_declare_copyin (attr: dest, NULL, where))
2121 goto fail;
2122 if (src->oacc_declare_deviceptr
2123 && !gfc_add_oacc_declare_deviceptr (attr: dest, NULL, where))
2124 goto fail;
2125 if (src->oacc_declare_device_resident
2126 && !gfc_add_oacc_declare_device_resident (attr: dest, NULL, where))
2127 goto fail;
2128 if (src->target && !gfc_add_target (attr: dest, where))
2129 goto fail;
2130 if (src->dummy && !gfc_add_dummy (attr: dest, NULL, where))
2131 goto fail;
2132 if (src->result && !gfc_add_result (attr: dest, NULL, where))
2133 goto fail;
2134 if (src->entry)
2135 dest->entry = 1;
2136
2137 if (src->in_namelist && !gfc_add_in_namelist (attr: dest, NULL, where))
2138 goto fail;
2139
2140 if (src->in_common && !gfc_add_in_common (attr: dest, NULL, where))
2141 goto fail;
2142
2143 if (src->generic && !gfc_add_generic (attr: dest, NULL, where))
2144 goto fail;
2145 if (src->function && !gfc_add_function (attr: dest, NULL, where))
2146 goto fail;
2147 if (src->subroutine && !gfc_add_subroutine (attr: dest, NULL, where))
2148 goto fail;
2149
2150 if (src->sequence && !gfc_add_sequence (attr: dest, NULL, where))
2151 goto fail;
2152 if (src->elemental && !gfc_add_elemental (attr: dest, where))
2153 goto fail;
2154 if (src->pure && !gfc_add_pure (attr: dest, where))
2155 goto fail;
2156 if (src->recursive && !gfc_add_recursive (attr: dest, where))
2157 goto fail;
2158
2159 if (src->flavor != FL_UNKNOWN
2160 && !gfc_add_flavor (attr: dest, f: src->flavor, NULL, where))
2161 goto fail;
2162
2163 if (src->intent != INTENT_UNKNOWN
2164 && !gfc_add_intent (attr: dest, intent: src->intent, where))
2165 goto fail;
2166
2167 if (src->access != ACCESS_UNKNOWN
2168 && !gfc_add_access (attr: dest, access: src->access, NULL, where))
2169 goto fail;
2170
2171 if (!gfc_missing_attr (attr: dest, where))
2172 goto fail;
2173
2174 if (src->cray_pointer && !gfc_add_cray_pointer (attr: dest, where))
2175 goto fail;
2176 if (src->cray_pointee && !gfc_add_cray_pointee (attr: dest, where))
2177 goto fail;
2178
2179 is_proc_lang_bind_spec = (src->flavor == FL_PROCEDURE ? 1 : 0);
2180 if (src->is_bind_c
2181 && !gfc_add_is_bind_c (attr: dest, NULL, where, is_proc_lang_bind_spec))
2182 return false;
2183
2184 if (src->is_c_interop)
2185 dest->is_c_interop = 1;
2186 if (src->is_iso_c)
2187 dest->is_iso_c = 1;
2188
2189 if (src->external && !gfc_add_external (attr: dest, where))
2190 goto fail;
2191 if (src->intrinsic && !gfc_add_intrinsic (attr: dest, where))
2192 goto fail;
2193 if (src->proc_pointer)
2194 dest->proc_pointer = 1;
2195
2196 return true;
2197
2198fail:
2199 return false;
2200}
2201
2202
2203/* A function to generate a dummy argument symbol using that from the
2204 interface declaration. Can be used for the result symbol as well if
2205 the flag is set. */
2206
2207int
2208gfc_copy_dummy_sym (gfc_symbol **dsym, gfc_symbol *sym, int result)
2209{
2210 int rc;
2211
2212 rc = gfc_get_symbol (sym->name, NULL, dsym);
2213 if (rc)
2214 return rc;
2215
2216 if (!gfc_add_type (sym: *dsym, ts: &(sym->ts), where: &gfc_current_locus))
2217 return 1;
2218
2219 if (!gfc_copy_attr (dest: &(*dsym)->attr, src: &(sym->attr),
2220 where: &gfc_current_locus))
2221 return 1;
2222
2223 if ((*dsym)->attr.dimension)
2224 (*dsym)->as = gfc_copy_array_spec (sym->as);
2225
2226 (*dsym)->attr.class_ok = sym->attr.class_ok;
2227
2228 if ((*dsym) != NULL && !result
2229 && (!gfc_add_dummy(attr: &(*dsym)->attr, name: (*dsym)->name, NULL)
2230 || !gfc_missing_attr (attr: &(*dsym)->attr, NULL)))
2231 return 1;
2232 else if ((*dsym) != NULL && result
2233 && (!gfc_add_result(attr: &(*dsym)->attr, name: (*dsym)->name, NULL)
2234 || !gfc_missing_attr (attr: &(*dsym)->attr, NULL)))
2235 return 1;
2236
2237 return 0;
2238}
2239
2240
2241/************** Component name management ************/
2242
2243/* Component names of a derived type form their own little namespaces
2244 that are separate from all other spaces. The space is composed of
2245 a singly linked list of gfc_component structures whose head is
2246 located in the parent symbol. */
2247
2248
2249/* Add a component name to a symbol. The call fails if the name is
2250 already present. On success, the component pointer is modified to
2251 point to the additional component structure. */
2252
2253bool
2254gfc_add_component (gfc_symbol *sym, const char *name,
2255 gfc_component **component)
2256{
2257 gfc_component *p, *tail;
2258
2259 /* Check for existing components with the same name, but not for union
2260 components or containers. Unions and maps are anonymous so they have
2261 unique internal names which will never conflict.
2262 Don't use gfc_find_component here because it calls gfc_use_derived,
2263 but the derived type may not be fully defined yet. */
2264 tail = NULL;
2265
2266 for (p = sym->components; p; p = p->next)
2267 {
2268 if (strcmp (s1: p->name, s2: name) == 0)
2269 {
2270 gfc_error ("Component %qs at %C already declared at %L",
2271 name, &p->loc);
2272 return false;
2273 }
2274
2275 tail = p;
2276 }
2277
2278 if (sym->attr.extension
2279 && gfc_find_component (sym->components->ts.u.derived,
2280 name, true, true, NULL))
2281 {
2282 gfc_error ("Component %qs at %C already in the parent type "
2283 "at %L", name, &sym->components->ts.u.derived->declared_at);
2284 return false;
2285 }
2286
2287 /* Allocate a new component. */
2288 p = gfc_get_component ();
2289
2290 if (tail == NULL)
2291 sym->components = p;
2292 else
2293 tail->next = p;
2294
2295 p->name = gfc_get_string ("%s", name);
2296 p->loc = gfc_current_locus;
2297 p->ts.type = BT_UNKNOWN;
2298
2299 *component = p;
2300 return true;
2301}
2302
2303
2304/* Recursive function to switch derived types of all symbol in a
2305 namespace. */
2306
2307static void
2308switch_types (gfc_symtree *st, gfc_symbol *from, gfc_symbol *to)
2309{
2310 gfc_symbol *sym;
2311
2312 if (st == NULL)
2313 return;
2314
2315 sym = st->n.sym;
2316 if (sym->ts.type == BT_DERIVED && sym->ts.u.derived == from)
2317 sym->ts.u.derived = to;
2318
2319 switch_types (st: st->left, from, to);
2320 switch_types (st: st->right, from, to);
2321}
2322
2323
2324/* This subroutine is called when a derived type is used in order to
2325 make the final determination about which version to use. The
2326 standard requires that a type be defined before it is 'used', but
2327 such types can appear in IMPLICIT statements before the actual
2328 definition. 'Using' in this context means declaring a variable to
2329 be that type or using the type constructor.
2330
2331 If a type is used and the components haven't been defined, then we
2332 have to have a derived type in a parent unit. We find the node in
2333 the other namespace and point the symtree node in this namespace to
2334 that node. Further reference to this name point to the correct
2335 node. If we can't find the node in a parent namespace, then we have
2336 an error.
2337
2338 This subroutine takes a pointer to a symbol node and returns a
2339 pointer to the translated node or NULL for an error. Usually there
2340 is no translation and we return the node we were passed. */
2341
2342gfc_symbol *
2343gfc_use_derived (gfc_symbol *sym)
2344{
2345 gfc_symbol *s;
2346 gfc_typespec *t;
2347 gfc_symtree *st;
2348 int i;
2349
2350 if (!sym)
2351 return NULL;
2352
2353 if (sym->attr.unlimited_polymorphic)
2354 return sym;
2355
2356 if (sym->attr.generic)
2357 sym = gfc_find_dt_in_generic (sym);
2358
2359 if (sym->components != NULL || sym->attr.zero_comp)
2360 return sym; /* Already defined. */
2361
2362 if (sym->ns->parent == NULL)
2363 goto bad;
2364
2365 if (gfc_find_symbol (sym->name, sym->ns->parent, 1, &s))
2366 {
2367 gfc_error ("Symbol %qs at %C is ambiguous", sym->name);
2368 return NULL;
2369 }
2370
2371 if (s == NULL || !gfc_fl_struct (s->attr.flavor))
2372 goto bad;
2373
2374 /* Get rid of symbol sym, translating all references to s. */
2375 for (i = 0; i < GFC_LETTERS; i++)
2376 {
2377 t = &sym->ns->default_type[i];
2378 if (t->u.derived == sym)
2379 t->u.derived = s;
2380 }
2381
2382 st = gfc_find_symtree (sym->ns->sym_root, sym->name);
2383 st->n.sym = s;
2384
2385 s->refs++;
2386
2387 /* Unlink from list of modified symbols. */
2388 gfc_commit_symbol (sym);
2389
2390 switch_types (st: sym->ns->sym_root, from: sym, to: s);
2391
2392 /* TODO: Also have to replace sym -> s in other lists like
2393 namelists, common lists and interface lists. */
2394 gfc_free_symbol (sym);
2395
2396 return s;
2397
2398bad:
2399 gfc_error ("Derived type %qs at %C is being used before it is defined",
2400 sym->name);
2401 return NULL;
2402}
2403
2404
2405/* Find the component with the given name in the union type symbol.
2406 If ref is not NULL it will be set to the chain of components through which
2407 the component can actually be accessed. This is necessary for unions because
2408 intermediate structures may be maps, nested structures, or other unions,
2409 all of which may (or must) be 'anonymous' to user code. */
2410
2411static gfc_component *
2412find_union_component (gfc_symbol *un, const char *name,
2413 bool noaccess, gfc_ref **ref)
2414{
2415 gfc_component *m, *check;
2416 gfc_ref *sref, *tmp;
2417
2418 for (m = un->components; m; m = m->next)
2419 {
2420 check = gfc_find_component (m->ts.u.derived, name, noaccess, true, &tmp);
2421 if (check == NULL)
2422 continue;
2423
2424 /* Found component somewhere in m; chain the refs together. */
2425 if (ref)
2426 {
2427 /* Map ref. */
2428 sref = gfc_get_ref ();
2429 sref->type = REF_COMPONENT;
2430 sref->u.c.component = m;
2431 sref->u.c.sym = m->ts.u.derived;
2432 sref->next = tmp;
2433
2434 *ref = sref;
2435 }
2436 /* Other checks (such as access) were done in the recursive calls. */
2437 return check;
2438 }
2439 return NULL;
2440}
2441
2442
2443/* Recursively append candidate COMPONENT structures to CANDIDATES. Store
2444 the number of total candidates in CANDIDATES_LEN. */
2445
2446static void
2447lookup_component_fuzzy_find_candidates (gfc_component *component,
2448 char **&candidates,
2449 size_t &candidates_len)
2450{
2451 for (gfc_component *p = component; p; p = p->next)
2452 vec_push (optr&: candidates, osz&: candidates_len, elt: p->name);
2453}
2454
2455
2456/* Lookup component MEMBER fuzzily, taking names in COMPONENT into account. */
2457
2458static const char*
2459lookup_component_fuzzy (const char *member, gfc_component *component)
2460{
2461 char **candidates = NULL;
2462 size_t candidates_len = 0;
2463 lookup_component_fuzzy_find_candidates (component, candidates,
2464 candidates_len);
2465 return gfc_closest_fuzzy_match (member, candidates);
2466}
2467
2468
2469/* Given a derived type node and a component name, try to locate the
2470 component structure. Returns the NULL pointer if the component is
2471 not found or the components are private. If noaccess is set, no access
2472 checks are done. If silent is set, an error will not be generated if
2473 the component cannot be found or accessed.
2474
2475 If ref is not NULL, *ref is set to represent the chain of components
2476 required to get to the ultimate component.
2477
2478 If the component is simply a direct subcomponent, or is inherited from a
2479 parent derived type in the given derived type, this is a single ref with its
2480 component set to the returned component.
2481
2482 Otherwise, *ref is constructed as a chain of subcomponents. This occurs
2483 when the component is found through an implicit chain of nested union and
2484 map components. Unions and maps are "anonymous" substructures in FORTRAN
2485 which cannot be explicitly referenced, but the reference chain must be
2486 considered as in C for backend translation to correctly compute layouts.
2487 (For example, x.a may refer to x->(UNION)->(MAP)->(UNION)->(MAP)->a). */
2488
2489gfc_component *
2490gfc_find_component (gfc_symbol *sym, const char *name,
2491 bool noaccess, bool silent, gfc_ref **ref)
2492{
2493 gfc_component *p, *check;
2494 gfc_ref *sref = NULL, *tmp = NULL;
2495
2496 if (name == NULL || sym == NULL)
2497 return NULL;
2498
2499 if (sym->attr.flavor == FL_DERIVED)
2500 sym = gfc_use_derived (sym);
2501 else
2502 gcc_assert (gfc_fl_struct (sym->attr.flavor));
2503
2504 if (sym == NULL)
2505 return NULL;
2506
2507 /* Handle UNIONs specially - mutually recursive with gfc_find_component. */
2508 if (sym->attr.flavor == FL_UNION)
2509 return find_union_component (un: sym, name, noaccess, ref);
2510
2511 if (ref) *ref = NULL;
2512 for (p = sym->components; p; p = p->next)
2513 {
2514 /* Nest search into union's maps. */
2515 if (p->ts.type == BT_UNION)
2516 {
2517 check = find_union_component (un: p->ts.u.derived, name, noaccess, ref: &tmp);
2518 if (check != NULL)
2519 {
2520 /* Union ref. */
2521 if (ref)
2522 {
2523 sref = gfc_get_ref ();
2524 sref->type = REF_COMPONENT;
2525 sref->u.c.component = p;
2526 sref->u.c.sym = p->ts.u.derived;
2527 sref->next = tmp;
2528 *ref = sref;
2529 }
2530 return check;
2531 }
2532 }
2533 else if (strcmp (s1: p->name, s2: name) == 0)
2534 break;
2535
2536 continue;
2537 }
2538
2539 if (p && sym->attr.use_assoc && !noaccess)
2540 {
2541 bool is_parent_comp = sym->attr.extension && (p == sym->components);
2542 if (p->attr.access == ACCESS_PRIVATE ||
2543 (p->attr.access != ACCESS_PUBLIC
2544 && sym->component_access == ACCESS_PRIVATE
2545 && !is_parent_comp))
2546 {
2547 if (!silent)
2548 gfc_error ("Component %qs at %C is a PRIVATE component of %qs",
2549 name, sym->name);
2550 return NULL;
2551 }
2552 }
2553
2554 if (p == NULL
2555 && sym->attr.extension
2556 && sym->components->ts.type == BT_DERIVED)
2557 {
2558 p = gfc_find_component (sym: sym->components->ts.u.derived, name,
2559 noaccess, silent, ref);
2560 /* Do not overwrite the error. */
2561 if (p == NULL)
2562 return p;
2563 }
2564
2565 if (p == NULL && !silent)
2566 {
2567 const char *guessed = lookup_component_fuzzy (member: name, component: sym->components);
2568 if (guessed)
2569 gfc_error ("%qs at %C is not a member of the %qs structure"
2570 "; did you mean %qs?",
2571 name, sym->name, guessed);
2572 else
2573 gfc_error ("%qs at %C is not a member of the %qs structure",
2574 name, sym->name);
2575 }
2576
2577 /* Component was found; build the ultimate component reference. */
2578 if (p != NULL && ref)
2579 {
2580 tmp = gfc_get_ref ();
2581 tmp->type = REF_COMPONENT;
2582 tmp->u.c.component = p;
2583 tmp->u.c.sym = sym;
2584 /* Link the final component ref to the end of the chain of subrefs. */
2585 if (sref)
2586 {
2587 *ref = sref;
2588 for (; sref->next; sref = sref->next)
2589 ;
2590 sref->next = tmp;
2591 }
2592 else
2593 *ref = tmp;
2594 }
2595
2596 return p;
2597}
2598
2599
2600/* Given a symbol, free all of the component structures and everything
2601 they point to. */
2602
2603static void
2604free_components (gfc_component *p)
2605{
2606 gfc_component *q;
2607
2608 for (; p; p = q)
2609 {
2610 q = p->next;
2611
2612 gfc_free_array_spec (p->as);
2613 gfc_free_expr (p->initializer);
2614 if (p->kind_expr)
2615 gfc_free_expr (p->kind_expr);
2616 if (p->param_list)
2617 gfc_free_actual_arglist (p->param_list);
2618 free (ptr: p->tb);
2619 p->tb = NULL;
2620 free (ptr: p);
2621 }
2622}
2623
2624
2625/******************** Statement label management ********************/
2626
2627/* Comparison function for statement labels, used for managing the
2628 binary tree. */
2629
2630static int
2631compare_st_labels (void *a1, void *b1)
2632{
2633 int a = ((gfc_st_label *) a1)->value;
2634 int b = ((gfc_st_label *) b1)->value;
2635
2636 return (b - a);
2637}
2638
2639
2640/* Free a single gfc_st_label structure, making sure the tree is not
2641 messed up. This function is called only when some parse error
2642 occurs. */
2643
2644void
2645gfc_free_st_label (gfc_st_label *label)
2646{
2647
2648 if (label == NULL)
2649 return;
2650
2651 gfc_delete_bbt (&label->ns->st_labels, label, compare_st_labels);
2652
2653 if (label->format != NULL)
2654 gfc_free_expr (label->format);
2655
2656 free (ptr: label);
2657}
2658
2659
2660/* Free a whole tree of gfc_st_label structures. */
2661
2662static void
2663free_st_labels (gfc_st_label *label)
2664{
2665
2666 if (label == NULL)
2667 return;
2668
2669 free_st_labels (label: label->left);
2670 free_st_labels (label: label->right);
2671
2672 if (label->format != NULL)
2673 gfc_free_expr (label->format);
2674 free (ptr: label);
2675}
2676
2677
2678/* Given a label number, search for and return a pointer to the label
2679 structure, creating it if it does not exist. */
2680
2681gfc_st_label *
2682gfc_get_st_label (int labelno)
2683{
2684 gfc_st_label *lp;
2685 gfc_namespace *ns;
2686
2687 if (gfc_current_state () == COMP_DERIVED)
2688 ns = gfc_current_block ()->f2k_derived;
2689 else
2690 {
2691 /* Find the namespace of the scoping unit:
2692 If we're in a BLOCK construct, jump to the parent namespace. */
2693 ns = gfc_current_ns;
2694 while (ns->proc_name && ns->proc_name->attr.flavor == FL_LABEL)
2695 ns = ns->parent;
2696 }
2697
2698 /* First see if the label is already in this namespace. */
2699 lp = ns->st_labels;
2700 while (lp)
2701 {
2702 if (lp->value == labelno)
2703 return lp;
2704
2705 if (lp->value < labelno)
2706 lp = lp->left;
2707 else
2708 lp = lp->right;
2709 }
2710
2711 lp = XCNEW (gfc_st_label);
2712
2713 lp->value = labelno;
2714 lp->defined = ST_LABEL_UNKNOWN;
2715 lp->referenced = ST_LABEL_UNKNOWN;
2716 lp->ns = ns;
2717
2718 gfc_insert_bbt (&ns->st_labels, lp, compare_st_labels);
2719
2720 return lp;
2721}
2722
2723
2724/* Called when a statement with a statement label is about to be
2725 accepted. We add the label to the list of the current namespace,
2726 making sure it hasn't been defined previously and referenced
2727 correctly. */
2728
2729void
2730gfc_define_st_label (gfc_st_label *lp, gfc_sl_type type, locus *label_locus)
2731{
2732 int labelno;
2733
2734 labelno = lp->value;
2735
2736 if (lp->defined != ST_LABEL_UNKNOWN)
2737 gfc_error ("Duplicate statement label %d at %L and %L", labelno,
2738 &lp->where, label_locus);
2739 else
2740 {
2741 lp->where = *label_locus;
2742
2743 switch (type)
2744 {
2745 case ST_LABEL_FORMAT:
2746 if (lp->referenced == ST_LABEL_TARGET
2747 || lp->referenced == ST_LABEL_DO_TARGET)
2748 gfc_error ("Label %d at %C already referenced as branch target",
2749 labelno);
2750 else
2751 lp->defined = ST_LABEL_FORMAT;
2752
2753 break;
2754
2755 case ST_LABEL_TARGET:
2756 case ST_LABEL_DO_TARGET:
2757 if (lp->referenced == ST_LABEL_FORMAT)
2758 gfc_error ("Label %d at %C already referenced as a format label",
2759 labelno);
2760 else
2761 lp->defined = type;
2762
2763 if (lp->referenced == ST_LABEL_DO_TARGET && type != ST_LABEL_DO_TARGET
2764 && !gfc_notify_std (GFC_STD_F95_OBS | GFC_STD_F2018_DEL,
2765 "DO termination statement which is not END DO"
2766 " or CONTINUE with label %d at %C", labelno))
2767 return;
2768 break;
2769
2770 default:
2771 lp->defined = ST_LABEL_BAD_TARGET;
2772 lp->referenced = ST_LABEL_BAD_TARGET;
2773 }
2774 }
2775}
2776
2777
2778/* Reference a label. Given a label and its type, see if that
2779 reference is consistent with what is known about that label,
2780 updating the unknown state. Returns false if something goes
2781 wrong. */
2782
2783bool
2784gfc_reference_st_label (gfc_st_label *lp, gfc_sl_type type)
2785{
2786 gfc_sl_type label_type;
2787 int labelno;
2788 bool rc;
2789
2790 if (lp == NULL)
2791 return true;
2792
2793 labelno = lp->value;
2794
2795 if (lp->defined != ST_LABEL_UNKNOWN)
2796 label_type = lp->defined;
2797 else
2798 {
2799 label_type = lp->referenced;
2800 lp->where = gfc_current_locus;
2801 }
2802
2803 if (label_type == ST_LABEL_FORMAT
2804 && (type == ST_LABEL_TARGET || type == ST_LABEL_DO_TARGET))
2805 {
2806 gfc_error ("Label %d at %C previously used as a FORMAT label", labelno);
2807 rc = false;
2808 goto done;
2809 }
2810
2811 if ((label_type == ST_LABEL_TARGET || label_type == ST_LABEL_DO_TARGET
2812 || label_type == ST_LABEL_BAD_TARGET)
2813 && type == ST_LABEL_FORMAT)
2814 {
2815 gfc_error ("Label %d at %C previously used as branch target", labelno);
2816 rc = false;
2817 goto done;
2818 }
2819
2820 if (lp->referenced == ST_LABEL_DO_TARGET && type == ST_LABEL_DO_TARGET
2821 && !gfc_notify_std (GFC_STD_F95_OBS | GFC_STD_F2018_DEL,
2822 "Shared DO termination label %d at %C", labelno))
2823 return false;
2824
2825 if (type == ST_LABEL_DO_TARGET
2826 && !gfc_notify_std (GFC_STD_F2018_OBS, "Labeled DO statement "
2827 "at %L", &gfc_current_locus))
2828 return false;
2829
2830 if (lp->referenced != ST_LABEL_DO_TARGET)
2831 lp->referenced = type;
2832 rc = true;
2833
2834done:
2835 return rc;
2836}
2837
2838
2839/************** Symbol table management subroutines ****************/
2840
2841/* Basic details: Fortran 95 requires a potentially unlimited number
2842 of distinct namespaces when compiling a program unit. This case
2843 occurs during a compilation of internal subprograms because all of
2844 the internal subprograms must be read before we can start
2845 generating code for the host.
2846
2847 Given the tricky nature of the Fortran grammar, we must be able to
2848 undo changes made to a symbol table if the current interpretation
2849 of a statement is found to be incorrect. Whenever a symbol is
2850 looked up, we make a copy of it and link to it. All of these
2851 symbols are kept in a vector so that we can commit or
2852 undo the changes at a later time.
2853
2854 A symtree may point to a symbol node outside of its namespace. In
2855 this case, that symbol has been used as a host associated variable
2856 at some previous time. */
2857
2858/* Allocate a new namespace structure. Copies the implicit types from
2859 PARENT if PARENT_TYPES is set. */
2860
2861gfc_namespace *
2862gfc_get_namespace (gfc_namespace *parent, int parent_types)
2863{
2864 gfc_namespace *ns;
2865 gfc_typespec *ts;
2866 int in;
2867 int i;
2868
2869 ns = XCNEW (gfc_namespace);
2870 ns->sym_root = NULL;
2871 ns->uop_root = NULL;
2872 ns->tb_sym_root = NULL;
2873 ns->finalizers = NULL;
2874 ns->default_access = ACCESS_UNKNOWN;
2875 ns->parent = parent;
2876
2877 for (in = GFC_INTRINSIC_BEGIN; in != GFC_INTRINSIC_END; in++)
2878 {
2879 ns->operator_access[in] = ACCESS_UNKNOWN;
2880 ns->tb_op[in] = NULL;
2881 }
2882
2883 /* Initialize default implicit types. */
2884 for (i = 'a'; i <= 'z'; i++)
2885 {
2886 ns->set_flag[i - 'a'] = 0;
2887 ts = &ns->default_type[i - 'a'];
2888
2889 if (parent_types && ns->parent != NULL)
2890 {
2891 /* Copy parent settings. */
2892 *ts = ns->parent->default_type[i - 'a'];
2893 continue;
2894 }
2895
2896 if (flag_implicit_none != 0)
2897 {
2898 gfc_clear_ts (ts);
2899 continue;
2900 }
2901
2902 if ('i' <= i && i <= 'n')
2903 {
2904 ts->type = BT_INTEGER;
2905 ts->kind = gfc_default_integer_kind;
2906 }
2907 else
2908 {
2909 ts->type = BT_REAL;
2910 ts->kind = gfc_default_real_kind;
2911 }
2912 }
2913
2914 ns->refs = 1;
2915
2916 return ns;
2917}
2918
2919
2920/* Comparison function for symtree nodes. */
2921
2922static int
2923compare_symtree (void *_st1, void *_st2)
2924{
2925 gfc_symtree *st1, *st2;
2926
2927 st1 = (gfc_symtree *) _st1;
2928 st2 = (gfc_symtree *) _st2;
2929
2930 return strcmp (s1: st1->name, s2: st2->name);
2931}
2932
2933
2934/* Allocate a new symtree node and associate it with the new symbol. */
2935
2936gfc_symtree *
2937gfc_new_symtree (gfc_symtree **root, const char *name)
2938{
2939 gfc_symtree *st;
2940
2941 st = XCNEW (gfc_symtree);
2942 st->name = gfc_get_string ("%s", name);
2943
2944 gfc_insert_bbt (root, st, compare_symtree);
2945 return st;
2946}
2947
2948
2949/* Delete a symbol from the tree. Does not free the symbol itself! */
2950
2951static void
2952gfc_delete_symtree (gfc_symtree **root, const char *name)
2953{
2954 gfc_symtree st, *st0;
2955 const char *p;
2956
2957 /* Submodules are marked as mod.submod. When freeing a submodule
2958 symbol, the symtree only has "submod", so adjust that here. */
2959
2960 p = strrchr(s: name, c: '.');
2961 if (p)
2962 p++;
2963 else
2964 p = name;
2965
2966 st.name = gfc_get_string ("%s", p);
2967 st0 = (gfc_symtree *) gfc_delete_bbt (root, &st, compare_symtree);
2968
2969 free (ptr: st0);
2970}
2971
2972
2973/* Given a root symtree node and a name, try to find the symbol within
2974 the namespace. Returns NULL if the symbol is not found. */
2975
2976gfc_symtree *
2977gfc_find_symtree (gfc_symtree *st, const char *name)
2978{
2979 int c;
2980
2981 while (st != NULL)
2982 {
2983 c = strcmp (s1: name, s2: st->name);
2984 if (c == 0)
2985 return st;
2986
2987 st = (c < 0) ? st->left : st->right;
2988 }
2989
2990 return NULL;
2991}
2992
2993
2994/* Return a symtree node with a name that is guaranteed to be unique
2995 within the namespace and corresponds to an illegal fortran name. */
2996
2997gfc_symtree *
2998gfc_get_unique_symtree (gfc_namespace *ns)
2999{
3000 char name[GFC_MAX_SYMBOL_LEN + 1];
3001 static int serial = 0;
3002
3003 sprintf (s: name, format: "@%d", serial++);
3004 return gfc_new_symtree (root: &ns->sym_root, name);
3005}
3006
3007
3008/* Given a name find a user operator node, creating it if it doesn't
3009 exist. These are much simpler than symbols because they can't be
3010 ambiguous with one another. */
3011
3012gfc_user_op *
3013gfc_get_uop (const char *name)
3014{
3015 gfc_user_op *uop;
3016 gfc_symtree *st;
3017 gfc_namespace *ns = gfc_current_ns;
3018
3019 if (ns->omp_udr_ns)
3020 ns = ns->parent;
3021 st = gfc_find_symtree (st: ns->uop_root, name);
3022 if (st != NULL)
3023 return st->n.uop;
3024
3025 st = gfc_new_symtree (root: &ns->uop_root, name);
3026
3027 uop = st->n.uop = XCNEW (gfc_user_op);
3028 uop->name = gfc_get_string ("%s", name);
3029 uop->access = ACCESS_UNKNOWN;
3030 uop->ns = ns;
3031
3032 return uop;
3033}
3034
3035
3036/* Given a name find the user operator node. Returns NULL if it does
3037 not exist. */
3038
3039gfc_user_op *
3040gfc_find_uop (const char *name, gfc_namespace *ns)
3041{
3042 gfc_symtree *st;
3043
3044 if (ns == NULL)
3045 ns = gfc_current_ns;
3046
3047 st = gfc_find_symtree (st: ns->uop_root, name);
3048 return (st == NULL) ? NULL : st->n.uop;
3049}
3050
3051
3052/* Update a symbol's common_block field, and take care of the associated
3053 memory management. */
3054
3055static void
3056set_symbol_common_block (gfc_symbol *sym, gfc_common_head *common_block)
3057{
3058 if (sym->common_block == common_block)
3059 return;
3060
3061 if (sym->common_block && sym->common_block->name[0] != '\0')
3062 {
3063 sym->common_block->refs--;
3064 if (sym->common_block->refs == 0)
3065 free (ptr: sym->common_block);
3066 }
3067 sym->common_block = common_block;
3068}
3069
3070
3071/* Remove a gfc_symbol structure and everything it points to. */
3072
3073void
3074gfc_free_symbol (gfc_symbol *&sym)
3075{
3076
3077 if (sym == NULL)
3078 return;
3079
3080 gfc_free_array_spec (sym->as);
3081
3082 free_components (p: sym->components);
3083
3084 gfc_free_expr (sym->value);
3085
3086 gfc_free_namelist (sym->namelist);
3087
3088 if (sym->ns != sym->formal_ns)
3089 gfc_free_namespace (sym->formal_ns);
3090
3091 if (!sym->attr.generic_copy)
3092 gfc_free_interface (sym->generic);
3093
3094 gfc_free_formal_arglist (sym->formal);
3095
3096 gfc_free_namespace (sym->f2k_derived);
3097
3098 set_symbol_common_block (sym, NULL);
3099
3100 if (sym->param_list)
3101 gfc_free_actual_arglist (sym->param_list);
3102
3103 free (ptr: sym);
3104 sym = NULL;
3105}
3106
3107
3108/* Decrease the reference counter and free memory when we reach zero.
3109 Returns true if the symbol has been freed, false otherwise. */
3110
3111bool
3112gfc_release_symbol (gfc_symbol *&sym)
3113{
3114 if (sym == NULL)
3115 return false;
3116
3117 if (sym->formal_ns != NULL && sym->refs == 2 && sym->formal_ns != sym->ns
3118 && (!sym->attr.entry || !sym->module))
3119 {
3120 /* As formal_ns contains a reference to sym, delete formal_ns just
3121 before the deletion of sym. */
3122 gfc_namespace *ns = sym->formal_ns;
3123 sym->formal_ns = NULL;
3124 gfc_free_namespace (ns);
3125 }
3126
3127 sym->refs--;
3128 if (sym->refs > 0)
3129 return false;
3130
3131 gcc_assert (sym->refs == 0);
3132 gfc_free_symbol (sym);
3133 return true;
3134}
3135
3136
3137/* Allocate and initialize a new symbol node. */
3138
3139gfc_symbol *
3140gfc_new_symbol (const char *name, gfc_namespace *ns)
3141{
3142 gfc_symbol *p;
3143
3144 p = XCNEW (gfc_symbol);
3145
3146 gfc_clear_ts (&p->ts);
3147 gfc_clear_attr (attr: &p->attr);
3148 p->ns = ns;
3149 p->declared_at = gfc_current_locus;
3150 p->name = gfc_get_string ("%s", name);
3151
3152 return p;
3153}
3154
3155
3156/* Generate an error if a symbol is ambiguous, and set the error flag
3157 on it. */
3158
3159static void
3160ambiguous_symbol (const char *name, gfc_symtree *st)
3161{
3162
3163 if (st->n.sym->error)
3164 return;
3165
3166 if (st->n.sym->module)
3167 gfc_error ("Name %qs at %C is an ambiguous reference to %qs "
3168 "from module %qs", name, st->n.sym->name, st->n.sym->module);
3169 else
3170 gfc_error ("Name %qs at %C is an ambiguous reference to %qs "
3171 "from current program unit", name, st->n.sym->name);
3172
3173 st->n.sym->error = 1;
3174}
3175
3176
3177/* If we're in a SELECT TYPE block, check if the variable 'st' matches any
3178 selector on the stack. If yes, replace it by the corresponding temporary. */
3179
3180static void
3181select_type_insert_tmp (gfc_symtree **st)
3182{
3183 gfc_select_type_stack *stack = select_type_stack;
3184 for (; stack; stack = stack->prev)
3185 if ((*st)->n.sym == stack->selector && stack->tmp)
3186 {
3187 *st = stack->tmp;
3188 select_type_insert_tmp (st);
3189 return;
3190 }
3191}
3192
3193
3194/* Look for a symtree in the current procedure -- that is, go up to
3195 parent namespaces but only if inside a BLOCK. Returns NULL if not found. */
3196
3197gfc_symtree*
3198gfc_find_symtree_in_proc (const char* name, gfc_namespace* ns)
3199{
3200 while (ns)
3201 {
3202 gfc_symtree* st = gfc_find_symtree (st: ns->sym_root, name);
3203 if (st)
3204 return st;
3205
3206 if (!ns->construct_entities)
3207 break;
3208 ns = ns->parent;
3209 }
3210
3211 return NULL;
3212}
3213
3214
3215/* Search for a symtree starting in the current namespace, resorting to
3216 any parent namespaces if requested by a nonzero parent_flag.
3217 Returns true if the name is ambiguous. */
3218
3219bool
3220gfc_find_sym_tree (const char *name, gfc_namespace *ns, int parent_flag,
3221 gfc_symtree **result)
3222{
3223 gfc_symtree *st;
3224
3225 if (ns == NULL)
3226 ns = gfc_current_ns;
3227
3228 do
3229 {
3230 st = gfc_find_symtree (st: ns->sym_root, name);
3231 if (st != NULL)
3232 {
3233 select_type_insert_tmp (st: &st);
3234
3235 *result = st;
3236 /* Ambiguous generic interfaces are permitted, as long
3237 as the specific interfaces are different. */
3238 if (st->ambiguous && !st->n.sym->attr.generic)
3239 {
3240 ambiguous_symbol (name, st);
3241 return true;
3242 }
3243
3244 return false;
3245 }
3246
3247 if (!parent_flag)
3248 break;
3249
3250 /* Don't escape an interface block. */
3251 if (ns && !ns->has_import_set
3252 && ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY)
3253 break;
3254
3255 ns = ns->parent;
3256 }
3257 while (ns != NULL);
3258
3259 if (gfc_current_state() == COMP_DERIVED
3260 && gfc_current_block ()->attr.pdt_template)
3261 {
3262 gfc_symbol *der = gfc_current_block ();
3263 for (; der; der = gfc_get_derived_super_type (der))
3264 {
3265 if (der->f2k_derived && der->f2k_derived->sym_root)
3266 {
3267 st = gfc_find_symtree (st: der->f2k_derived->sym_root, name);
3268 if (st)
3269 break;
3270 }
3271 }
3272 *result = st;
3273 return false;
3274 }
3275
3276 *result = NULL;
3277
3278 return false;
3279}
3280
3281
3282/* Same, but returns the symbol instead. */
3283
3284int
3285gfc_find_symbol (const char *name, gfc_namespace *ns, int parent_flag,
3286 gfc_symbol **result)
3287{
3288 gfc_symtree *st;
3289 int i;
3290
3291 i = gfc_find_sym_tree (name, ns, parent_flag, result: &st);
3292
3293 if (st == NULL)
3294 *result = NULL;
3295 else
3296 *result = st->n.sym;
3297
3298 return i;
3299}
3300
3301
3302/* Tells whether there is only one set of changes in the stack. */
3303
3304static bool
3305single_undo_checkpoint_p (void)
3306{
3307 if (latest_undo_chgset == &default_undo_chgset_var)
3308 {
3309 gcc_assert (latest_undo_chgset->previous == NULL);
3310 return true;
3311 }
3312 else
3313 {
3314 gcc_assert (latest_undo_chgset->previous != NULL);
3315 return false;
3316 }
3317}
3318
3319/* Save symbol with the information necessary to back it out. */
3320
3321void
3322gfc_save_symbol_data (gfc_symbol *sym)
3323{
3324 gfc_symbol *s;
3325 unsigned i;
3326
3327 if (!single_undo_checkpoint_p ())
3328 {
3329 /* If there is more than one change set, look for the symbol in the
3330 current one. If it is found there, we can reuse it. */
3331 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, s)
3332 if (s == sym)
3333 {
3334 gcc_assert (sym->gfc_new || sym->old_symbol != NULL);
3335 return;
3336 }
3337 }
3338 else if (sym->gfc_new || sym->old_symbol != NULL)
3339 return;
3340
3341 s = XCNEW (gfc_symbol);
3342 *s = *sym;
3343 sym->old_symbol = s;
3344 sym->gfc_new = 0;
3345
3346 latest_undo_chgset->syms.safe_push (obj: sym);
3347}
3348
3349
3350/* Given a name, find a symbol, or create it if it does not exist yet
3351 in the current namespace. If the symbol is found we make sure that
3352 it's OK.
3353
3354 The integer return code indicates
3355 0 All OK
3356 1 The symbol name was ambiguous
3357 2 The name meant to be established was already host associated.
3358
3359 So if the return value is nonzero, then an error was issued. */
3360
3361int
3362gfc_get_sym_tree (const char *name, gfc_namespace *ns, gfc_symtree **result,
3363 bool allow_subroutine)
3364{
3365 gfc_symtree *st;
3366 gfc_symbol *p;
3367
3368 /* This doesn't usually happen during resolution. */
3369 if (ns == NULL)
3370 ns = gfc_current_ns;
3371
3372 /* Try to find the symbol in ns. */
3373 st = gfc_find_symtree (st: ns->sym_root, name);
3374
3375 if (st == NULL && ns->omp_udr_ns)
3376 {
3377 ns = ns->parent;
3378 st = gfc_find_symtree (st: ns->sym_root, name);
3379 }
3380
3381 if (st == NULL)
3382 {
3383 /* If not there, create a new symbol. */
3384 p = gfc_new_symbol (name, ns);
3385
3386 /* Add to the list of tentative symbols. */
3387 p->old_symbol = NULL;
3388 p->mark = 1;
3389 p->gfc_new = 1;
3390 latest_undo_chgset->syms.safe_push (obj: p);
3391
3392 st = gfc_new_symtree (root: &ns->sym_root, name);
3393 st->n.sym = p;
3394 p->refs++;
3395
3396 }
3397 else
3398 {
3399 /* Make sure the existing symbol is OK. Ambiguous
3400 generic interfaces are permitted, as long as the
3401 specific interfaces are different. */
3402 if (st->ambiguous && !st->n.sym->attr.generic)
3403 {
3404 ambiguous_symbol (name, st);
3405 return 1;
3406 }
3407
3408 p = st->n.sym;
3409 if (p->ns != ns && (!p->attr.function || ns->proc_name != p)
3410 && !(allow_subroutine && p->attr.subroutine)
3411 && !(ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY
3412 && (ns->has_import_set || p->attr.imported)))
3413 {
3414 /* Symbol is from another namespace. */
3415 gfc_error ("Symbol %qs at %C has already been host associated",
3416 name);
3417 return 2;
3418 }
3419
3420 p->mark = 1;
3421
3422 /* Copy in case this symbol is changed. */
3423 gfc_save_symbol_data (sym: p);
3424 }
3425
3426 *result = st;
3427 return 0;
3428}
3429
3430
3431int
3432gfc_get_symbol (const char *name, gfc_namespace *ns, gfc_symbol **result)
3433{
3434 gfc_symtree *st;
3435 int i;
3436
3437 i = gfc_get_sym_tree (name, ns, result: &st, allow_subroutine: false);
3438 if (i != 0)
3439 return i;
3440
3441 if (st)
3442 *result = st->n.sym;
3443 else
3444 *result = NULL;
3445 return i;
3446}
3447
3448
3449/* Subroutine that searches for a symbol, creating it if it doesn't
3450 exist, but tries to host-associate the symbol if possible. */
3451
3452int
3453gfc_get_ha_sym_tree (const char *name, gfc_symtree **result)
3454{
3455 gfc_symtree *st;
3456 int i;
3457
3458 i = gfc_find_sym_tree (name, ns: gfc_current_ns, parent_flag: 0, result: &st);
3459
3460 if (st != NULL)
3461 {
3462 gfc_save_symbol_data (sym: st->n.sym);
3463 *result = st;
3464 return i;
3465 }
3466
3467 i = gfc_find_sym_tree (name, ns: gfc_current_ns, parent_flag: 1, result: &st);
3468 if (i)
3469 return i;
3470
3471 if (st != NULL)
3472 {
3473 *result = st;
3474 return 0;
3475 }
3476
3477 return gfc_get_sym_tree (name, ns: gfc_current_ns, result, allow_subroutine: false);
3478}
3479
3480
3481int
3482gfc_get_ha_symbol (const char *name, gfc_symbol **result)
3483{
3484 int i;
3485 gfc_symtree *st;
3486
3487 i = gfc_get_ha_sym_tree (name, result: &st);
3488
3489 if (st)
3490 *result = st->n.sym;
3491 else
3492 *result = NULL;
3493
3494 return i;
3495}
3496
3497
3498/* Search for the symtree belonging to a gfc_common_head; we cannot use
3499 head->name as the common_root symtree's name might be mangled. */
3500
3501static gfc_symtree *
3502find_common_symtree (gfc_symtree *st, gfc_common_head *head)
3503{
3504
3505 gfc_symtree *result;
3506
3507 if (st == NULL)
3508 return NULL;
3509
3510 if (st->n.common == head)
3511 return st;
3512
3513 result = find_common_symtree (st: st->left, head);
3514 if (!result)
3515 result = find_common_symtree (st: st->right, head);
3516
3517 return result;
3518}
3519
3520
3521/* Restore previous state of symbol. Just copy simple stuff. */
3522
3523static void
3524restore_old_symbol (gfc_symbol *p)
3525{
3526 gfc_symbol *old;
3527
3528 p->mark = 0;
3529 old = p->old_symbol;
3530
3531 p->ts.type = old->ts.type;
3532 p->ts.kind = old->ts.kind;
3533
3534 p->attr = old->attr;
3535
3536 if (p->value != old->value)
3537 {
3538 gcc_checking_assert (old->value == NULL);
3539 gfc_free_expr (p->value);
3540 p->value = NULL;
3541 }
3542
3543 if (p->as != old->as)
3544 {
3545 if (p->as)
3546 gfc_free_array_spec (p->as);
3547 p->as = old->as;
3548 }
3549
3550 p->generic = old->generic;
3551 p->component_access = old->component_access;
3552
3553 if (p->namelist != NULL && old->namelist == NULL)
3554 {
3555 gfc_free_namelist (p->namelist);
3556 p->namelist = NULL;
3557 }
3558 else
3559 {
3560 if (p->namelist_tail != old->namelist_tail)
3561 {
3562 gfc_free_namelist (old->namelist_tail->next);
3563 old->namelist_tail->next = NULL;
3564 }
3565 }
3566
3567 p->namelist_tail = old->namelist_tail;
3568
3569 if (p->formal != old->formal)
3570 {
3571 gfc_free_formal_arglist (p->formal);
3572 p->formal = old->formal;
3573 }
3574
3575 set_symbol_common_block (sym: p, common_block: old->common_block);
3576 p->common_head = old->common_head;
3577
3578 p->old_symbol = old->old_symbol;
3579 free (ptr: old);
3580}
3581
3582
3583/* Frees the internal data of a gfc_undo_change_set structure. Doesn't free
3584 the structure itself. */
3585
3586static void
3587free_undo_change_set_data (gfc_undo_change_set &cs)
3588{
3589 cs.syms.release ();
3590 cs.tbps.release ();
3591}
3592
3593
3594/* Given a change set pointer, free its target's contents and update it with
3595 the address of the previous change set. Note that only the contents are
3596 freed, not the target itself (the contents' container). It is not a problem
3597 as the latter will be a local variable usually. */
3598
3599static void
3600pop_undo_change_set (gfc_undo_change_set *&cs)
3601{
3602 free_undo_change_set_data (cs&: *cs);
3603 cs = cs->previous;
3604}
3605
3606
3607static void free_old_symbol (gfc_symbol *sym);
3608
3609
3610/* Merges the current change set into the previous one. The changes themselves
3611 are left untouched; only one checkpoint is forgotten. */
3612
3613void
3614gfc_drop_last_undo_checkpoint (void)
3615{
3616 gfc_symbol *s, *t;
3617 unsigned i, j;
3618
3619 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, s)
3620 {
3621 /* No need to loop in this case. */
3622 if (s->old_symbol == NULL)
3623 continue;
3624
3625 /* Remove the duplicate symbols. */
3626 FOR_EACH_VEC_ELT (latest_undo_chgset->previous->syms, j, t)
3627 if (t == s)
3628 {
3629 latest_undo_chgset->previous->syms.unordered_remove (ix: j);
3630
3631 /* S->OLD_SYMBOL is the backup symbol for S as it was at the
3632 last checkpoint. We drop that checkpoint, so S->OLD_SYMBOL
3633 shall contain from now on the backup symbol for S as it was
3634 at the checkpoint before. */
3635 if (s->old_symbol->gfc_new)
3636 {
3637 gcc_assert (s->old_symbol->old_symbol == NULL);
3638 s->gfc_new = s->old_symbol->gfc_new;
3639 free_old_symbol (sym: s);
3640 }
3641 else
3642 restore_old_symbol (p: s->old_symbol);
3643 break;
3644 }
3645 }
3646
3647 latest_undo_chgset->previous->syms.safe_splice (src: latest_undo_chgset->syms);
3648 latest_undo_chgset->previous->tbps.safe_splice (src: latest_undo_chgset->tbps);
3649
3650 pop_undo_change_set (cs&: latest_undo_chgset);
3651}
3652
3653
3654/* Remove the reference to the symbol SYM in the symbol tree held by NS
3655 and free SYM if the last reference to it has been removed.
3656 Returns whether the symbol has been freed. */
3657
3658static bool
3659delete_symbol_from_ns (gfc_symbol *sym, gfc_namespace *ns)
3660{
3661 if (ns == nullptr)
3662 return false;
3663
3664 /* The derived type is saved in the symtree with the first
3665 letter capitalized; the all lower-case version to the
3666 derived type contains its associated generic function. */
3667 const char *sym_name = gfc_fl_struct (sym->attr.flavor)
3668 ? gfc_dt_upper_string (sym->name)
3669 : sym->name;
3670
3671 gfc_delete_symtree (root: &ns->sym_root, name: sym_name);
3672
3673 return gfc_release_symbol (sym);
3674}
3675
3676
3677/* Undoes all the changes made to symbols since the previous checkpoint.
3678 This subroutine is made simpler due to the fact that attributes are
3679 never removed once added. */
3680
3681void
3682gfc_restore_last_undo_checkpoint (void)
3683{
3684 gfc_symbol *p;
3685 unsigned i;
3686
3687 FOR_EACH_VEC_ELT_REVERSE (latest_undo_chgset->syms, i, p)
3688 {
3689 /* Symbol in a common block was new. Or was old and just put in common */
3690 if (p->common_block
3691 && (p->gfc_new || !p->old_symbol->common_block))
3692 {
3693 /* If the symbol was added to any common block, it
3694 needs to be removed to stop the resolver looking
3695 for a (possibly) dead symbol. */
3696 if (p->common_block->head == p && !p->common_next)
3697 {
3698 gfc_symtree st, *st0;
3699 st0 = find_common_symtree (st: p->ns->common_root,
3700 head: p->common_block);
3701 if (st0)
3702 {
3703 st.name = st0->name;
3704 gfc_delete_bbt (&p->ns->common_root, &st, compare_symtree);
3705 free (ptr: st0);
3706 }
3707 }
3708
3709 if (p->common_block->head == p)
3710 p->common_block->head = p->common_next;
3711 else
3712 {
3713 gfc_symbol *cparent, *csym;
3714
3715 cparent = p->common_block->head;
3716 csym = cparent->common_next;
3717
3718 while (csym != p)
3719 {
3720 cparent = csym;
3721 csym = csym->common_next;
3722 }
3723
3724 gcc_assert(cparent->common_next == p);
3725 cparent->common_next = csym->common_next;
3726 }
3727 p->common_next = NULL;
3728 }
3729 if (p->gfc_new)
3730 {
3731 bool freed = delete_symbol_from_ns (sym: p, ns: p->ns);
3732
3733 /* If the symbol is a procedure (function or subroutine), remove
3734 it from the procedure body namespace as well as from the outer
3735 namespace. */
3736 if (!freed
3737 && p->formal_ns != p->ns)
3738 freed = delete_symbol_from_ns (sym: p, ns: p->formal_ns);
3739
3740 /* If the formal_ns field has not been set yet, the previous
3741 conditional does nothing. In that case, we can assume that
3742 gfc_current_ns is the procedure body namespace, and remove the
3743 symbol from there. */
3744 if (!freed
3745 && gfc_current_ns != p->ns
3746 && gfc_current_ns != p->formal_ns)
3747 freed = delete_symbol_from_ns (sym: p, ns: gfc_current_ns);
3748 }
3749 else
3750 restore_old_symbol (p);
3751 }
3752
3753 latest_undo_chgset->syms.truncate (size: 0);
3754 latest_undo_chgset->tbps.truncate (size: 0);
3755
3756 if (!single_undo_checkpoint_p ())
3757 pop_undo_change_set (cs&: latest_undo_chgset);
3758}
3759
3760
3761/* Makes sure that there is only one set of changes; in other words we haven't
3762 forgotten to pair a call to gfc_new_checkpoint with a call to either
3763 gfc_drop_last_undo_checkpoint or gfc_restore_last_undo_checkpoint. */
3764
3765static void
3766enforce_single_undo_checkpoint (void)
3767{
3768 gcc_checking_assert (single_undo_checkpoint_p ());
3769}
3770
3771
3772/* Undoes all the changes made to symbols in the current statement. */
3773
3774void
3775gfc_undo_symbols (void)
3776{
3777 enforce_single_undo_checkpoint ();
3778 gfc_restore_last_undo_checkpoint ();
3779}
3780
3781
3782/* Free sym->old_symbol. sym->old_symbol is mostly a shallow copy of sym; the
3783 components of old_symbol that might need deallocation are the "allocatables"
3784 that are restored in gfc_undo_symbols(), with two exceptions: namelist and
3785 namelist_tail. In case these differ between old_symbol and sym, it's just
3786 because sym->namelist has gotten a few more items. */
3787
3788static void
3789free_old_symbol (gfc_symbol *sym)
3790{
3791
3792 if (sym->old_symbol == NULL)
3793 return;
3794
3795 if (sym->old_symbol->as != NULL
3796 && sym->old_symbol->as != sym->as
3797 && !(sym->ts.type == BT_CLASS
3798 && sym->ts.u.derived->attr.is_class
3799 && sym->old_symbol->as == CLASS_DATA (sym)->as))
3800 gfc_free_array_spec (sym->old_symbol->as);
3801
3802 if (sym->old_symbol->value != sym->value)
3803 gfc_free_expr (sym->old_symbol->value);
3804
3805 if (sym->old_symbol->formal != sym->formal)
3806 gfc_free_formal_arglist (sym->old_symbol->formal);
3807
3808 free (ptr: sym->old_symbol);
3809 sym->old_symbol = NULL;
3810}
3811
3812
3813/* Makes the changes made in the current statement permanent-- gets
3814 rid of undo information. */
3815
3816void
3817gfc_commit_symbols (void)
3818{
3819 gfc_symbol *p;
3820 gfc_typebound_proc *tbp;
3821 unsigned i;
3822
3823 enforce_single_undo_checkpoint ();
3824
3825 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3826 {
3827 p->mark = 0;
3828 p->gfc_new = 0;
3829 free_old_symbol (sym: p);
3830 }
3831 latest_undo_chgset->syms.truncate (size: 0);
3832
3833 FOR_EACH_VEC_ELT (latest_undo_chgset->tbps, i, tbp)
3834 tbp->error = 0;
3835 latest_undo_chgset->tbps.truncate (size: 0);
3836}
3837
3838
3839/* Makes the changes made in one symbol permanent -- gets rid of undo
3840 information. */
3841
3842void
3843gfc_commit_symbol (gfc_symbol *sym)
3844{
3845 gfc_symbol *p;
3846 unsigned i;
3847
3848 enforce_single_undo_checkpoint ();
3849
3850 FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
3851 if (p == sym)
3852 {
3853 latest_undo_chgset->syms.unordered_remove (ix: i);
3854 break;
3855 }
3856
3857 sym->mark = 0;
3858 sym->gfc_new = 0;
3859
3860 free_old_symbol (sym);
3861}
3862
3863
3864/* Recursively free trees containing type-bound procedures. */
3865
3866static void
3867free_tb_tree (gfc_symtree *t)
3868{
3869 if (t == NULL)
3870 return;
3871
3872 free_tb_tree (t: t->left);
3873 free_tb_tree (t: t->right);
3874
3875 /* TODO: Free type-bound procedure u.generic */
3876 free (ptr: t->n.tb);
3877 t->n.tb = NULL;
3878 free (ptr: t);
3879}
3880
3881
3882/* Recursive function that deletes an entire tree and all the common
3883 head structures it points to. */
3884
3885static void
3886free_common_tree (gfc_symtree * common_tree)
3887{
3888 if (common_tree == NULL)
3889 return;
3890
3891 free_common_tree (common_tree: common_tree->left);
3892 free_common_tree (common_tree: common_tree->right);
3893
3894 free (ptr: common_tree);
3895}
3896
3897
3898/* Recursive function that deletes an entire tree and all the common
3899 head structures it points to. */
3900
3901static void
3902free_omp_udr_tree (gfc_symtree * omp_udr_tree)
3903{
3904 if (omp_udr_tree == NULL)
3905 return;
3906
3907 free_omp_udr_tree (omp_udr_tree: omp_udr_tree->left);
3908 free_omp_udr_tree (omp_udr_tree: omp_udr_tree->right);
3909
3910 gfc_free_omp_udr (omp_udr_tree->n.omp_udr);
3911 free (ptr: omp_udr_tree);
3912}
3913
3914
3915/* Recursive function that deletes an entire tree and all the user
3916 operator nodes that it contains. */
3917
3918static void
3919free_uop_tree (gfc_symtree *uop_tree)
3920{
3921 if (uop_tree == NULL)
3922 return;
3923
3924 free_uop_tree (uop_tree: uop_tree->left);
3925 free_uop_tree (uop_tree: uop_tree->right);
3926
3927 gfc_free_interface (uop_tree->n.uop->op);
3928 free (ptr: uop_tree->n.uop);
3929 free (ptr: uop_tree);
3930}
3931
3932
3933/* Recursive function that deletes an entire tree and all the symbols
3934 that it contains. */
3935
3936static void
3937free_sym_tree (gfc_symtree *sym_tree)
3938{
3939 if (sym_tree == NULL)
3940 return;
3941
3942 free_sym_tree (sym_tree: sym_tree->left);
3943 free_sym_tree (sym_tree: sym_tree->right);
3944
3945 gfc_release_symbol (sym&: sym_tree->n.sym);
3946 free (ptr: sym_tree);
3947}
3948
3949
3950/* Free the gfc_equiv_info's. */
3951
3952static void
3953gfc_free_equiv_infos (gfc_equiv_info *s)
3954{
3955 if (s == NULL)
3956 return;
3957 gfc_free_equiv_infos (s: s->next);
3958 free (ptr: s);
3959}
3960
3961
3962/* Free the gfc_equiv_lists. */
3963
3964static void
3965gfc_free_equiv_lists (gfc_equiv_list *l)
3966{
3967 if (l == NULL)
3968 return;
3969 gfc_free_equiv_lists (l: l->next);
3970 gfc_free_equiv_infos (s: l->equiv);
3971 free (ptr: l);
3972}
3973
3974
3975/* Free a finalizer procedure list. */
3976
3977void
3978gfc_free_finalizer (gfc_finalizer* el)
3979{
3980 if (el)
3981 {
3982 gfc_release_symbol (sym&: el->proc_sym);
3983 free (ptr: el);
3984 }
3985}
3986
3987static void
3988gfc_free_finalizer_list (gfc_finalizer* list)
3989{
3990 while (list)
3991 {
3992 gfc_finalizer* current = list;
3993 list = list->next;
3994 gfc_free_finalizer (el: current);
3995 }
3996}
3997
3998
3999/* Create a new gfc_charlen structure and add it to a namespace.
4000 If 'old_cl' is given, the newly created charlen will be a copy of it. */
4001
4002gfc_charlen*
4003gfc_new_charlen (gfc_namespace *ns, gfc_charlen *old_cl)
4004{
4005 gfc_charlen *cl;
4006
4007 cl = gfc_get_charlen ();
4008
4009 /* Copy old_cl. */
4010 if (old_cl)
4011 {
4012 cl->length = gfc_copy_expr (old_cl->length);
4013 cl->length_from_typespec = old_cl->length_from_typespec;
4014 cl->backend_decl = old_cl->backend_decl;
4015 cl->passed_length = old_cl->passed_length;
4016 cl->resolved = old_cl->resolved;
4017 }
4018
4019 /* Put into namespace. */
4020 cl->next = ns->cl_list;
4021 ns->cl_list = cl;
4022
4023 return cl;
4024}
4025
4026
4027/* Free the charlen list from cl to end (end is not freed).
4028 Free the whole list if end is NULL. */
4029
4030static void
4031gfc_free_charlen (gfc_charlen *cl, gfc_charlen *end)
4032{
4033 gfc_charlen *cl2;
4034
4035 for (; cl != end; cl = cl2)
4036 {
4037 gcc_assert (cl);
4038
4039 cl2 = cl->next;
4040 gfc_free_expr (cl->length);
4041 free (ptr: cl);
4042 }
4043}
4044
4045
4046/* Free entry list structs. */
4047
4048static void
4049free_entry_list (gfc_entry_list *el)
4050{
4051 gfc_entry_list *next;
4052
4053 if (el == NULL)
4054 return;
4055
4056 next = el->next;
4057 free (ptr: el);
4058 free_entry_list (el: next);
4059}
4060
4061
4062/* Free a namespace structure and everything below it. Interface
4063 lists associated with intrinsic operators are not freed. These are
4064 taken care of when a specific name is freed. */
4065
4066void
4067gfc_free_namespace (gfc_namespace *&ns)
4068{
4069 gfc_namespace *p, *q;
4070 int i;
4071 gfc_was_finalized *f;
4072
4073 if (ns == NULL)
4074 return;
4075
4076 ns->refs--;
4077 if (ns->refs > 0)
4078 return;
4079
4080 gcc_assert (ns->refs == 0);
4081
4082 gfc_free_statements (ns->code);
4083
4084 free_sym_tree (sym_tree: ns->sym_root);
4085 free_uop_tree (uop_tree: ns->uop_root);
4086 free_common_tree (common_tree: ns->common_root);
4087 free_omp_udr_tree (omp_udr_tree: ns->omp_udr_root);
4088 free_tb_tree (t: ns->tb_sym_root);
4089 free_tb_tree (t: ns->tb_uop_root);
4090 gfc_free_finalizer_list (list: ns->finalizers);
4091 gfc_free_omp_declare_simd_list (ns->omp_declare_simd);
4092 gfc_free_omp_declare_variant_list (list: ns->omp_declare_variant);
4093 gfc_free_charlen (cl: ns->cl_list, NULL);
4094 free_st_labels (label: ns->st_labels);
4095
4096 free_entry_list (el: ns->entries);
4097 gfc_free_equiv (ns->equiv);
4098 gfc_free_equiv_lists (l: ns->equiv_lists);
4099 gfc_free_use_stmts (ns->use_stmts);
4100
4101 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
4102 gfc_free_interface (ns->op[i]);
4103
4104 gfc_free_data (ns->data);
4105
4106 /* Free all the expr + component combinations that have been
4107 finalized. */
4108 f = ns->was_finalized;
4109 while (f)
4110 {
4111 gfc_was_finalized* current = f;
4112 f = f->next;
4113 free (ptr: current);
4114 }
4115 if (ns->omp_assumes)
4116 {
4117 free (ptr: ns->omp_assumes->absent);
4118 free (ptr: ns->omp_assumes->contains);
4119 gfc_free_expr_list (ns->omp_assumes->holds);
4120 free (ptr: ns->omp_assumes);
4121 }
4122 p = ns->contained;
4123 free (ptr: ns);
4124 ns = NULL;
4125
4126 /* Recursively free any contained namespaces. */
4127 while (p != NULL)
4128 {
4129 q = p;
4130 p = p->sibling;
4131 gfc_free_namespace (ns&: q);
4132 }
4133}
4134
4135
4136void
4137gfc_symbol_init_2 (void)
4138{
4139
4140 gfc_current_ns = gfc_get_namespace (NULL, parent_types: 0);
4141}
4142
4143
4144void
4145gfc_symbol_done_2 (void)
4146{
4147 if (gfc_current_ns != NULL)
4148 {
4149 /* free everything from the root. */
4150 while (gfc_current_ns->parent != NULL)
4151 gfc_current_ns = gfc_current_ns->parent;
4152 gfc_free_namespace (ns&: gfc_current_ns);
4153 gfc_current_ns = NULL;
4154 }
4155 gfc_derived_types = NULL;
4156
4157 enforce_single_undo_checkpoint ();
4158 free_undo_change_set_data (cs&: *latest_undo_chgset);
4159}
4160
4161
4162/* Count how many nodes a symtree has. */
4163
4164static unsigned
4165count_st_nodes (const gfc_symtree *st)
4166{
4167 unsigned nodes;
4168 if (!st)
4169 return 0;
4170
4171 nodes = count_st_nodes (st: st->left);
4172 nodes++;
4173 nodes += count_st_nodes (st: st->right);
4174
4175 return nodes;
4176}
4177
4178
4179/* Convert symtree tree into symtree vector. */
4180
4181static unsigned
4182fill_st_vector (gfc_symtree *st, gfc_symtree **st_vec, unsigned node_cntr)
4183{
4184 if (!st)
4185 return node_cntr;
4186
4187 node_cntr = fill_st_vector (st: st->left, st_vec, node_cntr);
4188 st_vec[node_cntr++] = st;
4189 node_cntr = fill_st_vector (st: st->right, st_vec, node_cntr);
4190
4191 return node_cntr;
4192}
4193
4194
4195/* Traverse namespace. As the functions might modify the symtree, we store the
4196 symtree as a vector and operate on this vector. Note: We assume that
4197 sym_func or st_func never deletes nodes from the symtree - only adding is
4198 allowed. Additionally, newly added nodes are not traversed. */
4199
4200static void
4201do_traverse_symtree (gfc_symtree *st, void (*st_func) (gfc_symtree *),
4202 void (*sym_func) (gfc_symbol *))
4203{
4204 gfc_symtree **st_vec;
4205 unsigned nodes, i, node_cntr;
4206
4207 gcc_assert ((st_func && !sym_func) || (!st_func && sym_func));
4208 nodes = count_st_nodes (st);
4209 st_vec = XALLOCAVEC (gfc_symtree *, nodes);
4210 node_cntr = 0;
4211 fill_st_vector (st, st_vec, node_cntr);
4212
4213 if (sym_func)
4214 {
4215 /* Clear marks. */
4216 for (i = 0; i < nodes; i++)
4217 st_vec[i]->n.sym->mark = 0;
4218 for (i = 0; i < nodes; i++)
4219 if (!st_vec[i]->n.sym->mark)
4220 {
4221 (*sym_func) (st_vec[i]->n.sym);
4222 st_vec[i]->n.sym->mark = 1;
4223 }
4224 }
4225 else
4226 for (i = 0; i < nodes; i++)
4227 (*st_func) (st_vec[i]);
4228}
4229
4230
4231/* Recursively traverse the symtree nodes. */
4232
4233void
4234gfc_traverse_symtree (gfc_symtree *st, void (*st_func) (gfc_symtree *))
4235{
4236 do_traverse_symtree (st, st_func, NULL);
4237}
4238
4239
4240/* Call a given function for all symbols in the namespace. We take
4241 care that each gfc_symbol node is called exactly once. */
4242
4243void
4244gfc_traverse_ns (gfc_namespace *ns, void (*sym_func) (gfc_symbol *))
4245{
4246 do_traverse_symtree (st: ns->sym_root, NULL, sym_func);
4247}
4248
4249
4250/* Return TRUE when name is the name of an intrinsic type. */
4251
4252bool
4253gfc_is_intrinsic_typename (const char *name)
4254{
4255 if (strcmp (s1: name, s2: "integer") == 0
4256 || strcmp (s1: name, s2: "real") == 0
4257 || strcmp (s1: name, s2: "character") == 0
4258 || strcmp (s1: name, s2: "logical") == 0
4259 || strcmp (s1: name, s2: "complex") == 0
4260 || strcmp (s1: name, s2: "doubleprecision") == 0
4261 || strcmp (s1: name, s2: "doublecomplex") == 0)
4262 return true;
4263 else
4264 return false;
4265}
4266
4267
4268/* Return TRUE if the symbol is an automatic variable. */
4269
4270static bool
4271gfc_is_var_automatic (gfc_symbol *sym)
4272{
4273 /* Pointer and allocatable variables are never automatic. */
4274 if (sym->attr.pointer || sym->attr.allocatable)
4275 return false;
4276 /* Check for arrays with non-constant size. */
4277 if (sym->attr.dimension && sym->as
4278 && !gfc_is_compile_time_shape (sym->as))
4279 return true;
4280 /* Check for non-constant length character variables. */
4281 if (sym->ts.type == BT_CHARACTER
4282 && sym->ts.u.cl
4283 && !gfc_is_constant_expr (sym->ts.u.cl->length))
4284 return true;
4285 /* Variables with explicit AUTOMATIC attribute. */
4286 if (sym->attr.automatic)
4287 return true;
4288
4289 return false;
4290}
4291
4292/* Given a symbol, mark it as SAVEd if it is allowed. */
4293
4294static void
4295save_symbol (gfc_symbol *sym)
4296{
4297
4298 if (sym->attr.use_assoc)
4299 return;
4300
4301 if (sym->attr.in_common
4302 || sym->attr.in_equivalence
4303 || sym->attr.dummy
4304 || sym->attr.result
4305 || sym->attr.flavor != FL_VARIABLE)
4306 return;
4307 /* Automatic objects are not saved. */
4308 if (gfc_is_var_automatic (sym))
4309 return;
4310 gfc_add_save (attr: &sym->attr, s: SAVE_EXPLICIT, name: sym->name, where: &sym->declared_at);
4311}
4312
4313
4314/* Mark those symbols which can be SAVEd as such. */
4315
4316void
4317gfc_save_all (gfc_namespace *ns)
4318{
4319 gfc_traverse_ns (ns, sym_func: save_symbol);
4320}
4321
4322
4323/* Make sure that no changes to symbols are pending. */
4324
4325void
4326gfc_enforce_clean_symbol_state(void)
4327{
4328 enforce_single_undo_checkpoint ();
4329 gcc_assert (latest_undo_chgset->syms.is_empty ());
4330}
4331
4332
4333/************** Global symbol handling ************/
4334
4335
4336/* Search a tree for the global symbol. */
4337
4338gfc_gsymbol *
4339gfc_find_gsymbol (gfc_gsymbol *symbol, const char *name)
4340{
4341 int c;
4342
4343 if (symbol == NULL)
4344 return NULL;
4345
4346 while (symbol)
4347 {
4348 c = strcmp (s1: name, s2: symbol->name);
4349 if (!c)
4350 return symbol;
4351
4352 symbol = (c < 0) ? symbol->left : symbol->right;
4353 }
4354
4355 return NULL;
4356}
4357
4358
4359/* Case insensitive search a tree for the global symbol. */
4360
4361gfc_gsymbol *
4362gfc_find_case_gsymbol (gfc_gsymbol *symbol, const char *name)
4363{
4364 int c;
4365
4366 if (symbol == NULL)
4367 return NULL;
4368
4369 while (symbol)
4370 {
4371 c = strcasecmp (s1: name, s2: symbol->name);
4372 if (!c)
4373 return symbol;
4374
4375 symbol = (c < 0) ? symbol->left : symbol->right;
4376 }
4377
4378 return NULL;
4379}
4380
4381
4382/* Compare two global symbols. Used for managing the BB tree. */
4383
4384static int
4385gsym_compare (void *_s1, void *_s2)
4386{
4387 gfc_gsymbol *s1, *s2;
4388
4389 s1 = (gfc_gsymbol *) _s1;
4390 s2 = (gfc_gsymbol *) _s2;
4391 return strcmp (s1: s1->name, s2: s2->name);
4392}
4393
4394
4395/* Get a global symbol, creating it if it doesn't exist. */
4396
4397gfc_gsymbol *
4398gfc_get_gsymbol (const char *name, bool bind_c)
4399{
4400 gfc_gsymbol *s;
4401
4402 s = gfc_find_gsymbol (symbol: gfc_gsym_root, name);
4403 if (s != NULL)
4404 return s;
4405
4406 s = XCNEW (gfc_gsymbol);
4407 s->type = GSYM_UNKNOWN;
4408 s->name = gfc_get_string ("%s", name);
4409 s->bind_c = bind_c;
4410
4411 gfc_insert_bbt (&gfc_gsym_root, s, gsym_compare);
4412
4413 return s;
4414}
4415
4416void
4417gfc_traverse_gsymbol (gfc_gsymbol *gsym,
4418 void (*do_something) (gfc_gsymbol *, void *),
4419 void *data)
4420{
4421 if (gsym->left)
4422 gfc_traverse_gsymbol (gsym: gsym->left, do_something, data);
4423
4424 (*do_something) (gsym, data);
4425
4426 if (gsym->right)
4427 gfc_traverse_gsymbol (gsym: gsym->right, do_something, data);
4428}
4429
4430static gfc_symbol *
4431get_iso_c_binding_dt (int sym_id)
4432{
4433 gfc_symbol *dt_list = gfc_derived_types;
4434
4435 /* Loop through the derived types in the name list, searching for
4436 the desired symbol from iso_c_binding. Search the parent namespaces
4437 if necessary and requested to (parent_flag). */
4438 if (dt_list)
4439 {
4440 while (dt_list->dt_next != gfc_derived_types)
4441 {
4442 if (dt_list->from_intmod != INTMOD_NONE
4443 && dt_list->intmod_sym_id == sym_id)
4444 return dt_list;
4445
4446 dt_list = dt_list->dt_next;
4447 }
4448 }
4449
4450 return NULL;
4451}
4452
4453
4454/* Verifies that the given derived type symbol, derived_sym, is interoperable
4455 with C. This is necessary for any derived type that is BIND(C) and for
4456 derived types that are parameters to functions that are BIND(C). All
4457 fields of the derived type are required to be interoperable, and are tested
4458 for such. If an error occurs, the errors are reported here, allowing for
4459 multiple errors to be handled for a single derived type. */
4460
4461bool
4462verify_bind_c_derived_type (gfc_symbol *derived_sym)
4463{
4464 gfc_component *curr_comp = NULL;
4465 bool is_c_interop = false;
4466 bool retval = true;
4467
4468 if (derived_sym == NULL)
4469 gfc_internal_error ("verify_bind_c_derived_type(): Given symbol is "
4470 "unexpectedly NULL");
4471
4472 /* If we've already looked at this derived symbol, do not look at it again
4473 so we don't repeat warnings/errors. */
4474 if (derived_sym->ts.is_c_interop)
4475 return true;
4476
4477 /* The derived type must have the BIND attribute to be interoperable
4478 J3/04-007, Section 15.2.3. */
4479 if (derived_sym->attr.is_bind_c != 1)
4480 {
4481 derived_sym->ts.is_c_interop = 0;
4482 gfc_error_now ("Derived type %qs declared at %L must have the BIND "
4483 "attribute to be C interoperable", derived_sym->name,
4484 &(derived_sym->declared_at));
4485 retval = false;
4486 }
4487
4488 curr_comp = derived_sym->components;
4489
4490 /* Fortran 2003 allows an empty derived type. C99 appears to disallow an
4491 empty struct. Section 15.2 in Fortran 2003 states: "The following
4492 subclauses define the conditions under which a Fortran entity is
4493 interoperable. If a Fortran entity is interoperable, an equivalent
4494 entity may be defined by means of C and the Fortran entity is said
4495 to be interoperable with the C entity. There does not have to be such
4496 an interoperating C entity."
4497 */
4498 if (curr_comp == NULL)
4499 {
4500 gfc_warning (opt: 0, "Derived type %qs with BIND(C) attribute at %L is empty, "
4501 "and may be inaccessible by the C companion processor",
4502 derived_sym->name, &(derived_sym->declared_at));
4503 derived_sym->ts.is_c_interop = 1;
4504 derived_sym->attr.is_bind_c = 1;
4505 return true;
4506 }
4507
4508
4509 /* Initialize the derived type as being C interoperable.
4510 If we find an error in the components, this will be set false. */
4511 derived_sym->ts.is_c_interop = 1;
4512
4513 /* Loop through the list of components to verify that the kind of
4514 each is a C interoperable type. */
4515 do
4516 {
4517 /* The components cannot be pointers (fortran sense).
4518 J3/04-007, Section 15.2.3, C1505. */
4519 if (curr_comp->attr.pointer != 0)
4520 {
4521 gfc_error ("Component %qs at %L cannot have the "
4522 "POINTER attribute because it is a member "
4523 "of the BIND(C) derived type %qs at %L",
4524 curr_comp->name, &(curr_comp->loc),
4525 derived_sym->name, &(derived_sym->declared_at));
4526 retval = false;
4527 }
4528
4529 if (curr_comp->attr.proc_pointer != 0)
4530 {
4531 gfc_error ("Procedure pointer component %qs at %L cannot be a member"
4532 " of the BIND(C) derived type %qs at %L", curr_comp->name,
4533 &curr_comp->loc, derived_sym->name,
4534 &derived_sym->declared_at);
4535 retval = false;
4536 }
4537
4538 /* The components cannot be allocatable.
4539 J3/04-007, Section 15.2.3, C1505. */
4540 if (curr_comp->attr.allocatable != 0)
4541 {
4542 gfc_error ("Component %qs at %L cannot have the "
4543 "ALLOCATABLE attribute because it is a member "
4544 "of the BIND(C) derived type %qs at %L",
4545 curr_comp->name, &(curr_comp->loc),
4546 derived_sym->name, &(derived_sym->declared_at));
4547 retval = false;
4548 }
4549
4550 /* BIND(C) derived types must have interoperable components. */
4551 if (curr_comp->ts.type == BT_DERIVED
4552 && curr_comp->ts.u.derived->ts.is_iso_c != 1
4553 && curr_comp->ts.u.derived != derived_sym)
4554 {
4555 /* This should be allowed; the draft says a derived-type cannot
4556 have type parameters if it is has the BIND attribute. Type
4557 parameters seem to be for making parameterized derived types.
4558 There's no need to verify the type if it is c_ptr/c_funptr. */
4559 retval = verify_bind_c_derived_type (derived_sym: curr_comp->ts.u.derived);
4560 }
4561 else
4562 {
4563 /* Grab the typespec for the given component and test the kind. */
4564 is_c_interop = gfc_verify_c_interop (&(curr_comp->ts));
4565
4566 if (!is_c_interop)
4567 {
4568 /* Report warning and continue since not fatal. The
4569 draft does specify a constraint that requires all fields
4570 to interoperate, but if the user says real(4), etc., it
4571 may interoperate with *something* in C, but the compiler
4572 most likely won't know exactly what. Further, it may not
4573 interoperate with the same data type(s) in C if the user
4574 recompiles with different flags (e.g., -m32 and -m64 on
4575 x86_64 and using integer(4) to claim interop with a
4576 C_LONG). */
4577 if (derived_sym->attr.is_bind_c == 1 && warn_c_binding_type)
4578 /* If the derived type is bind(c), all fields must be
4579 interop. */
4580 gfc_warning (opt: OPT_Wc_binding_type,
4581 "Component %qs in derived type %qs at %L "
4582 "may not be C interoperable, even though "
4583 "derived type %qs is BIND(C)",
4584 curr_comp->name, derived_sym->name,
4585 &(curr_comp->loc), derived_sym->name);
4586 else if (warn_c_binding_type)
4587 /* If derived type is param to bind(c) routine, or to one
4588 of the iso_c_binding procs, it must be interoperable, so
4589 all fields must interop too. */
4590 gfc_warning (opt: OPT_Wc_binding_type,
4591 "Component %qs in derived type %qs at %L "
4592 "may not be C interoperable",
4593 curr_comp->name, derived_sym->name,
4594 &(curr_comp->loc));
4595 }
4596 }
4597
4598 curr_comp = curr_comp->next;
4599 } while (curr_comp != NULL);
4600
4601 if (derived_sym->attr.sequence != 0)
4602 {
4603 gfc_error ("Derived type %qs at %L cannot have the SEQUENCE "
4604 "attribute because it is BIND(C)", derived_sym->name,
4605 &(derived_sym->declared_at));
4606 retval = false;
4607 }
4608
4609 /* Mark the derived type as not being C interoperable if we found an
4610 error. If there were only warnings, proceed with the assumption
4611 it's interoperable. */
4612 if (!retval)
4613 derived_sym->ts.is_c_interop = 0;
4614
4615 return retval;
4616}
4617
4618
4619/* Generate symbols for the named constants c_null_ptr and c_null_funptr. */
4620
4621static bool
4622gen_special_c_interop_ptr (gfc_symbol *tmp_sym, gfc_symtree *dt_symtree)
4623{
4624 gfc_constructor *c;
4625
4626 gcc_assert (tmp_sym && dt_symtree && dt_symtree->n.sym);
4627 dt_symtree->n.sym->attr.referenced = 1;
4628
4629 tmp_sym->attr.is_c_interop = 1;
4630 tmp_sym->attr.is_bind_c = 1;
4631 tmp_sym->ts.is_c_interop = 1;
4632 tmp_sym->ts.is_iso_c = 1;
4633 tmp_sym->ts.type = BT_DERIVED;
4634 tmp_sym->ts.f90_type = BT_VOID;
4635 tmp_sym->attr.flavor = FL_PARAMETER;
4636 tmp_sym->ts.u.derived = dt_symtree->n.sym;
4637
4638 /* Set the c_address field of c_null_ptr and c_null_funptr to
4639 the value of NULL. */
4640 tmp_sym->value = gfc_get_expr ();
4641 tmp_sym->value->expr_type = EXPR_STRUCTURE;
4642 tmp_sym->value->ts.type = BT_DERIVED;
4643 tmp_sym->value->ts.f90_type = BT_VOID;
4644 tmp_sym->value->ts.u.derived = tmp_sym->ts.u.derived;
4645 gfc_constructor_append_expr (base: &tmp_sym->value->value.constructor, NULL, NULL);
4646 c = gfc_constructor_first (base: tmp_sym->value->value.constructor);
4647 c->expr = gfc_get_int_expr (gfc_index_integer_kind, NULL, 0);
4648 c->expr->ts.is_iso_c = 1;
4649
4650 return true;
4651}
4652
4653
4654/* Add a formal argument, gfc_formal_arglist, to the
4655 end of the given list of arguments. Set the reference to the
4656 provided symbol, param_sym, in the argument. */
4657
4658static void
4659add_formal_arg (gfc_formal_arglist **head,
4660 gfc_formal_arglist **tail,
4661 gfc_formal_arglist *formal_arg,
4662 gfc_symbol *param_sym)
4663{
4664 /* Put in list, either as first arg or at the tail (curr arg). */
4665 if (*head == NULL)
4666 *head = *tail = formal_arg;
4667 else
4668 {
4669 (*tail)->next = formal_arg;
4670 (*tail) = formal_arg;
4671 }
4672
4673 (*tail)->sym = param_sym;
4674 (*tail)->next = NULL;
4675
4676 return;
4677}
4678
4679
4680/* Add a procedure interface to the given symbol (i.e., store a
4681 reference to the list of formal arguments). */
4682
4683static void
4684add_proc_interface (gfc_symbol *sym, ifsrc source, gfc_formal_arglist *formal)
4685{
4686
4687 sym->formal = formal;
4688 sym->attr.if_source = source;
4689}
4690
4691
4692/* Copy the formal args from an existing symbol, src, into a new
4693 symbol, dest. New formal args are created, and the description of
4694 each arg is set according to the existing ones. This function is
4695 used when creating procedure declaration variables from a procedure
4696 declaration statement (see match_proc_decl()) to create the formal
4697 args based on the args of a given named interface.
4698
4699 When an actual argument list is provided, skip the absent arguments
4700 unless copy_type is true.
4701 To be used together with gfc_se->ignore_optional. */
4702
4703void
4704gfc_copy_formal_args_intr (gfc_symbol *dest, gfc_intrinsic_sym *src,
4705 gfc_actual_arglist *actual, bool copy_type)
4706{
4707 gfc_formal_arglist *head = NULL;
4708 gfc_formal_arglist *tail = NULL;
4709 gfc_formal_arglist *formal_arg = NULL;
4710 gfc_intrinsic_arg *curr_arg = NULL;
4711 gfc_formal_arglist *formal_prev = NULL;
4712 gfc_actual_arglist *act_arg = actual;
4713 /* Save current namespace so we can change it for formal args. */
4714 gfc_namespace *parent_ns = gfc_current_ns;
4715
4716 /* Create a new namespace, which will be the formal ns (namespace
4717 of the formal args). */
4718 gfc_current_ns = gfc_get_namespace (parent: parent_ns, parent_types: 0);
4719 gfc_current_ns->proc_name = dest;
4720
4721 for (curr_arg = src->formal; curr_arg; curr_arg = curr_arg->next)
4722 {
4723 /* Skip absent arguments. */
4724 if (actual)
4725 {
4726 gcc_assert (act_arg != NULL);
4727 if (act_arg->expr == NULL)
4728 {
4729 act_arg = act_arg->next;
4730 continue;
4731 }
4732 }
4733 formal_arg = gfc_get_formal_arglist ();
4734 gfc_get_symbol (name: curr_arg->name, ns: gfc_current_ns, result: &(formal_arg->sym));
4735
4736 /* May need to copy more info for the symbol. */
4737 if (copy_type && act_arg->expr != NULL)
4738 {
4739 formal_arg->sym->ts = act_arg->expr->ts;
4740 if (act_arg->expr->rank > 0)
4741 {
4742 formal_arg->sym->attr.dimension = 1;
4743 formal_arg->sym->as = gfc_get_array_spec();
4744 formal_arg->sym->as->rank = -1;
4745 formal_arg->sym->as->type = AS_ASSUMED_RANK;
4746 }
4747 if (act_arg->name && strcmp (s1: act_arg->name, s2: "%VAL") == 0)
4748 formal_arg->sym->pass_as_value = 1;
4749 }
4750 else
4751 formal_arg->sym->ts = curr_arg->ts;
4752
4753 formal_arg->sym->attr.optional = curr_arg->optional;
4754 formal_arg->sym->attr.value = curr_arg->value;
4755 formal_arg->sym->attr.intent = curr_arg->intent;
4756 formal_arg->sym->attr.flavor = FL_VARIABLE;
4757 formal_arg->sym->attr.dummy = 1;
4758
4759 /* Do not treat an actual deferred-length character argument wrongly
4760 as template for the formal argument. */
4761 if (formal_arg->sym->ts.type == BT_CHARACTER
4762 && !(formal_arg->sym->attr.allocatable
4763 || formal_arg->sym->attr.pointer))
4764 formal_arg->sym->ts.deferred = false;
4765
4766 if (formal_arg->sym->ts.type == BT_CHARACTER)
4767 formal_arg->sym->ts.u.cl = gfc_new_charlen (ns: gfc_current_ns, NULL);
4768
4769 /* If this isn't the first arg, set up the next ptr. For the
4770 last arg built, the formal_arg->next will never get set to
4771 anything other than NULL. */
4772 if (formal_prev != NULL)
4773 formal_prev->next = formal_arg;
4774 else
4775 formal_arg->next = NULL;
4776
4777 formal_prev = formal_arg;
4778
4779 /* Add arg to list of formal args. */
4780 add_formal_arg (head: &head, tail: &tail, formal_arg, param_sym: formal_arg->sym);
4781
4782 /* Validate changes. */
4783 gfc_commit_symbol (sym: formal_arg->sym);
4784 if (actual)
4785 act_arg = act_arg->next;
4786 }
4787
4788 /* Add the interface to the symbol. */
4789 add_proc_interface (sym: dest, source: IFSRC_DECL, formal: head);
4790
4791 /* Store the formal namespace information. */
4792 if (dest->formal != NULL)
4793 /* The current ns should be that for the dest proc. */
4794 dest->formal_ns = gfc_current_ns;
4795 /* Restore the current namespace to what it was on entry. */
4796 gfc_current_ns = parent_ns;
4797}
4798
4799
4800static int
4801std_for_isocbinding_symbol (int id)
4802{
4803 switch (id)
4804 {
4805#define NAMED_INTCST(a,b,c,d) \
4806 case a:\
4807 return d;
4808#include "iso-c-binding.def"
4809#undef NAMED_INTCST
4810
4811#define NAMED_FUNCTION(a,b,c,d) \
4812 case a:\
4813 return d;
4814#define NAMED_SUBROUTINE(a,b,c,d) \
4815 case a:\
4816 return d;
4817#include "iso-c-binding.def"
4818#undef NAMED_FUNCTION
4819#undef NAMED_SUBROUTINE
4820
4821 default:
4822 return GFC_STD_F2003;
4823 }
4824}
4825
4826/* Generate the given set of C interoperable kind objects, or all
4827 interoperable kinds. This function will only be given kind objects
4828 for valid iso_c_binding defined types because this is verified when
4829 the 'use' statement is parsed. If the user gives an 'only' clause,
4830 the specific kinds are looked up; if they don't exist, an error is
4831 reported. If the user does not give an 'only' clause, all
4832 iso_c_binding symbols are generated. If a list of specific kinds
4833 is given, it must have a NULL in the first empty spot to mark the
4834 end of the list. For C_null_(fun)ptr, dt_symtree has to be set and
4835 point to the symtree for c_(fun)ptr. */
4836
4837gfc_symtree *
4838generate_isocbinding_symbol (const char *mod_name, iso_c_binding_symbol s,
4839 const char *local_name, gfc_symtree *dt_symtree,
4840 bool hidden)
4841{
4842 const char *const name = (local_name && local_name[0])
4843 ? local_name : c_interop_kinds_table[s].name;
4844 gfc_symtree *tmp_symtree;
4845 gfc_symbol *tmp_sym = NULL;
4846 int index;
4847
4848 if (gfc_notification_std (std_for_isocbinding_symbol (id: s)) == ERROR)
4849 return NULL;
4850
4851 tmp_symtree = gfc_find_symtree (st: gfc_current_ns->sym_root, name);
4852 if (hidden
4853 && (!tmp_symtree || !tmp_symtree->n.sym
4854 || tmp_symtree->n.sym->from_intmod != INTMOD_ISO_C_BINDING
4855 || tmp_symtree->n.sym->intmod_sym_id != s))
4856 tmp_symtree = NULL;
4857
4858 /* Already exists in this scope so don't re-add it. */
4859 if (tmp_symtree != NULL && (tmp_sym = tmp_symtree->n.sym) != NULL
4860 && (!tmp_sym->attr.generic
4861 || (tmp_sym = gfc_find_dt_in_generic (tmp_sym)) != NULL)
4862 && tmp_sym->from_intmod == INTMOD_ISO_C_BINDING)
4863 {
4864 if (tmp_sym->attr.flavor == FL_DERIVED
4865 && !get_iso_c_binding_dt (sym_id: tmp_sym->intmod_sym_id))
4866 {
4867 if (gfc_derived_types)
4868 {
4869 tmp_sym->dt_next = gfc_derived_types->dt_next;
4870 gfc_derived_types->dt_next = tmp_sym;
4871 }
4872 else
4873 {
4874 tmp_sym->dt_next = tmp_sym;
4875 }
4876 gfc_derived_types = tmp_sym;
4877 }
4878
4879 return tmp_symtree;
4880 }
4881
4882 /* Create the sym tree in the current ns. */
4883 if (hidden)
4884 {
4885 tmp_symtree = gfc_get_unique_symtree (ns: gfc_current_ns);
4886 tmp_sym = gfc_new_symbol (name, ns: gfc_current_ns);
4887
4888 /* Add to the list of tentative symbols. */
4889 latest_undo_chgset->syms.safe_push (obj: tmp_sym);
4890 tmp_sym->old_symbol = NULL;
4891 tmp_sym->mark = 1;
4892 tmp_sym->gfc_new = 1;
4893
4894 tmp_symtree->n.sym = tmp_sym;
4895 tmp_sym->refs++;
4896 }
4897 else
4898 {
4899 gfc_get_sym_tree (name, ns: gfc_current_ns, result: &tmp_symtree, allow_subroutine: false);
4900 gcc_assert (tmp_symtree);
4901 tmp_sym = tmp_symtree->n.sym;
4902 }
4903
4904 /* Say what module this symbol belongs to. */
4905 tmp_sym->module = gfc_get_string ("%s", mod_name);
4906 tmp_sym->from_intmod = INTMOD_ISO_C_BINDING;
4907 tmp_sym->intmod_sym_id = s;
4908 tmp_sym->attr.is_iso_c = 1;
4909 tmp_sym->attr.use_assoc = 1;
4910
4911 gcc_assert (dt_symtree == NULL || s == ISOCBINDING_NULL_FUNPTR
4912 || s == ISOCBINDING_NULL_PTR);
4913
4914 switch (s)
4915 {
4916
4917#define NAMED_INTCST(a,b,c,d) case a :
4918#define NAMED_REALCST(a,b,c,d) case a :
4919#define NAMED_CMPXCST(a,b,c,d) case a :
4920#define NAMED_LOGCST(a,b,c) case a :
4921#define NAMED_CHARKNDCST(a,b,c) case a :
4922#include "iso-c-binding.def"
4923
4924 tmp_sym->value = gfc_get_int_expr (gfc_default_integer_kind, NULL,
4925 c_interop_kinds_table[s].value);
4926
4927 /* Initialize an integer constant expression node. */
4928 tmp_sym->attr.flavor = FL_PARAMETER;
4929 tmp_sym->ts.type = BT_INTEGER;
4930 tmp_sym->ts.kind = gfc_default_integer_kind;
4931
4932 /* Mark this type as a C interoperable one. */
4933 tmp_sym->ts.is_c_interop = 1;
4934 tmp_sym->ts.is_iso_c = 1;
4935 tmp_sym->value->ts.is_c_interop = 1;
4936 tmp_sym->value->ts.is_iso_c = 1;
4937 tmp_sym->attr.is_c_interop = 1;
4938
4939 /* Tell what f90 type this c interop kind is valid. */
4940 tmp_sym->ts.f90_type = c_interop_kinds_table[s].f90_type;
4941
4942 break;
4943
4944
4945#define NAMED_CHARCST(a,b,c) case a :
4946#include "iso-c-binding.def"
4947
4948 /* Initialize an integer constant expression node for the
4949 length of the character. */
4950 tmp_sym->value = gfc_get_character_expr (gfc_default_character_kind,
4951 &gfc_current_locus, NULL, len: 1);
4952 tmp_sym->value->ts.is_c_interop = 1;
4953 tmp_sym->value->ts.is_iso_c = 1;
4954 tmp_sym->value->value.character.length = 1;
4955 tmp_sym->value->value.character.string[0]
4956 = (gfc_char_t) c_interop_kinds_table[s].value;
4957 tmp_sym->ts.u.cl = gfc_new_charlen (ns: gfc_current_ns, NULL);
4958 tmp_sym->ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind,
4959 NULL, 1);
4960
4961 /* May not need this in both attr and ts, but do need in
4962 attr for writing module file. */
4963 tmp_sym->attr.is_c_interop = 1;
4964
4965 tmp_sym->attr.flavor = FL_PARAMETER;
4966 tmp_sym->ts.type = BT_CHARACTER;
4967
4968 /* Need to set it to the C_CHAR kind. */
4969 tmp_sym->ts.kind = gfc_default_character_kind;
4970
4971 /* Mark this type as a C interoperable one. */
4972 tmp_sym->ts.is_c_interop = 1;
4973 tmp_sym->ts.is_iso_c = 1;
4974
4975 /* Tell what f90 type this c interop kind is valid. */
4976 tmp_sym->ts.f90_type = BT_CHARACTER;
4977
4978 break;
4979
4980 case ISOCBINDING_PTR:
4981 case ISOCBINDING_FUNPTR:
4982 {
4983 gfc_symbol *dt_sym;
4984 gfc_component *tmp_comp = NULL;
4985
4986 /* Generate real derived type. */
4987 if (hidden)
4988 dt_sym = tmp_sym;
4989 else
4990 {
4991 const char *hidden_name;
4992 gfc_interface *intr, *head;
4993
4994 hidden_name = gfc_dt_upper_string (tmp_sym->name);
4995 tmp_symtree = gfc_find_symtree (st: gfc_current_ns->sym_root,
4996 name: hidden_name);
4997 gcc_assert (tmp_symtree == NULL);
4998 gfc_get_sym_tree (name: hidden_name, ns: gfc_current_ns, result: &tmp_symtree, allow_subroutine: false);
4999 dt_sym = tmp_symtree->n.sym;
5000 dt_sym->name = gfc_get_string (s == ISOCBINDING_PTR
5001 ? "c_ptr" : "c_funptr");
5002
5003 /* Generate an artificial generic function. */
5004 head = tmp_sym->generic;
5005 intr = gfc_get_interface ();
5006 intr->sym = dt_sym;
5007 intr->where = gfc_current_locus;
5008 intr->next = head;
5009 tmp_sym->generic = intr;
5010
5011 if (!tmp_sym->attr.generic
5012 && !gfc_add_generic (attr: &tmp_sym->attr, name: tmp_sym->name, NULL))
5013 return NULL;
5014
5015 if (!tmp_sym->attr.function
5016 && !gfc_add_function (attr: &tmp_sym->attr, name: tmp_sym->name, NULL))
5017 return NULL;
5018 }
5019
5020 /* Say what module this symbol belongs to. */
5021 dt_sym->module = gfc_get_string ("%s", mod_name);
5022 dt_sym->from_intmod = INTMOD_ISO_C_BINDING;
5023 dt_sym->intmod_sym_id = s;
5024 dt_sym->attr.use_assoc = 1;
5025
5026 /* Initialize an integer constant expression node. */
5027 dt_sym->attr.flavor = FL_DERIVED;
5028 dt_sym->ts.is_c_interop = 1;
5029 dt_sym->attr.is_c_interop = 1;
5030 dt_sym->attr.private_comp = 1;
5031 dt_sym->component_access = ACCESS_PRIVATE;
5032 dt_sym->ts.is_iso_c = 1;
5033 dt_sym->ts.type = BT_DERIVED;
5034 dt_sym->ts.f90_type = BT_VOID;
5035
5036 /* A derived type must have the bind attribute to be
5037 interoperable (J3/04-007, Section 15.2.3), even though
5038 the binding label is not used. */
5039 dt_sym->attr.is_bind_c = 1;
5040
5041 dt_sym->attr.referenced = 1;
5042 dt_sym->ts.u.derived = dt_sym;
5043
5044 /* Add the symbol created for the derived type to the current ns. */
5045 if (gfc_derived_types)
5046 {
5047 dt_sym->dt_next = gfc_derived_types->dt_next;
5048 gfc_derived_types->dt_next = dt_sym;
5049 }
5050 else
5051 {
5052 dt_sym->dt_next = dt_sym;
5053 }
5054 gfc_derived_types = dt_sym;
5055
5056 gfc_add_component (sym: dt_sym, name: "c_address", component: &tmp_comp);
5057 if (tmp_comp == NULL)
5058 gcc_unreachable ();
5059
5060 tmp_comp->ts.type = BT_INTEGER;
5061
5062 /* Set this because the module will need to read/write this field. */
5063 tmp_comp->ts.f90_type = BT_INTEGER;
5064
5065 /* The kinds for c_ptr and c_funptr are the same. */
5066 index = get_c_kind ("c_ptr", c_interop_kinds_table);
5067 tmp_comp->ts.kind = c_interop_kinds_table[index].value;
5068 tmp_comp->attr.access = ACCESS_PRIVATE;
5069
5070 /* Mark the component as C interoperable. */
5071 tmp_comp->ts.is_c_interop = 1;
5072 }
5073
5074 break;
5075
5076 case ISOCBINDING_NULL_PTR:
5077 case ISOCBINDING_NULL_FUNPTR:
5078 gen_special_c_interop_ptr (tmp_sym, dt_symtree);
5079 break;
5080
5081 default:
5082 gcc_unreachable ();
5083 }
5084 gfc_commit_symbol (sym: tmp_sym);
5085 return tmp_symtree;
5086}
5087
5088
5089/* Check that a symbol is already typed. If strict is not set, an untyped
5090 symbol is acceptable for non-standard-conforming mode. */
5091
5092bool
5093gfc_check_symbol_typed (gfc_symbol* sym, gfc_namespace* ns,
5094 bool strict, locus where)
5095{
5096 gcc_assert (sym);
5097
5098 if (gfc_matching_prefix)
5099 return true;
5100
5101 /* Check for the type and try to give it an implicit one. */
5102 if (sym->ts.type == BT_UNKNOWN
5103 && !gfc_set_default_type (sym, error_flag: 0, ns))
5104 {
5105 if (strict)
5106 {
5107 gfc_error ("Symbol %qs is used before it is typed at %L",
5108 sym->name, &where);
5109 return false;
5110 }
5111
5112 if (!gfc_notify_std (GFC_STD_GNU, "Symbol %qs is used before"
5113 " it is typed at %L", sym->name, &where))
5114 return false;
5115 }
5116
5117 /* Everything is ok. */
5118 return true;
5119}
5120
5121
5122/* Construct a typebound-procedure structure. Those are stored in a tentative
5123 list and marked `error' until symbols are committed. */
5124
5125gfc_typebound_proc*
5126gfc_get_typebound_proc (gfc_typebound_proc *tb0)
5127{
5128 gfc_typebound_proc *result;
5129
5130 result = XCNEW (gfc_typebound_proc);
5131 if (tb0)
5132 *result = *tb0;
5133 result->error = 1;
5134
5135 latest_undo_chgset->tbps.safe_push (obj: result);
5136
5137 return result;
5138}
5139
5140
5141/* Get the super-type of a given derived type. */
5142
5143gfc_symbol*
5144gfc_get_derived_super_type (gfc_symbol* derived)
5145{
5146 gcc_assert (derived);
5147
5148 if (derived->attr.generic)
5149 derived = gfc_find_dt_in_generic (derived);
5150
5151 if (!derived->attr.extension)
5152 return NULL;
5153
5154 gcc_assert (derived->components);
5155 gcc_assert (derived->components->ts.type == BT_DERIVED);
5156 gcc_assert (derived->components->ts.u.derived);
5157
5158 if (derived->components->ts.u.derived->attr.generic)
5159 return gfc_find_dt_in_generic (derived->components->ts.u.derived);
5160
5161 return derived->components->ts.u.derived;
5162}
5163
5164
5165/* Check if a derived type t2 is an extension of (or equal to) a type t1. */
5166
5167bool
5168gfc_type_is_extension_of (gfc_symbol *t1, gfc_symbol *t2)
5169{
5170 while (!gfc_compare_derived_types (t1, t2) && t2->attr.extension)
5171 t2 = gfc_get_derived_super_type (derived: t2);
5172 return gfc_compare_derived_types (t1, t2);
5173}
5174
5175
5176/* Check if two typespecs are type compatible (F03:5.1.1.2):
5177 If ts1 is nonpolymorphic, ts2 must be the same type.
5178 If ts1 is polymorphic (CLASS), ts2 must be an extension of ts1. */
5179
5180bool
5181gfc_type_compatible (gfc_typespec *ts1, gfc_typespec *ts2)
5182{
5183 bool is_class1 = (ts1->type == BT_CLASS);
5184 bool is_class2 = (ts2->type == BT_CLASS);
5185 bool is_derived1 = (ts1->type == BT_DERIVED);
5186 bool is_derived2 = (ts2->type == BT_DERIVED);
5187 bool is_union1 = (ts1->type == BT_UNION);
5188 bool is_union2 = (ts2->type == BT_UNION);
5189
5190 /* A boz-literal-constant has no type. */
5191 if (ts1->type == BT_BOZ || ts2->type == BT_BOZ)
5192 return false;
5193
5194 if (is_class1
5195 && ts1->u.derived->components
5196 && ((ts1->u.derived->attr.is_class
5197 && ts1->u.derived->components->ts.u.derived->attr
5198 .unlimited_polymorphic)
5199 || ts1->u.derived->attr.unlimited_polymorphic))
5200 return 1;
5201
5202 if (!is_derived1 && !is_derived2 && !is_class1 && !is_class2
5203 && !is_union1 && !is_union2)
5204 return (ts1->type == ts2->type);
5205
5206 if ((is_derived1 && is_derived2) || (is_union1 && is_union2))
5207 return gfc_compare_derived_types (ts1->u.derived, ts2->u.derived);
5208
5209 if (is_derived1 && is_class2)
5210 return gfc_compare_derived_types (ts1->u.derived,
5211 ts2->u.derived->attr.is_class ?
5212 ts2->u.derived->components->ts.u.derived
5213 : ts2->u.derived);
5214 if (is_class1 && is_derived2)
5215 return gfc_type_is_extension_of (t1: ts1->u.derived->attr.is_class ?
5216 ts1->u.derived->components->ts.u.derived
5217 : ts1->u.derived,
5218 t2: ts2->u.derived);
5219 else if (is_class1 && is_class2)
5220 return gfc_type_is_extension_of (t1: ts1->u.derived->attr.is_class ?
5221 ts1->u.derived->components->ts.u.derived
5222 : ts1->u.derived,
5223 t2: ts2->u.derived->attr.is_class ?
5224 ts2->u.derived->components->ts.u.derived
5225 : ts2->u.derived);
5226 else
5227 return 0;
5228}
5229
5230
5231/* Find the parent-namespace of the current function. If we're inside
5232 BLOCK constructs, it may not be the current one. */
5233
5234gfc_namespace*
5235gfc_find_proc_namespace (gfc_namespace* ns)
5236{
5237 while (ns->construct_entities)
5238 {
5239 ns = ns->parent;
5240 gcc_assert (ns);
5241 }
5242
5243 return ns;
5244}
5245
5246
5247/* Check if an associate-variable should be translated as an `implicit' pointer
5248 internally (if it is associated to a variable and not an array with
5249 descriptor). */
5250
5251bool
5252gfc_is_associate_pointer (gfc_symbol* sym)
5253{
5254 if (!sym->assoc)
5255 return false;
5256
5257 if (sym->ts.type == BT_CLASS)
5258 return true;
5259
5260 if (sym->ts.type == BT_CHARACTER
5261 && sym->ts.deferred
5262 && sym->assoc->target
5263 && sym->assoc->target->expr_type == EXPR_FUNCTION)
5264 return true;
5265
5266 if (!sym->assoc->variable)
5267 return false;
5268
5269 if (sym->attr.dimension && sym->as->type != AS_EXPLICIT)
5270 return false;
5271
5272 return true;
5273}
5274
5275
5276gfc_symbol *
5277gfc_find_dt_in_generic (gfc_symbol *sym)
5278{
5279 gfc_interface *intr = NULL;
5280
5281 if (!sym || gfc_fl_struct (sym->attr.flavor))
5282 return sym;
5283
5284 if (sym->attr.generic)
5285 for (intr = sym->generic; intr; intr = intr->next)
5286 if (gfc_fl_struct (intr->sym->attr.flavor))
5287 break;
5288 return intr ? intr->sym : NULL;
5289}
5290
5291
5292/* Get the dummy arguments from a procedure symbol. If it has been declared
5293 via a PROCEDURE statement with a named interface, ts.interface will be set
5294 and the arguments need to be taken from there. */
5295
5296gfc_formal_arglist *
5297gfc_sym_get_dummy_args (gfc_symbol *sym)
5298{
5299 gfc_formal_arglist *dummies;
5300
5301 if (sym == NULL)
5302 return NULL;
5303
5304 dummies = sym->formal;
5305 if (dummies == NULL && sym->ts.interface != NULL)
5306 dummies = sym->ts.interface->formal;
5307
5308 return dummies;
5309}
5310

source code of gcc/fortran/symbol.cc