OSDN Git Service

2008-01-22 Paul Thomas <pault@gcc.gnu.org>
[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 || e->ts.type != BT_CHARACTER)
2113       && gfc_notify_std (GFC_STD_F2003, "Extension: Evaluation of "
2114                         "nonstandard initialization expression at %L",
2115                         &e->where) == FAILURE)
2116     return MATCH_ERROR;
2117
2118   return check_init_expr_arguments (e);
2119 }
2120
2121
2122 static match
2123 check_conversion (gfc_expr *e)
2124 {
2125   if (!e->value.function.isym
2126       || !e->value.function.isym->conversion)
2127     return MATCH_NO;
2128
2129   return check_init_expr_arguments (e);
2130 }
2131
2132
2133 /* Verify that an expression is an initialization expression.  A side
2134    effect is that the expression tree is reduced to a single constant
2135    node if all goes well.  This would normally happen when the
2136    expression is constructed but function references are assumed to be
2137    intrinsics in the context of initialization expressions.  If
2138    FAILURE is returned an error message has been generated.  */
2139
2140 static try
2141 check_init_expr (gfc_expr *e)
2142 {
2143   match m;
2144   try t;
2145   gfc_intrinsic_sym *isym;
2146
2147   if (e == NULL)
2148     return SUCCESS;
2149
2150   switch (e->expr_type)
2151     {
2152     case EXPR_OP:
2153       t = check_intrinsic_op (e, check_init_expr);
2154       if (t == SUCCESS)
2155         t = gfc_simplify_expr (e, 0);
2156
2157       break;
2158
2159     case EXPR_FUNCTION:
2160       t = FAILURE;
2161
2162       if ((m = check_specification_function (e)) != MATCH_YES)
2163         {
2164           if ((m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES)
2165             {
2166               gfc_error ("Function '%s' in initialization expression at %L "
2167                          "must be an intrinsic or a specification function",
2168                          e->symtree->n.sym->name, &e->where);
2169               break;
2170             }
2171
2172           if ((m = check_conversion (e)) == MATCH_NO
2173               && (m = check_inquiry (e, 1)) == MATCH_NO
2174               && (m = check_null (e)) == MATCH_NO
2175               && (m = check_transformational (e)) == MATCH_NO
2176               && (m = check_elemental (e)) == MATCH_NO)
2177             {
2178               gfc_error ("Intrinsic function '%s' at %L is not permitted "
2179                          "in an initialization expression",
2180                          e->symtree->n.sym->name, &e->where);
2181               m = MATCH_ERROR;
2182             }
2183
2184           /* Try to scalarize an elemental intrinsic function that has an
2185              array argument.  */
2186           isym = gfc_find_function (e->symtree->n.sym->name);
2187           if (isym && isym->elemental
2188               && e->value.function.actual->expr->expr_type == EXPR_ARRAY)
2189             {
2190                 if ((t = scalarize_intrinsic_call (e)) == SUCCESS)
2191                 break;
2192             }
2193         }
2194
2195       if (m == MATCH_YES)
2196         t = gfc_simplify_expr (e, 0);
2197
2198       break;
2199
2200     case EXPR_VARIABLE:
2201       t = SUCCESS;
2202
2203       if (gfc_check_iter_variable (e) == SUCCESS)
2204         break;
2205
2206       if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2207         {
2208           /* A PARAMETER shall not be used to define itself, i.e.
2209                 REAL, PARAMETER :: x = transfer(0, x)
2210              is invalid.  */
2211           if (!e->symtree->n.sym->value)
2212             {
2213               gfc_error("PARAMETER '%s' is used at %L before its definition "
2214                         "is complete", e->symtree->n.sym->name, &e->where);
2215               t = FAILURE;
2216             }
2217           else
2218             t = simplify_parameter_variable (e, 0);
2219
2220           break;
2221         }
2222
2223       if (gfc_in_match_data ())
2224         break;
2225
2226       t = FAILURE;
2227
2228       if (e->symtree->n.sym->as)
2229         {
2230           switch (e->symtree->n.sym->as->type)
2231             {
2232               case AS_ASSUMED_SIZE:
2233                 gfc_error ("Assumed size array '%s' at %L is not permitted "
2234                            "in an initialization expression",
2235                            e->symtree->n.sym->name, &e->where);
2236                 break;
2237
2238               case AS_ASSUMED_SHAPE:
2239                 gfc_error ("Assumed shape array '%s' at %L is not permitted "
2240                            "in an initialization expression",
2241                            e->symtree->n.sym->name, &e->where);
2242                 break;
2243
2244               case AS_DEFERRED:
2245                 gfc_error ("Deferred array '%s' at %L is not permitted "
2246                            "in an initialization expression",
2247                            e->symtree->n.sym->name, &e->where);
2248                 break;
2249
2250               case AS_EXPLICIT:
2251                 gfc_error ("Array '%s' at %L is a variable, which does "
2252                            "not reduce to a constant expression",
2253                            e->symtree->n.sym->name, &e->where);
2254                 break;
2255
2256               default:
2257                 gcc_unreachable();
2258           }
2259         }
2260       else
2261         gfc_error ("Parameter '%s' at %L has not been declared or is "
2262                    "a variable, which does not reduce to a constant "
2263                    "expression", e->symtree->n.sym->name, &e->where);
2264
2265       break;
2266
2267     case EXPR_CONSTANT:
2268     case EXPR_NULL:
2269       t = SUCCESS;
2270       break;
2271
2272     case EXPR_SUBSTRING:
2273       t = check_init_expr (e->ref->u.ss.start);
2274       if (t == FAILURE)
2275         break;
2276
2277       t = check_init_expr (e->ref->u.ss.end);
2278       if (t == SUCCESS)
2279         t = gfc_simplify_expr (e, 0);
2280
2281       break;
2282
2283     case EXPR_STRUCTURE:
2284       if (e->ts.is_iso_c)
2285         t = SUCCESS;
2286       else
2287         t = gfc_check_constructor (e, check_init_expr);
2288       break;
2289
2290     case EXPR_ARRAY:
2291       t = gfc_check_constructor (e, check_init_expr);
2292       if (t == FAILURE)
2293         break;
2294
2295       t = gfc_expand_constructor (e);
2296       if (t == FAILURE)
2297         break;
2298
2299       t = gfc_check_constructor_type (e);
2300       break;
2301
2302     default:
2303       gfc_internal_error ("check_init_expr(): Unknown expression type");
2304     }
2305
2306   return t;
2307 }
2308
2309
2310 /* Match an initialization expression.  We work by first matching an
2311    expression, then reducing it to a constant.  */
2312
2313 match
2314 gfc_match_init_expr (gfc_expr **result)
2315 {
2316   gfc_expr *expr;
2317   match m;
2318   try t;
2319
2320   m = gfc_match_expr (&expr);
2321   if (m != MATCH_YES)
2322     return m;
2323
2324   gfc_init_expr = 1;
2325   t = gfc_resolve_expr (expr);
2326   if (t == SUCCESS)
2327     t = check_init_expr (expr);
2328   gfc_init_expr = 0;
2329
2330   if (t == FAILURE)
2331     {
2332       gfc_free_expr (expr);
2333       return MATCH_ERROR;
2334     }
2335
2336   if (expr->expr_type == EXPR_ARRAY
2337       && (gfc_check_constructor_type (expr) == FAILURE
2338           || gfc_expand_constructor (expr) == FAILURE))
2339     {
2340       gfc_free_expr (expr);
2341       return MATCH_ERROR;
2342     }
2343
2344   /* Not all inquiry functions are simplified to constant expressions
2345      so it is necessary to call check_inquiry again.  */ 
2346   if (!gfc_is_constant_expr (expr) && check_inquiry (expr, 1) != MATCH_YES
2347       && !gfc_in_match_data ())
2348     {
2349       gfc_error ("Initialization expression didn't reduce %C");
2350       return MATCH_ERROR;
2351     }
2352
2353   *result = expr;
2354
2355   return MATCH_YES;
2356 }
2357
2358
2359 static try check_restricted (gfc_expr *);
2360
2361 /* Given an actual argument list, test to see that each argument is a
2362    restricted expression and optionally if the expression type is
2363    integer or character.  */
2364
2365 static try
2366 restricted_args (gfc_actual_arglist *a)
2367 {
2368   for (; a; a = a->next)
2369     {
2370       if (check_restricted (a->expr) == FAILURE)
2371         return FAILURE;
2372     }
2373
2374   return SUCCESS;
2375 }
2376
2377
2378 /************* Restricted/specification expressions *************/
2379
2380
2381 /* Make sure a non-intrinsic function is a specification function.  */
2382
2383 static try
2384 external_spec_function (gfc_expr *e)
2385 {
2386   gfc_symbol *f;
2387
2388   f = e->value.function.esym;
2389
2390   if (f->attr.proc == PROC_ST_FUNCTION)
2391     {
2392       gfc_error ("Specification function '%s' at %L cannot be a statement "
2393                  "function", f->name, &e->where);
2394       return FAILURE;
2395     }
2396
2397   if (f->attr.proc == PROC_INTERNAL)
2398     {
2399       gfc_error ("Specification function '%s' at %L cannot be an internal "
2400                  "function", f->name, &e->where);
2401       return FAILURE;
2402     }
2403
2404   if (!f->attr.pure && !f->attr.elemental)
2405     {
2406       gfc_error ("Specification function '%s' at %L must be PURE", f->name,
2407                  &e->where);
2408       return FAILURE;
2409     }
2410
2411   if (f->attr.recursive)
2412     {
2413       gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
2414                  f->name, &e->where);
2415       return FAILURE;
2416     }
2417
2418   return restricted_args (e->value.function.actual);
2419 }
2420
2421
2422 /* Check to see that a function reference to an intrinsic is a
2423    restricted expression.  */
2424
2425 static try
2426 restricted_intrinsic (gfc_expr *e)
2427 {
2428   /* TODO: Check constraints on inquiry functions.  7.1.6.2 (7).  */
2429   if (check_inquiry (e, 0) == MATCH_YES)
2430     return SUCCESS;
2431
2432   return restricted_args (e->value.function.actual);
2433 }
2434
2435
2436 /* Verify that an expression is a restricted expression.  Like its
2437    cousin check_init_expr(), an error message is generated if we
2438    return FAILURE.  */
2439
2440 static try
2441 check_restricted (gfc_expr *e)
2442 {
2443   gfc_symbol *sym;
2444   try t;
2445
2446   if (e == NULL)
2447     return SUCCESS;
2448
2449   switch (e->expr_type)
2450     {
2451     case EXPR_OP:
2452       t = check_intrinsic_op (e, check_restricted);
2453       if (t == SUCCESS)
2454         t = gfc_simplify_expr (e, 0);
2455
2456       break;
2457
2458     case EXPR_FUNCTION:
2459       t = e->value.function.esym ? external_spec_function (e)
2460                                  : restricted_intrinsic (e);
2461       break;
2462
2463     case EXPR_VARIABLE:
2464       sym = e->symtree->n.sym;
2465       t = FAILURE;
2466
2467       /* If a dummy argument appears in a context that is valid for a
2468          restricted expression in an elemental procedure, it will have
2469          already been simplified away once we get here.  Therefore we
2470          don't need to jump through hoops to distinguish valid from
2471          invalid cases.  */
2472       if (sym->attr.dummy && sym->ns == gfc_current_ns
2473           && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
2474         {
2475           gfc_error ("Dummy argument '%s' not allowed in expression at %L",
2476                      sym->name, &e->where);
2477           break;
2478         }
2479
2480       if (sym->attr.optional)
2481         {
2482           gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2483                      sym->name, &e->where);
2484           break;
2485         }
2486
2487       if (sym->attr.intent == INTENT_OUT)
2488         {
2489           gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2490                      sym->name, &e->where);
2491           break;
2492         }
2493
2494       /* gfc_is_formal_arg broadcasts that a formal argument list is being
2495          processed in resolve.c(resolve_formal_arglist).  This is done so
2496          that host associated dummy array indices are accepted (PR23446).
2497          This mechanism also does the same for the specification expressions
2498          of array-valued functions.  */
2499       if (sym->attr.in_common
2500           || sym->attr.use_assoc
2501           || sym->attr.dummy
2502           || sym->attr.implied_index
2503           || sym->ns != gfc_current_ns
2504           || (sym->ns->proc_name != NULL
2505               && sym->ns->proc_name->attr.flavor == FL_MODULE)
2506           || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2507         {
2508           t = SUCCESS;
2509           break;
2510         }
2511
2512       gfc_error ("Variable '%s' cannot appear in the expression at %L",
2513                  sym->name, &e->where);
2514
2515       break;
2516
2517     case EXPR_NULL:
2518     case EXPR_CONSTANT:
2519       t = SUCCESS;
2520       break;
2521
2522     case EXPR_SUBSTRING:
2523       t = gfc_specification_expr (e->ref->u.ss.start);
2524       if (t == FAILURE)
2525         break;
2526
2527       t = gfc_specification_expr (e->ref->u.ss.end);
2528       if (t == SUCCESS)
2529         t = gfc_simplify_expr (e, 0);
2530
2531       break;
2532
2533     case EXPR_STRUCTURE:
2534       t = gfc_check_constructor (e, check_restricted);
2535       break;
2536
2537     case EXPR_ARRAY:
2538       t = gfc_check_constructor (e, check_restricted);
2539       break;
2540
2541     default:
2542       gfc_internal_error ("check_restricted(): Unknown expression type");
2543     }
2544
2545   return t;
2546 }
2547
2548
2549 /* Check to see that an expression is a specification expression.  If
2550    we return FAILURE, an error has been generated.  */
2551
2552 try
2553 gfc_specification_expr (gfc_expr *e)
2554 {
2555
2556   if (e == NULL)
2557     return SUCCESS;
2558
2559   if (e->ts.type != BT_INTEGER)
2560     {
2561       gfc_error ("Expression at %L must be of INTEGER type", &e->where);
2562       return FAILURE;
2563     }
2564
2565   if (e->expr_type == EXPR_FUNCTION
2566           && !e->value.function.isym
2567           && !e->value.function.esym
2568           && !gfc_pure (e->symtree->n.sym))
2569     {
2570       gfc_error ("Function '%s' at %L must be PURE",
2571                  e->symtree->n.sym->name, &e->where);
2572       /* Prevent repeat error messages.  */
2573       e->symtree->n.sym->attr.pure = 1;
2574       return FAILURE;
2575     }
2576
2577   if (e->rank != 0)
2578     {
2579       gfc_error ("Expression at %L must be scalar", &e->where);
2580       return FAILURE;
2581     }
2582
2583   if (gfc_simplify_expr (e, 0) == FAILURE)
2584     return FAILURE;
2585
2586   return check_restricted (e);
2587 }
2588
2589
2590 /************** Expression conformance checks.  *************/
2591
2592 /* Given two expressions, make sure that the arrays are conformable.  */
2593
2594 try
2595 gfc_check_conformance (const char *optype_msgid, gfc_expr *op1, gfc_expr *op2)
2596 {
2597   int op1_flag, op2_flag, d;
2598   mpz_t op1_size, op2_size;
2599   try t;
2600
2601   if (op1->rank == 0 || op2->rank == 0)
2602     return SUCCESS;
2603
2604   if (op1->rank != op2->rank)
2605     {
2606       gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(optype_msgid),
2607                  op1->rank, op2->rank, &op1->where);
2608       return FAILURE;
2609     }
2610
2611   t = SUCCESS;
2612
2613   for (d = 0; d < op1->rank; d++)
2614     {
2615       op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2616       op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2617
2618       if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2619         {
2620           gfc_error ("Different shape for %s at %L on dimension %d "
2621                      "(%d and %d)", _(optype_msgid), &op1->where, d + 1,
2622                      (int) mpz_get_si (op1_size),
2623                      (int) mpz_get_si (op2_size));
2624
2625           t = FAILURE;
2626         }
2627
2628       if (op1_flag)
2629         mpz_clear (op1_size);
2630       if (op2_flag)
2631         mpz_clear (op2_size);
2632
2633       if (t == FAILURE)
2634         return FAILURE;
2635     }
2636
2637   return SUCCESS;
2638 }
2639
2640
2641 /* Given an assignable expression and an arbitrary expression, make
2642    sure that the assignment can take place.  */
2643
2644 try
2645 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
2646 {
2647   gfc_symbol *sym;
2648   gfc_ref *ref;
2649   int has_pointer;
2650
2651   sym = lvalue->symtree->n.sym;
2652
2653   /* Check INTENT(IN), unless the object itself is the component or
2654      sub-component of a pointer.  */
2655   has_pointer = sym->attr.pointer;
2656
2657   for (ref = lvalue->ref; ref; ref = ref->next)
2658     if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2659       {
2660         has_pointer = 1;
2661         break;
2662       }
2663
2664   if (!has_pointer && sym->attr.intent == INTENT_IN)
2665     {
2666       gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2667                  sym->name, &lvalue->where);
2668       return FAILURE;
2669     }
2670
2671   /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2672      variable local to a function subprogram.  Its existence begins when
2673      execution of the function is initiated and ends when execution of the
2674      function is terminated...
2675      Therefore, the left hand side is no longer a variable, when it is:  */
2676   if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
2677       && !sym->attr.external)
2678     {
2679       bool bad_proc;
2680       bad_proc = false;
2681
2682       /* (i) Use associated;  */
2683       if (sym->attr.use_assoc)
2684         bad_proc = true;
2685
2686       /* (ii) The assignment is in the main program; or  */
2687       if (gfc_current_ns->proc_name->attr.is_main_program)
2688         bad_proc = true;
2689
2690       /* (iii) A module or internal procedure...  */
2691       if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2692            || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2693           && gfc_current_ns->parent
2694           && (!(gfc_current_ns->parent->proc_name->attr.function
2695                 || gfc_current_ns->parent->proc_name->attr.subroutine)
2696               || gfc_current_ns->parent->proc_name->attr.is_main_program))
2697         {
2698           /* ... that is not a function...  */ 
2699           if (!gfc_current_ns->proc_name->attr.function)
2700             bad_proc = true;
2701
2702           /* ... or is not an entry and has a different name.  */
2703           if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2704             bad_proc = true;
2705         }
2706
2707       if (bad_proc)
2708         {
2709           gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2710           return FAILURE;
2711         }
2712     }
2713
2714   if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2715     {
2716       gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2717                  lvalue->rank, rvalue->rank, &lvalue->where);
2718       return FAILURE;
2719     }
2720
2721   if (lvalue->ts.type == BT_UNKNOWN)
2722     {
2723       gfc_error ("Variable type is UNKNOWN in assignment at %L",
2724                  &lvalue->where);
2725       return FAILURE;
2726     }
2727
2728   if (rvalue->expr_type == EXPR_NULL)
2729     {  
2730       if (lvalue->symtree->n.sym->attr.pointer
2731           && lvalue->symtree->n.sym->attr.data)
2732         return SUCCESS;
2733       else
2734         {
2735           gfc_error ("NULL appears on right-hand side in assignment at %L",
2736                      &rvalue->where);
2737           return FAILURE;
2738         }
2739     }
2740
2741    if (sym->attr.cray_pointee
2742        && lvalue->ref != NULL
2743        && lvalue->ref->u.ar.type == AR_FULL
2744        && lvalue->ref->u.ar.as->cp_was_assumed)
2745      {
2746        gfc_error ("Vector assignment to assumed-size Cray Pointee at %L "
2747                   "is illegal", &lvalue->where);
2748        return FAILURE;
2749      }
2750
2751   /* This is possibly a typo: x = f() instead of x => f().  */
2752   if (gfc_option.warn_surprising 
2753       && rvalue->expr_type == EXPR_FUNCTION
2754       && rvalue->symtree->n.sym->attr.pointer)
2755     gfc_warning ("POINTER valued function appears on right-hand side of "
2756                  "assignment at %L", &rvalue->where);
2757
2758   /* Check size of array assignments.  */
2759   if (lvalue->rank != 0 && rvalue->rank != 0
2760       && gfc_check_conformance ("array assignment", lvalue, rvalue) != SUCCESS)
2761     return FAILURE;
2762
2763   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
2764       && lvalue->symtree->n.sym->attr.data
2765       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L used to "
2766                          "initialize non-integer variable '%s'",
2767                          &rvalue->where, lvalue->symtree->n.sym->name)
2768          == FAILURE)
2769     return FAILURE;
2770   else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
2771       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L outside "
2772                          "a DATA statement and outside INT/REAL/DBLE/CMPLX",
2773                          &rvalue->where) == FAILURE)
2774     return FAILURE;
2775
2776   /* Handle the case of a BOZ literal on the RHS.  */
2777   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
2778     {
2779       int rc;
2780       if (gfc_option.warn_surprising)
2781         gfc_warning ("BOZ literal at %L is bitwise transferred "
2782                      "non-integer symbol '%s'", &rvalue->where,
2783                      lvalue->symtree->n.sym->name);
2784       if (!gfc_convert_boz (rvalue, &lvalue->ts))
2785         return FAILURE;
2786       if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
2787         {
2788           if (rc == ARITH_UNDERFLOW)
2789             gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
2790                        ". This check can be disabled with the option "
2791                        "-fno-range-check", &rvalue->where);
2792           else if (rc == ARITH_OVERFLOW)
2793             gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
2794                        ". This check can be disabled with the option "
2795                        "-fno-range-check", &rvalue->where);
2796           else if (rc == ARITH_NAN)
2797             gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
2798                        ". This check can be disabled with the option "
2799                        "-fno-range-check", &rvalue->where);
2800           return FAILURE;
2801         }
2802     }
2803
2804   if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2805     return SUCCESS;
2806
2807   if (!conform)
2808     {
2809       /* Numeric can be converted to any other numeric. And Hollerith can be
2810          converted to any other type.  */
2811       if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2812           || rvalue->ts.type == BT_HOLLERITH)
2813         return SUCCESS;
2814
2815       if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2816         return SUCCESS;
2817
2818       gfc_error ("Incompatible types in assignment at %L, %s to %s",
2819                  &rvalue->where, gfc_typename (&rvalue->ts),
2820                  gfc_typename (&lvalue->ts));
2821
2822       return FAILURE;
2823     }
2824
2825   return gfc_convert_type (rvalue, &lvalue->ts, 1);
2826 }
2827
2828
2829 /* Check that a pointer assignment is OK.  We first check lvalue, and
2830    we only check rvalue if it's not an assignment to NULL() or a
2831    NULLIFY statement.  */
2832
2833 try
2834 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
2835 {
2836   symbol_attribute attr;
2837   gfc_ref *ref;
2838   int is_pure;
2839   int pointer, check_intent_in;
2840
2841   if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN)
2842     {
2843       gfc_error ("Pointer assignment target is not a POINTER at %L",
2844                  &lvalue->where);
2845       return FAILURE;
2846     }
2847
2848   if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
2849       && lvalue->symtree->n.sym->attr.use_assoc)
2850     {
2851       gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2852                  "l-value since it is a procedure",
2853                  lvalue->symtree->n.sym->name, &lvalue->where);
2854       return FAILURE;
2855     }
2856
2857
2858   /* Check INTENT(IN), unless the object itself is the component or
2859      sub-component of a pointer.  */
2860   check_intent_in = 1;
2861   pointer = lvalue->symtree->n.sym->attr.pointer;
2862
2863   for (ref = lvalue->ref; ref; ref = ref->next)
2864     {
2865       if (pointer)
2866         check_intent_in = 0;
2867
2868       if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2869         pointer = 1;
2870     }
2871
2872   if (check_intent_in && lvalue->symtree->n.sym->attr.intent == INTENT_IN)
2873     {
2874       gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2875                  lvalue->symtree->n.sym->name, &lvalue->where);
2876       return FAILURE;
2877     }
2878
2879   if (!pointer)
2880     {
2881       gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2882       return FAILURE;
2883     }
2884
2885   is_pure = gfc_pure (NULL);
2886
2887   if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym)
2888         && lvalue->symtree->n.sym->value != rvalue)
2889     {
2890       gfc_error ("Bad pointer object in PURE procedure at %L", &lvalue->where);
2891       return FAILURE;
2892     }
2893
2894   /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2895      kind, etc for lvalue and rvalue must match, and rvalue must be a
2896      pure variable if we're in a pure function.  */
2897   if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
2898     return SUCCESS;
2899
2900   if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
2901     {
2902       gfc_error ("Different types in pointer assignment at %L",
2903                  &lvalue->where);
2904       return FAILURE;
2905     }
2906
2907   if (lvalue->ts.kind != rvalue->ts.kind)
2908     {
2909       gfc_error ("Different kind type parameters in pointer "
2910                  "assignment at %L", &lvalue->where);
2911       return FAILURE;
2912     }
2913
2914   if (lvalue->rank != rvalue->rank)
2915     {
2916       gfc_error ("Different ranks in pointer assignment at %L",
2917                  &lvalue->where);
2918       return FAILURE;
2919     }
2920
2921   /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
2922   if (rvalue->expr_type == EXPR_NULL)
2923     return SUCCESS;
2924
2925   if (lvalue->ts.type == BT_CHARACTER
2926       && lvalue->ts.cl && rvalue->ts.cl
2927       && lvalue->ts.cl->length && rvalue->ts.cl->length
2928       && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
2929                                     rvalue->ts.cl->length)) == 1)
2930     {
2931       gfc_error ("Different character lengths in pointer "
2932                  "assignment at %L", &lvalue->where);
2933       return FAILURE;
2934     }
2935
2936   if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
2937     lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
2938
2939   attr = gfc_expr_attr (rvalue);
2940   if (!attr.target && !attr.pointer)
2941     {
2942       gfc_error ("Pointer assignment target is neither TARGET "
2943                  "nor POINTER at %L", &rvalue->where);
2944       return FAILURE;
2945     }
2946
2947   if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
2948     {
2949       gfc_error ("Bad target in pointer assignment in PURE "
2950                  "procedure at %L", &rvalue->where);
2951     }
2952
2953   if (gfc_has_vector_index (rvalue))
2954     {
2955       gfc_error ("Pointer assignment with vector subscript "
2956                  "on rhs at %L", &rvalue->where);
2957       return FAILURE;
2958     }
2959
2960   if (attr.protected && attr.use_assoc)
2961     {
2962       gfc_error ("Pointer assigment target has PROTECTED "
2963                  "attribute at %L", &rvalue->where);
2964       return FAILURE;
2965     }
2966
2967   return SUCCESS;
2968 }
2969
2970
2971 /* Relative of gfc_check_assign() except that the lvalue is a single
2972    symbol.  Used for initialization assignments.  */
2973
2974 try
2975 gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
2976 {
2977   gfc_expr lvalue;
2978   try r;
2979
2980   memset (&lvalue, '\0', sizeof (gfc_expr));
2981
2982   lvalue.expr_type = EXPR_VARIABLE;
2983   lvalue.ts = sym->ts;
2984   if (sym->as)
2985     lvalue.rank = sym->as->rank;
2986   lvalue.symtree = (gfc_symtree *) gfc_getmem (sizeof (gfc_symtree));
2987   lvalue.symtree->n.sym = sym;
2988   lvalue.where = sym->declared_at;
2989
2990   if (sym->attr.pointer)
2991     r = gfc_check_pointer_assign (&lvalue, rvalue);
2992   else
2993     r = gfc_check_assign (&lvalue, rvalue, 1);
2994
2995   gfc_free (lvalue.symtree);
2996
2997   return r;
2998 }
2999
3000
3001 /* Get an expression for a default initializer.  */
3002
3003 gfc_expr *
3004 gfc_default_initializer (gfc_typespec *ts)
3005 {
3006   gfc_constructor *tail;
3007   gfc_expr *init;
3008   gfc_component *c;
3009
3010   /* See if we have a default initializer.  */
3011   for (c = ts->derived->components; c; c = c->next)
3012     if (c->initializer || c->allocatable)
3013       break;
3014
3015   if (!c)
3016     return NULL;
3017
3018   /* Build the constructor.  */
3019   init = gfc_get_expr ();
3020   init->expr_type = EXPR_STRUCTURE;
3021   init->ts = *ts;
3022   init->where = ts->derived->declared_at;
3023
3024   tail = NULL;
3025   for (c = ts->derived->components; c; c = c->next)
3026     {
3027       if (tail == NULL)
3028         init->value.constructor = tail = gfc_get_constructor ();
3029       else
3030         {
3031           tail->next = gfc_get_constructor ();
3032           tail = tail->next;
3033         }
3034
3035       if (c->initializer)
3036         tail->expr = gfc_copy_expr (c->initializer);
3037
3038       if (c->allocatable)
3039         {
3040           tail->expr = gfc_get_expr ();
3041           tail->expr->expr_type = EXPR_NULL;
3042           tail->expr->ts = c->ts;
3043         }
3044     }
3045   return init;
3046 }
3047
3048
3049 /* Given a symbol, create an expression node with that symbol as a
3050    variable. If the symbol is array valued, setup a reference of the
3051    whole array.  */
3052
3053 gfc_expr *
3054 gfc_get_variable_expr (gfc_symtree *var)
3055 {
3056   gfc_expr *e;
3057
3058   e = gfc_get_expr ();
3059   e->expr_type = EXPR_VARIABLE;
3060   e->symtree = var;
3061   e->ts = var->n.sym->ts;
3062
3063   if (var->n.sym->as != NULL)
3064     {
3065       e->rank = var->n.sym->as->rank;
3066       e->ref = gfc_get_ref ();
3067       e->ref->type = REF_ARRAY;
3068       e->ref->u.ar.type = AR_FULL;
3069     }
3070
3071   return e;
3072 }
3073
3074
3075 /* General expression traversal function.  */
3076
3077 bool
3078 gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
3079                    bool (*func)(gfc_expr *, gfc_symbol *, int*),
3080                    int f)
3081 {
3082   gfc_array_ref ar;
3083   gfc_ref *ref;
3084   gfc_actual_arglist *args;
3085   gfc_constructor *c;
3086   int i;
3087
3088   if (!expr)
3089     return false;
3090
3091   if ((*func) (expr, sym, &f))
3092     return true;
3093
3094   if (expr->ts.type == BT_CHARACTER
3095         && expr->ts.cl
3096         && expr->ts.cl->length
3097         && expr->ts.cl->length->expr_type != EXPR_CONSTANT
3098         && gfc_traverse_expr (expr->ts.cl->length, sym, func, f))
3099     return true;
3100
3101   switch (expr->expr_type)
3102     {
3103     case EXPR_FUNCTION:
3104       for (args = expr->value.function.actual; args; args = args->next)
3105         {
3106           if (gfc_traverse_expr (args->expr, sym, func, f))
3107             return true;
3108         }
3109       break;
3110
3111     case EXPR_VARIABLE:
3112     case EXPR_CONSTANT:
3113     case EXPR_NULL:
3114     case EXPR_SUBSTRING:
3115       break;
3116
3117     case EXPR_STRUCTURE:
3118     case EXPR_ARRAY:
3119       for (c = expr->value.constructor; c; c = c->next)
3120         {
3121           if (gfc_traverse_expr (c->expr, sym, func, f))
3122             return true;
3123           if (c->iterator)
3124             {
3125               if (gfc_traverse_expr (c->iterator->var, sym, func, f))
3126                 return true;
3127               if (gfc_traverse_expr (c->iterator->start, sym, func, f))
3128                 return true;
3129               if (gfc_traverse_expr (c->iterator->end, sym, func, f))
3130                 return true;
3131               if (gfc_traverse_expr (c->iterator->step, sym, func, f))
3132                 return true;
3133             }
3134         }
3135       break;
3136
3137     case EXPR_OP:
3138       if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
3139         return true;
3140       if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
3141         return true;
3142       break;
3143
3144     default:
3145       gcc_unreachable ();
3146       break;
3147     }
3148
3149   ref = expr->ref;
3150   while (ref != NULL)
3151     {
3152       switch (ref->type)
3153         {
3154         case  REF_ARRAY:
3155           ar = ref->u.ar;
3156           for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
3157             {
3158               if (gfc_traverse_expr (ar.start[i], sym, func, f))
3159                 return true;
3160               if (gfc_traverse_expr (ar.end[i], sym, func, f))
3161                 return true;
3162               if (gfc_traverse_expr (ar.stride[i], sym, func, f))
3163                 return true;
3164             }
3165           break;
3166
3167         case REF_SUBSTRING:
3168           if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
3169             return true;
3170           if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
3171             return true;
3172           break;
3173
3174         case REF_COMPONENT:
3175           if (ref->u.c.component->ts.type == BT_CHARACTER
3176                 && ref->u.c.component->ts.cl
3177                 && ref->u.c.component->ts.cl->length
3178                 && ref->u.c.component->ts.cl->length->expr_type
3179                      != EXPR_CONSTANT
3180                 && gfc_traverse_expr (ref->u.c.component->ts.cl->length,
3181                                       sym, func, f))
3182             return true;
3183
3184           if (ref->u.c.component->as)
3185             for (i = 0; i < ref->u.c.component->as->rank; i++)
3186               {
3187                 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
3188                                        sym, func, f))
3189                   return true;
3190                 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
3191                                        sym, func, f))
3192                   return true;
3193               }
3194           break;
3195
3196         default:
3197           gcc_unreachable ();
3198         }
3199       ref = ref->next;
3200     }
3201   return false;
3202 }
3203
3204 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
3205
3206 static bool
3207 expr_set_symbols_referenced (gfc_expr *expr,
3208                              gfc_symbol *sym ATTRIBUTE_UNUSED,
3209                              int *f ATTRIBUTE_UNUSED)
3210 {
3211   if (expr->expr_type != EXPR_VARIABLE)
3212     return false;
3213   gfc_set_sym_referenced (expr->symtree->n.sym);
3214   return false;
3215 }
3216
3217 void
3218 gfc_expr_set_symbols_referenced (gfc_expr *expr)
3219 {
3220   gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
3221 }