Home | History | Annotate | Line # | Download | only in fortran
symbol.cc revision 1.1.1.1
      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
    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
    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
    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
    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 *
    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
    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*
    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
    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
    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
    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
    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
    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
    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
    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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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 *
   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 *
   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
   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*
   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 *
   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
   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
   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
   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
   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 *
   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
   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
   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 *
   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
   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 *
   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
   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 *
   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 *
   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 *
   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 *
   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
   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
   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
   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 *
   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
   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
   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*
   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
   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
   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
   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
   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
   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
   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
   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
   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 *
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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*
   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
   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
   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
   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
   4100 gfc_symbol_init_2 (void)
   4101 {
   4102 
   4103   gfc_current_ns = gfc_get_namespace (NULL, 0);
   4104 }
   4105 
   4106 
   4107 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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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 *
   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 *
   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
   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 *
   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
   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 *
   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
   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
   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
   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
   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
   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       /* Do not treat an actual deferred-length character argument wrongly
   4723 	 as template for the formal argument.  */
   4724       if (formal_arg->sym->ts.type == BT_CHARACTER
   4725 	  && !(formal_arg->sym->attr.allocatable
   4726 	       || formal_arg->sym->attr.pointer))
   4727 	formal_arg->sym->ts.deferred = false;
   4728 
   4729       if (formal_arg->sym->ts.type == BT_CHARACTER)
   4730 	formal_arg->sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
   4731 
   4732       /* If this isn't the first arg, set up the next ptr.  For the
   4733         last arg built, the formal_arg->next will never get set to
   4734         anything other than NULL.  */
   4735       if (formal_prev != NULL)
   4736 	formal_prev->next = formal_arg;
   4737       else
   4738 	formal_arg->next = NULL;
   4739 
   4740       formal_prev = formal_arg;
   4741 
   4742       /* Add arg to list of formal args.  */
   4743       add_formal_arg (&head, &tail, formal_arg, formal_arg->sym);
   4744 
   4745       /* Validate changes.  */
   4746       gfc_commit_symbol (formal_arg->sym);
   4747       if (actual)
   4748 	act_arg = act_arg->next;
   4749     }
   4750 
   4751   /* Add the interface to the symbol.  */
   4752   add_proc_interface (dest, IFSRC_DECL, head);
   4753 
   4754   /* Store the formal namespace information.  */
   4755   if (dest->formal != NULL)
   4756     /* The current ns should be that for the dest proc.  */
   4757     dest->formal_ns = gfc_current_ns;
   4758   /* Restore the current namespace to what it was on entry.  */
   4759   gfc_current_ns = parent_ns;
   4760 }
   4761 
   4762 
   4763 static int
   4764 std_for_isocbinding_symbol (int id)
   4765 {
   4766   switch (id)
   4767     {
   4768 #define NAMED_INTCST(a,b,c,d) \
   4769       case a:\
   4770         return d;
   4771 #include "iso-c-binding.def"
   4772 #undef NAMED_INTCST
   4773 
   4774 #define NAMED_FUNCTION(a,b,c,d) \
   4775       case a:\
   4776         return d;
   4777 #define NAMED_SUBROUTINE(a,b,c,d) \
   4778       case a:\
   4779         return d;
   4780 #include "iso-c-binding.def"
   4781 #undef NAMED_FUNCTION
   4782 #undef NAMED_SUBROUTINE
   4783 
   4784        default:
   4785          return GFC_STD_F2003;
   4786     }
   4787 }
   4788 
   4789 /* Generate the given set of C interoperable kind objects, or all
   4790    interoperable kinds.  This function will only be given kind objects
   4791    for valid iso_c_binding defined types because this is verified when
   4792    the 'use' statement is parsed.  If the user gives an 'only' clause,
   4793    the specific kinds are looked up; if they don't exist, an error is
   4794    reported.  If the user does not give an 'only' clause, all
   4795    iso_c_binding symbols are generated.  If a list of specific kinds
   4796    is given, it must have a NULL in the first empty spot to mark the
   4797    end of the list. For C_null_(fun)ptr, dt_symtree has to be set and
   4798    point to the symtree for c_(fun)ptr.  */
   4799 
   4800 gfc_symtree *
   4801 generate_isocbinding_symbol (const char *mod_name, iso_c_binding_symbol s,
   4802 			     const char *local_name, gfc_symtree *dt_symtree,
   4803 			     bool hidden)
   4804 {
   4805   const char *const name = (local_name && local_name[0])
   4806 			   ? local_name : c_interop_kinds_table[s].name;
   4807   gfc_symtree *tmp_symtree;
   4808   gfc_symbol *tmp_sym = NULL;
   4809   int index;
   4810 
   4811   if (gfc_notification_std (std_for_isocbinding_symbol (s)) == ERROR)
   4812     return NULL;
   4813 
   4814   tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
   4815   if (hidden
   4816       && (!tmp_symtree || !tmp_symtree->n.sym
   4817 	  || tmp_symtree->n.sym->from_intmod != INTMOD_ISO_C_BINDING
   4818 	  || tmp_symtree->n.sym->intmod_sym_id != s))
   4819     tmp_symtree = NULL;
   4820 
   4821   /* Already exists in this scope so don't re-add it.  */
   4822   if (tmp_symtree != NULL && (tmp_sym = tmp_symtree->n.sym) != NULL
   4823       && (!tmp_sym->attr.generic
   4824 	  || (tmp_sym = gfc_find_dt_in_generic (tmp_sym)) != NULL)
   4825       && tmp_sym->from_intmod == INTMOD_ISO_C_BINDING)
   4826     {
   4827       if (tmp_sym->attr.flavor == FL_DERIVED
   4828 	  && !get_iso_c_binding_dt (tmp_sym->intmod_sym_id))
   4829 	{
   4830 	  if (gfc_derived_types)
   4831 	    {
   4832 	      tmp_sym->dt_next = gfc_derived_types->dt_next;
   4833 	      gfc_derived_types->dt_next = tmp_sym;
   4834 	    }
   4835 	  else
   4836 	    {
   4837 	      tmp_sym->dt_next = tmp_sym;
   4838 	    }
   4839 	  gfc_derived_types = tmp_sym;
   4840         }
   4841 
   4842       return tmp_symtree;
   4843     }
   4844 
   4845   /* Create the sym tree in the current ns.  */
   4846   if (hidden)
   4847     {
   4848       tmp_symtree = gfc_get_unique_symtree (gfc_current_ns);
   4849       tmp_sym = gfc_new_symbol (name, gfc_current_ns);
   4850 
   4851       /* Add to the list of tentative symbols.  */
   4852       latest_undo_chgset->syms.safe_push (tmp_sym);
   4853       tmp_sym->old_symbol = NULL;
   4854       tmp_sym->mark = 1;
   4855       tmp_sym->gfc_new = 1;
   4856 
   4857       tmp_symtree->n.sym = tmp_sym;
   4858       tmp_sym->refs++;
   4859     }
   4860   else
   4861     {
   4862       gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false);
   4863       gcc_assert (tmp_symtree);
   4864       tmp_sym = tmp_symtree->n.sym;
   4865     }
   4866 
   4867   /* Say what module this symbol belongs to.  */
   4868   tmp_sym->module = gfc_get_string ("%s", mod_name);
   4869   tmp_sym->from_intmod = INTMOD_ISO_C_BINDING;
   4870   tmp_sym->intmod_sym_id = s;
   4871   tmp_sym->attr.is_iso_c = 1;
   4872   tmp_sym->attr.use_assoc = 1;
   4873 
   4874   gcc_assert (dt_symtree == NULL || s == ISOCBINDING_NULL_FUNPTR
   4875 	      || s == ISOCBINDING_NULL_PTR);
   4876 
   4877   switch (s)
   4878     {
   4879 
   4880 #define NAMED_INTCST(a,b,c,d) case a :
   4881 #define NAMED_REALCST(a,b,c,d) case a :
   4882 #define NAMED_CMPXCST(a,b,c,d) case a :
   4883 #define NAMED_LOGCST(a,b,c) case a :
   4884 #define NAMED_CHARKNDCST(a,b,c) case a :
   4885 #include "iso-c-binding.def"
   4886 
   4887 	tmp_sym->value = gfc_get_int_expr (gfc_default_integer_kind, NULL,
   4888 				 	   c_interop_kinds_table[s].value);
   4889 
   4890 	/* Initialize an integer constant expression node.  */
   4891 	tmp_sym->attr.flavor = FL_PARAMETER;
   4892 	tmp_sym->ts.type = BT_INTEGER;
   4893 	tmp_sym->ts.kind = gfc_default_integer_kind;
   4894 
   4895 	/* Mark this type as a C interoperable one.  */
   4896 	tmp_sym->ts.is_c_interop = 1;
   4897 	tmp_sym->ts.is_iso_c = 1;
   4898 	tmp_sym->value->ts.is_c_interop = 1;
   4899 	tmp_sym->value->ts.is_iso_c = 1;
   4900 	tmp_sym->attr.is_c_interop = 1;
   4901 
   4902 	/* Tell what f90 type this c interop kind is valid.  */
   4903 	tmp_sym->ts.f90_type = c_interop_kinds_table[s].f90_type;
   4904 
   4905 	break;
   4906 
   4907 
   4908 #define NAMED_CHARCST(a,b,c) case a :
   4909 #include "iso-c-binding.def"
   4910 
   4911 	/* Initialize an integer constant expression node for the
   4912 	   length of the character.  */
   4913 	tmp_sym->value = gfc_get_character_expr (gfc_default_character_kind,
   4914 						 &gfc_current_locus, NULL, 1);
   4915 	tmp_sym->value->ts.is_c_interop = 1;
   4916 	tmp_sym->value->ts.is_iso_c = 1;
   4917 	tmp_sym->value->value.character.length = 1;
   4918 	tmp_sym->value->value.character.string[0]
   4919 	  = (gfc_char_t) c_interop_kinds_table[s].value;
   4920 	tmp_sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
   4921 	tmp_sym->ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind,
   4922 						     NULL, 1);
   4923 
   4924 	/* May not need this in both attr and ts, but do need in
   4925 	   attr for writing module file.  */
   4926 	tmp_sym->attr.is_c_interop = 1;
   4927 
   4928 	tmp_sym->attr.flavor = FL_PARAMETER;
   4929 	tmp_sym->ts.type = BT_CHARACTER;
   4930 
   4931 	/* Need to set it to the C_CHAR kind.  */
   4932 	tmp_sym->ts.kind = gfc_default_character_kind;
   4933 
   4934 	/* Mark this type as a C interoperable one.  */
   4935 	tmp_sym->ts.is_c_interop = 1;
   4936 	tmp_sym->ts.is_iso_c = 1;
   4937 
   4938 	/* Tell what f90 type this c interop kind is valid.  */
   4939 	tmp_sym->ts.f90_type = BT_CHARACTER;
   4940 
   4941 	break;
   4942 
   4943       case ISOCBINDING_PTR:
   4944       case ISOCBINDING_FUNPTR:
   4945 	{
   4946 	  gfc_symbol *dt_sym;
   4947 	  gfc_component *tmp_comp = NULL;
   4948 
   4949 	  /* Generate real derived type.  */
   4950 	  if (hidden)
   4951 	    dt_sym = tmp_sym;
   4952 	  else
   4953 	    {
   4954 	      const char *hidden_name;
   4955 	      gfc_interface *intr, *head;
   4956 
   4957 	      hidden_name = gfc_dt_upper_string (tmp_sym->name);
   4958 	      tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
   4959 					      hidden_name);
   4960 	      gcc_assert (tmp_symtree == NULL);
   4961 	      gfc_get_sym_tree (hidden_name, gfc_current_ns, &tmp_symtree, false);
   4962 	      dt_sym = tmp_symtree->n.sym;
   4963 	      dt_sym->name = gfc_get_string (s == ISOCBINDING_PTR
   4964 					     ? "c_ptr" : "c_funptr");
   4965 
   4966 	      /* Generate an artificial generic function.  */
   4967 	      head = tmp_sym->generic;
   4968 	      intr = gfc_get_interface ();
   4969 	      intr->sym = dt_sym;
   4970 	      intr->where = gfc_current_locus;
   4971 	      intr->next = head;
   4972 	      tmp_sym->generic = intr;
   4973 
   4974 	      if (!tmp_sym->attr.generic
   4975 		  && !gfc_add_generic (&tmp_sym->attr, tmp_sym->name, NULL))
   4976 		return NULL;
   4977 
   4978 	      if (!tmp_sym->attr.function
   4979 		  && !gfc_add_function (&tmp_sym->attr, tmp_sym->name, NULL))
   4980 		return NULL;
   4981 	    }
   4982 
   4983 	  /* Say what module this symbol belongs to.  */
   4984 	  dt_sym->module = gfc_get_string ("%s", mod_name);
   4985 	  dt_sym->from_intmod = INTMOD_ISO_C_BINDING;
   4986 	  dt_sym->intmod_sym_id = s;
   4987           dt_sym->attr.use_assoc = 1;
   4988 
   4989 	  /* Initialize an integer constant expression node.  */
   4990 	  dt_sym->attr.flavor = FL_DERIVED;
   4991 	  dt_sym->ts.is_c_interop = 1;
   4992 	  dt_sym->attr.is_c_interop = 1;
   4993 	  dt_sym->attr.private_comp = 1;
   4994 	  dt_sym->component_access = ACCESS_PRIVATE;
   4995 	  dt_sym->ts.is_iso_c = 1;
   4996 	  dt_sym->ts.type = BT_DERIVED;
   4997 	  dt_sym->ts.f90_type = BT_VOID;
   4998 
   4999 	  /* A derived type must have the bind attribute to be
   5000 	     interoperable (J3/04-007, Section 15.2.3), even though
   5001 	     the binding label is not used.  */
   5002 	  dt_sym->attr.is_bind_c = 1;
   5003 
   5004 	  dt_sym->attr.referenced = 1;
   5005 	  dt_sym->ts.u.derived = dt_sym;
   5006 
   5007 	  /* Add the symbol created for the derived type to the current ns.  */
   5008 	  if (gfc_derived_types)
   5009 	    {
   5010 	      dt_sym->dt_next = gfc_derived_types->dt_next;
   5011 	      gfc_derived_types->dt_next = dt_sym;
   5012 	    }
   5013 	  else
   5014 	    {
   5015 	      dt_sym->dt_next = dt_sym;
   5016 	    }
   5017 	  gfc_derived_types = dt_sym;
   5018 
   5019 	  gfc_add_component (dt_sym, "c_address", &tmp_comp);
   5020 	  if (tmp_comp == NULL)
   5021 	    gcc_unreachable ();
   5022 
   5023 	  tmp_comp->ts.type = BT_INTEGER;
   5024 
   5025 	  /* Set this because the module will need to read/write this field.  */
   5026 	  tmp_comp->ts.f90_type = BT_INTEGER;
   5027 
   5028 	  /* The kinds for c_ptr and c_funptr are the same.  */
   5029 	  index = get_c_kind ("c_ptr", c_interop_kinds_table);
   5030 	  tmp_comp->ts.kind = c_interop_kinds_table[index].value;
   5031 	  tmp_comp->attr.access = ACCESS_PRIVATE;
   5032 
   5033 	  /* Mark the component as C interoperable.  */
   5034 	  tmp_comp->ts.is_c_interop = 1;
   5035 	}
   5036 
   5037 	break;
   5038 
   5039       case ISOCBINDING_NULL_PTR:
   5040       case ISOCBINDING_NULL_FUNPTR:
   5041         gen_special_c_interop_ptr (tmp_sym, dt_symtree);
   5042         break;
   5043 
   5044       default:
   5045 	gcc_unreachable ();
   5046     }
   5047   gfc_commit_symbol (tmp_sym);
   5048   return tmp_symtree;
   5049 }
   5050 
   5051 
   5052 /* Check that a symbol is already typed.  If strict is not set, an untyped
   5053    symbol is acceptable for non-standard-conforming mode.  */
   5054 
   5055 bool
   5056 gfc_check_symbol_typed (gfc_symbol* sym, gfc_namespace* ns,
   5057 			bool strict, locus where)
   5058 {
   5059   gcc_assert (sym);
   5060 
   5061   if (gfc_matching_prefix)
   5062     return true;
   5063 
   5064   /* Check for the type and try to give it an implicit one.  */
   5065   if (sym->ts.type == BT_UNKNOWN
   5066       && !gfc_set_default_type (sym, 0, ns))
   5067     {
   5068       if (strict)
   5069 	{
   5070 	  gfc_error ("Symbol %qs is used before it is typed at %L",
   5071 		     sym->name, &where);
   5072 	  return false;
   5073 	}
   5074 
   5075       if (!gfc_notify_std (GFC_STD_GNU, "Symbol %qs is used before"
   5076 			   " it is typed at %L", sym->name, &where))
   5077 	return false;
   5078     }
   5079 
   5080   /* Everything is ok.  */
   5081   return true;
   5082 }
   5083 
   5084 
   5085 /* Construct a typebound-procedure structure.  Those are stored in a tentative
   5086    list and marked `error' until symbols are committed.  */
   5087 
   5088 gfc_typebound_proc*
   5089 gfc_get_typebound_proc (gfc_typebound_proc *tb0)
   5090 {
   5091   gfc_typebound_proc *result;
   5092 
   5093   result = XCNEW (gfc_typebound_proc);
   5094   if (tb0)
   5095     *result = *tb0;
   5096   result->error = 1;
   5097 
   5098   latest_undo_chgset->tbps.safe_push (result);
   5099 
   5100   return result;
   5101 }
   5102 
   5103 
   5104 /* Get the super-type of a given derived type.  */
   5105 
   5106 gfc_symbol*
   5107 gfc_get_derived_super_type (gfc_symbol* derived)
   5108 {
   5109   gcc_assert (derived);
   5110 
   5111   if (derived->attr.generic)
   5112     derived = gfc_find_dt_in_generic (derived);
   5113 
   5114   if (!derived->attr.extension)
   5115     return NULL;
   5116 
   5117   gcc_assert (derived->components);
   5118   gcc_assert (derived->components->ts.type == BT_DERIVED);
   5119   gcc_assert (derived->components->ts.u.derived);
   5120 
   5121   if (derived->components->ts.u.derived->attr.generic)
   5122     return gfc_find_dt_in_generic (derived->components->ts.u.derived);
   5123 
   5124   return derived->components->ts.u.derived;
   5125 }
   5126 
   5127 
   5128 /* Check if a derived type t2 is an extension of (or equal to) a type t1.  */
   5129 
   5130 bool
   5131 gfc_type_is_extension_of (gfc_symbol *t1, gfc_symbol *t2)
   5132 {
   5133   while (!gfc_compare_derived_types (t1, t2) && t2->attr.extension)
   5134     t2 = gfc_get_derived_super_type (t2);
   5135   return gfc_compare_derived_types (t1, t2);
   5136 }
   5137 
   5138 
   5139 /* Check if two typespecs are type compatible (F03:5.1.1.2):
   5140    If ts1 is nonpolymorphic, ts2 must be the same type.
   5141    If ts1 is polymorphic (CLASS), ts2 must be an extension of ts1.  */
   5142 
   5143 bool
   5144 gfc_type_compatible (gfc_typespec *ts1, gfc_typespec *ts2)
   5145 {
   5146   bool is_class1 = (ts1->type == BT_CLASS);
   5147   bool is_class2 = (ts2->type == BT_CLASS);
   5148   bool is_derived1 = (ts1->type == BT_DERIVED);
   5149   bool is_derived2 = (ts2->type == BT_DERIVED);
   5150   bool is_union1 = (ts1->type == BT_UNION);
   5151   bool is_union2 = (ts2->type == BT_UNION);
   5152 
   5153   /* A boz-literal-constant has no type.  */
   5154   if (ts1->type == BT_BOZ || ts2->type == BT_BOZ)
   5155     return false;
   5156 
   5157   if (is_class1
   5158       && ts1->u.derived->components
   5159       && ((ts1->u.derived->attr.is_class
   5160 	   && ts1->u.derived->components->ts.u.derived->attr
   5161 							.unlimited_polymorphic)
   5162 	  || ts1->u.derived->attr.unlimited_polymorphic))
   5163     return 1;
   5164 
   5165   if (!is_derived1 && !is_derived2 && !is_class1 && !is_class2
   5166       && !is_union1 && !is_union2)
   5167     return (ts1->type == ts2->type);
   5168 
   5169   if ((is_derived1 && is_derived2) || (is_union1 && is_union2))
   5170     return gfc_compare_derived_types (ts1->u.derived, ts2->u.derived);
   5171 
   5172   if (is_derived1 && is_class2)
   5173     return gfc_compare_derived_types (ts1->u.derived,
   5174 				      ts2->u.derived->attr.is_class ?
   5175 				      ts2->u.derived->components->ts.u.derived
   5176 				      : ts2->u.derived);
   5177   if (is_class1 && is_derived2)
   5178     return gfc_type_is_extension_of (ts1->u.derived->attr.is_class ?
   5179 				       ts1->u.derived->components->ts.u.derived
   5180 				     : ts1->u.derived,
   5181 				     ts2->u.derived);
   5182   else if (is_class1 && is_class2)
   5183     return gfc_type_is_extension_of (ts1->u.derived->attr.is_class ?
   5184 				       ts1->u.derived->components->ts.u.derived
   5185 				     : ts1->u.derived,
   5186 				     ts2->u.derived->attr.is_class ?
   5187 				       ts2->u.derived->components->ts.u.derived
   5188 				     : ts2->u.derived);
   5189   else
   5190     return 0;
   5191 }
   5192 
   5193 
   5194 /* Find the parent-namespace of the current function.  If we're inside
   5195    BLOCK constructs, it may not be the current one.  */
   5196 
   5197 gfc_namespace*
   5198 gfc_find_proc_namespace (gfc_namespace* ns)
   5199 {
   5200   while (ns->construct_entities)
   5201     {
   5202       ns = ns->parent;
   5203       gcc_assert (ns);
   5204     }
   5205 
   5206   return ns;
   5207 }
   5208 
   5209 
   5210 /* Check if an associate-variable should be translated as an `implicit' pointer
   5211    internally (if it is associated to a variable and not an array with
   5212    descriptor).  */
   5213 
   5214 bool
   5215 gfc_is_associate_pointer (gfc_symbol* sym)
   5216 {
   5217   if (!sym->assoc)
   5218     return false;
   5219 
   5220   if (sym->ts.type == BT_CLASS)
   5221     return true;
   5222 
   5223   if (sym->ts.type == BT_CHARACTER
   5224       && sym->ts.deferred
   5225       && sym->assoc->target
   5226       && sym->assoc->target->expr_type == EXPR_FUNCTION)
   5227     return true;
   5228 
   5229   if (!sym->assoc->variable)
   5230     return false;
   5231 
   5232   if (sym->attr.dimension && sym->as->type != AS_EXPLICIT)
   5233     return false;
   5234 
   5235   return true;
   5236 }
   5237 
   5238 
   5239 gfc_symbol *
   5240 gfc_find_dt_in_generic (gfc_symbol *sym)
   5241 {
   5242   gfc_interface *intr = NULL;
   5243 
   5244   if (!sym || gfc_fl_struct (sym->attr.flavor))
   5245     return sym;
   5246 
   5247   if (sym->attr.generic)
   5248     for (intr = sym->generic; intr; intr = intr->next)
   5249       if (gfc_fl_struct (intr->sym->attr.flavor))
   5250         break;
   5251   return intr ? intr->sym : NULL;
   5252 }
   5253 
   5254 
   5255 /* Get the dummy arguments from a procedure symbol. If it has been declared
   5256    via a PROCEDURE statement with a named interface, ts.interface will be set
   5257    and the arguments need to be taken from there.  */
   5258 
   5259 gfc_formal_arglist *
   5260 gfc_sym_get_dummy_args (gfc_symbol *sym)
   5261 {
   5262   gfc_formal_arglist *dummies;
   5263 
   5264   if (sym == NULL)
   5265     return NULL;
   5266 
   5267   dummies = sym->formal;
   5268   if (dummies == NULL && sym->ts.interface != NULL)
   5269     dummies = sym->ts.interface->formal;
   5270 
   5271   return dummies;
   5272 }
   5273