OSDN Git Service

2bf980cfa2590c474bbde355fd7daf7e14432c7d
[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   /* Do not copy subobject refs for constant.  */
1367   if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1368     e->ref = copy_ref (p->ref);
1369   t = gfc_simplify_expr (e, type);
1370
1371   /* Only use the simplification if it eliminated all subobject
1372      references.  */
1373   if (t == SUCCESS && ! e->ref)
1374     gfc_replace_expr (p, e);
1375   else
1376     gfc_free_expr (e);
1377
1378   return t;
1379 }
1380
1381 /* Given an expression, simplify it by collapsing constant
1382    expressions.  Most simplification takes place when the expression
1383    tree is being constructed.  If an intrinsic function is simplified
1384    at some point, we get called again to collapse the result against
1385    other constants.
1386
1387    We work by recursively simplifying expression nodes, simplifying
1388    intrinsic functions where possible, which can lead to further
1389    constant collapsing.  If an operator has constant operand(s), we
1390    rip the expression apart, and rebuild it, hoping that it becomes
1391    something simpler.
1392
1393    The expression type is defined for:
1394      0   Basic expression parsing
1395      1   Simplifying array constructors -- will substitute
1396          iterator values.
1397    Returns FAILURE on error, SUCCESS otherwise.
1398    NOTE: Will return SUCCESS even if the expression can not be simplified.  */
1399
1400 try
1401 gfc_simplify_expr (gfc_expr * p, int type)
1402 {
1403   gfc_actual_arglist *ap;
1404
1405   if (p == NULL)
1406     return SUCCESS;
1407
1408   switch (p->expr_type)
1409     {
1410     case EXPR_CONSTANT:
1411     case EXPR_NULL:
1412       break;
1413
1414     case EXPR_FUNCTION:
1415       for (ap = p->value.function.actual; ap; ap = ap->next)
1416         if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1417           return FAILURE;
1418
1419       if (p->value.function.isym != NULL
1420           && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1421         return FAILURE;
1422
1423       break;
1424
1425     case EXPR_SUBSTRING:
1426       if (simplify_ref_chain (p->ref, type) == FAILURE)
1427         return FAILURE;
1428
1429       if (gfc_is_constant_expr (p))
1430         {
1431           char *s;
1432           int start, end;
1433
1434           gfc_extract_int (p->ref->u.ss.start, &start);
1435           start--;  /* Convert from one-based to zero-based.  */
1436           gfc_extract_int (p->ref->u.ss.end, &end);
1437           s = gfc_getmem (end - start + 1);
1438           memcpy (s, p->value.character.string + start, end - start);
1439           s[end] = '\0';  /* TODO: C-style string for debugging.  */
1440           gfc_free (p->value.character.string);
1441           p->value.character.string = s;
1442           p->value.character.length = end - start;
1443           p->ts.cl = gfc_get_charlen ();
1444           p->ts.cl->next = gfc_current_ns->cl_list;
1445           gfc_current_ns->cl_list = p->ts.cl;
1446           p->ts.cl->length = gfc_int_expr (p->value.character.length);
1447           gfc_free_ref_list (p->ref);
1448           p->ref = NULL;
1449           p->expr_type = EXPR_CONSTANT;
1450         }
1451       break;
1452
1453     case EXPR_OP:
1454       if (simplify_intrinsic_op (p, type) == FAILURE)
1455         return FAILURE;
1456       break;
1457
1458     case EXPR_VARIABLE:
1459       /* Only substitute array parameter variables if we are in an
1460          initialization expression, or we want a subsection.  */
1461       if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1462           && (gfc_init_expr || p->ref
1463               || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1464         {
1465           if (simplify_parameter_variable (p, type) == FAILURE)
1466             return FAILURE;
1467           break;
1468         }
1469
1470       if (type == 1)
1471         {
1472           gfc_simplify_iterator_var (p);
1473         }
1474
1475       /* Simplify subcomponent references.  */
1476       if (simplify_ref_chain (p->ref, type) == FAILURE)
1477         return FAILURE;
1478
1479       break;
1480
1481     case EXPR_STRUCTURE:
1482     case EXPR_ARRAY:
1483       if (simplify_ref_chain (p->ref, type) == FAILURE)
1484         return FAILURE;
1485
1486       if (simplify_constructor (p->value.constructor, type) == FAILURE)
1487         return FAILURE;
1488
1489       if (p->expr_type == EXPR_ARRAY
1490             && p->ref && p->ref->type == REF_ARRAY
1491             && p->ref->u.ar.type == AR_FULL)
1492           gfc_expand_constructor (p);
1493
1494       if (simplify_const_ref (p) == FAILURE)
1495         return FAILURE;
1496
1497       break;
1498     }
1499
1500   return SUCCESS;
1501 }
1502
1503
1504 /* Returns the type of an expression with the exception that iterator
1505    variables are automatically integers no matter what else they may
1506    be declared as.  */
1507
1508 static bt
1509 et0 (gfc_expr * e)
1510 {
1511
1512   if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1513     return BT_INTEGER;
1514
1515   return e->ts.type;
1516 }
1517
1518
1519 /* Check an intrinsic arithmetic operation to see if it is consistent
1520    with some type of expression.  */
1521
1522 static try check_init_expr (gfc_expr *);
1523
1524 static try
1525 check_intrinsic_op (gfc_expr * e, try (*check_function) (gfc_expr *))
1526 {
1527   gfc_expr *op1 = e->value.op.op1;
1528   gfc_expr *op2 = e->value.op.op2;
1529
1530   if ((*check_function) (op1) == FAILURE)
1531     return FAILURE;
1532
1533   switch (e->value.op.operator)
1534     {
1535     case INTRINSIC_UPLUS:
1536     case INTRINSIC_UMINUS:
1537       if (!numeric_type (et0 (op1)))
1538         goto not_numeric;
1539       break;
1540
1541     case INTRINSIC_EQ:
1542     case INTRINSIC_NE:
1543     case INTRINSIC_GT:
1544     case INTRINSIC_GE:
1545     case INTRINSIC_LT:
1546     case INTRINSIC_LE:
1547       if ((*check_function) (op2) == FAILURE)
1548         return FAILURE;
1549       
1550       if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1551           && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
1552         {
1553           gfc_error ("Numeric or CHARACTER operands are required in "
1554                      "expression at %L", &e->where);
1555          return FAILURE;
1556         }
1557       break;
1558
1559     case INTRINSIC_PLUS:
1560     case INTRINSIC_MINUS:
1561     case INTRINSIC_TIMES:
1562     case INTRINSIC_DIVIDE:
1563     case INTRINSIC_POWER:
1564       if ((*check_function) (op2) == FAILURE)
1565         return FAILURE;
1566
1567       if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
1568         goto not_numeric;
1569
1570       if (e->value.op.operator == INTRINSIC_POWER
1571           && check_function == check_init_expr && et0 (op2) != BT_INTEGER)
1572         {
1573           gfc_error ("Exponent at %L must be INTEGER for an initialization "
1574                      "expression", &op2->where);
1575           return FAILURE;
1576         }
1577
1578       break;
1579
1580     case INTRINSIC_CONCAT:
1581       if ((*check_function) (op2) == FAILURE)
1582         return FAILURE;
1583
1584       if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
1585         {
1586           gfc_error ("Concatenation operator in expression at %L "
1587                      "must have two CHARACTER operands", &op1->where);
1588           return FAILURE;
1589         }
1590
1591       if (op1->ts.kind != op2->ts.kind)
1592         {
1593           gfc_error ("Concat operator at %L must concatenate strings of the "
1594                      "same kind", &e->where);
1595           return FAILURE;
1596         }
1597
1598       break;
1599
1600     case INTRINSIC_NOT:
1601       if (et0 (op1) != BT_LOGICAL)
1602         {
1603           gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
1604                      "operand", &op1->where);
1605           return FAILURE;
1606         }
1607
1608       break;
1609
1610     case INTRINSIC_AND:
1611     case INTRINSIC_OR:
1612     case INTRINSIC_EQV:
1613     case INTRINSIC_NEQV:
1614       if ((*check_function) (op2) == FAILURE)
1615         return FAILURE;
1616
1617       if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
1618         {
1619           gfc_error ("LOGICAL operands are required in expression at %L",
1620                      &e->where);
1621           return FAILURE;
1622         }
1623
1624       break;
1625
1626     case INTRINSIC_PARENTHESES:
1627       break;
1628
1629     default:
1630       gfc_error ("Only intrinsic operators can be used in expression at %L",
1631                  &e->where);
1632       return FAILURE;
1633     }
1634
1635   return SUCCESS;
1636
1637 not_numeric:
1638   gfc_error ("Numeric operands are required in expression at %L", &e->where);
1639
1640   return FAILURE;
1641 }
1642
1643
1644
1645 /* Certain inquiry functions are specifically allowed to have variable
1646    arguments, which is an exception to the normal requirement that an
1647    initialization function have initialization arguments.  We head off
1648    this problem here.  */
1649
1650 static try
1651 check_inquiry (gfc_expr * e, int not_restricted)
1652 {
1653   const char *name;
1654
1655   /* FIXME: This should be moved into the intrinsic definitions,
1656      to eliminate this ugly hack.  */
1657   static const char * const inquiry_function[] = {
1658     "digits", "epsilon", "huge", "kind", "len", "maxexponent", "minexponent",
1659     "precision", "radix", "range", "tiny", "bit_size", "size", "shape",
1660     "lbound", "ubound", NULL
1661   };
1662
1663   int i;
1664
1665   /* An undeclared parameter will get us here (PR25018).  */
1666   if (e->symtree == NULL)
1667     return FAILURE;
1668
1669   name = e->symtree->n.sym->name;
1670
1671   for (i = 0; inquiry_function[i]; i++)
1672     if (strcmp (inquiry_function[i], name) == 0)
1673       break;
1674
1675   if (inquiry_function[i] == NULL)
1676     return FAILURE;
1677
1678   e = e->value.function.actual->expr;
1679
1680   if (e == NULL || e->expr_type != EXPR_VARIABLE)
1681     return FAILURE;
1682
1683   /* At this point we have an inquiry function with a variable argument.  The
1684      type of the variable might be undefined, but we need it now, because the
1685      arguments of these functions are allowed to be undefined.  */
1686
1687   if (e->ts.type == BT_UNKNOWN)
1688     {
1689       if (e->symtree->n.sym->ts.type == BT_UNKNOWN
1690           && gfc_set_default_type (e->symtree->n.sym, 0, gfc_current_ns)
1691             == FAILURE)
1692         return FAILURE;
1693
1694       e->ts = e->symtree->n.sym->ts;
1695     }
1696
1697   /* Assumed character length will not reduce to a constant expression
1698      with LEN, as required by the standard.  */
1699   if (i == 4 && not_restricted
1700         && e->symtree->n.sym->ts.type == BT_CHARACTER
1701         && e->symtree->n.sym->ts.cl->length == NULL)
1702     gfc_notify_std (GFC_STD_GNU, "assumed character length "
1703                     "variable '%s' in constant expression at %L",
1704                     e->symtree->n.sym->name, &e->where);
1705
1706   return SUCCESS;
1707 }
1708
1709
1710 /* Verify that an expression is an initialization expression.  A side
1711    effect is that the expression tree is reduced to a single constant
1712    node if all goes well.  This would normally happen when the
1713    expression is constructed but function references are assumed to be
1714    intrinsics in the context of initialization expressions.  If
1715    FAILURE is returned an error message has been generated.  */
1716
1717 static try
1718 check_init_expr (gfc_expr * e)
1719 {
1720   gfc_actual_arglist *ap;
1721   match m;
1722   try t;
1723
1724   if (e == NULL)
1725     return SUCCESS;
1726
1727   switch (e->expr_type)
1728     {
1729     case EXPR_OP:
1730       t = check_intrinsic_op (e, check_init_expr);
1731       if (t == SUCCESS)
1732         t = gfc_simplify_expr (e, 0);
1733
1734       break;
1735
1736     case EXPR_FUNCTION:
1737       t = SUCCESS;
1738
1739       if (check_inquiry (e, 1) != SUCCESS)
1740         {
1741           t = SUCCESS;
1742           for (ap = e->value.function.actual; ap; ap = ap->next)
1743             if (check_init_expr (ap->expr) == FAILURE)
1744               {
1745                 t = FAILURE;
1746                 break;
1747               }
1748         }
1749
1750       if (t == SUCCESS)
1751         {
1752           m = gfc_intrinsic_func_interface (e, 0);
1753
1754           if (m == MATCH_NO)
1755             gfc_error ("Function '%s' in initialization expression at %L "
1756                        "must be an intrinsic function",
1757                        e->symtree->n.sym->name, &e->where);
1758
1759           if (m != MATCH_YES)
1760             t = FAILURE;
1761         }
1762
1763       break;
1764
1765     case EXPR_VARIABLE:
1766       t = SUCCESS;
1767
1768       if (gfc_check_iter_variable (e) == SUCCESS)
1769         break;
1770
1771       if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
1772         {
1773           t = simplify_parameter_variable (e, 0);
1774           break;
1775         }
1776
1777       gfc_error ("Parameter '%s' at %L has not been declared or is "
1778                  "a variable, which does not reduce to a constant "
1779                  "expression", e->symtree->n.sym->name, &e->where);
1780       t = FAILURE;
1781       break;
1782
1783     case EXPR_CONSTANT:
1784     case EXPR_NULL:
1785       t = SUCCESS;
1786       break;
1787
1788     case EXPR_SUBSTRING:
1789       t = check_init_expr (e->ref->u.ss.start);
1790       if (t == FAILURE)
1791         break;
1792
1793       t = check_init_expr (e->ref->u.ss.end);
1794       if (t == SUCCESS)
1795         t = gfc_simplify_expr (e, 0);
1796
1797       break;
1798
1799     case EXPR_STRUCTURE:
1800       t = gfc_check_constructor (e, check_init_expr);
1801       break;
1802
1803     case EXPR_ARRAY:
1804       t = gfc_check_constructor (e, check_init_expr);
1805       if (t == FAILURE)
1806         break;
1807
1808       t = gfc_expand_constructor (e);
1809       if (t == FAILURE)
1810         break;
1811
1812       t = gfc_check_constructor_type (e);
1813       break;
1814
1815     default:
1816       gfc_internal_error ("check_init_expr(): Unknown expression type");
1817     }
1818
1819   return t;
1820 }
1821
1822
1823 /* Match an initialization expression.  We work by first matching an
1824    expression, then reducing it to a constant.  */
1825
1826 match
1827 gfc_match_init_expr (gfc_expr ** result)
1828 {
1829   gfc_expr *expr;
1830   match m;
1831   try t;
1832
1833   m = gfc_match_expr (&expr);
1834   if (m != MATCH_YES)
1835     return m;
1836
1837   gfc_init_expr = 1;
1838   t = gfc_resolve_expr (expr);
1839   if (t == SUCCESS)
1840     t = check_init_expr (expr);
1841   gfc_init_expr = 0;
1842
1843   if (t == FAILURE)
1844     {
1845       gfc_free_expr (expr);
1846       return MATCH_ERROR;
1847     }
1848
1849   if (expr->expr_type == EXPR_ARRAY
1850       && (gfc_check_constructor_type (expr) == FAILURE
1851           || gfc_expand_constructor (expr) == FAILURE))
1852     {
1853       gfc_free_expr (expr);
1854       return MATCH_ERROR;
1855     }
1856
1857   /* Not all inquiry functions are simplified to constant expressions
1858      so it is necessary to call check_inquiry again.  */ 
1859   if (!gfc_is_constant_expr (expr)
1860         && check_inquiry (expr, 1) == FAILURE)
1861     {
1862       gfc_error ("Initialization expression didn't reduce %C");
1863       return MATCH_ERROR;
1864     }
1865
1866   *result = expr;
1867
1868   return MATCH_YES;
1869 }
1870
1871
1872
1873 static try check_restricted (gfc_expr *);
1874
1875 /* Given an actual argument list, test to see that each argument is a
1876    restricted expression and optionally if the expression type is
1877    integer or character.  */
1878
1879 static try
1880 restricted_args (gfc_actual_arglist * a)
1881 {
1882   for (; a; a = a->next)
1883     {
1884       if (check_restricted (a->expr) == FAILURE)
1885         return FAILURE;
1886     }
1887
1888   return SUCCESS;
1889 }
1890
1891
1892 /************* Restricted/specification expressions *************/
1893
1894
1895 /* Make sure a non-intrinsic function is a specification function.  */
1896
1897 static try
1898 external_spec_function (gfc_expr * e)
1899 {
1900   gfc_symbol *f;
1901
1902   f = e->value.function.esym;
1903
1904   if (f->attr.proc == PROC_ST_FUNCTION)
1905     {
1906       gfc_error ("Specification function '%s' at %L cannot be a statement "
1907                  "function", f->name, &e->where);
1908       return FAILURE;
1909     }
1910
1911   if (f->attr.proc == PROC_INTERNAL)
1912     {
1913       gfc_error ("Specification function '%s' at %L cannot be an internal "
1914                  "function", f->name, &e->where);
1915       return FAILURE;
1916     }
1917
1918   if (!f->attr.pure && !f->attr.elemental)
1919     {
1920       gfc_error ("Specification function '%s' at %L must be PURE", f->name,
1921                  &e->where);
1922       return FAILURE;
1923     }
1924
1925   if (f->attr.recursive)
1926     {
1927       gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
1928                  f->name, &e->where);
1929       return FAILURE;
1930     }
1931
1932   return restricted_args (e->value.function.actual);
1933 }
1934
1935
1936 /* Check to see that a function reference to an intrinsic is a
1937    restricted expression.  */
1938
1939 static try
1940 restricted_intrinsic (gfc_expr * e)
1941 {
1942   /* TODO: Check constraints on inquiry functions.  7.1.6.2 (7).  */
1943   if (check_inquiry (e, 0) == SUCCESS)
1944     return SUCCESS;
1945
1946   return restricted_args (e->value.function.actual);
1947 }
1948
1949
1950 /* Verify that an expression is a restricted expression.  Like its
1951    cousin check_init_expr(), an error message is generated if we
1952    return FAILURE.  */
1953
1954 static try
1955 check_restricted (gfc_expr * e)
1956 {
1957   gfc_symbol *sym;
1958   try t;
1959
1960   if (e == NULL)
1961     return SUCCESS;
1962
1963   switch (e->expr_type)
1964     {
1965     case EXPR_OP:
1966       t = check_intrinsic_op (e, check_restricted);
1967       if (t == SUCCESS)
1968         t = gfc_simplify_expr (e, 0);
1969
1970       break;
1971
1972     case EXPR_FUNCTION:
1973       t = e->value.function.esym ?
1974         external_spec_function (e) : restricted_intrinsic (e);
1975
1976       break;
1977
1978     case EXPR_VARIABLE:
1979       sym = e->symtree->n.sym;
1980       t = FAILURE;
1981
1982       if (sym->attr.optional)
1983         {
1984           gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
1985                      sym->name, &e->where);
1986           break;
1987         }
1988
1989       if (sym->attr.intent == INTENT_OUT)
1990         {
1991           gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
1992                      sym->name, &e->where);
1993           break;
1994         }
1995
1996       /* gfc_is_formal_arg broadcasts that a formal argument list is being processed
1997          in resolve.c(resolve_formal_arglist).  This is done so that host associated
1998          dummy array indices are accepted (PR23446).  */
1999       if (sym->attr.in_common
2000           || sym->attr.use_assoc
2001           || sym->attr.dummy
2002           || sym->ns != gfc_current_ns
2003           || (sym->ns->proc_name != NULL
2004               && sym->ns->proc_name->attr.flavor == FL_MODULE)
2005           || gfc_is_formal_arg ())
2006         {
2007           t = SUCCESS;
2008           break;
2009         }
2010
2011       gfc_error ("Variable '%s' cannot appear in the expression at %L",
2012                  sym->name, &e->where);
2013
2014       break;
2015
2016     case EXPR_NULL:
2017     case EXPR_CONSTANT:
2018       t = SUCCESS;
2019       break;
2020
2021     case EXPR_SUBSTRING:
2022       t = gfc_specification_expr (e->ref->u.ss.start);
2023       if (t == FAILURE)
2024         break;
2025
2026       t = gfc_specification_expr (e->ref->u.ss.end);
2027       if (t == SUCCESS)
2028         t = gfc_simplify_expr (e, 0);
2029
2030       break;
2031
2032     case EXPR_STRUCTURE:
2033       t = gfc_check_constructor (e, check_restricted);
2034       break;
2035
2036     case EXPR_ARRAY:
2037       t = gfc_check_constructor (e, check_restricted);
2038       break;
2039
2040     default:
2041       gfc_internal_error ("check_restricted(): Unknown expression type");
2042     }
2043
2044   return t;
2045 }
2046
2047
2048 /* Check to see that an expression is a specification expression.  If
2049    we return FAILURE, an error has been generated.  */
2050
2051 try
2052 gfc_specification_expr (gfc_expr * e)
2053 {
2054   if (e == NULL)
2055     return SUCCESS;
2056
2057   if (e->ts.type != BT_INTEGER)
2058     {
2059       gfc_error ("Expression at %L must be of INTEGER type", &e->where);
2060       return FAILURE;
2061     }
2062
2063   if (e->rank != 0)
2064     {
2065       gfc_error ("Expression at %L must be scalar", &e->where);
2066       return FAILURE;
2067     }
2068
2069   if (gfc_simplify_expr (e, 0) == FAILURE)
2070     return FAILURE;
2071
2072   return check_restricted (e);
2073 }
2074
2075
2076 /************** Expression conformance checks.  *************/
2077
2078 /* Given two expressions, make sure that the arrays are conformable.  */
2079
2080 try
2081 gfc_check_conformance (const char *optype_msgid,
2082                        gfc_expr * op1, gfc_expr * op2)
2083 {
2084   int op1_flag, op2_flag, d;
2085   mpz_t op1_size, op2_size;
2086   try t;
2087
2088   if (op1->rank == 0 || op2->rank == 0)
2089     return SUCCESS;
2090
2091   if (op1->rank != op2->rank)
2092     {
2093       gfc_error ("Incompatible ranks in %s at %L", _(optype_msgid),
2094                  &op1->where);
2095       return FAILURE;
2096     }
2097
2098   t = SUCCESS;
2099
2100   for (d = 0; d < op1->rank; d++)
2101     {
2102       op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2103       op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2104
2105       if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2106         {
2107           gfc_error ("different shape for %s at %L on dimension %d (%d/%d)",
2108                      _(optype_msgid), &op1->where, d + 1,
2109                      (int) mpz_get_si (op1_size),
2110                      (int) mpz_get_si (op2_size));
2111
2112           t = FAILURE;
2113         }
2114
2115       if (op1_flag)
2116         mpz_clear (op1_size);
2117       if (op2_flag)
2118         mpz_clear (op2_size);
2119
2120       if (t == FAILURE)
2121         return FAILURE;
2122     }
2123
2124   return SUCCESS;
2125 }
2126
2127
2128 /* Given an assignable expression and an arbitrary expression, make
2129    sure that the assignment can take place.  */
2130
2131 try
2132 gfc_check_assign (gfc_expr * lvalue, gfc_expr * rvalue, int conform)
2133 {
2134   gfc_symbol *sym;
2135
2136   sym = lvalue->symtree->n.sym;
2137
2138   if (sym->attr.intent == INTENT_IN)
2139     {
2140       gfc_error ("Can't assign to INTENT(IN) variable '%s' at %L",
2141                  sym->name, &lvalue->where);
2142       return FAILURE;
2143     }
2144
2145 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2146    variable local to a function subprogram.  Its existence begins when
2147    execution of the function is initiated and ends when execution of the
2148    function is terminated.....
2149    Therefore, the left hand side is no longer a varaiable, when it is:*/
2150   if (sym->attr.flavor == FL_PROCEDURE
2151         && sym->attr.proc != PROC_ST_FUNCTION
2152         && !sym->attr.external)
2153     {
2154       bool bad_proc;
2155       bad_proc = false;
2156
2157       /* (i) Use associated; */
2158       if (sym->attr.use_assoc)
2159         bad_proc = true;
2160
2161       /* (ii) The assignment is in the main program; or  */
2162       if (gfc_current_ns->proc_name->attr.is_main_program)
2163         bad_proc = true;
2164
2165       /* (iii) A module or internal procedure....  */
2166       if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2167              || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2168           && gfc_current_ns->parent
2169           && (!(gfc_current_ns->parent->proc_name->attr.function
2170                   || gfc_current_ns->parent->proc_name->attr.subroutine)
2171               || gfc_current_ns->parent->proc_name->attr.is_main_program))
2172         {
2173           /* .... that is not a function.... */ 
2174           if (!gfc_current_ns->proc_name->attr.function)
2175             bad_proc = true;
2176
2177           /* .... or is not an entry and has a different name.  */
2178           if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2179             bad_proc = true;
2180         }
2181
2182       if (bad_proc)
2183         {
2184           gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2185           return FAILURE;
2186         }
2187     }
2188
2189   if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2190     {
2191       gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2192                  lvalue->rank, rvalue->rank, &lvalue->where);
2193       return FAILURE;
2194     }
2195
2196   if (lvalue->ts.type == BT_UNKNOWN)
2197     {
2198       gfc_error ("Variable type is UNKNOWN in assignment at %L",
2199                  &lvalue->where);
2200       return FAILURE;
2201     }
2202
2203    if (rvalue->expr_type == EXPR_NULL)
2204      {
2205        gfc_error ("NULL appears on right-hand side in assignment at %L",
2206                   &rvalue->where);
2207        return FAILURE;
2208      }
2209
2210    if (sym->attr.cray_pointee
2211        && lvalue->ref != NULL
2212        && lvalue->ref->u.ar.type == AR_FULL
2213        && lvalue->ref->u.ar.as->cp_was_assumed)
2214      {
2215        gfc_error ("Vector assignment to assumed-size Cray Pointee at %L"
2216                   " is illegal.", &lvalue->where);
2217        return FAILURE;
2218      }
2219
2220   /* This is possibly a typo: x = f() instead of x => f()  */
2221   if (gfc_option.warn_surprising 
2222       && rvalue->expr_type == EXPR_FUNCTION
2223       && rvalue->symtree->n.sym->attr.pointer)
2224     gfc_warning ("POINTER valued function appears on right-hand side of "
2225                  "assignment at %L", &rvalue->where);
2226
2227   /* Check size of array assignments.  */
2228   if (lvalue->rank != 0 && rvalue->rank != 0
2229       && gfc_check_conformance ("Array assignment", lvalue, rvalue) != SUCCESS)
2230     return FAILURE;
2231
2232   if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2233     return SUCCESS;
2234
2235   if (!conform)
2236     {
2237       /* Numeric can be converted to any other numeric. And Hollerith can be
2238          converted to any other type.  */
2239       if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2240           || rvalue->ts.type == BT_HOLLERITH)
2241         return SUCCESS;
2242
2243       if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2244         return SUCCESS;
2245
2246       gfc_error ("Incompatible types in assignment at %L, %s to %s",
2247                  &rvalue->where, gfc_typename (&rvalue->ts),
2248                  gfc_typename (&lvalue->ts));
2249
2250       return FAILURE;
2251     }
2252
2253   return gfc_convert_type (rvalue, &lvalue->ts, 1);
2254 }
2255
2256
2257 /* Check that a pointer assignment is OK.  We first check lvalue, and
2258    we only check rvalue if it's not an assignment to NULL() or a
2259    NULLIFY statement.  */
2260
2261 try
2262 gfc_check_pointer_assign (gfc_expr * lvalue, gfc_expr * rvalue)
2263 {
2264   symbol_attribute attr;
2265   int is_pure;
2266
2267   if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN)
2268     {
2269       gfc_error ("Pointer assignment target is not a POINTER at %L",
2270                  &lvalue->where);
2271       return FAILURE;
2272     }
2273
2274   if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
2275         && lvalue->symtree->n.sym->attr.use_assoc)
2276     {
2277       gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2278                  "l-value since it is a procedure",
2279                  lvalue->symtree->n.sym->name, &lvalue->where);
2280       return FAILURE;
2281     }
2282
2283   attr = gfc_variable_attr (lvalue, NULL);
2284   if (!attr.pointer)
2285     {
2286       gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2287       return FAILURE;
2288     }
2289
2290   is_pure = gfc_pure (NULL);
2291
2292   if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym))
2293     {
2294       gfc_error ("Bad pointer object in PURE procedure at %L",
2295                  &lvalue->where);
2296       return FAILURE;
2297     }
2298
2299   /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2300      kind, etc for lvalue and rvalue must match, and rvalue must be a
2301      pure variable if we're in a pure function.  */
2302   if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
2303     return SUCCESS;
2304
2305   if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
2306     {
2307       gfc_error ("Different types in pointer assignment at %L",
2308                  &lvalue->where);
2309       return FAILURE;
2310     }
2311
2312   if (lvalue->ts.kind != rvalue->ts.kind)
2313     {
2314       gfc_error ("Different kind type parameters in pointer "
2315                  "assignment at %L", &lvalue->where);
2316       return FAILURE;
2317     }
2318
2319   if (lvalue->rank != rvalue->rank)
2320     {
2321       gfc_error ("Different ranks in pointer assignment at %L",
2322                   &lvalue->where);
2323       return FAILURE;
2324     }
2325
2326   /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
2327   if (rvalue->expr_type == EXPR_NULL)
2328     return SUCCESS;
2329
2330   if (lvalue->ts.type == BT_CHARACTER
2331         && lvalue->ts.cl->length && rvalue->ts.cl->length
2332         && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
2333                                       rvalue->ts.cl->length)) == 1)
2334     {
2335       gfc_error ("Different character lengths in pointer "
2336                  "assignment at %L", &lvalue->where);
2337       return FAILURE;
2338     }
2339
2340   attr = gfc_expr_attr (rvalue);
2341   if (!attr.target && !attr.pointer)
2342     {
2343       gfc_error ("Pointer assignment target is neither TARGET "
2344                  "nor POINTER at %L", &rvalue->where);
2345       return FAILURE;
2346     }
2347
2348   if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
2349     {
2350       gfc_error ("Bad target in pointer assignment in PURE "
2351                  "procedure at %L", &rvalue->where);
2352     }
2353
2354   if (gfc_has_vector_index (rvalue))
2355     {
2356       gfc_error ("Pointer assignment with vector subscript "
2357                  "on rhs at %L", &rvalue->where);
2358       return FAILURE;
2359     }
2360
2361   return SUCCESS;
2362 }
2363
2364
2365 /* Relative of gfc_check_assign() except that the lvalue is a single
2366    symbol.  Used for initialization assignments.  */
2367
2368 try
2369 gfc_check_assign_symbol (gfc_symbol * sym, gfc_expr * rvalue)
2370 {
2371   gfc_expr lvalue;
2372   try r;
2373
2374   memset (&lvalue, '\0', sizeof (gfc_expr));
2375
2376   lvalue.expr_type = EXPR_VARIABLE;
2377   lvalue.ts = sym->ts;
2378   if (sym->as)
2379     lvalue.rank = sym->as->rank;
2380   lvalue.symtree = (gfc_symtree *)gfc_getmem (sizeof (gfc_symtree));
2381   lvalue.symtree->n.sym = sym;
2382   lvalue.where = sym->declared_at;
2383
2384   if (sym->attr.pointer)
2385     r = gfc_check_pointer_assign (&lvalue, rvalue);
2386   else
2387     r = gfc_check_assign (&lvalue, rvalue, 1);
2388
2389   gfc_free (lvalue.symtree);
2390
2391   return r;
2392 }
2393
2394
2395 /* Get an expression for a default initializer.  */
2396
2397 gfc_expr *
2398 gfc_default_initializer (gfc_typespec *ts)
2399 {
2400   gfc_constructor *tail;
2401   gfc_expr *init;
2402   gfc_component *c;
2403
2404   init = NULL;
2405
2406   /* See if we have a default initializer.  */
2407   for (c = ts->derived->components; c; c = c->next)
2408     {
2409       if ((c->initializer || c->allocatable) && init == NULL)
2410         init = gfc_get_expr ();
2411     }
2412
2413   if (init == NULL)
2414     return NULL;
2415
2416   /* Build the constructor.  */
2417   init->expr_type = EXPR_STRUCTURE;
2418   init->ts = *ts;
2419   init->where = ts->derived->declared_at;
2420   tail = NULL;
2421   for (c = ts->derived->components; c; c = c->next)
2422     {
2423       if (tail == NULL)
2424         init->value.constructor = tail = gfc_get_constructor ();
2425       else
2426         {
2427           tail->next = gfc_get_constructor ();
2428           tail = tail->next;
2429         }
2430
2431       if (c->initializer)
2432         tail->expr = gfc_copy_expr (c->initializer);
2433
2434       if (c->allocatable)
2435         {
2436           tail->expr = gfc_get_expr ();
2437           tail->expr->expr_type = EXPR_NULL;
2438           tail->expr->ts = c->ts;
2439         }
2440     }
2441   return init;
2442 }
2443
2444
2445 /* Given a symbol, create an expression node with that symbol as a
2446    variable. If the symbol is array valued, setup a reference of the
2447    whole array.  */
2448
2449 gfc_expr *
2450 gfc_get_variable_expr (gfc_symtree * var)
2451 {
2452   gfc_expr *e;
2453
2454   e = gfc_get_expr ();
2455   e->expr_type = EXPR_VARIABLE;
2456   e->symtree = var;
2457   e->ts = var->n.sym->ts;
2458
2459   if (var->n.sym->as != NULL)
2460     {
2461       e->rank = var->n.sym->as->rank;
2462       e->ref = gfc_get_ref ();
2463       e->ref->type = REF_ARRAY;
2464       e->ref->u.ar.type = AR_FULL;
2465     }
2466
2467   return e;
2468 }
2469
2470
2471 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
2472
2473 void
2474 gfc_expr_set_symbols_referenced (gfc_expr * expr)
2475 {
2476   gfc_actual_arglist *arg;
2477   gfc_constructor *c;
2478   gfc_ref *ref;
2479   int i;
2480
2481   if (!expr) return;
2482
2483   switch (expr->expr_type)
2484     {
2485     case EXPR_OP:
2486       gfc_expr_set_symbols_referenced (expr->value.op.op1);
2487       gfc_expr_set_symbols_referenced (expr->value.op.op2);
2488       break;
2489
2490     case EXPR_FUNCTION:
2491       for (arg = expr->value.function.actual; arg; arg = arg->next)
2492         gfc_expr_set_symbols_referenced (arg->expr);
2493       break;
2494
2495     case EXPR_VARIABLE:
2496       gfc_set_sym_referenced (expr->symtree->n.sym);
2497       break;
2498
2499     case EXPR_CONSTANT:
2500     case EXPR_NULL:
2501     case EXPR_SUBSTRING:
2502       break;
2503
2504     case EXPR_STRUCTURE:
2505     case EXPR_ARRAY:
2506       for (c = expr->value.constructor; c; c = c->next)
2507         gfc_expr_set_symbols_referenced (c->expr);
2508       break;
2509
2510     default:
2511       gcc_unreachable ();
2512       break;
2513     }
2514
2515     for (ref = expr->ref; ref; ref = ref->next)
2516       switch (ref->type)
2517         {
2518         case REF_ARRAY:
2519           for (i = 0; i < ref->u.ar.dimen; i++)
2520             {
2521               gfc_expr_set_symbols_referenced (ref->u.ar.start[i]);
2522               gfc_expr_set_symbols_referenced (ref->u.ar.end[i]);
2523               gfc_expr_set_symbols_referenced (ref->u.ar.stride[i]);
2524             }
2525           break;
2526            
2527         case REF_COMPONENT:
2528           break;
2529            
2530         case REF_SUBSTRING:
2531           gfc_expr_set_symbols_referenced (ref->u.ss.start);
2532           gfc_expr_set_symbols_referenced (ref->u.ss.end);
2533           break;
2534            
2535         default:
2536           gcc_unreachable ();
2537           break;
2538         }
2539 }