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