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