OSDN Git Service

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