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