OSDN Git Service

2200a805b449b9990156073b63e546ccf61b3143
[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   /* F2008, C723 (pointer) and C726 (proc-pointer); for PURE also C1283.  */
3209   if (lvalue->expr_type == EXPR_VARIABLE
3210       && gfc_is_coindexed (lvalue))
3211     {
3212       gfc_ref *ref;
3213       for (ref = lvalue->ref; ref; ref = ref->next)
3214         if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3215           {
3216             gfc_error ("Pointer object at %L shall not have a coindex",
3217                        &lvalue->where);
3218             return FAILURE;
3219           }
3220     }
3221
3222   /* Checks on rvalue for procedure pointer assignments.  */
3223   if (proc_pointer)
3224     {
3225       char err[200];
3226       gfc_symbol *s1,*s2;
3227       gfc_component *comp;
3228       const char *name;
3229
3230       attr = gfc_expr_attr (rvalue);
3231       if (!((rvalue->expr_type == EXPR_NULL)
3232             || (rvalue->expr_type == EXPR_FUNCTION && attr.proc_pointer)
3233             || (rvalue->expr_type == EXPR_VARIABLE && attr.proc_pointer)
3234             || (rvalue->expr_type == EXPR_VARIABLE
3235                 && attr.flavor == FL_PROCEDURE)))
3236         {
3237           gfc_error ("Invalid procedure pointer assignment at %L",
3238                      &rvalue->where);
3239           return FAILURE;
3240         }
3241       if (attr.abstract)
3242         {
3243           gfc_error ("Abstract interface '%s' is invalid "
3244                      "in procedure pointer assignment at %L",
3245                      rvalue->symtree->name, &rvalue->where);
3246           return FAILURE;
3247         }
3248       /* Check for C727.  */
3249       if (attr.flavor == FL_PROCEDURE)
3250         {
3251           if (attr.proc == PROC_ST_FUNCTION)
3252             {
3253               gfc_error ("Statement function '%s' is invalid "
3254                          "in procedure pointer assignment at %L",
3255                          rvalue->symtree->name, &rvalue->where);
3256               return FAILURE;
3257             }
3258           if (attr.proc == PROC_INTERNAL &&
3259               gfc_notify_std (GFC_STD_F2008, "Internal procedure '%s' is "
3260                               "invalid in procedure pointer assignment at %L",
3261                               rvalue->symtree->name, &rvalue->where) == FAILURE)
3262             return FAILURE;
3263         }
3264
3265       /* Ensure that the calling convention is the same. As other attributes
3266          such as DLLEXPORT may differ, one explicitly only tests for the
3267          calling conventions.  */
3268       if (rvalue->expr_type == EXPR_VARIABLE
3269           && lvalue->symtree->n.sym->attr.ext_attr
3270                != rvalue->symtree->n.sym->attr.ext_attr)
3271         {
3272           symbol_attribute calls;
3273
3274           calls.ext_attr = 0;
3275           gfc_add_ext_attribute (&calls, EXT_ATTR_CDECL, NULL);
3276           gfc_add_ext_attribute (&calls, EXT_ATTR_STDCALL, NULL);
3277           gfc_add_ext_attribute (&calls, EXT_ATTR_FASTCALL, NULL);
3278
3279           if ((calls.ext_attr & lvalue->symtree->n.sym->attr.ext_attr)
3280               != (calls.ext_attr & rvalue->symtree->n.sym->attr.ext_attr))
3281             {
3282               gfc_error ("Mismatch in the procedure pointer assignment "
3283                          "at %L: mismatch in the calling convention",
3284                          &rvalue->where);
3285           return FAILURE;
3286             }
3287         }
3288
3289       if (gfc_is_proc_ptr_comp (lvalue, &comp))
3290         s1 = comp->ts.interface;
3291       else
3292         s1 = lvalue->symtree->n.sym;
3293
3294       if (gfc_is_proc_ptr_comp (rvalue, &comp))
3295         {
3296           s2 = comp->ts.interface;
3297           name = comp->name;
3298         }
3299       else if (rvalue->expr_type == EXPR_FUNCTION)
3300         {
3301           s2 = rvalue->symtree->n.sym->result;
3302           name = rvalue->symtree->n.sym->result->name;
3303         }
3304       else
3305         {
3306           s2 = rvalue->symtree->n.sym;
3307           name = rvalue->symtree->n.sym->name;
3308         }
3309
3310       if (s1 && s2 && !gfc_compare_interfaces (s1, s2, name, 0, 1,
3311                                                err, sizeof(err)))
3312         {
3313           gfc_error ("Interface mismatch in procedure pointer assignment "
3314                      "at %L: %s", &rvalue->where, err);
3315           return FAILURE;
3316         }
3317
3318       return SUCCESS;
3319     }
3320
3321   if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
3322     {
3323       gfc_error ("Different types in pointer assignment at %L; attempted "
3324                  "assignment of %s to %s", &lvalue->where, 
3325                  gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3326       return FAILURE;
3327     }
3328
3329   if (lvalue->ts.type != BT_CLASS && lvalue->ts.kind != rvalue->ts.kind)
3330     {
3331       gfc_error ("Different kind type parameters in pointer "
3332                  "assignment at %L", &lvalue->where);
3333       return FAILURE;
3334     }
3335
3336   if (lvalue->rank != rvalue->rank)
3337     {
3338       gfc_error ("Different ranks in pointer assignment at %L",
3339                  &lvalue->where);
3340       return FAILURE;
3341     }
3342
3343   /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
3344   if (rvalue->expr_type == EXPR_NULL)
3345     return SUCCESS;
3346
3347   if (lvalue->ts.type == BT_CHARACTER)
3348     {
3349       gfc_try t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment");
3350       if (t == FAILURE)
3351         return FAILURE;
3352     }
3353
3354   if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
3355     lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
3356
3357   attr = gfc_expr_attr (rvalue);
3358   if (!attr.target && !attr.pointer)
3359     {
3360       gfc_error ("Pointer assignment target is neither TARGET "
3361                  "nor POINTER at %L", &rvalue->where);
3362       return FAILURE;
3363     }
3364
3365   if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3366     {
3367       gfc_error ("Bad target in pointer assignment in PURE "
3368                  "procedure at %L", &rvalue->where);
3369     }
3370
3371   if (gfc_has_vector_index (rvalue))
3372     {
3373       gfc_error ("Pointer assignment with vector subscript "
3374                  "on rhs at %L", &rvalue->where);
3375       return FAILURE;
3376     }
3377
3378   if (attr.is_protected && attr.use_assoc
3379       && !(attr.pointer || attr.proc_pointer))
3380     {
3381       gfc_error ("Pointer assignment target has PROTECTED "
3382                  "attribute at %L", &rvalue->where);
3383       return FAILURE;
3384     }
3385
3386   /* F2008, C725. For PURE also C1283.  */
3387   if (rvalue->expr_type == EXPR_VARIABLE
3388       && gfc_is_coindexed (rvalue))
3389     {
3390       gfc_ref *ref;
3391       for (ref = rvalue->ref; ref; ref = ref->next)
3392         if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3393           {
3394             gfc_error ("Data target at %L shall not have a coindex",
3395                        &rvalue->where);
3396             return FAILURE;
3397           }
3398     }
3399
3400   return SUCCESS;
3401 }
3402
3403
3404 /* Relative of gfc_check_assign() except that the lvalue is a single
3405    symbol.  Used for initialization assignments.  */
3406
3407 gfc_try
3408 gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
3409 {
3410   gfc_expr lvalue;
3411   gfc_try r;
3412
3413   memset (&lvalue, '\0', sizeof (gfc_expr));
3414
3415   lvalue.expr_type = EXPR_VARIABLE;
3416   lvalue.ts = sym->ts;
3417   if (sym->as)
3418     lvalue.rank = sym->as->rank;
3419   lvalue.symtree = (gfc_symtree *) gfc_getmem (sizeof (gfc_symtree));
3420   lvalue.symtree->n.sym = sym;
3421   lvalue.where = sym->declared_at;
3422
3423   if (sym->attr.pointer || sym->attr.proc_pointer
3424       || (sym->ts.type == BT_CLASS 
3425           && sym->ts.u.derived->components->attr.pointer
3426           && rvalue->expr_type == EXPR_NULL))
3427     r = gfc_check_pointer_assign (&lvalue, rvalue);
3428   else
3429     r = gfc_check_assign (&lvalue, rvalue, 1);
3430
3431   gfc_free (lvalue.symtree);
3432
3433   return r;
3434 }
3435
3436
3437 /* Get an expression for a default initializer.  */
3438
3439 gfc_expr *
3440 gfc_default_initializer (gfc_typespec *ts)
3441 {
3442   gfc_constructor *tail;
3443   gfc_expr *init;
3444   gfc_component *c;
3445
3446   /* See if we have a default initializer.  */
3447   for (c = ts->u.derived->components; c; c = c->next)
3448     if (c->initializer || c->attr.allocatable)
3449       break;
3450
3451   if (!c)
3452     return NULL;
3453
3454   /* Build the constructor.  */
3455   init = gfc_get_expr ();
3456   init->expr_type = EXPR_STRUCTURE;
3457   init->ts = *ts;
3458   init->where = ts->u.derived->declared_at;
3459
3460   tail = NULL;
3461   for (c = ts->u.derived->components; c; c = c->next)
3462     {
3463       if (tail == NULL)
3464         init->value.constructor = tail = gfc_get_constructor ();
3465       else
3466         {
3467           tail->next = gfc_get_constructor ();
3468           tail = tail->next;
3469         }
3470
3471       if (c->initializer)
3472         tail->expr = gfc_copy_expr (c->initializer);
3473
3474       if (c->attr.allocatable)
3475         {
3476           tail->expr = gfc_get_expr ();
3477           tail->expr->expr_type = EXPR_NULL;
3478           tail->expr->ts = c->ts;
3479         }
3480     }
3481   return init;
3482 }
3483
3484
3485 /* Given a symbol, create an expression node with that symbol as a
3486    variable. If the symbol is array valued, setup a reference of the
3487    whole array.  */
3488
3489 gfc_expr *
3490 gfc_get_variable_expr (gfc_symtree *var)
3491 {
3492   gfc_expr *e;
3493
3494   e = gfc_get_expr ();
3495   e->expr_type = EXPR_VARIABLE;
3496   e->symtree = var;
3497   e->ts = var->n.sym->ts;
3498
3499   if (var->n.sym->as != NULL)
3500     {
3501       e->rank = var->n.sym->as->rank;
3502       e->ref = gfc_get_ref ();
3503       e->ref->type = REF_ARRAY;
3504       e->ref->u.ar.type = AR_FULL;
3505     }
3506
3507   return e;
3508 }
3509
3510
3511 /* Returns the array_spec of a full array expression.  A NULL is
3512    returned otherwise.  */
3513 gfc_array_spec *
3514 gfc_get_full_arrayspec_from_expr (gfc_expr *expr)
3515 {
3516   gfc_array_spec *as;
3517   gfc_ref *ref;
3518
3519   if (expr->rank == 0)
3520     return NULL;
3521
3522   /* Follow any component references.  */
3523   if (expr->expr_type == EXPR_VARIABLE
3524       || expr->expr_type == EXPR_CONSTANT)
3525     {
3526       as = expr->symtree->n.sym->as;
3527       for (ref = expr->ref; ref; ref = ref->next)
3528         {
3529           switch (ref->type)
3530             {
3531             case REF_COMPONENT:
3532               as = ref->u.c.component->as;
3533               continue;
3534
3535             case REF_SUBSTRING:
3536               continue;
3537
3538             case REF_ARRAY:
3539               {
3540                 switch (ref->u.ar.type)
3541                   {
3542                   case AR_ELEMENT:
3543                   case AR_SECTION:
3544                   case AR_UNKNOWN:
3545                     as = NULL;
3546                     continue;
3547
3548                   case AR_FULL:
3549                     break;
3550                   }
3551                 break;
3552               }
3553             }
3554         }
3555     }
3556   else
3557     as = NULL;
3558
3559   return as;
3560 }
3561
3562
3563 /* General expression traversal function.  */
3564
3565 bool
3566 gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
3567                    bool (*func)(gfc_expr *, gfc_symbol *, int*),
3568                    int f)
3569 {
3570   gfc_array_ref ar;
3571   gfc_ref *ref;
3572   gfc_actual_arglist *args;
3573   gfc_constructor *c;
3574   int i;
3575
3576   if (!expr)
3577     return false;
3578
3579   if ((*func) (expr, sym, &f))
3580     return true;
3581
3582   if (expr->ts.type == BT_CHARACTER
3583         && expr->ts.u.cl
3584         && expr->ts.u.cl->length
3585         && expr->ts.u.cl->length->expr_type != EXPR_CONSTANT
3586         && gfc_traverse_expr (expr->ts.u.cl->length, sym, func, f))
3587     return true;
3588
3589   switch (expr->expr_type)
3590     {
3591     case EXPR_FUNCTION:
3592       for (args = expr->value.function.actual; args; args = args->next)
3593         {
3594           if (gfc_traverse_expr (args->expr, sym, func, f))
3595             return true;
3596         }
3597       break;
3598
3599     case EXPR_VARIABLE:
3600     case EXPR_CONSTANT:
3601     case EXPR_NULL:
3602     case EXPR_SUBSTRING:
3603       break;
3604
3605     case EXPR_STRUCTURE:
3606     case EXPR_ARRAY:
3607       for (c = expr->value.constructor; c; c = c->next)
3608         {
3609           if (gfc_traverse_expr (c->expr, sym, func, f))
3610             return true;
3611           if (c->iterator)
3612             {
3613               if (gfc_traverse_expr (c->iterator->var, sym, func, f))
3614                 return true;
3615               if (gfc_traverse_expr (c->iterator->start, sym, func, f))
3616                 return true;
3617               if (gfc_traverse_expr (c->iterator->end, sym, func, f))
3618                 return true;
3619               if (gfc_traverse_expr (c->iterator->step, sym, func, f))
3620                 return true;
3621             }
3622         }
3623       break;
3624
3625     case EXPR_OP:
3626       if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
3627         return true;
3628       if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
3629         return true;
3630       break;
3631
3632     default:
3633       gcc_unreachable ();
3634       break;
3635     }
3636
3637   ref = expr->ref;
3638   while (ref != NULL)
3639     {
3640       switch (ref->type)
3641         {
3642         case  REF_ARRAY:
3643           ar = ref->u.ar;
3644           for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
3645             {
3646               if (gfc_traverse_expr (ar.start[i], sym, func, f))
3647                 return true;
3648               if (gfc_traverse_expr (ar.end[i], sym, func, f))
3649                 return true;
3650               if (gfc_traverse_expr (ar.stride[i], sym, func, f))
3651                 return true;
3652             }
3653           break;
3654
3655         case REF_SUBSTRING:
3656           if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
3657             return true;
3658           if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
3659             return true;
3660           break;
3661
3662         case REF_COMPONENT:
3663           if (ref->u.c.component->ts.type == BT_CHARACTER
3664                 && ref->u.c.component->ts.u.cl
3665                 && ref->u.c.component->ts.u.cl->length
3666                 && ref->u.c.component->ts.u.cl->length->expr_type
3667                      != EXPR_CONSTANT
3668                 && gfc_traverse_expr (ref->u.c.component->ts.u.cl->length,
3669                                       sym, func, f))
3670             return true;
3671
3672           if (ref->u.c.component->as)
3673             for (i = 0; i < ref->u.c.component->as->rank
3674                             + ref->u.c.component->as->corank; i++)
3675               {
3676                 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
3677                                        sym, func, f))
3678                   return true;
3679                 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
3680                                        sym, func, f))
3681                   return true;
3682               }
3683           break;
3684
3685         default:
3686           gcc_unreachable ();
3687         }
3688       ref = ref->next;
3689     }
3690   return false;
3691 }
3692
3693 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
3694
3695 static bool
3696 expr_set_symbols_referenced (gfc_expr *expr,
3697                              gfc_symbol *sym ATTRIBUTE_UNUSED,
3698                              int *f ATTRIBUTE_UNUSED)
3699 {
3700   if (expr->expr_type != EXPR_VARIABLE)
3701     return false;
3702   gfc_set_sym_referenced (expr->symtree->n.sym);
3703   return false;
3704 }
3705
3706 void
3707 gfc_expr_set_symbols_referenced (gfc_expr *expr)
3708 {
3709   gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
3710 }
3711
3712
3713 /* Determine if an expression is a procedure pointer component. If yes, the
3714    argument 'comp' will point to the component (provided that 'comp' was
3715    provided).  */
3716
3717 bool
3718 gfc_is_proc_ptr_comp (gfc_expr *expr, gfc_component **comp)
3719 {
3720   gfc_ref *ref;
3721   bool ppc = false;
3722
3723   if (!expr || !expr->ref)
3724     return false;
3725
3726   ref = expr->ref;
3727   while (ref->next)
3728     ref = ref->next;
3729
3730   if (ref->type == REF_COMPONENT)
3731     {
3732       ppc = ref->u.c.component->attr.proc_pointer;
3733       if (ppc && comp)
3734         *comp = ref->u.c.component;
3735     }
3736
3737   return ppc;
3738 }
3739
3740
3741 /* Walk an expression tree and check each variable encountered for being typed.
3742    If strict is not set, a top-level variable is tolerated untyped in -std=gnu
3743    mode as is a basic arithmetic expression using those; this is for things in
3744    legacy-code like:
3745
3746      INTEGER :: arr(n), n
3747      INTEGER :: arr(n + 1), n
3748
3749    The namespace is needed for IMPLICIT typing.  */
3750
3751 static gfc_namespace* check_typed_ns;
3752
3753 static bool
3754 expr_check_typed_help (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
3755                        int* f ATTRIBUTE_UNUSED)
3756 {
3757   gfc_try t;
3758
3759   if (e->expr_type != EXPR_VARIABLE)
3760     return false;
3761
3762   gcc_assert (e->symtree);
3763   t = gfc_check_symbol_typed (e->symtree->n.sym, check_typed_ns,
3764                               true, e->where);
3765
3766   return (t == FAILURE);
3767 }
3768
3769 gfc_try
3770 gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
3771 {
3772   bool error_found;
3773
3774   /* If this is a top-level variable or EXPR_OP, do the check with strict given
3775      to us.  */
3776   if (!strict)
3777     {
3778       if (e->expr_type == EXPR_VARIABLE && !e->ref)
3779         return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
3780
3781       if (e->expr_type == EXPR_OP)
3782         {
3783           gfc_try t = SUCCESS;
3784
3785           gcc_assert (e->value.op.op1);
3786           t = gfc_expr_check_typed (e->value.op.op1, ns, strict);
3787
3788           if (t == SUCCESS && e->value.op.op2)
3789             t = gfc_expr_check_typed (e->value.op.op2, ns, strict);
3790
3791           return t;
3792         }
3793     }
3794
3795   /* Otherwise, walk the expression and do it strictly.  */
3796   check_typed_ns = ns;
3797   error_found = gfc_traverse_expr (e, NULL, &expr_check_typed_help, 0);
3798
3799   return error_found ? FAILURE : SUCCESS;
3800 }
3801
3802 /* Walk an expression tree and replace all symbols with a corresponding symbol
3803    in the formal_ns of "sym". Needed for copying interfaces in PROCEDURE
3804    statements. The boolean return value is required by gfc_traverse_expr.  */
3805
3806 static bool
3807 replace_symbol (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
3808 {
3809   if ((expr->expr_type == EXPR_VARIABLE 
3810        || (expr->expr_type == EXPR_FUNCTION
3811            && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
3812       && expr->symtree->n.sym->ns == sym->ts.interface->formal_ns)
3813     {
3814       gfc_symtree *stree;
3815       gfc_namespace *ns = sym->formal_ns;
3816       /* Don't use gfc_get_symtree as we prefer to fail badly if we don't find
3817          the symtree rather than create a new one (and probably fail later).  */
3818       stree = gfc_find_symtree (ns ? ns->sym_root : gfc_current_ns->sym_root,
3819                                 expr->symtree->n.sym->name);
3820       gcc_assert (stree);
3821       stree->n.sym->attr = expr->symtree->n.sym->attr;
3822       expr->symtree = stree;
3823     }
3824   return false;
3825 }
3826
3827 void
3828 gfc_expr_replace_symbols (gfc_expr *expr, gfc_symbol *dest)
3829 {
3830   gfc_traverse_expr (expr, dest, &replace_symbol, 0);
3831 }
3832
3833 /* The following is analogous to 'replace_symbol', and needed for copying
3834    interfaces for procedure pointer components. The argument 'sym' must formally
3835    be a gfc_symbol, so that the function can be passed to gfc_traverse_expr.
3836    However, it gets actually passed a gfc_component (i.e. the procedure pointer
3837    component in whose formal_ns the arguments have to be).  */
3838
3839 static bool
3840 replace_comp (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
3841 {
3842   gfc_component *comp;
3843   comp = (gfc_component *)sym;
3844   if ((expr->expr_type == EXPR_VARIABLE 
3845        || (expr->expr_type == EXPR_FUNCTION
3846            && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
3847       && expr->symtree->n.sym->ns == comp->ts.interface->formal_ns)
3848     {
3849       gfc_symtree *stree;
3850       gfc_namespace *ns = comp->formal_ns;
3851       /* Don't use gfc_get_symtree as we prefer to fail badly if we don't find
3852          the symtree rather than create a new one (and probably fail later).  */
3853       stree = gfc_find_symtree (ns ? ns->sym_root : gfc_current_ns->sym_root,
3854                                 expr->symtree->n.sym->name);
3855       gcc_assert (stree);
3856       stree->n.sym->attr = expr->symtree->n.sym->attr;
3857       expr->symtree = stree;
3858     }
3859   return false;
3860 }
3861
3862 void
3863 gfc_expr_replace_comp (gfc_expr *expr, gfc_component *dest)
3864 {
3865   gfc_traverse_expr (expr, (gfc_symbol *)dest, &replace_comp, 0);
3866 }
3867
3868
3869 bool
3870 gfc_is_coindexed (gfc_expr *e)
3871 {
3872   gfc_ref *ref;
3873
3874   for (ref = e->ref; ref; ref = ref->next)
3875     if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
3876       return true;
3877
3878   return false;
3879 }
3880
3881
3882 /* Check whether the expression has an ultimate allocatable component.
3883    Being itself allocatable does not count.  */
3884 bool
3885 gfc_has_ultimate_allocatable (gfc_expr *e)
3886 {
3887   gfc_ref *ref, *last = NULL;
3888
3889   if (e->expr_type != EXPR_VARIABLE)
3890     return false;
3891
3892   for (ref = e->ref; ref; ref = ref->next)
3893     if (ref->type == REF_COMPONENT)
3894       last = ref;
3895
3896   if (last && last->u.c.component->ts.type == BT_CLASS)
3897     return last->u.c.component->ts.u.derived->components->attr.alloc_comp;
3898   else if (last && last->u.c.component->ts.type == BT_DERIVED)
3899     return last->u.c.component->ts.u.derived->attr.alloc_comp;
3900   else if (last)
3901     return false;
3902
3903   if (e->ts.type == BT_CLASS)
3904     return e->ts.u.derived->components->attr.alloc_comp;
3905   else if (e->ts.type == BT_DERIVED)
3906     return e->ts.u.derived->attr.alloc_comp;
3907   else
3908     return false;
3909 }
3910
3911
3912 /* Check whether the expression has an pointer component.
3913    Being itself a pointer does not count.  */
3914 bool
3915 gfc_has_ultimate_pointer (gfc_expr *e)
3916 {
3917   gfc_ref *ref, *last = NULL;
3918
3919   if (e->expr_type != EXPR_VARIABLE)
3920     return false;
3921
3922   for (ref = e->ref; ref; ref = ref->next)
3923     if (ref->type == REF_COMPONENT)
3924       last = ref;
3925  
3926   if (last && last->u.c.component->ts.type == BT_CLASS)
3927     return last->u.c.component->ts.u.derived->components->attr.pointer_comp;
3928   else if (last && last->u.c.component->ts.type == BT_DERIVED)
3929     return last->u.c.component->ts.u.derived->attr.pointer_comp;
3930   else if (last)
3931     return false;
3932
3933   if (e->ts.type == BT_CLASS)
3934     return e->ts.u.derived->components->attr.pointer_comp;
3935   else if (e->ts.type == BT_DERIVED)
3936     return e->ts.u.derived->attr.pointer_comp;
3937   else
3938     return false;
3939 }