OSDN Git Service

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