OSDN Git Service

2014-02-03 Janus Weil <janus@gcc.gnu.org>
[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         {
1888           if (simplify_parameter_variable (p, type) == FAILURE)
1889             return FAILURE;
1890           break;
1891         }
1892
1893       if (type == 1)
1894         {
1895           gfc_simplify_iterator_var (p);
1896         }
1897
1898       /* Simplify subcomponent references.  */
1899       if (simplify_ref_chain (p->ref, type) == FAILURE)
1900         return FAILURE;
1901
1902       break;
1903
1904     case EXPR_STRUCTURE:
1905     case EXPR_ARRAY:
1906       if (simplify_ref_chain (p->ref, type) == FAILURE)
1907         return FAILURE;
1908
1909       if (simplify_constructor (p->value.constructor, type) == FAILURE)
1910         return FAILURE;
1911
1912       if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1913           && p->ref->u.ar.type == AR_FULL)
1914           gfc_expand_constructor (p, false);
1915
1916       if (simplify_const_ref (p) == FAILURE)
1917         return FAILURE;
1918
1919       break;
1920
1921     case EXPR_COMPCALL:
1922     case EXPR_PPC:
1923       gcc_unreachable ();
1924       break;
1925     }
1926
1927   return SUCCESS;
1928 }
1929
1930
1931 /* Returns the type of an expression with the exception that iterator
1932    variables are automatically integers no matter what else they may
1933    be declared as.  */
1934
1935 static bt
1936 et0 (gfc_expr *e)
1937 {
1938   if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1939     return BT_INTEGER;
1940
1941   return e->ts.type;
1942 }
1943
1944
1945 /* Check an intrinsic arithmetic operation to see if it is consistent
1946    with some type of expression.  */
1947
1948 static gfc_try check_init_expr (gfc_expr *);
1949
1950
1951 /* Scalarize an expression for an elemental intrinsic call.  */
1952
1953 static gfc_try
1954 scalarize_intrinsic_call (gfc_expr *e)
1955 {
1956   gfc_actual_arglist *a, *b;
1957   gfc_constructor_base ctor;
1958   gfc_constructor *args[5];
1959   gfc_constructor *ci, *new_ctor;
1960   gfc_expr *expr, *old;
1961   int n, i, rank[5], array_arg;
1962   
1963   /* Find which, if any, arguments are arrays.  Assume that the old
1964      expression carries the type information and that the first arg
1965      that is an array expression carries all the shape information.*/
1966   n = array_arg = 0;
1967   a = e->value.function.actual;
1968   for (; a; a = a->next)
1969     {
1970       n++;
1971       if (a->expr->expr_type != EXPR_ARRAY)
1972         continue;
1973       array_arg = n;
1974       expr = gfc_copy_expr (a->expr);
1975       break;
1976     }
1977
1978   if (!array_arg)
1979     return FAILURE;
1980
1981   old = gfc_copy_expr (e);
1982
1983   gfc_constructor_free (expr->value.constructor);
1984   expr->value.constructor = NULL;
1985   expr->ts = old->ts;
1986   expr->where = old->where;
1987   expr->expr_type = EXPR_ARRAY;
1988
1989   /* Copy the array argument constructors into an array, with nulls
1990      for the scalars.  */
1991   n = 0;
1992   a = old->value.function.actual;
1993   for (; a; a = a->next)
1994     {
1995       /* Check that this is OK for an initialization expression.  */
1996       if (a->expr && check_init_expr (a->expr) == FAILURE)
1997         goto cleanup;
1998
1999       rank[n] = 0;
2000       if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
2001         {
2002           rank[n] = a->expr->rank;
2003           ctor = a->expr->symtree->n.sym->value->value.constructor;
2004           args[n] = gfc_constructor_first (ctor);
2005         }
2006       else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
2007         {
2008           if (a->expr->rank)
2009             rank[n] = a->expr->rank;
2010           else
2011             rank[n] = 1;
2012           ctor = gfc_constructor_copy (a->expr->value.constructor);
2013           args[n] = gfc_constructor_first (ctor);
2014         }
2015       else
2016         args[n] = NULL;
2017
2018       n++;
2019     }
2020
2021
2022   /* Using the array argument as the master, step through the array
2023      calling the function for each element and advancing the array
2024      constructors together.  */
2025   for (ci = args[array_arg - 1]; ci; ci = gfc_constructor_next (ci))
2026     {
2027       new_ctor = gfc_constructor_append_expr (&expr->value.constructor,
2028                                               gfc_copy_expr (old), NULL);
2029
2030       gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
2031       a = NULL;
2032       b = old->value.function.actual;
2033       for (i = 0; i < n; i++)
2034         {
2035           if (a == NULL)
2036             new_ctor->expr->value.function.actual
2037                         = a = gfc_get_actual_arglist ();
2038           else
2039             {
2040               a->next = gfc_get_actual_arglist ();
2041               a = a->next;
2042             }
2043
2044           if (args[i])
2045             a->expr = gfc_copy_expr (args[i]->expr);
2046           else
2047             a->expr = gfc_copy_expr (b->expr);
2048
2049           b = b->next;
2050         }
2051
2052       /* Simplify the function calls.  If the simplification fails, the
2053          error will be flagged up down-stream or the library will deal
2054          with it.  */
2055       gfc_simplify_expr (new_ctor->expr, 0);
2056
2057       for (i = 0; i < n; i++)
2058         if (args[i])
2059           args[i] = gfc_constructor_next (args[i]);
2060
2061       for (i = 1; i < n; i++)
2062         if (rank[i] && ((args[i] != NULL && args[array_arg - 1] == NULL)
2063                         || (args[i] == NULL && args[array_arg - 1] != NULL)))
2064           goto compliance;
2065     }
2066
2067   free_expr0 (e);
2068   *e = *expr;
2069   gfc_free_expr (old);
2070   return SUCCESS;
2071
2072 compliance:
2073   gfc_error_now ("elemental function arguments at %C are not compliant");
2074
2075 cleanup:
2076   gfc_free_expr (expr);
2077   gfc_free_expr (old);
2078   return FAILURE;
2079 }
2080
2081
2082 static gfc_try
2083 check_intrinsic_op (gfc_expr *e, gfc_try (*check_function) (gfc_expr *))
2084 {
2085   gfc_expr *op1 = e->value.op.op1;
2086   gfc_expr *op2 = e->value.op.op2;
2087
2088   if ((*check_function) (op1) == FAILURE)
2089     return FAILURE;
2090
2091   switch (e->value.op.op)
2092     {
2093     case INTRINSIC_UPLUS:
2094     case INTRINSIC_UMINUS:
2095       if (!numeric_type (et0 (op1)))
2096         goto not_numeric;
2097       break;
2098
2099     case INTRINSIC_EQ:
2100     case INTRINSIC_EQ_OS:
2101     case INTRINSIC_NE:
2102     case INTRINSIC_NE_OS:
2103     case INTRINSIC_GT:
2104     case INTRINSIC_GT_OS:
2105     case INTRINSIC_GE:
2106     case INTRINSIC_GE_OS:
2107     case INTRINSIC_LT:
2108     case INTRINSIC_LT_OS:
2109     case INTRINSIC_LE:
2110     case INTRINSIC_LE_OS:
2111       if ((*check_function) (op2) == FAILURE)
2112         return FAILURE;
2113       
2114       if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
2115           && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
2116         {
2117           gfc_error ("Numeric or CHARACTER operands are required in "
2118                      "expression at %L", &e->where);
2119          return FAILURE;
2120         }
2121       break;
2122
2123     case INTRINSIC_PLUS:
2124     case INTRINSIC_MINUS:
2125     case INTRINSIC_TIMES:
2126     case INTRINSIC_DIVIDE:
2127     case INTRINSIC_POWER:
2128       if ((*check_function) (op2) == FAILURE)
2129         return FAILURE;
2130
2131       if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
2132         goto not_numeric;
2133
2134       break;
2135
2136     case INTRINSIC_CONCAT:
2137       if ((*check_function) (op2) == FAILURE)
2138         return FAILURE;
2139
2140       if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
2141         {
2142           gfc_error ("Concatenation operator in expression at %L "
2143                      "must have two CHARACTER operands", &op1->where);
2144           return FAILURE;
2145         }
2146
2147       if (op1->ts.kind != op2->ts.kind)
2148         {
2149           gfc_error ("Concat operator at %L must concatenate strings of the "
2150                      "same kind", &e->where);
2151           return FAILURE;
2152         }
2153
2154       break;
2155
2156     case INTRINSIC_NOT:
2157       if (et0 (op1) != BT_LOGICAL)
2158         {
2159           gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
2160                      "operand", &op1->where);
2161           return FAILURE;
2162         }
2163
2164       break;
2165
2166     case INTRINSIC_AND:
2167     case INTRINSIC_OR:
2168     case INTRINSIC_EQV:
2169     case INTRINSIC_NEQV:
2170       if ((*check_function) (op2) == FAILURE)
2171         return FAILURE;
2172
2173       if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
2174         {
2175           gfc_error ("LOGICAL operands are required in expression at %L",
2176                      &e->where);
2177           return FAILURE;
2178         }
2179
2180       break;
2181
2182     case INTRINSIC_PARENTHESES:
2183       break;
2184
2185     default:
2186       gfc_error ("Only intrinsic operators can be used in expression at %L",
2187                  &e->where);
2188       return FAILURE;
2189     }
2190
2191   return SUCCESS;
2192
2193 not_numeric:
2194   gfc_error ("Numeric operands are required in expression at %L", &e->where);
2195
2196   return FAILURE;
2197 }
2198
2199 /* F2003, 7.1.7 (3): In init expression, allocatable components
2200    must not be data-initialized.  */
2201 static gfc_try
2202 check_alloc_comp_init (gfc_expr *e)
2203 {
2204   gfc_component *comp;
2205   gfc_constructor *ctor;
2206
2207   gcc_assert (e->expr_type == EXPR_STRUCTURE);
2208   gcc_assert (e->ts.type == BT_DERIVED);
2209
2210   for (comp = e->ts.u.derived->components,
2211        ctor = gfc_constructor_first (e->value.constructor);
2212        comp; comp = comp->next, ctor = gfc_constructor_next (ctor))
2213     {
2214       if (comp->attr.allocatable
2215           && ctor->expr->expr_type != EXPR_NULL)
2216         {
2217           gfc_error("Invalid initialization expression for ALLOCATABLE "
2218                     "component '%s' in structure constructor at %L",
2219                     comp->name, &ctor->expr->where);
2220           return FAILURE;
2221         }
2222     }
2223
2224   return SUCCESS;
2225 }
2226
2227 static match
2228 check_init_expr_arguments (gfc_expr *e)
2229 {
2230   gfc_actual_arglist *ap;
2231
2232   for (ap = e->value.function.actual; ap; ap = ap->next)
2233     if (check_init_expr (ap->expr) == FAILURE)
2234       return MATCH_ERROR;
2235
2236   return MATCH_YES;
2237 }
2238
2239 static gfc_try check_restricted (gfc_expr *);
2240
2241 /* F95, 7.1.6.1, Initialization expressions, (7)
2242    F2003, 7.1.7 Initialization expression, (8)  */
2243
2244 static match
2245 check_inquiry (gfc_expr *e, int not_restricted)
2246 {
2247   const char *name;
2248   const char *const *functions;
2249
2250   static const char *const inquiry_func_f95[] = {
2251     "lbound", "shape", "size", "ubound",
2252     "bit_size", "len", "kind",
2253     "digits", "epsilon", "huge", "maxexponent", "minexponent",
2254     "precision", "radix", "range", "tiny",
2255     NULL
2256   };
2257
2258   static const char *const inquiry_func_f2003[] = {
2259     "lbound", "shape", "size", "ubound",
2260     "bit_size", "len", "kind",
2261     "digits", "epsilon", "huge", "maxexponent", "minexponent",
2262     "precision", "radix", "range", "tiny",
2263     "new_line", NULL
2264   };
2265
2266   int i;
2267   gfc_actual_arglist *ap;
2268
2269   if (!e->value.function.isym
2270       || !e->value.function.isym->inquiry)
2271     return MATCH_NO;
2272
2273   /* An undeclared parameter will get us here (PR25018).  */
2274   if (e->symtree == NULL)
2275     return MATCH_NO;
2276
2277   name = e->symtree->n.sym->name;
2278
2279   functions = (gfc_option.warn_std & GFC_STD_F2003) 
2280                 ? inquiry_func_f2003 : inquiry_func_f95;
2281
2282   for (i = 0; functions[i]; i++)
2283     if (strcmp (functions[i], name) == 0)
2284       break;
2285
2286   if (functions[i] == NULL)
2287     return MATCH_ERROR;
2288
2289   /* At this point we have an inquiry function with a variable argument.  The
2290      type of the variable might be undefined, but we need it now, because the
2291      arguments of these functions are not allowed to be undefined.  */
2292
2293   for (ap = e->value.function.actual; ap; ap = ap->next)
2294     {
2295       if (!ap->expr)
2296         continue;
2297
2298       if (ap->expr->ts.type == BT_UNKNOWN)
2299         {
2300           if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
2301               && gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns)
2302               == FAILURE)
2303             return MATCH_NO;
2304
2305           ap->expr->ts = ap->expr->symtree->n.sym->ts;
2306         }
2307
2308         /* Assumed character length will not reduce to a constant expression
2309            with LEN, as required by the standard.  */
2310         if (i == 5 && not_restricted
2311             && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
2312             && (ap->expr->symtree->n.sym->ts.u.cl->length == NULL
2313                 || ap->expr->symtree->n.sym->ts.deferred))
2314           {
2315             gfc_error ("Assumed or deferred character length variable '%s' "
2316                         " in constant expression at %L",
2317                         ap->expr->symtree->n.sym->name,
2318                         &ap->expr->where);
2319               return MATCH_ERROR;
2320           }
2321         else if (not_restricted && check_init_expr (ap->expr) == FAILURE)
2322           return MATCH_ERROR;
2323
2324         if (not_restricted == 0
2325               && ap->expr->expr_type != EXPR_VARIABLE
2326               && check_restricted (ap->expr) == FAILURE)
2327           return MATCH_ERROR;
2328
2329         if (not_restricted == 0
2330             && ap->expr->expr_type == EXPR_VARIABLE
2331             && ap->expr->symtree->n.sym->attr.dummy
2332             && ap->expr->symtree->n.sym->attr.optional)
2333           return MATCH_NO;
2334     }
2335
2336   return MATCH_YES;
2337 }
2338
2339
2340 /* F95, 7.1.6.1, Initialization expressions, (5)
2341    F2003, 7.1.7 Initialization expression, (5)  */
2342
2343 static match
2344 check_transformational (gfc_expr *e)
2345 {
2346   static const char * const trans_func_f95[] = {
2347     "repeat", "reshape", "selected_int_kind",
2348     "selected_real_kind", "transfer", "trim", NULL
2349   };
2350
2351   static const char * const trans_func_f2003[] =  {
2352     "all", "any", "count", "dot_product", "matmul", "null", "pack",
2353     "product", "repeat", "reshape", "selected_char_kind", "selected_int_kind",
2354     "selected_real_kind", "spread", "sum", "transfer", "transpose",
2355     "trim", "unpack", NULL
2356   };
2357
2358   int i;
2359   const char *name;
2360   const char *const *functions;
2361
2362   if (!e->value.function.isym
2363       || !e->value.function.isym->transformational)
2364     return MATCH_NO;
2365
2366   name = e->symtree->n.sym->name;
2367
2368   functions = (gfc_option.allow_std & GFC_STD_F2003) 
2369                 ? trans_func_f2003 : trans_func_f95;
2370
2371   /* NULL() is dealt with below.  */
2372   if (strcmp ("null", name) == 0)
2373     return MATCH_NO;
2374
2375   for (i = 0; functions[i]; i++)
2376     if (strcmp (functions[i], name) == 0)
2377        break;
2378
2379   if (functions[i] == NULL)
2380     {
2381       gfc_error("transformational intrinsic '%s' at %L is not permitted "
2382                 "in an initialization expression", name, &e->where);
2383       return MATCH_ERROR;
2384     }
2385
2386   return check_init_expr_arguments (e);
2387 }
2388
2389
2390 /* F95, 7.1.6.1, Initialization expressions, (6)
2391    F2003, 7.1.7 Initialization expression, (6)  */
2392
2393 static match
2394 check_null (gfc_expr *e)
2395 {
2396   if (strcmp ("null", e->symtree->n.sym->name) != 0)
2397     return MATCH_NO;
2398
2399   return check_init_expr_arguments (e);
2400 }
2401
2402
2403 static match
2404 check_elemental (gfc_expr *e)
2405 {
2406   if (!e->value.function.isym
2407       || !e->value.function.isym->elemental)
2408     return MATCH_NO;
2409
2410   if (e->ts.type != BT_INTEGER
2411       && e->ts.type != BT_CHARACTER
2412       && gfc_notify_std (GFC_STD_F2003, "Extension: Evaluation of "
2413                         "nonstandard initialization expression at %L",
2414                         &e->where) == FAILURE)
2415     return MATCH_ERROR;
2416
2417   return check_init_expr_arguments (e);
2418 }
2419
2420
2421 static match
2422 check_conversion (gfc_expr *e)
2423 {
2424   if (!e->value.function.isym
2425       || !e->value.function.isym->conversion)
2426     return MATCH_NO;
2427
2428   return check_init_expr_arguments (e);
2429 }
2430
2431
2432 /* Verify that an expression is an initialization expression.  A side
2433    effect is that the expression tree is reduced to a single constant
2434    node if all goes well.  This would normally happen when the
2435    expression is constructed but function references are assumed to be
2436    intrinsics in the context of initialization expressions.  If
2437    FAILURE is returned an error message has been generated.  */
2438
2439 static gfc_try
2440 check_init_expr (gfc_expr *e)
2441 {
2442   match m;
2443   gfc_try t;
2444
2445   if (e == NULL)
2446     return SUCCESS;
2447
2448   switch (e->expr_type)
2449     {
2450     case EXPR_OP:
2451       t = check_intrinsic_op (e, check_init_expr);
2452       if (t == SUCCESS)
2453         t = gfc_simplify_expr (e, 0);
2454
2455       break;
2456
2457     case EXPR_FUNCTION:
2458       t = FAILURE;
2459
2460       {
2461         gfc_intrinsic_sym* isym;
2462         gfc_symbol* sym;
2463
2464         sym = e->symtree->n.sym;
2465         if (!gfc_is_intrinsic (sym, 0, e->where)
2466             || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES)
2467           {
2468             gfc_error ("Function '%s' in initialization expression at %L "
2469                        "must be an intrinsic function",
2470                        e->symtree->n.sym->name, &e->where);
2471             break;
2472           }
2473
2474         if ((m = check_conversion (e)) == MATCH_NO
2475             && (m = check_inquiry (e, 1)) == MATCH_NO
2476             && (m = check_null (e)) == MATCH_NO
2477             && (m = check_transformational (e)) == MATCH_NO
2478             && (m = check_elemental (e)) == MATCH_NO)
2479           {
2480             gfc_error ("Intrinsic function '%s' at %L is not permitted "
2481                        "in an initialization expression",
2482                        e->symtree->n.sym->name, &e->where);
2483             m = MATCH_ERROR;
2484           }
2485
2486         if (m == MATCH_ERROR)
2487           return FAILURE;
2488
2489         /* Try to scalarize an elemental intrinsic function that has an
2490            array argument.  */
2491         isym = gfc_find_function (e->symtree->n.sym->name);
2492         if (isym && isym->elemental
2493             && (t = scalarize_intrinsic_call (e)) == SUCCESS)
2494           break;
2495       }
2496
2497       if (m == MATCH_YES)
2498         t = gfc_simplify_expr (e, 0);
2499
2500       break;
2501
2502     case EXPR_VARIABLE:
2503       t = SUCCESS;
2504
2505       if (gfc_check_iter_variable (e) == SUCCESS)
2506         break;
2507
2508       if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2509         {
2510           /* A PARAMETER shall not be used to define itself, i.e.
2511                 REAL, PARAMETER :: x = transfer(0, x)
2512              is invalid.  */
2513           if (!e->symtree->n.sym->value)
2514             {
2515               gfc_error("PARAMETER '%s' is used at %L before its definition "
2516                         "is complete", e->symtree->n.sym->name, &e->where);
2517               t = FAILURE;
2518             }
2519           else
2520             t = simplify_parameter_variable (e, 0);
2521
2522           break;
2523         }
2524
2525       if (gfc_in_match_data ())
2526         break;
2527
2528       t = FAILURE;
2529
2530       if (e->symtree->n.sym->as)
2531         {
2532           switch (e->symtree->n.sym->as->type)
2533             {
2534               case AS_ASSUMED_SIZE:
2535                 gfc_error ("Assumed size array '%s' at %L is not permitted "
2536                            "in an initialization expression",
2537                            e->symtree->n.sym->name, &e->where);
2538                 break;
2539
2540               case AS_ASSUMED_SHAPE:
2541                 gfc_error ("Assumed shape array '%s' at %L is not permitted "
2542                            "in an initialization expression",
2543                            e->symtree->n.sym->name, &e->where);
2544                 break;
2545
2546               case AS_DEFERRED:
2547                 gfc_error ("Deferred array '%s' at %L is not permitted "
2548                            "in an initialization expression",
2549                            e->symtree->n.sym->name, &e->where);
2550                 break;
2551
2552               case AS_EXPLICIT:
2553                 gfc_error ("Array '%s' at %L is a variable, which does "
2554                            "not reduce to a constant expression",
2555                            e->symtree->n.sym->name, &e->where);
2556                 break;
2557
2558               default:
2559                 gcc_unreachable();
2560           }
2561         }
2562       else
2563         gfc_error ("Parameter '%s' at %L has not been declared or is "
2564                    "a variable, which does not reduce to a constant "
2565                    "expression", e->symtree->n.sym->name, &e->where);
2566
2567       break;
2568
2569     case EXPR_CONSTANT:
2570     case EXPR_NULL:
2571       t = SUCCESS;
2572       break;
2573
2574     case EXPR_SUBSTRING:
2575       t = check_init_expr (e->ref->u.ss.start);
2576       if (t == FAILURE)
2577         break;
2578
2579       t = check_init_expr (e->ref->u.ss.end);
2580       if (t == SUCCESS)
2581         t = gfc_simplify_expr (e, 0);
2582
2583       break;
2584
2585     case EXPR_STRUCTURE:
2586       t = e->ts.is_iso_c ? SUCCESS : FAILURE;
2587       if (t == SUCCESS)
2588         break;
2589
2590       t = check_alloc_comp_init (e);
2591       if (t == FAILURE)
2592         break;
2593
2594       t = gfc_check_constructor (e, check_init_expr);
2595       if (t == FAILURE)
2596         break;
2597
2598       break;
2599
2600     case EXPR_ARRAY:
2601       t = gfc_check_constructor (e, check_init_expr);
2602       if (t == FAILURE)
2603         break;
2604
2605       t = gfc_expand_constructor (e, true);
2606       if (t == FAILURE)
2607         break;
2608
2609       t = gfc_check_constructor_type (e);
2610       break;
2611
2612     default:
2613       gfc_internal_error ("check_init_expr(): Unknown expression type");
2614     }
2615
2616   return t;
2617 }
2618
2619 /* Reduces a general expression to an initialization expression (a constant).
2620    This used to be part of gfc_match_init_expr.
2621    Note that this function doesn't free the given expression on FAILURE.  */
2622
2623 gfc_try
2624 gfc_reduce_init_expr (gfc_expr *expr)
2625 {
2626   gfc_try t;
2627
2628   gfc_init_expr_flag = true;
2629   t = gfc_resolve_expr (expr);
2630   if (t == SUCCESS)
2631     t = check_init_expr (expr);
2632   gfc_init_expr_flag = false;
2633
2634   if (t == FAILURE)
2635     return FAILURE;
2636
2637   if (expr->expr_type == EXPR_ARRAY)
2638     {
2639       if (gfc_check_constructor_type (expr) == FAILURE)
2640         return FAILURE;
2641       if (gfc_expand_constructor (expr, true) == FAILURE)
2642         return FAILURE;
2643     }
2644
2645   return SUCCESS;
2646 }
2647
2648
2649 /* Match an initialization expression.  We work by first matching an
2650    expression, then reducing it to a constant.  */
2651
2652 match
2653 gfc_match_init_expr (gfc_expr **result)
2654 {
2655   gfc_expr *expr;
2656   match m;
2657   gfc_try t;
2658
2659   expr = NULL;
2660
2661   gfc_init_expr_flag = true;
2662
2663   m = gfc_match_expr (&expr);
2664   if (m != MATCH_YES)
2665     {
2666       gfc_init_expr_flag = false;
2667       return m;
2668     }
2669
2670   t = gfc_reduce_init_expr (expr);
2671   if (t != SUCCESS)
2672     {
2673       gfc_free_expr (expr);
2674       gfc_init_expr_flag = false;
2675       return MATCH_ERROR;
2676     }
2677
2678   *result = expr;
2679   gfc_init_expr_flag = false;
2680
2681   return MATCH_YES;
2682 }
2683
2684
2685 /* Given an actual argument list, test to see that each argument is a
2686    restricted expression and optionally if the expression type is
2687    integer or character.  */
2688
2689 static gfc_try
2690 restricted_args (gfc_actual_arglist *a)
2691 {
2692   for (; a; a = a->next)
2693     {
2694       if (check_restricted (a->expr) == FAILURE)
2695         return FAILURE;
2696     }
2697
2698   return SUCCESS;
2699 }
2700
2701
2702 /************* Restricted/specification expressions *************/
2703
2704
2705 /* Make sure a non-intrinsic function is a specification function.  */
2706
2707 static gfc_try
2708 external_spec_function (gfc_expr *e)
2709 {
2710   gfc_symbol *f;
2711
2712   f = e->value.function.esym;
2713
2714   if (f->attr.proc == PROC_ST_FUNCTION)
2715     {
2716       gfc_error ("Specification function '%s' at %L cannot be a statement "
2717                  "function", f->name, &e->where);
2718       return FAILURE;
2719     }
2720
2721   if (f->attr.proc == PROC_INTERNAL)
2722     {
2723       gfc_error ("Specification function '%s' at %L cannot be an internal "
2724                  "function", f->name, &e->where);
2725       return FAILURE;
2726     }
2727
2728   if (!f->attr.pure && !f->attr.elemental)
2729     {
2730       gfc_error ("Specification function '%s' at %L must be PURE", f->name,
2731                  &e->where);
2732       return FAILURE;
2733     }
2734
2735   if (f->attr.recursive)
2736     {
2737       gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
2738                  f->name, &e->where);
2739       return FAILURE;
2740     }
2741
2742   return restricted_args (e->value.function.actual);
2743 }
2744
2745
2746 /* Check to see that a function reference to an intrinsic is a
2747    restricted expression.  */
2748
2749 static gfc_try
2750 restricted_intrinsic (gfc_expr *e)
2751 {
2752   /* TODO: Check constraints on inquiry functions.  7.1.6.2 (7).  */
2753   if (check_inquiry (e, 0) == MATCH_YES)
2754     return SUCCESS;
2755
2756   return restricted_args (e->value.function.actual);
2757 }
2758
2759
2760 /* Check the expressions of an actual arglist.  Used by check_restricted.  */
2761
2762 static gfc_try
2763 check_arglist (gfc_actual_arglist* arg, gfc_try (*checker) (gfc_expr*))
2764 {
2765   for (; arg; arg = arg->next)
2766     if (checker (arg->expr) == FAILURE)
2767       return FAILURE;
2768
2769   return SUCCESS;
2770 }
2771
2772
2773 /* Check the subscription expressions of a reference chain with a checking
2774    function; used by check_restricted.  */
2775
2776 static gfc_try
2777 check_references (gfc_ref* ref, gfc_try (*checker) (gfc_expr*))
2778 {
2779   int dim;
2780
2781   if (!ref)
2782     return SUCCESS;
2783
2784   switch (ref->type)
2785     {
2786     case REF_ARRAY:
2787       for (dim = 0; dim != ref->u.ar.dimen; ++dim)
2788         {
2789           if (checker (ref->u.ar.start[dim]) == FAILURE)
2790             return FAILURE;
2791           if (checker (ref->u.ar.end[dim]) == FAILURE)
2792             return FAILURE;
2793           if (checker (ref->u.ar.stride[dim]) == FAILURE)
2794             return FAILURE;
2795         }
2796       break;
2797
2798     case REF_COMPONENT:
2799       /* Nothing needed, just proceed to next reference.  */
2800       break;
2801
2802     case REF_SUBSTRING:
2803       if (checker (ref->u.ss.start) == FAILURE)
2804         return FAILURE;
2805       if (checker (ref->u.ss.end) == FAILURE)
2806         return FAILURE;
2807       break;
2808
2809     default:
2810       gcc_unreachable ();
2811       break;
2812     }
2813
2814   return check_references (ref->next, checker);
2815 }
2816
2817
2818 /* Verify that an expression is a restricted expression.  Like its
2819    cousin check_init_expr(), an error message is generated if we
2820    return FAILURE.  */
2821
2822 static gfc_try
2823 check_restricted (gfc_expr *e)
2824 {
2825   gfc_symbol* sym;
2826   gfc_try t;
2827
2828   if (e == NULL)
2829     return SUCCESS;
2830
2831   switch (e->expr_type)
2832     {
2833     case EXPR_OP:
2834       t = check_intrinsic_op (e, check_restricted);
2835       if (t == SUCCESS)
2836         t = gfc_simplify_expr (e, 0);
2837
2838       break;
2839
2840     case EXPR_FUNCTION:
2841       if (e->value.function.esym)
2842         {
2843           t = check_arglist (e->value.function.actual, &check_restricted);
2844           if (t == SUCCESS)
2845             t = external_spec_function (e);
2846         }
2847       else
2848         {
2849           if (e->value.function.isym && e->value.function.isym->inquiry)
2850             t = SUCCESS;
2851           else
2852             t = check_arglist (e->value.function.actual, &check_restricted);
2853
2854           if (t == SUCCESS)
2855             t = restricted_intrinsic (e);
2856         }
2857       break;
2858
2859     case EXPR_VARIABLE:
2860       sym = e->symtree->n.sym;
2861       t = FAILURE;
2862
2863       /* If a dummy argument appears in a context that is valid for a
2864          restricted expression in an elemental procedure, it will have
2865          already been simplified away once we get here.  Therefore we
2866          don't need to jump through hoops to distinguish valid from
2867          invalid cases.  */
2868       if (sym->attr.dummy && sym->ns == gfc_current_ns
2869           && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
2870         {
2871           gfc_error ("Dummy argument '%s' not allowed in expression at %L",
2872                      sym->name, &e->where);
2873           break;
2874         }
2875
2876       if (sym->attr.optional)
2877         {
2878           gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2879                      sym->name, &e->where);
2880           break;
2881         }
2882
2883       if (sym->attr.intent == INTENT_OUT)
2884         {
2885           gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2886                      sym->name, &e->where);
2887           break;
2888         }
2889
2890       /* Check reference chain if any.  */
2891       if (check_references (e->ref, &check_restricted) == FAILURE)
2892         break;
2893
2894       /* gfc_is_formal_arg broadcasts that a formal argument list is being
2895          processed in resolve.c(resolve_formal_arglist).  This is done so
2896          that host associated dummy array indices are accepted (PR23446).
2897          This mechanism also does the same for the specification expressions
2898          of array-valued functions.  */
2899       if (e->error
2900             || sym->attr.in_common
2901             || sym->attr.use_assoc
2902             || sym->attr.dummy
2903             || sym->attr.implied_index
2904             || sym->attr.flavor == FL_PARAMETER
2905             || (sym->ns && sym->ns == gfc_current_ns->parent)
2906             || (sym->ns && gfc_current_ns->parent
2907                   && sym->ns == gfc_current_ns->parent->parent)
2908             || (sym->ns->proc_name != NULL
2909                   && sym->ns->proc_name->attr.flavor == FL_MODULE)
2910             || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2911         {
2912           t = SUCCESS;
2913           break;
2914         }
2915
2916       gfc_error ("Variable '%s' cannot appear in the expression at %L",
2917                  sym->name, &e->where);
2918       /* Prevent a repetition of the error.  */
2919       e->error = 1;
2920       break;
2921
2922     case EXPR_NULL:
2923     case EXPR_CONSTANT:
2924       t = SUCCESS;
2925       break;
2926
2927     case EXPR_SUBSTRING:
2928       t = gfc_specification_expr (e->ref->u.ss.start);
2929       if (t == FAILURE)
2930         break;
2931
2932       t = gfc_specification_expr (e->ref->u.ss.end);
2933       if (t == SUCCESS)
2934         t = gfc_simplify_expr (e, 0);
2935
2936       break;
2937
2938     case EXPR_STRUCTURE:
2939       t = gfc_check_constructor (e, check_restricted);
2940       break;
2941
2942     case EXPR_ARRAY:
2943       t = gfc_check_constructor (e, check_restricted);
2944       break;
2945
2946     default:
2947       gfc_internal_error ("check_restricted(): Unknown expression type");
2948     }
2949
2950   return t;
2951 }
2952
2953
2954 /* Check to see that an expression is a specification expression.  If
2955    we return FAILURE, an error has been generated.  */
2956
2957 gfc_try
2958 gfc_specification_expr (gfc_expr *e)
2959 {
2960   gfc_component *comp;
2961
2962   if (e == NULL)
2963     return SUCCESS;
2964
2965   if (e->ts.type != BT_INTEGER)
2966     {
2967       gfc_error ("Expression at %L must be of INTEGER type, found %s",
2968                  &e->where, gfc_basic_typename (e->ts.type));
2969       return FAILURE;
2970     }
2971
2972   if (e->expr_type == EXPR_FUNCTION
2973           && !e->value.function.isym
2974           && !e->value.function.esym
2975           && !gfc_pure (e->symtree->n.sym)
2976           && (!gfc_is_proc_ptr_comp (e, &comp)
2977               || !comp->attr.pure))
2978     {
2979       gfc_error ("Function '%s' at %L must be PURE",
2980                  e->symtree->n.sym->name, &e->where);
2981       /* Prevent repeat error messages.  */
2982       e->symtree->n.sym->attr.pure = 1;
2983       return FAILURE;
2984     }
2985
2986   if (e->rank != 0)
2987     {
2988       gfc_error ("Expression at %L must be scalar", &e->where);
2989       return FAILURE;
2990     }
2991
2992   if (gfc_simplify_expr (e, 0) == FAILURE)
2993     return FAILURE;
2994
2995   return check_restricted (e);
2996 }
2997
2998
2999 /************** Expression conformance checks.  *************/
3000
3001 /* Given two expressions, make sure that the arrays are conformable.  */
3002
3003 gfc_try
3004 gfc_check_conformance (gfc_expr *op1, gfc_expr *op2, const char *optype_msgid, ...)
3005 {
3006   int op1_flag, op2_flag, d;
3007   mpz_t op1_size, op2_size;
3008   gfc_try t;
3009
3010   va_list argp;
3011   char buffer[240];
3012
3013   if (op1->rank == 0 || op2->rank == 0)
3014     return SUCCESS;
3015
3016   va_start (argp, optype_msgid);
3017   vsnprintf (buffer, 240, optype_msgid, argp);
3018   va_end (argp);
3019
3020   if (op1->rank != op2->rank)
3021     {
3022       gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(buffer),
3023                  op1->rank, op2->rank, &op1->where);
3024       return FAILURE;
3025     }
3026
3027   t = SUCCESS;
3028
3029   for (d = 0; d < op1->rank; d++)
3030     {
3031       op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
3032       op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
3033
3034       if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
3035         {
3036           gfc_error ("Different shape for %s at %L on dimension %d "
3037                      "(%d and %d)", _(buffer), &op1->where, d + 1,
3038                      (int) mpz_get_si (op1_size),
3039                      (int) mpz_get_si (op2_size));
3040
3041           t = FAILURE;
3042         }
3043
3044       if (op1_flag)
3045         mpz_clear (op1_size);
3046       if (op2_flag)
3047         mpz_clear (op2_size);
3048
3049       if (t == FAILURE)
3050         return FAILURE;
3051     }
3052
3053   return SUCCESS;
3054 }
3055
3056
3057 /* Given an assignable expression and an arbitrary expression, make
3058    sure that the assignment can take place.  */
3059
3060 gfc_try
3061 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
3062 {
3063   gfc_symbol *sym;
3064   gfc_ref *ref;
3065   int has_pointer;
3066
3067   sym = lvalue->symtree->n.sym;
3068
3069   /* See if this is the component or subcomponent of a pointer.  */
3070   has_pointer = sym->attr.pointer;
3071   for (ref = lvalue->ref; ref; ref = ref->next)
3072     if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
3073       {
3074         has_pointer = 1;
3075         break;
3076       }
3077
3078   /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
3079      variable local to a function subprogram.  Its existence begins when
3080      execution of the function is initiated and ends when execution of the
3081      function is terminated...
3082      Therefore, the left hand side is no longer a variable, when it is:  */
3083   if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
3084       && !sym->attr.external)
3085     {
3086       bool bad_proc;
3087       bad_proc = false;
3088
3089       /* (i) Use associated;  */
3090       if (sym->attr.use_assoc)
3091         bad_proc = true;
3092
3093       /* (ii) The assignment is in the main program; or  */
3094       if (gfc_current_ns->proc_name->attr.is_main_program)
3095         bad_proc = true;
3096
3097       /* (iii) A module or internal procedure...  */
3098       if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
3099            || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
3100           && gfc_current_ns->parent
3101           && (!(gfc_current_ns->parent->proc_name->attr.function
3102                 || gfc_current_ns->parent->proc_name->attr.subroutine)
3103               || gfc_current_ns->parent->proc_name->attr.is_main_program))
3104         {
3105           /* ... that is not a function...  */ 
3106           if (!gfc_current_ns->proc_name->attr.function)
3107             bad_proc = true;
3108
3109           /* ... or is not an entry and has a different name.  */
3110           if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
3111             bad_proc = true;
3112         }
3113
3114       /* (iv) Host associated and not the function symbol or the
3115               parent result.  This picks up sibling references, which
3116               cannot be entries.  */
3117       if (!sym->attr.entry
3118             && sym->ns == gfc_current_ns->parent
3119             && sym != gfc_current_ns->proc_name
3120             && sym != gfc_current_ns->parent->proc_name->result)
3121         bad_proc = true;
3122
3123       if (bad_proc)
3124         {
3125           gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
3126           return FAILURE;
3127         }
3128     }
3129
3130   if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
3131     {
3132       gfc_error ("Incompatible ranks %d and %d in assignment at %L",
3133                  lvalue->rank, rvalue->rank, &lvalue->where);
3134       return FAILURE;
3135     }
3136
3137   if (lvalue->ts.type == BT_UNKNOWN)
3138     {
3139       gfc_error ("Variable type is UNKNOWN in assignment at %L",
3140                  &lvalue->where);
3141       return FAILURE;
3142     }
3143
3144   if (rvalue->expr_type == EXPR_NULL)
3145     {  
3146       if (has_pointer && (ref == NULL || ref->next == NULL)
3147           && lvalue->symtree->n.sym->attr.data)
3148         return SUCCESS;
3149       else
3150         {
3151           gfc_error ("NULL appears on right-hand side in assignment at %L",
3152                      &rvalue->where);
3153           return FAILURE;
3154         }
3155     }
3156
3157   /* This is possibly a typo: x = f() instead of x => f().  */
3158   if (gfc_option.warn_surprising 
3159       && rvalue->expr_type == EXPR_FUNCTION
3160       && rvalue->symtree->n.sym->attr.pointer)
3161     gfc_warning ("POINTER valued function appears on right-hand side of "
3162                  "assignment at %L", &rvalue->where);
3163
3164   /* Check size of array assignments.  */
3165   if (lvalue->rank != 0 && rvalue->rank != 0
3166       && gfc_check_conformance (lvalue, rvalue, "array assignment") != SUCCESS)
3167     return FAILURE;
3168
3169   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
3170       && lvalue->symtree->n.sym->attr.data
3171       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L used to "
3172                          "initialize non-integer variable '%s'",
3173                          &rvalue->where, lvalue->symtree->n.sym->name)
3174          == FAILURE)
3175     return FAILURE;
3176   else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
3177       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L outside "
3178                          "a DATA statement and outside INT/REAL/DBLE/CMPLX",
3179                          &rvalue->where) == FAILURE)
3180     return FAILURE;
3181
3182   /* Handle the case of a BOZ literal on the RHS.  */
3183   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
3184     {
3185       int rc;
3186       if (gfc_option.warn_surprising)
3187         gfc_warning ("BOZ literal at %L is bitwise transferred "
3188                      "non-integer symbol '%s'", &rvalue->where,
3189                      lvalue->symtree->n.sym->name);
3190       if (!gfc_convert_boz (rvalue, &lvalue->ts))
3191         return FAILURE;
3192       if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
3193         {
3194           if (rc == ARITH_UNDERFLOW)
3195             gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
3196                        ". This check can be disabled with the option "
3197                        "-fno-range-check", &rvalue->where);
3198           else if (rc == ARITH_OVERFLOW)
3199             gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
3200                        ". This check can be disabled with the option "
3201                        "-fno-range-check", &rvalue->where);
3202           else if (rc == ARITH_NAN)
3203             gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
3204                        ". This check can be disabled with the option "
3205                        "-fno-range-check", &rvalue->where);
3206           return FAILURE;
3207         }
3208     }
3209
3210   /*  Warn about type-changing conversions for REAL or COMPLEX constants.
3211       If lvalue and rvalue are mixed REAL and complex, gfc_compare_types
3212       will warn anyway, so there is no need to to so here.  */
3213
3214   if (rvalue->expr_type == EXPR_CONSTANT && lvalue->ts.type == rvalue->ts.type
3215       && (lvalue->ts.type == BT_REAL || lvalue->ts.type == BT_COMPLEX))
3216     {
3217       if (lvalue->ts.kind < rvalue->ts.kind && gfc_option.gfc_warn_conversion)
3218         {
3219           /* As a special bonus, don't warn about REAL rvalues which are not
3220              changed by the conversion if -Wconversion is specified.  */
3221           if (rvalue->ts.type == BT_REAL && mpfr_number_p (rvalue->value.real))
3222             {
3223               /* Calculate the difference between the constant and the rounded
3224                  value and check it against zero.  */
3225               mpfr_t rv, diff;
3226               gfc_set_model_kind (lvalue->ts.kind);
3227               mpfr_init (rv);
3228               gfc_set_model_kind (rvalue->ts.kind);
3229               mpfr_init (diff);
3230               
3231               mpfr_set (rv, rvalue->value.real, GFC_RND_MODE);
3232               mpfr_sub (diff, rv, rvalue->value.real, GFC_RND_MODE);
3233           
3234               if (!mpfr_zero_p (diff))
3235                 gfc_warning ("Change of value in conversion from "
3236                              " %s to %s at %L", gfc_typename (&rvalue->ts),
3237                              gfc_typename (&lvalue->ts), &rvalue->where);
3238               
3239               mpfr_clear (rv);
3240               mpfr_clear (diff);
3241             }
3242           else
3243             gfc_warning ("Possible change of value in conversion from %s "
3244                          "to %s at %L",gfc_typename (&rvalue->ts),
3245                          gfc_typename (&lvalue->ts), &rvalue->where);
3246
3247         }
3248       else if (gfc_option.warn_conversion_extra
3249                && lvalue->ts.kind > rvalue->ts.kind)
3250         {
3251           gfc_warning ("Conversion from %s to %s at %L",
3252                        gfc_typename (&rvalue->ts),
3253                        gfc_typename (&lvalue->ts), &rvalue->where);
3254         }
3255     }
3256
3257   if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
3258     return SUCCESS;
3259
3260   /* Only DATA Statements come here.  */
3261   if (!conform)
3262     {
3263       /* Numeric can be converted to any other numeric. And Hollerith can be
3264          converted to any other type.  */
3265       if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
3266           || rvalue->ts.type == BT_HOLLERITH)
3267         return SUCCESS;
3268
3269       if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
3270         return SUCCESS;
3271
3272       gfc_error ("Incompatible types in DATA statement at %L; attempted "
3273                  "conversion of %s to %s", &lvalue->where,
3274                  gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3275
3276       return FAILURE;
3277     }
3278
3279   /* Assignment is the only case where character variables of different
3280      kind values can be converted into one another.  */
3281   if (lvalue->ts.type == BT_CHARACTER && rvalue->ts.type == BT_CHARACTER)
3282     {
3283       if (lvalue->ts.kind != rvalue->ts.kind)
3284         gfc_convert_chartype (rvalue, &lvalue->ts);
3285
3286       return SUCCESS;
3287     }
3288
3289   return gfc_convert_type (rvalue, &lvalue->ts, 1);
3290 }
3291
3292
3293 /* Check that a pointer assignment is OK.  We first check lvalue, and
3294    we only check rvalue if it's not an assignment to NULL() or a
3295    NULLIFY statement.  */
3296
3297 gfc_try
3298 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
3299 {
3300   symbol_attribute attr;
3301   gfc_ref *ref;
3302   bool is_pure, is_implicit_pure, rank_remap;
3303   int proc_pointer;
3304
3305   if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN
3306       && !lvalue->symtree->n.sym->attr.proc_pointer)
3307     {
3308       gfc_error ("Pointer assignment target is not a POINTER at %L",
3309                  &lvalue->where);
3310       return FAILURE;
3311     }
3312
3313   if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
3314       && lvalue->symtree->n.sym->attr.use_assoc
3315       && !lvalue->symtree->n.sym->attr.proc_pointer)
3316     {
3317       gfc_error ("'%s' in the pointer assignment at %L cannot be an "
3318                  "l-value since it is a procedure",
3319                  lvalue->symtree->n.sym->name, &lvalue->where);
3320       return FAILURE;
3321     }
3322
3323   proc_pointer = lvalue->symtree->n.sym->attr.proc_pointer;
3324
3325   rank_remap = false;
3326   for (ref = lvalue->ref; ref; ref = ref->next)
3327     {
3328       if (ref->type == REF_COMPONENT)
3329         proc_pointer = ref->u.c.component->attr.proc_pointer;
3330
3331       if (ref->type == REF_ARRAY && ref->next == NULL)
3332         {
3333           int dim;
3334
3335           if (ref->u.ar.type == AR_FULL)
3336             break;
3337
3338           if (ref->u.ar.type != AR_SECTION)
3339             {
3340               gfc_error ("Expected bounds specification for '%s' at %L",
3341                          lvalue->symtree->n.sym->name, &lvalue->where);
3342               return FAILURE;
3343             }
3344
3345           if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Bounds "
3346                               "specification for '%s' in pointer assignment "
3347                               "at %L", lvalue->symtree->n.sym->name,
3348                               &lvalue->where) == FAILURE)
3349             return FAILURE;
3350
3351           /* When bounds are given, all lbounds are necessary and either all
3352              or none of the upper bounds; no strides are allowed.  If the
3353              upper bounds are present, we may do rank remapping.  */
3354           for (dim = 0; dim < ref->u.ar.dimen; ++dim)
3355             {
3356               if (!ref->u.ar.start[dim]
3357                   || ref->u.ar.dimen_type[dim] != DIMEN_RANGE)
3358                 {
3359                   gfc_error ("Lower bound has to be present at %L",
3360                              &lvalue->where);
3361                   return FAILURE;
3362                 }
3363               if (ref->u.ar.stride[dim])
3364                 {
3365                   gfc_error ("Stride must not be present at %L",
3366                              &lvalue->where);
3367                   return FAILURE;
3368                 }
3369
3370               if (dim == 0)
3371                 rank_remap = (ref->u.ar.end[dim] != NULL);
3372               else
3373                 {
3374                   if ((rank_remap && !ref->u.ar.end[dim])
3375                       || (!rank_remap && ref->u.ar.end[dim]))
3376                     {
3377                       gfc_error ("Either all or none of the upper bounds"
3378                                  " must be specified at %L", &lvalue->where);
3379                       return FAILURE;
3380                     }
3381                 }
3382             }
3383         }
3384     }
3385
3386   is_pure = gfc_pure (NULL);
3387   is_implicit_pure = gfc_implicit_pure (NULL);
3388
3389   /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
3390      kind, etc for lvalue and rvalue must match, and rvalue must be a
3391      pure variable if we're in a pure function.  */
3392   if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
3393     return SUCCESS;
3394
3395   /* F2008, C723 (pointer) and C726 (proc-pointer); for PURE also C1283.  */
3396   if (lvalue->expr_type == EXPR_VARIABLE
3397       && gfc_is_coindexed (lvalue))
3398     {
3399       gfc_ref *ref;
3400       for (ref = lvalue->ref; ref; ref = ref->next)
3401         if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3402           {
3403             gfc_error ("Pointer object at %L shall not have a coindex",
3404                        &lvalue->where);
3405             return FAILURE;
3406           }
3407     }
3408
3409   /* Checks on rvalue for procedure pointer assignments.  */
3410   if (proc_pointer)
3411     {
3412       char err[200];
3413       gfc_symbol *s1,*s2;
3414       gfc_component *comp;
3415       const char *name;
3416
3417       attr = gfc_expr_attr (rvalue);
3418       if (!((rvalue->expr_type == EXPR_NULL)
3419             || (rvalue->expr_type == EXPR_FUNCTION && attr.proc_pointer)
3420             || (rvalue->expr_type == EXPR_VARIABLE && attr.proc_pointer)
3421             || (rvalue->expr_type == EXPR_VARIABLE
3422                 && attr.flavor == FL_PROCEDURE)))
3423         {
3424           gfc_error ("Invalid procedure pointer assignment at %L",
3425                      &rvalue->where);
3426           return FAILURE;
3427         }
3428       if (attr.abstract)
3429         {
3430           gfc_error ("Abstract interface '%s' is invalid "
3431                      "in procedure pointer assignment at %L",
3432                      rvalue->symtree->name, &rvalue->where);
3433           return FAILURE;
3434         }
3435       /* Check for F08:C729.  */
3436       if (attr.flavor == FL_PROCEDURE)
3437         {
3438           if (attr.proc == PROC_ST_FUNCTION)
3439             {
3440               gfc_error ("Statement function '%s' is invalid "
3441                          "in procedure pointer assignment at %L",
3442                          rvalue->symtree->name, &rvalue->where);
3443               return FAILURE;
3444             }
3445           if (attr.proc == PROC_INTERNAL &&
3446               gfc_notify_std (GFC_STD_F2008, "Internal procedure '%s' is "
3447                               "invalid in procedure pointer assignment at %L",
3448                               rvalue->symtree->name, &rvalue->where) == FAILURE)
3449             return FAILURE;
3450         }
3451       /* Check for F08:C730.  */
3452       if (attr.elemental && !attr.intrinsic)
3453         {
3454           gfc_error ("Nonintrinsic elemental procedure '%s' is invalid "
3455                      "in procedure pointer assigment at %L",
3456                      rvalue->symtree->name, &rvalue->where);
3457           return FAILURE;
3458         }
3459
3460       /* Ensure that the calling convention is the same. As other attributes
3461          such as DLLEXPORT may differ, one explicitly only tests for the
3462          calling conventions.  */
3463       if (rvalue->expr_type == EXPR_VARIABLE
3464           && lvalue->symtree->n.sym->attr.ext_attr
3465                != rvalue->symtree->n.sym->attr.ext_attr)
3466         {
3467           symbol_attribute calls;
3468
3469           calls.ext_attr = 0;
3470           gfc_add_ext_attribute (&calls, EXT_ATTR_CDECL, NULL);
3471           gfc_add_ext_attribute (&calls, EXT_ATTR_STDCALL, NULL);
3472           gfc_add_ext_attribute (&calls, EXT_ATTR_FASTCALL, NULL);
3473
3474           if ((calls.ext_attr & lvalue->symtree->n.sym->attr.ext_attr)
3475               != (calls.ext_attr & rvalue->symtree->n.sym->attr.ext_attr))
3476             {
3477               gfc_error ("Mismatch in the procedure pointer assignment "
3478                          "at %L: mismatch in the calling convention",
3479                          &rvalue->where);
3480           return FAILURE;
3481             }
3482         }
3483
3484       if (gfc_is_proc_ptr_comp (lvalue, &comp))
3485         s1 = comp->ts.interface;
3486       else
3487         s1 = lvalue->symtree->n.sym;
3488
3489       if (gfc_is_proc_ptr_comp (rvalue, &comp))
3490         {
3491           s2 = comp->ts.interface;
3492           name = comp->name;
3493         }
3494       else if (rvalue->expr_type == EXPR_FUNCTION)
3495         {
3496           if (rvalue->value.function.esym)
3497             s2 = rvalue->value.function.esym->result;
3498           else
3499             s2 = rvalue->symtree->n.sym->result;
3500
3501           name = s2->name;
3502         }
3503       else
3504         {
3505           s2 = rvalue->symtree->n.sym;
3506           name = rvalue->symtree->n.sym->name;
3507         }
3508
3509       if (s1 && s2 && !gfc_compare_interfaces (s1, s2, name, 0, 1,
3510                                                err, sizeof(err)))
3511         {
3512           gfc_error ("Interface mismatch in procedure pointer assignment "
3513                      "at %L: %s", &rvalue->where, err);
3514           return FAILURE;
3515         }
3516
3517       return SUCCESS;
3518     }
3519
3520   if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
3521     {
3522       gfc_error ("Different types in pointer assignment at %L; attempted "
3523                  "assignment of %s to %s", &lvalue->where, 
3524                  gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3525       return FAILURE;
3526     }
3527
3528   if (lvalue->ts.type != BT_CLASS && lvalue->ts.kind != rvalue->ts.kind)
3529     {
3530       gfc_error ("Different kind type parameters in pointer "
3531                  "assignment at %L", &lvalue->where);
3532       return FAILURE;
3533     }
3534
3535   if (lvalue->rank != rvalue->rank && !rank_remap)
3536     {
3537       gfc_error ("Different ranks in pointer assignment at %L", &lvalue->where);
3538       return FAILURE;
3539     }
3540
3541   if (lvalue->ts.type == BT_CLASS && rvalue->ts.type == BT_DERIVED)
3542     /* Make sure the vtab is present.  */
3543     gfc_find_derived_vtab (rvalue->ts.u.derived);
3544
3545   /* Check rank remapping.  */
3546   if (rank_remap)
3547     {
3548       mpz_t lsize, rsize;
3549
3550       /* If this can be determined, check that the target must be at least as
3551          large as the pointer assigned to it is.  */
3552       if (gfc_array_size (lvalue, &lsize) == SUCCESS
3553           && gfc_array_size (rvalue, &rsize) == SUCCESS
3554           && mpz_cmp (rsize, lsize) < 0)
3555         {
3556           gfc_error ("Rank remapping target is smaller than size of the"
3557                      " pointer (%ld < %ld) at %L",
3558                      mpz_get_si (rsize), mpz_get_si (lsize),
3559                      &lvalue->where);
3560           return FAILURE;
3561         }
3562
3563       /* The target must be either rank one or it must be simply contiguous
3564          and F2008 must be allowed.  */
3565       if (rvalue->rank != 1)
3566         {
3567           if (!gfc_is_simply_contiguous (rvalue, true))
3568             {
3569               gfc_error ("Rank remapping target must be rank 1 or"
3570                          " simply contiguous at %L", &rvalue->where);
3571               return FAILURE;
3572             }
3573           if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: Rank remapping"
3574                               " target is not rank 1 at %L", &rvalue->where)
3575                 == FAILURE)
3576             return FAILURE;
3577         }
3578     }
3579
3580   /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
3581   if (rvalue->expr_type == EXPR_NULL)
3582     return SUCCESS;
3583
3584   if (lvalue->ts.type == BT_CHARACTER)
3585     {
3586       gfc_try t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment");
3587       if (t == FAILURE)
3588         return FAILURE;
3589     }
3590
3591   if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
3592     lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
3593
3594   attr = gfc_expr_attr (rvalue);
3595
3596   if (rvalue->expr_type == EXPR_FUNCTION && !attr.pointer)
3597     {
3598       gfc_error ("Target expression in pointer assignment "
3599                  "at %L must deliver a pointer result",
3600                  &rvalue->where);
3601       return FAILURE;
3602     }
3603
3604   if (!attr.target && !attr.pointer)
3605     {
3606       gfc_error ("Pointer assignment target is neither TARGET "
3607                  "nor POINTER at %L", &rvalue->where);
3608       return FAILURE;
3609     }
3610
3611   if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3612     {
3613       gfc_error ("Bad target in pointer assignment in PURE "
3614                  "procedure at %L", &rvalue->where);
3615     }
3616
3617   if (is_implicit_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3618     gfc_current_ns->proc_name->attr.implicit_pure = 0;
3619     
3620
3621   if (gfc_has_vector_index (rvalue))
3622     {
3623       gfc_error ("Pointer assignment with vector subscript "
3624                  "on rhs at %L", &rvalue->where);
3625       return FAILURE;
3626     }
3627
3628   if (attr.is_protected && attr.use_assoc
3629       && !(attr.pointer || attr.proc_pointer))
3630     {
3631       gfc_error ("Pointer assignment target has PROTECTED "
3632                  "attribute at %L", &rvalue->where);
3633       return FAILURE;
3634     }
3635
3636   /* F2008, C725. For PURE also C1283.  */
3637   if (rvalue->expr_type == EXPR_VARIABLE
3638       && gfc_is_coindexed (rvalue))
3639     {
3640       gfc_ref *ref;
3641       for (ref = rvalue->ref; ref; ref = ref->next)
3642         if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3643           {
3644             gfc_error ("Data target at %L shall not have a coindex",
3645                        &rvalue->where);
3646             return FAILURE;
3647           }
3648     }
3649
3650   return SUCCESS;
3651 }
3652
3653
3654 /* Relative of gfc_check_assign() except that the lvalue is a single
3655    symbol.  Used for initialization assignments.  */
3656
3657 gfc_try
3658 gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
3659 {
3660   gfc_expr lvalue;
3661   gfc_try r;
3662
3663   memset (&lvalue, '\0', sizeof (gfc_expr));
3664
3665   lvalue.expr_type = EXPR_VARIABLE;
3666   lvalue.ts = sym->ts;
3667   if (sym->as)
3668     lvalue.rank = sym->as->rank;
3669   lvalue.symtree = XCNEW (gfc_symtree);
3670   lvalue.symtree->n.sym = sym;
3671   lvalue.where = sym->declared_at;
3672
3673   if (sym->attr.pointer || sym->attr.proc_pointer
3674       || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->attr.class_pointer
3675           && rvalue->expr_type == EXPR_NULL))
3676     r = gfc_check_pointer_assign (&lvalue, rvalue);
3677   else
3678     r = gfc_check_assign (&lvalue, rvalue, 1);
3679
3680   free (lvalue.symtree);
3681
3682   if (r == FAILURE)
3683     return r;
3684   
3685   if (sym->attr.pointer && rvalue->expr_type != EXPR_NULL)
3686     {
3687       /* F08:C461. Additional checks for pointer initialization.  */
3688       symbol_attribute attr;
3689       attr = gfc_expr_attr (rvalue);
3690       if (attr.allocatable)
3691         {
3692           gfc_error ("Pointer initialization target at %C "
3693                      "must not be ALLOCATABLE ");
3694           return FAILURE;
3695         }
3696       if (!attr.target || attr.pointer)
3697         {
3698           gfc_error ("Pointer initialization target at %C "
3699                      "must have the TARGET attribute");
3700           return FAILURE;
3701         }
3702       if (!attr.save)
3703         {
3704           gfc_error ("Pointer initialization target at %C "
3705                      "must have the SAVE attribute");
3706           return FAILURE;
3707         }
3708     }
3709     
3710   if (sym->attr.proc_pointer && rvalue->expr_type != EXPR_NULL)
3711     {
3712       /* F08:C1220. Additional checks for procedure pointer initialization.  */
3713       symbol_attribute attr = gfc_expr_attr (rvalue);
3714       if (attr.proc_pointer)
3715         {
3716           gfc_error ("Procedure pointer initialization target at %L "
3717                      "may not be a procedure pointer", &rvalue->where);
3718           return FAILURE;
3719         }
3720     }
3721
3722   return SUCCESS;
3723 }
3724
3725
3726 /* Check for default initializer; sym->value is not enough
3727    as it is also set for EXPR_NULL of allocatables.  */
3728
3729 bool
3730 gfc_has_default_initializer (gfc_symbol *der)
3731 {
3732   gfc_component *c;
3733
3734   gcc_assert (der->attr.flavor == FL_DERIVED);
3735   for (c = der->components; c; c = c->next)
3736     if (c->ts.type == BT_DERIVED)
3737       {
3738         if (!c->attr.pointer
3739              && gfc_has_default_initializer (c->ts.u.derived))
3740           return true;
3741         if (c->attr.pointer && c->initializer)
3742           return true;
3743       }
3744     else
3745       {
3746         if (c->initializer)
3747           return true;
3748       }
3749
3750   return false;
3751 }
3752
3753
3754 /* Get an expression for a default initializer.  */
3755
3756 gfc_expr *
3757 gfc_default_initializer (gfc_typespec *ts)
3758 {
3759   gfc_expr *init;
3760   gfc_component *comp;
3761
3762   /* See if we have a default initializer in this, but not in nested
3763      types (otherwise we could use gfc_has_default_initializer()).  */
3764   for (comp = ts->u.derived->components; comp; comp = comp->next)
3765     if (comp->initializer || comp->attr.allocatable
3766         || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)
3767             && CLASS_DATA (comp)->attr.allocatable))
3768       break;
3769
3770   if (!comp)
3771     return NULL;
3772
3773   init = gfc_get_structure_constructor_expr (ts->type, ts->kind,
3774                                              &ts->u.derived->declared_at);
3775   init->ts = *ts;
3776
3777   for (comp = ts->u.derived->components; comp; comp = comp->next)
3778     {
3779       gfc_constructor *ctor = gfc_constructor_get();
3780
3781       if (comp->initializer)
3782         {
3783           ctor->expr = gfc_copy_expr (comp->initializer);
3784           if ((comp->ts.type != comp->initializer->ts.type
3785                || comp->ts.kind != comp->initializer->ts.kind)
3786               && !comp->attr.pointer && !comp->attr.proc_pointer)
3787             gfc_convert_type_warn (ctor->expr, &comp->ts, 2, false);
3788         }
3789
3790       if (comp->attr.allocatable
3791           || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable))
3792         {
3793           ctor->expr = gfc_get_expr ();
3794           ctor->expr->expr_type = EXPR_NULL;
3795           ctor->expr->ts = comp->ts;
3796         }
3797
3798       gfc_constructor_append (&init->value.constructor, ctor);
3799     }
3800
3801   return init;
3802 }
3803
3804
3805 /* Given a symbol, create an expression node with that symbol as a
3806    variable. If the symbol is array valued, setup a reference of the
3807    whole array.  */
3808
3809 gfc_expr *
3810 gfc_get_variable_expr (gfc_symtree *var)
3811 {
3812   gfc_expr *e;
3813
3814   e = gfc_get_expr ();
3815   e->expr_type = EXPR_VARIABLE;
3816   e->symtree = var;
3817   e->ts = var->n.sym->ts;
3818
3819   if ((var->n.sym->as != NULL && var->n.sym->ts.type != BT_CLASS)
3820       || (var->n.sym->ts.type == BT_CLASS && CLASS_DATA (var->n.sym)
3821           && CLASS_DATA (var->n.sym)->as))
3822     {
3823       e->rank = var->n.sym->ts.type == BT_CLASS
3824                 ? CLASS_DATA (var->n.sym)->as->rank : var->n.sym->as->rank;
3825       e->ref = gfc_get_ref ();
3826       e->ref->type = REF_ARRAY;
3827       e->ref->u.ar.type = AR_FULL;
3828     }
3829
3830   return e;
3831 }
3832
3833
3834 gfc_expr *
3835 gfc_lval_expr_from_sym (gfc_symbol *sym)
3836 {
3837   gfc_expr *lval;
3838   lval = gfc_get_expr ();
3839   lval->expr_type = EXPR_VARIABLE;
3840   lval->where = sym->declared_at;
3841   lval->ts = sym->ts;
3842   lval->symtree = gfc_find_symtree (sym->ns->sym_root, sym->name);
3843
3844   /* It will always be a full array.  */
3845   lval->rank = sym->as ? sym->as->rank : 0;
3846   if (lval->rank)
3847     {
3848       lval->ref = gfc_get_ref ();
3849       lval->ref->type = REF_ARRAY;
3850       lval->ref->u.ar.type = AR_FULL;
3851       lval->ref->u.ar.dimen = lval->rank;
3852       lval->ref->u.ar.where = sym->declared_at;
3853       lval->ref->u.ar.as = sym->ts.type == BT_CLASS
3854                            ? CLASS_DATA (sym)->as : sym->as;
3855     }
3856
3857   return lval;
3858 }
3859
3860
3861 /* Returns the array_spec of a full array expression.  A NULL is
3862    returned otherwise.  */
3863 gfc_array_spec *
3864 gfc_get_full_arrayspec_from_expr (gfc_expr *expr)
3865 {
3866   gfc_array_spec *as;
3867   gfc_ref *ref;
3868
3869   if (expr->rank == 0)
3870     return NULL;
3871
3872   /* Follow any component references.  */
3873   if (expr->expr_type == EXPR_VARIABLE
3874       || expr->expr_type == EXPR_CONSTANT)
3875     {
3876       as = expr->symtree->n.sym->as;
3877       for (ref = expr->ref; ref; ref = ref->next)
3878         {
3879           switch (ref->type)
3880             {
3881             case REF_COMPONENT:
3882               as = ref->u.c.component->as;
3883               continue;
3884
3885             case REF_SUBSTRING:
3886               continue;
3887
3888             case REF_ARRAY:
3889               {
3890                 switch (ref->u.ar.type)
3891                   {
3892                   case AR_ELEMENT:
3893                   case AR_SECTION:
3894                   case AR_UNKNOWN:
3895                     as = NULL;
3896                     continue;
3897
3898                   case AR_FULL:
3899                     break;
3900                   }
3901                 break;
3902               }
3903             }
3904         }
3905     }
3906   else
3907     as = NULL;
3908
3909   return as;
3910 }
3911
3912
3913 /* General expression traversal function.  */
3914
3915 bool
3916 gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
3917                    bool (*func)(gfc_expr *, gfc_symbol *, int*),
3918                    int f)
3919 {
3920   gfc_array_ref ar;
3921   gfc_ref *ref;
3922   gfc_actual_arglist *args;
3923   gfc_constructor *c;
3924   int i;
3925
3926   if (!expr)
3927     return false;
3928
3929   if ((*func) (expr, sym, &f))
3930     return true;
3931
3932   if (expr->ts.type == BT_CHARACTER
3933         && expr->ts.u.cl
3934         && expr->ts.u.cl->length
3935         && expr->ts.u.cl->length->expr_type != EXPR_CONSTANT
3936         && gfc_traverse_expr (expr->ts.u.cl->length, sym, func, f))
3937     return true;
3938
3939   switch (expr->expr_type)
3940     {
3941     case EXPR_PPC:
3942     case EXPR_COMPCALL:
3943     case EXPR_FUNCTION:
3944       for (args = expr->value.function.actual; args; args = args->next)
3945         {
3946           if (gfc_traverse_expr (args->expr, sym, func, f))
3947             return true;
3948         }
3949       break;
3950
3951     case EXPR_VARIABLE:
3952     case EXPR_CONSTANT:
3953     case EXPR_NULL:
3954     case EXPR_SUBSTRING:
3955       break;
3956
3957     case EXPR_STRUCTURE:
3958     case EXPR_ARRAY:
3959       for (c = gfc_constructor_first (expr->value.constructor);
3960            c; c = gfc_constructor_next (c))
3961         {
3962           if (gfc_traverse_expr (c->expr, sym, func, f))
3963             return true;
3964           if (c->iterator)
3965             {
3966               if (gfc_traverse_expr (c->iterator->var, sym, func, f))
3967                 return true;
3968               if (gfc_traverse_expr (c->iterator->start, sym, func, f))
3969                 return true;
3970               if (gfc_traverse_expr (c->iterator->end, sym, func, f))
3971                 return true;
3972               if (gfc_traverse_expr (c->iterator->step, sym, func, f))
3973                 return true;
3974             }
3975         }
3976       break;
3977
3978     case EXPR_OP:
3979       if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
3980         return true;
3981       if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
3982         return true;
3983       break;
3984
3985     default:
3986       gcc_unreachable ();
3987       break;
3988     }
3989
3990   ref = expr->ref;
3991   while (ref != NULL)
3992     {
3993       switch (ref->type)
3994         {
3995         case  REF_ARRAY:
3996           ar = ref->u.ar;
3997           for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
3998             {
3999               if (gfc_traverse_expr (ar.start[i], sym, func, f))
4000                 return true;
4001               if (gfc_traverse_expr (ar.end[i], sym, func, f))
4002                 return true;
4003               if (gfc_traverse_expr (ar.stride[i], sym, func, f))
4004                 return true;
4005             }
4006           break;
4007
4008         case REF_SUBSTRING:
4009           if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
4010             return true;
4011           if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
4012             return true;
4013           break;
4014
4015         case REF_COMPONENT:
4016           if (ref->u.c.component->ts.type == BT_CHARACTER
4017                 && ref->u.c.component->ts.u.cl
4018                 && ref->u.c.component->ts.u.cl->length
4019                 && ref->u.c.component->ts.u.cl->length->expr_type
4020                      != EXPR_CONSTANT
4021                 && gfc_traverse_expr (ref->u.c.component->ts.u.cl->length,
4022                                       sym, func, f))
4023             return true;
4024
4025           if (ref->u.c.component->as)
4026             for (i = 0; i < ref->u.c.component->as->rank
4027                             + ref->u.c.component->as->corank; i++)
4028               {
4029                 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
4030                                        sym, func, f))
4031                   return true;
4032                 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
4033                                        sym, func, f))
4034                   return true;
4035               }
4036           break;
4037
4038         default:
4039           gcc_unreachable ();
4040         }
4041       ref = ref->next;
4042     }
4043   return false;
4044 }
4045
4046 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
4047
4048 static bool
4049 expr_set_symbols_referenced (gfc_expr *expr,
4050                              gfc_symbol *sym ATTRIBUTE_UNUSED,
4051                              int *f ATTRIBUTE_UNUSED)
4052 {
4053   if (expr->expr_type != EXPR_VARIABLE)
4054     return false;
4055   gfc_set_sym_referenced (expr->symtree->n.sym);
4056   return false;
4057 }
4058
4059 void
4060 gfc_expr_set_symbols_referenced (gfc_expr *expr)
4061 {
4062   gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
4063 }
4064
4065
4066 /* Determine if an expression is a procedure pointer component. If yes, the
4067    argument 'comp' will point to the component (provided that 'comp' was
4068    provided).  */
4069
4070 bool
4071 gfc_is_proc_ptr_comp (gfc_expr *expr, gfc_component **comp)
4072 {
4073   gfc_ref *ref;
4074   bool ppc = false;
4075
4076   if (!expr || !expr->ref)
4077     return false;
4078
4079   ref = expr->ref;
4080   while (ref->next)
4081     ref = ref->next;
4082
4083   if (ref->type == REF_COMPONENT)
4084     {
4085       ppc = ref->u.c.component->attr.proc_pointer;
4086       if (ppc && comp)
4087         *comp = ref->u.c.component;
4088     }
4089
4090   return ppc;
4091 }
4092
4093
4094 /* Walk an expression tree and check each variable encountered for being typed.
4095    If strict is not set, a top-level variable is tolerated untyped in -std=gnu
4096    mode as is a basic arithmetic expression using those; this is for things in
4097    legacy-code like:
4098
4099      INTEGER :: arr(n), n
4100      INTEGER :: arr(n + 1), n
4101
4102    The namespace is needed for IMPLICIT typing.  */
4103
4104 static gfc_namespace* check_typed_ns;
4105
4106 static bool
4107 expr_check_typed_help (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
4108                        int* f ATTRIBUTE_UNUSED)
4109 {
4110   gfc_try t;
4111
4112   if (e->expr_type != EXPR_VARIABLE)
4113     return false;
4114
4115   gcc_assert (e->symtree);
4116   t = gfc_check_symbol_typed (e->symtree->n.sym, check_typed_ns,
4117                               true, e->where);
4118
4119   return (t == FAILURE);
4120 }
4121
4122 gfc_try
4123 gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
4124 {
4125   bool error_found;
4126
4127   /* If this is a top-level variable or EXPR_OP, do the check with strict given
4128      to us.  */
4129   if (!strict)
4130     {
4131       if (e->expr_type == EXPR_VARIABLE && !e->ref)
4132         return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
4133
4134       if (e->expr_type == EXPR_OP)
4135         {
4136           gfc_try t = SUCCESS;
4137
4138           gcc_assert (e->value.op.op1);
4139           t = gfc_expr_check_typed (e->value.op.op1, ns, strict);
4140
4141           if (t == SUCCESS && e->value.op.op2)
4142             t = gfc_expr_check_typed (e->value.op.op2, ns, strict);
4143
4144           return t;
4145         }
4146     }
4147
4148   /* Otherwise, walk the expression and do it strictly.  */
4149   check_typed_ns = ns;
4150   error_found = gfc_traverse_expr (e, NULL, &expr_check_typed_help, 0);
4151
4152   return error_found ? FAILURE : SUCCESS;
4153 }
4154
4155
4156 /* Walk an expression tree and replace all dummy symbols by the corresponding
4157    symbol in the formal_ns of "sym". Needed for copying interfaces in PROCEDURE
4158    statements. The boolean return value is required by gfc_traverse_expr.  */
4159
4160 static bool
4161 replace_symbol (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
4162 {
4163   if ((expr->expr_type == EXPR_VARIABLE 
4164        || (expr->expr_type == EXPR_FUNCTION
4165            && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
4166       && expr->symtree->n.sym->ns == sym->ts.interface->formal_ns
4167       && expr->symtree->n.sym->attr.dummy)
4168     {
4169       gfc_symtree *root = sym->formal_ns ? sym->formal_ns->sym_root
4170                                          : gfc_current_ns->sym_root;
4171       gfc_symtree *stree = gfc_find_symtree (root, expr->symtree->n.sym->name);
4172       gcc_assert (stree);
4173       stree->n.sym->attr = expr->symtree->n.sym->attr;
4174       expr->symtree = stree;
4175     }
4176   return false;
4177 }
4178
4179 void
4180 gfc_expr_replace_symbols (gfc_expr *expr, gfc_symbol *dest)
4181 {
4182   gfc_traverse_expr (expr, dest, &replace_symbol, 0);
4183 }
4184
4185
4186 /* The following is analogous to 'replace_symbol', and needed for copying
4187    interfaces for procedure pointer components. The argument 'sym' must formally
4188    be a gfc_symbol, so that the function can be passed to gfc_traverse_expr.
4189    However, it gets actually passed a gfc_component (i.e. the procedure pointer
4190    component in whose formal_ns the arguments have to be).  */
4191
4192 static bool
4193 replace_comp (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
4194 {
4195   gfc_component *comp;
4196   comp = (gfc_component *)sym;
4197   if ((expr->expr_type == EXPR_VARIABLE 
4198        || (expr->expr_type == EXPR_FUNCTION && !expr->value.function.isym
4199            && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
4200       && expr->symtree->n.sym->ns == comp->ts.interface->formal_ns)
4201     {
4202       gfc_symtree *stree;
4203       gfc_namespace *ns = comp->formal_ns;
4204       /* Don't use gfc_get_symtree as we prefer to fail badly if we don't find
4205          the symtree rather than create a new one (and probably fail later).  */
4206       stree = gfc_find_symtree (ns ? ns->sym_root : gfc_current_ns->sym_root,
4207                                 expr->symtree->n.sym->name);
4208       gcc_assert (stree);
4209       stree->n.sym->attr = expr->symtree->n.sym->attr;
4210       expr->symtree = stree;
4211     }
4212   return false;
4213 }
4214
4215 void
4216 gfc_expr_replace_comp (gfc_expr *expr, gfc_component *dest)
4217 {
4218   gfc_traverse_expr (expr, (gfc_symbol *)dest, &replace_comp, 0);
4219 }
4220
4221
4222 bool
4223 gfc_ref_this_image (gfc_ref *ref)
4224 {
4225   int n;
4226
4227   gcc_assert (ref->type == REF_ARRAY && ref->u.ar.codimen > 0);
4228
4229   for (n = ref->u.ar.dimen; n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
4230     if (ref->u.ar.dimen_type[n] != DIMEN_THIS_IMAGE)
4231       return false;
4232
4233   return true;
4234 }
4235
4236
4237 bool
4238 gfc_is_coindexed (gfc_expr *e)
4239 {
4240   gfc_ref *ref;
4241
4242   for (ref = e->ref; ref; ref = ref->next)
4243     if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4244       return !gfc_ref_this_image (ref);
4245
4246   return false;
4247 }
4248
4249
4250 /* Coarrays are variables with a corank but not being coindexed. However, also
4251    the following is a coarray: A subobject of a coarray is a coarray if it does
4252    not have any cosubscripts, vector subscripts, allocatable component
4253    selection, or pointer component selection. (F2008, 2.4.7)  */
4254
4255 bool
4256 gfc_is_coarray (gfc_expr *e)
4257 {
4258   gfc_ref *ref;
4259   gfc_symbol *sym;
4260   gfc_component *comp;
4261   bool coindexed;
4262   bool coarray;
4263   int i;
4264
4265   if (e->expr_type != EXPR_VARIABLE)
4266     return false;
4267
4268   coindexed = false;
4269   sym = e->symtree->n.sym;
4270
4271   if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
4272     coarray = CLASS_DATA (sym)->attr.codimension;
4273   else
4274     coarray = sym->attr.codimension;
4275
4276   for (ref = e->ref; ref; ref = ref->next)
4277     switch (ref->type)
4278     {
4279       case REF_COMPONENT:
4280         comp = ref->u.c.component;
4281         if (comp->ts.type == BT_CLASS && comp->attr.class_ok
4282             && (CLASS_DATA (comp)->attr.class_pointer
4283                 || CLASS_DATA (comp)->attr.allocatable))
4284           {
4285             coindexed = false;
4286             coarray = CLASS_DATA (comp)->attr.codimension;
4287           }
4288         else if (comp->attr.pointer || comp->attr.allocatable)
4289           {
4290             coindexed = false;
4291             coarray = comp->attr.codimension;
4292           }
4293         break;
4294
4295      case REF_ARRAY:
4296         if (!coarray)
4297           break;
4298
4299         if (ref->u.ar.codimen > 0 && !gfc_ref_this_image (ref))
4300           {
4301             coindexed = true;
4302             break;
4303           }
4304
4305         for (i = 0; i < ref->u.ar.dimen; i++)
4306           if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
4307             {
4308               coarray = false;
4309               break;
4310             }
4311         break;
4312
4313      case REF_SUBSTRING:
4314         break;
4315     }
4316
4317   return coarray && !coindexed;
4318 }
4319
4320
4321 int
4322 gfc_get_corank (gfc_expr *e)
4323 {
4324   int corank;
4325   gfc_ref *ref;
4326
4327   if (!gfc_is_coarray (e))
4328     return 0;
4329
4330   if (e->ts.type == BT_CLASS && e->ts.u.derived->components)
4331     corank = e->ts.u.derived->components->as
4332              ? e->ts.u.derived->components->as->corank : 0;
4333   else 
4334     corank = e->symtree->n.sym->as ? e->symtree->n.sym->as->corank : 0;
4335
4336   for (ref = e->ref; ref; ref = ref->next)
4337     {
4338       if (ref->type == REF_ARRAY)
4339         corank = ref->u.ar.as->corank;
4340       gcc_assert (ref->type != REF_SUBSTRING);
4341     }
4342
4343   return corank;
4344 }
4345
4346
4347 /* Check whether the expression has an ultimate allocatable component.
4348    Being itself allocatable does not count.  */
4349 bool
4350 gfc_has_ultimate_allocatable (gfc_expr *e)
4351 {
4352   gfc_ref *ref, *last = NULL;
4353
4354   if (e->expr_type != EXPR_VARIABLE)
4355     return false;
4356
4357   for (ref = e->ref; ref; ref = ref->next)
4358     if (ref->type == REF_COMPONENT)
4359       last = ref;
4360
4361   if (last && last->u.c.component->ts.type == BT_CLASS)
4362     return CLASS_DATA (last->u.c.component)->attr.alloc_comp;
4363   else if (last && last->u.c.component->ts.type == BT_DERIVED)
4364     return last->u.c.component->ts.u.derived->attr.alloc_comp;
4365   else if (last)
4366     return false;
4367
4368   if (e->ts.type == BT_CLASS)
4369     return CLASS_DATA (e)->attr.alloc_comp;
4370   else if (e->ts.type == BT_DERIVED)
4371     return e->ts.u.derived->attr.alloc_comp;
4372   else
4373     return false;
4374 }
4375
4376
4377 /* Check whether the expression has an pointer component.
4378    Being itself a pointer does not count.  */
4379 bool
4380 gfc_has_ultimate_pointer (gfc_expr *e)
4381 {
4382   gfc_ref *ref, *last = NULL;
4383
4384   if (e->expr_type != EXPR_VARIABLE)
4385     return false;
4386
4387   for (ref = e->ref; ref; ref = ref->next)
4388     if (ref->type == REF_COMPONENT)
4389       last = ref;
4390  
4391   if (last && last->u.c.component->ts.type == BT_CLASS)
4392     return CLASS_DATA (last->u.c.component)->attr.pointer_comp;
4393   else if (last && last->u.c.component->ts.type == BT_DERIVED)
4394     return last->u.c.component->ts.u.derived->attr.pointer_comp;
4395   else if (last)
4396     return false;
4397
4398   if (e->ts.type == BT_CLASS)
4399     return CLASS_DATA (e)->attr.pointer_comp;
4400   else if (e->ts.type == BT_DERIVED)
4401     return e->ts.u.derived->attr.pointer_comp;
4402   else
4403     return false;
4404 }
4405
4406
4407 /* Check whether an expression is "simply contiguous", cf. F2008, 6.5.4.
4408    Note: A scalar is not regarded as "simply contiguous" by the standard.
4409    if bool is not strict, some futher checks are done - for instance,
4410    a "(::1)" is accepted.  */
4411
4412 bool
4413 gfc_is_simply_contiguous (gfc_expr *expr, bool strict)
4414 {
4415   bool colon;
4416   int i;
4417   gfc_array_ref *ar = NULL;
4418   gfc_ref *ref, *part_ref = NULL;
4419   gfc_symbol *sym;
4420
4421   if (expr->expr_type == EXPR_FUNCTION)
4422     return expr->value.function.esym
4423            ? expr->value.function.esym->result->attr.contiguous : false;
4424   else if (expr->expr_type != EXPR_VARIABLE)
4425     return false;
4426
4427   if (expr->rank == 0)
4428     return false;
4429
4430   for (ref = expr->ref; ref; ref = ref->next)
4431     {
4432       if (ar)
4433         return false; /* Array shall be last part-ref. */
4434
4435       if (ref->type == REF_COMPONENT)
4436         part_ref  = ref;
4437       else if (ref->type == REF_SUBSTRING)
4438         return false;
4439       else if (ref->u.ar.type != AR_ELEMENT)
4440         ar = &ref->u.ar;
4441     }
4442
4443   sym = expr->symtree->n.sym;
4444   if (expr->ts.type != BT_CLASS
4445         && ((part_ref
4446                 && !part_ref->u.c.component->attr.contiguous
4447                 && part_ref->u.c.component->attr.pointer)
4448             || (!part_ref
4449                 && !sym->attr.contiguous
4450                 && (sym->attr.pointer
4451                       || sym->as->type == AS_ASSUMED_SHAPE))))
4452     return false;
4453
4454   if (!ar || ar->type == AR_FULL)
4455     return true;
4456
4457   gcc_assert (ar->type == AR_SECTION);
4458
4459   /* Check for simply contiguous array */
4460   colon = true;
4461   for (i = 0; i < ar->dimen; i++)
4462     {
4463       if (ar->dimen_type[i] == DIMEN_VECTOR)
4464         return false;
4465
4466       if (ar->dimen_type[i] == DIMEN_ELEMENT)
4467         {
4468           colon = false;
4469           continue;
4470         }
4471
4472       gcc_assert (ar->dimen_type[i] == DIMEN_RANGE);
4473
4474
4475       /* If the previous section was not contiguous, that's an error,
4476          unless we have effective only one element and checking is not
4477          strict.  */
4478       if (!colon && (strict || !ar->start[i] || !ar->end[i]
4479                      || ar->start[i]->expr_type != EXPR_CONSTANT
4480                      || ar->end[i]->expr_type != EXPR_CONSTANT
4481                      || mpz_cmp (ar->start[i]->value.integer,
4482                                  ar->end[i]->value.integer) != 0))
4483         return false;
4484
4485       /* Following the standard, "(::1)" or - if known at compile time -
4486          "(lbound:ubound)" are not simply contigous; if strict
4487          is false, they are regarded as simply contiguous.  */
4488       if (ar->stride[i] && (strict || ar->stride[i]->expr_type != EXPR_CONSTANT
4489                             || ar->stride[i]->ts.type != BT_INTEGER
4490                             || mpz_cmp_si (ar->stride[i]->value.integer, 1) != 0))
4491         return false;
4492
4493       if (ar->start[i]
4494           && (strict || ar->start[i]->expr_type != EXPR_CONSTANT
4495               || !ar->as->lower[i]
4496               || ar->as->lower[i]->expr_type != EXPR_CONSTANT
4497               || mpz_cmp (ar->start[i]->value.integer,
4498                           ar->as->lower[i]->value.integer) != 0))
4499         colon = false;
4500
4501       if (ar->end[i]
4502           && (strict || ar->end[i]->expr_type != EXPR_CONSTANT
4503               || !ar->as->upper[i]
4504               || ar->as->upper[i]->expr_type != EXPR_CONSTANT
4505               || mpz_cmp (ar->end[i]->value.integer,
4506                           ar->as->upper[i]->value.integer) != 0))
4507         colon = false;
4508     }
4509   
4510   return true;
4511 }
4512
4513
4514 /* Build call to an intrinsic procedure.  The number of arguments has to be
4515    passed (rather than ending the list with a NULL value) because we may
4516    want to add arguments but with a NULL-expression.  */
4517
4518 gfc_expr*
4519 gfc_build_intrinsic_call (gfc_namespace *ns, gfc_isym_id id, const char* name,
4520                           locus where, unsigned numarg, ...)
4521 {
4522   gfc_expr* result;
4523   gfc_actual_arglist* atail;
4524   gfc_intrinsic_sym* isym;
4525   va_list ap;
4526   unsigned i;
4527   const char *mangled_name = gfc_get_string (GFC_PREFIX ("%s"), name);
4528
4529   isym = gfc_intrinsic_function_by_id (id);
4530   gcc_assert (isym);
4531   
4532   result = gfc_get_expr ();
4533   result->expr_type = EXPR_FUNCTION;
4534   result->ts = isym->ts;
4535   result->where = where;
4536   result->value.function.name = mangled_name;
4537   result->value.function.isym = isym;
4538
4539   gfc_get_sym_tree (mangled_name, ns, &result->symtree, false);
4540   gfc_commit_symbol (result->symtree->n.sym);
4541   gcc_assert (result->symtree
4542               && (result->symtree->n.sym->attr.flavor == FL_PROCEDURE
4543                   || result->symtree->n.sym->attr.flavor == FL_UNKNOWN));
4544
4545   result->symtree->n.sym->intmod_sym_id = id;
4546   result->symtree->n.sym->attr.flavor = FL_PROCEDURE;
4547   result->symtree->n.sym->attr.intrinsic = 1;
4548
4549   va_start (ap, numarg);
4550   atail = NULL;
4551   for (i = 0; i < numarg; ++i)
4552     {
4553       if (atail)
4554         {
4555           atail->next = gfc_get_actual_arglist ();
4556           atail = atail->next;
4557         }
4558       else
4559         atail = result->value.function.actual = gfc_get_actual_arglist ();
4560
4561       atail->expr = va_arg (ap, gfc_expr*);
4562     }
4563   va_end (ap);
4564
4565   return result;
4566 }
4567
4568
4569 /* Check if an expression may appear in a variable definition context
4570    (F2008, 16.6.7) or pointer association context (F2008, 16.6.8).
4571    This is called from the various places when resolving
4572    the pieces that make up such a context.
4573
4574    Optionally, a possible error message can be suppressed if context is NULL
4575    and just the return status (SUCCESS / FAILURE) be requested.  */
4576
4577 gfc_try
4578 gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj,
4579                           const char* context)
4580 {
4581   gfc_symbol* sym = NULL;
4582   bool is_pointer;
4583   bool check_intentin;
4584   bool ptr_component;
4585   symbol_attribute attr;
4586   gfc_ref* ref;
4587
4588   if (e->expr_type == EXPR_VARIABLE)
4589     {
4590       gcc_assert (e->symtree);
4591       sym = e->symtree->n.sym;
4592     }
4593   else if (e->expr_type == EXPR_FUNCTION)
4594     {
4595       gcc_assert (e->symtree);
4596       sym = e->value.function.esym ? e->value.function.esym : e->symtree->n.sym;
4597     }
4598
4599   attr = gfc_expr_attr (e);
4600   if (!pointer && e->expr_type == EXPR_FUNCTION && attr.pointer)
4601     {
4602       if (!(gfc_option.allow_std & GFC_STD_F2008))
4603         {
4604           if (context)
4605             gfc_error ("Fortran 2008: Pointer functions in variable definition"
4606                        " context (%s) at %L", context, &e->where);
4607           return FAILURE;
4608         }
4609     }
4610   else if (e->expr_type != EXPR_VARIABLE)
4611     {
4612       if (context)
4613         gfc_error ("Non-variable expression in variable definition context (%s)"
4614                    " at %L", context, &e->where);
4615       return FAILURE;
4616     }
4617
4618   if (!pointer && sym->attr.flavor == FL_PARAMETER)
4619     {
4620       if (context)
4621         gfc_error ("Named constant '%s' in variable definition context (%s)"
4622                    " at %L", sym->name, context, &e->where);
4623       return FAILURE;
4624     }
4625   if (!pointer && sym->attr.flavor != FL_VARIABLE
4626       && !(sym->attr.flavor == FL_PROCEDURE && sym == sym->result)
4627       && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer))
4628     {
4629       if (context)
4630         gfc_error ("'%s' in variable definition context (%s) at %L is not"
4631                    " a variable", sym->name, context, &e->where);
4632       return FAILURE;
4633     }
4634
4635   /* Find out whether the expr is a pointer; this also means following
4636      component references to the last one.  */
4637   is_pointer = (attr.pointer || attr.proc_pointer);
4638   if (pointer && !is_pointer)
4639     {
4640       if (context)
4641         gfc_error ("Non-POINTER in pointer association context (%s)"
4642                    " at %L", context, &e->where);
4643       return FAILURE;
4644     }
4645
4646   /* F2008, C1303.  */
4647   if (!alloc_obj
4648       && (attr.lock_comp
4649           || (e->ts.type == BT_DERIVED
4650               && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
4651               && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)))
4652     {
4653       if (context)
4654         gfc_error ("LOCK_TYPE in variable definition context (%s) at %L",
4655                    context, &e->where);
4656       return FAILURE;
4657     }
4658
4659   /* INTENT(IN) dummy argument.  Check this, unless the object itself is
4660      the component of sub-component of a pointer.  Obviously,
4661      procedure pointers are of no interest here.  */
4662   check_intentin = true;
4663   ptr_component = sym->attr.pointer;
4664   for (ref = e->ref; ref && check_intentin; ref = ref->next)
4665     {
4666       if (ptr_component && ref->type == REF_COMPONENT)
4667         check_intentin = false;
4668       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
4669         {
4670           ptr_component = true;
4671           if (!pointer)
4672             check_intentin = false;
4673         }
4674     }
4675   if (check_intentin && sym->attr.intent == INTENT_IN)
4676     {
4677       if (pointer && is_pointer)
4678         {
4679           if (context)
4680             gfc_error ("Dummy argument '%s' with INTENT(IN) in pointer"
4681                        " association context (%s) at %L",
4682                        sym->name, context, &e->where);
4683           return FAILURE;
4684         }
4685       if (!pointer && !is_pointer && !sym->attr.pointer)
4686         {
4687           if (context)
4688             gfc_error ("Dummy argument '%s' with INTENT(IN) in variable"
4689                        " definition context (%s) at %L",
4690                        sym->name, context, &e->where);
4691           return FAILURE;
4692         }
4693     }
4694
4695   /* PROTECTED and use-associated.  */
4696   if (sym->attr.is_protected && sym->attr.use_assoc  && check_intentin)
4697     {
4698       if (pointer && is_pointer)
4699         {
4700           if (context)
4701             gfc_error ("Variable '%s' is PROTECTED and can not appear in a"
4702                        " pointer association context (%s) at %L",
4703                        sym->name, context, &e->where);
4704           return FAILURE;
4705         }
4706       if (!pointer && !is_pointer)
4707         {
4708           if (context)
4709             gfc_error ("Variable '%s' is PROTECTED and can not appear in a"
4710                        " variable definition context (%s) at %L",
4711                        sym->name, context, &e->where);
4712           return FAILURE;
4713         }
4714     }
4715
4716   /* Variable not assignable from a PURE procedure but appears in
4717      variable definition context.  */
4718   if (!pointer && gfc_pure (NULL) && gfc_impure_variable (sym))
4719     {
4720       if (context)
4721         gfc_error ("Variable '%s' can not appear in a variable definition"
4722                    " context (%s) at %L in PURE procedure",
4723                    sym->name, context, &e->where);
4724       return FAILURE;
4725     }
4726
4727   if (!pointer && context && gfc_implicit_pure (NULL)
4728       && gfc_impure_variable (sym))
4729     {
4730       gfc_namespace *ns;
4731       gfc_symbol *sym;
4732
4733       for (ns = gfc_current_ns; ns; ns = ns->parent)
4734         {
4735           sym = ns->proc_name;
4736           if (sym == NULL)
4737             break;
4738           if (sym->attr.flavor == FL_PROCEDURE)
4739             {
4740               sym->attr.implicit_pure = 0;
4741               break;
4742             }
4743         }
4744     }
4745   /* Check variable definition context for associate-names.  */
4746   if (!pointer && sym->assoc)
4747     {
4748       const char* name;
4749       gfc_association_list* assoc;
4750
4751       gcc_assert (sym->assoc->target);
4752
4753       /* If this is a SELECT TYPE temporary (the association is used internally
4754          for SELECT TYPE), silently go over to the target.  */
4755       if (sym->attr.select_type_temporary)
4756         {
4757           gfc_expr* t = sym->assoc->target;
4758
4759           gcc_assert (t->expr_type == EXPR_VARIABLE);
4760           name = t->symtree->name;
4761
4762           if (t->symtree->n.sym->assoc)
4763             assoc = t->symtree->n.sym->assoc;
4764           else
4765             assoc = sym->assoc;
4766         }
4767       else
4768         {
4769           name = sym->name;
4770           assoc = sym->assoc;
4771         }
4772       gcc_assert (name && assoc);
4773
4774       /* Is association to a valid variable?  */
4775       if (!assoc->variable)
4776         {
4777           if (context)
4778             {
4779               if (assoc->target->expr_type == EXPR_VARIABLE)
4780                 gfc_error ("'%s' at %L associated to vector-indexed target can"
4781                            " not be used in a variable definition context (%s)",
4782                            name, &e->where, context);
4783               else
4784                 gfc_error ("'%s' at %L associated to expression can"
4785                            " not be used in a variable definition context (%s)",
4786                            name, &e->where, context);
4787             }
4788           return FAILURE;
4789         }
4790
4791       /* Target must be allowed to appear in a variable definition context.  */
4792       if (gfc_check_vardef_context (assoc->target, pointer, false, NULL)
4793           == FAILURE)
4794         {
4795           if (context)
4796             gfc_error ("Associate-name '%s' can not appear in a variable"
4797                        " definition context (%s) at %L because its target"
4798                        " at %L can not, either",
4799                        name, context, &e->where,
4800                        &assoc->target->where);
4801           return FAILURE;
4802         }
4803     }
4804
4805   return SUCCESS;
4806 }