OSDN Git Service

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