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