OSDN Git Service

PR fortran/29702
[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   int shape_i;
1017   long unsigned one = 1;
1018   bool incr_ctr;
1019   mpz_t start[GFC_MAX_DIMENSIONS];
1020   mpz_t end[GFC_MAX_DIMENSIONS];
1021   mpz_t stride[GFC_MAX_DIMENSIONS];
1022   mpz_t delta[GFC_MAX_DIMENSIONS];
1023   mpz_t ctr[GFC_MAX_DIMENSIONS];
1024   mpz_t delta_mpz;
1025   mpz_t tmp_mpz;
1026   mpz_t nelts;
1027   mpz_t ptr;
1028   mpz_t index;
1029   gfc_constructor *cons;
1030   gfc_constructor *base;
1031   gfc_expr *begin;
1032   gfc_expr *finish;
1033   gfc_expr *step;
1034   gfc_expr *upper;
1035   gfc_expr *lower;
1036   gfc_constructor *vecsub[GFC_MAX_DIMENSIONS], *c;
1037   try t;
1038
1039   t = SUCCESS;
1040
1041   base = expr->value.constructor;
1042   expr->value.constructor = NULL;
1043
1044   rank = ref->u.ar.as->rank;
1045
1046   if (expr->shape == NULL)
1047     expr->shape = gfc_get_shape (rank);
1048
1049   mpz_init_set_ui (delta_mpz, one);
1050   mpz_init_set_ui (nelts, one);
1051   mpz_init (tmp_mpz);
1052
1053   /* Do the initialization now, so that we can cleanup without
1054      keeping track of where we were.  */
1055   for (d = 0; d < rank; d++)
1056     {
1057       mpz_init (delta[d]);
1058       mpz_init (start[d]);
1059       mpz_init (end[d]);
1060       mpz_init (ctr[d]);
1061       mpz_init (stride[d]);
1062       vecsub[d] = NULL;
1063     }
1064
1065   /* Build the counters to clock through the array reference.  */
1066   shape_i = 0;
1067   for (d = 0; d < rank; d++)
1068     {
1069       /* Make this stretch of code easier on the eye!  */
1070       begin = ref->u.ar.start[d];
1071       finish = ref->u.ar.end[d];
1072       step = ref->u.ar.stride[d];
1073       lower = ref->u.ar.as->lower[d];
1074       upper = ref->u.ar.as->upper[d];
1075
1076       if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR)  /* Vector subscript.  */
1077         {
1078           gcc_assert(begin);
1079           gcc_assert(begin->expr_type == EXPR_ARRAY); 
1080           gcc_assert(begin->rank == 1);
1081           gcc_assert(begin->shape);
1082
1083           vecsub[d] = begin->value.constructor;
1084           mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1085           mpz_mul (nelts, nelts, begin->shape[0]);
1086           mpz_set (expr->shape[shape_i++], begin->shape[0]);
1087
1088           /* Check bounds.  */
1089           for (c = vecsub[d]; c; c = c->next)
1090             {
1091               if (mpz_cmp (c->expr->value.integer, upper->value.integer) > 0
1092                   || mpz_cmp (c->expr->value.integer, lower->value.integer) < 0)
1093                 {
1094                   gfc_error ("index in dimension %d is out of bounds "
1095                              "at %L", d + 1, &ref->u.ar.c_where[d]);
1096                   t = FAILURE;
1097                   goto cleanup;
1098                 }
1099             }
1100         }
1101       else
1102         {
1103           if ((begin && begin->expr_type != EXPR_CONSTANT)
1104                 || (finish && finish->expr_type != EXPR_CONSTANT)
1105                 || (step && step->expr_type != EXPR_CONSTANT))
1106             {
1107               t = FAILURE;
1108               goto cleanup;
1109             }
1110
1111           /* Obtain the stride.  */
1112           if (step)
1113             mpz_set (stride[d], step->value.integer);
1114           else
1115             mpz_set_ui (stride[d], one);
1116
1117           if (mpz_cmp_ui (stride[d], 0) == 0)
1118             mpz_set_ui (stride[d], one);
1119
1120           /* Obtain the start value for the index.  */
1121           if (begin)
1122             mpz_set (start[d], begin->value.integer);
1123           else
1124             mpz_set (start[d], lower->value.integer);
1125
1126           mpz_set (ctr[d], start[d]);
1127
1128           /* Obtain the end value for the index.  */
1129           if (finish)
1130             mpz_set (end[d], finish->value.integer);
1131           else
1132             mpz_set (end[d], upper->value.integer);
1133
1134           /* Separate 'if' because elements sometimes arrive with
1135              non-null end.  */
1136           if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1137             mpz_set (end [d], begin->value.integer);
1138
1139           /* Check the bounds.  */
1140           if (mpz_cmp (ctr[d], upper->value.integer) > 0
1141               || mpz_cmp (end[d], upper->value.integer) > 0
1142               || mpz_cmp (ctr[d], lower->value.integer) < 0
1143               || mpz_cmp (end[d], lower->value.integer) < 0)
1144             {
1145               gfc_error ("index in dimension %d is out of bounds "
1146                          "at %L", d + 1, &ref->u.ar.c_where[d]);
1147               t = FAILURE;
1148               goto cleanup;
1149             }
1150
1151           /* Calculate the number of elements and the shape.  */
1152           mpz_abs (tmp_mpz, stride[d]);
1153           mpz_div (tmp_mpz, stride[d], tmp_mpz);
1154           mpz_add (tmp_mpz, end[d], tmp_mpz);
1155           mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1156           mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1157           mpz_mul (nelts, nelts, tmp_mpz);
1158
1159           /* An element reference reduces the rank of the expression; don't add
1160              anything to the shape array.  */
1161           if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT) 
1162             mpz_set (expr->shape[shape_i++], tmp_mpz);
1163         }
1164
1165       /* Calculate the 'stride' (=delta) for conversion of the
1166          counter values into the index along the constructor.  */
1167       mpz_set (delta[d], delta_mpz);
1168       mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1169       mpz_add_ui (tmp_mpz, tmp_mpz, one);
1170       mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1171     }
1172
1173   mpz_init (index);
1174   mpz_init (ptr);
1175   cons = base;
1176
1177   /* Now clock through the array reference, calculating the index in
1178      the source constructor and transferring the elements to the new
1179      constructor.  */  
1180   for (idx = 0; idx < (int)mpz_get_si (nelts); idx++)
1181     {
1182       if (ref->u.ar.offset)
1183         mpz_set (ptr, ref->u.ar.offset->value.integer);
1184       else
1185         mpz_init_set_ui (ptr, 0);
1186
1187       incr_ctr = true;
1188       for (d = 0; d < rank; d++)
1189         {
1190           mpz_set (tmp_mpz, ctr[d]);
1191           mpz_sub_ui (tmp_mpz, tmp_mpz, one);
1192           mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1193           mpz_add (ptr, ptr, tmp_mpz);
1194
1195           if (!incr_ctr) continue;
1196
1197           if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR)  /* Vector subscript.  */
1198             {
1199               gcc_assert(vecsub[d]);
1200
1201               if (!vecsub[d]->next)
1202                 vecsub[d] = ref->u.ar.start[d]->value.constructor;
1203               else
1204                 {
1205                   vecsub[d] = vecsub[d]->next;
1206                   incr_ctr = false;
1207                 }
1208               mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1209             }
1210           else
1211             {
1212               mpz_add (ctr[d], ctr[d], stride[d]); 
1213
1214               if (mpz_cmp_ui (stride[d], 0) > 0 ?
1215                     mpz_cmp (ctr[d], end[d]) > 0 :
1216                     mpz_cmp (ctr[d], end[d]) < 0)
1217                 mpz_set (ctr[d], start[d]);
1218               else
1219                 incr_ctr = false;
1220             }
1221         }
1222
1223       /* There must be a better way of dealing with negative strides
1224          than resetting the index and the constructor pointer!  */ 
1225       if (mpz_cmp (ptr, index) < 0)
1226         {
1227           mpz_set_ui (index, 0);
1228           cons = base;
1229         }
1230
1231       while (mpz_cmp (ptr, index) > 0)
1232         {
1233           mpz_add_ui (index, index, one);
1234           cons = cons->next;
1235         }
1236
1237       gfc_append_constructor (expr, gfc_copy_expr (cons->expr));
1238     }
1239
1240   mpz_clear (ptr);
1241   mpz_clear (index);
1242
1243 cleanup:
1244
1245   mpz_clear (delta_mpz);
1246   mpz_clear (tmp_mpz);
1247   mpz_clear (nelts);
1248   for (d = 0; d < rank; d++)
1249     {
1250       mpz_clear (delta[d]);
1251       mpz_clear (start[d]);
1252       mpz_clear (end[d]);
1253       mpz_clear (ctr[d]);
1254       mpz_clear (stride[d]);
1255     }
1256   gfc_free_constructor (base);
1257   return t;
1258 }
1259
1260 /* Pull a substring out of an expression.  */
1261
1262 static try
1263 find_substring_ref (gfc_expr *p, gfc_expr **newp)
1264 {
1265   int end;
1266   int start;
1267   char *chr;
1268
1269   if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1270         || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1271     return FAILURE;
1272
1273   *newp = gfc_copy_expr (p);
1274   chr = p->value.character.string;
1275   end = (int)mpz_get_ui (p->ref->u.ss.end->value.integer);
1276   start = (int)mpz_get_ui (p->ref->u.ss.start->value.integer);
1277
1278   (*newp)->value.character.length = end - start + 1;
1279   strncpy ((*newp)->value.character.string, &chr[start - 1],
1280            (*newp)->value.character.length);
1281   return SUCCESS;
1282 }
1283
1284
1285
1286 /* Simplify a subobject reference of a constructor.  This occurs when
1287    parameter variable values are substituted.  */
1288
1289 static try
1290 simplify_const_ref (gfc_expr * p)
1291 {
1292   gfc_constructor *cons;
1293   gfc_expr *newp;
1294
1295   while (p->ref)
1296     {
1297       switch (p->ref->type)
1298         {
1299         case REF_ARRAY:
1300           switch (p->ref->u.ar.type)
1301             {
1302             case AR_ELEMENT:
1303               if (find_array_element (p->value.constructor,
1304                                       &p->ref->u.ar,
1305                                       &cons) == FAILURE)
1306                 return FAILURE;
1307
1308               if (!cons)
1309                 return SUCCESS;
1310
1311               remove_subobject_ref (p, cons);
1312               break;
1313
1314             case AR_SECTION:
1315               if (find_array_section (p, p->ref) == FAILURE)
1316                 return FAILURE;
1317               p->ref->u.ar.type = AR_FULL;
1318
1319             /* FALLTHROUGH  */
1320
1321             case AR_FULL:
1322               if (p->ref->next != NULL
1323                     && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
1324                 {
1325                   cons = p->value.constructor;
1326                   for (; cons; cons = cons->next)
1327                     {
1328                       cons->expr->ref = copy_ref (p->ref->next);
1329                       simplify_const_ref (cons->expr);
1330                     }
1331                 }
1332               gfc_free_ref_list (p->ref);
1333               p->ref = NULL;
1334               break;
1335
1336             default:
1337               return SUCCESS;
1338             }
1339
1340           break;
1341
1342         case REF_COMPONENT:
1343           cons = find_component_ref (p->value.constructor, p->ref);
1344           remove_subobject_ref (p, cons);
1345           break;
1346
1347         case REF_SUBSTRING:
1348           if (find_substring_ref (p, &newp) == FAILURE)
1349             return FAILURE;
1350
1351           gfc_replace_expr (p, newp);
1352           gfc_free_ref_list (p->ref);
1353           p->ref = NULL;
1354           break;
1355         }
1356     }
1357
1358   return SUCCESS;
1359 }
1360
1361
1362 /* Simplify a chain of references.  */
1363
1364 static try
1365 simplify_ref_chain (gfc_ref * ref, int type)
1366 {
1367   int n;
1368
1369   for (; ref; ref = ref->next)
1370     {
1371       switch (ref->type)
1372         {
1373         case REF_ARRAY:
1374           for (n = 0; n < ref->u.ar.dimen; n++)
1375             {
1376               if (gfc_simplify_expr (ref->u.ar.start[n], type)
1377                     == FAILURE)
1378                 return FAILURE;
1379               if (gfc_simplify_expr (ref->u.ar.end[n], type)
1380                      == FAILURE)
1381                 return FAILURE;
1382               if (gfc_simplify_expr (ref->u.ar.stride[n], type)
1383                      == FAILURE)
1384                 return FAILURE;
1385
1386             }
1387           break;
1388
1389         case REF_SUBSTRING:
1390           if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1391             return FAILURE;
1392           if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1393             return FAILURE;
1394           break;
1395
1396         default:
1397           break;
1398         }
1399     }
1400   return SUCCESS;
1401 }
1402
1403
1404 /* Try to substitute the value of a parameter variable.  */
1405 static try
1406 simplify_parameter_variable (gfc_expr * p, int type)
1407 {
1408   gfc_expr *e;
1409   try t;
1410
1411   e = gfc_copy_expr (p->symtree->n.sym->value);
1412   if (e == NULL)
1413     return FAILURE;
1414
1415   e->rank = p->rank;
1416
1417   /* Do not copy subobject refs for constant.  */
1418   if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1419     e->ref = copy_ref (p->ref);
1420   t = gfc_simplify_expr (e, type);
1421
1422   /* Only use the simplification if it eliminated all subobject
1423      references.  */
1424   if (t == SUCCESS && ! e->ref)
1425     gfc_replace_expr (p, e);
1426   else
1427     gfc_free_expr (e);
1428
1429   return t;
1430 }
1431
1432 /* Given an expression, simplify it by collapsing constant
1433    expressions.  Most simplification takes place when the expression
1434    tree is being constructed.  If an intrinsic function is simplified
1435    at some point, we get called again to collapse the result against
1436    other constants.
1437
1438    We work by recursively simplifying expression nodes, simplifying
1439    intrinsic functions where possible, which can lead to further
1440    constant collapsing.  If an operator has constant operand(s), we
1441    rip the expression apart, and rebuild it, hoping that it becomes
1442    something simpler.
1443
1444    The expression type is defined for:
1445      0   Basic expression parsing
1446      1   Simplifying array constructors -- will substitute
1447          iterator values.
1448    Returns FAILURE on error, SUCCESS otherwise.
1449    NOTE: Will return SUCCESS even if the expression can not be simplified.  */
1450
1451 try
1452 gfc_simplify_expr (gfc_expr * p, int type)
1453 {
1454   gfc_actual_arglist *ap;
1455
1456   if (p == NULL)
1457     return SUCCESS;
1458
1459   switch (p->expr_type)
1460     {
1461     case EXPR_CONSTANT:
1462     case EXPR_NULL:
1463       break;
1464
1465     case EXPR_FUNCTION:
1466       for (ap = p->value.function.actual; ap; ap = ap->next)
1467         if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1468           return FAILURE;
1469
1470       if (p->value.function.isym != NULL
1471           && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1472         return FAILURE;
1473
1474       break;
1475
1476     case EXPR_SUBSTRING:
1477       if (simplify_ref_chain (p->ref, type) == FAILURE)
1478         return FAILURE;
1479
1480       if (gfc_is_constant_expr (p))
1481         {
1482           char *s;
1483           int start, end;
1484
1485           gfc_extract_int (p->ref->u.ss.start, &start);
1486           start--;  /* Convert from one-based to zero-based.  */
1487           gfc_extract_int (p->ref->u.ss.end, &end);
1488           s = gfc_getmem (end - start + 2);
1489           memcpy (s, p->value.character.string + start, end - start);
1490           s[end-start+1] = '\0';  /* TODO: C-style string for debugging.  */
1491           gfc_free (p->value.character.string);
1492           p->value.character.string = s;
1493           p->value.character.length = end - start;
1494           p->ts.cl = gfc_get_charlen ();
1495           p->ts.cl->next = gfc_current_ns->cl_list;
1496           gfc_current_ns->cl_list = p->ts.cl;
1497           p->ts.cl->length = gfc_int_expr (p->value.character.length);
1498           gfc_free_ref_list (p->ref);
1499           p->ref = NULL;
1500           p->expr_type = EXPR_CONSTANT;
1501         }
1502       break;
1503
1504     case EXPR_OP:
1505       if (simplify_intrinsic_op (p, type) == FAILURE)
1506         return FAILURE;
1507       break;
1508
1509     case EXPR_VARIABLE:
1510       /* Only substitute array parameter variables if we are in an
1511          initialization expression, or we want a subsection.  */
1512       if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1513           && (gfc_init_expr || p->ref
1514               || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1515         {
1516           if (simplify_parameter_variable (p, type) == FAILURE)
1517             return FAILURE;
1518           break;
1519         }
1520
1521       if (type == 1)
1522         {
1523           gfc_simplify_iterator_var (p);
1524         }
1525
1526       /* Simplify subcomponent references.  */
1527       if (simplify_ref_chain (p->ref, type) == FAILURE)
1528         return FAILURE;
1529
1530       break;
1531
1532     case EXPR_STRUCTURE:
1533     case EXPR_ARRAY:
1534       if (simplify_ref_chain (p->ref, type) == FAILURE)
1535         return FAILURE;
1536
1537       if (simplify_constructor (p->value.constructor, type) == FAILURE)
1538         return FAILURE;
1539
1540       if (p->expr_type == EXPR_ARRAY
1541             && p->ref && p->ref->type == REF_ARRAY
1542             && p->ref->u.ar.type == AR_FULL)
1543           gfc_expand_constructor (p);
1544
1545       if (simplify_const_ref (p) == FAILURE)
1546         return FAILURE;
1547
1548       break;
1549     }
1550
1551   return SUCCESS;
1552 }
1553
1554
1555 /* Returns the type of an expression with the exception that iterator
1556    variables are automatically integers no matter what else they may
1557    be declared as.  */
1558
1559 static bt
1560 et0 (gfc_expr * e)
1561 {
1562
1563   if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1564     return BT_INTEGER;
1565
1566   return e->ts.type;
1567 }
1568
1569
1570 /* Check an intrinsic arithmetic operation to see if it is consistent
1571    with some type of expression.  */
1572
1573 static try check_init_expr (gfc_expr *);
1574
1575 static try
1576 check_intrinsic_op (gfc_expr * e, try (*check_function) (gfc_expr *))
1577 {
1578   gfc_expr *op1 = e->value.op.op1;
1579   gfc_expr *op2 = e->value.op.op2;
1580
1581   if ((*check_function) (op1) == FAILURE)
1582     return FAILURE;
1583
1584   switch (e->value.op.operator)
1585     {
1586     case INTRINSIC_UPLUS:
1587     case INTRINSIC_UMINUS:
1588       if (!numeric_type (et0 (op1)))
1589         goto not_numeric;
1590       break;
1591
1592     case INTRINSIC_EQ:
1593     case INTRINSIC_NE:
1594     case INTRINSIC_GT:
1595     case INTRINSIC_GE:
1596     case INTRINSIC_LT:
1597     case INTRINSIC_LE:
1598       if ((*check_function) (op2) == FAILURE)
1599         return FAILURE;
1600       
1601       if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1602           && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
1603         {
1604           gfc_error ("Numeric or CHARACTER operands are required in "
1605                      "expression at %L", &e->where);
1606          return FAILURE;
1607         }
1608       break;
1609
1610     case INTRINSIC_PLUS:
1611     case INTRINSIC_MINUS:
1612     case INTRINSIC_TIMES:
1613     case INTRINSIC_DIVIDE:
1614     case INTRINSIC_POWER:
1615       if ((*check_function) (op2) == FAILURE)
1616         return FAILURE;
1617
1618       if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
1619         goto not_numeric;
1620
1621       if (e->value.op.operator == INTRINSIC_POWER
1622           && check_function == check_init_expr && et0 (op2) != BT_INTEGER)
1623         {
1624           gfc_error ("Exponent at %L must be INTEGER for an initialization "
1625                      "expression", &op2->where);
1626           return FAILURE;
1627         }
1628
1629       break;
1630
1631     case INTRINSIC_CONCAT:
1632       if ((*check_function) (op2) == FAILURE)
1633         return FAILURE;
1634
1635       if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
1636         {
1637           gfc_error ("Concatenation operator in expression at %L "
1638                      "must have two CHARACTER operands", &op1->where);
1639           return FAILURE;
1640         }
1641
1642       if (op1->ts.kind != op2->ts.kind)
1643         {
1644           gfc_error ("Concat operator at %L must concatenate strings of the "
1645                      "same kind", &e->where);
1646           return FAILURE;
1647         }
1648
1649       break;
1650
1651     case INTRINSIC_NOT:
1652       if (et0 (op1) != BT_LOGICAL)
1653         {
1654           gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
1655                      "operand", &op1->where);
1656           return FAILURE;
1657         }
1658
1659       break;
1660
1661     case INTRINSIC_AND:
1662     case INTRINSIC_OR:
1663     case INTRINSIC_EQV:
1664     case INTRINSIC_NEQV:
1665       if ((*check_function) (op2) == FAILURE)
1666         return FAILURE;
1667
1668       if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
1669         {
1670           gfc_error ("LOGICAL operands are required in expression at %L",
1671                      &e->where);
1672           return FAILURE;
1673         }
1674
1675       break;
1676
1677     case INTRINSIC_PARENTHESES:
1678       break;
1679
1680     default:
1681       gfc_error ("Only intrinsic operators can be used in expression at %L",
1682                  &e->where);
1683       return FAILURE;
1684     }
1685
1686   return SUCCESS;
1687
1688 not_numeric:
1689   gfc_error ("Numeric operands are required in expression at %L", &e->where);
1690
1691   return FAILURE;
1692 }
1693
1694
1695
1696 /* Certain inquiry functions are specifically allowed to have variable
1697    arguments, which is an exception to the normal requirement that an
1698    initialization function have initialization arguments.  We head off
1699    this problem here.  */
1700
1701 static try
1702 check_inquiry (gfc_expr * e, int not_restricted)
1703 {
1704   const char *name;
1705
1706   /* FIXME: This should be moved into the intrinsic definitions,
1707      to eliminate this ugly hack.  */
1708   static const char * const inquiry_function[] = {
1709     "digits", "epsilon", "huge", "kind", "len", "maxexponent", "minexponent",
1710     "precision", "radix", "range", "tiny", "bit_size", "size", "shape",
1711     "lbound", "ubound", NULL
1712   };
1713
1714   int i;
1715
1716   /* An undeclared parameter will get us here (PR25018).  */
1717   if (e->symtree == NULL)
1718     return FAILURE;
1719
1720   name = e->symtree->n.sym->name;
1721
1722   for (i = 0; inquiry_function[i]; i++)
1723     if (strcmp (inquiry_function[i], name) == 0)
1724       break;
1725
1726   if (inquiry_function[i] == NULL)
1727     return FAILURE;
1728
1729   e = e->value.function.actual->expr;
1730
1731   if (e == NULL || e->expr_type != EXPR_VARIABLE)
1732     return FAILURE;
1733
1734   /* At this point we have an inquiry function with a variable argument.  The
1735      type of the variable might be undefined, but we need it now, because the
1736      arguments of these functions are allowed to be undefined.  */
1737
1738   if (e->ts.type == BT_UNKNOWN)
1739     {
1740       if (e->symtree->n.sym->ts.type == BT_UNKNOWN
1741           && gfc_set_default_type (e->symtree->n.sym, 0, gfc_current_ns)
1742             == FAILURE)
1743         return FAILURE;
1744
1745       e->ts = e->symtree->n.sym->ts;
1746     }
1747
1748   /* Assumed character length will not reduce to a constant expression
1749      with LEN, as required by the standard.  */
1750   if (i == 4 && not_restricted
1751         && e->symtree->n.sym->ts.type == BT_CHARACTER
1752         && e->symtree->n.sym->ts.cl->length == NULL)
1753     gfc_notify_std (GFC_STD_GNU, "assumed character length "
1754                     "variable '%s' in constant expression at %L",
1755                     e->symtree->n.sym->name, &e->where);
1756
1757   return SUCCESS;
1758 }
1759
1760
1761 /* Verify that an expression is an initialization expression.  A side
1762    effect is that the expression tree is reduced to a single constant
1763    node if all goes well.  This would normally happen when the
1764    expression is constructed but function references are assumed to be
1765    intrinsics in the context of initialization expressions.  If
1766    FAILURE is returned an error message has been generated.  */
1767
1768 static try
1769 check_init_expr (gfc_expr * e)
1770 {
1771   gfc_actual_arglist *ap;
1772   match m;
1773   try t;
1774
1775   if (e == NULL)
1776     return SUCCESS;
1777
1778   switch (e->expr_type)
1779     {
1780     case EXPR_OP:
1781       t = check_intrinsic_op (e, check_init_expr);
1782       if (t == SUCCESS)
1783         t = gfc_simplify_expr (e, 0);
1784
1785       break;
1786
1787     case EXPR_FUNCTION:
1788       t = SUCCESS;
1789
1790       if (check_inquiry (e, 1) != SUCCESS)
1791         {
1792           t = SUCCESS;
1793           for (ap = e->value.function.actual; ap; ap = ap->next)
1794             if (check_init_expr (ap->expr) == FAILURE)
1795               {
1796                 t = FAILURE;
1797                 break;
1798               }
1799         }
1800
1801       if (t == SUCCESS)
1802         {
1803           m = gfc_intrinsic_func_interface (e, 0);
1804
1805           if (m == MATCH_NO)
1806             gfc_error ("Function '%s' in initialization expression at %L "
1807                        "must be an intrinsic function",
1808                        e->symtree->n.sym->name, &e->where);
1809
1810           if (m != MATCH_YES)
1811             t = FAILURE;
1812         }
1813
1814       break;
1815
1816     case EXPR_VARIABLE:
1817       t = SUCCESS;
1818
1819       if (gfc_check_iter_variable (e) == SUCCESS)
1820         break;
1821
1822       if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
1823         {
1824           t = simplify_parameter_variable (e, 0);
1825           break;
1826         }
1827
1828       gfc_error ("Parameter '%s' at %L has not been declared or is "
1829                  "a variable, which does not reduce to a constant "
1830                  "expression", e->symtree->n.sym->name, &e->where);
1831       t = FAILURE;
1832       break;
1833
1834     case EXPR_CONSTANT:
1835     case EXPR_NULL:
1836       t = SUCCESS;
1837       break;
1838
1839     case EXPR_SUBSTRING:
1840       t = check_init_expr (e->ref->u.ss.start);
1841       if (t == FAILURE)
1842         break;
1843
1844       t = check_init_expr (e->ref->u.ss.end);
1845       if (t == SUCCESS)
1846         t = gfc_simplify_expr (e, 0);
1847
1848       break;
1849
1850     case EXPR_STRUCTURE:
1851       t = gfc_check_constructor (e, check_init_expr);
1852       break;
1853
1854     case EXPR_ARRAY:
1855       t = gfc_check_constructor (e, check_init_expr);
1856       if (t == FAILURE)
1857         break;
1858
1859       t = gfc_expand_constructor (e);
1860       if (t == FAILURE)
1861         break;
1862
1863       t = gfc_check_constructor_type (e);
1864       break;
1865
1866     default:
1867       gfc_internal_error ("check_init_expr(): Unknown expression type");
1868     }
1869
1870   return t;
1871 }
1872
1873
1874 /* Match an initialization expression.  We work by first matching an
1875    expression, then reducing it to a constant.  */
1876
1877 match
1878 gfc_match_init_expr (gfc_expr ** result)
1879 {
1880   gfc_expr *expr;
1881   match m;
1882   try t;
1883
1884   m = gfc_match_expr (&expr);
1885   if (m != MATCH_YES)
1886     return m;
1887
1888   gfc_init_expr = 1;
1889   t = gfc_resolve_expr (expr);
1890   if (t == SUCCESS)
1891     t = check_init_expr (expr);
1892   gfc_init_expr = 0;
1893
1894   if (t == FAILURE)
1895     {
1896       gfc_free_expr (expr);
1897       return MATCH_ERROR;
1898     }
1899
1900   if (expr->expr_type == EXPR_ARRAY
1901       && (gfc_check_constructor_type (expr) == FAILURE
1902           || gfc_expand_constructor (expr) == FAILURE))
1903     {
1904       gfc_free_expr (expr);
1905       return MATCH_ERROR;
1906     }
1907
1908   /* Not all inquiry functions are simplified to constant expressions
1909      so it is necessary to call check_inquiry again.  */ 
1910   if (!gfc_is_constant_expr (expr)
1911         && check_inquiry (expr, 1) == FAILURE)
1912     {
1913       gfc_error ("Initialization expression didn't reduce %C");
1914       return MATCH_ERROR;
1915     }
1916
1917   *result = expr;
1918
1919   return MATCH_YES;
1920 }
1921
1922
1923
1924 static try check_restricted (gfc_expr *);
1925
1926 /* Given an actual argument list, test to see that each argument is a
1927    restricted expression and optionally if the expression type is
1928    integer or character.  */
1929
1930 static try
1931 restricted_args (gfc_actual_arglist * a)
1932 {
1933   for (; a; a = a->next)
1934     {
1935       if (check_restricted (a->expr) == FAILURE)
1936         return FAILURE;
1937     }
1938
1939   return SUCCESS;
1940 }
1941
1942
1943 /************* Restricted/specification expressions *************/
1944
1945
1946 /* Make sure a non-intrinsic function is a specification function.  */
1947
1948 static try
1949 external_spec_function (gfc_expr * e)
1950 {
1951   gfc_symbol *f;
1952
1953   f = e->value.function.esym;
1954
1955   if (f->attr.proc == PROC_ST_FUNCTION)
1956     {
1957       gfc_error ("Specification function '%s' at %L cannot be a statement "
1958                  "function", f->name, &e->where);
1959       return FAILURE;
1960     }
1961
1962   if (f->attr.proc == PROC_INTERNAL)
1963     {
1964       gfc_error ("Specification function '%s' at %L cannot be an internal "
1965                  "function", f->name, &e->where);
1966       return FAILURE;
1967     }
1968
1969   if (!f->attr.pure && !f->attr.elemental)
1970     {
1971       gfc_error ("Specification function '%s' at %L must be PURE", f->name,
1972                  &e->where);
1973       return FAILURE;
1974     }
1975
1976   if (f->attr.recursive)
1977     {
1978       gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
1979                  f->name, &e->where);
1980       return FAILURE;
1981     }
1982
1983   return restricted_args (e->value.function.actual);
1984 }
1985
1986
1987 /* Check to see that a function reference to an intrinsic is a
1988    restricted expression.  */
1989
1990 static try
1991 restricted_intrinsic (gfc_expr * e)
1992 {
1993   /* TODO: Check constraints on inquiry functions.  7.1.6.2 (7).  */
1994   if (check_inquiry (e, 0) == SUCCESS)
1995     return SUCCESS;
1996
1997   return restricted_args (e->value.function.actual);
1998 }
1999
2000
2001 /* Verify that an expression is a restricted expression.  Like its
2002    cousin check_init_expr(), an error message is generated if we
2003    return FAILURE.  */
2004
2005 static try
2006 check_restricted (gfc_expr * e)
2007 {
2008   gfc_symbol *sym;
2009   try t;
2010
2011   if (e == NULL)
2012     return SUCCESS;
2013
2014   switch (e->expr_type)
2015     {
2016     case EXPR_OP:
2017       t = check_intrinsic_op (e, check_restricted);
2018       if (t == SUCCESS)
2019         t = gfc_simplify_expr (e, 0);
2020
2021       break;
2022
2023     case EXPR_FUNCTION:
2024       t = e->value.function.esym ?
2025         external_spec_function (e) : restricted_intrinsic (e);
2026
2027       break;
2028
2029     case EXPR_VARIABLE:
2030       sym = e->symtree->n.sym;
2031       t = FAILURE;
2032
2033       if (sym->attr.optional)
2034         {
2035           gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2036                      sym->name, &e->where);
2037           break;
2038         }
2039
2040       if (sym->attr.intent == INTENT_OUT)
2041         {
2042           gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2043                      sym->name, &e->where);
2044           break;
2045         }
2046
2047       /* gfc_is_formal_arg broadcasts that a formal argument list is being processed
2048          in resolve.c(resolve_formal_arglist).  This is done so that host associated
2049          dummy array indices are accepted (PR23446).  */
2050       if (sym->attr.in_common
2051           || sym->attr.use_assoc
2052           || sym->attr.dummy
2053           || sym->ns != gfc_current_ns
2054           || (sym->ns->proc_name != NULL
2055               && sym->ns->proc_name->attr.flavor == FL_MODULE)
2056           || gfc_is_formal_arg ())
2057         {
2058           t = SUCCESS;
2059           break;
2060         }
2061
2062       gfc_error ("Variable '%s' cannot appear in the expression at %L",
2063                  sym->name, &e->where);
2064
2065       break;
2066
2067     case EXPR_NULL:
2068     case EXPR_CONSTANT:
2069       t = SUCCESS;
2070       break;
2071
2072     case EXPR_SUBSTRING:
2073       t = gfc_specification_expr (e->ref->u.ss.start);
2074       if (t == FAILURE)
2075         break;
2076
2077       t = gfc_specification_expr (e->ref->u.ss.end);
2078       if (t == SUCCESS)
2079         t = gfc_simplify_expr (e, 0);
2080
2081       break;
2082
2083     case EXPR_STRUCTURE:
2084       t = gfc_check_constructor (e, check_restricted);
2085       break;
2086
2087     case EXPR_ARRAY:
2088       t = gfc_check_constructor (e, check_restricted);
2089       break;
2090
2091     default:
2092       gfc_internal_error ("check_restricted(): Unknown expression type");
2093     }
2094
2095   return t;
2096 }
2097
2098
2099 /* Check to see that an expression is a specification expression.  If
2100    we return FAILURE, an error has been generated.  */
2101
2102 try
2103 gfc_specification_expr (gfc_expr * e)
2104 {
2105   if (e == NULL)
2106     return SUCCESS;
2107
2108   if (e->ts.type != BT_INTEGER)
2109     {
2110       gfc_error ("Expression at %L must be of INTEGER type", &e->where);
2111       return FAILURE;
2112     }
2113
2114   if (e->rank != 0)
2115     {
2116       gfc_error ("Expression at %L must be scalar", &e->where);
2117       return FAILURE;
2118     }
2119
2120   if (gfc_simplify_expr (e, 0) == FAILURE)
2121     return FAILURE;
2122
2123   return check_restricted (e);
2124 }
2125
2126
2127 /************** Expression conformance checks.  *************/
2128
2129 /* Given two expressions, make sure that the arrays are conformable.  */
2130
2131 try
2132 gfc_check_conformance (const char *optype_msgid,
2133                        gfc_expr * op1, gfc_expr * op2)
2134 {
2135   int op1_flag, op2_flag, d;
2136   mpz_t op1_size, op2_size;
2137   try t;
2138
2139   if (op1->rank == 0 || op2->rank == 0)
2140     return SUCCESS;
2141
2142   if (op1->rank != op2->rank)
2143     {
2144       gfc_error ("Incompatible ranks in %s at %L", _(optype_msgid),
2145                  &op1->where);
2146       return FAILURE;
2147     }
2148
2149   t = SUCCESS;
2150
2151   for (d = 0; d < op1->rank; d++)
2152     {
2153       op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2154       op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2155
2156       if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2157         {
2158           gfc_error ("different shape for %s at %L on dimension %d (%d/%d)",
2159                      _(optype_msgid), &op1->where, d + 1,
2160                      (int) mpz_get_si (op1_size),
2161                      (int) mpz_get_si (op2_size));
2162
2163           t = FAILURE;
2164         }
2165
2166       if (op1_flag)
2167         mpz_clear (op1_size);
2168       if (op2_flag)
2169         mpz_clear (op2_size);
2170
2171       if (t == FAILURE)
2172         return FAILURE;
2173     }
2174
2175   return SUCCESS;
2176 }
2177
2178
2179 /* Given an assignable expression and an arbitrary expression, make
2180    sure that the assignment can take place.  */
2181
2182 try
2183 gfc_check_assign (gfc_expr * lvalue, gfc_expr * rvalue, int conform)
2184 {
2185   gfc_symbol *sym;
2186
2187   sym = lvalue->symtree->n.sym;
2188
2189   if (sym->attr.intent == INTENT_IN)
2190     {
2191       gfc_error ("Can't assign to INTENT(IN) variable '%s' at %L",
2192                  sym->name, &lvalue->where);
2193       return FAILURE;
2194     }
2195
2196 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2197    variable local to a function subprogram.  Its existence begins when
2198    execution of the function is initiated and ends when execution of the
2199    function is terminated.....
2200    Therefore, the left hand side is no longer a varaiable, when it is:*/
2201   if (sym->attr.flavor == FL_PROCEDURE
2202         && sym->attr.proc != PROC_ST_FUNCTION
2203         && !sym->attr.external)
2204     {
2205       bool bad_proc;
2206       bad_proc = false;
2207
2208       /* (i) Use associated; */
2209       if (sym->attr.use_assoc)
2210         bad_proc = true;
2211
2212       /* (ii) The assignment is in the main program; or  */
2213       if (gfc_current_ns->proc_name->attr.is_main_program)
2214         bad_proc = true;
2215
2216       /* (iii) A module or internal procedure....  */
2217       if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2218              || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2219           && gfc_current_ns->parent
2220           && (!(gfc_current_ns->parent->proc_name->attr.function
2221                   || gfc_current_ns->parent->proc_name->attr.subroutine)
2222               || gfc_current_ns->parent->proc_name->attr.is_main_program))
2223         {
2224           /* .... that is not a function.... */ 
2225           if (!gfc_current_ns->proc_name->attr.function)
2226             bad_proc = true;
2227
2228           /* .... or is not an entry and has a different name.  */
2229           if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2230             bad_proc = true;
2231         }
2232
2233       if (bad_proc)
2234         {
2235           gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2236           return FAILURE;
2237         }
2238     }
2239
2240   if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2241     {
2242       gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2243                  lvalue->rank, rvalue->rank, &lvalue->where);
2244       return FAILURE;
2245     }
2246
2247   if (lvalue->ts.type == BT_UNKNOWN)
2248     {
2249       gfc_error ("Variable type is UNKNOWN in assignment at %L",
2250                  &lvalue->where);
2251       return FAILURE;
2252     }
2253
2254    if (rvalue->expr_type == EXPR_NULL)
2255      {
2256        gfc_error ("NULL appears on right-hand side in assignment at %L",
2257                   &rvalue->where);
2258        return FAILURE;
2259      }
2260
2261    if (sym->attr.cray_pointee
2262        && lvalue->ref != NULL
2263        && lvalue->ref->u.ar.type == AR_FULL
2264        && lvalue->ref->u.ar.as->cp_was_assumed)
2265      {
2266        gfc_error ("Vector assignment to assumed-size Cray Pointee at %L"
2267                   " is illegal.", &lvalue->where);
2268        return FAILURE;
2269      }
2270
2271   /* This is possibly a typo: x = f() instead of x => f()  */
2272   if (gfc_option.warn_surprising 
2273       && rvalue->expr_type == EXPR_FUNCTION
2274       && rvalue->symtree->n.sym->attr.pointer)
2275     gfc_warning ("POINTER valued function appears on right-hand side of "
2276                  "assignment at %L", &rvalue->where);
2277
2278   /* Check size of array assignments.  */
2279   if (lvalue->rank != 0 && rvalue->rank != 0
2280       && gfc_check_conformance ("Array assignment", lvalue, rvalue) != SUCCESS)
2281     return FAILURE;
2282
2283   if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2284     return SUCCESS;
2285
2286   if (!conform)
2287     {
2288       /* Numeric can be converted to any other numeric. And Hollerith can be
2289          converted to any other type.  */
2290       if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2291           || rvalue->ts.type == BT_HOLLERITH)
2292         return SUCCESS;
2293
2294       if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2295         return SUCCESS;
2296
2297       gfc_error ("Incompatible types in assignment at %L, %s to %s",
2298                  &rvalue->where, gfc_typename (&rvalue->ts),
2299                  gfc_typename (&lvalue->ts));
2300
2301       return FAILURE;
2302     }
2303
2304   return gfc_convert_type (rvalue, &lvalue->ts, 1);
2305 }
2306
2307
2308 /* Check that a pointer assignment is OK.  We first check lvalue, and
2309    we only check rvalue if it's not an assignment to NULL() or a
2310    NULLIFY statement.  */
2311
2312 try
2313 gfc_check_pointer_assign (gfc_expr * lvalue, gfc_expr * rvalue)
2314 {
2315   symbol_attribute attr;
2316   int is_pure;
2317
2318   if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN)
2319     {
2320       gfc_error ("Pointer assignment target is not a POINTER at %L",
2321                  &lvalue->where);
2322       return FAILURE;
2323     }
2324
2325   if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
2326         && lvalue->symtree->n.sym->attr.use_assoc)
2327     {
2328       gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2329                  "l-value since it is a procedure",
2330                  lvalue->symtree->n.sym->name, &lvalue->where);
2331       return FAILURE;
2332     }
2333
2334   attr = gfc_variable_attr (lvalue, NULL);
2335   if (!attr.pointer)
2336     {
2337       gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2338       return FAILURE;
2339     }
2340
2341   is_pure = gfc_pure (NULL);
2342
2343   if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym))
2344     {
2345       gfc_error ("Bad pointer object in PURE procedure at %L",
2346                  &lvalue->where);
2347       return FAILURE;
2348     }
2349
2350   /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2351      kind, etc for lvalue and rvalue must match, and rvalue must be a
2352      pure variable if we're in a pure function.  */
2353   if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
2354     return SUCCESS;
2355
2356   if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
2357     {
2358       gfc_error ("Different types in pointer assignment at %L",
2359                  &lvalue->where);
2360       return FAILURE;
2361     }
2362
2363   if (lvalue->ts.kind != rvalue->ts.kind)
2364     {
2365       gfc_error ("Different kind type parameters in pointer "
2366                  "assignment at %L", &lvalue->where);
2367       return FAILURE;
2368     }
2369
2370   if (lvalue->rank != rvalue->rank)
2371     {
2372       gfc_error ("Different ranks in pointer assignment at %L",
2373                   &lvalue->where);
2374       return FAILURE;
2375     }
2376
2377   /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
2378   if (rvalue->expr_type == EXPR_NULL)
2379     return SUCCESS;
2380
2381   if (lvalue->ts.type == BT_CHARACTER
2382         && lvalue->ts.cl->length && rvalue->ts.cl->length
2383         && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
2384                                       rvalue->ts.cl->length)) == 1)
2385     {
2386       gfc_error ("Different character lengths in pointer "
2387                  "assignment at %L", &lvalue->where);
2388       return FAILURE;
2389     }
2390
2391   attr = gfc_expr_attr (rvalue);
2392   if (!attr.target && !attr.pointer)
2393     {
2394       gfc_error ("Pointer assignment target is neither TARGET "
2395                  "nor POINTER at %L", &rvalue->where);
2396       return FAILURE;
2397     }
2398
2399   if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
2400     {
2401       gfc_error ("Bad target in pointer assignment in PURE "
2402                  "procedure at %L", &rvalue->where);
2403     }
2404
2405   if (gfc_has_vector_index (rvalue))
2406     {
2407       gfc_error ("Pointer assignment with vector subscript "
2408                  "on rhs at %L", &rvalue->where);
2409       return FAILURE;
2410     }
2411
2412   return SUCCESS;
2413 }
2414
2415
2416 /* Relative of gfc_check_assign() except that the lvalue is a single
2417    symbol.  Used for initialization assignments.  */
2418
2419 try
2420 gfc_check_assign_symbol (gfc_symbol * sym, gfc_expr * rvalue)
2421 {
2422   gfc_expr lvalue;
2423   try r;
2424
2425   memset (&lvalue, '\0', sizeof (gfc_expr));
2426
2427   lvalue.expr_type = EXPR_VARIABLE;
2428   lvalue.ts = sym->ts;
2429   if (sym->as)
2430     lvalue.rank = sym->as->rank;
2431   lvalue.symtree = (gfc_symtree *)gfc_getmem (sizeof (gfc_symtree));
2432   lvalue.symtree->n.sym = sym;
2433   lvalue.where = sym->declared_at;
2434
2435   if (sym->attr.pointer)
2436     r = gfc_check_pointer_assign (&lvalue, rvalue);
2437   else
2438     r = gfc_check_assign (&lvalue, rvalue, 1);
2439
2440   gfc_free (lvalue.symtree);
2441
2442   return r;
2443 }
2444
2445
2446 /* Get an expression for a default initializer.  */
2447
2448 gfc_expr *
2449 gfc_default_initializer (gfc_typespec *ts)
2450 {
2451   gfc_constructor *tail;
2452   gfc_expr *init;
2453   gfc_component *c;
2454
2455   init = NULL;
2456
2457   /* See if we have a default initializer.  */
2458   for (c = ts->derived->components; c; c = c->next)
2459     {
2460       if ((c->initializer || c->allocatable) && init == NULL)
2461         init = gfc_get_expr ();
2462     }
2463
2464   if (init == NULL)
2465     return NULL;
2466
2467   /* Build the constructor.  */
2468   init->expr_type = EXPR_STRUCTURE;
2469   init->ts = *ts;
2470   init->where = ts->derived->declared_at;
2471   tail = NULL;
2472   for (c = ts->derived->components; c; c = c->next)
2473     {
2474       if (tail == NULL)
2475         init->value.constructor = tail = gfc_get_constructor ();
2476       else
2477         {
2478           tail->next = gfc_get_constructor ();
2479           tail = tail->next;
2480         }
2481
2482       if (c->initializer)
2483         tail->expr = gfc_copy_expr (c->initializer);
2484
2485       if (c->allocatable)
2486         {
2487           tail->expr = gfc_get_expr ();
2488           tail->expr->expr_type = EXPR_NULL;
2489           tail->expr->ts = c->ts;
2490         }
2491     }
2492   return init;
2493 }
2494
2495
2496 /* Given a symbol, create an expression node with that symbol as a
2497    variable. If the symbol is array valued, setup a reference of the
2498    whole array.  */
2499
2500 gfc_expr *
2501 gfc_get_variable_expr (gfc_symtree * var)
2502 {
2503   gfc_expr *e;
2504
2505   e = gfc_get_expr ();
2506   e->expr_type = EXPR_VARIABLE;
2507   e->symtree = var;
2508   e->ts = var->n.sym->ts;
2509
2510   if (var->n.sym->as != NULL)
2511     {
2512       e->rank = var->n.sym->as->rank;
2513       e->ref = gfc_get_ref ();
2514       e->ref->type = REF_ARRAY;
2515       e->ref->u.ar.type = AR_FULL;
2516     }
2517
2518   return e;
2519 }
2520
2521
2522 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
2523
2524 void
2525 gfc_expr_set_symbols_referenced (gfc_expr * expr)
2526 {
2527   gfc_actual_arglist *arg;
2528   gfc_constructor *c;
2529   gfc_ref *ref;
2530   int i;
2531
2532   if (!expr) return;
2533
2534   switch (expr->expr_type)
2535     {
2536     case EXPR_OP:
2537       gfc_expr_set_symbols_referenced (expr->value.op.op1);
2538       gfc_expr_set_symbols_referenced (expr->value.op.op2);
2539       break;
2540
2541     case EXPR_FUNCTION:
2542       for (arg = expr->value.function.actual; arg; arg = arg->next)
2543         gfc_expr_set_symbols_referenced (arg->expr);
2544       break;
2545
2546     case EXPR_VARIABLE:
2547       gfc_set_sym_referenced (expr->symtree->n.sym);
2548       break;
2549
2550     case EXPR_CONSTANT:
2551     case EXPR_NULL:
2552     case EXPR_SUBSTRING:
2553       break;
2554
2555     case EXPR_STRUCTURE:
2556     case EXPR_ARRAY:
2557       for (c = expr->value.constructor; c; c = c->next)
2558         gfc_expr_set_symbols_referenced (c->expr);
2559       break;
2560
2561     default:
2562       gcc_unreachable ();
2563       break;
2564     }
2565
2566     for (ref = expr->ref; ref; ref = ref->next)
2567       switch (ref->type)
2568         {
2569         case REF_ARRAY:
2570           for (i = 0; i < ref->u.ar.dimen; i++)
2571             {
2572               gfc_expr_set_symbols_referenced (ref->u.ar.start[i]);
2573               gfc_expr_set_symbols_referenced (ref->u.ar.end[i]);
2574               gfc_expr_set_symbols_referenced (ref->u.ar.stride[i]);
2575             }
2576           break;
2577            
2578         case REF_COMPONENT:
2579           break;
2580            
2581         case REF_SUBSTRING:
2582           gfc_expr_set_symbols_referenced (ref->u.ss.start);
2583           gfc_expr_set_symbols_referenced (ref->u.ss.end);
2584           break;
2585            
2586         default:
2587           gcc_unreachable ();
2588           break;
2589         }
2590 }