OSDN Git Service

1146bd117961c938eb676b58e177eebbb973712d
[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       if (gfc_in_match_data ())
1833         break;
1834
1835       gfc_error ("Parameter '%s' at %L has not been declared or is "
1836                  "a variable, which does not reduce to a constant "
1837                  "expression", e->symtree->n.sym->name, &e->where);
1838       t = FAILURE;
1839       break;
1840
1841     case EXPR_CONSTANT:
1842     case EXPR_NULL:
1843       t = SUCCESS;
1844       break;
1845
1846     case EXPR_SUBSTRING:
1847       t = check_init_expr (e->ref->u.ss.start);
1848       if (t == FAILURE)
1849         break;
1850
1851       t = check_init_expr (e->ref->u.ss.end);
1852       if (t == SUCCESS)
1853         t = gfc_simplify_expr (e, 0);
1854
1855       break;
1856
1857     case EXPR_STRUCTURE:
1858       t = gfc_check_constructor (e, check_init_expr);
1859       break;
1860
1861     case EXPR_ARRAY:
1862       t = gfc_check_constructor (e, check_init_expr);
1863       if (t == FAILURE)
1864         break;
1865
1866       t = gfc_expand_constructor (e);
1867       if (t == FAILURE)
1868         break;
1869
1870       t = gfc_check_constructor_type (e);
1871       break;
1872
1873     default:
1874       gfc_internal_error ("check_init_expr(): Unknown expression type");
1875     }
1876
1877   return t;
1878 }
1879
1880
1881 /* Match an initialization expression.  We work by first matching an
1882    expression, then reducing it to a constant.  */
1883
1884 match
1885 gfc_match_init_expr (gfc_expr ** result)
1886 {
1887   gfc_expr *expr;
1888   match m;
1889   try t;
1890
1891   m = gfc_match_expr (&expr);
1892   if (m != MATCH_YES)
1893     return m;
1894
1895   gfc_init_expr = 1;
1896   t = gfc_resolve_expr (expr);
1897   if (t == SUCCESS)
1898     t = check_init_expr (expr);
1899   gfc_init_expr = 0;
1900
1901   if (t == FAILURE)
1902     {
1903       gfc_free_expr (expr);
1904       return MATCH_ERROR;
1905     }
1906
1907   if (expr->expr_type == EXPR_ARRAY
1908       && (gfc_check_constructor_type (expr) == FAILURE
1909           || gfc_expand_constructor (expr) == FAILURE))
1910     {
1911       gfc_free_expr (expr);
1912       return MATCH_ERROR;
1913     }
1914
1915   /* Not all inquiry functions are simplified to constant expressions
1916      so it is necessary to call check_inquiry again.  */ 
1917   if (!gfc_is_constant_expr (expr)
1918         && check_inquiry (expr, 1) == FAILURE
1919         && !gfc_in_match_data ())
1920     {
1921       gfc_error ("Initialization expression didn't reduce %C");
1922       return MATCH_ERROR;
1923     }
1924
1925   *result = expr;
1926
1927   return MATCH_YES;
1928 }
1929
1930
1931
1932 static try check_restricted (gfc_expr *);
1933
1934 /* Given an actual argument list, test to see that each argument is a
1935    restricted expression and optionally if the expression type is
1936    integer or character.  */
1937
1938 static try
1939 restricted_args (gfc_actual_arglist * a)
1940 {
1941   for (; a; a = a->next)
1942     {
1943       if (check_restricted (a->expr) == FAILURE)
1944         return FAILURE;
1945     }
1946
1947   return SUCCESS;
1948 }
1949
1950
1951 /************* Restricted/specification expressions *************/
1952
1953
1954 /* Make sure a non-intrinsic function is a specification function.  */
1955
1956 static try
1957 external_spec_function (gfc_expr * e)
1958 {
1959   gfc_symbol *f;
1960
1961   f = e->value.function.esym;
1962
1963   if (f->attr.proc == PROC_ST_FUNCTION)
1964     {
1965       gfc_error ("Specification function '%s' at %L cannot be a statement "
1966                  "function", f->name, &e->where);
1967       return FAILURE;
1968     }
1969
1970   if (f->attr.proc == PROC_INTERNAL)
1971     {
1972       gfc_error ("Specification function '%s' at %L cannot be an internal "
1973                  "function", f->name, &e->where);
1974       return FAILURE;
1975     }
1976
1977   if (!f->attr.pure && !f->attr.elemental)
1978     {
1979       gfc_error ("Specification function '%s' at %L must be PURE", f->name,
1980                  &e->where);
1981       return FAILURE;
1982     }
1983
1984   if (f->attr.recursive)
1985     {
1986       gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
1987                  f->name, &e->where);
1988       return FAILURE;
1989     }
1990
1991   return restricted_args (e->value.function.actual);
1992 }
1993
1994
1995 /* Check to see that a function reference to an intrinsic is a
1996    restricted expression.  */
1997
1998 static try
1999 restricted_intrinsic (gfc_expr * e)
2000 {
2001   /* TODO: Check constraints on inquiry functions.  7.1.6.2 (7).  */
2002   if (check_inquiry (e, 0) == SUCCESS)
2003     return SUCCESS;
2004
2005   return restricted_args (e->value.function.actual);
2006 }
2007
2008
2009 /* Verify that an expression is a restricted expression.  Like its
2010    cousin check_init_expr(), an error message is generated if we
2011    return FAILURE.  */
2012
2013 static try
2014 check_restricted (gfc_expr * e)
2015 {
2016   gfc_symbol *sym;
2017   try t;
2018
2019   if (e == NULL)
2020     return SUCCESS;
2021
2022   switch (e->expr_type)
2023     {
2024     case EXPR_OP:
2025       t = check_intrinsic_op (e, check_restricted);
2026       if (t == SUCCESS)
2027         t = gfc_simplify_expr (e, 0);
2028
2029       break;
2030
2031     case EXPR_FUNCTION:
2032       t = e->value.function.esym ?
2033         external_spec_function (e) : restricted_intrinsic (e);
2034
2035       break;
2036
2037     case EXPR_VARIABLE:
2038       sym = e->symtree->n.sym;
2039       t = FAILURE;
2040
2041       if (sym->attr.optional)
2042         {
2043           gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2044                      sym->name, &e->where);
2045           break;
2046         }
2047
2048       if (sym->attr.intent == INTENT_OUT)
2049         {
2050           gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2051                      sym->name, &e->where);
2052           break;
2053         }
2054
2055       /* gfc_is_formal_arg broadcasts that a formal argument list is being processed
2056          in resolve.c(resolve_formal_arglist).  This is done so that host associated
2057          dummy array indices are accepted (PR23446). This mechanism also does the
2058          same for the specification expressions of array-valued functions.  */
2059       if (sym->attr.in_common
2060           || sym->attr.use_assoc
2061           || sym->attr.dummy
2062           || sym->ns != gfc_current_ns
2063           || (sym->ns->proc_name != NULL
2064               && sym->ns->proc_name->attr.flavor == FL_MODULE)
2065           || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2066         {
2067           t = SUCCESS;
2068           break;
2069         }
2070
2071       gfc_error ("Variable '%s' cannot appear in the expression at %L",
2072                  sym->name, &e->where);
2073
2074       break;
2075
2076     case EXPR_NULL:
2077     case EXPR_CONSTANT:
2078       t = SUCCESS;
2079       break;
2080
2081     case EXPR_SUBSTRING:
2082       t = gfc_specification_expr (e->ref->u.ss.start);
2083       if (t == FAILURE)
2084         break;
2085
2086       t = gfc_specification_expr (e->ref->u.ss.end);
2087       if (t == SUCCESS)
2088         t = gfc_simplify_expr (e, 0);
2089
2090       break;
2091
2092     case EXPR_STRUCTURE:
2093       t = gfc_check_constructor (e, check_restricted);
2094       break;
2095
2096     case EXPR_ARRAY:
2097       t = gfc_check_constructor (e, check_restricted);
2098       break;
2099
2100     default:
2101       gfc_internal_error ("check_restricted(): Unknown expression type");
2102     }
2103
2104   return t;
2105 }
2106
2107
2108 /* Check to see that an expression is a specification expression.  If
2109    we return FAILURE, an error has been generated.  */
2110
2111 try
2112 gfc_specification_expr (gfc_expr * e)
2113 {
2114   if (e == NULL)
2115     return SUCCESS;
2116
2117   if (e->ts.type != BT_INTEGER)
2118     {
2119       gfc_error ("Expression at %L must be of INTEGER type", &e->where);
2120       return FAILURE;
2121     }
2122
2123   if (e->rank != 0)
2124     {
2125       gfc_error ("Expression at %L must be scalar", &e->where);
2126       return FAILURE;
2127     }
2128
2129   if (gfc_simplify_expr (e, 0) == FAILURE)
2130     return FAILURE;
2131
2132   return check_restricted (e);
2133 }
2134
2135
2136 /************** Expression conformance checks.  *************/
2137
2138 /* Given two expressions, make sure that the arrays are conformable.  */
2139
2140 try
2141 gfc_check_conformance (const char *optype_msgid,
2142                        gfc_expr * op1, gfc_expr * op2)
2143 {
2144   int op1_flag, op2_flag, d;
2145   mpz_t op1_size, op2_size;
2146   try t;
2147
2148   if (op1->rank == 0 || op2->rank == 0)
2149     return SUCCESS;
2150
2151   if (op1->rank != op2->rank)
2152     {
2153       gfc_error ("Incompatible ranks in %s at %L", _(optype_msgid),
2154                  &op1->where);
2155       return FAILURE;
2156     }
2157
2158   t = SUCCESS;
2159
2160   for (d = 0; d < op1->rank; d++)
2161     {
2162       op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2163       op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2164
2165       if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2166         {
2167           gfc_error ("different shape for %s at %L on dimension %d (%d/%d)",
2168                      _(optype_msgid), &op1->where, d + 1,
2169                      (int) mpz_get_si (op1_size),
2170                      (int) mpz_get_si (op2_size));
2171
2172           t = FAILURE;
2173         }
2174
2175       if (op1_flag)
2176         mpz_clear (op1_size);
2177       if (op2_flag)
2178         mpz_clear (op2_size);
2179
2180       if (t == FAILURE)
2181         return FAILURE;
2182     }
2183
2184   return SUCCESS;
2185 }
2186
2187
2188 /* Given an assignable expression and an arbitrary expression, make
2189    sure that the assignment can take place.  */
2190
2191 try
2192 gfc_check_assign (gfc_expr * lvalue, gfc_expr * rvalue, int conform)
2193 {
2194   gfc_symbol *sym;
2195   gfc_ref *ref;
2196   int has_pointer;
2197
2198   sym = lvalue->symtree->n.sym;
2199
2200   /* Check INTENT(IN), unless the object itself is the component or
2201      sub-component of a pointer.  */
2202   has_pointer = sym->attr.pointer;
2203
2204   for (ref = lvalue->ref; ref; ref = ref->next)
2205     if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2206       {
2207         has_pointer = 1;
2208         break;
2209       }
2210
2211   if (!has_pointer && sym->attr.intent == INTENT_IN)
2212     {
2213       gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2214                  sym->name, &lvalue->where);
2215       return FAILURE;
2216     }
2217
2218 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2219    variable local to a function subprogram.  Its existence begins when
2220    execution of the function is initiated and ends when execution of the
2221    function is terminated.....
2222    Therefore, the left hand side is no longer a varaiable, when it is:*/
2223   if (sym->attr.flavor == FL_PROCEDURE
2224         && sym->attr.proc != PROC_ST_FUNCTION
2225         && !sym->attr.external)
2226     {
2227       bool bad_proc;
2228       bad_proc = false;
2229
2230       /* (i) Use associated; */
2231       if (sym->attr.use_assoc)
2232         bad_proc = true;
2233
2234       /* (ii) The assignment is in the main program; or  */
2235       if (gfc_current_ns->proc_name->attr.is_main_program)
2236         bad_proc = true;
2237
2238       /* (iii) A module or internal procedure....  */
2239       if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2240              || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2241           && gfc_current_ns->parent
2242           && (!(gfc_current_ns->parent->proc_name->attr.function
2243                   || gfc_current_ns->parent->proc_name->attr.subroutine)
2244               || gfc_current_ns->parent->proc_name->attr.is_main_program))
2245         {
2246           /* .... that is not a function.... */ 
2247           if (!gfc_current_ns->proc_name->attr.function)
2248             bad_proc = true;
2249
2250           /* .... or is not an entry and has a different name.  */
2251           if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2252             bad_proc = true;
2253         }
2254
2255       if (bad_proc)
2256         {
2257           gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2258           return FAILURE;
2259         }
2260     }
2261
2262   if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2263     {
2264       gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2265                  lvalue->rank, rvalue->rank, &lvalue->where);
2266       return FAILURE;
2267     }
2268
2269   if (lvalue->ts.type == BT_UNKNOWN)
2270     {
2271       gfc_error ("Variable type is UNKNOWN in assignment at %L",
2272                  &lvalue->where);
2273       return FAILURE;
2274     }
2275
2276    if (rvalue->expr_type == EXPR_NULL)
2277      {
2278        gfc_error ("NULL appears on right-hand side in assignment at %L",
2279                   &rvalue->where);
2280        return FAILURE;
2281      }
2282
2283    if (sym->attr.cray_pointee
2284        && lvalue->ref != NULL
2285        && lvalue->ref->u.ar.type == AR_FULL
2286        && lvalue->ref->u.ar.as->cp_was_assumed)
2287      {
2288        gfc_error ("Vector assignment to assumed-size Cray Pointee at %L"
2289                   " is illegal", &lvalue->where);
2290        return FAILURE;
2291      }
2292
2293   /* This is possibly a typo: x = f() instead of x => f()  */
2294   if (gfc_option.warn_surprising 
2295       && rvalue->expr_type == EXPR_FUNCTION
2296       && rvalue->symtree->n.sym->attr.pointer)
2297     gfc_warning ("POINTER valued function appears on right-hand side of "
2298                  "assignment at %L", &rvalue->where);
2299
2300   /* Check size of array assignments.  */
2301   if (lvalue->rank != 0 && rvalue->rank != 0
2302       && gfc_check_conformance ("Array assignment", lvalue, rvalue) != SUCCESS)
2303     return FAILURE;
2304
2305   if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2306     return SUCCESS;
2307
2308   if (!conform)
2309     {
2310       /* Numeric can be converted to any other numeric. And Hollerith can be
2311          converted to any other type.  */
2312       if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2313           || rvalue->ts.type == BT_HOLLERITH)
2314         return SUCCESS;
2315
2316       if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2317         return SUCCESS;
2318
2319       gfc_error ("Incompatible types in assignment at %L, %s to %s",
2320                  &rvalue->where, gfc_typename (&rvalue->ts),
2321                  gfc_typename (&lvalue->ts));
2322
2323       return FAILURE;
2324     }
2325
2326   return gfc_convert_type (rvalue, &lvalue->ts, 1);
2327 }
2328
2329
2330 /* Check that a pointer assignment is OK.  We first check lvalue, and
2331    we only check rvalue if it's not an assignment to NULL() or a
2332    NULLIFY statement.  */
2333
2334 try
2335 gfc_check_pointer_assign (gfc_expr * lvalue, gfc_expr * rvalue)
2336 {
2337   symbol_attribute attr;
2338   gfc_ref *ref;
2339   int is_pure;
2340   int pointer, check_intent_in;
2341
2342   if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN)
2343     {
2344       gfc_error ("Pointer assignment target is not a POINTER at %L",
2345                  &lvalue->where);
2346       return FAILURE;
2347     }
2348
2349   if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
2350         && lvalue->symtree->n.sym->attr.use_assoc)
2351     {
2352       gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2353                  "l-value since it is a procedure",
2354                  lvalue->symtree->n.sym->name, &lvalue->where);
2355       return FAILURE;
2356     }
2357
2358
2359   /* Check INTENT(IN), unless the object itself is the component or
2360      sub-component of a pointer.  */
2361   check_intent_in = 1;
2362   pointer = lvalue->symtree->n.sym->attr.pointer;
2363
2364   for (ref = lvalue->ref; ref; ref = ref->next)
2365     {
2366       if (pointer)
2367         check_intent_in = 0;
2368
2369       if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2370         pointer = 1;
2371     }
2372
2373   if (check_intent_in && lvalue->symtree->n.sym->attr.intent == INTENT_IN)
2374     {
2375       gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2376                  lvalue->symtree->n.sym->name, &lvalue->where);
2377       return FAILURE;
2378     }
2379
2380   if (!pointer)
2381     {
2382       gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2383       return FAILURE;
2384     }
2385
2386   is_pure = gfc_pure (NULL);
2387
2388   if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym))
2389     {
2390       gfc_error ("Bad pointer object in PURE procedure at %L",
2391                  &lvalue->where);
2392       return FAILURE;
2393     }
2394
2395   /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2396      kind, etc for lvalue and rvalue must match, and rvalue must be a
2397      pure variable if we're in a pure function.  */
2398   if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
2399     return SUCCESS;
2400
2401   if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
2402     {
2403       gfc_error ("Different types in pointer assignment at %L",
2404                  &lvalue->where);
2405       return FAILURE;
2406     }
2407
2408   if (lvalue->ts.kind != rvalue->ts.kind)
2409     {
2410       gfc_error ("Different kind type parameters in pointer "
2411                  "assignment at %L", &lvalue->where);
2412       return FAILURE;
2413     }
2414
2415   if (lvalue->rank != rvalue->rank)
2416     {
2417       gfc_error ("Different ranks in pointer assignment at %L",
2418                   &lvalue->where);
2419       return FAILURE;
2420     }
2421
2422   /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
2423   if (rvalue->expr_type == EXPR_NULL)
2424     return SUCCESS;
2425
2426   if (lvalue->ts.type == BT_CHARACTER
2427         && lvalue->ts.cl->length && rvalue->ts.cl->length
2428         && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
2429                                       rvalue->ts.cl->length)) == 1)
2430     {
2431       gfc_error ("Different character lengths in pointer "
2432                  "assignment at %L", &lvalue->where);
2433       return FAILURE;
2434     }
2435
2436   attr = gfc_expr_attr (rvalue);
2437   if (!attr.target && !attr.pointer)
2438     {
2439       gfc_error ("Pointer assignment target is neither TARGET "
2440                  "nor POINTER at %L", &rvalue->where);
2441       return FAILURE;
2442     }
2443
2444   if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
2445     {
2446       gfc_error ("Bad target in pointer assignment in PURE "
2447                  "procedure at %L", &rvalue->where);
2448     }
2449
2450   if (gfc_has_vector_index (rvalue))
2451     {
2452       gfc_error ("Pointer assignment with vector subscript "
2453                  "on rhs at %L", &rvalue->where);
2454       return FAILURE;
2455     }
2456
2457   if (attr.protected && attr.use_assoc)
2458     {
2459       gfc_error ("Pointer assigment target has PROTECTED "
2460                  "attribute at %L", &rvalue->where);
2461       return FAILURE;
2462     }
2463
2464   return SUCCESS;
2465 }
2466
2467
2468 /* Relative of gfc_check_assign() except that the lvalue is a single
2469    symbol.  Used for initialization assignments.  */
2470
2471 try
2472 gfc_check_assign_symbol (gfc_symbol * sym, gfc_expr * rvalue)
2473 {
2474   gfc_expr lvalue;
2475   try r;
2476
2477   memset (&lvalue, '\0', sizeof (gfc_expr));
2478
2479   lvalue.expr_type = EXPR_VARIABLE;
2480   lvalue.ts = sym->ts;
2481   if (sym->as)
2482     lvalue.rank = sym->as->rank;
2483   lvalue.symtree = (gfc_symtree *)gfc_getmem (sizeof (gfc_symtree));
2484   lvalue.symtree->n.sym = sym;
2485   lvalue.where = sym->declared_at;
2486
2487   if (sym->attr.pointer)
2488     r = gfc_check_pointer_assign (&lvalue, rvalue);
2489   else
2490     r = gfc_check_assign (&lvalue, rvalue, 1);
2491
2492   gfc_free (lvalue.symtree);
2493
2494   return r;
2495 }
2496
2497
2498 /* Get an expression for a default initializer.  */
2499
2500 gfc_expr *
2501 gfc_default_initializer (gfc_typespec *ts)
2502 {
2503   gfc_constructor *tail;
2504   gfc_expr *init;
2505   gfc_component *c;
2506
2507   init = NULL;
2508
2509   /* See if we have a default initializer.  */
2510   for (c = ts->derived->components; c; c = c->next)
2511     {
2512       if ((c->initializer || c->allocatable) && init == NULL)
2513         init = gfc_get_expr ();
2514     }
2515
2516   if (init == NULL)
2517     return NULL;
2518
2519   /* Build the constructor.  */
2520   init->expr_type = EXPR_STRUCTURE;
2521   init->ts = *ts;
2522   init->where = ts->derived->declared_at;
2523   tail = NULL;
2524   for (c = ts->derived->components; c; c = c->next)
2525     {
2526       if (tail == NULL)
2527         init->value.constructor = tail = gfc_get_constructor ();
2528       else
2529         {
2530           tail->next = gfc_get_constructor ();
2531           tail = tail->next;
2532         }
2533
2534       if (c->initializer)
2535         tail->expr = gfc_copy_expr (c->initializer);
2536
2537       if (c->allocatable)
2538         {
2539           tail->expr = gfc_get_expr ();
2540           tail->expr->expr_type = EXPR_NULL;
2541           tail->expr->ts = c->ts;
2542         }
2543     }
2544   return init;
2545 }
2546
2547
2548 /* Given a symbol, create an expression node with that symbol as a
2549    variable. If the symbol is array valued, setup a reference of the
2550    whole array.  */
2551
2552 gfc_expr *
2553 gfc_get_variable_expr (gfc_symtree * var)
2554 {
2555   gfc_expr *e;
2556
2557   e = gfc_get_expr ();
2558   e->expr_type = EXPR_VARIABLE;
2559   e->symtree = var;
2560   e->ts = var->n.sym->ts;
2561
2562   if (var->n.sym->as != NULL)
2563     {
2564       e->rank = var->n.sym->as->rank;
2565       e->ref = gfc_get_ref ();
2566       e->ref->type = REF_ARRAY;
2567       e->ref->u.ar.type = AR_FULL;
2568     }
2569
2570   return e;
2571 }
2572
2573
2574 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
2575
2576 void
2577 gfc_expr_set_symbols_referenced (gfc_expr * expr)
2578 {
2579   gfc_actual_arglist *arg;
2580   gfc_constructor *c;
2581   gfc_ref *ref;
2582   int i;
2583
2584   if (!expr) return;
2585
2586   switch (expr->expr_type)
2587     {
2588     case EXPR_OP:
2589       gfc_expr_set_symbols_referenced (expr->value.op.op1);
2590       gfc_expr_set_symbols_referenced (expr->value.op.op2);
2591       break;
2592
2593     case EXPR_FUNCTION:
2594       for (arg = expr->value.function.actual; arg; arg = arg->next)
2595         gfc_expr_set_symbols_referenced (arg->expr);
2596       break;
2597
2598     case EXPR_VARIABLE:
2599       gfc_set_sym_referenced (expr->symtree->n.sym);
2600       break;
2601
2602     case EXPR_CONSTANT:
2603     case EXPR_NULL:
2604     case EXPR_SUBSTRING:
2605       break;
2606
2607     case EXPR_STRUCTURE:
2608     case EXPR_ARRAY:
2609       for (c = expr->value.constructor; c; c = c->next)
2610         gfc_expr_set_symbols_referenced (c->expr);
2611       break;
2612
2613     default:
2614       gcc_unreachable ();
2615       break;
2616     }
2617
2618     for (ref = expr->ref; ref; ref = ref->next)
2619       switch (ref->type)
2620         {
2621         case REF_ARRAY:
2622           for (i = 0; i < ref->u.ar.dimen; i++)
2623             {
2624               gfc_expr_set_symbols_referenced (ref->u.ar.start[i]);
2625               gfc_expr_set_symbols_referenced (ref->u.ar.end[i]);
2626               gfc_expr_set_symbols_referenced (ref->u.ar.stride[i]);
2627             }
2628           break;
2629            
2630         case REF_COMPONENT:
2631           break;
2632            
2633         case REF_SUBSTRING:
2634           gfc_expr_set_symbols_referenced (ref->u.ss.start);
2635           gfc_expr_set_symbols_referenced (ref->u.ss.end);
2636           break;
2637            
2638         default:
2639           gcc_unreachable ();
2640           break;
2641         }
2642 }