OSDN Git Service

PR fortran/29067
[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 Free Software 
3    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 2, 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 COPYING.  If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "gfortran.h"
26 #include "arith.h"
27 #include "match.h"
28
29 /* Get a new expr node.  */
30
31 gfc_expr *
32 gfc_get_expr (void)
33 {
34   gfc_expr *e;
35
36   e = gfc_getmem (sizeof (gfc_expr));
37
38   gfc_clear_ts (&e->ts);
39   e->shape = NULL;
40   e->ref = NULL;
41   e->symtree = NULL;
42
43   return e;
44 }
45
46
47 /* Free an argument list and everything below it.  */
48
49 void
50 gfc_free_actual_arglist (gfc_actual_arglist * a1)
51 {
52   gfc_actual_arglist *a2;
53
54   while (a1)
55     {
56       a2 = a1->next;
57       gfc_free_expr (a1->expr);
58       gfc_free (a1);
59       a1 = a2;
60     }
61 }
62
63
64 /* Copy an arglist structure and all of the arguments.  */
65
66 gfc_actual_arglist *
67 gfc_copy_actual_arglist (gfc_actual_arglist * p)
68 {
69   gfc_actual_arglist *head, *tail, *new;
70
71   head = tail = NULL;
72
73   for (; p; p = p->next)
74     {
75       new = gfc_get_actual_arglist ();
76       *new = *p;
77
78       new->expr = gfc_copy_expr (p->expr);
79       new->next = NULL;
80
81       if (head == NULL)
82         head = new;
83       else
84         tail->next = new;
85
86       tail = new;
87     }
88
89   return head;
90 }
91
92
93 /* Free a list of reference structures.  */
94
95 void
96 gfc_free_ref_list (gfc_ref * p)
97 {
98   gfc_ref *q;
99   int i;
100
101   for (; p; p = q)
102     {
103       q = p->next;
104
105       switch (p->type)
106         {
107         case REF_ARRAY:
108           for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
109             {
110               gfc_free_expr (p->u.ar.start[i]);
111               gfc_free_expr (p->u.ar.end[i]);
112               gfc_free_expr (p->u.ar.stride[i]);
113             }
114
115           break;
116
117         case REF_SUBSTRING:
118           gfc_free_expr (p->u.ss.start);
119           gfc_free_expr (p->u.ss.end);
120           break;
121
122         case REF_COMPONENT:
123           break;
124         }
125
126       gfc_free (p);
127     }
128 }
129
130
131 /* Workhorse function for gfc_free_expr() that frees everything
132    beneath an expression node, but not the node itself.  This is
133    useful when we want to simplify a node and replace it with
134    something else or the expression node belongs to another structure.  */
135
136 static void
137 free_expr0 (gfc_expr * e)
138 {
139   int n;
140
141   switch (e->expr_type)
142     {
143     case EXPR_CONSTANT:
144       if (e->from_H)
145         {
146           gfc_free (e->value.character.string);
147           break;
148         }
149
150       switch (e->ts.type)
151         {
152         case BT_INTEGER:
153           mpz_clear (e->value.integer);
154           break;
155
156         case BT_REAL:
157           mpfr_clear (e->value.real);
158           break;
159
160         case BT_CHARACTER:
161         case BT_HOLLERITH:
162           gfc_free (e->value.character.string);
163           break;
164
165         case BT_COMPLEX:
166           mpfr_clear (e->value.complex.r);
167           mpfr_clear (e->value.complex.i);
168           break;
169
170         default:
171           break;
172         }
173
174       break;
175
176     case EXPR_OP:
177       if (e->value.op.op1 != NULL)
178         gfc_free_expr (e->value.op.op1);
179       if (e->value.op.op2 != NULL)
180         gfc_free_expr (e->value.op.op2);
181       break;
182
183     case EXPR_FUNCTION:
184       gfc_free_actual_arglist (e->value.function.actual);
185       break;
186
187     case EXPR_VARIABLE:
188       break;
189
190     case EXPR_ARRAY:
191     case EXPR_STRUCTURE:
192       gfc_free_constructor (e->value.constructor);
193       break;
194
195     case EXPR_SUBSTRING:
196       gfc_free (e->value.character.string);
197       break;
198
199     case EXPR_NULL:
200       break;
201
202     default:
203       gfc_internal_error ("free_expr0(): Bad expr type");
204     }
205
206   /* Free a shape array.  */
207   if (e->shape != NULL)
208     {
209       for (n = 0; n < e->rank; n++)
210         mpz_clear (e->shape[n]);
211
212       gfc_free (e->shape);
213     }
214
215   gfc_free_ref_list (e->ref);
216
217   memset (e, '\0', sizeof (gfc_expr));
218 }
219
220
221 /* Free an expression node and everything beneath it.  */
222
223 void
224 gfc_free_expr (gfc_expr * e)
225 {
226
227   if (e == NULL)
228     return;
229
230   free_expr0 (e);
231   gfc_free (e);
232 }
233
234
235 /* Graft the *src expression onto the *dest subexpression.  */
236
237 void
238 gfc_replace_expr (gfc_expr * dest, gfc_expr * src)
239 {
240
241   free_expr0 (dest);
242   *dest = *src;
243
244   gfc_free (src);
245 }
246
247
248 /* Try to extract an integer constant from the passed expression node.
249    Returns an error message or NULL if the result is set.  It is
250    tempting to generate an error and return SUCCESS or FAILURE, but
251    failure is OK for some callers.  */
252
253 const char *
254 gfc_extract_int (gfc_expr * expr, int *result)
255 {
256
257   if (expr->expr_type != EXPR_CONSTANT)
258     return _("Constant expression required at %C");
259
260   if (expr->ts.type != BT_INTEGER)
261     return _("Integer expression required at %C");
262
263   if ((mpz_cmp_si (expr->value.integer, INT_MAX) > 0)
264       || (mpz_cmp_si (expr->value.integer, INT_MIN) < 0))
265     {
266       return _("Integer value too large in expression at %C");
267     }
268
269   *result = (int) mpz_get_si (expr->value.integer);
270
271   return NULL;
272 }
273
274
275 /* Recursively copy a list of reference structures.  */
276
277 static gfc_ref *
278 copy_ref (gfc_ref * src)
279 {
280   gfc_array_ref *ar;
281   gfc_ref *dest;
282
283   if (src == NULL)
284     return NULL;
285
286   dest = gfc_get_ref ();
287   dest->type = src->type;
288
289   switch (src->type)
290     {
291     case REF_ARRAY:
292       ar = gfc_copy_array_ref (&src->u.ar);
293       dest->u.ar = *ar;
294       gfc_free (ar);
295       break;
296
297     case REF_COMPONENT:
298       dest->u.c = src->u.c;
299       break;
300
301     case REF_SUBSTRING:
302       dest->u.ss = src->u.ss;
303       dest->u.ss.start = gfc_copy_expr (src->u.ss.start);
304       dest->u.ss.end = gfc_copy_expr (src->u.ss.end);
305       break;
306     }
307
308   dest->next = copy_ref (src->next);
309
310   return dest;
311 }
312
313
314 /* Detect whether an expression has any vector index array
315    references.  */
316
317 int
318 gfc_has_vector_index (gfc_expr *e)
319 {
320   gfc_ref * ref;
321   int i;
322   for (ref = e->ref; ref; ref = ref->next)
323     if (ref->type == REF_ARRAY)
324       for (i = 0; i < ref->u.ar.dimen; i++)
325         if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
326           return 1;
327   return 0;
328 }
329
330
331 /* Copy a shape array.  */
332
333 mpz_t *
334 gfc_copy_shape (mpz_t * shape, int rank)
335 {
336   mpz_t *new_shape;
337   int n;
338
339   if (shape == NULL)
340     return NULL;
341
342   new_shape = gfc_get_shape (rank);
343
344   for (n = 0; n < rank; n++)
345     mpz_init_set (new_shape[n], shape[n]);
346
347   return new_shape;
348 }
349
350
351 /* Copy a shape array excluding dimension N, where N is an integer
352    constant expression.  Dimensions are numbered in fortran style --
353    starting with ONE.
354
355    So, if the original shape array contains R elements
356       { s1 ... sN-1  sN  sN+1 ... sR-1 sR}
357    the result contains R-1 elements:
358       { s1 ... sN-1  sN+1    ...  sR-1}
359
360    If anything goes wrong -- N is not a constant, its value is out
361    of range -- or anything else, just returns NULL.
362 */
363
364 mpz_t *
365 gfc_copy_shape_excluding (mpz_t * shape, int rank, gfc_expr * dim)
366 {
367   mpz_t *new_shape, *s;
368   int i, n;
369
370   if (shape == NULL 
371       || rank <= 1
372       || dim == NULL
373       || dim->expr_type != EXPR_CONSTANT 
374       || dim->ts.type != BT_INTEGER)
375     return NULL;
376
377   n = mpz_get_si (dim->value.integer);
378   n--; /* Convert to zero based index */
379   if (n < 0 || n >= rank)
380     return NULL;
381
382   s = new_shape = gfc_get_shape (rank-1);
383
384   for (i = 0; i < rank; i++)
385     {
386       if (i == n)
387         continue;
388       mpz_init_set (*s, shape[i]);
389       s++;
390     }
391
392   return new_shape;
393 }
394
395 /* Given an expression pointer, return a copy of the expression.  This
396    subroutine is recursive.  */
397
398 gfc_expr *
399 gfc_copy_expr (gfc_expr * p)
400 {
401   gfc_expr *q;
402   char *s;
403
404   if (p == NULL)
405     return NULL;
406
407   q = gfc_get_expr ();
408   *q = *p;
409
410   switch (q->expr_type)
411     {
412     case EXPR_SUBSTRING:
413       s = gfc_getmem (p->value.character.length + 1);
414       q->value.character.string = s;
415
416       memcpy (s, p->value.character.string, p->value.character.length + 1);
417       break;
418
419     case EXPR_CONSTANT:
420       if (p->from_H)
421         {
422           s = gfc_getmem (p->value.character.length + 1);
423           q->value.character.string = s;
424
425           memcpy (s, p->value.character.string,
426                   p->value.character.length + 1);
427           break;
428         }
429       switch (q->ts.type)
430         {
431         case BT_INTEGER:
432           mpz_init_set (q->value.integer, p->value.integer);
433           break;
434
435         case BT_REAL:
436           gfc_set_model_kind (q->ts.kind);
437           mpfr_init (q->value.real);
438           mpfr_set (q->value.real, p->value.real, GFC_RND_MODE);
439           break;
440
441         case BT_COMPLEX:
442           gfc_set_model_kind (q->ts.kind);
443           mpfr_init (q->value.complex.r);
444           mpfr_init (q->value.complex.i);
445           mpfr_set (q->value.complex.r, p->value.complex.r, GFC_RND_MODE);
446           mpfr_set (q->value.complex.i, p->value.complex.i, GFC_RND_MODE);
447           break;
448
449         case BT_CHARACTER:
450         case BT_HOLLERITH:
451           s = gfc_getmem (p->value.character.length + 1);
452           q->value.character.string = s;
453
454           memcpy (s, p->value.character.string,
455                   p->value.character.length + 1);
456           break;
457
458         case BT_LOGICAL:
459         case BT_DERIVED:
460           break;                /* Already done */
461
462         case BT_PROCEDURE:
463         case BT_UNKNOWN:
464           gfc_internal_error ("gfc_copy_expr(): Bad expr node");
465           /* Not reached */
466         }
467
468       break;
469
470     case EXPR_OP:
471       switch (q->value.op.operator)
472         {
473         case INTRINSIC_NOT:
474         case INTRINSIC_UPLUS:
475         case INTRINSIC_UMINUS:
476           q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
477           break;
478
479         default:                /* Binary operators */
480           q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
481           q->value.op.op2 = gfc_copy_expr (p->value.op.op2);
482           break;
483         }
484
485       break;
486
487     case EXPR_FUNCTION:
488       q->value.function.actual =
489         gfc_copy_actual_arglist (p->value.function.actual);
490       break;
491
492     case EXPR_STRUCTURE:
493     case EXPR_ARRAY:
494       q->value.constructor = gfc_copy_constructor (p->value.constructor);
495       break;
496
497     case EXPR_VARIABLE:
498     case EXPR_NULL:
499       break;
500     }
501
502   q->shape = gfc_copy_shape (p->shape, p->rank);
503
504   q->ref = copy_ref (p->ref);
505
506   return q;
507 }
508
509
510 /* Return the maximum kind of two expressions.  In general, higher
511    kind numbers mean more precision for numeric types.  */
512
513 int
514 gfc_kind_max (gfc_expr * e1, gfc_expr * e2)
515 {
516
517   return (e1->ts.kind > e2->ts.kind) ? e1->ts.kind : e2->ts.kind;
518 }
519
520
521 /* Returns nonzero if the type is numeric, zero otherwise.  */
522
523 static int
524 numeric_type (bt type)
525 {
526
527   return type == BT_COMPLEX || type == BT_REAL || type == BT_INTEGER;
528 }
529
530
531 /* Returns nonzero if the typespec is a numeric type, zero otherwise.  */
532
533 int
534 gfc_numeric_ts (gfc_typespec * ts)
535 {
536
537   return numeric_type (ts->type);
538 }
539
540
541 /* Returns an expression node that is an integer constant.  */
542
543 gfc_expr *
544 gfc_int_expr (int i)
545 {
546   gfc_expr *p;
547
548   p = gfc_get_expr ();
549
550   p->expr_type = EXPR_CONSTANT;
551   p->ts.type = BT_INTEGER;
552   p->ts.kind = gfc_default_integer_kind;
553
554   p->where = gfc_current_locus;
555   mpz_init_set_si (p->value.integer, i);
556
557   return p;
558 }
559
560
561 /* Returns an expression node that is a logical constant.  */
562
563 gfc_expr *
564 gfc_logical_expr (int i, locus * where)
565 {
566   gfc_expr *p;
567
568   p = gfc_get_expr ();
569
570   p->expr_type = EXPR_CONSTANT;
571   p->ts.type = BT_LOGICAL;
572   p->ts.kind = gfc_default_logical_kind;
573
574   if (where == NULL)
575     where = &gfc_current_locus;
576   p->where = *where;
577   p->value.logical = i;
578
579   return p;
580 }
581
582
583 /* Return an expression node with an optional argument list attached.
584    A variable number of gfc_expr pointers are strung together in an
585    argument list with a NULL pointer terminating the list.  */
586
587 gfc_expr *
588 gfc_build_conversion (gfc_expr * e)
589 {
590   gfc_expr *p;
591
592   p = gfc_get_expr ();
593   p->expr_type = EXPR_FUNCTION;
594   p->symtree = NULL;
595   p->value.function.actual = NULL;
596
597   p->value.function.actual = gfc_get_actual_arglist ();
598   p->value.function.actual->expr = e;
599
600   return p;
601 }
602
603
604 /* Given an expression node with some sort of numeric binary
605    expression, insert type conversions required to make the operands
606    have the same type.
607
608    The exception is that the operands of an exponential don't have to
609    have the same type.  If possible, the base is promoted to the type
610    of the exponent.  For example, 1**2.3 becomes 1.0**2.3, but
611    1.0**2 stays as it is.  */
612
613 void
614 gfc_type_convert_binary (gfc_expr * e)
615 {
616   gfc_expr *op1, *op2;
617
618   op1 = e->value.op.op1;
619   op2 = e->value.op.op2;
620
621   if (op1->ts.type == BT_UNKNOWN || op2->ts.type == BT_UNKNOWN)
622     {
623       gfc_clear_ts (&e->ts);
624       return;
625     }
626
627   /* Kind conversions of same type.  */
628   if (op1->ts.type == op2->ts.type)
629     {
630
631       if (op1->ts.kind == op2->ts.kind)
632         {
633           /* No type conversions.  */
634           e->ts = op1->ts;
635           goto done;
636         }
637
638       if (op1->ts.kind > op2->ts.kind)
639         gfc_convert_type (op2, &op1->ts, 2);
640       else
641         gfc_convert_type (op1, &op2->ts, 2);
642
643       e->ts = op1->ts;
644       goto done;
645     }
646
647   /* Integer combined with real or complex.  */
648   if (op2->ts.type == BT_INTEGER)
649     {
650       e->ts = op1->ts;
651
652       /* Special case for ** operator.  */
653       if (e->value.op.operator == INTRINSIC_POWER)
654         goto done;
655
656       gfc_convert_type (e->value.op.op2, &e->ts, 2);
657       goto done;
658     }
659
660   if (op1->ts.type == BT_INTEGER)
661     {
662       e->ts = op2->ts;
663       gfc_convert_type (e->value.op.op1, &e->ts, 2);
664       goto done;
665     }
666
667   /* Real combined with complex.  */
668   e->ts.type = BT_COMPLEX;
669   if (op1->ts.kind > op2->ts.kind)
670     e->ts.kind = op1->ts.kind;
671   else
672     e->ts.kind = op2->ts.kind;
673   if (op1->ts.type != BT_COMPLEX || op1->ts.kind != e->ts.kind)
674     gfc_convert_type (e->value.op.op1, &e->ts, 2);
675   if (op2->ts.type != BT_COMPLEX || op2->ts.kind != e->ts.kind)
676     gfc_convert_type (e->value.op.op2, &e->ts, 2);
677
678 done:
679   return;
680 }
681
682
683 /* Function to determine if an expression is constant or not.  This
684    function expects that the expression has already been simplified.  */
685
686 int
687 gfc_is_constant_expr (gfc_expr * e)
688 {
689   gfc_constructor *c;
690   gfc_actual_arglist *arg;
691   int rv;
692
693   if (e == NULL)
694     return 1;
695
696   switch (e->expr_type)
697     {
698     case EXPR_OP:
699       rv = (gfc_is_constant_expr (e->value.op.op1)
700             && (e->value.op.op2 == NULL
701                 || gfc_is_constant_expr (e->value.op.op2)));
702
703       break;
704
705     case EXPR_VARIABLE:
706       rv = 0;
707       break;
708
709     case EXPR_FUNCTION:
710       /* Call to intrinsic with at least one argument.  */
711       rv = 0;
712       if (e->value.function.isym && e->value.function.actual)
713         {
714           for (arg = e->value.function.actual; arg; arg = arg->next)
715             {
716               if (!gfc_is_constant_expr (arg->expr))
717                 break;
718             }
719           if (arg == NULL)
720             rv = 1;
721         }
722       break;
723
724     case EXPR_CONSTANT:
725     case EXPR_NULL:
726       rv = 1;
727       break;
728
729     case EXPR_SUBSTRING:
730       rv = (gfc_is_constant_expr (e->ref->u.ss.start)
731             && gfc_is_constant_expr (e->ref->u.ss.end));
732       break;
733
734     case EXPR_STRUCTURE:
735       rv = 0;
736       for (c = e->value.constructor; c; c = c->next)
737         if (!gfc_is_constant_expr (c->expr))
738           break;
739
740       if (c == NULL)
741         rv = 1;
742       break;
743
744     case EXPR_ARRAY:
745       rv = gfc_constant_ac (e);
746       break;
747
748     default:
749       gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
750     }
751
752   return rv;
753 }
754
755
756 /* Try to collapse intrinsic expressions.  */
757
758 static try
759 simplify_intrinsic_op (gfc_expr * p, int type)
760 {
761   gfc_expr *op1, *op2, *result;
762
763   if (p->value.op.operator == INTRINSIC_USER)
764     return SUCCESS;
765
766   op1 = p->value.op.op1;
767   op2 = p->value.op.op2;
768
769   if (gfc_simplify_expr (op1, type) == FAILURE)
770     return FAILURE;
771   if (gfc_simplify_expr (op2, type) == FAILURE)
772     return FAILURE;
773
774   if (!gfc_is_constant_expr (op1)
775       || (op2 != NULL && !gfc_is_constant_expr (op2)))
776     return SUCCESS;
777
778   /* Rip p apart */
779   p->value.op.op1 = NULL;
780   p->value.op.op2 = NULL;
781
782   switch (p->value.op.operator)
783     {
784     case INTRINSIC_UPLUS:
785     case INTRINSIC_PARENTHESES:
786       result = gfc_uplus (op1);
787       break;
788
789     case INTRINSIC_UMINUS:
790       result = gfc_uminus (op1);
791       break;
792
793     case INTRINSIC_PLUS:
794       result = gfc_add (op1, op2);
795       break;
796
797     case INTRINSIC_MINUS:
798       result = gfc_subtract (op1, op2);
799       break;
800
801     case INTRINSIC_TIMES:
802       result = gfc_multiply (op1, op2);
803       break;
804
805     case INTRINSIC_DIVIDE:
806       result = gfc_divide (op1, op2);
807       break;
808
809     case INTRINSIC_POWER:
810       result = gfc_power (op1, op2);
811       break;
812
813     case INTRINSIC_CONCAT:
814       result = gfc_concat (op1, op2);
815       break;
816
817     case INTRINSIC_EQ:
818       result = gfc_eq (op1, op2);
819       break;
820
821     case INTRINSIC_NE:
822       result = gfc_ne (op1, op2);
823       break;
824
825     case INTRINSIC_GT:
826       result = gfc_gt (op1, op2);
827       break;
828
829     case INTRINSIC_GE:
830       result = gfc_ge (op1, op2);
831       break;
832
833     case INTRINSIC_LT:
834       result = gfc_lt (op1, op2);
835       break;
836
837     case INTRINSIC_LE:
838       result = gfc_le (op1, op2);
839       break;
840
841     case INTRINSIC_NOT:
842       result = gfc_not (op1);
843       break;
844
845     case INTRINSIC_AND:
846       result = gfc_and (op1, op2);
847       break;
848
849     case INTRINSIC_OR:
850       result = gfc_or (op1, op2);
851       break;
852
853     case INTRINSIC_EQV:
854       result = gfc_eqv (op1, op2);
855       break;
856
857     case INTRINSIC_NEQV:
858       result = gfc_neqv (op1, op2);
859       break;
860
861     default:
862       gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
863     }
864
865   if (result == NULL)
866     {
867       gfc_free_expr (op1);
868       gfc_free_expr (op2);
869       return FAILURE;
870     }
871
872   result->rank = p->rank;
873   result->where = p->where;
874   gfc_replace_expr (p, result);
875
876   return SUCCESS;
877 }
878
879
880 /* Subroutine to simplify constructor expressions.  Mutually recursive
881    with gfc_simplify_expr().  */
882
883 static try
884 simplify_constructor (gfc_constructor * c, int type)
885 {
886
887   for (; c; c = c->next)
888     {
889       if (c->iterator
890           && (gfc_simplify_expr (c->iterator->start, type) == FAILURE
891               || gfc_simplify_expr (c->iterator->end, type) == FAILURE
892               || gfc_simplify_expr (c->iterator->step, type) == FAILURE))
893         return FAILURE;
894
895       if (c->expr && gfc_simplify_expr (c->expr, type) == FAILURE)
896         return FAILURE;
897     }
898
899   return SUCCESS;
900 }
901
902
903 /* Pull a single array element out of an array constructor.  */
904
905 static try
906 find_array_element (gfc_constructor * cons, gfc_array_ref * ar,
907                     gfc_constructor ** rval)
908 {
909   unsigned long nelemen;
910   int i;
911   mpz_t delta;
912   mpz_t offset;
913   gfc_expr *e;
914   try t;
915
916   t = SUCCESS;
917   e = NULL;
918
919   mpz_init_set_ui (offset, 0);
920   mpz_init (delta);
921   for (i = 0; i < ar->dimen; i++)
922     {
923       e = gfc_copy_expr (ar->start[i]);
924       if (e->expr_type != EXPR_CONSTANT)
925         {
926           cons = NULL;
927           goto depart;
928         }
929
930       /* Check the bounds.  */
931       if (ar->as->upper[i]
932             && (mpz_cmp (e->value.integer,
933                         ar->as->upper[i]->value.integer) > 0
934             || mpz_cmp (e->value.integer,
935                         ar->as->lower[i]->value.integer) < 0))
936         {
937           gfc_error ("index in dimension %d is out of bounds "
938                      "at %L", i + 1, &ar->c_where[i]);
939           cons = NULL;
940           t = FAILURE;
941           goto depart;
942         }
943
944       mpz_sub (delta, e->value.integer,
945                ar->as->lower[i]->value.integer);
946       mpz_add (offset, offset, delta);
947     }
948
949   if (cons)
950     {
951       for (nelemen = mpz_get_ui (offset); nelemen > 0; nelemen--)
952         {
953           if (cons->iterator)
954             {
955               cons = NULL;
956               goto depart;
957             }
958           cons = cons->next;
959         }
960     }
961
962 depart:
963   mpz_clear (delta);
964   mpz_clear (offset);
965   if (e)
966     gfc_free_expr (e);
967   *rval = cons;
968   return t;
969 }
970
971
972 /* Find a component of a structure constructor.  */
973
974 static gfc_constructor *
975 find_component_ref (gfc_constructor * cons, gfc_ref * ref)
976 {
977   gfc_component *comp;
978   gfc_component *pick;
979
980   comp = ref->u.c.sym->components;
981   pick = ref->u.c.component;
982   while (comp != pick)
983     {
984       comp = comp->next;
985       cons = cons->next;
986     }
987
988   return cons;
989 }
990
991
992 /* Replace an expression with the contents of a constructor, removing
993    the subobject reference in the process.  */
994
995 static void
996 remove_subobject_ref (gfc_expr * p, gfc_constructor * cons)
997 {
998   gfc_expr *e;
999
1000   e = cons->expr;
1001   cons->expr = NULL;
1002   e->ref = p->ref->next;
1003   p->ref->next =  NULL;
1004   gfc_replace_expr (p, e);
1005 }
1006
1007
1008 /* Pull an array section out of an array constructor.  */
1009
1010 static try
1011 find_array_section (gfc_expr *expr, gfc_ref *ref)
1012 {
1013   int idx;
1014   int rank;
1015   int d;
1016   long unsigned one = 1;
1017   mpz_t start[GFC_MAX_DIMENSIONS];
1018   mpz_t end[GFC_MAX_DIMENSIONS];
1019   mpz_t stride[GFC_MAX_DIMENSIONS];
1020   mpz_t delta[GFC_MAX_DIMENSIONS];
1021   mpz_t ctr[GFC_MAX_DIMENSIONS];
1022   mpz_t delta_mpz;
1023   mpz_t tmp_mpz;
1024   mpz_t nelts;
1025   mpz_t ptr;
1026   mpz_t stop;
1027   mpz_t index;
1028   gfc_constructor *cons;
1029   gfc_constructor *base;
1030   gfc_expr *begin;
1031   gfc_expr *finish;
1032   gfc_expr *step;
1033   gfc_expr *upper;
1034   gfc_expr *lower;
1035   try t;
1036
1037   t = SUCCESS;
1038
1039   base = expr->value.constructor;
1040   expr->value.constructor = NULL;
1041
1042   rank = ref->u.ar.as->rank;
1043
1044   if (expr->shape == NULL)
1045     expr->shape = gfc_get_shape (rank);
1046
1047   mpz_init_set_ui (delta_mpz, one);
1048   mpz_init_set_ui (nelts, one);
1049   mpz_init (tmp_mpz);
1050
1051   /* Do the initialization now, so that we can cleanup without
1052      keeping track of where we were.  */
1053   for (d = 0; d < rank; d++)
1054     {
1055       mpz_init (delta[d]);
1056       mpz_init (start[d]);
1057       mpz_init (end[d]);
1058       mpz_init (ctr[d]);
1059       mpz_init (stride[d]);
1060     }
1061
1062   /* Build the counters to clock through the array reference.  */
1063   for (d = 0; d < rank; d++)
1064     {
1065       /* Make this stretch of code easier on the eye!  */
1066       begin = ref->u.ar.start[d];
1067       finish = ref->u.ar.end[d];
1068       step = ref->u.ar.stride[d];
1069       lower = ref->u.ar.as->lower[d];
1070       upper = ref->u.ar.as->upper[d];
1071
1072       if ((begin && begin->expr_type != EXPR_CONSTANT)
1073             || (finish && finish->expr_type != EXPR_CONSTANT)
1074             || (step && step->expr_type != EXPR_CONSTANT))
1075         {
1076           t = FAILURE;
1077           goto cleanup;
1078         }
1079
1080       /* Obtain the stride.  */
1081       if (step)
1082         mpz_set (stride[d], step->value.integer);
1083       else
1084         mpz_set_ui (stride[d], one);
1085
1086       if (mpz_cmp_ui (stride[d], 0) == 0)
1087         mpz_set_ui (stride[d], one);
1088
1089       /* Obtain the start value for the index.  */
1090       if (begin)
1091           mpz_set (start[d], begin->value.integer);
1092       else
1093         mpz_set (start[d], lower->value.integer);
1094
1095       mpz_set (ctr[d], start[d]);
1096
1097       /* Obtain the end value for the index.  */
1098       if (finish)
1099         mpz_set (end[d], finish->value.integer);
1100       else
1101         mpz_set (end[d], upper->value.integer);
1102
1103       /* Separate 'if' because elements sometimes arrive with
1104          non-null end.  */
1105       if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1106         mpz_set (end [d], begin->value.integer);
1107
1108       /* Check the bounds.  */
1109       if (mpz_cmp (ctr[d], upper->value.integer) > 0
1110             || mpz_cmp (end[d], upper->value.integer) > 0
1111             || mpz_cmp (ctr[d], lower->value.integer) < 0
1112             || mpz_cmp (end[d], lower->value.integer) < 0)
1113         {
1114           gfc_error ("index in dimension %d is out of bounds "
1115                      "at %L", d + 1, &ref->u.ar.c_where[d]);
1116           t = FAILURE;
1117           goto cleanup;
1118         }
1119
1120       /* Calculate the number of elements and the shape.  */
1121       mpz_abs (tmp_mpz, stride[d]);
1122       mpz_div (tmp_mpz, stride[d], tmp_mpz);
1123       mpz_add (tmp_mpz, end[d], tmp_mpz);
1124       mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1125       mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1126       mpz_mul (nelts, nelts, tmp_mpz);
1127
1128       mpz_set (expr->shape[d], tmp_mpz);
1129
1130       /* Calculate the 'stride' (=delta) for conversion of the
1131          counter values into the index along the constructor.  */
1132       mpz_set (delta[d], delta_mpz);
1133       mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1134       mpz_add_ui (tmp_mpz, tmp_mpz, one);
1135       mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1136     }
1137
1138   mpz_init (index);
1139   mpz_init (ptr);
1140   mpz_init (stop);
1141   cons = base;
1142
1143   /* Now clock through the array reference, calculating the index in
1144      the source constructor and transferring the elements to the new
1145      constructor.  */  
1146   for (idx = 0; idx < (int)mpz_get_si (nelts); idx++)
1147     {
1148       if (ref->u.ar.offset)
1149         mpz_set (ptr, ref->u.ar.offset->value.integer);
1150       else
1151         mpz_init_set_ui (ptr, 0);
1152
1153       mpz_set_ui (stop, one);
1154       for (d = 0; d < rank; d++)
1155         {
1156           mpz_set (tmp_mpz, ctr[d]);
1157           mpz_sub_ui (tmp_mpz, tmp_mpz, one);
1158           mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1159           mpz_add (ptr, ptr, tmp_mpz);
1160
1161           mpz_mul (tmp_mpz, stride[d], stop);
1162           mpz_add (ctr[d], ctr[d], tmp_mpz); 
1163
1164           mpz_set (tmp_mpz, end[d]);
1165           if (mpz_cmp_ui (stride[d], 0) > 0 ?
1166                 mpz_cmp (ctr[d], tmp_mpz) > 0 :
1167                 mpz_cmp (ctr[d], tmp_mpz) < 0)
1168             mpz_set (ctr[d], start[d]);
1169           else
1170             mpz_set_ui (stop, 0);
1171         }
1172
1173       /* There must be a better way of dealing with negative strides
1174          than resetting the index and the constructor pointer!  */ 
1175       if (mpz_cmp (ptr, index) < 0)
1176         {
1177           mpz_set_ui (index, 0);
1178           cons = base;
1179         }
1180
1181       while (mpz_cmp (ptr, index) > 0)
1182         {
1183           mpz_add_ui (index, index, one);
1184           cons = cons->next;
1185         }
1186
1187       gfc_append_constructor (expr, gfc_copy_expr (cons->expr));
1188     }
1189
1190   mpz_clear (ptr);
1191   mpz_clear (index);
1192   mpz_clear (stop);
1193
1194 cleanup:
1195
1196   mpz_clear (delta_mpz);
1197   mpz_clear (tmp_mpz);
1198   mpz_clear (nelts);
1199   for (d = 0; d < rank; d++)
1200     {
1201       mpz_clear (delta[d]);
1202       mpz_clear (start[d]);
1203       mpz_clear (end[d]);
1204       mpz_clear (ctr[d]);
1205       mpz_clear (stride[d]);
1206     }
1207   gfc_free_constructor (base);
1208   return t;
1209 }
1210
1211 /* Pull a substring out of an expression.  */
1212
1213 static try
1214 find_substring_ref (gfc_expr *p, gfc_expr **newp)
1215 {
1216   int end;
1217   int start;
1218   char *chr;
1219
1220   if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1221         || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1222     return FAILURE;
1223
1224   *newp = gfc_copy_expr (p);
1225   chr = p->value.character.string;
1226   end = (int)mpz_get_ui (p->ref->u.ss.end->value.integer);
1227   start = (int)mpz_get_ui (p->ref->u.ss.start->value.integer);
1228
1229   (*newp)->value.character.length = end - start + 1;
1230   strncpy ((*newp)->value.character.string, &chr[start - 1],
1231            (*newp)->value.character.length);
1232   return SUCCESS;
1233 }
1234
1235
1236
1237 /* Simplify a subobject reference of a constructor.  This occurs when
1238    parameter variable values are substituted.  */
1239
1240 static try
1241 simplify_const_ref (gfc_expr * p)
1242 {
1243   gfc_constructor *cons;
1244   gfc_expr *newp;
1245
1246   while (p->ref)
1247     {
1248       switch (p->ref->type)
1249         {
1250         case REF_ARRAY:
1251           switch (p->ref->u.ar.type)
1252             {
1253             case AR_ELEMENT:
1254               if (find_array_element (p->value.constructor,
1255                                       &p->ref->u.ar,
1256                                       &cons) == FAILURE)
1257                 return FAILURE;
1258
1259               if (!cons)
1260                 return SUCCESS;
1261
1262               remove_subobject_ref (p, cons);
1263               break;
1264
1265             case AR_SECTION:
1266               if (find_array_section (p, p->ref) == FAILURE)
1267                 return FAILURE;
1268               p->ref->u.ar.type = AR_FULL;
1269
1270             /* FALLTHROUGH  */
1271
1272             case AR_FULL:
1273               if (p->ref->next != NULL
1274                     && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
1275                 {
1276                   cons = p->value.constructor;
1277                   for (; cons; cons = cons->next)
1278                     {
1279                       cons->expr->ref = copy_ref (p->ref->next);
1280                       simplify_const_ref (cons->expr);
1281                     }
1282                 }
1283               gfc_free_ref_list (p->ref);
1284               p->ref = NULL;
1285               break;
1286
1287             default:
1288               return SUCCESS;
1289             }
1290
1291           break;
1292
1293         case REF_COMPONENT:
1294           cons = find_component_ref (p->value.constructor, p->ref);
1295           remove_subobject_ref (p, cons);
1296           break;
1297
1298         case REF_SUBSTRING:
1299           if (find_substring_ref (p, &newp) == FAILURE)
1300             return FAILURE;
1301
1302           gfc_replace_expr (p, newp);
1303           gfc_free_ref_list (p->ref);
1304           p->ref = NULL;
1305           break;
1306         }
1307     }
1308
1309   return SUCCESS;
1310 }
1311
1312
1313 /* Simplify a chain of references.  */
1314
1315 static try
1316 simplify_ref_chain (gfc_ref * ref, int type)
1317 {
1318   int n;
1319
1320   for (; ref; ref = ref->next)
1321     {
1322       switch (ref->type)
1323         {
1324         case REF_ARRAY:
1325           for (n = 0; n < ref->u.ar.dimen; n++)
1326             {
1327               if (gfc_simplify_expr (ref->u.ar.start[n], type)
1328                     == FAILURE)
1329                 return FAILURE;
1330               if (gfc_simplify_expr (ref->u.ar.end[n], type)
1331                      == FAILURE)
1332                 return FAILURE;
1333               if (gfc_simplify_expr (ref->u.ar.stride[n], type)
1334                      == FAILURE)
1335                 return FAILURE;
1336
1337             }
1338           break;
1339
1340         case REF_SUBSTRING:
1341           if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1342             return FAILURE;
1343           if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1344             return FAILURE;
1345           break;
1346
1347         default:
1348           break;
1349         }
1350     }
1351   return SUCCESS;
1352 }
1353
1354
1355 /* Try to substitute the value of a parameter variable.  */
1356 static try
1357 simplify_parameter_variable (gfc_expr * p, int type)
1358 {
1359   gfc_expr *e;
1360   try t;
1361
1362   e = gfc_copy_expr (p->symtree->n.sym->value);
1363   if (e == NULL)
1364     return FAILURE;
1365
1366   e->rank = p->rank;
1367
1368   /* Do not copy subobject refs for constant.  */
1369   if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1370     e->ref = copy_ref (p->ref);
1371   t = gfc_simplify_expr (e, type);
1372
1373   /* Only use the simplification if it eliminated all subobject
1374      references.  */
1375   if (t == SUCCESS && ! e->ref)
1376     gfc_replace_expr (p, e);
1377   else
1378     gfc_free_expr (e);
1379
1380   return t;
1381 }
1382
1383 /* Given an expression, simplify it by collapsing constant
1384    expressions.  Most simplification takes place when the expression
1385    tree is being constructed.  If an intrinsic function is simplified
1386    at some point, we get called again to collapse the result against
1387    other constants.
1388
1389    We work by recursively simplifying expression nodes, simplifying
1390    intrinsic functions where possible, which can lead to further
1391    constant collapsing.  If an operator has constant operand(s), we
1392    rip the expression apart, and rebuild it, hoping that it becomes
1393    something simpler.
1394
1395    The expression type is defined for:
1396      0   Basic expression parsing
1397      1   Simplifying array constructors -- will substitute
1398          iterator values.
1399    Returns FAILURE on error, SUCCESS otherwise.
1400    NOTE: Will return SUCCESS even if the expression can not be simplified.  */
1401
1402 try
1403 gfc_simplify_expr (gfc_expr * p, int type)
1404 {
1405   gfc_actual_arglist *ap;
1406
1407   if (p == NULL)
1408     return SUCCESS;
1409
1410   switch (p->expr_type)
1411     {
1412     case EXPR_CONSTANT:
1413     case EXPR_NULL:
1414       break;
1415
1416     case EXPR_FUNCTION:
1417       for (ap = p->value.function.actual; ap; ap = ap->next)
1418         if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1419           return FAILURE;
1420
1421       if (p->value.function.isym != NULL
1422           && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1423         return FAILURE;
1424
1425       break;
1426
1427     case EXPR_SUBSTRING:
1428       if (simplify_ref_chain (p->ref, type) == FAILURE)
1429         return FAILURE;
1430
1431       if (gfc_is_constant_expr (p))
1432         {
1433           char *s;
1434           int start, end;
1435
1436           gfc_extract_int (p->ref->u.ss.start, &start);
1437           start--;  /* Convert from one-based to zero-based.  */
1438           gfc_extract_int (p->ref->u.ss.end, &end);
1439           s = gfc_getmem (end - start + 1);
1440           memcpy (s, p->value.character.string + start, end - start);
1441           s[end-start+1] = '\0';  /* TODO: C-style string for debugging.  */
1442           gfc_free (p->value.character.string);
1443           p->value.character.string = s;
1444           p->value.character.length = end - start;
1445           p->ts.cl = gfc_get_charlen ();
1446           p->ts.cl->next = gfc_current_ns->cl_list;
1447           gfc_current_ns->cl_list = p->ts.cl;
1448           p->ts.cl->length = gfc_int_expr (p->value.character.length);
1449           gfc_free_ref_list (p->ref);
1450           p->ref = NULL;
1451           p->expr_type = EXPR_CONSTANT;
1452         }
1453       break;
1454
1455     case EXPR_OP:
1456       if (simplify_intrinsic_op (p, type) == FAILURE)
1457         return FAILURE;
1458       break;
1459
1460     case EXPR_VARIABLE:
1461       /* Only substitute array parameter variables if we are in an
1462          initialization expression, or we want a subsection.  */
1463       if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1464           && (gfc_init_expr || p->ref
1465               || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1466         {
1467           if (simplify_parameter_variable (p, type) == FAILURE)
1468             return FAILURE;
1469           break;
1470         }
1471
1472       if (type == 1)
1473         {
1474           gfc_simplify_iterator_var (p);
1475         }
1476
1477       /* Simplify subcomponent references.  */
1478       if (simplify_ref_chain (p->ref, type) == FAILURE)
1479         return FAILURE;
1480
1481       break;
1482
1483     case EXPR_STRUCTURE:
1484     case EXPR_ARRAY:
1485       if (simplify_ref_chain (p->ref, type) == FAILURE)
1486         return FAILURE;
1487
1488       if (simplify_constructor (p->value.constructor, type) == FAILURE)
1489         return FAILURE;
1490
1491       if (p->expr_type == EXPR_ARRAY
1492             && p->ref && p->ref->type == REF_ARRAY
1493             && p->ref->u.ar.type == AR_FULL)
1494           gfc_expand_constructor (p);
1495
1496       if (simplify_const_ref (p) == FAILURE)
1497         return FAILURE;
1498
1499       break;
1500     }
1501
1502   return SUCCESS;
1503 }
1504
1505
1506 /* Returns the type of an expression with the exception that iterator
1507    variables are automatically integers no matter what else they may
1508    be declared as.  */
1509
1510 static bt
1511 et0 (gfc_expr * e)
1512 {
1513
1514   if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1515     return BT_INTEGER;
1516
1517   return e->ts.type;
1518 }
1519
1520
1521 /* Check an intrinsic arithmetic operation to see if it is consistent
1522    with some type of expression.  */
1523
1524 static try check_init_expr (gfc_expr *);
1525
1526 static try
1527 check_intrinsic_op (gfc_expr * e, try (*check_function) (gfc_expr *))
1528 {
1529   gfc_expr *op1 = e->value.op.op1;
1530   gfc_expr *op2 = e->value.op.op2;
1531
1532   if ((*check_function) (op1) == FAILURE)
1533     return FAILURE;
1534
1535   switch (e->value.op.operator)
1536     {
1537     case INTRINSIC_UPLUS:
1538     case INTRINSIC_UMINUS:
1539       if (!numeric_type (et0 (op1)))
1540         goto not_numeric;
1541       break;
1542
1543     case INTRINSIC_EQ:
1544     case INTRINSIC_NE:
1545     case INTRINSIC_GT:
1546     case INTRINSIC_GE:
1547     case INTRINSIC_LT:
1548     case INTRINSIC_LE:
1549       if ((*check_function) (op2) == FAILURE)
1550         return FAILURE;
1551       
1552       if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1553           && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
1554         {
1555           gfc_error ("Numeric or CHARACTER operands are required in "
1556                      "expression at %L", &e->where);
1557          return FAILURE;
1558         }
1559       break;
1560
1561     case INTRINSIC_PLUS:
1562     case INTRINSIC_MINUS:
1563     case INTRINSIC_TIMES:
1564     case INTRINSIC_DIVIDE:
1565     case INTRINSIC_POWER:
1566       if ((*check_function) (op2) == FAILURE)
1567         return FAILURE;
1568
1569       if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
1570         goto not_numeric;
1571
1572       if (e->value.op.operator == INTRINSIC_POWER
1573           && check_function == check_init_expr && et0 (op2) != BT_INTEGER)
1574         {
1575           gfc_error ("Exponent at %L must be INTEGER for an initialization "
1576                      "expression", &op2->where);
1577           return FAILURE;
1578         }
1579
1580       break;
1581
1582     case INTRINSIC_CONCAT:
1583       if ((*check_function) (op2) == FAILURE)
1584         return FAILURE;
1585
1586       if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
1587         {
1588           gfc_error ("Concatenation operator in expression at %L "
1589                      "must have two CHARACTER operands", &op1->where);
1590           return FAILURE;
1591         }
1592
1593       if (op1->ts.kind != op2->ts.kind)
1594         {
1595           gfc_error ("Concat operator at %L must concatenate strings of the "
1596                      "same kind", &e->where);
1597           return FAILURE;
1598         }
1599
1600       break;
1601
1602     case INTRINSIC_NOT:
1603       if (et0 (op1) != BT_LOGICAL)
1604         {
1605           gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
1606                      "operand", &op1->where);
1607           return FAILURE;
1608         }
1609
1610       break;
1611
1612     case INTRINSIC_AND:
1613     case INTRINSIC_OR:
1614     case INTRINSIC_EQV:
1615     case INTRINSIC_NEQV:
1616       if ((*check_function) (op2) == FAILURE)
1617         return FAILURE;
1618
1619       if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
1620         {
1621           gfc_error ("LOGICAL operands are required in expression at %L",
1622                      &e->where);
1623           return FAILURE;
1624         }
1625
1626       break;
1627
1628     case INTRINSIC_PARENTHESES:
1629       break;
1630
1631     default:
1632       gfc_error ("Only intrinsic operators can be used in expression at %L",
1633                  &e->where);
1634       return FAILURE;
1635     }
1636
1637   return SUCCESS;
1638
1639 not_numeric:
1640   gfc_error ("Numeric operands are required in expression at %L", &e->where);
1641
1642   return FAILURE;
1643 }
1644
1645
1646
1647 /* Certain inquiry functions are specifically allowed to have variable
1648    arguments, which is an exception to the normal requirement that an
1649    initialization function have initialization arguments.  We head off
1650    this problem here.  */
1651
1652 static try
1653 check_inquiry (gfc_expr * e, int not_restricted)
1654 {
1655   const char *name;
1656
1657   /* FIXME: This should be moved into the intrinsic definitions,
1658      to eliminate this ugly hack.  */
1659   static const char * const inquiry_function[] = {
1660     "digits", "epsilon", "huge", "kind", "len", "maxexponent", "minexponent",
1661     "precision", "radix", "range", "tiny", "bit_size", "size", "shape",
1662     "lbound", "ubound", NULL
1663   };
1664
1665   int i;
1666
1667   /* An undeclared parameter will get us here (PR25018).  */
1668   if (e->symtree == NULL)
1669     return FAILURE;
1670
1671   name = e->symtree->n.sym->name;
1672
1673   for (i = 0; inquiry_function[i]; i++)
1674     if (strcmp (inquiry_function[i], name) == 0)
1675       break;
1676
1677   if (inquiry_function[i] == NULL)
1678     return FAILURE;
1679
1680   e = e->value.function.actual->expr;
1681
1682   if (e == NULL || e->expr_type != EXPR_VARIABLE)
1683     return FAILURE;
1684
1685   /* At this point we have an inquiry function with a variable argument.  The
1686      type of the variable might be undefined, but we need it now, because the
1687      arguments of these functions are allowed to be undefined.  */
1688
1689   if (e->ts.type == BT_UNKNOWN)
1690     {
1691       if (e->symtree->n.sym->ts.type == BT_UNKNOWN
1692           && gfc_set_default_type (e->symtree->n.sym, 0, gfc_current_ns)
1693             == FAILURE)
1694         return FAILURE;
1695
1696       e->ts = e->symtree->n.sym->ts;
1697     }
1698
1699   /* Assumed character length will not reduce to a constant expression
1700      with LEN, as required by the standard.  */
1701   if (i == 4 && not_restricted
1702         && e->symtree->n.sym->ts.type == BT_CHARACTER
1703         && e->symtree->n.sym->ts.cl->length == NULL)
1704     gfc_notify_std (GFC_STD_GNU, "assumed character length "
1705                     "variable '%s' in constant expression at %L",
1706                     e->symtree->n.sym->name, &e->where);
1707
1708   return SUCCESS;
1709 }
1710
1711
1712 /* Verify that an expression is an initialization expression.  A side
1713    effect is that the expression tree is reduced to a single constant
1714    node if all goes well.  This would normally happen when the
1715    expression is constructed but function references are assumed to be
1716    intrinsics in the context of initialization expressions.  If
1717    FAILURE is returned an error message has been generated.  */
1718
1719 static try
1720 check_init_expr (gfc_expr * e)
1721 {
1722   gfc_actual_arglist *ap;
1723   match m;
1724   try t;
1725
1726   if (e == NULL)
1727     return SUCCESS;
1728
1729   switch (e->expr_type)
1730     {
1731     case EXPR_OP:
1732       t = check_intrinsic_op (e, check_init_expr);
1733       if (t == SUCCESS)
1734         t = gfc_simplify_expr (e, 0);
1735
1736       break;
1737
1738     case EXPR_FUNCTION:
1739       t = SUCCESS;
1740
1741       if (check_inquiry (e, 1) != SUCCESS)
1742         {
1743           t = SUCCESS;
1744           for (ap = e->value.function.actual; ap; ap = ap->next)
1745             if (check_init_expr (ap->expr) == FAILURE)
1746               {
1747                 t = FAILURE;
1748                 break;
1749               }
1750         }
1751
1752       if (t == SUCCESS)
1753         {
1754           m = gfc_intrinsic_func_interface (e, 0);
1755
1756           if (m == MATCH_NO)
1757             gfc_error ("Function '%s' in initialization expression at %L "
1758                        "must be an intrinsic function",
1759                        e->symtree->n.sym->name, &e->where);
1760
1761           if (m != MATCH_YES)
1762             t = FAILURE;
1763         }
1764
1765       break;
1766
1767     case EXPR_VARIABLE:
1768       t = SUCCESS;
1769
1770       if (gfc_check_iter_variable (e) == SUCCESS)
1771         break;
1772
1773       if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
1774         {
1775           t = simplify_parameter_variable (e, 0);
1776           break;
1777         }
1778
1779       gfc_error ("Parameter '%s' at %L has not been declared or is "
1780                  "a variable, which does not reduce to a constant "
1781                  "expression", e->symtree->n.sym->name, &e->where);
1782       t = FAILURE;
1783       break;
1784
1785     case EXPR_CONSTANT:
1786     case EXPR_NULL:
1787       t = SUCCESS;
1788       break;
1789
1790     case EXPR_SUBSTRING:
1791       t = check_init_expr (e->ref->u.ss.start);
1792       if (t == FAILURE)
1793         break;
1794
1795       t = check_init_expr (e->ref->u.ss.end);
1796       if (t == SUCCESS)
1797         t = gfc_simplify_expr (e, 0);
1798
1799       break;
1800
1801     case EXPR_STRUCTURE:
1802       t = gfc_check_constructor (e, check_init_expr);
1803       break;
1804
1805     case EXPR_ARRAY:
1806       t = gfc_check_constructor (e, check_init_expr);
1807       if (t == FAILURE)
1808         break;
1809
1810       t = gfc_expand_constructor (e);
1811       if (t == FAILURE)
1812         break;
1813
1814       t = gfc_check_constructor_type (e);
1815       break;
1816
1817     default:
1818       gfc_internal_error ("check_init_expr(): Unknown expression type");
1819     }
1820
1821   return t;
1822 }
1823
1824
1825 /* Match an initialization expression.  We work by first matching an
1826    expression, then reducing it to a constant.  */
1827
1828 match
1829 gfc_match_init_expr (gfc_expr ** result)
1830 {
1831   gfc_expr *expr;
1832   match m;
1833   try t;
1834
1835   m = gfc_match_expr (&expr);
1836   if (m != MATCH_YES)
1837     return m;
1838
1839   gfc_init_expr = 1;
1840   t = gfc_resolve_expr (expr);
1841   if (t == SUCCESS)
1842     t = check_init_expr (expr);
1843   gfc_init_expr = 0;
1844
1845   if (t == FAILURE)
1846     {
1847       gfc_free_expr (expr);
1848       return MATCH_ERROR;
1849     }
1850
1851   if (expr->expr_type == EXPR_ARRAY
1852       && (gfc_check_constructor_type (expr) == FAILURE
1853           || gfc_expand_constructor (expr) == FAILURE))
1854     {
1855       gfc_free_expr (expr);
1856       return MATCH_ERROR;
1857     }
1858
1859   /* Not all inquiry functions are simplified to constant expressions
1860      so it is necessary to call check_inquiry again.  */ 
1861   if (!gfc_is_constant_expr (expr)
1862         && check_inquiry (expr, 1) == FAILURE)
1863     {
1864       gfc_error ("Initialization expression didn't reduce %C");
1865       return MATCH_ERROR;
1866     }
1867
1868   *result = expr;
1869
1870   return MATCH_YES;
1871 }
1872
1873
1874
1875 static try check_restricted (gfc_expr *);
1876
1877 /* Given an actual argument list, test to see that each argument is a
1878    restricted expression and optionally if the expression type is
1879    integer or character.  */
1880
1881 static try
1882 restricted_args (gfc_actual_arglist * a)
1883 {
1884   for (; a; a = a->next)
1885     {
1886       if (check_restricted (a->expr) == FAILURE)
1887         return FAILURE;
1888     }
1889
1890   return SUCCESS;
1891 }
1892
1893
1894 /************* Restricted/specification expressions *************/
1895
1896
1897 /* Make sure a non-intrinsic function is a specification function.  */
1898
1899 static try
1900 external_spec_function (gfc_expr * e)
1901 {
1902   gfc_symbol *f;
1903
1904   f = e->value.function.esym;
1905
1906   if (f->attr.proc == PROC_ST_FUNCTION)
1907     {
1908       gfc_error ("Specification function '%s' at %L cannot be a statement "
1909                  "function", f->name, &e->where);
1910       return FAILURE;
1911     }
1912
1913   if (f->attr.proc == PROC_INTERNAL)
1914     {
1915       gfc_error ("Specification function '%s' at %L cannot be an internal "
1916                  "function", f->name, &e->where);
1917       return FAILURE;
1918     }
1919
1920   if (!f->attr.pure && !f->attr.elemental)
1921     {
1922       gfc_error ("Specification function '%s' at %L must be PURE", f->name,
1923                  &e->where);
1924       return FAILURE;
1925     }
1926
1927   if (f->attr.recursive)
1928     {
1929       gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
1930                  f->name, &e->where);
1931       return FAILURE;
1932     }
1933
1934   return restricted_args (e->value.function.actual);
1935 }
1936
1937
1938 /* Check to see that a function reference to an intrinsic is a
1939    restricted expression.  */
1940
1941 static try
1942 restricted_intrinsic (gfc_expr * e)
1943 {
1944   /* TODO: Check constraints on inquiry functions.  7.1.6.2 (7).  */
1945   if (check_inquiry (e, 0) == SUCCESS)
1946     return SUCCESS;
1947
1948   return restricted_args (e->value.function.actual);
1949 }
1950
1951
1952 /* Verify that an expression is a restricted expression.  Like its
1953    cousin check_init_expr(), an error message is generated if we
1954    return FAILURE.  */
1955
1956 static try
1957 check_restricted (gfc_expr * e)
1958 {
1959   gfc_symbol *sym;
1960   try t;
1961
1962   if (e == NULL)
1963     return SUCCESS;
1964
1965   switch (e->expr_type)
1966     {
1967     case EXPR_OP:
1968       t = check_intrinsic_op (e, check_restricted);
1969       if (t == SUCCESS)
1970         t = gfc_simplify_expr (e, 0);
1971
1972       break;
1973
1974     case EXPR_FUNCTION:
1975       t = e->value.function.esym ?
1976         external_spec_function (e) : restricted_intrinsic (e);
1977
1978       break;
1979
1980     case EXPR_VARIABLE:
1981       sym = e->symtree->n.sym;
1982       t = FAILURE;
1983
1984       if (sym->attr.optional)
1985         {
1986           gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
1987                      sym->name, &e->where);
1988           break;
1989         }
1990
1991       if (sym->attr.intent == INTENT_OUT)
1992         {
1993           gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
1994                      sym->name, &e->where);
1995           break;
1996         }
1997
1998       /* gfc_is_formal_arg broadcasts that a formal argument list is being processed
1999          in resolve.c(resolve_formal_arglist).  This is done so that host associated
2000          dummy array indices are accepted (PR23446).  */
2001       if (sym->attr.in_common
2002           || sym->attr.use_assoc
2003           || sym->attr.dummy
2004           || sym->ns != gfc_current_ns
2005           || (sym->ns->proc_name != NULL
2006               && sym->ns->proc_name->attr.flavor == FL_MODULE)
2007           || gfc_is_formal_arg ())
2008         {
2009           t = SUCCESS;
2010           break;
2011         }
2012
2013       gfc_error ("Variable '%s' cannot appear in the expression at %L",
2014                  sym->name, &e->where);
2015
2016       break;
2017
2018     case EXPR_NULL:
2019     case EXPR_CONSTANT:
2020       t = SUCCESS;
2021       break;
2022
2023     case EXPR_SUBSTRING:
2024       t = gfc_specification_expr (e->ref->u.ss.start);
2025       if (t == FAILURE)
2026         break;
2027
2028       t = gfc_specification_expr (e->ref->u.ss.end);
2029       if (t == SUCCESS)
2030         t = gfc_simplify_expr (e, 0);
2031
2032       break;
2033
2034     case EXPR_STRUCTURE:
2035       t = gfc_check_constructor (e, check_restricted);
2036       break;
2037
2038     case EXPR_ARRAY:
2039       t = gfc_check_constructor (e, check_restricted);
2040       break;
2041
2042     default:
2043       gfc_internal_error ("check_restricted(): Unknown expression type");
2044     }
2045
2046   return t;
2047 }
2048
2049
2050 /* Check to see that an expression is a specification expression.  If
2051    we return FAILURE, an error has been generated.  */
2052
2053 try
2054 gfc_specification_expr (gfc_expr * e)
2055 {
2056   if (e == NULL)
2057     return SUCCESS;
2058
2059   if (e->ts.type != BT_INTEGER)
2060     {
2061       gfc_error ("Expression at %L must be of INTEGER type", &e->where);
2062       return FAILURE;
2063     }
2064
2065   if (e->rank != 0)
2066     {
2067       gfc_error ("Expression at %L must be scalar", &e->where);
2068       return FAILURE;
2069     }
2070
2071   if (gfc_simplify_expr (e, 0) == FAILURE)
2072     return FAILURE;
2073
2074   return check_restricted (e);
2075 }
2076
2077
2078 /************** Expression conformance checks.  *************/
2079
2080 /* Given two expressions, make sure that the arrays are conformable.  */
2081
2082 try
2083 gfc_check_conformance (const char *optype_msgid,
2084                        gfc_expr * op1, gfc_expr * op2)
2085 {
2086   int op1_flag, op2_flag, d;
2087   mpz_t op1_size, op2_size;
2088   try t;
2089
2090   if (op1->rank == 0 || op2->rank == 0)
2091     return SUCCESS;
2092
2093   if (op1->rank != op2->rank)
2094     {
2095       gfc_error ("Incompatible ranks in %s at %L", _(optype_msgid),
2096                  &op1->where);
2097       return FAILURE;
2098     }
2099
2100   t = SUCCESS;
2101
2102   for (d = 0; d < op1->rank; d++)
2103     {
2104       op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2105       op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2106
2107       if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2108         {
2109           gfc_error ("different shape for %s at %L on dimension %d (%d/%d)",
2110                      _(optype_msgid), &op1->where, d + 1,
2111                      (int) mpz_get_si (op1_size),
2112                      (int) mpz_get_si (op2_size));
2113
2114           t = FAILURE;
2115         }
2116
2117       if (op1_flag)
2118         mpz_clear (op1_size);
2119       if (op2_flag)
2120         mpz_clear (op2_size);
2121
2122       if (t == FAILURE)
2123         return FAILURE;
2124     }
2125
2126   return SUCCESS;
2127 }
2128
2129
2130 /* Given an assignable expression and an arbitrary expression, make
2131    sure that the assignment can take place.  */
2132
2133 try
2134 gfc_check_assign (gfc_expr * lvalue, gfc_expr * rvalue, int conform)
2135 {
2136   gfc_symbol *sym;
2137
2138   sym = lvalue->symtree->n.sym;
2139
2140   if (sym->attr.intent == INTENT_IN)
2141     {
2142       gfc_error ("Can't assign to INTENT(IN) variable '%s' at %L",
2143                  sym->name, &lvalue->where);
2144       return FAILURE;
2145     }
2146
2147 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2148    variable local to a function subprogram.  Its existence begins when
2149    execution of the function is initiated and ends when execution of the
2150    function is terminated.....
2151    Therefore, the left hand side is no longer a varaiable, when it is:*/
2152   if (sym->attr.flavor == FL_PROCEDURE
2153         && sym->attr.proc != PROC_ST_FUNCTION
2154         && !sym->attr.external)
2155     {
2156       bool bad_proc;
2157       bad_proc = false;
2158
2159       /* (i) Use associated; */
2160       if (sym->attr.use_assoc)
2161         bad_proc = true;
2162
2163       /* (ii) The assignment is in the main program; or  */
2164       if (gfc_current_ns->proc_name->attr.is_main_program)
2165         bad_proc = true;
2166
2167       /* (iii) A module or internal procedure....  */
2168       if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2169              || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2170           && gfc_current_ns->parent
2171           && (!(gfc_current_ns->parent->proc_name->attr.function
2172                   || gfc_current_ns->parent->proc_name->attr.subroutine)
2173               || gfc_current_ns->parent->proc_name->attr.is_main_program))
2174         {
2175           /* .... that is not a function.... */ 
2176           if (!gfc_current_ns->proc_name->attr.function)
2177             bad_proc = true;
2178
2179           /* .... or is not an entry and has a different name.  */
2180           if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2181             bad_proc = true;
2182         }
2183
2184       if (bad_proc)
2185         {
2186           gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2187           return FAILURE;
2188         }
2189     }
2190
2191   if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2192     {
2193       gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2194                  lvalue->rank, rvalue->rank, &lvalue->where);
2195       return FAILURE;
2196     }
2197
2198   if (lvalue->ts.type == BT_UNKNOWN)
2199     {
2200       gfc_error ("Variable type is UNKNOWN in assignment at %L",
2201                  &lvalue->where);
2202       return FAILURE;
2203     }
2204
2205    if (rvalue->expr_type == EXPR_NULL)
2206      {
2207        gfc_error ("NULL appears on right-hand side in assignment at %L",
2208                   &rvalue->where);
2209        return FAILURE;
2210      }
2211
2212    if (sym->attr.cray_pointee
2213        && lvalue->ref != NULL
2214        && lvalue->ref->u.ar.type == AR_FULL
2215        && lvalue->ref->u.ar.as->cp_was_assumed)
2216      {
2217        gfc_error ("Vector assignment to assumed-size Cray Pointee at %L"
2218                   " is illegal.", &lvalue->where);
2219        return FAILURE;
2220      }
2221
2222   /* This is possibly a typo: x = f() instead of x => f()  */
2223   if (gfc_option.warn_surprising 
2224       && rvalue->expr_type == EXPR_FUNCTION
2225       && rvalue->symtree->n.sym->attr.pointer)
2226     gfc_warning ("POINTER valued function appears on right-hand side of "
2227                  "assignment at %L", &rvalue->where);
2228
2229   /* Check size of array assignments.  */
2230   if (lvalue->rank != 0 && rvalue->rank != 0
2231       && gfc_check_conformance ("Array assignment", lvalue, rvalue) != SUCCESS)
2232     return FAILURE;
2233
2234   if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2235     return SUCCESS;
2236
2237   if (!conform)
2238     {
2239       /* Numeric can be converted to any other numeric. And Hollerith can be
2240          converted to any other type.  */
2241       if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2242           || rvalue->ts.type == BT_HOLLERITH)
2243         return SUCCESS;
2244
2245       if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2246         return SUCCESS;
2247
2248       gfc_error ("Incompatible types in assignment at %L, %s to %s",
2249                  &rvalue->where, gfc_typename (&rvalue->ts),
2250                  gfc_typename (&lvalue->ts));
2251
2252       return FAILURE;
2253     }
2254
2255   return gfc_convert_type (rvalue, &lvalue->ts, 1);
2256 }
2257
2258
2259 /* Check that a pointer assignment is OK.  We first check lvalue, and
2260    we only check rvalue if it's not an assignment to NULL() or a
2261    NULLIFY statement.  */
2262
2263 try
2264 gfc_check_pointer_assign (gfc_expr * lvalue, gfc_expr * rvalue)
2265 {
2266   symbol_attribute attr;
2267   int is_pure;
2268
2269   if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN)
2270     {
2271       gfc_error ("Pointer assignment target is not a POINTER at %L",
2272                  &lvalue->where);
2273       return FAILURE;
2274     }
2275
2276   if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
2277         && lvalue->symtree->n.sym->attr.use_assoc)
2278     {
2279       gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2280                  "l-value since it is a procedure",
2281                  lvalue->symtree->n.sym->name, &lvalue->where);
2282       return FAILURE;
2283     }
2284
2285   attr = gfc_variable_attr (lvalue, NULL);
2286   if (!attr.pointer)
2287     {
2288       gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2289       return FAILURE;
2290     }
2291
2292   is_pure = gfc_pure (NULL);
2293
2294   if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym))
2295     {
2296       gfc_error ("Bad pointer object in PURE procedure at %L",
2297                  &lvalue->where);
2298       return FAILURE;
2299     }
2300
2301   /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2302      kind, etc for lvalue and rvalue must match, and rvalue must be a
2303      pure variable if we're in a pure function.  */
2304   if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
2305     return SUCCESS;
2306
2307   if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
2308     {
2309       gfc_error ("Different types in pointer assignment at %L",
2310                  &lvalue->where);
2311       return FAILURE;
2312     }
2313
2314   if (lvalue->ts.kind != rvalue->ts.kind)
2315     {
2316       gfc_error ("Different kind type parameters in pointer "
2317                  "assignment at %L", &lvalue->where);
2318       return FAILURE;
2319     }
2320
2321   if (lvalue->rank != rvalue->rank)
2322     {
2323       gfc_error ("Different ranks in pointer assignment at %L",
2324                   &lvalue->where);
2325       return FAILURE;
2326     }
2327
2328   /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
2329   if (rvalue->expr_type == EXPR_NULL)
2330     return SUCCESS;
2331
2332   if (lvalue->ts.type == BT_CHARACTER
2333         && lvalue->ts.cl->length && rvalue->ts.cl->length
2334         && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
2335                                       rvalue->ts.cl->length)) == 1)
2336     {
2337       gfc_error ("Different character lengths in pointer "
2338                  "assignment at %L", &lvalue->where);
2339       return FAILURE;
2340     }
2341
2342   attr = gfc_expr_attr (rvalue);
2343   if (!attr.target && !attr.pointer)
2344     {
2345       gfc_error ("Pointer assignment target is neither TARGET "
2346                  "nor POINTER at %L", &rvalue->where);
2347       return FAILURE;
2348     }
2349
2350   if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
2351     {
2352       gfc_error ("Bad target in pointer assignment in PURE "
2353                  "procedure at %L", &rvalue->where);
2354     }
2355
2356   if (gfc_has_vector_index (rvalue))
2357     {
2358       gfc_error ("Pointer assignment with vector subscript "
2359                  "on rhs at %L", &rvalue->where);
2360       return FAILURE;
2361     }
2362
2363   return SUCCESS;
2364 }
2365
2366
2367 /* Relative of gfc_check_assign() except that the lvalue is a single
2368    symbol.  Used for initialization assignments.  */
2369
2370 try
2371 gfc_check_assign_symbol (gfc_symbol * sym, gfc_expr * rvalue)
2372 {
2373   gfc_expr lvalue;
2374   try r;
2375
2376   memset (&lvalue, '\0', sizeof (gfc_expr));
2377
2378   lvalue.expr_type = EXPR_VARIABLE;
2379   lvalue.ts = sym->ts;
2380   if (sym->as)
2381     lvalue.rank = sym->as->rank;
2382   lvalue.symtree = (gfc_symtree *)gfc_getmem (sizeof (gfc_symtree));
2383   lvalue.symtree->n.sym = sym;
2384   lvalue.where = sym->declared_at;
2385
2386   if (sym->attr.pointer)
2387     r = gfc_check_pointer_assign (&lvalue, rvalue);
2388   else
2389     r = gfc_check_assign (&lvalue, rvalue, 1);
2390
2391   gfc_free (lvalue.symtree);
2392
2393   return r;
2394 }
2395
2396
2397 /* Get an expression for a default initializer.  */
2398
2399 gfc_expr *
2400 gfc_default_initializer (gfc_typespec *ts)
2401 {
2402   gfc_constructor *tail;
2403   gfc_expr *init;
2404   gfc_component *c;
2405
2406   init = NULL;
2407
2408   /* See if we have a default initializer.  */
2409   for (c = ts->derived->components; c; c = c->next)
2410     {
2411       if ((c->initializer || c->allocatable) && init == NULL)
2412         init = gfc_get_expr ();
2413     }
2414
2415   if (init == NULL)
2416     return NULL;
2417
2418   /* Build the constructor.  */
2419   init->expr_type = EXPR_STRUCTURE;
2420   init->ts = *ts;
2421   init->where = ts->derived->declared_at;
2422   tail = NULL;
2423   for (c = ts->derived->components; c; c = c->next)
2424     {
2425       if (tail == NULL)
2426         init->value.constructor = tail = gfc_get_constructor ();
2427       else
2428         {
2429           tail->next = gfc_get_constructor ();
2430           tail = tail->next;
2431         }
2432
2433       if (c->initializer)
2434         tail->expr = gfc_copy_expr (c->initializer);
2435
2436       if (c->allocatable)
2437         {
2438           tail->expr = gfc_get_expr ();
2439           tail->expr->expr_type = EXPR_NULL;
2440           tail->expr->ts = c->ts;
2441         }
2442     }
2443   return init;
2444 }
2445
2446
2447 /* Given a symbol, create an expression node with that symbol as a
2448    variable. If the symbol is array valued, setup a reference of the
2449    whole array.  */
2450
2451 gfc_expr *
2452 gfc_get_variable_expr (gfc_symtree * var)
2453 {
2454   gfc_expr *e;
2455
2456   e = gfc_get_expr ();
2457   e->expr_type = EXPR_VARIABLE;
2458   e->symtree = var;
2459   e->ts = var->n.sym->ts;
2460
2461   if (var->n.sym->as != NULL)
2462     {
2463       e->rank = var->n.sym->as->rank;
2464       e->ref = gfc_get_ref ();
2465       e->ref->type = REF_ARRAY;
2466       e->ref->u.ar.type = AR_FULL;
2467     }
2468
2469   return e;
2470 }
2471
2472
2473 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
2474
2475 void
2476 gfc_expr_set_symbols_referenced (gfc_expr * expr)
2477 {
2478   gfc_actual_arglist *arg;
2479   gfc_constructor *c;
2480   gfc_ref *ref;
2481   int i;
2482
2483   if (!expr) return;
2484
2485   switch (expr->expr_type)
2486     {
2487     case EXPR_OP:
2488       gfc_expr_set_symbols_referenced (expr->value.op.op1);
2489       gfc_expr_set_symbols_referenced (expr->value.op.op2);
2490       break;
2491
2492     case EXPR_FUNCTION:
2493       for (arg = expr->value.function.actual; arg; arg = arg->next)
2494         gfc_expr_set_symbols_referenced (arg->expr);
2495       break;
2496
2497     case EXPR_VARIABLE:
2498       gfc_set_sym_referenced (expr->symtree->n.sym);
2499       break;
2500
2501     case EXPR_CONSTANT:
2502     case EXPR_NULL:
2503     case EXPR_SUBSTRING:
2504       break;
2505
2506     case EXPR_STRUCTURE:
2507     case EXPR_ARRAY:
2508       for (c = expr->value.constructor; c; c = c->next)
2509         gfc_expr_set_symbols_referenced (c->expr);
2510       break;
2511
2512     default:
2513       gcc_unreachable ();
2514       break;
2515     }
2516
2517     for (ref = expr->ref; ref; ref = ref->next)
2518       switch (ref->type)
2519         {
2520         case REF_ARRAY:
2521           for (i = 0; i < ref->u.ar.dimen; i++)
2522             {
2523               gfc_expr_set_symbols_referenced (ref->u.ar.start[i]);
2524               gfc_expr_set_symbols_referenced (ref->u.ar.end[i]);
2525               gfc_expr_set_symbols_referenced (ref->u.ar.stride[i]);
2526             }
2527           break;
2528            
2529         case REF_COMPONENT:
2530           break;
2531            
2532         case REF_SUBSTRING:
2533           gfc_expr_set_symbols_referenced (ref->u.ss.start);
2534           gfc_expr_set_symbols_referenced (ref->u.ss.end);
2535           break;
2536            
2537         default:
2538           gcc_unreachable ();
2539           break;
2540         }
2541 }