OSDN Git Service

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