OSDN Git Service

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