OSDN Git Service

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