OSDN Git Service

2007-12-20 Tobias Burnus <burnus@net-b.de>
[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
1028       /* Check the bounds.  */
1029       if (ar->as->upper[i]
1030           && (mpz_cmp (e->value.integer, ar->as->upper[i]->value.integer) > 0
1031               || mpz_cmp (e->value.integer,
1032                           ar->as->lower[i]->value.integer) < 0))
1033         {
1034           gfc_error ("index in dimension %d is out of bounds "
1035                      "at %L", i + 1, &ar->c_where[i]);
1036           cons = NULL;
1037           t = FAILURE;
1038           goto depart;
1039         }
1040
1041       mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer);
1042       mpz_mul (delta, delta, span);
1043       mpz_add (offset, offset, delta);
1044
1045       mpz_set_ui (tmp, 1);
1046       mpz_add (tmp, tmp, ar->as->upper[i]->value.integer);
1047       mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
1048       mpz_mul (span, span, tmp);
1049     }
1050
1051   if (cons)
1052     {
1053       for (nelemen = mpz_get_ui (offset); nelemen > 0; nelemen--)
1054         {
1055           if (cons->iterator)
1056             {
1057               cons = NULL;
1058               goto depart;
1059             }
1060           cons = cons->next;
1061         }
1062     }
1063
1064 depart:
1065   mpz_clear (delta);
1066   mpz_clear (offset);
1067   mpz_clear (span);
1068   mpz_clear (tmp);
1069   if (e)
1070     gfc_free_expr (e);
1071   *rval = cons;
1072   return t;
1073 }
1074
1075
1076 /* Find a component of a structure constructor.  */
1077
1078 static gfc_constructor *
1079 find_component_ref (gfc_constructor *cons, gfc_ref *ref)
1080 {
1081   gfc_component *comp;
1082   gfc_component *pick;
1083
1084   comp = ref->u.c.sym->components;
1085   pick = ref->u.c.component;
1086   while (comp != pick)
1087     {
1088       comp = comp->next;
1089       cons = cons->next;
1090     }
1091
1092   return cons;
1093 }
1094
1095
1096 /* Replace an expression with the contents of a constructor, removing
1097    the subobject reference in the process.  */
1098
1099 static void
1100 remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
1101 {
1102   gfc_expr *e;
1103
1104   e = cons->expr;
1105   cons->expr = NULL;
1106   e->ref = p->ref->next;
1107   p->ref->next =  NULL;
1108   gfc_replace_expr (p, e);
1109 }
1110
1111
1112 /* Pull an array section out of an array constructor.  */
1113
1114 static try
1115 find_array_section (gfc_expr *expr, gfc_ref *ref)
1116 {
1117   int idx;
1118   int rank;
1119   int d;
1120   int shape_i;
1121   long unsigned one = 1;
1122   bool incr_ctr;
1123   mpz_t start[GFC_MAX_DIMENSIONS];
1124   mpz_t end[GFC_MAX_DIMENSIONS];
1125   mpz_t stride[GFC_MAX_DIMENSIONS];
1126   mpz_t delta[GFC_MAX_DIMENSIONS];
1127   mpz_t ctr[GFC_MAX_DIMENSIONS];
1128   mpz_t delta_mpz;
1129   mpz_t tmp_mpz;
1130   mpz_t nelts;
1131   mpz_t ptr;
1132   mpz_t index;
1133   gfc_constructor *cons;
1134   gfc_constructor *base;
1135   gfc_expr *begin;
1136   gfc_expr *finish;
1137   gfc_expr *step;
1138   gfc_expr *upper;
1139   gfc_expr *lower;
1140   gfc_constructor *vecsub[GFC_MAX_DIMENSIONS], *c;
1141   try t;
1142
1143   t = SUCCESS;
1144
1145   base = expr->value.constructor;
1146   expr->value.constructor = NULL;
1147
1148   rank = ref->u.ar.as->rank;
1149
1150   if (expr->shape == NULL)
1151     expr->shape = gfc_get_shape (rank);
1152
1153   mpz_init_set_ui (delta_mpz, one);
1154   mpz_init_set_ui (nelts, one);
1155   mpz_init (tmp_mpz);
1156
1157   /* Do the initialization now, so that we can cleanup without
1158      keeping track of where we were.  */
1159   for (d = 0; d < rank; d++)
1160     {
1161       mpz_init (delta[d]);
1162       mpz_init (start[d]);
1163       mpz_init (end[d]);
1164       mpz_init (ctr[d]);
1165       mpz_init (stride[d]);
1166       vecsub[d] = NULL;
1167     }
1168
1169   /* Build the counters to clock through the array reference.  */
1170   shape_i = 0;
1171   for (d = 0; d < rank; d++)
1172     {
1173       /* Make this stretch of code easier on the eye!  */
1174       begin = ref->u.ar.start[d];
1175       finish = ref->u.ar.end[d];
1176       step = ref->u.ar.stride[d];
1177       lower = ref->u.ar.as->lower[d];
1178       upper = ref->u.ar.as->upper[d];
1179
1180       if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR)  /* Vector subscript.  */
1181         {
1182           gcc_assert (begin);
1183
1184           if (begin->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (begin))
1185             {
1186               t = FAILURE;
1187               goto cleanup;
1188             }
1189
1190           gcc_assert (begin->rank == 1);
1191           gcc_assert (begin->shape);
1192
1193           vecsub[d] = begin->value.constructor;
1194           mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1195           mpz_mul (nelts, nelts, begin->shape[0]);
1196           mpz_set (expr->shape[shape_i++], begin->shape[0]);
1197
1198           /* Check bounds.  */
1199           for (c = vecsub[d]; c; c = c->next)
1200             {
1201               if (mpz_cmp (c->expr->value.integer, upper->value.integer) > 0
1202                   || mpz_cmp (c->expr->value.integer,
1203                               lower->value.integer) < 0)
1204                 {
1205                   gfc_error ("index in dimension %d is out of bounds "
1206                              "at %L", d + 1, &ref->u.ar.c_where[d]);
1207                   t = FAILURE;
1208                   goto cleanup;
1209                 }
1210             }
1211         }
1212       else
1213         {
1214           if ((begin && begin->expr_type != EXPR_CONSTANT)
1215               || (finish && finish->expr_type != EXPR_CONSTANT)
1216               || (step && step->expr_type != EXPR_CONSTANT))
1217             {
1218               t = FAILURE;
1219               goto cleanup;
1220             }
1221
1222           /* Obtain the stride.  */
1223           if (step)
1224             mpz_set (stride[d], step->value.integer);
1225           else
1226             mpz_set_ui (stride[d], one);
1227
1228           if (mpz_cmp_ui (stride[d], 0) == 0)
1229             mpz_set_ui (stride[d], one);
1230
1231           /* Obtain the start value for the index.  */
1232           if (begin)
1233             mpz_set (start[d], begin->value.integer);
1234           else
1235             mpz_set (start[d], lower->value.integer);
1236
1237           mpz_set (ctr[d], start[d]);
1238
1239           /* Obtain the end value for the index.  */
1240           if (finish)
1241             mpz_set (end[d], finish->value.integer);
1242           else
1243             mpz_set (end[d], upper->value.integer);
1244
1245           /* Separate 'if' because elements sometimes arrive with
1246              non-null end.  */
1247           if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1248             mpz_set (end [d], begin->value.integer);
1249
1250           /* Check the bounds.  */
1251           if (mpz_cmp (ctr[d], upper->value.integer) > 0
1252               || mpz_cmp (end[d], upper->value.integer) > 0
1253               || mpz_cmp (ctr[d], lower->value.integer) < 0
1254               || mpz_cmp (end[d], lower->value.integer) < 0)
1255             {
1256               gfc_error ("index in dimension %d is out of bounds "
1257                          "at %L", d + 1, &ref->u.ar.c_where[d]);
1258               t = FAILURE;
1259               goto cleanup;
1260             }
1261
1262           /* Calculate the number of elements and the shape.  */
1263           mpz_set (tmp_mpz, stride[d]);
1264           mpz_add (tmp_mpz, end[d], tmp_mpz);
1265           mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1266           mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1267           mpz_mul (nelts, nelts, tmp_mpz);
1268
1269           /* An element reference reduces the rank of the expression; don't
1270              add anything to the shape array.  */
1271           if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT) 
1272             mpz_set (expr->shape[shape_i++], tmp_mpz);
1273         }
1274
1275       /* Calculate the 'stride' (=delta) for conversion of the
1276          counter values into the index along the constructor.  */
1277       mpz_set (delta[d], delta_mpz);
1278       mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1279       mpz_add_ui (tmp_mpz, tmp_mpz, one);
1280       mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1281     }
1282
1283   mpz_init (index);
1284   mpz_init (ptr);
1285   cons = base;
1286
1287   /* Now clock through the array reference, calculating the index in
1288      the source constructor and transferring the elements to the new
1289      constructor.  */  
1290   for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
1291     {
1292       if (ref->u.ar.offset)
1293         mpz_set (ptr, ref->u.ar.offset->value.integer);
1294       else
1295         mpz_init_set_ui (ptr, 0);
1296
1297       incr_ctr = true;
1298       for (d = 0; d < rank; d++)
1299         {
1300           mpz_set (tmp_mpz, ctr[d]);
1301           mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
1302           mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1303           mpz_add (ptr, ptr, tmp_mpz);
1304
1305           if (!incr_ctr) continue;
1306
1307           if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript.  */
1308             {
1309               gcc_assert(vecsub[d]);
1310
1311               if (!vecsub[d]->next)
1312                 vecsub[d] = ref->u.ar.start[d]->value.constructor;
1313               else
1314                 {
1315                   vecsub[d] = vecsub[d]->next;
1316                   incr_ctr = false;
1317                 }
1318               mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1319             }
1320           else
1321             {
1322               mpz_add (ctr[d], ctr[d], stride[d]); 
1323
1324               if (mpz_cmp_ui (stride[d], 0) > 0
1325                   ? mpz_cmp (ctr[d], end[d]) > 0
1326                   : mpz_cmp (ctr[d], end[d]) < 0)
1327                 mpz_set (ctr[d], start[d]);
1328               else
1329                 incr_ctr = false;
1330             }
1331         }
1332
1333       /* There must be a better way of dealing with negative strides
1334          than resetting the index and the constructor pointer!  */ 
1335       if (mpz_cmp (ptr, index) < 0)
1336         {
1337           mpz_set_ui (index, 0);
1338           cons = base;
1339         }
1340
1341       while (mpz_cmp (ptr, index) > 0)
1342         {
1343           mpz_add_ui (index, index, one);
1344           cons = cons->next;
1345         }
1346
1347       gfc_append_constructor (expr, gfc_copy_expr (cons->expr));
1348     }
1349
1350   mpz_clear (ptr);
1351   mpz_clear (index);
1352
1353 cleanup:
1354
1355   mpz_clear (delta_mpz);
1356   mpz_clear (tmp_mpz);
1357   mpz_clear (nelts);
1358   for (d = 0; d < rank; d++)
1359     {
1360       mpz_clear (delta[d]);
1361       mpz_clear (start[d]);
1362       mpz_clear (end[d]);
1363       mpz_clear (ctr[d]);
1364       mpz_clear (stride[d]);
1365     }
1366   gfc_free_constructor (base);
1367   return t;
1368 }
1369
1370 /* Pull a substring out of an expression.  */
1371
1372 static try
1373 find_substring_ref (gfc_expr *p, gfc_expr **newp)
1374 {
1375   int end;
1376   int start;
1377   int length;
1378   char *chr;
1379
1380   if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1381       || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1382     return FAILURE;
1383
1384   *newp = gfc_copy_expr (p);
1385   gfc_free ((*newp)->value.character.string);
1386
1387   end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer);
1388   start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer);
1389   length = end - start + 1;
1390
1391   chr = (*newp)->value.character.string = gfc_getmem (length + 1);
1392   (*newp)->value.character.length = length;
1393   memcpy (chr, &p->value.character.string[start - 1], length);
1394   chr[length] = '\0';
1395   return SUCCESS;
1396 }
1397
1398
1399
1400 /* Simplify a subobject reference of a constructor.  This occurs when
1401    parameter variable values are substituted.  */
1402
1403 static try
1404 simplify_const_ref (gfc_expr *p)
1405 {
1406   gfc_constructor *cons;
1407   gfc_expr *newp;
1408
1409   while (p->ref)
1410     {
1411       switch (p->ref->type)
1412         {
1413         case REF_ARRAY:
1414           switch (p->ref->u.ar.type)
1415             {
1416             case AR_ELEMENT:
1417               if (find_array_element (p->value.constructor, &p->ref->u.ar,
1418                                       &cons) == FAILURE)
1419                 return FAILURE;
1420
1421               if (!cons)
1422                 return SUCCESS;
1423
1424               remove_subobject_ref (p, cons);
1425               break;
1426
1427             case AR_SECTION:
1428               if (find_array_section (p, p->ref) == FAILURE)
1429                 return FAILURE;
1430               p->ref->u.ar.type = AR_FULL;
1431
1432             /* Fall through.  */
1433
1434             case AR_FULL:
1435               if (p->ref->next != NULL
1436                   && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
1437                 {
1438                   cons = p->value.constructor;
1439                   for (; cons; cons = cons->next)
1440                     {
1441                       cons->expr->ref = copy_ref (p->ref->next);
1442                       simplify_const_ref (cons->expr);
1443                     }
1444                 }
1445               gfc_free_ref_list (p->ref);
1446               p->ref = NULL;
1447               break;
1448
1449             default:
1450               return SUCCESS;
1451             }
1452
1453           break;
1454
1455         case REF_COMPONENT:
1456           cons = find_component_ref (p->value.constructor, p->ref);
1457           remove_subobject_ref (p, cons);
1458           break;
1459
1460         case REF_SUBSTRING:
1461           if (find_substring_ref (p, &newp) == FAILURE)
1462             return FAILURE;
1463
1464           gfc_replace_expr (p, newp);
1465           gfc_free_ref_list (p->ref);
1466           p->ref = NULL;
1467           break;
1468         }
1469     }
1470
1471   return SUCCESS;
1472 }
1473
1474
1475 /* Simplify a chain of references.  */
1476
1477 static try
1478 simplify_ref_chain (gfc_ref *ref, int type)
1479 {
1480   int n;
1481
1482   for (; ref; ref = ref->next)
1483     {
1484       switch (ref->type)
1485         {
1486         case REF_ARRAY:
1487           for (n = 0; n < ref->u.ar.dimen; n++)
1488             {
1489               if (gfc_simplify_expr (ref->u.ar.start[n], type) == FAILURE)
1490                 return FAILURE;
1491               if (gfc_simplify_expr (ref->u.ar.end[n], type) == FAILURE)
1492                 return FAILURE;
1493               if (gfc_simplify_expr (ref->u.ar.stride[n], type) == FAILURE)
1494                 return FAILURE;
1495             }
1496           break;
1497
1498         case REF_SUBSTRING:
1499           if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1500             return FAILURE;
1501           if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1502             return FAILURE;
1503           break;
1504
1505         default:
1506           break;
1507         }
1508     }
1509   return SUCCESS;
1510 }
1511
1512
1513 /* Try to substitute the value of a parameter variable.  */
1514
1515 static try
1516 simplify_parameter_variable (gfc_expr *p, int type)
1517 {
1518   gfc_expr *e;
1519   try t;
1520
1521   e = gfc_copy_expr (p->symtree->n.sym->value);
1522   if (e == NULL)
1523     return FAILURE;
1524
1525   e->rank = p->rank;
1526
1527   /* Do not copy subobject refs for constant.  */
1528   if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1529     e->ref = copy_ref (p->ref);
1530   t = gfc_simplify_expr (e, type);
1531
1532   /* Only use the simplification if it eliminated all subobject references.  */
1533   if (t == SUCCESS && !e->ref)
1534     gfc_replace_expr (p, e);
1535   else
1536     gfc_free_expr (e);
1537
1538   return t;
1539 }
1540
1541 /* Given an expression, simplify it by collapsing constant
1542    expressions.  Most simplification takes place when the expression
1543    tree is being constructed.  If an intrinsic function is simplified
1544    at some point, we get called again to collapse the result against
1545    other constants.
1546
1547    We work by recursively simplifying expression nodes, simplifying
1548    intrinsic functions where possible, which can lead to further
1549    constant collapsing.  If an operator has constant operand(s), we
1550    rip the expression apart, and rebuild it, hoping that it becomes
1551    something simpler.
1552
1553    The expression type is defined for:
1554      0   Basic expression parsing
1555      1   Simplifying array constructors -- will substitute
1556          iterator values.
1557    Returns FAILURE on error, SUCCESS otherwise.
1558    NOTE: Will return SUCCESS even if the expression can not be simplified.  */
1559
1560 try
1561 gfc_simplify_expr (gfc_expr *p, int type)
1562 {
1563   gfc_actual_arglist *ap;
1564
1565   if (p == NULL)
1566     return SUCCESS;
1567
1568   switch (p->expr_type)
1569     {
1570     case EXPR_CONSTANT:
1571     case EXPR_NULL:
1572       break;
1573
1574     case EXPR_FUNCTION:
1575       for (ap = p->value.function.actual; ap; ap = ap->next)
1576         if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1577           return FAILURE;
1578
1579       if (p->value.function.isym != NULL
1580           && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1581         return FAILURE;
1582
1583       break;
1584
1585     case EXPR_SUBSTRING:
1586       if (simplify_ref_chain (p->ref, type) == FAILURE)
1587         return FAILURE;
1588
1589       if (gfc_is_constant_expr (p))
1590         {
1591           char *s;
1592           int start, end;
1593
1594           if (p->ref && p->ref->u.ss.start)
1595             {
1596               gfc_extract_int (p->ref->u.ss.start, &start);
1597               start--;  /* Convert from one-based to zero-based.  */
1598             }
1599           else
1600             start = 0;
1601
1602           if (p->ref && p->ref->u.ss.end)
1603             gfc_extract_int (p->ref->u.ss.end, &end);
1604           else
1605             end = p->value.character.length;
1606
1607           s = gfc_getmem (end - start + 2);
1608           memcpy (s, p->value.character.string + start, end - start);
1609           s[end - start + 1] = '\0';  /* TODO: C-style string.  */
1610           gfc_free (p->value.character.string);
1611           p->value.character.string = s;
1612           p->value.character.length = end - start;
1613           p->ts.cl = gfc_get_charlen ();
1614           p->ts.cl->next = gfc_current_ns->cl_list;
1615           gfc_current_ns->cl_list = p->ts.cl;
1616           p->ts.cl->length = gfc_int_expr (p->value.character.length);
1617           gfc_free_ref_list (p->ref);
1618           p->ref = NULL;
1619           p->expr_type = EXPR_CONSTANT;
1620         }
1621       break;
1622
1623     case EXPR_OP:
1624       if (simplify_intrinsic_op (p, type) == FAILURE)
1625         return FAILURE;
1626       break;
1627
1628     case EXPR_VARIABLE:
1629       /* Only substitute array parameter variables if we are in an
1630          initialization expression, or we want a subsection.  */
1631       if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1632           && (gfc_init_expr || p->ref
1633               || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1634         {
1635           if (simplify_parameter_variable (p, type) == FAILURE)
1636             return FAILURE;
1637           break;
1638         }
1639
1640       if (type == 1)
1641         {
1642           gfc_simplify_iterator_var (p);
1643         }
1644
1645       /* Simplify subcomponent references.  */
1646       if (simplify_ref_chain (p->ref, type) == FAILURE)
1647         return FAILURE;
1648
1649       break;
1650
1651     case EXPR_STRUCTURE:
1652     case EXPR_ARRAY:
1653       if (simplify_ref_chain (p->ref, type) == FAILURE)
1654         return FAILURE;
1655
1656       if (simplify_constructor (p->value.constructor, type) == FAILURE)
1657         return FAILURE;
1658
1659       if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1660           && p->ref->u.ar.type == AR_FULL)
1661           gfc_expand_constructor (p);
1662
1663       if (simplify_const_ref (p) == FAILURE)
1664         return FAILURE;
1665
1666       break;
1667     }
1668
1669   return SUCCESS;
1670 }
1671
1672
1673 /* Returns the type of an expression with the exception that iterator
1674    variables are automatically integers no matter what else they may
1675    be declared as.  */
1676
1677 static bt
1678 et0 (gfc_expr *e)
1679 {
1680   if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1681     return BT_INTEGER;
1682
1683   return e->ts.type;
1684 }
1685
1686
1687 /* Check an intrinsic arithmetic operation to see if it is consistent
1688    with some type of expression.  */
1689
1690 static try check_init_expr (gfc_expr *);
1691
1692
1693 /* Scalarize an expression for an elemental intrinsic call.  */
1694
1695 static try
1696 scalarize_intrinsic_call (gfc_expr *e)
1697 {
1698   gfc_actual_arglist *a, *b;
1699   gfc_constructor *args[5], *ctor, *new_ctor;
1700   gfc_expr *expr, *old;
1701   int n, i, rank[5];
1702
1703   old = gfc_copy_expr (e);
1704
1705 /* Assume that the old expression carries the type information and
1706    that the first arg carries all the shape information.  */
1707   expr = gfc_copy_expr (old->value.function.actual->expr);
1708   gfc_free_constructor (expr->value.constructor);
1709   expr->value.constructor = NULL;
1710
1711   expr->ts = old->ts;
1712   expr->expr_type = EXPR_ARRAY;
1713
1714   /* Copy the array argument constructors into an array, with nulls
1715      for the scalars.  */
1716   n = 0;
1717   a = old->value.function.actual;
1718   for (; a; a = a->next)
1719     {
1720       /* Check that this is OK for an initialization expression.  */
1721       if (a->expr && check_init_expr (a->expr) == FAILURE)
1722         goto cleanup;
1723
1724       rank[n] = 0;
1725       if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
1726         {
1727           rank[n] = a->expr->rank;
1728           ctor = a->expr->symtree->n.sym->value->value.constructor;
1729           args[n] = gfc_copy_constructor (ctor);
1730         }
1731       else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
1732         {
1733           if (a->expr->rank)
1734             rank[n] = a->expr->rank;
1735           else
1736             rank[n] = 1;
1737           args[n] = gfc_copy_constructor (a->expr->value.constructor);
1738         }
1739       else
1740         args[n] = NULL;
1741       n++;
1742     }
1743
1744   for (i = 1; i < n; i++)
1745     if (rank[i] && rank[i] != rank[0])
1746       goto compliance;
1747
1748   /* Using the first argument as the master, step through the array
1749      calling the function for each element and advancing the array
1750      constructors together.  */
1751   ctor = args[0];
1752   new_ctor = NULL;
1753   for (; ctor; ctor = ctor->next)
1754     {
1755           if (expr->value.constructor == NULL)
1756             expr->value.constructor
1757                 = new_ctor = gfc_get_constructor ();
1758           else
1759             {
1760               new_ctor->next = gfc_get_constructor ();
1761               new_ctor = new_ctor->next;
1762             }
1763           new_ctor->expr = gfc_copy_expr (old);
1764           gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
1765           a = NULL;
1766           b = old->value.function.actual;
1767           for (i = 0; i < n; i++)
1768             {
1769               if (a == NULL)
1770                 new_ctor->expr->value.function.actual
1771                         = a = gfc_get_actual_arglist ();
1772               else
1773                 {
1774                   a->next = gfc_get_actual_arglist ();
1775                   a = a->next;
1776                 }
1777               if (args[i])
1778                 a->expr = gfc_copy_expr (args[i]->expr);
1779               else
1780                 a->expr = gfc_copy_expr (b->expr);
1781
1782               b = b->next;
1783             }
1784
1785           /* Simplify the function calls.  */
1786           if (gfc_simplify_expr (new_ctor->expr, 0) == FAILURE)
1787             goto cleanup;
1788
1789           for (i = 0; i < n; i++)
1790             if (args[i])
1791               args[i] = args[i]->next;
1792
1793           for (i = 1; i < n; i++)
1794             if (rank[i] && ((args[i] != NULL && args[0] == NULL)
1795                          || (args[i] == NULL && args[0] != NULL)))
1796               goto compliance;
1797     }
1798
1799   free_expr0 (e);
1800   *e = *expr;
1801   gfc_free_expr (old);
1802   return SUCCESS;
1803
1804 compliance:
1805   gfc_error_now ("elemental function arguments at %C are not compliant");
1806
1807 cleanup:
1808   gfc_free_expr (expr);
1809   gfc_free_expr (old);
1810   return FAILURE;
1811 }
1812
1813
1814 static try
1815 check_intrinsic_op (gfc_expr *e, try (*check_function) (gfc_expr *))
1816 {
1817   gfc_expr *op1 = e->value.op.op1;
1818   gfc_expr *op2 = e->value.op.op2;
1819
1820   if ((*check_function) (op1) == FAILURE)
1821     return FAILURE;
1822
1823   switch (e->value.op.operator)
1824     {
1825     case INTRINSIC_UPLUS:
1826     case INTRINSIC_UMINUS:
1827       if (!numeric_type (et0 (op1)))
1828         goto not_numeric;
1829       break;
1830
1831     case INTRINSIC_EQ:
1832     case INTRINSIC_EQ_OS:
1833     case INTRINSIC_NE:
1834     case INTRINSIC_NE_OS:
1835     case INTRINSIC_GT:
1836     case INTRINSIC_GT_OS:
1837     case INTRINSIC_GE:
1838     case INTRINSIC_GE_OS:
1839     case INTRINSIC_LT:
1840     case INTRINSIC_LT_OS:
1841     case INTRINSIC_LE:
1842     case INTRINSIC_LE_OS:
1843       if ((*check_function) (op2) == FAILURE)
1844         return FAILURE;
1845       
1846       if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1847           && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
1848         {
1849           gfc_error ("Numeric or CHARACTER operands are required in "
1850                      "expression at %L", &e->where);
1851          return FAILURE;
1852         }
1853       break;
1854
1855     case INTRINSIC_PLUS:
1856     case INTRINSIC_MINUS:
1857     case INTRINSIC_TIMES:
1858     case INTRINSIC_DIVIDE:
1859     case INTRINSIC_POWER:
1860       if ((*check_function) (op2) == FAILURE)
1861         return FAILURE;
1862
1863       if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
1864         goto not_numeric;
1865
1866       if (e->value.op.operator == INTRINSIC_POWER
1867           && check_function == check_init_expr && et0 (op2) != BT_INTEGER)
1868         {
1869           if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Noninteger "
1870                               "exponent in an initialization "
1871                               "expression at %L", &op2->where)
1872               == FAILURE)
1873             return FAILURE;
1874         }
1875
1876       break;
1877
1878     case INTRINSIC_CONCAT:
1879       if ((*check_function) (op2) == FAILURE)
1880         return FAILURE;
1881
1882       if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
1883         {
1884           gfc_error ("Concatenation operator in expression at %L "
1885                      "must have two CHARACTER operands", &op1->where);
1886           return FAILURE;
1887         }
1888
1889       if (op1->ts.kind != op2->ts.kind)
1890         {
1891           gfc_error ("Concat operator at %L must concatenate strings of the "
1892                      "same kind", &e->where);
1893           return FAILURE;
1894         }
1895
1896       break;
1897
1898     case INTRINSIC_NOT:
1899       if (et0 (op1) != BT_LOGICAL)
1900         {
1901           gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
1902                      "operand", &op1->where);
1903           return FAILURE;
1904         }
1905
1906       break;
1907
1908     case INTRINSIC_AND:
1909     case INTRINSIC_OR:
1910     case INTRINSIC_EQV:
1911     case INTRINSIC_NEQV:
1912       if ((*check_function) (op2) == FAILURE)
1913         return FAILURE;
1914
1915       if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
1916         {
1917           gfc_error ("LOGICAL operands are required in expression at %L",
1918                      &e->where);
1919           return FAILURE;
1920         }
1921
1922       break;
1923
1924     case INTRINSIC_PARENTHESES:
1925       break;
1926
1927     default:
1928       gfc_error ("Only intrinsic operators can be used in expression at %L",
1929                  &e->where);
1930       return FAILURE;
1931     }
1932
1933   return SUCCESS;
1934
1935 not_numeric:
1936   gfc_error ("Numeric operands are required in expression at %L", &e->where);
1937
1938   return FAILURE;
1939 }
1940
1941
1942 static match
1943 check_init_expr_arguments (gfc_expr *e)
1944 {
1945   gfc_actual_arglist *ap;
1946
1947   for (ap = e->value.function.actual; ap; ap = ap->next)
1948     if (check_init_expr (ap->expr) == FAILURE)
1949       return MATCH_ERROR;
1950
1951   return MATCH_YES;
1952 }
1953
1954 /* F95, 7.1.6.1, Initialization expressions, (7)
1955    F2003, 7.1.7 Initialization expression, (8)  */
1956
1957 static match
1958 check_inquiry (gfc_expr *e, int not_restricted)
1959 {
1960   const char *name;
1961   const char *const *functions;
1962
1963   static const char *const inquiry_func_f95[] = {
1964     "lbound", "shape", "size", "ubound",
1965     "bit_size", "len", "kind",
1966     "digits", "epsilon", "huge", "maxexponent", "minexponent",
1967     "precision", "radix", "range", "tiny",
1968     NULL
1969   };
1970
1971   static const char *const inquiry_func_f2003[] = {
1972     "lbound", "shape", "size", "ubound",
1973     "bit_size", "len", "kind",
1974     "digits", "epsilon", "huge", "maxexponent", "minexponent",
1975     "precision", "radix", "range", "tiny",
1976     "new_line", NULL
1977   };
1978
1979   int i;
1980   gfc_actual_arglist *ap;
1981
1982   if (!e->value.function.isym
1983       || !e->value.function.isym->inquiry)
1984     return MATCH_NO;
1985
1986   /* An undeclared parameter will get us here (PR25018).  */
1987   if (e->symtree == NULL)
1988     return MATCH_NO;
1989
1990   name = e->symtree->n.sym->name;
1991
1992   functions = (gfc_option.warn_std & GFC_STD_F2003) 
1993                 ? inquiry_func_f2003 : inquiry_func_f95;
1994
1995   for (i = 0; functions[i]; i++)
1996     if (strcmp (functions[i], name) == 0)
1997       break;
1998
1999   if (functions[i] == NULL)
2000     return MATCH_ERROR;
2001
2002   /* At this point we have an inquiry function with a variable argument.  The
2003      type of the variable might be undefined, but we need it now, because the
2004      arguments of these functions are not allowed to be undefined.  */
2005
2006   for (ap = e->value.function.actual; ap; ap = ap->next)
2007     {
2008       if (!ap->expr)
2009         continue;
2010
2011       if (ap->expr->ts.type == BT_UNKNOWN)
2012         {
2013           if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
2014               && gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns)
2015               == FAILURE)
2016             return MATCH_NO;
2017
2018           ap->expr->ts = ap->expr->symtree->n.sym->ts;
2019         }
2020
2021         /* Assumed character length will not reduce to a constant expression
2022            with LEN, as required by the standard.  */
2023         if (i == 5 && not_restricted
2024             && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
2025             && ap->expr->symtree->n.sym->ts.cl->length == NULL)
2026           {
2027             gfc_error ("Assumed character length variable '%s' in constant "
2028                        "expression at %L", e->symtree->n.sym->name, &e->where);
2029               return MATCH_ERROR;
2030           }
2031         else if (not_restricted && check_init_expr (ap->expr) == FAILURE)
2032           return MATCH_ERROR;
2033     }
2034
2035   return MATCH_YES;
2036 }
2037
2038
2039 /* F95, 7.1.6.1, Initialization expressions, (5)
2040    F2003, 7.1.7 Initialization expression, (5)  */
2041
2042 static match
2043 check_transformational (gfc_expr *e)
2044 {
2045   static const char * const trans_func_f95[] = {
2046     "repeat", "reshape", "selected_int_kind",
2047     "selected_real_kind", "transfer", "trim", NULL
2048   };
2049
2050   int i;
2051   const char *name;
2052
2053   if (!e->value.function.isym
2054       || !e->value.function.isym->transformational)
2055     return MATCH_NO;
2056
2057   name = e->symtree->n.sym->name;
2058
2059   /* NULL() is dealt with below.  */
2060   if (strcmp ("null", name) == 0)
2061     return MATCH_NO;
2062
2063   for (i = 0; trans_func_f95[i]; i++)
2064     if (strcmp (trans_func_f95[i], name) == 0)
2065       break;
2066
2067   /* FIXME, F2003: implement translation of initialization
2068      expressions before enabling this check. For F95, error
2069      out if the transformational function is not in the list.  */
2070 #if 0
2071   if (trans_func_f95[i] == NULL
2072       && gfc_notify_std (GFC_STD_F2003, 
2073                          "transformational intrinsic '%s' at %L is not permitted "
2074                          "in an initialization expression", name, &e->where) == FAILURE)
2075     return MATCH_ERROR;
2076 #else
2077   if (trans_func_f95[i] == NULL)
2078     {
2079       gfc_error("transformational intrinsic '%s' at %L is not permitted "
2080                 "in an initialization expression", name, &e->where);
2081       return MATCH_ERROR;
2082     }
2083 #endif
2084
2085   return check_init_expr_arguments (e);
2086 }
2087
2088
2089 /* F95, 7.1.6.1, Initialization expressions, (6)
2090    F2003, 7.1.7 Initialization expression, (6)  */
2091
2092 static match
2093 check_null (gfc_expr *e)
2094 {
2095   if (strcmp ("null", e->symtree->n.sym->name) != 0)
2096     return MATCH_NO;
2097
2098   return check_init_expr_arguments (e);
2099 }
2100
2101
2102 static match
2103 check_elemental (gfc_expr *e)
2104 {
2105   if (!e->value.function.isym
2106       || !e->value.function.isym->elemental)
2107     return MATCH_NO;
2108
2109   if ((e->ts.type != BT_INTEGER || e->ts.type != BT_CHARACTER)
2110       && gfc_notify_std (GFC_STD_F2003, "Extension: Evaluation of "
2111                         "nonstandard initialization expression at %L",
2112                         &e->where) == FAILURE)
2113     return MATCH_ERROR;
2114
2115   return check_init_expr_arguments (e);
2116 }
2117
2118
2119 static match
2120 check_conversion (gfc_expr *e)
2121 {
2122   if (!e->value.function.isym
2123       || !e->value.function.isym->conversion)
2124     return MATCH_NO;
2125
2126   return check_init_expr_arguments (e);
2127 }
2128
2129
2130 /* Verify that an expression is an initialization expression.  A side
2131    effect is that the expression tree is reduced to a single constant
2132    node if all goes well.  This would normally happen when the
2133    expression is constructed but function references are assumed to be
2134    intrinsics in the context of initialization expressions.  If
2135    FAILURE is returned an error message has been generated.  */
2136
2137 static try
2138 check_init_expr (gfc_expr *e)
2139 {
2140   match m;
2141   try t;
2142   gfc_intrinsic_sym *isym;
2143
2144   if (e == NULL)
2145     return SUCCESS;
2146
2147   switch (e->expr_type)
2148     {
2149     case EXPR_OP:
2150       t = check_intrinsic_op (e, check_init_expr);
2151       if (t == SUCCESS)
2152         t = gfc_simplify_expr (e, 0);
2153
2154       break;
2155
2156     case EXPR_FUNCTION:
2157       t = FAILURE;
2158
2159       if ((m = check_specification_function (e)) != MATCH_YES)
2160         {
2161           if ((m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES)
2162             {
2163               gfc_error ("Function '%s' in initialization expression at %L "
2164                          "must be an intrinsic or a specification function",
2165                          e->symtree->n.sym->name, &e->where);
2166               break;
2167             }
2168
2169           if ((m = check_conversion (e)) == MATCH_NO
2170               && (m = check_inquiry (e, 1)) == MATCH_NO
2171               && (m = check_null (e)) == MATCH_NO
2172               && (m = check_transformational (e)) == MATCH_NO
2173               && (m = check_elemental (e)) == MATCH_NO)
2174             {
2175               gfc_error ("Intrinsic function '%s' at %L is not permitted "
2176                          "in an initialization expression",
2177                          e->symtree->n.sym->name, &e->where);
2178               m = MATCH_ERROR;
2179             }
2180
2181           /* Try to scalarize an elemental intrinsic function that has an
2182              array argument.  */
2183           isym = gfc_find_function (e->symtree->n.sym->name);
2184           if (isym && isym->elemental
2185               && e->value.function.actual->expr->expr_type == EXPR_ARRAY)
2186             {
2187                 if ((t = scalarize_intrinsic_call (e)) == SUCCESS)
2188                 break;
2189             }
2190         }
2191
2192       if (m == MATCH_YES)
2193         t = gfc_simplify_expr (e, 0);
2194
2195       break;
2196
2197     case EXPR_VARIABLE:
2198       t = SUCCESS;
2199
2200       if (gfc_check_iter_variable (e) == SUCCESS)
2201         break;
2202
2203       if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2204         {
2205           /* A PARAMETER shall not be used to define itself, i.e.
2206                 REAL, PARAMETER :: x = transfer(0, x)
2207              is invalid.  */
2208           if (!e->symtree->n.sym->value)
2209             {
2210               gfc_error("PARAMETER '%s' is used at %L before its definition "
2211                         "is complete", e->symtree->n.sym->name, &e->where);
2212               t = FAILURE;
2213             }
2214           else
2215             t = simplify_parameter_variable (e, 0);
2216
2217           break;
2218         }
2219
2220       if (gfc_in_match_data ())
2221         break;
2222
2223       t = FAILURE;
2224
2225       if (e->symtree->n.sym->as)
2226         {
2227           switch (e->symtree->n.sym->as->type)
2228             {
2229               case AS_ASSUMED_SIZE:
2230                 gfc_error ("Assumed size array '%s' at %L is not permitted "
2231                            "in an initialization expression",
2232                            e->symtree->n.sym->name, &e->where);
2233                 break;
2234
2235               case AS_ASSUMED_SHAPE:
2236                 gfc_error ("Assumed shape array '%s' at %L is not permitted "
2237                            "in an initialization expression",
2238                            e->symtree->n.sym->name, &e->where);
2239                 break;
2240
2241               case AS_DEFERRED:
2242                 gfc_error ("Deferred array '%s' at %L is not permitted "
2243                            "in an initialization expression",
2244                            e->symtree->n.sym->name, &e->where);
2245                 break;
2246
2247               case AS_EXPLICIT:
2248                 gfc_error ("Array '%s' at %L is a variable, which does "
2249                            "not reduce to a constant expression",
2250                            e->symtree->n.sym->name, &e->where);
2251                 break;
2252
2253               default:
2254                 gcc_unreachable();
2255           }
2256         }
2257       else
2258         gfc_error ("Parameter '%s' at %L has not been declared or is "
2259                    "a variable, which does not reduce to a constant "
2260                    "expression", e->symtree->n.sym->name, &e->where);
2261
2262       break;
2263
2264     case EXPR_CONSTANT:
2265     case EXPR_NULL:
2266       t = SUCCESS;
2267       break;
2268
2269     case EXPR_SUBSTRING:
2270       t = check_init_expr (e->ref->u.ss.start);
2271       if (t == FAILURE)
2272         break;
2273
2274       t = check_init_expr (e->ref->u.ss.end);
2275       if (t == SUCCESS)
2276         t = gfc_simplify_expr (e, 0);
2277
2278       break;
2279
2280     case EXPR_STRUCTURE:
2281       if (e->ts.is_iso_c)
2282         t = SUCCESS;
2283       else
2284         t = gfc_check_constructor (e, check_init_expr);
2285       break;
2286
2287     case EXPR_ARRAY:
2288       t = gfc_check_constructor (e, check_init_expr);
2289       if (t == FAILURE)
2290         break;
2291
2292       t = gfc_expand_constructor (e);
2293       if (t == FAILURE)
2294         break;
2295
2296       t = gfc_check_constructor_type (e);
2297       break;
2298
2299     default:
2300       gfc_internal_error ("check_init_expr(): Unknown expression type");
2301     }
2302
2303   return t;
2304 }
2305
2306
2307 /* Match an initialization expression.  We work by first matching an
2308    expression, then reducing it to a constant.  */
2309
2310 match
2311 gfc_match_init_expr (gfc_expr **result)
2312 {
2313   gfc_expr *expr;
2314   match m;
2315   try t;
2316
2317   m = gfc_match_expr (&expr);
2318   if (m != MATCH_YES)
2319     return m;
2320
2321   gfc_init_expr = 1;
2322   t = gfc_resolve_expr (expr);
2323   if (t == SUCCESS)
2324     t = check_init_expr (expr);
2325   gfc_init_expr = 0;
2326
2327   if (t == FAILURE)
2328     {
2329       gfc_free_expr (expr);
2330       return MATCH_ERROR;
2331     }
2332
2333   if (expr->expr_type == EXPR_ARRAY
2334       && (gfc_check_constructor_type (expr) == FAILURE
2335           || gfc_expand_constructor (expr) == FAILURE))
2336     {
2337       gfc_free_expr (expr);
2338       return MATCH_ERROR;
2339     }
2340
2341   /* Not all inquiry functions are simplified to constant expressions
2342      so it is necessary to call check_inquiry again.  */ 
2343   if (!gfc_is_constant_expr (expr) && check_inquiry (expr, 1) != MATCH_YES
2344       && !gfc_in_match_data ())
2345     {
2346       gfc_error ("Initialization expression didn't reduce %C");
2347       return MATCH_ERROR;
2348     }
2349
2350   *result = expr;
2351
2352   return MATCH_YES;
2353 }
2354
2355
2356 static try check_restricted (gfc_expr *);
2357
2358 /* Given an actual argument list, test to see that each argument is a
2359    restricted expression and optionally if the expression type is
2360    integer or character.  */
2361
2362 static try
2363 restricted_args (gfc_actual_arglist *a)
2364 {
2365   for (; a; a = a->next)
2366     {
2367       if (check_restricted (a->expr) == FAILURE)
2368         return FAILURE;
2369     }
2370
2371   return SUCCESS;
2372 }
2373
2374
2375 /************* Restricted/specification expressions *************/
2376
2377
2378 /* Make sure a non-intrinsic function is a specification function.  */
2379
2380 static try
2381 external_spec_function (gfc_expr *e)
2382 {
2383   gfc_symbol *f;
2384
2385   f = e->value.function.esym;
2386
2387   if (f->attr.proc == PROC_ST_FUNCTION)
2388     {
2389       gfc_error ("Specification function '%s' at %L cannot be a statement "
2390                  "function", f->name, &e->where);
2391       return FAILURE;
2392     }
2393
2394   if (f->attr.proc == PROC_INTERNAL)
2395     {
2396       gfc_error ("Specification function '%s' at %L cannot be an internal "
2397                  "function", f->name, &e->where);
2398       return FAILURE;
2399     }
2400
2401   if (!f->attr.pure && !f->attr.elemental)
2402     {
2403       gfc_error ("Specification function '%s' at %L must be PURE", f->name,
2404                  &e->where);
2405       return FAILURE;
2406     }
2407
2408   if (f->attr.recursive)
2409     {
2410       gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
2411                  f->name, &e->where);
2412       return FAILURE;
2413     }
2414
2415   return restricted_args (e->value.function.actual);
2416 }
2417
2418
2419 /* Check to see that a function reference to an intrinsic is a
2420    restricted expression.  */
2421
2422 static try
2423 restricted_intrinsic (gfc_expr *e)
2424 {
2425   /* TODO: Check constraints on inquiry functions.  7.1.6.2 (7).  */
2426   if (check_inquiry (e, 0) == MATCH_YES)
2427     return SUCCESS;
2428
2429   return restricted_args (e->value.function.actual);
2430 }
2431
2432
2433 /* Verify that an expression is a restricted expression.  Like its
2434    cousin check_init_expr(), an error message is generated if we
2435    return FAILURE.  */
2436
2437 static try
2438 check_restricted (gfc_expr *e)
2439 {
2440   gfc_symbol *sym;
2441   try t;
2442
2443   if (e == NULL)
2444     return SUCCESS;
2445
2446   switch (e->expr_type)
2447     {
2448     case EXPR_OP:
2449       t = check_intrinsic_op (e, check_restricted);
2450       if (t == SUCCESS)
2451         t = gfc_simplify_expr (e, 0);
2452
2453       break;
2454
2455     case EXPR_FUNCTION:
2456       t = e->value.function.esym ? external_spec_function (e)
2457                                  : restricted_intrinsic (e);
2458       break;
2459
2460     case EXPR_VARIABLE:
2461       sym = e->symtree->n.sym;
2462       t = FAILURE;
2463
2464       /* If a dummy argument appears in a context that is valid for a
2465          restricted expression in an elemental procedure, it will have
2466          already been simplified away once we get here.  Therefore we
2467          don't need to jump through hoops to distinguish valid from
2468          invalid cases.  */
2469       if (sym->attr.dummy && sym->ns == gfc_current_ns
2470           && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
2471         {
2472           gfc_error ("Dummy argument '%s' not allowed in expression at %L",
2473                      sym->name, &e->where);
2474           break;
2475         }
2476
2477       if (sym->attr.optional)
2478         {
2479           gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2480                      sym->name, &e->where);
2481           break;
2482         }
2483
2484       if (sym->attr.intent == INTENT_OUT)
2485         {
2486           gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2487                      sym->name, &e->where);
2488           break;
2489         }
2490
2491       /* gfc_is_formal_arg broadcasts that a formal argument list is being
2492          processed in resolve.c(resolve_formal_arglist).  This is done so
2493          that host associated dummy array indices are accepted (PR23446).
2494          This mechanism also does the same for the specification expressions
2495          of array-valued functions.  */
2496       if (sym->attr.in_common
2497           || sym->attr.use_assoc
2498           || sym->attr.dummy
2499           || sym->ns != gfc_current_ns
2500           || (sym->ns->proc_name != NULL
2501               && sym->ns->proc_name->attr.flavor == FL_MODULE)
2502           || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2503         {
2504           t = SUCCESS;
2505           break;
2506         }
2507
2508       gfc_error ("Variable '%s' cannot appear in the expression at %L",
2509                  sym->name, &e->where);
2510
2511       break;
2512
2513     case EXPR_NULL:
2514     case EXPR_CONSTANT:
2515       t = SUCCESS;
2516       break;
2517
2518     case EXPR_SUBSTRING:
2519       t = gfc_specification_expr (e->ref->u.ss.start);
2520       if (t == FAILURE)
2521         break;
2522
2523       t = gfc_specification_expr (e->ref->u.ss.end);
2524       if (t == SUCCESS)
2525         t = gfc_simplify_expr (e, 0);
2526
2527       break;
2528
2529     case EXPR_STRUCTURE:
2530       t = gfc_check_constructor (e, check_restricted);
2531       break;
2532
2533     case EXPR_ARRAY:
2534       t = gfc_check_constructor (e, check_restricted);
2535       break;
2536
2537     default:
2538       gfc_internal_error ("check_restricted(): Unknown expression type");
2539     }
2540
2541   return t;
2542 }
2543
2544
2545 /* Check to see that an expression is a specification expression.  If
2546    we return FAILURE, an error has been generated.  */
2547
2548 try
2549 gfc_specification_expr (gfc_expr *e)
2550 {
2551
2552   if (e == NULL)
2553     return SUCCESS;
2554
2555   if (e->ts.type != BT_INTEGER)
2556     {
2557       gfc_error ("Expression at %L must be of INTEGER type", &e->where);
2558       return FAILURE;
2559     }
2560
2561   if (e->expr_type == EXPR_FUNCTION
2562           && !e->value.function.isym
2563           && !e->value.function.esym
2564           && !gfc_pure (e->symtree->n.sym))
2565     {
2566       gfc_error ("Function '%s' at %L must be PURE",
2567                  e->symtree->n.sym->name, &e->where);
2568       /* Prevent repeat error messages.  */
2569       e->symtree->n.sym->attr.pure = 1;
2570       return FAILURE;
2571     }
2572
2573   if (e->rank != 0)
2574     {
2575       gfc_error ("Expression at %L must be scalar", &e->where);
2576       return FAILURE;
2577     }
2578
2579   if (gfc_simplify_expr (e, 0) == FAILURE)
2580     return FAILURE;
2581
2582   return check_restricted (e);
2583 }
2584
2585
2586 /************** Expression conformance checks.  *************/
2587
2588 /* Given two expressions, make sure that the arrays are conformable.  */
2589
2590 try
2591 gfc_check_conformance (const char *optype_msgid, gfc_expr *op1, gfc_expr *op2)
2592 {
2593   int op1_flag, op2_flag, d;
2594   mpz_t op1_size, op2_size;
2595   try t;
2596
2597   if (op1->rank == 0 || op2->rank == 0)
2598     return SUCCESS;
2599
2600   if (op1->rank != op2->rank)
2601     {
2602       gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(optype_msgid),
2603                  op1->rank, op2->rank, &op1->where);
2604       return FAILURE;
2605     }
2606
2607   t = SUCCESS;
2608
2609   for (d = 0; d < op1->rank; d++)
2610     {
2611       op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2612       op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2613
2614       if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2615         {
2616           gfc_error ("Different shape for %s at %L on dimension %d "
2617                      "(%d and %d)", _(optype_msgid), &op1->where, d + 1,
2618                      (int) mpz_get_si (op1_size),
2619                      (int) mpz_get_si (op2_size));
2620
2621           t = FAILURE;
2622         }
2623
2624       if (op1_flag)
2625         mpz_clear (op1_size);
2626       if (op2_flag)
2627         mpz_clear (op2_size);
2628
2629       if (t == FAILURE)
2630         return FAILURE;
2631     }
2632
2633   return SUCCESS;
2634 }
2635
2636
2637 /* Given an assignable expression and an arbitrary expression, make
2638    sure that the assignment can take place.  */
2639
2640 try
2641 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
2642 {
2643   gfc_symbol *sym;
2644   gfc_ref *ref;
2645   int has_pointer;
2646
2647   sym = lvalue->symtree->n.sym;
2648
2649   /* Check INTENT(IN), unless the object itself is the component or
2650      sub-component of a pointer.  */
2651   has_pointer = sym->attr.pointer;
2652
2653   for (ref = lvalue->ref; ref; ref = ref->next)
2654     if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2655       {
2656         has_pointer = 1;
2657         break;
2658       }
2659
2660   if (!has_pointer && sym->attr.intent == INTENT_IN)
2661     {
2662       gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2663                  sym->name, &lvalue->where);
2664       return FAILURE;
2665     }
2666
2667   /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2668      variable local to a function subprogram.  Its existence begins when
2669      execution of the function is initiated and ends when execution of the
2670      function is terminated...
2671      Therefore, the left hand side is no longer a variable, when it is:  */
2672   if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
2673       && !sym->attr.external)
2674     {
2675       bool bad_proc;
2676       bad_proc = false;
2677
2678       /* (i) Use associated;  */
2679       if (sym->attr.use_assoc)
2680         bad_proc = true;
2681
2682       /* (ii) The assignment is in the main program; or  */
2683       if (gfc_current_ns->proc_name->attr.is_main_program)
2684         bad_proc = true;
2685
2686       /* (iii) A module or internal procedure...  */
2687       if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2688            || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2689           && gfc_current_ns->parent
2690           && (!(gfc_current_ns->parent->proc_name->attr.function
2691                 || gfc_current_ns->parent->proc_name->attr.subroutine)
2692               || gfc_current_ns->parent->proc_name->attr.is_main_program))
2693         {
2694           /* ... that is not a function...  */ 
2695           if (!gfc_current_ns->proc_name->attr.function)
2696             bad_proc = true;
2697
2698           /* ... or is not an entry and has a different name.  */
2699           if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2700             bad_proc = true;
2701         }
2702
2703       if (bad_proc)
2704         {
2705           gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2706           return FAILURE;
2707         }
2708     }
2709
2710   if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2711     {
2712       gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2713                  lvalue->rank, rvalue->rank, &lvalue->where);
2714       return FAILURE;
2715     }
2716
2717   if (lvalue->ts.type == BT_UNKNOWN)
2718     {
2719       gfc_error ("Variable type is UNKNOWN in assignment at %L",
2720                  &lvalue->where);
2721       return FAILURE;
2722     }
2723
2724   if (rvalue->expr_type == EXPR_NULL)
2725     {  
2726       if (lvalue->symtree->n.sym->attr.pointer
2727           && lvalue->symtree->n.sym->attr.data)
2728         return SUCCESS;
2729       else
2730         {
2731           gfc_error ("NULL appears on right-hand side in assignment at %L",
2732                      &rvalue->where);
2733           return FAILURE;
2734         }
2735     }
2736
2737    if (sym->attr.cray_pointee
2738        && lvalue->ref != NULL
2739        && lvalue->ref->u.ar.type == AR_FULL
2740        && lvalue->ref->u.ar.as->cp_was_assumed)
2741      {
2742        gfc_error ("Vector assignment to assumed-size Cray Pointee at %L "
2743                   "is illegal", &lvalue->where);
2744        return FAILURE;
2745      }
2746
2747   /* This is possibly a typo: x = f() instead of x => f().  */
2748   if (gfc_option.warn_surprising 
2749       && rvalue->expr_type == EXPR_FUNCTION
2750       && rvalue->symtree->n.sym->attr.pointer)
2751     gfc_warning ("POINTER valued function appears on right-hand side of "
2752                  "assignment at %L", &rvalue->where);
2753
2754   /* Check size of array assignments.  */
2755   if (lvalue->rank != 0 && rvalue->rank != 0
2756       && gfc_check_conformance ("array assignment", lvalue, rvalue) != SUCCESS)
2757     return FAILURE;
2758
2759   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
2760       && lvalue->symtree->n.sym->attr.data
2761       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L used to "
2762                          "initialize non-integer variable '%s'",
2763                          &rvalue->where, lvalue->symtree->n.sym->name)
2764          == FAILURE)
2765     return FAILURE;
2766   else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
2767       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L outside "
2768                          "a DATA statement and outside INT/REAL/DBLE/CMPLX",
2769                          &rvalue->where) == FAILURE)
2770     return FAILURE;
2771
2772   /* Handle the case of a BOZ literal on the RHS.  */
2773   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
2774     {
2775       int rc;
2776       if (gfc_option.warn_surprising)
2777         gfc_warning ("BOZ literal at %L is bitwise transferred "
2778                      "non-integer symbol '%s'", &rvalue->where,
2779                      lvalue->symtree->n.sym->name);
2780       if (!gfc_convert_boz (rvalue, &lvalue->ts))
2781         return FAILURE;
2782       if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
2783         {
2784           if (rc == ARITH_UNDERFLOW)
2785             gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
2786                        ". This check can be disabled with the option "
2787                        "-fno-range-check", &rvalue->where);
2788           else if (rc == ARITH_OVERFLOW)
2789             gfc_error ("Arithmetic overflow 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_NAN)
2793             gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
2794                        ". This check can be disabled with the option "
2795                        "-fno-range-check", &rvalue->where);
2796           return FAILURE;
2797         }
2798     }
2799
2800   if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2801     return SUCCESS;
2802
2803   if (!conform)
2804     {
2805       /* Numeric can be converted to any other numeric. And Hollerith can be
2806          converted to any other type.  */
2807       if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2808           || rvalue->ts.type == BT_HOLLERITH)
2809         return SUCCESS;
2810
2811       if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2812         return SUCCESS;
2813
2814       gfc_error ("Incompatible types in assignment at %L, %s to %s",
2815                  &rvalue->where, gfc_typename (&rvalue->ts),
2816                  gfc_typename (&lvalue->ts));
2817
2818       return FAILURE;
2819     }
2820
2821   return gfc_convert_type (rvalue, &lvalue->ts, 1);
2822 }
2823
2824
2825 /* Check that a pointer assignment is OK.  We first check lvalue, and
2826    we only check rvalue if it's not an assignment to NULL() or a
2827    NULLIFY statement.  */
2828
2829 try
2830 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
2831 {
2832   symbol_attribute attr;
2833   gfc_ref *ref;
2834   int is_pure;
2835   int pointer, check_intent_in;
2836
2837   if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN)
2838     {
2839       gfc_error ("Pointer assignment target is not a POINTER at %L",
2840                  &lvalue->where);
2841       return FAILURE;
2842     }
2843
2844   if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
2845       && lvalue->symtree->n.sym->attr.use_assoc)
2846     {
2847       gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2848                  "l-value since it is a procedure",
2849                  lvalue->symtree->n.sym->name, &lvalue->where);
2850       return FAILURE;
2851     }
2852
2853
2854   /* Check INTENT(IN), unless the object itself is the component or
2855      sub-component of a pointer.  */
2856   check_intent_in = 1;
2857   pointer = lvalue->symtree->n.sym->attr.pointer;
2858
2859   for (ref = lvalue->ref; ref; ref = ref->next)
2860     {
2861       if (pointer)
2862         check_intent_in = 0;
2863
2864       if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2865         pointer = 1;
2866     }
2867
2868   if (check_intent_in && lvalue->symtree->n.sym->attr.intent == INTENT_IN)
2869     {
2870       gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2871                  lvalue->symtree->n.sym->name, &lvalue->where);
2872       return FAILURE;
2873     }
2874
2875   if (!pointer)
2876     {
2877       gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2878       return FAILURE;
2879     }
2880
2881   is_pure = gfc_pure (NULL);
2882
2883   if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym)
2884         && lvalue->symtree->n.sym->value != rvalue)
2885     {
2886       gfc_error ("Bad pointer object in PURE procedure at %L", &lvalue->where);
2887       return FAILURE;
2888     }
2889
2890   /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2891      kind, etc for lvalue and rvalue must match, and rvalue must be a
2892      pure variable if we're in a pure function.  */
2893   if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
2894     return SUCCESS;
2895
2896   if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
2897     {
2898       gfc_error ("Different types in pointer assignment at %L",
2899                  &lvalue->where);
2900       return FAILURE;
2901     }
2902
2903   if (lvalue->ts.kind != rvalue->ts.kind)
2904     {
2905       gfc_error ("Different kind type parameters in pointer "
2906                  "assignment at %L", &lvalue->where);
2907       return FAILURE;
2908     }
2909
2910   if (lvalue->rank != rvalue->rank)
2911     {
2912       gfc_error ("Different ranks in pointer assignment at %L",
2913                  &lvalue->where);
2914       return FAILURE;
2915     }
2916
2917   /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
2918   if (rvalue->expr_type == EXPR_NULL)
2919     return SUCCESS;
2920
2921   if (lvalue->ts.type == BT_CHARACTER
2922       && lvalue->ts.cl && rvalue->ts.cl
2923       && lvalue->ts.cl->length && rvalue->ts.cl->length
2924       && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
2925                                     rvalue->ts.cl->length)) == 1)
2926     {
2927       gfc_error ("Different character lengths in pointer "
2928                  "assignment at %L", &lvalue->where);
2929       return FAILURE;
2930     }
2931
2932   if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
2933     lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
2934
2935   attr = gfc_expr_attr (rvalue);
2936   if (!attr.target && !attr.pointer)
2937     {
2938       gfc_error ("Pointer assignment target is neither TARGET "
2939                  "nor POINTER at %L", &rvalue->where);
2940       return FAILURE;
2941     }
2942
2943   if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
2944     {
2945       gfc_error ("Bad target in pointer assignment in PURE "
2946                  "procedure at %L", &rvalue->where);
2947     }
2948
2949   if (gfc_has_vector_index (rvalue))
2950     {
2951       gfc_error ("Pointer assignment with vector subscript "
2952                  "on rhs at %L", &rvalue->where);
2953       return FAILURE;
2954     }
2955
2956   if (attr.protected && attr.use_assoc)
2957     {
2958       gfc_error ("Pointer assigment target has PROTECTED "
2959                  "attribute at %L", &rvalue->where);
2960       return FAILURE;
2961     }
2962
2963   return SUCCESS;
2964 }
2965
2966
2967 /* Relative of gfc_check_assign() except that the lvalue is a single
2968    symbol.  Used for initialization assignments.  */
2969
2970 try
2971 gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
2972 {
2973   gfc_expr lvalue;
2974   try r;
2975
2976   memset (&lvalue, '\0', sizeof (gfc_expr));
2977
2978   lvalue.expr_type = EXPR_VARIABLE;
2979   lvalue.ts = sym->ts;
2980   if (sym->as)
2981     lvalue.rank = sym->as->rank;
2982   lvalue.symtree = (gfc_symtree *) gfc_getmem (sizeof (gfc_symtree));
2983   lvalue.symtree->n.sym = sym;
2984   lvalue.where = sym->declared_at;
2985
2986   if (sym->attr.pointer)
2987     r = gfc_check_pointer_assign (&lvalue, rvalue);
2988   else
2989     r = gfc_check_assign (&lvalue, rvalue, 1);
2990
2991   gfc_free (lvalue.symtree);
2992
2993   return r;
2994 }
2995
2996
2997 /* Get an expression for a default initializer.  */
2998
2999 gfc_expr *
3000 gfc_default_initializer (gfc_typespec *ts)
3001 {
3002   gfc_constructor *tail;
3003   gfc_expr *init;
3004   gfc_component *c;
3005
3006   /* See if we have a default initializer.  */
3007   for (c = ts->derived->components; c; c = c->next)
3008     if (c->initializer || c->allocatable)
3009       break;
3010
3011   if (!c)
3012     return NULL;
3013
3014   /* Build the constructor.  */
3015   init = gfc_get_expr ();
3016   init->expr_type = EXPR_STRUCTURE;
3017   init->ts = *ts;
3018   init->where = ts->derived->declared_at;
3019
3020   tail = NULL;
3021   for (c = ts->derived->components; c; c = c->next)
3022     {
3023       if (tail == NULL)
3024         init->value.constructor = tail = gfc_get_constructor ();
3025       else
3026         {
3027           tail->next = gfc_get_constructor ();
3028           tail = tail->next;
3029         }
3030
3031       if (c->initializer)
3032         tail->expr = gfc_copy_expr (c->initializer);
3033
3034       if (c->allocatable)
3035         {
3036           tail->expr = gfc_get_expr ();
3037           tail->expr->expr_type = EXPR_NULL;
3038           tail->expr->ts = c->ts;
3039         }
3040     }
3041   return init;
3042 }
3043
3044
3045 /* Given a symbol, create an expression node with that symbol as a
3046    variable. If the symbol is array valued, setup a reference of the
3047    whole array.  */
3048
3049 gfc_expr *
3050 gfc_get_variable_expr (gfc_symtree *var)
3051 {
3052   gfc_expr *e;
3053
3054   e = gfc_get_expr ();
3055   e->expr_type = EXPR_VARIABLE;
3056   e->symtree = var;
3057   e->ts = var->n.sym->ts;
3058
3059   if (var->n.sym->as != NULL)
3060     {
3061       e->rank = var->n.sym->as->rank;
3062       e->ref = gfc_get_ref ();
3063       e->ref->type = REF_ARRAY;
3064       e->ref->u.ar.type = AR_FULL;
3065     }
3066
3067   return e;
3068 }
3069
3070
3071 /* General expression traversal function.  */
3072
3073 bool
3074 gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
3075                    bool (*func)(gfc_expr *, gfc_symbol *, int*),
3076                    int f)
3077 {
3078   gfc_array_ref ar;
3079   gfc_ref *ref;
3080   gfc_actual_arglist *args;
3081   gfc_constructor *c;
3082   int i;
3083
3084   if (!expr)
3085     return false;
3086
3087   if ((*func) (expr, sym, &f))
3088     return true;
3089
3090   if (expr->ts.type == BT_CHARACTER
3091         && expr->ts.cl
3092         && expr->ts.cl->length
3093         && expr->ts.cl->length->expr_type != EXPR_CONSTANT
3094         && gfc_traverse_expr (expr->ts.cl->length, sym, func, f))
3095     return true;
3096
3097   switch (expr->expr_type)
3098     {
3099     case EXPR_FUNCTION:
3100       for (args = expr->value.function.actual; args; args = args->next)
3101         {
3102           if (gfc_traverse_expr (args->expr, sym, func, f))
3103             return true;
3104         }
3105       break;
3106
3107     case EXPR_VARIABLE:
3108     case EXPR_CONSTANT:
3109     case EXPR_NULL:
3110     case EXPR_SUBSTRING:
3111       break;
3112
3113     case EXPR_STRUCTURE:
3114     case EXPR_ARRAY:
3115       for (c = expr->value.constructor; c; c = c->next)
3116         {
3117           if (gfc_traverse_expr (c->expr, sym, func, f))
3118             return true;
3119           if (c->iterator)
3120             {
3121               if (gfc_traverse_expr (c->iterator->var, sym, func, f))
3122                 return true;
3123               if (gfc_traverse_expr (c->iterator->start, sym, func, f))
3124                 return true;
3125               if (gfc_traverse_expr (c->iterator->end, sym, func, f))
3126                 return true;
3127               if (gfc_traverse_expr (c->iterator->step, sym, func, f))
3128                 return true;
3129             }
3130         }
3131       break;
3132
3133     case EXPR_OP:
3134       if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
3135         return true;
3136       if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
3137         return true;
3138       break;
3139
3140     default:
3141       gcc_unreachable ();
3142       break;
3143     }
3144
3145   ref = expr->ref;
3146   while (ref != NULL)
3147     {
3148       switch (ref->type)
3149         {
3150         case  REF_ARRAY:
3151           ar = ref->u.ar;
3152           for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
3153             {
3154               if (gfc_traverse_expr (ar.start[i], sym, func, f))
3155                 return true;
3156               if (gfc_traverse_expr (ar.end[i], sym, func, f))
3157                 return true;
3158               if (gfc_traverse_expr (ar.stride[i], sym, func, f))
3159                 return true;
3160             }
3161           break;
3162
3163         case REF_SUBSTRING:
3164           if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
3165             return true;
3166           if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
3167             return true;
3168           break;
3169
3170         case REF_COMPONENT:
3171           if (ref->u.c.component->ts.type == BT_CHARACTER
3172                 && ref->u.c.component->ts.cl
3173                 && ref->u.c.component->ts.cl->length
3174                 && ref->u.c.component->ts.cl->length->expr_type
3175                      != EXPR_CONSTANT
3176                 && gfc_traverse_expr (ref->u.c.component->ts.cl->length,
3177                                       sym, func, f))
3178             return true;
3179
3180           if (ref->u.c.component->as)
3181             for (i = 0; i < ref->u.c.component->as->rank; i++)
3182               {
3183                 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
3184                                        sym, func, f))
3185                   return true;
3186                 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
3187                                        sym, func, f))
3188                   return true;
3189               }
3190           break;
3191
3192         default:
3193           gcc_unreachable ();
3194         }
3195       ref = ref->next;
3196     }
3197   return false;
3198 }
3199
3200 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
3201
3202 static bool
3203 expr_set_symbols_referenced (gfc_expr *expr,
3204                              gfc_symbol *sym ATTRIBUTE_UNUSED,
3205                              int *f ATTRIBUTE_UNUSED)
3206 {
3207   if (expr->expr_type != EXPR_VARIABLE)
3208     return false;
3209   gfc_set_sym_referenced (expr->symtree->n.sym);
3210   return false;
3211 }
3212
3213 void
3214 gfc_expr_set_symbols_referenced (gfc_expr *expr)
3215 {
3216   gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
3217 }