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