OSDN Git Service

700fd10f6fe872c285241f2a65385b2fd300289c
[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, 2008,
3    2009, 2010
4    Free Software Foundation, Inc.
5    Contributed by Andy Vaught
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "gfortran.h"
26 #include "arith.h"
27 #include "match.h"
28 #include "target-memory.h" /* for gfc_convert_boz */
29 #include "constructor.h"
30
31
32 /* The following set of functions provide access to gfc_expr* of
33    various types - actual all but EXPR_FUNCTION and EXPR_VARIABLE.
34
35    There are two functions available elsewhere that provide
36    slightly different flavours of variables.  Namely:
37      expr.c (gfc_get_variable_expr)
38      symbol.c (gfc_lval_expr_from_sym)
39    TODO: Merge these functions, if possible.  */
40
41 /* Get a new expression node.  */
42
43 gfc_expr *
44 gfc_get_expr (void)
45 {
46   gfc_expr *e;
47
48   e = XCNEW (gfc_expr);
49   gfc_clear_ts (&e->ts);
50   e->shape = NULL;
51   e->ref = NULL;
52   e->symtree = NULL;
53   return e;
54 }
55
56
57 /* Get a new expression node that is an array constructor
58    of given type and kind.  */
59
60 gfc_expr *
61 gfc_get_array_expr (bt type, int kind, locus *where)
62 {
63   gfc_expr *e;
64
65   e = gfc_get_expr ();
66   e->expr_type = EXPR_ARRAY;
67   e->value.constructor = NULL;
68   e->rank = 1;
69   e->shape = NULL;
70
71   e->ts.type = type;
72   e->ts.kind = kind;
73   if (where)
74     e->where = *where;
75
76   return e;
77 }
78
79
80 /* Get a new expression node that is the NULL expression.  */
81
82 gfc_expr *
83 gfc_get_null_expr (locus *where)
84 {
85   gfc_expr *e;
86
87   e = gfc_get_expr ();
88   e->expr_type = EXPR_NULL;
89   e->ts.type = BT_UNKNOWN;
90
91   if (where)
92     e->where = *where;
93
94   return e;
95 }
96
97
98 /* Get a new expression node that is an operator expression node.  */
99
100 gfc_expr *
101 gfc_get_operator_expr (locus *where, gfc_intrinsic_op op,
102                       gfc_expr *op1, gfc_expr *op2)
103 {
104   gfc_expr *e;
105
106   e = gfc_get_expr ();
107   e->expr_type = EXPR_OP;
108   e->value.op.op = op;
109   e->value.op.op1 = op1;
110   e->value.op.op2 = op2;
111
112   if (where)
113     e->where = *where;
114
115   return e;
116 }
117
118
119 /* Get a new expression node that is an structure constructor
120    of given type and kind.  */
121
122 gfc_expr *
123 gfc_get_structure_constructor_expr (bt type, int kind, locus *where)
124 {
125   gfc_expr *e;
126
127   e = gfc_get_expr ();
128   e->expr_type = EXPR_STRUCTURE;
129   e->value.constructor = NULL;
130
131   e->ts.type = type;
132   e->ts.kind = kind;
133   if (where)
134     e->where = *where;
135
136   return e;
137 }
138
139
140 /* Get a new expression node that is an constant of given type and kind.  */
141
142 gfc_expr *
143 gfc_get_constant_expr (bt type, int kind, locus *where)
144 {
145   gfc_expr *e;
146
147   if (!where)
148     gfc_internal_error ("gfc_get_constant_expr(): locus 'where' cannot be NULL");
149
150   e = gfc_get_expr ();
151
152   e->expr_type = EXPR_CONSTANT;
153   e->ts.type = type;
154   e->ts.kind = kind;
155   e->where = *where;
156
157   switch (type)
158     {
159     case BT_INTEGER:
160       mpz_init (e->value.integer);
161       break;
162
163     case BT_REAL:
164       gfc_set_model_kind (kind);
165       mpfr_init (e->value.real);
166       break;
167
168     case BT_COMPLEX:
169       gfc_set_model_kind (kind);
170       mpc_init2 (e->value.complex, mpfr_get_default_prec());
171       break;
172
173     default:
174       break;
175     }
176
177   return e;
178 }
179
180
181 /* Get a new expression node that is an string constant.
182    If no string is passed, a string of len is allocated,
183    blanked and null-terminated.  */
184
185 gfc_expr *
186 gfc_get_character_expr (int kind, locus *where, const char *src, int len)
187 {
188   gfc_expr *e;
189   gfc_char_t *dest;
190
191   if (!src)
192     {
193       dest = gfc_get_wide_string (len + 1);
194       gfc_wide_memset (dest, ' ', len);
195       dest[len] = '\0';
196     }
197   else
198     dest = gfc_char_to_widechar (src);
199
200   e = gfc_get_constant_expr (BT_CHARACTER, kind,
201                             where ? where : &gfc_current_locus);
202   e->value.character.string = dest;
203   e->value.character.length = len;
204
205   return e;
206 }
207
208
209 /* Get a new expression node that is an integer constant.  */
210
211 gfc_expr *
212 gfc_get_int_expr (int kind, locus *where, int value)
213 {
214   gfc_expr *p;
215   p = gfc_get_constant_expr (BT_INTEGER, kind,
216                              where ? where : &gfc_current_locus);
217
218   mpz_init_set_si (p->value.integer, value);
219
220   return p;
221 }
222
223
224 /* Get a new expression node that is a logical constant.  */
225
226 gfc_expr *
227 gfc_get_logical_expr (int kind, locus *where, bool value)
228 {
229   gfc_expr *p;
230   p = gfc_get_constant_expr (BT_LOGICAL, kind,
231                              where ? where : &gfc_current_locus);
232
233   p->value.logical = value;
234
235   return p;
236 }
237
238
239 gfc_expr *
240 gfc_get_iokind_expr (locus *where, io_kind k)
241 {
242   gfc_expr *e;
243
244   /* Set the types to something compatible with iokind. This is needed to
245      get through gfc_free_expr later since iokind really has no Basic Type,
246      BT, of its own.  */
247
248   e = gfc_get_expr ();
249   e->expr_type = EXPR_CONSTANT;
250   e->ts.type = BT_LOGICAL;
251   e->value.iokind = k;
252   e->where = *where;
253
254   return e;
255 }
256
257
258 /* Given an expression pointer, return a copy of the expression.  This
259    subroutine is recursive.  */
260
261 gfc_expr *
262 gfc_copy_expr (gfc_expr *p)
263 {
264   gfc_expr *q;
265   gfc_char_t *s;
266   char *c;
267
268   if (p == NULL)
269     return NULL;
270
271   q = gfc_get_expr ();
272   *q = *p;
273
274   switch (q->expr_type)
275     {
276     case EXPR_SUBSTRING:
277       s = gfc_get_wide_string (p->value.character.length + 1);
278       q->value.character.string = s;
279       memcpy (s, p->value.character.string,
280               (p->value.character.length + 1) * sizeof (gfc_char_t));
281       break;
282
283     case EXPR_CONSTANT:
284       /* Copy target representation, if it exists.  */
285       if (p->representation.string)
286         {
287           c = XCNEWVEC (char, p->representation.length + 1);
288           q->representation.string = c;
289           memcpy (c, p->representation.string, (p->representation.length + 1));
290         }
291
292       /* Copy the values of any pointer components of p->value.  */
293       switch (q->ts.type)
294         {
295         case BT_INTEGER:
296           mpz_init_set (q->value.integer, p->value.integer);
297           break;
298
299         case BT_REAL:
300           gfc_set_model_kind (q->ts.kind);
301           mpfr_init (q->value.real);
302           mpfr_set (q->value.real, p->value.real, GFC_RND_MODE);
303           break;
304
305         case BT_COMPLEX:
306           gfc_set_model_kind (q->ts.kind);
307           mpc_init2 (q->value.complex, mpfr_get_default_prec());
308           mpc_set (q->value.complex, p->value.complex, GFC_MPC_RND_MODE);
309           break;
310
311         case BT_CHARACTER:
312           if (p->representation.string)
313             q->value.character.string
314               = gfc_char_to_widechar (q->representation.string);
315           else
316             {
317               s = gfc_get_wide_string (p->value.character.length + 1);
318               q->value.character.string = s;
319
320               /* This is the case for the C_NULL_CHAR named constant.  */
321               if (p->value.character.length == 0
322                   && (p->ts.is_c_interop || p->ts.is_iso_c))
323                 {
324                   *s = '\0';
325                   /* Need to set the length to 1 to make sure the NUL
326                      terminator is copied.  */
327                   q->value.character.length = 1;
328                 }
329               else
330                 memcpy (s, p->value.character.string,
331                         (p->value.character.length + 1) * sizeof (gfc_char_t));
332             }
333           break;
334
335         case BT_HOLLERITH:
336         case BT_LOGICAL:
337         case BT_DERIVED:
338         case BT_CLASS:
339           break;                /* Already done.  */
340
341         case BT_PROCEDURE:
342         case BT_VOID:
343            /* Should never be reached.  */
344         case BT_UNKNOWN:
345           gfc_internal_error ("gfc_copy_expr(): Bad expr node");
346           /* Not reached.  */
347         }
348
349       break;
350
351     case EXPR_OP:
352       switch (q->value.op.op)
353         {
354         case INTRINSIC_NOT:
355         case INTRINSIC_PARENTHESES:
356         case INTRINSIC_UPLUS:
357         case INTRINSIC_UMINUS:
358           q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
359           break;
360
361         default:                /* Binary operators.  */
362           q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
363           q->value.op.op2 = gfc_copy_expr (p->value.op.op2);
364           break;
365         }
366
367       break;
368
369     case EXPR_FUNCTION:
370       q->value.function.actual =
371         gfc_copy_actual_arglist (p->value.function.actual);
372       break;
373
374     case EXPR_COMPCALL:
375     case EXPR_PPC:
376       q->value.compcall.actual =
377         gfc_copy_actual_arglist (p->value.compcall.actual);
378       q->value.compcall.tbp = p->value.compcall.tbp;
379       break;
380
381     case EXPR_STRUCTURE:
382     case EXPR_ARRAY:
383       q->value.constructor = gfc_constructor_copy (p->value.constructor);
384       break;
385
386     case EXPR_VARIABLE:
387     case EXPR_NULL:
388       break;
389     }
390
391   q->shape = gfc_copy_shape (p->shape, p->rank);
392
393   q->ref = gfc_copy_ref (p->ref);
394
395   return q;
396 }
397
398
399 /* Workhorse function for gfc_free_expr() that frees everything
400    beneath an expression node, but not the node itself.  This is
401    useful when we want to simplify a node and replace it with
402    something else or the expression node belongs to another structure.  */
403
404 static void
405 free_expr0 (gfc_expr *e)
406 {
407   int n;
408
409   switch (e->expr_type)
410     {
411     case EXPR_CONSTANT:
412       /* Free any parts of the value that need freeing.  */
413       switch (e->ts.type)
414         {
415         case BT_INTEGER:
416           mpz_clear (e->value.integer);
417           break;
418
419         case BT_REAL:
420           mpfr_clear (e->value.real);
421           break;
422
423         case BT_CHARACTER:
424           gfc_free (e->value.character.string);
425           break;
426
427         case BT_COMPLEX:
428           mpc_clear (e->value.complex);
429           break;
430
431         default:
432           break;
433         }
434
435       /* Free the representation.  */
436       if (e->representation.string)
437         gfc_free (e->representation.string);
438
439       break;
440
441     case EXPR_OP:
442       if (e->value.op.op1 != NULL)
443         gfc_free_expr (e->value.op.op1);
444       if (e->value.op.op2 != NULL)
445         gfc_free_expr (e->value.op.op2);
446       break;
447
448     case EXPR_FUNCTION:
449       gfc_free_actual_arglist (e->value.function.actual);
450       break;
451
452     case EXPR_COMPCALL:
453     case EXPR_PPC:
454       gfc_free_actual_arglist (e->value.compcall.actual);
455       break;
456
457     case EXPR_VARIABLE:
458       break;
459
460     case EXPR_ARRAY:
461     case EXPR_STRUCTURE:
462       gfc_constructor_free (e->value.constructor);
463       break;
464
465     case EXPR_SUBSTRING:
466       gfc_free (e->value.character.string);
467       break;
468
469     case EXPR_NULL:
470       break;
471
472     default:
473       gfc_internal_error ("free_expr0(): Bad expr type");
474     }
475
476   /* Free a shape array.  */
477   if (e->shape != NULL)
478     {
479       for (n = 0; n < e->rank; n++)
480         mpz_clear (e->shape[n]);
481
482       gfc_free (e->shape);
483     }
484
485   gfc_free_ref_list (e->ref);
486
487   memset (e, '\0', sizeof (gfc_expr));
488 }
489
490
491 /* Free an expression node and everything beneath it.  */
492
493 void
494 gfc_free_expr (gfc_expr *e)
495 {
496   if (e == NULL)
497     return;
498   free_expr0 (e);
499   gfc_free (e);
500 }
501
502
503 /* Free an argument list and everything below it.  */
504
505 void
506 gfc_free_actual_arglist (gfc_actual_arglist *a1)
507 {
508   gfc_actual_arglist *a2;
509
510   while (a1)
511     {
512       a2 = a1->next;
513       gfc_free_expr (a1->expr);
514       gfc_free (a1);
515       a1 = a2;
516     }
517 }
518
519
520 /* Copy an arglist structure and all of the arguments.  */
521
522 gfc_actual_arglist *
523 gfc_copy_actual_arglist (gfc_actual_arglist *p)
524 {
525   gfc_actual_arglist *head, *tail, *new_arg;
526
527   head = tail = NULL;
528
529   for (; p; p = p->next)
530     {
531       new_arg = gfc_get_actual_arglist ();
532       *new_arg = *p;
533
534       new_arg->expr = gfc_copy_expr (p->expr);
535       new_arg->next = NULL;
536
537       if (head == NULL)
538         head = new_arg;
539       else
540         tail->next = new_arg;
541
542       tail = new_arg;
543     }
544
545   return head;
546 }
547
548
549 /* Free a list of reference structures.  */
550
551 void
552 gfc_free_ref_list (gfc_ref *p)
553 {
554   gfc_ref *q;
555   int i;
556
557   for (; p; p = q)
558     {
559       q = p->next;
560
561       switch (p->type)
562         {
563         case REF_ARRAY:
564           for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
565             {
566               gfc_free_expr (p->u.ar.start[i]);
567               gfc_free_expr (p->u.ar.end[i]);
568               gfc_free_expr (p->u.ar.stride[i]);
569             }
570
571           break;
572
573         case REF_SUBSTRING:
574           gfc_free_expr (p->u.ss.start);
575           gfc_free_expr (p->u.ss.end);
576           break;
577
578         case REF_COMPONENT:
579           break;
580         }
581
582       gfc_free (p);
583     }
584 }
585
586
587 /* Graft the *src expression onto the *dest subexpression.  */
588
589 void
590 gfc_replace_expr (gfc_expr *dest, gfc_expr *src)
591 {
592   free_expr0 (dest);
593   *dest = *src;
594   gfc_free (src);
595 }
596
597
598 /* Try to extract an integer constant from the passed expression node.
599    Returns an error message or NULL if the result is set.  It is
600    tempting to generate an error and return SUCCESS or FAILURE, but
601    failure is OK for some callers.  */
602
603 const char *
604 gfc_extract_int (gfc_expr *expr, int *result)
605 {
606   if (expr->expr_type != EXPR_CONSTANT)
607     return _("Constant expression required at %C");
608
609   if (expr->ts.type != BT_INTEGER)
610     return _("Integer expression required at %C");
611
612   if ((mpz_cmp_si (expr->value.integer, INT_MAX) > 0)
613       || (mpz_cmp_si (expr->value.integer, INT_MIN) < 0))
614     {
615       return _("Integer value too large in expression at %C");
616     }
617
618   *result = (int) mpz_get_si (expr->value.integer);
619
620   return NULL;
621 }
622
623
624 /* Recursively copy a list of reference structures.  */
625
626 gfc_ref *
627 gfc_copy_ref (gfc_ref *src)
628 {
629   gfc_array_ref *ar;
630   gfc_ref *dest;
631
632   if (src == NULL)
633     return NULL;
634
635   dest = gfc_get_ref ();
636   dest->type = src->type;
637
638   switch (src->type)
639     {
640     case REF_ARRAY:
641       ar = gfc_copy_array_ref (&src->u.ar);
642       dest->u.ar = *ar;
643       gfc_free (ar);
644       break;
645
646     case REF_COMPONENT:
647       dest->u.c = src->u.c;
648       break;
649
650     case REF_SUBSTRING:
651       dest->u.ss = src->u.ss;
652       dest->u.ss.start = gfc_copy_expr (src->u.ss.start);
653       dest->u.ss.end = gfc_copy_expr (src->u.ss.end);
654       break;
655     }
656
657   dest->next = gfc_copy_ref (src->next);
658
659   return dest;
660 }
661
662
663 /* Detect whether an expression has any vector index array references.  */
664
665 int
666 gfc_has_vector_index (gfc_expr *e)
667 {
668   gfc_ref *ref;
669   int i;
670   for (ref = e->ref; ref; ref = ref->next)
671     if (ref->type == REF_ARRAY)
672       for (i = 0; i < ref->u.ar.dimen; i++)
673         if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
674           return 1;
675   return 0;
676 }
677
678
679 /* Insert a reference to the component of the given name.
680    Only to be used with CLASS containers.  */
681
682 void
683 gfc_add_component_ref (gfc_expr *e, const char *name)
684 {
685   gfc_ref **tail = &(e->ref);
686   gfc_ref *next = NULL;
687   gfc_symbol *derived = e->symtree->n.sym->ts.u.derived;
688   while (*tail != NULL)
689     {
690       if ((*tail)->type == REF_COMPONENT)
691         derived = (*tail)->u.c.component->ts.u.derived;
692       if ((*tail)->type == REF_ARRAY && (*tail)->next == NULL)
693         break;
694       tail = &((*tail)->next);
695     }
696   if (*tail != NULL && strcmp (name, "$data") == 0)
697     next = *tail;
698   (*tail) = gfc_get_ref();
699   (*tail)->next = next;
700   (*tail)->type = REF_COMPONENT;
701   (*tail)->u.c.sym = derived;
702   (*tail)->u.c.component = gfc_find_component (derived, name, true, true);
703   gcc_assert((*tail)->u.c.component);
704   if (!next)
705     e->ts = (*tail)->u.c.component->ts;
706 }
707
708
709 /* Copy a shape array.  */
710
711 mpz_t *
712 gfc_copy_shape (mpz_t *shape, int rank)
713 {
714   mpz_t *new_shape;
715   int n;
716
717   if (shape == NULL)
718     return NULL;
719
720   new_shape = gfc_get_shape (rank);
721
722   for (n = 0; n < rank; n++)
723     mpz_init_set (new_shape[n], shape[n]);
724
725   return new_shape;
726 }
727
728
729 /* Copy a shape array excluding dimension N, where N is an integer
730    constant expression.  Dimensions are numbered in fortran style --
731    starting with ONE.
732
733    So, if the original shape array contains R elements
734       { s1 ... sN-1  sN  sN+1 ... sR-1 sR}
735    the result contains R-1 elements:
736       { s1 ... sN-1  sN+1    ...  sR-1}
737
738    If anything goes wrong -- N is not a constant, its value is out
739    of range -- or anything else, just returns NULL.  */
740
741 mpz_t *
742 gfc_copy_shape_excluding (mpz_t *shape, int rank, gfc_expr *dim)
743 {
744   mpz_t *new_shape, *s;
745   int i, n;
746
747   if (shape == NULL 
748       || rank <= 1
749       || dim == NULL
750       || dim->expr_type != EXPR_CONSTANT 
751       || dim->ts.type != BT_INTEGER)
752     return NULL;
753
754   n = mpz_get_si (dim->value.integer);
755   n--; /* Convert to zero based index.  */
756   if (n < 0 || n >= rank)
757     return NULL;
758
759   s = new_shape = gfc_get_shape (rank - 1);
760
761   for (i = 0; i < rank; i++)
762     {
763       if (i == n)
764         continue;
765       mpz_init_set (*s, shape[i]);
766       s++;
767     }
768
769   return new_shape;
770 }
771
772
773 /* Return the maximum kind of two expressions.  In general, higher
774    kind numbers mean more precision for numeric types.  */
775
776 int
777 gfc_kind_max (gfc_expr *e1, gfc_expr *e2)
778 {
779   return (e1->ts.kind > e2->ts.kind) ? e1->ts.kind : e2->ts.kind;
780 }
781
782
783 /* Returns nonzero if the type is numeric, zero otherwise.  */
784
785 static int
786 numeric_type (bt type)
787 {
788   return type == BT_COMPLEX || type == BT_REAL || type == BT_INTEGER;
789 }
790
791
792 /* Returns nonzero if the typespec is a numeric type, zero otherwise.  */
793
794 int
795 gfc_numeric_ts (gfc_typespec *ts)
796 {
797   return numeric_type (ts->type);
798 }
799
800
801 /* Return an expression node with an optional argument list attached.
802    A variable number of gfc_expr pointers are strung together in an
803    argument list with a NULL pointer terminating the list.  */
804
805 gfc_expr *
806 gfc_build_conversion (gfc_expr *e)
807 {
808   gfc_expr *p;
809
810   p = gfc_get_expr ();
811   p->expr_type = EXPR_FUNCTION;
812   p->symtree = NULL;
813   p->value.function.actual = NULL;
814
815   p->value.function.actual = gfc_get_actual_arglist ();
816   p->value.function.actual->expr = e;
817
818   return p;
819 }
820
821
822 /* Given an expression node with some sort of numeric binary
823    expression, insert type conversions required to make the operands
824    have the same type. Conversion warnings are disabled if wconversion
825    is set to 0.
826
827    The exception is that the operands of an exponential don't have to
828    have the same type.  If possible, the base is promoted to the type
829    of the exponent.  For example, 1**2.3 becomes 1.0**2.3, but
830    1.0**2 stays as it is.  */
831
832 void
833 gfc_type_convert_binary (gfc_expr *e, int wconversion)
834 {
835   gfc_expr *op1, *op2;
836
837   op1 = e->value.op.op1;
838   op2 = e->value.op.op2;
839
840   if (op1->ts.type == BT_UNKNOWN || op2->ts.type == BT_UNKNOWN)
841     {
842       gfc_clear_ts (&e->ts);
843       return;
844     }
845
846   /* Kind conversions of same type.  */
847   if (op1->ts.type == op2->ts.type)
848     {
849       if (op1->ts.kind == op2->ts.kind)
850         {
851           /* No type conversions.  */
852           e->ts = op1->ts;
853           goto done;
854         }
855
856       if (op1->ts.kind > op2->ts.kind)
857         gfc_convert_type_warn (op2, &op1->ts, 2, wconversion);
858       else
859         gfc_convert_type_warn (op1, &op2->ts, 2, wconversion);
860
861       e->ts = op1->ts;
862       goto done;
863     }
864
865   /* Integer combined with real or complex.  */
866   if (op2->ts.type == BT_INTEGER)
867     {
868       e->ts = op1->ts;
869
870       /* Special case for ** operator.  */
871       if (e->value.op.op == INTRINSIC_POWER)
872         goto done;
873
874       gfc_convert_type_warn (e->value.op.op2, &e->ts, 2, wconversion);
875       goto done;
876     }
877
878   if (op1->ts.type == BT_INTEGER)
879     {
880       e->ts = op2->ts;
881       gfc_convert_type_warn (e->value.op.op1, &e->ts, 2, wconversion);
882       goto done;
883     }
884
885   /* Real combined with complex.  */
886   e->ts.type = BT_COMPLEX;
887   if (op1->ts.kind > op2->ts.kind)
888     e->ts.kind = op1->ts.kind;
889   else
890     e->ts.kind = op2->ts.kind;
891   if (op1->ts.type != BT_COMPLEX || op1->ts.kind != e->ts.kind)
892     gfc_convert_type_warn (e->value.op.op1, &e->ts, 2, wconversion);
893   if (op2->ts.type != BT_COMPLEX || op2->ts.kind != e->ts.kind)
894     gfc_convert_type_warn (e->value.op.op2, &e->ts, 2, wconversion);
895
896 done:
897   return;
898 }
899
900
901 static match
902 check_specification_function (gfc_expr *e)
903 {
904   gfc_symbol *sym;
905
906   if (!e->symtree)
907     return MATCH_NO;
908
909   sym = e->symtree->n.sym;
910
911   /* F95, 7.1.6.2; F2003, 7.1.7  */
912   if (sym
913       && sym->attr.function
914       && sym->attr.pure
915       && !sym->attr.intrinsic
916       && !sym->attr.recursive
917       && sym->attr.proc != PROC_INTERNAL
918       && sym->attr.proc != PROC_ST_FUNCTION
919       && sym->attr.proc != PROC_UNKNOWN
920       && sym->formal == NULL)
921     return MATCH_YES;
922
923   return MATCH_NO;
924 }
925
926 /* Function to determine if an expression is constant or not.  This
927    function expects that the expression has already been simplified.  */
928
929 int
930 gfc_is_constant_expr (gfc_expr *e)
931 {
932   gfc_constructor *c;
933   gfc_actual_arglist *arg;
934
935   if (e == NULL)
936     return 1;
937
938   switch (e->expr_type)
939     {
940     case EXPR_OP:
941       return (gfc_is_constant_expr (e->value.op.op1)
942               && (e->value.op.op2 == NULL
943                   || gfc_is_constant_expr (e->value.op.op2)));
944
945     case EXPR_VARIABLE:
946       return 0;
947
948     case EXPR_FUNCTION:
949     case EXPR_PPC:
950     case EXPR_COMPCALL:
951       /* Specification functions are constant.  */
952       if (check_specification_function (e) == MATCH_YES)
953         return 1;
954
955       /* Call to intrinsic with at least one argument.  */
956       if (e->value.function.isym && e->value.function.actual)
957         {
958           for (arg = e->value.function.actual; arg; arg = arg->next)
959             if (!gfc_is_constant_expr (arg->expr))
960               return 0;
961
962           return 1;
963         }
964       else
965         return 0;
966
967     case EXPR_CONSTANT:
968     case EXPR_NULL:
969       return 1;
970
971     case EXPR_SUBSTRING:
972       return e->ref == NULL || (gfc_is_constant_expr (e->ref->u.ss.start)
973                                 && gfc_is_constant_expr (e->ref->u.ss.end));
974
975     case EXPR_STRUCTURE:
976       for (c = gfc_constructor_first (e->value.constructor);
977            c; c = gfc_constructor_next (c))
978         if (!gfc_is_constant_expr (c->expr))
979           return 0;
980
981       return 1;
982
983     case EXPR_ARRAY:
984       return gfc_constant_ac (e);
985
986     default:
987       gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
988       return 0;
989     }
990 }
991
992
993 /* Is true if an array reference is followed by a component or substring
994    reference.  */
995 bool
996 is_subref_array (gfc_expr * e)
997 {
998   gfc_ref * ref;
999   bool seen_array;
1000
1001   if (e->expr_type != EXPR_VARIABLE)
1002     return false;
1003
1004   if (e->symtree->n.sym->attr.subref_array_pointer)
1005     return true;
1006
1007   seen_array = false;
1008   for (ref = e->ref; ref; ref = ref->next)
1009     {
1010       if (ref->type == REF_ARRAY
1011             && ref->u.ar.type != AR_ELEMENT)
1012         seen_array = true;
1013
1014       if (seen_array
1015             && ref->type != REF_ARRAY)
1016         return seen_array;
1017     }
1018   return false;
1019 }
1020
1021
1022 /* Try to collapse intrinsic expressions.  */
1023
1024 static gfc_try
1025 simplify_intrinsic_op (gfc_expr *p, int type)
1026 {
1027   gfc_intrinsic_op op;
1028   gfc_expr *op1, *op2, *result;
1029
1030   if (p->value.op.op == INTRINSIC_USER)
1031     return SUCCESS;
1032
1033   op1 = p->value.op.op1;
1034   op2 = p->value.op.op2;
1035   op  = p->value.op.op;
1036
1037   if (gfc_simplify_expr (op1, type) == FAILURE)
1038     return FAILURE;
1039   if (gfc_simplify_expr (op2, type) == FAILURE)
1040     return FAILURE;
1041
1042   if (!gfc_is_constant_expr (op1)
1043       || (op2 != NULL && !gfc_is_constant_expr (op2)))
1044     return SUCCESS;
1045
1046   /* Rip p apart.  */
1047   p->value.op.op1 = NULL;
1048   p->value.op.op2 = NULL;
1049
1050   switch (op)
1051     {
1052     case INTRINSIC_PARENTHESES:
1053       result = gfc_parentheses (op1);
1054       break;
1055
1056     case INTRINSIC_UPLUS:
1057       result = gfc_uplus (op1);
1058       break;
1059
1060     case INTRINSIC_UMINUS:
1061       result = gfc_uminus (op1);
1062       break;
1063
1064     case INTRINSIC_PLUS:
1065       result = gfc_add (op1, op2);
1066       break;
1067
1068     case INTRINSIC_MINUS:
1069       result = gfc_subtract (op1, op2);
1070       break;
1071
1072     case INTRINSIC_TIMES:
1073       result = gfc_multiply (op1, op2);
1074       break;
1075
1076     case INTRINSIC_DIVIDE:
1077       result = gfc_divide (op1, op2);
1078       break;
1079
1080     case INTRINSIC_POWER:
1081       result = gfc_power (op1, op2);
1082       break;
1083
1084     case INTRINSIC_CONCAT:
1085       result = gfc_concat (op1, op2);
1086       break;
1087
1088     case INTRINSIC_EQ:
1089     case INTRINSIC_EQ_OS:
1090       result = gfc_eq (op1, op2, op);
1091       break;
1092
1093     case INTRINSIC_NE:
1094     case INTRINSIC_NE_OS:
1095       result = gfc_ne (op1, op2, op);
1096       break;
1097
1098     case INTRINSIC_GT:
1099     case INTRINSIC_GT_OS:
1100       result = gfc_gt (op1, op2, op);
1101       break;
1102
1103     case INTRINSIC_GE:
1104     case INTRINSIC_GE_OS:
1105       result = gfc_ge (op1, op2, op);
1106       break;
1107
1108     case INTRINSIC_LT:
1109     case INTRINSIC_LT_OS:
1110       result = gfc_lt (op1, op2, op);
1111       break;
1112
1113     case INTRINSIC_LE:
1114     case INTRINSIC_LE_OS:
1115       result = gfc_le (op1, op2, op);
1116       break;
1117
1118     case INTRINSIC_NOT:
1119       result = gfc_not (op1);
1120       break;
1121
1122     case INTRINSIC_AND:
1123       result = gfc_and (op1, op2);
1124       break;
1125
1126     case INTRINSIC_OR:
1127       result = gfc_or (op1, op2);
1128       break;
1129
1130     case INTRINSIC_EQV:
1131       result = gfc_eqv (op1, op2);
1132       break;
1133
1134     case INTRINSIC_NEQV:
1135       result = gfc_neqv (op1, op2);
1136       break;
1137
1138     default:
1139       gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
1140     }
1141
1142   if (result == NULL)
1143     {
1144       gfc_free_expr (op1);
1145       gfc_free_expr (op2);
1146       return FAILURE;
1147     }
1148
1149   result->rank = p->rank;
1150   result->where = p->where;
1151   gfc_replace_expr (p, result);
1152
1153   return SUCCESS;
1154 }
1155
1156
1157 /* Subroutine to simplify constructor expressions.  Mutually recursive
1158    with gfc_simplify_expr().  */
1159
1160 static gfc_try
1161 simplify_constructor (gfc_constructor_base base, int type)
1162 {
1163   gfc_constructor *c;
1164   gfc_expr *p;
1165
1166   for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
1167     {
1168       if (c->iterator
1169           && (gfc_simplify_expr (c->iterator->start, type) == FAILURE
1170               || gfc_simplify_expr (c->iterator->end, type) == FAILURE
1171               || gfc_simplify_expr (c->iterator->step, type) == FAILURE))
1172         return FAILURE;
1173
1174       if (c->expr)
1175         {
1176           /* Try and simplify a copy.  Replace the original if successful
1177              but keep going through the constructor at all costs.  Not
1178              doing so can make a dog's dinner of complicated things.  */
1179           p = gfc_copy_expr (c->expr);
1180
1181           if (gfc_simplify_expr (p, type) == FAILURE)
1182             {
1183               gfc_free_expr (p);
1184               continue;
1185             }
1186
1187           gfc_replace_expr (c->expr, p);
1188         }
1189     }
1190
1191   return SUCCESS;
1192 }
1193
1194
1195 /* Pull a single array element out of an array constructor.  */
1196
1197 static gfc_try
1198 find_array_element (gfc_constructor_base base, gfc_array_ref *ar,
1199                     gfc_constructor **rval)
1200 {
1201   unsigned long nelemen;
1202   int i;
1203   mpz_t delta;
1204   mpz_t offset;
1205   mpz_t span;
1206   mpz_t tmp;
1207   gfc_constructor *cons;
1208   gfc_expr *e;
1209   gfc_try t;
1210
1211   t = SUCCESS;
1212   e = NULL;
1213
1214   mpz_init_set_ui (offset, 0);
1215   mpz_init (delta);
1216   mpz_init (tmp);
1217   mpz_init_set_ui (span, 1);
1218   for (i = 0; i < ar->dimen; i++)
1219     {
1220       if (gfc_reduce_init_expr (ar->as->lower[i]) == FAILURE
1221           || gfc_reduce_init_expr (ar->as->upper[i]) == FAILURE)
1222         {
1223           t = FAILURE;
1224           cons = NULL;
1225           goto depart;
1226         }
1227
1228       e = gfc_copy_expr (ar->start[i]);
1229       if (e->expr_type != EXPR_CONSTANT)
1230         {
1231           cons = NULL;
1232           goto depart;
1233         }
1234
1235       gcc_assert (ar->as->upper[i]->expr_type == EXPR_CONSTANT
1236                   && ar->as->lower[i]->expr_type == EXPR_CONSTANT);
1237
1238       /* Check the bounds.  */
1239       if ((ar->as->upper[i]
1240            && mpz_cmp (e->value.integer,
1241                        ar->as->upper[i]->value.integer) > 0)
1242           || (mpz_cmp (e->value.integer,
1243                        ar->as->lower[i]->value.integer) < 0))
1244         {
1245           gfc_error ("Index in dimension %d is out of bounds "
1246                      "at %L", i + 1, &ar->c_where[i]);
1247           cons = NULL;
1248           t = FAILURE;
1249           goto depart;
1250         }
1251
1252       mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer);
1253       mpz_mul (delta, delta, span);
1254       mpz_add (offset, offset, delta);
1255
1256       mpz_set_ui (tmp, 1);
1257       mpz_add (tmp, tmp, ar->as->upper[i]->value.integer);
1258       mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
1259       mpz_mul (span, span, tmp);
1260     }
1261
1262   for (cons = gfc_constructor_first (base), nelemen = mpz_get_ui (offset);
1263        cons && nelemen > 0; cons = gfc_constructor_next (cons), nelemen--)
1264     {
1265       if (cons->iterator)
1266         {
1267           cons = NULL;
1268           goto depart;
1269         }
1270     }
1271
1272 depart:
1273   mpz_clear (delta);
1274   mpz_clear (offset);
1275   mpz_clear (span);
1276   mpz_clear (tmp);
1277   if (e)
1278     gfc_free_expr (e);
1279   *rval = cons;
1280   return t;
1281 }
1282
1283
1284 /* Find a component of a structure constructor.  */
1285
1286 static gfc_constructor *
1287 find_component_ref (gfc_constructor_base base, gfc_ref *ref)
1288 {
1289   gfc_component *comp;
1290   gfc_component *pick;
1291   gfc_constructor *c = gfc_constructor_first (base);
1292
1293   comp = ref->u.c.sym->components;
1294   pick = ref->u.c.component;
1295   while (comp != pick)
1296     {
1297       comp = comp->next;
1298       c = gfc_constructor_next (c);
1299     }
1300
1301   return c;
1302 }
1303
1304
1305 /* Replace an expression with the contents of a constructor, removing
1306    the subobject reference in the process.  */
1307
1308 static void
1309 remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
1310 {
1311   gfc_expr *e;
1312
1313   if (cons)
1314     {
1315       e = cons->expr;
1316       cons->expr = NULL;
1317     }
1318   else
1319     e = gfc_copy_expr (p);
1320   e->ref = p->ref->next;
1321   p->ref->next =  NULL;
1322   gfc_replace_expr (p, e);
1323 }
1324
1325
1326 /* Pull an array section out of an array constructor.  */
1327
1328 static gfc_try
1329 find_array_section (gfc_expr *expr, gfc_ref *ref)
1330 {
1331   int idx;
1332   int rank;
1333   int d;
1334   int shape_i;
1335   long unsigned one = 1;
1336   bool incr_ctr;
1337   mpz_t start[GFC_MAX_DIMENSIONS];
1338   mpz_t end[GFC_MAX_DIMENSIONS];
1339   mpz_t stride[GFC_MAX_DIMENSIONS];
1340   mpz_t delta[GFC_MAX_DIMENSIONS];
1341   mpz_t ctr[GFC_MAX_DIMENSIONS];
1342   mpz_t delta_mpz;
1343   mpz_t tmp_mpz;
1344   mpz_t nelts;
1345   mpz_t ptr;
1346   gfc_constructor_base base;
1347   gfc_constructor *cons, *vecsub[GFC_MAX_DIMENSIONS];
1348   gfc_expr *begin;
1349   gfc_expr *finish;
1350   gfc_expr *step;
1351   gfc_expr *upper;
1352   gfc_expr *lower;
1353   gfc_try t;
1354
1355   t = SUCCESS;
1356
1357   base = expr->value.constructor;
1358   expr->value.constructor = NULL;
1359
1360   rank = ref->u.ar.as->rank;
1361
1362   if (expr->shape == NULL)
1363     expr->shape = gfc_get_shape (rank);
1364
1365   mpz_init_set_ui (delta_mpz, one);
1366   mpz_init_set_ui (nelts, one);
1367   mpz_init (tmp_mpz);
1368
1369   /* Do the initialization now, so that we can cleanup without
1370      keeping track of where we were.  */
1371   for (d = 0; d < rank; d++)
1372     {
1373       mpz_init (delta[d]);
1374       mpz_init (start[d]);
1375       mpz_init (end[d]);
1376       mpz_init (ctr[d]);
1377       mpz_init (stride[d]);
1378       vecsub[d] = NULL;
1379     }
1380
1381   /* Build the counters to clock through the array reference.  */
1382   shape_i = 0;
1383   for (d = 0; d < rank; d++)
1384     {
1385       /* Make this stretch of code easier on the eye!  */
1386       begin = ref->u.ar.start[d];
1387       finish = ref->u.ar.end[d];
1388       step = ref->u.ar.stride[d];
1389       lower = ref->u.ar.as->lower[d];
1390       upper = ref->u.ar.as->upper[d];
1391
1392       if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR)  /* Vector subscript.  */
1393         {
1394           gfc_constructor *ci;
1395           gcc_assert (begin);
1396
1397           if (begin->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (begin))
1398             {
1399               t = FAILURE;
1400               goto cleanup;
1401             }
1402
1403           gcc_assert (begin->rank == 1);
1404           /* Zero-sized arrays have no shape and no elements, stop early.  */
1405           if (!begin->shape) 
1406             {
1407               mpz_init_set_ui (nelts, 0);
1408               break;
1409             }
1410
1411           vecsub[d] = gfc_constructor_first (begin->value.constructor);
1412           mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1413           mpz_mul (nelts, nelts, begin->shape[0]);
1414           mpz_set (expr->shape[shape_i++], begin->shape[0]);
1415
1416           /* Check bounds.  */
1417           for (ci = vecsub[d]; ci; ci = gfc_constructor_next (ci))
1418             {
1419               if (mpz_cmp (ci->expr->value.integer, upper->value.integer) > 0
1420                   || mpz_cmp (ci->expr->value.integer,
1421                               lower->value.integer) < 0)
1422                 {
1423                   gfc_error ("index in dimension %d is out of bounds "
1424                              "at %L", d + 1, &ref->u.ar.c_where[d]);
1425                   t = FAILURE;
1426                   goto cleanup;
1427                 }
1428             }
1429         }
1430       else
1431         {
1432           if ((begin && begin->expr_type != EXPR_CONSTANT)
1433               || (finish && finish->expr_type != EXPR_CONSTANT)
1434               || (step && step->expr_type != EXPR_CONSTANT))
1435             {
1436               t = FAILURE;
1437               goto cleanup;
1438             }
1439
1440           /* Obtain the stride.  */
1441           if (step)
1442             mpz_set (stride[d], step->value.integer);
1443           else
1444             mpz_set_ui (stride[d], one);
1445
1446           if (mpz_cmp_ui (stride[d], 0) == 0)
1447             mpz_set_ui (stride[d], one);
1448
1449           /* Obtain the start value for the index.  */
1450           if (begin)
1451             mpz_set (start[d], begin->value.integer);
1452           else
1453             mpz_set (start[d], lower->value.integer);
1454
1455           mpz_set (ctr[d], start[d]);
1456
1457           /* Obtain the end value for the index.  */
1458           if (finish)
1459             mpz_set (end[d], finish->value.integer);
1460           else
1461             mpz_set (end[d], upper->value.integer);
1462
1463           /* Separate 'if' because elements sometimes arrive with
1464              non-null end.  */
1465           if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1466             mpz_set (end [d], begin->value.integer);
1467
1468           /* Check the bounds.  */
1469           if (mpz_cmp (ctr[d], upper->value.integer) > 0
1470               || mpz_cmp (end[d], upper->value.integer) > 0
1471               || mpz_cmp (ctr[d], lower->value.integer) < 0
1472               || mpz_cmp (end[d], lower->value.integer) < 0)
1473             {
1474               gfc_error ("index in dimension %d is out of bounds "
1475                          "at %L", d + 1, &ref->u.ar.c_where[d]);
1476               t = FAILURE;
1477               goto cleanup;
1478             }
1479
1480           /* Calculate the number of elements and the shape.  */
1481           mpz_set (tmp_mpz, stride[d]);
1482           mpz_add (tmp_mpz, end[d], tmp_mpz);
1483           mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1484           mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1485           mpz_mul (nelts, nelts, tmp_mpz);
1486
1487           /* An element reference reduces the rank of the expression; don't
1488              add anything to the shape array.  */
1489           if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT) 
1490             mpz_set (expr->shape[shape_i++], tmp_mpz);
1491         }
1492
1493       /* Calculate the 'stride' (=delta) for conversion of the
1494          counter values into the index along the constructor.  */
1495       mpz_set (delta[d], delta_mpz);
1496       mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1497       mpz_add_ui (tmp_mpz, tmp_mpz, one);
1498       mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1499     }
1500
1501   mpz_init (ptr);
1502   cons = gfc_constructor_first (base);
1503
1504   /* Now clock through the array reference, calculating the index in
1505      the source constructor and transferring the elements to the new
1506      constructor.  */  
1507   for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
1508     {
1509       if (ref->u.ar.offset)
1510         mpz_set (ptr, ref->u.ar.offset->value.integer);
1511       else
1512         mpz_init_set_ui (ptr, 0);
1513
1514       incr_ctr = true;
1515       for (d = 0; d < rank; d++)
1516         {
1517           mpz_set (tmp_mpz, ctr[d]);
1518           mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
1519           mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1520           mpz_add (ptr, ptr, tmp_mpz);
1521
1522           if (!incr_ctr) continue;
1523
1524           if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript.  */
1525             {
1526               gcc_assert(vecsub[d]);
1527
1528               if (!gfc_constructor_next (vecsub[d]))
1529                 vecsub[d] = gfc_constructor_first (ref->u.ar.start[d]->value.constructor);
1530               else
1531                 {
1532                   vecsub[d] = gfc_constructor_next (vecsub[d]);
1533                   incr_ctr = false;
1534                 }
1535               mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1536             }
1537           else
1538             {
1539               mpz_add (ctr[d], ctr[d], stride[d]); 
1540
1541               if (mpz_cmp_ui (stride[d], 0) > 0
1542                   ? mpz_cmp (ctr[d], end[d]) > 0
1543                   : mpz_cmp (ctr[d], end[d]) < 0)
1544                 mpz_set (ctr[d], start[d]);
1545               else
1546                 incr_ctr = false;
1547             }
1548         }
1549
1550       cons = gfc_constructor_lookup (base, mpz_get_ui (ptr));
1551       gcc_assert (cons);
1552       gfc_constructor_append_expr (&expr->value.constructor,
1553                                    gfc_copy_expr (cons->expr), NULL);
1554     }
1555
1556   mpz_clear (ptr);
1557
1558 cleanup:
1559
1560   mpz_clear (delta_mpz);
1561   mpz_clear (tmp_mpz);
1562   mpz_clear (nelts);
1563   for (d = 0; d < rank; d++)
1564     {
1565       mpz_clear (delta[d]);
1566       mpz_clear (start[d]);
1567       mpz_clear (end[d]);
1568       mpz_clear (ctr[d]);
1569       mpz_clear (stride[d]);
1570     }
1571   gfc_constructor_free (base);
1572   return t;
1573 }
1574
1575 /* Pull a substring out of an expression.  */
1576
1577 static gfc_try
1578 find_substring_ref (gfc_expr *p, gfc_expr **newp)
1579 {
1580   int end;
1581   int start;
1582   int length;
1583   gfc_char_t *chr;
1584
1585   if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1586       || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1587     return FAILURE;
1588
1589   *newp = gfc_copy_expr (p);
1590   gfc_free ((*newp)->value.character.string);
1591
1592   end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer);
1593   start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer);
1594   length = end - start + 1;
1595
1596   chr = (*newp)->value.character.string = gfc_get_wide_string (length + 1);
1597   (*newp)->value.character.length = length;
1598   memcpy (chr, &p->value.character.string[start - 1],
1599           length * sizeof (gfc_char_t));
1600   chr[length] = '\0';
1601   return SUCCESS;
1602 }
1603
1604
1605
1606 /* Simplify a subobject reference of a constructor.  This occurs when
1607    parameter variable values are substituted.  */
1608
1609 static gfc_try
1610 simplify_const_ref (gfc_expr *p)
1611 {
1612   gfc_constructor *cons, *c;
1613   gfc_expr *newp;
1614   gfc_ref *last_ref;
1615
1616   while (p->ref)
1617     {
1618       switch (p->ref->type)
1619         {
1620         case REF_ARRAY:
1621           switch (p->ref->u.ar.type)
1622             {
1623             case AR_ELEMENT:
1624               /* <type/kind spec>, parameter :: x(<int>) = scalar_expr
1625                  will generate this.  */
1626               if (p->expr_type != EXPR_ARRAY)
1627                 {
1628                   remove_subobject_ref (p, NULL);
1629                   break;
1630                 }
1631               if (find_array_element (p->value.constructor, &p->ref->u.ar,
1632                                       &cons) == FAILURE)
1633                 return FAILURE;
1634
1635               if (!cons)
1636                 return SUCCESS;
1637
1638               remove_subobject_ref (p, cons);
1639               break;
1640
1641             case AR_SECTION:
1642               if (find_array_section (p, p->ref) == FAILURE)
1643                 return FAILURE;
1644               p->ref->u.ar.type = AR_FULL;
1645
1646             /* Fall through.  */
1647
1648             case AR_FULL:
1649               if (p->ref->next != NULL
1650                   && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
1651                 {
1652                   for (c = gfc_constructor_first (p->value.constructor);
1653                        c; c = gfc_constructor_next (c))
1654                     {
1655                       c->expr->ref = gfc_copy_ref (p->ref->next);
1656                       if (simplify_const_ref (c->expr) == FAILURE)
1657                         return FAILURE;
1658                     }
1659
1660                   if (p->ts.type == BT_DERIVED
1661                         && p->ref->next
1662                         && (c = gfc_constructor_first (p->value.constructor)))
1663                     {
1664                       /* There may have been component references.  */
1665                       p->ts = c->expr->ts;
1666                     }
1667
1668                   last_ref = p->ref;
1669                   for (; last_ref->next; last_ref = last_ref->next) {};
1670
1671                   if (p->ts.type == BT_CHARACTER
1672                         && last_ref->type == REF_SUBSTRING)
1673                     {
1674                       /* If this is a CHARACTER array and we possibly took
1675                          a substring out of it, update the type-spec's
1676                          character length according to the first element
1677                          (as all should have the same length).  */
1678                       int string_len;
1679                       if ((c = gfc_constructor_first (p->value.constructor)))
1680                         {
1681                           const gfc_expr* first = c->expr;
1682                           gcc_assert (first->expr_type == EXPR_CONSTANT);
1683                           gcc_assert (first->ts.type == BT_CHARACTER);
1684                           string_len = first->value.character.length;
1685                         }
1686                       else
1687                         string_len = 0;
1688
1689                       if (!p->ts.u.cl)
1690                         p->ts.u.cl = gfc_new_charlen (p->symtree->n.sym->ns,
1691                                                       NULL);
1692                       else
1693                         gfc_free_expr (p->ts.u.cl->length);
1694
1695                       p->ts.u.cl->length
1696                         = gfc_get_int_expr (gfc_default_integer_kind,
1697                                             NULL, string_len);
1698                     }
1699                 }
1700               gfc_free_ref_list (p->ref);
1701               p->ref = NULL;
1702               break;
1703
1704             default:
1705               return SUCCESS;
1706             }
1707
1708           break;
1709
1710         case REF_COMPONENT:
1711           cons = find_component_ref (p->value.constructor, p->ref);
1712           remove_subobject_ref (p, cons);
1713           break;
1714
1715         case REF_SUBSTRING:
1716           if (find_substring_ref (p, &newp) == FAILURE)
1717             return FAILURE;
1718
1719           gfc_replace_expr (p, newp);
1720           gfc_free_ref_list (p->ref);
1721           p->ref = NULL;
1722           break;
1723         }
1724     }
1725
1726   return SUCCESS;
1727 }
1728
1729
1730 /* Simplify a chain of references.  */
1731
1732 static gfc_try
1733 simplify_ref_chain (gfc_ref *ref, int type)
1734 {
1735   int n;
1736
1737   for (; ref; ref = ref->next)
1738     {
1739       switch (ref->type)
1740         {
1741         case REF_ARRAY:
1742           for (n = 0; n < ref->u.ar.dimen; n++)
1743             {
1744               if (gfc_simplify_expr (ref->u.ar.start[n], type) == FAILURE)
1745                 return FAILURE;
1746               if (gfc_simplify_expr (ref->u.ar.end[n], type) == FAILURE)
1747                 return FAILURE;
1748               if (gfc_simplify_expr (ref->u.ar.stride[n], type) == FAILURE)
1749                 return FAILURE;
1750             }
1751           break;
1752
1753         case REF_SUBSTRING:
1754           if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1755             return FAILURE;
1756           if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1757             return FAILURE;
1758           break;
1759
1760         default:
1761           break;
1762         }
1763     }
1764   return SUCCESS;
1765 }
1766
1767
1768 /* Try to substitute the value of a parameter variable.  */
1769
1770 static gfc_try
1771 simplify_parameter_variable (gfc_expr *p, int type)
1772 {
1773   gfc_expr *e;
1774   gfc_try t;
1775
1776   e = gfc_copy_expr (p->symtree->n.sym->value);
1777   if (e == NULL)
1778     return FAILURE;
1779
1780   e->rank = p->rank;
1781
1782   /* Do not copy subobject refs for constant.  */
1783   if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1784     e->ref = gfc_copy_ref (p->ref);
1785   t = gfc_simplify_expr (e, type);
1786
1787   /* Only use the simplification if it eliminated all subobject references.  */
1788   if (t == SUCCESS && !e->ref)
1789     gfc_replace_expr (p, e);
1790   else
1791     gfc_free_expr (e);
1792
1793   return t;
1794 }
1795
1796 /* Given an expression, simplify it by collapsing constant
1797    expressions.  Most simplification takes place when the expression
1798    tree is being constructed.  If an intrinsic function is simplified
1799    at some point, we get called again to collapse the result against
1800    other constants.
1801
1802    We work by recursively simplifying expression nodes, simplifying
1803    intrinsic functions where possible, which can lead to further
1804    constant collapsing.  If an operator has constant operand(s), we
1805    rip the expression apart, and rebuild it, hoping that it becomes
1806    something simpler.
1807
1808    The expression type is defined for:
1809      0   Basic expression parsing
1810      1   Simplifying array constructors -- will substitute
1811          iterator values.
1812    Returns FAILURE on error, SUCCESS otherwise.
1813    NOTE: Will return SUCCESS even if the expression can not be simplified.  */
1814
1815 gfc_try
1816 gfc_simplify_expr (gfc_expr *p, int type)
1817 {
1818   gfc_actual_arglist *ap;
1819
1820   if (p == NULL)
1821     return SUCCESS;
1822
1823   switch (p->expr_type)
1824     {
1825     case EXPR_CONSTANT:
1826     case EXPR_NULL:
1827       break;
1828
1829     case EXPR_FUNCTION:
1830       for (ap = p->value.function.actual; ap; ap = ap->next)
1831         if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1832           return FAILURE;
1833
1834       if (p->value.function.isym != NULL
1835           && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1836         return FAILURE;
1837
1838       break;
1839
1840     case EXPR_SUBSTRING:
1841       if (simplify_ref_chain (p->ref, type) == FAILURE)
1842         return FAILURE;
1843
1844       if (gfc_is_constant_expr (p))
1845         {
1846           gfc_char_t *s;
1847           int start, end;
1848
1849           start = 0;
1850           if (p->ref && p->ref->u.ss.start)
1851             {
1852               gfc_extract_int (p->ref->u.ss.start, &start);
1853               start--;  /* Convert from one-based to zero-based.  */
1854             }
1855
1856           end = p->value.character.length;
1857           if (p->ref && p->ref->u.ss.end)
1858             gfc_extract_int (p->ref->u.ss.end, &end);
1859
1860           s = gfc_get_wide_string (end - start + 2);
1861           memcpy (s, p->value.character.string + start,
1862                   (end - start) * sizeof (gfc_char_t));
1863           s[end - start + 1] = '\0';  /* TODO: C-style string.  */
1864           gfc_free (p->value.character.string);
1865           p->value.character.string = s;
1866           p->value.character.length = end - start;
1867           p->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1868           p->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
1869                                                  NULL,
1870                                                  p->value.character.length);
1871           gfc_free_ref_list (p->ref);
1872           p->ref = NULL;
1873           p->expr_type = EXPR_CONSTANT;
1874         }
1875       break;
1876
1877     case EXPR_OP:
1878       if (simplify_intrinsic_op (p, type) == FAILURE)
1879         return FAILURE;
1880       break;
1881
1882     case EXPR_VARIABLE:
1883       /* Only substitute array parameter variables if we are in an
1884          initialization expression, or we want a subsection.  */
1885       if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1886           && (gfc_init_expr || p->ref
1887               || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1888         {
1889           if (simplify_parameter_variable (p, type) == FAILURE)
1890             return FAILURE;
1891           break;
1892         }
1893
1894       if (type == 1)
1895         {
1896           gfc_simplify_iterator_var (p);
1897         }
1898
1899       /* Simplify subcomponent references.  */
1900       if (simplify_ref_chain (p->ref, type) == FAILURE)
1901         return FAILURE;
1902
1903       break;
1904
1905     case EXPR_STRUCTURE:
1906     case EXPR_ARRAY:
1907       if (simplify_ref_chain (p->ref, type) == FAILURE)
1908         return FAILURE;
1909
1910       if (simplify_constructor (p->value.constructor, type) == FAILURE)
1911         return FAILURE;
1912
1913       if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1914           && p->ref->u.ar.type == AR_FULL)
1915           gfc_expand_constructor (p);
1916
1917       if (simplify_const_ref (p) == FAILURE)
1918         return FAILURE;
1919
1920       break;
1921
1922     case EXPR_COMPCALL:
1923     case EXPR_PPC:
1924       gcc_unreachable ();
1925       break;
1926     }
1927
1928   return SUCCESS;
1929 }
1930
1931
1932 /* Returns the type of an expression with the exception that iterator
1933    variables are automatically integers no matter what else they may
1934    be declared as.  */
1935
1936 static bt
1937 et0 (gfc_expr *e)
1938 {
1939   if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1940     return BT_INTEGER;
1941
1942   return e->ts.type;
1943 }
1944
1945
1946 /* Check an intrinsic arithmetic operation to see if it is consistent
1947    with some type of expression.  */
1948
1949 static gfc_try check_init_expr (gfc_expr *);
1950
1951
1952 /* Scalarize an expression for an elemental intrinsic call.  */
1953
1954 static gfc_try
1955 scalarize_intrinsic_call (gfc_expr *e)
1956 {
1957   gfc_actual_arglist *a, *b;
1958   gfc_constructor_base ctor;
1959   gfc_constructor *args[5];
1960   gfc_constructor *ci, *new_ctor;
1961   gfc_expr *expr, *old;
1962   int n, i, rank[5], array_arg;
1963   
1964   /* Find which, if any, arguments are arrays.  Assume that the old
1965      expression carries the type information and that the first arg
1966      that is an array expression carries all the shape information.*/
1967   n = array_arg = 0;
1968   a = e->value.function.actual;
1969   for (; a; a = a->next)
1970     {
1971       n++;
1972       if (a->expr->expr_type != EXPR_ARRAY)
1973         continue;
1974       array_arg = n;
1975       expr = gfc_copy_expr (a->expr);
1976       break;
1977     }
1978
1979   if (!array_arg)
1980     return FAILURE;
1981
1982   old = gfc_copy_expr (e);
1983
1984   gfc_constructor_free (expr->value.constructor);
1985   expr->value.constructor = NULL;
1986   expr->ts = old->ts;
1987   expr->where = old->where;
1988   expr->expr_type = EXPR_ARRAY;
1989
1990   /* Copy the array argument constructors into an array, with nulls
1991      for the scalars.  */
1992   n = 0;
1993   a = old->value.function.actual;
1994   for (; a; a = a->next)
1995     {
1996       /* Check that this is OK for an initialization expression.  */
1997       if (a->expr && check_init_expr (a->expr) == FAILURE)
1998         goto cleanup;
1999
2000       rank[n] = 0;
2001       if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
2002         {
2003           rank[n] = a->expr->rank;
2004           ctor = a->expr->symtree->n.sym->value->value.constructor;
2005           args[n] = gfc_constructor_first (ctor);
2006         }
2007       else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
2008         {
2009           if (a->expr->rank)
2010             rank[n] = a->expr->rank;
2011           else
2012             rank[n] = 1;
2013           ctor = gfc_constructor_copy (a->expr->value.constructor);
2014           args[n] = gfc_constructor_first (ctor);
2015         }
2016       else
2017         args[n] = NULL;
2018
2019       n++;
2020     }
2021
2022
2023   /* Using the array argument as the master, step through the array
2024      calling the function for each element and advancing the array
2025      constructors together.  */
2026   for (ci = args[array_arg - 1]; ci; ci = gfc_constructor_next (ci))
2027     {
2028       new_ctor = gfc_constructor_append_expr (&expr->value.constructor,
2029                                               gfc_copy_expr (old), NULL);
2030
2031       gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
2032       a = NULL;
2033       b = old->value.function.actual;
2034       for (i = 0; i < n; i++)
2035         {
2036           if (a == NULL)
2037             new_ctor->expr->value.function.actual
2038                         = a = gfc_get_actual_arglist ();
2039           else
2040             {
2041               a->next = gfc_get_actual_arglist ();
2042               a = a->next;
2043             }
2044
2045           if (args[i])
2046             a->expr = gfc_copy_expr (args[i]->expr);
2047           else
2048             a->expr = gfc_copy_expr (b->expr);
2049
2050           b = b->next;
2051         }
2052
2053       /* Simplify the function calls.  If the simplification fails, the
2054          error will be flagged up down-stream or the library will deal
2055          with it.  */
2056       gfc_simplify_expr (new_ctor->expr, 0);
2057
2058       for (i = 0; i < n; i++)
2059         if (args[i])
2060           args[i] = gfc_constructor_next (args[i]);
2061
2062       for (i = 1; i < n; i++)
2063         if (rank[i] && ((args[i] != NULL && args[array_arg - 1] == NULL)
2064                         || (args[i] == NULL && args[array_arg - 1] != NULL)))
2065           goto compliance;
2066     }
2067
2068   free_expr0 (e);
2069   *e = *expr;
2070   gfc_free_expr (old);
2071   return SUCCESS;
2072
2073 compliance:
2074   gfc_error_now ("elemental function arguments at %C are not compliant");
2075
2076 cleanup:
2077   gfc_free_expr (expr);
2078   gfc_free_expr (old);
2079   return FAILURE;
2080 }
2081
2082
2083 static gfc_try
2084 check_intrinsic_op (gfc_expr *e, gfc_try (*check_function) (gfc_expr *))
2085 {
2086   gfc_expr *op1 = e->value.op.op1;
2087   gfc_expr *op2 = e->value.op.op2;
2088
2089   if ((*check_function) (op1) == FAILURE)
2090     return FAILURE;
2091
2092   switch (e->value.op.op)
2093     {
2094     case INTRINSIC_UPLUS:
2095     case INTRINSIC_UMINUS:
2096       if (!numeric_type (et0 (op1)))
2097         goto not_numeric;
2098       break;
2099
2100     case INTRINSIC_EQ:
2101     case INTRINSIC_EQ_OS:
2102     case INTRINSIC_NE:
2103     case INTRINSIC_NE_OS:
2104     case INTRINSIC_GT:
2105     case INTRINSIC_GT_OS:
2106     case INTRINSIC_GE:
2107     case INTRINSIC_GE_OS:
2108     case INTRINSIC_LT:
2109     case INTRINSIC_LT_OS:
2110     case INTRINSIC_LE:
2111     case INTRINSIC_LE_OS:
2112       if ((*check_function) (op2) == FAILURE)
2113         return FAILURE;
2114       
2115       if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
2116           && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
2117         {
2118           gfc_error ("Numeric or CHARACTER operands are required in "
2119                      "expression at %L", &e->where);
2120          return FAILURE;
2121         }
2122       break;
2123
2124     case INTRINSIC_PLUS:
2125     case INTRINSIC_MINUS:
2126     case INTRINSIC_TIMES:
2127     case INTRINSIC_DIVIDE:
2128     case INTRINSIC_POWER:
2129       if ((*check_function) (op2) == FAILURE)
2130         return FAILURE;
2131
2132       if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
2133         goto not_numeric;
2134
2135       break;
2136
2137     case INTRINSIC_CONCAT:
2138       if ((*check_function) (op2) == FAILURE)
2139         return FAILURE;
2140
2141       if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
2142         {
2143           gfc_error ("Concatenation operator in expression at %L "
2144                      "must have two CHARACTER operands", &op1->where);
2145           return FAILURE;
2146         }
2147
2148       if (op1->ts.kind != op2->ts.kind)
2149         {
2150           gfc_error ("Concat operator at %L must concatenate strings of the "
2151                      "same kind", &e->where);
2152           return FAILURE;
2153         }
2154
2155       break;
2156
2157     case INTRINSIC_NOT:
2158       if (et0 (op1) != BT_LOGICAL)
2159         {
2160           gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
2161                      "operand", &op1->where);
2162           return FAILURE;
2163         }
2164
2165       break;
2166
2167     case INTRINSIC_AND:
2168     case INTRINSIC_OR:
2169     case INTRINSIC_EQV:
2170     case INTRINSIC_NEQV:
2171       if ((*check_function) (op2) == FAILURE)
2172         return FAILURE;
2173
2174       if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
2175         {
2176           gfc_error ("LOGICAL operands are required in expression at %L",
2177                      &e->where);
2178           return FAILURE;
2179         }
2180
2181       break;
2182
2183     case INTRINSIC_PARENTHESES:
2184       break;
2185
2186     default:
2187       gfc_error ("Only intrinsic operators can be used in expression at %L",
2188                  &e->where);
2189       return FAILURE;
2190     }
2191
2192   return SUCCESS;
2193
2194 not_numeric:
2195   gfc_error ("Numeric operands are required in expression at %L", &e->where);
2196
2197   return FAILURE;
2198 }
2199
2200 /* F2003, 7.1.7 (3): In init expression, allocatable components
2201    must not be data-initialized.  */
2202 static gfc_try
2203 check_alloc_comp_init (gfc_expr *e)
2204 {
2205   gfc_component *comp;
2206   gfc_constructor *ctor;
2207
2208   gcc_assert (e->expr_type == EXPR_STRUCTURE);
2209   gcc_assert (e->ts.type == BT_DERIVED);
2210
2211   for (comp = e->ts.u.derived->components,
2212        ctor = gfc_constructor_first (e->value.constructor);
2213        comp; comp = comp->next, ctor = gfc_constructor_next (ctor))
2214     {
2215       if (comp->attr.allocatable
2216           && ctor->expr->expr_type != EXPR_NULL)
2217         {
2218           gfc_error("Invalid initialization expression for ALLOCATABLE "
2219                     "component '%s' in structure constructor at %L",
2220                     comp->name, &ctor->expr->where);
2221           return FAILURE;
2222         }
2223     }
2224
2225   return SUCCESS;
2226 }
2227
2228 static match
2229 check_init_expr_arguments (gfc_expr *e)
2230 {
2231   gfc_actual_arglist *ap;
2232
2233   for (ap = e->value.function.actual; ap; ap = ap->next)
2234     if (check_init_expr (ap->expr) == FAILURE)
2235       return MATCH_ERROR;
2236
2237   return MATCH_YES;
2238 }
2239
2240 static gfc_try check_restricted (gfc_expr *);
2241
2242 /* F95, 7.1.6.1, Initialization expressions, (7)
2243    F2003, 7.1.7 Initialization expression, (8)  */
2244
2245 static match
2246 check_inquiry (gfc_expr *e, int not_restricted)
2247 {
2248   const char *name;
2249   const char *const *functions;
2250
2251   static const char *const inquiry_func_f95[] = {
2252     "lbound", "shape", "size", "ubound",
2253     "bit_size", "len", "kind",
2254     "digits", "epsilon", "huge", "maxexponent", "minexponent",
2255     "precision", "radix", "range", "tiny",
2256     NULL
2257   };
2258
2259   static const char *const inquiry_func_f2003[] = {
2260     "lbound", "shape", "size", "ubound",
2261     "bit_size", "len", "kind",
2262     "digits", "epsilon", "huge", "maxexponent", "minexponent",
2263     "precision", "radix", "range", "tiny",
2264     "new_line", NULL
2265   };
2266
2267   int i;
2268   gfc_actual_arglist *ap;
2269
2270   if (!e->value.function.isym
2271       || !e->value.function.isym->inquiry)
2272     return MATCH_NO;
2273
2274   /* An undeclared parameter will get us here (PR25018).  */
2275   if (e->symtree == NULL)
2276     return MATCH_NO;
2277
2278   name = e->symtree->n.sym->name;
2279
2280   functions = (gfc_option.warn_std & GFC_STD_F2003) 
2281                 ? inquiry_func_f2003 : inquiry_func_f95;
2282
2283   for (i = 0; functions[i]; i++)
2284     if (strcmp (functions[i], name) == 0)
2285       break;
2286
2287   if (functions[i] == NULL)
2288     return MATCH_ERROR;
2289
2290   /* At this point we have an inquiry function with a variable argument.  The
2291      type of the variable might be undefined, but we need it now, because the
2292      arguments of these functions are not allowed to be undefined.  */
2293
2294   for (ap = e->value.function.actual; ap; ap = ap->next)
2295     {
2296       if (!ap->expr)
2297         continue;
2298
2299       if (ap->expr->ts.type == BT_UNKNOWN)
2300         {
2301           if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
2302               && gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns)
2303               == FAILURE)
2304             return MATCH_NO;
2305
2306           ap->expr->ts = ap->expr->symtree->n.sym->ts;
2307         }
2308
2309         /* Assumed character length will not reduce to a constant expression
2310            with LEN, as required by the standard.  */
2311         if (i == 5 && not_restricted
2312             && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
2313             && ap->expr->symtree->n.sym->ts.u.cl->length == NULL)
2314           {
2315             gfc_error ("Assumed character length variable '%s' in constant "
2316                        "expression at %L", e->symtree->n.sym->name, &e->where);
2317               return MATCH_ERROR;
2318           }
2319         else if (not_restricted && check_init_expr (ap->expr) == FAILURE)
2320           return MATCH_ERROR;
2321
2322         if (not_restricted == 0
2323               && ap->expr->expr_type != EXPR_VARIABLE
2324               && check_restricted (ap->expr) == FAILURE)
2325           return MATCH_ERROR;
2326     }
2327
2328   return MATCH_YES;
2329 }
2330
2331
2332 /* F95, 7.1.6.1, Initialization expressions, (5)
2333    F2003, 7.1.7 Initialization expression, (5)  */
2334
2335 static match
2336 check_transformational (gfc_expr *e)
2337 {
2338   static const char * const trans_func_f95[] = {
2339     "repeat", "reshape", "selected_int_kind",
2340     "selected_real_kind", "transfer", "trim", NULL
2341   };
2342
2343   static const char * const trans_func_f2003[] =  {
2344     "all", "any", "count", "dot_product", "matmul", "null", "pack",
2345     "product", "repeat", "reshape", "selected_char_kind", "selected_int_kind",
2346     "selected_real_kind", "spread", "sum", "transfer", "transpose",
2347     "trim", "unpack", NULL
2348   };
2349
2350   int i;
2351   const char *name;
2352   const char *const *functions;
2353
2354   if (!e->value.function.isym
2355       || !e->value.function.isym->transformational)
2356     return MATCH_NO;
2357
2358   name = e->symtree->n.sym->name;
2359
2360   functions = (gfc_option.allow_std & GFC_STD_F2003) 
2361                 ? trans_func_f2003 : trans_func_f95;
2362
2363   /* NULL() is dealt with below.  */
2364   if (strcmp ("null", name) == 0)
2365     return MATCH_NO;
2366
2367   for (i = 0; functions[i]; i++)
2368     if (strcmp (functions[i], name) == 0)
2369        break;
2370
2371   if (functions[i] == NULL)
2372     {
2373       gfc_error("transformational intrinsic '%s' at %L is not permitted "
2374                 "in an initialization expression", name, &e->where);
2375       return MATCH_ERROR;
2376     }
2377
2378   return check_init_expr_arguments (e);
2379 }
2380
2381
2382 /* F95, 7.1.6.1, Initialization expressions, (6)
2383    F2003, 7.1.7 Initialization expression, (6)  */
2384
2385 static match
2386 check_null (gfc_expr *e)
2387 {
2388   if (strcmp ("null", e->symtree->n.sym->name) != 0)
2389     return MATCH_NO;
2390
2391   return check_init_expr_arguments (e);
2392 }
2393
2394
2395 static match
2396 check_elemental (gfc_expr *e)
2397 {
2398   if (!e->value.function.isym
2399       || !e->value.function.isym->elemental)
2400     return MATCH_NO;
2401
2402   if (e->ts.type != BT_INTEGER
2403       && e->ts.type != BT_CHARACTER
2404       && gfc_notify_std (GFC_STD_F2003, "Extension: Evaluation of "
2405                         "nonstandard initialization expression at %L",
2406                         &e->where) == FAILURE)
2407     return MATCH_ERROR;
2408
2409   return check_init_expr_arguments (e);
2410 }
2411
2412
2413 static match
2414 check_conversion (gfc_expr *e)
2415 {
2416   if (!e->value.function.isym
2417       || !e->value.function.isym->conversion)
2418     return MATCH_NO;
2419
2420   return check_init_expr_arguments (e);
2421 }
2422
2423
2424 /* Verify that an expression is an initialization expression.  A side
2425    effect is that the expression tree is reduced to a single constant
2426    node if all goes well.  This would normally happen when the
2427    expression is constructed but function references are assumed to be
2428    intrinsics in the context of initialization expressions.  If
2429    FAILURE is returned an error message has been generated.  */
2430
2431 static gfc_try
2432 check_init_expr (gfc_expr *e)
2433 {
2434   match m;
2435   gfc_try t;
2436
2437   if (e == NULL)
2438     return SUCCESS;
2439
2440   switch (e->expr_type)
2441     {
2442     case EXPR_OP:
2443       t = check_intrinsic_op (e, check_init_expr);
2444       if (t == SUCCESS)
2445         t = gfc_simplify_expr (e, 0);
2446
2447       break;
2448
2449     case EXPR_FUNCTION:
2450       t = FAILURE;
2451
2452       {
2453         gfc_intrinsic_sym* isym;
2454         gfc_symbol* sym;
2455
2456         sym = e->symtree->n.sym;
2457         if (!gfc_is_intrinsic (sym, 0, e->where)
2458             || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES)
2459           {
2460             gfc_error ("Function '%s' in initialization expression at %L "
2461                        "must be an intrinsic function",
2462                        e->symtree->n.sym->name, &e->where);
2463             break;
2464           }
2465
2466         if ((m = check_conversion (e)) == MATCH_NO
2467             && (m = check_inquiry (e, 1)) == MATCH_NO
2468             && (m = check_null (e)) == MATCH_NO
2469             && (m = check_transformational (e)) == MATCH_NO
2470             && (m = check_elemental (e)) == MATCH_NO)
2471           {
2472             gfc_error ("Intrinsic function '%s' at %L is not permitted "
2473                        "in an initialization expression",
2474                        e->symtree->n.sym->name, &e->where);
2475             m = MATCH_ERROR;
2476           }
2477
2478         /* Try to scalarize an elemental intrinsic function that has an
2479            array argument.  */
2480         isym = gfc_find_function (e->symtree->n.sym->name);
2481         if (isym && isym->elemental
2482             && (t = scalarize_intrinsic_call (e)) == SUCCESS)
2483           break;
2484       }
2485
2486       if (m == MATCH_YES)
2487         t = gfc_simplify_expr (e, 0);
2488
2489       break;
2490
2491     case EXPR_VARIABLE:
2492       t = SUCCESS;
2493
2494       if (gfc_check_iter_variable (e) == SUCCESS)
2495         break;
2496
2497       if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2498         {
2499           /* A PARAMETER shall not be used to define itself, i.e.
2500                 REAL, PARAMETER :: x = transfer(0, x)
2501              is invalid.  */
2502           if (!e->symtree->n.sym->value)
2503             {
2504               gfc_error("PARAMETER '%s' is used at %L before its definition "
2505                         "is complete", e->symtree->n.sym->name, &e->where);
2506               t = FAILURE;
2507             }
2508           else
2509             t = simplify_parameter_variable (e, 0);
2510
2511           break;
2512         }
2513
2514       if (gfc_in_match_data ())
2515         break;
2516
2517       t = FAILURE;
2518
2519       if (e->symtree->n.sym->as)
2520         {
2521           switch (e->symtree->n.sym->as->type)
2522             {
2523               case AS_ASSUMED_SIZE:
2524                 gfc_error ("Assumed size array '%s' at %L is not permitted "
2525                            "in an initialization expression",
2526                            e->symtree->n.sym->name, &e->where);
2527                 break;
2528
2529               case AS_ASSUMED_SHAPE:
2530                 gfc_error ("Assumed shape array '%s' at %L is not permitted "
2531                            "in an initialization expression",
2532                            e->symtree->n.sym->name, &e->where);
2533                 break;
2534
2535               case AS_DEFERRED:
2536                 gfc_error ("Deferred array '%s' at %L is not permitted "
2537                            "in an initialization expression",
2538                            e->symtree->n.sym->name, &e->where);
2539                 break;
2540
2541               case AS_EXPLICIT:
2542                 gfc_error ("Array '%s' at %L is a variable, which does "
2543                            "not reduce to a constant expression",
2544                            e->symtree->n.sym->name, &e->where);
2545                 break;
2546
2547               default:
2548                 gcc_unreachable();
2549           }
2550         }
2551       else
2552         gfc_error ("Parameter '%s' at %L has not been declared or is "
2553                    "a variable, which does not reduce to a constant "
2554                    "expression", e->symtree->n.sym->name, &e->where);
2555
2556       break;
2557
2558     case EXPR_CONSTANT:
2559     case EXPR_NULL:
2560       t = SUCCESS;
2561       break;
2562
2563     case EXPR_SUBSTRING:
2564       t = check_init_expr (e->ref->u.ss.start);
2565       if (t == FAILURE)
2566         break;
2567
2568       t = check_init_expr (e->ref->u.ss.end);
2569       if (t == SUCCESS)
2570         t = gfc_simplify_expr (e, 0);
2571
2572       break;
2573
2574     case EXPR_STRUCTURE:
2575       t = e->ts.is_iso_c ? SUCCESS : FAILURE;
2576       if (t == SUCCESS)
2577         break;
2578
2579       t = check_alloc_comp_init (e);
2580       if (t == FAILURE)
2581         break;
2582
2583       t = gfc_check_constructor (e, check_init_expr);
2584       if (t == FAILURE)
2585         break;
2586
2587       break;
2588
2589     case EXPR_ARRAY:
2590       t = gfc_check_constructor (e, check_init_expr);
2591       if (t == FAILURE)
2592         break;
2593
2594       t = gfc_expand_constructor (e);
2595       if (t == FAILURE)
2596         break;
2597
2598       t = gfc_check_constructor_type (e);
2599       break;
2600
2601     default:
2602       gfc_internal_error ("check_init_expr(): Unknown expression type");
2603     }
2604
2605   return t;
2606 }
2607
2608 /* Reduces a general expression to an initialization expression (a constant).
2609    This used to be part of gfc_match_init_expr.
2610    Note that this function doesn't free the given expression on FAILURE.  */
2611
2612 gfc_try
2613 gfc_reduce_init_expr (gfc_expr *expr)
2614 {
2615   gfc_try t;
2616
2617   gfc_init_expr = 1;
2618   t = gfc_resolve_expr (expr);
2619   if (t == SUCCESS)
2620     t = check_init_expr (expr);
2621   gfc_init_expr = 0;
2622
2623   if (t == FAILURE)
2624     return FAILURE;
2625
2626   if (expr->expr_type == EXPR_ARRAY)
2627     {
2628       if (gfc_check_constructor_type (expr) == FAILURE)
2629         return FAILURE;
2630       if (gfc_expand_constructor (expr) == FAILURE)
2631         return FAILURE;
2632     }
2633
2634   return SUCCESS;
2635 }
2636
2637
2638 /* Match an initialization expression.  We work by first matching an
2639    expression, then reducing it to a constant.  The reducing it to 
2640    constant part requires a global variable to flag the prohibition
2641    of a non-integer exponent in -std=f95 mode.  */
2642
2643 bool init_flag = false;
2644
2645 match
2646 gfc_match_init_expr (gfc_expr **result)
2647 {
2648   gfc_expr *expr;
2649   match m;
2650   gfc_try t;
2651
2652   expr = NULL;
2653
2654   init_flag = true;
2655
2656   m = gfc_match_expr (&expr);
2657   if (m != MATCH_YES)
2658     {
2659       init_flag = false;
2660       return m;
2661     }
2662
2663   t = gfc_reduce_init_expr (expr);
2664   if (t != SUCCESS)
2665     {
2666       gfc_free_expr (expr);
2667       init_flag = false;
2668       return MATCH_ERROR;
2669     }
2670
2671   *result = expr;
2672   init_flag = false;
2673
2674   return MATCH_YES;
2675 }
2676
2677
2678 /* Given an actual argument list, test to see that each argument is a
2679    restricted expression and optionally if the expression type is
2680    integer or character.  */
2681
2682 static gfc_try
2683 restricted_args (gfc_actual_arglist *a)
2684 {
2685   for (; a; a = a->next)
2686     {
2687       if (check_restricted (a->expr) == FAILURE)
2688         return FAILURE;
2689     }
2690
2691   return SUCCESS;
2692 }
2693
2694
2695 /************* Restricted/specification expressions *************/
2696
2697
2698 /* Make sure a non-intrinsic function is a specification function.  */
2699
2700 static gfc_try
2701 external_spec_function (gfc_expr *e)
2702 {
2703   gfc_symbol *f;
2704
2705   f = e->value.function.esym;
2706
2707   if (f->attr.proc == PROC_ST_FUNCTION)
2708     {
2709       gfc_error ("Specification function '%s' at %L cannot be a statement "
2710                  "function", f->name, &e->where);
2711       return FAILURE;
2712     }
2713
2714   if (f->attr.proc == PROC_INTERNAL)
2715     {
2716       gfc_error ("Specification function '%s' at %L cannot be an internal "
2717                  "function", f->name, &e->where);
2718       return FAILURE;
2719     }
2720
2721   if (!f->attr.pure && !f->attr.elemental)
2722     {
2723       gfc_error ("Specification function '%s' at %L must be PURE", f->name,
2724                  &e->where);
2725       return FAILURE;
2726     }
2727
2728   if (f->attr.recursive)
2729     {
2730       gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
2731                  f->name, &e->where);
2732       return FAILURE;
2733     }
2734
2735   return restricted_args (e->value.function.actual);
2736 }
2737
2738
2739 /* Check to see that a function reference to an intrinsic is a
2740    restricted expression.  */
2741
2742 static gfc_try
2743 restricted_intrinsic (gfc_expr *e)
2744 {
2745   /* TODO: Check constraints on inquiry functions.  7.1.6.2 (7).  */
2746   if (check_inquiry (e, 0) == MATCH_YES)
2747     return SUCCESS;
2748
2749   return restricted_args (e->value.function.actual);
2750 }
2751
2752
2753 /* Check the expressions of an actual arglist.  Used by check_restricted.  */
2754
2755 static gfc_try
2756 check_arglist (gfc_actual_arglist* arg, gfc_try (*checker) (gfc_expr*))
2757 {
2758   for (; arg; arg = arg->next)
2759     if (checker (arg->expr) == FAILURE)
2760       return FAILURE;
2761
2762   return SUCCESS;
2763 }
2764
2765
2766 /* Check the subscription expressions of a reference chain with a checking
2767    function; used by check_restricted.  */
2768
2769 static gfc_try
2770 check_references (gfc_ref* ref, gfc_try (*checker) (gfc_expr*))
2771 {
2772   int dim;
2773
2774   if (!ref)
2775     return SUCCESS;
2776
2777   switch (ref->type)
2778     {
2779     case REF_ARRAY:
2780       for (dim = 0; dim != ref->u.ar.dimen; ++dim)
2781         {
2782           if (checker (ref->u.ar.start[dim]) == FAILURE)
2783             return FAILURE;
2784           if (checker (ref->u.ar.end[dim]) == FAILURE)
2785             return FAILURE;
2786           if (checker (ref->u.ar.stride[dim]) == FAILURE)
2787             return FAILURE;
2788         }
2789       break;
2790
2791     case REF_COMPONENT:
2792       /* Nothing needed, just proceed to next reference.  */
2793       break;
2794
2795     case REF_SUBSTRING:
2796       if (checker (ref->u.ss.start) == FAILURE)
2797         return FAILURE;
2798       if (checker (ref->u.ss.end) == FAILURE)
2799         return FAILURE;
2800       break;
2801
2802     default:
2803       gcc_unreachable ();
2804       break;
2805     }
2806
2807   return check_references (ref->next, checker);
2808 }
2809
2810
2811 /* Verify that an expression is a restricted expression.  Like its
2812    cousin check_init_expr(), an error message is generated if we
2813    return FAILURE.  */
2814
2815 static gfc_try
2816 check_restricted (gfc_expr *e)
2817 {
2818   gfc_symbol* sym;
2819   gfc_try t;
2820
2821   if (e == NULL)
2822     return SUCCESS;
2823
2824   switch (e->expr_type)
2825     {
2826     case EXPR_OP:
2827       t = check_intrinsic_op (e, check_restricted);
2828       if (t == SUCCESS)
2829         t = gfc_simplify_expr (e, 0);
2830
2831       break;
2832
2833     case EXPR_FUNCTION:
2834       if (e->value.function.esym)
2835         {
2836           t = check_arglist (e->value.function.actual, &check_restricted);
2837           if (t == SUCCESS)
2838             t = external_spec_function (e);
2839         }
2840       else
2841         {
2842           if (e->value.function.isym && e->value.function.isym->inquiry)
2843             t = SUCCESS;
2844           else
2845             t = check_arglist (e->value.function.actual, &check_restricted);
2846
2847           if (t == SUCCESS)
2848             t = restricted_intrinsic (e);
2849         }
2850       break;
2851
2852     case EXPR_VARIABLE:
2853       sym = e->symtree->n.sym;
2854       t = FAILURE;
2855
2856       /* If a dummy argument appears in a context that is valid for a
2857          restricted expression in an elemental procedure, it will have
2858          already been simplified away once we get here.  Therefore we
2859          don't need to jump through hoops to distinguish valid from
2860          invalid cases.  */
2861       if (sym->attr.dummy && sym->ns == gfc_current_ns
2862           && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
2863         {
2864           gfc_error ("Dummy argument '%s' not allowed in expression at %L",
2865                      sym->name, &e->where);
2866           break;
2867         }
2868
2869       if (sym->attr.optional)
2870         {
2871           gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2872                      sym->name, &e->where);
2873           break;
2874         }
2875
2876       if (sym->attr.intent == INTENT_OUT)
2877         {
2878           gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2879                      sym->name, &e->where);
2880           break;
2881         }
2882
2883       /* Check reference chain if any.  */
2884       if (check_references (e->ref, &check_restricted) == FAILURE)
2885         break;
2886
2887       /* gfc_is_formal_arg broadcasts that a formal argument list is being
2888          processed in resolve.c(resolve_formal_arglist).  This is done so
2889          that host associated dummy array indices are accepted (PR23446).
2890          This mechanism also does the same for the specification expressions
2891          of array-valued functions.  */
2892       if (e->error
2893             || sym->attr.in_common
2894             || sym->attr.use_assoc
2895             || sym->attr.dummy
2896             || sym->attr.implied_index
2897             || sym->attr.flavor == FL_PARAMETER
2898             || (sym->ns && sym->ns == gfc_current_ns->parent)
2899             || (sym->ns && gfc_current_ns->parent
2900                   && sym->ns == gfc_current_ns->parent->parent)
2901             || (sym->ns->proc_name != NULL
2902                   && sym->ns->proc_name->attr.flavor == FL_MODULE)
2903             || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2904         {
2905           t = SUCCESS;
2906           break;
2907         }
2908
2909       gfc_error ("Variable '%s' cannot appear in the expression at %L",
2910                  sym->name, &e->where);
2911       /* Prevent a repetition of the error.  */
2912       e->error = 1;
2913       break;
2914
2915     case EXPR_NULL:
2916     case EXPR_CONSTANT:
2917       t = SUCCESS;
2918       break;
2919
2920     case EXPR_SUBSTRING:
2921       t = gfc_specification_expr (e->ref->u.ss.start);
2922       if (t == FAILURE)
2923         break;
2924
2925       t = gfc_specification_expr (e->ref->u.ss.end);
2926       if (t == SUCCESS)
2927         t = gfc_simplify_expr (e, 0);
2928
2929       break;
2930
2931     case EXPR_STRUCTURE:
2932       t = gfc_check_constructor (e, check_restricted);
2933       break;
2934
2935     case EXPR_ARRAY:
2936       t = gfc_check_constructor (e, check_restricted);
2937       break;
2938
2939     default:
2940       gfc_internal_error ("check_restricted(): Unknown expression type");
2941     }
2942
2943   return t;
2944 }
2945
2946
2947 /* Check to see that an expression is a specification expression.  If
2948    we return FAILURE, an error has been generated.  */
2949
2950 gfc_try
2951 gfc_specification_expr (gfc_expr *e)
2952 {
2953   gfc_component *comp;
2954
2955   if (e == NULL)
2956     return SUCCESS;
2957
2958   if (e->ts.type != BT_INTEGER)
2959     {
2960       gfc_error ("Expression at %L must be of INTEGER type, found %s",
2961                  &e->where, gfc_basic_typename (e->ts.type));
2962       return FAILURE;
2963     }
2964
2965   if (e->expr_type == EXPR_FUNCTION
2966           && !e->value.function.isym
2967           && !e->value.function.esym
2968           && !gfc_pure (e->symtree->n.sym)
2969           && (!gfc_is_proc_ptr_comp (e, &comp)
2970               || !comp->attr.pure))
2971     {
2972       gfc_error ("Function '%s' at %L must be PURE",
2973                  e->symtree->n.sym->name, &e->where);
2974       /* Prevent repeat error messages.  */
2975       e->symtree->n.sym->attr.pure = 1;
2976       return FAILURE;
2977     }
2978
2979   if (e->rank != 0)
2980     {
2981       gfc_error ("Expression at %L must be scalar", &e->where);
2982       return FAILURE;
2983     }
2984
2985   if (gfc_simplify_expr (e, 0) == FAILURE)
2986     return FAILURE;
2987
2988   return check_restricted (e);
2989 }
2990
2991
2992 /************** Expression conformance checks.  *************/
2993
2994 /* Given two expressions, make sure that the arrays are conformable.  */
2995
2996 gfc_try
2997 gfc_check_conformance (gfc_expr *op1, gfc_expr *op2, const char *optype_msgid, ...)
2998 {
2999   int op1_flag, op2_flag, d;
3000   mpz_t op1_size, op2_size;
3001   gfc_try t;
3002
3003   va_list argp;
3004   char buffer[240];
3005
3006   if (op1->rank == 0 || op2->rank == 0)
3007     return SUCCESS;
3008
3009   va_start (argp, optype_msgid);
3010   vsnprintf (buffer, 240, optype_msgid, argp);
3011   va_end (argp);
3012
3013   if (op1->rank != op2->rank)
3014     {
3015       gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(buffer),
3016                  op1->rank, op2->rank, &op1->where);
3017       return FAILURE;
3018     }
3019
3020   t = SUCCESS;
3021
3022   for (d = 0; d < op1->rank; d++)
3023     {
3024       op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
3025       op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
3026
3027       if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
3028         {
3029           gfc_error ("Different shape for %s at %L on dimension %d "
3030                      "(%d and %d)", _(buffer), &op1->where, d + 1,
3031                      (int) mpz_get_si (op1_size),
3032                      (int) mpz_get_si (op2_size));
3033
3034           t = FAILURE;
3035         }
3036
3037       if (op1_flag)
3038         mpz_clear (op1_size);
3039       if (op2_flag)
3040         mpz_clear (op2_size);
3041
3042       if (t == FAILURE)
3043         return FAILURE;
3044     }
3045
3046   return SUCCESS;
3047 }
3048
3049
3050 /* Given an assignable expression and an arbitrary expression, make
3051    sure that the assignment can take place.  */
3052
3053 gfc_try
3054 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
3055 {
3056   gfc_symbol *sym;
3057   gfc_ref *ref;
3058   int has_pointer;
3059
3060   sym = lvalue->symtree->n.sym;
3061
3062   /* Check INTENT(IN), unless the object itself is the component or
3063      sub-component of a pointer.  */
3064   has_pointer = sym->attr.pointer;
3065
3066   for (ref = lvalue->ref; ref; ref = ref->next)
3067     if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
3068       {
3069         has_pointer = 1;
3070         break;
3071       }
3072
3073   if (!has_pointer && sym->attr.intent == INTENT_IN)
3074     {
3075       gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
3076                  sym->name, &lvalue->where);
3077       return FAILURE;
3078     }
3079
3080   /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
3081      variable local to a function subprogram.  Its existence begins when
3082      execution of the function is initiated and ends when execution of the
3083      function is terminated...
3084      Therefore, the left hand side is no longer a variable, when it is:  */
3085   if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
3086       && !sym->attr.external)
3087     {
3088       bool bad_proc;
3089       bad_proc = false;
3090
3091       /* (i) Use associated;  */
3092       if (sym->attr.use_assoc)
3093         bad_proc = true;
3094
3095       /* (ii) The assignment is in the main program; or  */
3096       if (gfc_current_ns->proc_name->attr.is_main_program)
3097         bad_proc = true;
3098
3099       /* (iii) A module or internal procedure...  */
3100       if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
3101            || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
3102           && gfc_current_ns->parent
3103           && (!(gfc_current_ns->parent->proc_name->attr.function
3104                 || gfc_current_ns->parent->proc_name->attr.subroutine)
3105               || gfc_current_ns->parent->proc_name->attr.is_main_program))
3106         {
3107           /* ... that is not a function...  */ 
3108           if (!gfc_current_ns->proc_name->attr.function)
3109             bad_proc = true;
3110
3111           /* ... or is not an entry and has a different name.  */
3112           if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
3113             bad_proc = true;
3114         }
3115
3116       /* (iv) Host associated and not the function symbol or the
3117               parent result.  This picks up sibling references, which
3118               cannot be entries.  */
3119       if (!sym->attr.entry
3120             && sym->ns == gfc_current_ns->parent
3121             && sym != gfc_current_ns->proc_name
3122             && sym != gfc_current_ns->parent->proc_name->result)
3123         bad_proc = true;
3124
3125       if (bad_proc)
3126         {
3127           gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
3128           return FAILURE;
3129         }
3130     }
3131
3132   if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
3133     {
3134       gfc_error ("Incompatible ranks %d and %d in assignment at %L",
3135                  lvalue->rank, rvalue->rank, &lvalue->where);
3136       return FAILURE;
3137     }
3138
3139   if (lvalue->ts.type == BT_UNKNOWN)
3140     {
3141       gfc_error ("Variable type is UNKNOWN in assignment at %L",
3142                  &lvalue->where);
3143       return FAILURE;
3144     }
3145
3146   if (rvalue->expr_type == EXPR_NULL)
3147     {  
3148       if (has_pointer && (ref == NULL || ref->next == NULL)
3149           && lvalue->symtree->n.sym->attr.data)
3150         return SUCCESS;
3151       else
3152         {
3153           gfc_error ("NULL appears on right-hand side in assignment at %L",
3154                      &rvalue->where);
3155           return FAILURE;
3156         }
3157     }
3158
3159   /* This is possibly a typo: x = f() instead of x => f().  */
3160   if (gfc_option.warn_surprising 
3161       && rvalue->expr_type == EXPR_FUNCTION
3162       && rvalue->symtree->n.sym->attr.pointer)
3163     gfc_warning ("POINTER valued function appears on right-hand side of "
3164                  "assignment at %L", &rvalue->where);
3165
3166   /* Check size of array assignments.  */
3167   if (lvalue->rank != 0 && rvalue->rank != 0
3168       && gfc_check_conformance (lvalue, rvalue, "array assignment") != SUCCESS)
3169     return FAILURE;
3170
3171   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
3172       && lvalue->symtree->n.sym->attr.data
3173       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L used to "
3174                          "initialize non-integer variable '%s'",
3175                          &rvalue->where, lvalue->symtree->n.sym->name)
3176          == FAILURE)
3177     return FAILURE;
3178   else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
3179       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L outside "
3180                          "a DATA statement and outside INT/REAL/DBLE/CMPLX",
3181                          &rvalue->where) == FAILURE)
3182     return FAILURE;
3183
3184   /* Handle the case of a BOZ literal on the RHS.  */
3185   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
3186     {
3187       int rc;
3188       if (gfc_option.warn_surprising)
3189         gfc_warning ("BOZ literal at %L is bitwise transferred "
3190                      "non-integer symbol '%s'", &rvalue->where,
3191                      lvalue->symtree->n.sym->name);
3192       if (!gfc_convert_boz (rvalue, &lvalue->ts))
3193         return FAILURE;
3194       if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
3195         {
3196           if (rc == ARITH_UNDERFLOW)
3197             gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
3198                        ". This check can be disabled with the option "
3199                        "-fno-range-check", &rvalue->where);
3200           else if (rc == ARITH_OVERFLOW)
3201             gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
3202                        ". This check can be disabled with the option "
3203                        "-fno-range-check", &rvalue->where);
3204           else if (rc == ARITH_NAN)
3205             gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
3206                        ". This check can be disabled with the option "
3207                        "-fno-range-check", &rvalue->where);
3208           return FAILURE;
3209         }
3210     }
3211
3212   if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
3213     return SUCCESS;
3214
3215   /* Only DATA Statements come here.  */
3216   if (!conform)
3217     {
3218       /* Numeric can be converted to any other numeric. And Hollerith can be
3219          converted to any other type.  */
3220       if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
3221           || rvalue->ts.type == BT_HOLLERITH)
3222         return SUCCESS;
3223
3224       if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
3225         return SUCCESS;
3226
3227       gfc_error ("Incompatible types in DATA statement at %L; attempted "
3228                  "conversion of %s to %s", &lvalue->where,
3229                  gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3230
3231       return FAILURE;
3232     }
3233
3234   /* Assignment is the only case where character variables of different
3235      kind values can be converted into one another.  */
3236   if (lvalue->ts.type == BT_CHARACTER && rvalue->ts.type == BT_CHARACTER)
3237     {
3238       if (lvalue->ts.kind != rvalue->ts.kind)
3239         gfc_convert_chartype (rvalue, &lvalue->ts);
3240
3241       return SUCCESS;
3242     }
3243
3244   return gfc_convert_type (rvalue, &lvalue->ts, 1);
3245 }
3246
3247
3248 /* Check that a pointer assignment is OK.  We first check lvalue, and
3249    we only check rvalue if it's not an assignment to NULL() or a
3250    NULLIFY statement.  */
3251
3252 gfc_try
3253 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
3254 {
3255   symbol_attribute attr;
3256   gfc_ref *ref;
3257   int is_pure;
3258   int pointer, check_intent_in, proc_pointer;
3259
3260   if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN
3261       && !lvalue->symtree->n.sym->attr.proc_pointer)
3262     {
3263       gfc_error ("Pointer assignment target is not a POINTER at %L",
3264                  &lvalue->where);
3265       return FAILURE;
3266     }
3267
3268   if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
3269       && lvalue->symtree->n.sym->attr.use_assoc
3270       && !lvalue->symtree->n.sym->attr.proc_pointer)
3271     {
3272       gfc_error ("'%s' in the pointer assignment at %L cannot be an "
3273                  "l-value since it is a procedure",
3274                  lvalue->symtree->n.sym->name, &lvalue->where);
3275       return FAILURE;
3276     }
3277
3278
3279   /* Check INTENT(IN), unless the object itself is the component or
3280      sub-component of a pointer.  */
3281   check_intent_in = 1;
3282   pointer = lvalue->symtree->n.sym->attr.pointer;
3283   proc_pointer = lvalue->symtree->n.sym->attr.proc_pointer;
3284
3285   for (ref = lvalue->ref; ref; ref = ref->next)
3286     {
3287       if (pointer)
3288         check_intent_in = 0;
3289
3290       if (ref->type == REF_COMPONENT)
3291         {
3292           pointer = ref->u.c.component->attr.pointer;
3293           proc_pointer = ref->u.c.component->attr.proc_pointer;
3294         }
3295
3296       if (ref->type == REF_ARRAY && ref->next == NULL)
3297         {
3298           if (ref->u.ar.type == AR_FULL)
3299             break;
3300
3301           if (ref->u.ar.type != AR_SECTION)
3302             {
3303               gfc_error ("Expected bounds specification for '%s' at %L",
3304                          lvalue->symtree->n.sym->name, &lvalue->where);
3305               return FAILURE;
3306             }
3307
3308           if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Bounds "
3309                               "specification for '%s' in pointer assignment "
3310                               "at %L", lvalue->symtree->n.sym->name,
3311                               &lvalue->where) == FAILURE)
3312             return FAILURE;
3313
3314           gfc_error ("Pointer bounds remapping at %L is not yet implemented "
3315                      "in gfortran", &lvalue->where);
3316           /* TODO: See PR 29785. Add checks that all lbounds are specified and
3317              either never or always the upper-bound; strides shall not be
3318              present.  */
3319           return FAILURE;
3320         }
3321     }
3322
3323   if (check_intent_in && lvalue->symtree->n.sym->attr.intent == INTENT_IN)
3324     {
3325       gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
3326                  lvalue->symtree->n.sym->name, &lvalue->where);
3327       return FAILURE;
3328     }
3329
3330   if (!pointer && !proc_pointer
3331         && !(lvalue->ts.type == BT_CLASS
3332                 && lvalue->ts.u.derived->components->attr.pointer))
3333     {
3334       gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
3335       return FAILURE;
3336     }
3337
3338   is_pure = gfc_pure (NULL);
3339
3340   if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym)
3341         && lvalue->symtree->n.sym->value != rvalue)
3342     {
3343       gfc_error ("Bad pointer object in PURE procedure at %L", &lvalue->where);
3344       return FAILURE;
3345     }
3346
3347   /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
3348      kind, etc for lvalue and rvalue must match, and rvalue must be a
3349      pure variable if we're in a pure function.  */
3350   if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
3351     return SUCCESS;
3352
3353   /* F2008, C723 (pointer) and C726 (proc-pointer); for PURE also C1283.  */
3354   if (lvalue->expr_type == EXPR_VARIABLE
3355       && gfc_is_coindexed (lvalue))
3356     {
3357       gfc_ref *ref;
3358       for (ref = lvalue->ref; ref; ref = ref->next)
3359         if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3360           {
3361             gfc_error ("Pointer object at %L shall not have a coindex",
3362                        &lvalue->where);
3363             return FAILURE;
3364           }
3365     }
3366
3367   /* Checks on rvalue for procedure pointer assignments.  */
3368   if (proc_pointer)
3369     {
3370       char err[200];
3371       gfc_symbol *s1,*s2;
3372       gfc_component *comp;
3373       const char *name;
3374
3375       attr = gfc_expr_attr (rvalue);
3376       if (!((rvalue->expr_type == EXPR_NULL)
3377             || (rvalue->expr_type == EXPR_FUNCTION && attr.proc_pointer)
3378             || (rvalue->expr_type == EXPR_VARIABLE && attr.proc_pointer)
3379             || (rvalue->expr_type == EXPR_VARIABLE
3380                 && attr.flavor == FL_PROCEDURE)))
3381         {
3382           gfc_error ("Invalid procedure pointer assignment at %L",
3383                      &rvalue->where);
3384           return FAILURE;
3385         }
3386       if (attr.abstract)
3387         {
3388           gfc_error ("Abstract interface '%s' is invalid "
3389                      "in procedure pointer assignment at %L",
3390                      rvalue->symtree->name, &rvalue->where);
3391           return FAILURE;
3392         }
3393       /* Check for C727.  */
3394       if (attr.flavor == FL_PROCEDURE)
3395         {
3396           if (attr.proc == PROC_ST_FUNCTION)
3397             {
3398               gfc_error ("Statement function '%s' is invalid "
3399                          "in procedure pointer assignment at %L",
3400                          rvalue->symtree->name, &rvalue->where);
3401               return FAILURE;
3402             }
3403           if (attr.proc == PROC_INTERNAL &&
3404               gfc_notify_std (GFC_STD_F2008, "Internal procedure '%s' is "
3405                               "invalid in procedure pointer assignment at %L",
3406                               rvalue->symtree->name, &rvalue->where) == FAILURE)
3407             return FAILURE;
3408         }
3409
3410       /* Ensure that the calling convention is the same. As other attributes
3411          such as DLLEXPORT may differ, one explicitly only tests for the
3412          calling conventions.  */
3413       if (rvalue->expr_type == EXPR_VARIABLE
3414           && lvalue->symtree->n.sym->attr.ext_attr
3415                != rvalue->symtree->n.sym->attr.ext_attr)
3416         {
3417           symbol_attribute calls;
3418
3419           calls.ext_attr = 0;
3420           gfc_add_ext_attribute (&calls, EXT_ATTR_CDECL, NULL);
3421           gfc_add_ext_attribute (&calls, EXT_ATTR_STDCALL, NULL);
3422           gfc_add_ext_attribute (&calls, EXT_ATTR_FASTCALL, NULL);
3423
3424           if ((calls.ext_attr & lvalue->symtree->n.sym->attr.ext_attr)
3425               != (calls.ext_attr & rvalue->symtree->n.sym->attr.ext_attr))
3426             {
3427               gfc_error ("Mismatch in the procedure pointer assignment "
3428                          "at %L: mismatch in the calling convention",
3429                          &rvalue->where);
3430           return FAILURE;
3431             }
3432         }
3433
3434       if (gfc_is_proc_ptr_comp (lvalue, &comp))
3435         s1 = comp->ts.interface;
3436       else
3437         s1 = lvalue->symtree->n.sym;
3438
3439       if (gfc_is_proc_ptr_comp (rvalue, &comp))
3440         {
3441           s2 = comp->ts.interface;
3442           name = comp->name;
3443         }
3444       else if (rvalue->expr_type == EXPR_FUNCTION)
3445         {
3446           s2 = rvalue->symtree->n.sym->result;
3447           name = rvalue->symtree->n.sym->result->name;
3448         }
3449       else
3450         {
3451           s2 = rvalue->symtree->n.sym;
3452           name = rvalue->symtree->n.sym->name;
3453         }
3454
3455       if (s1 && s2 && !gfc_compare_interfaces (s1, s2, name, 0, 1,
3456                                                err, sizeof(err)))
3457         {
3458           gfc_error ("Interface mismatch in procedure pointer assignment "
3459                      "at %L: %s", &rvalue->where, err);
3460           return FAILURE;
3461         }
3462
3463       return SUCCESS;
3464     }
3465
3466   if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
3467     {
3468       gfc_error ("Different types in pointer assignment at %L; attempted "
3469                  "assignment of %s to %s", &lvalue->where, 
3470                  gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3471       return FAILURE;
3472     }
3473
3474   if (lvalue->ts.type != BT_CLASS && lvalue->ts.kind != rvalue->ts.kind)
3475     {
3476       gfc_error ("Different kind type parameters in pointer "
3477                  "assignment at %L", &lvalue->where);
3478       return FAILURE;
3479     }
3480
3481   if (lvalue->rank != rvalue->rank)
3482     {
3483       gfc_error ("Different ranks in pointer assignment at %L",
3484                  &lvalue->where);
3485       return FAILURE;
3486     }
3487
3488   /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
3489   if (rvalue->expr_type == EXPR_NULL)
3490     return SUCCESS;
3491
3492   if (lvalue->ts.type == BT_CHARACTER)
3493     {
3494       gfc_try t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment");
3495       if (t == FAILURE)
3496         return FAILURE;
3497     }
3498
3499   if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
3500     lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
3501
3502   attr = gfc_expr_attr (rvalue);
3503   if (!attr.target && !attr.pointer)
3504     {
3505       gfc_error ("Pointer assignment target is neither TARGET "
3506                  "nor POINTER at %L", &rvalue->where);
3507       return FAILURE;
3508     }
3509
3510   if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3511     {
3512       gfc_error ("Bad target in pointer assignment in PURE "
3513                  "procedure at %L", &rvalue->where);
3514     }
3515
3516   if (gfc_has_vector_index (rvalue))
3517     {
3518       gfc_error ("Pointer assignment with vector subscript "
3519                  "on rhs at %L", &rvalue->where);
3520       return FAILURE;
3521     }
3522
3523   if (attr.is_protected && attr.use_assoc
3524       && !(attr.pointer || attr.proc_pointer))
3525     {
3526       gfc_error ("Pointer assignment target has PROTECTED "
3527                  "attribute at %L", &rvalue->where);
3528       return FAILURE;
3529     }
3530
3531   /* F2008, C725. For PURE also C1283.  */
3532   if (rvalue->expr_type == EXPR_VARIABLE
3533       && gfc_is_coindexed (rvalue))
3534     {
3535       gfc_ref *ref;
3536       for (ref = rvalue->ref; ref; ref = ref->next)
3537         if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3538           {
3539             gfc_error ("Data target at %L shall not have a coindex",
3540                        &rvalue->where);
3541             return FAILURE;
3542           }
3543     }
3544
3545   return SUCCESS;
3546 }
3547
3548
3549 /* Relative of gfc_check_assign() except that the lvalue is a single
3550    symbol.  Used for initialization assignments.  */
3551
3552 gfc_try
3553 gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
3554 {
3555   gfc_expr lvalue;
3556   gfc_try r;
3557
3558   memset (&lvalue, '\0', sizeof (gfc_expr));
3559
3560   lvalue.expr_type = EXPR_VARIABLE;
3561   lvalue.ts = sym->ts;
3562   if (sym->as)
3563     lvalue.rank = sym->as->rank;
3564   lvalue.symtree = (gfc_symtree *) gfc_getmem (sizeof (gfc_symtree));
3565   lvalue.symtree->n.sym = sym;
3566   lvalue.where = sym->declared_at;
3567
3568   if (sym->attr.pointer || sym->attr.proc_pointer
3569       || (sym->ts.type == BT_CLASS 
3570           && sym->ts.u.derived->components->attr.pointer
3571           && rvalue->expr_type == EXPR_NULL))
3572     r = gfc_check_pointer_assign (&lvalue, rvalue);
3573   else
3574     r = gfc_check_assign (&lvalue, rvalue, 1);
3575
3576   gfc_free (lvalue.symtree);
3577
3578   return r;
3579 }
3580
3581
3582 /* Get an expression for a default initializer.  */
3583
3584 gfc_expr *
3585 gfc_default_initializer (gfc_typespec *ts)
3586 {
3587   gfc_expr *init;
3588   gfc_component *comp;
3589
3590   /* See if we have a default initializer.  */
3591   for (comp = ts->u.derived->components; comp; comp = comp->next)
3592     if (comp->initializer || comp->attr.allocatable)
3593       break;
3594
3595   if (!comp)
3596     return NULL;
3597
3598   init = gfc_get_structure_constructor_expr (ts->type, ts->kind,
3599                                              &ts->u.derived->declared_at);
3600   init->ts = *ts;
3601
3602   for (comp = ts->u.derived->components; comp; comp = comp->next)
3603     {
3604       gfc_constructor *ctor = gfc_constructor_get();
3605
3606       if (comp->initializer)
3607         ctor->expr = gfc_copy_expr (comp->initializer);
3608
3609       if (comp->attr.allocatable)
3610         {
3611           ctor->expr = gfc_get_expr ();
3612           ctor->expr->expr_type = EXPR_NULL;
3613           ctor->expr->ts = comp->ts;
3614         }
3615
3616       gfc_constructor_append (&init->value.constructor, ctor);
3617     }
3618
3619   return init;
3620 }
3621
3622
3623 /* Given a symbol, create an expression node with that symbol as a
3624    variable. If the symbol is array valued, setup a reference of the
3625    whole array.  */
3626
3627 gfc_expr *
3628 gfc_get_variable_expr (gfc_symtree *var)
3629 {
3630   gfc_expr *e;
3631
3632   e = gfc_get_expr ();
3633   e->expr_type = EXPR_VARIABLE;
3634   e->symtree = var;
3635   e->ts = var->n.sym->ts;
3636
3637   if (var->n.sym->as != NULL)
3638     {
3639       e->rank = var->n.sym->as->rank;
3640       e->ref = gfc_get_ref ();
3641       e->ref->type = REF_ARRAY;
3642       e->ref->u.ar.type = AR_FULL;
3643     }
3644
3645   return e;
3646 }
3647
3648
3649 /* Returns the array_spec of a full array expression.  A NULL is
3650    returned otherwise.  */
3651 gfc_array_spec *
3652 gfc_get_full_arrayspec_from_expr (gfc_expr *expr)
3653 {
3654   gfc_array_spec *as;
3655   gfc_ref *ref;
3656
3657   if (expr->rank == 0)
3658     return NULL;
3659
3660   /* Follow any component references.  */
3661   if (expr->expr_type == EXPR_VARIABLE
3662       || expr->expr_type == EXPR_CONSTANT)
3663     {
3664       as = expr->symtree->n.sym->as;
3665       for (ref = expr->ref; ref; ref = ref->next)
3666         {
3667           switch (ref->type)
3668             {
3669             case REF_COMPONENT:
3670               as = ref->u.c.component->as;
3671               continue;
3672
3673             case REF_SUBSTRING:
3674               continue;
3675
3676             case REF_ARRAY:
3677               {
3678                 switch (ref->u.ar.type)
3679                   {
3680                   case AR_ELEMENT:
3681                   case AR_SECTION:
3682                   case AR_UNKNOWN:
3683                     as = NULL;
3684                     continue;
3685
3686                   case AR_FULL:
3687                     break;
3688                   }
3689                 break;
3690               }
3691             }
3692         }
3693     }
3694   else
3695     as = NULL;
3696
3697   return as;
3698 }
3699
3700
3701 /* General expression traversal function.  */
3702
3703 bool
3704 gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
3705                    bool (*func)(gfc_expr *, gfc_symbol *, int*),
3706                    int f)
3707 {
3708   gfc_array_ref ar;
3709   gfc_ref *ref;
3710   gfc_actual_arglist *args;
3711   gfc_constructor *c;
3712   int i;
3713
3714   if (!expr)
3715     return false;
3716
3717   if ((*func) (expr, sym, &f))
3718     return true;
3719
3720   if (expr->ts.type == BT_CHARACTER
3721         && expr->ts.u.cl
3722         && expr->ts.u.cl->length
3723         && expr->ts.u.cl->length->expr_type != EXPR_CONSTANT
3724         && gfc_traverse_expr (expr->ts.u.cl->length, sym, func, f))
3725     return true;
3726
3727   switch (expr->expr_type)
3728     {
3729     case EXPR_PPC:
3730     case EXPR_COMPCALL:
3731     case EXPR_FUNCTION:
3732       for (args = expr->value.function.actual; args; args = args->next)
3733         {
3734           if (gfc_traverse_expr (args->expr, sym, func, f))
3735             return true;
3736         }
3737       break;
3738
3739     case EXPR_VARIABLE:
3740     case EXPR_CONSTANT:
3741     case EXPR_NULL:
3742     case EXPR_SUBSTRING:
3743       break;
3744
3745     case EXPR_STRUCTURE:
3746     case EXPR_ARRAY:
3747       for (c = gfc_constructor_first (expr->value.constructor);
3748            c; c = gfc_constructor_next (c))
3749         {
3750           if (gfc_traverse_expr (c->expr, sym, func, f))
3751             return true;
3752           if (c->iterator)
3753             {
3754               if (gfc_traverse_expr (c->iterator->var, sym, func, f))
3755                 return true;
3756               if (gfc_traverse_expr (c->iterator->start, sym, func, f))
3757                 return true;
3758               if (gfc_traverse_expr (c->iterator->end, sym, func, f))
3759                 return true;
3760               if (gfc_traverse_expr (c->iterator->step, sym, func, f))
3761                 return true;
3762             }
3763         }
3764       break;
3765
3766     case EXPR_OP:
3767       if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
3768         return true;
3769       if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
3770         return true;
3771       break;
3772
3773     default:
3774       gcc_unreachable ();
3775       break;
3776     }
3777
3778   ref = expr->ref;
3779   while (ref != NULL)
3780     {
3781       switch (ref->type)
3782         {
3783         case  REF_ARRAY:
3784           ar = ref->u.ar;
3785           for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
3786             {
3787               if (gfc_traverse_expr (ar.start[i], sym, func, f))
3788                 return true;
3789               if (gfc_traverse_expr (ar.end[i], sym, func, f))
3790                 return true;
3791               if (gfc_traverse_expr (ar.stride[i], sym, func, f))
3792                 return true;
3793             }
3794           break;
3795
3796         case REF_SUBSTRING:
3797           if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
3798             return true;
3799           if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
3800             return true;
3801           break;
3802
3803         case REF_COMPONENT:
3804           if (ref->u.c.component->ts.type == BT_CHARACTER
3805                 && ref->u.c.component->ts.u.cl
3806                 && ref->u.c.component->ts.u.cl->length
3807                 && ref->u.c.component->ts.u.cl->length->expr_type
3808                      != EXPR_CONSTANT
3809                 && gfc_traverse_expr (ref->u.c.component->ts.u.cl->length,
3810                                       sym, func, f))
3811             return true;
3812
3813           if (ref->u.c.component->as)
3814             for (i = 0; i < ref->u.c.component->as->rank
3815                             + ref->u.c.component->as->corank; i++)
3816               {
3817                 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
3818                                        sym, func, f))
3819                   return true;
3820                 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
3821                                        sym, func, f))
3822                   return true;
3823               }
3824           break;
3825
3826         default:
3827           gcc_unreachable ();
3828         }
3829       ref = ref->next;
3830     }
3831   return false;
3832 }
3833
3834 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
3835
3836 static bool
3837 expr_set_symbols_referenced (gfc_expr *expr,
3838                              gfc_symbol *sym ATTRIBUTE_UNUSED,
3839                              int *f ATTRIBUTE_UNUSED)
3840 {
3841   if (expr->expr_type != EXPR_VARIABLE)
3842     return false;
3843   gfc_set_sym_referenced (expr->symtree->n.sym);
3844   return false;
3845 }
3846
3847 void
3848 gfc_expr_set_symbols_referenced (gfc_expr *expr)
3849 {
3850   gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
3851 }
3852
3853
3854 /* Determine if an expression is a procedure pointer component. If yes, the
3855    argument 'comp' will point to the component (provided that 'comp' was
3856    provided).  */
3857
3858 bool
3859 gfc_is_proc_ptr_comp (gfc_expr *expr, gfc_component **comp)
3860 {
3861   gfc_ref *ref;
3862   bool ppc = false;
3863
3864   if (!expr || !expr->ref)
3865     return false;
3866
3867   ref = expr->ref;
3868   while (ref->next)
3869     ref = ref->next;
3870
3871   if (ref->type == REF_COMPONENT)
3872     {
3873       ppc = ref->u.c.component->attr.proc_pointer;
3874       if (ppc && comp)
3875         *comp = ref->u.c.component;
3876     }
3877
3878   return ppc;
3879 }
3880
3881
3882 /* Walk an expression tree and check each variable encountered for being typed.
3883    If strict is not set, a top-level variable is tolerated untyped in -std=gnu
3884    mode as is a basic arithmetic expression using those; this is for things in
3885    legacy-code like:
3886
3887      INTEGER :: arr(n), n
3888      INTEGER :: arr(n + 1), n
3889
3890    The namespace is needed for IMPLICIT typing.  */
3891
3892 static gfc_namespace* check_typed_ns;
3893
3894 static bool
3895 expr_check_typed_help (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
3896                        int* f ATTRIBUTE_UNUSED)
3897 {
3898   gfc_try t;
3899
3900   if (e->expr_type != EXPR_VARIABLE)
3901     return false;
3902
3903   gcc_assert (e->symtree);
3904   t = gfc_check_symbol_typed (e->symtree->n.sym, check_typed_ns,
3905                               true, e->where);
3906
3907   return (t == FAILURE);
3908 }
3909
3910 gfc_try
3911 gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
3912 {
3913   bool error_found;
3914
3915   /* If this is a top-level variable or EXPR_OP, do the check with strict given
3916      to us.  */
3917   if (!strict)
3918     {
3919       if (e->expr_type == EXPR_VARIABLE && !e->ref)
3920         return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
3921
3922       if (e->expr_type == EXPR_OP)
3923         {
3924           gfc_try t = SUCCESS;
3925
3926           gcc_assert (e->value.op.op1);
3927           t = gfc_expr_check_typed (e->value.op.op1, ns, strict);
3928
3929           if (t == SUCCESS && e->value.op.op2)
3930             t = gfc_expr_check_typed (e->value.op.op2, ns, strict);
3931
3932           return t;
3933         }
3934     }
3935
3936   /* Otherwise, walk the expression and do it strictly.  */
3937   check_typed_ns = ns;
3938   error_found = gfc_traverse_expr (e, NULL, &expr_check_typed_help, 0);
3939
3940   return error_found ? FAILURE : SUCCESS;
3941 }
3942
3943 /* Walk an expression tree and replace all symbols with a corresponding symbol
3944    in the formal_ns of "sym". Needed for copying interfaces in PROCEDURE
3945    statements. The boolean return value is required by gfc_traverse_expr.  */
3946
3947 static bool
3948 replace_symbol (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
3949 {
3950   if ((expr->expr_type == EXPR_VARIABLE 
3951        || (expr->expr_type == EXPR_FUNCTION
3952            && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
3953       && expr->symtree->n.sym->ns == sym->ts.interface->formal_ns)
3954     {
3955       gfc_symtree *stree;
3956       gfc_namespace *ns = sym->formal_ns;
3957       /* Don't use gfc_get_symtree as we prefer to fail badly if we don't find
3958          the symtree rather than create a new one (and probably fail later).  */
3959       stree = gfc_find_symtree (ns ? ns->sym_root : gfc_current_ns->sym_root,
3960                                 expr->symtree->n.sym->name);
3961       gcc_assert (stree);
3962       stree->n.sym->attr = expr->symtree->n.sym->attr;
3963       expr->symtree = stree;
3964     }
3965   return false;
3966 }
3967
3968 void
3969 gfc_expr_replace_symbols (gfc_expr *expr, gfc_symbol *dest)
3970 {
3971   gfc_traverse_expr (expr, dest, &replace_symbol, 0);
3972 }
3973
3974 /* The following is analogous to 'replace_symbol', and needed for copying
3975    interfaces for procedure pointer components. The argument 'sym' must formally
3976    be a gfc_symbol, so that the function can be passed to gfc_traverse_expr.
3977    However, it gets actually passed a gfc_component (i.e. the procedure pointer
3978    component in whose formal_ns the arguments have to be).  */
3979
3980 static bool
3981 replace_comp (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
3982 {
3983   gfc_component *comp;
3984   comp = (gfc_component *)sym;
3985   if ((expr->expr_type == EXPR_VARIABLE 
3986        || (expr->expr_type == EXPR_FUNCTION
3987            && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
3988       && expr->symtree->n.sym->ns == comp->ts.interface->formal_ns)
3989     {
3990       gfc_symtree *stree;
3991       gfc_namespace *ns = comp->formal_ns;
3992       /* Don't use gfc_get_symtree as we prefer to fail badly if we don't find
3993          the symtree rather than create a new one (and probably fail later).  */
3994       stree = gfc_find_symtree (ns ? ns->sym_root : gfc_current_ns->sym_root,
3995                                 expr->symtree->n.sym->name);
3996       gcc_assert (stree);
3997       stree->n.sym->attr = expr->symtree->n.sym->attr;
3998       expr->symtree = stree;
3999     }
4000   return false;
4001 }
4002
4003 void
4004 gfc_expr_replace_comp (gfc_expr *expr, gfc_component *dest)
4005 {
4006   gfc_traverse_expr (expr, (gfc_symbol *)dest, &replace_comp, 0);
4007 }
4008
4009
4010 bool
4011 gfc_is_coindexed (gfc_expr *e)
4012 {
4013   gfc_ref *ref;
4014
4015   for (ref = e->ref; ref; ref = ref->next)
4016     if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4017       return true;
4018
4019   return false;
4020 }
4021
4022
4023 /* Check whether the expression has an ultimate allocatable component.
4024    Being itself allocatable does not count.  */
4025 bool
4026 gfc_has_ultimate_allocatable (gfc_expr *e)
4027 {
4028   gfc_ref *ref, *last = NULL;
4029
4030   if (e->expr_type != EXPR_VARIABLE)
4031     return false;
4032
4033   for (ref = e->ref; ref; ref = ref->next)
4034     if (ref->type == REF_COMPONENT)
4035       last = ref;
4036
4037   if (last && last->u.c.component->ts.type == BT_CLASS)
4038     return last->u.c.component->ts.u.derived->components->attr.alloc_comp;
4039   else if (last && last->u.c.component->ts.type == BT_DERIVED)
4040     return last->u.c.component->ts.u.derived->attr.alloc_comp;
4041   else if (last)
4042     return false;
4043
4044   if (e->ts.type == BT_CLASS)
4045     return e->ts.u.derived->components->attr.alloc_comp;
4046   else if (e->ts.type == BT_DERIVED)
4047     return e->ts.u.derived->attr.alloc_comp;
4048   else
4049     return false;
4050 }
4051
4052
4053 /* Check whether the expression has an pointer component.
4054    Being itself a pointer does not count.  */
4055 bool
4056 gfc_has_ultimate_pointer (gfc_expr *e)
4057 {
4058   gfc_ref *ref, *last = NULL;
4059
4060   if (e->expr_type != EXPR_VARIABLE)
4061     return false;
4062
4063   for (ref = e->ref; ref; ref = ref->next)
4064     if (ref->type == REF_COMPONENT)
4065       last = ref;
4066  
4067   if (last && last->u.c.component->ts.type == BT_CLASS)
4068     return last->u.c.component->ts.u.derived->components->attr.pointer_comp;
4069   else if (last && last->u.c.component->ts.type == BT_DERIVED)
4070     return last->u.c.component->ts.u.derived->attr.pointer_comp;
4071   else if (last)
4072     return false;
4073
4074   if (e->ts.type == BT_CLASS)
4075     return e->ts.u.derived->components->attr.pointer_comp;
4076   else if (e->ts.type == BT_DERIVED)
4077     return e->ts.u.derived->attr.pointer_comp;
4078   else
4079     return false;
4080 }