1 /* Perform type resolution on the various structures.
2    Copyright (C) 2001-2019 Free Software Foundation, Inc.
3    Contributed by Andy Vaught
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "options.h"
25 #include "bitmap.h"
26 #include "gfortran.h"
27 #include "arith.h"  /* For gfc_compare_expr().  */
28 #include "dependency.h"
29 #include "data.h"
30 #include "target-memory.h" /* for gfc_simplify_transfer */
31 #include "constructor.h"
32 
33 /* Types used in equivalence statements.  */
34 
35 enum seq_type
36 {
37   SEQ_NONDEFAULT, SEQ_NUMERIC, SEQ_CHARACTER, SEQ_MIXED
38 };
39 
40 /* Stack to keep track of the nesting of blocks as we move through the
41    code.  See resolve_branch() and gfc_resolve_code().  */
42 
43 typedef struct code_stack
44 {
45   struct gfc_code *head, *current;
46   struct code_stack *prev;
47 
48   /* This bitmap keeps track of the targets valid for a branch from
49      inside this block except for END {IF|SELECT}s of enclosing
50      blocks.  */
51   bitmap reachable_labels;
52 }
53 code_stack;
54 
55 static code_stack *cs_base = NULL;
56 
57 
58 /* Nonzero if we're inside a FORALL or DO CONCURRENT block.  */
59 
60 static int forall_flag;
61 int gfc_do_concurrent_flag;
62 
63 /* True when we are resolving an expression that is an actual argument to
64    a procedure.  */
65 static bool actual_arg = false;
66 /* True when we are resolving an expression that is the first actual argument
67    to a procedure.  */
68 static bool first_actual_arg = false;
69 
70 
71 /* Nonzero if we're inside a OpenMP WORKSHARE or PARALLEL WORKSHARE block.  */
72 
73 static int omp_workshare_flag;
74 
75 /* True if we are processing a formal arglist. The corresponding function
76    resets the flag each time that it is read.  */
77 static bool formal_arg_flag = false;
78 
79 /* True if we are resolving a specification expression.  */
80 static bool specification_expr = false;
81 
82 /* The id of the last entry seen.  */
83 static int current_entry_id;
84 
85 /* We use bitmaps to determine if a branch target is valid.  */
86 static bitmap_obstack labels_obstack;
87 
88 /* True when simplifying a EXPR_VARIABLE argument to an inquiry function.  */
89 static bool inquiry_argument = false;
90 
91 
92 bool
gfc_is_formal_arg(void)93 gfc_is_formal_arg (void)
94 {
95   return formal_arg_flag;
96 }
97 
98 /* Is the symbol host associated?  */
99 static bool
is_sym_host_assoc(gfc_symbol * sym,gfc_namespace * ns)100 is_sym_host_assoc (gfc_symbol *sym, gfc_namespace *ns)
101 {
102   for (ns = ns->parent; ns; ns = ns->parent)
103     {
104       if (sym->ns == ns)
105 	return true;
106     }
107 
108   return false;
109 }
110 
111 /* Ensure a typespec used is valid; for instance, TYPE(t) is invalid if t is
112    an ABSTRACT derived-type.  If where is not NULL, an error message with that
113    locus is printed, optionally using name.  */
114 
115 static bool
resolve_typespec_used(gfc_typespec * ts,locus * where,const char * name)116 resolve_typespec_used (gfc_typespec* ts, locus* where, const char* name)
117 {
118   if (ts->type == BT_DERIVED && ts->u.derived->attr.abstract)
119     {
120       if (where)
121 	{
122 	  if (name)
123 	    gfc_error ("%qs at %L is of the ABSTRACT type %qs",
124 		       name, where, ts->u.derived->name);
125 	  else
126 	    gfc_error ("ABSTRACT type %qs used at %L",
127 		       ts->u.derived->name, where);
128 	}
129 
130       return false;
131     }
132 
133   return true;
134 }
135 
136 
137 static bool
check_proc_interface(gfc_symbol * ifc,locus * where)138 check_proc_interface (gfc_symbol *ifc, locus *where)
139 {
140   /* Several checks for F08:C1216.  */
141   if (ifc->attr.procedure)
142     {
143       gfc_error ("Interface %qs at %L is declared "
144 		 "in a later PROCEDURE statement", ifc->name, where);
145       return false;
146     }
147   if (ifc->generic)
148     {
149       /* For generic interfaces, check if there is
150 	 a specific procedure with the same name.  */
151       gfc_interface *gen = ifc->generic;
152       while (gen && strcmp (gen->sym->name, ifc->name) != 0)
153 	gen = gen->next;
154       if (!gen)
155 	{
156 	  gfc_error ("Interface %qs at %L may not be generic",
157 		     ifc->name, where);
158 	  return false;
159 	}
160     }
161   if (ifc->attr.proc == PROC_ST_FUNCTION)
162     {
163       gfc_error ("Interface %qs at %L may not be a statement function",
164 		 ifc->name, where);
165       return false;
166     }
167   if (gfc_is_intrinsic (ifc, 0, ifc->declared_at)
168       || gfc_is_intrinsic (ifc, 1, ifc->declared_at))
169     ifc->attr.intrinsic = 1;
170   if (ifc->attr.intrinsic && !gfc_intrinsic_actual_ok (ifc->name, 0))
171     {
172       gfc_error ("Intrinsic procedure %qs not allowed in "
173 		 "PROCEDURE statement at %L", ifc->name, where);
174       return false;
175     }
176   if (!ifc->attr.if_source && !ifc->attr.intrinsic && ifc->name[0] != '\0')
177     {
178       gfc_error ("Interface %qs at %L must be explicit", ifc->name, where);
179       return false;
180     }
181   return true;
182 }
183 
184 
185 static void resolve_symbol (gfc_symbol *sym);
186 
187 
188 /* Resolve the interface for a PROCEDURE declaration or procedure pointer.  */
189 
190 static bool
resolve_procedure_interface(gfc_symbol * sym)191 resolve_procedure_interface (gfc_symbol *sym)
192 {
193   gfc_symbol *ifc = sym->ts.interface;
194 
195   if (!ifc)
196     return true;
197 
198   if (ifc == sym)
199     {
200       gfc_error ("PROCEDURE %qs at %L may not be used as its own interface",
201 		 sym->name, &sym->declared_at);
202       return false;
203     }
204   if (!check_proc_interface (ifc, &sym->declared_at))
205     return false;
206 
207   if (ifc->attr.if_source || ifc->attr.intrinsic)
208     {
209       /* Resolve interface and copy attributes.  */
210       resolve_symbol (ifc);
211       if (ifc->attr.intrinsic)
212 	gfc_resolve_intrinsic (ifc, &ifc->declared_at);
213 
214       if (ifc->result)
215 	{
216 	  sym->ts = ifc->result->ts;
217 	  sym->attr.allocatable = ifc->result->attr.allocatable;
218 	  sym->attr.pointer = ifc->result->attr.pointer;
219 	  sym->attr.dimension = ifc->result->attr.dimension;
220 	  sym->attr.class_ok = ifc->result->attr.class_ok;
221 	  sym->as = gfc_copy_array_spec (ifc->result->as);
222 	  sym->result = sym;
223 	}
224       else
225 	{
226 	  sym->ts = ifc->ts;
227 	  sym->attr.allocatable = ifc->attr.allocatable;
228 	  sym->attr.pointer = ifc->attr.pointer;
229 	  sym->attr.dimension = ifc->attr.dimension;
230 	  sym->attr.class_ok = ifc->attr.class_ok;
231 	  sym->as = gfc_copy_array_spec (ifc->as);
232 	}
233       sym->ts.interface = ifc;
234       sym->attr.function = ifc->attr.function;
235       sym->attr.subroutine = ifc->attr.subroutine;
236 
237       sym->attr.pure = ifc->attr.pure;
238       sym->attr.elemental = ifc->attr.elemental;
239       sym->attr.contiguous = ifc->attr.contiguous;
240       sym->attr.recursive = ifc->attr.recursive;
241       sym->attr.always_explicit = ifc->attr.always_explicit;
242       sym->attr.ext_attr |= ifc->attr.ext_attr;
243       sym->attr.is_bind_c = ifc->attr.is_bind_c;
244       /* Copy char length.  */
245       if (ifc->ts.type == BT_CHARACTER && ifc->ts.u.cl)
246 	{
247 	  sym->ts.u.cl = gfc_new_charlen (sym->ns, ifc->ts.u.cl);
248 	  if (sym->ts.u.cl->length && !sym->ts.u.cl->resolved
249 	      && !gfc_resolve_expr (sym->ts.u.cl->length))
250 	    return false;
251 	}
252     }
253 
254   return true;
255 }
256 
257 
258 /* Resolve types of formal argument lists.  These have to be done early so that
259    the formal argument lists of module procedures can be copied to the
260    containing module before the individual procedures are resolved
261    individually.  We also resolve argument lists of procedures in interface
262    blocks because they are self-contained scoping units.
263 
264    Since a dummy argument cannot be a non-dummy procedure, the only
265    resort left for untyped names are the IMPLICIT types.  */
266 
267 static void
resolve_formal_arglist(gfc_symbol * proc)268 resolve_formal_arglist (gfc_symbol *proc)
269 {
270   gfc_formal_arglist *f;
271   gfc_symbol *sym;
272   bool saved_specification_expr;
273   int i;
274 
275   if (proc->result != NULL)
276     sym = proc->result;
277   else
278     sym = proc;
279 
280   if (gfc_elemental (proc)
281       || sym->attr.pointer || sym->attr.allocatable
282       || (sym->as && sym->as->rank != 0))
283     {
284       proc->attr.always_explicit = 1;
285       sym->attr.always_explicit = 1;
286     }
287 
288   formal_arg_flag = true;
289 
290   for (f = proc->formal; f; f = f->next)
291     {
292       gfc_array_spec *as;
293 
294       sym = f->sym;
295 
296       if (sym == NULL)
297 	{
298 	  /* Alternate return placeholder.  */
299 	  if (gfc_elemental (proc))
300 	    gfc_error ("Alternate return specifier in elemental subroutine "
301 		       "%qs at %L is not allowed", proc->name,
302 		       &proc->declared_at);
303 	  if (proc->attr.function)
304 	    gfc_error ("Alternate return specifier in function "
305 		       "%qs at %L is not allowed", proc->name,
306 		       &proc->declared_at);
307 	  continue;
308 	}
309       else if (sym->attr.procedure && sym->attr.if_source != IFSRC_DECL
310 	       && !resolve_procedure_interface (sym))
311 	return;
312 
313       if (strcmp (proc->name, sym->name) == 0)
314         {
315           gfc_error ("Self-referential argument "
316                      "%qs at %L is not allowed", sym->name,
317                      &proc->declared_at);
318           return;
319         }
320 
321       if (sym->attr.if_source != IFSRC_UNKNOWN)
322 	resolve_formal_arglist (sym);
323 
324       if (sym->attr.subroutine || sym->attr.external)
325 	{
326 	  if (sym->attr.flavor == FL_UNKNOWN)
327 	    gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, &sym->declared_at);
328 	}
329       else
330 	{
331 	  if (sym->ts.type == BT_UNKNOWN && !proc->attr.intrinsic
332 	      && (!sym->attr.function || sym->result == sym))
333 	    gfc_set_default_type (sym, 1, sym->ns);
334 	}
335 
336       as = sym->ts.type == BT_CLASS && sym->attr.class_ok
337 	   ? CLASS_DATA (sym)->as : sym->as;
338 
339       saved_specification_expr = specification_expr;
340       specification_expr = true;
341       gfc_resolve_array_spec (as, 0);
342       specification_expr = saved_specification_expr;
343 
344       /* We can't tell if an array with dimension (:) is assumed or deferred
345 	 shape until we know if it has the pointer or allocatable attributes.
346       */
347       if (as && as->rank > 0 && as->type == AS_DEFERRED
348 	  && ((sym->ts.type != BT_CLASS
349 	       && !(sym->attr.pointer || sym->attr.allocatable))
350               || (sym->ts.type == BT_CLASS
351 		  && !(CLASS_DATA (sym)->attr.class_pointer
352 		       || CLASS_DATA (sym)->attr.allocatable)))
353 	  && sym->attr.flavor != FL_PROCEDURE)
354 	{
355 	  as->type = AS_ASSUMED_SHAPE;
356 	  for (i = 0; i < as->rank; i++)
357 	    as->lower[i] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
358 	}
359 
360       if ((as && as->rank > 0 && as->type == AS_ASSUMED_SHAPE)
361 	  || (as && as->type == AS_ASSUMED_RANK)
362 	  || sym->attr.pointer || sym->attr.allocatable || sym->attr.target
363 	  || (sym->ts.type == BT_CLASS && sym->attr.class_ok
364 	      && (CLASS_DATA (sym)->attr.class_pointer
365 		  || CLASS_DATA (sym)->attr.allocatable
366 		  || CLASS_DATA (sym)->attr.target))
367 	  || sym->attr.optional)
368 	{
369 	  proc->attr.always_explicit = 1;
370 	  if (proc->result)
371 	    proc->result->attr.always_explicit = 1;
372 	}
373 
374       /* If the flavor is unknown at this point, it has to be a variable.
375 	 A procedure specification would have already set the type.  */
376 
377       if (sym->attr.flavor == FL_UNKNOWN)
378 	gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, &sym->declared_at);
379 
380       if (gfc_pure (proc))
381 	{
382 	  if (sym->attr.flavor == FL_PROCEDURE)
383 	    {
384 	      /* F08:C1279.  */
385 	      if (!gfc_pure (sym))
386 		{
387 		  gfc_error ("Dummy procedure %qs of PURE procedure at %L must "
388 			    "also be PURE", sym->name, &sym->declared_at);
389 		  continue;
390 		}
391 	    }
392 	  else if (!sym->attr.pointer)
393 	    {
394 	      if (proc->attr.function && sym->attr.intent != INTENT_IN)
395 		{
396 		  if (sym->attr.value)
397 		    gfc_notify_std (GFC_STD_F2008, "Argument %qs"
398 				    " of pure function %qs at %L with VALUE "
399 				    "attribute but without INTENT(IN)",
400 				    sym->name, proc->name, &sym->declared_at);
401 		  else
402 		    gfc_error ("Argument %qs of pure function %qs at %L must "
403 			       "be INTENT(IN) or VALUE", sym->name, proc->name,
404 			       &sym->declared_at);
405 		}
406 
407 	      if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN)
408 		{
409 		  if (sym->attr.value)
410 		    gfc_notify_std (GFC_STD_F2008, "Argument %qs"
411 				    " of pure subroutine %qs at %L with VALUE "
412 				    "attribute but without INTENT", sym->name,
413 				    proc->name, &sym->declared_at);
414 		  else
415 		    gfc_error ("Argument %qs of pure subroutine %qs at %L "
416 			       "must have its INTENT specified or have the "
417 			       "VALUE attribute", sym->name, proc->name,
418 			       &sym->declared_at);
419 		}
420 	    }
421 
422 	  /* F08:C1278a.  */
423 	  if (sym->ts.type == BT_CLASS && sym->attr.intent == INTENT_OUT)
424 	    {
425 	      gfc_error ("INTENT(OUT) argument %qs of pure procedure %qs at %L"
426 			 " may not be polymorphic", sym->name, proc->name,
427 			 &sym->declared_at);
428 	      continue;
429 	    }
430 	}
431 
432       if (proc->attr.implicit_pure)
433 	{
434 	  if (sym->attr.flavor == FL_PROCEDURE)
435 	    {
436 	      if (!gfc_pure (sym))
437 		proc->attr.implicit_pure = 0;
438 	    }
439 	  else if (!sym->attr.pointer)
440 	    {
441 	      if (proc->attr.function && sym->attr.intent != INTENT_IN
442 		  && !sym->value)
443 		proc->attr.implicit_pure = 0;
444 
445 	      if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN
446 		  && !sym->value)
447 		proc->attr.implicit_pure = 0;
448 	    }
449 	}
450 
451       if (gfc_elemental (proc))
452 	{
453 	  /* F08:C1289.  */
454 	  if (sym->attr.codimension
455 	      || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
456 		  && CLASS_DATA (sym)->attr.codimension))
457 	    {
458 	      gfc_error ("Coarray dummy argument %qs at %L to elemental "
459 			 "procedure", sym->name, &sym->declared_at);
460 	      continue;
461 	    }
462 
463 	  if (sym->as || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
464 			  && CLASS_DATA (sym)->as))
465 	    {
466 	      gfc_error ("Argument %qs of elemental procedure at %L must "
467 			 "be scalar", sym->name, &sym->declared_at);
468 	      continue;
469 	    }
470 
471 	  if (sym->attr.allocatable
472 	      || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
473 		  && CLASS_DATA (sym)->attr.allocatable))
474 	    {
475 	      gfc_error ("Argument %qs of elemental procedure at %L cannot "
476 			 "have the ALLOCATABLE attribute", sym->name,
477 			 &sym->declared_at);
478 	      continue;
479 	    }
480 
481 	  if (sym->attr.pointer
482 	      || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
483 		  && CLASS_DATA (sym)->attr.class_pointer))
484 	    {
485 	      gfc_error ("Argument %qs of elemental procedure at %L cannot "
486 			 "have the POINTER attribute", sym->name,
487 			 &sym->declared_at);
488 	      continue;
489 	    }
490 
491 	  if (sym->attr.flavor == FL_PROCEDURE)
492 	    {
493 	      gfc_error ("Dummy procedure %qs not allowed in elemental "
494 			 "procedure %qs at %L", sym->name, proc->name,
495 			 &sym->declared_at);
496 	      continue;
497 	    }
498 
499 	  /* Fortran 2008 Corrigendum 1, C1290a.  */
500 	  if (sym->attr.intent == INTENT_UNKNOWN && !sym->attr.value)
501 	    {
502 	      gfc_error ("Argument %qs of elemental procedure %qs at %L must "
503 			 "have its INTENT specified or have the VALUE "
504 			 "attribute", sym->name, proc->name,
505 			 &sym->declared_at);
506 	      continue;
507 	    }
508 	}
509 
510       /* Each dummy shall be specified to be scalar.  */
511       if (proc->attr.proc == PROC_ST_FUNCTION)
512 	{
513 	  if (sym->as != NULL)
514 	    {
515 	      /* F03:C1263 (R1238) The function-name and each dummy-arg-name
516 		 shall be specified, explicitly or implicitly, to be scalar.  */
517 	      gfc_error ("Argument '%s' of statement function '%s' at %L "
518 			 "must be scalar", sym->name, proc->name,
519 			 &proc->declared_at);
520 	      continue;
521 	    }
522 
523 	  if (sym->ts.type == BT_CHARACTER)
524 	    {
525 	      gfc_charlen *cl = sym->ts.u.cl;
526 	      if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
527 		{
528 		  gfc_error ("Character-valued argument %qs of statement "
529 			     "function at %L must have constant length",
530 			     sym->name, &sym->declared_at);
531 		  continue;
532 		}
533 	    }
534 	}
535     }
536   formal_arg_flag = false;
537 }
538 
539 
540 /* Work function called when searching for symbols that have argument lists
541    associated with them.  */
542 
543 static void
find_arglists(gfc_symbol * sym)544 find_arglists (gfc_symbol *sym)
545 {
546   if (sym->attr.if_source == IFSRC_UNKNOWN || sym->ns != gfc_current_ns
547       || gfc_fl_struct (sym->attr.flavor) || sym->attr.intrinsic)
548     return;
549 
550   resolve_formal_arglist (sym);
551 }
552 
553 
554 /* Given a namespace, resolve all formal argument lists within the namespace.
555  */
556 
557 static void
resolve_formal_arglists(gfc_namespace * ns)558 resolve_formal_arglists (gfc_namespace *ns)
559 {
560   if (ns == NULL)
561     return;
562 
563   gfc_traverse_ns (ns, find_arglists);
564 }
565 
566 
567 static void
resolve_contained_fntype(gfc_symbol * sym,gfc_namespace * ns)568 resolve_contained_fntype (gfc_symbol *sym, gfc_namespace *ns)
569 {
570   bool t;
571 
572   if (sym && sym->attr.flavor == FL_PROCEDURE
573       && sym->ns->parent
574       && sym->ns->parent->proc_name
575       && sym->ns->parent->proc_name->attr.flavor == FL_PROCEDURE
576       && !strcmp (sym->name, sym->ns->parent->proc_name->name))
577     gfc_error ("Contained procedure %qs at %L has the same name as its "
578 	       "encompassing procedure", sym->name, &sym->declared_at);
579 
580   /* If this namespace is not a function or an entry master function,
581      ignore it.  */
582   if (! sym || !(sym->attr.function || sym->attr.flavor == FL_VARIABLE)
583       || sym->attr.entry_master)
584     return;
585 
586   /* Try to find out of what the return type is.  */
587   if (sym->result->ts.type == BT_UNKNOWN && sym->result->ts.interface == NULL)
588     {
589       t = gfc_set_default_type (sym->result, 0, ns);
590 
591       if (!t && !sym->result->attr.untyped)
592 	{
593 	  if (sym->result == sym)
594 	    gfc_error ("Contained function %qs at %L has no IMPLICIT type",
595 		       sym->name, &sym->declared_at);
596 	  else if (!sym->result->attr.proc_pointer)
597 	    gfc_error ("Result %qs of contained function %qs at %L has "
598 		       "no IMPLICIT type", sym->result->name, sym->name,
599 		       &sym->result->declared_at);
600 	  sym->result->attr.untyped = 1;
601 	}
602     }
603 
604   /* Fortran 2008 Draft Standard, page 535, C418, on type-param-value
605      type, lists the only ways a character length value of * can be used:
606      dummy arguments of procedures, named constants, function results and
607      in allocate statements if the allocate_object is an assumed length dummy
608      in external functions.  Internal function results and results of module
609      procedures are not on this list, ergo, not permitted.  */
610 
611   if (sym->result->ts.type == BT_CHARACTER)
612     {
613       gfc_charlen *cl = sym->result->ts.u.cl;
614       if ((!cl || !cl->length) && !sym->result->ts.deferred)
615 	{
616 	  /* See if this is a module-procedure and adapt error message
617 	     accordingly.  */
618 	  bool module_proc;
619 	  gcc_assert (ns->parent && ns->parent->proc_name);
620 	  module_proc = (ns->parent->proc_name->attr.flavor == FL_MODULE);
621 
622 	  gfc_error (module_proc
623 		     ? G_("Character-valued module procedure %qs at %L"
624 			  " must not be assumed length")
625 		     : G_("Character-valued internal function %qs at %L"
626 			  " must not be assumed length"),
627 		     sym->name, &sym->declared_at);
628 	}
629     }
630 }
631 
632 
633 /* Add NEW_ARGS to the formal argument list of PROC, taking care not to
634    introduce duplicates.  */
635 
636 static void
merge_argument_lists(gfc_symbol * proc,gfc_formal_arglist * new_args)637 merge_argument_lists (gfc_symbol *proc, gfc_formal_arglist *new_args)
638 {
639   gfc_formal_arglist *f, *new_arglist;
640   gfc_symbol *new_sym;
641 
642   for (; new_args != NULL; new_args = new_args->next)
643     {
644       new_sym = new_args->sym;
645       /* See if this arg is already in the formal argument list.  */
646       for (f = proc->formal; f; f = f->next)
647 	{
648 	  if (new_sym == f->sym)
649 	    break;
650 	}
651 
652       if (f)
653 	continue;
654 
655       /* Add a new argument.  Argument order is not important.  */
656       new_arglist = gfc_get_formal_arglist ();
657       new_arglist->sym = new_sym;
658       new_arglist->next = proc->formal;
659       proc->formal  = new_arglist;
660     }
661 }
662 
663 
664 /* Flag the arguments that are not present in all entries.  */
665 
666 static void
check_argument_lists(gfc_symbol * proc,gfc_formal_arglist * new_args)667 check_argument_lists (gfc_symbol *proc, gfc_formal_arglist *new_args)
668 {
669   gfc_formal_arglist *f, *head;
670   head = new_args;
671 
672   for (f = proc->formal; f; f = f->next)
673     {
674       if (f->sym == NULL)
675 	continue;
676 
677       for (new_args = head; new_args; new_args = new_args->next)
678 	{
679 	  if (new_args->sym == f->sym)
680 	    break;
681 	}
682 
683       if (new_args)
684 	continue;
685 
686       f->sym->attr.not_always_present = 1;
687     }
688 }
689 
690 
691 /* Resolve alternate entry points.  If a symbol has multiple entry points we
692    create a new master symbol for the main routine, and turn the existing
693    symbol into an entry point.  */
694 
695 static void
resolve_entries(gfc_namespace * ns)696 resolve_entries (gfc_namespace *ns)
697 {
698   gfc_namespace *old_ns;
699   gfc_code *c;
700   gfc_symbol *proc;
701   gfc_entry_list *el;
702   char name[GFC_MAX_SYMBOL_LEN + 1];
703   static int master_count = 0;
704 
705   if (ns->proc_name == NULL)
706     return;
707 
708   /* No need to do anything if this procedure doesn't have alternate entry
709      points.  */
710   if (!ns->entries)
711     return;
712 
713   /* We may already have resolved alternate entry points.  */
714   if (ns->proc_name->attr.entry_master)
715     return;
716 
717   /* If this isn't a procedure something has gone horribly wrong.  */
718   gcc_assert (ns->proc_name->attr.flavor == FL_PROCEDURE);
719 
720   /* Remember the current namespace.  */
721   old_ns = gfc_current_ns;
722 
723   gfc_current_ns = ns;
724 
725   /* Add the main entry point to the list of entry points.  */
726   el = gfc_get_entry_list ();
727   el->sym = ns->proc_name;
728   el->id = 0;
729   el->next = ns->entries;
730   ns->entries = el;
731   ns->proc_name->attr.entry = 1;
732 
733   /* If it is a module function, it needs to be in the right namespace
734      so that gfc_get_fake_result_decl can gather up the results. The
735      need for this arose in get_proc_name, where these beasts were
736      left in their own namespace, to keep prior references linked to
737      the entry declaration.*/
738   if (ns->proc_name->attr.function
739       && ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
740     el->sym->ns = ns;
741 
742   /* Do the same for entries where the master is not a module
743      procedure.  These are retained in the module namespace because
744      of the module procedure declaration.  */
745   for (el = el->next; el; el = el->next)
746     if (el->sym->ns->proc_name->attr.flavor == FL_MODULE
747 	  && el->sym->attr.mod_proc)
748       el->sym->ns = ns;
749   el = ns->entries;
750 
751   /* Add an entry statement for it.  */
752   c = gfc_get_code (EXEC_ENTRY);
753   c->ext.entry = el;
754   c->next = ns->code;
755   ns->code = c;
756 
757   /* Create a new symbol for the master function.  */
758   /* Give the internal function a unique name (within this file).
759      Also include the function name so the user has some hope of figuring
760      out what is going on.  */
761   snprintf (name, GFC_MAX_SYMBOL_LEN, "master.%d.%s",
762 	    master_count++, ns->proc_name->name);
763   gfc_get_ha_symbol (name, &proc);
764   gcc_assert (proc != NULL);
765 
766   gfc_add_procedure (&proc->attr, PROC_INTERNAL, proc->name, NULL);
767   if (ns->proc_name->attr.subroutine)
768     gfc_add_subroutine (&proc->attr, proc->name, NULL);
769   else
770     {
771       gfc_symbol *sym;
772       gfc_typespec *ts, *fts;
773       gfc_array_spec *as, *fas;
774       gfc_add_function (&proc->attr, proc->name, NULL);
775       proc->result = proc;
776       fas = ns->entries->sym->as;
777       fas = fas ? fas : ns->entries->sym->result->as;
778       fts = &ns->entries->sym->result->ts;
779       if (fts->type == BT_UNKNOWN)
780 	fts = gfc_get_default_type (ns->entries->sym->result->name, NULL);
781       for (el = ns->entries->next; el; el = el->next)
782 	{
783 	  ts = &el->sym->result->ts;
784 	  as = el->sym->as;
785 	  as = as ? as : el->sym->result->as;
786 	  if (ts->type == BT_UNKNOWN)
787 	    ts = gfc_get_default_type (el->sym->result->name, NULL);
788 
789 	  if (! gfc_compare_types (ts, fts)
790 	      || (el->sym->result->attr.dimension
791 		  != ns->entries->sym->result->attr.dimension)
792 	      || (el->sym->result->attr.pointer
793 		  != ns->entries->sym->result->attr.pointer))
794 	    break;
795 	  else if (as && fas && ns->entries->sym->result != el->sym->result
796 		      && gfc_compare_array_spec (as, fas) == 0)
797 	    gfc_error ("Function %s at %L has entries with mismatched "
798 		       "array specifications", ns->entries->sym->name,
799 		       &ns->entries->sym->declared_at);
800 	  /* The characteristics need to match and thus both need to have
801 	     the same string length, i.e. both len=*, or both len=4.
802 	     Having both len=<variable> is also possible, but difficult to
803 	     check at compile time.  */
804 	  else if (ts->type == BT_CHARACTER && ts->u.cl && fts->u.cl
805 		   && (((ts->u.cl->length && !fts->u.cl->length)
806 			||(!ts->u.cl->length && fts->u.cl->length))
807 		       || (ts->u.cl->length
808 			   && ts->u.cl->length->expr_type
809 			      != fts->u.cl->length->expr_type)
810 		       || (ts->u.cl->length
811 			   && ts->u.cl->length->expr_type == EXPR_CONSTANT
812 		           && mpz_cmp (ts->u.cl->length->value.integer,
813 				       fts->u.cl->length->value.integer) != 0)))
814 	    gfc_notify_std (GFC_STD_GNU, "Function %s at %L with "
815 			    "entries returning variables of different "
816 			    "string lengths", ns->entries->sym->name,
817 			    &ns->entries->sym->declared_at);
818 	}
819 
820       if (el == NULL)
821 	{
822 	  sym = ns->entries->sym->result;
823 	  /* All result types the same.  */
824 	  proc->ts = *fts;
825 	  if (sym->attr.dimension)
826 	    gfc_set_array_spec (proc, gfc_copy_array_spec (sym->as), NULL);
827 	  if (sym->attr.pointer)
828 	    gfc_add_pointer (&proc->attr, NULL);
829 	}
830       else
831 	{
832 	  /* Otherwise the result will be passed through a union by
833 	     reference.  */
834 	  proc->attr.mixed_entry_master = 1;
835 	  for (el = ns->entries; el; el = el->next)
836 	    {
837 	      sym = el->sym->result;
838 	      if (sym->attr.dimension)
839 		{
840 		  if (el == ns->entries)
841 		    gfc_error ("FUNCTION result %s cannot be an array in "
842 			       "FUNCTION %s at %L", sym->name,
843 			       ns->entries->sym->name, &sym->declared_at);
844 		  else
845 		    gfc_error ("ENTRY result %s cannot be an array in "
846 			       "FUNCTION %s at %L", sym->name,
847 			       ns->entries->sym->name, &sym->declared_at);
848 		}
849 	      else if (sym->attr.pointer)
850 		{
851 		  if (el == ns->entries)
852 		    gfc_error ("FUNCTION result %s cannot be a POINTER in "
853 			       "FUNCTION %s at %L", sym->name,
854 			       ns->entries->sym->name, &sym->declared_at);
855 		  else
856 		    gfc_error ("ENTRY result %s cannot be a POINTER in "
857 			       "FUNCTION %s at %L", sym->name,
858 			       ns->entries->sym->name, &sym->declared_at);
859 		}
860 	      else
861 		{
862 		  ts = &sym->ts;
863 		  if (ts->type == BT_UNKNOWN)
864 		    ts = gfc_get_default_type (sym->name, NULL);
865 		  switch (ts->type)
866 		    {
867 		    case BT_INTEGER:
868 		      if (ts->kind == gfc_default_integer_kind)
869 			sym = NULL;
870 		      break;
871 		    case BT_REAL:
872 		      if (ts->kind == gfc_default_real_kind
873 			  || ts->kind == gfc_default_double_kind)
874 			sym = NULL;
875 		      break;
876 		    case BT_COMPLEX:
877 		      if (ts->kind == gfc_default_complex_kind)
878 			sym = NULL;
879 		      break;
880 		    case BT_LOGICAL:
881 		      if (ts->kind == gfc_default_logical_kind)
882 			sym = NULL;
883 		      break;
884 		    case BT_UNKNOWN:
885 		      /* We will issue error elsewhere.  */
886 		      sym = NULL;
887 		      break;
888 		    default:
889 		      break;
890 		    }
891 		  if (sym)
892 		    {
893 		      if (el == ns->entries)
894 			gfc_error ("FUNCTION result %s cannot be of type %s "
895 				   "in FUNCTION %s at %L", sym->name,
896 				   gfc_typename (ts), ns->entries->sym->name,
897 				   &sym->declared_at);
898 		      else
899 			gfc_error ("ENTRY result %s cannot be of type %s "
900 				   "in FUNCTION %s at %L", sym->name,
901 				   gfc_typename (ts), ns->entries->sym->name,
902 				   &sym->declared_at);
903 		    }
904 		}
905 	    }
906 	}
907     }
908   proc->attr.access = ACCESS_PRIVATE;
909   proc->attr.entry_master = 1;
910 
911   /* Merge all the entry point arguments.  */
912   for (el = ns->entries; el; el = el->next)
913     merge_argument_lists (proc, el->sym->formal);
914 
915   /* Check the master formal arguments for any that are not
916      present in all entry points.  */
917   for (el = ns->entries; el; el = el->next)
918     check_argument_lists (proc, el->sym->formal);
919 
920   /* Use the master function for the function body.  */
921   ns->proc_name = proc;
922 
923   /* Finalize the new symbols.  */
924   gfc_commit_symbols ();
925 
926   /* Restore the original namespace.  */
927   gfc_current_ns = old_ns;
928 }
929 
930 
931 /* Resolve common variables.  */
932 static void
resolve_common_vars(gfc_common_head * common_block,bool named_common)933 resolve_common_vars (gfc_common_head *common_block, bool named_common)
934 {
935   gfc_symbol *csym = common_block->head;
936 
937   for (; csym; csym = csym->common_next)
938     {
939       /* gfc_add_in_common may have been called before, but the reported errors
940 	 have been ignored to continue parsing.
941 	 We do the checks again here.  */
942       if (!csym->attr.use_assoc)
943 	{
944 	  gfc_add_in_common (&csym->attr, csym->name, &common_block->where);
945 	  gfc_notify_std (GFC_STD_F2018_OBS, "COMMON block at %L",
946 			  &common_block->where);
947 	}
948 
949       if (csym->value || csym->attr.data)
950 	{
951 	  if (!csym->ns->is_block_data)
952 	    gfc_notify_std (GFC_STD_GNU, "Variable %qs at %L is in COMMON "
953 			    "but only in BLOCK DATA initialization is "
954 			    "allowed", csym->name, &csym->declared_at);
955 	  else if (!named_common)
956 	    gfc_notify_std (GFC_STD_GNU, "Initialized variable %qs at %L is "
957 			    "in a blank COMMON but initialization is only "
958 			    "allowed in named common blocks", csym->name,
959 			    &csym->declared_at);
960 	}
961 
962       if (UNLIMITED_POLY (csym))
963 	gfc_error_now ("%qs in cannot appear in COMMON at %L "
964 		       "[F2008:C5100]", csym->name, &csym->declared_at);
965 
966       if (csym->ts.type != BT_DERIVED)
967 	continue;
968 
969       if (!(csym->ts.u.derived->attr.sequence
970 	    || csym->ts.u.derived->attr.is_bind_c))
971 	gfc_error_now ("Derived type variable %qs in COMMON at %L "
972 		       "has neither the SEQUENCE nor the BIND(C) "
973 		       "attribute", csym->name, &csym->declared_at);
974       if (csym->ts.u.derived->attr.alloc_comp)
975 	gfc_error_now ("Derived type variable %qs in COMMON at %L "
976 		       "has an ultimate component that is "
977 		       "allocatable", csym->name, &csym->declared_at);
978       if (gfc_has_default_initializer (csym->ts.u.derived))
979 	gfc_error_now ("Derived type variable %qs in COMMON at %L "
980 		       "may not have default initializer", csym->name,
981 		       &csym->declared_at);
982 
983       if (csym->attr.flavor == FL_UNKNOWN && !csym->attr.proc_pointer)
984 	gfc_add_flavor (&csym->attr, FL_VARIABLE, csym->name, &csym->declared_at);
985     }
986 }
987 
988 /* Resolve common blocks.  */
989 static void
resolve_common_blocks(gfc_symtree * common_root)990 resolve_common_blocks (gfc_symtree *common_root)
991 {
992   gfc_symbol *sym;
993   gfc_gsymbol * gsym;
994 
995   if (common_root == NULL)
996     return;
997 
998   if (common_root->left)
999     resolve_common_blocks (common_root->left);
1000   if (common_root->right)
1001     resolve_common_blocks (common_root->right);
1002 
1003   resolve_common_vars (common_root->n.common, true);
1004 
1005   /* The common name is a global name - in Fortran 2003 also if it has a
1006      C binding name, since Fortran 2008 only the C binding name is a global
1007      identifier.  */
1008   if (!common_root->n.common->binding_label
1009       || gfc_notification_std (GFC_STD_F2008))
1010     {
1011       gsym = gfc_find_gsymbol (gfc_gsym_root,
1012 			       common_root->n.common->name);
1013 
1014       if (gsym && gfc_notification_std (GFC_STD_F2008)
1015 	  && gsym->type == GSYM_COMMON
1016 	  && ((common_root->n.common->binding_label
1017 	       && (!gsym->binding_label
1018 		   || strcmp (common_root->n.common->binding_label,
1019 			      gsym->binding_label) != 0))
1020 	      || (!common_root->n.common->binding_label
1021 		  && gsym->binding_label)))
1022 	{
1023 	  gfc_error ("In Fortran 2003 COMMON %qs block at %L is a global "
1024 		     "identifier and must thus have the same binding name "
1025 		     "as the same-named COMMON block at %L: %s vs %s",
1026 		     common_root->n.common->name, &common_root->n.common->where,
1027 		     &gsym->where,
1028 		     common_root->n.common->binding_label
1029 		     ? common_root->n.common->binding_label : "(blank)",
1030 		     gsym->binding_label ? gsym->binding_label : "(blank)");
1031 	  return;
1032 	}
1033 
1034       if (gsym && gsym->type != GSYM_COMMON
1035 	  && !common_root->n.common->binding_label)
1036 	{
1037 	  gfc_error ("COMMON block %qs at %L uses the same global identifier "
1038 		     "as entity at %L",
1039 		     common_root->n.common->name, &common_root->n.common->where,
1040 		     &gsym->where);
1041 	  return;
1042 	}
1043       if (gsym && gsym->type != GSYM_COMMON)
1044 	{
1045 	  gfc_error ("Fortran 2008: COMMON block %qs with binding label at "
1046 		     "%L sharing the identifier with global non-COMMON-block "
1047 		     "entity at %L", common_root->n.common->name,
1048 		     &common_root->n.common->where, &gsym->where);
1049 	  return;
1050 	}
1051       if (!gsym)
1052 	{
1053 	  gsym = gfc_get_gsymbol (common_root->n.common->name, false);
1054 	  gsym->type = GSYM_COMMON;
1055 	  gsym->where = common_root->n.common->where;
1056 	  gsym->defined = 1;
1057 	}
1058       gsym->used = 1;
1059     }
1060 
1061   if (common_root->n.common->binding_label)
1062     {
1063       gsym = gfc_find_gsymbol (gfc_gsym_root,
1064 			       common_root->n.common->binding_label);
1065       if (gsym && gsym->type != GSYM_COMMON)
1066 	{
1067 	  gfc_error ("COMMON block at %L with binding label %qs uses the same "
1068 		     "global identifier as entity at %L",
1069 		     &common_root->n.common->where,
1070 		     common_root->n.common->binding_label, &gsym->where);
1071 	  return;
1072 	}
1073       if (!gsym)
1074 	{
1075 	  gsym = gfc_get_gsymbol (common_root->n.common->binding_label, true);
1076 	  gsym->type = GSYM_COMMON;
1077 	  gsym->where = common_root->n.common->where;
1078 	  gsym->defined = 1;
1079 	}
1080       gsym->used = 1;
1081     }
1082 
1083   gfc_find_symbol (common_root->name, gfc_current_ns, 0, &sym);
1084   if (sym == NULL)
1085     return;
1086 
1087   if (sym->attr.flavor == FL_PARAMETER)
1088     gfc_error ("COMMON block %qs at %L is used as PARAMETER at %L",
1089 	       sym->name, &common_root->n.common->where, &sym->declared_at);
1090 
1091   if (sym->attr.external)
1092     gfc_error ("COMMON block %qs at %L cannot have the EXTERNAL attribute",
1093 	       sym->name, &common_root->n.common->where);
1094 
1095   if (sym->attr.intrinsic)
1096     gfc_error ("COMMON block %qs at %L is also an intrinsic procedure",
1097 	       sym->name, &common_root->n.common->where);
1098   else if (sym->attr.result
1099 	   || gfc_is_function_return_value (sym, gfc_current_ns))
1100     gfc_notify_std (GFC_STD_F2003, "COMMON block %qs at %L "
1101 		    "that is also a function result", sym->name,
1102 		    &common_root->n.common->where);
1103   else if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_INTERNAL
1104 	   && sym->attr.proc != PROC_ST_FUNCTION)
1105     gfc_notify_std (GFC_STD_F2003, "COMMON block %qs at %L "
1106 		    "that is also a global procedure", sym->name,
1107 		    &common_root->n.common->where);
1108 }
1109 
1110 
1111 /* Resolve contained function types.  Because contained functions can call one
1112    another, they have to be worked out before any of the contained procedures
1113    can be resolved.
1114 
1115    The good news is that if a function doesn't already have a type, the only
1116    way it can get one is through an IMPLICIT type or a RESULT variable, because
1117    by definition contained functions are contained namespace they're contained
1118    in, not in a sibling or parent namespace.  */
1119 
1120 static void
resolve_contained_functions(gfc_namespace * ns)1121 resolve_contained_functions (gfc_namespace *ns)
1122 {
1123   gfc_namespace *child;
1124   gfc_entry_list *el;
1125 
1126   resolve_formal_arglists (ns);
1127 
1128   for (child = ns->contained; child; child = child->sibling)
1129     {
1130       /* Resolve alternate entry points first.  */
1131       resolve_entries (child);
1132 
1133       /* Then check function return types.  */
1134       resolve_contained_fntype (child->proc_name, child);
1135       for (el = child->entries; el; el = el->next)
1136 	resolve_contained_fntype (el->sym, child);
1137     }
1138 }
1139 
1140 
1141 
1142 /* A Parameterized Derived Type constructor must contain values for
1143    the PDT KIND parameters or they must have a default initializer.
1144    Go through the constructor picking out the KIND expressions,
1145    storing them in 'param_list' and then call gfc_get_pdt_instance
1146    to obtain the PDT instance.  */
1147 
1148 static gfc_actual_arglist *param_list, *param_tail, *param;
1149 
1150 static bool
get_pdt_spec_expr(gfc_component * c,gfc_expr * expr)1151 get_pdt_spec_expr (gfc_component *c, gfc_expr *expr)
1152 {
1153   param = gfc_get_actual_arglist ();
1154   if (!param_list)
1155     param_list = param_tail = param;
1156   else
1157     {
1158       param_tail->next = param;
1159       param_tail = param_tail->next;
1160     }
1161 
1162   param_tail->name = c->name;
1163   if (expr)
1164     param_tail->expr = gfc_copy_expr (expr);
1165   else if (c->initializer)
1166     param_tail->expr = gfc_copy_expr (c->initializer);
1167   else
1168     {
1169       param_tail->spec_type = SPEC_ASSUMED;
1170       if (c->attr.pdt_kind)
1171 	{
1172 	  gfc_error ("The KIND parameter %qs in the PDT constructor "
1173 		     "at %C has no value", param->name);
1174 	  return false;
1175 	}
1176     }
1177 
1178   return true;
1179 }
1180 
1181 static bool
get_pdt_constructor(gfc_expr * expr,gfc_constructor ** constr,gfc_symbol * derived)1182 get_pdt_constructor (gfc_expr *expr, gfc_constructor **constr,
1183 		     gfc_symbol *derived)
1184 {
1185   gfc_constructor *cons = NULL;
1186   gfc_component *comp;
1187   bool t = true;
1188 
1189   if (expr && expr->expr_type == EXPR_STRUCTURE)
1190     cons = gfc_constructor_first (expr->value.constructor);
1191   else if (constr)
1192     cons = *constr;
1193   gcc_assert (cons);
1194 
1195   comp = derived->components;
1196 
1197   for (; comp && cons; comp = comp->next, cons = gfc_constructor_next (cons))
1198     {
1199       if (cons->expr
1200 	  && cons->expr->expr_type == EXPR_STRUCTURE
1201 	  && comp->ts.type == BT_DERIVED)
1202 	{
1203 	  t = get_pdt_constructor (cons->expr, NULL, comp->ts.u.derived);
1204 	  if (!t)
1205 	    return t;
1206 	}
1207       else if (comp->ts.type == BT_DERIVED)
1208 	{
1209 	  t = get_pdt_constructor (NULL, &cons, comp->ts.u.derived);
1210 	  if (!t)
1211 	    return t;
1212 	}
1213      else if ((comp->attr.pdt_kind || comp->attr.pdt_len)
1214 	       && derived->attr.pdt_template)
1215 	{
1216 	  t = get_pdt_spec_expr (comp, cons->expr);
1217 	  if (!t)
1218 	    return t;
1219 	}
1220     }
1221   return t;
1222 }
1223 
1224 
1225 static bool resolve_fl_derived0 (gfc_symbol *sym);
1226 static bool resolve_fl_struct (gfc_symbol *sym);
1227 
1228 
1229 /* Resolve all of the elements of a structure constructor and make sure that
1230    the types are correct. The 'init' flag indicates that the given
1231    constructor is an initializer.  */
1232 
1233 static bool
resolve_structure_cons(gfc_expr * expr,int init)1234 resolve_structure_cons (gfc_expr *expr, int init)
1235 {
1236   gfc_constructor *cons;
1237   gfc_component *comp;
1238   bool t;
1239   symbol_attribute a;
1240 
1241   t = true;
1242 
1243   if (expr->ts.type == BT_DERIVED || expr->ts.type == BT_UNION)
1244     {
1245       if (expr->ts.u.derived->attr.flavor == FL_DERIVED)
1246         resolve_fl_derived0 (expr->ts.u.derived);
1247       else
1248         resolve_fl_struct (expr->ts.u.derived);
1249 
1250       /* If this is a Parameterized Derived Type template, find the
1251 	 instance corresponding to the PDT kind parameters.  */
1252       if (expr->ts.u.derived->attr.pdt_template)
1253 	{
1254 	  param_list = NULL;
1255 	  t = get_pdt_constructor (expr, NULL, expr->ts.u.derived);
1256 	  if (!t)
1257 	    return t;
1258 	  gfc_get_pdt_instance (param_list, &expr->ts.u.derived, NULL);
1259 
1260 	  expr->param_list = gfc_copy_actual_arglist (param_list);
1261 
1262 	  if (param_list)
1263 	    gfc_free_actual_arglist (param_list);
1264 
1265 	  if (!expr->ts.u.derived->attr.pdt_type)
1266 	    return false;
1267 	}
1268     }
1269 
1270   cons = gfc_constructor_first (expr->value.constructor);
1271 
1272   /* A constructor may have references if it is the result of substituting a
1273      parameter variable.  In this case we just pull out the component we
1274      want.  */
1275   if (expr->ref)
1276     comp = expr->ref->u.c.sym->components;
1277   else
1278     comp = expr->ts.u.derived->components;
1279 
1280   for (; comp && cons; comp = comp->next, cons = gfc_constructor_next (cons))
1281     {
1282       int rank;
1283 
1284       if (!cons->expr)
1285 	continue;
1286 
1287       /* Unions use an EXPR_NULL contrived expression to tell the translation
1288          phase to generate an initializer of the appropriate length.
1289          Ignore it here.  */
1290       if (cons->expr->ts.type == BT_UNION && cons->expr->expr_type == EXPR_NULL)
1291         continue;
1292 
1293       if (!gfc_resolve_expr (cons->expr))
1294 	{
1295 	  t = false;
1296 	  continue;
1297 	}
1298 
1299       rank = comp->as ? comp->as->rank : 0;
1300       if (comp->ts.type == BT_CLASS
1301 	  && !comp->ts.u.derived->attr.unlimited_polymorphic
1302 	  && CLASS_DATA (comp)->as)
1303  	rank = CLASS_DATA (comp)->as->rank;
1304 
1305       if (cons->expr->expr_type != EXPR_NULL && rank != cons->expr->rank
1306 	  && (comp->attr.allocatable || cons->expr->rank))
1307 	{
1308 	  gfc_error ("The rank of the element in the structure "
1309 		     "constructor at %L does not match that of the "
1310 		     "component (%d/%d)", &cons->expr->where,
1311 		     cons->expr->rank, rank);
1312 	  t = false;
1313 	}
1314 
1315       /* If we don't have the right type, try to convert it.  */
1316 
1317       if (!comp->attr.proc_pointer &&
1318 	  !gfc_compare_types (&cons->expr->ts, &comp->ts))
1319 	{
1320 	  if (strcmp (comp->name, "_extends") == 0)
1321 	    {
1322 	      /* Can afford to be brutal with the _extends initializer.
1323 		 The derived type can get lost because it is PRIVATE
1324 		 but it is not usage constrained by the standard.  */
1325 	      cons->expr->ts = comp->ts;
1326 	    }
1327 	  else if (comp->attr.pointer && cons->expr->ts.type != BT_UNKNOWN)
1328 	    {
1329 	      gfc_error ("The element in the structure constructor at %L, "
1330 			 "for pointer component %qs, is %s but should be %s",
1331 			 &cons->expr->where, comp->name,
1332 			 gfc_basic_typename (cons->expr->ts.type),
1333 			 gfc_basic_typename (comp->ts.type));
1334 	      t = false;
1335 	    }
1336 	  else
1337 	    {
1338 	      bool t2 = gfc_convert_type (cons->expr, &comp->ts, 1);
1339 	      if (t)
1340 		t = t2;
1341 	    }
1342 	}
1343 
1344       /* For strings, the length of the constructor should be the same as
1345 	 the one of the structure, ensure this if the lengths are known at
1346  	 compile time and when we are dealing with PARAMETER or structure
1347 	 constructors.  */
1348       if (cons->expr->ts.type == BT_CHARACTER && comp->ts.u.cl
1349 	  && comp->ts.u.cl->length
1350 	  && comp->ts.u.cl->length->expr_type == EXPR_CONSTANT
1351 	  && cons->expr->ts.u.cl && cons->expr->ts.u.cl->length
1352 	  && cons->expr->ts.u.cl->length->expr_type == EXPR_CONSTANT
1353 	  && cons->expr->rank != 0
1354 	  && mpz_cmp (cons->expr->ts.u.cl->length->value.integer,
1355 		      comp->ts.u.cl->length->value.integer) != 0)
1356 	{
1357 	  if (cons->expr->expr_type == EXPR_VARIABLE
1358 	      && cons->expr->symtree->n.sym->attr.flavor == FL_PARAMETER)
1359 	    {
1360 	      /* Wrap the parameter in an array constructor (EXPR_ARRAY)
1361 		 to make use of the gfc_resolve_character_array_constructor
1362 		 machinery.  The expression is later simplified away to
1363 		 an array of string literals.  */
1364 	      gfc_expr *para = cons->expr;
1365 	      cons->expr = gfc_get_expr ();
1366 	      cons->expr->ts = para->ts;
1367 	      cons->expr->where = para->where;
1368 	      cons->expr->expr_type = EXPR_ARRAY;
1369 	      cons->expr->rank = para->rank;
1370 	      cons->expr->shape = gfc_copy_shape (para->shape, para->rank);
1371 	      gfc_constructor_append_expr (&cons->expr->value.constructor,
1372 					   para, &cons->expr->where);
1373 	    }
1374 
1375 	  if (cons->expr->expr_type == EXPR_ARRAY)
1376 	    {
1377 	      /* Rely on the cleanup of the namespace to deal correctly with
1378 		 the old charlen.  (There was a block here that attempted to
1379 		 remove the charlen but broke the chain in so doing.)  */
1380 	      cons->expr->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1381 	      cons->expr->ts.u.cl->length_from_typespec = true;
1382 	      cons->expr->ts.u.cl->length = gfc_copy_expr (comp->ts.u.cl->length);
1383 	      gfc_resolve_character_array_constructor (cons->expr);
1384 	    }
1385 	}
1386 
1387       if (cons->expr->expr_type == EXPR_NULL
1388 	  && !(comp->attr.pointer || comp->attr.allocatable
1389 	       || comp->attr.proc_pointer || comp->ts.f90_type == BT_VOID
1390 	       || (comp->ts.type == BT_CLASS
1391 		   && (CLASS_DATA (comp)->attr.class_pointer
1392 		       || CLASS_DATA (comp)->attr.allocatable))))
1393 	{
1394 	  t = false;
1395 	  gfc_error ("The NULL in the structure constructor at %L is "
1396 		     "being applied to component %qs, which is neither "
1397 		     "a POINTER nor ALLOCATABLE", &cons->expr->where,
1398 		     comp->name);
1399 	}
1400 
1401       if (comp->attr.proc_pointer && comp->ts.interface)
1402 	{
1403 	  /* Check procedure pointer interface.  */
1404 	  gfc_symbol *s2 = NULL;
1405 	  gfc_component *c2;
1406 	  const char *name;
1407 	  char err[200];
1408 
1409 	  c2 = gfc_get_proc_ptr_comp (cons->expr);
1410 	  if (c2)
1411 	    {
1412 	      s2 = c2->ts.interface;
1413 	      name = c2->name;
1414 	    }
1415 	  else if (cons->expr->expr_type == EXPR_FUNCTION)
1416 	    {
1417 	      s2 = cons->expr->symtree->n.sym->result;
1418 	      name = cons->expr->symtree->n.sym->result->name;
1419 	    }
1420 	  else if (cons->expr->expr_type != EXPR_NULL)
1421 	    {
1422 	      s2 = cons->expr->symtree->n.sym;
1423 	      name = cons->expr->symtree->n.sym->name;
1424 	    }
1425 
1426 	  if (s2 && !gfc_compare_interfaces (comp->ts.interface, s2, name, 0, 1,
1427 					     err, sizeof (err), NULL, NULL))
1428 	    {
1429 	      gfc_error_opt (OPT_Wargument_mismatch,
1430 			     "Interface mismatch for procedure-pointer "
1431 			     "component %qs in structure constructor at %L:"
1432 			     " %s", comp->name, &cons->expr->where, err);
1433 	      return false;
1434 	    }
1435 	}
1436 
1437       if (!comp->attr.pointer || comp->attr.proc_pointer
1438 	  || cons->expr->expr_type == EXPR_NULL)
1439 	continue;
1440 
1441       a = gfc_expr_attr (cons->expr);
1442 
1443       if (!a.pointer && !a.target)
1444 	{
1445 	  t = false;
1446 	  gfc_error ("The element in the structure constructor at %L, "
1447 		     "for pointer component %qs should be a POINTER or "
1448 		     "a TARGET", &cons->expr->where, comp->name);
1449 	}
1450 
1451       if (init)
1452 	{
1453 	  /* F08:C461. Additional checks for pointer initialization.  */
1454 	  if (a.allocatable)
1455 	    {
1456 	      t = false;
1457 	      gfc_error ("Pointer initialization target at %L "
1458 			 "must not be ALLOCATABLE", &cons->expr->where);
1459 	    }
1460 	  if (!a.save)
1461 	    {
1462 	      t = false;
1463 	      gfc_error ("Pointer initialization target at %L "
1464 			 "must have the SAVE attribute", &cons->expr->where);
1465 	    }
1466 	}
1467 
1468       /* F2003, C1272 (3).  */
1469       bool impure = cons->expr->expr_type == EXPR_VARIABLE
1470 		    && (gfc_impure_variable (cons->expr->symtree->n.sym)
1471 			|| gfc_is_coindexed (cons->expr));
1472       if (impure && gfc_pure (NULL))
1473 	{
1474 	  t = false;
1475 	  gfc_error ("Invalid expression in the structure constructor for "
1476 		     "pointer component %qs at %L in PURE procedure",
1477 		     comp->name, &cons->expr->where);
1478 	}
1479 
1480       if (impure)
1481 	gfc_unset_implicit_pure (NULL);
1482     }
1483 
1484   return t;
1485 }
1486 
1487 
1488 /****************** Expression name resolution ******************/
1489 
1490 /* Returns 0 if a symbol was not declared with a type or
1491    attribute declaration statement, nonzero otherwise.  */
1492 
1493 static int
was_declared(gfc_symbol * sym)1494 was_declared (gfc_symbol *sym)
1495 {
1496   symbol_attribute a;
1497 
1498   a = sym->attr;
1499 
1500   if (!a.implicit_type && sym->ts.type != BT_UNKNOWN)
1501     return 1;
1502 
1503   if (a.allocatable || a.dimension || a.dummy || a.external || a.intrinsic
1504       || a.optional || a.pointer || a.save || a.target || a.volatile_
1505       || a.value || a.access != ACCESS_UNKNOWN || a.intent != INTENT_UNKNOWN
1506       || a.asynchronous || a.codimension)
1507     return 1;
1508 
1509   return 0;
1510 }
1511 
1512 
1513 /* Determine if a symbol is generic or not.  */
1514 
1515 static int
generic_sym(gfc_symbol * sym)1516 generic_sym (gfc_symbol *sym)
1517 {
1518   gfc_symbol *s;
1519 
1520   if (sym->attr.generic ||
1521       (sym->attr.intrinsic && gfc_generic_intrinsic (sym->name)))
1522     return 1;
1523 
1524   if (was_declared (sym) || sym->ns->parent == NULL)
1525     return 0;
1526 
1527   gfc_find_symbol (sym->name, sym->ns->parent, 1, &s);
1528 
1529   if (s != NULL)
1530     {
1531       if (s == sym)
1532 	return 0;
1533       else
1534 	return generic_sym (s);
1535     }
1536 
1537   return 0;
1538 }
1539 
1540 
1541 /* Determine if a symbol is specific or not.  */
1542 
1543 static int
specific_sym(gfc_symbol * sym)1544 specific_sym (gfc_symbol *sym)
1545 {
1546   gfc_symbol *s;
1547 
1548   if (sym->attr.if_source == IFSRC_IFBODY
1549       || sym->attr.proc == PROC_MODULE
1550       || sym->attr.proc == PROC_INTERNAL
1551       || sym->attr.proc == PROC_ST_FUNCTION
1552       || (sym->attr.intrinsic && gfc_specific_intrinsic (sym->name))
1553       || sym->attr.external)
1554     return 1;
1555 
1556   if (was_declared (sym) || sym->ns->parent == NULL)
1557     return 0;
1558 
1559   gfc_find_symbol (sym->name, sym->ns->parent, 1, &s);
1560 
1561   return (s == NULL) ? 0 : specific_sym (s);
1562 }
1563 
1564 
1565 /* Figure out if the procedure is specific, generic or unknown.  */
1566 
1567 enum proc_type
1568 { PTYPE_GENERIC = 1, PTYPE_SPECIFIC, PTYPE_UNKNOWN };
1569 
1570 static proc_type
procedure_kind(gfc_symbol * sym)1571 procedure_kind (gfc_symbol *sym)
1572 {
1573   if (generic_sym (sym))
1574     return PTYPE_GENERIC;
1575 
1576   if (specific_sym (sym))
1577     return PTYPE_SPECIFIC;
1578 
1579   return PTYPE_UNKNOWN;
1580 }
1581 
1582 /* Check references to assumed size arrays.  The flag need_full_assumed_size
1583    is nonzero when matching actual arguments.  */
1584 
1585 static int need_full_assumed_size = 0;
1586 
1587 static bool
check_assumed_size_reference(gfc_symbol * sym,gfc_expr * e)1588 check_assumed_size_reference (gfc_symbol *sym, gfc_expr *e)
1589 {
1590   if (need_full_assumed_size || !(sym->as && sym->as->type == AS_ASSUMED_SIZE))
1591       return false;
1592 
1593   /* FIXME: The comparison "e->ref->u.ar.type == AR_FULL" is wrong.
1594      What should it be?  */
1595   if (e->ref && (e->ref->u.ar.end[e->ref->u.ar.as->rank - 1] == NULL)
1596 	  && (e->ref->u.ar.as->type == AS_ASSUMED_SIZE)
1597 	       && (e->ref->u.ar.type == AR_FULL))
1598     {
1599       gfc_error ("The upper bound in the last dimension must "
1600 		 "appear in the reference to the assumed size "
1601 		 "array %qs at %L", sym->name, &e->where);
1602       return true;
1603     }
1604   return false;
1605 }
1606 
1607 
1608 /* Look for bad assumed size array references in argument expressions
1609   of elemental and array valued intrinsic procedures.  Since this is
1610   called from procedure resolution functions, it only recurses at
1611   operators.  */
1612 
1613 static bool
resolve_assumed_size_actual(gfc_expr * e)1614 resolve_assumed_size_actual (gfc_expr *e)
1615 {
1616   if (e == NULL)
1617    return false;
1618 
1619   switch (e->expr_type)
1620     {
1621     case EXPR_VARIABLE:
1622       if (e->symtree && check_assumed_size_reference (e->symtree->n.sym, e))
1623 	return true;
1624       break;
1625 
1626     case EXPR_OP:
1627       if (resolve_assumed_size_actual (e->value.op.op1)
1628 	  || resolve_assumed_size_actual (e->value.op.op2))
1629 	return true;
1630       break;
1631 
1632     default:
1633       break;
1634     }
1635   return false;
1636 }
1637 
1638 
1639 /* Check a generic procedure, passed as an actual argument, to see if
1640    there is a matching specific name.  If none, it is an error, and if
1641    more than one, the reference is ambiguous.  */
1642 static int
count_specific_procs(gfc_expr * e)1643 count_specific_procs (gfc_expr *e)
1644 {
1645   int n;
1646   gfc_interface *p;
1647   gfc_symbol *sym;
1648 
1649   n = 0;
1650   sym = e->symtree->n.sym;
1651 
1652   for (p = sym->generic; p; p = p->next)
1653     if (strcmp (sym->name, p->sym->name) == 0)
1654       {
1655 	e->symtree = gfc_find_symtree (p->sym->ns->sym_root,
1656 				       sym->name);
1657 	n++;
1658       }
1659 
1660   if (n > 1)
1661     gfc_error ("%qs at %L is ambiguous", e->symtree->n.sym->name,
1662 	       &e->where);
1663 
1664   if (n == 0)
1665     gfc_error ("GENERIC procedure %qs is not allowed as an actual "
1666 	       "argument at %L", sym->name, &e->where);
1667 
1668   return n;
1669 }
1670 
1671 
1672 /* See if a call to sym could possibly be a not allowed RECURSION because of
1673    a missing RECURSIVE declaration.  This means that either sym is the current
1674    context itself, or sym is the parent of a contained procedure calling its
1675    non-RECURSIVE containing procedure.
1676    This also works if sym is an ENTRY.  */
1677 
1678 static bool
is_illegal_recursion(gfc_symbol * sym,gfc_namespace * context)1679 is_illegal_recursion (gfc_symbol* sym, gfc_namespace* context)
1680 {
1681   gfc_symbol* proc_sym;
1682   gfc_symbol* context_proc;
1683   gfc_namespace* real_context;
1684 
1685   if (sym->attr.flavor == FL_PROGRAM
1686       || gfc_fl_struct (sym->attr.flavor))
1687     return false;
1688 
1689   /* If we've got an ENTRY, find real procedure.  */
1690   if (sym->attr.entry && sym->ns->entries)
1691     proc_sym = sym->ns->entries->sym;
1692   else
1693     proc_sym = sym;
1694 
1695   /* If sym is RECURSIVE, all is well of course.  */
1696   if (proc_sym->attr.recursive || flag_recursive)
1697     return false;
1698 
1699   /* Find the context procedure's "real" symbol if it has entries.
1700      We look for a procedure symbol, so recurse on the parents if we don't
1701      find one (like in case of a BLOCK construct).  */
1702   for (real_context = context; ; real_context = real_context->parent)
1703     {
1704       /* We should find something, eventually!  */
1705       gcc_assert (real_context);
1706 
1707       context_proc = (real_context->entries ? real_context->entries->sym
1708 					    : real_context->proc_name);
1709 
1710       /* In some special cases, there may not be a proc_name, like for this
1711 	 invalid code:
1712 	 real(bad_kind()) function foo () ...
1713 	 when checking the call to bad_kind ().
1714 	 In these cases, we simply return here and assume that the
1715 	 call is ok.  */
1716       if (!context_proc)
1717 	return false;
1718 
1719       if (context_proc->attr.flavor != FL_LABEL)
1720 	break;
1721     }
1722 
1723   /* A call from sym's body to itself is recursion, of course.  */
1724   if (context_proc == proc_sym)
1725     return true;
1726 
1727   /* The same is true if context is a contained procedure and sym the
1728      containing one.  */
1729   if (context_proc->attr.contained)
1730     {
1731       gfc_symbol* parent_proc;
1732 
1733       gcc_assert (context->parent);
1734       parent_proc = (context->parent->entries ? context->parent->entries->sym
1735 					      : context->parent->proc_name);
1736 
1737       if (parent_proc == proc_sym)
1738 	return true;
1739     }
1740 
1741   return false;
1742 }
1743 
1744 
1745 /* Resolve an intrinsic procedure: Set its function/subroutine attribute,
1746    its typespec and formal argument list.  */
1747 
1748 bool
gfc_resolve_intrinsic(gfc_symbol * sym,locus * loc)1749 gfc_resolve_intrinsic (gfc_symbol *sym, locus *loc)
1750 {
1751   gfc_intrinsic_sym* isym = NULL;
1752   const char* symstd;
1753 
1754   if (sym->formal)
1755     return true;
1756 
1757   /* Already resolved.  */
1758   if (sym->from_intmod && sym->ts.type != BT_UNKNOWN)
1759     return true;
1760 
1761   /* We already know this one is an intrinsic, so we don't call
1762      gfc_is_intrinsic for full checking but rather use gfc_find_function and
1763      gfc_find_subroutine directly to check whether it is a function or
1764      subroutine.  */
1765 
1766   if (sym->intmod_sym_id && sym->attr.subroutine)
1767     {
1768       gfc_isym_id id = gfc_isym_id_by_intmod_sym (sym);
1769       isym = gfc_intrinsic_subroutine_by_id (id);
1770     }
1771   else if (sym->intmod_sym_id)
1772     {
1773       gfc_isym_id id = gfc_isym_id_by_intmod_sym (sym);
1774       isym = gfc_intrinsic_function_by_id (id);
1775     }
1776   else if (!sym->attr.subroutine)
1777     isym = gfc_find_function (sym->name);
1778 
1779   if (isym && !sym->attr.subroutine)
1780     {
1781       if (sym->ts.type != BT_UNKNOWN && warn_surprising
1782 	  && !sym->attr.implicit_type)
1783 	gfc_warning (OPT_Wsurprising,
1784 		     "Type specified for intrinsic function %qs at %L is"
1785 		      " ignored", sym->name, &sym->declared_at);
1786 
1787       if (!sym->attr.function &&
1788 	  !gfc_add_function(&sym->attr, sym->name, loc))
1789 	return false;
1790 
1791       sym->ts = isym->ts;
1792     }
1793   else if (isym || (isym = gfc_find_subroutine (sym->name)))
1794     {
1795       if (sym->ts.type != BT_UNKNOWN && !sym->attr.implicit_type)
1796 	{
1797 	  gfc_error ("Intrinsic subroutine %qs at %L shall not have a type"
1798 		      " specifier", sym->name, &sym->declared_at);
1799 	  return false;
1800 	}
1801 
1802       if (!sym->attr.subroutine &&
1803 	  !gfc_add_subroutine(&sym->attr, sym->name, loc))
1804 	return false;
1805     }
1806   else
1807     {
1808       gfc_error ("%qs declared INTRINSIC at %L does not exist", sym->name,
1809 		 &sym->declared_at);
1810       return false;
1811     }
1812 
1813   gfc_copy_formal_args_intr (sym, isym, NULL);
1814 
1815   sym->attr.pure = isym->pure;
1816   sym->attr.elemental = isym->elemental;
1817 
1818   /* Check it is actually available in the standard settings.  */
1819   if (!gfc_check_intrinsic_standard (isym, &symstd, false, sym->declared_at))
1820     {
1821       gfc_error ("The intrinsic %qs declared INTRINSIC at %L is not "
1822 		 "available in the current standard settings but %s. Use "
1823 		 "an appropriate %<-std=*%> option or enable "
1824 		 "%<-fall-intrinsics%> in order to use it.",
1825 		 sym->name, &sym->declared_at, symstd);
1826       return false;
1827     }
1828 
1829   return true;
1830 }
1831 
1832 
1833 /* Resolve a procedure expression, like passing it to a called procedure or as
1834    RHS for a procedure pointer assignment.  */
1835 
1836 static bool
resolve_procedure_expression(gfc_expr * expr)1837 resolve_procedure_expression (gfc_expr* expr)
1838 {
1839   gfc_symbol* sym;
1840 
1841   if (expr->expr_type != EXPR_VARIABLE)
1842     return true;
1843   gcc_assert (expr->symtree);
1844 
1845   sym = expr->symtree->n.sym;
1846 
1847   if (sym->attr.intrinsic)
1848     gfc_resolve_intrinsic (sym, &expr->where);
1849 
1850   if (sym->attr.flavor != FL_PROCEDURE
1851       || (sym->attr.function && sym->result == sym))
1852     return true;
1853 
1854   /* A non-RECURSIVE procedure that is used as procedure expression within its
1855      own body is in danger of being called recursively.  */
1856   if (is_illegal_recursion (sym, gfc_current_ns))
1857     gfc_warning (0, "Non-RECURSIVE procedure %qs at %L is possibly calling"
1858 		 " itself recursively.  Declare it RECURSIVE or use"
1859 		 " %<-frecursive%>", sym->name, &expr->where);
1860 
1861   return true;
1862 }
1863 
1864 
1865 /* Resolve an actual argument list.  Most of the time, this is just
1866    resolving the expressions in the list.
1867    The exception is that we sometimes have to decide whether arguments
1868    that look like procedure arguments are really simple variable
1869    references.  */
1870 
1871 static bool
resolve_actual_arglist(gfc_actual_arglist * arg,procedure_type ptype,bool no_formal_args)1872 resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype,
1873 			bool no_formal_args)
1874 {
1875   gfc_symbol *sym;
1876   gfc_symtree *parent_st;
1877   gfc_expr *e;
1878   gfc_component *comp;
1879   int save_need_full_assumed_size;
1880   bool return_value = false;
1881   bool actual_arg_sav = actual_arg, first_actual_arg_sav = first_actual_arg;
1882 
1883   actual_arg = true;
1884   first_actual_arg = true;
1885 
1886   for (; arg; arg = arg->next)
1887     {
1888       e = arg->expr;
1889       if (e == NULL)
1890 	{
1891 	  /* Check the label is a valid branching target.  */
1892 	  if (arg->label)
1893 	    {
1894 	      if (arg->label->defined == ST_LABEL_UNKNOWN)
1895 		{
1896 		  gfc_error ("Label %d referenced at %L is never defined",
1897 			     arg->label->value, &arg->label->where);
1898 		  goto cleanup;
1899 		}
1900 	    }
1901 	  first_actual_arg = false;
1902 	  continue;
1903 	}
1904 
1905       if (e->expr_type == EXPR_VARIABLE
1906 	    && e->symtree->n.sym->attr.generic
1907 	    && no_formal_args
1908 	    && count_specific_procs (e) != 1)
1909 	goto cleanup;
1910 
1911       if (e->ts.type != BT_PROCEDURE)
1912 	{
1913 	  save_need_full_assumed_size = need_full_assumed_size;
1914 	  if (e->expr_type != EXPR_VARIABLE)
1915 	    need_full_assumed_size = 0;
1916 	  if (!gfc_resolve_expr (e))
1917 	    goto cleanup;
1918 	  need_full_assumed_size = save_need_full_assumed_size;
1919 	  goto argument_list;
1920 	}
1921 
1922       /* See if the expression node should really be a variable reference.  */
1923 
1924       sym = e->symtree->n.sym;
1925 
1926       if (sym->attr.flavor == FL_PROCEDURE
1927 	  || sym->attr.intrinsic
1928 	  || sym->attr.external)
1929 	{
1930 	  int actual_ok;
1931 
1932 	  /* If a procedure is not already determined to be something else
1933 	     check if it is intrinsic.  */
1934 	  if (gfc_is_intrinsic (sym, sym->attr.subroutine, e->where))
1935 	    sym->attr.intrinsic = 1;
1936 
1937 	  if (sym->attr.proc == PROC_ST_FUNCTION)
1938 	    {
1939 	      gfc_error ("Statement function %qs at %L is not allowed as an "
1940 			 "actual argument", sym->name, &e->where);
1941 	    }
1942 
1943 	  actual_ok = gfc_intrinsic_actual_ok (sym->name,
1944 					       sym->attr.subroutine);
1945 	  if (sym->attr.intrinsic && actual_ok == 0)
1946 	    {
1947 	      gfc_error ("Intrinsic %qs at %L is not allowed as an "
1948 			 "actual argument", sym->name, &e->where);
1949 	    }
1950 
1951 	  if (sym->attr.contained && !sym->attr.use_assoc
1952 	      && sym->ns->proc_name->attr.flavor != FL_MODULE)
1953 	    {
1954 	      if (!gfc_notify_std (GFC_STD_F2008, "Internal procedure %qs is"
1955 				   " used as actual argument at %L",
1956 				   sym->name, &e->where))
1957 		goto cleanup;
1958 	    }
1959 
1960 	  if (sym->attr.elemental && !sym->attr.intrinsic)
1961 	    {
1962 	      gfc_error ("ELEMENTAL non-INTRINSIC procedure %qs is not "
1963 			 "allowed as an actual argument at %L", sym->name,
1964 			 &e->where);
1965 	    }
1966 
1967 	  /* Check if a generic interface has a specific procedure
1968 	    with the same name before emitting an error.  */
1969 	  if (sym->attr.generic && count_specific_procs (e) != 1)
1970 	    goto cleanup;
1971 
1972 	  /* Just in case a specific was found for the expression.  */
1973 	  sym = e->symtree->n.sym;
1974 
1975 	  /* If the symbol is the function that names the current (or
1976 	     parent) scope, then we really have a variable reference.  */
1977 
1978 	  if (gfc_is_function_return_value (sym, sym->ns))
1979 	    goto got_variable;
1980 
1981 	  /* If all else fails, see if we have a specific intrinsic.  */
1982 	  if (sym->ts.type == BT_UNKNOWN && sym->attr.intrinsic)
1983 	    {
1984 	      gfc_intrinsic_sym *isym;
1985 
1986 	      isym = gfc_find_function (sym->name);
1987 	      if (isym == NULL || !isym->specific)
1988 		{
1989 		  gfc_error ("Unable to find a specific INTRINSIC procedure "
1990 			     "for the reference %qs at %L", sym->name,
1991 			     &e->where);
1992 		  goto cleanup;
1993 		}
1994 	      sym->ts = isym->ts;
1995 	      sym->attr.intrinsic = 1;
1996 	      sym->attr.function = 1;
1997 	    }
1998 
1999 	  if (!gfc_resolve_expr (e))
2000 	    goto cleanup;
2001 	  goto argument_list;
2002 	}
2003 
2004       /* See if the name is a module procedure in a parent unit.  */
2005 
2006       if (was_declared (sym) || sym->ns->parent == NULL)
2007 	goto got_variable;
2008 
2009       if (gfc_find_sym_tree (sym->name, sym->ns->parent, 1, &parent_st))
2010 	{
2011 	  gfc_error ("Symbol %qs at %L is ambiguous", sym->name, &e->where);
2012 	  goto cleanup;
2013 	}
2014 
2015       if (parent_st == NULL)
2016 	goto got_variable;
2017 
2018       sym = parent_st->n.sym;
2019       e->symtree = parent_st;		/* Point to the right thing.  */
2020 
2021       if (sym->attr.flavor == FL_PROCEDURE
2022 	  || sym->attr.intrinsic
2023 	  || sym->attr.external)
2024 	{
2025 	  if (!gfc_resolve_expr (e))
2026 	    goto cleanup;
2027 	  goto argument_list;
2028 	}
2029 
2030     got_variable:
2031       e->expr_type = EXPR_VARIABLE;
2032       e->ts = sym->ts;
2033       if ((sym->as != NULL && sym->ts.type != BT_CLASS)
2034 	  || (sym->ts.type == BT_CLASS && sym->attr.class_ok
2035 	      && CLASS_DATA (sym)->as))
2036 	{
2037 	  e->rank = sym->ts.type == BT_CLASS
2038 		    ? CLASS_DATA (sym)->as->rank : sym->as->rank;
2039 	  e->ref = gfc_get_ref ();
2040 	  e->ref->type = REF_ARRAY;
2041 	  e->ref->u.ar.type = AR_FULL;
2042 	  e->ref->u.ar.as = sym->ts.type == BT_CLASS
2043 			    ? CLASS_DATA (sym)->as : sym->as;
2044 	}
2045 
2046       /* Expressions are assigned a default ts.type of BT_PROCEDURE in
2047 	 primary.c (match_actual_arg). If above code determines that it
2048 	 is a  variable instead, it needs to be resolved as it was not
2049 	 done at the beginning of this function.  */
2050       save_need_full_assumed_size = need_full_assumed_size;
2051       if (e->expr_type != EXPR_VARIABLE)
2052 	need_full_assumed_size = 0;
2053       if (!gfc_resolve_expr (e))
2054 	goto cleanup;
2055       need_full_assumed_size = save_need_full_assumed_size;
2056 
2057     argument_list:
2058       /* Check argument list functions %VAL, %LOC and %REF.  There is
2059 	 nothing to do for %REF.  */
2060       if (arg->name && arg->name[0] == '%')
2061 	{
2062 	  if (strcmp ("%VAL", arg->name) == 0)
2063 	    {
2064 	      if (e->ts.type == BT_CHARACTER || e->ts.type == BT_DERIVED)
2065 		{
2066 		  gfc_error ("By-value argument at %L is not of numeric "
2067 			     "type", &e->where);
2068 		  goto cleanup;
2069 		}
2070 
2071 	      if (e->rank)
2072 		{
2073 		  gfc_error ("By-value argument at %L cannot be an array or "
2074 			     "an array section", &e->where);
2075 		  goto cleanup;
2076 		}
2077 
2078 	      /* Intrinsics are still PROC_UNKNOWN here.  However,
2079 		 since same file external procedures are not resolvable
2080 		 in gfortran, it is a good deal easier to leave them to
2081 		 intrinsic.c.  */
2082 	      if (ptype != PROC_UNKNOWN
2083 		  && ptype != PROC_DUMMY
2084 		  && ptype != PROC_EXTERNAL
2085 		  && ptype != PROC_MODULE)
2086 		{
2087 		  gfc_error ("By-value argument at %L is not allowed "
2088 			     "in this context", &e->where);
2089 		  goto cleanup;
2090 		}
2091 	    }
2092 
2093 	  /* Statement functions have already been excluded above.  */
2094 	  else if (strcmp ("%LOC", arg->name) == 0
2095 		   && e->ts.type == BT_PROCEDURE)
2096 	    {
2097 	      if (e->symtree->n.sym->attr.proc == PROC_INTERNAL)
2098 		{
2099 		  gfc_error ("Passing internal procedure at %L by location "
2100 			     "not allowed", &e->where);
2101 		  goto cleanup;
2102 		}
2103 	    }
2104 	}
2105 
2106       comp = gfc_get_proc_ptr_comp(e);
2107       if (e->expr_type == EXPR_VARIABLE
2108 	  && comp && comp->attr.elemental)
2109 	{
2110 	    gfc_error ("ELEMENTAL procedure pointer component %qs is not "
2111 		       "allowed as an actual argument at %L", comp->name,
2112 		       &e->where);
2113 	}
2114 
2115       /* Fortran 2008, C1237.  */
2116       if (e->expr_type == EXPR_VARIABLE && gfc_is_coindexed (e)
2117 	  && gfc_has_ultimate_pointer (e))
2118 	{
2119 	  gfc_error ("Coindexed actual argument at %L with ultimate pointer "
2120 		     "component", &e->where);
2121 	  goto cleanup;
2122 	}
2123 
2124       first_actual_arg = false;
2125     }
2126 
2127   return_value = true;
2128 
2129 cleanup:
2130   actual_arg = actual_arg_sav;
2131   first_actual_arg = first_actual_arg_sav;
2132 
2133   return return_value;
2134 }
2135 
2136 
2137 /* Do the checks of the actual argument list that are specific to elemental
2138    procedures.  If called with c == NULL, we have a function, otherwise if
2139    expr == NULL, we have a subroutine.  */
2140 
2141 static bool
resolve_elemental_actual(gfc_expr * expr,gfc_code * c)2142 resolve_elemental_actual (gfc_expr *expr, gfc_code *c)
2143 {
2144   gfc_actual_arglist *arg0;
2145   gfc_actual_arglist *arg;
2146   gfc_symbol *esym = NULL;
2147   gfc_intrinsic_sym *isym = NULL;
2148   gfc_expr *e = NULL;
2149   gfc_intrinsic_arg *iformal = NULL;
2150   gfc_formal_arglist *eformal = NULL;
2151   bool formal_optional = false;
2152   bool set_by_optional = false;
2153   int i;
2154   int rank = 0;
2155 
2156   /* Is this an elemental procedure?  */
2157   if (expr && expr->value.function.actual != NULL)
2158     {
2159       if (expr->value.function.esym != NULL
2160 	  && expr->value.function.esym->attr.elemental)
2161 	{
2162 	  arg0 = expr->value.function.actual;
2163 	  esym = expr->value.function.esym;
2164 	}
2165       else if (expr->value.function.isym != NULL
2166 	       && expr->value.function.isym->elemental)
2167 	{
2168 	  arg0 = expr->value.function.actual;
2169 	  isym = expr->value.function.isym;
2170 	}
2171       else
2172 	return true;
2173     }
2174   else if (c && c->ext.actual != NULL)
2175     {
2176       arg0 = c->ext.actual;
2177 
2178       if (c->resolved_sym)
2179 	esym = c->resolved_sym;
2180       else
2181 	esym = c->symtree->n.sym;
2182       gcc_assert (esym);
2183 
2184       if (!esym->attr.elemental)
2185 	return true;
2186     }
2187   else
2188     return true;
2189 
2190   /* The rank of an elemental is the rank of its array argument(s).  */
2191   for (arg = arg0; arg; arg = arg->next)
2192     {
2193       if (arg->expr != NULL && arg->expr->rank != 0)
2194 	{
2195 	  rank = arg->expr->rank;
2196 	  if (arg->expr->expr_type == EXPR_VARIABLE
2197 	      && arg->expr->symtree->n.sym->attr.optional)
2198 	    set_by_optional = true;
2199 
2200 	  /* Function specific; set the result rank and shape.  */
2201 	  if (expr)
2202 	    {
2203 	      expr->rank = rank;
2204 	      if (!expr->shape && arg->expr->shape)
2205 		{
2206 		  expr->shape = gfc_get_shape (rank);
2207 		  for (i = 0; i < rank; i++)
2208 		    mpz_init_set (expr->shape[i], arg->expr->shape[i]);
2209 		}
2210 	    }
2211 	  break;
2212 	}
2213     }
2214 
2215   /* If it is an array, it shall not be supplied as an actual argument
2216      to an elemental procedure unless an array of the same rank is supplied
2217      as an actual argument corresponding to a nonoptional dummy argument of
2218      that elemental procedure(12.4.1.5).  */
2219   formal_optional = false;
2220   if (isym)
2221     iformal = isym->formal;
2222   else
2223     eformal = esym->formal;
2224 
2225   for (arg = arg0; arg; arg = arg->next)
2226     {
2227       if (eformal)
2228 	{
2229 	  if (eformal->sym && eformal->sym->attr.optional)
2230 	    formal_optional = true;
2231 	  eformal = eformal->next;
2232 	}
2233       else if (isym && iformal)
2234 	{
2235 	  if (iformal->optional)
2236 	    formal_optional = true;
2237 	  iformal = iformal->next;
2238 	}
2239       else if (isym)
2240 	formal_optional = true;
2241 
2242       if (pedantic && arg->expr != NULL
2243 	  && arg->expr->expr_type == EXPR_VARIABLE
2244 	  && arg->expr->symtree->n.sym->attr.optional
2245 	  && formal_optional
2246 	  && arg->expr->rank
2247 	  && (set_by_optional || arg->expr->rank != rank)
2248 	  && !(isym && isym->id == GFC_ISYM_CONVERSION))
2249 	{
2250 	  gfc_warning (OPT_Wpedantic,
2251 		       "%qs at %L is an array and OPTIONAL; IF IT IS "
2252 		       "MISSING, it cannot be the actual argument of an "
2253 		       "ELEMENTAL procedure unless there is a non-optional "
2254 		       "argument with the same rank (12.4.1.5)",
2255 		       arg->expr->symtree->n.sym->name, &arg->expr->where);
2256 	}
2257     }
2258 
2259   for (arg = arg0; arg; arg = arg->next)
2260     {
2261       if (arg->expr == NULL || arg->expr->rank == 0)
2262 	continue;
2263 
2264       /* Being elemental, the last upper bound of an assumed size array
2265 	 argument must be present.  */
2266       if (resolve_assumed_size_actual (arg->expr))
2267 	return false;
2268 
2269       /* Elemental procedure's array actual arguments must conform.  */
2270       if (e != NULL)
2271 	{
2272 	  if (!gfc_check_conformance (arg->expr, e, "elemental procedure"))
2273 	    return false;
2274 	}
2275       else
2276 	e = arg->expr;
2277     }
2278 
2279   /* INTENT(OUT) is only allowed for subroutines; if any actual argument
2280      is an array, the intent inout/out variable needs to be also an array.  */
2281   if (rank > 0 && esym && expr == NULL)
2282     for (eformal = esym->formal, arg = arg0; arg && eformal;
2283 	 arg = arg->next, eformal = eformal->next)
2284       if ((eformal->sym->attr.intent == INTENT_OUT
2285 	   || eformal->sym->attr.intent == INTENT_INOUT)
2286 	  && arg->expr && arg->expr->rank == 0)
2287 	{
2288 	  gfc_error ("Actual argument at %L for INTENT(%s) dummy %qs of "
2289 		     "ELEMENTAL subroutine %qs is a scalar, but another "
2290 		     "actual argument is an array", &arg->expr->where,
2291 		     (eformal->sym->attr.intent == INTENT_OUT) ? "OUT"
2292 		     : "INOUT", eformal->sym->name, esym->name);
2293 	  return false;
2294 	}
2295   return true;
2296 }
2297 
2298 
2299 /* This function does the checking of references to global procedures
2300    as defined in sections 18.1 and 14.1, respectively, of the Fortran
2301    77 and 95 standards.  It checks for a gsymbol for the name, making
2302    one if it does not already exist.  If it already exists, then the
2303    reference being resolved must correspond to the type of gsymbol.
2304    Otherwise, the new symbol is equipped with the attributes of the
2305    reference.  The corresponding code that is called in creating
2306    global entities is parse.c.
2307 
2308    In addition, for all but -std=legacy, the gsymbols are used to
2309    check the interfaces of external procedures from the same file.
2310    The namespace of the gsymbol is resolved and then, once this is
2311    done the interface is checked.  */
2312 
2313 
2314 static bool
not_in_recursive(gfc_symbol * sym,gfc_namespace * gsym_ns)2315 not_in_recursive (gfc_symbol *sym, gfc_namespace *gsym_ns)
2316 {
2317   if (!gsym_ns->proc_name->attr.recursive)
2318     return true;
2319 
2320   if (sym->ns == gsym_ns)
2321     return false;
2322 
2323   if (sym->ns->parent && sym->ns->parent == gsym_ns)
2324     return false;
2325 
2326   return true;
2327 }
2328 
2329 static bool
not_entry_self_reference(gfc_symbol * sym,gfc_namespace * gsym_ns)2330 not_entry_self_reference  (gfc_symbol *sym, gfc_namespace *gsym_ns)
2331 {
2332   if (gsym_ns->entries)
2333     {
2334       gfc_entry_list *entry = gsym_ns->entries;
2335 
2336       for (; entry; entry = entry->next)
2337 	{
2338 	  if (strcmp (sym->name, entry->sym->name) == 0)
2339 	    {
2340 	      if (strcmp (gsym_ns->proc_name->name,
2341 			  sym->ns->proc_name->name) == 0)
2342 		return false;
2343 
2344 	      if (sym->ns->parent
2345 		  && strcmp (gsym_ns->proc_name->name,
2346 			     sym->ns->parent->proc_name->name) == 0)
2347 		return false;
2348 	    }
2349 	}
2350     }
2351   return true;
2352 }
2353 
2354 
2355 /* Check for the requirement of an explicit interface. F08:12.4.2.2.  */
2356 
2357 bool
gfc_explicit_interface_required(gfc_symbol * sym,char * errmsg,int err_len)2358 gfc_explicit_interface_required (gfc_symbol *sym, char *errmsg, int err_len)
2359 {
2360   gfc_formal_arglist *arg = gfc_sym_get_dummy_args (sym);
2361 
2362   for ( ; arg; arg = arg->next)
2363     {
2364       if (!arg->sym)
2365 	continue;
2366 
2367       if (arg->sym->attr.allocatable)  /* (2a)  */
2368 	{
2369 	  strncpy (errmsg, _("allocatable argument"), err_len);
2370 	  return true;
2371 	}
2372       else if (arg->sym->attr.asynchronous)
2373 	{
2374 	  strncpy (errmsg, _("asynchronous argument"), err_len);
2375 	  return true;
2376 	}
2377       else if (arg->sym->attr.optional)
2378 	{
2379 	  strncpy (errmsg, _("optional argument"), err_len);
2380 	  return true;
2381 	}
2382       else if (arg->sym->attr.pointer)
2383 	{
2384 	  strncpy (errmsg, _("pointer argument"), err_len);
2385 	  return true;
2386 	}
2387       else if (arg->sym->attr.target)
2388 	{
2389 	  strncpy (errmsg, _("target argument"), err_len);
2390 	  return true;
2391 	}
2392       else if (arg->sym->attr.value)
2393 	{
2394 	  strncpy (errmsg, _("value argument"), err_len);
2395 	  return true;
2396 	}
2397       else if (arg->sym->attr.volatile_)
2398 	{
2399 	  strncpy (errmsg, _("volatile argument"), err_len);
2400 	  return true;
2401 	}
2402       else if (arg->sym->as && arg->sym->as->type == AS_ASSUMED_SHAPE)  /* (2b)  */
2403 	{
2404 	  strncpy (errmsg, _("assumed-shape argument"), err_len);
2405 	  return true;
2406 	}
2407       else if (arg->sym->as && arg->sym->as->type == AS_ASSUMED_RANK)  /* TS 29113, 6.2.  */
2408 	{
2409 	  strncpy (errmsg, _("assumed-rank argument"), err_len);
2410 	  return true;
2411 	}
2412       else if (arg->sym->attr.codimension)  /* (2c)  */
2413 	{
2414 	  strncpy (errmsg, _("coarray argument"), err_len);
2415 	  return true;
2416 	}
2417       else if (false)  /* (2d) TODO: parametrized derived type  */
2418 	{
2419 	  strncpy (errmsg, _("parametrized derived type argument"), err_len);
2420 	  return true;
2421 	}
2422       else if (arg->sym->ts.type == BT_CLASS)  /* (2e)  */
2423 	{
2424 	  strncpy (errmsg, _("polymorphic argument"), err_len);
2425 	  return true;
2426 	}
2427       else if (arg->sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
2428 	{
2429 	  strncpy (errmsg, _("NO_ARG_CHECK attribute"), err_len);
2430 	  return true;
2431 	}
2432       else if (arg->sym->ts.type == BT_ASSUMED)
2433 	{
2434 	  /* As assumed-type is unlimited polymorphic (cf. above).
2435 	     See also TS 29113, Note 6.1.  */
2436 	  strncpy (errmsg, _("assumed-type argument"), err_len);
2437 	  return true;
2438 	}
2439     }
2440 
2441   if (sym->attr.function)
2442     {
2443       gfc_symbol *res = sym->result ? sym->result : sym;
2444 
2445       if (res->attr.dimension)  /* (3a)  */
2446 	{
2447 	  strncpy (errmsg, _("array result"), err_len);
2448 	  return true;
2449 	}
2450       else if (res->attr.pointer || res->attr.allocatable)  /* (3b)  */
2451 	{
2452 	  strncpy (errmsg, _("pointer or allocatable result"), err_len);
2453 	  return true;
2454 	}
2455       else if (res->ts.type == BT_CHARACTER && res->ts.u.cl
2456 	       && res->ts.u.cl->length
2457 	       && res->ts.u.cl->length->expr_type != EXPR_CONSTANT)  /* (3c)  */
2458 	{
2459 	  strncpy (errmsg, _("result with non-constant character length"), err_len);
2460 	  return true;
2461 	}
2462     }
2463 
2464   if (sym->attr.elemental && !sym->attr.intrinsic)  /* (4)  */
2465     {
2466       strncpy (errmsg, _("elemental procedure"), err_len);
2467       return true;
2468     }
2469   else if (sym->attr.is_bind_c)  /* (5)  */
2470     {
2471       strncpy (errmsg, _("bind(c) procedure"), err_len);
2472       return true;
2473     }
2474 
2475   return false;
2476 }
2477 
2478 
2479 static void
resolve_global_procedure(gfc_symbol * sym,locus * where,gfc_actual_arglist ** actual,int sub)2480 resolve_global_procedure (gfc_symbol *sym, locus *where,
2481 			  gfc_actual_arglist **actual, int sub)
2482 {
2483   gfc_gsymbol * gsym;
2484   gfc_namespace *ns;
2485   enum gfc_symbol_type type;
2486   char reason[200];
2487 
2488   type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
2489 
2490   gsym = gfc_get_gsymbol (sym->binding_label ? sym->binding_label : sym->name,
2491 			  sym->binding_label != NULL);
2492 
2493   if ((gsym->type != GSYM_UNKNOWN && gsym->type != type))
2494     gfc_global_used (gsym, where);
2495 
2496   if ((sym->attr.if_source == IFSRC_UNKNOWN
2497        || sym->attr.if_source == IFSRC_IFBODY)
2498       && gsym->type != GSYM_UNKNOWN
2499       && !gsym->binding_label
2500       && gsym->ns
2501       && gsym->ns->proc_name
2502       && not_in_recursive (sym, gsym->ns)
2503       && not_entry_self_reference (sym, gsym->ns))
2504     {
2505       gfc_symbol *def_sym;
2506       def_sym = gsym->ns->proc_name;
2507 
2508       if (gsym->ns->resolved != -1)
2509 	{
2510 
2511 	  /* Resolve the gsymbol namespace if needed.  */
2512 	  if (!gsym->ns->resolved)
2513 	    {
2514 	      gfc_symbol *old_dt_list;
2515 
2516 	      /* Stash away derived types so that the backend_decls
2517 		 do not get mixed up.  */
2518 	      old_dt_list = gfc_derived_types;
2519 	      gfc_derived_types = NULL;
2520 
2521 	      gfc_resolve (gsym->ns);
2522 
2523 	      /* Store the new derived types with the global namespace.  */
2524 	      if (gfc_derived_types)
2525 		gsym->ns->derived_types = gfc_derived_types;
2526 
2527 	      /* Restore the derived types of this namespace.  */
2528 	      gfc_derived_types = old_dt_list;
2529 	    }
2530 
2531 	  /* Make sure that translation for the gsymbol occurs before
2532 	     the procedure currently being resolved.  */
2533 	  ns = gfc_global_ns_list;
2534 	  for (; ns && ns != gsym->ns; ns = ns->sibling)
2535 	    {
2536 	      if (ns->sibling == gsym->ns)
2537 		{
2538 		  ns->sibling = gsym->ns->sibling;
2539 		  gsym->ns->sibling = gfc_global_ns_list;
2540 		  gfc_global_ns_list = gsym->ns;
2541 		  break;
2542 		}
2543 	    }
2544 
2545 	  /* This can happen if a binding name has been specified.  */
2546 	  if (gsym->binding_label && gsym->sym_name != def_sym->name)
2547 	    gfc_find_symbol (gsym->sym_name, gsym->ns, 0, &def_sym);
2548 
2549 	  if (def_sym->attr.entry_master || def_sym->attr.entry)
2550 	    {
2551 	      gfc_entry_list *entry;
2552 	      for (entry = gsym->ns->entries; entry; entry = entry->next)
2553 		if (strcmp (entry->sym->name, sym->name) == 0)
2554 		  {
2555 		    def_sym = entry->sym;
2556 		    break;
2557 		  }
2558 	    }
2559 	}
2560 
2561       if (sym->attr.function && !gfc_compare_types (&sym->ts, &def_sym->ts))
2562 	{
2563 	  gfc_error ("Return type mismatch of function %qs at %L (%s/%s)",
2564 		     sym->name, &sym->declared_at, gfc_typename (&sym->ts),
2565 		     gfc_typename (&def_sym->ts));
2566 	  goto done;
2567 	}
2568 
2569       if (sym->attr.if_source == IFSRC_UNKNOWN
2570 	  && gfc_explicit_interface_required (def_sym, reason, sizeof(reason)))
2571 	{
2572 	  gfc_error ("Explicit interface required for %qs at %L: %s",
2573 		     sym->name, &sym->declared_at, reason);
2574 	  goto done;
2575 	}
2576 
2577       if (!pedantic && (gfc_option.allow_std & GFC_STD_GNU))
2578 	/* Turn erros into warnings with -std=gnu and -std=legacy.  */
2579 	gfc_errors_to_warnings (true);
2580 
2581       if (!gfc_compare_interfaces (sym, def_sym, sym->name, 0, 1,
2582 				   reason, sizeof(reason), NULL, NULL))
2583 	{
2584 	  gfc_error_opt (OPT_Wargument_mismatch,
2585 			 "Interface mismatch in global procedure %qs at %L:"
2586 			 " %s", sym->name, &sym->declared_at, reason);
2587 	  goto done;
2588 	}
2589 
2590       if (!pedantic
2591 	  || ((gfc_option.warn_std & GFC_STD_LEGACY)
2592 	      && !(gfc_option.warn_std & GFC_STD_GNU)))
2593 	gfc_errors_to_warnings (true);
2594 
2595       if (sym->attr.if_source != IFSRC_IFBODY)
2596 	gfc_procedure_use (def_sym, actual, where);
2597     }
2598 
2599 done:
2600   gfc_errors_to_warnings (false);
2601 
2602   if (gsym->type == GSYM_UNKNOWN)
2603     {
2604       gsym->type = type;
2605       gsym->where = *where;
2606     }
2607 
2608   gsym->used = 1;
2609 }
2610 
2611 
2612 /************* Function resolution *************/
2613 
2614 /* Resolve a function call known to be generic.
2615    Section 14.1.2.4.1.  */
2616 
2617 static match
resolve_generic_f0(gfc_expr * expr,gfc_symbol * sym)2618 resolve_generic_f0 (gfc_expr *expr, gfc_symbol *sym)
2619 {
2620   gfc_symbol *s;
2621 
2622   if (sym->attr.generic)
2623     {
2624       s = gfc_search_interface (sym->generic, 0, &expr->value.function.actual);
2625       if (s != NULL)
2626 	{
2627 	  expr->value.function.name = s->name;
2628 	  expr->value.function.esym = s;
2629 
2630 	  if (s->ts.type != BT_UNKNOWN)
2631 	    expr->ts = s->ts;
2632 	  else if (s->result != NULL && s->result->ts.type != BT_UNKNOWN)
2633 	    expr->ts = s->result->ts;
2634 
2635 	  if (s->as != NULL)
2636 	    expr->rank = s->as->rank;
2637 	  else if (s->result != NULL && s->result->as != NULL)
2638 	    expr->rank = s->result->as->rank;
2639 
2640 	  gfc_set_sym_referenced (expr->value.function.esym);
2641 
2642 	  return MATCH_YES;
2643 	}
2644 
2645       /* TODO: Need to search for elemental references in generic
2646 	 interface.  */
2647     }
2648 
2649   if (sym->attr.intrinsic)
2650     return gfc_intrinsic_func_interface (expr, 0);
2651 
2652   return MATCH_NO;
2653 }
2654 
2655 
2656 static bool
resolve_generic_f(gfc_expr * expr)2657 resolve_generic_f (gfc_expr *expr)
2658 {
2659   gfc_symbol *sym;
2660   match m;
2661   gfc_interface *intr = NULL;
2662 
2663   sym = expr->symtree->n.sym;
2664 
2665   for (;;)
2666     {
2667       m = resolve_generic_f0 (expr, sym);
2668       if (m == MATCH_YES)
2669 	return true;
2670       else if (m == MATCH_ERROR)
2671 	return false;
2672 
2673 generic:
2674       if (!intr)
2675 	for (intr = sym->generic; intr; intr = intr->next)
2676 	  if (gfc_fl_struct (intr->sym->attr.flavor))
2677 	    break;
2678 
2679       if (sym->ns->parent == NULL)
2680 	break;
2681       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
2682 
2683       if (sym == NULL)
2684 	break;
2685       if (!generic_sym (sym))
2686 	goto generic;
2687     }
2688 
2689   /* Last ditch attempt.  See if the reference is to an intrinsic
2690      that possesses a matching interface.  14.1.2.4  */
2691   if (sym  && !intr && !gfc_is_intrinsic (sym, 0, expr->where))
2692     {
2693       if (gfc_init_expr_flag)
2694 	gfc_error ("Function %qs in initialization expression at %L "
2695 		   "must be an intrinsic function",
2696 		   expr->symtree->n.sym->name, &expr->where);
2697       else
2698 	gfc_error ("There is no specific function for the generic %qs "
2699 		   "at %L", expr->symtree->n.sym->name, &expr->where);
2700       return false;
2701     }
2702 
2703   if (intr)
2704     {
2705       if (!gfc_convert_to_structure_constructor (expr, intr->sym, NULL,
2706 						 NULL, false))
2707 	return false;
2708       if (!gfc_use_derived (expr->ts.u.derived))
2709 	return false;
2710       return resolve_structure_cons (expr, 0);
2711     }
2712 
2713   m = gfc_intrinsic_func_interface (expr, 0);
2714   if (m == MATCH_YES)
2715     return true;
2716 
2717   if (m == MATCH_NO)
2718     gfc_error ("Generic function %qs at %L is not consistent with a "
2719 	       "specific intrinsic interface", expr->symtree->n.sym->name,
2720 	       &expr->where);
2721 
2722   return false;
2723 }
2724 
2725 
2726 /* Resolve a function call known to be specific.  */
2727 
2728 static match
resolve_specific_f0(gfc_symbol * sym,gfc_expr * expr)2729 resolve_specific_f0 (gfc_symbol *sym, gfc_expr *expr)
2730 {
2731   match m;
2732 
2733   if (sym->attr.external || sym->attr.if_source == IFSRC_IFBODY)
2734     {
2735       if (sym->attr.dummy)
2736 	{
2737 	  sym->attr.proc = PROC_DUMMY;
2738 	  goto found;
2739 	}
2740 
2741       sym->attr.proc = PROC_EXTERNAL;
2742       goto found;
2743     }
2744 
2745   if (sym->attr.proc == PROC_MODULE
2746       || sym->attr.proc == PROC_ST_FUNCTION
2747       || sym->attr.proc == PROC_INTERNAL)
2748     goto found;
2749 
2750   if (sym->attr.intrinsic)
2751     {
2752       m = gfc_intrinsic_func_interface (expr, 1);
2753       if (m == MATCH_YES)
2754 	return MATCH_YES;
2755       if (m == MATCH_NO)
2756 	gfc_error ("Function %qs at %L is INTRINSIC but is not compatible "
2757 		   "with an intrinsic", sym->name, &expr->where);
2758 
2759       return MATCH_ERROR;
2760     }
2761 
2762   return MATCH_NO;
2763 
2764 found:
2765   gfc_procedure_use (sym, &expr->value.function.actual, &expr->where);
2766 
2767   if (sym->result)
2768     expr->ts = sym->result->ts;
2769   else
2770     expr->ts = sym->ts;
2771   expr->value.function.name = sym->name;
2772   expr->value.function.esym = sym;
2773   /* Prevent crash when sym->ts.u.derived->components is not set due to previous
2774      error(s).  */
2775   if (sym->ts.type == BT_CLASS && !CLASS_DATA (sym))
2776     return MATCH_ERROR;
2777   if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as)
2778     expr->rank = CLASS_DATA (sym)->as->rank;
2779   else if (sym->as != NULL)
2780     expr->rank = sym->as->rank;
2781 
2782   return MATCH_YES;
2783 }
2784 
2785 
2786 static bool
resolve_specific_f(gfc_expr * expr)2787 resolve_specific_f (gfc_expr *expr)
2788 {
2789   gfc_symbol *sym;
2790   match m;
2791 
2792   sym = expr->symtree->n.sym;
2793 
2794   for (;;)
2795     {
2796       m = resolve_specific_f0 (sym, expr);
2797       if (m == MATCH_YES)
2798 	return true;
2799       if (m == MATCH_ERROR)
2800 	return false;
2801 
2802       if (sym->ns->parent == NULL)
2803 	break;
2804 
2805       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
2806 
2807       if (sym == NULL)
2808 	break;
2809     }
2810 
2811   gfc_error ("Unable to resolve the specific function %qs at %L",
2812 	     expr->symtree->n.sym->name, &expr->where);
2813 
2814   return true;
2815 }
2816 
2817 /* Recursively append candidate SYM to CANDIDATES.  Store the number of
2818    candidates in CANDIDATES_LEN.  */
2819 
2820 static void
lookup_function_fuzzy_find_candidates(gfc_symtree * sym,char ** & candidates,size_t & candidates_len)2821 lookup_function_fuzzy_find_candidates (gfc_symtree *sym,
2822 				       char **&candidates,
2823 				       size_t &candidates_len)
2824 {
2825   gfc_symtree *p;
2826 
2827   if (sym == NULL)
2828     return;
2829   if ((sym->n.sym->ts.type != BT_UNKNOWN || sym->n.sym->attr.external)
2830       && sym->n.sym->attr.flavor == FL_PROCEDURE)
2831     vec_push (candidates, candidates_len, sym->name);
2832 
2833   p = sym->left;
2834   if (p)
2835     lookup_function_fuzzy_find_candidates (p, candidates, candidates_len);
2836 
2837   p = sym->right;
2838   if (p)
2839     lookup_function_fuzzy_find_candidates (p, candidates, candidates_len);
2840 }
2841 
2842 
2843 /* Lookup function FN fuzzily, taking names in SYMROOT into account.  */
2844 
2845 const char*
gfc_lookup_function_fuzzy(const char * fn,gfc_symtree * symroot)2846 gfc_lookup_function_fuzzy (const char *fn, gfc_symtree *symroot)
2847 {
2848   char **candidates = NULL;
2849   size_t candidates_len = 0;
2850   lookup_function_fuzzy_find_candidates (symroot, candidates, candidates_len);
2851   return gfc_closest_fuzzy_match (fn, candidates);
2852 }
2853 
2854 
2855 /* Resolve a procedure call not known to be generic nor specific.  */
2856 
2857 static bool
resolve_unknown_f(gfc_expr * expr)2858 resolve_unknown_f (gfc_expr *expr)
2859 {
2860   gfc_symbol *sym;
2861   gfc_typespec *ts;
2862 
2863   sym = expr->symtree->n.sym;
2864 
2865   if (sym->attr.dummy)
2866     {
2867       sym->attr.proc = PROC_DUMMY;
2868       expr->value.function.name = sym->name;
2869       goto set_type;
2870     }
2871 
2872   /* See if we have an intrinsic function reference.  */
2873 
2874   if (gfc_is_intrinsic (sym, 0, expr->where))
2875     {
2876       if (gfc_intrinsic_func_interface (expr, 1) == MATCH_YES)
2877 	return true;
2878       return false;
2879     }
2880 
2881   /* The reference is to an external name.  */
2882 
2883   sym->attr.proc = PROC_EXTERNAL;
2884   expr->value.function.name = sym->name;
2885   expr->value.function.esym = expr->symtree->n.sym;
2886 
2887   if (sym->as != NULL)
2888     expr->rank = sym->as->rank;
2889 
2890   /* Type of the expression is either the type of the symbol or the
2891      default type of the symbol.  */
2892 
2893 set_type:
2894   gfc_procedure_use (sym, &expr->value.function.actual, &expr->where);
2895 
2896   if (sym->ts.type != BT_UNKNOWN)
2897     expr->ts = sym->ts;
2898   else
2899     {
2900       ts = gfc_get_default_type (sym->name, sym->ns);
2901 
2902       if (ts->type == BT_UNKNOWN)
2903 	{
2904 	  const char *guessed
2905 	    = gfc_lookup_function_fuzzy (sym->name, sym->ns->sym_root);
2906 	  if (guessed)
2907 	    gfc_error ("Function %qs at %L has no IMPLICIT type"
2908 		       "; did you mean %qs?",
2909 		       sym->name, &expr->where, guessed);
2910 	  else
2911 	    gfc_error ("Function %qs at %L has no IMPLICIT type",
2912 		       sym->name, &expr->where);
2913 	  return false;
2914 	}
2915       else
2916 	expr->ts = *ts;
2917     }
2918 
2919   return true;
2920 }
2921 
2922 
2923 /* Return true, if the symbol is an external procedure.  */
2924 static bool
is_external_proc(gfc_symbol * sym)2925 is_external_proc (gfc_symbol *sym)
2926 {
2927   if (!sym->attr.dummy && !sym->attr.contained
2928 	&& !gfc_is_intrinsic (sym, sym->attr.subroutine, sym->declared_at)
2929 	&& sym->attr.proc != PROC_ST_FUNCTION
2930 	&& !sym->attr.proc_pointer
2931 	&& !sym->attr.use_assoc
2932 	&& sym->name)
2933     return true;
2934 
2935   return false;
2936 }
2937 
2938 
2939 /* Figure out if a function reference is pure or not.  Also set the name
2940    of the function for a potential error message.  Return nonzero if the
2941    function is PURE, zero if not.  */
2942 static int
2943 pure_stmt_function (gfc_expr *, gfc_symbol *);
2944 
2945 int
gfc_pure_function(gfc_expr * e,const char ** name)2946 gfc_pure_function (gfc_expr *e, const char **name)
2947 {
2948   int pure;
2949   gfc_component *comp;
2950 
2951   *name = NULL;
2952 
2953   if (e->symtree != NULL
2954         && e->symtree->n.sym != NULL
2955         && e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
2956     return pure_stmt_function (e, e->symtree->n.sym);
2957 
2958   comp = gfc_get_proc_ptr_comp (e);
2959   if (comp)
2960     {
2961       pure = gfc_pure (comp->ts.interface);
2962       *name = comp->name;
2963     }
2964   else if (e->value.function.esym)
2965     {
2966       pure = gfc_pure (e->value.function.esym);
2967       *name = e->value.function.esym->name;
2968     }
2969   else if (e->value.function.isym)
2970     {
2971       pure = e->value.function.isym->pure
2972 	     || e->value.function.isym->elemental;
2973       *name = e->value.function.isym->name;
2974     }
2975   else
2976     {
2977       /* Implicit functions are not pure.  */
2978       pure = 0;
2979       *name = e->value.function.name;
2980     }
2981 
2982   return pure;
2983 }
2984 
2985 
2986 /* Check if the expression is a reference to an implicitly pure function.  */
2987 
2988 int
gfc_implicit_pure_function(gfc_expr * e)2989 gfc_implicit_pure_function (gfc_expr *e)
2990 {
2991   gfc_component *comp = gfc_get_proc_ptr_comp (e);
2992   if (comp)
2993     return gfc_implicit_pure (comp->ts.interface);
2994   else if (e->value.function.esym)
2995     return gfc_implicit_pure (e->value.function.esym);
2996   else
2997     return 0;
2998 }
2999 
3000 
3001 static bool
impure_stmt_fcn(gfc_expr * e,gfc_symbol * sym,int * f ATTRIBUTE_UNUSED)3002 impure_stmt_fcn (gfc_expr *e, gfc_symbol *sym,
3003 		 int *f ATTRIBUTE_UNUSED)
3004 {
3005   const char *name;
3006 
3007   /* Don't bother recursing into other statement functions
3008      since they will be checked individually for purity.  */
3009   if (e->expr_type != EXPR_FUNCTION
3010 	|| !e->symtree
3011 	|| e->symtree->n.sym == sym
3012 	|| e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
3013     return false;
3014 
3015   return gfc_pure_function (e, &name) ? false : true;
3016 }
3017 
3018 
3019 static int
pure_stmt_function(gfc_expr * e,gfc_symbol * sym)3020 pure_stmt_function (gfc_expr *e, gfc_symbol *sym)
3021 {
3022   return gfc_traverse_expr (e, sym, impure_stmt_fcn, 0) ? 0 : 1;
3023 }
3024 
3025 
3026 /* Check if an impure function is allowed in the current context. */
3027 
check_pure_function(gfc_expr * e)3028 static bool check_pure_function (gfc_expr *e)
3029 {
3030   const char *name = NULL;
3031   if (!gfc_pure_function (e, &name) && name)
3032     {
3033       if (forall_flag)
3034 	{
3035 	  gfc_error ("Reference to impure function %qs at %L inside a "
3036 		     "FORALL %s", name, &e->where,
3037 		     forall_flag == 2 ? "mask" : "block");
3038 	  return false;
3039 	}
3040       else if (gfc_do_concurrent_flag)
3041 	{
3042 	  gfc_error ("Reference to impure function %qs at %L inside a "
3043 		     "DO CONCURRENT %s", name, &e->where,
3044 		     gfc_do_concurrent_flag == 2 ? "mask" : "block");
3045 	  return false;
3046 	}
3047       else if (gfc_pure (NULL))
3048 	{
3049 	  gfc_error ("Reference to impure function %qs at %L "
3050 		     "within a PURE procedure", name, &e->where);
3051 	  return false;
3052 	}
3053       if (!gfc_implicit_pure_function (e))
3054 	gfc_unset_implicit_pure (NULL);
3055     }
3056   return true;
3057 }
3058 
3059 
3060 /* Update current procedure's array_outer_dependency flag, considering
3061    a call to procedure SYM.  */
3062 
3063 static void
update_current_proc_array_outer_dependency(gfc_symbol * sym)3064 update_current_proc_array_outer_dependency (gfc_symbol *sym)
3065 {
3066   /* Check to see if this is a sibling function that has not yet
3067      been resolved.  */
3068   gfc_namespace *sibling = gfc_current_ns->sibling;
3069   for (; sibling; sibling = sibling->sibling)
3070     {
3071       if (sibling->proc_name == sym)
3072 	{
3073 	  gfc_resolve (sibling);
3074 	  break;
3075 	}
3076     }
3077 
3078   /* If SYM has references to outer arrays, so has the procedure calling
3079      SYM.  If SYM is a procedure pointer, we can assume the worst.  */
3080   if ((sym->attr.array_outer_dependency || sym->attr.proc_pointer)
3081       && gfc_current_ns->proc_name)
3082     gfc_current_ns->proc_name->attr.array_outer_dependency = 1;
3083 }
3084 
3085 
3086 /* Resolve a function call, which means resolving the arguments, then figuring
3087    out which entity the name refers to.  */
3088 
3089 static bool
resolve_function(gfc_expr * expr)3090 resolve_function (gfc_expr *expr)
3091 {
3092   gfc_actual_arglist *arg;
3093   gfc_symbol *sym;
3094   bool t;
3095   int temp;
3096   procedure_type p = PROC_INTRINSIC;
3097   bool no_formal_args;
3098 
3099   sym = NULL;
3100   if (expr->symtree)
3101     sym = expr->symtree->n.sym;
3102 
3103   /* If this is a procedure pointer component, it has already been resolved.  */
3104   if (gfc_is_proc_ptr_comp (expr))
3105     return true;
3106 
3107   /* Avoid re-resolving the arguments of caf_get, which can lead to inserting
3108      another caf_get.  */
3109   if (sym && sym->attr.intrinsic
3110       && (sym->intmod_sym_id == GFC_ISYM_CAF_GET
3111 	  || sym->intmod_sym_id == GFC_ISYM_CAF_SEND))
3112     return true;
3113 
3114   if (sym && sym->attr.intrinsic
3115       && !gfc_resolve_intrinsic (sym, &expr->where))
3116     return false;
3117 
3118   if (sym && (sym->attr.flavor == FL_VARIABLE || sym->attr.subroutine))
3119     {
3120       gfc_error ("%qs at %L is not a function", sym->name, &expr->where);
3121       return false;
3122     }
3123 
3124   /* If this is a deferred TBP with an abstract interface (which may
3125      of course be referenced), expr->value.function.esym will be set.  */
3126   if (sym && sym->attr.abstract && !expr->value.function.esym)
3127     {
3128       gfc_error ("ABSTRACT INTERFACE %qs must not be referenced at %L",
3129 		 sym->name, &expr->where);
3130       return false;
3131     }
3132 
3133   /* If this is a deferred TBP with an abstract interface, its result
3134      cannot be an assumed length character (F2003: C418).  */
3135   if (sym && sym->attr.abstract && sym->attr.function
3136       && sym->result->ts.u.cl
3137       && sym->result->ts.u.cl->length == NULL
3138       && !sym->result->ts.deferred)
3139     {
3140       gfc_error ("ABSTRACT INTERFACE %qs at %L must not have an assumed "
3141 		 "character length result (F2008: C418)", sym->name,
3142 		 &sym->declared_at);
3143       return false;
3144     }
3145 
3146   /* Switch off assumed size checking and do this again for certain kinds
3147      of procedure, once the procedure itself is resolved.  */
3148   need_full_assumed_size++;
3149 
3150   if (expr->symtree && expr->symtree->n.sym)
3151     p = expr->symtree->n.sym->attr.proc;
3152 
3153   if (expr->value.function.isym && expr->value.function.isym->inquiry)
3154     inquiry_argument = true;
3155   no_formal_args = sym && is_external_proc (sym)
3156   		       && gfc_sym_get_dummy_args (sym) == NULL;
3157 
3158   if (!resolve_actual_arglist (expr->value.function.actual,
3159 			       p, no_formal_args))
3160     {
3161       inquiry_argument = false;
3162       return false;
3163     }
3164 
3165   inquiry_argument = false;
3166 
3167   /* Resume assumed_size checking.  */
3168   need_full_assumed_size--;
3169 
3170   /* If the procedure is external, check for usage.  */
3171   if (sym && is_external_proc (sym))
3172     resolve_global_procedure (sym, &expr->where,
3173 			      &expr->value.function.actual, 0);
3174 
3175   if (sym && sym->ts.type == BT_CHARACTER
3176       && sym->ts.u.cl
3177       && sym->ts.u.cl->length == NULL
3178       && !sym->attr.dummy
3179       && !sym->ts.deferred
3180       && expr->value.function.esym == NULL
3181       && !sym->attr.contained)
3182     {
3183       /* Internal procedures are taken care of in resolve_contained_fntype.  */
3184       gfc_error ("Function %qs is declared CHARACTER(*) and cannot "
3185 		 "be used at %L since it is not a dummy argument",
3186 		 sym->name, &expr->where);
3187       return false;
3188     }
3189 
3190   /* See if function is already resolved.  */
3191 
3192   if (expr->value.function.name != NULL
3193       || expr->value.function.isym != NULL)
3194     {
3195       if (expr->ts.type == BT_UNKNOWN)
3196 	expr->ts = sym->ts;
3197       t = true;
3198     }
3199   else
3200     {
3201       /* Apply the rules of section 14.1.2.  */
3202 
3203       switch (procedure_kind (sym))
3204 	{
3205 	case PTYPE_GENERIC:
3206 	  t = resolve_generic_f (expr);
3207 	  break;
3208 
3209 	case PTYPE_SPECIFIC:
3210 	  t = resolve_specific_f (expr);
3211 	  break;
3212 
3213 	case PTYPE_UNKNOWN:
3214 	  t = resolve_unknown_f (expr);
3215 	  break;
3216 
3217 	default:
3218 	  gfc_internal_error ("resolve_function(): bad function type");
3219 	}
3220     }
3221 
3222   /* If the expression is still a function (it might have simplified),
3223      then we check to see if we are calling an elemental function.  */
3224 
3225   if (expr->expr_type != EXPR_FUNCTION)
3226     return t;
3227 
3228   temp = need_full_assumed_size;
3229   need_full_assumed_size = 0;
3230 
3231   if (!resolve_elemental_actual (expr, NULL))
3232     return false;
3233 
3234   if (omp_workshare_flag
3235       && expr->value.function.esym
3236       && ! gfc_elemental (expr->value.function.esym))
3237     {
3238       gfc_error ("User defined non-ELEMENTAL function %qs at %L not allowed "
3239 		 "in WORKSHARE construct", expr->value.function.esym->name,
3240 		 &expr->where);
3241       t = false;
3242     }
3243 
3244 #define GENERIC_ID expr->value.function.isym->id
3245   else if (expr->value.function.actual != NULL
3246 	   && expr->value.function.isym != NULL
3247 	   && GENERIC_ID != GFC_ISYM_LBOUND
3248 	   && GENERIC_ID != GFC_ISYM_LCOBOUND
3249 	   && GENERIC_ID != GFC_ISYM_UCOBOUND
3250 	   && GENERIC_ID != GFC_ISYM_LEN
3251 	   && GENERIC_ID != GFC_ISYM_LOC
3252 	   && GENERIC_ID != GFC_ISYM_C_LOC
3253 	   && GENERIC_ID != GFC_ISYM_PRESENT)
3254     {
3255       /* Array intrinsics must also have the last upper bound of an
3256 	 assumed size array argument.  UBOUND and SIZE have to be
3257 	 excluded from the check if the second argument is anything
3258 	 than a constant.  */
3259 
3260       for (arg = expr->value.function.actual; arg; arg = arg->next)
3261 	{
3262 	  if ((GENERIC_ID == GFC_ISYM_UBOUND || GENERIC_ID == GFC_ISYM_SIZE)
3263 	      && arg == expr->value.function.actual
3264 	      && arg->next != NULL && arg->next->expr)
3265 	    {
3266 	      if (arg->next->expr->expr_type != EXPR_CONSTANT)
3267 		break;
3268 
3269 	      if (arg->next->name && strcmp (arg->next->name, "kind") == 0)
3270 		break;
3271 
3272 	      if ((int)mpz_get_si (arg->next->expr->value.integer)
3273 			< arg->expr->rank)
3274 		break;
3275 	    }
3276 
3277 	  if (arg->expr != NULL
3278 	      && arg->expr->rank > 0
3279 	      && resolve_assumed_size_actual (arg->expr))
3280 	    return false;
3281 	}
3282     }
3283 #undef GENERIC_ID
3284 
3285   need_full_assumed_size = temp;
3286 
3287   if (!check_pure_function(expr))
3288     t = false;
3289 
3290   /* Functions without the RECURSIVE attribution are not allowed to
3291    * call themselves.  */
3292   if (expr->value.function.esym && !expr->value.function.esym->attr.recursive)
3293     {
3294       gfc_symbol *esym;
3295       esym = expr->value.function.esym;
3296 
3297       if (is_illegal_recursion (esym, gfc_current_ns))
3298       {
3299 	if (esym->attr.entry && esym->ns->entries)
3300 	  gfc_error ("ENTRY %qs at %L cannot be called recursively, as"
3301 		     " function %qs is not RECURSIVE",
3302 		     esym->name, &expr->where, esym->ns->entries->sym->name);
3303 	else
3304 	  gfc_error ("Function %qs at %L cannot be called recursively, as it"
3305 		     " is not RECURSIVE", esym->name, &expr->where);
3306 
3307 	t = false;
3308       }
3309     }
3310 
3311   /* Character lengths of use associated functions may contains references to
3312      symbols not referenced from the current program unit otherwise.  Make sure
3313      those symbols are marked as referenced.  */
3314 
3315   if (expr->ts.type == BT_CHARACTER && expr->value.function.esym
3316       && expr->value.function.esym->attr.use_assoc)
3317     {
3318       gfc_expr_set_symbols_referenced (expr->ts.u.cl->length);
3319     }
3320 
3321   /* Make sure that the expression has a typespec that works.  */
3322   if (expr->ts.type == BT_UNKNOWN)
3323     {
3324       if (expr->symtree->n.sym->result
3325 	    && expr->symtree->n.sym->result->ts.type != BT_UNKNOWN
3326 	    && !expr->symtree->n.sym->result->attr.proc_pointer)
3327 	expr->ts = expr->symtree->n.sym->result->ts;
3328     }
3329 
3330   if (!expr->ref && !expr->value.function.isym)
3331     {
3332       if (expr->value.function.esym)
3333 	update_current_proc_array_outer_dependency (expr->value.function.esym);
3334       else
3335 	update_current_proc_array_outer_dependency (sym);
3336     }
3337   else if (expr->ref)
3338     /* typebound procedure: Assume the worst.  */
3339     gfc_current_ns->proc_name->attr.array_outer_dependency = 1;
3340 
3341   return t;
3342 }
3343 
3344 
3345 /************* Subroutine resolution *************/
3346 
3347 static bool
pure_subroutine(gfc_symbol * sym,const char * name,locus * loc)3348 pure_subroutine (gfc_symbol *sym, const char *name, locus *loc)
3349 {
3350   if (gfc_pure (sym))
3351     return true;
3352 
3353   if (forall_flag)
3354     {
3355       gfc_error ("Subroutine call to %qs in FORALL block at %L is not PURE",
3356 		 name, loc);
3357       return false;
3358     }
3359   else if (gfc_do_concurrent_flag)
3360     {
3361       gfc_error ("Subroutine call to %qs in DO CONCURRENT block at %L is not "
3362 		 "PURE", name, loc);
3363       return false;
3364     }
3365   else if (gfc_pure (NULL))
3366     {
3367       gfc_error ("Subroutine call to %qs at %L is not PURE", name, loc);
3368       return false;
3369     }
3370 
3371   gfc_unset_implicit_pure (NULL);
3372   return true;
3373 }
3374 
3375 
3376 static match
resolve_generic_s0(gfc_code * c,gfc_symbol * sym)3377 resolve_generic_s0 (gfc_code *c, gfc_symbol *sym)
3378 {
3379   gfc_symbol *s;
3380 
3381   if (sym->attr.generic)
3382     {
3383       s = gfc_search_interface (sym->generic, 1, &c->ext.actual);
3384       if (s != NULL)
3385 	{
3386 	  c->resolved_sym = s;
3387 	  if (!pure_subroutine (s, s->name, &c->loc))
3388 	    return MATCH_ERROR;
3389 	  return MATCH_YES;
3390 	}
3391 
3392       /* TODO: Need to search for elemental references in generic interface.  */
3393     }
3394 
3395   if (sym->attr.intrinsic)
3396     return gfc_intrinsic_sub_interface (c, 0);
3397 
3398   return MATCH_NO;
3399 }
3400 
3401 
3402 static bool
resolve_generic_s(gfc_code * c)3403 resolve_generic_s (gfc_code *c)
3404 {
3405   gfc_symbol *sym;
3406   match m;
3407 
3408   sym = c->symtree->n.sym;
3409 
3410   for (;;)
3411     {
3412       m = resolve_generic_s0 (c, sym);
3413       if (m == MATCH_YES)
3414 	return true;
3415       else if (m == MATCH_ERROR)
3416 	return false;
3417 
3418 generic:
3419       if (sym->ns->parent == NULL)
3420 	break;
3421       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
3422 
3423       if (sym == NULL)
3424 	break;
3425       if (!generic_sym (sym))
3426 	goto generic;
3427     }
3428 
3429   /* Last ditch attempt.  See if the reference is to an intrinsic
3430      that possesses a matching interface.  14.1.2.4  */
3431   sym = c->symtree->n.sym;
3432 
3433   if (!gfc_is_intrinsic (sym, 1, c->loc))
3434     {
3435       gfc_error ("There is no specific subroutine for the generic %qs at %L",
3436 		 sym->name, &c->loc);
3437       return false;
3438     }
3439 
3440   m = gfc_intrinsic_sub_interface (c, 0);
3441   if (m == MATCH_YES)
3442     return true;
3443   if (m == MATCH_NO)
3444     gfc_error ("Generic subroutine %qs at %L is not consistent with an "
3445 	       "intrinsic subroutine interface", sym->name, &c->loc);
3446 
3447   return false;
3448 }
3449 
3450 
3451 /* Resolve a subroutine call known to be specific.  */
3452 
3453 static match
resolve_specific_s0(gfc_code * c,gfc_symbol * sym)3454 resolve_specific_s0 (gfc_code *c, gfc_symbol *sym)
3455 {
3456   match m;
3457 
3458   if (sym->attr.external || sym->attr.if_source == IFSRC_IFBODY)
3459     {
3460       if (sym->attr.dummy)
3461 	{
3462 	  sym->attr.proc = PROC_DUMMY;
3463 	  goto found;
3464 	}
3465 
3466       sym->attr.proc = PROC_EXTERNAL;
3467       goto found;
3468     }
3469 
3470   if (sym->attr.proc == PROC_MODULE || sym->attr.proc == PROC_INTERNAL)
3471     goto found;
3472 
3473   if (sym->attr.intrinsic)
3474     {
3475       m = gfc_intrinsic_sub_interface (c, 1);
3476       if (m == MATCH_YES)
3477 	return MATCH_YES;
3478       if (m == MATCH_NO)
3479 	gfc_error ("Subroutine %qs at %L is INTRINSIC but is not compatible "
3480 		   "with an intrinsic", sym->name, &c->loc);
3481 
3482       return MATCH_ERROR;
3483     }
3484 
3485   return MATCH_NO;
3486 
3487 found:
3488   gfc_procedure_use (sym, &c->ext.actual, &c->loc);
3489 
3490   c->resolved_sym = sym;
3491   if (!pure_subroutine (sym, sym->name, &c->loc))
3492     return MATCH_ERROR;
3493 
3494   return MATCH_YES;
3495 }
3496 
3497 
3498 static bool
resolve_specific_s(gfc_code * c)3499 resolve_specific_s (gfc_code *c)
3500 {
3501   gfc_symbol *sym;
3502   match m;
3503 
3504   sym = c->symtree->n.sym;
3505 
3506   for (;;)
3507     {
3508       m = resolve_specific_s0 (c, sym);
3509       if (m == MATCH_YES)
3510 	return true;
3511       if (m == MATCH_ERROR)
3512 	return false;
3513 
3514       if (sym->ns->parent == NULL)
3515 	break;
3516 
3517       gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym);
3518 
3519       if (sym == NULL)
3520 	break;
3521     }
3522 
3523   sym = c->symtree->n.sym;
3524   gfc_error ("Unable to resolve the specific subroutine %qs at %L",
3525 	     sym->name, &c->loc);
3526 
3527   return false;
3528 }
3529 
3530 
3531 /* Resolve a subroutine call not known to be generic nor specific.  */
3532 
3533 static bool
resolve_unknown_s(gfc_code * c)3534 resolve_unknown_s (gfc_code *c)
3535 {
3536   gfc_symbol *sym;
3537 
3538   sym = c->symtree->n.sym;
3539 
3540   if (sym->attr.dummy)
3541     {
3542       sym->attr.proc = PROC_DUMMY;
3543       goto found;
3544     }
3545 
3546   /* See if we have an intrinsic function reference.  */
3547 
3548   if (gfc_is_intrinsic (sym, 1, c->loc))
3549     {
3550       if (gfc_intrinsic_sub_interface (c, 1) == MATCH_YES)
3551 	return true;
3552       return false;
3553     }
3554 
3555   /* The reference is to an external name.  */
3556 
3557 found:
3558   gfc_procedure_use (sym, &c->ext.actual, &c->loc);
3559 
3560   c->resolved_sym = sym;
3561 
3562   return pure_subroutine (sym, sym->name, &c->loc);
3563 }
3564 
3565 
3566 /* Resolve a subroutine call.  Although it was tempting to use the same code
3567    for functions, subroutines and functions are stored differently and this
3568    makes things awkward.  */
3569 
3570 static bool
resolve_call(gfc_code * c)3571 resolve_call (gfc_code *c)
3572 {
3573   bool t;
3574   procedure_type ptype = PROC_INTRINSIC;
3575   gfc_symbol *csym, *sym;
3576   bool no_formal_args;
3577 
3578   csym = c->symtree ? c->symtree->n.sym : NULL;
3579 
3580   if (csym && csym->ts.type != BT_UNKNOWN)
3581     {
3582       gfc_error ("%qs at %L has a type, which is not consistent with "
3583 		 "the CALL at %L", csym->name, &csym->declared_at, &c->loc);
3584       return false;
3585     }
3586 
3587   if (csym && gfc_current_ns->parent && csym->ns != gfc_current_ns)
3588     {
3589       gfc_symtree *st;
3590       gfc_find_sym_tree (c->symtree->name, gfc_current_ns, 1, &st);
3591       sym = st ? st->n.sym : NULL;
3592       if (sym && csym != sym
3593 	      && sym->ns == gfc_current_ns
3594 	      && sym->attr.flavor == FL_PROCEDURE
3595 	      && sym->attr.contained)
3596 	{
3597 	  sym->refs++;
3598 	  if (csym->attr.generic)
3599 	    c->symtree->n.sym = sym;
3600 	  else
3601 	    c->symtree = st;
3602 	  csym = c->symtree->n.sym;
3603 	}
3604     }
3605 
3606   /* If this ia a deferred TBP, c->expr1 will be set.  */
3607   if (!c->expr1 && csym)
3608     {
3609       if (csym->attr.abstract)
3610 	{
3611 	  gfc_error ("ABSTRACT INTERFACE %qs must not be referenced at %L",
3612 		    csym->name, &c->loc);
3613 	  return false;
3614 	}
3615 
3616       /* Subroutines without the RECURSIVE attribution are not allowed to
3617 	 call themselves.  */
3618       if (is_illegal_recursion (csym, gfc_current_ns))
3619 	{
3620 	  if (csym->attr.entry && csym->ns->entries)
3621 	    gfc_error ("ENTRY %qs at %L cannot be called recursively, "
3622 		       "as subroutine %qs is not RECURSIVE",
3623 		       csym->name, &c->loc, csym->ns->entries->sym->name);
3624 	  else
3625 	    gfc_error ("SUBROUTINE %qs at %L cannot be called recursively, "
3626 		       "as it is not RECURSIVE", csym->name, &c->loc);
3627 
3628 	  t = false;
3629 	}
3630     }
3631 
3632   /* Switch off assumed size checking and do this again for certain kinds
3633      of procedure, once the procedure itself is resolved.  */
3634   need_full_assumed_size++;
3635 
3636   if (csym)
3637     ptype = csym->attr.proc;
3638 
3639   no_formal_args = csym && is_external_proc (csym)
3640 			&& gfc_sym_get_dummy_args (csym) == NULL;
3641   if (!resolve_actual_arglist (c->ext.actual, ptype, no_formal_args))
3642     return false;
3643 
3644   /* Resume assumed_size checking.  */
3645   need_full_assumed_size--;
3646 
3647   /* If external, check for usage.  */
3648   if (csym && is_external_proc (csym))
3649     resolve_global_procedure (csym, &c->loc, &c->ext.actual, 1);
3650 
3651   t = true;
3652   if (c->resolved_sym == NULL)
3653     {
3654       c->resolved_isym = NULL;
3655       switch (procedure_kind (csym))
3656 	{
3657 	case PTYPE_GENERIC:
3658 	  t = resolve_generic_s (c);
3659 	  break;
3660 
3661 	case PTYPE_SPECIFIC:
3662 	  t = resolve_specific_s (c);
3663 	  break;
3664 
3665 	case PTYPE_UNKNOWN:
3666 	  t = resolve_unknown_s (c);
3667 	  break;
3668 
3669 	default:
3670 	  gfc_internal_error ("resolve_subroutine(): bad function type");
3671 	}
3672     }
3673 
3674   /* Some checks of elemental subroutine actual arguments.  */
3675   if (!resolve_elemental_actual (NULL, c))
3676     return false;
3677 
3678   if (!c->expr1)
3679     update_current_proc_array_outer_dependency (csym);
3680   else
3681     /* Typebound procedure: Assume the worst.  */
3682     gfc_current_ns->proc_name->attr.array_outer_dependency = 1;
3683 
3684   return t;
3685 }
3686 
3687 
3688 /* Compare the shapes of two arrays that have non-NULL shapes.  If both
3689    op1->shape and op2->shape are non-NULL return true if their shapes
3690    match.  If both op1->shape and op2->shape are non-NULL return false
3691    if their shapes do not match.  If either op1->shape or op2->shape is
3692    NULL, return true.  */
3693 
3694 static bool
compare_shapes(gfc_expr * op1,gfc_expr * op2)3695 compare_shapes (gfc_expr *op1, gfc_expr *op2)
3696 {
3697   bool t;
3698   int i;
3699 
3700   t = true;
3701 
3702   if (op1->shape != NULL && op2->shape != NULL)
3703     {
3704       for (i = 0; i < op1->rank; i++)
3705 	{
3706 	  if (mpz_cmp (op1->shape[i], op2->shape[i]) != 0)
3707 	   {
3708 	     gfc_error ("Shapes for operands at %L and %L are not conformable",
3709 			&op1->where, &op2->where);
3710 	     t = false;
3711 	     break;
3712 	   }
3713 	}
3714     }
3715 
3716   return t;
3717 }
3718 
3719 /* Convert a logical operator to the corresponding bitwise intrinsic call.
3720    For example A .AND. B becomes IAND(A, B).  */
3721 static gfc_expr *
logical_to_bitwise(gfc_expr * e)3722 logical_to_bitwise (gfc_expr *e)
3723 {
3724   gfc_expr *tmp, *op1, *op2;
3725   gfc_isym_id isym;
3726   gfc_actual_arglist *args = NULL;
3727 
3728   gcc_assert (e->expr_type == EXPR_OP);
3729 
3730   isym = GFC_ISYM_NONE;
3731   op1 = e->value.op.op1;
3732   op2 = e->value.op.op2;
3733 
3734   switch (e->value.op.op)
3735     {
3736     case INTRINSIC_NOT:
3737       isym = GFC_ISYM_NOT;
3738       break;
3739     case INTRINSIC_AND:
3740       isym = GFC_ISYM_IAND;
3741       break;
3742     case INTRINSIC_OR:
3743       isym = GFC_ISYM_IOR;
3744       break;
3745     case INTRINSIC_NEQV:
3746       isym = GFC_ISYM_IEOR;
3747       break;
3748     case INTRINSIC_EQV:
3749       /* "Bitwise eqv" is just the complement of NEQV === IEOR.
3750 	 Change the old expression to NEQV, which will get replaced by IEOR,
3751 	 and wrap it in NOT.  */
3752       tmp = gfc_copy_expr (e);
3753       tmp->value.op.op = INTRINSIC_NEQV;
3754       tmp = logical_to_bitwise (tmp);
3755       isym = GFC_ISYM_NOT;
3756       op1 = tmp;
3757       op2 = NULL;
3758       break;
3759     default:
3760       gfc_internal_error ("logical_to_bitwise(): Bad intrinsic");
3761     }
3762 
3763   /* Inherit the original operation's operands as arguments.  */
3764   args = gfc_get_actual_arglist ();
3765   args->expr = op1;
3766   if (op2)
3767     {
3768       args->next = gfc_get_actual_arglist ();
3769       args->next->expr = op2;
3770     }
3771 
3772   /* Convert the expression to a function call.  */
3773   e->expr_type = EXPR_FUNCTION;
3774   e->value.function.actual = args;
3775   e->value.function.isym = gfc_intrinsic_function_by_id (isym);
3776   e->value.function.name = e->value.function.isym->name;
3777   e->value.function.esym = NULL;
3778 
3779   /* Make up a pre-resolved function call symtree if we need to.  */
3780   if (!e->symtree || !e->symtree->n.sym)
3781     {
3782       gfc_symbol *sym;
3783       gfc_get_ha_sym_tree (e->value.function.isym->name, &e->symtree);
3784       sym = e->symtree->n.sym;
3785       sym->result = sym;
3786       sym->attr.flavor = FL_PROCEDURE;
3787       sym->attr.function = 1;
3788       sym->attr.elemental = 1;
3789       sym->attr.pure = 1;
3790       sym->attr.referenced = 1;
3791       gfc_intrinsic_symbol (sym);
3792       gfc_commit_symbol (sym);
3793     }
3794 
3795   args->name = e->value.function.isym->formal->name;
3796   if (e->value.function.isym->formal->next)
3797     args->next->name = e->value.function.isym->formal->next->name;
3798 
3799   return e;
3800 }
3801 
3802 /* Recursively append candidate UOP to CANDIDATES.  Store the number of
3803    candidates in CANDIDATES_LEN.  */
3804 static void
lookup_uop_fuzzy_find_candidates(gfc_symtree * uop,char ** & candidates,size_t & candidates_len)3805 lookup_uop_fuzzy_find_candidates (gfc_symtree *uop,
3806 				  char **&candidates,
3807 				  size_t &candidates_len)
3808 {
3809   gfc_symtree *p;
3810 
3811   if (uop == NULL)
3812     return;
3813 
3814   /* Not sure how to properly filter here.  Use all for a start.
3815      n.uop.op is NULL for empty interface operators (is that legal?) disregard
3816      these as i suppose they don't make terribly sense.  */
3817 
3818   if (uop->n.uop->op != NULL)
3819     vec_push (candidates, candidates_len, uop->name);
3820 
3821   p = uop->left;
3822   if (p)
3823     lookup_uop_fuzzy_find_candidates (p, candidates, candidates_len);
3824 
3825   p = uop->right;
3826   if (p)
3827     lookup_uop_fuzzy_find_candidates (p, candidates, candidates_len);
3828 }
3829 
3830 /* Lookup user-operator OP fuzzily, taking names in UOP into account.  */
3831 
3832 static const char*
lookup_uop_fuzzy(const char * op,gfc_symtree * uop)3833 lookup_uop_fuzzy (const char *op, gfc_symtree *uop)
3834 {
3835   char **candidates = NULL;
3836   size_t candidates_len = 0;
3837   lookup_uop_fuzzy_find_candidates (uop, candidates, candidates_len);
3838   return gfc_closest_fuzzy_match (op, candidates);
3839 }
3840 
3841 
3842 /* Callback finding an impure function as an operand to an .and. or
3843    .or.  expression.  Remember the last function warned about to
3844    avoid double warnings when recursing.  */
3845 
3846 static int
impure_function_callback(gfc_expr ** e,int * walk_subtrees ATTRIBUTE_UNUSED,void * data)3847 impure_function_callback (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED,
3848 			  void *data)
3849 {
3850   gfc_expr *f = *e;
3851   const char *name;
3852   static gfc_expr *last = NULL;
3853   bool *found = (bool *) data;
3854 
3855   if (f->expr_type == EXPR_FUNCTION)
3856     {
3857       *found = 1;
3858       if (f != last && !gfc_pure_function (f, &name)
3859 	  && !gfc_implicit_pure_function (f))
3860 	{
3861 	  if (name)
3862 	    gfc_warning (OPT_Wfunction_elimination,
3863 			 "Impure function %qs at %L might not be evaluated",
3864 			 name, &f->where);
3865 	  else
3866 	    gfc_warning (OPT_Wfunction_elimination,
3867 			 "Impure function at %L might not be evaluated",
3868 			 &f->where);
3869 	}
3870       last = f;
3871     }
3872 
3873   return 0;
3874 }
3875 
3876 
3877 /* Resolve an operator expression node.  This can involve replacing the
3878    operation with a user defined function call.  */
3879 
3880 static bool
resolve_operator(gfc_expr * e)3881 resolve_operator (gfc_expr *e)
3882 {
3883   gfc_expr *op1, *op2;
3884   char msg[200];
3885   bool dual_locus_error;
3886   bool t = true;
3887 
3888   /* Resolve all subnodes-- give them types.  */
3889 
3890   switch (e->value.op.op)
3891     {
3892     default:
3893       if (!gfc_resolve_expr (e->value.op.op2))
3894 	return false;
3895 
3896     /* Fall through.  */
3897 
3898     case INTRINSIC_NOT:
3899     case INTRINSIC_UPLUS:
3900     case INTRINSIC_UMINUS:
3901     case INTRINSIC_PARENTHESES:
3902       if (!gfc_resolve_expr (e->value.op.op1))
3903 	return false;
3904       break;
3905     }
3906 
3907   /* Typecheck the new node.  */
3908 
3909   op1 = e->value.op.op1;
3910   op2 = e->value.op.op2;
3911   dual_locus_error = false;
3912 
3913   if ((op1 && op1->expr_type == EXPR_NULL)
3914       || (op2 && op2->expr_type == EXPR_NULL))
3915     {
3916       sprintf (msg, _("Invalid context for NULL() pointer at %%L"));
3917       goto bad_op;
3918     }
3919 
3920   switch (e->value.op.op)
3921     {
3922     case INTRINSIC_UPLUS:
3923     case INTRINSIC_UMINUS:
3924       if (op1->ts.type == BT_INTEGER
3925 	  || op1->ts.type == BT_REAL
3926 	  || op1->ts.type == BT_COMPLEX)
3927 	{
3928 	  e->ts = op1->ts;
3929 	  break;
3930 	}
3931 
3932       sprintf (msg, _("Operand of unary numeric operator %%<%s%%> at %%L is %s"),
3933 	       gfc_op2string (e->value.op.op), gfc_typename (&e->ts));
3934       goto bad_op;
3935 
3936     case INTRINSIC_PLUS:
3937     case INTRINSIC_MINUS:
3938     case INTRINSIC_TIMES:
3939     case INTRINSIC_DIVIDE:
3940     case INTRINSIC_POWER:
3941       if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
3942 	{
3943 	  gfc_type_convert_binary (e, 1);
3944 	  break;
3945 	}
3946 
3947       if (op1->ts.type == BT_DERIVED || op2->ts.type == BT_DERIVED)
3948 	sprintf (msg,
3949 	       _("Unexpected derived-type entities in binary intrinsic "
3950 		 "numeric operator %%<%s%%> at %%L"),
3951 	       gfc_op2string (e->value.op.op));
3952       else
3953       	sprintf (msg,
3954 	       _("Operands of binary numeric operator %%<%s%%> at %%L are %s/%s"),
3955 	       gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
3956 	       gfc_typename (&op2->ts));
3957       goto bad_op;
3958 
3959     case INTRINSIC_CONCAT:
3960       if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
3961 	  && op1->ts.kind == op2->ts.kind)
3962 	{
3963 	  e->ts.type = BT_CHARACTER;
3964 	  e->ts.kind = op1->ts.kind;
3965 	  break;
3966 	}
3967 
3968       sprintf (msg,
3969 	       _("Operands of string concatenation operator at %%L are %s/%s"),
3970 	       gfc_typename (&op1->ts), gfc_typename (&op2->ts));
3971       goto bad_op;
3972 
3973     case INTRINSIC_AND:
3974     case INTRINSIC_OR:
3975     case INTRINSIC_EQV:
3976     case INTRINSIC_NEQV:
3977       if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
3978 	{
3979 	  e->ts.type = BT_LOGICAL;
3980 	  e->ts.kind = gfc_kind_max (op1, op2);
3981 	  if (op1->ts.kind < e->ts.kind)
3982 	    gfc_convert_type (op1, &e->ts, 2);
3983 	  else if (op2->ts.kind < e->ts.kind)
3984 	    gfc_convert_type (op2, &e->ts, 2);
3985 
3986 	  if (flag_frontend_optimize &&
3987 	    (e->value.op.op == INTRINSIC_AND || e->value.op.op == INTRINSIC_OR))
3988 	    {
3989 	      /* Warn about short-circuiting
3990 	         with impure function as second operand.  */
3991 	      bool op2_f = false;
3992 	      gfc_expr_walker (&op2, impure_function_callback, &op2_f);
3993 	    }
3994 	  break;
3995 	}
3996 
3997       /* Logical ops on integers become bitwise ops with -fdec.  */
3998       else if (flag_dec
3999 	       && (op1->ts.type == BT_INTEGER || op2->ts.type == BT_INTEGER))
4000 	{
4001 	  e->ts.type = BT_INTEGER;
4002 	  e->ts.kind = gfc_kind_max (op1, op2);
4003 	  if (op1->ts.type != e->ts.type || op1->ts.kind != e->ts.kind)
4004 	    gfc_convert_type (op1, &e->ts, 1);
4005 	  if (op2->ts.type != e->ts.type || op2->ts.kind != e->ts.kind)
4006 	    gfc_convert_type (op2, &e->ts, 1);
4007 	  e = logical_to_bitwise (e);
4008 	  goto simplify_op;
4009 	}
4010 
4011       sprintf (msg, _("Operands of logical operator %%<%s%%> at %%L are %s/%s"),
4012 	       gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
4013 	       gfc_typename (&op2->ts));
4014 
4015       goto bad_op;
4016 
4017     case INTRINSIC_NOT:
4018       /* Logical ops on integers become bitwise ops with -fdec.  */
4019       if (flag_dec && op1->ts.type == BT_INTEGER)
4020 	{
4021 	  e->ts.type = BT_INTEGER;
4022 	  e->ts.kind = op1->ts.kind;
4023 	  e = logical_to_bitwise (e);
4024 	  goto simplify_op;
4025 	}
4026 
4027       if (op1->ts.type == BT_LOGICAL)
4028 	{
4029 	  e->ts.type = BT_LOGICAL;
4030 	  e->ts.kind = op1->ts.kind;
4031 	  break;
4032 	}
4033 
4034       sprintf (msg, _("Operand of .not. operator at %%L is %s"),
4035 	       gfc_typename (&op1->ts));
4036       goto bad_op;
4037 
4038     case INTRINSIC_GT:
4039     case INTRINSIC_GT_OS:
4040     case INTRINSIC_GE:
4041     case INTRINSIC_GE_OS:
4042     case INTRINSIC_LT:
4043     case INTRINSIC_LT_OS:
4044     case INTRINSIC_LE:
4045     case INTRINSIC_LE_OS:
4046       if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
4047 	{
4048 	  strcpy (msg, _("COMPLEX quantities cannot be compared at %L"));
4049 	  goto bad_op;
4050 	}
4051 
4052       /* Fall through.  */
4053 
4054     case INTRINSIC_EQ:
4055     case INTRINSIC_EQ_OS:
4056     case INTRINSIC_NE:
4057     case INTRINSIC_NE_OS:
4058       if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
4059 	  && op1->ts.kind == op2->ts.kind)
4060 	{
4061 	  e->ts.type = BT_LOGICAL;
4062 	  e->ts.kind = gfc_default_logical_kind;
4063 	  break;
4064 	}
4065 
4066       if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
4067 	{
4068 	  gfc_type_convert_binary (e, 1);
4069 
4070 	  e->ts.type = BT_LOGICAL;
4071 	  e->ts.kind = gfc_default_logical_kind;
4072 
4073 	  if (warn_compare_reals)
4074 	    {
4075 	      gfc_intrinsic_op op = e->value.op.op;
4076 
4077 	      /* Type conversion has made sure that the types of op1 and op2
4078 		 agree, so it is only necessary to check the first one.   */
4079 	      if ((op1->ts.type == BT_REAL || op1->ts.type == BT_COMPLEX)
4080 		  && (op == INTRINSIC_EQ || op == INTRINSIC_EQ_OS
4081 		      || op == INTRINSIC_NE || op == INTRINSIC_NE_OS))
4082 		{
4083 		  const char *msg;
4084 
4085 		  if (op == INTRINSIC_EQ || op == INTRINSIC_EQ_OS)
4086 		    msg = "Equality comparison for %s at %L";
4087 		  else
4088 		    msg = "Inequality comparison for %s at %L";
4089 
4090 		  gfc_warning (OPT_Wcompare_reals, msg,
4091 			       gfc_typename (&op1->ts), &op1->where);
4092 		}
4093 	    }
4094 
4095 	  break;
4096 	}
4097 
4098       if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
4099 	sprintf (msg,
4100 		 _("Logicals at %%L must be compared with %s instead of %s"),
4101 		 (e->value.op.op == INTRINSIC_EQ
4102 		  || e->value.op.op == INTRINSIC_EQ_OS)
4103 		 ? ".eqv." : ".neqv.", gfc_op2string (e->value.op.op));
4104       else
4105 	sprintf (msg,
4106 		 _("Operands of comparison operator %%<%s%%> at %%L are %s/%s"),
4107 		 gfc_op2string (e->value.op.op), gfc_typename (&op1->ts),
4108 		 gfc_typename (&op2->ts));
4109 
4110       goto bad_op;
4111 
4112     case INTRINSIC_USER:
4113       if (e->value.op.uop->op == NULL)
4114 	{
4115 	  const char *name = e->value.op.uop->name;
4116 	  const char *guessed;
4117 	  guessed = lookup_uop_fuzzy (name, e->value.op.uop->ns->uop_root);
4118 	  if (guessed)
4119 	    sprintf (msg, _("Unknown operator %%<%s%%> at %%L; did you mean '%s'?"),
4120 		name, guessed);
4121 	  else
4122 	    sprintf (msg, _("Unknown operator %%<%s%%> at %%L"), name);
4123 	}
4124       else if (op2 == NULL)
4125 	sprintf (msg, _("Operand of user operator %%<%s%%> at %%L is %s"),
4126 		 e->value.op.uop->name, gfc_typename (&op1->ts));
4127       else
4128 	{
4129 	  sprintf (msg, _("Operands of user operator %%<%s%%> at %%L are %s/%s"),
4130 		   e->value.op.uop->name, gfc_typename (&op1->ts),
4131 		   gfc_typename (&op2->ts));
4132 	  e->value.op.uop->op->sym->attr.referenced = 1;
4133 	}
4134 
4135       goto bad_op;
4136 
4137     case INTRINSIC_PARENTHESES:
4138       e->ts = op1->ts;
4139       if (e->ts.type == BT_CHARACTER)
4140 	e->ts.u.cl = op1->ts.u.cl;
4141       break;
4142 
4143     default:
4144       gfc_internal_error ("resolve_operator(): Bad intrinsic");
4145     }
4146 
4147   /* Deal with arrayness of an operand through an operator.  */
4148 
4149   switch (e->value.op.op)
4150     {
4151     case INTRINSIC_PLUS:
4152     case INTRINSIC_MINUS:
4153     case INTRINSIC_TIMES:
4154     case INTRINSIC_DIVIDE:
4155     case INTRINSIC_POWER:
4156     case INTRINSIC_CONCAT:
4157     case INTRINSIC_AND:
4158     case INTRINSIC_OR:
4159     case INTRINSIC_EQV:
4160     case INTRINSIC_NEQV:
4161     case INTRINSIC_EQ:
4162     case INTRINSIC_EQ_OS:
4163     case INTRINSIC_NE:
4164     case INTRINSIC_NE_OS:
4165     case INTRINSIC_GT:
4166     case INTRINSIC_GT_OS:
4167     case INTRINSIC_GE:
4168     case INTRINSIC_GE_OS:
4169     case INTRINSIC_LT:
4170     case INTRINSIC_LT_OS:
4171     case INTRINSIC_LE:
4172     case INTRINSIC_LE_OS:
4173 
4174       if (op1->rank == 0 && op2->rank == 0)
4175 	e->rank = 0;
4176 
4177       if (op1->rank == 0 && op2->rank != 0)
4178 	{
4179 	  e->rank = op2->rank;
4180 
4181 	  if (e->shape == NULL)
4182 	    e->shape = gfc_copy_shape (op2->shape, op2->rank);
4183 	}
4184 
4185       if (op1->rank != 0 && op2->rank == 0)
4186 	{
4187 	  e->rank = op1->rank;
4188 
4189 	  if (e->shape == NULL)
4190 	    e->shape = gfc_copy_shape (op1->shape, op1->rank);
4191 	}
4192 
4193       if (op1->rank != 0 && op2->rank != 0)
4194 	{
4195 	  if (op1->rank == op2->rank)
4196 	    {
4197 	      e->rank = op1->rank;
4198 	      if (e->shape == NULL)
4199 		{
4200 		  t = compare_shapes (op1, op2);
4201 		  if (!t)
4202 		    e->shape = NULL;
4203 		  else
4204 		    e->shape = gfc_copy_shape (op1->shape, op1->rank);
4205 		}
4206 	    }
4207 	  else
4208 	    {
4209 	      /* Allow higher level expressions to work.  */
4210 	      e->rank = 0;
4211 
4212 	      /* Try user-defined operators, and otherwise throw an error.  */
4213 	      dual_locus_error = true;
4214 	      sprintf (msg,
4215 		       _("Inconsistent ranks for operator at %%L and %%L"));
4216 	      goto bad_op;
4217 	    }
4218 	}
4219 
4220       break;
4221 
4222     case INTRINSIC_PARENTHESES:
4223     case INTRINSIC_NOT:
4224     case INTRINSIC_UPLUS:
4225     case INTRINSIC_UMINUS:
4226       /* Simply copy arrayness attribute */
4227       e->rank = op1->rank;
4228 
4229       if (e->shape == NULL)
4230 	e->shape = gfc_copy_shape (op1->shape, op1->rank);
4231 
4232       break;
4233 
4234     default:
4235       break;
4236     }
4237 
4238 simplify_op:
4239 
4240   /* Attempt to simplify the expression.  */
4241   if (t)
4242     {
4243       t = gfc_simplify_expr (e, 0);
4244       /* Some calls do not succeed in simplification and return false
4245 	 even though there is no error; e.g. variable references to
4246 	 PARAMETER arrays.  */
4247       if (!gfc_is_constant_expr (e))
4248 	t = true;
4249     }
4250   return t;
4251 
4252 bad_op:
4253 
4254   {
4255     match m = gfc_extend_expr (e);
4256     if (m == MATCH_YES)
4257       return true;
4258     if (m == MATCH_ERROR)
4259       return false;
4260   }
4261 
4262   if (dual_locus_error)
4263     gfc_error (msg, &op1->where, &op2->where);
4264   else
4265     gfc_error (msg, &e->where);
4266 
4267   return false;
4268 }
4269 
4270 
4271 /************** Array resolution subroutines **************/
4272 
4273 enum compare_result
4274 { CMP_LT, CMP_EQ, CMP_GT, CMP_UNKNOWN };
4275 
4276 /* Compare two integer expressions.  */
4277 
4278 static compare_result
compare_bound(gfc_expr * a,gfc_expr * b)4279 compare_bound (gfc_expr *a, gfc_expr *b)
4280 {
4281   int i;
4282 
4283   if (a == NULL || a->expr_type != EXPR_CONSTANT
4284       || b == NULL || b->expr_type != EXPR_CONSTANT)
4285     return CMP_UNKNOWN;
4286 
4287   /* If either of the types isn't INTEGER, we must have
4288      raised an error earlier.  */
4289 
4290   if (a->ts.type != BT_INTEGER || b->ts.type != BT_INTEGER)
4291     return CMP_UNKNOWN;
4292 
4293   i = mpz_cmp (a->value.integer, b->value.integer);
4294 
4295   if (i < 0)
4296     return CMP_LT;
4297   if (i > 0)
4298     return CMP_GT;
4299   return CMP_EQ;
4300 }
4301 
4302 
4303 /* Compare an integer expression with an integer.  */
4304 
4305 static compare_result
compare_bound_int(gfc_expr * a,int b)4306 compare_bound_int (gfc_expr *a, int b)
4307 {
4308   int i;
4309 
4310   if (a == NULL || a->expr_type != EXPR_CONSTANT)
4311     return CMP_UNKNOWN;
4312 
4313   if (a->ts.type != BT_INTEGER)
4314     gfc_internal_error ("compare_bound_int(): Bad expression");
4315 
4316   i = mpz_cmp_si (a->value.integer, b);
4317 
4318   if (i < 0)
4319     return CMP_LT;
4320   if (i > 0)
4321     return CMP_GT;
4322   return CMP_EQ;
4323 }
4324 
4325 
4326 /* Compare an integer expression with a mpz_t.  */
4327 
4328 static compare_result
compare_bound_mpz_t(gfc_expr * a,mpz_t b)4329 compare_bound_mpz_t (gfc_expr *a, mpz_t b)
4330 {
4331   int i;
4332 
4333   if (a == NULL || a->expr_type != EXPR_CONSTANT)
4334     return CMP_UNKNOWN;
4335 
4336   if (a->ts.type != BT_INTEGER)
4337     gfc_internal_error ("compare_bound_int(): Bad expression");
4338 
4339   i = mpz_cmp (a->value.integer, b);
4340 
4341   if (i < 0)
4342     return CMP_LT;
4343   if (i > 0)
4344     return CMP_GT;
4345   return CMP_EQ;
4346 }
4347 
4348 
4349 /* Compute the last value of a sequence given by a triplet.
4350    Return 0 if it wasn't able to compute the last value, or if the
4351    sequence if empty, and 1 otherwise.  */
4352 
4353 static int
compute_last_value_for_triplet(gfc_expr * start,gfc_expr * end,gfc_expr * stride,mpz_t last)4354 compute_last_value_for_triplet (gfc_expr *start, gfc_expr *end,
4355 				gfc_expr *stride, mpz_t last)
4356 {
4357   mpz_t rem;
4358 
4359   if (start == NULL || start->expr_type != EXPR_CONSTANT
4360       || end == NULL || end->expr_type != EXPR_CONSTANT
4361       || (stride != NULL && stride->expr_type != EXPR_CONSTANT))
4362     return 0;
4363 
4364   if (start->ts.type != BT_INTEGER || end->ts.type != BT_INTEGER
4365       || (stride != NULL && stride->ts.type != BT_INTEGER))
4366     return 0;
4367 
4368   if (stride == NULL || compare_bound_int (stride, 1) == CMP_EQ)
4369     {
4370       if (compare_bound (start, end) == CMP_GT)
4371 	return 0;
4372       mpz_set (last, end->value.integer);
4373       return 1;
4374     }
4375 
4376   if (compare_bound_int (stride, 0) == CMP_GT)
4377     {
4378       /* Stride is positive */
4379       if (mpz_cmp (start->value.integer, end->value.integer) > 0)
4380 	return 0;
4381     }
4382   else
4383     {
4384       /* Stride is negative */
4385       if (mpz_cmp (start->value.integer, end->value.integer) < 0)
4386 	return 0;
4387     }
4388 
4389   mpz_init (rem);
4390   mpz_sub (rem, end->value.integer, start->value.integer);
4391   mpz_tdiv_r (rem, rem, stride->value.integer);
4392   mpz_sub (last, end->value.integer, rem);
4393   mpz_clear (rem);
4394 
4395   return 1;
4396 }
4397 
4398 
4399 /* Compare a single dimension of an array reference to the array
4400    specification.  */
4401 
4402 static bool
check_dimension(int i,gfc_array_ref * ar,gfc_array_spec * as)4403 check_dimension (int i, gfc_array_ref *ar, gfc_array_spec *as)
4404 {
4405   mpz_t last_value;
4406 
4407   if (ar->dimen_type[i] == DIMEN_STAR)
4408     {
4409       gcc_assert (ar->stride[i] == NULL);
4410       /* This implies [*] as [*:] and [*:3] are not possible.  */
4411       if (ar->start[i] == NULL)
4412 	{
4413 	  gcc_assert (ar->end[i] == NULL);
4414 	  return true;
4415 	}
4416     }
4417 
4418 /* Given start, end and stride values, calculate the minimum and
4419    maximum referenced indexes.  */
4420 
4421   switch (ar->dimen_type[i])
4422     {
4423     case DIMEN_VECTOR:
4424     case DIMEN_THIS_IMAGE:
4425       break;
4426 
4427     case DIMEN_STAR:
4428     case DIMEN_ELEMENT:
4429       if (compare_bound (ar->start[i], as->lower[i]) == CMP_LT)
4430 	{
4431 	  if (i < as->rank)
4432 	    gfc_warning (0, "Array reference at %L is out of bounds "
4433 			 "(%ld < %ld) in dimension %d", &ar->c_where[i],
4434 			 mpz_get_si (ar->start[i]->value.integer),
4435 			 mpz_get_si (as->lower[i]->value.integer), i+1);
4436 	  else
4437 	    gfc_warning (0, "Array reference at %L is out of bounds "
4438 			 "(%ld < %ld) in codimension %d", &ar->c_where[i],
4439 			 mpz_get_si (ar->start[i]->value.integer),
4440 			 mpz_get_si (as->lower[i]->value.integer),
4441 			 i + 1 - as->rank);
4442 	  return true;
4443 	}
4444       if (compare_bound (ar->start[i], as->upper[i]) == CMP_GT)
4445 	{
4446 	  if (i < as->rank)
4447 	    gfc_warning (0, "Array reference at %L is out of bounds "
4448 			 "(%ld > %ld) in dimension %d", &ar->c_where[i],
4449 			 mpz_get_si (ar->start[i]->value.integer),
4450 			 mpz_get_si (as->upper[i]->value.integer), i+1);
4451 	  else
4452 	    gfc_warning (0, "Array reference at %L is out of bounds "
4453 			 "(%ld > %ld) in codimension %d", &ar->c_where[i],
4454 			 mpz_get_si (ar->start[i]->value.integer),
4455 			 mpz_get_si (as->upper[i]->value.integer),
4456 			 i + 1 - as->rank);
4457 	  return true;
4458 	}
4459 
4460       break;
4461 
4462     case DIMEN_RANGE:
4463       {
4464 #define AR_START (ar->start[i] ? ar->start[i] : as->lower[i])
4465 #define AR_END (ar->end[i] ? ar->end[i] : as->upper[i])
4466 
4467 	compare_result comp_start_end = compare_bound (AR_START, AR_END);
4468 
4469 	/* Check for zero stride, which is not allowed.  */
4470 	if (compare_bound_int (ar->stride[i], 0) == CMP_EQ)
4471 	  {
4472 	    gfc_error ("Illegal stride of zero at %L", &ar->c_where[i]);
4473 	    return false;
4474 	  }
4475 
4476 	/* if start == len || (stride > 0 && start < len)
4477 			   || (stride < 0 && start > len),
4478 	   then the array section contains at least one element.  In this
4479 	   case, there is an out-of-bounds access if
4480 	   (start < lower || start > upper).  */
4481 	if (compare_bound (AR_START, AR_END) == CMP_EQ
4482 	    || ((compare_bound_int (ar->stride[i], 0) == CMP_GT
4483 		 || ar->stride[i] == NULL) && comp_start_end == CMP_LT)
4484 	    || (compare_bound_int (ar->stride[i], 0) == CMP_LT
4485 	        && comp_start_end == CMP_GT))
4486 	  {
4487 	    if (compare_bound (AR_START, as->lower[i]) == CMP_LT)
4488 	      {
4489 		gfc_warning (0, "Lower array reference at %L is out of bounds "
4490 		       "(%ld < %ld) in dimension %d", &ar->c_where[i],
4491 		       mpz_get_si (AR_START->value.integer),
4492 		       mpz_get_si (as->lower[i]->value.integer), i+1);
4493 		return true;
4494 	      }
4495 	    if (compare_bound (AR_START, as->upper[i]) == CMP_GT)
4496 	      {
4497 		gfc_warning (0, "Lower array reference at %L is out of bounds "
4498 		       "(%ld > %ld) in dimension %d", &ar->c_where[i],
4499 		       mpz_get_si (AR_START->value.integer),
4500 		       mpz_get_si (as->upper[i]->value.integer), i+1);
4501 		return true;
4502 	      }
4503 	  }
4504 
4505 	/* If we can compute the highest index of the array section,
4506 	   then it also has to be between lower and upper.  */
4507 	mpz_init (last_value);
4508 	if (compute_last_value_for_triplet (AR_START, AR_END, ar->stride[i],
4509 					    last_value))
4510 	  {
4511 	    if (compare_bound_mpz_t (as->lower[i], last_value) == CMP_GT)
4512 	      {
4513 		gfc_warning (0, "Upper array reference at %L is out of bounds "
4514 		       "(%ld < %ld) in dimension %d", &ar->c_where[i],
4515 		       mpz_get_si (last_value),
4516 		       mpz_get_si (as->lower[i]->value.integer), i+1);
4517 	        mpz_clear (last_value);
4518 		return true;
4519 	      }
4520 	    if (compare_bound_mpz_t (as->upper[i], last_value) == CMP_LT)
4521 	      {
4522 		gfc_warning (0, "Upper array reference at %L is out of bounds "
4523 		       "(%ld > %ld) in dimension %d", &ar->c_where[i],
4524 		       mpz_get_si (last_value),
4525 		       mpz_get_si (as->upper[i]->value.integer), i+1);
4526 	        mpz_clear (last_value);
4527 		return true;
4528 	      }
4529 	  }
4530 	mpz_clear (last_value);
4531 
4532 #undef AR_START
4533 #undef AR_END
4534       }
4535       break;
4536 
4537     default:
4538       gfc_internal_error ("check_dimension(): Bad array reference");
4539     }
4540 
4541   return true;
4542 }
4543 
4544 
4545 /* Compare an array reference with an array specification.  */
4546 
4547 static bool
compare_spec_to_ref(gfc_array_ref * ar)4548 compare_spec_to_ref (gfc_array_ref *ar)
4549 {
4550   gfc_array_spec *as;
4551   int i;
4552 
4553   as = ar->as;
4554   i = as->rank - 1;
4555   /* TODO: Full array sections are only allowed as actual parameters.  */
4556   if (as->type == AS_ASSUMED_SIZE
4557       && (/*ar->type == AR_FULL
4558 	  ||*/ (ar->type == AR_SECTION
4559 	      && ar->dimen_type[i] == DIMEN_RANGE && ar->end[i] == NULL)))
4560     {
4561       gfc_error ("Rightmost upper bound of assumed size array section "
4562 		 "not specified at %L", &ar->where);
4563       return false;
4564     }
4565 
4566   if (ar->type == AR_FULL)
4567     return true;
4568 
4569   if (as->rank != ar->dimen)
4570     {
4571       gfc_error ("Rank mismatch in array reference at %L (%d/%d)",
4572 		 &ar->where, ar->dimen, as->rank);
4573       return false;
4574     }
4575 
4576   /* ar->codimen == 0 is a local array.  */
4577   if (as->corank != ar->codimen && ar->codimen != 0)
4578     {
4579       gfc_error ("Coindex rank mismatch in array reference at %L (%d/%d)",
4580 		 &ar->where, ar->codimen, as->corank);
4581       return false;
4582     }
4583 
4584   for (i = 0; i < as->rank; i++)
4585     if (!check_dimension (i, ar, as))
4586       return false;
4587 
4588   /* Local access has no coarray spec.  */
4589   if (ar->codimen != 0)
4590     for (i = as->rank; i < as->rank + as->corank; i++)
4591       {
4592 	if (ar->dimen_type[i] != DIMEN_ELEMENT && !ar->in_allocate
4593 	    && ar->dimen_type[i] != DIMEN_THIS_IMAGE)
4594 	  {
4595 	    gfc_error ("Coindex of codimension %d must be a scalar at %L",
4596 		       i + 1 - as->rank, &ar->where);
4597 	    return false;
4598 	  }
4599 	if (!check_dimension (i, ar, as))
4600 	  return false;
4601       }
4602 
4603   return true;
4604 }
4605 
4606 
4607 /* Resolve one part of an array index.  */
4608 
4609 static bool
gfc_resolve_index_1(gfc_expr * index,int check_scalar,int force_index_integer_kind)4610 gfc_resolve_index_1 (gfc_expr *index, int check_scalar,
4611 		     int force_index_integer_kind)
4612 {
4613   gfc_typespec ts;
4614 
4615   if (index == NULL)
4616     return true;
4617 
4618   if (!gfc_resolve_expr (index))
4619     return false;
4620 
4621   if (check_scalar && index->rank != 0)
4622     {
4623       gfc_error ("Array index at %L must be scalar", &index->where);
4624       return false;
4625     }
4626 
4627   if (index->ts.type != BT_INTEGER && index->ts.type != BT_REAL)
4628     {
4629       gfc_error ("Array index at %L must be of INTEGER type, found %s",
4630 		 &index->where, gfc_basic_typename (index->ts.type));
4631       return false;
4632     }
4633 
4634   if (index->ts.type == BT_REAL)
4635     if (!gfc_notify_std (GFC_STD_LEGACY, "REAL array index at %L",
4636 			 &index->where))
4637       return false;
4638 
4639   if ((index->ts.kind != gfc_index_integer_kind
4640        && force_index_integer_kind)
4641       || index->ts.type != BT_INTEGER)
4642     {
4643       gfc_clear_ts (&ts);
4644       ts.type = BT_INTEGER;
4645       ts.kind = gfc_index_integer_kind;
4646 
4647       gfc_convert_type_warn (index, &ts, 2, 0);
4648     }
4649 
4650   return true;
4651 }
4652 
4653 /* Resolve one part of an array index.  */
4654 
4655 bool
gfc_resolve_index(gfc_expr * index,int check_scalar)4656 gfc_resolve_index (gfc_expr *index, int check_scalar)
4657 {
4658   return gfc_resolve_index_1 (index, check_scalar, 1);
4659 }
4660 
4661 /* Resolve a dim argument to an intrinsic function.  */
4662 
4663 bool
gfc_resolve_dim_arg(gfc_expr * dim)4664 gfc_resolve_dim_arg (gfc_expr *dim)
4665 {
4666   if (dim == NULL)
4667     return true;
4668 
4669   if (!gfc_resolve_expr (dim))
4670     return false;
4671 
4672   if (dim->rank != 0)
4673     {
4674       gfc_error ("Argument dim at %L must be scalar", &dim->where);
4675       return false;
4676 
4677     }
4678 
4679   if (dim->ts.type != BT_INTEGER)
4680     {
4681       gfc_error ("Argument dim at %L must be of INTEGER type", &dim->where);
4682       return false;
4683     }
4684 
4685   if (dim->ts.kind != gfc_index_integer_kind)
4686     {
4687       gfc_typespec ts;
4688 
4689       gfc_clear_ts (&ts);
4690       ts.type = BT_INTEGER;
4691       ts.kind = gfc_index_integer_kind;
4692 
4693       gfc_convert_type_warn (dim, &ts, 2, 0);
4694     }
4695 
4696   return true;
4697 }
4698 
4699 /* Given an expression that contains array references, update those array
4700    references to point to the right array specifications.  While this is
4701    filled in during matching, this information is difficult to save and load
4702    in a module, so we take care of it here.
4703 
4704    The idea here is that the original array reference comes from the
4705    base symbol.  We traverse the list of reference structures, setting
4706    the stored reference to references.  Component references can
4707    provide an additional array specification.  */
4708 
4709 static void
find_array_spec(gfc_expr * e)4710 find_array_spec (gfc_expr *e)
4711 {
4712   gfc_array_spec *as;
4713   gfc_component *c;
4714   gfc_ref *ref;
4715   bool class_as = false;
4716 
4717   if (e->symtree->n.sym->ts.type == BT_CLASS)
4718     {
4719       as = CLASS_DATA (e->symtree->n.sym)->as;
4720       class_as = true;
4721     }
4722   else
4723     as = e->symtree->n.sym->as;
4724 
4725   for (ref = e->ref; ref; ref = ref->next)
4726     switch (ref->type)
4727       {
4728       case REF_ARRAY:
4729 	if (as == NULL)
4730 	  gfc_internal_error ("find_array_spec(): Missing spec");
4731 
4732 	ref->u.ar.as = as;
4733 	as = NULL;
4734 	break;
4735 
4736       case REF_COMPONENT:
4737 	c = ref->u.c.component;
4738 	if (c->attr.dimension)
4739 	  {
4740 	    if (as != NULL && !(class_as && as == c->as))
4741 	      gfc_internal_error ("find_array_spec(): unused as(1)");
4742 	    as = c->as;
4743 	  }
4744 
4745 	break;
4746 
4747       case REF_SUBSTRING:
4748       case REF_INQUIRY:
4749 	break;
4750       }
4751 
4752   if (as != NULL)
4753     gfc_internal_error ("find_array_spec(): unused as(2)");
4754 }
4755 
4756 
4757 /* Resolve an array reference.  */
4758 
4759 static bool
resolve_array_ref(gfc_array_ref * ar)4760 resolve_array_ref (gfc_array_ref *ar)
4761 {
4762   int i, check_scalar;
4763   gfc_expr *e;
4764 
4765   for (i = 0; i < ar->dimen + ar->codimen; i++)
4766     {
4767       check_scalar = ar->dimen_type[i] == DIMEN_RANGE;
4768 
4769       /* Do not force gfc_index_integer_kind for the start.  We can
4770          do fine with any integer kind.  This avoids temporary arrays
4771 	 created for indexing with a vector.  */
4772       if (!gfc_resolve_index_1 (ar->start[i], check_scalar, 0))
4773 	return false;
4774       if (!gfc_resolve_index (ar->end[i], check_scalar))
4775 	return false;
4776       if (!gfc_resolve_index (ar->stride[i], check_scalar))
4777 	return false;
4778 
4779       e = ar->start[i];
4780 
4781       if (ar->dimen_type[i] == DIMEN_UNKNOWN)
4782 	switch (e->rank)
4783 	  {
4784 	  case 0:
4785 	    ar->dimen_type[i] = DIMEN_ELEMENT;
4786 	    break;
4787 
4788 	  case 1:
4789 	    ar->dimen_type[i] = DIMEN_VECTOR;
4790 	    if (e->expr_type == EXPR_VARIABLE
4791 		&& e->symtree->n.sym->ts.type == BT_DERIVED)
4792 	      ar->start[i] = gfc_get_parentheses (e);
4793 	    break;
4794 
4795 	  default:
4796 	    gfc_error ("Array index at %L is an array of rank %d",
4797 		       &ar->c_where[i], e->rank);
4798 	    return false;
4799 	  }
4800 
4801       /* Fill in the upper bound, which may be lower than the
4802 	 specified one for something like a(2:10:5), which is
4803 	 identical to a(2:7:5).  Only relevant for strides not equal
4804 	 to one.  Don't try a division by zero.  */
4805       if (ar->dimen_type[i] == DIMEN_RANGE
4806 	  && ar->stride[i] != NULL && ar->stride[i]->expr_type == EXPR_CONSTANT
4807 	  && mpz_cmp_si (ar->stride[i]->value.integer, 1L) != 0
4808 	  && mpz_cmp_si (ar->stride[i]->value.integer, 0L) != 0)
4809 	{
4810 	  mpz_t size, end;
4811 
4812 	  if (gfc_ref_dimen_size (ar, i, &size, &end))
4813 	    {
4814 	      if (ar->end[i] == NULL)
4815 		{
4816 		  ar->end[i] =
4817 		    gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind,
4818 					   &ar->where);
4819 		  mpz_set (ar->end[i]->value.integer, end);
4820 		}
4821 	      else if (ar->end[i]->ts.type == BT_INTEGER
4822 		       && ar->end[i]->expr_type == EXPR_CONSTANT)
4823 		{
4824 		  mpz_set (ar->end[i]->value.integer, end);
4825 		}
4826 	      else
4827 		gcc_unreachable ();
4828 
4829 	      mpz_clear (size);
4830 	      mpz_clear (end);
4831 	    }
4832 	}
4833     }
4834 
4835   if (ar->type == AR_FULL)
4836     {
4837       if (ar->as->rank == 0)
4838 	ar->type = AR_ELEMENT;
4839 
4840       /* Make sure array is the same as array(:,:), this way
4841 	 we don't need to special case all the time.  */
4842       ar->dimen = ar->as->rank;
4843       for (i = 0; i < ar->dimen; i++)
4844 	{
4845 	  ar->dimen_type[i] = DIMEN_RANGE;
4846 
4847 	  gcc_assert (ar->start[i] == NULL);
4848 	  gcc_assert (ar->end[i] == NULL);
4849 	  gcc_assert (ar->stride[i] == NULL);
4850 	}
4851     }
4852 
4853   /* If the reference type is unknown, figure out what kind it is.  */
4854 
4855   if (ar->type == AR_UNKNOWN)
4856     {
4857       ar->type = AR_ELEMENT;
4858       for (i = 0; i < ar->dimen; i++)
4859 	if (ar->dimen_type[i] == DIMEN_RANGE
4860 	    || ar->dimen_type[i] == DIMEN_VECTOR)
4861 	  {
4862 	    ar->type = AR_SECTION;
4863 	    break;
4864 	  }
4865     }
4866 
4867   if (!ar->as->cray_pointee && !compare_spec_to_ref (ar))
4868     return false;
4869 
4870   if (ar->as->corank && ar->codimen == 0)
4871     {
4872       int n;
4873       ar->codimen = ar->as->corank;
4874       for (n = ar->dimen; n < ar->dimen + ar->codimen; n++)
4875 	ar->dimen_type[n] = DIMEN_THIS_IMAGE;
4876     }
4877 
4878   return true;
4879 }
4880 
4881 
4882 static bool
resolve_substring(gfc_ref * ref,bool * equal_length)4883 resolve_substring (gfc_ref *ref, bool *equal_length)
4884 {
4885   int k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
4886 
4887   if (ref->u.ss.start != NULL)
4888     {
4889       if (!gfc_resolve_expr (ref->u.ss.start))
4890 	return false;
4891 
4892       if (ref->u.ss.start->ts.type != BT_INTEGER)
4893 	{
4894 	  gfc_error ("Substring start index at %L must be of type INTEGER",
4895 		     &ref->u.ss.start->where);
4896 	  return false;
4897 	}
4898 
4899       if (ref->u.ss.start->rank != 0)
4900 	{
4901 	  gfc_error ("Substring start index at %L must be scalar",
4902 		     &ref->u.ss.start->where);
4903 	  return false;
4904 	}
4905 
4906       if (compare_bound_int (ref->u.ss.start, 1) == CMP_LT
4907 	  && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
4908 	      || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
4909 	{
4910 	  gfc_error ("Substring start index at %L is less than one",
4911 		     &ref->u.ss.start->where);
4912 	  return false;
4913 	}
4914     }
4915 
4916   if (ref->u.ss.end != NULL)
4917     {
4918       if (!gfc_resolve_expr (ref->u.ss.end))
4919 	return false;
4920 
4921       if (ref->u.ss.end->ts.type != BT_INTEGER)
4922 	{
4923 	  gfc_error ("Substring end index at %L must be of type INTEGER",
4924 		     &ref->u.ss.end->where);
4925 	  return false;
4926 	}
4927 
4928       if (ref->u.ss.end->rank != 0)
4929 	{
4930 	  gfc_error ("Substring end index at %L must be scalar",
4931 		     &ref->u.ss.end->where);
4932 	  return false;
4933 	}
4934 
4935       if (ref->u.ss.length != NULL
4936 	  && compare_bound (ref->u.ss.end, ref->u.ss.length->length) == CMP_GT
4937 	  && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
4938 	      || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
4939 	{
4940 	  gfc_error ("Substring end index at %L exceeds the string length",
4941 		     &ref->u.ss.start->where);
4942 	  return false;
4943 	}
4944 
4945       if (compare_bound_mpz_t (ref->u.ss.end,
4946 			       gfc_integer_kinds[k].huge) == CMP_GT
4947 	  && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ
4948 	      || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT))
4949 	{
4950 	  gfc_error ("Substring end index at %L is too large",
4951 		     &ref->u.ss.end->where);
4952 	  return false;
4953 	}
4954       /*  If the substring has the same length as the original
4955 	  variable, the reference itself can be deleted.  */
4956 
4957       if (ref->u.ss.length != NULL
4958 	  && compare_bound (ref->u.ss.end, ref->u.ss.length->length) == CMP_EQ
4959 	  && compare_bound_int (ref->u.ss.start, 1) == CMP_EQ)
4960 	*equal_length = true;
4961     }
4962 
4963   return true;
4964 }
4965 
4966 
4967 /* This function supplies missing substring charlens.  */
4968 
4969 void
gfc_resolve_substring_charlen(gfc_expr * e)4970 gfc_resolve_substring_charlen (gfc_expr *e)
4971 {
4972   gfc_ref *char_ref;
4973   gfc_expr *start, *end;
4974   gfc_typespec *ts = NULL;
4975   mpz_t diff;
4976 
4977   for (char_ref = e->ref; char_ref; char_ref = char_ref->next)
4978     {
4979       if (char_ref->type == REF_SUBSTRING || char_ref->type == REF_INQUIRY)
4980 	break;
4981       if (char_ref->type == REF_COMPONENT)
4982 	ts = &char_ref->u.c.component->ts;
4983     }
4984 
4985   if (!char_ref || char_ref->type == REF_INQUIRY)
4986     return;
4987 
4988   gcc_assert (char_ref->next == NULL);
4989 
4990   if (e->ts.u.cl)
4991     {
4992       if (e->ts.u.cl->length)
4993 	gfc_free_expr (e->ts.u.cl->length);
4994       else if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym->attr.dummy)
4995 	return;
4996     }
4997 
4998   e->ts.type = BT_CHARACTER;
4999   e->ts.kind = gfc_default_character_kind;
5000 
5001   if (!e->ts.u.cl)
5002     e->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
5003 
5004   if (char_ref->u.ss.start)
5005     start = gfc_copy_expr (char_ref->u.ss.start);
5006   else
5007     start = gfc_get_int_expr (gfc_charlen_int_kind, NULL, 1);
5008 
5009   if (char_ref->u.ss.end)
5010     end = gfc_copy_expr (char_ref->u.ss.end);
5011   else if (e->expr_type == EXPR_VARIABLE)
5012     {
5013       if (!ts)
5014 	ts = &e->symtree->n.sym->ts;
5015       end = gfc_copy_expr (ts->u.cl->length);
5016     }
5017   else
5018     end = NULL;
5019 
5020   if (!start || !end)
5021     {
5022       gfc_free_expr (start);
5023       gfc_free_expr (end);
5024       return;
5025     }
5026 
5027   /* Length = (end - start + 1).
5028      Check first whether it has a constant length.  */
5029   if (gfc_dep_difference (end, start, &diff))
5030     {
5031       gfc_expr *len = gfc_get_constant_expr (BT_INTEGER, gfc_charlen_int_kind,
5032 					     &e->where);
5033 
5034       mpz_add_ui (len->value.integer, diff, 1);
5035       mpz_clear (diff);
5036       e->ts.u.cl->length = len;
5037       /* The check for length < 0 is handled below */
5038     }
5039   else
5040     {
5041       e->ts.u.cl->length = gfc_subtract (end, start);
5042       e->ts.u.cl->length = gfc_add (e->ts.u.cl->length,
5043 				    gfc_get_int_expr (gfc_charlen_int_kind,
5044 						      NULL, 1));
5045     }
5046 
5047   /* F2008, 6.4.1:  Both the starting point and the ending point shall
5048      be within the range 1, 2, ..., n unless the starting point exceeds
5049      the ending point, in which case the substring has length zero.  */
5050 
5051   if (mpz_cmp_si (e->ts.u.cl->length->value.integer, 0) < 0)
5052     mpz_set_si (e->ts.u.cl->length->value.integer, 0);
5053 
5054   e->ts.u.cl->length->ts.type = BT_INTEGER;
5055   e->ts.u.cl->length->ts.kind = gfc_charlen_int_kind;
5056 
5057   /* Make sure that the length is simplified.  */
5058   gfc_simplify_expr (e->ts.u.cl->length, 1);
5059   gfc_resolve_expr (e->ts.u.cl->length);
5060 }
5061 
5062 
5063 /* Resolve subtype references.  */
5064 
5065 static bool
resolve_ref(gfc_expr * expr)5066 resolve_ref (gfc_expr *expr)
5067 {
5068   int current_part_dimension, n_components, seen_part_dimension;
5069   gfc_ref *ref, **prev;
5070   bool equal_length;
5071 
5072   for (ref = expr->ref; ref; ref = ref->next)
5073     if (ref->type == REF_ARRAY && ref->u.ar.as == NULL)
5074       {
5075 	find_array_spec (expr);
5076 	break;
5077       }
5078 
5079   for (prev = &expr->ref; *prev != NULL;
5080        prev = *prev == NULL ? prev : &(*prev)->next)
5081     switch ((*prev)->type)
5082       {
5083       case REF_ARRAY:
5084 	if (!resolve_array_ref (&(*prev)->u.ar))
5085 	  return false;
5086 	break;
5087 
5088       case REF_COMPONENT:
5089       case REF_INQUIRY:
5090 	break;
5091 
5092       case REF_SUBSTRING:
5093 	equal_length = false;
5094 	if (!resolve_substring (*prev, &equal_length))
5095 	  return false;
5096 
5097 	if (expr->expr_type != EXPR_SUBSTRING && equal_length)
5098 	  {
5099 	    /* Remove the reference and move the charlen, if any.  */
5100 	    ref = *prev;
5101 	    *prev = ref->next;
5102 	    ref->next = NULL;
5103 	    expr->ts.u.cl = ref->u.ss.length;
5104 	    ref->u.ss.length = NULL;
5105 	    gfc_free_ref_list (ref);
5106 	  }
5107 	break;
5108       }
5109 
5110   /* Check constraints on part references.  */
5111 
5112   current_part_dimension = 0;
5113   seen_part_dimension = 0;
5114   n_components = 0;
5115 
5116   for (ref = expr->ref; ref; ref = ref->next)
5117     {
5118       switch (ref->type)
5119 	{
5120 	case REF_ARRAY:
5121 	  switch (ref->u.ar.type)
5122 	    {
5123 	    case AR_FULL:
5124 	      /* Coarray scalar.  */
5125 	      if (ref->u.ar.as->rank == 0)
5126 		{
5127 		  current_part_dimension = 0;
5128 		  break;
5129 		}
5130 	      /* Fall through.  */
5131 	    case AR_SECTION:
5132 	      current_part_dimension = 1;
5133 	      break;
5134 
5135 	    case AR_ELEMENT:
5136 	      current_part_dimension = 0;
5137 	      break;
5138 
5139 	    case AR_UNKNOWN:
5140 	      gfc_internal_error ("resolve_ref(): Bad array reference");
5141 	    }
5142 
5143 	  break;
5144 
5145 	case REF_COMPONENT:
5146 	  if (current_part_dimension || seen_part_dimension)
5147 	    {
5148 	      /* F03:C614.  */
5149 	      if (ref->u.c.component->attr.pointer
5150 		  || ref->u.c.component->attr.proc_pointer
5151 		  || (ref->u.c.component->ts.type == BT_CLASS
5152 			&& CLASS_DATA (ref->u.c.component)->attr.pointer))
5153 		{
5154 		  gfc_error ("Component to the right of a part reference "
5155 			     "with nonzero rank must not have the POINTER "
5156 			     "attribute at %L", &expr->where);
5157 		  return false;
5158 		}
5159 	      else if (ref->u.c.component->attr.allocatable
5160 			|| (ref->u.c.component->ts.type == BT_CLASS
5161 			    && CLASS_DATA (ref->u.c.component)->attr.allocatable))
5162 
5163 		{
5164 		  gfc_error ("Component to the right of a part reference "
5165 			     "with nonzero rank must not have the ALLOCATABLE "
5166 			     "attribute at %L", &expr->where);
5167 		  return false;
5168 		}
5169 	    }
5170 
5171 	  n_components++;
5172 	  break;
5173 
5174 	case REF_SUBSTRING:
5175 	case REF_INQUIRY:
5176 	  break;
5177 	}
5178 
5179       if (((ref->type == REF_COMPONENT && n_components > 1)
5180 	   || ref->next == NULL)
5181 	  && current_part_dimension
5182 	  && seen_part_dimension)
5183 	{
5184 	  gfc_error ("Two or more part references with nonzero rank must "
5185 		     "not be specified at %L", &expr->where);
5186 	  return false;
5187 	}
5188 
5189       if (ref->type == REF_COMPONENT)
5190 	{
5191 	  if (current_part_dimension)
5192 	    seen_part_dimension = 1;
5193 
5194 	  /* reset to make sure */
5195 	  current_part_dimension = 0;
5196 	}
5197     }
5198 
5199   return true;
5200 }
5201 
5202 
5203 /* Given an expression, determine its shape.  This is easier than it sounds.
5204    Leaves the shape array NULL if it is not possible to determine the shape.  */
5205 
5206 static void
expression_shape(gfc_expr * e)5207 expression_shape (gfc_expr *e)
5208 {
5209   mpz_t array[GFC_MAX_DIMENSIONS];
5210   int i;
5211 
5212   if (e->rank <= 0 || e->shape != NULL)
5213     return;
5214 
5215   for (i = 0; i < e->rank; i++)
5216     if (!gfc_array_dimen_size (e, i, &array[i]))
5217       goto fail;
5218 
5219   e->shape = gfc_get_shape (e->rank);
5220 
5221   memcpy (e->shape, array, e->rank * sizeof (mpz_t));
5222 
5223   return;
5224 
5225 fail:
5226   for (i--; i >= 0; i--)
5227     mpz_clear (array[i]);
5228 }
5229 
5230 
5231 /* Given a variable expression node, compute the rank of the expression by
5232    examining the base symbol and any reference structures it may have.  */
5233 
5234 void
expression_rank(gfc_expr * e)5235 expression_rank (gfc_expr *e)
5236 {
5237   gfc_ref *ref;
5238   int i, rank;
5239 
5240   /* Just to make sure, because EXPR_COMPCALL's also have an e->ref and that
5241      could lead to serious confusion...  */
5242   gcc_assert (e->expr_type != EXPR_COMPCALL);
5243 
5244   if (e->ref == NULL)
5245     {
5246       if (e->expr_type == EXPR_ARRAY)
5247 	goto done;
5248       /* Constructors can have a rank different from one via RESHAPE().  */
5249 
5250       if (e->symtree == NULL)
5251 	{
5252 	  e->rank = 0;
5253 	  goto done;
5254 	}
5255 
5256       e->rank = (e->symtree->n.sym->as == NULL)
5257 		? 0 : e->symtree->n.sym->as->rank;
5258       goto done;
5259     }
5260 
5261   rank = 0;
5262 
5263   for (ref = e->ref; ref; ref = ref->next)
5264     {
5265       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.proc_pointer
5266 	  && ref->u.c.component->attr.function && !ref->next)
5267 	rank = ref->u.c.component->as ? ref->u.c.component->as->rank : 0;
5268 
5269       if (ref->type != REF_ARRAY)
5270 	continue;
5271 
5272       if (ref->u.ar.type == AR_FULL)
5273 	{
5274 	  rank = ref->u.ar.as->rank;
5275 	  break;
5276 	}
5277 
5278       if (ref->u.ar.type == AR_SECTION)
5279 	{
5280 	  /* Figure out the rank of the section.  */
5281 	  if (rank != 0)
5282 	    gfc_internal_error ("expression_rank(): Two array specs");
5283 
5284 	  for (i = 0; i < ref->u.ar.dimen; i++)
5285 	    if (ref->u.ar.dimen_type[i] == DIMEN_RANGE
5286 		|| ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
5287 	      rank++;
5288 
5289 	  break;
5290 	}
5291     }
5292 
5293   e->rank = rank;
5294 
5295 done:
5296   expression_shape (e);
5297 }
5298 
5299 
5300 static void
add_caf_get_intrinsic(gfc_expr * e)5301 add_caf_get_intrinsic (gfc_expr *e)
5302 {
5303   gfc_expr *wrapper, *tmp_expr;
5304   gfc_ref *ref;
5305   int n;
5306 
5307   for (ref = e->ref; ref; ref = ref->next)
5308     if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
5309       break;
5310   if (ref == NULL)
5311     return;
5312 
5313   for (n = ref->u.ar.dimen; n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
5314     if (ref->u.ar.dimen_type[n] != DIMEN_ELEMENT)
5315       return;
5316 
5317   tmp_expr = XCNEW (gfc_expr);
5318   *tmp_expr = *e;
5319   wrapper = gfc_build_intrinsic_call (gfc_current_ns, GFC_ISYM_CAF_GET,
5320 				      "caf_get", tmp_expr->where, 1, tmp_expr);
5321   wrapper->ts = e->ts;
5322   wrapper->rank = e->rank;
5323   if (e->rank)
5324     wrapper->shape = gfc_copy_shape (e->shape, e->rank);
5325   *e = *wrapper;
5326   free (wrapper);
5327 }
5328 
5329 
5330 static void
remove_caf_get_intrinsic(gfc_expr * e)5331 remove_caf_get_intrinsic (gfc_expr *e)
5332 {
5333   gcc_assert (e->expr_type == EXPR_FUNCTION && e->value.function.isym
5334 	      && e->value.function.isym->id == GFC_ISYM_CAF_GET);
5335   gfc_expr *e2 = e->value.function.actual->expr;
5336   e->value.function.actual->expr = NULL;
5337   gfc_free_actual_arglist (e->value.function.actual);
5338   gfc_free_shape (&e->shape, e->rank);
5339   *e = *e2;
5340   free (e2);
5341 }
5342 
5343 
5344 /* Resolve a variable expression.  */
5345 
5346 static bool
resolve_variable(gfc_expr * e)5347 resolve_variable (gfc_expr *e)
5348 {
5349   gfc_symbol *sym;
5350   bool t;
5351 
5352   t = true;
5353 
5354   if (e->symtree == NULL)
5355     return false;
5356   sym = e->symtree->n.sym;
5357 
5358   /* Use same check as for TYPE(*) below; this check has to be before TYPE(*)
5359      as ts.type is set to BT_ASSUMED in resolve_symbol.  */
5360   if (sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
5361     {
5362       if (!actual_arg || inquiry_argument)
5363 	{
5364 	  gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute may only "
5365 		     "be used as actual argument", sym->name, &e->where);
5366 	  return false;
5367 	}
5368     }
5369   /* TS 29113, 407b.  */
5370   else if (e->ts.type == BT_ASSUMED)
5371     {
5372       if (!actual_arg)
5373 	{
5374 	  gfc_error ("Assumed-type variable %s at %L may only be used "
5375 		     "as actual argument", sym->name, &e->where);
5376 	  return false;
5377 	}
5378       else if (inquiry_argument && !first_actual_arg)
5379 	{
5380 	  /* FIXME: It doesn't work reliably as inquiry_argument is not set
5381 	     for all inquiry functions in resolve_function; the reason is
5382 	     that the function-name resolution happens too late in that
5383 	     function.  */
5384 	  gfc_error ("Assumed-type variable %s at %L as actual argument to "
5385 		     "an inquiry function shall be the first argument",
5386 		     sym->name, &e->where);
5387 	  return false;
5388 	}
5389     }
5390   /* TS 29113, C535b.  */
5391   else if ((sym->ts.type == BT_CLASS && sym->attr.class_ok
5392 	    && CLASS_DATA (sym)->as
5393 	    && CLASS_DATA (sym)->as->type == AS_ASSUMED_RANK)
5394 	   || (sym->ts.type != BT_CLASS && sym->as
5395 	       && sym->as->type == AS_ASSUMED_RANK))
5396     {
5397       if (!actual_arg)
5398 	{
5399 	  gfc_error ("Assumed-rank variable %s at %L may only be used as "
5400 		     "actual argument", sym->name, &e->where);
5401 	  return false;
5402 	}
5403       else if (inquiry_argument && !first_actual_arg)
5404 	{
5405 	  /* FIXME: It doesn't work reliably as inquiry_argument is not set
5406 	     for all inquiry functions in resolve_function; the reason is
5407 	     that the function-name resolution happens too late in that
5408 	     function.  */
5409 	  gfc_error ("Assumed-rank variable %s at %L as actual argument "
5410 		     "to an inquiry function shall be the first argument",
5411 		     sym->name, &e->where);
5412 	  return false;
5413 	}
5414     }
5415 
5416   if ((sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK)) && e->ref
5417       && !(e->ref->type == REF_ARRAY && e->ref->u.ar.type == AR_FULL
5418 	   && e->ref->next == NULL))
5419     {
5420       gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall not have "
5421 		 "a subobject reference", sym->name, &e->ref->u.ar.where);
5422       return false;
5423     }
5424   /* TS 29113, 407b.  */
5425   else if (e->ts.type == BT_ASSUMED && e->ref
5426 	   && !(e->ref->type == REF_ARRAY && e->ref->u.ar.type == AR_FULL
5427 		&& e->ref->next == NULL))
5428     {
5429       gfc_error ("Assumed-type variable %s at %L shall not have a subobject "
5430 		 "reference", sym->name, &e->ref->u.ar.where);
5431       return false;
5432     }
5433 
5434   /* TS 29113, C535b.  */
5435   if (((sym->ts.type == BT_CLASS && sym->attr.class_ok
5436 	&& CLASS_DATA (sym)->as
5437 	&& CLASS_DATA (sym)->as->type == AS_ASSUMED_RANK)
5438        || (sym->ts.type != BT_CLASS && sym->as
5439 	   && sym->as->type == AS_ASSUMED_RANK))
5440       && e->ref
5441       && !(e->ref->type == REF_ARRAY && e->ref->u.ar.type == AR_FULL
5442 	   && e->ref->next == NULL))
5443     {
5444       gfc_error ("Assumed-rank variable %s at %L shall not have a subobject "
5445 		 "reference", sym->name, &e->ref->u.ar.where);
5446       return false;
5447     }
5448 
5449   /* For variables that are used in an associate (target => object) where
5450      the object's basetype is array valued while the target is scalar,
5451      the ts' type of the component refs is still array valued, which
5452      can't be translated that way.  */
5453   if (sym->assoc && e->rank == 0 && e->ref && sym->ts.type == BT_CLASS
5454       && sym->assoc->target && sym->assoc->target->ts.type == BT_CLASS
5455       && CLASS_DATA (sym->assoc->target)->as)
5456     {
5457       gfc_ref *ref = e->ref;
5458       while (ref)
5459 	{
5460 	  switch (ref->type)
5461 	    {
5462 	    case REF_COMPONENT:
5463 	      ref->u.c.sym = sym->ts.u.derived;
5464 	      /* Stop the loop.  */
5465 	      ref = NULL;
5466 	      break;
5467 	    default:
5468 	      ref = ref->next;
5469 	      break;
5470 	    }
5471 	}
5472     }
5473 
5474   /* If this is an associate-name, it may be parsed with an array reference
5475      in error even though the target is scalar.  Fail directly in this case.
5476      TODO Understand why class scalar expressions must be excluded.  */
5477   if (sym->assoc && !(sym->ts.type == BT_CLASS && e->rank == 0))
5478     {
5479       if (sym->ts.type == BT_CLASS)
5480 	gfc_fix_class_refs (e);
5481       if (!sym->attr.dimension && e->ref && e->ref->type == REF_ARRAY)
5482 	return false;
5483       else if (sym->attr.dimension && (!e->ref || e->ref->type != REF_ARRAY))
5484 	{
5485 	  /* This can happen because the parser did not detect that the
5486 	     associate name is an array and the expression had no array
5487 	     part_ref.  */
5488 	  gfc_ref *ref = gfc_get_ref ();
5489 	  ref->type = REF_ARRAY;
5490 	  ref->u.ar = *gfc_get_array_ref();
5491 	  ref->u.ar.type = AR_FULL;
5492 	  if (sym->as)
5493 	    {
5494 	      ref->u.ar.as = sym->as;
5495 	      ref->u.ar.dimen = sym->as->rank;
5496 	    }
5497 	  ref->next = e->ref;
5498 	  e->ref = ref;
5499 
5500 	}
5501     }
5502 
5503   if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.generic)
5504     sym->ts.u.derived = gfc_find_dt_in_generic (sym->ts.u.derived);
5505 
5506   /* On the other hand, the parser may not have known this is an array;
5507      in this case, we have to add a FULL reference.  */
5508   if (sym->assoc && sym->attr.dimension && !e->ref)
5509     {
5510       e->ref = gfc_get_ref ();
5511       e->ref->type = REF_ARRAY;
5512       e->ref->u.ar.type = AR_FULL;
5513       e->ref->u.ar.dimen = 0;
5514     }
5515 
5516   /* Like above, but for class types, where the checking whether an array
5517      ref is present is more complicated.  Furthermore make sure not to add
5518      the full array ref to _vptr or _len refs.  */
5519   if (sym->assoc && sym->ts.type == BT_CLASS
5520       && CLASS_DATA (sym)->attr.dimension
5521       && (e->ts.type != BT_DERIVED || !e->ts.u.derived->attr.vtype))
5522     {
5523       gfc_ref *ref, *newref;
5524 
5525       newref = gfc_get_ref ();
5526       newref->type = REF_ARRAY;
5527       newref->u.ar.type = AR_FULL;
5528       newref->u.ar.dimen = 0;
5529       /* Because this is an associate var and the first ref either is a ref to
5530 	 the _data component or not, no traversal of the ref chain is
5531 	 needed.  The array ref needs to be inserted after the _data ref,
5532 	 or when that is not present, which may happend for polymorphic
5533 	 types, then at the first position.  */
5534       ref = e->ref;
5535       if (!ref)
5536 	e->ref = newref;
5537       else if (ref->type == REF_COMPONENT
5538 	       && strcmp ("_data", ref->u.c.component->name) == 0)
5539 	{
5540 	  if (!ref->next || ref->next->type != REF_ARRAY)
5541 	    {
5542 	      newref->next = ref->next;
5543 	      ref->next = newref;
5544 	    }
5545 	  else
5546 	    /* Array ref present already.  */
5547 	    gfc_free_ref_list (newref);
5548 	}
5549       else if (ref->type == REF_ARRAY)
5550 	/* Array ref present already.  */
5551 	gfc_free_ref_list (newref);
5552       else
5553 	{
5554 	  newref->next = ref;
5555 	  e->ref = newref;
5556 	}
5557     }
5558 
5559   if (e->ref && !resolve_ref (e))
5560     return false;
5561 
5562   if (sym->attr.flavor == FL_PROCEDURE
5563       && (!sym->attr.function
5564 	  || (sym->attr.function && sym->result
5565 	      && sym->result->attr.proc_pointer
5566 	      && !sym->result->attr.function)))
5567     {
5568       e->ts.type = BT_PROCEDURE;
5569       goto resolve_procedure;
5570     }
5571 
5572   if (sym->ts.type != BT_UNKNOWN)
5573     gfc_variable_attr (e, &e->ts);
5574   else if (sym->attr.flavor == FL_PROCEDURE
5575 	   && sym->attr.function && sym->result
5576 	   && sym->result->ts.type != BT_UNKNOWN
5577 	   && sym->result->attr.proc_pointer)
5578     e->ts = sym->result->ts;
5579   else
5580     {
5581       /* Must be a simple variable reference.  */
5582       if (!gfc_set_default_type (sym, 1, sym->ns))
5583 	return false;
5584       e->ts = sym->ts;
5585     }
5586 
5587   if (check_assumed_size_reference (sym, e))
5588     return false;
5589 
5590   /* Deal with forward references to entries during gfc_resolve_code, to
5591      satisfy, at least partially, 12.5.2.5.  */
5592   if (gfc_current_ns->entries
5593       && current_entry_id == sym->entry_id
5594       && cs_base
5595       && cs_base->current
5596       && cs_base->current->op != EXEC_ENTRY)
5597     {
5598       gfc_entry_list *entry;
5599       gfc_formal_arglist *formal;
5600       int n;
5601       bool seen, saved_specification_expr;
5602 
5603       /* If the symbol is a dummy...  */
5604       if (sym->attr.dummy && sym->ns == gfc_current_ns)
5605 	{
5606 	  entry = gfc_current_ns->entries;
5607 	  seen = false;
5608 
5609 	  /* ...test if the symbol is a parameter of previous entries.  */
5610 	  for (; entry && entry->id <= current_entry_id; entry = entry->next)
5611 	    for (formal = entry->sym->formal; formal; formal = formal->next)
5612 	      {
5613 		if (formal->sym && sym->name == formal->sym->name)
5614 		  {
5615 		    seen = true;
5616 		    break;
5617 		  }
5618 	      }
5619 
5620 	  /*  If it has not been seen as a dummy, this is an error.  */
5621 	  if (!seen)
5622 	    {
5623 	      if (specification_expr)
5624 		gfc_error ("Variable %qs, used in a specification expression"
5625 			   ", is referenced at %L before the ENTRY statement "
5626 			   "in which it is a parameter",
5627 			   sym->name, &cs_base->current->loc);
5628 	      else
5629 		gfc_error ("Variable %qs is used at %L before the ENTRY "
5630 			   "statement in which it is a parameter",
5631 			   sym->name, &cs_base->current->loc);
5632 	      t = false;
5633 	    }
5634 	}
5635 
5636       /* Now do the same check on the specification expressions.  */
5637       saved_specification_expr = specification_expr;
5638       specification_expr = true;
5639       if (sym->ts.type == BT_CHARACTER
5640 	  && !gfc_resolve_expr (sym->ts.u.cl->length))
5641 	t = false;
5642 
5643       if (sym->as)
5644 	for (n = 0; n < sym->as->rank; n++)
5645 	  {
5646 	     if (!gfc_resolve_expr (sym->as->lower[n]))
5647 	       t = false;
5648 	     if (!gfc_resolve_expr (sym->as->upper[n]))
5649 	       t = false;
5650 	  }
5651       specification_expr = saved_specification_expr;
5652 
5653       if (t)
5654 	/* Update the symbol's entry level.  */
5655 	sym->entry_id = current_entry_id + 1;
5656     }
5657 
5658   /* If a symbol has been host_associated mark it.  This is used latter,
5659      to identify if aliasing is possible via host association.  */
5660   if (sym->attr.flavor == FL_VARIABLE
5661 	&& gfc_current_ns->parent
5662 	&& (gfc_current_ns->parent == sym->ns
5663 	      || (gfc_current_ns->parent->parent
5664 		    && gfc_current_ns->parent->parent == sym->ns)))
5665     sym->attr.host_assoc = 1;
5666 
5667   if (gfc_current_ns->proc_name
5668       && sym->attr.dimension
5669       && (sym->ns != gfc_current_ns
5670 	  || sym->attr.use_assoc
5671 	  || sym->attr.in_common))
5672     gfc_current_ns->proc_name->attr.array_outer_dependency = 1;
5673 
5674 resolve_procedure:
5675   if (t && !resolve_procedure_expression (e))
5676     t = false;
5677 
5678   /* F2008, C617 and C1229.  */
5679   if (!inquiry_argument && (e->ts.type == BT_CLASS || e->ts.type == BT_DERIVED)
5680       && gfc_is_coindexed (e))
5681     {
5682       gfc_ref *ref, *ref2 = NULL;
5683 
5684       for (ref = e->ref; ref; ref = ref->next)
5685 	{
5686 	  if (ref->type == REF_COMPONENT)
5687 	    ref2 = ref;
5688 	  if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
5689 	    break;
5690 	}
5691 
5692       for ( ; ref; ref = ref->next)
5693 	if (ref->type == REF_COMPONENT)
5694 	  break;
5695 
5696       /* Expression itself is not coindexed object.  */
5697       if (ref && e->ts.type == BT_CLASS)
5698 	{
5699 	  gfc_error ("Polymorphic subobject of coindexed object at %L",
5700 		     &e->where);
5701 	  t = false;
5702 	}
5703 
5704       /* Expression itself is coindexed object.  */
5705       if (ref == NULL)
5706 	{
5707 	  gfc_component *c;
5708 	  c = ref2 ? ref2->u.c.component : e->symtree->n.sym->components;
5709 	  for ( ; c; c = c->next)
5710 	    if (c->attr.allocatable && c->ts.type == BT_CLASS)
5711 	      {
5712 		gfc_error ("Coindexed object with polymorphic allocatable "
5713 			 "subcomponent at %L", &e->where);
5714 		t = false;
5715 		break;
5716 	      }
5717 	}
5718     }
5719 
5720   if (t)
5721     expression_rank (e);
5722 
5723   if (t && flag_coarray == GFC_FCOARRAY_LIB && gfc_is_coindexed (e))
5724     add_caf_get_intrinsic (e);
5725 
5726   /* Simplify cases where access to a parameter array results in a
5727      single constant.  Suppress errors since those will have been
5728      issued before, as warnings.  */
5729   if (e->rank == 0 && sym->as && sym->attr.flavor == FL_PARAMETER)
5730     {
5731       gfc_push_suppress_errors ();
5732       gfc_simplify_expr (e, 1);
5733       gfc_pop_suppress_errors ();
5734     }
5735 
5736   return t;
5737 }
5738 
5739 
5740 /* Checks to see that the correct symbol has been host associated.
5741    The only situation where this arises is that in which a twice
5742    contained function is parsed after the host association is made.
5743    Therefore, on detecting this, change the symbol in the expression
5744    and convert the array reference into an actual arglist if the old
5745    symbol is a variable.  */
5746 static bool
check_host_association(gfc_expr * e)5747 check_host_association (gfc_expr *e)
5748 {
5749   gfc_symbol *sym, *old_sym;
5750   gfc_symtree *st;
5751   int n;
5752   gfc_ref *ref;
5753   gfc_actual_arglist *arg, *tail = NULL;
5754   bool retval = e->expr_type == EXPR_FUNCTION;
5755 
5756   /*  If the expression is the result of substitution in
5757       interface.c(gfc_extend_expr) because there is no way in
5758       which the host association can be wrong.  */
5759   if (e->symtree == NULL
5760 	|| e->symtree->n.sym == NULL
5761 	|| e->user_operator)
5762     return retval;
5763 
5764   old_sym = e->symtree->n.sym;
5765 
5766   if (gfc_current_ns->parent
5767 	&& old_sym->ns != gfc_current_ns)
5768     {
5769       /* Use the 'USE' name so that renamed module symbols are
5770 	 correctly handled.  */
5771       gfc_find_symbol (e->symtree->name, gfc_current_ns, 1, &sym);
5772 
5773       if (sym && old_sym != sym
5774 	      && sym->ts.type == old_sym->ts.type
5775 	      && sym->attr.flavor == FL_PROCEDURE
5776 	      && sym->attr.contained)
5777 	{
5778 	  /* Clear the shape, since it might not be valid.  */
5779 	  gfc_free_shape (&e->shape, e->rank);
5780 
5781 	  /* Give the expression the right symtree!  */
5782 	  gfc_find_sym_tree (e->symtree->name, NULL, 1, &st);
5783 	  gcc_assert (st != NULL);
5784 
5785 	  if (old_sym->attr.flavor == FL_PROCEDURE
5786 		|| e->expr_type == EXPR_FUNCTION)
5787   	    {
5788 	      /* Original was function so point to the new symbol, since
5789 		 the actual argument list is already attached to the
5790 		 expression.  */
5791 	      e->value.function.esym = NULL;
5792 	      e->symtree = st;
5793 	    }
5794 	  else
5795 	    {
5796 	      /* Original was variable so convert array references into
5797 		 an actual arglist. This does not need any checking now
5798 		 since resolve_function will take care of it.  */
5799 	      e->value.function.actual = NULL;
5800 	      e->expr_type = EXPR_FUNCTION;
5801 	      e->symtree = st;
5802 
5803 	      /* Ambiguity will not arise if the array reference is not
5804 		 the last reference.  */
5805 	      for (ref = e->ref; ref; ref = ref->next)
5806 		if (ref->type == REF_ARRAY && ref->next == NULL)
5807 		  break;
5808 
5809 	      gcc_assert (ref->type == REF_ARRAY);
5810 
5811 	      /* Grab the start expressions from the array ref and
5812 		 copy them into actual arguments.  */
5813 	      for (n = 0; n < ref->u.ar.dimen; n++)
5814 		{
5815 		  arg = gfc_get_actual_arglist ();
5816 		  arg->expr = gfc_copy_expr (ref->u.ar.start[n]);
5817 		  if (e->value.function.actual == NULL)
5818 		    tail = e->value.function.actual = arg;
5819 	          else
5820 		    {
5821 		      tail->next = arg;
5822 		      tail = arg;
5823 		    }
5824 		}
5825 
5826 	      /* Dump the reference list and set the rank.  */
5827 	      gfc_free_ref_list (e->ref);
5828 	      e->ref = NULL;
5829 	      e->rank = sym->as ? sym->as->rank : 0;
5830 	    }
5831 
5832 	  gfc_resolve_expr (e);
5833 	  sym->refs++;
5834 	}
5835     }
5836   /* This might have changed!  */
5837   return e->expr_type == EXPR_FUNCTION;
5838 }
5839 
5840 
5841 static void
gfc_resolve_character_operator(gfc_expr * e)5842 gfc_resolve_character_operator (gfc_expr *e)
5843 {
5844   gfc_expr *op1 = e->value.op.op1;
5845   gfc_expr *op2 = e->value.op.op2;
5846   gfc_expr *e1 = NULL;
5847   gfc_expr *e2 = NULL;
5848 
5849   gcc_assert (e->value.op.op == INTRINSIC_CONCAT);
5850 
5851   if (op1->ts.u.cl && op1->ts.u.cl->length)
5852     e1 = gfc_copy_expr (op1->ts.u.cl->length);
5853   else if (op1->expr_type == EXPR_CONSTANT)
5854     e1 = gfc_get_int_expr (gfc_charlen_int_kind, NULL,
5855 			   op1->value.character.length);
5856 
5857   if (op2->ts.u.cl && op2->ts.u.cl->length)
5858     e2 = gfc_copy_expr (op2->ts.u.cl->length);
5859   else if (op2->expr_type == EXPR_CONSTANT)
5860     e2 = gfc_get_int_expr (gfc_charlen_int_kind, NULL,
5861 			   op2->value.character.length);
5862 
5863   e->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
5864 
5865   if (!e1 || !e2)
5866     {
5867       gfc_free_expr (e1);
5868       gfc_free_expr (e2);
5869 
5870       return;
5871     }
5872 
5873   e->ts.u.cl->length = gfc_add (e1, e2);
5874   e->ts.u.cl->length->ts.type = BT_INTEGER;
5875   e->ts.u.cl->length->ts.kind = gfc_charlen_int_kind;
5876   gfc_simplify_expr (e->ts.u.cl->length, 0);
5877   gfc_resolve_expr (e->ts.u.cl->length);
5878 
5879   return;
5880 }
5881 
5882 
5883 /*  Ensure that an character expression has a charlen and, if possible, a
5884     length expression.  */
5885 
5886 static void
fixup_charlen(gfc_expr * e)5887 fixup_charlen (gfc_expr *e)
5888 {
5889   /* The cases fall through so that changes in expression type and the need
5890      for multiple fixes are picked up.  In all circumstances, a charlen should
5891      be available for the middle end to hang a backend_decl on.  */
5892   switch (e->expr_type)
5893     {
5894     case EXPR_OP:
5895       gfc_resolve_character_operator (e);
5896       /* FALLTHRU */
5897 
5898     case EXPR_ARRAY:
5899       if (e->expr_type == EXPR_ARRAY)
5900 	gfc_resolve_character_array_constructor (e);
5901       /* FALLTHRU */
5902 
5903     case EXPR_SUBSTRING:
5904       if (!e->ts.u.cl && e->ref)
5905 	gfc_resolve_substring_charlen (e);
5906       /* FALLTHRU */
5907 
5908     default:
5909       if (!e->ts.u.cl)
5910 	e->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
5911 
5912       break;
5913     }
5914 }
5915 
5916 
5917 /* Update an actual argument to include the passed-object for type-bound
5918    procedures at the right position.  */
5919 
5920 static gfc_actual_arglist*
update_arglist_pass(gfc_actual_arglist * lst,gfc_expr * po,unsigned argpos,const char * name)5921 update_arglist_pass (gfc_actual_arglist* lst, gfc_expr* po, unsigned argpos,
5922 		     const char *name)
5923 {
5924   gcc_assert (argpos > 0);
5925 
5926   if (argpos == 1)
5927     {
5928       gfc_actual_arglist* result;
5929 
5930       result = gfc_get_actual_arglist ();
5931       result->expr = po;
5932       result->next = lst;
5933       if (name)
5934         result->name = name;
5935 
5936       return result;
5937     }
5938 
5939   if (lst)
5940     lst->next = update_arglist_pass (lst->next, po, argpos - 1, name);
5941   else
5942     lst = update_arglist_pass (NULL, po, argpos - 1, name);
5943   return lst;
5944 }
5945 
5946 
5947 /* Extract the passed-object from an EXPR_COMPCALL (a copy of it).  */
5948 
5949 static gfc_expr*
extract_compcall_passed_object(gfc_expr * e)5950 extract_compcall_passed_object (gfc_expr* e)
5951 {
5952   gfc_expr* po;
5953 
5954   if (e->expr_type == EXPR_UNKNOWN)
5955     {
5956       gfc_error ("Error in typebound call at %L",
5957 		 &e->where);
5958       return NULL;
5959     }
5960 
5961   gcc_assert (e->expr_type == EXPR_COMPCALL);
5962 
5963   if (e->value.compcall.base_object)
5964     po = gfc_copy_expr (e->value.compcall.base_object);
5965   else
5966     {
5967       po = gfc_get_expr ();
5968       po->expr_type = EXPR_VARIABLE;
5969       po->symtree = e->symtree;
5970       po->ref = gfc_copy_ref (e->ref);
5971       po->where = e->where;
5972     }
5973 
5974   if (!gfc_resolve_expr (po))
5975     return NULL;
5976 
5977   return po;
5978 }
5979 
5980 
5981 /* Update the arglist of an EXPR_COMPCALL expression to include the
5982    passed-object.  */
5983 
5984 static bool
update_compcall_arglist(gfc_expr * e)5985 update_compcall_arglist (gfc_expr* e)
5986 {
5987   gfc_expr* po;
5988   gfc_typebound_proc* tbp;
5989 
5990   tbp = e->value.compcall.tbp;
5991 
5992   if (tbp->error)
5993     return false;
5994 
5995   po = extract_compcall_passed_object (e);
5996   if (!po)
5997     return false;
5998 
5999   if (tbp->nopass || e->value.compcall.ignore_pass)
6000     {
6001       gfc_free_expr (po);
6002       return true;
6003     }
6004 
6005   if (tbp->pass_arg_num <= 0)
6006     return false;
6007 
6008   e->value.compcall.actual = update_arglist_pass (e->value.compcall.actual, po,
6009 						  tbp->pass_arg_num,
6010 						  tbp->pass_arg);
6011 
6012   return true;
6013 }
6014 
6015 
6016 /* Extract the passed object from a PPC call (a copy of it).  */
6017 
6018 static gfc_expr*
extract_ppc_passed_object(gfc_expr * e)6019 extract_ppc_passed_object (gfc_expr *e)
6020 {
6021   gfc_expr *po;
6022   gfc_ref **ref;
6023 
6024   po = gfc_get_expr ();
6025   po->expr_type = EXPR_VARIABLE;
6026   po->symtree = e->symtree;
6027   po->ref = gfc_copy_ref (e->ref);
6028   po->where = e->where;
6029 
6030   /* Remove PPC reference.  */
6031   ref = &po->ref;
6032   while ((*ref)->next)
6033     ref = &(*ref)->next;
6034   gfc_free_ref_list (*ref);
6035   *ref = NULL;
6036 
6037   if (!gfc_resolve_expr (po))
6038     return NULL;
6039 
6040   return po;
6041 }
6042 
6043 
6044 /* Update the actual arglist of a procedure pointer component to include the
6045    passed-object.  */
6046 
6047 static bool
update_ppc_arglist(gfc_expr * e)6048 update_ppc_arglist (gfc_expr* e)
6049 {
6050   gfc_expr* po;
6051   gfc_component *ppc;
6052   gfc_typebound_proc* tb;
6053 
6054   ppc = gfc_get_proc_ptr_comp (e);
6055   if (!ppc)
6056     return false;
6057 
6058   tb = ppc->tb;
6059 
6060   if (tb->error)
6061     return false;
6062   else if (tb->nopass)
6063     return true;
6064 
6065   po = extract_ppc_passed_object (e);
6066   if (!po)
6067     return false;
6068 
6069   /* F08:R739.  */
6070   if (po->rank != 0)
6071     {
6072       gfc_error ("Passed-object at %L must be scalar", &e->where);
6073       return false;
6074     }
6075 
6076   /* F08:C611.  */
6077   if (po->ts.type == BT_DERIVED && po->ts.u.derived->attr.abstract)
6078     {
6079       gfc_error ("Base object for procedure-pointer component call at %L is of"
6080 		 " ABSTRACT type %qs", &e->where, po->ts.u.derived->name);
6081       return false;
6082     }
6083 
6084   gcc_assert (tb->pass_arg_num > 0);
6085   e->value.compcall.actual = update_arglist_pass (e->value.compcall.actual, po,
6086 						  tb->pass_arg_num,
6087 						  tb->pass_arg);
6088 
6089   return true;
6090 }
6091 
6092 
6093 /* Check that the object a TBP is called on is valid, i.e. it must not be
6094    of ABSTRACT type (as in subobject%abstract_parent%tbp()).  */
6095 
6096 static bool
check_typebound_baseobject(gfc_expr * e)6097 check_typebound_baseobject (gfc_expr* e)
6098 {
6099   gfc_expr* base;
6100   bool return_value = false;
6101 
6102   base = extract_compcall_passed_object (e);
6103   if (!base)
6104     return false;
6105 
6106   if (base->ts.type != BT_DERIVED && base->ts.type != BT_CLASS)
6107     {
6108       gfc_error ("Error in typebound call at %L", &e->where);
6109       goto cleanup;
6110     }
6111 
6112   if (base->ts.type == BT_CLASS && !gfc_expr_attr (base).class_ok)
6113     return false;
6114 
6115   /* F08:C611.  */
6116   if (base->ts.type == BT_DERIVED && base->ts.u.derived->attr.abstract)
6117     {
6118       gfc_error ("Base object for type-bound procedure call at %L is of"
6119 		 " ABSTRACT type %qs", &e->where, base->ts.u.derived->name);
6120       goto cleanup;
6121     }
6122 
6123   /* F08:C1230. If the procedure called is NOPASS,
6124      the base object must be scalar.  */
6125   if (e->value.compcall.tbp->nopass && base->rank != 0)
6126     {
6127       gfc_error ("Base object for NOPASS type-bound procedure call at %L must"
6128 		 " be scalar", &e->where);
6129       goto cleanup;
6130     }
6131 
6132   return_value = true;
6133 
6134 cleanup:
6135   gfc_free_expr (base);
6136   return return_value;
6137 }
6138 
6139 
6140 /* Resolve a call to a type-bound procedure, either function or subroutine,
6141    statically from the data in an EXPR_COMPCALL expression.  The adapted
6142    arglist and the target-procedure symtree are returned.  */
6143 
6144 static bool
resolve_typebound_static(gfc_expr * e,gfc_symtree ** target,gfc_actual_arglist ** actual)6145 resolve_typebound_static (gfc_expr* e, gfc_symtree** target,
6146 			  gfc_actual_arglist** actual)
6147 {
6148   gcc_assert (e->expr_type == EXPR_COMPCALL);
6149   gcc_assert (!e->value.compcall.tbp->is_generic);
6150 
6151   /* Update the actual arglist for PASS.  */
6152   if (!update_compcall_arglist (e))
6153     return false;
6154 
6155   *actual = e->value.compcall.actual;
6156   *target = e->value.compcall.tbp->u.specific;
6157 
6158   gfc_free_ref_list (e->ref);
6159   e->ref = NULL;
6160   e->value.compcall.actual = NULL;
6161 
6162   /* If we find a deferred typebound procedure, check for derived types
6163      that an overriding typebound procedure has not been missed.  */
6164   if (e->value.compcall.name
6165       && !e->value.compcall.tbp->non_overridable
6166       && e->value.compcall.base_object
6167       && e->value.compcall.base_object->ts.type == BT_DERIVED)
6168     {
6169       gfc_symtree *st;
6170       gfc_symbol *derived;
6171 
6172       /* Use the derived type of the base_object.  */
6173       derived = e->value.compcall.base_object->ts.u.derived;
6174       st = NULL;
6175 
6176       /* If necessary, go through the inheritance chain.  */
6177       while (!st && derived)
6178 	{
6179 	  /* Look for the typebound procedure 'name'.  */
6180 	  if (derived->f2k_derived && derived->f2k_derived->tb_sym_root)
6181 	    st = gfc_find_symtree (derived->f2k_derived->tb_sym_root,
6182 				   e->value.compcall.name);
6183 	  if (!st)
6184 	    derived = gfc_get_derived_super_type (derived);
6185 	}
6186 
6187       /* Now find the specific name in the derived type namespace.  */
6188       if (st && st->n.tb && st->n.tb->u.specific)
6189 	gfc_find_sym_tree (st->n.tb->u.specific->name,
6190 			   derived->ns, 1, &st);
6191       if (st)
6192 	*target = st;
6193     }
6194   return true;
6195 }
6196 
6197 
6198 /* Get the ultimate declared type from an expression.  In addition,
6199    return the last class/derived type reference and the copy of the
6200    reference list.  If check_types is set true, derived types are
6201    identified as well as class references.  */
6202 static gfc_symbol*
get_declared_from_expr(gfc_ref ** class_ref,gfc_ref ** new_ref,gfc_expr * e,bool check_types)6203 get_declared_from_expr (gfc_ref **class_ref, gfc_ref **new_ref,
6204 			gfc_expr *e, bool check_types)
6205 {
6206   gfc_symbol *declared;
6207   gfc_ref *ref;
6208 
6209   declared = NULL;
6210   if (class_ref)
6211     *class_ref = NULL;
6212   if (new_ref)
6213     *new_ref = gfc_copy_ref (e->ref);
6214 
6215   for (ref = e->ref; ref; ref = ref->next)
6216     {
6217       if (ref->type != REF_COMPONENT)
6218 	continue;
6219 
6220       if ((ref->u.c.component->ts.type == BT_CLASS
6221 	     || (check_types && gfc_bt_struct (ref->u.c.component->ts.type)))
6222 	  && ref->u.c.component->attr.flavor != FL_PROCEDURE)
6223 	{
6224 	  declared = ref->u.c.component->ts.u.derived;
6225 	  if (class_ref)
6226 	    *class_ref = ref;
6227 	}
6228     }
6229 
6230   if (declared == NULL)
6231     declared = e->symtree->n.sym->ts.u.derived;
6232 
6233   return declared;
6234 }
6235 
6236 
6237 /* Given an EXPR_COMPCALL calling a GENERIC typebound procedure, figure out
6238    which of the specific bindings (if any) matches the arglist and transform
6239    the expression into a call of that binding.  */
6240 
6241 static bool
resolve_typebound_generic_call(gfc_expr * e,const char ** name)6242 resolve_typebound_generic_call (gfc_expr* e, const char **name)
6243 {
6244   gfc_typebound_proc* genproc;
6245   const char* genname;
6246   gfc_symtree *st;
6247   gfc_symbol *derived;
6248 
6249   gcc_assert (e->expr_type == EXPR_COMPCALL);
6250   genname = e->value.compcall.name;
6251   genproc = e->value.compcall.tbp;
6252 
6253   if (!genproc->is_generic)
6254     return true;
6255 
6256   /* Try the bindings on this type and in the inheritance hierarchy.  */
6257   for (; genproc; genproc = genproc->overridden)
6258     {
6259       gfc_tbp_generic* g;
6260 
6261       gcc_assert (genproc->is_generic);
6262       for (g = genproc->u.generic; g; g = g->next)
6263 	{
6264 	  gfc_symbol* target;
6265 	  gfc_actual_arglist* args;
6266 	  bool matches;
6267 
6268 	  gcc_assert (g->specific);
6269 
6270 	  if (g->specific->error)
6271 	    continue;
6272 
6273 	  target = g->specific->u.specific->n.sym;
6274 
6275 	  /* Get the right arglist by handling PASS/NOPASS.  */
6276 	  args = gfc_copy_actual_arglist (e->value.compcall.actual);
6277 	  if (!g->specific->nopass)
6278 	    {
6279 	      gfc_expr* po;
6280 	      po = extract_compcall_passed_object (e);
6281 	      if (!po)
6282 		{
6283 		  gfc_free_actual_arglist (args);
6284 		  return false;
6285 		}
6286 
6287 	      gcc_assert (g->specific->pass_arg_num > 0);
6288 	      gcc_assert (!g->specific->error);
6289 	      args = update_arglist_pass (args, po, g->specific->pass_arg_num,
6290 					  g->specific->pass_arg);
6291 	    }
6292 	  resolve_actual_arglist (args, target->attr.proc,
6293 				  is_external_proc (target)
6294 				  && gfc_sym_get_dummy_args (target) == NULL);
6295 
6296 	  /* Check if this arglist matches the formal.  */
6297 	  matches = gfc_arglist_matches_symbol (&args, target);
6298 
6299 	  /* Clean up and break out of the loop if we've found it.  */
6300 	  gfc_free_actual_arglist (args);
6301 	  if (matches)
6302 	    {
6303 	      e->value.compcall.tbp = g->specific;
6304 	      genname = g->specific_st->name;
6305 	      /* Pass along the name for CLASS methods, where the vtab
6306 		 procedure pointer component has to be referenced.  */
6307 	      if (name)
6308 		*name = genname;
6309 	      goto success;
6310 	    }
6311 	}
6312     }
6313 
6314   /* Nothing matching found!  */
6315   gfc_error ("Found no matching specific binding for the call to the GENERIC"
6316 	     " %qs at %L", genname, &e->where);
6317   return false;
6318 
6319 success:
6320   /* Make sure that we have the right specific instance for the name.  */
6321   derived = get_declared_from_expr (NULL, NULL, e, true);
6322 
6323   st = gfc_find_typebound_proc (derived, NULL, genname, true, &e->where);
6324   if (st)
6325     e->value.compcall.tbp = st->n.tb;
6326 
6327   return true;
6328 }
6329 
6330 
6331 /* Resolve a call to a type-bound subroutine.  */
6332 
6333 static bool
resolve_typebound_call(gfc_code * c,const char ** name,bool * overridable)6334 resolve_typebound_call (gfc_code* c, const char **name, bool *overridable)
6335 {
6336   gfc_actual_arglist* newactual;
6337   gfc_symtree* target;
6338 
6339   /* Check that's really a SUBROUTINE.  */
6340   if (!c->expr1->value.compcall.tbp->subroutine)
6341     {
6342       if (!c->expr1->value.compcall.tbp->is_generic
6343 	  && c->expr1->value.compcall.tbp->u.specific
6344 	  && c->expr1->value.compcall.tbp->u.specific->n.sym
6345 	  && c->expr1->value.compcall.tbp->u.specific->n.sym->attr.subroutine)
6346 	c->expr1->value.compcall.tbp->subroutine = 1;
6347       else
6348 	{
6349 	  gfc_error ("%qs at %L should be a SUBROUTINE",
6350 		     c->expr1->value.compcall.name, &c->loc);
6351 	  return false;
6352 	}
6353     }
6354 
6355   if (!check_typebound_baseobject (c->expr1))
6356     return false;
6357 
6358   /* Pass along the name for CLASS methods, where the vtab
6359      procedure pointer component has to be referenced.  */
6360   if (name)
6361     *name = c->expr1->value.compcall.name;
6362 
6363   if (!resolve_typebound_generic_call (c->expr1, name))
6364     return false;
6365 
6366   /* Pass along the NON_OVERRIDABLE attribute of the specific TBP. */
6367   if (overridable)
6368     *overridable = !c->expr1->value.compcall.tbp->non_overridable;
6369 
6370   /* Transform into an ordinary EXEC_CALL for now.  */
6371 
6372   if (!resolve_typebound_static (c->expr1, &target, &newactual))
6373     return false;
6374 
6375   c->ext.actual = newactual;
6376   c->symtree = target;
6377   c->op = (c->expr1->value.compcall.assign ? EXEC_ASSIGN_CALL : EXEC_CALL);
6378 
6379   gcc_assert (!c->expr1->ref && !c->expr1->value.compcall.actual);
6380 
6381   gfc_free_expr (c->expr1);
6382   c->expr1 = gfc_get_expr ();
6383   c->expr1->expr_type = EXPR_FUNCTION;
6384   c->expr1->symtree = target;
6385   c->expr1->where = c->loc;
6386 
6387   return resolve_call (c);
6388 }
6389 
6390 
6391 /* Resolve a component-call expression.  */
6392 static bool
resolve_compcall(gfc_expr * e,const char ** name)6393 resolve_compcall (gfc_expr* e, const char **name)
6394 {
6395   gfc_actual_arglist* newactual;
6396   gfc_symtree* target;
6397 
6398   /* Check that's really a FUNCTION.  */
6399   if (!e->value.compcall.tbp->function)
6400     {
6401       gfc_error ("%qs at %L should be a FUNCTION",
6402 		 e->value.compcall.name, &e->where);
6403       return false;
6404     }
6405 
6406   /* These must not be assign-calls!  */
6407   gcc_assert (!e->value.compcall.assign);
6408 
6409   if (!check_typebound_baseobject (e))
6410     return false;
6411 
6412   /* Pass along the name for CLASS methods, where the vtab
6413      procedure pointer component has to be referenced.  */
6414   if (name)
6415     *name = e->value.compcall.name;
6416 
6417   if (!resolve_typebound_generic_call (e, name))
6418     return false;
6419   gcc_assert (!e->value.compcall.tbp->is_generic);
6420 
6421   /* Take the rank from the function's symbol.  */
6422   if (e->value.compcall.tbp->u.specific->n.sym->as)
6423     e->rank = e->value.compcall.tbp->u.specific->n.sym->as->rank;
6424 
6425   /* For now, we simply transform it into an EXPR_FUNCTION call with the same
6426      arglist to the TBP's binding target.  */
6427 
6428   if (!resolve_typebound_static (e, &target, &newactual))
6429     return false;
6430 
6431   e->value.function.actual = newactual;
6432   e->value.function.name = NULL;
6433   e->value.function.esym = target->n.sym;
6434   e->value.function.isym = NULL;
6435   e->symtree = target;
6436   e->ts = target->n.sym->ts;
6437   e->expr_type = EXPR_FUNCTION;
6438 
6439   /* Resolution is not necessary if this is a class subroutine; this
6440      function only has to identify the specific proc. Resolution of
6441      the call will be done next in resolve_typebound_call.  */
6442   return gfc_resolve_expr (e);
6443 }
6444 
6445 
6446 static bool resolve_fl_derived (gfc_symbol *sym);
6447 
6448 
6449 /* Resolve a typebound function, or 'method'. First separate all
6450    the non-CLASS references by calling resolve_compcall directly.  */
6451 
6452 static bool
resolve_typebound_function(gfc_expr * e)6453 resolve_typebound_function (gfc_expr* e)
6454 {
6455   gfc_symbol *declared;
6456   gfc_component *c;
6457   gfc_ref *new_ref;
6458   gfc_ref *class_ref;
6459   gfc_symtree *st;
6460   const char *name;
6461   gfc_typespec ts;
6462   gfc_expr *expr;
6463   bool overridable;
6464 
6465   st = e->symtree;
6466 
6467   /* Deal with typebound operators for CLASS objects.  */
6468   expr = e->value.compcall.base_object;
6469   overridable = !e->value.compcall.tbp->non_overridable;
6470   if (expr && expr->ts.type == BT_CLASS && e->value.compcall.name)
6471     {
6472       /* If the base_object is not a variable, the corresponding actual
6473 	 argument expression must be stored in e->base_expression so
6474 	 that the corresponding tree temporary can be used as the base
6475 	 object in gfc_conv_procedure_call.  */
6476       if (expr->expr_type != EXPR_VARIABLE)
6477 	{
6478 	  gfc_actual_arglist *args;
6479 
6480 	  for (args= e->value.function.actual; args; args = args->next)
6481 	    {
6482 	      if (expr == args->expr)
6483 		expr = args->expr;
6484 	    }
6485 	}
6486 
6487       /* Since the typebound operators are generic, we have to ensure
6488 	 that any delays in resolution are corrected and that the vtab
6489 	 is present.  */
6490       ts = expr->ts;
6491       declared = ts.u.derived;
6492       c = gfc_find_component (declared, "_vptr", true, true, NULL);
6493       if (c->ts.u.derived == NULL)
6494 	c->ts.u.derived = gfc_find_derived_vtab (declared);
6495 
6496       if (!resolve_compcall (e, &name))
6497 	return false;
6498 
6499       /* Use the generic name if it is there.  */
6500       name = name ? name : e->value.function.esym->name;
6501       e->symtree = expr->symtree;
6502       e->ref = gfc_copy_ref (expr->ref);
6503       get_declared_from_expr (&class_ref, NULL, e, false);
6504 
6505       /* Trim away the extraneous references that emerge from nested
6506 	 use of interface.c (extend_expr).  */
6507       if (class_ref && class_ref->next)
6508 	{
6509 	  gfc_free_ref_list (class_ref->next);
6510 	  class_ref->next = NULL;
6511 	}
6512       else if (e->ref && !class_ref && expr->ts.type != BT_CLASS)
6513 	{
6514 	  gfc_free_ref_list (e->ref);
6515 	  e->ref = NULL;
6516 	}
6517 
6518       gfc_add_vptr_component (e);
6519       gfc_add_component_ref (e, name);
6520       e->value.function.esym = NULL;
6521       if (expr->expr_type != EXPR_VARIABLE)
6522 	e->base_expr = expr;
6523       return true;
6524     }
6525 
6526   if (st == NULL)
6527     return resolve_compcall (e, NULL);
6528 
6529   if (!resolve_ref (e))
6530     return false;
6531 
6532   /* Get the CLASS declared type.  */
6533   declared = get_declared_from_expr (&class_ref, &new_ref, e, true);
6534 
6535   if (!resolve_fl_derived (declared))
6536     return false;
6537 
6538   /* Weed out cases of the ultimate component being a derived type.  */
6539   if ((class_ref && gfc_bt_struct (class_ref->u.c.component->ts.type))
6540 	 || (!class_ref && st->n.sym->ts.type != BT_CLASS))
6541     {
6542       gfc_free_ref_list (new_ref);
6543       return resolve_compcall (e, NULL);
6544     }
6545 
6546   c = gfc_find_component (declared, "_data", true, true, NULL);
6547   declared = c->ts.u.derived;
6548 
6549   /* Treat the call as if it is a typebound procedure, in order to roll
6550      out the correct name for the specific function.  */
6551   if (!resolve_compcall (e, &name))
6552     {
6553       gfc_free_ref_list (new_ref);
6554       return false;
6555     }
6556   ts = e->ts;
6557 
6558   if (overridable)
6559     {
6560       /* Convert the expression to a procedure pointer component call.  */
6561       e->value.function.esym = NULL;
6562       e->symtree = st;
6563 
6564       if (new_ref)
6565 	e->ref = new_ref;
6566 
6567       /* '_vptr' points to the vtab, which contains the procedure pointers.  */
6568       gfc_add_vptr_component (e);
6569       gfc_add_component_ref (e, name);
6570 
6571       /* Recover the typespec for the expression.  This is really only
6572 	necessary for generic procedures, where the additional call
6573 	to gfc_add_component_ref seems to throw the collection of the
6574 	correct typespec.  */
6575       e->ts = ts;
6576     }
6577   else if (new_ref)
6578     gfc_free_ref_list (new_ref);
6579 
6580   return true;
6581 }
6582 
6583 /* Resolve a typebound subroutine, or 'method'. First separate all
6584    the non-CLASS references by calling resolve_typebound_call
6585    directly.  */
6586 
6587 static bool
resolve_typebound_subroutine(gfc_code * code)6588 resolve_typebound_subroutine (gfc_code *code)
6589 {
6590   gfc_symbol *declared;
6591   gfc_component *c;
6592   gfc_ref *new_ref;
6593   gfc_ref *class_ref;
6594   gfc_symtree *st;
6595   const char *name;
6596   gfc_typespec ts;
6597   gfc_expr *expr;
6598   bool overridable;
6599 
6600   st = code->expr1->symtree;
6601 
6602   /* Deal with typebound operators for CLASS objects.  */
6603   expr = code->expr1->value.compcall.base_object;
6604   overridable = !code->expr1->value.compcall.tbp->non_overridable;
6605   if (expr && expr->ts.type == BT_CLASS && code->expr1->value.compcall.name)
6606     {
6607       /* If the base_object is not a variable, the corresponding actual
6608 	 argument expression must be stored in e->base_expression so
6609 	 that the corresponding tree temporary can be used as the base
6610 	 object in gfc_conv_procedure_call.  */
6611       if (expr->expr_type != EXPR_VARIABLE)
6612 	{
6613 	  gfc_actual_arglist *args;
6614 
6615 	  args= code->expr1->value.function.actual;
6616 	  for (; args; args = args->next)
6617 	    if (expr == args->expr)
6618 	      expr = args->expr;
6619 	}
6620 
6621       /* Since the typebound operators are generic, we have to ensure
6622 	 that any delays in resolution are corrected and that the vtab
6623 	 is present.  */
6624       declared = expr->ts.u.derived;
6625       c = gfc_find_component (declared, "_vptr", true, true, NULL);
6626       if (c->ts.u.derived == NULL)
6627 	c->ts.u.derived = gfc_find_derived_vtab (declared);
6628 
6629       if (!resolve_typebound_call (code, &name, NULL))
6630 	return false;
6631 
6632       /* Use the generic name if it is there.  */
6633       name = name ? name : code->expr1->value.function.esym->name;
6634       code->expr1->symtree = expr->symtree;
6635       code->expr1->ref = gfc_copy_ref (expr->ref);
6636 
6637       /* Trim away the extraneous references that emerge from nested
6638 	 use of interface.c (extend_expr).  */
6639       get_declared_from_expr (&class_ref, NULL, code->expr1, false);
6640       if (class_ref && class_ref->next)
6641 	{
6642 	  gfc_free_ref_list (class_ref->next);
6643 	  class_ref->next = NULL;
6644 	}
6645       else if (code->expr1->ref && !class_ref)
6646 	{
6647 	  gfc_free_ref_list (code->expr1->ref);
6648 	  code->expr1->ref = NULL;
6649 	}
6650 
6651       /* Now use the procedure in the vtable.  */
6652       gfc_add_vptr_component (code->expr1);
6653       gfc_add_component_ref (code->expr1, name);
6654       code->expr1->value.function.esym = NULL;
6655       if (expr->expr_type != EXPR_VARIABLE)
6656 	code->expr1->base_expr = expr;
6657       return true;
6658     }
6659 
6660   if (st == NULL)
6661     return resolve_typebound_call (code, NULL, NULL);
6662 
6663   if (!resolve_ref (code->expr1))
6664     return false;
6665 
6666   /* Get the CLASS declared type.  */
6667   get_declared_from_expr (&class_ref, &new_ref, code->expr1, true);
6668 
6669   /* Weed out cases of the ultimate component being a derived type.  */
6670   if ((class_ref && gfc_bt_struct (class_ref->u.c.component->ts.type))
6671 	 || (!class_ref && st->n.sym->ts.type != BT_CLASS))
6672     {
6673       gfc_free_ref_list (new_ref);
6674       return resolve_typebound_call (code, NULL, NULL);
6675     }
6676 
6677   if (!resolve_typebound_call (code, &name, &overridable))
6678     {
6679       gfc_free_ref_list (new_ref);
6680       return false;
6681     }
6682   ts = code->expr1->ts;
6683 
6684   if (overridable)
6685     {
6686       /* Convert the expression to a procedure pointer component call.  */
6687       code->expr1->value.function.esym = NULL;
6688       code->expr1->symtree = st;
6689 
6690       if (new_ref)
6691 	code->expr1->ref = new_ref;
6692 
6693       /* '_vptr' points to the vtab, which contains the procedure pointers.  */
6694       gfc_add_vptr_component (code->expr1);
6695       gfc_add_component_ref (code->expr1, name);
6696 
6697       /* Recover the typespec for the expression.  This is really only
6698 	necessary for generic procedures, where the additional call
6699 	to gfc_add_component_ref seems to throw the collection of the
6700 	correct typespec.  */
6701       code->expr1->ts = ts;
6702     }
6703   else if (new_ref)
6704     gfc_free_ref_list (new_ref);
6705 
6706   return true;
6707 }
6708 
6709 
6710 /* Resolve a CALL to a Procedure Pointer Component (Subroutine).  */
6711 
6712 static bool
resolve_ppc_call(gfc_code * c)6713 resolve_ppc_call (gfc_code* c)
6714 {
6715   gfc_component *comp;
6716 
6717   comp = gfc_get_proc_ptr_comp (c->expr1);
6718   gcc_assert (comp != NULL);
6719 
6720   c->resolved_sym = c->expr1->symtree->n.sym;
6721   c->expr1->expr_type = EXPR_VARIABLE;
6722 
6723   if (!comp->attr.subroutine)
6724     gfc_add_subroutine (&comp->attr, comp->name, &c->expr1->where);
6725 
6726   if (!resolve_ref (c->expr1))
6727     return false;
6728 
6729   if (!update_ppc_arglist (c->expr1))
6730     return false;
6731 
6732   c->ext.actual = c->expr1->value.compcall.actual;
6733 
6734   if (!resolve_actual_arglist (c->ext.actual, comp->attr.proc,
6735 			       !(comp->ts.interface
6736 				 && comp->ts.interface->formal)))
6737     return false;
6738 
6739   if (!pure_subroutine (comp->ts.interface, comp->name, &c->expr1->where))
6740     return false;
6741 
6742   gfc_ppc_use (comp, &c->expr1->value.compcall.actual, &c->expr1->where);
6743 
6744   return true;
6745 }
6746 
6747 
6748 /* Resolve a Function Call to a Procedure Pointer Component (Function).  */
6749 
6750 static bool
resolve_expr_ppc(gfc_expr * e)6751 resolve_expr_ppc (gfc_expr* e)
6752 {
6753   gfc_component *comp;
6754 
6755   comp = gfc_get_proc_ptr_comp (e);
6756   gcc_assert (comp != NULL);
6757 
6758   /* Convert to EXPR_FUNCTION.  */
6759   e->expr_type = EXPR_FUNCTION;
6760   e->value.function.isym = NULL;
6761   e->value.function.actual = e->value.compcall.actual;
6762   e->ts = comp->ts;
6763   if (comp->as != NULL)
6764     e->rank = comp->as->rank;
6765 
6766   if (!comp->attr.function)
6767     gfc_add_function (&comp->attr, comp->name, &e->where);
6768 
6769   if (!resolve_ref (e))
6770     return false;
6771 
6772   if (!resolve_actual_arglist (e->value.function.actual, comp->attr.proc,
6773 			       !(comp->ts.interface
6774 				 && comp->ts.interface->formal)))
6775     return false;
6776 
6777   if (!update_ppc_arglist (e))
6778     return false;
6779 
6780   if (!check_pure_function(e))
6781     return false;
6782 
6783   gfc_ppc_use (comp, &e->value.compcall.actual, &e->where);
6784 
6785   return true;
6786 }
6787 
6788 
6789 static bool
gfc_is_expandable_expr(gfc_expr * e)6790 gfc_is_expandable_expr (gfc_expr *e)
6791 {
6792   gfc_constructor *con;
6793 
6794   if (e->expr_type == EXPR_ARRAY)
6795     {
6796       /* Traverse the constructor looking for variables that are flavor
6797 	 parameter.  Parameters must be expanded since they are fully used at
6798 	 compile time.  */
6799       con = gfc_constructor_first (e->value.constructor);
6800       for (; con; con = gfc_constructor_next (con))
6801 	{
6802 	  if (con->expr->expr_type == EXPR_VARIABLE
6803 	      && con->expr->symtree
6804 	      && (con->expr->symtree->n.sym->attr.flavor == FL_PARAMETER
6805 	      || con->expr->symtree->n.sym->attr.flavor == FL_VARIABLE))
6806 	    return true;
6807 	  if (con->expr->expr_type == EXPR_ARRAY
6808 	      && gfc_is_expandable_expr (con->expr))
6809 	    return true;
6810 	}
6811     }
6812 
6813   return false;
6814 }
6815 
6816 
6817 /* Sometimes variables in specification expressions of the result
6818    of module procedures in submodules wind up not being the 'real'
6819    dummy.  Find this, if possible, in the namespace of the first
6820    formal argument.  */
6821 
6822 static void
fixup_unique_dummy(gfc_expr * e)6823 fixup_unique_dummy (gfc_expr *e)
6824 {
6825   gfc_symtree *st = NULL;
6826   gfc_symbol *s = NULL;
6827 
6828   if (e->symtree->n.sym->ns->proc_name
6829       && e->symtree->n.sym->ns->proc_name->formal)
6830     s = e->symtree->n.sym->ns->proc_name->formal->sym;
6831 
6832   if (s != NULL)
6833     st = gfc_find_symtree (s->ns->sym_root, e->symtree->n.sym->name);
6834 
6835   if (st != NULL
6836       && st->n.sym != NULL
6837       && st->n.sym->attr.dummy)
6838     e->symtree = st;
6839 }
6840 
6841 /* Resolve an expression.  That is, make sure that types of operands agree
6842    with their operators, intrinsic operators are converted to function calls
6843    for overloaded types and unresolved function references are resolved.  */
6844 
6845 bool
gfc_resolve_expr(gfc_expr * e)6846 gfc_resolve_expr (gfc_expr *e)
6847 {
6848   bool t;
6849   bool inquiry_save, actual_arg_save, first_actual_arg_save;
6850 
6851   if (e == NULL)
6852     return true;
6853 
6854   /* inquiry_argument only applies to variables.  */
6855   inquiry_save = inquiry_argument;
6856   actual_arg_save = actual_arg;
6857   first_actual_arg_save = first_actual_arg;
6858 
6859   if (e->expr_type != EXPR_VARIABLE)
6860     {
6861       inquiry_argument = false;
6862       actual_arg = false;
6863       first_actual_arg = false;
6864     }
6865   else if (e->symtree != NULL
6866 	   && *e->symtree->name == '@'
6867 	   && e->symtree->n.sym->attr.dummy)
6868     {
6869       /* Deal with submodule specification expressions that are not
6870 	 found to be referenced in module.c(read_cleanup).  */
6871       fixup_unique_dummy (e);
6872     }
6873 
6874   switch (e->expr_type)
6875     {
6876     case EXPR_OP:
6877       t = resolve_operator (e);
6878       break;
6879 
6880     case EXPR_FUNCTION:
6881     case EXPR_VARIABLE:
6882 
6883       if (check_host_association (e))
6884 	t = resolve_function (e);
6885       else
6886 	t = resolve_variable (e);
6887 
6888       if (e->ts.type == BT_CHARACTER && e->ts.u.cl == NULL && e->ref
6889 	  && e->ref->type != REF_SUBSTRING)
6890 	gfc_resolve_substring_charlen (e);
6891 
6892       break;
6893 
6894     case EXPR_COMPCALL:
6895       t = resolve_typebound_function (e);
6896       break;
6897 
6898     case EXPR_SUBSTRING:
6899       t = resolve_ref (e);
6900       break;
6901 
6902     case EXPR_CONSTANT:
6903     case EXPR_NULL:
6904       t = true;
6905       break;
6906 
6907     case EXPR_PPC:
6908       t = resolve_expr_ppc (e);
6909       break;
6910 
6911     case EXPR_ARRAY:
6912       t = false;
6913       if (!resolve_ref (e))
6914 	break;
6915 
6916       t = gfc_resolve_array_constructor (e);
6917       /* Also try to expand a constructor.  */
6918       if (t)
6919 	{
6920 	  expression_rank (e);
6921 	  if (gfc_is_constant_expr (e) || gfc_is_expandable_expr (e))
6922 	    gfc_expand_constructor (e, false);
6923 	}
6924 
6925       /* This provides the opportunity for the length of constructors with
6926 	 character valued function elements to propagate the string length
6927 	 to the expression.  */
6928       if (t && e->ts.type == BT_CHARACTER)
6929         {
6930 	  /* For efficiency, we call gfc_expand_constructor for BT_CHARACTER
6931 	     here rather then add a duplicate test for it above.  */
6932 	  gfc_expand_constructor (e, false);
6933 	  t = gfc_resolve_character_array_constructor (e);
6934 	}
6935 
6936       break;
6937 
6938     case EXPR_STRUCTURE:
6939       t = resolve_ref (e);
6940       if (!t)
6941 	break;
6942 
6943       t = resolve_structure_cons (e, 0);
6944       if (!t)
6945 	break;
6946 
6947       t = gfc_simplify_expr (e, 0);
6948       break;
6949 
6950     default:
6951       gfc_internal_error ("gfc_resolve_expr(): Bad expression type");
6952     }
6953 
6954   if (e->ts.type == BT_CHARACTER && t && !e->ts.u.cl)
6955     fixup_charlen (e);
6956 
6957   inquiry_argument = inquiry_save;
6958   actual_arg = actual_arg_save;
6959   first_actual_arg = first_actual_arg_save;
6960 
6961   return t;
6962 }
6963 
6964 
6965 /* Resolve an expression from an iterator.  They must be scalar and have
6966    INTEGER or (optionally) REAL type.  */
6967 
6968 static bool
gfc_resolve_iterator_expr(gfc_expr * expr,bool real_ok,const char * name_msgid)6969 gfc_resolve_iterator_expr (gfc_expr *expr, bool real_ok,
6970 			   const char *name_msgid)
6971 {
6972   if (!gfc_resolve_expr (expr))
6973     return false;
6974 
6975   if (expr->rank != 0)
6976     {
6977       gfc_error ("%s at %L must be a scalar", _(name_msgid), &expr->where);
6978       return false;
6979     }
6980 
6981   if (expr->ts.type != BT_INTEGER)
6982     {
6983       if (expr->ts.type == BT_REAL)
6984 	{
6985 	  if (real_ok)
6986 	    return gfc_notify_std (GFC_STD_F95_DEL,
6987 				   "%s at %L must be integer",
6988 				   _(name_msgid), &expr->where);
6989 	  else
6990 	    {
6991 	      gfc_error ("%s at %L must be INTEGER", _(name_msgid),
6992 			 &expr->where);
6993 	      return false;
6994 	    }
6995 	}
6996       else
6997 	{
6998 	  gfc_error ("%s at %L must be INTEGER", _(name_msgid), &expr->where);
6999 	  return false;
7000 	}
7001     }
7002   return true;
7003 }
7004 
7005 
7006 /* Resolve the expressions in an iterator structure.  If REAL_OK is
7007    false allow only INTEGER type iterators, otherwise allow REAL types.
7008    Set own_scope to true for ac-implied-do and data-implied-do as those
7009    have a separate scope such that, e.g., a INTENT(IN) doesn't apply.  */
7010 
7011 bool
gfc_resolve_iterator(gfc_iterator * iter,bool real_ok,bool own_scope)7012 gfc_resolve_iterator (gfc_iterator *iter, bool real_ok, bool own_scope)
7013 {
7014   if (!gfc_resolve_iterator_expr (iter->var, real_ok, "Loop variable"))
7015     return false;
7016 
7017   if (!gfc_check_vardef_context (iter->var, false, false, own_scope,
7018 				 _("iterator variable")))
7019     return false;
7020 
7021   if (!gfc_resolve_iterator_expr (iter->start, real_ok,
7022 				  "Start expression in DO loop"))
7023     return false;
7024 
7025   if (!gfc_resolve_iterator_expr (iter->end, real_ok,
7026 				  "End expression in DO loop"))
7027     return false;
7028 
7029   if (!gfc_resolve_iterator_expr (iter->step, real_ok,
7030 				  "Step expression in DO loop"))
7031     return false;
7032 
7033   if (iter->step->expr_type == EXPR_CONSTANT)
7034     {
7035       if ((iter->step->ts.type == BT_INTEGER
7036 	   && mpz_cmp_ui (iter->step->value.integer, 0) == 0)
7037 	  || (iter->step->ts.type == BT_REAL
7038 	      && mpfr_sgn (iter->step->value.real) == 0))
7039 	{
7040 	  gfc_error ("Step expression in DO loop at %L cannot be zero",
7041 		     &iter->step->where);
7042 	  return false;
7043 	}
7044     }
7045 
7046   /* Convert start, end, and step to the same type as var.  */
7047   if (iter->start->ts.kind != iter->var->ts.kind
7048       || iter->start->ts.type != iter->var->ts.type)
7049     gfc_convert_type (iter->start, &iter->var->ts, 1);
7050 
7051   if (iter->end->ts.kind != iter->var->ts.kind
7052       || iter->end->ts.type != iter->var->ts.type)
7053     gfc_convert_type (iter->end, &iter->var->ts, 1);
7054 
7055   if (iter->step->ts.kind != iter->var->ts.kind
7056       || iter->step->ts.type != iter->var->ts.type)
7057     gfc_convert_type (iter->step, &iter->var->ts, 1);
7058 
7059   if (iter->start->expr_type == EXPR_CONSTANT
7060       && iter->end->expr_type == EXPR_CONSTANT
7061       && iter->step->expr_type == EXPR_CONSTANT)
7062     {
7063       int sgn, cmp;
7064       if (iter->start->ts.type == BT_INTEGER)
7065 	{
7066 	  sgn = mpz_cmp_ui (iter->step->value.integer, 0);
7067 	  cmp = mpz_cmp (iter->end->value.integer, iter->start->value.integer);
7068 	}
7069       else
7070 	{
7071 	  sgn = mpfr_sgn (iter->step->value.real);
7072 	  cmp = mpfr_cmp (iter->end->value.real, iter->start->value.real);
7073 	}
7074       if (warn_zerotrip && ((sgn > 0 && cmp < 0) || (sgn < 0 && cmp > 0)))
7075 	gfc_warning (OPT_Wzerotrip,
7076 		     "DO loop at %L will be executed zero times",
7077 		     &iter->step->where);
7078     }
7079 
7080   if (iter->end->expr_type == EXPR_CONSTANT
7081       && iter->end->ts.type == BT_INTEGER
7082       && iter->step->expr_type == EXPR_CONSTANT
7083       && iter->step->ts.type == BT_INTEGER
7084       && (mpz_cmp_si (iter->step->value.integer, -1L) == 0
7085 	  || mpz_cmp_si (iter->step->value.integer, 1L) == 0))
7086     {
7087       bool is_step_positive = mpz_cmp_ui (iter->step->value.integer, 1) == 0;
7088       int k = gfc_validate_kind (BT_INTEGER, iter->end->ts.kind, false);
7089 
7090       if (is_step_positive
7091 	  && mpz_cmp (iter->end->value.integer, gfc_integer_kinds[k].huge) == 0)
7092 	gfc_warning (OPT_Wundefined_do_loop,
7093 		     "DO loop at %L is undefined as it overflows",
7094 		     &iter->step->where);
7095       else if (!is_step_positive
7096 	       && mpz_cmp (iter->end->value.integer,
7097 			   gfc_integer_kinds[k].min_int) == 0)
7098 	gfc_warning (OPT_Wundefined_do_loop,
7099 		     "DO loop at %L is undefined as it underflows",
7100 		     &iter->step->where);
7101     }
7102 
7103   return true;
7104 }
7105 
7106 
7107 /* Traversal function for find_forall_index.  f == 2 signals that
7108    that variable itself is not to be checked - only the references.  */
7109 
7110 static bool
forall_index(gfc_expr * expr,gfc_symbol * sym,int * f)7111 forall_index (gfc_expr *expr, gfc_symbol *sym, int *f)
7112 {
7113   if (expr->expr_type != EXPR_VARIABLE)
7114     return false;
7115 
7116   /* A scalar assignment  */
7117   if (!expr->ref || *f == 1)
7118     {
7119       if (expr->symtree->n.sym == sym)
7120 	return true;
7121       else
7122 	return false;
7123     }
7124 
7125   if (*f == 2)
7126     *f = 1;
7127   return false;
7128 }
7129 
7130 
7131 /* Check whether the FORALL index appears in the expression or not.
7132    Returns true if SYM is found in EXPR.  */
7133 
7134 bool
find_forall_index(gfc_expr * expr,gfc_symbol * sym,int f)7135 find_forall_index (gfc_expr *expr, gfc_symbol *sym, int f)
7136 {
7137   if (gfc_traverse_expr (expr, sym, forall_index, f))
7138     return true;
7139   else
7140     return false;
7141 }
7142 
7143 
7144 /* Resolve a list of FORALL iterators.  The FORALL index-name is constrained
7145    to be a scalar INTEGER variable.  The subscripts and stride are scalar
7146    INTEGERs, and if stride is a constant it must be nonzero.
7147    Furthermore "A subscript or stride in a forall-triplet-spec shall
7148    not contain a reference to any index-name in the
7149    forall-triplet-spec-list in which it appears." (7.5.4.1)  */
7150 
7151 static void
resolve_forall_iterators(gfc_forall_iterator * it)7152 resolve_forall_iterators (gfc_forall_iterator *it)
7153 {
7154   gfc_forall_iterator *iter, *iter2;
7155 
7156   for (iter = it; iter; iter = iter->next)
7157     {
7158       if (gfc_resolve_expr (iter->var)
7159 	  && (iter->var->ts.type != BT_INTEGER || iter->var->rank != 0))
7160 	gfc_error ("FORALL index-name at %L must be a scalar INTEGER",
7161 		   &iter->var->where);
7162 
7163       if (gfc_resolve_expr (iter->start)
7164 	  && (iter->start->ts.type != BT_INTEGER || iter->start->rank != 0))
7165 	gfc_error ("FORALL start expression at %L must be a scalar INTEGER",
7166 		   &iter->start->where);
7167       if (iter->var->ts.kind != iter->start->ts.kind)
7168 	gfc_convert_type (iter->start, &iter->var->ts, 1);
7169 
7170       if (gfc_resolve_expr (iter->end)
7171 	  && (iter->end->ts.type != BT_INTEGER || iter->end->rank != 0))
7172 	gfc_error ("FORALL end expression at %L must be a scalar INTEGER",
7173 		   &iter->end->where);
7174       if (iter->var->ts.kind != iter->end->ts.kind)
7175 	gfc_convert_type (iter->end, &iter->var->ts, 1);
7176 
7177       if (gfc_resolve_expr (iter->stride))
7178 	{
7179 	  if (iter->stride->ts.type != BT_INTEGER || iter->stride->rank != 0)
7180 	    gfc_error ("FORALL stride expression at %L must be a scalar %s",
7181 		       &iter->stride->where, "INTEGER");
7182 
7183 	  if (iter->stride->expr_type == EXPR_CONSTANT
7184 	      && mpz_cmp_ui (iter->stride->value.integer, 0) == 0)
7185 	    gfc_error ("FORALL stride expression at %L cannot be zero",
7186 		       &iter->stride->where);
7187 	}
7188       if (iter->var->ts.kind != iter->stride->ts.kind)
7189 	gfc_convert_type (iter->stride, &iter->var->ts, 1);
7190     }
7191 
7192   for (iter = it; iter; iter = iter->next)
7193     for (iter2 = iter; iter2; iter2 = iter2->next)
7194       {
7195 	if (find_forall_index (iter2->start, iter->var->symtree->n.sym, 0)
7196 	    || find_forall_index (iter2->end, iter->var->symtree->n.sym, 0)
7197 	    || find_forall_index (iter2->stride, iter->var->symtree->n.sym, 0))
7198 	  gfc_error ("FORALL index %qs may not appear in triplet "
7199 		     "specification at %L", iter->var->symtree->name,
7200 		     &iter2->start->where);
7201       }
7202 }
7203 
7204 
7205 /* Given a pointer to a symbol that is a derived type, see if it's
7206    inaccessible, i.e. if it's defined in another module and the components are
7207    PRIVATE.  The search is recursive if necessary.  Returns zero if no
7208    inaccessible components are found, nonzero otherwise.  */
7209 
7210 static int
derived_inaccessible(gfc_symbol * sym)7211 derived_inaccessible (gfc_symbol *sym)
7212 {
7213   gfc_component *c;
7214 
7215   if (sym->attr.use_assoc && sym->attr.private_comp)
7216     return 1;
7217 
7218   for (c = sym->components; c; c = c->next)
7219     {
7220 	/* Prevent an infinite loop through this function.  */
7221 	if (c->ts.type == BT_DERIVED && c->attr.pointer
7222 	    && sym == c->ts.u.derived)
7223 	  continue;
7224 
7225 	if (c->ts.type == BT_DERIVED && derived_inaccessible (c->ts.u.derived))
7226 	  return 1;
7227     }
7228 
7229   return 0;
7230 }
7231 
7232 
7233 /* Resolve the argument of a deallocate expression.  The expression must be
7234    a pointer or a full array.  */
7235 
7236 static bool
resolve_deallocate_expr(gfc_expr * e)7237 resolve_deallocate_expr (gfc_expr *e)
7238 {
7239   symbol_attribute attr;
7240   int allocatable, pointer;
7241   gfc_ref *ref;
7242   gfc_symbol *sym;
7243   gfc_component *c;
7244   bool unlimited;
7245 
7246   if (!gfc_resolve_expr (e))
7247     return false;
7248 
7249   if (e->expr_type != EXPR_VARIABLE)
7250     goto bad;
7251 
7252   sym = e->symtree->n.sym;
7253   unlimited = UNLIMITED_POLY(sym);
7254 
7255   if (sym->ts.type == BT_CLASS)
7256     {
7257       allocatable = CLASS_DATA (sym)->attr.allocatable;
7258       pointer = CLASS_DATA (sym)->attr.class_pointer;
7259     }
7260   else
7261     {
7262       allocatable = sym->attr.allocatable;
7263       pointer = sym->attr.pointer;
7264     }
7265   for (ref = e->ref; ref; ref = ref->next)
7266     {
7267       switch (ref->type)
7268 	{
7269 	case REF_ARRAY:
7270 	  if (ref->u.ar.type != AR_FULL
7271 	      && !(ref->u.ar.type == AR_ELEMENT && ref->u.ar.as->rank == 0
7272 	           && ref->u.ar.codimen && gfc_ref_this_image (ref)))
7273 	    allocatable = 0;
7274 	  break;
7275 
7276 	case REF_COMPONENT:
7277 	  c = ref->u.c.component;
7278 	  if (c->ts.type == BT_CLASS)
7279 	    {
7280 	      allocatable = CLASS_DATA (c)->attr.allocatable;
7281 	      pointer = CLASS_DATA (c)->attr.class_pointer;
7282 	    }
7283 	  else
7284 	    {
7285 	      allocatable = c->attr.allocatable;
7286 	      pointer = c->attr.pointer;
7287 	    }
7288 	  break;
7289 
7290 	case REF_SUBSTRING:
7291 	case REF_INQUIRY:
7292 	  allocatable = 0;
7293 	  break;
7294 	}
7295     }
7296 
7297   attr = gfc_expr_attr (e);
7298 
7299   if (allocatable == 0 && attr.pointer == 0 && !unlimited)
7300     {
7301     bad:
7302       gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",
7303 		 &e->where);
7304       return false;
7305     }
7306 
7307   /* F2008, C644.  */
7308   if (gfc_is_coindexed (e))
7309     {
7310       gfc_error ("Coindexed allocatable object at %L", &e->where);
7311       return false;
7312     }
7313 
7314   if (pointer
7315       && !gfc_check_vardef_context (e, true, true, false,
7316 				    _("DEALLOCATE object")))
7317     return false;
7318   if (!gfc_check_vardef_context (e, false, true, false,
7319 				 _("DEALLOCATE object")))
7320     return false;
7321 
7322   return true;
7323 }
7324 
7325 
7326 /* Returns true if the expression e contains a reference to the symbol sym.  */
7327 static bool
sym_in_expr(gfc_expr * e,gfc_symbol * sym,int * f ATTRIBUTE_UNUSED)7328 sym_in_expr (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
7329 {
7330   if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym == sym)
7331     return true;
7332 
7333   return false;
7334 }
7335 
7336 bool
gfc_find_sym_in_expr(gfc_symbol * sym,gfc_expr * e)7337 gfc_find_sym_in_expr (gfc_symbol *sym, gfc_expr *e)
7338 {
7339   return gfc_traverse_expr (e, sym, sym_in_expr, 0);
7340 }
7341 
7342 
7343 /* Given the expression node e for an allocatable/pointer of derived type to be
7344    allocated, get the expression node to be initialized afterwards (needed for
7345    derived types with default initializers, and derived types with allocatable
7346    components that need nullification.)  */
7347 
7348 gfc_expr *
gfc_expr_to_initialize(gfc_expr * e)7349 gfc_expr_to_initialize (gfc_expr *e)
7350 {
7351   gfc_expr *result;
7352   gfc_ref *ref;
7353   int i;
7354 
7355   result = gfc_copy_expr (e);
7356 
7357   /* Change the last array reference from AR_ELEMENT to AR_FULL.  */
7358   for (ref = result->ref; ref; ref = ref->next)
7359     if (ref->type == REF_ARRAY && ref->next == NULL)
7360       {
7361 	ref->u.ar.type = AR_FULL;
7362 
7363 	for (i = 0; i < ref->u.ar.dimen; i++)
7364 	  ref->u.ar.start[i] = ref->u.ar.end[i] = ref->u.ar.stride[i] = NULL;
7365 
7366 	break;
7367       }
7368 
7369   gfc_free_shape (&result->shape, result->rank);
7370 
7371   /* Recalculate rank, shape, etc.  */
7372   gfc_resolve_expr (result);
7373   return result;
7374 }
7375 
7376 
7377 /* If the last ref of an expression is an array ref, return a copy of the
7378    expression with that one removed.  Otherwise, a copy of the original
7379    expression.  This is used for allocate-expressions and pointer assignment
7380    LHS, where there may be an array specification that needs to be stripped
7381    off when using gfc_check_vardef_context.  */
7382 
7383 static gfc_expr*
remove_last_array_ref(gfc_expr * e)7384 remove_last_array_ref (gfc_expr* e)
7385 {
7386   gfc_expr* e2;
7387   gfc_ref** r;
7388 
7389   e2 = gfc_copy_expr (e);
7390   for (r = &e2->ref; *r; r = &(*r)->next)
7391     if ((*r)->type == REF_ARRAY && !(*r)->next)
7392       {
7393 	gfc_free_ref_list (*r);
7394 	*r = NULL;
7395 	break;
7396       }
7397 
7398   return e2;
7399 }
7400 
7401 
7402 /* Used in resolve_allocate_expr to check that a allocation-object and
7403    a source-expr are conformable.  This does not catch all possible
7404    cases; in particular a runtime checking is needed.  */
7405 
7406 static bool
conformable_arrays(gfc_expr * e1,gfc_expr * e2)7407 conformable_arrays (gfc_expr *e1, gfc_expr *e2)
7408 {
7409   gfc_ref *tail;
7410   for (tail = e2->ref; tail && tail->next; tail = tail->next);
7411 
7412   /* First compare rank.  */
7413   if ((tail && e1->rank != tail->u.ar.as->rank)
7414       || (!tail && e1->rank != e2->rank))
7415     {
7416       gfc_error ("Source-expr at %L must be scalar or have the "
7417 		 "same rank as the allocate-object at %L",
7418 		 &e1->where, &e2->where);
7419       return false;
7420     }
7421 
7422   if (e1->shape)
7423     {
7424       int i;
7425       mpz_t s;
7426 
7427       mpz_init (s);
7428 
7429       for (i = 0; i < e1->rank; i++)
7430 	{
7431 	  if (tail->u.ar.start[i] == NULL)
7432 	    break;
7433 
7434 	  if (tail->u.ar.end[i])
7435 	    {
7436 	      mpz_set (s, tail->u.ar.end[i]->value.integer);
7437 	      mpz_sub (s, s, tail->u.ar.start[i]->value.integer);
7438 	      mpz_add_ui (s, s, 1);
7439 	    }
7440 	  else
7441 	    {
7442 	      mpz_set (s, tail->u.ar.start[i]->value.integer);
7443 	    }
7444 
7445 	  if (mpz_cmp (e1->shape[i], s) != 0)
7446 	    {
7447 	      gfc_error ("Source-expr at %L and allocate-object at %L must "
7448 			 "have the same shape", &e1->where, &e2->where);
7449 	      mpz_clear (s);
7450    	      return false;
7451 	    }
7452 	}
7453 
7454       mpz_clear (s);
7455     }
7456 
7457   return true;
7458 }
7459 
7460 
7461 /* Resolve the expression in an ALLOCATE statement, doing the additional
7462    checks to see whether the expression is OK or not.  The expression must
7463    have a trailing array reference that gives the size of the array.  */
7464 
7465 static bool
resolve_allocate_expr(gfc_expr * e,gfc_code * code,bool * array_alloc_wo_spec)7466 resolve_allocate_expr (gfc_expr *e, gfc_code *code, bool *array_alloc_wo_spec)
7467 {
7468   int i, pointer, allocatable, dimension, is_abstract;
7469   int codimension;
7470   bool coindexed;
7471   bool unlimited;
7472   symbol_attribute attr;
7473   gfc_ref *ref, *ref2;
7474   gfc_expr *e2;
7475   gfc_array_ref *ar;
7476   gfc_symbol *sym = NULL;
7477   gfc_alloc *a;
7478   gfc_component *c;
7479   bool t;
7480 
7481   /* Mark the utmost array component as being in allocate to allow DIMEN_STAR
7482      checking of coarrays.  */
7483   for (ref = e->ref; ref; ref = ref->next)
7484     if (ref->next == NULL)
7485       break;
7486 
7487   if (ref && ref->type == REF_ARRAY)
7488     ref->u.ar.in_allocate = true;
7489 
7490   if (!gfc_resolve_expr (e))
7491     goto failure;
7492 
7493   /* Make sure the expression is allocatable or a pointer.  If it is
7494      pointer, the next-to-last reference must be a pointer.  */
7495 
7496   ref2 = NULL;
7497   if (e->symtree)
7498     sym = e->symtree->n.sym;
7499 
7500   /* Check whether ultimate component is abstract and CLASS.  */
7501   is_abstract = 0;
7502 
7503   /* Is the allocate-object unlimited polymorphic?  */
7504   unlimited = UNLIMITED_POLY(e);
7505 
7506   if (e->expr_type != EXPR_VARIABLE)
7507     {
7508       allocatable = 0;
7509       attr = gfc_expr_attr (e);
7510       pointer = attr.pointer;
7511       dimension = attr.dimension;
7512       codimension = attr.codimension;
7513     }
7514   else
7515     {
7516       if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
7517 	{
7518 	  allocatable = CLASS_DATA (sym)->attr.allocatable;
7519 	  pointer = CLASS_DATA (sym)->attr.class_pointer;
7520 	  dimension = CLASS_DATA (sym)->attr.dimension;
7521 	  codimension = CLASS_DATA (sym)->attr.codimension;
7522 	  is_abstract = CLASS_DATA (sym)->attr.abstract;
7523 	}
7524       else
7525 	{
7526 	  allocatable = sym->attr.allocatable;
7527 	  pointer = sym->attr.pointer;
7528 	  dimension = sym->attr.dimension;
7529 	  codimension = sym->attr.codimension;
7530 	}
7531 
7532       coindexed = false;
7533 
7534       for (ref = e->ref; ref; ref2 = ref, ref = ref->next)
7535 	{
7536 	  switch (ref->type)
7537 	    {
7538  	      case REF_ARRAY:
7539                 if (ref->u.ar.codimen > 0)
7540 		  {
7541 		    int n;
7542 		    for (n = ref->u.ar.dimen;
7543 			 n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
7544 		      if (ref->u.ar.dimen_type[n] != DIMEN_THIS_IMAGE)
7545 			{
7546 			  coindexed = true;
7547 			  break;
7548 			}
7549 		   }
7550 
7551 		if (ref->next != NULL)
7552 		  pointer = 0;
7553 		break;
7554 
7555 	      case REF_COMPONENT:
7556 		/* F2008, C644.  */
7557 		if (coindexed)
7558 		  {
7559 		    gfc_error ("Coindexed allocatable object at %L",
7560 			       &e->where);
7561 		    goto failure;
7562 		  }
7563 
7564 		c = ref->u.c.component;
7565 		if (c->ts.type == BT_CLASS)
7566 		  {
7567 		    allocatable = CLASS_DATA (c)->attr.allocatable;
7568 		    pointer = CLASS_DATA (c)->attr.class_pointer;
7569 		    dimension = CLASS_DATA (c)->attr.dimension;
7570 		    codimension = CLASS_DATA (c)->attr.codimension;
7571 		    is_abstract = CLASS_DATA (c)->attr.abstract;
7572 		  }
7573 		else
7574 		  {
7575 		    allocatable = c->attr.allocatable;
7576 		    pointer = c->attr.pointer;
7577 		    dimension = c->attr.dimension;
7578 		    codimension = c->attr.codimension;
7579 		    is_abstract = c->attr.abstract;
7580 		  }
7581 		break;
7582 
7583 	      case REF_SUBSTRING:
7584 	      case REF_INQUIRY:
7585 		allocatable = 0;
7586 		pointer = 0;
7587 		break;
7588 	    }
7589 	}
7590     }
7591 
7592   /* Check for F08:C628.  */
7593   if (allocatable == 0 && pointer == 0 && !unlimited)
7594     {
7595       gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",
7596 		 &e->where);
7597       goto failure;
7598     }
7599 
7600   /* Some checks for the SOURCE tag.  */
7601   if (code->expr3)
7602     {
7603       /* Check F03:C631.  */
7604       if (!gfc_type_compatible (&e->ts, &code->expr3->ts))
7605 	{
7606 	  gfc_error ("Type of entity at %L is type incompatible with "
7607 		     "source-expr at %L", &e->where, &code->expr3->where);
7608 	  goto failure;
7609 	}
7610 
7611       /* Check F03:C632 and restriction following Note 6.18.  */
7612       if (code->expr3->rank > 0 && !conformable_arrays (code->expr3, e))
7613 	goto failure;
7614 
7615       /* Check F03:C633.  */
7616       if (code->expr3->ts.kind != e->ts.kind && !unlimited)
7617 	{
7618 	  gfc_error ("The allocate-object at %L and the source-expr at %L "
7619 		     "shall have the same kind type parameter",
7620 		     &e->where, &code->expr3->where);
7621 	  goto failure;
7622 	}
7623 
7624       /* Check F2008, C642.  */
7625       if (code->expr3->ts.type == BT_DERIVED
7626 	  && ((codimension && gfc_expr_attr (code->expr3).lock_comp)
7627 	      || (code->expr3->ts.u.derived->from_intmod
7628 		     == INTMOD_ISO_FORTRAN_ENV
7629 		  && code->expr3->ts.u.derived->intmod_sym_id
7630 		     == ISOFORTRAN_LOCK_TYPE)))
7631 	{
7632 	  gfc_error ("The source-expr at %L shall neither be of type "
7633 		     "LOCK_TYPE nor have a LOCK_TYPE component if "
7634 		      "allocate-object at %L is a coarray",
7635 		      &code->expr3->where, &e->where);
7636 	  goto failure;
7637 	}
7638 
7639       /* Check TS18508, C702/C703.  */
7640       if (code->expr3->ts.type == BT_DERIVED
7641 	  && ((codimension && gfc_expr_attr (code->expr3).event_comp)
7642 	      || (code->expr3->ts.u.derived->from_intmod
7643 		     == INTMOD_ISO_FORTRAN_ENV
7644 		  && code->expr3->ts.u.derived->intmod_sym_id
7645 		     == ISOFORTRAN_EVENT_TYPE)))
7646 	{
7647 	  gfc_error ("The source-expr at %L shall neither be of type "
7648 		     "EVENT_TYPE nor have a EVENT_TYPE component if "
7649 		      "allocate-object at %L is a coarray",
7650 		      &code->expr3->where, &e->where);
7651 	  goto failure;
7652 	}
7653     }
7654 
7655   /* Check F08:C629.  */
7656   if (is_abstract && code->ext.alloc.ts.type == BT_UNKNOWN
7657       && !code->expr3)
7658     {
7659       gcc_assert (e->ts.type == BT_CLASS);
7660       gfc_error ("Allocating %s of ABSTRACT base type at %L requires a "
7661 		 "type-spec or source-expr", sym->name, &e->where);
7662       goto failure;
7663     }
7664 
7665   /* Check F08:C632.  */
7666   if (code->ext.alloc.ts.type == BT_CHARACTER && !e->ts.deferred
7667       && !UNLIMITED_POLY (e))
7668     {
7669       int cmp;
7670 
7671       if (!e->ts.u.cl->length)
7672 	goto failure;
7673 
7674       cmp = gfc_dep_compare_expr (e->ts.u.cl->length,
7675 				  code->ext.alloc.ts.u.cl->length);
7676       if (cmp == 1 || cmp == -1 || cmp == -3)
7677 	{
7678 	  gfc_error ("Allocating %s at %L with type-spec requires the same "
7679 		     "character-length parameter as in the declaration",
7680 		     sym->name, &e->where);
7681 	  goto failure;
7682 	}
7683     }
7684 
7685   /* In the variable definition context checks, gfc_expr_attr is used
7686      on the expression.  This is fooled by the array specification
7687      present in e, thus we have to eliminate that one temporarily.  */
7688   e2 = remove_last_array_ref (e);
7689   t = true;
7690   if (t && pointer)
7691     t = gfc_check_vardef_context (e2, true, true, false,
7692 				  _("ALLOCATE object"));
7693   if (t)
7694     t = gfc_check_vardef_context (e2, false, true, false,
7695 				  _("ALLOCATE object"));
7696   gfc_free_expr (e2);
7697   if (!t)
7698     goto failure;
7699 
7700   if (e->ts.type == BT_CLASS && CLASS_DATA (e)->attr.dimension
7701 	&& !code->expr3 && code->ext.alloc.ts.type == BT_DERIVED)
7702     {
7703       /* For class arrays, the initialization with SOURCE is done
7704 	 using _copy and trans_call. It is convenient to exploit that
7705 	 when the allocated type is different from the declared type but
7706 	 no SOURCE exists by setting expr3.  */
7707       code->expr3 = gfc_default_initializer (&code->ext.alloc.ts);
7708     }
7709   else if (flag_coarray != GFC_FCOARRAY_LIB && e->ts.type == BT_DERIVED
7710 	   && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
7711 	   && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
7712     {
7713       /* We have to zero initialize the integer variable.  */
7714       code->expr3 = gfc_get_int_expr (gfc_default_integer_kind, &e->where, 0);
7715     }
7716 
7717   if (e->ts.type == BT_CLASS && !unlimited && !UNLIMITED_POLY (code->expr3))
7718     {
7719       /* Make sure the vtab symbol is present when
7720 	 the module variables are generated.  */
7721       gfc_typespec ts = e->ts;
7722       if (code->expr3)
7723 	ts = code->expr3->ts;
7724       else if (code->ext.alloc.ts.type == BT_DERIVED)
7725 	ts = code->ext.alloc.ts;
7726 
7727       /* Finding the vtab also publishes the type's symbol.  Therefore this
7728 	 statement is necessary.  */
7729       gfc_find_derived_vtab (ts.u.derived);
7730     }
7731   else if (unlimited && !UNLIMITED_POLY (code->expr3))
7732     {
7733       /* Again, make sure the vtab symbol is present when
7734 	 the module variables are generated.  */
7735       gfc_typespec *ts = NULL;
7736       if (code->expr3)
7737 	ts = &code->expr3->ts;
7738       else
7739 	ts = &code->ext.alloc.ts;
7740 
7741       gcc_assert (ts);
7742 
7743       /* Finding the vtab also publishes the type's symbol.  Therefore this
7744 	 statement is necessary.  */
7745       gfc_find_vtab (ts);
7746     }
7747 
7748   if (dimension == 0 && codimension == 0)
7749     goto success;
7750 
7751   /* Make sure the last reference node is an array specification.  */
7752 
7753   if (!ref2 || ref2->type != REF_ARRAY || ref2->u.ar.type == AR_FULL
7754       || (dimension && ref2->u.ar.dimen == 0))
7755     {
7756       /* F08:C633.  */
7757       if (code->expr3)
7758 	{
7759 	  if (!gfc_notify_std (GFC_STD_F2008, "Array specification required "
7760 			       "in ALLOCATE statement at %L", &e->where))
7761 	    goto failure;
7762 	  if (code->expr3->rank != 0)
7763 	    *array_alloc_wo_spec = true;
7764 	  else
7765 	    {
7766 	      gfc_error ("Array specification or array-valued SOURCE= "
7767 			 "expression required in ALLOCATE statement at %L",
7768 			 &e->where);
7769 	      goto failure;
7770 	    }
7771 	}
7772       else
7773 	{
7774 	  gfc_error ("Array specification required in ALLOCATE statement "
7775 		     "at %L", &e->where);
7776 	  goto failure;
7777 	}
7778     }
7779 
7780   /* Make sure that the array section reference makes sense in the
7781      context of an ALLOCATE specification.  */
7782 
7783   ar = &ref2->u.ar;
7784 
7785   if (codimension)
7786     for (i = ar->dimen; i < ar->dimen + ar->codimen; i++)
7787       {
7788 	switch (ar->dimen_type[i])
7789 	  {
7790 	  case DIMEN_THIS_IMAGE:
7791 	    gfc_error ("Coarray specification required in ALLOCATE statement "
7792 		       "at %L", &e->where);
7793 	    goto failure;
7794 
7795 	  case  DIMEN_RANGE:
7796 	    if (ar->start[i] == 0 || ar->end[i] == 0)
7797 	      {
7798 		/* If ar->stride[i] is NULL, we issued a previous error.  */
7799 		if (ar->stride[i] == NULL)
7800 		  gfc_error ("Bad array specification in ALLOCATE statement "
7801 			     "at %L", &e->where);
7802 		goto failure;
7803 	      }
7804 	    else if (gfc_dep_compare_expr (ar->start[i], ar->end[i]) == 1)
7805 	      {
7806 		gfc_error ("Upper cobound is less than lower cobound at %L",
7807 			   &ar->start[i]->where);
7808 		goto failure;
7809 	      }
7810 	    break;
7811 
7812 	  case DIMEN_ELEMENT:
7813 	    if (ar->start[i]->expr_type == EXPR_CONSTANT)
7814 	      {
7815 		gcc_assert (ar->start[i]->ts.type == BT_INTEGER);
7816 		if (mpz_cmp_si (ar->start[i]->value.integer, 1) < 0)
7817 		  {
7818 		    gfc_error ("Upper cobound is less than lower cobound "
7819 			       "of 1 at %L", &ar->start[i]->where);
7820 		    goto failure;
7821 		  }
7822 	      }
7823 	    break;
7824 
7825 	  case DIMEN_STAR:
7826 	    break;
7827 
7828 	  default:
7829 	    gfc_error ("Bad array specification in ALLOCATE statement at %L",
7830 		       &e->where);
7831 	    goto failure;
7832 
7833 	  }
7834       }
7835   for (i = 0; i < ar->dimen; i++)
7836     {
7837       if (ar->type == AR_ELEMENT || ar->type == AR_FULL)
7838 	goto check_symbols;
7839 
7840       switch (ar->dimen_type[i])
7841 	{
7842 	case DIMEN_ELEMENT:
7843 	  break;
7844 
7845 	case DIMEN_RANGE:
7846 	  if (ar->start[i] != NULL
7847 	      && ar->end[i] != NULL
7848 	      && ar->stride[i] == NULL)
7849 	    break;
7850 
7851 	  /* Fall through.  */
7852 
7853 	case DIMEN_UNKNOWN:
7854 	case DIMEN_VECTOR:
7855 	case DIMEN_STAR:
7856 	case DIMEN_THIS_IMAGE:
7857 	  gfc_error ("Bad array specification in ALLOCATE statement at %L",
7858 		     &e->where);
7859 	  goto failure;
7860 	}
7861 
7862 check_symbols:
7863       for (a = code->ext.alloc.list; a; a = a->next)
7864 	{
7865 	  sym = a->expr->symtree->n.sym;
7866 
7867 	  /* TODO - check derived type components.  */
7868 	  if (gfc_bt_struct (sym->ts.type) || sym->ts.type == BT_CLASS)
7869 	    continue;
7870 
7871 	  if ((ar->start[i] != NULL
7872 	       && gfc_find_sym_in_expr (sym, ar->start[i]))
7873 	      || (ar->end[i] != NULL
7874 		  && gfc_find_sym_in_expr (sym, ar->end[i])))
7875 	    {
7876 	      gfc_error ("%qs must not appear in the array specification at "
7877 			 "%L in the same ALLOCATE statement where it is "
7878 			 "itself allocated", sym->name, &ar->where);
7879 	      goto failure;
7880 	    }
7881 	}
7882     }
7883 
7884   for (i = ar->dimen; i < ar->codimen + ar->dimen; i++)
7885     {
7886       if (ar->dimen_type[i] == DIMEN_ELEMENT
7887 	  || ar->dimen_type[i] == DIMEN_RANGE)
7888 	{
7889 	  if (i == (ar->dimen + ar->codimen - 1))
7890 	    {
7891 	      gfc_error ("Expected '*' in coindex specification in ALLOCATE "
7892 			 "statement at %L", &e->where);
7893 	      goto failure;
7894 	    }
7895 	  continue;
7896 	}
7897 
7898       if (ar->dimen_type[i] == DIMEN_STAR && i == (ar->dimen + ar->codimen - 1)
7899 	  && ar->stride[i] == NULL)
7900 	break;
7901 
7902       gfc_error ("Bad coarray specification in ALLOCATE statement at %L",
7903 		 &e->where);
7904       goto failure;
7905     }
7906 
7907 success:
7908   return true;
7909 
7910 failure:
7911   return false;
7912 }
7913 
7914 
7915 static void
resolve_allocate_deallocate(gfc_code * code,const char * fcn)7916 resolve_allocate_deallocate (gfc_code *code, const char *fcn)
7917 {
7918   gfc_expr *stat, *errmsg, *pe, *qe;
7919   gfc_alloc *a, *p, *q;
7920 
7921   stat = code->expr1;
7922   errmsg = code->expr2;
7923 
7924   /* Check the stat variable.  */
7925   if (stat)
7926     {
7927       gfc_check_vardef_context (stat, false, false, false,
7928 				_("STAT variable"));
7929 
7930       if ((stat->ts.type != BT_INTEGER
7931 	   && !(stat->ref && (stat->ref->type == REF_ARRAY
7932 			      || stat->ref->type == REF_COMPONENT)))
7933 	  || stat->rank > 0)
7934 	gfc_error ("Stat-variable at %L must be a scalar INTEGER "
7935 		   "variable", &stat->where);
7936 
7937       for (p = code->ext.alloc.list; p; p = p->next)
7938 	if (p->expr->symtree->n.sym->name == stat->symtree->n.sym->name)
7939 	  {
7940 	    gfc_ref *ref1, *ref2;
7941 	    bool found = true;
7942 
7943 	    for (ref1 = p->expr->ref, ref2 = stat->ref; ref1 && ref2;
7944 		 ref1 = ref1->next, ref2 = ref2->next)
7945 	      {
7946 		if (ref1->type != REF_COMPONENT || ref2->type != REF_COMPONENT)
7947 		  continue;
7948 		if (ref1->u.c.component->name != ref2->u.c.component->name)
7949 		  {
7950 		    found = false;
7951 		    break;
7952 		  }
7953 	      }
7954 
7955 	    if (found)
7956 	      {
7957 		gfc_error ("Stat-variable at %L shall not be %sd within "
7958 			   "the same %s statement", &stat->where, fcn, fcn);
7959 		break;
7960 	      }
7961 	  }
7962     }
7963 
7964   /* Check the errmsg variable.  */
7965   if (errmsg)
7966     {
7967       if (!stat)
7968 	gfc_warning (0, "ERRMSG at %L is useless without a STAT tag",
7969 		     &errmsg->where);
7970 
7971       gfc_check_vardef_context (errmsg, false, false, false,
7972 				_("ERRMSG variable"));
7973 
7974       /* F18:R928  alloc-opt             is ERRMSG = errmsg-variable
7975 	 F18:R930  errmsg-variable       is scalar-default-char-variable
7976 	 F18:R906  default-char-variable is variable
7977 	 F18:C906  default-char-variable shall be default character.  */
7978       if ((errmsg->ts.type != BT_CHARACTER
7979 	   && !(errmsg->ref
7980 		&& (errmsg->ref->type == REF_ARRAY
7981 		    || errmsg->ref->type == REF_COMPONENT)))
7982 	  || errmsg->rank > 0
7983 	  || errmsg->ts.kind != gfc_default_character_kind)
7984 	gfc_error ("ERRMSG variable at %L shall be a scalar default CHARACTER "
7985 		   "variable", &errmsg->where);
7986 
7987       for (p = code->ext.alloc.list; p; p = p->next)
7988 	if (p->expr->symtree->n.sym->name == errmsg->symtree->n.sym->name)
7989 	  {
7990 	    gfc_ref *ref1, *ref2;
7991 	    bool found = true;
7992 
7993 	    for (ref1 = p->expr->ref, ref2 = errmsg->ref; ref1 && ref2;
7994 		 ref1 = ref1->next, ref2 = ref2->next)
7995 	      {
7996 		if (ref1->type != REF_COMPONENT || ref2->type != REF_COMPONENT)
7997 		  continue;
7998 		if (ref1->u.c.component->name != ref2->u.c.component->name)
7999 		  {
8000 		    found = false;
8001 		    break;
8002 		  }
8003 	      }
8004 
8005 	    if (found)
8006 	      {
8007 		gfc_error ("Errmsg-variable at %L shall not be %sd within "
8008 			   "the same %s statement", &errmsg->where, fcn, fcn);
8009 		break;
8010 	      }
8011 	  }
8012     }
8013 
8014   /* Check that an allocate-object appears only once in the statement.  */
8015 
8016   for (p = code->ext.alloc.list; p; p = p->next)
8017     {
8018       pe = p->expr;
8019       for (q = p->next; q; q = q->next)
8020 	{
8021 	  qe = q->expr;
8022 	  if (pe->symtree->n.sym->name == qe->symtree->n.sym->name)
8023 	    {
8024 	      /* This is a potential collision.  */
8025 	      gfc_ref *pr = pe->ref;
8026 	      gfc_ref *qr = qe->ref;
8027 
8028 	      /* Follow the references  until
8029 		 a) They start to differ, in which case there is no error;
8030 		 you can deallocate a%b and a%c in a single statement
8031 		 b) Both of them stop, which is an error
8032 		 c) One of them stops, which is also an error.  */
8033 	      while (1)
8034 		{
8035 		  if (pr == NULL && qr == NULL)
8036 		    {
8037 		      gfc_error ("Allocate-object at %L also appears at %L",
8038 				 &pe->where, &qe->where);
8039 		      break;
8040 		    }
8041 		  else if (pr != NULL && qr == NULL)
8042 		    {
8043 		      gfc_error ("Allocate-object at %L is subobject of"
8044 				 " object at %L", &pe->where, &qe->where);
8045 		      break;
8046 		    }
8047 		  else if (pr == NULL && qr != NULL)
8048 		    {
8049 		      gfc_error ("Allocate-object at %L is subobject of"
8050 				 " object at %L", &qe->where, &pe->where);
8051 		      break;
8052 		    }
8053 		  /* Here, pr != NULL && qr != NULL  */
8054 		  gcc_assert(pr->type == qr->type);
8055 		  if (pr->type == REF_ARRAY)
8056 		    {
8057 		      /* Handle cases like allocate(v(3)%x(3), v(2)%x(3)),
8058 			 which are legal.  */
8059 		      gcc_assert (qr->type == REF_ARRAY);
8060 
8061 		      if (pr->next && qr->next)
8062 			{
8063 			  int i;
8064 			  gfc_array_ref *par = &(pr->u.ar);
8065 			  gfc_array_ref *qar = &(qr->u.ar);
8066 
8067 			  for (i=0; i<par->dimen; i++)
8068 			    {
8069 			      if ((par->start[i] != NULL
8070 				   || qar->start[i] != NULL)
8071 				  && gfc_dep_compare_expr (par->start[i],
8072 							   qar->start[i]) != 0)
8073 				goto break_label;
8074 			    }
8075 			}
8076 		    }
8077 		  else
8078 		    {
8079 		      if (pr->u.c.component->name != qr->u.c.component->name)
8080 			break;
8081 		    }
8082 
8083 		  pr = pr->next;
8084 		  qr = qr->next;
8085 		}
8086 	    break_label:
8087 	      ;
8088 	    }
8089 	}
8090     }
8091 
8092   if (strcmp (fcn, "ALLOCATE") == 0)
8093     {
8094       bool arr_alloc_wo_spec = false;
8095 
8096       /* Resolving the expr3 in the loop over all objects to allocate would
8097 	 execute loop invariant code for each loop item.  Therefore do it just
8098 	 once here.  */
8099       if (code->expr3 && code->expr3->mold
8100 	  && code->expr3->ts.type == BT_DERIVED)
8101 	{
8102 	  /* Default initialization via MOLD (non-polymorphic).  */
8103 	  gfc_expr *rhs = gfc_default_initializer (&code->expr3->ts);
8104 	  if (rhs != NULL)
8105 	    {
8106 	      gfc_resolve_expr (rhs);
8107 	      gfc_free_expr (code->expr3);
8108 	      code->expr3 = rhs;
8109 	    }
8110 	}
8111       for (a = code->ext.alloc.list; a; a = a->next)
8112 	resolve_allocate_expr (a->expr, code, &arr_alloc_wo_spec);
8113 
8114       if (arr_alloc_wo_spec && code->expr3)
8115 	{
8116 	  /* Mark the allocate to have to take the array specification
8117 	     from the expr3.  */
8118 	  code->ext.alloc.arr_spec_from_expr3 = 1;
8119 	}
8120     }
8121   else
8122     {
8123       for (a = code->ext.alloc.list; a; a = a->next)
8124 	resolve_deallocate_expr (a->expr);
8125     }
8126 }
8127 
8128 
8129 /************ SELECT CASE resolution subroutines ************/
8130 
8131 /* Callback function for our mergesort variant.  Determines interval
8132    overlaps for CASEs. Return <0 if op1 < op2, 0 for overlap, >0 for
8133    op1 > op2.  Assumes we're not dealing with the default case.
8134    We have op1 = (:L), (K:L) or (K:) and op2 = (:N), (M:N) or (M:).
8135    There are nine situations to check.  */
8136 
8137 static int
compare_cases(const gfc_case * op1,const gfc_case * op2)8138 compare_cases (const gfc_case *op1, const gfc_case *op2)
8139 {
8140   int retval;
8141 
8142   if (op1->low == NULL) /* op1 = (:L)  */
8143     {
8144       /* op2 = (:N), so overlap.  */
8145       retval = 0;
8146       /* op2 = (M:) or (M:N),  L < M  */
8147       if (op2->low != NULL
8148 	  && gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
8149 	retval = -1;
8150     }
8151   else if (op1->high == NULL) /* op1 = (K:)  */
8152     {
8153       /* op2 = (M:), so overlap.  */
8154       retval = 0;
8155       /* op2 = (:N) or (M:N), K > N  */
8156       if (op2->high != NULL
8157 	  && gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
8158 	retval = 1;
8159     }
8160   else /* op1 = (K:L)  */
8161     {
8162       if (op2->low == NULL)       /* op2 = (:N), K > N  */
8163 	retval = (gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
8164 		 ? 1 : 0;
8165       else if (op2->high == NULL) /* op2 = (M:), L < M  */
8166 	retval = (gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
8167 		 ? -1 : 0;
8168       else			/* op2 = (M:N)  */
8169 	{
8170 	  retval =  0;
8171 	  /* L < M  */
8172 	  if (gfc_compare_expr (op1->high, op2->low, INTRINSIC_LT) < 0)
8173 	    retval =  -1;
8174 	  /* K > N  */
8175 	  else if (gfc_compare_expr (op1->low, op2->high, INTRINSIC_GT) > 0)
8176 	    retval =  1;
8177 	}
8178     }
8179 
8180   return retval;
8181 }
8182 
8183 
8184 /* Merge-sort a double linked case list, detecting overlap in the
8185    process.  LIST is the head of the double linked case list before it
8186    is sorted.  Returns the head of the sorted list if we don't see any
8187    overlap, or NULL otherwise.  */
8188 
8189 static gfc_case *
check_case_overlap(gfc_case * list)8190 check_case_overlap (gfc_case *list)
8191 {
8192   gfc_case *p, *q, *e, *tail;
8193   int insize, nmerges, psize, qsize, cmp, overlap_seen;
8194 
8195   /* If the passed list was empty, return immediately.  */
8196   if (!list)
8197     return NULL;
8198 
8199   overlap_seen = 0;
8200   insize = 1;
8201 
8202   /* Loop unconditionally.  The only exit from this loop is a return
8203      statement, when we've finished sorting the case list.  */
8204   for (;;)
8205     {
8206       p = list;
8207       list = NULL;
8208       tail = NULL;
8209 
8210       /* Count the number of merges we do in this pass.  */
8211       nmerges = 0;
8212 
8213       /* Loop while there exists a merge to be done.  */
8214       while (p)
8215 	{
8216 	  int i;
8217 
8218 	  /* Count this merge.  */
8219 	  nmerges++;
8220 
8221 	  /* Cut the list in two pieces by stepping INSIZE places
8222 	     forward in the list, starting from P.  */
8223 	  psize = 0;
8224 	  q = p;
8225 	  for (i = 0; i < insize; i++)
8226 	    {
8227 	      psize++;
8228 	      q = q->right;
8229 	      if (!q)
8230 		break;
8231 	    }
8232 	  qsize = insize;
8233 
8234 	  /* Now we have two lists.  Merge them!  */
8235 	  while (psize > 0 || (qsize > 0 && q != NULL))
8236 	    {
8237 	      /* See from which the next case to merge comes from.  */
8238 	      if (psize == 0)
8239 		{
8240 		  /* P is empty so the next case must come from Q.  */
8241 		  e = q;
8242 		  q = q->right;
8243 		  qsize--;
8244 		}
8245 	      else if (qsize == 0 || q == NULL)
8246 		{
8247 		  /* Q is empty.  */
8248 		  e = p;
8249 		  p = p->right;
8250 		  psize--;
8251 		}
8252 	      else
8253 		{
8254 		  cmp = compare_cases (p, q);
8255 		  if (cmp < 0)
8256 		    {
8257 		      /* The whole case range for P is less than the
8258 			 one for Q.  */
8259 		      e = p;
8260 		      p = p->right;
8261 		      psize--;
8262 		    }
8263 		  else if (cmp > 0)
8264 		    {
8265 		      /* The whole case range for Q is greater than
8266 			 the case range for P.  */
8267 		      e = q;
8268 		      q = q->right;
8269 		      qsize--;
8270 		    }
8271 		  else
8272 		    {
8273 		      /* The cases overlap, or they are the same
8274 			 element in the list.  Either way, we must
8275 			 issue an error and get the next case from P.  */
8276 		      /* FIXME: Sort P and Q by line number.  */
8277 		      gfc_error ("CASE label at %L overlaps with CASE "
8278 				 "label at %L", &p->where, &q->where);
8279 		      overlap_seen = 1;
8280 		      e = p;
8281 		      p = p->right;
8282 		      psize--;
8283 		    }
8284 		}
8285 
8286 		/* Add the next element to the merged list.  */
8287 	      if (tail)
8288 		tail->right = e;
8289 	      else
8290 		list = e;
8291 	      e->left = tail;
8292 	      tail = e;
8293 	    }
8294 
8295 	  /* P has now stepped INSIZE places along, and so has Q.  So
8296 	     they're the same.  */
8297 	  p = q;
8298 	}
8299       tail->right = NULL;
8300 
8301       /* If we have done only one merge or none at all, we've
8302 	 finished sorting the cases.  */
8303       if (nmerges <= 1)
8304 	{
8305 	  if (!overlap_seen)
8306 	    return list;
8307 	  else
8308 	    return NULL;
8309 	}
8310 
8311       /* Otherwise repeat, merging lists twice the size.  */
8312       insize *= 2;
8313     }
8314 }
8315 
8316 
8317 /* Check to see if an expression is suitable for use in a CASE statement.
8318    Makes sure that all case expressions are scalar constants of the same
8319    type.  Return false if anything is wrong.  */
8320 
8321 static bool
validate_case_label_expr(gfc_expr * e,gfc_expr * case_expr)8322 validate_case_label_expr (gfc_expr *e, gfc_expr *case_expr)
8323 {
8324   if (e == NULL) return true;
8325 
8326   if (e->ts.type != case_expr->ts.type)
8327     {
8328       gfc_error ("Expression in CASE statement at %L must be of type %s",
8329 		 &e->where, gfc_basic_typename (case_expr->ts.type));
8330       return false;
8331     }
8332 
8333   /* C805 (R808) For a given case-construct, each case-value shall be of
8334      the same type as case-expr.  For character type, length differences
8335      are allowed, but the kind type parameters shall be the same.  */
8336 
8337   if (case_expr->ts.type == BT_CHARACTER && e->ts.kind != case_expr->ts.kind)
8338     {
8339       gfc_error ("Expression in CASE statement at %L must be of kind %d",
8340 		 &e->where, case_expr->ts.kind);
8341       return false;
8342     }
8343 
8344   /* Convert the case value kind to that of case expression kind,
8345      if needed */
8346 
8347   if (e->ts.kind != case_expr->ts.kind)
8348     gfc_convert_type_warn (e, &case_expr->ts, 2, 0);
8349 
8350   if (e->rank != 0)
8351     {
8352       gfc_error ("Expression in CASE statement at %L must be scalar",
8353 		 &e->where);
8354       return false;
8355     }
8356 
8357   return true;
8358 }
8359 
8360 
8361 /* Given a completely parsed select statement, we:
8362 
8363      - Validate all expressions and code within the SELECT.
8364      - Make sure that the selection expression is not of the wrong type.
8365      - Make sure that no case ranges overlap.
8366      - Eliminate unreachable cases and unreachable code resulting from
8367        removing case labels.
8368 
8369    The standard does allow unreachable cases, e.g. CASE (5:3).  But
8370    they are a hassle for code generation, and to prevent that, we just
8371    cut them out here.  This is not necessary for overlapping cases
8372    because they are illegal and we never even try to generate code.
8373 
8374    We have the additional caveat that a SELECT construct could have
8375    been a computed GOTO in the source code. Fortunately we can fairly
8376    easily work around that here: The case_expr for a "real" SELECT CASE
8377    is in code->expr1, but for a computed GOTO it is in code->expr2. All
8378    we have to do is make sure that the case_expr is a scalar integer
8379    expression.  */
8380 
8381 static void
resolve_select(gfc_code * code,bool select_type)8382 resolve_select (gfc_code *code, bool select_type)
8383 {
8384   gfc_code *body;
8385   gfc_expr *case_expr;
8386   gfc_case *cp, *default_case, *tail, *head;
8387   int seen_unreachable;
8388   int seen_logical;
8389   int ncases;
8390   bt type;
8391   bool t;
8392 
8393   if (code->expr1 == NULL)
8394     {
8395       /* This was actually a computed GOTO statement.  */
8396       case_expr = code->expr2;
8397       if (case_expr->ts.type != BT_INTEGER|| case_expr->rank != 0)
8398 	gfc_error ("Selection expression in computed GOTO statement "
8399 		   "at %L must be a scalar integer expression",
8400 		   &case_expr->where);
8401 
8402       /* Further checking is not necessary because this SELECT was built
8403 	 by the compiler, so it should always be OK.  Just move the
8404 	 case_expr from expr2 to expr so that we can handle computed
8405 	 GOTOs as normal SELECTs from here on.  */
8406       code->expr1 = code->expr2;
8407       code->expr2 = NULL;
8408       return;
8409     }
8410 
8411   case_expr = code->expr1;
8412   type = case_expr->ts.type;
8413 
8414   /* F08:C830.  */
8415   if (type != BT_LOGICAL && type != BT_INTEGER && type != BT_CHARACTER)
8416     {
8417       gfc_error ("Argument of SELECT statement at %L cannot be %s",
8418 		 &case_expr->where, gfc_typename (&case_expr->ts));
8419 
8420       /* Punt. Going on here just produce more garbage error messages.  */
8421       return;
8422     }
8423 
8424   /* F08:R842.  */
8425   if (!select_type && case_expr->rank != 0)
8426     {
8427       gfc_error ("Argument of SELECT statement at %L must be a scalar "
8428 		 "expression", &case_expr->where);
8429 
8430       /* Punt.  */
8431       return;
8432     }
8433 
8434   /* Raise a warning if an INTEGER case value exceeds the range of
8435      the case-expr. Later, all expressions will be promoted to the
8436      largest kind of all case-labels.  */
8437 
8438   if (type == BT_INTEGER)
8439     for (body = code->block; body; body = body->block)
8440       for (cp = body->ext.block.case_list; cp; cp = cp->next)
8441 	{
8442 	  if (cp->low
8443 	      && gfc_check_integer_range (cp->low->value.integer,
8444 					  case_expr->ts.kind) != ARITH_OK)
8445 	    gfc_warning (0, "Expression in CASE statement at %L is "
8446 			 "not in the range of %s", &cp->low->where,
8447 			 gfc_typename (&case_expr->ts));
8448 
8449 	  if (cp->high
8450 	      && cp->low != cp->high
8451 	      && gfc_check_integer_range (cp->high->value.integer,
8452 					  case_expr->ts.kind) != ARITH_OK)
8453 	    gfc_warning (0, "Expression in CASE statement at %L is "
8454 			 "not in the range of %s", &cp->high->where,
8455 			 gfc_typename (&case_expr->ts));
8456 	}
8457 
8458   /* PR 19168 has a long discussion concerning a mismatch of the kinds
8459      of the SELECT CASE expression and its CASE values.  Walk the lists
8460      of case values, and if we find a mismatch, promote case_expr to
8461      the appropriate kind.  */
8462 
8463   if (type == BT_LOGICAL || type == BT_INTEGER)
8464     {
8465       for (body = code->block; body; body = body->block)
8466 	{
8467 	  /* Walk the case label list.  */
8468 	  for (cp = body->ext.block.case_list; cp; cp = cp->next)
8469 	    {
8470 	      /* Intercept the DEFAULT case.  It does not have a kind.  */
8471 	      if (cp->low == NULL && cp->high == NULL)
8472 		continue;
8473 
8474 	      /* Unreachable case ranges are discarded, so ignore.  */
8475 	      if (cp->low != NULL && cp->high != NULL
8476 		  && cp->low != cp->high
8477 		  && gfc_compare_expr (cp->low, cp->high, INTRINSIC_GT) > 0)
8478 		continue;
8479 
8480 	      if (cp->low != NULL
8481 		  && case_expr->ts.kind != gfc_kind_max(case_expr, cp->low))
8482 		gfc_convert_type_warn (case_expr, &cp->low->ts, 2, 0);
8483 
8484 	      if (cp->high != NULL
8485 		  && case_expr->ts.kind != gfc_kind_max(case_expr, cp->high))
8486 		gfc_convert_type_warn (case_expr, &cp->high->ts, 2, 0);
8487 	    }
8488 	 }
8489     }
8490 
8491   /* Assume there is no DEFAULT case.  */
8492   default_case = NULL;
8493   head = tail = NULL;
8494   ncases = 0;
8495   seen_logical = 0;
8496 
8497   for (body = code->block; body; body = body->block)
8498     {
8499       /* Assume the CASE list is OK, and all CASE labels can be matched.  */
8500       t = true;
8501       seen_unreachable = 0;
8502 
8503       /* Walk the case label list, making sure that all case labels
8504 	 are legal.  */
8505       for (cp = body->ext.block.case_list; cp; cp = cp->next)
8506 	{
8507 	  /* Count the number of cases in the whole construct.  */
8508 	  ncases++;
8509 
8510 	  /* Intercept the DEFAULT case.  */
8511 	  if (cp->low == NULL && cp->high == NULL)
8512 	    {
8513 	      if (default_case != NULL)
8514 		{
8515 		  gfc_error ("The DEFAULT CASE at %L cannot be followed "
8516 			     "by a second DEFAULT CASE at %L",
8517 			     &default_case->where, &cp->where);
8518 		  t = false;
8519 		  break;
8520 		}
8521 	      else
8522 		{
8523 		  default_case = cp;
8524 		  continue;
8525 		}
8526 	    }
8527 
8528 	  /* Deal with single value cases and case ranges.  Errors are
8529 	     issued from the validation function.  */
8530 	  if (!validate_case_label_expr (cp->low, case_expr)
8531 	      || !validate_case_label_expr (cp->high, case_expr))
8532 	    {
8533 	      t = false;
8534 	      break;
8535 	    }
8536 
8537 	  if (type == BT_LOGICAL
8538 	      && ((cp->low == NULL || cp->high == NULL)
8539 		  || cp->low != cp->high))
8540 	    {
8541 	      gfc_error ("Logical range in CASE statement at %L is not "
8542 			 "allowed", &cp->low->where);
8543 	      t = false;
8544 	      break;
8545 	    }
8546 
8547 	  if (type == BT_LOGICAL && cp->low->expr_type == EXPR_CONSTANT)
8548 	    {
8549 	      int value;
8550 	      value = cp->low->value.logical == 0 ? 2 : 1;
8551 	      if (value & seen_logical)
8552 		{
8553 		  gfc_error ("Constant logical value in CASE statement "
8554 			     "is repeated at %L",
8555 			     &cp->low->where);
8556 		  t = false;
8557 		  break;
8558 		}
8559 	      seen_logical |= value;
8560 	    }
8561 
8562 	  if (cp->low != NULL && cp->high != NULL
8563 	      && cp->low != cp->high
8564 	      && gfc_compare_expr (cp->low, cp->high, INTRINSIC_GT) > 0)
8565 	    {
8566 	      if (warn_surprising)
8567 		gfc_warning (OPT_Wsurprising,
8568 			     "Range specification at %L can never be matched",
8569 			     &cp->where);
8570 
8571 	      cp->unreachable = 1;
8572 	      seen_unreachable = 1;
8573 	    }
8574 	  else
8575 	    {
8576 	      /* If the case range can be matched, it can also overlap with
8577 		 other cases.  To make sure it does not, we put it in a
8578 		 double linked list here.  We sort that with a merge sort
8579 		 later on to detect any overlapping cases.  */
8580 	      if (!head)
8581 		{
8582 		  head = tail = cp;
8583 		  head->right = head->left = NULL;
8584 		}
8585 	      else
8586 		{
8587 		  tail->right = cp;
8588 		  tail->right->left = tail;
8589 		  tail = tail->right;
8590 		  tail->right = NULL;
8591 		}
8592 	    }
8593 	}
8594 
8595       /* It there was a failure in the previous case label, give up
8596 	 for this case label list.  Continue with the next block.  */
8597       if (!t)
8598 	continue;
8599 
8600       /* See if any case labels that are unreachable have been seen.
8601 	 If so, we eliminate them.  This is a bit of a kludge because
8602 	 the case lists for a single case statement (label) is a
8603 	 single forward linked lists.  */
8604       if (seen_unreachable)
8605       {
8606 	/* Advance until the first case in the list is reachable.  */
8607 	while (body->ext.block.case_list != NULL
8608 	       && body->ext.block.case_list->unreachable)
8609 	  {
8610 	    gfc_case *n = body->ext.block.case_list;
8611 	    body->ext.block.case_list = body->ext.block.case_list->next;
8612 	    n->next = NULL;
8613 	    gfc_free_case_list (n);
8614 	  }
8615 
8616 	/* Strip all other unreachable cases.  */
8617 	if (body->ext.block.case_list)
8618 	  {
8619 	    for (cp = body->ext.block.case_list; cp && cp->next; cp = cp->next)
8620 	      {
8621 		if (cp->next->unreachable)
8622 		  {
8623 		    gfc_case *n = cp->next;
8624 		    cp->next = cp->next->next;
8625 		    n->next = NULL;
8626 		    gfc_free_case_list (n);
8627 		  }
8628 	      }
8629 	  }
8630       }
8631     }
8632 
8633   /* See if there were overlapping cases.  If the check returns NULL,
8634      there was overlap.  In that case we don't do anything.  If head
8635      is non-NULL, we prepend the DEFAULT case.  The sorted list can
8636      then used during code generation for SELECT CASE constructs with
8637      a case expression of a CHARACTER type.  */
8638   if (head)
8639     {
8640       head = check_case_overlap (head);
8641 
8642       /* Prepend the default_case if it is there.  */
8643       if (head != NULL && default_case)
8644 	{
8645 	  default_case->left = NULL;
8646 	  default_case->right = head;
8647 	  head->left = default_case;
8648 	}
8649     }
8650 
8651   /* Eliminate dead blocks that may be the result if we've seen
8652      unreachable case labels for a block.  */
8653   for (body = code; body && body->block; body = body->block)
8654     {
8655       if (body->block->ext.block.case_list == NULL)
8656 	{
8657 	  /* Cut the unreachable block from the code chain.  */
8658 	  gfc_code *c = body->block;
8659 	  body->block = c->block;
8660 
8661 	  /* Kill the dead block, but not the blocks below it.  */
8662 	  c->block = NULL;
8663 	  gfc_free_statements (c);
8664 	}
8665     }
8666 
8667   /* More than two cases is legal but insane for logical selects.
8668      Issue a warning for it.  */
8669   if (warn_surprising && type == BT_LOGICAL && ncases > 2)
8670     gfc_warning (OPT_Wsurprising,
8671 		 "Logical SELECT CASE block at %L has more that two cases",
8672 		 &code->loc);
8673 }
8674 
8675 
8676 /* Check if a derived type is extensible.  */
8677 
8678 bool
gfc_type_is_extensible(gfc_symbol * sym)8679 gfc_type_is_extensible (gfc_symbol *sym)
8680 {
8681   return !(sym->attr.is_bind_c || sym->attr.sequence
8682 	   || (sym->attr.is_class
8683 	       && sym->components->ts.u.derived->attr.unlimited_polymorphic));
8684 }
8685 
8686 
8687 static void
8688 resolve_types (gfc_namespace *ns);
8689 
8690 /* Resolve an associate-name:  Resolve target and ensure the type-spec is
8691    correct as well as possibly the array-spec.  */
8692 
8693 static void
resolve_assoc_var(gfc_symbol * sym,bool resolve_target)8694 resolve_assoc_var (gfc_symbol* sym, bool resolve_target)
8695 {
8696   gfc_expr* target;
8697 
8698   gcc_assert (sym->assoc);
8699   gcc_assert (sym->attr.flavor == FL_VARIABLE);
8700 
8701   /* If this is for SELECT TYPE, the target may not yet be set.  In that
8702      case, return.  Resolution will be called later manually again when
8703      this is done.  */
8704   target = sym->assoc->target;
8705   if (!target)
8706     return;
8707   gcc_assert (!sym->assoc->dangling);
8708 
8709   if (resolve_target && !gfc_resolve_expr (target))
8710     return;
8711 
8712   /* For variable targets, we get some attributes from the target.  */
8713   if (target->expr_type == EXPR_VARIABLE)
8714     {
8715       gfc_symbol* tsym;
8716 
8717       gcc_assert (target->symtree);
8718       tsym = target->symtree->n.sym;
8719 
8720       sym->attr.asynchronous = tsym->attr.asynchronous;
8721       sym->attr.volatile_ = tsym->attr.volatile_;
8722 
8723       sym->attr.target = tsym->attr.target
8724 			 || gfc_expr_attr (target).pointer;
8725       if (is_subref_array (target))
8726 	sym->attr.subref_array_pointer = 1;
8727     }
8728 
8729   if (target->expr_type == EXPR_NULL)
8730     {
8731       gfc_error ("Selector at %L cannot be NULL()", &target->where);
8732       return;
8733     }
8734   else if (target->ts.type == BT_UNKNOWN)
8735     {
8736       gfc_error ("Selector at %L has no type", &target->where);
8737       return;
8738     }
8739 
8740   /* Get type if this was not already set.  Note that it can be
8741      some other type than the target in case this is a SELECT TYPE
8742      selector!  So we must not update when the type is already there.  */
8743   if (sym->ts.type == BT_UNKNOWN)
8744     sym->ts = target->ts;
8745 
8746   gcc_assert (sym->ts.type != BT_UNKNOWN);
8747 
8748   /* See if this is a valid association-to-variable.  */
8749   sym->assoc->variable = (target->expr_type == EXPR_VARIABLE
8750 			  && !gfc_has_vector_subscript (target));
8751 
8752   /* Finally resolve if this is an array or not.  */
8753   if (sym->attr.dimension && target->rank == 0)
8754     {
8755       /* primary.c makes the assumption that a reference to an associate
8756 	 name followed by a left parenthesis is an array reference.  */
8757       if (sym->ts.type != BT_CHARACTER)
8758 	gfc_error ("Associate-name %qs at %L is used as array",
8759 		   sym->name, &sym->declared_at);
8760       sym->attr.dimension = 0;
8761       return;
8762     }
8763 
8764 
8765   /* We cannot deal with class selectors that need temporaries.  */
8766   if (target->ts.type == BT_CLASS
8767 	&& gfc_ref_needs_temporary_p (target->ref))
8768     {
8769       gfc_error ("CLASS selector at %L needs a temporary which is not "
8770 		 "yet implemented", &target->where);
8771       return;
8772     }
8773 
8774   if (target->ts.type == BT_CLASS)
8775     gfc_fix_class_refs (target);
8776 
8777   if (target->rank != 0)
8778     {
8779       gfc_array_spec *as;
8780       /* The rank may be incorrectly guessed at parsing, therefore make sure
8781 	 it is corrected now.  */
8782       if (sym->ts.type != BT_CLASS && (!sym->as || sym->assoc->rankguessed))
8783 	{
8784 	  if (!sym->as)
8785 	    sym->as = gfc_get_array_spec ();
8786 	  as = sym->as;
8787 	  as->rank = target->rank;
8788 	  as->type = AS_DEFERRED;
8789 	  as->corank = gfc_get_corank (target);
8790 	  sym->attr.dimension = 1;
8791 	  if (as->corank != 0)
8792 	    sym->attr.codimension = 1;
8793 	}
8794       else if (sym->ts.type == BT_CLASS && (!CLASS_DATA (sym)->as || sym->assoc->rankguessed))
8795 	{
8796 	  if (!CLASS_DATA (sym)->as)
8797 	    CLASS_DATA (sym)->as = gfc_get_array_spec ();
8798 	  as = CLASS_DATA (sym)->as;
8799 	  as->rank = target->rank;
8800 	  as->type = AS_DEFERRED;
8801 	  as->corank = gfc_get_corank (target);
8802 	  CLASS_DATA (sym)->attr.dimension = 1;
8803 	  if (as->corank != 0)
8804 	    CLASS_DATA (sym)->attr.codimension = 1;
8805 	}
8806     }
8807   else
8808     {
8809       /* target's rank is 0, but the type of the sym is still array valued,
8810 	 which has to be corrected.  */
8811       if (sym->ts.type == BT_CLASS
8812 	  && CLASS_DATA (sym) && CLASS_DATA (sym)->as)
8813 	{
8814 	  gfc_array_spec *as;
8815 	  symbol_attribute attr;
8816 	  /* The associated variable's type is still the array type
8817 	     correct this now.  */
8818 	  gfc_typespec *ts = &target->ts;
8819 	  gfc_ref *ref;
8820 	  gfc_component *c;
8821 	  for (ref = target->ref; ref != NULL; ref = ref->next)
8822 	    {
8823 	      switch (ref->type)
8824 		{
8825 		case REF_COMPONENT:
8826 		  ts = &ref->u.c.component->ts;
8827 		  break;
8828 		case REF_ARRAY:
8829 		  if (ts->type == BT_CLASS)
8830 		    ts = &ts->u.derived->components->ts;
8831 		  break;
8832 		default:
8833 		  break;
8834 		}
8835 	    }
8836 	  /* Create a scalar instance of the current class type.  Because the
8837 	     rank of a class array goes into its name, the type has to be
8838 	     rebuild.  The alternative of (re-)setting just the attributes
8839 	     and as in the current type, destroys the type also in other
8840 	     places.  */
8841 	  as = NULL;
8842 	  sym->ts = *ts;
8843 	  sym->ts.type = BT_CLASS;
8844 	  attr = CLASS_DATA (sym)->attr;
8845 	  attr.class_ok = 0;
8846 	  attr.associate_var = 1;
8847 	  attr.dimension = attr.codimension = 0;
8848 	  attr.class_pointer = 1;
8849 	  if (!gfc_build_class_symbol (&sym->ts, &attr, &as))
8850 	    gcc_unreachable ();
8851 	  /* Make sure the _vptr is set.  */
8852 	  c = gfc_find_component (sym->ts.u.derived, "_vptr", true, true, NULL);
8853 	  if (c->ts.u.derived == NULL)
8854 	    c->ts.u.derived = gfc_find_derived_vtab (sym->ts.u.derived);
8855 	  CLASS_DATA (sym)->attr.pointer = 1;
8856 	  CLASS_DATA (sym)->attr.class_pointer = 1;
8857 	  gfc_set_sym_referenced (sym->ts.u.derived);
8858 	  gfc_commit_symbol (sym->ts.u.derived);
8859 	  /* _vptr now has the _vtab in it, change it to the _vtype.  */
8860 	  if (c->ts.u.derived->attr.vtab)
8861 	    c->ts.u.derived = c->ts.u.derived->ts.u.derived;
8862 	  c->ts.u.derived->ns->types_resolved = 0;
8863 	  resolve_types (c->ts.u.derived->ns);
8864 	}
8865     }
8866 
8867   /* Mark this as an associate variable.  */
8868   sym->attr.associate_var = 1;
8869 
8870   /* Fix up the type-spec for CHARACTER types.  */
8871   if (sym->ts.type == BT_CHARACTER && !sym->attr.select_type_temporary)
8872     {
8873       if (!sym->ts.u.cl)
8874 	sym->ts.u.cl = target->ts.u.cl;
8875 
8876       if (sym->ts.deferred && target->expr_type == EXPR_VARIABLE
8877 	  && target->symtree->n.sym->attr.dummy
8878 	  && sym->ts.u.cl == target->ts.u.cl)
8879 	{
8880 	  sym->ts.u.cl = gfc_new_charlen (sym->ns, NULL);
8881 	  sym->ts.deferred = 1;
8882 	}
8883 
8884       if (!sym->ts.u.cl->length
8885 	  && !sym->ts.deferred
8886 	  && target->expr_type == EXPR_CONSTANT)
8887 	{
8888 	  sym->ts.u.cl->length =
8889 		gfc_get_int_expr (gfc_charlen_int_kind, NULL,
8890 				  target->value.character.length);
8891 	}
8892       else if ((!sym->ts.u.cl->length
8893 		|| sym->ts.u.cl->length->expr_type != EXPR_CONSTANT)
8894 		&& target->expr_type != EXPR_VARIABLE)
8895 	{
8896 	  sym->ts.u.cl = gfc_new_charlen (sym->ns, NULL);
8897 	  sym->ts.deferred = 1;
8898 
8899 	  /* This is reset in trans-stmt.c after the assignment
8900 	     of the target expression to the associate name.  */
8901 	  sym->attr.allocatable = 1;
8902 	}
8903     }
8904 
8905   /* If the target is a good class object, so is the associate variable.  */
8906   if (sym->ts.type == BT_CLASS && gfc_expr_attr (target).class_ok)
8907     sym->attr.class_ok = 1;
8908 }
8909 
8910 
8911 /* Ensure that SELECT TYPE expressions have the correct rank and a full
8912    array reference, where necessary.  The symbols are artificial and so
8913    the dimension attribute and arrayspec can also be set.  In addition,
8914    sometimes the expr1 arrives as BT_DERIVED, when the symbol is BT_CLASS.
8915    This is corrected here as well.*/
8916 
8917 static void
fixup_array_ref(gfc_expr ** expr1,gfc_expr * expr2,int rank,gfc_ref * ref)8918 fixup_array_ref (gfc_expr **expr1, gfc_expr *expr2,
8919 		 int rank, gfc_ref *ref)
8920 {
8921   gfc_ref *nref = (*expr1)->ref;
8922   gfc_symbol *sym1 = (*expr1)->symtree->n.sym;
8923   gfc_symbol *sym2 = expr2 ? expr2->symtree->n.sym : NULL;
8924   (*expr1)->rank = rank;
8925   if (sym1->ts.type == BT_CLASS)
8926     {
8927       if ((*expr1)->ts.type != BT_CLASS)
8928 	(*expr1)->ts = sym1->ts;
8929 
8930       CLASS_DATA (sym1)->attr.dimension = 1;
8931       if (CLASS_DATA (sym1)->as == NULL && sym2)
8932 	CLASS_DATA (sym1)->as
8933 		= gfc_copy_array_spec (CLASS_DATA (sym2)->as);
8934     }
8935   else
8936     {
8937       sym1->attr.dimension = 1;
8938       if (sym1->as == NULL && sym2)
8939 	sym1->as = gfc_copy_array_spec (sym2->as);
8940     }
8941 
8942   for (; nref; nref = nref->next)
8943     if (nref->next == NULL)
8944       break;
8945 
8946   if (ref && nref && nref->type != REF_ARRAY)
8947     nref->next = gfc_copy_ref (ref);
8948   else if (ref && !nref)
8949     (*expr1)->ref = gfc_copy_ref (ref);
8950 }
8951 
8952 
8953 static gfc_expr *
build_loc_call(gfc_expr * sym_expr)8954 build_loc_call (gfc_expr *sym_expr)
8955 {
8956   gfc_expr *loc_call;
8957   loc_call = gfc_get_expr ();
8958   loc_call->expr_type = EXPR_FUNCTION;
8959   gfc_get_sym_tree ("_loc", gfc_current_ns, &loc_call->symtree, false);
8960   loc_call->symtree->n.sym->attr.flavor = FL_PROCEDURE;
8961   loc_call->symtree->n.sym->attr.intrinsic = 1;
8962   loc_call->symtree->n.sym->result = loc_call->symtree->n.sym;
8963   gfc_commit_symbol (loc_call->symtree->n.sym);
8964   loc_call->ts.type = BT_INTEGER;
8965   loc_call->ts.kind = gfc_index_integer_kind;
8966   loc_call->value.function.isym = gfc_intrinsic_function_by_id (GFC_ISYM_LOC);
8967   loc_call->value.function.actual = gfc_get_actual_arglist ();
8968   loc_call->value.function.actual->expr = sym_expr;
8969   loc_call->where = sym_expr->where;
8970   return loc_call;
8971 }
8972 
8973 /* Resolve a SELECT TYPE statement.  */
8974 
8975 static void
resolve_select_type(gfc_code * code,gfc_namespace * old_ns)8976 resolve_select_type (gfc_code *code, gfc_namespace *old_ns)
8977 {
8978   gfc_symbol *selector_type;
8979   gfc_code *body, *new_st, *if_st, *tail;
8980   gfc_code *class_is = NULL, *default_case = NULL;
8981   gfc_case *c;
8982   gfc_symtree *st;
8983   char name[GFC_MAX_SYMBOL_LEN];
8984   gfc_namespace *ns;
8985   int error = 0;
8986   int rank = 0;
8987   gfc_ref* ref = NULL;
8988   gfc_expr *selector_expr = NULL;
8989 
8990   ns = code->ext.block.ns;
8991   gfc_resolve (ns);
8992 
8993   /* Check for F03:C813.  */
8994   if (code->expr1->ts.type != BT_CLASS
8995       && !(code->expr2 && code->expr2->ts.type == BT_CLASS))
8996     {
8997       gfc_error ("Selector shall be polymorphic in SELECT TYPE statement "
8998 		 "at %L", &code->loc);
8999       return;
9000     }
9001 
9002   if (!code->expr1->symtree->n.sym->attr.class_ok)
9003     return;
9004 
9005   if (code->expr2)
9006     {
9007       gfc_ref *ref2 = NULL;
9008       for (ref = code->expr2->ref; ref != NULL; ref = ref->next)
9009 	 if (ref->type == REF_COMPONENT
9010 	     && ref->u.c.component->ts.type == BT_CLASS)
9011 	   ref2 = ref;
9012 
9013       if (ref2)
9014 	{
9015 	  if (code->expr1->symtree->n.sym->attr.untyped)
9016 	    code->expr1->symtree->n.sym->ts = ref2->u.c.component->ts;
9017 	  selector_type = CLASS_DATA (ref2->u.c.component)->ts.u.derived;
9018 	}
9019       else
9020 	{
9021 	  if (code->expr1->symtree->n.sym->attr.untyped)
9022 	    code->expr1->symtree->n.sym->ts = code->expr2->ts;
9023 	  selector_type = CLASS_DATA (code->expr2)->ts.u.derived;
9024 	}
9025 
9026       if (code->expr2->rank && CLASS_DATA (code->expr1)->as)
9027 	CLASS_DATA (code->expr1)->as->rank = code->expr2->rank;
9028 
9029       /* F2008: C803 The selector expression must not be coindexed.  */
9030       if (gfc_is_coindexed (code->expr2))
9031 	{
9032 	  gfc_error ("Selector at %L must not be coindexed",
9033 		     &code->expr2->where);
9034 	  return;
9035 	}
9036 
9037     }
9038   else
9039     {
9040       selector_type = CLASS_DATA (code->expr1)->ts.u.derived;
9041 
9042       if (gfc_is_coindexed (code->expr1))
9043 	{
9044 	  gfc_error ("Selector at %L must not be coindexed",
9045 		     &code->expr1->where);
9046 	  return;
9047 	}
9048     }
9049 
9050   /* Loop over TYPE IS / CLASS IS cases.  */
9051   for (body = code->block; body; body = body->block)
9052     {
9053       c = body->ext.block.case_list;
9054 
9055       if (!error)
9056 	{
9057 	  /* Check for repeated cases.  */
9058 	  for (tail = code->block; tail; tail = tail->block)
9059 	    {
9060 	      gfc_case *d = tail->ext.block.case_list;
9061 	      if (tail == body)
9062 		break;
9063 
9064 	      if (c->ts.type == d->ts.type
9065 		  && ((c->ts.type == BT_DERIVED
9066 		       && c->ts.u.derived && d->ts.u.derived
9067 		       && !strcmp (c->ts.u.derived->name,
9068 				   d->ts.u.derived->name))
9069 		      || c->ts.type == BT_UNKNOWN
9070 		      || (!(c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
9071 			  && c->ts.kind == d->ts.kind)))
9072 		{
9073 		  gfc_error ("TYPE IS at %L overlaps with TYPE IS at %L",
9074 			     &c->where, &d->where);
9075 		  return;
9076 		}
9077 	    }
9078 	}
9079 
9080       /* Check F03:C815.  */
9081       if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
9082 	  && !selector_type->attr.unlimited_polymorphic
9083 	  && !gfc_type_is_extensible (c->ts.u.derived))
9084 	{
9085 	  gfc_error ("Derived type %qs at %L must be extensible",
9086 		     c->ts.u.derived->name, &c->where);
9087 	  error++;
9088 	  continue;
9089 	}
9090 
9091       /* Check F03:C816.  */
9092       if (c->ts.type != BT_UNKNOWN && !selector_type->attr.unlimited_polymorphic
9093 	  && ((c->ts.type != BT_DERIVED && c->ts.type != BT_CLASS)
9094 	      || !gfc_type_is_extension_of (selector_type, c->ts.u.derived)))
9095 	{
9096 	  if (c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
9097 	    gfc_error ("Derived type %qs at %L must be an extension of %qs",
9098 		       c->ts.u.derived->name, &c->where, selector_type->name);
9099 	  else
9100 	    gfc_error ("Unexpected intrinsic type %qs at %L",
9101 		       gfc_basic_typename (c->ts.type), &c->where);
9102 	  error++;
9103 	  continue;
9104 	}
9105 
9106       /* Check F03:C814.  */
9107       if (c->ts.type == BT_CHARACTER
9108 	  && (c->ts.u.cl->length != NULL || c->ts.deferred))
9109 	{
9110 	  gfc_error ("The type-spec at %L shall specify that each length "
9111 		     "type parameter is assumed", &c->where);
9112 	  error++;
9113 	  continue;
9114 	}
9115 
9116       /* Intercept the DEFAULT case.  */
9117       if (c->ts.type == BT_UNKNOWN)
9118 	{
9119 	  /* Check F03:C818.  */
9120 	  if (default_case)
9121 	    {
9122 	      gfc_error ("The DEFAULT CASE at %L cannot be followed "
9123 			 "by a second DEFAULT CASE at %L",
9124 			 &default_case->ext.block.case_list->where, &c->where);
9125 	      error++;
9126 	      continue;
9127 	    }
9128 
9129 	  default_case = body;
9130 	}
9131     }
9132 
9133   if (error > 0)
9134     return;
9135 
9136   /* Transform SELECT TYPE statement to BLOCK and associate selector to
9137      target if present.  If there are any EXIT statements referring to the
9138      SELECT TYPE construct, this is no problem because the gfc_code
9139      reference stays the same and EXIT is equally possible from the BLOCK
9140      it is changed to.  */
9141   code->op = EXEC_BLOCK;
9142   if (code->expr2)
9143     {
9144       gfc_association_list* assoc;
9145 
9146       assoc = gfc_get_association_list ();
9147       assoc->st = code->expr1->symtree;
9148       assoc->target = gfc_copy_expr (code->expr2);
9149       assoc->target->where = code->expr2->where;
9150       /* assoc->variable will be set by resolve_assoc_var.  */
9151 
9152       code->ext.block.assoc = assoc;
9153       code->expr1->symtree->n.sym->assoc = assoc;
9154 
9155       resolve_assoc_var (code->expr1->symtree->n.sym, false);
9156     }
9157   else
9158     code->ext.block.assoc = NULL;
9159 
9160   /* Ensure that the selector rank and arrayspec are available to
9161      correct expressions in which they might be missing.  */
9162   if (code->expr2 && code->expr2->rank)
9163     {
9164       rank = code->expr2->rank;
9165       for (ref = code->expr2->ref; ref; ref = ref->next)
9166 	if (ref->next == NULL)
9167 	  break;
9168       if (ref && ref->type == REF_ARRAY)
9169 	ref = gfc_copy_ref (ref);
9170 
9171       /* Fixup expr1 if necessary.  */
9172       if (rank)
9173 	fixup_array_ref (&code->expr1, code->expr2, rank, ref);
9174     }
9175   else if (code->expr1->rank)
9176     {
9177       rank = code->expr1->rank;
9178       for (ref = code->expr1->ref; ref; ref = ref->next)
9179 	if (ref->next == NULL)
9180 	  break;
9181       if (ref && ref->type == REF_ARRAY)
9182 	ref = gfc_copy_ref (ref);
9183     }
9184 
9185   /* Add EXEC_SELECT to switch on type.  */
9186   new_st = gfc_get_code (code->op);
9187   new_st->expr1 = code->expr1;
9188   new_st->expr2 = code->expr2;
9189   new_st->block = code->block;
9190   code->expr1 = code->expr2 =  NULL;
9191   code->block = NULL;
9192   if (!ns->code)
9193     ns->code = new_st;
9194   else
9195     ns->code->next = new_st;
9196   code = new_st;
9197   code->op = EXEC_SELECT_TYPE;
9198 
9199   /* Use the intrinsic LOC function to generate an integer expression
9200      for the vtable of the selector.  Note that the rank of the selector
9201      expression has to be set to zero.  */
9202   gfc_add_vptr_component (code->expr1);
9203   code->expr1->rank = 0;
9204   code->expr1 = build_loc_call (code->expr1);
9205   selector_expr = code->expr1->value.function.actual->expr;
9206 
9207   /* Loop over TYPE IS / CLASS IS cases.  */
9208   for (body = code->block; body; body = body->block)
9209     {
9210       gfc_symbol *vtab;
9211       gfc_expr *e;
9212       c = body->ext.block.case_list;
9213 
9214       /* Generate an index integer expression for address of the
9215 	 TYPE/CLASS vtable and store it in c->low.  The hash expression
9216 	 is stored in c->high and is used to resolve intrinsic cases.  */
9217       if (c->ts.type != BT_UNKNOWN)
9218 	{
9219 	  if (c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
9220 	    {
9221 	      vtab = gfc_find_derived_vtab (c->ts.u.derived);
9222 	      gcc_assert (vtab);
9223 	      c->high = gfc_get_int_expr (gfc_integer_4_kind, NULL,
9224 					  c->ts.u.derived->hash_value);
9225 	    }
9226 	  else
9227 	    {
9228 	      vtab = gfc_find_vtab (&c->ts);
9229 	      gcc_assert (vtab && CLASS_DATA (vtab)->initializer);
9230 	      e = CLASS_DATA (vtab)->initializer;
9231 	      c->high = gfc_copy_expr (e);
9232 	      if (c->high->ts.kind != gfc_integer_4_kind)
9233 		{
9234 		  gfc_typespec ts;
9235 		  ts.kind = gfc_integer_4_kind;
9236 		  ts.type = BT_INTEGER;
9237 		  gfc_convert_type_warn (c->high, &ts, 2, 0);
9238 		}
9239 	    }
9240 
9241 	  e = gfc_lval_expr_from_sym (vtab);
9242 	  c->low = build_loc_call (e);
9243 	}
9244       else
9245 	continue;
9246 
9247       /* Associate temporary to selector.  This should only be done
9248 	 when this case is actually true, so build a new ASSOCIATE
9249 	 that does precisely this here (instead of using the
9250 	 'global' one).  */
9251 
9252       if (c->ts.type == BT_CLASS)
9253 	sprintf (name, "__tmp_class_%s", c->ts.u.derived->name);
9254       else if (c->ts.type == BT_DERIVED)
9255 	sprintf (name, "__tmp_type_%s", c->ts.u.derived->name);
9256       else if (c->ts.type == BT_CHARACTER)
9257 	{
9258 	  HOST_WIDE_INT charlen = 0;
9259 	  if (c->ts.u.cl && c->ts.u.cl->length
9260 	      && c->ts.u.cl->length->expr_type == EXPR_CONSTANT)
9261 	    charlen = gfc_mpz_get_hwi (c->ts.u.cl->length->value.integer);
9262 	  snprintf (name, sizeof (name),
9263 		    "__tmp_%s_" HOST_WIDE_INT_PRINT_DEC "_%d",
9264 		    gfc_basic_typename (c->ts.type), charlen, c->ts.kind);
9265 	}
9266       else
9267 	sprintf (name, "__tmp_%s_%d", gfc_basic_typename (c->ts.type),
9268 	         c->ts.kind);
9269 
9270       st = gfc_find_symtree (ns->sym_root, name);
9271       gcc_assert (st->n.sym->assoc);
9272       st->n.sym->assoc->target = gfc_get_variable_expr (selector_expr->symtree);
9273       st->n.sym->assoc->target->where = selector_expr->where;
9274       if (c->ts.type != BT_CLASS && c->ts.type != BT_UNKNOWN)
9275 	{
9276 	  gfc_add_data_component (st->n.sym->assoc->target);
9277 	  /* Fixup the target expression if necessary.  */
9278 	  if (rank)
9279 	    fixup_array_ref (&st->n.sym->assoc->target, NULL, rank, ref);
9280 	}
9281 
9282       new_st = gfc_get_code (EXEC_BLOCK);
9283       new_st->ext.block.ns = gfc_build_block_ns (ns);
9284       new_st->ext.block.ns->code = body->next;
9285       body->next = new_st;
9286 
9287       /* Chain in the new list only if it is marked as dangling.  Otherwise
9288 	 there is a CASE label overlap and this is already used.  Just ignore,
9289 	 the error is diagnosed elsewhere.  */
9290       if (st->n.sym->assoc->dangling)
9291 	{
9292 	  new_st->ext.block.assoc = st->n.sym->assoc;
9293 	  st->n.sym->assoc->dangling = 0;
9294 	}
9295 
9296       resolve_assoc_var (st->n.sym, false);
9297     }
9298 
9299   /* Take out CLASS IS cases for separate treatment.  */
9300   body = code;
9301   while (body && body->block)
9302     {
9303       if (body->block->ext.block.case_list->ts.type == BT_CLASS)
9304 	{
9305 	  /* Add to class_is list.  */
9306 	  if (class_is == NULL)
9307 	    {
9308 	      class_is = body->block;
9309 	      tail = class_is;
9310 	    }
9311 	  else
9312 	    {
9313 	      for (tail = class_is; tail->block; tail = tail->block) ;
9314 	      tail->block = body->block;
9315 	      tail = tail->block;
9316 	    }
9317 	  /* Remove from EXEC_SELECT list.  */
9318 	  body->block = body->block->block;
9319 	  tail->block = NULL;
9320 	}
9321       else
9322 	body = body->block;
9323     }
9324 
9325   if (class_is)
9326     {
9327       gfc_symbol *vtab;
9328 
9329       if (!default_case)
9330 	{
9331 	  /* Add a default case to hold the CLASS IS cases.  */
9332 	  for (tail = code; tail->block; tail = tail->block) ;
9333 	  tail->block = gfc_get_code (EXEC_SELECT_TYPE);
9334 	  tail = tail->block;
9335 	  tail->ext.block.case_list = gfc_get_case ();
9336 	  tail->ext.block.case_list->ts.type = BT_UNKNOWN;
9337 	  tail->next = NULL;
9338 	  default_case = tail;
9339 	}
9340 
9341       /* More than one CLASS IS block?  */
9342       if (class_is->block)
9343 	{
9344 	  gfc_code **c1,*c2;
9345 	  bool swapped;
9346 	  /* Sort CLASS IS blocks by extension level.  */
9347 	  do
9348 	    {
9349 	      swapped = false;
9350 	      for (c1 = &class_is; (*c1) && (*c1)->block; c1 = &((*c1)->block))
9351 		{
9352 		  c2 = (*c1)->block;
9353 		  /* F03:C817 (check for doubles).  */
9354 		  if ((*c1)->ext.block.case_list->ts.u.derived->hash_value
9355 		      == c2->ext.block.case_list->ts.u.derived->hash_value)
9356 		    {
9357 		      gfc_error ("Double CLASS IS block in SELECT TYPE "
9358 				 "statement at %L",
9359 				 &c2->ext.block.case_list->where);
9360 		      return;
9361 		    }
9362 		  if ((*c1)->ext.block.case_list->ts.u.derived->attr.extension
9363 		      < c2->ext.block.case_list->ts.u.derived->attr.extension)
9364 		    {
9365 		      /* Swap.  */
9366 		      (*c1)->block = c2->block;
9367 		      c2->block = *c1;
9368 		      *c1 = c2;
9369 		      swapped = true;
9370 		    }
9371 		}
9372 	    }
9373 	  while (swapped);
9374 	}
9375 
9376       /* Generate IF chain.  */
9377       if_st = gfc_get_code (EXEC_IF);
9378       new_st = if_st;
9379       for (body = class_is; body; body = body->block)
9380 	{
9381 	  new_st->block = gfc_get_code (EXEC_IF);
9382 	  new_st = new_st->block;
9383 	  /* Set up IF condition: Call _gfortran_is_extension_of.  */
9384 	  new_st->expr1 = gfc_get_expr ();
9385 	  new_st->expr1->expr_type = EXPR_FUNCTION;
9386 	  new_st->expr1->ts.type = BT_LOGICAL;
9387 	  new_st->expr1->ts.kind = 4;
9388 	  new_st->expr1->value.function.name = gfc_get_string (PREFIX ("is_extension_of"));
9389 	  new_st->expr1->value.function.isym = XCNEW (gfc_intrinsic_sym);
9390 	  new_st->expr1->value.function.isym->id = GFC_ISYM_EXTENDS_TYPE_OF;
9391 	  /* Set up arguments.  */
9392 	  new_st->expr1->value.function.actual = gfc_get_actual_arglist ();
9393 	  new_st->expr1->value.function.actual->expr = gfc_get_variable_expr (selector_expr->symtree);
9394 	  new_st->expr1->value.function.actual->expr->where = code->loc;
9395 	  new_st->expr1->where = code->loc;
9396 	  gfc_add_vptr_component (new_st->expr1->value.function.actual->expr);
9397 	  vtab = gfc_find_derived_vtab (body->ext.block.case_list->ts.u.derived);
9398 	  st = gfc_find_symtree (vtab->ns->sym_root, vtab->name);
9399 	  new_st->expr1->value.function.actual->next = gfc_get_actual_arglist ();
9400 	  new_st->expr1->value.function.actual->next->expr = gfc_get_variable_expr (st);
9401 	  new_st->expr1->value.function.actual->next->expr->where = code->loc;
9402 	  new_st->next = body->next;
9403 	}
9404 	if (default_case->next)
9405 	  {
9406 	    new_st->block = gfc_get_code (EXEC_IF);
9407 	    new_st = new_st->block;
9408 	    new_st->next = default_case->next;
9409 	  }
9410 
9411 	/* Replace CLASS DEFAULT code by the IF chain.  */
9412 	default_case->next = if_st;
9413     }
9414 
9415   /* Resolve the internal code.  This cannot be done earlier because
9416      it requires that the sym->assoc of selectors is set already.  */
9417   gfc_current_ns = ns;
9418   gfc_resolve_blocks (code->block, gfc_current_ns);
9419   gfc_current_ns = old_ns;
9420 
9421   if (ref)
9422     free (ref);
9423 }
9424 
9425 
9426 /* Resolve a transfer statement. This is making sure that:
9427    -- a derived type being transferred has only non-pointer components
9428    -- a derived type being transferred doesn't have private components, unless
9429       it's being transferred from the module where the type was defined
9430    -- we're not trying to transfer a whole assumed size array.  */
9431 
9432 static void
resolve_transfer(gfc_code * code)9433 resolve_transfer (gfc_code *code)
9434 {
9435   gfc_symbol *sym, *derived;
9436   gfc_ref *ref;
9437   gfc_expr *exp;
9438   bool write = false;
9439   bool formatted = false;
9440   gfc_dt *dt = code->ext.dt;
9441   gfc_symbol *dtio_sub = NULL;
9442 
9443   exp = code->expr1;
9444 
9445   while (exp != NULL && exp->expr_type == EXPR_OP
9446 	 && exp->value.op.op == INTRINSIC_PARENTHESES)
9447     exp = exp->value.op.op1;
9448 
9449   if (exp && exp->expr_type == EXPR_NULL
9450       && code->ext.dt)
9451     {
9452       gfc_error ("Invalid context for NULL () intrinsic at %L",
9453 		 &exp->where);
9454       return;
9455     }
9456 
9457   if (exp == NULL || (exp->expr_type != EXPR_VARIABLE
9458 		      && exp->expr_type != EXPR_FUNCTION
9459 		      && exp->expr_type != EXPR_STRUCTURE))
9460     return;
9461 
9462   /* If we are reading, the variable will be changed.  Note that
9463      code->ext.dt may be NULL if the TRANSFER is related to
9464      an INQUIRE statement -- but in this case, we are not reading, either.  */
9465   if (dt && dt->dt_io_kind->value.iokind == M_READ
9466       && !gfc_check_vardef_context (exp, false, false, false,
9467 				    _("item in READ")))
9468     return;
9469 
9470   const gfc_typespec *ts = exp->expr_type == EXPR_STRUCTURE
9471 			|| exp->expr_type == EXPR_FUNCTION
9472 			 ? &exp->ts : &exp->symtree->n.sym->ts;
9473 
9474   /* Go to actual component transferred.  */
9475   for (ref = exp->ref; ref; ref = ref->next)
9476     if (ref->type == REF_COMPONENT)
9477       ts = &ref->u.c.component->ts;
9478 
9479   if (dt && dt->dt_io_kind->value.iokind != M_INQUIRE
9480       && (ts->type == BT_DERIVED || ts->type == BT_CLASS))
9481     {
9482       derived = ts->u.derived;
9483 
9484       /* Determine when to use the formatted DTIO procedure.  */
9485       if (dt && (dt->format_expr || dt->format_label))
9486 	formatted = true;
9487 
9488       write = dt->dt_io_kind->value.iokind == M_WRITE
9489 	      || dt->dt_io_kind->value.iokind == M_PRINT;
9490       dtio_sub = gfc_find_specific_dtio_proc (derived, write, formatted);
9491 
9492       if (dtio_sub != NULL && exp->expr_type == EXPR_VARIABLE)
9493 	{
9494 	  dt->udtio = exp;
9495 	  sym = exp->symtree->n.sym->ns->proc_name;
9496 	  /* Check to see if this is a nested DTIO call, with the
9497 	     dummy as the io-list object.  */
9498 	  if (sym && sym == dtio_sub && sym->formal
9499 	      && sym->formal->sym == exp->symtree->n.sym
9500 	      && exp->ref == NULL)
9501 	    {
9502 	      if (!sym->attr.recursive)
9503 		{
9504 		  gfc_error ("DTIO %s procedure at %L must be recursive",
9505 			     sym->name, &sym->declared_at);
9506 		  return;
9507 		}
9508 	    }
9509 	}
9510     }
9511 
9512   if (ts->type == BT_CLASS && dtio_sub == NULL)
9513     {
9514       gfc_error ("Data transfer element at %L cannot be polymorphic unless "
9515                 "it is processed by a defined input/output procedure",
9516                 &code->loc);
9517       return;
9518     }
9519 
9520   if (ts->type == BT_DERIVED)
9521     {
9522       /* Check that transferred derived type doesn't contain POINTER
9523 	 components unless it is processed by a defined input/output
9524 	 procedure".  */
9525       if (ts->u.derived->attr.pointer_comp && dtio_sub == NULL)
9526 	{
9527 	  gfc_error ("Data transfer element at %L cannot have POINTER "
9528 		     "components unless it is processed by a defined "
9529 		     "input/output procedure", &code->loc);
9530 	  return;
9531 	}
9532 
9533       /* F08:C935.  */
9534       if (ts->u.derived->attr.proc_pointer_comp)
9535 	{
9536 	  gfc_error ("Data transfer element at %L cannot have "
9537 		     "procedure pointer components", &code->loc);
9538 	  return;
9539 	}
9540 
9541       if (ts->u.derived->attr.alloc_comp && dtio_sub == NULL)
9542 	{
9543 	  gfc_error ("Data transfer element at %L cannot have ALLOCATABLE "
9544 		     "components unless it is processed by a defined "
9545 		     "input/output procedure", &code->loc);
9546 	  return;
9547 	}
9548 
9549       /* C_PTR and C_FUNPTR have private components which means they cannot
9550          be printed.  However, if -std=gnu and not -pedantic, allow
9551          the component to be printed to help debugging.  */
9552       if (ts->u.derived->ts.f90_type == BT_VOID)
9553 	{
9554 	  if (!gfc_notify_std (GFC_STD_GNU, "Data transfer element at %L "
9555 			       "cannot have PRIVATE components", &code->loc))
9556 	    return;
9557 	}
9558       else if (derived_inaccessible (ts->u.derived) && dtio_sub == NULL)
9559 	{
9560 	  gfc_error ("Data transfer element at %L cannot have "
9561 		     "PRIVATE components unless it is processed by "
9562 		     "a defined input/output procedure", &code->loc);
9563 	  return;
9564 	}
9565     }
9566 
9567   if (exp->expr_type == EXPR_STRUCTURE)
9568     return;
9569 
9570   sym = exp->symtree->n.sym;
9571 
9572   if (sym->as != NULL && sym->as->type == AS_ASSUMED_SIZE && exp->ref
9573       && exp->ref->type == REF_ARRAY && exp->ref->u.ar.type == AR_FULL)
9574     {
9575       gfc_error ("Data transfer element at %L cannot be a full reference to "
9576 		 "an assumed-size array", &code->loc);
9577       return;
9578     }
9579 
9580   if (async_io_dt && exp->expr_type == EXPR_VARIABLE)
9581     exp->symtree->n.sym->attr.asynchronous = 1;
9582 }
9583 
9584 
9585 /*********** Toplevel code resolution subroutines ***********/
9586 
9587 /* Find the set of labels that are reachable from this block.  We also
9588    record the last statement in each block.  */
9589 
9590 static void
find_reachable_labels(gfc_code * block)9591 find_reachable_labels (gfc_code *block)
9592 {
9593   gfc_code *c;
9594 
9595   if (!block)
9596     return;
9597 
9598   cs_base->reachable_labels = bitmap_alloc (&labels_obstack);
9599 
9600   /* Collect labels in this block.  We don't keep those corresponding
9601      to END {IF|SELECT}, these are checked in resolve_branch by going
9602      up through the code_stack.  */
9603   for (c = block; c; c = c->next)
9604     {
9605       if (c->here && c->op != EXEC_END_NESTED_BLOCK)
9606 	bitmap_set_bit (cs_base->reachable_labels, c->here->value);
9607     }
9608 
9609   /* Merge with labels from parent block.  */
9610   if (cs_base->prev)
9611     {
9612       gcc_assert (cs_base->prev->reachable_labels);
9613       bitmap_ior_into (cs_base->reachable_labels,
9614 		       cs_base->prev->reachable_labels);
9615     }
9616 }
9617 
9618 
9619 static void
resolve_lock_unlock_event(gfc_code * code)9620 resolve_lock_unlock_event (gfc_code *code)
9621 {
9622   if (code->expr1->expr_type == EXPR_FUNCTION
9623       && code->expr1->value.function.isym
9624       && code->expr1->value.function.isym->id == GFC_ISYM_CAF_GET)
9625     remove_caf_get_intrinsic (code->expr1);
9626 
9627   if ((code->op == EXEC_LOCK || code->op == EXEC_UNLOCK)
9628       && (code->expr1->ts.type != BT_DERIVED
9629 	  || code->expr1->expr_type != EXPR_VARIABLE
9630 	  || code->expr1->ts.u.derived->from_intmod != INTMOD_ISO_FORTRAN_ENV
9631 	  || code->expr1->ts.u.derived->intmod_sym_id != ISOFORTRAN_LOCK_TYPE
9632 	  || code->expr1->rank != 0
9633 	  || (!gfc_is_coarray (code->expr1) &&
9634 	      !gfc_is_coindexed (code->expr1))))
9635     gfc_error ("Lock variable at %L must be a scalar of type LOCK_TYPE",
9636 	       &code->expr1->where);
9637   else if ((code->op == EXEC_EVENT_POST || code->op == EXEC_EVENT_WAIT)
9638 	   && (code->expr1->ts.type != BT_DERIVED
9639 	       || code->expr1->expr_type != EXPR_VARIABLE
9640 	       || code->expr1->ts.u.derived->from_intmod
9641 		  != INTMOD_ISO_FORTRAN_ENV
9642 	       || code->expr1->ts.u.derived->intmod_sym_id
9643 		  != ISOFORTRAN_EVENT_TYPE
9644 	       || code->expr1->rank != 0))
9645     gfc_error ("Event variable at %L must be a scalar of type EVENT_TYPE",
9646 	       &code->expr1->where);
9647   else if (code->op == EXEC_EVENT_POST && !gfc_is_coarray (code->expr1)
9648 	   && !gfc_is_coindexed (code->expr1))
9649     gfc_error ("Event variable argument at %L must be a coarray or coindexed",
9650 	       &code->expr1->where);
9651   else if (code->op == EXEC_EVENT_WAIT && !gfc_is_coarray (code->expr1))
9652     gfc_error ("Event variable argument at %L must be a coarray but not "
9653 	       "coindexed", &code->expr1->where);
9654 
9655   /* Check STAT.  */
9656   if (code->expr2
9657       && (code->expr2->ts.type != BT_INTEGER || code->expr2->rank != 0
9658 	  || code->expr2->expr_type != EXPR_VARIABLE))
9659     gfc_error ("STAT= argument at %L must be a scalar INTEGER variable",
9660 	       &code->expr2->where);
9661 
9662   if (code->expr2
9663       && !gfc_check_vardef_context (code->expr2, false, false, false,
9664 				    _("STAT variable")))
9665     return;
9666 
9667   /* Check ERRMSG.  */
9668   if (code->expr3
9669       && (code->expr3->ts.type != BT_CHARACTER || code->expr3->rank != 0
9670 	  || code->expr3->expr_type != EXPR_VARIABLE))
9671     gfc_error ("ERRMSG= argument at %L must be a scalar CHARACTER variable",
9672 	       &code->expr3->where);
9673 
9674   if (code->expr3
9675       && !gfc_check_vardef_context (code->expr3, false, false, false,
9676 				    _("ERRMSG variable")))
9677     return;
9678 
9679   /* Check for LOCK the ACQUIRED_LOCK.  */
9680   if (code->op != EXEC_EVENT_WAIT && code->expr4
9681       && (code->expr4->ts.type != BT_LOGICAL || code->expr4->rank != 0
9682 	  || code->expr4->expr_type != EXPR_VARIABLE))
9683     gfc_error ("ACQUIRED_LOCK= argument at %L must be a scalar LOGICAL "
9684 	       "variable", &code->expr4->where);
9685 
9686   if (code->op != EXEC_EVENT_WAIT && code->expr4
9687       && !gfc_check_vardef_context (code->expr4, false, false, false,
9688 				    _("ACQUIRED_LOCK variable")))
9689     return;
9690 
9691   /* Check for EVENT WAIT the UNTIL_COUNT.  */
9692   if (code->op == EXEC_EVENT_WAIT && code->expr4)
9693     {
9694       if (!gfc_resolve_expr (code->expr4) || code->expr4->ts.type != BT_INTEGER
9695 	  || code->expr4->rank != 0)
9696 	gfc_error ("UNTIL_COUNT= argument at %L must be a scalar INTEGER "
9697 		   "expression", &code->expr4->where);
9698     }
9699 }
9700 
9701 
9702 static void
resolve_critical(gfc_code * code)9703 resolve_critical (gfc_code *code)
9704 {
9705   gfc_symtree *symtree;
9706   gfc_symbol *lock_type;
9707   char name[GFC_MAX_SYMBOL_LEN];
9708   static int serial = 0;
9709 
9710   if (flag_coarray != GFC_FCOARRAY_LIB)
9711     return;
9712 
9713   symtree = gfc_find_symtree (gfc_current_ns->sym_root,
9714 			      GFC_PREFIX ("lock_type"));
9715   if (symtree)
9716     lock_type = symtree->n.sym;
9717   else
9718     {
9719       if (gfc_get_sym_tree (GFC_PREFIX ("lock_type"), gfc_current_ns, &symtree,
9720 			    false) != 0)
9721 	gcc_unreachable ();
9722       lock_type = symtree->n.sym;
9723       lock_type->attr.flavor = FL_DERIVED;
9724       lock_type->attr.zero_comp = 1;
9725       lock_type->from_intmod = INTMOD_ISO_FORTRAN_ENV;
9726       lock_type->intmod_sym_id = ISOFORTRAN_LOCK_TYPE;
9727     }
9728 
9729   sprintf(name, GFC_PREFIX ("lock_var") "%d",serial++);
9730   if (gfc_get_sym_tree (name, gfc_current_ns, &symtree, false) != 0)
9731     gcc_unreachable ();
9732 
9733   code->resolved_sym = symtree->n.sym;
9734   symtree->n.sym->attr.flavor = FL_VARIABLE;
9735   symtree->n.sym->attr.referenced = 1;
9736   symtree->n.sym->attr.artificial = 1;
9737   symtree->n.sym->attr.codimension = 1;
9738   symtree->n.sym->ts.type = BT_DERIVED;
9739   symtree->n.sym->ts.u.derived = lock_type;
9740   symtree->n.sym->as = gfc_get_array_spec ();
9741   symtree->n.sym->as->corank = 1;
9742   symtree->n.sym->as->type = AS_EXPLICIT;
9743   symtree->n.sym->as->cotype = AS_EXPLICIT;
9744   symtree->n.sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind,
9745 						   NULL, 1);
9746   gfc_commit_symbols();
9747 }
9748 
9749 
9750 static void
resolve_sync(gfc_code * code)9751 resolve_sync (gfc_code *code)
9752 {
9753   /* Check imageset. The * case matches expr1 == NULL.  */
9754   if (code->expr1)
9755     {
9756       if (code->expr1->ts.type != BT_INTEGER || code->expr1->rank > 1)
9757 	gfc_error ("Imageset argument at %L must be a scalar or rank-1 "
9758 		   "INTEGER expression", &code->expr1->where);
9759       if (code->expr1->expr_type == EXPR_CONSTANT && code->expr1->rank == 0
9760 	  && mpz_cmp_si (code->expr1->value.integer, 1) < 0)
9761 	gfc_error ("Imageset argument at %L must between 1 and num_images()",
9762 		   &code->expr1->where);
9763       else if (code->expr1->expr_type == EXPR_ARRAY
9764 	       && gfc_simplify_expr (code->expr1, 0))
9765 	{
9766 	   gfc_constructor *cons;
9767 	   cons = gfc_constructor_first (code->expr1->value.constructor);
9768 	   for (; cons; cons = gfc_constructor_next (cons))
9769 	     if (cons->expr->expr_type == EXPR_CONSTANT
9770 		 &&  mpz_cmp_si (cons->expr->value.integer, 1) < 0)
9771 	       gfc_error ("Imageset argument at %L must between 1 and "
9772 			  "num_images()", &cons->expr->where);
9773 	}
9774     }
9775 
9776   /* Check STAT.  */
9777   gfc_resolve_expr (code->expr2);
9778   if (code->expr2
9779       && (code->expr2->ts.type != BT_INTEGER || code->expr2->rank != 0
9780 	  || code->expr2->expr_type != EXPR_VARIABLE))
9781     gfc_error ("STAT= argument at %L must be a scalar INTEGER variable",
9782 	       &code->expr2->where);
9783 
9784   /* Check ERRMSG.  */
9785   gfc_resolve_expr (code->expr3);
9786   if (code->expr3
9787       && (code->expr3->ts.type != BT_CHARACTER || code->expr3->rank != 0
9788 	  || code->expr3->expr_type != EXPR_VARIABLE))
9789     gfc_error ("ERRMSG= argument at %L must be a scalar CHARACTER variable",
9790 	       &code->expr3->where);
9791 }
9792 
9793 
9794 /* Given a branch to a label, see if the branch is conforming.
9795    The code node describes where the branch is located.  */
9796 
9797 static void
resolve_branch(gfc_st_label * label,gfc_code * code)9798 resolve_branch (gfc_st_label *label, gfc_code *code)
9799 {
9800   code_stack *stack;
9801 
9802   if (label == NULL)
9803     return;
9804 
9805   /* Step one: is this a valid branching target?  */
9806 
9807   if (label->defined == ST_LABEL_UNKNOWN)
9808     {
9809       gfc_error ("Label %d referenced at %L is never defined", label->value,
9810 		 &code->loc);
9811       return;
9812     }
9813 
9814   if (label->defined != ST_LABEL_TARGET && label->defined != ST_LABEL_DO_TARGET)
9815     {
9816       gfc_error ("Statement at %L is not a valid branch target statement "
9817 		 "for the branch statement at %L", &label->where, &code->loc);
9818       return;
9819     }
9820 
9821   /* Step two: make sure this branch is not a branch to itself ;-)  */
9822 
9823   if (code->here == label)
9824     {
9825       gfc_warning (0,
9826 		   "Branch at %L may result in an infinite loop", &code->loc);
9827       return;
9828     }
9829 
9830   /* Step three:  See if the label is in the same block as the
9831      branching statement.  The hard work has been done by setting up
9832      the bitmap reachable_labels.  */
9833 
9834   if (bitmap_bit_p (cs_base->reachable_labels, label->value))
9835     {
9836       /* Check now whether there is a CRITICAL construct; if so, check
9837 	 whether the label is still visible outside of the CRITICAL block,
9838 	 which is invalid.  */
9839       for (stack = cs_base; stack; stack = stack->prev)
9840 	{
9841 	  if (stack->current->op == EXEC_CRITICAL
9842 	      && bitmap_bit_p (stack->reachable_labels, label->value))
9843 	    gfc_error ("GOTO statement at %L leaves CRITICAL construct for "
9844 		      "label at %L", &code->loc, &label->where);
9845 	  else if (stack->current->op == EXEC_DO_CONCURRENT
9846 		   && bitmap_bit_p (stack->reachable_labels, label->value))
9847 	    gfc_error ("GOTO statement at %L leaves DO CONCURRENT construct "
9848 		      "for label at %L", &code->loc, &label->where);
9849 	}
9850 
9851       return;
9852     }
9853 
9854   /* Step four:  If we haven't found the label in the bitmap, it may
9855     still be the label of the END of the enclosing block, in which
9856     case we find it by going up the code_stack.  */
9857 
9858   for (stack = cs_base; stack; stack = stack->prev)
9859     {
9860       if (stack->current->next && stack->current->next->here == label)
9861 	break;
9862       if (stack->current->op == EXEC_CRITICAL)
9863 	{
9864 	  /* Note: A label at END CRITICAL does not leave the CRITICAL
9865 	     construct as END CRITICAL is still part of it.  */
9866 	  gfc_error ("GOTO statement at %L leaves CRITICAL construct for label"
9867 		      " at %L", &code->loc, &label->where);
9868 	  return;
9869 	}
9870       else if (stack->current->op == EXEC_DO_CONCURRENT)
9871 	{
9872 	  gfc_error ("GOTO statement at %L leaves DO CONCURRENT construct for "
9873 		     "label at %L", &code->loc, &label->where);
9874 	  return;
9875 	}
9876     }
9877 
9878   if (stack)
9879     {
9880       gcc_assert (stack->current->next->op == EXEC_END_NESTED_BLOCK);
9881       return;
9882     }
9883 
9884   /* The label is not in an enclosing block, so illegal.  This was
9885      allowed in Fortran 66, so we allow it as extension.  No
9886      further checks are necessary in this case.  */
9887   gfc_notify_std (GFC_STD_LEGACY, "Label at %L is not in the same block "
9888 		  "as the GOTO statement at %L", &label->where,
9889 		  &code->loc);
9890   return;
9891 }
9892 
9893 
9894 /* Check whether EXPR1 has the same shape as EXPR2.  */
9895 
9896 static bool
resolve_where_shape(gfc_expr * expr1,gfc_expr * expr2)9897 resolve_where_shape (gfc_expr *expr1, gfc_expr *expr2)
9898 {
9899   mpz_t shape[GFC_MAX_DIMENSIONS];
9900   mpz_t shape2[GFC_MAX_DIMENSIONS];
9901   bool result = false;
9902   int i;
9903 
9904   /* Compare the rank.  */
9905   if (expr1->rank != expr2->rank)
9906     return result;
9907 
9908   /* Compare the size of each dimension.  */
9909   for (i=0; i<expr1->rank; i++)
9910     {
9911       if (!gfc_array_dimen_size (expr1, i, &shape[i]))
9912 	goto ignore;
9913 
9914       if (!gfc_array_dimen_size (expr2, i, &shape2[i]))
9915 	goto ignore;
9916 
9917       if (mpz_cmp (shape[i], shape2[i]))
9918 	goto over;
9919     }
9920 
9921   /* When either of the two expression is an assumed size array, we
9922      ignore the comparison of dimension sizes.  */
9923 ignore:
9924   result = true;
9925 
9926 over:
9927   gfc_clear_shape (shape, i);
9928   gfc_clear_shape (shape2, i);
9929   return result;
9930 }
9931 
9932 
9933 /* Check whether a WHERE assignment target or a WHERE mask expression
9934    has the same shape as the outmost WHERE mask expression.  */
9935 
9936 static void
resolve_where(gfc_code * code,gfc_expr * mask)9937 resolve_where (gfc_code *code, gfc_expr *mask)
9938 {
9939   gfc_code *cblock;
9940   gfc_code *cnext;
9941   gfc_expr *e = NULL;
9942 
9943   cblock = code->block;
9944 
9945   /* Store the first WHERE mask-expr of the WHERE statement or construct.
9946      In case of nested WHERE, only the outmost one is stored.  */
9947   if (mask == NULL) /* outmost WHERE */
9948     e = cblock->expr1;
9949   else /* inner WHERE */
9950     e = mask;
9951 
9952   while (cblock)
9953     {
9954       if (cblock->expr1)
9955 	{
9956 	  /* Check if the mask-expr has a consistent shape with the
9957 	     outmost WHERE mask-expr.  */
9958 	  if (!resolve_where_shape (cblock->expr1, e))
9959 	    gfc_error ("WHERE mask at %L has inconsistent shape",
9960 		       &cblock->expr1->where);
9961 	 }
9962 
9963       /* the assignment statement of a WHERE statement, or the first
9964 	 statement in where-body-construct of a WHERE construct */
9965       cnext = cblock->next;
9966       while (cnext)
9967 	{
9968 	  switch (cnext->op)
9969 	    {
9970 	    /* WHERE assignment statement */
9971 	    case EXEC_ASSIGN:
9972 
9973 	      /* Check shape consistent for WHERE assignment target.  */
9974 	      if (e && !resolve_where_shape (cnext->expr1, e))
9975 	       gfc_error ("WHERE assignment target at %L has "
9976 			  "inconsistent shape", &cnext->expr1->where);
9977 	      break;
9978 
9979 
9980 	    case EXEC_ASSIGN_CALL:
9981 	      resolve_call (cnext);
9982 	      if (!cnext->resolved_sym->attr.elemental)
9983 		gfc_error("Non-ELEMENTAL user-defined assignment in WHERE at %L",
9984 			  &cnext->ext.actual->expr->where);
9985 	      break;
9986 
9987 	    /* WHERE or WHERE construct is part of a where-body-construct */
9988 	    case EXEC_WHERE:
9989 	      resolve_where (cnext, e);
9990 	      break;
9991 
9992 	    default:
9993 	      gfc_error ("Unsupported statement inside WHERE at %L",
9994 			 &cnext->loc);
9995 	    }
9996 	 /* the next statement within the same where-body-construct */
9997 	 cnext = cnext->next;
9998        }
9999     /* the next masked-elsewhere-stmt, elsewhere-stmt, or end-where-stmt */
10000     cblock = cblock->block;
10001   }
10002 }
10003 
10004 
10005 /* Resolve assignment in FORALL construct.
10006    NVAR is the number of FORALL index variables, and VAR_EXPR records the
10007    FORALL index variables.  */
10008 
10009 static void
gfc_resolve_assign_in_forall(gfc_code * code,int nvar,gfc_expr ** var_expr)10010 gfc_resolve_assign_in_forall (gfc_code *code, int nvar, gfc_expr **var_expr)
10011 {
10012   int n;
10013 
10014   for (n = 0; n < nvar; n++)
10015     {
10016       gfc_symbol *forall_index;
10017 
10018       forall_index = var_expr[n]->symtree->n.sym;
10019 
10020       /* Check whether the assignment target is one of the FORALL index
10021 	 variable.  */
10022       if ((code->expr1->expr_type == EXPR_VARIABLE)
10023 	  && (code->expr1->symtree->n.sym == forall_index))
10024 	gfc_error ("Assignment to a FORALL index variable at %L",
10025 		   &code->expr1->where);
10026       else
10027 	{
10028 	  /* If one of the FORALL index variables doesn't appear in the
10029 	     assignment variable, then there could be a many-to-one
10030 	     assignment.  Emit a warning rather than an error because the
10031 	     mask could be resolving this problem.  */
10032 	  if (!find_forall_index (code->expr1, forall_index, 0))
10033 	    gfc_warning (0, "The FORALL with index %qs is not used on the "
10034 			 "left side of the assignment at %L and so might "
10035 			 "cause multiple assignment to this object",
10036 			 var_expr[n]->symtree->name, &code->expr1->where);
10037 	}
10038     }
10039 }
10040 
10041 
10042 /* Resolve WHERE statement in FORALL construct.  */
10043 
10044 static void
gfc_resolve_where_code_in_forall(gfc_code * code,int nvar,gfc_expr ** var_expr)10045 gfc_resolve_where_code_in_forall (gfc_code *code, int nvar,
10046 				  gfc_expr **var_expr)
10047 {
10048   gfc_code *cblock;
10049   gfc_code *cnext;
10050 
10051   cblock = code->block;
10052   while (cblock)
10053     {
10054       /* the assignment statement of a WHERE statement, or the first
10055 	 statement in where-body-construct of a WHERE construct */
10056       cnext = cblock->next;
10057       while (cnext)
10058 	{
10059 	  switch (cnext->op)
10060 	    {
10061 	    /* WHERE assignment statement */
10062 	    case EXEC_ASSIGN:
10063 	      gfc_resolve_assign_in_forall (cnext, nvar, var_expr);
10064 	      break;
10065 
10066 	    /* WHERE operator assignment statement */
10067 	    case EXEC_ASSIGN_CALL:
10068 	      resolve_call (cnext);
10069 	      if (!cnext->resolved_sym->attr.elemental)
10070 		gfc_error("Non-ELEMENTAL user-defined assignment in WHERE at %L",
10071 			  &cnext->ext.actual->expr->where);
10072 	      break;
10073 
10074 	    /* WHERE or WHERE construct is part of a where-body-construct */
10075 	    case EXEC_WHERE:
10076 	      gfc_resolve_where_code_in_forall (cnext, nvar, var_expr);
10077 	      break;
10078 
10079 	    default:
10080 	      gfc_error ("Unsupported statement inside WHERE at %L",
10081 			 &cnext->loc);
10082 	    }
10083 	  /* the next statement within the same where-body-construct */
10084 	  cnext = cnext->next;
10085 	}
10086       /* the next masked-elsewhere-stmt, elsewhere-stmt, or end-where-stmt */
10087       cblock = cblock->block;
10088     }
10089 }
10090 
10091 
10092 /* Traverse the FORALL body to check whether the following errors exist:
10093    1. For assignment, check if a many-to-one assignment happens.
10094    2. For WHERE statement, check the WHERE body to see if there is any
10095       many-to-one assignment.  */
10096 
10097 static void
gfc_resolve_forall_body(gfc_code * code,int nvar,gfc_expr ** var_expr)10098 gfc_resolve_forall_body (gfc_code *code, int nvar, gfc_expr **var_expr)
10099 {
10100   gfc_code *c;
10101 
10102   c = code->block->next;
10103   while (c)
10104     {
10105       switch (c->op)
10106 	{
10107 	case EXEC_ASSIGN:
10108 	case EXEC_POINTER_ASSIGN:
10109 	  gfc_resolve_assign_in_forall (c, nvar, var_expr);
10110 	  break;
10111 
10112 	case EXEC_ASSIGN_CALL:
10113 	  resolve_call (c);
10114 	  break;
10115 
10116 	/* Because the gfc_resolve_blocks() will handle the nested FORALL,
10117 	   there is no need to handle it here.  */
10118 	case EXEC_FORALL:
10119 	  break;
10120 	case EXEC_WHERE:
10121 	  gfc_resolve_where_code_in_forall(c, nvar, var_expr);
10122 	  break;
10123 	default:
10124 	  break;
10125 	}
10126       /* The next statement in the FORALL body.  */
10127       c = c->next;
10128     }
10129 }
10130 
10131 
10132 /* Counts the number of iterators needed inside a forall construct, including
10133    nested forall constructs. This is used to allocate the needed memory
10134    in gfc_resolve_forall.  */
10135 
10136 static int
gfc_count_forall_iterators(gfc_code * code)10137 gfc_count_forall_iterators (gfc_code *code)
10138 {
10139   int max_iters, sub_iters, current_iters;
10140   gfc_forall_iterator *fa;
10141 
10142   gcc_assert(code->op == EXEC_FORALL);
10143   max_iters = 0;
10144   current_iters = 0;
10145 
10146   for (fa = code->ext.forall_iterator; fa; fa = fa->next)
10147     current_iters ++;
10148 
10149   code = code->block->next;
10150 
10151   while (code)
10152     {
10153       if (code->op == EXEC_FORALL)
10154         {
10155           sub_iters = gfc_count_forall_iterators (code);
10156           if (sub_iters > max_iters)
10157             max_iters = sub_iters;
10158         }
10159       code = code->next;
10160     }
10161 
10162   return current_iters + max_iters;
10163 }
10164 
10165 
10166 /* Given a FORALL construct, first resolve the FORALL iterator, then call
10167    gfc_resolve_forall_body to resolve the FORALL body.  */
10168 
10169 static void
gfc_resolve_forall(gfc_code * code,gfc_namespace * ns,int forall_save)10170 gfc_resolve_forall (gfc_code *code, gfc_namespace *ns, int forall_save)
10171 {
10172   static gfc_expr **var_expr;
10173   static int total_var = 0;
10174   static int nvar = 0;
10175   int i, old_nvar, tmp;
10176   gfc_forall_iterator *fa;
10177 
10178   old_nvar = nvar;
10179 
10180   if (!gfc_notify_std (GFC_STD_F2018_OBS, "FORALL construct at %L", &code->loc))
10181     return;
10182 
10183   /* Start to resolve a FORALL construct   */
10184   if (forall_save == 0)
10185     {
10186       /* Count the total number of FORALL indices in the nested FORALL
10187          construct in order to allocate the VAR_EXPR with proper size.  */
10188       total_var = gfc_count_forall_iterators (code);
10189 
10190       /* Allocate VAR_EXPR with NUMBER_OF_FORALL_INDEX elements.  */
10191       var_expr = XCNEWVEC (gfc_expr *, total_var);
10192     }
10193 
10194   /* The information about FORALL iterator, including FORALL indices start, end
10195      and stride.  An outer FORALL indice cannot appear in start, end or stride.  */
10196   for (fa = code->ext.forall_iterator; fa; fa = fa->next)
10197     {
10198       /* Fortran 20008: C738 (R753).  */
10199       if (fa->var->ref && fa->var->ref->type == REF_ARRAY)
10200 	{
10201 	  gfc_error ("FORALL index-name at %L must be a scalar variable "
10202 		     "of type integer", &fa->var->where);
10203 	  continue;
10204 	}
10205 
10206       /* Check if any outer FORALL index name is the same as the current
10207 	 one.  */
10208       for (i = 0; i < nvar; i++)
10209 	{
10210 	  if (fa->var->symtree->n.sym == var_expr[i]->symtree->n.sym)
10211 	    gfc_error ("An outer FORALL construct already has an index "
10212 			"with this name %L", &fa->var->where);
10213 	}
10214 
10215       /* Record the current FORALL index.  */
10216       var_expr[nvar] = gfc_copy_expr (fa->var);
10217 
10218       nvar++;
10219 
10220       /* No memory leak.  */
10221       gcc_assert (nvar <= total_var);
10222     }
10223 
10224   /* Resolve the FORALL body.  */
10225   gfc_resolve_forall_body (code, nvar, var_expr);
10226 
10227   /* May call gfc_resolve_forall to resolve the inner FORALL loop.  */
10228   gfc_resolve_blocks (code->block, ns);
10229 
10230   tmp = nvar;
10231   nvar = old_nvar;
10232   /* Free only the VAR_EXPRs allocated in this frame.  */
10233   for (i = nvar; i < tmp; i++)
10234      gfc_free_expr (var_expr[i]);
10235 
10236   if (nvar == 0)
10237     {
10238       /* We are in the outermost FORALL construct.  */
10239       gcc_assert (forall_save == 0);
10240 
10241       /* VAR_EXPR is not needed any more.  */
10242       free (var_expr);
10243       total_var = 0;
10244     }
10245 }
10246 
10247 
10248 /* Resolve a BLOCK construct statement.  */
10249 
10250 static void
resolve_block_construct(gfc_code * code)10251 resolve_block_construct (gfc_code* code)
10252 {
10253   /* Resolve the BLOCK's namespace.  */
10254   gfc_resolve (code->ext.block.ns);
10255 
10256   /* For an ASSOCIATE block, the associations (and their targets) are already
10257      resolved during resolve_symbol.  */
10258 }
10259 
10260 
10261 /* Resolve lists of blocks found in IF, SELECT CASE, WHERE, FORALL, GOTO and
10262    DO code nodes.  */
10263 
10264 void
gfc_resolve_blocks(gfc_code * b,gfc_namespace * ns)10265 gfc_resolve_blocks (gfc_code *b, gfc_namespace *ns)
10266 {
10267   bool t;
10268 
10269   for (; b; b = b->block)
10270     {
10271       t = gfc_resolve_expr (b->expr1);
10272       if (!gfc_resolve_expr (b->expr2))
10273 	t = false;
10274 
10275       switch (b->op)
10276 	{
10277 	case EXEC_IF:
10278 	  if (t && b->expr1 != NULL
10279 	      && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank != 0))
10280 	    gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
10281 		       &b->expr1->where);
10282 	  break;
10283 
10284 	case EXEC_WHERE:
10285 	  if (t
10286 	      && b->expr1 != NULL
10287 	      && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank == 0))
10288 	    gfc_error ("WHERE/ELSEWHERE clause at %L requires a LOGICAL array",
10289 		       &b->expr1->where);
10290 	  break;
10291 
10292 	case EXEC_GOTO:
10293 	  resolve_branch (b->label1, b);
10294 	  break;
10295 
10296 	case EXEC_BLOCK:
10297 	  resolve_block_construct (b);
10298 	  break;
10299 
10300 	case EXEC_SELECT:
10301 	case EXEC_SELECT_TYPE:
10302 	case EXEC_FORALL:
10303 	case EXEC_DO:
10304 	case EXEC_DO_WHILE:
10305 	case EXEC_DO_CONCURRENT:
10306 	case EXEC_CRITICAL:
10307 	case EXEC_READ:
10308 	case EXEC_WRITE:
10309 	case EXEC_IOLENGTH:
10310 	case EXEC_WAIT:
10311 	  break;
10312 
10313 	case EXEC_OMP_ATOMIC:
10314 	case EXEC_OACC_ATOMIC:
10315 	  {
10316 	    gfc_omp_atomic_op aop
10317 	      = (gfc_omp_atomic_op) (b->ext.omp_atomic & GFC_OMP_ATOMIC_MASK);
10318 
10319 	    /* Verify this before calling gfc_resolve_code, which might
10320 	       change it.  */
10321 	    gcc_assert (b->next && b->next->op == EXEC_ASSIGN);
10322 	    gcc_assert (((aop != GFC_OMP_ATOMIC_CAPTURE)
10323 			 && b->next->next == NULL)
10324 			|| ((aop == GFC_OMP_ATOMIC_CAPTURE)
10325 			    && b->next->next != NULL
10326 			    && b->next->next->op == EXEC_ASSIGN
10327 			    && b->next->next->next == NULL));
10328 	  }
10329 	  break;
10330 
10331 	case EXEC_OACC_PARALLEL_LOOP:
10332 	case EXEC_OACC_PARALLEL:
10333 	case EXEC_OACC_KERNELS_LOOP:
10334 	case EXEC_OACC_KERNELS:
10335 	case EXEC_OACC_DATA:
10336 	case EXEC_OACC_HOST_DATA:
10337 	case EXEC_OACC_LOOP:
10338 	case EXEC_OACC_UPDATE:
10339 	case EXEC_OACC_WAIT:
10340 	case EXEC_OACC_CACHE:
10341 	case EXEC_OACC_ENTER_DATA:
10342 	case EXEC_OACC_EXIT_DATA:
10343 	case EXEC_OACC_ROUTINE:
10344 	case EXEC_OMP_CRITICAL:
10345 	case EXEC_OMP_DISTRIBUTE:
10346 	case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
10347 	case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
10348 	case EXEC_OMP_DISTRIBUTE_SIMD:
10349 	case EXEC_OMP_DO:
10350 	case EXEC_OMP_DO_SIMD:
10351 	case EXEC_OMP_MASTER:
10352 	case EXEC_OMP_ORDERED:
10353 	case EXEC_OMP_PARALLEL:
10354 	case EXEC_OMP_PARALLEL_DO:
10355 	case EXEC_OMP_PARALLEL_DO_SIMD:
10356 	case EXEC_OMP_PARALLEL_SECTIONS:
10357 	case EXEC_OMP_PARALLEL_WORKSHARE:
10358 	case EXEC_OMP_SECTIONS:
10359 	case EXEC_OMP_SIMD:
10360 	case EXEC_OMP_SINGLE:
10361 	case EXEC_OMP_TARGET:
10362 	case EXEC_OMP_TARGET_DATA:
10363 	case EXEC_OMP_TARGET_ENTER_DATA:
10364 	case EXEC_OMP_TARGET_EXIT_DATA:
10365 	case EXEC_OMP_TARGET_PARALLEL:
10366 	case EXEC_OMP_TARGET_PARALLEL_DO:
10367 	case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
10368 	case EXEC_OMP_TARGET_SIMD:
10369 	case EXEC_OMP_TARGET_TEAMS:
10370 	case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
10371 	case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
10372 	case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
10373 	case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
10374 	case EXEC_OMP_TARGET_UPDATE:
10375 	case EXEC_OMP_TASK:
10376 	case EXEC_OMP_TASKGROUP:
10377 	case EXEC_OMP_TASKLOOP:
10378 	case EXEC_OMP_TASKLOOP_SIMD:
10379 	case EXEC_OMP_TASKWAIT:
10380 	case EXEC_OMP_TASKYIELD:
10381 	case EXEC_OMP_TEAMS:
10382 	case EXEC_OMP_TEAMS_DISTRIBUTE:
10383 	case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
10384 	case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
10385 	case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
10386 	case EXEC_OMP_WORKSHARE:
10387 	  break;
10388 
10389 	default:
10390 	  gfc_internal_error ("gfc_resolve_blocks(): Bad block type");
10391 	}
10392 
10393       gfc_resolve_code (b->next, ns);
10394     }
10395 }
10396 
10397 
10398 /* Does everything to resolve an ordinary assignment.  Returns true
10399    if this is an interface assignment.  */
10400 static bool
resolve_ordinary_assign(gfc_code * code,gfc_namespace * ns)10401 resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns)
10402 {
10403   bool rval = false;
10404   gfc_expr *lhs;
10405   gfc_expr *rhs;
10406   int n;
10407   gfc_ref *ref;
10408   symbol_attribute attr;
10409 
10410   if (gfc_extend_assign (code, ns))
10411     {
10412       gfc_expr** rhsptr;
10413 
10414       if (code->op == EXEC_ASSIGN_CALL)
10415 	{
10416 	  lhs = code->ext.actual->expr;
10417 	  rhsptr = &code->ext.actual->next->expr;
10418 	}
10419       else
10420 	{
10421 	  gfc_actual_arglist* args;
10422 	  gfc_typebound_proc* tbp;
10423 
10424 	  gcc_assert (code->op == EXEC_COMPCALL);
10425 
10426 	  args = code->expr1->value.compcall.actual;
10427 	  lhs = args->expr;
10428 	  rhsptr = &args->next->expr;
10429 
10430 	  tbp = code->expr1->value.compcall.tbp;
10431 	  gcc_assert (!tbp->is_generic);
10432 	}
10433 
10434       /* Make a temporary rhs when there is a default initializer
10435 	 and rhs is the same symbol as the lhs.  */
10436       if ((*rhsptr)->expr_type == EXPR_VARIABLE
10437 	    && (*rhsptr)->symtree->n.sym->ts.type == BT_DERIVED
10438 	    && gfc_has_default_initializer ((*rhsptr)->symtree->n.sym->ts.u.derived)
10439 	    && (lhs->symtree->n.sym == (*rhsptr)->symtree->n.sym))
10440 	*rhsptr = gfc_get_parentheses (*rhsptr);
10441 
10442       return true;
10443     }
10444 
10445   lhs = code->expr1;
10446   rhs = code->expr2;
10447 
10448   if (rhs->is_boz
10449       && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L outside "
10450 			  "a DATA statement and outside INT/REAL/DBLE/CMPLX",
10451 			  &code->loc))
10452     return false;
10453 
10454   /* Handle the case of a BOZ literal on the RHS.  */
10455   if (rhs->is_boz && lhs->ts.type != BT_INTEGER)
10456     {
10457       int rc;
10458       if (warn_surprising)
10459 	gfc_warning (OPT_Wsurprising,
10460 		     "BOZ literal at %L is bitwise transferred "
10461 		     "non-integer symbol %qs", &code->loc,
10462 		     lhs->symtree->n.sym->name);
10463 
10464       if (!gfc_convert_boz (rhs, &lhs->ts))
10465 	return false;
10466       if ((rc = gfc_range_check (rhs)) != ARITH_OK)
10467 	{
10468 	  if (rc == ARITH_UNDERFLOW)
10469 	    gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
10470 		       ". This check can be disabled with the option "
10471 		       "%<-fno-range-check%>", &rhs->where);
10472 	  else if (rc == ARITH_OVERFLOW)
10473 	    gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
10474 		       ". This check can be disabled with the option "
10475 		       "%<-fno-range-check%>", &rhs->where);
10476 	  else if (rc == ARITH_NAN)
10477 	    gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
10478 		       ". This check can be disabled with the option "
10479 		       "%<-fno-range-check%>", &rhs->where);
10480 	  return false;
10481 	}
10482     }
10483 
10484   if (lhs->ts.type == BT_CHARACTER
10485 	&& warn_character_truncation)
10486     {
10487       HOST_WIDE_INT llen = 0, rlen = 0;
10488       if (lhs->ts.u.cl != NULL
10489 	    && lhs->ts.u.cl->length != NULL
10490 	    && lhs->ts.u.cl->length->expr_type == EXPR_CONSTANT)
10491 	llen = gfc_mpz_get_hwi (lhs->ts.u.cl->length->value.integer);
10492 
10493       if (rhs->expr_type == EXPR_CONSTANT)
10494  	rlen = rhs->value.character.length;
10495 
10496       else if (rhs->ts.u.cl != NULL
10497 		 && rhs->ts.u.cl->length != NULL
10498 		 && rhs->ts.u.cl->length->expr_type == EXPR_CONSTANT)
10499 	rlen = gfc_mpz_get_hwi (rhs->ts.u.cl->length->value.integer);
10500 
10501       if (rlen && llen && rlen > llen)
10502 	gfc_warning_now (OPT_Wcharacter_truncation,
10503 			 "CHARACTER expression will be truncated "
10504 			 "in assignment (%ld/%ld) at %L",
10505 			 (long) llen, (long) rlen, &code->loc);
10506     }
10507 
10508   /* Ensure that a vector index expression for the lvalue is evaluated
10509      to a temporary if the lvalue symbol is referenced in it.  */
10510   if (lhs->rank)
10511     {
10512       for (ref = lhs->ref; ref; ref= ref->next)
10513 	if (ref->type == REF_ARRAY)
10514 	  {
10515 	    for (n = 0; n < ref->u.ar.dimen; n++)
10516 	      if (ref->u.ar.dimen_type[n] == DIMEN_VECTOR
10517 		  && gfc_find_sym_in_expr (lhs->symtree->n.sym,
10518 					   ref->u.ar.start[n]))
10519 		ref->u.ar.start[n]
10520 			= gfc_get_parentheses (ref->u.ar.start[n]);
10521 	  }
10522     }
10523 
10524   if (gfc_pure (NULL))
10525     {
10526       if (lhs->ts.type == BT_DERIVED
10527 	    && lhs->expr_type == EXPR_VARIABLE
10528 	    && lhs->ts.u.derived->attr.pointer_comp
10529 	    && rhs->expr_type == EXPR_VARIABLE
10530 	    && (gfc_impure_variable (rhs->symtree->n.sym)
10531 		|| gfc_is_coindexed (rhs)))
10532 	{
10533 	  /* F2008, C1283.  */
10534 	  if (gfc_is_coindexed (rhs))
10535 	    gfc_error ("Coindexed expression at %L is assigned to "
10536 			"a derived type variable with a POINTER "
10537 			"component in a PURE procedure",
10538 			&rhs->where);
10539 	  else
10540 	    gfc_error ("The impure variable at %L is assigned to "
10541 			"a derived type variable with a POINTER "
10542 			"component in a PURE procedure (12.6)",
10543 			&rhs->where);
10544 	  return rval;
10545 	}
10546 
10547       /* Fortran 2008, C1283.  */
10548       if (gfc_is_coindexed (lhs))
10549 	{
10550 	  gfc_error ("Assignment to coindexed variable at %L in a PURE "
10551 		     "procedure", &rhs->where);
10552 	  return rval;
10553 	}
10554     }
10555 
10556   if (gfc_implicit_pure (NULL))
10557     {
10558       if (lhs->expr_type == EXPR_VARIABLE
10559 	    && lhs->symtree->n.sym != gfc_current_ns->proc_name
10560 	    && lhs->symtree->n.sym->ns != gfc_current_ns)
10561 	gfc_unset_implicit_pure (NULL);
10562 
10563       if (lhs->ts.type == BT_DERIVED
10564 	    && lhs->expr_type == EXPR_VARIABLE
10565 	    && lhs->ts.u.derived->attr.pointer_comp
10566 	    && rhs->expr_type == EXPR_VARIABLE
10567 	    && (gfc_impure_variable (rhs->symtree->n.sym)
10568 		|| gfc_is_coindexed (rhs)))
10569 	gfc_unset_implicit_pure (NULL);
10570 
10571       /* Fortran 2008, C1283.  */
10572       if (gfc_is_coindexed (lhs))
10573 	gfc_unset_implicit_pure (NULL);
10574     }
10575 
10576   /* F2008, 7.2.1.2.  */
10577   attr = gfc_expr_attr (lhs);
10578   if (lhs->ts.type == BT_CLASS && attr.allocatable)
10579     {
10580       if (attr.codimension)
10581 	{
10582 	  gfc_error ("Assignment to polymorphic coarray at %L is not "
10583 		     "permitted", &lhs->where);
10584 	  return false;
10585 	}
10586       if (!gfc_notify_std (GFC_STD_F2008, "Assignment to an allocatable "
10587 			   "polymorphic variable at %L", &lhs->where))
10588 	return false;
10589       if (!flag_realloc_lhs)
10590 	{
10591 	  gfc_error ("Assignment to an allocatable polymorphic variable at %L "
10592 		     "requires %<-frealloc-lhs%>", &lhs->where);
10593 	  return false;
10594 	}
10595     }
10596   else if (lhs->ts.type == BT_CLASS)
10597     {
10598       gfc_error ("Nonallocatable variable must not be polymorphic in intrinsic "
10599 		 "assignment at %L - check that there is a matching specific "
10600 		 "subroutine for '=' operator", &lhs->where);
10601       return false;
10602     }
10603 
10604   bool lhs_coindexed = gfc_is_coindexed (lhs);
10605 
10606   /* F2008, Section 7.2.1.2.  */
10607   if (lhs_coindexed && gfc_has_ultimate_allocatable (lhs))
10608     {
10609       gfc_error ("Coindexed variable must not have an allocatable ultimate "
10610 		 "component in assignment at %L", &lhs->where);
10611       return false;
10612     }
10613 
10614   /* Assign the 'data' of a class object to a derived type.  */
10615   if (lhs->ts.type == BT_DERIVED
10616       && rhs->ts.type == BT_CLASS
10617       && rhs->expr_type != EXPR_ARRAY)
10618     gfc_add_data_component (rhs);
10619 
10620   /* Make sure there is a vtable and, in particular, a _copy for the
10621      rhs type.  */
10622   if (UNLIMITED_POLY (lhs) && lhs->rank && rhs->ts.type != BT_CLASS)
10623     gfc_find_vtab (&rhs->ts);
10624 
10625   bool caf_convert_to_send = flag_coarray == GFC_FCOARRAY_LIB
10626       && (lhs_coindexed
10627 	  || (code->expr2->expr_type == EXPR_FUNCTION
10628 	      && code->expr2->value.function.isym
10629 	      && code->expr2->value.function.isym->id == GFC_ISYM_CAF_GET
10630 	      && (code->expr1->rank == 0 || code->expr2->rank != 0)
10631 	      && !gfc_expr_attr (rhs).allocatable
10632 	      && !gfc_has_vector_subscript (rhs)));
10633 
10634   gfc_check_assign (lhs, rhs, 1, !caf_convert_to_send);
10635 
10636   /* Insert a GFC_ISYM_CAF_SEND intrinsic, when the LHS is a coindexed variable.
10637      Additionally, insert this code when the RHS is a CAF as we then use the
10638      GFC_ISYM_CAF_SEND intrinsic just to avoid a temporary; but do not do so if
10639      the LHS is (re)allocatable or has a vector subscript.  If the LHS is a
10640      noncoindexed array and the RHS is a coindexed scalar, use the normal code
10641      path.  */
10642   if (caf_convert_to_send)
10643     {
10644       if (code->expr2->expr_type == EXPR_FUNCTION
10645 	  && code->expr2->value.function.isym
10646 	  && code->expr2->value.function.isym->id == GFC_ISYM_CAF_GET)
10647 	remove_caf_get_intrinsic (code->expr2);
10648       code->op = EXEC_CALL;
10649       gfc_get_sym_tree (GFC_PREFIX ("caf_send"), ns, &code->symtree, true);
10650       code->resolved_sym = code->symtree->n.sym;
10651       code->resolved_sym->attr.flavor = FL_PROCEDURE;
10652       code->resolved_sym->attr.intrinsic = 1;
10653       code->resolved_sym->attr.subroutine = 1;
10654       code->resolved_isym = gfc_intrinsic_subroutine_by_id (GFC_ISYM_CAF_SEND);
10655       gfc_commit_symbol (code->resolved_sym);
10656       code->ext.actual = gfc_get_actual_arglist ();
10657       code->ext.actual->expr = lhs;
10658       code->ext.actual->next = gfc_get_actual_arglist ();
10659       code->ext.actual->next->expr = rhs;
10660       code->expr1 = NULL;
10661       code->expr2 = NULL;
10662     }
10663 
10664   return false;
10665 }
10666 
10667 
10668 /* Add a component reference onto an expression.  */
10669 
10670 static void
add_comp_ref(gfc_expr * e,gfc_component * c)10671 add_comp_ref (gfc_expr *e, gfc_component *c)
10672 {
10673   gfc_ref **ref;
10674   ref = &(e->ref);
10675   while (*ref)
10676     ref = &((*ref)->next);
10677   *ref = gfc_get_ref ();
10678   (*ref)->type = REF_COMPONENT;
10679   (*ref)->u.c.sym = e->ts.u.derived;
10680   (*ref)->u.c.component = c;
10681   e->ts = c->ts;
10682 
10683   /* Add a full array ref, as necessary.  */
10684   if (c->as)
10685     {
10686       gfc_add_full_array_ref (e, c->as);
10687       e->rank = c->as->rank;
10688     }
10689 }
10690 
10691 
10692 /* Build an assignment.  Keep the argument 'op' for future use, so that
10693    pointer assignments can be made.  */
10694 
10695 static gfc_code *
build_assignment(gfc_exec_op op,gfc_expr * expr1,gfc_expr * expr2,gfc_component * comp1,gfc_component * comp2,locus loc)10696 build_assignment (gfc_exec_op op, gfc_expr *expr1, gfc_expr *expr2,
10697 		  gfc_component *comp1, gfc_component *comp2, locus loc)
10698 {
10699   gfc_code *this_code;
10700 
10701   this_code = gfc_get_code (op);
10702   this_code->next = NULL;
10703   this_code->expr1 = gfc_copy_expr (expr1);
10704   this_code->expr2 = gfc_copy_expr (expr2);
10705   this_code->loc = loc;
10706   if (comp1 && comp2)
10707     {
10708       add_comp_ref (this_code->expr1, comp1);
10709       add_comp_ref (this_code->expr2, comp2);
10710     }
10711 
10712   return this_code;
10713 }
10714 
10715 
10716 /* Makes a temporary variable expression based on the characteristics of
10717    a given variable expression.  */
10718 
10719 static gfc_expr*
get_temp_from_expr(gfc_expr * e,gfc_namespace * ns)10720 get_temp_from_expr (gfc_expr *e, gfc_namespace *ns)
10721 {
10722   static int serial = 0;
10723   char name[GFC_MAX_SYMBOL_LEN];
10724   gfc_symtree *tmp;
10725   gfc_array_spec *as;
10726   gfc_array_ref *aref;
10727   gfc_ref *ref;
10728 
10729   sprintf (name, GFC_PREFIX("DA%d"), serial++);
10730   gfc_get_sym_tree (name, ns, &tmp, false);
10731   gfc_add_type (tmp->n.sym, &e->ts, NULL);
10732 
10733   if (e->expr_type == EXPR_CONSTANT && e->ts.type == BT_CHARACTER)
10734     tmp->n.sym->ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind,
10735 						    NULL,
10736 						    e->value.character.length);
10737 
10738   as = NULL;
10739   ref = NULL;
10740   aref = NULL;
10741 
10742   /* Obtain the arrayspec for the temporary.  */
10743    if (e->rank && e->expr_type != EXPR_ARRAY
10744        && e->expr_type != EXPR_FUNCTION
10745        && e->expr_type != EXPR_OP)
10746     {
10747       aref = gfc_find_array_ref (e);
10748       if (e->expr_type == EXPR_VARIABLE
10749 	  && e->symtree->n.sym->as == aref->as)
10750 	as = aref->as;
10751       else
10752 	{
10753 	  for (ref = e->ref; ref; ref = ref->next)
10754 	    if (ref->type == REF_COMPONENT
10755 		&& ref->u.c.component->as == aref->as)
10756 	      {
10757 		as = aref->as;
10758 		break;
10759 	      }
10760 	}
10761     }
10762 
10763   /* Add the attributes and the arrayspec to the temporary.  */
10764   tmp->n.sym->attr = gfc_expr_attr (e);
10765   tmp->n.sym->attr.function = 0;
10766   tmp->n.sym->attr.result = 0;
10767   tmp->n.sym->attr.flavor = FL_VARIABLE;
10768   tmp->n.sym->attr.dummy = 0;
10769   tmp->n.sym->attr.intent = INTENT_UNKNOWN;
10770 
10771   if (as)
10772     {
10773       tmp->n.sym->as = gfc_copy_array_spec (as);
10774       if (!ref)
10775 	ref = e->ref;
10776       if (as->type == AS_DEFERRED)
10777 	tmp->n.sym->attr.allocatable = 1;
10778     }
10779   else if (e->rank && (e->expr_type == EXPR_ARRAY
10780 		       || e->expr_type == EXPR_FUNCTION
10781 		       || e->expr_type == EXPR_OP))
10782     {
10783       tmp->n.sym->as = gfc_get_array_spec ();
10784       tmp->n.sym->as->type = AS_DEFERRED;
10785       tmp->n.sym->as->rank = e->rank;
10786       tmp->n.sym->attr.allocatable = 1;
10787       tmp->n.sym->attr.dimension = 1;
10788     }
10789   else
10790     tmp->n.sym->attr.dimension = 0;
10791 
10792   gfc_set_sym_referenced (tmp->n.sym);
10793   gfc_commit_symbol (tmp->n.sym);
10794   e = gfc_lval_expr_from_sym (tmp->n.sym);
10795 
10796   /* Should the lhs be a section, use its array ref for the
10797      temporary expression.  */
10798   if (aref && aref->type != AR_FULL)
10799     {
10800       gfc_free_ref_list (e->ref);
10801       e->ref = gfc_copy_ref (ref);
10802     }
10803   return e;
10804 }
10805 
10806 
10807 /* Add one line of code to the code chain, making sure that 'head' and
10808    'tail' are appropriately updated.  */
10809 
10810 static void
add_code_to_chain(gfc_code ** this_code,gfc_code ** head,gfc_code ** tail)10811 add_code_to_chain (gfc_code **this_code, gfc_code **head, gfc_code **tail)
10812 {
10813   gcc_assert (this_code);
10814   if (*head == NULL)
10815     *head = *tail = *this_code;
10816   else
10817     *tail = gfc_append_code (*tail, *this_code);
10818   *this_code = NULL;
10819 }
10820 
10821 
10822 /* Counts the potential number of part array references that would
10823    result from resolution of typebound defined assignments.  */
10824 
10825 static int
nonscalar_typebound_assign(gfc_symbol * derived,int depth)10826 nonscalar_typebound_assign (gfc_symbol *derived, int depth)
10827 {
10828   gfc_component *c;
10829   int c_depth = 0, t_depth;
10830 
10831   for (c= derived->components; c; c = c->next)
10832     {
10833       if ((!gfc_bt_struct (c->ts.type)
10834 	    || c->attr.pointer
10835 	    || c->attr.allocatable
10836 	    || c->attr.proc_pointer_comp
10837 	    || c->attr.class_pointer
10838 	    || c->attr.proc_pointer)
10839 	  && !c->attr.defined_assign_comp)
10840 	continue;
10841 
10842       if (c->as && c_depth == 0)
10843 	c_depth = 1;
10844 
10845       if (c->ts.u.derived->attr.defined_assign_comp)
10846 	t_depth = nonscalar_typebound_assign (c->ts.u.derived,
10847 					      c->as ? 1 : 0);
10848       else
10849 	t_depth = 0;
10850 
10851       c_depth = t_depth > c_depth ? t_depth : c_depth;
10852     }
10853   return depth + c_depth;
10854 }
10855 
10856 
10857 /* Implement 7.2.1.3 of the F08 standard:
10858    "An intrinsic assignment where the variable is of derived type is
10859    performed as if each component of the variable were assigned from the
10860    corresponding component of expr using pointer assignment (7.2.2) for
10861    each pointer component, defined assignment for each nonpointer
10862    nonallocatable component of a type that has a type-bound defined
10863    assignment consistent with the component, intrinsic assignment for
10864    each other nonpointer nonallocatable component, ..."
10865 
10866    The pointer assignments are taken care of by the intrinsic
10867    assignment of the structure itself.  This function recursively adds
10868    defined assignments where required.  The recursion is accomplished
10869    by calling gfc_resolve_code.
10870 
10871    When the lhs in a defined assignment has intent INOUT, we need a
10872    temporary for the lhs.  In pseudo-code:
10873 
10874    ! Only call function lhs once.
10875       if (lhs is not a constant or an variable)
10876 	  temp_x = expr2
10877           expr2 => temp_x
10878    ! Do the intrinsic assignment
10879       expr1 = expr2
10880    ! Now do the defined assignments
10881       do over components with typebound defined assignment [%cmp]
10882 	#if one component's assignment procedure is INOUT
10883 	  t1 = expr1
10884 	  #if expr2 non-variable
10885 	    temp_x = expr2
10886 	    expr2 => temp_x
10887 	  # endif
10888 	  expr1 = expr2
10889 	  # for each cmp
10890 	    t1%cmp {defined=} expr2%cmp
10891 	    expr1%cmp = t1%cmp
10892 	#else
10893 	  expr1 = expr2
10894 
10895 	# for each cmp
10896 	  expr1%cmp {defined=} expr2%cmp
10897 	#endif
10898    */
10899 
10900 /* The temporary assignments have to be put on top of the additional
10901    code to avoid the result being changed by the intrinsic assignment.
10902    */
10903 static int component_assignment_level = 0;
10904 static gfc_code *tmp_head = NULL, *tmp_tail = NULL;
10905 
10906 static void
generate_component_assignments(gfc_code ** code,gfc_namespace * ns)10907 generate_component_assignments (gfc_code **code, gfc_namespace *ns)
10908 {
10909   gfc_component *comp1, *comp2;
10910   gfc_code *this_code = NULL, *head = NULL, *tail = NULL;
10911   gfc_expr *t1;
10912   int error_count, depth;
10913 
10914   gfc_get_errors (NULL, &error_count);
10915 
10916   /* Filter out continuing processing after an error.  */
10917   if (error_count
10918       || (*code)->expr1->ts.type != BT_DERIVED
10919       || (*code)->expr2->ts.type != BT_DERIVED)
10920     return;
10921 
10922   /* TODO: Handle more than one part array reference in assignments.  */
10923   depth = nonscalar_typebound_assign ((*code)->expr1->ts.u.derived,
10924 				      (*code)->expr1->rank ? 1 : 0);
10925   if (depth > 1)
10926     {
10927       gfc_warning (0, "TODO: type-bound defined assignment(s) at %L not "
10928 		   "done because multiple part array references would "
10929 		   "occur in intermediate expressions.", &(*code)->loc);
10930       return;
10931     }
10932 
10933   component_assignment_level++;
10934 
10935   /* Create a temporary so that functions get called only once.  */
10936   if ((*code)->expr2->expr_type != EXPR_VARIABLE
10937       && (*code)->expr2->expr_type != EXPR_CONSTANT)
10938     {
10939       gfc_expr *tmp_expr;
10940 
10941       /* Assign the rhs to the temporary.  */
10942       tmp_expr = get_temp_from_expr ((*code)->expr1, ns);
10943       this_code = build_assignment (EXEC_ASSIGN,
10944 				    tmp_expr, (*code)->expr2,
10945 				    NULL, NULL, (*code)->loc);
10946       /* Add the code and substitute the rhs expression.  */
10947       add_code_to_chain (&this_code, &tmp_head, &tmp_tail);
10948       gfc_free_expr ((*code)->expr2);
10949       (*code)->expr2 = tmp_expr;
10950     }
10951 
10952   /* Do the intrinsic assignment.  This is not needed if the lhs is one
10953      of the temporaries generated here, since the intrinsic assignment
10954      to the final result already does this.  */
10955   if ((*code)->expr1->symtree->n.sym->name[2] != '@')
10956     {
10957       this_code = build_assignment (EXEC_ASSIGN,
10958 				    (*code)->expr1, (*code)->expr2,
10959 				    NULL, NULL, (*code)->loc);
10960       add_code_to_chain (&this_code, &head, &tail);
10961     }
10962 
10963   comp1 = (*code)->expr1->ts.u.derived->components;
10964   comp2 = (*code)->expr2->ts.u.derived->components;
10965 
10966   t1 = NULL;
10967   for (; comp1; comp1 = comp1->next, comp2 = comp2->next)
10968     {
10969       bool inout = false;
10970 
10971       /* The intrinsic assignment does the right thing for pointers
10972 	 of all kinds and allocatable components.  */
10973       if (!gfc_bt_struct (comp1->ts.type)
10974 	  || comp1->attr.pointer
10975 	  || comp1->attr.allocatable
10976 	  || comp1->attr.proc_pointer_comp
10977 	  || comp1->attr.class_pointer
10978 	  || comp1->attr.proc_pointer)
10979 	continue;
10980 
10981       /* Make an assigment for this component.  */
10982       this_code = build_assignment (EXEC_ASSIGN,
10983 				    (*code)->expr1, (*code)->expr2,
10984 				    comp1, comp2, (*code)->loc);
10985 
10986       /* Convert the assignment if there is a defined assignment for
10987 	 this type.  Otherwise, using the call from gfc_resolve_code,
10988 	 recurse into its components.  */
10989       gfc_resolve_code (this_code, ns);
10990 
10991       if (this_code->op == EXEC_ASSIGN_CALL)
10992 	{
10993 	  gfc_formal_arglist *dummy_args;
10994 	  gfc_symbol *rsym;
10995 	  /* Check that there is a typebound defined assignment.  If not,
10996 	     then this must be a module defined assignment.  We cannot
10997 	     use the defined_assign_comp attribute here because it must
10998 	     be this derived type that has the defined assignment and not
10999 	     a parent type.  */
11000 	  if (!(comp1->ts.u.derived->f2k_derived
11001 		&& comp1->ts.u.derived->f2k_derived
11002 					->tb_op[INTRINSIC_ASSIGN]))
11003 	    {
11004 	      gfc_free_statements (this_code);
11005 	      this_code = NULL;
11006 	      continue;
11007 	    }
11008 
11009 	  /* If the first argument of the subroutine has intent INOUT
11010 	     a temporary must be generated and used instead.  */
11011 	  rsym = this_code->resolved_sym;
11012 	  dummy_args = gfc_sym_get_dummy_args (rsym);
11013 	  if (dummy_args
11014 	      && dummy_args->sym->attr.intent == INTENT_INOUT)
11015 	    {
11016 	      gfc_code *temp_code;
11017 	      inout = true;
11018 
11019 	      /* Build the temporary required for the assignment and put
11020 		 it at the head of the generated code.  */
11021 	      if (!t1)
11022 		{
11023 		  t1 = get_temp_from_expr ((*code)->expr1, ns);
11024 		  temp_code = build_assignment (EXEC_ASSIGN,
11025 						t1, (*code)->expr1,
11026 				NULL, NULL, (*code)->loc);
11027 
11028 		  /* For allocatable LHS, check whether it is allocated.  Note
11029 		     that allocatable components with defined assignment are
11030 		     not yet support.  See PR 57696.  */
11031 		  if ((*code)->expr1->symtree->n.sym->attr.allocatable)
11032 		    {
11033 		      gfc_code *block;
11034 		      gfc_expr *e =
11035 			gfc_lval_expr_from_sym ((*code)->expr1->symtree->n.sym);
11036 		      block = gfc_get_code (EXEC_IF);
11037 		      block->block = gfc_get_code (EXEC_IF);
11038 		      block->block->expr1
11039 			  = gfc_build_intrinsic_call (ns,
11040 				    GFC_ISYM_ALLOCATED, "allocated",
11041 				    (*code)->loc, 1, e);
11042 		      block->block->next = temp_code;
11043 		      temp_code = block;
11044 		    }
11045 		  add_code_to_chain (&temp_code, &tmp_head, &tmp_tail);
11046 		}
11047 
11048 	      /* Replace the first actual arg with the component of the
11049 		 temporary.  */
11050 	      gfc_free_expr (this_code->ext.actual->expr);
11051 	      this_code->ext.actual->expr = gfc_copy_expr (t1);
11052 	      add_comp_ref (this_code->ext.actual->expr, comp1);
11053 
11054 	      /* If the LHS variable is allocatable and wasn't allocated and
11055                  the temporary is allocatable, pointer assign the address of
11056                  the freshly allocated LHS to the temporary.  */
11057 	      if ((*code)->expr1->symtree->n.sym->attr.allocatable
11058 		  && gfc_expr_attr ((*code)->expr1).allocatable)
11059 		{
11060 		  gfc_code *block;
11061 		  gfc_expr *cond;
11062 
11063 		  cond = gfc_get_expr ();
11064 		  cond->ts.type = BT_LOGICAL;
11065 		  cond->ts.kind = gfc_default_logical_kind;
11066 		  cond->expr_type = EXPR_OP;
11067 		  cond->where = (*code)->loc;
11068 		  cond->value.op.op = INTRINSIC_NOT;
11069 		  cond->value.op.op1 = gfc_build_intrinsic_call (ns,
11070 					  GFC_ISYM_ALLOCATED, "allocated",
11071 					  (*code)->loc, 1, gfc_copy_expr (t1));
11072 		  block = gfc_get_code (EXEC_IF);
11073 		  block->block = gfc_get_code (EXEC_IF);
11074 		  block->block->expr1 = cond;
11075 		  block->block->next = build_assignment (EXEC_POINTER_ASSIGN,
11076 					t1, (*code)->expr1,
11077 					NULL, NULL, (*code)->loc);
11078 		  add_code_to_chain (&block, &head, &tail);
11079 		}
11080 	    }
11081 	}
11082       else if (this_code->op == EXEC_ASSIGN && !this_code->next)
11083 	{
11084 	  /* Don't add intrinsic assignments since they are already
11085 	     effected by the intrinsic assignment of the structure.  */
11086 	  gfc_free_statements (this_code);
11087 	  this_code = NULL;
11088 	  continue;
11089 	}
11090 
11091       add_code_to_chain (&this_code, &head, &tail);
11092 
11093       if (t1 && inout)
11094 	{
11095 	  /* Transfer the value to the final result.  */
11096 	  this_code = build_assignment (EXEC_ASSIGN,
11097 					(*code)->expr1, t1,
11098 					comp1, comp2, (*code)->loc);
11099 	  add_code_to_chain (&this_code, &head, &tail);
11100 	}
11101     }
11102 
11103   /* Put the temporary assignments at the top of the generated code.  */
11104   if (tmp_head && component_assignment_level == 1)
11105     {
11106       gfc_append_code (tmp_head, head);
11107       head = tmp_head;
11108       tmp_head = tmp_tail = NULL;
11109     }
11110 
11111   // If we did a pointer assignment - thus, we need to ensure that the LHS is
11112   // not accidentally deallocated. Hence, nullify t1.
11113   if (t1 && (*code)->expr1->symtree->n.sym->attr.allocatable
11114       && gfc_expr_attr ((*code)->expr1).allocatable)
11115     {
11116       gfc_code *block;
11117       gfc_expr *cond;
11118       gfc_expr *e;
11119 
11120       e = gfc_lval_expr_from_sym ((*code)->expr1->symtree->n.sym);
11121       cond = gfc_build_intrinsic_call (ns, GFC_ISYM_ASSOCIATED, "associated",
11122 				       (*code)->loc, 2, gfc_copy_expr (t1), e);
11123       block = gfc_get_code (EXEC_IF);
11124       block->block = gfc_get_code (EXEC_IF);
11125       block->block->expr1 = cond;
11126       block->block->next = build_assignment (EXEC_POINTER_ASSIGN,
11127 					t1, gfc_get_null_expr (&(*code)->loc),
11128 					NULL, NULL, (*code)->loc);
11129       gfc_append_code (tail, block);
11130       tail = block;
11131     }
11132 
11133   /* Now attach the remaining code chain to the input code.  Step on
11134      to the end of the new code since resolution is complete.  */
11135   gcc_assert ((*code)->op == EXEC_ASSIGN);
11136   tail->next = (*code)->next;
11137   /* Overwrite 'code' because this would place the intrinsic assignment
11138      before the temporary for the lhs is created.  */
11139   gfc_free_expr ((*code)->expr1);
11140   gfc_free_expr ((*code)->expr2);
11141   **code = *head;
11142   if (head != tail)
11143     free (head);
11144   *code = tail;
11145 
11146   component_assignment_level--;
11147 }
11148 
11149 
11150 /* F2008: Pointer function assignments are of the form:
11151 	ptr_fcn (args) = expr
11152    This function breaks these assignments into two statements:
11153 	temporary_pointer => ptr_fcn(args)
11154 	temporary_pointer = expr  */
11155 
11156 static bool
resolve_ptr_fcn_assign(gfc_code ** code,gfc_namespace * ns)11157 resolve_ptr_fcn_assign (gfc_code **code, gfc_namespace *ns)
11158 {
11159   gfc_expr *tmp_ptr_expr;
11160   gfc_code *this_code;
11161   gfc_component *comp;
11162   gfc_symbol *s;
11163 
11164   if ((*code)->expr1->expr_type != EXPR_FUNCTION)
11165     return false;
11166 
11167   /* Even if standard does not support this feature, continue to build
11168      the two statements to avoid upsetting frontend_passes.c.  */
11169   gfc_notify_std (GFC_STD_F2008, "Pointer procedure assignment at "
11170 		  "%L", &(*code)->loc);
11171 
11172   comp = gfc_get_proc_ptr_comp ((*code)->expr1);
11173 
11174   if (comp)
11175     s = comp->ts.interface;
11176   else
11177     s = (*code)->expr1->symtree->n.sym;
11178 
11179   if (s == NULL || !s->result->attr.pointer)
11180     {
11181       gfc_error ("The function result on the lhs of the assignment at "
11182 		 "%L must have the pointer attribute.",
11183 		 &(*code)->expr1->where);
11184       (*code)->op = EXEC_NOP;
11185       return false;
11186     }
11187 
11188   tmp_ptr_expr = get_temp_from_expr ((*code)->expr2, ns);
11189 
11190   /* get_temp_from_expression is set up for ordinary assignments. To that
11191      end, where array bounds are not known, arrays are made allocatable.
11192      Change the temporary to a pointer here.  */
11193   tmp_ptr_expr->symtree->n.sym->attr.pointer = 1;
11194   tmp_ptr_expr->symtree->n.sym->attr.allocatable = 0;
11195   tmp_ptr_expr->where = (*code)->loc;
11196 
11197   this_code = build_assignment (EXEC_ASSIGN,
11198 				tmp_ptr_expr, (*code)->expr2,
11199 				NULL, NULL, (*code)->loc);
11200   this_code->next = (*code)->next;
11201   (*code)->next = this_code;
11202   (*code)->op = EXEC_POINTER_ASSIGN;
11203   (*code)->expr2 = (*code)->expr1;
11204   (*code)->expr1 = tmp_ptr_expr;
11205 
11206   return true;
11207 }
11208 
11209 
11210 /* Deferred character length assignments from an operator expression
11211    require a temporary because the character length of the lhs can
11212    change in the course of the assignment.  */
11213 
11214 static bool
deferred_op_assign(gfc_code ** code,gfc_namespace * ns)11215 deferred_op_assign (gfc_code **code, gfc_namespace *ns)
11216 {
11217   gfc_expr *tmp_expr;
11218   gfc_code *this_code;
11219 
11220   if (!((*code)->expr1->ts.type == BT_CHARACTER
11221 	 && (*code)->expr1->ts.deferred && (*code)->expr1->rank
11222 	 && (*code)->expr2->expr_type == EXPR_OP))
11223     return false;
11224 
11225   if (!gfc_check_dependency ((*code)->expr1, (*code)->expr2, 1))
11226     return false;
11227 
11228   if (gfc_expr_attr ((*code)->expr1).pointer)
11229     return false;
11230 
11231   tmp_expr = get_temp_from_expr ((*code)->expr1, ns);
11232   tmp_expr->where = (*code)->loc;
11233 
11234   /* A new charlen is required to ensure that the variable string
11235      length is different to that of the original lhs.  */
11236   tmp_expr->ts.u.cl = gfc_get_charlen();
11237   tmp_expr->symtree->n.sym->ts.u.cl = tmp_expr->ts.u.cl;
11238   tmp_expr->ts.u.cl->next = (*code)->expr2->ts.u.cl->next;
11239   (*code)->expr2->ts.u.cl->next = tmp_expr->ts.u.cl;
11240 
11241   tmp_expr->symtree->n.sym->ts.deferred = 1;
11242 
11243   this_code = build_assignment (EXEC_ASSIGN,
11244 				(*code)->expr1,
11245 				gfc_copy_expr (tmp_expr),
11246 				NULL, NULL, (*code)->loc);
11247 
11248   (*code)->expr1 = tmp_expr;
11249 
11250   this_code->next = (*code)->next;
11251   (*code)->next = this_code;
11252 
11253   return true;
11254 }
11255 
11256 
11257 /* Given a block of code, recursively resolve everything pointed to by this
11258    code block.  */
11259 
11260 void
gfc_resolve_code(gfc_code * code,gfc_namespace * ns)11261 gfc_resolve_code (gfc_code *code, gfc_namespace *ns)
11262 {
11263   int omp_workshare_save;
11264   int forall_save, do_concurrent_save;
11265   code_stack frame;
11266   bool t;
11267 
11268   frame.prev = cs_base;
11269   frame.head = code;
11270   cs_base = &frame;
11271 
11272   find_reachable_labels (code);
11273 
11274   for (; code; code = code->next)
11275     {
11276       frame.current = code;
11277       forall_save = forall_flag;
11278       do_concurrent_save = gfc_do_concurrent_flag;
11279 
11280       if (code->op == EXEC_FORALL)
11281 	{
11282 	  forall_flag = 1;
11283 	  gfc_resolve_forall (code, ns, forall_save);
11284 	  forall_flag = 2;
11285 	}
11286       else if (code->block)
11287 	{
11288 	  omp_workshare_save = -1;
11289 	  switch (code->op)
11290 	    {
11291 	    case EXEC_OACC_PARALLEL_LOOP:
11292 	    case EXEC_OACC_PARALLEL:
11293 	    case EXEC_OACC_KERNELS_LOOP:
11294 	    case EXEC_OACC_KERNELS:
11295 	    case EXEC_OACC_DATA:
11296 	    case EXEC_OACC_HOST_DATA:
11297 	    case EXEC_OACC_LOOP:
11298 	      gfc_resolve_oacc_blocks (code, ns);
11299 	      break;
11300 	    case EXEC_OMP_PARALLEL_WORKSHARE:
11301 	      omp_workshare_save = omp_workshare_flag;
11302 	      omp_workshare_flag = 1;
11303 	      gfc_resolve_omp_parallel_blocks (code, ns);
11304 	      break;
11305 	    case EXEC_OMP_PARALLEL:
11306 	    case EXEC_OMP_PARALLEL_DO:
11307 	    case EXEC_OMP_PARALLEL_DO_SIMD:
11308 	    case EXEC_OMP_PARALLEL_SECTIONS:
11309 	    case EXEC_OMP_TARGET_PARALLEL:
11310 	    case EXEC_OMP_TARGET_PARALLEL_DO:
11311 	    case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
11312 	    case EXEC_OMP_TARGET_TEAMS:
11313 	    case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
11314 	    case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
11315 	    case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
11316 	    case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
11317 	    case EXEC_OMP_TASK:
11318 	    case EXEC_OMP_TASKLOOP:
11319 	    case EXEC_OMP_TASKLOOP_SIMD:
11320 	    case EXEC_OMP_TEAMS:
11321 	    case EXEC_OMP_TEAMS_DISTRIBUTE:
11322 	    case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
11323 	    case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
11324 	    case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
11325 	      omp_workshare_save = omp_workshare_flag;
11326 	      omp_workshare_flag = 0;
11327 	      gfc_resolve_omp_parallel_blocks (code, ns);
11328 	      break;
11329 	    case EXEC_OMP_DISTRIBUTE:
11330 	    case EXEC_OMP_DISTRIBUTE_SIMD:
11331 	    case EXEC_OMP_DO:
11332 	    case EXEC_OMP_DO_SIMD:
11333 	    case EXEC_OMP_SIMD:
11334 	    case EXEC_OMP_TARGET_SIMD:
11335 	      gfc_resolve_omp_do_blocks (code, ns);
11336 	      break;
11337 	    case EXEC_SELECT_TYPE:
11338 	      /* Blocks are handled in resolve_select_type because we have
11339 		 to transform the SELECT TYPE into ASSOCIATE first.  */
11340 	      break;
11341             case EXEC_DO_CONCURRENT:
11342 	      gfc_do_concurrent_flag = 1;
11343 	      gfc_resolve_blocks (code->block, ns);
11344 	      gfc_do_concurrent_flag = 2;
11345 	      break;
11346 	    case EXEC_OMP_WORKSHARE:
11347 	      omp_workshare_save = omp_workshare_flag;
11348 	      omp_workshare_flag = 1;
11349 	      /* FALL THROUGH */
11350 	    default:
11351 	      gfc_resolve_blocks (code->block, ns);
11352 	      break;
11353 	    }
11354 
11355 	  if (omp_workshare_save != -1)
11356 	    omp_workshare_flag = omp_workshare_save;
11357 	}
11358 start:
11359       t = true;
11360       if (code->op != EXEC_COMPCALL && code->op != EXEC_CALL_PPC)
11361 	t = gfc_resolve_expr (code->expr1);
11362       forall_flag = forall_save;
11363       gfc_do_concurrent_flag = do_concurrent_save;
11364 
11365       if (!gfc_resolve_expr (code->expr2))
11366 	t = false;
11367 
11368       if (code->op == EXEC_ALLOCATE
11369 	  && !gfc_resolve_expr (code->expr3))
11370 	t = false;
11371 
11372       switch (code->op)
11373 	{
11374 	case EXEC_NOP:
11375 	case EXEC_END_BLOCK:
11376 	case EXEC_END_NESTED_BLOCK:
11377 	case EXEC_CYCLE:
11378 	case EXEC_PAUSE:
11379 	case EXEC_STOP:
11380 	case EXEC_ERROR_STOP:
11381 	case EXEC_EXIT:
11382 	case EXEC_CONTINUE:
11383 	case EXEC_DT_END:
11384 	case EXEC_ASSIGN_CALL:
11385 	  break;
11386 
11387 	case EXEC_CRITICAL:
11388 	  resolve_critical (code);
11389 	  break;
11390 
11391 	case EXEC_SYNC_ALL:
11392 	case EXEC_SYNC_IMAGES:
11393 	case EXEC_SYNC_MEMORY:
11394 	  resolve_sync (code);
11395 	  break;
11396 
11397 	case EXEC_LOCK:
11398 	case EXEC_UNLOCK:
11399 	case EXEC_EVENT_POST:
11400 	case EXEC_EVENT_WAIT:
11401 	  resolve_lock_unlock_event (code);
11402 	  break;
11403 
11404 	case EXEC_FAIL_IMAGE:
11405 	case EXEC_FORM_TEAM:
11406 	case EXEC_CHANGE_TEAM:
11407 	case EXEC_END_TEAM:
11408 	case EXEC_SYNC_TEAM:
11409 	  break;
11410 
11411 	case EXEC_ENTRY:
11412 	  /* Keep track of which entry we are up to.  */
11413 	  current_entry_id = code->ext.entry->id;
11414 	  break;
11415 
11416 	case EXEC_WHERE:
11417 	  resolve_where (code, NULL);
11418 	  break;
11419 
11420 	case EXEC_GOTO:
11421 	  if (code->expr1 != NULL)
11422 	    {
11423 	      if (code->expr1->ts.type != BT_INTEGER)
11424 		gfc_error ("ASSIGNED GOTO statement at %L requires an "
11425 			   "INTEGER variable", &code->expr1->where);
11426 	      else if (code->expr1->symtree->n.sym->attr.assign != 1)
11427 		gfc_error ("Variable %qs has not been assigned a target "
11428 			   "label at %L", code->expr1->symtree->n.sym->name,
11429 			   &code->expr1->where);
11430 	    }
11431 	  else
11432 	    resolve_branch (code->label1, code);
11433 	  break;
11434 
11435 	case EXEC_RETURN:
11436 	  if (code->expr1 != NULL
11437 		&& (code->expr1->ts.type != BT_INTEGER || code->expr1->rank))
11438 	    gfc_error ("Alternate RETURN statement at %L requires a SCALAR-"
11439 		       "INTEGER return specifier", &code->expr1->where);
11440 	  break;
11441 
11442 	case EXEC_INIT_ASSIGN:
11443 	case EXEC_END_PROCEDURE:
11444 	  break;
11445 
11446 	case EXEC_ASSIGN:
11447 	  if (!t)
11448 	    break;
11449 
11450 	  /* Remove a GFC_ISYM_CAF_GET inserted for a coindexed variable on
11451 	     the LHS.  */
11452 	  if (code->expr1->expr_type == EXPR_FUNCTION
11453 	      && code->expr1->value.function.isym
11454 	      && code->expr1->value.function.isym->id == GFC_ISYM_CAF_GET)
11455 	    remove_caf_get_intrinsic (code->expr1);
11456 
11457 	  /* If this is a pointer function in an lvalue variable context,
11458 	     the new code will have to be resolved afresh. This is also the
11459 	     case with an error, where the code is transformed into NOP to
11460 	     prevent ICEs downstream.  */
11461 	  if (resolve_ptr_fcn_assign (&code, ns)
11462 	      || code->op == EXEC_NOP)
11463 	    goto start;
11464 
11465 	  if (!gfc_check_vardef_context (code->expr1, false, false, false,
11466 					 _("assignment")))
11467 	    break;
11468 
11469 	  if (resolve_ordinary_assign (code, ns))
11470 	    {
11471 	      if (code->op == EXEC_COMPCALL)
11472 		goto compcall;
11473 	      else
11474 		goto call;
11475 	    }
11476 
11477 	  /* Check for dependencies in deferred character length array
11478 	     assignments and generate a temporary, if necessary.  */
11479 	  if (code->op == EXEC_ASSIGN && deferred_op_assign (&code, ns))
11480 	    break;
11481 
11482 	  /* F03 7.4.1.3 for non-allocatable, non-pointer components.  */
11483 	  if (code->op != EXEC_CALL && code->expr1->ts.type == BT_DERIVED
11484 	      && code->expr1->ts.u.derived
11485 	      && code->expr1->ts.u.derived->attr.defined_assign_comp)
11486 	    generate_component_assignments (&code, ns);
11487 
11488 	  break;
11489 
11490 	case EXEC_LABEL_ASSIGN:
11491 	  if (code->label1->defined == ST_LABEL_UNKNOWN)
11492 	    gfc_error ("Label %d referenced at %L is never defined",
11493 		       code->label1->value, &code->label1->where);
11494 	  if (t
11495 	      && (code->expr1->expr_type != EXPR_VARIABLE
11496 		  || code->expr1->symtree->n.sym->ts.type != BT_INTEGER
11497 		  || code->expr1->symtree->n.sym->ts.kind
11498 		     != gfc_default_integer_kind
11499 		  || code->expr1->symtree->n.sym->as != NULL))
11500 	    gfc_error ("ASSIGN statement at %L requires a scalar "
11501 		       "default INTEGER variable", &code->expr1->where);
11502 	  break;
11503 
11504 	case EXEC_POINTER_ASSIGN:
11505 	  {
11506 	    gfc_expr* e;
11507 
11508 	    if (!t)
11509 	      break;
11510 
11511 	    /* This is both a variable definition and pointer assignment
11512 	       context, so check both of them.  For rank remapping, a final
11513 	       array ref may be present on the LHS and fool gfc_expr_attr
11514 	       used in gfc_check_vardef_context.  Remove it.  */
11515 	    e = remove_last_array_ref (code->expr1);
11516 	    t = gfc_check_vardef_context (e, true, false, false,
11517 					  _("pointer assignment"));
11518 	    if (t)
11519 	      t = gfc_check_vardef_context (e, false, false, false,
11520 					    _("pointer assignment"));
11521 	    gfc_free_expr (e);
11522 
11523 	    t = gfc_check_pointer_assign (code->expr1, code->expr2, !t) && t;
11524 
11525 	    if (!t)
11526 	      break;
11527 
11528 	    /* Assigning a class object always is a regular assign.  */
11529 	    if (code->expr2->ts.type == BT_CLASS
11530 		&& code->expr1->ts.type == BT_CLASS
11531 		&& !CLASS_DATA (code->expr2)->attr.dimension
11532 		&& !(gfc_expr_attr (code->expr1).proc_pointer
11533 		     && code->expr2->expr_type == EXPR_VARIABLE
11534 		     && code->expr2->symtree->n.sym->attr.flavor
11535 			== FL_PROCEDURE))
11536 	      code->op = EXEC_ASSIGN;
11537 	    break;
11538 	  }
11539 
11540 	case EXEC_ARITHMETIC_IF:
11541 	  {
11542 	    gfc_expr *e = code->expr1;
11543 
11544 	    gfc_resolve_expr (e);
11545 	    if (e->expr_type == EXPR_NULL)
11546 	      gfc_error ("Invalid NULL at %L", &e->where);
11547 
11548 	    if (t && (e->rank > 0
11549 		      || !(e->ts.type == BT_REAL || e->ts.type == BT_INTEGER)))
11550 	      gfc_error ("Arithmetic IF statement at %L requires a scalar "
11551 			 "REAL or INTEGER expression", &e->where);
11552 
11553 	    resolve_branch (code->label1, code);
11554 	    resolve_branch (code->label2, code);
11555 	    resolve_branch (code->label3, code);
11556 	  }
11557 	  break;
11558 
11559 	case EXEC_IF:
11560 	  if (t && code->expr1 != NULL
11561 	      && (code->expr1->ts.type != BT_LOGICAL
11562 		  || code->expr1->rank != 0))
11563 	    gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
11564 		       &code->expr1->where);
11565 	  break;
11566 
11567 	case EXEC_CALL:
11568 	call:
11569 	  resolve_call (code);
11570 	  break;
11571 
11572 	case EXEC_COMPCALL:
11573 	compcall:
11574 	  resolve_typebound_subroutine (code);
11575 	  break;
11576 
11577 	case EXEC_CALL_PPC:
11578 	  resolve_ppc_call (code);
11579 	  break;
11580 
11581 	case EXEC_SELECT:
11582 	  /* Select is complicated. Also, a SELECT construct could be
11583 	     a transformed computed GOTO.  */
11584 	  resolve_select (code, false);
11585 	  break;
11586 
11587 	case EXEC_SELECT_TYPE:
11588 	  resolve_select_type (code, ns);
11589 	  break;
11590 
11591 	case EXEC_BLOCK:
11592 	  resolve_block_construct (code);
11593 	  break;
11594 
11595 	case EXEC_DO:
11596 	  if (code->ext.iterator != NULL)
11597 	    {
11598 	      gfc_iterator *iter = code->ext.iterator;
11599 	      if (gfc_resolve_iterator (iter, true, false))
11600 		gfc_resolve_do_iterator (code, iter->var->symtree->n.sym,
11601 					 true);
11602 	    }
11603 	  break;
11604 
11605 	case EXEC_DO_WHILE:
11606 	  if (code->expr1 == NULL)
11607 	    gfc_internal_error ("gfc_resolve_code(): No expression on "
11608 				"DO WHILE");
11609 	  if (t
11610 	      && (code->expr1->rank != 0
11611 		  || code->expr1->ts.type != BT_LOGICAL))
11612 	    gfc_error ("Exit condition of DO WHILE loop at %L must be "
11613 		       "a scalar LOGICAL expression", &code->expr1->where);
11614 	  break;
11615 
11616 	case EXEC_ALLOCATE:
11617 	  if (t)
11618 	    resolve_allocate_deallocate (code, "ALLOCATE");
11619 
11620 	  break;
11621 
11622 	case EXEC_DEALLOCATE:
11623 	  if (t)
11624 	    resolve_allocate_deallocate (code, "DEALLOCATE");
11625 
11626 	  break;
11627 
11628 	case EXEC_OPEN:
11629 	  if (!gfc_resolve_open (code->ext.open))
11630 	    break;
11631 
11632 	  resolve_branch (code->ext.open->err, code);
11633 	  break;
11634 
11635 	case EXEC_CLOSE:
11636 	  if (!gfc_resolve_close (code->ext.close))
11637 	    break;
11638 
11639 	  resolve_branch (code->ext.close->err, code);
11640 	  break;
11641 
11642 	case EXEC_BACKSPACE:
11643 	case EXEC_ENDFILE:
11644 	case EXEC_REWIND:
11645 	case EXEC_FLUSH:
11646 	  if (!gfc_resolve_filepos (code->ext.filepos, &code->loc))
11647 	    break;
11648 
11649 	  resolve_branch (code->ext.filepos->err, code);
11650 	  break;
11651 
11652 	case EXEC_INQUIRE:
11653 	  if (!gfc_resolve_inquire (code->ext.inquire))
11654 	      break;
11655 
11656 	  resolve_branch (code->ext.inquire->err, code);
11657 	  break;
11658 
11659 	case EXEC_IOLENGTH:
11660 	  gcc_assert (code->ext.inquire != NULL);
11661 	  if (!gfc_resolve_inquire (code->ext.inquire))
11662 	    break;
11663 
11664 	  resolve_branch (code->ext.inquire->err, code);
11665 	  break;
11666 
11667 	case EXEC_WAIT:
11668 	  if (!gfc_resolve_wait (code->ext.wait))
11669 	    break;
11670 
11671 	  resolve_branch (code->ext.wait->err, code);
11672 	  resolve_branch (code->ext.wait->end, code);
11673 	  resolve_branch (code->ext.wait->eor, code);
11674 	  break;
11675 
11676 	case EXEC_READ:
11677 	case EXEC_WRITE:
11678 	  if (!gfc_resolve_dt (code->ext.dt, &code->loc))
11679 	    break;
11680 
11681 	  resolve_branch (code->ext.dt->err, code);
11682 	  resolve_branch (code->ext.dt->end, code);
11683 	  resolve_branch (code->ext.dt->eor, code);
11684 	  break;
11685 
11686 	case EXEC_TRANSFER:
11687 	  resolve_transfer (code);
11688 	  break;
11689 
11690 	case EXEC_DO_CONCURRENT:
11691 	case EXEC_FORALL:
11692 	  resolve_forall_iterators (code->ext.forall_iterator);
11693 
11694 	  if (code->expr1 != NULL
11695 	      && (code->expr1->ts.type != BT_LOGICAL || code->expr1->rank))
11696 	    gfc_error ("FORALL mask clause at %L requires a scalar LOGICAL "
11697 		       "expression", &code->expr1->where);
11698 	  break;
11699 
11700 	case EXEC_OACC_PARALLEL_LOOP:
11701 	case EXEC_OACC_PARALLEL:
11702 	case EXEC_OACC_KERNELS_LOOP:
11703 	case EXEC_OACC_KERNELS:
11704 	case EXEC_OACC_DATA:
11705 	case EXEC_OACC_HOST_DATA:
11706 	case EXEC_OACC_LOOP:
11707 	case EXEC_OACC_UPDATE:
11708 	case EXEC_OACC_WAIT:
11709 	case EXEC_OACC_CACHE:
11710 	case EXEC_OACC_ENTER_DATA:
11711 	case EXEC_OACC_EXIT_DATA:
11712 	case EXEC_OACC_ATOMIC:
11713 	case EXEC_OACC_DECLARE:
11714 	  gfc_resolve_oacc_directive (code, ns);
11715 	  break;
11716 
11717 	case EXEC_OMP_ATOMIC:
11718 	case EXEC_OMP_BARRIER:
11719 	case EXEC_OMP_CANCEL:
11720 	case EXEC_OMP_CANCELLATION_POINT:
11721 	case EXEC_OMP_CRITICAL:
11722 	case EXEC_OMP_FLUSH:
11723 	case EXEC_OMP_DISTRIBUTE:
11724 	case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
11725 	case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
11726 	case EXEC_OMP_DISTRIBUTE_SIMD:
11727 	case EXEC_OMP_DO:
11728 	case EXEC_OMP_DO_SIMD:
11729 	case EXEC_OMP_MASTER:
11730 	case EXEC_OMP_ORDERED:
11731 	case EXEC_OMP_SECTIONS:
11732 	case EXEC_OMP_SIMD:
11733 	case EXEC_OMP_SINGLE:
11734 	case EXEC_OMP_TARGET:
11735 	case EXEC_OMP_TARGET_DATA:
11736 	case EXEC_OMP_TARGET_ENTER_DATA:
11737 	case EXEC_OMP_TARGET_EXIT_DATA:
11738 	case EXEC_OMP_TARGET_PARALLEL:
11739 	case EXEC_OMP_TARGET_PARALLEL_DO:
11740 	case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
11741 	case EXEC_OMP_TARGET_SIMD:
11742 	case EXEC_OMP_TARGET_TEAMS:
11743 	case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
11744 	case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
11745 	case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
11746 	case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
11747 	case EXEC_OMP_TARGET_UPDATE:
11748 	case EXEC_OMP_TASK:
11749 	case EXEC_OMP_TASKGROUP:
11750 	case EXEC_OMP_TASKLOOP:
11751 	case EXEC_OMP_TASKLOOP_SIMD:
11752 	case EXEC_OMP_TASKWAIT:
11753 	case EXEC_OMP_TASKYIELD:
11754 	case EXEC_OMP_TEAMS:
11755 	case EXEC_OMP_TEAMS_DISTRIBUTE:
11756 	case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
11757 	case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
11758 	case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
11759 	case EXEC_OMP_WORKSHARE:
11760 	  gfc_resolve_omp_directive (code, ns);
11761 	  break;
11762 
11763 	case EXEC_OMP_PARALLEL:
11764 	case EXEC_OMP_PARALLEL_DO:
11765 	case EXEC_OMP_PARALLEL_DO_SIMD:
11766 	case EXEC_OMP_PARALLEL_SECTIONS:
11767 	case EXEC_OMP_PARALLEL_WORKSHARE:
11768 	  omp_workshare_save = omp_workshare_flag;
11769 	  omp_workshare_flag = 0;
11770 	  gfc_resolve_omp_directive (code, ns);
11771 	  omp_workshare_flag = omp_workshare_save;
11772 	  break;
11773 
11774 	default:
11775 	  gfc_internal_error ("gfc_resolve_code(): Bad statement code");
11776 	}
11777     }
11778 
11779   cs_base = frame.prev;
11780 }
11781 
11782 
11783 /* Resolve initial values and make sure they are compatible with
11784    the variable.  */
11785 
11786 static void
resolve_values(gfc_symbol * sym)11787 resolve_values (gfc_symbol *sym)
11788 {
11789   bool t;
11790 
11791   if (sym->value == NULL)
11792     return;
11793 
11794   if (sym->value->expr_type == EXPR_STRUCTURE)
11795     t= resolve_structure_cons (sym->value, 1);
11796   else
11797     t = gfc_resolve_expr (sym->value);
11798 
11799   if (!t)
11800     return;
11801 
11802   gfc_check_assign_symbol (sym, NULL, sym->value);
11803 }
11804 
11805 
11806 /* Verify any BIND(C) derived types in the namespace so we can report errors
11807    for them once, rather than for each variable declared of that type.  */
11808 
11809 static void
resolve_bind_c_derived_types(gfc_symbol * derived_sym)11810 resolve_bind_c_derived_types (gfc_symbol *derived_sym)
11811 {
11812   if (derived_sym != NULL && derived_sym->attr.flavor == FL_DERIVED
11813       && derived_sym->attr.is_bind_c == 1)
11814     verify_bind_c_derived_type (derived_sym);
11815 
11816   return;
11817 }
11818 
11819 
11820 /* Check the interfaces of DTIO procedures associated with derived
11821    type 'sym'.  These procedures can either have typebound bindings or
11822    can appear in DTIO generic interfaces.  */
11823 
11824 static void
gfc_verify_DTIO_procedures(gfc_symbol * sym)11825 gfc_verify_DTIO_procedures (gfc_symbol *sym)
11826 {
11827   if (!sym || sym->attr.flavor != FL_DERIVED)
11828     return;
11829 
11830   gfc_check_dtio_interfaces (sym);
11831 
11832   return;
11833 }
11834 
11835 /* Verify that any binding labels used in a given namespace do not collide
11836    with the names or binding labels of any global symbols.  Multiple INTERFACE
11837    for the same procedure are permitted.  */
11838 
11839 static void
gfc_verify_binding_labels(gfc_symbol * sym)11840 gfc_verify_binding_labels (gfc_symbol *sym)
11841 {
11842   gfc_gsymbol *gsym;
11843   const char *module;
11844 
11845   if (!sym || !sym->attr.is_bind_c || sym->attr.is_iso_c
11846       || sym->attr.flavor == FL_DERIVED || !sym->binding_label)
11847     return;
11848 
11849   gsym = gfc_find_case_gsymbol (gfc_gsym_root, sym->binding_label);
11850 
11851   if (sym->module)
11852     module = sym->module;
11853   else if (sym->ns && sym->ns->proc_name
11854 	   && sym->ns->proc_name->attr.flavor == FL_MODULE)
11855     module = sym->ns->proc_name->name;
11856   else if (sym->ns && sym->ns->parent
11857 	   && sym->ns && sym->ns->parent->proc_name
11858 	   && sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
11859     module = sym->ns->parent->proc_name->name;
11860   else
11861     module = NULL;
11862 
11863   if (!gsym
11864       || (!gsym->defined
11865 	  && (gsym->type == GSYM_FUNCTION || gsym->type == GSYM_SUBROUTINE)))
11866     {
11867       if (!gsym)
11868 	gsym = gfc_get_gsymbol (sym->binding_label, true);
11869       gsym->where = sym->declared_at;
11870       gsym->sym_name = sym->name;
11871       gsym->binding_label = sym->binding_label;
11872       gsym->ns = sym->ns;
11873       gsym->mod_name = module;
11874       if (sym->attr.function)
11875         gsym->type = GSYM_FUNCTION;
11876       else if (sym->attr.subroutine)
11877 	gsym->type = GSYM_SUBROUTINE;
11878       /* Mark as variable/procedure as defined, unless its an INTERFACE.  */
11879       gsym->defined = sym->attr.if_source != IFSRC_IFBODY;
11880       return;
11881     }
11882 
11883   if (sym->attr.flavor == FL_VARIABLE && gsym->type != GSYM_UNKNOWN)
11884     {
11885       gfc_error ("Variable %qs with binding label %qs at %L uses the same global "
11886 		 "identifier as entity at %L", sym->name,
11887 		 sym->binding_label, &sym->declared_at, &gsym->where);
11888       /* Clear the binding label to prevent checking multiple times.  */
11889       sym->binding_label = NULL;
11890       return;
11891     }
11892 
11893   if (sym->attr.flavor == FL_VARIABLE && module
11894       && (strcmp (module, gsym->mod_name) != 0
11895 	  || strcmp (sym->name, gsym->sym_name) != 0))
11896     {
11897       /* This can only happen if the variable is defined in a module - if it
11898 	 isn't the same module, reject it.  */
11899       gfc_error ("Variable %qs from module %qs with binding label %qs at %L "
11900 		 "uses the same global identifier as entity at %L from module %qs",
11901 		 sym->name, module, sym->binding_label,
11902 		 &sym->declared_at, &gsym->where, gsym->mod_name);
11903       sym->binding_label = NULL;
11904       return;
11905     }
11906 
11907   if ((sym->attr.function || sym->attr.subroutine)
11908       && ((gsym->type != GSYM_SUBROUTINE && gsym->type != GSYM_FUNCTION)
11909 	   || (gsym->defined && sym->attr.if_source != IFSRC_IFBODY))
11910       && (sym != gsym->ns->proc_name && sym->attr.entry == 0)
11911       && (module != gsym->mod_name
11912 	  || strcmp (gsym->sym_name, sym->name) != 0
11913 	  || (module && strcmp (module, gsym->mod_name) != 0)))
11914     {
11915       /* Print an error if the procedure is defined multiple times; we have to
11916 	 exclude references to the same procedure via module association or
11917 	 multiple checks for the same procedure.  */
11918       gfc_error ("Procedure %qs with binding label %qs at %L uses the same "
11919 		 "global identifier as entity at %L", sym->name,
11920 		 sym->binding_label, &sym->declared_at, &gsym->where);
11921       sym->binding_label = NULL;
11922     }
11923 }
11924 
11925 
11926 /* Resolve an index expression.  */
11927 
11928 static bool
resolve_index_expr(gfc_expr * e)11929 resolve_index_expr (gfc_expr *e)
11930 {
11931   if (!gfc_resolve_expr (e))
11932     return false;
11933 
11934   if (!gfc_simplify_expr (e, 0))
11935     return false;
11936 
11937   if (!gfc_specification_expr (e))
11938     return false;
11939 
11940   return true;
11941 }
11942 
11943 
11944 /* Resolve a charlen structure.  */
11945 
11946 static bool
resolve_charlen(gfc_charlen * cl)11947 resolve_charlen (gfc_charlen *cl)
11948 {
11949   int k;
11950   bool saved_specification_expr;
11951 
11952   if (cl->resolved)
11953     return true;
11954 
11955   cl->resolved = 1;
11956   saved_specification_expr = specification_expr;
11957   specification_expr = true;
11958 
11959   if (cl->length_from_typespec)
11960     {
11961       if (!gfc_resolve_expr (cl->length))
11962 	{
11963 	  specification_expr = saved_specification_expr;
11964 	  return false;
11965 	}
11966 
11967       if (!gfc_simplify_expr (cl->length, 0))
11968 	{
11969 	  specification_expr = saved_specification_expr;
11970 	  return false;
11971 	}
11972 
11973       /* cl->length has been resolved.  It should have an integer type.  */
11974       if (cl->length->ts.type != BT_INTEGER)
11975 	{
11976 	  gfc_error ("Scalar INTEGER expression expected at %L",
11977 		     &cl->length->where);
11978 	  return false;
11979 	}
11980     }
11981   else
11982     {
11983       if (!resolve_index_expr (cl->length))
11984 	{
11985 	  specification_expr = saved_specification_expr;
11986 	  return false;
11987 	}
11988     }
11989 
11990   /* F2008, 4.4.3.2:  If the character length parameter value evaluates to
11991      a negative value, the length of character entities declared is zero.  */
11992   if (cl->length && cl->length->expr_type == EXPR_CONSTANT
11993       && mpz_sgn (cl->length->value.integer) < 0)
11994     gfc_replace_expr (cl->length,
11995 		      gfc_get_int_expr (gfc_charlen_int_kind, NULL, 0));
11996 
11997   /* Check that the character length is not too large.  */
11998   k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
11999   if (cl->length && cl->length->expr_type == EXPR_CONSTANT
12000       && cl->length->ts.type == BT_INTEGER
12001       && mpz_cmp (cl->length->value.integer, gfc_integer_kinds[k].huge) > 0)
12002     {
12003       gfc_error ("String length at %L is too large", &cl->length->where);
12004       specification_expr = saved_specification_expr;
12005       return false;
12006     }
12007 
12008   specification_expr = saved_specification_expr;
12009   return true;
12010 }
12011 
12012 
12013 /* Test for non-constant shape arrays.  */
12014 
12015 static bool
is_non_constant_shape_array(gfc_symbol * sym)12016 is_non_constant_shape_array (gfc_symbol *sym)
12017 {
12018   gfc_expr *e;
12019   int i;
12020   bool not_constant;
12021 
12022   not_constant = false;
12023   if (sym->as != NULL)
12024     {
12025       /* Unfortunately, !gfc_is_compile_time_shape hits a legal case that
12026 	 has not been simplified; parameter array references.  Do the
12027 	 simplification now.  */
12028       for (i = 0; i < sym->as->rank + sym->as->corank; i++)
12029 	{
12030 	  e = sym->as->lower[i];
12031 	  if (e && (!resolve_index_expr(e)
12032 		    || !gfc_is_constant_expr (e)))
12033 	    not_constant = true;
12034 	  e = sym->as->upper[i];
12035 	  if (e && (!resolve_index_expr(e)
12036 		    || !gfc_is_constant_expr (e)))
12037 	    not_constant = true;
12038 	}
12039     }
12040   return not_constant;
12041 }
12042 
12043 /* Given a symbol and an initialization expression, add code to initialize
12044    the symbol to the function entry.  */
12045 static void
build_init_assign(gfc_symbol * sym,gfc_expr * init)12046 build_init_assign (gfc_symbol *sym, gfc_expr *init)
12047 {
12048   gfc_expr *lval;
12049   gfc_code *init_st;
12050   gfc_namespace *ns = sym->ns;
12051 
12052   /* Search for the function namespace if this is a contained
12053      function without an explicit result.  */
12054   if (sym->attr.function && sym == sym->result
12055       && sym->name != sym->ns->proc_name->name)
12056     {
12057       ns = ns->contained;
12058       for (;ns; ns = ns->sibling)
12059 	if (strcmp (ns->proc_name->name, sym->name) == 0)
12060 	  break;
12061     }
12062 
12063   if (ns == NULL)
12064     {
12065       gfc_free_expr (init);
12066       return;
12067     }
12068 
12069   /* Build an l-value expression for the result.  */
12070   lval = gfc_lval_expr_from_sym (sym);
12071 
12072   /* Add the code at scope entry.  */
12073   init_st = gfc_get_code (EXEC_INIT_ASSIGN);
12074   init_st->next = ns->code;
12075   ns->code = init_st;
12076 
12077   /* Assign the default initializer to the l-value.  */
12078   init_st->loc = sym->declared_at;
12079   init_st->expr1 = lval;
12080   init_st->expr2 = init;
12081 }
12082 
12083 
12084 /* Whether or not we can generate a default initializer for a symbol.  */
12085 
12086 static bool
can_generate_init(gfc_symbol * sym)12087 can_generate_init (gfc_symbol *sym)
12088 {
12089   symbol_attribute *a;
12090   if (!sym)
12091     return false;
12092   a = &sym->attr;
12093 
12094   /* These symbols should never have a default initialization.  */
12095   return !(
12096        a->allocatable
12097     || a->external
12098     || a->pointer
12099     || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
12100         && (CLASS_DATA (sym)->attr.class_pointer
12101             || CLASS_DATA (sym)->attr.proc_pointer))
12102     || a->in_equivalence
12103     || a->in_common
12104     || a->data
12105     || sym->module
12106     || a->cray_pointee
12107     || a->cray_pointer
12108     || sym->assoc
12109     || (!a->referenced && !a->result)
12110     || (a->dummy && a->intent != INTENT_OUT)
12111     || (a->function && sym != sym->result)
12112   );
12113 }
12114 
12115 
12116 /* Assign the default initializer to a derived type variable or result.  */
12117 
12118 static void
apply_default_init(gfc_symbol * sym)12119 apply_default_init (gfc_symbol *sym)
12120 {
12121   gfc_expr *init = NULL;
12122 
12123   if (sym->attr.flavor != FL_VARIABLE && !sym->attr.function)
12124     return;
12125 
12126   if (sym->ts.type == BT_DERIVED && sym->ts.u.derived)
12127     init = gfc_generate_initializer (&sym->ts, can_generate_init (sym));
12128 
12129   if (init == NULL && sym->ts.type != BT_CLASS)
12130     return;
12131 
12132   build_init_assign (sym, init);
12133   sym->attr.referenced = 1;
12134 }
12135 
12136 
12137 /* Build an initializer for a local. Returns null if the symbol should not have
12138    a default initialization.  */
12139 
12140 static gfc_expr *
build_default_init_expr(gfc_symbol * sym)12141 build_default_init_expr (gfc_symbol *sym)
12142 {
12143   /* These symbols should never have a default initialization.  */
12144   if (sym->attr.allocatable
12145       || sym->attr.external
12146       || sym->attr.dummy
12147       || sym->attr.pointer
12148       || sym->attr.in_equivalence
12149       || sym->attr.in_common
12150       || sym->attr.data
12151       || sym->module
12152       || sym->attr.cray_pointee
12153       || sym->attr.cray_pointer
12154       || sym->assoc)
12155     return NULL;
12156 
12157   /* Get the appropriate init expression.  */
12158   return gfc_build_default_init_expr (&sym->ts, &sym->declared_at);
12159 }
12160 
12161 /* Add an initialization expression to a local variable.  */
12162 static void
apply_default_init_local(gfc_symbol * sym)12163 apply_default_init_local (gfc_symbol *sym)
12164 {
12165   gfc_expr *init = NULL;
12166 
12167   /* The symbol should be a variable or a function return value.  */
12168   if ((sym->attr.flavor != FL_VARIABLE && !sym->attr.function)
12169       || (sym->attr.function && sym->result != sym))
12170     return;
12171 
12172   /* Try to build the initializer expression.  If we can't initialize
12173      this symbol, then init will be NULL.  */
12174   init = build_default_init_expr (sym);
12175   if (init == NULL)
12176     return;
12177 
12178   /* For saved variables, we don't want to add an initializer at function
12179      entry, so we just add a static initializer. Note that automatic variables
12180      are stack allocated even with -fno-automatic; we have also to exclude
12181      result variable, which are also nonstatic.  */
12182   if (!sym->attr.automatic
12183       && (sym->attr.save || sym->ns->save_all
12184 	  || (flag_max_stack_var_size == 0 && !sym->attr.result
12185 	      && (sym->ns->proc_name && !sym->ns->proc_name->attr.recursive)
12186 	      && (!sym->attr.dimension || !is_non_constant_shape_array (sym)))))
12187     {
12188       /* Don't clobber an existing initializer!  */
12189       gcc_assert (sym->value == NULL);
12190       sym->value = init;
12191       return;
12192     }
12193 
12194   build_init_assign (sym, init);
12195 }
12196 
12197 
12198 /* Resolution of common features of flavors variable and procedure.  */
12199 
12200 static bool
resolve_fl_var_and_proc(gfc_symbol * sym,int mp_flag)12201 resolve_fl_var_and_proc (gfc_symbol *sym, int mp_flag)
12202 {
12203   gfc_array_spec *as;
12204 
12205   if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
12206     as = CLASS_DATA (sym)->as;
12207   else
12208     as = sym->as;
12209 
12210   /* Constraints on deferred shape variable.  */
12211   if (as == NULL || as->type != AS_DEFERRED)
12212     {
12213       bool pointer, allocatable, dimension;
12214 
12215       if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
12216 	{
12217 	  pointer = CLASS_DATA (sym)->attr.class_pointer;
12218 	  allocatable = CLASS_DATA (sym)->attr.allocatable;
12219 	  dimension = CLASS_DATA (sym)->attr.dimension;
12220 	}
12221       else
12222 	{
12223 	  pointer = sym->attr.pointer && !sym->attr.select_type_temporary;
12224 	  allocatable = sym->attr.allocatable;
12225 	  dimension = sym->attr.dimension;
12226 	}
12227 
12228       if (allocatable)
12229 	{
12230 	  if (dimension && as->type != AS_ASSUMED_RANK)
12231 	    {
12232 	      gfc_error ("Allocatable array %qs at %L must have a deferred "
12233 			 "shape or assumed rank", sym->name, &sym->declared_at);
12234 	      return false;
12235 	    }
12236 	  else if (!gfc_notify_std (GFC_STD_F2003, "Scalar object "
12237 				    "%qs at %L may not be ALLOCATABLE",
12238 				    sym->name, &sym->declared_at))
12239 	    return false;
12240 	}
12241 
12242       if (pointer && dimension && as->type != AS_ASSUMED_RANK)
12243 	{
12244 	  gfc_error ("Array pointer %qs at %L must have a deferred shape or "
12245 		     "assumed rank", sym->name, &sym->declared_at);
12246 	  return false;
12247 	}
12248     }
12249   else
12250     {
12251       if (!mp_flag && !sym->attr.allocatable && !sym->attr.pointer
12252 	  && sym->ts.type != BT_CLASS && !sym->assoc)
12253 	{
12254 	  gfc_error ("Array %qs at %L cannot have a deferred shape",
12255 		     sym->name, &sym->declared_at);
12256 	  return false;
12257 	 }
12258     }
12259 
12260   /* Constraints on polymorphic variables.  */
12261   if (sym->ts.type == BT_CLASS && !(sym->result && sym->result != sym))
12262     {
12263       /* F03:C502.  */
12264       if (sym->attr.class_ok
12265 	  && !sym->attr.select_type_temporary
12266 	  && !UNLIMITED_POLY (sym)
12267 	  && !gfc_type_is_extensible (CLASS_DATA (sym)->ts.u.derived))
12268 	{
12269 	  gfc_error ("Type %qs of CLASS variable %qs at %L is not extensible",
12270 		     CLASS_DATA (sym)->ts.u.derived->name, sym->name,
12271 		     &sym->declared_at);
12272 	  return false;
12273 	}
12274 
12275       /* F03:C509.  */
12276       /* Assume that use associated symbols were checked in the module ns.
12277 	 Class-variables that are associate-names are also something special
12278 	 and excepted from the test.  */
12279       if (!sym->attr.class_ok && !sym->attr.use_assoc && !sym->assoc)
12280 	{
12281 	  gfc_error ("CLASS variable %qs at %L must be dummy, allocatable "
12282 		     "or pointer", sym->name, &sym->declared_at);
12283 	  return false;
12284 	}
12285     }
12286 
12287   return true;
12288 }
12289 
12290 
12291 /* Additional checks for symbols with flavor variable and derived
12292    type.  To be called from resolve_fl_variable.  */
12293 
12294 static bool
resolve_fl_variable_derived(gfc_symbol * sym,int no_init_flag)12295 resolve_fl_variable_derived (gfc_symbol *sym, int no_init_flag)
12296 {
12297   gcc_assert (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS);
12298 
12299   /* Check to see if a derived type is blocked from being host
12300      associated by the presence of another class I symbol in the same
12301      namespace.  14.6.1.3 of the standard and the discussion on
12302      comp.lang.fortran.  */
12303   if (sym->ns != sym->ts.u.derived->ns
12304       && !sym->ts.u.derived->attr.use_assoc
12305       && sym->ns->proc_name->attr.if_source != IFSRC_IFBODY)
12306     {
12307       gfc_symbol *s;
12308       gfc_find_symbol (sym->ts.u.derived->name, sym->ns, 0, &s);
12309       if (s && s->attr.generic)
12310 	s = gfc_find_dt_in_generic (s);
12311       if (s && !gfc_fl_struct (s->attr.flavor))
12312 	{
12313 	  gfc_error ("The type %qs cannot be host associated at %L "
12314 		     "because it is blocked by an incompatible object "
12315 		     "of the same name declared at %L",
12316 		     sym->ts.u.derived->name, &sym->declared_at,
12317 		     &s->declared_at);
12318 	  return false;
12319 	}
12320     }
12321 
12322   /* 4th constraint in section 11.3: "If an object of a type for which
12323      component-initialization is specified (R429) appears in the
12324      specification-part of a module and does not have the ALLOCATABLE
12325      or POINTER attribute, the object shall have the SAVE attribute."
12326 
12327      The check for initializers is performed with
12328      gfc_has_default_initializer because gfc_default_initializer generates
12329      a hidden default for allocatable components.  */
12330   if (!(sym->value || no_init_flag) && sym->ns->proc_name
12331       && sym->ns->proc_name->attr.flavor == FL_MODULE
12332       && !(sym->ns->save_all && !sym->attr.automatic) && !sym->attr.save
12333       && !sym->attr.pointer && !sym->attr.allocatable
12334       && gfc_has_default_initializer (sym->ts.u.derived)
12335       && !gfc_notify_std (GFC_STD_F2008, "Implied SAVE for module variable "
12336 			  "%qs at %L, needed due to the default "
12337 			  "initialization", sym->name, &sym->declared_at))
12338     return false;
12339 
12340   /* Assign default initializer.  */
12341   if (!(sym->value || sym->attr.pointer || sym->attr.allocatable)
12342       && (!no_init_flag || sym->attr.intent == INTENT_OUT))
12343     sym->value = gfc_generate_initializer (&sym->ts, can_generate_init (sym));
12344 
12345   return true;
12346 }
12347 
12348 
12349 /* F2008, C402 (R401):  A colon shall not be used as a type-param-value
12350    except in the declaration of an entity or component that has the POINTER
12351    or ALLOCATABLE attribute.  */
12352 
12353 static bool
deferred_requirements(gfc_symbol * sym)12354 deferred_requirements (gfc_symbol *sym)
12355 {
12356   if (sym->ts.deferred
12357       && !(sym->attr.pointer
12358 	   || sym->attr.allocatable
12359 	   || sym->attr.associate_var
12360 	   || sym->attr.omp_udr_artificial_var))
12361     {
12362       gfc_error ("Entity %qs at %L has a deferred type parameter and "
12363 		 "requires either the POINTER or ALLOCATABLE attribute",
12364 		 sym->name, &sym->declared_at);
12365       return false;
12366     }
12367   return true;
12368 }
12369 
12370 
12371 /* Resolve symbols with flavor variable.  */
12372 
12373 static bool
resolve_fl_variable(gfc_symbol * sym,int mp_flag)12374 resolve_fl_variable (gfc_symbol *sym, int mp_flag)
12375 {
12376   const char *auto_save_msg = "Automatic object %qs at %L cannot have the "
12377 			      "SAVE attribute";
12378 
12379   if (!resolve_fl_var_and_proc (sym, mp_flag))
12380     return false;
12381 
12382   /* Set this flag to check that variables are parameters of all entries.
12383      This check is effected by the call to gfc_resolve_expr through
12384      is_non_constant_shape_array.  */
12385   bool saved_specification_expr = specification_expr;
12386   specification_expr = true;
12387 
12388   if (sym->ns->proc_name
12389       && (sym->ns->proc_name->attr.flavor == FL_MODULE
12390 	  || sym->ns->proc_name->attr.is_main_program)
12391       && !sym->attr.use_assoc
12392       && !sym->attr.allocatable
12393       && !sym->attr.pointer
12394       && is_non_constant_shape_array (sym))
12395     {
12396       /* F08:C541. The shape of an array defined in a main program or module
12397        * needs to be constant.  */
12398       gfc_error ("The module or main program array %qs at %L must "
12399 		 "have constant shape", sym->name, &sym->declared_at);
12400       specification_expr = saved_specification_expr;
12401       return false;
12402     }
12403 
12404   /* Constraints on deferred type parameter.  */
12405   if (!deferred_requirements (sym))
12406     return false;
12407 
12408   if (sym->ts.type == BT_CHARACTER && !sym->attr.associate_var)
12409     {
12410       /* Make sure that character string variables with assumed length are
12411 	 dummy arguments.  */
12412       gfc_expr *e = NULL;
12413 
12414       if (sym->ts.u.cl)
12415 	e = sym->ts.u.cl->length;
12416       else
12417 	return false;
12418 
12419       if (e == NULL && !sym->attr.dummy && !sym->attr.result
12420 	  && !sym->ts.deferred && !sym->attr.select_type_temporary
12421 	  && !sym->attr.omp_udr_artificial_var)
12422 	{
12423 	  gfc_error ("Entity with assumed character length at %L must be a "
12424 		     "dummy argument or a PARAMETER", &sym->declared_at);
12425 	  specification_expr = saved_specification_expr;
12426 	  return false;
12427 	}
12428 
12429       if (e && sym->attr.save == SAVE_EXPLICIT && !gfc_is_constant_expr (e))
12430 	{
12431 	  gfc_error (auto_save_msg, sym->name, &sym->declared_at);
12432 	  specification_expr = saved_specification_expr;
12433 	  return false;
12434 	}
12435 
12436       if (!gfc_is_constant_expr (e)
12437 	  && !(e->expr_type == EXPR_VARIABLE
12438 	       && e->symtree->n.sym->attr.flavor == FL_PARAMETER))
12439 	{
12440 	  if (!sym->attr.use_assoc && sym->ns->proc_name
12441 	      && (sym->ns->proc_name->attr.flavor == FL_MODULE
12442 		  || sym->ns->proc_name->attr.is_main_program))
12443 	    {
12444 	      gfc_error ("%qs at %L must have constant character length "
12445 			"in this context", sym->name, &sym->declared_at);
12446 	      specification_expr = saved_specification_expr;
12447 	      return false;
12448 	    }
12449 	  if (sym->attr.in_common)
12450 	    {
12451 	      gfc_error ("COMMON variable %qs at %L must have constant "
12452 			 "character length", sym->name, &sym->declared_at);
12453 	      specification_expr = saved_specification_expr;
12454 	      return false;
12455 	    }
12456 	}
12457     }
12458 
12459   if (sym->value == NULL && sym->attr.referenced)
12460     apply_default_init_local (sym); /* Try to apply a default initialization.  */
12461 
12462   /* Determine if the symbol may not have an initializer.  */
12463   int no_init_flag = 0, automatic_flag = 0;
12464   if (sym->attr.allocatable || sym->attr.external || sym->attr.dummy
12465       || sym->attr.intrinsic || sym->attr.result)
12466     no_init_flag = 1;
12467   else if ((sym->attr.dimension || sym->attr.codimension) && !sym->attr.pointer
12468 	   && is_non_constant_shape_array (sym))
12469     {
12470       no_init_flag = automatic_flag = 1;
12471 
12472       /* Also, they must not have the SAVE attribute.
12473 	 SAVE_IMPLICIT is checked below.  */
12474       if (sym->as && sym->attr.codimension)
12475 	{
12476 	  int corank = sym->as->corank;
12477 	  sym->as->corank = 0;
12478 	  no_init_flag = automatic_flag = is_non_constant_shape_array (sym);
12479 	  sym->as->corank = corank;
12480 	}
12481       if (automatic_flag && sym->attr.save == SAVE_EXPLICIT)
12482 	{
12483 	  gfc_error (auto_save_msg, sym->name, &sym->declared_at);
12484 	  specification_expr = saved_specification_expr;
12485 	  return false;
12486 	}
12487     }
12488 
12489   /* Ensure that any initializer is simplified.  */
12490   if (sym->value)
12491     gfc_simplify_expr (sym->value, 1);
12492 
12493   /* Reject illegal initializers.  */
12494   if (!sym->mark && sym->value)
12495     {
12496       if (sym->attr.allocatable || (sym->ts.type == BT_CLASS
12497 				    && CLASS_DATA (sym)->attr.allocatable))
12498 	gfc_error ("Allocatable %qs at %L cannot have an initializer",
12499 		   sym->name, &sym->declared_at);
12500       else if (sym->attr.external)
12501 	gfc_error ("External %qs at %L cannot have an initializer",
12502 		   sym->name, &sym->declared_at);
12503       else if (sym->attr.dummy
12504 	&& !(sym->ts.type == BT_DERIVED && sym->attr.intent == INTENT_OUT))
12505 	gfc_error ("Dummy %qs at %L cannot have an initializer",
12506 		   sym->name, &sym->declared_at);
12507       else if (sym->attr.intrinsic)
12508 	gfc_error ("Intrinsic %qs at %L cannot have an initializer",
12509 		   sym->name, &sym->declared_at);
12510       else if (sym->attr.result)
12511 	gfc_error ("Function result %qs at %L cannot have an initializer",
12512 		   sym->name, &sym->declared_at);
12513       else if (automatic_flag)
12514 	gfc_error ("Automatic array %qs at %L cannot have an initializer",
12515 		   sym->name, &sym->declared_at);
12516       else
12517 	goto no_init_error;
12518       specification_expr = saved_specification_expr;
12519       return false;
12520     }
12521 
12522 no_init_error:
12523   if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
12524     {
12525       bool res = resolve_fl_variable_derived (sym, no_init_flag);
12526       specification_expr = saved_specification_expr;
12527       return res;
12528     }
12529 
12530   specification_expr = saved_specification_expr;
12531   return true;
12532 }
12533 
12534 
12535 /* Compare the dummy characteristics of a module procedure interface
12536    declaration with the corresponding declaration in a submodule.  */
12537 static gfc_formal_arglist *new_formal;
12538 static char errmsg[200];
12539 
12540 static void
compare_fsyms(gfc_symbol * sym)12541 compare_fsyms (gfc_symbol *sym)
12542 {
12543   gfc_symbol *fsym;
12544 
12545   if (sym == NULL || new_formal == NULL)
12546     return;
12547 
12548   fsym = new_formal->sym;
12549 
12550   if (sym == fsym)
12551     return;
12552 
12553   if (strcmp (sym->name, fsym->name) == 0)
12554     {
12555       if (!gfc_check_dummy_characteristics (fsym, sym, true, errmsg, 200))
12556 	gfc_error ("%s at %L", errmsg, &fsym->declared_at);
12557     }
12558 }
12559 
12560 
12561 /* Resolve a procedure.  */
12562 
12563 static bool
resolve_fl_procedure(gfc_symbol * sym,int mp_flag)12564 resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
12565 {
12566   gfc_formal_arglist *arg;
12567 
12568   if (sym->attr.function
12569       && !resolve_fl_var_and_proc (sym, mp_flag))
12570     return false;
12571 
12572   if (sym->ts.type == BT_CHARACTER)
12573     {
12574       gfc_charlen *cl = sym->ts.u.cl;
12575 
12576       if (cl && cl->length && gfc_is_constant_expr (cl->length)
12577 	     && !resolve_charlen (cl))
12578 	return false;
12579 
12580       if ((!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
12581 	  && sym->attr.proc == PROC_ST_FUNCTION)
12582 	{
12583 	  gfc_error ("Character-valued statement function %qs at %L must "
12584 		     "have constant length", sym->name, &sym->declared_at);
12585 	  return false;
12586 	}
12587     }
12588 
12589   /* Ensure that derived type for are not of a private type.  Internal
12590      module procedures are excluded by 2.2.3.3 - i.e., they are not
12591      externally accessible and can access all the objects accessible in
12592      the host.  */
12593   if (!(sym->ns->parent && sym->ns->parent->proc_name
12594 	&& sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
12595       && gfc_check_symbol_access (sym))
12596     {
12597       gfc_interface *iface;
12598 
12599       for (arg = gfc_sym_get_dummy_args (sym); arg; arg = arg->next)
12600 	{
12601 	  if (arg->sym
12602 	      && arg->sym->ts.type == BT_DERIVED
12603 	      && !arg->sym->ts.u.derived->attr.use_assoc
12604 	      && !gfc_check_symbol_access (arg->sym->ts.u.derived)
12605 	      && !gfc_notify_std (GFC_STD_F2003, "%qs is of a PRIVATE type "
12606 				  "and cannot be a dummy argument"
12607 				  " of %qs, which is PUBLIC at %L",
12608 				  arg->sym->name, sym->name,
12609 				  &sym->declared_at))
12610 	    {
12611 	      /* Stop this message from recurring.  */
12612 	      arg->sym->ts.u.derived->attr.access = ACCESS_PUBLIC;
12613 	      return false;
12614 	    }
12615 	}
12616 
12617       /* PUBLIC interfaces may expose PRIVATE procedures that take types
12618 	 PRIVATE to the containing module.  */
12619       for (iface = sym->generic; iface; iface = iface->next)
12620 	{
12621 	  for (arg = gfc_sym_get_dummy_args (iface->sym); arg; arg = arg->next)
12622 	    {
12623 	      if (arg->sym
12624 		  && arg->sym->ts.type == BT_DERIVED
12625 		  && !arg->sym->ts.u.derived->attr.use_assoc
12626 		  && !gfc_check_symbol_access (arg->sym->ts.u.derived)
12627 		  && !gfc_notify_std (GFC_STD_F2003, "Procedure %qs in "
12628 				      "PUBLIC interface %qs at %L "
12629 				      "takes dummy arguments of %qs which "
12630 				      "is PRIVATE", iface->sym->name,
12631 				      sym->name, &iface->sym->declared_at,
12632 				      gfc_typename(&arg->sym->ts)))
12633 		{
12634 		  /* Stop this message from recurring.  */
12635 		  arg->sym->ts.u.derived->attr.access = ACCESS_PUBLIC;
12636 		  return false;
12637 		}
12638 	     }
12639 	}
12640     }
12641 
12642   if (sym->attr.function && sym->value && sym->attr.proc != PROC_ST_FUNCTION
12643       && !sym->attr.proc_pointer)
12644     {
12645       gfc_error ("Function %qs at %L cannot have an initializer",
12646 		 sym->name, &sym->declared_at);
12647 
12648       /* Make sure no second error is issued for this.  */
12649       sym->value->error = 1;
12650       return false;
12651     }
12652 
12653   /* An external symbol may not have an initializer because it is taken to be
12654      a procedure. Exception: Procedure Pointers.  */
12655   if (sym->attr.external && sym->value && !sym->attr.proc_pointer)
12656     {
12657       gfc_error ("External object %qs at %L may not have an initializer",
12658 		 sym->name, &sym->declared_at);
12659       return false;
12660     }
12661 
12662   /* An elemental function is required to return a scalar 12.7.1  */
12663   if (sym->attr.elemental && sym->attr.function
12664       && (sym->as || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as)))
12665     {
12666       gfc_error ("ELEMENTAL function %qs at %L must have a scalar "
12667 		 "result", sym->name, &sym->declared_at);
12668       /* Reset so that the error only occurs once.  */
12669       sym->attr.elemental = 0;
12670       return false;
12671     }
12672 
12673   if (sym->attr.proc == PROC_ST_FUNCTION
12674       && (sym->attr.allocatable || sym->attr.pointer))
12675     {
12676       gfc_error ("Statement function %qs at %L may not have pointer or "
12677 		 "allocatable attribute", sym->name, &sym->declared_at);
12678       return false;
12679     }
12680 
12681   /* 5.1.1.5 of the Standard: A function name declared with an asterisk
12682      char-len-param shall not be array-valued, pointer-valued, recursive
12683      or pure.  ....snip... A character value of * may only be used in the
12684      following ways: (i) Dummy arg of procedure - dummy associates with
12685      actual length; (ii) To declare a named constant; or (iii) External
12686      function - but length must be declared in calling scoping unit.  */
12687   if (sym->attr.function
12688       && sym->ts.type == BT_CHARACTER && !sym->ts.deferred
12689       && sym->ts.u.cl && sym->ts.u.cl->length == NULL)
12690     {
12691       if ((sym->as && sym->as->rank) || (sym->attr.pointer)
12692 	  || (sym->attr.recursive) || (sym->attr.pure))
12693 	{
12694 	  if (sym->as && sym->as->rank)
12695 	    gfc_error ("CHARACTER(*) function %qs at %L cannot be "
12696 		       "array-valued", sym->name, &sym->declared_at);
12697 
12698 	  if (sym->attr.pointer)
12699 	    gfc_error ("CHARACTER(*) function %qs at %L cannot be "
12700 		       "pointer-valued", sym->name, &sym->declared_at);
12701 
12702 	  if (sym->attr.pure)
12703 	    gfc_error ("CHARACTER(*) function %qs at %L cannot be "
12704 		       "pure", sym->name, &sym->declared_at);
12705 
12706 	  if (sym->attr.recursive)
12707 	    gfc_error ("CHARACTER(*) function %qs at %L cannot be "
12708 		       "recursive", sym->name, &sym->declared_at);
12709 
12710 	  return false;
12711 	}
12712 
12713       /* Appendix B.2 of the standard.  Contained functions give an
12714 	 error anyway.  Deferred character length is an F2003 feature.
12715 	 Don't warn on intrinsic conversion functions, which start
12716 	 with two underscores.  */
12717       if (!sym->attr.contained && !sym->ts.deferred
12718 	  && (sym->name[0] != '_' || sym->name[1] != '_'))
12719 	gfc_notify_std (GFC_STD_F95_OBS,
12720 			"CHARACTER(*) function %qs at %L",
12721 			sym->name, &sym->declared_at);
12722     }
12723 
12724   /* F2008, C1218.  */
12725   if (sym->attr.elemental)
12726     {
12727       if (sym->attr.proc_pointer)
12728 	{
12729 	  gfc_error ("Procedure pointer %qs at %L shall not be elemental",
12730 		     sym->name, &sym->declared_at);
12731 	  return false;
12732 	}
12733       if (sym->attr.dummy)
12734 	{
12735 	  gfc_error ("Dummy procedure %qs at %L shall not be elemental",
12736 		     sym->name, &sym->declared_at);
12737 	  return false;
12738 	}
12739     }
12740 
12741   /* F2018, C15100: "The result of an elemental function shall be scalar,
12742      and shall not have the POINTER or ALLOCATABLE attribute."  The scalar
12743      pointer is tested and caught elsewhere.  */
12744   if (sym->attr.elemental && sym->result
12745       && (sym->result->attr.allocatable || sym->result->attr.pointer))
12746     {
12747       gfc_error ("Function result variable %qs at %L of elemental "
12748 		 "function %qs shall not have an ALLOCATABLE or POINTER "
12749 		 "attribute", sym->result->name,
12750 		 &sym->result->declared_at, sym->name);
12751       return false;
12752     }
12753 
12754   if (sym->attr.is_bind_c && sym->attr.is_c_interop != 1)
12755     {
12756       gfc_formal_arglist *curr_arg;
12757       int has_non_interop_arg = 0;
12758 
12759       if (!verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
12760 			      sym->common_block))
12761         {
12762           /* Clear these to prevent looking at them again if there was an
12763              error.  */
12764           sym->attr.is_bind_c = 0;
12765           sym->attr.is_c_interop = 0;
12766           sym->ts.is_c_interop = 0;
12767         }
12768       else
12769         {
12770           /* So far, no errors have been found.  */
12771           sym->attr.is_c_interop = 1;
12772           sym->ts.is_c_interop = 1;
12773         }
12774 
12775       curr_arg = gfc_sym_get_dummy_args (sym);
12776       while (curr_arg != NULL)
12777         {
12778           /* Skip implicitly typed dummy args here.  */
12779 	  if (curr_arg->sym && curr_arg->sym->attr.implicit_type == 0)
12780 	    if (!gfc_verify_c_interop_param (curr_arg->sym))
12781 	      /* If something is found to fail, record the fact so we
12782 		 can mark the symbol for the procedure as not being
12783 		 BIND(C) to try and prevent multiple errors being
12784 		 reported.  */
12785 	      has_non_interop_arg = 1;
12786 
12787           curr_arg = curr_arg->next;
12788         }
12789 
12790       /* See if any of the arguments were not interoperable and if so, clear
12791 	 the procedure symbol to prevent duplicate error messages.  */
12792       if (has_non_interop_arg != 0)
12793 	{
12794 	  sym->attr.is_c_interop = 0;
12795 	  sym->ts.is_c_interop = 0;
12796 	  sym->attr.is_bind_c = 0;
12797 	}
12798     }
12799 
12800   if (!sym->attr.proc_pointer)
12801     {
12802       if (sym->attr.save == SAVE_EXPLICIT)
12803 	{
12804 	  gfc_error ("PROCEDURE attribute conflicts with SAVE attribute "
12805 		     "in %qs at %L", sym->name, &sym->declared_at);
12806 	  return false;
12807 	}
12808       if (sym->attr.intent)
12809 	{
12810 	  gfc_error ("PROCEDURE attribute conflicts with INTENT attribute "
12811 		     "in %qs at %L", sym->name, &sym->declared_at);
12812 	  return false;
12813 	}
12814       if (sym->attr.subroutine && sym->attr.result)
12815 	{
12816 	  gfc_error ("PROCEDURE attribute conflicts with RESULT attribute "
12817 		     "in %qs at %L", sym->name, &sym->declared_at);
12818 	  return false;
12819 	}
12820       if (sym->attr.external && sym->attr.function && !sym->attr.module_procedure
12821 	  && ((sym->attr.if_source == IFSRC_DECL && !sym->attr.procedure)
12822 	      || sym->attr.contained))
12823 	{
12824 	  gfc_error ("EXTERNAL attribute conflicts with FUNCTION attribute "
12825 		     "in %qs at %L", sym->name, &sym->declared_at);
12826 	  return false;
12827 	}
12828       if (strcmp ("ppr@", sym->name) == 0)
12829 	{
12830 	  gfc_error ("Procedure pointer result %qs at %L "
12831 		     "is missing the pointer attribute",
12832 		     sym->ns->proc_name->name, &sym->declared_at);
12833 	  return false;
12834 	}
12835     }
12836 
12837   /* Assume that a procedure whose body is not known has references
12838      to external arrays.  */
12839   if (sym->attr.if_source != IFSRC_DECL)
12840     sym->attr.array_outer_dependency = 1;
12841 
12842   /* Compare the characteristics of a module procedure with the
12843      interface declaration. Ideally this would be done with
12844      gfc_compare_interfaces but, at present, the formal interface
12845      cannot be copied to the ts.interface.  */
12846   if (sym->attr.module_procedure
12847       && sym->attr.if_source == IFSRC_DECL)
12848     {
12849       gfc_symbol *iface;
12850       char name[2*GFC_MAX_SYMBOL_LEN + 1];
12851       char *module_name;
12852       char *submodule_name;
12853       strcpy (name, sym->ns->proc_name->name);
12854       module_name = strtok (name, ".");
12855       submodule_name = strtok (NULL, ".");
12856 
12857       iface = sym->tlink;
12858       sym->tlink = NULL;
12859 
12860       /* Make sure that the result uses the correct charlen for deferred
12861 	 length results.  */
12862       if (iface && sym->result
12863 	  && iface->ts.type == BT_CHARACTER
12864 	  && iface->ts.deferred)
12865 	sym->result->ts.u.cl = iface->ts.u.cl;
12866 
12867       if (iface == NULL)
12868 	goto check_formal;
12869 
12870       /* Check the procedure characteristics.  */
12871       if (sym->attr.elemental != iface->attr.elemental)
12872 	{
12873 	  gfc_error ("Mismatch in ELEMENTAL attribute between MODULE "
12874 		     "PROCEDURE at %L and its interface in %s",
12875 		     &sym->declared_at, module_name);
12876 	  return false;
12877 	}
12878 
12879       if (sym->attr.pure != iface->attr.pure)
12880 	{
12881 	  gfc_error ("Mismatch in PURE attribute between MODULE "
12882 		     "PROCEDURE at %L and its interface in %s",
12883 		     &sym->declared_at, module_name);
12884 	  return false;
12885 	}
12886 
12887       if (sym->attr.recursive != iface->attr.recursive)
12888 	{
12889 	  gfc_error ("Mismatch in RECURSIVE attribute between MODULE "
12890 		     "PROCEDURE at %L and its interface in %s",
12891 		     &sym->declared_at, module_name);
12892 	  return false;
12893 	}
12894 
12895       /* Check the result characteristics.  */
12896       if (!gfc_check_result_characteristics (sym, iface, errmsg, 200))
12897 	{
12898 	  gfc_error ("%s between the MODULE PROCEDURE declaration "
12899 		     "in MODULE %qs and the declaration at %L in "
12900 		     "(SUB)MODULE %qs",
12901 		     errmsg, module_name, &sym->declared_at,
12902 		     submodule_name ? submodule_name : module_name);
12903 	  return false;
12904 	}
12905 
12906 check_formal:
12907       /* Check the characteristics of the formal arguments.  */
12908       if (sym->formal && sym->formal_ns)
12909 	{
12910 	  for (arg = sym->formal; arg && arg->sym; arg = arg->next)
12911 	    {
12912 	      new_formal = arg;
12913 	      gfc_traverse_ns (sym->formal_ns, compare_fsyms);
12914 	    }
12915 	}
12916     }
12917   return true;
12918 }
12919 
12920 
12921 /* Resolve a list of finalizer procedures.  That is, after they have hopefully
12922    been defined and we now know their defined arguments, check that they fulfill
12923    the requirements of the standard for procedures used as finalizers.  */
12924 
12925 static bool
gfc_resolve_finalizers(gfc_symbol * derived,bool * finalizable)12926 gfc_resolve_finalizers (gfc_symbol* derived, bool *finalizable)
12927 {
12928   gfc_finalizer* list;
12929   gfc_finalizer** prev_link; /* For removing wrong entries from the list.  */
12930   bool result = true;
12931   bool seen_scalar = false;
12932   gfc_symbol *vtab;
12933   gfc_component *c;
12934   gfc_symbol *parent = gfc_get_derived_super_type (derived);
12935 
12936   if (parent)
12937     gfc_resolve_finalizers (parent, finalizable);
12938 
12939   /* Ensure that derived-type components have a their finalizers resolved.  */
12940   bool has_final = derived->f2k_derived && derived->f2k_derived->finalizers;
12941   for (c = derived->components; c; c = c->next)
12942     if (c->ts.type == BT_DERIVED
12943 	&& !c->attr.pointer && !c->attr.proc_pointer && !c->attr.allocatable)
12944       {
12945 	bool has_final2 = false;
12946 	if (!gfc_resolve_finalizers (c->ts.u.derived, &has_final2))
12947 	  return false;  /* Error.  */
12948 	has_final = has_final || has_final2;
12949       }
12950   /* Return early if not finalizable.  */
12951   if (!has_final)
12952     {
12953       if (finalizable)
12954 	*finalizable = false;
12955       return true;
12956     }
12957 
12958   /* Walk over the list of finalizer-procedures, check them, and if any one
12959      does not fit in with the standard's definition, print an error and remove
12960      it from the list.  */
12961   prev_link = &derived->f2k_derived->finalizers;
12962   for (list = derived->f2k_derived->finalizers; list; list = *prev_link)
12963     {
12964       gfc_formal_arglist *dummy_args;
12965       gfc_symbol* arg;
12966       gfc_finalizer* i;
12967       int my_rank;
12968 
12969       /* Skip this finalizer if we already resolved it.  */
12970       if (list->proc_tree)
12971 	{
12972 	  if (list->proc_tree->n.sym->formal->sym->as == NULL
12973 	      || list->proc_tree->n.sym->formal->sym->as->rank == 0)
12974 	    seen_scalar = true;
12975 	  prev_link = &(list->next);
12976 	  continue;
12977 	}
12978 
12979       /* Check this exists and is a SUBROUTINE.  */
12980       if (!list->proc_sym->attr.subroutine)
12981 	{
12982 	  gfc_error ("FINAL procedure %qs at %L is not a SUBROUTINE",
12983 		     list->proc_sym->name, &list->where);
12984 	  goto error;
12985 	}
12986 
12987       /* We should have exactly one argument.  */
12988       dummy_args = gfc_sym_get_dummy_args (list->proc_sym);
12989       if (!dummy_args || dummy_args->next)
12990 	{
12991 	  gfc_error ("FINAL procedure at %L must have exactly one argument",
12992 		     &list->where);
12993 	  goto error;
12994 	}
12995       arg = dummy_args->sym;
12996 
12997       /* This argument must be of our type.  */
12998       if (arg->ts.type != BT_DERIVED || arg->ts.u.derived != derived)
12999 	{
13000 	  gfc_error ("Argument of FINAL procedure at %L must be of type %qs",
13001 		     &arg->declared_at, derived->name);
13002 	  goto error;
13003 	}
13004 
13005       /* It must neither be a pointer nor allocatable nor optional.  */
13006       if (arg->attr.pointer)
13007 	{
13008 	  gfc_error ("Argument of FINAL procedure at %L must not be a POINTER",
13009 		     &arg->declared_at);
13010 	  goto error;
13011 	}
13012       if (arg->attr.allocatable)
13013 	{
13014 	  gfc_error ("Argument of FINAL procedure at %L must not be"
13015 		     " ALLOCATABLE", &arg->declared_at);
13016 	  goto error;
13017 	}
13018       if (arg->attr.optional)
13019 	{
13020 	  gfc_error ("Argument of FINAL procedure at %L must not be OPTIONAL",
13021 		     &arg->declared_at);
13022 	  goto error;
13023 	}
13024 
13025       /* It must not be INTENT(OUT).  */
13026       if (arg->attr.intent == INTENT_OUT)
13027 	{
13028 	  gfc_error ("Argument of FINAL procedure at %L must not be"
13029 		     " INTENT(OUT)", &arg->declared_at);
13030 	  goto error;
13031 	}
13032 
13033       /* Warn if the procedure is non-scalar and not assumed shape.  */
13034       if (warn_surprising && arg->as && arg->as->rank != 0
13035 	  && arg->as->type != AS_ASSUMED_SHAPE)
13036 	gfc_warning (OPT_Wsurprising,
13037 		     "Non-scalar FINAL procedure at %L should have assumed"
13038 		     " shape argument", &arg->declared_at);
13039 
13040       /* Check that it does not match in kind and rank with a FINAL procedure
13041 	 defined earlier.  To really loop over the *earlier* declarations,
13042 	 we need to walk the tail of the list as new ones were pushed at the
13043 	 front.  */
13044       /* TODO: Handle kind parameters once they are implemented.  */
13045       my_rank = (arg->as ? arg->as->rank : 0);
13046       for (i = list->next; i; i = i->next)
13047 	{
13048 	  gfc_formal_arglist *dummy_args;
13049 
13050 	  /* Argument list might be empty; that is an error signalled earlier,
13051 	     but we nevertheless continued resolving.  */
13052 	  dummy_args = gfc_sym_get_dummy_args (i->proc_sym);
13053 	  if (dummy_args)
13054 	    {
13055 	      gfc_symbol* i_arg = dummy_args->sym;
13056 	      const int i_rank = (i_arg->as ? i_arg->as->rank : 0);
13057 	      if (i_rank == my_rank)
13058 		{
13059 		  gfc_error ("FINAL procedure %qs declared at %L has the same"
13060 			     " rank (%d) as %qs",
13061 			     list->proc_sym->name, &list->where, my_rank,
13062 			     i->proc_sym->name);
13063 		  goto error;
13064 		}
13065 	    }
13066 	}
13067 
13068 	/* Is this the/a scalar finalizer procedure?  */
13069 	if (my_rank == 0)
13070 	  seen_scalar = true;
13071 
13072 	/* Find the symtree for this procedure.  */
13073 	gcc_assert (!list->proc_tree);
13074 	list->proc_tree = gfc_find_sym_in_symtree (list->proc_sym);
13075 
13076 	prev_link = &list->next;
13077 	continue;
13078 
13079 	/* Remove wrong nodes immediately from the list so we don't risk any
13080 	   troubles in the future when they might fail later expectations.  */
13081 error:
13082 	i = list;
13083 	*prev_link = list->next;
13084 	gfc_free_finalizer (i);
13085 	result = false;
13086     }
13087 
13088   if (result == false)
13089     return false;
13090 
13091   /* Warn if we haven't seen a scalar finalizer procedure (but we know there
13092      were nodes in the list, must have been for arrays.  It is surely a good
13093      idea to have a scalar version there if there's something to finalize.  */
13094   if (warn_surprising && derived->f2k_derived->finalizers && !seen_scalar)
13095     gfc_warning (OPT_Wsurprising,
13096 		 "Only array FINAL procedures declared for derived type %qs"
13097 		 " defined at %L, suggest also scalar one",
13098 		 derived->name, &derived->declared_at);
13099 
13100   vtab = gfc_find_derived_vtab (derived);
13101   c = vtab->ts.u.derived->components->next->next->next->next->next;
13102   gfc_set_sym_referenced (c->initializer->symtree->n.sym);
13103 
13104   if (finalizable)
13105     *finalizable = true;
13106 
13107   return true;
13108 }
13109 
13110 
13111 /* Check if two GENERIC targets are ambiguous and emit an error is they are.  */
13112 
13113 static bool
check_generic_tbp_ambiguity(gfc_tbp_generic * t1,gfc_tbp_generic * t2,const char * generic_name,locus where)13114 check_generic_tbp_ambiguity (gfc_tbp_generic* t1, gfc_tbp_generic* t2,
13115 			     const char* generic_name, locus where)
13116 {
13117   gfc_symbol *sym1, *sym2;
13118   const char *pass1, *pass2;
13119   gfc_formal_arglist *dummy_args;
13120 
13121   gcc_assert (t1->specific && t2->specific);
13122   gcc_assert (!t1->specific->is_generic);
13123   gcc_assert (!t2->specific->is_generic);
13124   gcc_assert (t1->is_operator == t2->is_operator);
13125 
13126   sym1 = t1->specific->u.specific->n.sym;
13127   sym2 = t2->specific->u.specific->n.sym;
13128 
13129   if (sym1 == sym2)
13130     return true;
13131 
13132   /* Both must be SUBROUTINEs or both must be FUNCTIONs.  */
13133   if (sym1->attr.subroutine != sym2->attr.subroutine
13134       || sym1->attr.function != sym2->attr.function)
13135     {
13136       gfc_error ("%qs and %qs cannot be mixed FUNCTION/SUBROUTINE for"
13137 		 " GENERIC %qs at %L",
13138 		 sym1->name, sym2->name, generic_name, &where);
13139       return false;
13140     }
13141 
13142   /* Determine PASS arguments.  */
13143   if (t1->specific->nopass)
13144     pass1 = NULL;
13145   else if (t1->specific->pass_arg)
13146     pass1 = t1->specific->pass_arg;
13147   else
13148     {
13149       dummy_args = gfc_sym_get_dummy_args (t1->specific->u.specific->n.sym);
13150       if (dummy_args)
13151 	pass1 = dummy_args->sym->name;
13152       else
13153 	pass1 = NULL;
13154     }
13155   if (t2->specific->nopass)
13156     pass2 = NULL;
13157   else if (t2->specific->pass_arg)
13158     pass2 = t2->specific->pass_arg;
13159   else
13160     {
13161       dummy_args = gfc_sym_get_dummy_args (t2->specific->u.specific->n.sym);
13162       if (dummy_args)
13163 	pass2 = dummy_args->sym->name;
13164       else
13165 	pass2 = NULL;
13166     }
13167 
13168   /* Compare the interfaces.  */
13169   if (gfc_compare_interfaces (sym1, sym2, sym2->name, !t1->is_operator, 0,
13170 			      NULL, 0, pass1, pass2))
13171     {
13172       gfc_error ("%qs and %qs for GENERIC %qs at %L are ambiguous",
13173 		 sym1->name, sym2->name, generic_name, &where);
13174       return false;
13175     }
13176 
13177   return true;
13178 }
13179 
13180 
13181 /* Worker function for resolving a generic procedure binding; this is used to
13182    resolve GENERIC as well as user and intrinsic OPERATOR typebound procedures.
13183 
13184    The difference between those cases is finding possible inherited bindings
13185    that are overridden, as one has to look for them in tb_sym_root,
13186    tb_uop_root or tb_op, respectively.  Thus the caller must already find
13187    the super-type and set p->overridden correctly.  */
13188 
13189 static bool
resolve_tb_generic_targets(gfc_symbol * super_type,gfc_typebound_proc * p,const char * name)13190 resolve_tb_generic_targets (gfc_symbol* super_type,
13191 			    gfc_typebound_proc* p, const char* name)
13192 {
13193   gfc_tbp_generic* target;
13194   gfc_symtree* first_target;
13195   gfc_symtree* inherited;
13196 
13197   gcc_assert (p && p->is_generic);
13198 
13199   /* Try to find the specific bindings for the symtrees in our target-list.  */
13200   gcc_assert (p->u.generic);
13201   for (target = p->u.generic; target; target = target->next)
13202     if (!target->specific)
13203       {
13204 	gfc_typebound_proc* overridden_tbp;
13205 	gfc_tbp_generic* g;
13206 	const char* target_name;
13207 
13208 	target_name = target->specific_st->name;
13209 
13210 	/* Defined for this type directly.  */
13211 	if (target->specific_st->n.tb && !target->specific_st->n.tb->error)
13212 	  {
13213 	    target->specific = target->specific_st->n.tb;
13214 	    goto specific_found;
13215 	  }
13216 
13217 	/* Look for an inherited specific binding.  */
13218 	if (super_type)
13219 	  {
13220 	    inherited = gfc_find_typebound_proc (super_type, NULL, target_name,
13221 						 true, NULL);
13222 
13223 	    if (inherited)
13224 	      {
13225 		gcc_assert (inherited->n.tb);
13226 		target->specific = inherited->n.tb;
13227 		goto specific_found;
13228 	      }
13229 	  }
13230 
13231 	gfc_error ("Undefined specific binding %qs as target of GENERIC %qs"
13232 		   " at %L", target_name, name, &p->where);
13233 	return false;
13234 
13235 	/* Once we've found the specific binding, check it is not ambiguous with
13236 	   other specifics already found or inherited for the same GENERIC.  */
13237 specific_found:
13238 	gcc_assert (target->specific);
13239 
13240 	/* This must really be a specific binding!  */
13241 	if (target->specific->is_generic)
13242 	  {
13243 	    gfc_error ("GENERIC %qs at %L must target a specific binding,"
13244 		       " %qs is GENERIC, too", name, &p->where, target_name);
13245 	    return false;
13246 	  }
13247 
13248 	/* Check those already resolved on this type directly.  */
13249 	for (g = p->u.generic; g; g = g->next)
13250 	  if (g != target && g->specific
13251 	      && !check_generic_tbp_ambiguity (target, g, name, p->where))
13252 	    return false;
13253 
13254 	/* Check for ambiguity with inherited specific targets.  */
13255 	for (overridden_tbp = p->overridden; overridden_tbp;
13256 	     overridden_tbp = overridden_tbp->overridden)
13257 	  if (overridden_tbp->is_generic)
13258 	    {
13259 	      for (g = overridden_tbp->u.generic; g; g = g->next)
13260 		{
13261 		  gcc_assert (g->specific);
13262 		  if (!check_generic_tbp_ambiguity (target, g, name, p->where))
13263 		    return false;
13264 		}
13265 	    }
13266       }
13267 
13268   /* If we attempt to "overwrite" a specific binding, this is an error.  */
13269   if (p->overridden && !p->overridden->is_generic)
13270     {
13271       gfc_error ("GENERIC %qs at %L cannot overwrite specific binding with"
13272 		 " the same name", name, &p->where);
13273       return false;
13274     }
13275 
13276   /* Take the SUBROUTINE/FUNCTION attributes of the first specific target, as
13277      all must have the same attributes here.  */
13278   first_target = p->u.generic->specific->u.specific;
13279   gcc_assert (first_target);
13280   p->subroutine = first_target->n.sym->attr.subroutine;
13281   p->function = first_target->n.sym->attr.function;
13282 
13283   return true;
13284 }
13285 
13286 
13287 /* Resolve a GENERIC procedure binding for a derived type.  */
13288 
13289 static bool
resolve_typebound_generic(gfc_symbol * derived,gfc_symtree * st)13290 resolve_typebound_generic (gfc_symbol* derived, gfc_symtree* st)
13291 {
13292   gfc_symbol* super_type;
13293 
13294   /* Find the overridden binding if any.  */
13295   st->n.tb->overridden = NULL;
13296   super_type = gfc_get_derived_super_type (derived);
13297   if (super_type)
13298     {
13299       gfc_symtree* overridden;
13300       overridden = gfc_find_typebound_proc (super_type, NULL, st->name,
13301 					    true, NULL);
13302 
13303       if (overridden && overridden->n.tb)
13304 	st->n.tb->overridden = overridden->n.tb;
13305     }
13306 
13307   /* Resolve using worker function.  */
13308   return resolve_tb_generic_targets (super_type, st->n.tb, st->name);
13309 }
13310 
13311 
13312 /* Retrieve the target-procedure of an operator binding and do some checks in
13313    common for intrinsic and user-defined type-bound operators.  */
13314 
13315 static gfc_symbol*
get_checked_tb_operator_target(gfc_tbp_generic * target,locus where)13316 get_checked_tb_operator_target (gfc_tbp_generic* target, locus where)
13317 {
13318   gfc_symbol* target_proc;
13319 
13320   gcc_assert (target->specific && !target->specific->is_generic);
13321   target_proc = target->specific->u.specific->n.sym;
13322   gcc_assert (target_proc);
13323 
13324   /* F08:C468. All operator bindings must have a passed-object dummy argument.  */
13325   if (target->specific->nopass)
13326     {
13327       gfc_error ("Type-bound operator at %L cannot be NOPASS", &where);
13328       return NULL;
13329     }
13330 
13331   return target_proc;
13332 }
13333 
13334 
13335 /* Resolve a type-bound intrinsic operator.  */
13336 
13337 static bool
resolve_typebound_intrinsic_op(gfc_symbol * derived,gfc_intrinsic_op op,gfc_typebound_proc * p)13338 resolve_typebound_intrinsic_op (gfc_symbol* derived, gfc_intrinsic_op op,
13339 				gfc_typebound_proc* p)
13340 {
13341   gfc_symbol* super_type;
13342   gfc_tbp_generic* target;
13343 
13344   /* If there's already an error here, do nothing (but don't fail again).  */
13345   if (p->error)
13346     return true;
13347 
13348   /* Operators should always be GENERIC bindings.  */
13349   gcc_assert (p->is_generic);
13350 
13351   /* Look for an overridden binding.  */
13352   super_type = gfc_get_derived_super_type (derived);
13353   if (super_type && super_type->f2k_derived)
13354     p->overridden = gfc_find_typebound_intrinsic_op (super_type, NULL,
13355 						     op, true, NULL);
13356   else
13357     p->overridden = NULL;
13358 
13359   /* Resolve general GENERIC properties using worker function.  */
13360   if (!resolve_tb_generic_targets (super_type, p, gfc_op2string(op)))
13361     goto error;
13362 
13363   /* Check the targets to be procedures of correct interface.  */
13364   for (target = p->u.generic; target; target = target->next)
13365     {
13366       gfc_symbol* target_proc;
13367 
13368       target_proc = get_checked_tb_operator_target (target, p->where);
13369       if (!target_proc)
13370 	goto error;
13371 
13372       if (!gfc_check_operator_interface (target_proc, op, p->where))
13373 	goto error;
13374 
13375       /* Add target to non-typebound operator list.  */
13376       if (!target->specific->deferred && !derived->attr.use_assoc
13377 	  && p->access != ACCESS_PRIVATE && derived->ns == gfc_current_ns)
13378 	{
13379 	  gfc_interface *head, *intr;
13380 
13381 	  /* Preempt 'gfc_check_new_interface' for submodules, where the
13382 	     mechanism for handling module procedures winds up resolving
13383 	     operator interfaces twice and would otherwise cause an error.  */
13384 	  for (intr = derived->ns->op[op]; intr; intr = intr->next)
13385 	    if (intr->sym == target_proc
13386 		&& target_proc->attr.used_in_submodule)
13387 	      return true;
13388 
13389 	  if (!gfc_check_new_interface (derived->ns->op[op],
13390 					target_proc, p->where))
13391 	    return false;
13392 	  head = derived->ns->op[op];
13393 	  intr = gfc_get_interface ();
13394 	  intr->sym = target_proc;
13395 	  intr->where = p->where;
13396 	  intr->next = head;
13397 	  derived->ns->op[op] = intr;
13398 	}
13399     }
13400 
13401   return true;
13402 
13403 error:
13404   p->error = 1;
13405   return false;
13406 }
13407 
13408 
13409 /* Resolve a type-bound user operator (tree-walker callback).  */
13410 
13411 static gfc_symbol* resolve_bindings_derived;
13412 static bool resolve_bindings_result;
13413 
13414 static bool check_uop_procedure (gfc_symbol* sym, locus where);
13415 
13416 static void
resolve_typebound_user_op(gfc_symtree * stree)13417 resolve_typebound_user_op (gfc_symtree* stree)
13418 {
13419   gfc_symbol* super_type;
13420   gfc_tbp_generic* target;
13421 
13422   gcc_assert (stree && stree->n.tb);
13423 
13424   if (stree->n.tb->error)
13425     return;
13426 
13427   /* Operators should always be GENERIC bindings.  */
13428   gcc_assert (stree->n.tb->is_generic);
13429 
13430   /* Find overridden procedure, if any.  */
13431   super_type = gfc_get_derived_super_type (resolve_bindings_derived);
13432   if (super_type && super_type->f2k_derived)
13433     {
13434       gfc_symtree* overridden;
13435       overridden = gfc_find_typebound_user_op (super_type, NULL,
13436 					       stree->name, true, NULL);
13437 
13438       if (overridden && overridden->n.tb)
13439 	stree->n.tb->overridden = overridden->n.tb;
13440     }
13441   else
13442     stree->n.tb->overridden = NULL;
13443 
13444   /* Resolve basically using worker function.  */
13445   if (!resolve_tb_generic_targets (super_type, stree->n.tb, stree->name))
13446     goto error;
13447 
13448   /* Check the targets to be functions of correct interface.  */
13449   for (target = stree->n.tb->u.generic; target; target = target->next)
13450     {
13451       gfc_symbol* target_proc;
13452 
13453       target_proc = get_checked_tb_operator_target (target, stree->n.tb->where);
13454       if (!target_proc)
13455 	goto error;
13456 
13457       if (!check_uop_procedure (target_proc, stree->n.tb->where))
13458 	goto error;
13459     }
13460 
13461   return;
13462 
13463 error:
13464   resolve_bindings_result = false;
13465   stree->n.tb->error = 1;
13466 }
13467 
13468 
13469 /* Resolve the type-bound procedures for a derived type.  */
13470 
13471 static void
resolve_typebound_procedure(gfc_symtree * stree)13472 resolve_typebound_procedure (gfc_symtree* stree)
13473 {
13474   gfc_symbol* proc;
13475   locus where;
13476   gfc_symbol* me_arg;
13477   gfc_symbol* super_type;
13478   gfc_component* comp;
13479 
13480   gcc_assert (stree);
13481 
13482   /* Undefined specific symbol from GENERIC target definition.  */
13483   if (!stree->n.tb)
13484     return;
13485 
13486   if (stree->n.tb->error)
13487     return;
13488 
13489   /* If this is a GENERIC binding, use that routine.  */
13490   if (stree->n.tb->is_generic)
13491     {
13492       if (!resolve_typebound_generic (resolve_bindings_derived, stree))
13493 	goto error;
13494       return;
13495     }
13496 
13497   /* Get the target-procedure to check it.  */
13498   gcc_assert (!stree->n.tb->is_generic);
13499   gcc_assert (stree->n.tb->u.specific);
13500   proc = stree->n.tb->u.specific->n.sym;
13501   where = stree->n.tb->where;
13502 
13503   /* Default access should already be resolved from the parser.  */
13504   gcc_assert (stree->n.tb->access != ACCESS_UNKNOWN);
13505 
13506   if (stree->n.tb->deferred)
13507     {
13508       if (!check_proc_interface (proc, &where))
13509 	goto error;
13510     }
13511   else
13512     {
13513       /* Check for F08:C465.  */
13514       if ((!proc->attr.subroutine && !proc->attr.function)
13515 	  || (proc->attr.proc != PROC_MODULE
13516 	      && proc->attr.if_source != IFSRC_IFBODY)
13517 	  || proc->attr.abstract)
13518 	{
13519 	  gfc_error ("%qs must be a module procedure or an external procedure with"
13520 		    " an explicit interface at %L", proc->name, &where);
13521 	  goto error;
13522 	}
13523     }
13524 
13525   stree->n.tb->subroutine = proc->attr.subroutine;
13526   stree->n.tb->function = proc->attr.function;
13527 
13528   /* Find the super-type of the current derived type.  We could do this once and
13529      store in a global if speed is needed, but as long as not I believe this is
13530      more readable and clearer.  */
13531   super_type = gfc_get_derived_super_type (resolve_bindings_derived);
13532 
13533   /* If PASS, resolve and check arguments if not already resolved / loaded
13534      from a .mod file.  */
13535   if (!stree->n.tb->nopass && stree->n.tb->pass_arg_num == 0)
13536     {
13537       gfc_formal_arglist *dummy_args;
13538 
13539       dummy_args = gfc_sym_get_dummy_args (proc);
13540       if (stree->n.tb->pass_arg)
13541 	{
13542 	  gfc_formal_arglist *i;
13543 
13544 	  /* If an explicit passing argument name is given, walk the arg-list
13545 	     and look for it.  */
13546 
13547 	  me_arg = NULL;
13548 	  stree->n.tb->pass_arg_num = 1;
13549 	  for (i = dummy_args; i; i = i->next)
13550 	    {
13551 	      if (!strcmp (i->sym->name, stree->n.tb->pass_arg))
13552 		{
13553 		  me_arg = i->sym;
13554 		  break;
13555 		}
13556 	      ++stree->n.tb->pass_arg_num;
13557 	    }
13558 
13559 	  if (!me_arg)
13560 	    {
13561 	      gfc_error ("Procedure %qs with PASS(%s) at %L has no"
13562 			 " argument %qs",
13563 			 proc->name, stree->n.tb->pass_arg, &where,
13564 			 stree->n.tb->pass_arg);
13565 	      goto error;
13566 	    }
13567 	}
13568       else
13569 	{
13570 	  /* Otherwise, take the first one; there should in fact be at least
13571 	     one.  */
13572 	  stree->n.tb->pass_arg_num = 1;
13573 	  if (!dummy_args)
13574 	    {
13575 	      gfc_error ("Procedure %qs with PASS at %L must have at"
13576 			 " least one argument", proc->name, &where);
13577 	      goto error;
13578 	    }
13579 	  me_arg = dummy_args->sym;
13580 	}
13581 
13582       /* Now check that the argument-type matches and the passed-object
13583 	 dummy argument is generally fine.  */
13584 
13585       gcc_assert (me_arg);
13586 
13587       if (me_arg->ts.type != BT_CLASS)
13588 	{
13589 	  gfc_error ("Non-polymorphic passed-object dummy argument of %qs"
13590 		     " at %L", proc->name, &where);
13591 	  goto error;
13592 	}
13593 
13594       if (CLASS_DATA (me_arg)->ts.u.derived
13595 	  != resolve_bindings_derived)
13596 	{
13597 	  gfc_error ("Argument %qs of %qs with PASS(%s) at %L must be of"
13598 		     " the derived-type %qs", me_arg->name, proc->name,
13599 		     me_arg->name, &where, resolve_bindings_derived->name);
13600 	  goto error;
13601 	}
13602 
13603       gcc_assert (me_arg->ts.type == BT_CLASS);
13604       if (CLASS_DATA (me_arg)->as && CLASS_DATA (me_arg)->as->rank != 0)
13605 	{
13606 	  gfc_error ("Passed-object dummy argument of %qs at %L must be"
13607 		     " scalar", proc->name, &where);
13608 	  goto error;
13609 	}
13610       if (CLASS_DATA (me_arg)->attr.allocatable)
13611 	{
13612 	  gfc_error ("Passed-object dummy argument of %qs at %L must not"
13613 		     " be ALLOCATABLE", proc->name, &where);
13614 	  goto error;
13615 	}
13616       if (CLASS_DATA (me_arg)->attr.class_pointer)
13617 	{
13618 	  gfc_error ("Passed-object dummy argument of %qs at %L must not"
13619 		     " be POINTER", proc->name, &where);
13620 	  goto error;
13621 	}
13622     }
13623 
13624   /* If we are extending some type, check that we don't override a procedure
13625      flagged NON_OVERRIDABLE.  */
13626   stree->n.tb->overridden = NULL;
13627   if (super_type)
13628     {
13629       gfc_symtree* overridden;
13630       overridden = gfc_find_typebound_proc (super_type, NULL,
13631 					    stree->name, true, NULL);
13632 
13633       if (overridden)
13634 	{
13635 	  if (overridden->n.tb)
13636 	    stree->n.tb->overridden = overridden->n.tb;
13637 
13638 	  if (!gfc_check_typebound_override (stree, overridden))
13639 	    goto error;
13640 	}
13641     }
13642 
13643   /* See if there's a name collision with a component directly in this type.  */
13644   for (comp = resolve_bindings_derived->components; comp; comp = comp->next)
13645     if (!strcmp (comp->name, stree->name))
13646       {
13647 	gfc_error ("Procedure %qs at %L has the same name as a component of"
13648 		   " %qs",
13649 		   stree->name, &where, resolve_bindings_derived->name);
13650 	goto error;
13651       }
13652 
13653   /* Try to find a name collision with an inherited component.  */
13654   if (super_type && gfc_find_component (super_type, stree->name, true, true,
13655                                         NULL))
13656     {
13657       gfc_error ("Procedure %qs at %L has the same name as an inherited"
13658 		 " component of %qs",
13659 		 stree->name, &where, resolve_bindings_derived->name);
13660       goto error;
13661     }
13662 
13663   stree->n.tb->error = 0;
13664   return;
13665 
13666 error:
13667   resolve_bindings_result = false;
13668   stree->n.tb->error = 1;
13669 }
13670 
13671 
13672 static bool
resolve_typebound_procedures(gfc_symbol * derived)13673 resolve_typebound_procedures (gfc_symbol* derived)
13674 {
13675   int op;
13676   gfc_symbol* super_type;
13677 
13678   if (!derived->f2k_derived || !derived->f2k_derived->tb_sym_root)
13679     return true;
13680 
13681   super_type = gfc_get_derived_super_type (derived);
13682   if (super_type)
13683     resolve_symbol (super_type);
13684 
13685   resolve_bindings_derived = derived;
13686   resolve_bindings_result = true;
13687 
13688   if (derived->f2k_derived->tb_sym_root)
13689     gfc_traverse_symtree (derived->f2k_derived->tb_sym_root,
13690 			  &resolve_typebound_procedure);
13691 
13692   if (derived->f2k_derived->tb_uop_root)
13693     gfc_traverse_symtree (derived->f2k_derived->tb_uop_root,
13694 			  &resolve_typebound_user_op);
13695 
13696   for (op = 0; op != GFC_INTRINSIC_OPS; ++op)
13697     {
13698       gfc_typebound_proc* p = derived->f2k_derived->tb_op[op];
13699       if (p && !resolve_typebound_intrinsic_op (derived,
13700 						(gfc_intrinsic_op)op, p))
13701 	resolve_bindings_result = false;
13702     }
13703 
13704   return resolve_bindings_result;
13705 }
13706 
13707 
13708 /* Add a derived type to the dt_list.  The dt_list is used in trans-types.c
13709    to give all identical derived types the same backend_decl.  */
13710 static void
add_dt_to_dt_list(gfc_symbol * derived)13711 add_dt_to_dt_list (gfc_symbol *derived)
13712 {
13713   if (!derived->dt_next)
13714     {
13715       if (gfc_derived_types)
13716 	{
13717 	  derived->dt_next = gfc_derived_types->dt_next;
13718 	  gfc_derived_types->dt_next = derived;
13719 	}
13720       else
13721 	{
13722 	  derived->dt_next = derived;
13723 	}
13724       gfc_derived_types = derived;
13725     }
13726 }
13727 
13728 
13729 /* Ensure that a derived-type is really not abstract, meaning that every
13730    inherited DEFERRED binding is overridden by a non-DEFERRED one.  */
13731 
13732 static bool
ensure_not_abstract_walker(gfc_symbol * sub,gfc_symtree * st)13733 ensure_not_abstract_walker (gfc_symbol* sub, gfc_symtree* st)
13734 {
13735   if (!st)
13736     return true;
13737 
13738   if (!ensure_not_abstract_walker (sub, st->left))
13739     return false;
13740   if (!ensure_not_abstract_walker (sub, st->right))
13741     return false;
13742 
13743   if (st->n.tb && st->n.tb->deferred)
13744     {
13745       gfc_symtree* overriding;
13746       overriding = gfc_find_typebound_proc (sub, NULL, st->name, true, NULL);
13747       if (!overriding)
13748 	return false;
13749       gcc_assert (overriding->n.tb);
13750       if (overriding->n.tb->deferred)
13751 	{
13752 	  gfc_error ("Derived-type %qs declared at %L must be ABSTRACT because"
13753 		     " %qs is DEFERRED and not overridden",
13754 		     sub->name, &sub->declared_at, st->name);
13755 	  return false;
13756 	}
13757     }
13758 
13759   return true;
13760 }
13761 
13762 static bool
ensure_not_abstract(gfc_symbol * sub,gfc_symbol * ancestor)13763 ensure_not_abstract (gfc_symbol* sub, gfc_symbol* ancestor)
13764 {
13765   /* The algorithm used here is to recursively travel up the ancestry of sub
13766      and for each ancestor-type, check all bindings.  If any of them is
13767      DEFERRED, look it up starting from sub and see if the found (overriding)
13768      binding is not DEFERRED.
13769      This is not the most efficient way to do this, but it should be ok and is
13770      clearer than something sophisticated.  */
13771 
13772   gcc_assert (ancestor && !sub->attr.abstract);
13773 
13774   if (!ancestor->attr.abstract)
13775     return true;
13776 
13777   /* Walk bindings of this ancestor.  */
13778   if (ancestor->f2k_derived)
13779     {
13780       bool t;
13781       t = ensure_not_abstract_walker (sub, ancestor->f2k_derived->tb_sym_root);
13782       if (!t)
13783 	return false;
13784     }
13785 
13786   /* Find next ancestor type and recurse on it.  */
13787   ancestor = gfc_get_derived_super_type (ancestor);
13788   if (ancestor)
13789     return ensure_not_abstract (sub, ancestor);
13790 
13791   return true;
13792 }
13793 
13794 
13795 /* This check for typebound defined assignments is done recursively
13796    since the order in which derived types are resolved is not always in
13797    order of the declarations.  */
13798 
13799 static void
check_defined_assignments(gfc_symbol * derived)13800 check_defined_assignments (gfc_symbol *derived)
13801 {
13802   gfc_component *c;
13803 
13804   for (c = derived->components; c; c = c->next)
13805     {
13806       if (!gfc_bt_struct (c->ts.type)
13807 	  || c->attr.pointer
13808 	  || c->attr.allocatable
13809 	  || c->attr.proc_pointer_comp
13810 	  || c->attr.class_pointer
13811 	  || c->attr.proc_pointer)
13812 	continue;
13813 
13814       if (c->ts.u.derived->attr.defined_assign_comp
13815 	  || (c->ts.u.derived->f2k_derived
13816 	     && c->ts.u.derived->f2k_derived->tb_op[INTRINSIC_ASSIGN]))
13817 	{
13818 	  derived->attr.defined_assign_comp = 1;
13819 	  return;
13820 	}
13821 
13822       check_defined_assignments (c->ts.u.derived);
13823       if (c->ts.u.derived->attr.defined_assign_comp)
13824 	{
13825 	  derived->attr.defined_assign_comp = 1;
13826 	  return;
13827 	}
13828     }
13829 }
13830 
13831 
13832 /* Resolve a single component of a derived type or structure.  */
13833 
13834 static bool
resolve_component(gfc_component * c,gfc_symbol * sym)13835 resolve_component (gfc_component *c, gfc_symbol *sym)
13836 {
13837   gfc_symbol *super_type;
13838   symbol_attribute *attr;
13839 
13840   if (c->attr.artificial)
13841     return true;
13842 
13843   /* Do not allow vtype components to be resolved in nameless namespaces
13844      such as block data because the procedure pointers will cause ICEs
13845      and vtables are not needed in these contexts.  */
13846   if (sym->attr.vtype && sym->attr.use_assoc
13847       && sym->ns->proc_name == NULL)
13848     return true;
13849 
13850   /* F2008, C442.  */
13851   if ((!sym->attr.is_class || c != sym->components)
13852       && c->attr.codimension
13853       && (!c->attr.allocatable || (c->as && c->as->type != AS_DEFERRED)))
13854     {
13855       gfc_error ("Coarray component %qs at %L must be allocatable with "
13856                  "deferred shape", c->name, &c->loc);
13857       return false;
13858     }
13859 
13860   /* F2008, C443.  */
13861   if (c->attr.codimension && c->ts.type == BT_DERIVED
13862       && c->ts.u.derived->ts.is_iso_c)
13863     {
13864       gfc_error ("Component %qs at %L of TYPE(C_PTR) or TYPE(C_FUNPTR) "
13865                  "shall not be a coarray", c->name, &c->loc);
13866       return false;
13867     }
13868 
13869   /* F2008, C444.  */
13870   if (gfc_bt_struct (c->ts.type) && c->ts.u.derived->attr.coarray_comp
13871       && (c->attr.codimension || c->attr.pointer || c->attr.dimension
13872           || c->attr.allocatable))
13873     {
13874       gfc_error ("Component %qs at %L with coarray component "
13875                  "shall be a nonpointer, nonallocatable scalar",
13876                  c->name, &c->loc);
13877       return false;
13878     }
13879 
13880   /* F2008, C448.  */
13881   if (c->ts.type == BT_CLASS)
13882     {
13883       if (CLASS_DATA (c))
13884 	{
13885 	  attr = &(CLASS_DATA (c)->attr);
13886 
13887 	  /* Fix up contiguous attribute.  */
13888 	  if (c->attr.contiguous)
13889 	    attr->contiguous = 1;
13890 	}
13891       else
13892 	attr = NULL;
13893     }
13894   else
13895     attr = &c->attr;
13896 
13897   if (attr && attr->contiguous && (!attr->dimension || !attr->pointer))
13898     {
13899       gfc_error ("Component %qs at %L has the CONTIGUOUS attribute but "
13900                  "is not an array pointer", c->name, &c->loc);
13901       return false;
13902     }
13903 
13904   /* F2003, 15.2.1 - length has to be one.  */
13905   if (sym->attr.is_bind_c && c->ts.type == BT_CHARACTER
13906       && (c->ts.u.cl == NULL || c->ts.u.cl->length == NULL
13907 	  || !gfc_is_constant_expr (c->ts.u.cl->length)
13908 	  || mpz_cmp_si (c->ts.u.cl->length->value.integer, 1) != 0))
13909     {
13910       gfc_error ("Component %qs of BIND(C) type at %L must have length one",
13911 		 c->name, &c->loc);
13912       return false;
13913     }
13914 
13915   if (c->attr.proc_pointer && c->ts.interface)
13916     {
13917       gfc_symbol *ifc = c->ts.interface;
13918 
13919       if (!sym->attr.vtype && !check_proc_interface (ifc, &c->loc))
13920         {
13921           c->tb->error = 1;
13922           return false;
13923         }
13924 
13925       if (ifc->attr.if_source || ifc->attr.intrinsic)
13926         {
13927           /* Resolve interface and copy attributes.  */
13928           if (ifc->formal && !ifc->formal_ns)
13929             resolve_symbol (ifc);
13930           if (ifc->attr.intrinsic)
13931             gfc_resolve_intrinsic (ifc, &ifc->declared_at);
13932 
13933           if (ifc->result)
13934             {
13935               c->ts = ifc->result->ts;
13936               c->attr.allocatable = ifc->result->attr.allocatable;
13937               c->attr.pointer = ifc->result->attr.pointer;
13938               c->attr.dimension = ifc->result->attr.dimension;
13939               c->as = gfc_copy_array_spec (ifc->result->as);
13940               c->attr.class_ok = ifc->result->attr.class_ok;
13941             }
13942           else
13943             {
13944               c->ts = ifc->ts;
13945               c->attr.allocatable = ifc->attr.allocatable;
13946               c->attr.pointer = ifc->attr.pointer;
13947               c->attr.dimension = ifc->attr.dimension;
13948               c->as = gfc_copy_array_spec (ifc->as);
13949               c->attr.class_ok = ifc->attr.class_ok;
13950             }
13951           c->ts.interface = ifc;
13952           c->attr.function = ifc->attr.function;
13953           c->attr.subroutine = ifc->attr.subroutine;
13954 
13955           c->attr.pure = ifc->attr.pure;
13956           c->attr.elemental = ifc->attr.elemental;
13957           c->attr.recursive = ifc->attr.recursive;
13958           c->attr.always_explicit = ifc->attr.always_explicit;
13959           c->attr.ext_attr |= ifc->attr.ext_attr;
13960           /* Copy char length.  */
13961           if (ifc->ts.type == BT_CHARACTER && ifc->ts.u.cl)
13962             {
13963               gfc_charlen *cl = gfc_new_charlen (sym->ns, ifc->ts.u.cl);
13964               if (cl->length && !cl->resolved
13965                   && !gfc_resolve_expr (cl->length))
13966                 {
13967                   c->tb->error = 1;
13968                   return false;
13969                 }
13970               c->ts.u.cl = cl;
13971             }
13972         }
13973     }
13974   else if (c->attr.proc_pointer && c->ts.type == BT_UNKNOWN)
13975     {
13976       /* Since PPCs are not implicitly typed, a PPC without an explicit
13977          interface must be a subroutine.  */
13978       gfc_add_subroutine (&c->attr, c->name, &c->loc);
13979     }
13980 
13981   /* Procedure pointer components: Check PASS arg.  */
13982   if (c->attr.proc_pointer && !c->tb->nopass && c->tb->pass_arg_num == 0
13983       && !sym->attr.vtype)
13984     {
13985       gfc_symbol* me_arg;
13986 
13987       if (c->tb->pass_arg)
13988         {
13989           gfc_formal_arglist* i;
13990 
13991           /* If an explicit passing argument name is given, walk the arg-list
13992             and look for it.  */
13993 
13994           me_arg = NULL;
13995           c->tb->pass_arg_num = 1;
13996           for (i = c->ts.interface->formal; i; i = i->next)
13997             {
13998               if (!strcmp (i->sym->name, c->tb->pass_arg))
13999                 {
14000                   me_arg = i->sym;
14001                   break;
14002                 }
14003               c->tb->pass_arg_num++;
14004             }
14005 
14006           if (!me_arg)
14007             {
14008               gfc_error ("Procedure pointer component %qs with PASS(%s) "
14009                          "at %L has no argument %qs", c->name,
14010                          c->tb->pass_arg, &c->loc, c->tb->pass_arg);
14011               c->tb->error = 1;
14012               return false;
14013             }
14014         }
14015       else
14016         {
14017           /* Otherwise, take the first one; there should in fact be at least
14018             one.  */
14019           c->tb->pass_arg_num = 1;
14020           if (!c->ts.interface->formal)
14021             {
14022               gfc_error ("Procedure pointer component %qs with PASS at %L "
14023                          "must have at least one argument",
14024                          c->name, &c->loc);
14025               c->tb->error = 1;
14026               return false;
14027             }
14028           me_arg = c->ts.interface->formal->sym;
14029         }
14030 
14031       /* Now check that the argument-type matches.  */
14032       gcc_assert (me_arg);
14033       if ((me_arg->ts.type != BT_DERIVED && me_arg->ts.type != BT_CLASS)
14034           || (me_arg->ts.type == BT_DERIVED && me_arg->ts.u.derived != sym)
14035           || (me_arg->ts.type == BT_CLASS
14036               && CLASS_DATA (me_arg)->ts.u.derived != sym))
14037         {
14038           gfc_error ("Argument %qs of %qs with PASS(%s) at %L must be of"
14039                      " the derived type %qs", me_arg->name, c->name,
14040                      me_arg->name, &c->loc, sym->name);
14041           c->tb->error = 1;
14042           return false;
14043         }
14044 
14045       /* Check for F03:C453.  */
14046       if (CLASS_DATA (me_arg)->attr.dimension)
14047         {
14048           gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
14049                      "must be scalar", me_arg->name, c->name, me_arg->name,
14050                      &c->loc);
14051           c->tb->error = 1;
14052           return false;
14053         }
14054 
14055       if (CLASS_DATA (me_arg)->attr.class_pointer)
14056         {
14057           gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
14058                      "may not have the POINTER attribute", me_arg->name,
14059                      c->name, me_arg->name, &c->loc);
14060           c->tb->error = 1;
14061           return false;
14062         }
14063 
14064       if (CLASS_DATA (me_arg)->attr.allocatable)
14065         {
14066           gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
14067                      "may not be ALLOCATABLE", me_arg->name, c->name,
14068                      me_arg->name, &c->loc);
14069           c->tb->error = 1;
14070           return false;
14071         }
14072 
14073       if (gfc_type_is_extensible (sym) && me_arg->ts.type != BT_CLASS)
14074         {
14075           gfc_error ("Non-polymorphic passed-object dummy argument of %qs"
14076                      " at %L", c->name, &c->loc);
14077           return false;
14078         }
14079 
14080     }
14081 
14082   /* Check type-spec if this is not the parent-type component.  */
14083   if (((sym->attr.is_class
14084         && (!sym->components->ts.u.derived->attr.extension
14085             || c != sym->components->ts.u.derived->components))
14086        || (!sym->attr.is_class
14087            && (!sym->attr.extension || c != sym->components)))
14088       && !sym->attr.vtype
14089       && !resolve_typespec_used (&c->ts, &c->loc, c->name))
14090     return false;
14091 
14092   super_type = gfc_get_derived_super_type (sym);
14093 
14094   /* If this type is an extension, set the accessibility of the parent
14095      component.  */
14096   if (super_type
14097       && ((sym->attr.is_class
14098            && c == sym->components->ts.u.derived->components)
14099           || (!sym->attr.is_class && c == sym->components))
14100       && strcmp (super_type->name, c->name) == 0)
14101     c->attr.access = super_type->attr.access;
14102 
14103   /* If this type is an extension, see if this component has the same name
14104      as an inherited type-bound procedure.  */
14105   if (super_type && !sym->attr.is_class
14106       && gfc_find_typebound_proc (super_type, NULL, c->name, true, NULL))
14107     {
14108       gfc_error ("Component %qs of %qs at %L has the same name as an"
14109                  " inherited type-bound procedure",
14110                  c->name, sym->name, &c->loc);
14111       return false;
14112     }
14113 
14114   if (c->ts.type == BT_CHARACTER && !c->attr.proc_pointer
14115         && !c->ts.deferred)
14116     {
14117      if (c->ts.u.cl->length == NULL
14118          || (!resolve_charlen(c->ts.u.cl))
14119          || !gfc_is_constant_expr (c->ts.u.cl->length))
14120        {
14121          gfc_error ("Character length of component %qs needs to "
14122                     "be a constant specification expression at %L",
14123                     c->name,
14124                     c->ts.u.cl->length ? &c->ts.u.cl->length->where : &c->loc);
14125          return false;
14126        }
14127     }
14128 
14129   if (c->ts.type == BT_CHARACTER && c->ts.deferred
14130       && !c->attr.pointer && !c->attr.allocatable)
14131     {
14132       gfc_error ("Character component %qs of %qs at %L with deferred "
14133                  "length must be a POINTER or ALLOCATABLE",
14134                  c->name, sym->name, &c->loc);
14135       return false;
14136     }
14137 
14138   /* Add the hidden deferred length field.  */
14139   if (c->ts.type == BT_CHARACTER
14140       && (c->ts.deferred || c->attr.pdt_string)
14141       && !c->attr.function
14142       && !sym->attr.is_class)
14143     {
14144       char name[GFC_MAX_SYMBOL_LEN+9];
14145       gfc_component *strlen;
14146       sprintf (name, "_%s_length", c->name);
14147       strlen = gfc_find_component (sym, name, true, true, NULL);
14148       if (strlen == NULL)
14149         {
14150           if (!gfc_add_component (sym, name, &strlen))
14151             return false;
14152           strlen->ts.type = BT_INTEGER;
14153           strlen->ts.kind = gfc_charlen_int_kind;
14154           strlen->attr.access = ACCESS_PRIVATE;
14155           strlen->attr.artificial = 1;
14156         }
14157     }
14158 
14159   if (c->ts.type == BT_DERIVED
14160       && sym->component_access != ACCESS_PRIVATE
14161       && gfc_check_symbol_access (sym)
14162       && !is_sym_host_assoc (c->ts.u.derived, sym->ns)
14163       && !c->ts.u.derived->attr.use_assoc
14164       && !gfc_check_symbol_access (c->ts.u.derived)
14165       && !gfc_notify_std (GFC_STD_F2003, "the component %qs is a "
14166                           "PRIVATE type and cannot be a component of "
14167                           "%qs, which is PUBLIC at %L", c->name,
14168                           sym->name, &sym->declared_at))
14169     return false;
14170 
14171   if ((sym->attr.sequence || sym->attr.is_bind_c) && c->ts.type == BT_CLASS)
14172     {
14173       gfc_error ("Polymorphic component %s at %L in SEQUENCE or BIND(C) "
14174                  "type %s", c->name, &c->loc, sym->name);
14175       return false;
14176     }
14177 
14178   if (sym->attr.sequence)
14179     {
14180       if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.sequence == 0)
14181         {
14182           gfc_error ("Component %s of SEQUENCE type declared at %L does "
14183                      "not have the SEQUENCE attribute",
14184                      c->ts.u.derived->name, &sym->declared_at);
14185           return false;
14186         }
14187     }
14188 
14189   if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.generic)
14190     c->ts.u.derived = gfc_find_dt_in_generic (c->ts.u.derived);
14191   else if (c->ts.type == BT_CLASS && c->attr.class_ok
14192            && CLASS_DATA (c)->ts.u.derived->attr.generic)
14193     CLASS_DATA (c)->ts.u.derived
14194                     = gfc_find_dt_in_generic (CLASS_DATA (c)->ts.u.derived);
14195 
14196   /* If an allocatable component derived type is of the same type as
14197      the enclosing derived type, we need a vtable generating so that
14198      the __deallocate procedure is created.  */
14199   if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
14200        && c->ts.u.derived == sym && c->attr.allocatable == 1)
14201     gfc_find_vtab (&c->ts);
14202 
14203   /* Ensure that all the derived type components are put on the
14204      derived type list; even in formal namespaces, where derived type
14205      pointer components might not have been declared.  */
14206   if (c->ts.type == BT_DERIVED
14207         && c->ts.u.derived
14208         && c->ts.u.derived->components
14209         && c->attr.pointer
14210         && sym != c->ts.u.derived)
14211     add_dt_to_dt_list (c->ts.u.derived);
14212 
14213   if (!gfc_resolve_array_spec (c->as,
14214                                !(c->attr.pointer || c->attr.proc_pointer
14215                                  || c->attr.allocatable)))
14216     return false;
14217 
14218   if (c->initializer && !sym->attr.vtype
14219       && !c->attr.pdt_kind && !c->attr.pdt_len
14220       && !gfc_check_assign_symbol (sym, c, c->initializer))
14221     return false;
14222 
14223   return true;
14224 }
14225 
14226 
14227 /* Be nice about the locus for a structure expression - show the locus of the
14228    first non-null sub-expression if we can.  */
14229 
14230 static locus *
cons_where(gfc_expr * struct_expr)14231 cons_where (gfc_expr *struct_expr)
14232 {
14233   gfc_constructor *cons;
14234 
14235   gcc_assert (struct_expr && struct_expr->expr_type == EXPR_STRUCTURE);
14236 
14237   cons = gfc_constructor_first (struct_expr->value.constructor);
14238   for (; cons; cons = gfc_constructor_next (cons))
14239     {
14240       if (cons->expr && cons->expr->expr_type != EXPR_NULL)
14241         return &cons->expr->where;
14242     }
14243 
14244   return &struct_expr->where;
14245 }
14246 
14247 /* Resolve the components of a structure type. Much less work than derived
14248    types.  */
14249 
14250 static bool
resolve_fl_struct(gfc_symbol * sym)14251 resolve_fl_struct (gfc_symbol *sym)
14252 {
14253   gfc_component *c;
14254   gfc_expr *init = NULL;
14255   bool success;
14256 
14257   /* Make sure UNIONs do not have overlapping initializers.  */
14258   if (sym->attr.flavor == FL_UNION)
14259     {
14260       for (c = sym->components; c; c = c->next)
14261         {
14262           if (init && c->initializer)
14263             {
14264               gfc_error ("Conflicting initializers in union at %L and %L",
14265                          cons_where (init), cons_where (c->initializer));
14266               gfc_free_expr (c->initializer);
14267               c->initializer = NULL;
14268             }
14269           if (init == NULL)
14270             init = c->initializer;
14271         }
14272     }
14273 
14274   success = true;
14275   for (c = sym->components; c; c = c->next)
14276     if (!resolve_component (c, sym))
14277       success = false;
14278 
14279   if (!success)
14280     return false;
14281 
14282   if (sym->components)
14283     add_dt_to_dt_list (sym);
14284 
14285   return true;
14286 }
14287 
14288 
14289 /* Resolve the components of a derived type. This does not have to wait until
14290    resolution stage, but can be done as soon as the dt declaration has been
14291    parsed.  */
14292 
14293 static bool
resolve_fl_derived0(gfc_symbol * sym)14294 resolve_fl_derived0 (gfc_symbol *sym)
14295 {
14296   gfc_symbol* super_type;
14297   gfc_component *c;
14298   gfc_formal_arglist *f;
14299   bool success;
14300 
14301   if (sym->attr.unlimited_polymorphic)
14302     return true;
14303 
14304   super_type = gfc_get_derived_super_type (sym);
14305 
14306   /* F2008, C432.  */
14307   if (super_type && sym->attr.coarray_comp && !super_type->attr.coarray_comp)
14308     {
14309       gfc_error ("As extending type %qs at %L has a coarray component, "
14310 		 "parent type %qs shall also have one", sym->name,
14311 		 &sym->declared_at, super_type->name);
14312       return false;
14313     }
14314 
14315   /* Ensure the extended type gets resolved before we do.  */
14316   if (super_type && !resolve_fl_derived0 (super_type))
14317     return false;
14318 
14319   /* An ABSTRACT type must be extensible.  */
14320   if (sym->attr.abstract && !gfc_type_is_extensible (sym))
14321     {
14322       gfc_error ("Non-extensible derived-type %qs at %L must not be ABSTRACT",
14323 		 sym->name, &sym->declared_at);
14324       return false;
14325     }
14326 
14327   c = (sym->attr.is_class) ? sym->components->ts.u.derived->components
14328 			   : sym->components;
14329 
14330   success = true;
14331   for ( ; c != NULL; c = c->next)
14332     if (!resolve_component (c, sym))
14333       success = false;
14334 
14335   if (!success)
14336     return false;
14337 
14338   /* Now add the caf token field, where needed.  */
14339   if (flag_coarray != GFC_FCOARRAY_NONE
14340       && !sym->attr.is_class && !sym->attr.vtype)
14341     {
14342       for (c = sym->components; c; c = c->next)
14343 	if (!c->attr.dimension && !c->attr.codimension
14344 	    && (c->attr.allocatable || c->attr.pointer))
14345 	  {
14346 	    char name[GFC_MAX_SYMBOL_LEN+9];
14347 	    gfc_component *token;
14348 	    sprintf (name, "_caf_%s", c->name);
14349 	    token = gfc_find_component (sym, name, true, true, NULL);
14350 	    if (token == NULL)
14351 	      {
14352 		if (!gfc_add_component (sym, name, &token))
14353 		  return false;
14354 		token->ts.type = BT_VOID;
14355 		token->ts.kind = gfc_default_integer_kind;
14356 		token->attr.access = ACCESS_PRIVATE;
14357 		token->attr.artificial = 1;
14358 		token->attr.caf_token = 1;
14359 	      }
14360 	  }
14361     }
14362 
14363   check_defined_assignments (sym);
14364 
14365   if (!sym->attr.defined_assign_comp && super_type)
14366     sym->attr.defined_assign_comp
14367 			= super_type->attr.defined_assign_comp;
14368 
14369   /* If this is a non-ABSTRACT type extending an ABSTRACT one, ensure that
14370      all DEFERRED bindings are overridden.  */
14371   if (super_type && super_type->attr.abstract && !sym->attr.abstract
14372       && !sym->attr.is_class
14373       && !ensure_not_abstract (sym, super_type))
14374     return false;
14375 
14376   /* Check that there is a component for every PDT parameter.  */
14377   if (sym->attr.pdt_template)
14378     {
14379       for (f = sym->formal; f; f = f->next)
14380 	{
14381 	  if (!f->sym)
14382 	    continue;
14383 	  c = gfc_find_component (sym, f->sym->name, true, true, NULL);
14384 	  if (c == NULL)
14385 	    {
14386 	      gfc_error ("Parameterized type %qs does not have a component "
14387 			 "corresponding to parameter %qs at %L", sym->name,
14388 			 f->sym->name, &sym->declared_at);
14389 	      break;
14390 	    }
14391 	}
14392     }
14393 
14394   /* Add derived type to the derived type list.  */
14395   add_dt_to_dt_list (sym);
14396 
14397   return true;
14398 }
14399 
14400 
14401 /* The following procedure does the full resolution of a derived type,
14402    including resolution of all type-bound procedures (if present). In contrast
14403    to 'resolve_fl_derived0' this can only be done after the module has been
14404    parsed completely.  */
14405 
14406 static bool
resolve_fl_derived(gfc_symbol * sym)14407 resolve_fl_derived (gfc_symbol *sym)
14408 {
14409   gfc_symbol *gen_dt = NULL;
14410 
14411   if (sym->attr.unlimited_polymorphic)
14412     return true;
14413 
14414   if (!sym->attr.is_class)
14415     gfc_find_symbol (sym->name, sym->ns, 0, &gen_dt);
14416   if (gen_dt && gen_dt->generic && gen_dt->generic->next
14417       && (!gen_dt->generic->sym->attr.use_assoc
14418 	  || gen_dt->generic->sym->module != gen_dt->generic->next->sym->module)
14419       && !gfc_notify_std (GFC_STD_F2003, "Generic name %qs of function "
14420 			  "%qs at %L being the same name as derived "
14421 			  "type at %L", sym->name,
14422 			  gen_dt->generic->sym == sym
14423 			  ? gen_dt->generic->next->sym->name
14424 			  : gen_dt->generic->sym->name,
14425 			  gen_dt->generic->sym == sym
14426 			  ? &gen_dt->generic->next->sym->declared_at
14427 			  : &gen_dt->generic->sym->declared_at,
14428 			  &sym->declared_at))
14429     return false;
14430 
14431   if (sym->components == NULL && !sym->attr.zero_comp && !sym->attr.use_assoc)
14432     {
14433       gfc_error ("Derived type %qs at %L has not been declared",
14434 		  sym->name, &sym->declared_at);
14435       return false;
14436     }
14437 
14438   /* Resolve the finalizer procedures.  */
14439   if (!gfc_resolve_finalizers (sym, NULL))
14440     return false;
14441 
14442   if (sym->attr.is_class && sym->ts.u.derived == NULL)
14443     {
14444       /* Fix up incomplete CLASS symbols.  */
14445       gfc_component *data = gfc_find_component (sym, "_data", true, true, NULL);
14446       gfc_component *vptr = gfc_find_component (sym, "_vptr", true, true, NULL);
14447 
14448       /* Nothing more to do for unlimited polymorphic entities.  */
14449       if (data->ts.u.derived->attr.unlimited_polymorphic)
14450 	return true;
14451       else if (vptr->ts.u.derived == NULL)
14452 	{
14453 	  gfc_symbol *vtab = gfc_find_derived_vtab (data->ts.u.derived);
14454 	  gcc_assert (vtab);
14455 	  vptr->ts.u.derived = vtab->ts.u.derived;
14456 	  if (!resolve_fl_derived0 (vptr->ts.u.derived))
14457 	    return false;
14458 	}
14459     }
14460 
14461   if (!resolve_fl_derived0 (sym))
14462     return false;
14463 
14464   /* Resolve the type-bound procedures.  */
14465   if (!resolve_typebound_procedures (sym))
14466     return false;
14467 
14468   /* Generate module vtables subject to their accessibility and their not
14469      being vtables or pdt templates. If this is not done class declarations
14470      in external procedures wind up with their own version and so SELECT TYPE
14471      fails because the vptrs do not have the same address.  */
14472   if (gfc_option.allow_std & GFC_STD_F2003
14473       && sym->ns->proc_name
14474       && sym->ns->proc_name->attr.flavor == FL_MODULE
14475       && sym->attr.access != ACCESS_PRIVATE
14476       && !(sym->attr.use_assoc || sym->attr.vtype || sym->attr.pdt_template))
14477     {
14478       gfc_symbol *vtab = gfc_find_derived_vtab (sym);
14479       gfc_set_sym_referenced (vtab);
14480     }
14481 
14482   return true;
14483 }
14484 
14485 
14486 static bool
resolve_fl_namelist(gfc_symbol * sym)14487 resolve_fl_namelist (gfc_symbol *sym)
14488 {
14489   gfc_namelist *nl;
14490   gfc_symbol *nlsym;
14491 
14492   for (nl = sym->namelist; nl; nl = nl->next)
14493     {
14494       /* Check again, the check in match only works if NAMELIST comes
14495 	 after the decl.  */
14496       if (nl->sym->as && nl->sym->as->type == AS_ASSUMED_SIZE)
14497      	{
14498 	  gfc_error ("Assumed size array %qs in namelist %qs at %L is not "
14499 		     "allowed", nl->sym->name, sym->name, &sym->declared_at);
14500 	  return false;
14501 	}
14502 
14503       if (nl->sym->as && nl->sym->as->type == AS_ASSUMED_SHAPE
14504 	  && !gfc_notify_std (GFC_STD_F2003, "NAMELIST array object %qs "
14505 			      "with assumed shape in namelist %qs at %L",
14506 			      nl->sym->name, sym->name, &sym->declared_at))
14507 	return false;
14508 
14509       if (is_non_constant_shape_array (nl->sym)
14510 	  && !gfc_notify_std (GFC_STD_F2003, "NAMELIST array object %qs "
14511 			      "with nonconstant shape in namelist %qs at %L",
14512 			      nl->sym->name, sym->name, &sym->declared_at))
14513 	return false;
14514 
14515       if (nl->sym->ts.type == BT_CHARACTER
14516 	  && (nl->sym->ts.u.cl->length == NULL
14517 	      || !gfc_is_constant_expr (nl->sym->ts.u.cl->length))
14518 	  && !gfc_notify_std (GFC_STD_F2003, "NAMELIST object %qs with "
14519 			      "nonconstant character length in "
14520 			      "namelist %qs at %L", nl->sym->name,
14521 			      sym->name, &sym->declared_at))
14522 	return false;
14523 
14524     }
14525 
14526   /* Reject PRIVATE objects in a PUBLIC namelist.  */
14527   if (gfc_check_symbol_access (sym))
14528     {
14529       for (nl = sym->namelist; nl; nl = nl->next)
14530 	{
14531 	  if (!nl->sym->attr.use_assoc
14532 	      && !is_sym_host_assoc (nl->sym, sym->ns)
14533 	      && !gfc_check_symbol_access (nl->sym))
14534 	    {
14535 	      gfc_error ("NAMELIST object %qs was declared PRIVATE and "
14536 			 "cannot be member of PUBLIC namelist %qs at %L",
14537 			 nl->sym->name, sym->name, &sym->declared_at);
14538 	      return false;
14539 	    }
14540 
14541 	  if (nl->sym->ts.type == BT_DERIVED
14542 	     && (nl->sym->ts.u.derived->attr.alloc_comp
14543 		 || nl->sym->ts.u.derived->attr.pointer_comp))
14544 	   {
14545 	     if (!gfc_notify_std (GFC_STD_F2003, "NAMELIST object %qs in "
14546 				  "namelist %qs at %L with ALLOCATABLE "
14547 				  "or POINTER components", nl->sym->name,
14548 				  sym->name, &sym->declared_at))
14549 	       return false;
14550 	     return true;
14551 	   }
14552 
14553 	  /* Types with private components that came here by USE-association.  */
14554 	  if (nl->sym->ts.type == BT_DERIVED
14555 	      && derived_inaccessible (nl->sym->ts.u.derived))
14556 	    {
14557 	      gfc_error ("NAMELIST object %qs has use-associated PRIVATE "
14558 			 "components and cannot be member of namelist %qs at %L",
14559 			 nl->sym->name, sym->name, &sym->declared_at);
14560 	      return false;
14561 	    }
14562 
14563 	  /* Types with private components that are defined in the same module.  */
14564 	  if (nl->sym->ts.type == BT_DERIVED
14565 	      && !is_sym_host_assoc (nl->sym->ts.u.derived, sym->ns)
14566 	      && nl->sym->ts.u.derived->attr.private_comp)
14567 	    {
14568 	      gfc_error ("NAMELIST object %qs has PRIVATE components and "
14569 			 "cannot be a member of PUBLIC namelist %qs at %L",
14570 			 nl->sym->name, sym->name, &sym->declared_at);
14571 	      return false;
14572 	    }
14573 	}
14574     }
14575 
14576 
14577   /* 14.1.2 A module or internal procedure represent local entities
14578      of the same type as a namelist member and so are not allowed.  */
14579   for (nl = sym->namelist; nl; nl = nl->next)
14580     {
14581       if (nl->sym->ts.kind != 0 && nl->sym->attr.flavor == FL_VARIABLE)
14582 	continue;
14583 
14584       if (nl->sym->attr.function && nl->sym == nl->sym->result)
14585 	if ((nl->sym == sym->ns->proc_name)
14586 	       ||
14587 	    (sym->ns->parent && nl->sym == sym->ns->parent->proc_name))
14588 	  continue;
14589 
14590       nlsym = NULL;
14591       if (nl->sym->name)
14592 	gfc_find_symbol (nl->sym->name, sym->ns, 1, &nlsym);
14593       if (nlsym && nlsym->attr.flavor == FL_PROCEDURE)
14594 	{
14595 	  gfc_error ("PROCEDURE attribute conflicts with NAMELIST "
14596 		     "attribute in %qs at %L", nlsym->name,
14597 		     &sym->declared_at);
14598 	  return false;
14599 	}
14600     }
14601 
14602   if (async_io_dt)
14603     {
14604       for (nl = sym->namelist; nl; nl = nl->next)
14605 	nl->sym->attr.asynchronous = 1;
14606     }
14607   return true;
14608 }
14609 
14610 
14611 static bool
resolve_fl_parameter(gfc_symbol * sym)14612 resolve_fl_parameter (gfc_symbol *sym)
14613 {
14614   /* A parameter array's shape needs to be constant.  */
14615   if (sym->as != NULL
14616       && (sym->as->type == AS_DEFERRED
14617           || is_non_constant_shape_array (sym)))
14618     {
14619       gfc_error ("Parameter array %qs at %L cannot be automatic "
14620 		 "or of deferred shape", sym->name, &sym->declared_at);
14621       return false;
14622     }
14623 
14624   /* Constraints on deferred type parameter.  */
14625   if (!deferred_requirements (sym))
14626     return false;
14627 
14628   /* Make sure a parameter that has been implicitly typed still
14629      matches the implicit type, since PARAMETER statements can precede
14630      IMPLICIT statements.  */
14631   if (sym->attr.implicit_type
14632       && !gfc_compare_types (&sym->ts, gfc_get_default_type (sym->name,
14633 							     sym->ns)))
14634     {
14635       gfc_error ("Implicitly typed PARAMETER %qs at %L doesn't match a "
14636 		 "later IMPLICIT type", sym->name, &sym->declared_at);
14637       return false;
14638     }
14639 
14640   /* Make sure the types of derived parameters are consistent.  This
14641      type checking is deferred until resolution because the type may
14642      refer to a derived type from the host.  */
14643   if (sym->ts.type == BT_DERIVED
14644       && !gfc_compare_types (&sym->ts, &sym->value->ts))
14645     {
14646       gfc_error ("Incompatible derived type in PARAMETER at %L",
14647 		 &sym->value->where);
14648       return false;
14649     }
14650 
14651   /* F03:C509,C514.  */
14652   if (sym->ts.type == BT_CLASS)
14653     {
14654       gfc_error ("CLASS variable %qs at %L cannot have the PARAMETER attribute",
14655 		 sym->name, &sym->declared_at);
14656       return false;
14657     }
14658 
14659   return true;
14660 }
14661 
14662 
14663 /* Called by resolve_symbol to check PDTs.  */
14664 
14665 static void
resolve_pdt(gfc_symbol * sym)14666 resolve_pdt (gfc_symbol* sym)
14667 {
14668   gfc_symbol *derived = NULL;
14669   gfc_actual_arglist *param;
14670   gfc_component *c;
14671   bool const_len_exprs = true;
14672   bool assumed_len_exprs = false;
14673   symbol_attribute *attr;
14674 
14675   if (sym->ts.type == BT_DERIVED)
14676     {
14677       derived = sym->ts.u.derived;
14678       attr = &(sym->attr);
14679     }
14680   else if (sym->ts.type == BT_CLASS)
14681     {
14682       derived = CLASS_DATA (sym)->ts.u.derived;
14683       attr = &(CLASS_DATA (sym)->attr);
14684     }
14685   else
14686     gcc_unreachable ();
14687 
14688   gcc_assert (derived->attr.pdt_type);
14689 
14690   for (param = sym->param_list; param; param = param->next)
14691     {
14692       c = gfc_find_component (derived, param->name, false, true, NULL);
14693       gcc_assert (c);
14694       if (c->attr.pdt_kind)
14695 	continue;
14696 
14697       if (param->expr && !gfc_is_constant_expr (param->expr)
14698 	  && c->attr.pdt_len)
14699 	const_len_exprs = false;
14700       else if (param->spec_type == SPEC_ASSUMED)
14701 	assumed_len_exprs = true;
14702 
14703       if (param->spec_type == SPEC_DEFERRED
14704 	  && !attr->allocatable && !attr->pointer)
14705 	gfc_error ("The object %qs at %L has a deferred LEN "
14706 		   "parameter %qs and is neither allocatable "
14707 		   "nor a pointer", sym->name, &sym->declared_at,
14708 		   param->name);
14709 
14710     }
14711 
14712   if (!const_len_exprs
14713       && (sym->ns->proc_name->attr.is_main_program
14714 	  || sym->ns->proc_name->attr.flavor == FL_MODULE
14715 	  || sym->attr.save != SAVE_NONE))
14716     gfc_error ("The AUTOMATIC object %qs at %L must not have the "
14717 	       "SAVE attribute or be a variable declared in the "
14718 	       "main program, a module or a submodule(F08/C513)",
14719 	       sym->name, &sym->declared_at);
14720 
14721   if (assumed_len_exprs && !(sym->attr.dummy
14722       || sym->attr.select_type_temporary || sym->attr.associate_var))
14723     gfc_error ("The object %qs at %L with ASSUMED type parameters "
14724 	       "must be a dummy or a SELECT TYPE selector(F08/4.2)",
14725 	       sym->name, &sym->declared_at);
14726 }
14727 
14728 
14729 /* Do anything necessary to resolve a symbol.  Right now, we just
14730    assume that an otherwise unknown symbol is a variable.  This sort
14731    of thing commonly happens for symbols in module.  */
14732 
14733 static void
resolve_symbol(gfc_symbol * sym)14734 resolve_symbol (gfc_symbol *sym)
14735 {
14736   int check_constant, mp_flag;
14737   gfc_symtree *symtree;
14738   gfc_symtree *this_symtree;
14739   gfc_namespace *ns;
14740   gfc_component *c;
14741   symbol_attribute class_attr;
14742   gfc_array_spec *as;
14743   bool saved_specification_expr;
14744 
14745   if (sym->resolved)
14746     return;
14747   sym->resolved = 1;
14748 
14749   /* No symbol will ever have union type; only components can be unions.
14750      Union type declaration symbols have type BT_UNKNOWN but flavor FL_UNION
14751      (just like derived type declaration symbols have flavor FL_DERIVED). */
14752   gcc_assert (sym->ts.type != BT_UNION);
14753 
14754   /* Coarrayed polymorphic objects with allocatable or pointer components are
14755      yet unsupported for -fcoarray=lib.  */
14756   if (flag_coarray == GFC_FCOARRAY_LIB && sym->ts.type == BT_CLASS
14757       && sym->ts.u.derived && CLASS_DATA (sym)
14758       && CLASS_DATA (sym)->attr.codimension
14759       && (CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp
14760 	  || CLASS_DATA (sym)->ts.u.derived->attr.pointer_comp))
14761     {
14762       gfc_error ("Sorry, allocatable/pointer components in polymorphic (CLASS) "
14763 		 "type coarrays at %L are unsupported", &sym->declared_at);
14764       return;
14765     }
14766 
14767   if (sym->attr.artificial)
14768     return;
14769 
14770   if (sym->attr.unlimited_polymorphic)
14771     return;
14772 
14773   if (sym->attr.flavor == FL_UNKNOWN
14774       || (sym->attr.flavor == FL_PROCEDURE && !sym->attr.intrinsic
14775 	  && !sym->attr.generic && !sym->attr.external
14776 	  && sym->attr.if_source == IFSRC_UNKNOWN
14777 	  && sym->ts.type == BT_UNKNOWN))
14778     {
14779 
14780     /* If we find that a flavorless symbol is an interface in one of the
14781        parent namespaces, find its symtree in this namespace, free the
14782        symbol and set the symtree to point to the interface symbol.  */
14783       for (ns = gfc_current_ns->parent; ns; ns = ns->parent)
14784 	{
14785 	  symtree = gfc_find_symtree (ns->sym_root, sym->name);
14786 	  if (symtree && (symtree->n.sym->generic ||
14787 			  (symtree->n.sym->attr.flavor == FL_PROCEDURE
14788 			   && sym->ns->construct_entities)))
14789 	    {
14790 	      this_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
14791 					       sym->name);
14792 	      if (this_symtree->n.sym == sym)
14793 		{
14794 		  symtree->n.sym->refs++;
14795 		  gfc_release_symbol (sym);
14796 		  this_symtree->n.sym = symtree->n.sym;
14797 		  return;
14798 		}
14799 	    }
14800 	}
14801 
14802       /* Otherwise give it a flavor according to such attributes as
14803 	 it has.  */
14804       if (sym->attr.flavor == FL_UNKNOWN && sym->attr.external == 0
14805 	  && sym->attr.intrinsic == 0)
14806 	sym->attr.flavor = FL_VARIABLE;
14807       else if (sym->attr.flavor == FL_UNKNOWN)
14808 	{
14809 	  sym->attr.flavor = FL_PROCEDURE;
14810 	  if (sym->attr.dimension)
14811 	    sym->attr.function = 1;
14812 	}
14813     }
14814 
14815   if (sym->attr.external && sym->ts.type != BT_UNKNOWN && !sym->attr.function)
14816     gfc_add_function (&sym->attr, sym->name, &sym->declared_at);
14817 
14818   if (sym->attr.procedure && sym->attr.if_source != IFSRC_DECL
14819       && !resolve_procedure_interface (sym))
14820     return;
14821 
14822   if (sym->attr.is_protected && !sym->attr.proc_pointer
14823       && (sym->attr.procedure || sym->attr.external))
14824     {
14825       if (sym->attr.external)
14826 	gfc_error ("PROTECTED attribute conflicts with EXTERNAL attribute "
14827 	           "at %L", &sym->declared_at);
14828       else
14829 	gfc_error ("PROCEDURE attribute conflicts with PROTECTED attribute "
14830 	           "at %L", &sym->declared_at);
14831 
14832       return;
14833     }
14834 
14835   if (sym->attr.flavor == FL_DERIVED && !resolve_fl_derived (sym))
14836     return;
14837 
14838   else if ((sym->attr.flavor == FL_STRUCT || sym->attr.flavor == FL_UNION)
14839            && !resolve_fl_struct (sym))
14840     return;
14841 
14842   /* Symbols that are module procedures with results (functions) have
14843      the types and array specification copied for type checking in
14844      procedures that call them, as well as for saving to a module
14845      file.  These symbols can't stand the scrutiny that their results
14846      can.  */
14847   mp_flag = (sym->result != NULL && sym->result != sym);
14848 
14849   /* Make sure that the intrinsic is consistent with its internal
14850      representation. This needs to be done before assigning a default
14851      type to avoid spurious warnings.  */
14852   if (sym->attr.flavor != FL_MODULE && sym->attr.intrinsic
14853       && !gfc_resolve_intrinsic (sym, &sym->declared_at))
14854     return;
14855 
14856   /* Resolve associate names.  */
14857   if (sym->assoc)
14858     resolve_assoc_var (sym, true);
14859 
14860   /* Assign default type to symbols that need one and don't have one.  */
14861   if (sym->ts.type == BT_UNKNOWN)
14862     {
14863       if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER)
14864 	{
14865 	  gfc_set_default_type (sym, 1, NULL);
14866 	}
14867 
14868       if (sym->attr.flavor == FL_PROCEDURE && sym->attr.external
14869 	  && !sym->attr.function && !sym->attr.subroutine
14870 	  && gfc_get_default_type (sym->name, sym->ns)->type == BT_UNKNOWN)
14871 	gfc_add_subroutine (&sym->attr, sym->name, &sym->declared_at);
14872 
14873       if (sym->attr.flavor == FL_PROCEDURE && sym->attr.function)
14874 	{
14875 	  /* The specific case of an external procedure should emit an error
14876 	     in the case that there is no implicit type.  */
14877 	  if (!mp_flag)
14878 	    {
14879 	      if (!sym->attr.mixed_entry_master)
14880 		gfc_set_default_type (sym, sym->attr.external, NULL);
14881 	    }
14882 	  else
14883 	    {
14884 	      /* Result may be in another namespace.  */
14885 	      resolve_symbol (sym->result);
14886 
14887 	      if (!sym->result->attr.proc_pointer)
14888 		{
14889 		  sym->ts = sym->result->ts;
14890 		  sym->as = gfc_copy_array_spec (sym->result->as);
14891 		  sym->attr.dimension = sym->result->attr.dimension;
14892 		  sym->attr.pointer = sym->result->attr.pointer;
14893 		  sym->attr.allocatable = sym->result->attr.allocatable;
14894 		  sym->attr.contiguous = sym->result->attr.contiguous;
14895 		}
14896 	    }
14897 	}
14898     }
14899   else if (mp_flag && sym->attr.flavor == FL_PROCEDURE && sym->attr.function)
14900     {
14901       bool saved_specification_expr = specification_expr;
14902       specification_expr = true;
14903       gfc_resolve_array_spec (sym->result->as, false);
14904       specification_expr = saved_specification_expr;
14905     }
14906 
14907   if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
14908     {
14909       as = CLASS_DATA (sym)->as;
14910       class_attr = CLASS_DATA (sym)->attr;
14911       class_attr.pointer = class_attr.class_pointer;
14912     }
14913   else
14914     {
14915       class_attr = sym->attr;
14916       as = sym->as;
14917     }
14918 
14919   /* F2008, C530.  */
14920   if (sym->attr.contiguous
14921       && (!class_attr.dimension
14922 	  || (as->type != AS_ASSUMED_SHAPE && as->type != AS_ASSUMED_RANK
14923 	      && !class_attr.pointer)))
14924     {
14925       gfc_error ("%qs at %L has the CONTIGUOUS attribute but is not an "
14926 		 "array pointer or an assumed-shape or assumed-rank array",
14927 		 sym->name, &sym->declared_at);
14928       return;
14929     }
14930 
14931   /* Assumed size arrays and assumed shape arrays must be dummy
14932      arguments.  Array-spec's of implied-shape should have been resolved to
14933      AS_EXPLICIT already.  */
14934 
14935   if (as)
14936     {
14937       /* If AS_IMPLIED_SHAPE makes it to here, it must be a bad
14938 	 specification expression.  */
14939       if (as->type == AS_IMPLIED_SHAPE)
14940 	{
14941 	  int i;
14942 	  for (i=0; i<as->rank; i++)
14943 	    {
14944 	      if (as->lower[i] != NULL && as->upper[i] == NULL)
14945 		{
14946 		  gfc_error ("Bad specification for assumed size array at %L",
14947 			     &as->lower[i]->where);
14948 		  return;
14949 		}
14950 	    }
14951 	  gcc_unreachable();
14952 	}
14953 
14954       if (((as->type == AS_ASSUMED_SIZE && !as->cp_was_assumed)
14955 	   || as->type == AS_ASSUMED_SHAPE)
14956 	  && !sym->attr.dummy && !sym->attr.select_type_temporary)
14957 	{
14958 	  if (as->type == AS_ASSUMED_SIZE)
14959 	    gfc_error ("Assumed size array at %L must be a dummy argument",
14960 		       &sym->declared_at);
14961 	  else
14962 	    gfc_error ("Assumed shape array at %L must be a dummy argument",
14963 		       &sym->declared_at);
14964 	  return;
14965 	}
14966       /* TS 29113, C535a.  */
14967       if (as->type == AS_ASSUMED_RANK && !sym->attr.dummy
14968 	  && !sym->attr.select_type_temporary)
14969 	{
14970 	  gfc_error ("Assumed-rank array at %L must be a dummy argument",
14971 		     &sym->declared_at);
14972 	  return;
14973 	}
14974       if (as->type == AS_ASSUMED_RANK
14975 	  && (sym->attr.codimension || sym->attr.value))
14976 	{
14977 	  gfc_error ("Assumed-rank array at %L may not have the VALUE or "
14978 		     "CODIMENSION attribute", &sym->declared_at);
14979 	  return;
14980 	}
14981     }
14982 
14983   /* Make sure symbols with known intent or optional are really dummy
14984      variable.  Because of ENTRY statement, this has to be deferred
14985      until resolution time.  */
14986 
14987   if (!sym->attr.dummy
14988       && (sym->attr.optional || sym->attr.intent != INTENT_UNKNOWN))
14989     {
14990       gfc_error ("Symbol at %L is not a DUMMY variable", &sym->declared_at);
14991       return;
14992     }
14993 
14994   if (sym->attr.value && !sym->attr.dummy)
14995     {
14996       gfc_error ("%qs at %L cannot have the VALUE attribute because "
14997 		 "it is not a dummy argument", sym->name, &sym->declared_at);
14998       return;
14999     }
15000 
15001   if (sym->attr.value && sym->ts.type == BT_CHARACTER)
15002     {
15003       gfc_charlen *cl = sym->ts.u.cl;
15004       if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
15005 	{
15006 	  gfc_error ("Character dummy variable %qs at %L with VALUE "
15007 		     "attribute must have constant length",
15008 		     sym->name, &sym->declared_at);
15009 	  return;
15010 	}
15011 
15012       if (sym->ts.is_c_interop
15013 	  && mpz_cmp_si (cl->length->value.integer, 1) != 0)
15014 	{
15015 	  gfc_error ("C interoperable character dummy variable %qs at %L "
15016 		     "with VALUE attribute must have length one",
15017 		     sym->name, &sym->declared_at);
15018 	  return;
15019 	}
15020     }
15021 
15022   if (sym->ts.type == BT_DERIVED && !sym->attr.is_iso_c
15023       && sym->ts.u.derived->attr.generic)
15024     {
15025       sym->ts.u.derived = gfc_find_dt_in_generic (sym->ts.u.derived);
15026       if (!sym->ts.u.derived)
15027 	{
15028 	  gfc_error ("The derived type %qs at %L is of type %qs, "
15029 		     "which has not been defined", sym->name,
15030 		     &sym->declared_at, sym->ts.u.derived->name);
15031 	  sym->ts.type = BT_UNKNOWN;
15032 	  return;
15033 	}
15034     }
15035 
15036     /* Use the same constraints as TYPE(*), except for the type check
15037        and that only scalars and assumed-size arrays are permitted.  */
15038     if (sym->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
15039       {
15040 	if (!sym->attr.dummy)
15041 	  {
15042 	    gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall be "
15043 		       "a dummy argument", sym->name, &sym->declared_at);
15044 	    return;
15045 	  }
15046 
15047 	if (sym->ts.type != BT_ASSUMED && sym->ts.type != BT_INTEGER
15048 	    && sym->ts.type != BT_REAL && sym->ts.type != BT_LOGICAL
15049 	    && sym->ts.type != BT_COMPLEX)
15050 	  {
15051 	    gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall be "
15052 		       "of type TYPE(*) or of an numeric intrinsic type",
15053 		       sym->name, &sym->declared_at);
15054 	    return;
15055 	  }
15056 
15057       if (sym->attr.allocatable || sym->attr.codimension
15058 	  || sym->attr.pointer || sym->attr.value)
15059 	{
15060 	  gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute may not "
15061 		     "have the ALLOCATABLE, CODIMENSION, POINTER or VALUE "
15062 		     "attribute", sym->name, &sym->declared_at);
15063 	  return;
15064 	}
15065 
15066       if (sym->attr.intent == INTENT_OUT)
15067 	{
15068 	  gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute may not "
15069 		     "have the INTENT(OUT) attribute",
15070 		     sym->name, &sym->declared_at);
15071 	  return;
15072 	}
15073       if (sym->attr.dimension && sym->as->type != AS_ASSUMED_SIZE)
15074 	{
15075 	  gfc_error ("Variable %s at %L with NO_ARG_CHECK attribute shall "
15076 		     "either be a scalar or an assumed-size array",
15077 		     sym->name, &sym->declared_at);
15078 	  return;
15079 	}
15080 
15081       /* Set the type to TYPE(*) and add a dimension(*) to ensure
15082 	 NO_ARG_CHECK is correctly handled in trans*.c, e.g. with
15083 	 packing.  */
15084       sym->ts.type = BT_ASSUMED;
15085       sym->as = gfc_get_array_spec ();
15086       sym->as->type = AS_ASSUMED_SIZE;
15087       sym->as->rank = 1;
15088       sym->as->lower[0] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
15089     }
15090   else if (sym->ts.type == BT_ASSUMED)
15091     {
15092       /* TS 29113, C407a.  */
15093       if (!sym->attr.dummy)
15094 	{
15095 	  gfc_error ("Assumed type of variable %s at %L is only permitted "
15096 		     "for dummy variables", sym->name, &sym->declared_at);
15097 	  return;
15098 	}
15099       if (sym->attr.allocatable || sym->attr.codimension
15100 	  || sym->attr.pointer || sym->attr.value)
15101     	{
15102 	  gfc_error ("Assumed-type variable %s at %L may not have the "
15103 		     "ALLOCATABLE, CODIMENSION, POINTER or VALUE attribute",
15104 		     sym->name, &sym->declared_at);
15105 	  return;
15106 	}
15107       if (sym->attr.intent == INTENT_OUT)
15108     	{
15109 	  gfc_error ("Assumed-type variable %s at %L may not have the "
15110 		     "INTENT(OUT) attribute",
15111 		     sym->name, &sym->declared_at);
15112 	  return;
15113 	}
15114       if (sym->attr.dimension && sym->as->type == AS_EXPLICIT)
15115 	{
15116 	  gfc_error ("Assumed-type variable %s at %L shall not be an "
15117 		     "explicit-shape array", sym->name, &sym->declared_at);
15118 	  return;
15119 	}
15120     }
15121 
15122   /* If the symbol is marked as bind(c), that it is declared at module level
15123      scope and verify its type and kind.  Do not do the latter for symbols
15124      that are implicitly typed because that is handled in
15125      gfc_set_default_type.  Handle dummy arguments and procedure definitions
15126      separately.  Also, anything that is use associated is not handled here
15127      but instead is handled in the module it is declared in.  Finally, derived
15128      type definitions are allowed to be BIND(C) since that only implies that
15129      they're interoperable, and they are checked fully for interoperability
15130      when a variable is declared of that type.  */
15131   if (sym->attr.is_bind_c && sym->attr.use_assoc == 0
15132       && sym->attr.dummy == 0 && sym->attr.flavor != FL_PROCEDURE
15133       && sym->attr.flavor != FL_DERIVED)
15134     {
15135       bool t = true;
15136 
15137       /* First, make sure the variable is declared at the
15138 	 module-level scope (J3/04-007, Section 15.3).	*/
15139       if (sym->ns->proc_name->attr.flavor != FL_MODULE &&
15140           sym->attr.in_common == 0)
15141 	{
15142 	  gfc_error ("Variable %qs at %L cannot be BIND(C) because it "
15143 		     "is neither a COMMON block nor declared at the "
15144 		     "module level scope", sym->name, &(sym->declared_at));
15145 	  t = false;
15146 	}
15147       else if (sym->ts.type == BT_CHARACTER
15148 	       && (sym->ts.u.cl == NULL || sym->ts.u.cl->length == NULL
15149 		   || !gfc_is_constant_expr (sym->ts.u.cl->length)
15150 		   || mpz_cmp_si (sym->ts.u.cl->length->value.integer, 1) != 0))
15151 	{
15152 	  gfc_error ("BIND(C) Variable %qs at %L must have length one",
15153 		     sym->name, &sym->declared_at);
15154 	  t = false;
15155 	}
15156       else if (sym->common_head != NULL && sym->attr.implicit_type == 0)
15157         {
15158           t = verify_com_block_vars_c_interop (sym->common_head);
15159         }
15160       else if (sym->attr.implicit_type == 0)
15161 	{
15162 	  /* If type() declaration, we need to verify that the components
15163 	     of the given type are all C interoperable, etc.  */
15164 	  if (sym->ts.type == BT_DERIVED &&
15165               sym->ts.u.derived->attr.is_c_interop != 1)
15166             {
15167               /* Make sure the user marked the derived type as BIND(C).  If
15168                  not, call the verify routine.  This could print an error
15169                  for the derived type more than once if multiple variables
15170                  of that type are declared.  */
15171               if (sym->ts.u.derived->attr.is_bind_c != 1)
15172                 verify_bind_c_derived_type (sym->ts.u.derived);
15173               t = false;
15174             }
15175 
15176 	  /* Verify the variable itself as C interoperable if it
15177              is BIND(C).  It is not possible for this to succeed if
15178              the verify_bind_c_derived_type failed, so don't have to handle
15179              any error returned by verify_bind_c_derived_type.  */
15180           t = verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
15181                                  sym->common_block);
15182 	}
15183 
15184       if (!t)
15185         {
15186           /* clear the is_bind_c flag to prevent reporting errors more than
15187              once if something failed.  */
15188           sym->attr.is_bind_c = 0;
15189           return;
15190         }
15191     }
15192 
15193   /* If a derived type symbol has reached this point, without its
15194      type being declared, we have an error.  Notice that most
15195      conditions that produce undefined derived types have already
15196      been dealt with.  However, the likes of:
15197      implicit type(t) (t) ..... call foo (t) will get us here if
15198      the type is not declared in the scope of the implicit
15199      statement. Change the type to BT_UNKNOWN, both because it is so
15200      and to prevent an ICE.  */
15201   if (sym->ts.type == BT_DERIVED && !sym->attr.is_iso_c
15202       && sym->ts.u.derived->components == NULL
15203       && !sym->ts.u.derived->attr.zero_comp)
15204     {
15205       gfc_error ("The derived type %qs at %L is of type %qs, "
15206 		 "which has not been defined", sym->name,
15207 		  &sym->declared_at, sym->ts.u.derived->name);
15208       sym->ts.type = BT_UNKNOWN;
15209       return;
15210     }
15211 
15212   /* Make sure that the derived type has been resolved and that the
15213      derived type is visible in the symbol's namespace, if it is a
15214      module function and is not PRIVATE.  */
15215   if (sym->ts.type == BT_DERIVED
15216 	&& sym->ts.u.derived->attr.use_assoc
15217 	&& sym->ns->proc_name
15218 	&& sym->ns->proc_name->attr.flavor == FL_MODULE
15219         && !resolve_fl_derived (sym->ts.u.derived))
15220     return;
15221 
15222   /* Unless the derived-type declaration is use associated, Fortran 95
15223      does not allow public entries of private derived types.
15224      See 4.4.1 (F95) and 4.5.1.1 (F2003); and related interpretation
15225      161 in 95-006r3.  */
15226   if (sym->ts.type == BT_DERIVED
15227       && sym->ns->proc_name && sym->ns->proc_name->attr.flavor == FL_MODULE
15228       && !sym->ts.u.derived->attr.use_assoc
15229       && gfc_check_symbol_access (sym)
15230       && !gfc_check_symbol_access (sym->ts.u.derived)
15231       && !gfc_notify_std (GFC_STD_F2003, "PUBLIC %s %qs at %L of PRIVATE "
15232 			  "derived type %qs",
15233 			  (sym->attr.flavor == FL_PARAMETER)
15234 			  ? "parameter" : "variable",
15235 			  sym->name, &sym->declared_at,
15236 			  sym->ts.u.derived->name))
15237     return;
15238 
15239   /* F2008, C1302.  */
15240   if (sym->ts.type == BT_DERIVED
15241       && ((sym->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
15242 	   && sym->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
15243 	  || sym->ts.u.derived->attr.lock_comp)
15244       && !sym->attr.codimension && !sym->ts.u.derived->attr.coarray_comp)
15245     {
15246       gfc_error ("Variable %s at %L of type LOCK_TYPE or with subcomponent of "
15247 		 "type LOCK_TYPE must be a coarray", sym->name,
15248 		 &sym->declared_at);
15249       return;
15250     }
15251 
15252   /* TS18508, C702/C703.  */
15253   if (sym->ts.type == BT_DERIVED
15254       && ((sym->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
15255 	   && sym->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
15256 	  || sym->ts.u.derived->attr.event_comp)
15257       && !sym->attr.codimension && !sym->ts.u.derived->attr.coarray_comp)
15258     {
15259       gfc_error ("Variable %s at %L of type EVENT_TYPE or with subcomponent of "
15260 		 "type EVENT_TYPE must be a coarray", sym->name,
15261 		 &sym->declared_at);
15262       return;
15263     }
15264 
15265   /* An assumed-size array with INTENT(OUT) shall not be of a type for which
15266      default initialization is defined (5.1.2.4.4).  */
15267   if (sym->ts.type == BT_DERIVED
15268       && sym->attr.dummy
15269       && sym->attr.intent == INTENT_OUT
15270       && sym->as
15271       && sym->as->type == AS_ASSUMED_SIZE)
15272     {
15273       for (c = sym->ts.u.derived->components; c; c = c->next)
15274 	{
15275 	  if (c->initializer)
15276 	    {
15277 	      gfc_error ("The INTENT(OUT) dummy argument %qs at %L is "
15278 			 "ASSUMED SIZE and so cannot have a default initializer",
15279 			 sym->name, &sym->declared_at);
15280 	      return;
15281 	    }
15282 	}
15283     }
15284 
15285   /* F2008, C542.  */
15286   if (sym->ts.type == BT_DERIVED && sym->attr.dummy
15287       && sym->attr.intent == INTENT_OUT && sym->attr.lock_comp)
15288     {
15289       gfc_error ("Dummy argument %qs at %L of LOCK_TYPE shall not be "
15290 		 "INTENT(OUT)", sym->name, &sym->declared_at);
15291       return;
15292     }
15293 
15294   /* TS18508.  */
15295   if (sym->ts.type == BT_DERIVED && sym->attr.dummy
15296       && sym->attr.intent == INTENT_OUT && sym->attr.event_comp)
15297     {
15298       gfc_error ("Dummy argument %qs at %L of EVENT_TYPE shall not be "
15299 		 "INTENT(OUT)", sym->name, &sym->declared_at);
15300       return;
15301     }
15302 
15303   /* F2008, C525.  */
15304   if ((((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.coarray_comp)
15305 	 || (sym->ts.type == BT_CLASS && sym->attr.class_ok
15306 	     && CLASS_DATA (sym)->attr.coarray_comp))
15307        || class_attr.codimension)
15308       && (sym->attr.result || sym->result == sym))
15309     {
15310       gfc_error ("Function result %qs at %L shall not be a coarray or have "
15311 	         "a coarray component", sym->name, &sym->declared_at);
15312       return;
15313     }
15314 
15315   /* F2008, C524.  */
15316   if (sym->attr.codimension && sym->ts.type == BT_DERIVED
15317       && sym->ts.u.derived->ts.is_iso_c)
15318     {
15319       gfc_error ("Variable %qs at %L of TYPE(C_PTR) or TYPE(C_FUNPTR) "
15320 		 "shall not be a coarray", sym->name, &sym->declared_at);
15321       return;
15322     }
15323 
15324   /* F2008, C525.  */
15325   if (((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.coarray_comp)
15326 	|| (sym->ts.type == BT_CLASS && sym->attr.class_ok
15327 	    && CLASS_DATA (sym)->attr.coarray_comp))
15328       && (class_attr.codimension || class_attr.pointer || class_attr.dimension
15329 	  || class_attr.allocatable))
15330     {
15331       gfc_error ("Variable %qs at %L with coarray component shall be a "
15332 		 "nonpointer, nonallocatable scalar, which is not a coarray",
15333 		 sym->name, &sym->declared_at);
15334       return;
15335     }
15336 
15337   /* F2008, C526.  The function-result case was handled above.  */
15338   if (class_attr.codimension
15339       && !(class_attr.allocatable || sym->attr.dummy || sym->attr.save
15340 	   || sym->attr.select_type_temporary
15341 	   || sym->attr.associate_var
15342 	   || (sym->ns->save_all && !sym->attr.automatic)
15343 	   || sym->ns->proc_name->attr.flavor == FL_MODULE
15344 	   || sym->ns->proc_name->attr.is_main_program
15345 	   || sym->attr.function || sym->attr.result || sym->attr.use_assoc))
15346     {
15347       gfc_error ("Variable %qs at %L is a coarray and is not ALLOCATABLE, SAVE "
15348 		 "nor a dummy argument", sym->name, &sym->declared_at);
15349       return;
15350     }
15351   /* F2008, C528.  */
15352   else if (class_attr.codimension && !sym->attr.select_type_temporary
15353 	   && !class_attr.allocatable && as && as->cotype == AS_DEFERRED)
15354     {
15355       gfc_error ("Coarray variable %qs at %L shall not have codimensions with "
15356 		 "deferred shape", sym->name, &sym->declared_at);
15357       return;
15358     }
15359   else if (class_attr.codimension && class_attr.allocatable && as
15360 	   && (as->cotype != AS_DEFERRED || as->type != AS_DEFERRED))
15361     {
15362       gfc_error ("Allocatable coarray variable %qs at %L must have "
15363 		 "deferred shape", sym->name, &sym->declared_at);
15364       return;
15365     }
15366 
15367   /* F2008, C541.  */
15368   if ((((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.coarray_comp)
15369 	|| (sym->ts.type == BT_CLASS && sym->attr.class_ok
15370 	    && CLASS_DATA (sym)->attr.coarray_comp))
15371        || (class_attr.codimension && class_attr.allocatable))
15372       && sym->attr.dummy && sym->attr.intent == INTENT_OUT)
15373     {
15374       gfc_error ("Variable %qs at %L is INTENT(OUT) and can thus not be an "
15375 		 "allocatable coarray or have coarray components",
15376 		 sym->name, &sym->declared_at);
15377       return;
15378     }
15379 
15380   if (class_attr.codimension && sym->attr.dummy
15381       && sym->ns->proc_name && sym->ns->proc_name->attr.is_bind_c)
15382     {
15383       gfc_error ("Coarray dummy variable %qs at %L not allowed in BIND(C) "
15384 		 "procedure %qs", sym->name, &sym->declared_at,
15385 		 sym->ns->proc_name->name);
15386       return;
15387     }
15388 
15389   if (sym->ts.type == BT_LOGICAL
15390       && ((sym->attr.function && sym->attr.is_bind_c && sym->result == sym)
15391 	  || ((sym->attr.dummy || sym->attr.result) && sym->ns->proc_name
15392 	      && sym->ns->proc_name->attr.is_bind_c)))
15393     {
15394       int i;
15395       for (i = 0; gfc_logical_kinds[i].kind; i++)
15396         if (gfc_logical_kinds[i].kind == sym->ts.kind)
15397           break;
15398       if (!gfc_logical_kinds[i].c_bool && sym->attr.dummy
15399 	  && !gfc_notify_std (GFC_STD_GNU, "LOGICAL dummy argument %qs at "
15400 			      "%L with non-C_Bool kind in BIND(C) procedure "
15401 			      "%qs", sym->name, &sym->declared_at,
15402 			      sym->ns->proc_name->name))
15403 	return;
15404       else if (!gfc_logical_kinds[i].c_bool
15405 	       && !gfc_notify_std (GFC_STD_GNU, "LOGICAL result variable "
15406 				   "%qs at %L with non-C_Bool kind in "
15407 				   "BIND(C) procedure %qs", sym->name,
15408 				   &sym->declared_at,
15409 				   sym->attr.function ? sym->name
15410 				   : sym->ns->proc_name->name))
15411 	return;
15412     }
15413 
15414   switch (sym->attr.flavor)
15415     {
15416     case FL_VARIABLE:
15417       if (!resolve_fl_variable (sym, mp_flag))
15418 	return;
15419       break;
15420 
15421     case FL_PROCEDURE:
15422       if (sym->formal && !sym->formal_ns)
15423 	{
15424 	  /* Check that none of the arguments are a namelist.  */
15425 	  gfc_formal_arglist *formal = sym->formal;
15426 
15427 	  for (; formal; formal = formal->next)
15428 	    if (formal->sym && formal->sym->attr.flavor == FL_NAMELIST)
15429 	      {
15430 		gfc_error ("Namelist %qs cannot be an argument to "
15431 			   "subroutine or function at %L",
15432 			   formal->sym->name, &sym->declared_at);
15433 		return;
15434 	      }
15435 	}
15436 
15437       if (!resolve_fl_procedure (sym, mp_flag))
15438 	return;
15439       break;
15440 
15441     case FL_NAMELIST:
15442       if (!resolve_fl_namelist (sym))
15443 	return;
15444       break;
15445 
15446     case FL_PARAMETER:
15447       if (!resolve_fl_parameter (sym))
15448 	return;
15449       break;
15450 
15451     default:
15452       break;
15453     }
15454 
15455   /* Resolve array specifier. Check as well some constraints
15456      on COMMON blocks.  */
15457 
15458   check_constant = sym->attr.in_common && !sym->attr.pointer;
15459 
15460   /* Set the formal_arg_flag so that check_conflict will not throw
15461      an error for host associated variables in the specification
15462      expression for an array_valued function.  */
15463   if ((sym->attr.function || sym->attr.result) && sym->as)
15464     formal_arg_flag = true;
15465 
15466   saved_specification_expr = specification_expr;
15467   specification_expr = true;
15468   gfc_resolve_array_spec (sym->as, check_constant);
15469   specification_expr = saved_specification_expr;
15470 
15471   formal_arg_flag = false;
15472 
15473   /* Resolve formal namespaces.  */
15474   if (sym->formal_ns && sym->formal_ns != gfc_current_ns
15475       && !sym->attr.contained && !sym->attr.intrinsic)
15476     gfc_resolve (sym->formal_ns);
15477 
15478   /* Make sure the formal namespace is present.  */
15479   if (sym->formal && !sym->formal_ns)
15480     {
15481       gfc_formal_arglist *formal = sym->formal;
15482       while (formal && !formal->sym)
15483 	formal = formal->next;
15484 
15485       if (formal)
15486 	{
15487 	  sym->formal_ns = formal->sym->ns;
15488           if (sym->ns != formal->sym->ns)
15489 	    sym->formal_ns->refs++;
15490 	}
15491     }
15492 
15493   /* Check threadprivate restrictions.  */
15494   if (sym->attr.threadprivate && !sym->attr.save
15495       && !(sym->ns->save_all && !sym->attr.automatic)
15496       && (!sym->attr.in_common
15497 	  && sym->module == NULL
15498 	  && (sym->ns->proc_name == NULL
15499 	      || sym->ns->proc_name->attr.flavor != FL_MODULE)))
15500     gfc_error ("Threadprivate at %L isn't SAVEd", &sym->declared_at);
15501 
15502   /* Check omp declare target restrictions.  */
15503   if (sym->attr.omp_declare_target
15504       && sym->attr.flavor == FL_VARIABLE
15505       && !sym->attr.save
15506       && !(sym->ns->save_all && !sym->attr.automatic)
15507       && (!sym->attr.in_common
15508 	  && sym->module == NULL
15509 	  && (sym->ns->proc_name == NULL
15510 	      || sym->ns->proc_name->attr.flavor != FL_MODULE)))
15511     gfc_error ("!$OMP DECLARE TARGET variable %qs at %L isn't SAVEd",
15512 	       sym->name, &sym->declared_at);
15513 
15514   /* If we have come this far we can apply default-initializers, as
15515      described in 14.7.5, to those variables that have not already
15516      been assigned one.  */
15517   if (sym->ts.type == BT_DERIVED
15518       && !sym->value
15519       && !sym->attr.allocatable
15520       && !sym->attr.alloc_comp)
15521     {
15522       symbol_attribute *a = &sym->attr;
15523 
15524       if ((!a->save && !a->dummy && !a->pointer
15525 	   && !a->in_common && !a->use_assoc
15526 	   && a->referenced
15527 	   && !((a->function || a->result)
15528 		&& (!a->dimension
15529 		    || sym->ts.u.derived->attr.alloc_comp
15530 		    || sym->ts.u.derived->attr.pointer_comp))
15531 	   && !(a->function && sym != sym->result))
15532 	  || (a->dummy && a->intent == INTENT_OUT && !a->pointer))
15533 	apply_default_init (sym);
15534       else if (a->function && sym->result && a->access != ACCESS_PRIVATE
15535 	       && (sym->ts.u.derived->attr.alloc_comp
15536 		   || sym->ts.u.derived->attr.pointer_comp))
15537 	/* Mark the result symbol to be referenced, when it has allocatable
15538 	   components.  */
15539 	sym->result->attr.referenced = 1;
15540     }
15541 
15542   if (sym->ts.type == BT_CLASS && sym->ns == gfc_current_ns
15543       && sym->attr.dummy && sym->attr.intent == INTENT_OUT
15544       && !CLASS_DATA (sym)->attr.class_pointer
15545       && !CLASS_DATA (sym)->attr.allocatable)
15546     apply_default_init (sym);
15547 
15548   /* If this symbol has a type-spec, check it.  */
15549   if (sym->attr.flavor == FL_VARIABLE || sym->attr.flavor == FL_PARAMETER
15550       || (sym->attr.flavor == FL_PROCEDURE && sym->attr.function))
15551     if (!resolve_typespec_used (&sym->ts, &sym->declared_at, sym->name))
15552       return;
15553 
15554   if (sym->param_list)
15555     resolve_pdt (sym);
15556 }
15557 
15558 
15559 /************* Resolve DATA statements *************/
15560 
15561 static struct
15562 {
15563   gfc_data_value *vnode;
15564   mpz_t left;
15565 }
15566 values;
15567 
15568 
15569 /* Advance the values structure to point to the next value in the data list.  */
15570 
15571 static bool
next_data_value(void)15572 next_data_value (void)
15573 {
15574   while (mpz_cmp_ui (values.left, 0) == 0)
15575     {
15576 
15577       if (values.vnode->next == NULL)
15578 	return false;
15579 
15580       values.vnode = values.vnode->next;
15581       mpz_set (values.left, values.vnode->repeat);
15582     }
15583 
15584   return true;
15585 }
15586 
15587 
15588 static bool
check_data_variable(gfc_data_variable * var,locus * where)15589 check_data_variable (gfc_data_variable *var, locus *where)
15590 {
15591   gfc_expr *e;
15592   mpz_t size;
15593   mpz_t offset;
15594   bool t;
15595   ar_type mark = AR_UNKNOWN;
15596   int i;
15597   mpz_t section_index[GFC_MAX_DIMENSIONS];
15598   gfc_ref *ref;
15599   gfc_array_ref *ar;
15600   gfc_symbol *sym;
15601   int has_pointer;
15602 
15603   if (!gfc_resolve_expr (var->expr))
15604     return false;
15605 
15606   ar = NULL;
15607   mpz_init_set_si (offset, 0);
15608   e = var->expr;
15609 
15610   if (e->expr_type == EXPR_FUNCTION && e->value.function.isym
15611       && e->value.function.isym->id == GFC_ISYM_CAF_GET)
15612     e = e->value.function.actual->expr;
15613 
15614   if (e->expr_type != EXPR_VARIABLE)
15615     {
15616       gfc_error ("Expecting definable entity near %L", where);
15617       return false;
15618     }
15619 
15620   sym = e->symtree->n.sym;
15621 
15622   if (sym->ns->is_block_data && !sym->attr.in_common)
15623     {
15624       gfc_error ("BLOCK DATA element %qs at %L must be in COMMON",
15625 		 sym->name, &sym->declared_at);
15626       return false;
15627     }
15628 
15629   if (e->ref == NULL && sym->as)
15630     {
15631       gfc_error ("DATA array %qs at %L must be specified in a previous"
15632 		 " declaration", sym->name, where);
15633       return false;
15634     }
15635 
15636   has_pointer = sym->attr.pointer;
15637 
15638   if (gfc_is_coindexed (e))
15639     {
15640       gfc_error ("DATA element %qs at %L cannot have a coindex", sym->name,
15641 		 where);
15642       return false;
15643     }
15644 
15645   for (ref = e->ref; ref; ref = ref->next)
15646     {
15647       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
15648 	has_pointer = 1;
15649 
15650       if (has_pointer
15651 	    && ref->type == REF_ARRAY
15652 	    && ref->u.ar.type != AR_FULL)
15653 	  {
15654 	    gfc_error ("DATA element %qs at %L is a pointer and so must "
15655 			"be a full array", sym->name, where);
15656 	    return false;
15657 	  }
15658     }
15659 
15660   if (e->rank == 0 || has_pointer)
15661     {
15662       mpz_init_set_ui (size, 1);
15663       ref = NULL;
15664     }
15665   else
15666     {
15667       ref = e->ref;
15668 
15669       /* Find the array section reference.  */
15670       for (ref = e->ref; ref; ref = ref->next)
15671 	{
15672 	  if (ref->type != REF_ARRAY)
15673 	    continue;
15674 	  if (ref->u.ar.type == AR_ELEMENT)
15675 	    continue;
15676 	  break;
15677 	}
15678       gcc_assert (ref);
15679 
15680       /* Set marks according to the reference pattern.  */
15681       switch (ref->u.ar.type)
15682 	{
15683 	case AR_FULL:
15684 	  mark = AR_FULL;
15685 	  break;
15686 
15687 	case AR_SECTION:
15688 	  ar = &ref->u.ar;
15689 	  /* Get the start position of array section.  */
15690 	  gfc_get_section_index (ar, section_index, &offset);
15691 	  mark = AR_SECTION;
15692 	  break;
15693 
15694 	default:
15695 	  gcc_unreachable ();
15696 	}
15697 
15698       if (!gfc_array_size (e, &size))
15699 	{
15700 	  gfc_error ("Nonconstant array section at %L in DATA statement",
15701 		     where);
15702 	  mpz_clear (offset);
15703 	  return false;
15704 	}
15705     }
15706 
15707   t = true;
15708 
15709   while (mpz_cmp_ui (size, 0) > 0)
15710     {
15711       if (!next_data_value ())
15712 	{
15713 	  gfc_error ("DATA statement at %L has more variables than values",
15714 		     where);
15715 	  t = false;
15716 	  break;
15717 	}
15718 
15719       t = gfc_check_assign (var->expr, values.vnode->expr, 0);
15720       if (!t)
15721 	break;
15722 
15723       /* If we have more than one element left in the repeat count,
15724 	 and we have more than one element left in the target variable,
15725 	 then create a range assignment.  */
15726       /* FIXME: Only done for full arrays for now, since array sections
15727 	 seem tricky.  */
15728       if (mark == AR_FULL && ref && ref->next == NULL
15729 	  && mpz_cmp_ui (values.left, 1) > 0 && mpz_cmp_ui (size, 1) > 0)
15730 	{
15731 	  mpz_t range;
15732 
15733 	  if (mpz_cmp (size, values.left) >= 0)
15734 	    {
15735 	      mpz_init_set (range, values.left);
15736 	      mpz_sub (size, size, values.left);
15737 	      mpz_set_ui (values.left, 0);
15738 	    }
15739 	  else
15740 	    {
15741 	      mpz_init_set (range, size);
15742 	      mpz_sub (values.left, values.left, size);
15743 	      mpz_set_ui (size, 0);
15744 	    }
15745 
15746 	  t = gfc_assign_data_value (var->expr, values.vnode->expr,
15747 				     offset, &range);
15748 
15749 	  mpz_add (offset, offset, range);
15750 	  mpz_clear (range);
15751 
15752 	  if (!t)
15753 	    break;
15754 	}
15755 
15756       /* Assign initial value to symbol.  */
15757       else
15758 	{
15759 	  mpz_sub_ui (values.left, values.left, 1);
15760 	  mpz_sub_ui (size, size, 1);
15761 
15762 	  t = gfc_assign_data_value (var->expr, values.vnode->expr,
15763 				     offset, NULL);
15764 	  if (!t)
15765 	    break;
15766 
15767 	  if (mark == AR_FULL)
15768 	    mpz_add_ui (offset, offset, 1);
15769 
15770 	  /* Modify the array section indexes and recalculate the offset
15771 	     for next element.  */
15772 	  else if (mark == AR_SECTION)
15773 	    gfc_advance_section (section_index, ar, &offset);
15774 	}
15775     }
15776 
15777   if (mark == AR_SECTION)
15778     {
15779       for (i = 0; i < ar->dimen; i++)
15780 	mpz_clear (section_index[i]);
15781     }
15782 
15783   mpz_clear (size);
15784   mpz_clear (offset);
15785 
15786   return t;
15787 }
15788 
15789 
15790 static bool traverse_data_var (gfc_data_variable *, locus *);
15791 
15792 /* Iterate over a list of elements in a DATA statement.  */
15793 
15794 static bool
traverse_data_list(gfc_data_variable * var,locus * where)15795 traverse_data_list (gfc_data_variable *var, locus *where)
15796 {
15797   mpz_t trip;
15798   iterator_stack frame;
15799   gfc_expr *e, *start, *end, *step;
15800   bool retval = true;
15801 
15802   mpz_init (frame.value);
15803   mpz_init (trip);
15804 
15805   start = gfc_copy_expr (var->iter.start);
15806   end = gfc_copy_expr (var->iter.end);
15807   step = gfc_copy_expr (var->iter.step);
15808 
15809   if (!gfc_simplify_expr (start, 1)
15810       || start->expr_type != EXPR_CONSTANT)
15811     {
15812       gfc_error ("start of implied-do loop at %L could not be "
15813 		 "simplified to a constant value", &start->where);
15814       retval = false;
15815       goto cleanup;
15816     }
15817   if (!gfc_simplify_expr (end, 1)
15818       || end->expr_type != EXPR_CONSTANT)
15819     {
15820       gfc_error ("end of implied-do loop at %L could not be "
15821 		 "simplified to a constant value", &start->where);
15822       retval = false;
15823       goto cleanup;
15824     }
15825   if (!gfc_simplify_expr (step, 1)
15826       || step->expr_type != EXPR_CONSTANT)
15827     {
15828       gfc_error ("step of implied-do loop at %L could not be "
15829 		 "simplified to a constant value", &start->where);
15830       retval = false;
15831       goto cleanup;
15832     }
15833 
15834   mpz_set (trip, end->value.integer);
15835   mpz_sub (trip, trip, start->value.integer);
15836   mpz_add (trip, trip, step->value.integer);
15837 
15838   mpz_div (trip, trip, step->value.integer);
15839 
15840   mpz_set (frame.value, start->value.integer);
15841 
15842   frame.prev = iter_stack;
15843   frame.variable = var->iter.var->symtree;
15844   iter_stack = &frame;
15845 
15846   while (mpz_cmp_ui (trip, 0) > 0)
15847     {
15848       if (!traverse_data_var (var->list, where))
15849 	{
15850 	  retval = false;
15851 	  goto cleanup;
15852 	}
15853 
15854       e = gfc_copy_expr (var->expr);
15855       if (!gfc_simplify_expr (e, 1))
15856 	{
15857 	  gfc_free_expr (e);
15858 	  retval = false;
15859 	  goto cleanup;
15860 	}
15861 
15862       mpz_add (frame.value, frame.value, step->value.integer);
15863 
15864       mpz_sub_ui (trip, trip, 1);
15865     }
15866 
15867 cleanup:
15868   mpz_clear (frame.value);
15869   mpz_clear (trip);
15870 
15871   gfc_free_expr (start);
15872   gfc_free_expr (end);
15873   gfc_free_expr (step);
15874 
15875   iter_stack = frame.prev;
15876   return retval;
15877 }
15878 
15879 
15880 /* Type resolve variables in the variable list of a DATA statement.  */
15881 
15882 static bool
traverse_data_var(gfc_data_variable * var,locus * where)15883 traverse_data_var (gfc_data_variable *var, locus *where)
15884 {
15885   bool t;
15886 
15887   for (; var; var = var->next)
15888     {
15889       if (var->expr == NULL)
15890 	t = traverse_data_list (var, where);
15891       else
15892 	t = check_data_variable (var, where);
15893 
15894       if (!t)
15895 	return false;
15896     }
15897 
15898   return true;
15899 }
15900 
15901 
15902 /* Resolve the expressions and iterators associated with a data statement.
15903    This is separate from the assignment checking because data lists should
15904    only be resolved once.  */
15905 
15906 static bool
resolve_data_variables(gfc_data_variable * d)15907 resolve_data_variables (gfc_data_variable *d)
15908 {
15909   for (; d; d = d->next)
15910     {
15911       if (d->list == NULL)
15912 	{
15913 	  if (!gfc_resolve_expr (d->expr))
15914 	    return false;
15915 	}
15916       else
15917 	{
15918 	  if (!gfc_resolve_iterator (&d->iter, false, true))
15919 	    return false;
15920 
15921 	  if (!resolve_data_variables (d->list))
15922 	    return false;
15923 	}
15924     }
15925 
15926   return true;
15927 }
15928 
15929 
15930 /* Resolve a single DATA statement.  We implement this by storing a pointer to
15931    the value list into static variables, and then recursively traversing the
15932    variables list, expanding iterators and such.  */
15933 
15934 static void
resolve_data(gfc_data * d)15935 resolve_data (gfc_data *d)
15936 {
15937 
15938   if (!resolve_data_variables (d->var))
15939     return;
15940 
15941   values.vnode = d->value;
15942   if (d->value == NULL)
15943     mpz_set_ui (values.left, 0);
15944   else
15945     mpz_set (values.left, d->value->repeat);
15946 
15947   if (!traverse_data_var (d->var, &d->where))
15948     return;
15949 
15950   /* At this point, we better not have any values left.  */
15951 
15952   if (next_data_value ())
15953     gfc_error ("DATA statement at %L has more values than variables",
15954 	       &d->where);
15955 }
15956 
15957 
15958 /* 12.6 Constraint: In a pure subprogram any variable which is in common or
15959    accessed by host or use association, is a dummy argument to a pure function,
15960    is a dummy argument with INTENT (IN) to a pure subroutine, or an object that
15961    is storage associated with any such variable, shall not be used in the
15962    following contexts: (clients of this function).  */
15963 
15964 /* Determines if a variable is not 'pure', i.e., not assignable within a pure
15965    procedure.  Returns zero if assignment is OK, nonzero if there is a
15966    problem.  */
15967 int
gfc_impure_variable(gfc_symbol * sym)15968 gfc_impure_variable (gfc_symbol *sym)
15969 {
15970   gfc_symbol *proc;
15971   gfc_namespace *ns;
15972 
15973   if (sym->attr.use_assoc || sym->attr.in_common)
15974     return 1;
15975 
15976   /* Check if the symbol's ns is inside the pure procedure.  */
15977   for (ns = gfc_current_ns; ns; ns = ns->parent)
15978     {
15979       if (ns == sym->ns)
15980 	break;
15981       if (ns->proc_name->attr.flavor == FL_PROCEDURE && !sym->attr.function)
15982 	return 1;
15983     }
15984 
15985   proc = sym->ns->proc_name;
15986   if (sym->attr.dummy
15987       && ((proc->attr.subroutine && sym->attr.intent == INTENT_IN)
15988 	  || proc->attr.function))
15989     return 1;
15990 
15991   /* TODO: Sort out what can be storage associated, if anything, and include
15992      it here.  In principle equivalences should be scanned but it does not
15993      seem to be possible to storage associate an impure variable this way.  */
15994   return 0;
15995 }
15996 
15997 
15998 /* Test whether a symbol is pure or not.  For a NULL pointer, checks if the
15999    current namespace is inside a pure procedure.  */
16000 
16001 int
gfc_pure(gfc_symbol * sym)16002 gfc_pure (gfc_symbol *sym)
16003 {
16004   symbol_attribute attr;
16005   gfc_namespace *ns;
16006 
16007   if (sym == NULL)
16008     {
16009       /* Check if the current namespace or one of its parents
16010 	belongs to a pure procedure.  */
16011       for (ns = gfc_current_ns; ns; ns = ns->parent)
16012 	{
16013 	  sym = ns->proc_name;
16014 	  if (sym == NULL)
16015 	    return 0;
16016 	  attr = sym->attr;
16017 	  if (attr.flavor == FL_PROCEDURE && attr.pure)
16018 	    return 1;
16019 	}
16020       return 0;
16021     }
16022 
16023   attr = sym->attr;
16024 
16025   return attr.flavor == FL_PROCEDURE && attr.pure;
16026 }
16027 
16028 
16029 /* Test whether a symbol is implicitly pure or not.  For a NULL pointer,
16030    checks if the current namespace is implicitly pure.  Note that this
16031    function returns false for a PURE procedure.  */
16032 
16033 int
gfc_implicit_pure(gfc_symbol * sym)16034 gfc_implicit_pure (gfc_symbol *sym)
16035 {
16036   gfc_namespace *ns;
16037 
16038   if (sym == NULL)
16039     {
16040       /* Check if the current procedure is implicit_pure.  Walk up
16041 	 the procedure list until we find a procedure.  */
16042       for (ns = gfc_current_ns; ns; ns = ns->parent)
16043 	{
16044 	  sym = ns->proc_name;
16045 	  if (sym == NULL)
16046 	    return 0;
16047 
16048 	  if (sym->attr.flavor == FL_PROCEDURE)
16049 	    break;
16050 	}
16051     }
16052 
16053   return sym->attr.flavor == FL_PROCEDURE && sym->attr.implicit_pure
16054     && !sym->attr.pure;
16055 }
16056 
16057 
16058 void
gfc_unset_implicit_pure(gfc_symbol * sym)16059 gfc_unset_implicit_pure (gfc_symbol *sym)
16060 {
16061   gfc_namespace *ns;
16062 
16063   if (sym == NULL)
16064     {
16065       /* Check if the current procedure is implicit_pure.  Walk up
16066 	 the procedure list until we find a procedure.  */
16067       for (ns = gfc_current_ns; ns; ns = ns->parent)
16068 	{
16069 	  sym = ns->proc_name;
16070 	  if (sym == NULL)
16071 	    return;
16072 
16073 	  if (sym->attr.flavor == FL_PROCEDURE)
16074 	    break;
16075 	}
16076     }
16077 
16078   if (sym->attr.flavor == FL_PROCEDURE)
16079     sym->attr.implicit_pure = 0;
16080   else
16081     sym->attr.pure = 0;
16082 }
16083 
16084 
16085 /* Test whether the current procedure is elemental or not.  */
16086 
16087 int
gfc_elemental(gfc_symbol * sym)16088 gfc_elemental (gfc_symbol *sym)
16089 {
16090   symbol_attribute attr;
16091 
16092   if (sym == NULL)
16093     sym = gfc_current_ns->proc_name;
16094   if (sym == NULL)
16095     return 0;
16096   attr = sym->attr;
16097 
16098   return attr.flavor == FL_PROCEDURE && attr.elemental;
16099 }
16100 
16101 
16102 /* Warn about unused labels.  */
16103 
16104 static void
warn_unused_fortran_label(gfc_st_label * label)16105 warn_unused_fortran_label (gfc_st_label *label)
16106 {
16107   if (label == NULL)
16108     return;
16109 
16110   warn_unused_fortran_label (label->left);
16111 
16112   if (label->defined == ST_LABEL_UNKNOWN)
16113     return;
16114 
16115   switch (label->referenced)
16116     {
16117     case ST_LABEL_UNKNOWN:
16118       gfc_warning (OPT_Wunused_label, "Label %d at %L defined but not used",
16119 		   label->value, &label->where);
16120       break;
16121 
16122     case ST_LABEL_BAD_TARGET:
16123       gfc_warning (OPT_Wunused_label,
16124 		   "Label %d at %L defined but cannot be used",
16125 		   label->value, &label->where);
16126       break;
16127 
16128     default:
16129       break;
16130     }
16131 
16132   warn_unused_fortran_label (label->right);
16133 }
16134 
16135 
16136 /* Returns the sequence type of a symbol or sequence.  */
16137 
16138 static seq_type
sequence_type(gfc_typespec ts)16139 sequence_type (gfc_typespec ts)
16140 {
16141   seq_type result;
16142   gfc_component *c;
16143 
16144   switch (ts.type)
16145   {
16146     case BT_DERIVED:
16147 
16148       if (ts.u.derived->components == NULL)
16149 	return SEQ_NONDEFAULT;
16150 
16151       result = sequence_type (ts.u.derived->components->ts);
16152       for (c = ts.u.derived->components->next; c; c = c->next)
16153 	if (sequence_type (c->ts) != result)
16154 	  return SEQ_MIXED;
16155 
16156       return result;
16157 
16158     case BT_CHARACTER:
16159       if (ts.kind != gfc_default_character_kind)
16160 	  return SEQ_NONDEFAULT;
16161 
16162       return SEQ_CHARACTER;
16163 
16164     case BT_INTEGER:
16165       if (ts.kind != gfc_default_integer_kind)
16166 	  return SEQ_NONDEFAULT;
16167 
16168       return SEQ_NUMERIC;
16169 
16170     case BT_REAL:
16171       if (!(ts.kind == gfc_default_real_kind
16172 	    || ts.kind == gfc_default_double_kind))
16173 	  return SEQ_NONDEFAULT;
16174 
16175       return SEQ_NUMERIC;
16176 
16177     case BT_COMPLEX:
16178       if (ts.kind != gfc_default_complex_kind)
16179 	  return SEQ_NONDEFAULT;
16180 
16181       return SEQ_NUMERIC;
16182 
16183     case BT_LOGICAL:
16184       if (ts.kind != gfc_default_logical_kind)
16185 	  return SEQ_NONDEFAULT;
16186 
16187       return SEQ_NUMERIC;
16188 
16189     default:
16190       return SEQ_NONDEFAULT;
16191   }
16192 }
16193 
16194 
16195 /* Resolve derived type EQUIVALENCE object.  */
16196 
16197 static bool
resolve_equivalence_derived(gfc_symbol * derived,gfc_symbol * sym,gfc_expr * e)16198 resolve_equivalence_derived (gfc_symbol *derived, gfc_symbol *sym, gfc_expr *e)
16199 {
16200   gfc_component *c = derived->components;
16201 
16202   if (!derived)
16203     return true;
16204 
16205   /* Shall not be an object of nonsequence derived type.  */
16206   if (!derived->attr.sequence)
16207     {
16208       gfc_error ("Derived type variable %qs at %L must have SEQUENCE "
16209 		 "attribute to be an EQUIVALENCE object", sym->name,
16210 		 &e->where);
16211       return false;
16212     }
16213 
16214   /* Shall not have allocatable components.  */
16215   if (derived->attr.alloc_comp)
16216     {
16217       gfc_error ("Derived type variable %qs at %L cannot have ALLOCATABLE "
16218 		 "components to be an EQUIVALENCE object",sym->name,
16219 		 &e->where);
16220       return false;
16221     }
16222 
16223   if (sym->attr.in_common && gfc_has_default_initializer (sym->ts.u.derived))
16224     {
16225       gfc_error ("Derived type variable %qs at %L with default "
16226 		 "initialization cannot be in EQUIVALENCE with a variable "
16227 		 "in COMMON", sym->name, &e->where);
16228       return false;
16229     }
16230 
16231   for (; c ; c = c->next)
16232     {
16233       if (gfc_bt_struct (c->ts.type)
16234 	  && (!resolve_equivalence_derived(c->ts.u.derived, sym, e)))
16235 	return false;
16236 
16237       /* Shall not be an object of sequence derived type containing a pointer
16238 	 in the structure.  */
16239       if (c->attr.pointer)
16240 	{
16241 	  gfc_error ("Derived type variable %qs at %L with pointer "
16242 		     "component(s) cannot be an EQUIVALENCE object",
16243 		     sym->name, &e->where);
16244 	  return false;
16245 	}
16246     }
16247   return true;
16248 }
16249 
16250 
16251 /* Resolve equivalence object.
16252    An EQUIVALENCE object shall not be a dummy argument, a pointer, a target,
16253    an allocatable array, an object of nonsequence derived type, an object of
16254    sequence derived type containing a pointer at any level of component
16255    selection, an automatic object, a function name, an entry name, a result
16256    name, a named constant, a structure component, or a subobject of any of
16257    the preceding objects.  A substring shall not have length zero.  A
16258    derived type shall not have components with default initialization nor
16259    shall two objects of an equivalence group be initialized.
16260    Either all or none of the objects shall have an protected attribute.
16261    The simple constraints are done in symbol.c(check_conflict) and the rest
16262    are implemented here.  */
16263 
16264 static void
resolve_equivalence(gfc_equiv * eq)16265 resolve_equivalence (gfc_equiv *eq)
16266 {
16267   gfc_symbol *sym;
16268   gfc_symbol *first_sym;
16269   gfc_expr *e;
16270   gfc_ref *r;
16271   locus *last_where = NULL;
16272   seq_type eq_type, last_eq_type;
16273   gfc_typespec *last_ts;
16274   int object, cnt_protected;
16275   const char *msg;
16276 
16277   last_ts = &eq->expr->symtree->n.sym->ts;
16278 
16279   first_sym = eq->expr->symtree->n.sym;
16280 
16281   cnt_protected = 0;
16282 
16283   for (object = 1; eq; eq = eq->eq, object++)
16284     {
16285       e = eq->expr;
16286 
16287       e->ts = e->symtree->n.sym->ts;
16288       /* match_varspec might not know yet if it is seeing
16289 	 array reference or substring reference, as it doesn't
16290 	 know the types.  */
16291       if (e->ref && e->ref->type == REF_ARRAY)
16292 	{
16293 	  gfc_ref *ref = e->ref;
16294 	  sym = e->symtree->n.sym;
16295 
16296 	  if (sym->attr.dimension)
16297 	    {
16298 	      ref->u.ar.as = sym->as;
16299 	      ref = ref->next;
16300 	    }
16301 
16302 	  /* For substrings, convert REF_ARRAY into REF_SUBSTRING.  */
16303 	  if (e->ts.type == BT_CHARACTER
16304 	      && ref
16305 	      && ref->type == REF_ARRAY
16306 	      && ref->u.ar.dimen == 1
16307 	      && ref->u.ar.dimen_type[0] == DIMEN_RANGE
16308 	      && ref->u.ar.stride[0] == NULL)
16309 	    {
16310 	      gfc_expr *start = ref->u.ar.start[0];
16311 	      gfc_expr *end = ref->u.ar.end[0];
16312 	      void *mem = NULL;
16313 
16314 	      /* Optimize away the (:) reference.  */
16315 	      if (start == NULL && end == NULL)
16316 		{
16317 		  if (e->ref == ref)
16318 		    e->ref = ref->next;
16319 		  else
16320 		    e->ref->next = ref->next;
16321 		  mem = ref;
16322 		}
16323 	      else
16324 		{
16325 		  ref->type = REF_SUBSTRING;
16326 		  if (start == NULL)
16327 		    start = gfc_get_int_expr (gfc_charlen_int_kind,
16328 					      NULL, 1);
16329 		  ref->u.ss.start = start;
16330 		  if (end == NULL && e->ts.u.cl)
16331 		    end = gfc_copy_expr (e->ts.u.cl->length);
16332 		  ref->u.ss.end = end;
16333 		  ref->u.ss.length = e->ts.u.cl;
16334 		  e->ts.u.cl = NULL;
16335 		}
16336 	      ref = ref->next;
16337 	      free (mem);
16338 	    }
16339 
16340 	  /* Any further ref is an error.  */
16341 	  if (ref)
16342 	    {
16343 	      gcc_assert (ref->type == REF_ARRAY);
16344 	      gfc_error ("Syntax error in EQUIVALENCE statement at %L",
16345 			 &ref->u.ar.where);
16346 	      continue;
16347 	    }
16348 	}
16349 
16350       if (!gfc_resolve_expr (e))
16351 	continue;
16352 
16353       sym = e->symtree->n.sym;
16354 
16355       if (sym->attr.is_protected)
16356 	cnt_protected++;
16357       if (cnt_protected > 0 && cnt_protected != object)
16358        	{
16359 	      gfc_error ("Either all or none of the objects in the "
16360 			 "EQUIVALENCE set at %L shall have the "
16361 			 "PROTECTED attribute",
16362 			 &e->where);
16363 	      break;
16364 	}
16365 
16366       /* Shall not equivalence common block variables in a PURE procedure.  */
16367       if (sym->ns->proc_name
16368 	  && sym->ns->proc_name->attr.pure
16369 	  && sym->attr.in_common)
16370 	{
16371 	  /* Need to check for symbols that may have entered the pure
16372 	     procedure via a USE statement.  */
16373 	  bool saw_sym = false;
16374 	  if (sym->ns->use_stmts)
16375 	    {
16376 	      gfc_use_rename *r;
16377 	      for (r = sym->ns->use_stmts->rename; r; r = r->next)
16378 		if (strcmp(r->use_name, sym->name) == 0) saw_sym = true;
16379 	    }
16380 	  else
16381 	    saw_sym = true;
16382 
16383 	  if (saw_sym)
16384 	    gfc_error ("COMMON block member %qs at %L cannot be an "
16385 		       "EQUIVALENCE object in the pure procedure %qs",
16386 		       sym->name, &e->where, sym->ns->proc_name->name);
16387 	  break;
16388 	}
16389 
16390       /* Shall not be a named constant.  */
16391       if (e->expr_type == EXPR_CONSTANT)
16392 	{
16393 	  gfc_error ("Named constant %qs at %L cannot be an EQUIVALENCE "
16394 		     "object", sym->name, &e->where);
16395 	  continue;
16396 	}
16397 
16398       if (e->ts.type == BT_DERIVED
16399 	  && !resolve_equivalence_derived (e->ts.u.derived, sym, e))
16400 	continue;
16401 
16402       /* Check that the types correspond correctly:
16403 	 Note 5.28:
16404 	 A numeric sequence structure may be equivalenced to another sequence
16405 	 structure, an object of default integer type, default real type, double
16406 	 precision real type, default logical type such that components of the
16407 	 structure ultimately only become associated to objects of the same
16408 	 kind. A character sequence structure may be equivalenced to an object
16409 	 of default character kind or another character sequence structure.
16410 	 Other objects may be equivalenced only to objects of the same type and
16411 	 kind parameters.  */
16412 
16413       /* Identical types are unconditionally OK.  */
16414       if (object == 1 || gfc_compare_types (last_ts, &sym->ts))
16415 	goto identical_types;
16416 
16417       last_eq_type = sequence_type (*last_ts);
16418       eq_type = sequence_type (sym->ts);
16419 
16420       /* Since the pair of objects is not of the same type, mixed or
16421 	 non-default sequences can be rejected.  */
16422 
16423       msg = "Sequence %s with mixed components in EQUIVALENCE "
16424 	    "statement at %L with different type objects";
16425       if ((object ==2
16426 	   && last_eq_type == SEQ_MIXED
16427 	   && !gfc_notify_std (GFC_STD_GNU, msg, first_sym->name, last_where))
16428 	  || (eq_type == SEQ_MIXED
16429 	      && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where)))
16430 	continue;
16431 
16432       msg = "Non-default type object or sequence %s in EQUIVALENCE "
16433 	    "statement at %L with objects of different type";
16434       if ((object ==2
16435 	   && last_eq_type == SEQ_NONDEFAULT
16436 	   && !gfc_notify_std (GFC_STD_GNU, msg, first_sym->name, last_where))
16437 	  || (eq_type == SEQ_NONDEFAULT
16438 	      && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where)))
16439 	continue;
16440 
16441       msg ="Non-CHARACTER object %qs in default CHARACTER "
16442 	   "EQUIVALENCE statement at %L";
16443       if (last_eq_type == SEQ_CHARACTER
16444 	  && eq_type != SEQ_CHARACTER
16445 	  && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where))
16446 		continue;
16447 
16448       msg ="Non-NUMERIC object %qs in default NUMERIC "
16449 	   "EQUIVALENCE statement at %L";
16450       if (last_eq_type == SEQ_NUMERIC
16451 	  && eq_type != SEQ_NUMERIC
16452 	  && !gfc_notify_std (GFC_STD_GNU, msg, sym->name, &e->where))
16453 		continue;
16454 
16455   identical_types:
16456       last_ts =&sym->ts;
16457       last_where = &e->where;
16458 
16459       if (!e->ref)
16460 	continue;
16461 
16462       /* Shall not be an automatic array.  */
16463       if (e->ref->type == REF_ARRAY
16464 	  && !gfc_resolve_array_spec (e->ref->u.ar.as, 1))
16465 	{
16466 	  gfc_error ("Array %qs at %L with non-constant bounds cannot be "
16467 		     "an EQUIVALENCE object", sym->name, &e->where);
16468 	  continue;
16469 	}
16470 
16471       r = e->ref;
16472       while (r)
16473 	{
16474 	  /* Shall not be a structure component.  */
16475 	  if (r->type == REF_COMPONENT)
16476 	    {
16477 	      gfc_error ("Structure component %qs at %L cannot be an "
16478 			 "EQUIVALENCE object",
16479 			 r->u.c.component->name, &e->where);
16480 	      break;
16481 	    }
16482 
16483 	  /* A substring shall not have length zero.  */
16484 	  if (r->type == REF_SUBSTRING)
16485 	    {
16486 	      if (compare_bound (r->u.ss.start, r->u.ss.end) == CMP_GT)
16487 		{
16488 		  gfc_error ("Substring at %L has length zero",
16489 			     &r->u.ss.start->where);
16490 		  break;
16491 		}
16492 	    }
16493 	  r = r->next;
16494 	}
16495     }
16496 }
16497 
16498 
16499 /* Function called by resolve_fntype to flag other symbol used in the
16500    length type parameter specification of function resuls.  */
16501 
16502 static bool
flag_fn_result_spec(gfc_expr * expr,gfc_symbol * sym,int * f ATTRIBUTE_UNUSED)16503 flag_fn_result_spec (gfc_expr *expr,
16504                      gfc_symbol *sym,
16505                      int *f ATTRIBUTE_UNUSED)
16506 {
16507   gfc_namespace *ns;
16508   gfc_symbol *s;
16509 
16510   if (expr->expr_type == EXPR_VARIABLE)
16511     {
16512       s = expr->symtree->n.sym;
16513       for (ns = s->ns; ns; ns = ns->parent)
16514 	if (!ns->parent)
16515 	  break;
16516 
16517       if (sym == s)
16518 	{
16519 	  gfc_error ("Self reference in character length expression "
16520 		     "for %qs at %L", sym->name, &expr->where);
16521 	  return true;
16522 	}
16523 
16524       if (!s->fn_result_spec
16525 	  && s->attr.flavor == FL_PARAMETER)
16526 	{
16527 	  /* Function contained in a module.... */
16528 	  if (ns->proc_name && ns->proc_name->attr.flavor == FL_MODULE)
16529 	    {
16530 	      gfc_symtree *st;
16531 	      s->fn_result_spec = 1;
16532 	      /* Make sure that this symbol is translated as a module
16533 		 variable.  */
16534 	      st = gfc_get_unique_symtree (ns);
16535 	      st->n.sym = s;
16536 	      s->refs++;
16537 	    }
16538 	  /* ... which is use associated and called.  */
16539 	  else if (s->attr.use_assoc || s->attr.used_in_submodule
16540 			||
16541 		  /* External function matched with an interface.  */
16542 		  (s->ns->proc_name
16543 		   && ((s->ns == ns
16544 			 && s->ns->proc_name->attr.if_source == IFSRC_DECL)
16545 		       || s->ns->proc_name->attr.if_source == IFSRC_IFBODY)
16546 		   && s->ns->proc_name->attr.function))
16547 	    s->fn_result_spec = 1;
16548 	}
16549     }
16550   return false;
16551 }
16552 
16553 
16554 /* Resolve function and ENTRY types, issue diagnostics if needed.  */
16555 
16556 static void
resolve_fntype(gfc_namespace * ns)16557 resolve_fntype (gfc_namespace *ns)
16558 {
16559   gfc_entry_list *el;
16560   gfc_symbol *sym;
16561 
16562   if (ns->proc_name == NULL || !ns->proc_name->attr.function)
16563     return;
16564 
16565   /* If there are any entries, ns->proc_name is the entry master
16566      synthetic symbol and ns->entries->sym actual FUNCTION symbol.  */
16567   if (ns->entries)
16568     sym = ns->entries->sym;
16569   else
16570     sym = ns->proc_name;
16571   if (sym->result == sym
16572       && sym->ts.type == BT_UNKNOWN
16573       && !gfc_set_default_type (sym, 0, NULL)
16574       && !sym->attr.untyped)
16575     {
16576       gfc_error ("Function %qs at %L has no IMPLICIT type",
16577 		 sym->name, &sym->declared_at);
16578       sym->attr.untyped = 1;
16579     }
16580 
16581   if (sym->ts.type == BT_DERIVED && !sym->ts.u.derived->attr.use_assoc
16582       && !sym->attr.contained
16583       && !gfc_check_symbol_access (sym->ts.u.derived)
16584       && gfc_check_symbol_access (sym))
16585     {
16586       gfc_notify_std (GFC_STD_F2003, "PUBLIC function %qs at "
16587 		      "%L of PRIVATE type %qs", sym->name,
16588 		      &sym->declared_at, sym->ts.u.derived->name);
16589     }
16590 
16591     if (ns->entries)
16592     for (el = ns->entries->next; el; el = el->next)
16593       {
16594 	if (el->sym->result == el->sym
16595 	    && el->sym->ts.type == BT_UNKNOWN
16596 	    && !gfc_set_default_type (el->sym, 0, NULL)
16597 	    && !el->sym->attr.untyped)
16598 	  {
16599 	    gfc_error ("ENTRY %qs at %L has no IMPLICIT type",
16600 		       el->sym->name, &el->sym->declared_at);
16601 	    el->sym->attr.untyped = 1;
16602 	  }
16603       }
16604 
16605   if (sym->ts.type == BT_CHARACTER)
16606     gfc_traverse_expr (sym->ts.u.cl->length, sym, flag_fn_result_spec, 0);
16607 }
16608 
16609 
16610 /* 12.3.2.1.1 Defined operators.  */
16611 
16612 static bool
check_uop_procedure(gfc_symbol * sym,locus where)16613 check_uop_procedure (gfc_symbol *sym, locus where)
16614 {
16615   gfc_formal_arglist *formal;
16616 
16617   if (!sym->attr.function)
16618     {
16619       gfc_error ("User operator procedure %qs at %L must be a FUNCTION",
16620 		 sym->name, &where);
16621       return false;
16622     }
16623 
16624   if (sym->ts.type == BT_CHARACTER
16625       && !((sym->ts.u.cl && sym->ts.u.cl->length) || sym->ts.deferred)
16626       && !(sym->result && ((sym->result->ts.u.cl
16627 	   && sym->result->ts.u.cl->length) || sym->result->ts.deferred)))
16628     {
16629       gfc_error ("User operator procedure %qs at %L cannot be assumed "
16630 		 "character length", sym->name, &where);
16631       return false;
16632     }
16633 
16634   formal = gfc_sym_get_dummy_args (sym);
16635   if (!formal || !formal->sym)
16636     {
16637       gfc_error ("User operator procedure %qs at %L must have at least "
16638 		 "one argument", sym->name, &where);
16639       return false;
16640     }
16641 
16642   if (formal->sym->attr.intent != INTENT_IN)
16643     {
16644       gfc_error ("First argument of operator interface at %L must be "
16645 		 "INTENT(IN)", &where);
16646       return false;
16647     }
16648 
16649   if (formal->sym->attr.optional)
16650     {
16651       gfc_error ("First argument of operator interface at %L cannot be "
16652 		 "optional", &where);
16653       return false;
16654     }
16655 
16656   formal = formal->next;
16657   if (!formal || !formal->sym)
16658     return true;
16659 
16660   if (formal->sym->attr.intent != INTENT_IN)
16661     {
16662       gfc_error ("Second argument of operator interface at %L must be "
16663 		 "INTENT(IN)", &where);
16664       return false;
16665     }
16666 
16667   if (formal->sym->attr.optional)
16668     {
16669       gfc_error ("Second argument of operator interface at %L cannot be "
16670 		 "optional", &where);
16671       return false;
16672     }
16673 
16674   if (formal->next)
16675     {
16676       gfc_error ("Operator interface at %L must have, at most, two "
16677 		 "arguments", &where);
16678       return false;
16679     }
16680 
16681   return true;
16682 }
16683 
16684 static void
gfc_resolve_uops(gfc_symtree * symtree)16685 gfc_resolve_uops (gfc_symtree *symtree)
16686 {
16687   gfc_interface *itr;
16688 
16689   if (symtree == NULL)
16690     return;
16691 
16692   gfc_resolve_uops (symtree->left);
16693   gfc_resolve_uops (symtree->right);
16694 
16695   for (itr = symtree->n.uop->op; itr; itr = itr->next)
16696     check_uop_procedure (itr->sym, itr->sym->declared_at);
16697 }
16698 
16699 
16700 /* Examine all of the expressions associated with a program unit,
16701    assign types to all intermediate expressions, make sure that all
16702    assignments are to compatible types and figure out which names
16703    refer to which functions or subroutines.  It doesn't check code
16704    block, which is handled by gfc_resolve_code.  */
16705 
16706 static void
resolve_types(gfc_namespace * ns)16707 resolve_types (gfc_namespace *ns)
16708 {
16709   gfc_namespace *n;
16710   gfc_charlen *cl;
16711   gfc_data *d;
16712   gfc_equiv *eq;
16713   gfc_namespace* old_ns = gfc_current_ns;
16714 
16715   if (ns->types_resolved)
16716     return;
16717 
16718   /* Check that all IMPLICIT types are ok.  */
16719   if (!ns->seen_implicit_none)
16720     {
16721       unsigned letter;
16722       for (letter = 0; letter != GFC_LETTERS; ++letter)
16723 	if (ns->set_flag[letter]
16724 	    && !resolve_typespec_used (&ns->default_type[letter],
16725 				       &ns->implicit_loc[letter], NULL))
16726 	  return;
16727     }
16728 
16729   gfc_current_ns = ns;
16730 
16731   resolve_entries (ns);
16732 
16733   resolve_common_vars (&ns->blank_common, false);
16734   resolve_common_blocks (ns->common_root);
16735 
16736   resolve_contained_functions (ns);
16737 
16738   if (ns->proc_name && ns->proc_name->attr.flavor == FL_PROCEDURE
16739       && ns->proc_name->attr.if_source == IFSRC_IFBODY)
16740     resolve_formal_arglist (ns->proc_name);
16741 
16742   gfc_traverse_ns (ns, resolve_bind_c_derived_types);
16743 
16744   for (cl = ns->cl_list; cl; cl = cl->next)
16745     resolve_charlen (cl);
16746 
16747   gfc_traverse_ns (ns, resolve_symbol);
16748 
16749   resolve_fntype (ns);
16750 
16751   for (n = ns->contained; n; n = n->sibling)
16752     {
16753       if (gfc_pure (ns->proc_name) && !gfc_pure (n->proc_name))
16754 	gfc_error ("Contained procedure %qs at %L of a PURE procedure must "
16755 		   "also be PURE", n->proc_name->name,
16756 		   &n->proc_name->declared_at);
16757 
16758       resolve_types (n);
16759     }
16760 
16761   forall_flag = 0;
16762   gfc_do_concurrent_flag = 0;
16763   gfc_check_interfaces (ns);
16764 
16765   gfc_traverse_ns (ns, resolve_values);
16766 
16767   if (ns->save_all || !flag_automatic)
16768     gfc_save_all (ns);
16769 
16770   iter_stack = NULL;
16771   for (d = ns->data; d; d = d->next)
16772     resolve_data (d);
16773 
16774   iter_stack = NULL;
16775   gfc_traverse_ns (ns, gfc_formalize_init_value);
16776 
16777   gfc_traverse_ns (ns, gfc_verify_binding_labels);
16778 
16779   for (eq = ns->equiv; eq; eq = eq->next)
16780     resolve_equivalence (eq);
16781 
16782   /* Warn about unused labels.  */
16783   if (warn_unused_label)
16784     warn_unused_fortran_label (ns->st_labels);
16785 
16786   gfc_resolve_uops (ns->uop_root);
16787 
16788   gfc_traverse_ns (ns, gfc_verify_DTIO_procedures);
16789 
16790   gfc_resolve_omp_declare_simd (ns);
16791 
16792   gfc_resolve_omp_udrs (ns->omp_udr_root);
16793 
16794   ns->types_resolved = 1;
16795 
16796   gfc_current_ns = old_ns;
16797 }
16798 
16799 
16800 /* Call gfc_resolve_code recursively.  */
16801 
16802 static void
resolve_codes(gfc_namespace * ns)16803 resolve_codes (gfc_namespace *ns)
16804 {
16805   gfc_namespace *n;
16806   bitmap_obstack old_obstack;
16807 
16808   if (ns->resolved == 1)
16809     return;
16810 
16811   for (n = ns->contained; n; n = n->sibling)
16812     resolve_codes (n);
16813 
16814   gfc_current_ns = ns;
16815 
16816   /* Don't clear 'cs_base' if this is the namespace of a BLOCK construct.  */
16817   if (!(ns->proc_name && ns->proc_name->attr.flavor == FL_LABEL))
16818     cs_base = NULL;
16819 
16820   /* Set to an out of range value.  */
16821   current_entry_id = -1;
16822 
16823   old_obstack = labels_obstack;
16824   bitmap_obstack_initialize (&labels_obstack);
16825 
16826   gfc_resolve_oacc_declare (ns);
16827   gfc_resolve_oacc_routines (ns);
16828   gfc_resolve_omp_local_vars (ns);
16829   gfc_resolve_code (ns->code, ns);
16830 
16831   bitmap_obstack_release (&labels_obstack);
16832   labels_obstack = old_obstack;
16833 }
16834 
16835 
16836 /* This function is called after a complete program unit has been compiled.
16837    Its purpose is to examine all of the expressions associated with a program
16838    unit, assign types to all intermediate expressions, make sure that all
16839    assignments are to compatible types and figure out which names refer to
16840    which functions or subroutines.  */
16841 
16842 void
gfc_resolve(gfc_namespace * ns)16843 gfc_resolve (gfc_namespace *ns)
16844 {
16845   gfc_namespace *old_ns;
16846   code_stack *old_cs_base;
16847   struct gfc_omp_saved_state old_omp_state;
16848 
16849   if (ns->resolved)
16850     return;
16851 
16852   ns->resolved = -1;
16853   old_ns = gfc_current_ns;
16854   old_cs_base = cs_base;
16855 
16856   /* As gfc_resolve can be called during resolution of an OpenMP construct
16857      body, we should clear any state associated to it, so that say NS's
16858      DO loops are not interpreted as OpenMP loops.  */
16859   if (!ns->construct_entities)
16860     gfc_omp_save_and_clear_state (&old_omp_state);
16861 
16862   resolve_types (ns);
16863   component_assignment_level = 0;
16864   resolve_codes (ns);
16865 
16866   gfc_current_ns = old_ns;
16867   cs_base = old_cs_base;
16868   ns->resolved = 1;
16869 
16870   gfc_run_passes (ns);
16871 
16872   if (!ns->construct_entities)
16873     gfc_omp_restore_state (&old_omp_state);
16874 }
16875