OSDN Git Service

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