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