OSDN Git Service

d85f23cd2ad68cb504f71fe26e086a4185d70e58
[pf3gnuchains/gcc-fork.git] / gcc / fortran / expr.c
1 /* Routines for manipulation of expression nodes.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3    2009, 2010
4    Free Software Foundation, Inc.
5    Contributed by Andy Vaught
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "gfortran.h"
26 #include "arith.h"
27 #include "match.h"
28 #include "target-memory.h" /* for gfc_convert_boz */
29
30 /* Get a new expr node.  */
31
32 gfc_expr *
33 gfc_get_expr (void)
34 {
35   gfc_expr *e;
36
37   e = XCNEW (gfc_expr);
38   gfc_clear_ts (&e->ts);
39   e->shape = NULL;
40   e->ref = NULL;
41   e->symtree = NULL;
42   e->con_by_offset = NULL;
43   return e;
44 }
45
46
47 /* Free an argument list and everything below it.  */
48
49 void
50 gfc_free_actual_arglist (gfc_actual_arglist *a1)
51 {
52   gfc_actual_arglist *a2;
53
54   while (a1)
55     {
56       a2 = a1->next;
57       gfc_free_expr (a1->expr);
58       gfc_free (a1);
59       a1 = a2;
60     }
61 }
62
63
64 /* Copy an arglist structure and all of the arguments.  */
65
66 gfc_actual_arglist *
67 gfc_copy_actual_arglist (gfc_actual_arglist *p)
68 {
69   gfc_actual_arglist *head, *tail, *new_arg;
70
71   head = tail = NULL;
72
73   for (; p; p = p->next)
74     {
75       new_arg = gfc_get_actual_arglist ();
76       *new_arg = *p;
77
78       new_arg->expr = gfc_copy_expr (p->expr);
79       new_arg->next = NULL;
80
81       if (head == NULL)
82         head = new_arg;
83       else
84         tail->next = new_arg;
85
86       tail = new_arg;
87     }
88
89   return head;
90 }
91
92
93 /* Free a list of reference structures.  */
94
95 void
96 gfc_free_ref_list (gfc_ref *p)
97 {
98   gfc_ref *q;
99   int i;
100
101   for (; p; p = q)
102     {
103       q = p->next;
104
105       switch (p->type)
106         {
107         case REF_ARRAY:
108           for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
109             {
110               gfc_free_expr (p->u.ar.start[i]);
111               gfc_free_expr (p->u.ar.end[i]);
112               gfc_free_expr (p->u.ar.stride[i]);
113             }
114
115           break;
116
117         case REF_SUBSTRING:
118           gfc_free_expr (p->u.ss.start);
119           gfc_free_expr (p->u.ss.end);
120           break;
121
122         case REF_COMPONENT:
123           break;
124         }
125
126       gfc_free (p);
127     }
128 }
129
130
131 /* Workhorse function for gfc_free_expr() that frees everything
132    beneath an expression node, but not the node itself.  This is
133    useful when we want to simplify a node and replace it with
134    something else or the expression node belongs to another structure.  */
135
136 static void
137 free_expr0 (gfc_expr *e)
138 {
139   int n;
140
141   switch (e->expr_type)
142     {
143     case EXPR_CONSTANT:
144       /* Free any parts of the value that need freeing.  */
145       switch (e->ts.type)
146         {
147         case BT_INTEGER:
148           mpz_clear (e->value.integer);
149           break;
150
151         case BT_REAL:
152           mpfr_clear (e->value.real);
153           break;
154
155         case BT_CHARACTER:
156           gfc_free (e->value.character.string);
157           break;
158
159         case BT_COMPLEX:
160           mpc_clear (e->value.complex);
161           break;
162
163         default:
164           break;
165         }
166
167       /* Free the representation.  */
168       if (e->representation.string)
169         gfc_free (e->representation.string);
170
171       break;
172
173     case EXPR_OP:
174       if (e->value.op.op1 != NULL)
175         gfc_free_expr (e->value.op.op1);
176       if (e->value.op.op2 != NULL)
177         gfc_free_expr (e->value.op.op2);
178       break;
179
180     case EXPR_FUNCTION:
181       gfc_free_actual_arglist (e->value.function.actual);
182       break;
183
184     case EXPR_COMPCALL:
185     case EXPR_PPC:
186       gfc_free_actual_arglist (e->value.compcall.actual);
187       break;
188
189     case EXPR_VARIABLE:
190       break;
191
192     case EXPR_ARRAY:
193     case EXPR_STRUCTURE:
194       gfc_free_constructor (e->value.constructor);
195       break;
196
197     case EXPR_SUBSTRING:
198       gfc_free (e->value.character.string);
199       break;
200
201     case EXPR_NULL:
202       break;
203
204     default:
205       gfc_internal_error ("free_expr0(): Bad expr type");
206     }
207
208   /* Free a shape array.  */
209   if (e->shape != NULL)
210     {
211       for (n = 0; n < e->rank; n++)
212         mpz_clear (e->shape[n]);
213
214       gfc_free (e->shape);
215     }
216
217   gfc_free_ref_list (e->ref);
218
219   memset (e, '\0', sizeof (gfc_expr));
220 }
221
222
223 /* Free an expression node and everything beneath it.  */
224
225 void
226 gfc_free_expr (gfc_expr *e)
227 {
228   if (e == NULL)
229     return;
230   if (e->con_by_offset)
231     splay_tree_delete (e->con_by_offset); 
232   free_expr0 (e);
233   gfc_free (e);
234 }
235
236
237 /* Graft the *src expression onto the *dest subexpression.  */
238
239 void
240 gfc_replace_expr (gfc_expr *dest, gfc_expr *src)
241 {
242   free_expr0 (dest);
243   *dest = *src;
244   gfc_free (src);
245 }
246
247
248 /* Try to extract an integer constant from the passed expression node.
249    Returns an error message or NULL if the result is set.  It is
250    tempting to generate an error and return SUCCESS or FAILURE, but
251    failure is OK for some callers.  */
252
253 const char *
254 gfc_extract_int (gfc_expr *expr, int *result)
255 {
256   if (expr->expr_type != EXPR_CONSTANT)
257     return _("Constant expression required at %C");
258
259   if (expr->ts.type != BT_INTEGER)
260     return _("Integer expression required at %C");
261
262   if ((mpz_cmp_si (expr->value.integer, INT_MAX) > 0)
263       || (mpz_cmp_si (expr->value.integer, INT_MIN) < 0))
264     {
265       return _("Integer value too large in expression at %C");
266     }
267
268   *result = (int) mpz_get_si (expr->value.integer);
269
270   return NULL;
271 }
272
273
274 /* Recursively copy a list of reference structures.  */
275
276 gfc_ref *
277 gfc_copy_ref (gfc_ref *src)
278 {
279   gfc_array_ref *ar;
280   gfc_ref *dest;
281
282   if (src == NULL)
283     return NULL;
284
285   dest = gfc_get_ref ();
286   dest->type = src->type;
287
288   switch (src->type)
289     {
290     case REF_ARRAY:
291       ar = gfc_copy_array_ref (&src->u.ar);
292       dest->u.ar = *ar;
293       gfc_free (ar);
294       break;
295
296     case REF_COMPONENT:
297       dest->u.c = src->u.c;
298       break;
299
300     case REF_SUBSTRING:
301       dest->u.ss = src->u.ss;
302       dest->u.ss.start = gfc_copy_expr (src->u.ss.start);
303       dest->u.ss.end = gfc_copy_expr (src->u.ss.end);
304       break;
305     }
306
307   dest->next = gfc_copy_ref (src->next);
308
309   return dest;
310 }
311
312
313 /* Detect whether an expression has any vector index array references.  */
314
315 int
316 gfc_has_vector_index (gfc_expr *e)
317 {
318   gfc_ref *ref;
319   int i;
320   for (ref = e->ref; ref; ref = ref->next)
321     if (ref->type == REF_ARRAY)
322       for (i = 0; i < ref->u.ar.dimen; i++)
323         if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
324           return 1;
325   return 0;
326 }
327
328
329 /* Insert a reference to the component of the given name.
330    Only to be used with CLASS containers.  */
331
332 void
333 gfc_add_component_ref (gfc_expr *e, const char *name)
334 {
335   gfc_ref **tail = &(e->ref);
336   gfc_ref *next = NULL;
337   gfc_symbol *derived = e->symtree->n.sym->ts.u.derived;
338   while (*tail != NULL)
339     {
340       if ((*tail)->type == REF_COMPONENT)
341         derived = (*tail)->u.c.component->ts.u.derived;
342       if ((*tail)->type == REF_ARRAY && (*tail)->next == NULL)
343         break;
344       tail = &((*tail)->next);
345     }
346   if (*tail != NULL && strcmp (name, "$data") == 0)
347     next = *tail;
348   (*tail) = gfc_get_ref();
349   (*tail)->next = next;
350   (*tail)->type = REF_COMPONENT;
351   (*tail)->u.c.sym = derived;
352   (*tail)->u.c.component = gfc_find_component (derived, name, true, true);
353   gcc_assert((*tail)->u.c.component);
354   if (!next)
355     e->ts = (*tail)->u.c.component->ts;
356 }
357
358
359 /* Copy a shape array.  */
360
361 mpz_t *
362 gfc_copy_shape (mpz_t *shape, int rank)
363 {
364   mpz_t *new_shape;
365   int n;
366
367   if (shape == NULL)
368     return NULL;
369
370   new_shape = gfc_get_shape (rank);
371
372   for (n = 0; n < rank; n++)
373     mpz_init_set (new_shape[n], shape[n]);
374
375   return new_shape;
376 }
377
378
379 /* Copy a shape array excluding dimension N, where N is an integer
380    constant expression.  Dimensions are numbered in fortran style --
381    starting with ONE.
382
383    So, if the original shape array contains R elements
384       { s1 ... sN-1  sN  sN+1 ... sR-1 sR}
385    the result contains R-1 elements:
386       { s1 ... sN-1  sN+1    ...  sR-1}
387
388    If anything goes wrong -- N is not a constant, its value is out
389    of range -- or anything else, just returns NULL.  */
390
391 mpz_t *
392 gfc_copy_shape_excluding (mpz_t *shape, int rank, gfc_expr *dim)
393 {
394   mpz_t *new_shape, *s;
395   int i, n;
396
397   if (shape == NULL 
398       || rank <= 1
399       || dim == NULL
400       || dim->expr_type != EXPR_CONSTANT 
401       || dim->ts.type != BT_INTEGER)
402     return NULL;
403
404   n = mpz_get_si (dim->value.integer);
405   n--; /* Convert to zero based index.  */
406   if (n < 0 || n >= rank)
407     return NULL;
408
409   s = new_shape = gfc_get_shape (rank - 1);
410
411   for (i = 0; i < rank; i++)
412     {
413       if (i == n)
414         continue;
415       mpz_init_set (*s, shape[i]);
416       s++;
417     }
418
419   return new_shape;
420 }
421
422
423 /* Given an expression pointer, return a copy of the expression.  This
424    subroutine is recursive.  */
425
426 gfc_expr *
427 gfc_copy_expr (gfc_expr *p)
428 {
429   gfc_expr *q;
430   gfc_char_t *s;
431   char *c;
432
433   if (p == NULL)
434     return NULL;
435
436   q = gfc_get_expr ();
437   *q = *p;
438
439   switch (q->expr_type)
440     {
441     case EXPR_SUBSTRING:
442       s = gfc_get_wide_string (p->value.character.length + 1);
443       q->value.character.string = s;
444       memcpy (s, p->value.character.string,
445               (p->value.character.length + 1) * sizeof (gfc_char_t));
446       break;
447
448     case EXPR_CONSTANT:
449       /* Copy target representation, if it exists.  */
450       if (p->representation.string)
451         {
452           c = XCNEWVEC (char, p->representation.length + 1);
453           q->representation.string = c;
454           memcpy (c, p->representation.string, (p->representation.length + 1));
455         }
456
457       /* Copy the values of any pointer components of p->value.  */
458       switch (q->ts.type)
459         {
460         case BT_INTEGER:
461           mpz_init_set (q->value.integer, p->value.integer);
462           break;
463
464         case BT_REAL:
465           gfc_set_model_kind (q->ts.kind);
466           mpfr_init (q->value.real);
467           mpfr_set (q->value.real, p->value.real, GFC_RND_MODE);
468           break;
469
470         case BT_COMPLEX:
471           gfc_set_model_kind (q->ts.kind);
472           mpc_init2 (q->value.complex, mpfr_get_default_prec());
473           mpc_set (q->value.complex, p->value.complex, GFC_MPC_RND_MODE);
474           break;
475
476         case BT_CHARACTER:
477           if (p->representation.string)
478             q->value.character.string
479               = gfc_char_to_widechar (q->representation.string);
480           else
481             {
482               s = gfc_get_wide_string (p->value.character.length + 1);
483               q->value.character.string = s;
484
485               /* This is the case for the C_NULL_CHAR named constant.  */
486               if (p->value.character.length == 0
487                   && (p->ts.is_c_interop || p->ts.is_iso_c))
488                 {
489                   *s = '\0';
490                   /* Need to set the length to 1 to make sure the NUL
491                      terminator is copied.  */
492                   q->value.character.length = 1;
493                 }
494               else
495                 memcpy (s, p->value.character.string,
496                         (p->value.character.length + 1) * sizeof (gfc_char_t));
497             }
498           break;
499
500         case BT_HOLLERITH:
501         case BT_LOGICAL:
502         case BT_DERIVED:
503         case BT_CLASS:
504           break;                /* Already done.  */
505
506         case BT_PROCEDURE:
507         case BT_VOID:
508            /* Should never be reached.  */
509         case BT_UNKNOWN:
510           gfc_internal_error ("gfc_copy_expr(): Bad expr node");
511           /* Not reached.  */
512         }
513
514       break;
515
516     case EXPR_OP:
517       switch (q->value.op.op)
518         {
519         case INTRINSIC_NOT:
520         case INTRINSIC_PARENTHESES:
521         case INTRINSIC_UPLUS:
522         case INTRINSIC_UMINUS:
523           q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
524           break;
525
526         default:                /* Binary operators.  */
527           q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
528           q->value.op.op2 = gfc_copy_expr (p->value.op.op2);
529           break;
530         }
531
532       break;
533
534     case EXPR_FUNCTION:
535       q->value.function.actual =
536         gfc_copy_actual_arglist (p->value.function.actual);
537       break;
538
539     case EXPR_COMPCALL:
540     case EXPR_PPC:
541       q->value.compcall.actual =
542         gfc_copy_actual_arglist (p->value.compcall.actual);
543       q->value.compcall.tbp = p->value.compcall.tbp;
544       break;
545
546     case EXPR_STRUCTURE:
547     case EXPR_ARRAY:
548       q->value.constructor = gfc_copy_constructor (p->value.constructor);
549       break;
550
551     case EXPR_VARIABLE:
552     case EXPR_NULL:
553       break;
554     }
555
556   q->shape = gfc_copy_shape (p->shape, p->rank);
557
558   q->ref = gfc_copy_ref (p->ref);
559
560   return q;
561 }
562
563
564 /* Return the maximum kind of two expressions.  In general, higher
565    kind numbers mean more precision for numeric types.  */
566
567 int
568 gfc_kind_max (gfc_expr *e1, gfc_expr *e2)
569 {
570   return (e1->ts.kind > e2->ts.kind) ? e1->ts.kind : e2->ts.kind;
571 }
572
573
574 /* Returns nonzero if the type is numeric, zero otherwise.  */
575
576 static int
577 numeric_type (bt type)
578 {
579   return type == BT_COMPLEX || type == BT_REAL || type == BT_INTEGER;
580 }
581
582
583 /* Returns nonzero if the typespec is a numeric type, zero otherwise.  */
584
585 int
586 gfc_numeric_ts (gfc_typespec *ts)
587 {
588   return numeric_type (ts->type);
589 }
590
591
592 /* Returns an expression node that is an integer constant.  */
593
594 gfc_expr *
595 gfc_int_expr (int i)
596 {
597   gfc_expr *p;
598
599   p = gfc_get_expr ();
600
601   p->expr_type = EXPR_CONSTANT;
602   p->ts.type = BT_INTEGER;
603   p->ts.kind = gfc_default_integer_kind;
604
605   p->where = gfc_current_locus;
606   mpz_init_set_si (p->value.integer, i);
607
608   return p;
609 }
610
611
612 /* Returns an expression node that is a logical constant.  */
613
614 gfc_expr *
615 gfc_logical_expr (int i, locus *where)
616 {
617   gfc_expr *p;
618
619   p = gfc_get_expr ();
620
621   p->expr_type = EXPR_CONSTANT;
622   p->ts.type = BT_LOGICAL;
623   p->ts.kind = gfc_default_logical_kind;
624
625   if (where == NULL)
626     where = &gfc_current_locus;
627   p->where = *where;
628   p->value.logical = i;
629
630   return p;
631 }
632
633
634 /* Return an expression node with an optional argument list attached.
635    A variable number of gfc_expr pointers are strung together in an
636    argument list with a NULL pointer terminating the list.  */
637
638 gfc_expr *
639 gfc_build_conversion (gfc_expr *e)
640 {
641   gfc_expr *p;
642
643   p = gfc_get_expr ();
644   p->expr_type = EXPR_FUNCTION;
645   p->symtree = NULL;
646   p->value.function.actual = NULL;
647
648   p->value.function.actual = gfc_get_actual_arglist ();
649   p->value.function.actual->expr = e;
650
651   return p;
652 }
653
654
655 /* Given an expression node with some sort of numeric binary
656    expression, insert type conversions required to make the operands
657    have the same type. Conversion warnings are disabled if wconversion
658    is set to 0.
659
660    The exception is that the operands of an exponential don't have to
661    have the same type.  If possible, the base is promoted to the type
662    of the exponent.  For example, 1**2.3 becomes 1.0**2.3, but
663    1.0**2 stays as it is.  */
664
665 void
666 gfc_type_convert_binary (gfc_expr *e, int wconversion)
667 {
668   gfc_expr *op1, *op2;
669
670   op1 = e->value.op.op1;
671   op2 = e->value.op.op2;
672
673   if (op1->ts.type == BT_UNKNOWN || op2->ts.type == BT_UNKNOWN)
674     {
675       gfc_clear_ts (&e->ts);
676       return;
677     }
678
679   /* Kind conversions of same type.  */
680   if (op1->ts.type == op2->ts.type)
681     {
682       if (op1->ts.kind == op2->ts.kind)
683         {
684           /* No type conversions.  */
685           e->ts = op1->ts;
686           goto done;
687         }
688
689       if (op1->ts.kind > op2->ts.kind)
690         gfc_convert_type_warn (op2, &op1->ts, 2, wconversion);
691       else
692         gfc_convert_type_warn (op1, &op2->ts, 2, wconversion);
693
694       e->ts = op1->ts;
695       goto done;
696     }
697
698   /* Integer combined with real or complex.  */
699   if (op2->ts.type == BT_INTEGER)
700     {
701       e->ts = op1->ts;
702
703       /* Special case for ** operator.  */
704       if (e->value.op.op == INTRINSIC_POWER)
705         goto done;
706
707       gfc_convert_type_warn (e->value.op.op2, &e->ts, 2, wconversion);
708       goto done;
709     }
710
711   if (op1->ts.type == BT_INTEGER)
712     {
713       e->ts = op2->ts;
714       gfc_convert_type_warn (e->value.op.op1, &e->ts, 2, wconversion);
715       goto done;
716     }
717
718   /* Real combined with complex.  */
719   e->ts.type = BT_COMPLEX;
720   if (op1->ts.kind > op2->ts.kind)
721     e->ts.kind = op1->ts.kind;
722   else
723     e->ts.kind = op2->ts.kind;
724   if (op1->ts.type != BT_COMPLEX || op1->ts.kind != e->ts.kind)
725     gfc_convert_type_warn (e->value.op.op1, &e->ts, 2, wconversion);
726   if (op2->ts.type != BT_COMPLEX || op2->ts.kind != e->ts.kind)
727     gfc_convert_type_warn (e->value.op.op2, &e->ts, 2, wconversion);
728
729 done:
730   return;
731 }
732
733
734 static match
735 check_specification_function (gfc_expr *e)
736 {
737   gfc_symbol *sym;
738
739   if (!e->symtree)
740     return MATCH_NO;
741
742   sym = e->symtree->n.sym;
743
744   /* F95, 7.1.6.2; F2003, 7.1.7  */
745   if (sym
746       && sym->attr.function
747       && sym->attr.pure
748       && !sym->attr.intrinsic
749       && !sym->attr.recursive
750       && sym->attr.proc != PROC_INTERNAL
751       && sym->attr.proc != PROC_ST_FUNCTION
752       && sym->attr.proc != PROC_UNKNOWN
753       && sym->formal == NULL)
754     return MATCH_YES;
755
756   return MATCH_NO;
757 }
758
759 /* Function to determine if an expression is constant or not.  This
760    function expects that the expression has already been simplified.  */
761
762 int
763 gfc_is_constant_expr (gfc_expr *e)
764 {
765   gfc_constructor *c;
766   gfc_actual_arglist *arg;
767   int rv;
768
769   if (e == NULL)
770     return 1;
771
772   switch (e->expr_type)
773     {
774     case EXPR_OP:
775       rv = (gfc_is_constant_expr (e->value.op.op1)
776             && (e->value.op.op2 == NULL
777                 || gfc_is_constant_expr (e->value.op.op2)));
778       break;
779
780     case EXPR_VARIABLE:
781       rv = 0;
782       break;
783
784     case EXPR_FUNCTION:
785       /* Specification functions are constant.  */
786       if (check_specification_function (e) == MATCH_YES)
787         {
788           rv = 1;
789           break;
790         }
791
792       /* Call to intrinsic with at least one argument.  */
793       rv = 0;
794       if (e->value.function.isym && e->value.function.actual)
795         {
796           for (arg = e->value.function.actual; arg; arg = arg->next)
797             {
798               if (!gfc_is_constant_expr (arg->expr))
799                 break;
800             }
801           if (arg == NULL)
802             rv = 1;
803         }
804       break;
805
806     case EXPR_CONSTANT:
807     case EXPR_NULL:
808       rv = 1;
809       break;
810
811     case EXPR_SUBSTRING:
812       rv = e->ref == NULL || (gfc_is_constant_expr (e->ref->u.ss.start)
813                               && gfc_is_constant_expr (e->ref->u.ss.end));
814       break;
815
816     case EXPR_STRUCTURE:
817       rv = 0;
818       for (c = e->value.constructor; c; c = c->next)
819         if (!gfc_is_constant_expr (c->expr))
820           break;
821
822       if (c == NULL)
823         rv = 1;
824       break;
825
826     case EXPR_ARRAY:
827       rv = gfc_constant_ac (e);
828       break;
829
830     default:
831       gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
832     }
833
834   return rv;
835 }
836
837
838 /* Is true if an array reference is followed by a component or substring
839    reference.  */
840 bool
841 is_subref_array (gfc_expr * e)
842 {
843   gfc_ref * ref;
844   bool seen_array;
845
846   if (e->expr_type != EXPR_VARIABLE)
847     return false;
848
849   if (e->symtree->n.sym->attr.subref_array_pointer)
850     return true;
851
852   seen_array = false;
853   for (ref = e->ref; ref; ref = ref->next)
854     {
855       if (ref->type == REF_ARRAY
856             && ref->u.ar.type != AR_ELEMENT)
857         seen_array = true;
858
859       if (seen_array
860             && ref->type != REF_ARRAY)
861         return seen_array;
862     }
863   return false;
864 }
865
866
867 /* Try to collapse intrinsic expressions.  */
868
869 static gfc_try
870 simplify_intrinsic_op (gfc_expr *p, int type)
871 {
872   gfc_intrinsic_op op;
873   gfc_expr *op1, *op2, *result;
874
875   if (p->value.op.op == INTRINSIC_USER)
876     return SUCCESS;
877
878   op1 = p->value.op.op1;
879   op2 = p->value.op.op2;
880   op  = p->value.op.op;
881
882   if (gfc_simplify_expr (op1, type) == FAILURE)
883     return FAILURE;
884   if (gfc_simplify_expr (op2, type) == FAILURE)
885     return FAILURE;
886
887   if (!gfc_is_constant_expr (op1)
888       || (op2 != NULL && !gfc_is_constant_expr (op2)))
889     return SUCCESS;
890
891   /* Rip p apart.  */
892   p->value.op.op1 = NULL;
893   p->value.op.op2 = NULL;
894
895   switch (op)
896     {
897     case INTRINSIC_PARENTHESES:
898       result = gfc_parentheses (op1);
899       break;
900
901     case INTRINSIC_UPLUS:
902       result = gfc_uplus (op1);
903       break;
904
905     case INTRINSIC_UMINUS:
906       result = gfc_uminus (op1);
907       break;
908
909     case INTRINSIC_PLUS:
910       result = gfc_add (op1, op2);
911       break;
912
913     case INTRINSIC_MINUS:
914       result = gfc_subtract (op1, op2);
915       break;
916
917     case INTRINSIC_TIMES:
918       result = gfc_multiply (op1, op2);
919       break;
920
921     case INTRINSIC_DIVIDE:
922       result = gfc_divide (op1, op2);
923       break;
924
925     case INTRINSIC_POWER:
926       result = gfc_power (op1, op2);
927       break;
928
929     case INTRINSIC_CONCAT:
930       result = gfc_concat (op1, op2);
931       break;
932
933     case INTRINSIC_EQ:
934     case INTRINSIC_EQ_OS:
935       result = gfc_eq (op1, op2, op);
936       break;
937
938     case INTRINSIC_NE:
939     case INTRINSIC_NE_OS:
940       result = gfc_ne (op1, op2, op);
941       break;
942
943     case INTRINSIC_GT:
944     case INTRINSIC_GT_OS:
945       result = gfc_gt (op1, op2, op);
946       break;
947
948     case INTRINSIC_GE:
949     case INTRINSIC_GE_OS:
950       result = gfc_ge (op1, op2, op);
951       break;
952
953     case INTRINSIC_LT:
954     case INTRINSIC_LT_OS:
955       result = gfc_lt (op1, op2, op);
956       break;
957
958     case INTRINSIC_LE:
959     case INTRINSIC_LE_OS:
960       result = gfc_le (op1, op2, op);
961       break;
962
963     case INTRINSIC_NOT:
964       result = gfc_not (op1);
965       break;
966
967     case INTRINSIC_AND:
968       result = gfc_and (op1, op2);
969       break;
970
971     case INTRINSIC_OR:
972       result = gfc_or (op1, op2);
973       break;
974
975     case INTRINSIC_EQV:
976       result = gfc_eqv (op1, op2);
977       break;
978
979     case INTRINSIC_NEQV:
980       result = gfc_neqv (op1, op2);
981       break;
982
983     default:
984       gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
985     }
986
987   if (result == NULL)
988     {
989       gfc_free_expr (op1);
990       gfc_free_expr (op2);
991       return FAILURE;
992     }
993
994   result->rank = p->rank;
995   result->where = p->where;
996   gfc_replace_expr (p, result);
997
998   return SUCCESS;
999 }
1000
1001
1002 /* Subroutine to simplify constructor expressions.  Mutually recursive
1003    with gfc_simplify_expr().  */
1004
1005 static gfc_try
1006 simplify_constructor (gfc_constructor *c, int type)
1007 {
1008   gfc_expr *p;
1009
1010   for (; c; c = c->next)
1011     {
1012       if (c->iterator
1013           && (gfc_simplify_expr (c->iterator->start, type) == FAILURE
1014               || gfc_simplify_expr (c->iterator->end, type) == FAILURE
1015               || gfc_simplify_expr (c->iterator->step, type) == FAILURE))
1016         return FAILURE;
1017
1018       if (c->expr)
1019         {
1020           /* Try and simplify a copy.  Replace the original if successful
1021              but keep going through the constructor at all costs.  Not
1022              doing so can make a dog's dinner of complicated things.  */
1023           p = gfc_copy_expr (c->expr);
1024
1025           if (gfc_simplify_expr (p, type) == FAILURE)
1026             {
1027               gfc_free_expr (p);
1028               continue;
1029             }
1030
1031           gfc_replace_expr (c->expr, p);
1032         }
1033     }
1034
1035   return SUCCESS;
1036 }
1037
1038
1039 /* Pull a single array element out of an array constructor.  */
1040
1041 static gfc_try
1042 find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
1043                     gfc_constructor **rval)
1044 {
1045   unsigned long nelemen;
1046   int i;
1047   mpz_t delta;
1048   mpz_t offset;
1049   mpz_t span;
1050   mpz_t tmp;
1051   gfc_expr *e;
1052   gfc_try t;
1053
1054   t = SUCCESS;
1055   e = NULL;
1056
1057   mpz_init_set_ui (offset, 0);
1058   mpz_init (delta);
1059   mpz_init (tmp);
1060   mpz_init_set_ui (span, 1);
1061   for (i = 0; i < ar->dimen; i++)
1062     {
1063       if (gfc_reduce_init_expr (ar->as->lower[i]) == FAILURE
1064           || gfc_reduce_init_expr (ar->as->upper[i]) == FAILURE)
1065         {
1066           t = FAILURE;
1067           cons = NULL;
1068           goto depart;
1069         }
1070
1071       e = gfc_copy_expr (ar->start[i]);
1072       if (e->expr_type != EXPR_CONSTANT)
1073         {
1074           cons = NULL;
1075           goto depart;
1076         }
1077
1078       gcc_assert (ar->as->upper[i]->expr_type == EXPR_CONSTANT
1079                   && ar->as->lower[i]->expr_type == EXPR_CONSTANT);
1080
1081       /* Check the bounds.  */
1082       if ((ar->as->upper[i]
1083            && mpz_cmp (e->value.integer,
1084                        ar->as->upper[i]->value.integer) > 0)
1085           || (mpz_cmp (e->value.integer,
1086                        ar->as->lower[i]->value.integer) < 0))
1087         {
1088           gfc_error ("Index in dimension %d is out of bounds "
1089                      "at %L", i + 1, &ar->c_where[i]);
1090           cons = NULL;
1091           t = FAILURE;
1092           goto depart;
1093         }
1094
1095       mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer);
1096       mpz_mul (delta, delta, span);
1097       mpz_add (offset, offset, delta);
1098
1099       mpz_set_ui (tmp, 1);
1100       mpz_add (tmp, tmp, ar->as->upper[i]->value.integer);
1101       mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
1102       mpz_mul (span, span, tmp);
1103     }
1104
1105   for (nelemen = mpz_get_ui (offset); nelemen > 0; nelemen--)
1106     {
1107       if (cons)
1108         {
1109           if (cons->iterator)
1110             {
1111               cons = NULL;
1112               goto depart;
1113             }
1114           cons = cons->next;
1115         }
1116     }
1117
1118 depart:
1119   mpz_clear (delta);
1120   mpz_clear (offset);
1121   mpz_clear (span);
1122   mpz_clear (tmp);
1123   if (e)
1124     gfc_free_expr (e);
1125   *rval = cons;
1126   return t;
1127 }
1128
1129
1130 /* Find a component of a structure constructor.  */
1131
1132 static gfc_constructor *
1133 find_component_ref (gfc_constructor *cons, gfc_ref *ref)
1134 {
1135   gfc_component *comp;
1136   gfc_component *pick;
1137
1138   comp = ref->u.c.sym->components;
1139   pick = ref->u.c.component;
1140   while (comp != pick)
1141     {
1142       comp = comp->next;
1143       cons = cons->next;
1144     }
1145
1146   return cons;
1147 }
1148
1149
1150 /* Replace an expression with the contents of a constructor, removing
1151    the subobject reference in the process.  */
1152
1153 static void
1154 remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
1155 {
1156   gfc_expr *e;
1157
1158   if (cons)
1159     {
1160       e = cons->expr;
1161       cons->expr = NULL;
1162     }
1163   else
1164     e = gfc_copy_expr (p);
1165   e->ref = p->ref->next;
1166   p->ref->next =  NULL;
1167   gfc_replace_expr (p, e);
1168 }
1169
1170
1171 /* Pull an array section out of an array constructor.  */
1172
1173 static gfc_try
1174 find_array_section (gfc_expr *expr, gfc_ref *ref)
1175 {
1176   int idx;
1177   int rank;
1178   int d;
1179   int shape_i;
1180   long unsigned one = 1;
1181   bool incr_ctr;
1182   mpz_t start[GFC_MAX_DIMENSIONS];
1183   mpz_t end[GFC_MAX_DIMENSIONS];
1184   mpz_t stride[GFC_MAX_DIMENSIONS];
1185   mpz_t delta[GFC_MAX_DIMENSIONS];
1186   mpz_t ctr[GFC_MAX_DIMENSIONS];
1187   mpz_t delta_mpz;
1188   mpz_t tmp_mpz;
1189   mpz_t nelts;
1190   mpz_t ptr;
1191   mpz_t index;
1192   gfc_constructor *cons;
1193   gfc_constructor *base;
1194   gfc_expr *begin;
1195   gfc_expr *finish;
1196   gfc_expr *step;
1197   gfc_expr *upper;
1198   gfc_expr *lower;
1199   gfc_constructor *vecsub[GFC_MAX_DIMENSIONS], *c;
1200   gfc_try t;
1201
1202   t = SUCCESS;
1203
1204   base = expr->value.constructor;
1205   expr->value.constructor = NULL;
1206
1207   rank = ref->u.ar.as->rank;
1208
1209   if (expr->shape == NULL)
1210     expr->shape = gfc_get_shape (rank);
1211
1212   mpz_init_set_ui (delta_mpz, one);
1213   mpz_init_set_ui (nelts, one);
1214   mpz_init (tmp_mpz);
1215
1216   /* Do the initialization now, so that we can cleanup without
1217      keeping track of where we were.  */
1218   for (d = 0; d < rank; d++)
1219     {
1220       mpz_init (delta[d]);
1221       mpz_init (start[d]);
1222       mpz_init (end[d]);
1223       mpz_init (ctr[d]);
1224       mpz_init (stride[d]);
1225       vecsub[d] = NULL;
1226     }
1227
1228   /* Build the counters to clock through the array reference.  */
1229   shape_i = 0;
1230   for (d = 0; d < rank; d++)
1231     {
1232       /* Make this stretch of code easier on the eye!  */
1233       begin = ref->u.ar.start[d];
1234       finish = ref->u.ar.end[d];
1235       step = ref->u.ar.stride[d];
1236       lower = ref->u.ar.as->lower[d];
1237       upper = ref->u.ar.as->upper[d];
1238
1239       if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR)  /* Vector subscript.  */
1240         {
1241           gcc_assert (begin);
1242
1243           if (begin->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (begin))
1244             {
1245               t = FAILURE;
1246               goto cleanup;
1247             }
1248
1249           gcc_assert (begin->rank == 1);
1250           /* Zero-sized arrays have no shape and no elements, stop early.  */
1251           if (!begin->shape) 
1252             {
1253               mpz_init_set_ui (nelts, 0);
1254               break;
1255             }
1256
1257           vecsub[d] = begin->value.constructor;
1258           mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1259           mpz_mul (nelts, nelts, begin->shape[0]);
1260           mpz_set (expr->shape[shape_i++], begin->shape[0]);
1261
1262           /* Check bounds.  */
1263           for (c = vecsub[d]; c; c = c->next)
1264             {
1265               if (mpz_cmp (c->expr->value.integer, upper->value.integer) > 0
1266                   || mpz_cmp (c->expr->value.integer,
1267                               lower->value.integer) < 0)
1268                 {
1269                   gfc_error ("index in dimension %d is out of bounds "
1270                              "at %L", d + 1, &ref->u.ar.c_where[d]);
1271                   t = FAILURE;
1272                   goto cleanup;
1273                 }
1274             }
1275         }
1276       else
1277         {
1278           if ((begin && begin->expr_type != EXPR_CONSTANT)
1279               || (finish && finish->expr_type != EXPR_CONSTANT)
1280               || (step && step->expr_type != EXPR_CONSTANT))
1281             {
1282               t = FAILURE;
1283               goto cleanup;
1284             }
1285
1286           /* Obtain the stride.  */
1287           if (step)
1288             mpz_set (stride[d], step->value.integer);
1289           else
1290             mpz_set_ui (stride[d], one);
1291
1292           if (mpz_cmp_ui (stride[d], 0) == 0)
1293             mpz_set_ui (stride[d], one);
1294
1295           /* Obtain the start value for the index.  */
1296           if (begin)
1297             mpz_set (start[d], begin->value.integer);
1298           else
1299             mpz_set (start[d], lower->value.integer);
1300
1301           mpz_set (ctr[d], start[d]);
1302
1303           /* Obtain the end value for the index.  */
1304           if (finish)
1305             mpz_set (end[d], finish->value.integer);
1306           else
1307             mpz_set (end[d], upper->value.integer);
1308
1309           /* Separate 'if' because elements sometimes arrive with
1310              non-null end.  */
1311           if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1312             mpz_set (end [d], begin->value.integer);
1313
1314           /* Check the bounds.  */
1315           if (mpz_cmp (ctr[d], upper->value.integer) > 0
1316               || mpz_cmp (end[d], upper->value.integer) > 0
1317               || mpz_cmp (ctr[d], lower->value.integer) < 0
1318               || mpz_cmp (end[d], lower->value.integer) < 0)
1319             {
1320               gfc_error ("index in dimension %d is out of bounds "
1321                          "at %L", d + 1, &ref->u.ar.c_where[d]);
1322               t = FAILURE;
1323               goto cleanup;
1324             }
1325
1326           /* Calculate the number of elements and the shape.  */
1327           mpz_set (tmp_mpz, stride[d]);
1328           mpz_add (tmp_mpz, end[d], tmp_mpz);
1329           mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1330           mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1331           mpz_mul (nelts, nelts, tmp_mpz);
1332
1333           /* An element reference reduces the rank of the expression; don't
1334              add anything to the shape array.  */
1335           if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT) 
1336             mpz_set (expr->shape[shape_i++], tmp_mpz);
1337         }
1338
1339       /* Calculate the 'stride' (=delta) for conversion of the
1340          counter values into the index along the constructor.  */
1341       mpz_set (delta[d], delta_mpz);
1342       mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1343       mpz_add_ui (tmp_mpz, tmp_mpz, one);
1344       mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1345     }
1346
1347   mpz_init (index);
1348   mpz_init (ptr);
1349   cons = base;
1350
1351   /* Now clock through the array reference, calculating the index in
1352      the source constructor and transferring the elements to the new
1353      constructor.  */  
1354   for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
1355     {
1356       if (ref->u.ar.offset)
1357         mpz_set (ptr, ref->u.ar.offset->value.integer);
1358       else
1359         mpz_init_set_ui (ptr, 0);
1360
1361       incr_ctr = true;
1362       for (d = 0; d < rank; d++)
1363         {
1364           mpz_set (tmp_mpz, ctr[d]);
1365           mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
1366           mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1367           mpz_add (ptr, ptr, tmp_mpz);
1368
1369           if (!incr_ctr) continue;
1370
1371           if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript.  */
1372             {
1373               gcc_assert(vecsub[d]);
1374
1375               if (!vecsub[d]->next)
1376                 vecsub[d] = ref->u.ar.start[d]->value.constructor;
1377               else
1378                 {
1379                   vecsub[d] = vecsub[d]->next;
1380                   incr_ctr = false;
1381                 }
1382               mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1383             }
1384           else
1385             {
1386               mpz_add (ctr[d], ctr[d], stride[d]); 
1387
1388               if (mpz_cmp_ui (stride[d], 0) > 0
1389                   ? mpz_cmp (ctr[d], end[d]) > 0
1390                   : mpz_cmp (ctr[d], end[d]) < 0)
1391                 mpz_set (ctr[d], start[d]);
1392               else
1393                 incr_ctr = false;
1394             }
1395         }
1396
1397       /* There must be a better way of dealing with negative strides
1398          than resetting the index and the constructor pointer!  */ 
1399       if (mpz_cmp (ptr, index) < 0)
1400         {
1401           mpz_set_ui (index, 0);
1402           cons = base;
1403         }
1404
1405       while (cons && cons->next && mpz_cmp (ptr, index) > 0)
1406         {
1407           mpz_add_ui (index, index, one);
1408           cons = cons->next;
1409         }
1410
1411       gfc_append_constructor (expr, gfc_copy_expr (cons->expr));
1412     }
1413
1414   mpz_clear (ptr);
1415   mpz_clear (index);
1416
1417 cleanup:
1418
1419   mpz_clear (delta_mpz);
1420   mpz_clear (tmp_mpz);
1421   mpz_clear (nelts);
1422   for (d = 0; d < rank; d++)
1423     {
1424       mpz_clear (delta[d]);
1425       mpz_clear (start[d]);
1426       mpz_clear (end[d]);
1427       mpz_clear (ctr[d]);
1428       mpz_clear (stride[d]);
1429     }
1430   gfc_free_constructor (base);
1431   return t;
1432 }
1433
1434 /* Pull a substring out of an expression.  */
1435
1436 static gfc_try
1437 find_substring_ref (gfc_expr *p, gfc_expr **newp)
1438 {
1439   int end;
1440   int start;
1441   int length;
1442   gfc_char_t *chr;
1443
1444   if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1445       || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1446     return FAILURE;
1447
1448   *newp = gfc_copy_expr (p);
1449   gfc_free ((*newp)->value.character.string);
1450
1451   end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer);
1452   start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer);
1453   length = end - start + 1;
1454
1455   chr = (*newp)->value.character.string = gfc_get_wide_string (length + 1);
1456   (*newp)->value.character.length = length;
1457   memcpy (chr, &p->value.character.string[start - 1],
1458           length * sizeof (gfc_char_t));
1459   chr[length] = '\0';
1460   return SUCCESS;
1461 }
1462
1463
1464
1465 /* Simplify a subobject reference of a constructor.  This occurs when
1466    parameter variable values are substituted.  */
1467
1468 static gfc_try
1469 simplify_const_ref (gfc_expr *p)
1470 {
1471   gfc_constructor *cons;
1472   gfc_expr *newp;
1473   gfc_ref *last_ref;
1474
1475   while (p->ref)
1476     {
1477       switch (p->ref->type)
1478         {
1479         case REF_ARRAY:
1480           switch (p->ref->u.ar.type)
1481             {
1482             case AR_ELEMENT:
1483               /* <type/kind spec>, parameter :: x(<int>) = scalar_expr
1484                  will generate this.  */
1485               if (p->expr_type != EXPR_ARRAY)
1486                 {
1487                   remove_subobject_ref (p, NULL);
1488                   break;
1489                 }
1490               if (find_array_element (p->value.constructor, &p->ref->u.ar,
1491                                       &cons) == FAILURE)
1492                 return FAILURE;
1493
1494               if (!cons)
1495                 return SUCCESS;
1496
1497               remove_subobject_ref (p, cons);
1498               break;
1499
1500             case AR_SECTION:
1501               if (find_array_section (p, p->ref) == FAILURE)
1502                 return FAILURE;
1503               p->ref->u.ar.type = AR_FULL;
1504
1505             /* Fall through.  */
1506
1507             case AR_FULL:
1508               if (p->ref->next != NULL
1509                   && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
1510                 {
1511                   cons = p->value.constructor;
1512                   for (; cons; cons = cons->next)
1513                     {
1514                       cons->expr->ref = gfc_copy_ref (p->ref->next);
1515                       if (simplify_const_ref (cons->expr) == FAILURE)
1516                         return FAILURE;
1517                     }
1518
1519                   if (p->ts.type == BT_DERIVED
1520                         && p->ref->next
1521                         && p->value.constructor)
1522                     {
1523                       /* There may have been component references.  */
1524                       p->ts = p->value.constructor->expr->ts;
1525                     }
1526
1527                   last_ref = p->ref;
1528                   for (; last_ref->next; last_ref = last_ref->next) {};
1529
1530                   if (p->ts.type == BT_CHARACTER
1531                         && last_ref->type == REF_SUBSTRING)
1532                     {
1533                       /* If this is a CHARACTER array and we possibly took
1534                          a substring out of it, update the type-spec's
1535                          character length according to the first element
1536                          (as all should have the same length).  */
1537                       int string_len;
1538                       if (p->value.constructor)
1539                         {
1540                           const gfc_expr* first = p->value.constructor->expr;
1541                           gcc_assert (first->expr_type == EXPR_CONSTANT);
1542                           gcc_assert (first->ts.type == BT_CHARACTER);
1543                           string_len = first->value.character.length;
1544                         }
1545                       else
1546                         string_len = 0;
1547
1548                       if (!p->ts.u.cl)
1549                         p->ts.u.cl = gfc_new_charlen (p->symtree->n.sym->ns,
1550                                                       NULL);
1551                       else
1552                         gfc_free_expr (p->ts.u.cl->length);
1553
1554                       p->ts.u.cl->length = gfc_int_expr (string_len);
1555                     }
1556                 }
1557               gfc_free_ref_list (p->ref);
1558               p->ref = NULL;
1559               break;
1560
1561             default:
1562               return SUCCESS;
1563             }
1564
1565           break;
1566
1567         case REF_COMPONENT:
1568           cons = find_component_ref (p->value.constructor, p->ref);
1569           remove_subobject_ref (p, cons);
1570           break;
1571
1572         case REF_SUBSTRING:
1573           if (find_substring_ref (p, &newp) == FAILURE)
1574             return FAILURE;
1575
1576           gfc_replace_expr (p, newp);
1577           gfc_free_ref_list (p->ref);
1578           p->ref = NULL;
1579           break;
1580         }
1581     }
1582
1583   return SUCCESS;
1584 }
1585
1586
1587 /* Simplify a chain of references.  */
1588
1589 static gfc_try
1590 simplify_ref_chain (gfc_ref *ref, int type)
1591 {
1592   int n;
1593
1594   for (; ref; ref = ref->next)
1595     {
1596       switch (ref->type)
1597         {
1598         case REF_ARRAY:
1599           for (n = 0; n < ref->u.ar.dimen; n++)
1600             {
1601               if (gfc_simplify_expr (ref->u.ar.start[n], type) == FAILURE)
1602                 return FAILURE;
1603               if (gfc_simplify_expr (ref->u.ar.end[n], type) == FAILURE)
1604                 return FAILURE;
1605               if (gfc_simplify_expr (ref->u.ar.stride[n], type) == FAILURE)
1606                 return FAILURE;
1607             }
1608           break;
1609
1610         case REF_SUBSTRING:
1611           if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1612             return FAILURE;
1613           if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1614             return FAILURE;
1615           break;
1616
1617         default:
1618           break;
1619         }
1620     }
1621   return SUCCESS;
1622 }
1623
1624
1625 /* Try to substitute the value of a parameter variable.  */
1626
1627 static gfc_try
1628 simplify_parameter_variable (gfc_expr *p, int type)
1629 {
1630   gfc_expr *e;
1631   gfc_try t;
1632
1633   e = gfc_copy_expr (p->symtree->n.sym->value);
1634   if (e == NULL)
1635     return FAILURE;
1636
1637   e->rank = p->rank;
1638
1639   /* Do not copy subobject refs for constant.  */
1640   if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1641     e->ref = gfc_copy_ref (p->ref);
1642   t = gfc_simplify_expr (e, type);
1643
1644   /* Only use the simplification if it eliminated all subobject references.  */
1645   if (t == SUCCESS && !e->ref)
1646     gfc_replace_expr (p, e);
1647   else
1648     gfc_free_expr (e);
1649
1650   return t;
1651 }
1652
1653 /* Given an expression, simplify it by collapsing constant
1654    expressions.  Most simplification takes place when the expression
1655    tree is being constructed.  If an intrinsic function is simplified
1656    at some point, we get called again to collapse the result against
1657    other constants.
1658
1659    We work by recursively simplifying expression nodes, simplifying
1660    intrinsic functions where possible, which can lead to further
1661    constant collapsing.  If an operator has constant operand(s), we
1662    rip the expression apart, and rebuild it, hoping that it becomes
1663    something simpler.
1664
1665    The expression type is defined for:
1666      0   Basic expression parsing
1667      1   Simplifying array constructors -- will substitute
1668          iterator values.
1669    Returns FAILURE on error, SUCCESS otherwise.
1670    NOTE: Will return SUCCESS even if the expression can not be simplified.  */
1671
1672 gfc_try
1673 gfc_simplify_expr (gfc_expr *p, int type)
1674 {
1675   gfc_actual_arglist *ap;
1676
1677   if (p == NULL)
1678     return SUCCESS;
1679
1680   switch (p->expr_type)
1681     {
1682     case EXPR_CONSTANT:
1683     case EXPR_NULL:
1684       break;
1685
1686     case EXPR_FUNCTION:
1687       for (ap = p->value.function.actual; ap; ap = ap->next)
1688         if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1689           return FAILURE;
1690
1691       if (p->value.function.isym != NULL
1692           && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1693         return FAILURE;
1694
1695       break;
1696
1697     case EXPR_SUBSTRING:
1698       if (simplify_ref_chain (p->ref, type) == FAILURE)
1699         return FAILURE;
1700
1701       if (gfc_is_constant_expr (p))
1702         {
1703           gfc_char_t *s;
1704           int start, end;
1705
1706           start = 0;
1707           if (p->ref && p->ref->u.ss.start)
1708             {
1709               gfc_extract_int (p->ref->u.ss.start, &start);
1710               start--;  /* Convert from one-based to zero-based.  */
1711             }
1712
1713           end = p->value.character.length;
1714           if (p->ref && p->ref->u.ss.end)
1715             gfc_extract_int (p->ref->u.ss.end, &end);
1716
1717           s = gfc_get_wide_string (end - start + 2);
1718           memcpy (s, p->value.character.string + start,
1719                   (end - start) * sizeof (gfc_char_t));
1720           s[end - start + 1] = '\0';  /* TODO: C-style string.  */
1721           gfc_free (p->value.character.string);
1722           p->value.character.string = s;
1723           p->value.character.length = end - start;
1724           p->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1725           p->ts.u.cl->length = gfc_int_expr (p->value.character.length);
1726           gfc_free_ref_list (p->ref);
1727           p->ref = NULL;
1728           p->expr_type = EXPR_CONSTANT;
1729         }
1730       break;
1731
1732     case EXPR_OP:
1733       if (simplify_intrinsic_op (p, type) == FAILURE)
1734         return FAILURE;
1735       break;
1736
1737     case EXPR_VARIABLE:
1738       /* Only substitute array parameter variables if we are in an
1739          initialization expression, or we want a subsection.  */
1740       if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1741           && (gfc_init_expr || p->ref
1742               || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1743         {
1744           if (simplify_parameter_variable (p, type) == FAILURE)
1745             return FAILURE;
1746           break;
1747         }
1748
1749       if (type == 1)
1750         {
1751           gfc_simplify_iterator_var (p);
1752         }
1753
1754       /* Simplify subcomponent references.  */
1755       if (simplify_ref_chain (p->ref, type) == FAILURE)
1756         return FAILURE;
1757
1758       break;
1759
1760     case EXPR_STRUCTURE:
1761     case EXPR_ARRAY:
1762       if (simplify_ref_chain (p->ref, type) == FAILURE)
1763         return FAILURE;
1764
1765       if (simplify_constructor (p->value.constructor, type) == FAILURE)
1766         return FAILURE;
1767
1768       if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1769           && p->ref->u.ar.type == AR_FULL)
1770           gfc_expand_constructor (p);
1771
1772       if (simplify_const_ref (p) == FAILURE)
1773         return FAILURE;
1774
1775       break;
1776
1777     case EXPR_COMPCALL:
1778     case EXPR_PPC:
1779       gcc_unreachable ();
1780       break;
1781     }
1782
1783   return SUCCESS;
1784 }
1785
1786
1787 /* Returns the type of an expression with the exception that iterator
1788    variables are automatically integers no matter what else they may
1789    be declared as.  */
1790
1791 static bt
1792 et0 (gfc_expr *e)
1793 {
1794   if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1795     return BT_INTEGER;
1796
1797   return e->ts.type;
1798 }
1799
1800
1801 /* Check an intrinsic arithmetic operation to see if it is consistent
1802    with some type of expression.  */
1803
1804 static gfc_try check_init_expr (gfc_expr *);
1805
1806
1807 /* Scalarize an expression for an elemental intrinsic call.  */
1808
1809 static gfc_try
1810 scalarize_intrinsic_call (gfc_expr *e)
1811 {
1812   gfc_actual_arglist *a, *b;
1813   gfc_constructor *args[5], *ctor, *new_ctor;
1814   gfc_expr *expr, *old;
1815   int n, i, rank[5], array_arg;
1816
1817   /* Find which, if any, arguments are arrays.  Assume that the old
1818      expression carries the type information and that the first arg
1819      that is an array expression carries all the shape information.*/
1820   n = array_arg = 0;
1821   a = e->value.function.actual;
1822   for (; a; a = a->next)
1823     {
1824       n++;
1825       if (a->expr->expr_type != EXPR_ARRAY)
1826         continue;
1827       array_arg = n;
1828       expr = gfc_copy_expr (a->expr);
1829       break;
1830     }
1831
1832   if (!array_arg)
1833     return FAILURE;
1834
1835   old = gfc_copy_expr (e);
1836
1837   gfc_free_constructor (expr->value.constructor);
1838   expr->value.constructor = NULL;
1839
1840   expr->ts = old->ts;
1841   expr->where = old->where;
1842   expr->expr_type = EXPR_ARRAY;
1843
1844   /* Copy the array argument constructors into an array, with nulls
1845      for the scalars.  */
1846   n = 0;
1847   a = old->value.function.actual;
1848   for (; a; a = a->next)
1849     {
1850       /* Check that this is OK for an initialization expression.  */
1851       if (a->expr && check_init_expr (a->expr) == FAILURE)
1852         goto cleanup;
1853
1854       rank[n] = 0;
1855       if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
1856         {
1857           rank[n] = a->expr->rank;
1858           ctor = a->expr->symtree->n.sym->value->value.constructor;
1859           args[n] = gfc_copy_constructor (ctor);
1860         }
1861       else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
1862         {
1863           if (a->expr->rank)
1864             rank[n] = a->expr->rank;
1865           else
1866             rank[n] = 1;
1867           args[n] = gfc_copy_constructor (a->expr->value.constructor);
1868         }
1869       else
1870         args[n] = NULL;
1871       n++;
1872     }
1873
1874
1875   /* Using the array argument as the master, step through the array
1876      calling the function for each element and advancing the array
1877      constructors together.  */
1878   ctor = args[array_arg - 1];
1879   new_ctor = NULL;
1880   for (; ctor; ctor = ctor->next)
1881     {
1882           if (expr->value.constructor == NULL)
1883             expr->value.constructor
1884                 = new_ctor = gfc_get_constructor ();
1885           else
1886             {
1887               new_ctor->next = gfc_get_constructor ();
1888               new_ctor = new_ctor->next;
1889             }
1890           new_ctor->expr = gfc_copy_expr (old);
1891           gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
1892           a = NULL;
1893           b = old->value.function.actual;
1894           for (i = 0; i < n; i++)
1895             {
1896               if (a == NULL)
1897                 new_ctor->expr->value.function.actual
1898                         = a = gfc_get_actual_arglist ();
1899               else
1900                 {
1901                   a->next = gfc_get_actual_arglist ();
1902                   a = a->next;
1903                 }
1904               if (args[i])
1905                 a->expr = gfc_copy_expr (args[i]->expr);
1906               else
1907                 a->expr = gfc_copy_expr (b->expr);
1908
1909               b = b->next;
1910             }
1911
1912           /* Simplify the function calls.  If the simplification fails, the
1913              error will be flagged up down-stream or the library will deal
1914              with it.  */
1915           gfc_simplify_expr (new_ctor->expr, 0);
1916
1917           for (i = 0; i < n; i++)
1918             if (args[i])
1919               args[i] = args[i]->next;
1920
1921           for (i = 1; i < n; i++)
1922             if (rank[i] && ((args[i] != NULL && args[array_arg - 1] == NULL)
1923                          || (args[i] == NULL && args[array_arg - 1] != NULL)))
1924               goto compliance;
1925     }
1926
1927   free_expr0 (e);
1928   *e = *expr;
1929   gfc_free_expr (old);
1930   return SUCCESS;
1931
1932 compliance:
1933   gfc_error_now ("elemental function arguments at %C are not compliant");
1934
1935 cleanup:
1936   gfc_free_expr (expr);
1937   gfc_free_expr (old);
1938   return FAILURE;
1939 }
1940
1941
1942 static gfc_try
1943 check_intrinsic_op (gfc_expr *e, gfc_try (*check_function) (gfc_expr *))
1944 {
1945   gfc_expr *op1 = e->value.op.op1;
1946   gfc_expr *op2 = e->value.op.op2;
1947
1948   if ((*check_function) (op1) == FAILURE)
1949     return FAILURE;
1950
1951   switch (e->value.op.op)
1952     {
1953     case INTRINSIC_UPLUS:
1954     case INTRINSIC_UMINUS:
1955       if (!numeric_type (et0 (op1)))
1956         goto not_numeric;
1957       break;
1958
1959     case INTRINSIC_EQ:
1960     case INTRINSIC_EQ_OS:
1961     case INTRINSIC_NE:
1962     case INTRINSIC_NE_OS:
1963     case INTRINSIC_GT:
1964     case INTRINSIC_GT_OS:
1965     case INTRINSIC_GE:
1966     case INTRINSIC_GE_OS:
1967     case INTRINSIC_LT:
1968     case INTRINSIC_LT_OS:
1969     case INTRINSIC_LE:
1970     case INTRINSIC_LE_OS:
1971       if ((*check_function) (op2) == FAILURE)
1972         return FAILURE;
1973       
1974       if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1975           && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
1976         {
1977           gfc_error ("Numeric or CHARACTER operands are required in "
1978                      "expression at %L", &e->where);
1979          return FAILURE;
1980         }
1981       break;
1982
1983     case INTRINSIC_PLUS:
1984     case INTRINSIC_MINUS:
1985     case INTRINSIC_TIMES:
1986     case INTRINSIC_DIVIDE:
1987     case INTRINSIC_POWER:
1988       if ((*check_function) (op2) == FAILURE)
1989         return FAILURE;
1990
1991       if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
1992         goto not_numeric;
1993
1994       break;
1995
1996     case INTRINSIC_CONCAT:
1997       if ((*check_function) (op2) == FAILURE)
1998         return FAILURE;
1999
2000       if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
2001         {
2002           gfc_error ("Concatenation operator in expression at %L "
2003                      "must have two CHARACTER operands", &op1->where);
2004           return FAILURE;
2005         }
2006
2007       if (op1->ts.kind != op2->ts.kind)
2008         {
2009           gfc_error ("Concat operator at %L must concatenate strings of the "
2010                      "same kind", &e->where);
2011           return FAILURE;
2012         }
2013
2014       break;
2015
2016     case INTRINSIC_NOT:
2017       if (et0 (op1) != BT_LOGICAL)
2018         {
2019           gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
2020                      "operand", &op1->where);
2021           return FAILURE;
2022         }
2023
2024       break;
2025
2026     case INTRINSIC_AND:
2027     case INTRINSIC_OR:
2028     case INTRINSIC_EQV:
2029     case INTRINSIC_NEQV:
2030       if ((*check_function) (op2) == FAILURE)
2031         return FAILURE;
2032
2033       if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
2034         {
2035           gfc_error ("LOGICAL operands are required in expression at %L",
2036                      &e->where);
2037           return FAILURE;
2038         }
2039
2040       break;
2041
2042     case INTRINSIC_PARENTHESES:
2043       break;
2044
2045     default:
2046       gfc_error ("Only intrinsic operators can be used in expression at %L",
2047                  &e->where);
2048       return FAILURE;
2049     }
2050
2051   return SUCCESS;
2052
2053 not_numeric:
2054   gfc_error ("Numeric operands are required in expression at %L", &e->where);
2055
2056   return FAILURE;
2057 }
2058
2059 /* F2003, 7.1.7 (3): In init expression, allocatable components
2060    must not be data-initialized.  */
2061 static gfc_try
2062 check_alloc_comp_init (gfc_expr *e)
2063 {
2064   gfc_component *c;
2065   gfc_constructor *ctor;
2066
2067   gcc_assert (e->expr_type == EXPR_STRUCTURE);
2068   gcc_assert (e->ts.type == BT_DERIVED);
2069
2070   for (c = e->ts.u.derived->components, ctor = e->value.constructor;
2071        c; c = c->next, ctor = ctor->next)
2072     {
2073       if (c->attr.allocatable
2074           && ctor->expr->expr_type != EXPR_NULL)
2075         {
2076           gfc_error("Invalid initialization expression for ALLOCATABLE "
2077                     "component '%s' in structure constructor at %L",
2078                     c->name, &ctor->expr->where);
2079           return FAILURE;
2080         }
2081     }
2082
2083   return SUCCESS;
2084 }
2085
2086 static match
2087 check_init_expr_arguments (gfc_expr *e)
2088 {
2089   gfc_actual_arglist *ap;
2090
2091   for (ap = e->value.function.actual; ap; ap = ap->next)
2092     if (check_init_expr (ap->expr) == FAILURE)
2093       return MATCH_ERROR;
2094
2095   return MATCH_YES;
2096 }
2097
2098 static gfc_try check_restricted (gfc_expr *);
2099
2100 /* F95, 7.1.6.1, Initialization expressions, (7)
2101    F2003, 7.1.7 Initialization expression, (8)  */
2102
2103 static match
2104 check_inquiry (gfc_expr *e, int not_restricted)
2105 {
2106   const char *name;
2107   const char *const *functions;
2108
2109   static const char *const inquiry_func_f95[] = {
2110     "lbound", "shape", "size", "ubound",
2111     "bit_size", "len", "kind",
2112     "digits", "epsilon", "huge", "maxexponent", "minexponent",
2113     "precision", "radix", "range", "tiny",
2114     NULL
2115   };
2116
2117   static const char *const inquiry_func_f2003[] = {
2118     "lbound", "shape", "size", "ubound",
2119     "bit_size", "len", "kind",
2120     "digits", "epsilon", "huge", "maxexponent", "minexponent",
2121     "precision", "radix", "range", "tiny",
2122     "new_line", NULL
2123   };
2124
2125   int i;
2126   gfc_actual_arglist *ap;
2127
2128   if (!e->value.function.isym
2129       || !e->value.function.isym->inquiry)
2130     return MATCH_NO;
2131
2132   /* An undeclared parameter will get us here (PR25018).  */
2133   if (e->symtree == NULL)
2134     return MATCH_NO;
2135
2136   name = e->symtree->n.sym->name;
2137
2138   functions = (gfc_option.warn_std & GFC_STD_F2003) 
2139                 ? inquiry_func_f2003 : inquiry_func_f95;
2140
2141   for (i = 0; functions[i]; i++)
2142     if (strcmp (functions[i], name) == 0)
2143       break;
2144
2145   if (functions[i] == NULL)
2146     return MATCH_ERROR;
2147
2148   /* At this point we have an inquiry function with a variable argument.  The
2149      type of the variable might be undefined, but we need it now, because the
2150      arguments of these functions are not allowed to be undefined.  */
2151
2152   for (ap = e->value.function.actual; ap; ap = ap->next)
2153     {
2154       if (!ap->expr)
2155         continue;
2156
2157       if (ap->expr->ts.type == BT_UNKNOWN)
2158         {
2159           if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
2160               && gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns)
2161               == FAILURE)
2162             return MATCH_NO;
2163
2164           ap->expr->ts = ap->expr->symtree->n.sym->ts;
2165         }
2166
2167         /* Assumed character length will not reduce to a constant expression
2168            with LEN, as required by the standard.  */
2169         if (i == 5 && not_restricted
2170             && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
2171             && ap->expr->symtree->n.sym->ts.u.cl->length == NULL)
2172           {
2173             gfc_error ("Assumed character length variable '%s' in constant "
2174                        "expression at %L", e->symtree->n.sym->name, &e->where);
2175               return MATCH_ERROR;
2176           }
2177         else if (not_restricted && check_init_expr (ap->expr) == FAILURE)
2178           return MATCH_ERROR;
2179
2180         if (not_restricted == 0
2181               && ap->expr->expr_type != EXPR_VARIABLE
2182               && check_restricted (ap->expr) == FAILURE)
2183           return MATCH_ERROR;
2184     }
2185
2186   return MATCH_YES;
2187 }
2188
2189
2190 /* F95, 7.1.6.1, Initialization expressions, (5)
2191    F2003, 7.1.7 Initialization expression, (5)  */
2192
2193 static match
2194 check_transformational (gfc_expr *e)
2195 {
2196   static const char * const trans_func_f95[] = {
2197     "repeat", "reshape", "selected_int_kind",
2198     "selected_real_kind", "transfer", "trim", NULL
2199   };
2200
2201   static const char * const trans_func_f2003[] =  {
2202     "all", "any", "count", "dot_product", "matmul", "null", "pack",
2203     "product", "repeat", "reshape", "selected_char_kind", "selected_int_kind",
2204     "selected_real_kind", "spread", "sum", "transfer", "transpose",
2205     "trim", "unpack", NULL
2206   };
2207
2208   int i;
2209   const char *name;
2210   const char *const *functions;
2211
2212   if (!e->value.function.isym
2213       || !e->value.function.isym->transformational)
2214     return MATCH_NO;
2215
2216   name = e->symtree->n.sym->name;
2217
2218   functions = (gfc_option.allow_std & GFC_STD_F2003) 
2219                 ? trans_func_f2003 : trans_func_f95;
2220
2221   /* NULL() is dealt with below.  */
2222   if (strcmp ("null", name) == 0)
2223     return MATCH_NO;
2224
2225   for (i = 0; functions[i]; i++)
2226     if (strcmp (functions[i], name) == 0)
2227        break;
2228
2229   if (functions[i] == NULL)
2230     {
2231       gfc_error("transformational intrinsic '%s' at %L is not permitted "
2232                 "in an initialization expression", name, &e->where);
2233       return MATCH_ERROR;
2234     }
2235
2236   return check_init_expr_arguments (e);
2237 }
2238
2239
2240 /* F95, 7.1.6.1, Initialization expressions, (6)
2241    F2003, 7.1.7 Initialization expression, (6)  */
2242
2243 static match
2244 check_null (gfc_expr *e)
2245 {
2246   if (strcmp ("null", e->symtree->n.sym->name) != 0)
2247     return MATCH_NO;
2248
2249   return check_init_expr_arguments (e);
2250 }
2251
2252
2253 static match
2254 check_elemental (gfc_expr *e)
2255 {
2256   if (!e->value.function.isym
2257       || !e->value.function.isym->elemental)
2258     return MATCH_NO;
2259
2260   if (e->ts.type != BT_INTEGER
2261       && e->ts.type != BT_CHARACTER
2262       && gfc_notify_std (GFC_STD_F2003, "Extension: Evaluation of "
2263                         "nonstandard initialization expression at %L",
2264                         &e->where) == FAILURE)
2265     return MATCH_ERROR;
2266
2267   return check_init_expr_arguments (e);
2268 }
2269
2270
2271 static match
2272 check_conversion (gfc_expr *e)
2273 {
2274   if (!e->value.function.isym
2275       || !e->value.function.isym->conversion)
2276     return MATCH_NO;
2277
2278   return check_init_expr_arguments (e);
2279 }
2280
2281
2282 /* Verify that an expression is an initialization expression.  A side
2283    effect is that the expression tree is reduced to a single constant
2284    node if all goes well.  This would normally happen when the
2285    expression is constructed but function references are assumed to be
2286    intrinsics in the context of initialization expressions.  If
2287    FAILURE is returned an error message has been generated.  */
2288
2289 static gfc_try
2290 check_init_expr (gfc_expr *e)
2291 {
2292   match m;
2293   gfc_try t;
2294
2295   if (e == NULL)
2296     return SUCCESS;
2297
2298   switch (e->expr_type)
2299     {
2300     case EXPR_OP:
2301       t = check_intrinsic_op (e, check_init_expr);
2302       if (t == SUCCESS)
2303         t = gfc_simplify_expr (e, 0);
2304
2305       break;
2306
2307     case EXPR_FUNCTION:
2308       t = FAILURE;
2309
2310       {
2311         gfc_intrinsic_sym* isym;
2312         gfc_symbol* sym;
2313
2314         sym = e->symtree->n.sym;
2315         if (!gfc_is_intrinsic (sym, 0, e->where)
2316             || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES)
2317           {
2318             gfc_error ("Function '%s' in initialization expression at %L "
2319                        "must be an intrinsic function",
2320                        e->symtree->n.sym->name, &e->where);
2321             break;
2322           }
2323
2324         if ((m = check_conversion (e)) == MATCH_NO
2325             && (m = check_inquiry (e, 1)) == MATCH_NO
2326             && (m = check_null (e)) == MATCH_NO
2327             && (m = check_transformational (e)) == MATCH_NO
2328             && (m = check_elemental (e)) == MATCH_NO)
2329           {
2330             gfc_error ("Intrinsic function '%s' at %L is not permitted "
2331                        "in an initialization expression",
2332                        e->symtree->n.sym->name, &e->where);
2333             m = MATCH_ERROR;
2334           }
2335
2336         /* Try to scalarize an elemental intrinsic function that has an
2337            array argument.  */
2338         isym = gfc_find_function (e->symtree->n.sym->name);
2339         if (isym && isym->elemental
2340             && (t = scalarize_intrinsic_call (e)) == SUCCESS)
2341           break;
2342       }
2343
2344       if (m == MATCH_YES)
2345         t = gfc_simplify_expr (e, 0);
2346
2347       break;
2348
2349     case EXPR_VARIABLE:
2350       t = SUCCESS;
2351
2352       if (gfc_check_iter_variable (e) == SUCCESS)
2353         break;
2354
2355       if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2356         {
2357           /* A PARAMETER shall not be used to define itself, i.e.
2358                 REAL, PARAMETER :: x = transfer(0, x)
2359              is invalid.  */
2360           if (!e->symtree->n.sym->value)
2361             {
2362               gfc_error("PARAMETER '%s' is used at %L before its definition "
2363                         "is complete", e->symtree->n.sym->name, &e->where);
2364               t = FAILURE;
2365             }
2366           else
2367             t = simplify_parameter_variable (e, 0);
2368
2369           break;
2370         }
2371
2372       if (gfc_in_match_data ())
2373         break;
2374
2375       t = FAILURE;
2376
2377       if (e->symtree->n.sym->as)
2378         {
2379           switch (e->symtree->n.sym->as->type)
2380             {
2381               case AS_ASSUMED_SIZE:
2382                 gfc_error ("Assumed size array '%s' at %L is not permitted "
2383                            "in an initialization expression",
2384                            e->symtree->n.sym->name, &e->where);
2385                 break;
2386
2387               case AS_ASSUMED_SHAPE:
2388                 gfc_error ("Assumed shape array '%s' at %L is not permitted "
2389                            "in an initialization expression",
2390                            e->symtree->n.sym->name, &e->where);
2391                 break;
2392
2393               case AS_DEFERRED:
2394                 gfc_error ("Deferred array '%s' at %L is not permitted "
2395                            "in an initialization expression",
2396                            e->symtree->n.sym->name, &e->where);
2397                 break;
2398
2399               case AS_EXPLICIT:
2400                 gfc_error ("Array '%s' at %L is a variable, which does "
2401                            "not reduce to a constant expression",
2402                            e->symtree->n.sym->name, &e->where);
2403                 break;
2404
2405               default:
2406                 gcc_unreachable();
2407           }
2408         }
2409       else
2410         gfc_error ("Parameter '%s' at %L has not been declared or is "
2411                    "a variable, which does not reduce to a constant "
2412                    "expression", e->symtree->n.sym->name, &e->where);
2413
2414       break;
2415
2416     case EXPR_CONSTANT:
2417     case EXPR_NULL:
2418       t = SUCCESS;
2419       break;
2420
2421     case EXPR_SUBSTRING:
2422       t = check_init_expr (e->ref->u.ss.start);
2423       if (t == FAILURE)
2424         break;
2425
2426       t = check_init_expr (e->ref->u.ss.end);
2427       if (t == SUCCESS)
2428         t = gfc_simplify_expr (e, 0);
2429
2430       break;
2431
2432     case EXPR_STRUCTURE:
2433       t = e->ts.is_iso_c ? SUCCESS : FAILURE;
2434       if (t == SUCCESS)
2435         break;
2436
2437       t = check_alloc_comp_init (e);
2438       if (t == FAILURE)
2439         break;
2440
2441       t = gfc_check_constructor (e, check_init_expr);
2442       if (t == FAILURE)
2443         break;
2444
2445       break;
2446
2447     case EXPR_ARRAY:
2448       t = gfc_check_constructor (e, check_init_expr);
2449       if (t == FAILURE)
2450         break;
2451
2452       t = gfc_expand_constructor (e);
2453       if (t == FAILURE)
2454         break;
2455
2456       t = gfc_check_constructor_type (e);
2457       break;
2458
2459     default:
2460       gfc_internal_error ("check_init_expr(): Unknown expression type");
2461     }
2462
2463   return t;
2464 }
2465
2466 /* Reduces a general expression to an initialization expression (a constant).
2467    This used to be part of gfc_match_init_expr.
2468    Note that this function doesn't free the given expression on FAILURE.  */
2469
2470 gfc_try
2471 gfc_reduce_init_expr (gfc_expr *expr)
2472 {
2473   gfc_try t;
2474
2475   gfc_init_expr = 1;
2476   t = gfc_resolve_expr (expr);
2477   if (t == SUCCESS)
2478     t = check_init_expr (expr);
2479   gfc_init_expr = 0;
2480
2481   if (t == FAILURE)
2482     return FAILURE;
2483
2484   if (expr->expr_type == EXPR_ARRAY)
2485     {
2486       if (gfc_check_constructor_type (expr) == FAILURE)
2487         return FAILURE;
2488       if (gfc_expand_constructor (expr) == FAILURE)
2489         return FAILURE;
2490     }
2491
2492   return SUCCESS;
2493 }
2494
2495
2496 /* Match an initialization expression.  We work by first matching an
2497    expression, then reducing it to a constant.  The reducing it to 
2498    constant part requires a global variable to flag the prohibition
2499    of a non-integer exponent in -std=f95 mode.  */
2500
2501 bool init_flag = false;
2502
2503 match
2504 gfc_match_init_expr (gfc_expr **result)
2505 {
2506   gfc_expr *expr;
2507   match m;
2508   gfc_try t;
2509
2510   expr = NULL;
2511
2512   init_flag = true;
2513
2514   m = gfc_match_expr (&expr);
2515   if (m != MATCH_YES)
2516     {
2517       init_flag = false;
2518       return m;
2519     }
2520
2521   t = gfc_reduce_init_expr (expr);
2522   if (t != SUCCESS)
2523     {
2524       gfc_free_expr (expr);
2525       init_flag = false;
2526       return MATCH_ERROR;
2527     }
2528
2529   *result = expr;
2530   init_flag = false;
2531
2532   return MATCH_YES;
2533 }
2534
2535
2536 /* Given an actual argument list, test to see that each argument is a
2537    restricted expression and optionally if the expression type is
2538    integer or character.  */
2539
2540 static gfc_try
2541 restricted_args (gfc_actual_arglist *a)
2542 {
2543   for (; a; a = a->next)
2544     {
2545       if (check_restricted (a->expr) == FAILURE)
2546         return FAILURE;
2547     }
2548
2549   return SUCCESS;
2550 }
2551
2552
2553 /************* Restricted/specification expressions *************/
2554
2555
2556 /* Make sure a non-intrinsic function is a specification function.  */
2557
2558 static gfc_try
2559 external_spec_function (gfc_expr *e)
2560 {
2561   gfc_symbol *f;
2562
2563   f = e->value.function.esym;
2564
2565   if (f->attr.proc == PROC_ST_FUNCTION)
2566     {
2567       gfc_error ("Specification function '%s' at %L cannot be a statement "
2568                  "function", f->name, &e->where);
2569       return FAILURE;
2570     }
2571
2572   if (f->attr.proc == PROC_INTERNAL)
2573     {
2574       gfc_error ("Specification function '%s' at %L cannot be an internal "
2575                  "function", f->name, &e->where);
2576       return FAILURE;
2577     }
2578
2579   if (!f->attr.pure && !f->attr.elemental)
2580     {
2581       gfc_error ("Specification function '%s' at %L must be PURE", f->name,
2582                  &e->where);
2583       return FAILURE;
2584     }
2585
2586   if (f->attr.recursive)
2587     {
2588       gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
2589                  f->name, &e->where);
2590       return FAILURE;
2591     }
2592
2593   return restricted_args (e->value.function.actual);
2594 }
2595
2596
2597 /* Check to see that a function reference to an intrinsic is a
2598    restricted expression.  */
2599
2600 static gfc_try
2601 restricted_intrinsic (gfc_expr *e)
2602 {
2603   /* TODO: Check constraints on inquiry functions.  7.1.6.2 (7).  */
2604   if (check_inquiry (e, 0) == MATCH_YES)
2605     return SUCCESS;
2606
2607   return restricted_args (e->value.function.actual);
2608 }
2609
2610
2611 /* Check the expressions of an actual arglist.  Used by check_restricted.  */
2612
2613 static gfc_try
2614 check_arglist (gfc_actual_arglist* arg, gfc_try (*checker) (gfc_expr*))
2615 {
2616   for (; arg; arg = arg->next)
2617     if (checker (arg->expr) == FAILURE)
2618       return FAILURE;
2619
2620   return SUCCESS;
2621 }
2622
2623
2624 /* Check the subscription expressions of a reference chain with a checking
2625    function; used by check_restricted.  */
2626
2627 static gfc_try
2628 check_references (gfc_ref* ref, gfc_try (*checker) (gfc_expr*))
2629 {
2630   int dim;
2631
2632   if (!ref)
2633     return SUCCESS;
2634
2635   switch (ref->type)
2636     {
2637     case REF_ARRAY:
2638       for (dim = 0; dim != ref->u.ar.dimen; ++dim)
2639         {
2640           if (checker (ref->u.ar.start[dim]) == FAILURE)
2641             return FAILURE;
2642           if (checker (ref->u.ar.end[dim]) == FAILURE)
2643             return FAILURE;
2644           if (checker (ref->u.ar.stride[dim]) == FAILURE)
2645             return FAILURE;
2646         }
2647       break;
2648
2649     case REF_COMPONENT:
2650       /* Nothing needed, just proceed to next reference.  */
2651       break;
2652
2653     case REF_SUBSTRING:
2654       if (checker (ref->u.ss.start) == FAILURE)
2655         return FAILURE;
2656       if (checker (ref->u.ss.end) == FAILURE)
2657         return FAILURE;
2658       break;
2659
2660     default:
2661       gcc_unreachable ();
2662       break;
2663     }
2664
2665   return check_references (ref->next, checker);
2666 }
2667
2668
2669 /* Verify that an expression is a restricted expression.  Like its
2670    cousin check_init_expr(), an error message is generated if we
2671    return FAILURE.  */
2672
2673 static gfc_try
2674 check_restricted (gfc_expr *e)
2675 {
2676   gfc_symbol* sym;
2677   gfc_try t;
2678
2679   if (e == NULL)
2680     return SUCCESS;
2681
2682   switch (e->expr_type)
2683     {
2684     case EXPR_OP:
2685       t = check_intrinsic_op (e, check_restricted);
2686       if (t == SUCCESS)
2687         t = gfc_simplify_expr (e, 0);
2688
2689       break;
2690
2691     case EXPR_FUNCTION:
2692       if (e->value.function.esym)
2693         {
2694           t = check_arglist (e->value.function.actual, &check_restricted);
2695           if (t == SUCCESS)
2696             t = external_spec_function (e);
2697         }
2698       else
2699         {
2700           if (e->value.function.isym && e->value.function.isym->inquiry)
2701             t = SUCCESS;
2702           else
2703             t = check_arglist (e->value.function.actual, &check_restricted);
2704
2705           if (t == SUCCESS)
2706             t = restricted_intrinsic (e);
2707         }
2708       break;
2709
2710     case EXPR_VARIABLE:
2711       sym = e->symtree->n.sym;
2712       t = FAILURE;
2713
2714       /* If a dummy argument appears in a context that is valid for a
2715          restricted expression in an elemental procedure, it will have
2716          already been simplified away once we get here.  Therefore we
2717          don't need to jump through hoops to distinguish valid from
2718          invalid cases.  */
2719       if (sym->attr.dummy && sym->ns == gfc_current_ns
2720           && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
2721         {
2722           gfc_error ("Dummy argument '%s' not allowed in expression at %L",
2723                      sym->name, &e->where);
2724           break;
2725         }
2726
2727       if (sym->attr.optional)
2728         {
2729           gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2730                      sym->name, &e->where);
2731           break;
2732         }
2733
2734       if (sym->attr.intent == INTENT_OUT)
2735         {
2736           gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2737                      sym->name, &e->where);
2738           break;
2739         }
2740
2741       /* Check reference chain if any.  */
2742       if (check_references (e->ref, &check_restricted) == FAILURE)
2743         break;
2744
2745       /* gfc_is_formal_arg broadcasts that a formal argument list is being
2746          processed in resolve.c(resolve_formal_arglist).  This is done so
2747          that host associated dummy array indices are accepted (PR23446).
2748          This mechanism also does the same for the specification expressions
2749          of array-valued functions.  */
2750       if (e->error
2751             || sym->attr.in_common
2752             || sym->attr.use_assoc
2753             || sym->attr.dummy
2754             || sym->attr.implied_index
2755             || sym->attr.flavor == FL_PARAMETER
2756             || (sym->ns && sym->ns == gfc_current_ns->parent)
2757             || (sym->ns && gfc_current_ns->parent
2758                   && sym->ns == gfc_current_ns->parent->parent)
2759             || (sym->ns->proc_name != NULL
2760                   && sym->ns->proc_name->attr.flavor == FL_MODULE)
2761             || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2762         {
2763           t = SUCCESS;
2764           break;
2765         }
2766
2767       gfc_error ("Variable '%s' cannot appear in the expression at %L",
2768                  sym->name, &e->where);
2769       /* Prevent a repetition of the error.  */
2770       e->error = 1;
2771       break;
2772
2773     case EXPR_NULL:
2774     case EXPR_CONSTANT:
2775       t = SUCCESS;
2776       break;
2777
2778     case EXPR_SUBSTRING:
2779       t = gfc_specification_expr (e->ref->u.ss.start);
2780       if (t == FAILURE)
2781         break;
2782
2783       t = gfc_specification_expr (e->ref->u.ss.end);
2784       if (t == SUCCESS)
2785         t = gfc_simplify_expr (e, 0);
2786
2787       break;
2788
2789     case EXPR_STRUCTURE:
2790       t = gfc_check_constructor (e, check_restricted);
2791       break;
2792
2793     case EXPR_ARRAY:
2794       t = gfc_check_constructor (e, check_restricted);
2795       break;
2796
2797     default:
2798       gfc_internal_error ("check_restricted(): Unknown expression type");
2799     }
2800
2801   return t;
2802 }
2803
2804
2805 /* Check to see that an expression is a specification expression.  If
2806    we return FAILURE, an error has been generated.  */
2807
2808 gfc_try
2809 gfc_specification_expr (gfc_expr *e)
2810 {
2811
2812   if (e == NULL)
2813     return SUCCESS;
2814
2815   if (e->ts.type != BT_INTEGER)
2816     {
2817       gfc_error ("Expression at %L must be of INTEGER type, found %s",
2818                  &e->where, gfc_basic_typename (e->ts.type));
2819       return FAILURE;
2820     }
2821
2822   if (e->expr_type == EXPR_FUNCTION
2823           && !e->value.function.isym
2824           && !e->value.function.esym
2825           && !gfc_pure (e->symtree->n.sym))
2826     {
2827       gfc_error ("Function '%s' at %L must be PURE",
2828                  e->symtree->n.sym->name, &e->where);
2829       /* Prevent repeat error messages.  */
2830       e->symtree->n.sym->attr.pure = 1;
2831       return FAILURE;
2832     }
2833
2834   if (e->rank != 0)
2835     {
2836       gfc_error ("Expression at %L must be scalar", &e->where);
2837       return FAILURE;
2838     }
2839
2840   if (gfc_simplify_expr (e, 0) == FAILURE)
2841     return FAILURE;
2842
2843   return check_restricted (e);
2844 }
2845
2846
2847 /************** Expression conformance checks.  *************/
2848
2849 /* Given two expressions, make sure that the arrays are conformable.  */
2850
2851 gfc_try
2852 gfc_check_conformance (gfc_expr *op1, gfc_expr *op2, const char *optype_msgid, ...)
2853 {
2854   int op1_flag, op2_flag, d;
2855   mpz_t op1_size, op2_size;
2856   gfc_try t;
2857
2858   va_list argp;
2859   char buffer[240];
2860
2861   if (op1->rank == 0 || op2->rank == 0)
2862     return SUCCESS;
2863
2864   va_start (argp, optype_msgid);
2865   vsnprintf (buffer, 240, optype_msgid, argp);
2866   va_end (argp);
2867
2868   if (op1->rank != op2->rank)
2869     {
2870       gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(buffer),
2871                  op1->rank, op2->rank, &op1->where);
2872       return FAILURE;
2873     }
2874
2875   t = SUCCESS;
2876
2877   for (d = 0; d < op1->rank; d++)
2878     {
2879       op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2880       op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2881
2882       if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2883         {
2884           gfc_error ("Different shape for %s at %L on dimension %d "
2885                      "(%d and %d)", _(buffer), &op1->where, d + 1,
2886                      (int) mpz_get_si (op1_size),
2887                      (int) mpz_get_si (op2_size));
2888
2889           t = FAILURE;
2890         }
2891
2892       if (op1_flag)
2893         mpz_clear (op1_size);
2894       if (op2_flag)
2895         mpz_clear (op2_size);
2896
2897       if (t == FAILURE)
2898         return FAILURE;
2899     }
2900
2901   return SUCCESS;
2902 }
2903
2904
2905 /* Given an assignable expression and an arbitrary expression, make
2906    sure that the assignment can take place.  */
2907
2908 gfc_try
2909 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
2910 {
2911   gfc_symbol *sym;
2912   gfc_ref *ref;
2913   int has_pointer;
2914
2915   sym = lvalue->symtree->n.sym;
2916
2917   /* Check INTENT(IN), unless the object itself is the component or
2918      sub-component of a pointer.  */
2919   has_pointer = sym->attr.pointer;
2920
2921   for (ref = lvalue->ref; ref; ref = ref->next)
2922     if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
2923       {
2924         has_pointer = 1;
2925         break;
2926       }
2927
2928   if (!has_pointer && sym->attr.intent == INTENT_IN)
2929     {
2930       gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2931                  sym->name, &lvalue->where);
2932       return FAILURE;
2933     }
2934
2935   /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2936      variable local to a function subprogram.  Its existence begins when
2937      execution of the function is initiated and ends when execution of the
2938      function is terminated...
2939      Therefore, the left hand side is no longer a variable, when it is:  */
2940   if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
2941       && !sym->attr.external)
2942     {
2943       bool bad_proc;
2944       bad_proc = false;
2945
2946       /* (i) Use associated;  */
2947       if (sym->attr.use_assoc)
2948         bad_proc = true;
2949
2950       /* (ii) The assignment is in the main program; or  */
2951       if (gfc_current_ns->proc_name->attr.is_main_program)
2952         bad_proc = true;
2953
2954       /* (iii) A module or internal procedure...  */
2955       if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2956            || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2957           && gfc_current_ns->parent
2958           && (!(gfc_current_ns->parent->proc_name->attr.function
2959                 || gfc_current_ns->parent->proc_name->attr.subroutine)
2960               || gfc_current_ns->parent->proc_name->attr.is_main_program))
2961         {
2962           /* ... that is not a function...  */ 
2963           if (!gfc_current_ns->proc_name->attr.function)
2964             bad_proc = true;
2965
2966           /* ... or is not an entry and has a different name.  */
2967           if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2968             bad_proc = true;
2969         }
2970
2971       /* (iv) Host associated and not the function symbol or the
2972               parent result.  This picks up sibling references, which
2973               cannot be entries.  */
2974       if (!sym->attr.entry
2975             && sym->ns == gfc_current_ns->parent
2976             && sym != gfc_current_ns->proc_name
2977             && sym != gfc_current_ns->parent->proc_name->result)
2978         bad_proc = true;
2979
2980       if (bad_proc)
2981         {
2982           gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2983           return FAILURE;
2984         }
2985     }
2986
2987   if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2988     {
2989       gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2990                  lvalue->rank, rvalue->rank, &lvalue->where);
2991       return FAILURE;
2992     }
2993
2994   if (lvalue->ts.type == BT_UNKNOWN)
2995     {
2996       gfc_error ("Variable type is UNKNOWN in assignment at %L",
2997                  &lvalue->where);
2998       return FAILURE;
2999     }
3000
3001   if (rvalue->expr_type == EXPR_NULL)
3002     {  
3003       if (has_pointer && (ref == NULL || ref->next == NULL)
3004           && lvalue->symtree->n.sym->attr.data)
3005         return SUCCESS;
3006       else
3007         {
3008           gfc_error ("NULL appears on right-hand side in assignment at %L",
3009                      &rvalue->where);
3010           return FAILURE;
3011         }
3012     }
3013
3014   /* This is possibly a typo: x = f() instead of x => f().  */
3015   if (gfc_option.warn_surprising 
3016       && rvalue->expr_type == EXPR_FUNCTION
3017       && rvalue->symtree->n.sym->attr.pointer)
3018     gfc_warning ("POINTER valued function appears on right-hand side of "
3019                  "assignment at %L", &rvalue->where);
3020
3021   /* Check size of array assignments.  */
3022   if (lvalue->rank != 0 && rvalue->rank != 0
3023       && gfc_check_conformance (lvalue, rvalue, "array assignment") != SUCCESS)
3024     return FAILURE;
3025
3026   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
3027       && lvalue->symtree->n.sym->attr.data
3028       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L used to "
3029                          "initialize non-integer variable '%s'",
3030                          &rvalue->where, lvalue->symtree->n.sym->name)
3031          == FAILURE)
3032     return FAILURE;
3033   else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
3034       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L outside "
3035                          "a DATA statement and outside INT/REAL/DBLE/CMPLX",
3036                          &rvalue->where) == FAILURE)
3037     return FAILURE;
3038
3039   /* Handle the case of a BOZ literal on the RHS.  */
3040   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
3041     {
3042       int rc;
3043       if (gfc_option.warn_surprising)
3044         gfc_warning ("BOZ literal at %L is bitwise transferred "
3045                      "non-integer symbol '%s'", &rvalue->where,
3046                      lvalue->symtree->n.sym->name);
3047       if (!gfc_convert_boz (rvalue, &lvalue->ts))
3048         return FAILURE;
3049       if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
3050         {
3051           if (rc == ARITH_UNDERFLOW)
3052             gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
3053                        ". This check can be disabled with the option "
3054                        "-fno-range-check", &rvalue->where);
3055           else if (rc == ARITH_OVERFLOW)
3056             gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
3057                        ". This check can be disabled with the option "
3058                        "-fno-range-check", &rvalue->where);
3059           else if (rc == ARITH_NAN)
3060             gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
3061                        ". This check can be disabled with the option "
3062                        "-fno-range-check", &rvalue->where);
3063           return FAILURE;
3064         }
3065     }
3066
3067   if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
3068     return SUCCESS;
3069
3070   /* Only DATA Statements come here.  */
3071   if (!conform)
3072     {
3073       /* Numeric can be converted to any other numeric. And Hollerith can be
3074          converted to any other type.  */
3075       if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
3076           || rvalue->ts.type == BT_HOLLERITH)
3077         return SUCCESS;
3078
3079       if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
3080         return SUCCESS;
3081
3082       gfc_error ("Incompatible types in DATA statement at %L; attempted "
3083                  "conversion of %s to %s", &lvalue->where,
3084                  gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3085
3086       return FAILURE;
3087     }
3088
3089   /* Assignment is the only case where character variables of different
3090      kind values can be converted into one another.  */
3091   if (lvalue->ts.type == BT_CHARACTER && rvalue->ts.type == BT_CHARACTER)
3092     {
3093       if (lvalue->ts.kind != rvalue->ts.kind)
3094         gfc_convert_chartype (rvalue, &lvalue->ts);
3095
3096       return SUCCESS;
3097     }
3098
3099   return gfc_convert_type (rvalue, &lvalue->ts, 1);
3100 }
3101
3102
3103 /* Check that a pointer assignment is OK.  We first check lvalue, and
3104    we only check rvalue if it's not an assignment to NULL() or a
3105    NULLIFY statement.  */
3106
3107 gfc_try
3108 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
3109 {
3110   symbol_attribute attr;
3111   gfc_ref *ref;
3112   int is_pure;
3113   int pointer, check_intent_in, proc_pointer;
3114
3115   if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN
3116       && !lvalue->symtree->n.sym->attr.proc_pointer)
3117     {
3118       gfc_error ("Pointer assignment target is not a POINTER at %L",
3119                  &lvalue->where);
3120       return FAILURE;
3121     }
3122
3123   if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
3124       && lvalue->symtree->n.sym->attr.use_assoc
3125       && !lvalue->symtree->n.sym->attr.proc_pointer)
3126     {
3127       gfc_error ("'%s' in the pointer assignment at %L cannot be an "
3128                  "l-value since it is a procedure",
3129                  lvalue->symtree->n.sym->name, &lvalue->where);
3130       return FAILURE;
3131     }
3132
3133
3134   /* Check INTENT(IN), unless the object itself is the component or
3135      sub-component of a pointer.  */
3136   check_intent_in = 1;
3137   pointer = lvalue->symtree->n.sym->attr.pointer;
3138   proc_pointer = lvalue->symtree->n.sym->attr.proc_pointer;
3139
3140   for (ref = lvalue->ref; ref; ref = ref->next)
3141     {
3142       if (pointer)
3143         check_intent_in = 0;
3144
3145       if (ref->type == REF_COMPONENT)
3146         {
3147           pointer = ref->u.c.component->attr.pointer;
3148           proc_pointer = ref->u.c.component->attr.proc_pointer;
3149         }
3150
3151       if (ref->type == REF_ARRAY && ref->next == NULL)
3152         {
3153           if (ref->u.ar.type == AR_FULL)
3154             break;
3155
3156           if (ref->u.ar.type != AR_SECTION)
3157             {
3158               gfc_error ("Expected bounds specification for '%s' at %L",
3159                          lvalue->symtree->n.sym->name, &lvalue->where);
3160               return FAILURE;
3161             }
3162
3163           if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Bounds "
3164                               "specification for '%s' in pointer assignment "
3165                               "at %L", lvalue->symtree->n.sym->name,
3166                               &lvalue->where) == FAILURE)
3167             return FAILURE;
3168
3169           gfc_error ("Pointer bounds remapping at %L is not yet implemented "
3170                      "in gfortran", &lvalue->where);
3171           /* TODO: See PR 29785. Add checks that all lbounds are specified and
3172              either never or always the upper-bound; strides shall not be
3173              present.  */
3174           return FAILURE;
3175         }
3176     }
3177
3178   if (check_intent_in && lvalue->symtree->n.sym->attr.intent == INTENT_IN)
3179     {
3180       gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
3181                  lvalue->symtree->n.sym->name, &lvalue->where);
3182       return FAILURE;
3183     }
3184
3185   if (!pointer && !proc_pointer
3186         && !(lvalue->ts.type == BT_CLASS
3187                 && lvalue->ts.u.derived->components->attr.pointer))
3188     {
3189       gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
3190       return FAILURE;
3191     }
3192
3193   is_pure = gfc_pure (NULL);
3194
3195   if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym)
3196         && lvalue->symtree->n.sym->value != rvalue)
3197     {
3198       gfc_error ("Bad pointer object in PURE procedure at %L", &lvalue->where);
3199       return FAILURE;
3200     }
3201
3202   /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
3203      kind, etc for lvalue and rvalue must match, and rvalue must be a
3204      pure variable if we're in a pure function.  */
3205   if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
3206     return SUCCESS;
3207
3208   /* Checks on rvalue for procedure pointer assignments.  */
3209   if (proc_pointer)
3210     {
3211       char err[200];
3212       gfc_symbol *s1,*s2;
3213       gfc_component *comp;
3214       const char *name;
3215
3216       attr = gfc_expr_attr (rvalue);
3217       if (!((rvalue->expr_type == EXPR_NULL)
3218             || (rvalue->expr_type == EXPR_FUNCTION && attr.proc_pointer)
3219             || (rvalue->expr_type == EXPR_VARIABLE && attr.proc_pointer)
3220             || (rvalue->expr_type == EXPR_VARIABLE
3221                 && attr.flavor == FL_PROCEDURE)))
3222         {
3223           gfc_error ("Invalid procedure pointer assignment at %L",
3224                      &rvalue->where);
3225           return FAILURE;
3226         }
3227       if (attr.abstract)
3228         {
3229           gfc_error ("Abstract interface '%s' is invalid "
3230                      "in procedure pointer assignment at %L",
3231                      rvalue->symtree->name, &rvalue->where);
3232           return FAILURE;
3233         }
3234       /* Check for C727.  */
3235       if (attr.flavor == FL_PROCEDURE)
3236         {
3237           if (attr.proc == PROC_ST_FUNCTION)
3238             {
3239               gfc_error ("Statement function '%s' is invalid "
3240                          "in procedure pointer assignment at %L",
3241                          rvalue->symtree->name, &rvalue->where);
3242               return FAILURE;
3243             }
3244           if (attr.proc == PROC_INTERNAL &&
3245               gfc_notify_std (GFC_STD_F2008, "Internal procedure '%s' is "
3246                               "invalid in procedure pointer assignment at %L",
3247                               rvalue->symtree->name, &rvalue->where) == FAILURE)
3248             return FAILURE;
3249         }
3250
3251       /* Ensure that the calling convention is the same. As other attributes
3252          such as DLLEXPORT may differ, one explicitly only tests for the
3253          calling conventions.  */
3254       if (rvalue->expr_type == EXPR_VARIABLE
3255           && lvalue->symtree->n.sym->attr.ext_attr
3256                != rvalue->symtree->n.sym->attr.ext_attr)
3257         {
3258           symbol_attribute calls;
3259
3260           calls.ext_attr = 0;
3261           gfc_add_ext_attribute (&calls, EXT_ATTR_CDECL, NULL);
3262           gfc_add_ext_attribute (&calls, EXT_ATTR_STDCALL, NULL);
3263           gfc_add_ext_attribute (&calls, EXT_ATTR_FASTCALL, NULL);
3264
3265           if ((calls.ext_attr & lvalue->symtree->n.sym->attr.ext_attr)
3266               != (calls.ext_attr & rvalue->symtree->n.sym->attr.ext_attr))
3267             {
3268               gfc_error ("Mismatch in the procedure pointer assignment "
3269                          "at %L: mismatch in the calling convention",
3270                          &rvalue->where);
3271           return FAILURE;
3272             }
3273         }
3274
3275       if (gfc_is_proc_ptr_comp (lvalue, &comp))
3276         s1 = comp->ts.interface;
3277       else
3278         s1 = lvalue->symtree->n.sym;
3279
3280       if (gfc_is_proc_ptr_comp (rvalue, &comp))
3281         {
3282           s2 = comp->ts.interface;
3283           name = comp->name;
3284         }
3285       else if (rvalue->expr_type == EXPR_FUNCTION)
3286         {
3287           s2 = rvalue->symtree->n.sym->result;
3288           name = rvalue->symtree->n.sym->result->name;
3289         }
3290       else
3291         {
3292           s2 = rvalue->symtree->n.sym;
3293           name = rvalue->symtree->n.sym->name;
3294         }
3295
3296       if (s1 && s2 && !gfc_compare_interfaces (s1, s2, name, 0, 1,
3297                                                err, sizeof(err)))
3298         {
3299           gfc_error ("Interface mismatch in procedure pointer assignment "
3300                      "at %L: %s", &rvalue->where, err);
3301           return FAILURE;
3302         }
3303
3304       return SUCCESS;
3305     }
3306
3307   if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
3308     {
3309       gfc_error ("Different types in pointer assignment at %L; attempted "
3310                  "assignment of %s to %s", &lvalue->where, 
3311                  gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3312       return FAILURE;
3313     }
3314
3315   if (lvalue->ts.type != BT_CLASS && lvalue->ts.kind != rvalue->ts.kind)
3316     {
3317       gfc_error ("Different kind type parameters in pointer "
3318                  "assignment at %L", &lvalue->where);
3319       return FAILURE;
3320     }
3321
3322   if (lvalue->rank != rvalue->rank)
3323     {
3324       gfc_error ("Different ranks in pointer assignment at %L",
3325                  &lvalue->where);
3326       return FAILURE;
3327     }
3328
3329   /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
3330   if (rvalue->expr_type == EXPR_NULL)
3331     return SUCCESS;
3332
3333   if (lvalue->ts.type == BT_CHARACTER)
3334     {
3335       gfc_try t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment");
3336       if (t == FAILURE)
3337         return FAILURE;
3338     }
3339
3340   if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
3341     lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
3342
3343   attr = gfc_expr_attr (rvalue);
3344   if (!attr.target && !attr.pointer)
3345     {
3346       gfc_error ("Pointer assignment target is neither TARGET "
3347                  "nor POINTER at %L", &rvalue->where);
3348       return FAILURE;
3349     }
3350
3351   if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3352     {
3353       gfc_error ("Bad target in pointer assignment in PURE "
3354                  "procedure at %L", &rvalue->where);
3355     }
3356
3357   if (gfc_has_vector_index (rvalue))
3358     {
3359       gfc_error ("Pointer assignment with vector subscript "
3360                  "on rhs at %L", &rvalue->where);
3361       return FAILURE;
3362     }
3363
3364   if (attr.is_protected && attr.use_assoc
3365       && !(attr.pointer || attr.proc_pointer))
3366     {
3367       gfc_error ("Pointer assignment target has PROTECTED "
3368                  "attribute at %L", &rvalue->where);
3369       return FAILURE;
3370     }
3371
3372   return SUCCESS;
3373 }
3374
3375
3376 /* Relative of gfc_check_assign() except that the lvalue is a single
3377    symbol.  Used for initialization assignments.  */
3378
3379 gfc_try
3380 gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
3381 {
3382   gfc_expr lvalue;
3383   gfc_try r;
3384
3385   memset (&lvalue, '\0', sizeof (gfc_expr));
3386
3387   lvalue.expr_type = EXPR_VARIABLE;
3388   lvalue.ts = sym->ts;
3389   if (sym->as)
3390     lvalue.rank = sym->as->rank;
3391   lvalue.symtree = (gfc_symtree *) gfc_getmem (sizeof (gfc_symtree));
3392   lvalue.symtree->n.sym = sym;
3393   lvalue.where = sym->declared_at;
3394
3395   if (sym->attr.pointer || sym->attr.proc_pointer
3396       || (sym->ts.type == BT_CLASS 
3397           && sym->ts.u.derived->components->attr.pointer
3398           && rvalue->expr_type == EXPR_NULL))
3399     r = gfc_check_pointer_assign (&lvalue, rvalue);
3400   else
3401     r = gfc_check_assign (&lvalue, rvalue, 1);
3402
3403   gfc_free (lvalue.symtree);
3404
3405   return r;
3406 }
3407
3408
3409 /* Get an expression for a default initializer.  */
3410
3411 gfc_expr *
3412 gfc_default_initializer (gfc_typespec *ts)
3413 {
3414   gfc_constructor *tail;
3415   gfc_expr *init;
3416   gfc_component *c;
3417
3418   /* See if we have a default initializer.  */
3419   for (c = ts->u.derived->components; c; c = c->next)
3420     if (c->initializer || c->attr.allocatable)
3421       break;
3422
3423   if (!c)
3424     return NULL;
3425
3426   /* Build the constructor.  */
3427   init = gfc_get_expr ();
3428   init->expr_type = EXPR_STRUCTURE;
3429   init->ts = *ts;
3430   init->where = ts->u.derived->declared_at;
3431
3432   tail = NULL;
3433   for (c = ts->u.derived->components; c; c = c->next)
3434     {
3435       if (tail == NULL)
3436         init->value.constructor = tail = gfc_get_constructor ();
3437       else
3438         {
3439           tail->next = gfc_get_constructor ();
3440           tail = tail->next;
3441         }
3442
3443       if (c->initializer)
3444         tail->expr = gfc_copy_expr (c->initializer);
3445
3446       if (c->attr.allocatable)
3447         {
3448           tail->expr = gfc_get_expr ();
3449           tail->expr->expr_type = EXPR_NULL;
3450           tail->expr->ts = c->ts;
3451         }
3452     }
3453   return init;
3454 }
3455
3456
3457 /* Given a symbol, create an expression node with that symbol as a
3458    variable. If the symbol is array valued, setup a reference of the
3459    whole array.  */
3460
3461 gfc_expr *
3462 gfc_get_variable_expr (gfc_symtree *var)
3463 {
3464   gfc_expr *e;
3465
3466   e = gfc_get_expr ();
3467   e->expr_type = EXPR_VARIABLE;
3468   e->symtree = var;
3469   e->ts = var->n.sym->ts;
3470
3471   if (var->n.sym->as != NULL)
3472     {
3473       e->rank = var->n.sym->as->rank;
3474       e->ref = gfc_get_ref ();
3475       e->ref->type = REF_ARRAY;
3476       e->ref->u.ar.type = AR_FULL;
3477     }
3478
3479   return e;
3480 }
3481
3482
3483 /* Returns the array_spec of a full array expression.  A NULL is
3484    returned otherwise.  */
3485 gfc_array_spec *
3486 gfc_get_full_arrayspec_from_expr (gfc_expr *expr)
3487 {
3488   gfc_array_spec *as;
3489   gfc_ref *ref;
3490
3491   if (expr->rank == 0)
3492     return NULL;
3493
3494   /* Follow any component references.  */
3495   if (expr->expr_type == EXPR_VARIABLE
3496       || expr->expr_type == EXPR_CONSTANT)
3497     {
3498       as = expr->symtree->n.sym->as;
3499       for (ref = expr->ref; ref; ref = ref->next)
3500         {
3501           switch (ref->type)
3502             {
3503             case REF_COMPONENT:
3504               as = ref->u.c.component->as;
3505               continue;
3506
3507             case REF_SUBSTRING:
3508               continue;
3509
3510             case REF_ARRAY:
3511               {
3512                 switch (ref->u.ar.type)
3513                   {
3514                   case AR_ELEMENT:
3515                   case AR_SECTION:
3516                   case AR_UNKNOWN:
3517                     as = NULL;
3518                     continue;
3519
3520                   case AR_FULL:
3521                     break;
3522                   }
3523                 break;
3524               }
3525             }
3526         }
3527     }
3528   else
3529     as = NULL;
3530
3531   return as;
3532 }
3533
3534
3535 /* General expression traversal function.  */
3536
3537 bool
3538 gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
3539                    bool (*func)(gfc_expr *, gfc_symbol *, int*),
3540                    int f)
3541 {
3542   gfc_array_ref ar;
3543   gfc_ref *ref;
3544   gfc_actual_arglist *args;
3545   gfc_constructor *c;
3546   int i;
3547
3548   if (!expr)
3549     return false;
3550
3551   if ((*func) (expr, sym, &f))
3552     return true;
3553
3554   if (expr->ts.type == BT_CHARACTER
3555         && expr->ts.u.cl
3556         && expr->ts.u.cl->length
3557         && expr->ts.u.cl->length->expr_type != EXPR_CONSTANT
3558         && gfc_traverse_expr (expr->ts.u.cl->length, sym, func, f))
3559     return true;
3560
3561   switch (expr->expr_type)
3562     {
3563     case EXPR_FUNCTION:
3564       for (args = expr->value.function.actual; args; args = args->next)
3565         {
3566           if (gfc_traverse_expr (args->expr, sym, func, f))
3567             return true;
3568         }
3569       break;
3570
3571     case EXPR_VARIABLE:
3572     case EXPR_CONSTANT:
3573     case EXPR_NULL:
3574     case EXPR_SUBSTRING:
3575       break;
3576
3577     case EXPR_STRUCTURE:
3578     case EXPR_ARRAY:
3579       for (c = expr->value.constructor; c; c = c->next)
3580         {
3581           if (gfc_traverse_expr (c->expr, sym, func, f))
3582             return true;
3583           if (c->iterator)
3584             {
3585               if (gfc_traverse_expr (c->iterator->var, sym, func, f))
3586                 return true;
3587               if (gfc_traverse_expr (c->iterator->start, sym, func, f))
3588                 return true;
3589               if (gfc_traverse_expr (c->iterator->end, sym, func, f))
3590                 return true;
3591               if (gfc_traverse_expr (c->iterator->step, sym, func, f))
3592                 return true;
3593             }
3594         }
3595       break;
3596
3597     case EXPR_OP:
3598       if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
3599         return true;
3600       if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
3601         return true;
3602       break;
3603
3604     default:
3605       gcc_unreachable ();
3606       break;
3607     }
3608
3609   ref = expr->ref;
3610   while (ref != NULL)
3611     {
3612       switch (ref->type)
3613         {
3614         case  REF_ARRAY:
3615           ar = ref->u.ar;
3616           for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
3617             {
3618               if (gfc_traverse_expr (ar.start[i], sym, func, f))
3619                 return true;
3620               if (gfc_traverse_expr (ar.end[i], sym, func, f))
3621                 return true;
3622               if (gfc_traverse_expr (ar.stride[i], sym, func, f))
3623                 return true;
3624             }
3625           break;
3626
3627         case REF_SUBSTRING:
3628           if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
3629             return true;
3630           if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
3631             return true;
3632           break;
3633
3634         case REF_COMPONENT:
3635           if (ref->u.c.component->ts.type == BT_CHARACTER
3636                 && ref->u.c.component->ts.u.cl
3637                 && ref->u.c.component->ts.u.cl->length
3638                 && ref->u.c.component->ts.u.cl->length->expr_type
3639                      != EXPR_CONSTANT
3640                 && gfc_traverse_expr (ref->u.c.component->ts.u.cl->length,
3641                                       sym, func, f))
3642             return true;
3643
3644           if (ref->u.c.component->as)
3645             for (i = 0; i < ref->u.c.component->as->rank; i++)
3646               {
3647                 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
3648                                        sym, func, f))
3649                   return true;
3650                 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
3651                                        sym, func, f))
3652                   return true;
3653               }
3654           break;
3655
3656         default:
3657           gcc_unreachable ();
3658         }
3659       ref = ref->next;
3660     }
3661   return false;
3662 }
3663
3664 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
3665
3666 static bool
3667 expr_set_symbols_referenced (gfc_expr *expr,
3668                              gfc_symbol *sym ATTRIBUTE_UNUSED,
3669                              int *f ATTRIBUTE_UNUSED)
3670 {
3671   if (expr->expr_type != EXPR_VARIABLE)
3672     return false;
3673   gfc_set_sym_referenced (expr->symtree->n.sym);
3674   return false;
3675 }
3676
3677 void
3678 gfc_expr_set_symbols_referenced (gfc_expr *expr)
3679 {
3680   gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
3681 }
3682
3683
3684 /* Determine if an expression is a procedure pointer component. If yes, the
3685    argument 'comp' will point to the component (provided that 'comp' was
3686    provided).  */
3687
3688 bool
3689 gfc_is_proc_ptr_comp (gfc_expr *expr, gfc_component **comp)
3690 {
3691   gfc_ref *ref;
3692   bool ppc = false;
3693
3694   if (!expr || !expr->ref)
3695     return false;
3696
3697   ref = expr->ref;
3698   while (ref->next)
3699     ref = ref->next;
3700
3701   if (ref->type == REF_COMPONENT)
3702     {
3703       ppc = ref->u.c.component->attr.proc_pointer;
3704       if (ppc && comp)
3705         *comp = ref->u.c.component;
3706     }
3707
3708   return ppc;
3709 }
3710
3711
3712 /* Walk an expression tree and check each variable encountered for being typed.
3713    If strict is not set, a top-level variable is tolerated untyped in -std=gnu
3714    mode as is a basic arithmetic expression using those; this is for things in
3715    legacy-code like:
3716
3717      INTEGER :: arr(n), n
3718      INTEGER :: arr(n + 1), n
3719
3720    The namespace is needed for IMPLICIT typing.  */
3721
3722 static gfc_namespace* check_typed_ns;
3723
3724 static bool
3725 expr_check_typed_help (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
3726                        int* f ATTRIBUTE_UNUSED)
3727 {
3728   gfc_try t;
3729
3730   if (e->expr_type != EXPR_VARIABLE)
3731     return false;
3732
3733   gcc_assert (e->symtree);
3734   t = gfc_check_symbol_typed (e->symtree->n.sym, check_typed_ns,
3735                               true, e->where);
3736
3737   return (t == FAILURE);
3738 }
3739
3740 gfc_try
3741 gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
3742 {
3743   bool error_found;
3744
3745   /* If this is a top-level variable or EXPR_OP, do the check with strict given
3746      to us.  */
3747   if (!strict)
3748     {
3749       if (e->expr_type == EXPR_VARIABLE && !e->ref)
3750         return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
3751
3752       if (e->expr_type == EXPR_OP)
3753         {
3754           gfc_try t = SUCCESS;
3755
3756           gcc_assert (e->value.op.op1);
3757           t = gfc_expr_check_typed (e->value.op.op1, ns, strict);
3758
3759           if (t == SUCCESS && e->value.op.op2)
3760             t = gfc_expr_check_typed (e->value.op.op2, ns, strict);
3761
3762           return t;
3763         }
3764     }
3765
3766   /* Otherwise, walk the expression and do it strictly.  */
3767   check_typed_ns = ns;
3768   error_found = gfc_traverse_expr (e, NULL, &expr_check_typed_help, 0);
3769
3770   return error_found ? FAILURE : SUCCESS;
3771 }
3772
3773 /* Walk an expression tree and replace all symbols with a corresponding symbol
3774    in the formal_ns of "sym". Needed for copying interfaces in PROCEDURE
3775    statements. The boolean return value is required by gfc_traverse_expr.  */
3776
3777 static bool
3778 replace_symbol (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
3779 {
3780   if ((expr->expr_type == EXPR_VARIABLE 
3781        || (expr->expr_type == EXPR_FUNCTION
3782            && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
3783       && expr->symtree->n.sym->ns == sym->ts.interface->formal_ns)
3784     {
3785       gfc_symtree *stree;
3786       gfc_namespace *ns = sym->formal_ns;
3787       /* Don't use gfc_get_symtree as we prefer to fail badly if we don't find
3788          the symtree rather than create a new one (and probably fail later).  */
3789       stree = gfc_find_symtree (ns ? ns->sym_root : gfc_current_ns->sym_root,
3790                                 expr->symtree->n.sym->name);
3791       gcc_assert (stree);
3792       stree->n.sym->attr = expr->symtree->n.sym->attr;
3793       expr->symtree = stree;
3794     }
3795   return false;
3796 }
3797
3798 void
3799 gfc_expr_replace_symbols (gfc_expr *expr, gfc_symbol *dest)
3800 {
3801   gfc_traverse_expr (expr, dest, &replace_symbol, 0);
3802 }
3803
3804 /* The following is analogous to 'replace_symbol', and needed for copying
3805    interfaces for procedure pointer components. The argument 'sym' must formally
3806    be a gfc_symbol, so that the function can be passed to gfc_traverse_expr.
3807    However, it gets actually passed a gfc_component (i.e. the procedure pointer
3808    component in whose formal_ns the arguments have to be).  */
3809
3810 static bool
3811 replace_comp (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
3812 {
3813   gfc_component *comp;
3814   comp = (gfc_component *)sym;
3815   if ((expr->expr_type == EXPR_VARIABLE 
3816        || (expr->expr_type == EXPR_FUNCTION
3817            && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
3818       && expr->symtree->n.sym->ns == comp->ts.interface->formal_ns)
3819     {
3820       gfc_symtree *stree;
3821       gfc_namespace *ns = comp->formal_ns;
3822       /* Don't use gfc_get_symtree as we prefer to fail badly if we don't find
3823          the symtree rather than create a new one (and probably fail later).  */
3824       stree = gfc_find_symtree (ns ? ns->sym_root : gfc_current_ns->sym_root,
3825                                 expr->symtree->n.sym->name);
3826       gcc_assert (stree);
3827       stree->n.sym->attr = expr->symtree->n.sym->attr;
3828       expr->symtree = stree;
3829     }
3830   return false;
3831 }
3832
3833 void
3834 gfc_expr_replace_comp (gfc_expr *expr, gfc_component *dest)
3835 {
3836   gfc_traverse_expr (expr, (gfc_symbol *)dest, &replace_comp, 0);
3837 }
3838