Second review of STAT= patch + tests
[platform/upstream/gcc.git] / gcc / fortran / expr.c
1 /* Routines for manipulation of expression nodes.
2    Copyright (C) 2000-2016 Free Software Foundation, Inc.
3    Contributed by Andy Vaught
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "options.h"
25 #include "gfortran.h"
26 #include "arith.h"
27 #include "match.h"
28 #include "target-memory.h" /* for gfc_convert_boz */
29 #include "constructor.h"
30
31
32 /* The following set of functions provide access to gfc_expr* of
33    various types - actual all but EXPR_FUNCTION and EXPR_VARIABLE.
34
35    There are two functions available elsewhere that provide
36    slightly different flavours of variables.  Namely:
37      expr.c (gfc_get_variable_expr)
38      symbol.c (gfc_lval_expr_from_sym)
39    TODO: Merge these functions, if possible.  */
40
41 /* Get a new expression node.  */
42
43 gfc_expr *
44 gfc_get_expr (void)
45 {
46   gfc_expr *e;
47
48   e = XCNEW (gfc_expr);
49   gfc_clear_ts (&e->ts);
50   e->shape = NULL;
51   e->ref = NULL;
52   e->symtree = NULL;
53   return e;
54 }
55
56
57 /* Get a new expression node that is an array constructor
58    of given type and kind.  */
59
60 gfc_expr *
61 gfc_get_array_expr (bt type, int kind, locus *where)
62 {
63   gfc_expr *e;
64
65   e = gfc_get_expr ();
66   e->expr_type = EXPR_ARRAY;
67   e->value.constructor = NULL;
68   e->rank = 1;
69   e->shape = NULL;
70
71   e->ts.type = type;
72   e->ts.kind = kind;
73   if (where)
74     e->where = *where;
75
76   return e;
77 }
78
79
80 /* Get a new expression node that is the NULL expression.  */
81
82 gfc_expr *
83 gfc_get_null_expr (locus *where)
84 {
85   gfc_expr *e;
86
87   e = gfc_get_expr ();
88   e->expr_type = EXPR_NULL;
89   e->ts.type = BT_UNKNOWN;
90
91   if (where)
92     e->where = *where;
93
94   return e;
95 }
96
97
98 /* Get a new expression node that is an operator expression node.  */
99
100 gfc_expr *
101 gfc_get_operator_expr (locus *where, gfc_intrinsic_op op,
102                       gfc_expr *op1, gfc_expr *op2)
103 {
104   gfc_expr *e;
105
106   e = gfc_get_expr ();
107   e->expr_type = EXPR_OP;
108   e->value.op.op = op;
109   e->value.op.op1 = op1;
110   e->value.op.op2 = op2;
111
112   if (where)
113     e->where = *where;
114
115   return e;
116 }
117
118
119 /* Get a new expression node that is an structure constructor
120    of given type and kind.  */
121
122 gfc_expr *
123 gfc_get_structure_constructor_expr (bt type, int kind, locus *where)
124 {
125   gfc_expr *e;
126
127   e = gfc_get_expr ();
128   e->expr_type = EXPR_STRUCTURE;
129   e->value.constructor = NULL;
130
131   e->ts.type = type;
132   e->ts.kind = kind;
133   if (where)
134     e->where = *where;
135
136   return e;
137 }
138
139
140 /* Get a new expression node that is an constant of given type and kind.  */
141
142 gfc_expr *
143 gfc_get_constant_expr (bt type, int kind, locus *where)
144 {
145   gfc_expr *e;
146
147   if (!where)
148     gfc_internal_error ("gfc_get_constant_expr(): locus %<where%> cannot be "
149                         "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_struct:
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 true or false, 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           && gfc_sym_get_dummy_args (sym) == 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 bool
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 true;
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))
1024     return false;
1025   if (!gfc_simplify_expr (op2, type))
1026     return false;
1027
1028   if (!gfc_is_constant_expr (op1)
1029       || (op2 != NULL && !gfc_is_constant_expr (op2)))
1030     return true;
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 false;
1133     }
1134
1135   result->rank = p->rank;
1136   result->where = p->where;
1137   gfc_replace_expr (p, result);
1138
1139   return true;
1140 }
1141
1142
1143 /* Subroutine to simplify constructor expressions.  Mutually recursive
1144    with gfc_simplify_expr().  */
1145
1146 static bool
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)
1156               || !gfc_simplify_expr (c->iterator->end, type)
1157               || !gfc_simplify_expr (c->iterator->step, type)))
1158         return false;
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))
1168             {
1169               gfc_free_expr (p);
1170               continue;
1171             }
1172
1173           gfc_replace_expr (c->expr, p);
1174         }
1175     }
1176
1177   return true;
1178 }
1179
1180
1181 /* Pull a single array element out of an array constructor.  */
1182
1183 static bool
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   bool t;
1196
1197   t = true;
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])
1207           || !gfc_reduce_init_expr (ar->as->upper[i]))
1208         {
1209           t = false;
1210           cons = NULL;
1211           goto depart;
1212         }
1213
1214       e = 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 = false;
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   *rval = cons;
1264   return t;
1265 }
1266
1267
1268 /* Find a component of a structure constructor.  */
1269
1270 static gfc_constructor *
1271 find_component_ref (gfc_constructor_base base, gfc_ref *ref)
1272 {
1273   gfc_component *pick = ref->u.c.component;
1274   gfc_constructor *c = gfc_constructor_first (base);
1275
1276   gfc_symbol *dt = ref->u.c.sym;
1277   int ext = dt->attr.extension;
1278
1279   /* For extended types, check if the desired component is in one of the
1280    * parent types.  */
1281   while (ext > 0 && gfc_find_component (dt->components->ts.u.derived,
1282                                         pick->name, true, true, NULL))
1283     {
1284       dt = dt->components->ts.u.derived;
1285       c = gfc_constructor_first (c->expr->value.constructor);
1286       ext--;
1287     }
1288
1289   gfc_component *comp = dt->components;
1290   while (comp != pick)
1291     {
1292       comp = comp->next;
1293       c = gfc_constructor_next (c);
1294     }
1295
1296   return c;
1297 }
1298
1299
1300 /* Replace an expression with the contents of a constructor, removing
1301    the subobject reference in the process.  */
1302
1303 static void
1304 remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
1305 {
1306   gfc_expr *e;
1307
1308   if (cons)
1309     {
1310       e = cons->expr;
1311       cons->expr = NULL;
1312     }
1313   else
1314     e = gfc_copy_expr (p);
1315   e->ref = p->ref->next;
1316   p->ref->next =  NULL;
1317   gfc_replace_expr (p, e);
1318 }
1319
1320
1321 /* Pull an array section out of an array constructor.  */
1322
1323 static bool
1324 find_array_section (gfc_expr *expr, gfc_ref *ref)
1325 {
1326   int idx;
1327   int rank;
1328   int d;
1329   int shape_i;
1330   int limit;
1331   long unsigned one = 1;
1332   bool incr_ctr;
1333   mpz_t start[GFC_MAX_DIMENSIONS];
1334   mpz_t end[GFC_MAX_DIMENSIONS];
1335   mpz_t stride[GFC_MAX_DIMENSIONS];
1336   mpz_t delta[GFC_MAX_DIMENSIONS];
1337   mpz_t ctr[GFC_MAX_DIMENSIONS];
1338   mpz_t delta_mpz;
1339   mpz_t tmp_mpz;
1340   mpz_t nelts;
1341   mpz_t ptr;
1342   gfc_constructor_base base;
1343   gfc_constructor *cons, *vecsub[GFC_MAX_DIMENSIONS];
1344   gfc_expr *begin;
1345   gfc_expr *finish;
1346   gfc_expr *step;
1347   gfc_expr *upper;
1348   gfc_expr *lower;
1349   bool t;
1350
1351   t = true;
1352
1353   base = expr->value.constructor;
1354   expr->value.constructor = NULL;
1355
1356   rank = ref->u.ar.as->rank;
1357
1358   if (expr->shape == NULL)
1359     expr->shape = gfc_get_shape (rank);
1360
1361   mpz_init_set_ui (delta_mpz, one);
1362   mpz_init_set_ui (nelts, one);
1363   mpz_init (tmp_mpz);
1364
1365   /* Do the initialization now, so that we can cleanup without
1366      keeping track of where we were.  */
1367   for (d = 0; d < rank; d++)
1368     {
1369       mpz_init (delta[d]);
1370       mpz_init (start[d]);
1371       mpz_init (end[d]);
1372       mpz_init (ctr[d]);
1373       mpz_init (stride[d]);
1374       vecsub[d] = NULL;
1375     }
1376
1377   /* Build the counters to clock through the array reference.  */
1378   shape_i = 0;
1379   for (d = 0; d < rank; d++)
1380     {
1381       /* Make this stretch of code easier on the eye!  */
1382       begin = ref->u.ar.start[d];
1383       finish = ref->u.ar.end[d];
1384       step = ref->u.ar.stride[d];
1385       lower = ref->u.ar.as->lower[d];
1386       upper = ref->u.ar.as->upper[d];
1387
1388       if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR)  /* Vector subscript.  */
1389         {
1390           gfc_constructor *ci;
1391           gcc_assert (begin);
1392
1393           if (begin->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (begin))
1394             {
1395               t = false;
1396               goto cleanup;
1397             }
1398
1399           gcc_assert (begin->rank == 1);
1400           /* Zero-sized arrays have no shape and no elements, stop early.  */
1401           if (!begin->shape)
1402             {
1403               mpz_init_set_ui (nelts, 0);
1404               break;
1405             }
1406
1407           vecsub[d] = gfc_constructor_first (begin->value.constructor);
1408           mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1409           mpz_mul (nelts, nelts, begin->shape[0]);
1410           mpz_set (expr->shape[shape_i++], begin->shape[0]);
1411
1412           /* Check bounds.  */
1413           for (ci = vecsub[d]; ci; ci = gfc_constructor_next (ci))
1414             {
1415               if (mpz_cmp (ci->expr->value.integer, upper->value.integer) > 0
1416                   || mpz_cmp (ci->expr->value.integer,
1417                               lower->value.integer) < 0)
1418                 {
1419                   gfc_error ("index in dimension %d is out of bounds "
1420                              "at %L", d + 1, &ref->u.ar.c_where[d]);
1421                   t = false;
1422                   goto cleanup;
1423                 }
1424             }
1425         }
1426       else
1427         {
1428           if ((begin && begin->expr_type != EXPR_CONSTANT)
1429               || (finish && finish->expr_type != EXPR_CONSTANT)
1430               || (step && step->expr_type != EXPR_CONSTANT))
1431             {
1432               t = false;
1433               goto cleanup;
1434             }
1435
1436           /* Obtain the stride.  */
1437           if (step)
1438             mpz_set (stride[d], step->value.integer);
1439           else
1440             mpz_set_ui (stride[d], one);
1441
1442           if (mpz_cmp_ui (stride[d], 0) == 0)
1443             mpz_set_ui (stride[d], one);
1444
1445           /* Obtain the start value for the index.  */
1446           if (begin)
1447             mpz_set (start[d], begin->value.integer);
1448           else
1449             mpz_set (start[d], lower->value.integer);
1450
1451           mpz_set (ctr[d], start[d]);
1452
1453           /* Obtain the end value for the index.  */
1454           if (finish)
1455             mpz_set (end[d], finish->value.integer);
1456           else
1457             mpz_set (end[d], upper->value.integer);
1458
1459           /* Separate 'if' because elements sometimes arrive with
1460              non-null end.  */
1461           if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1462             mpz_set (end [d], begin->value.integer);
1463
1464           /* Check the bounds.  */
1465           if (mpz_cmp (ctr[d], upper->value.integer) > 0
1466               || mpz_cmp (end[d], upper->value.integer) > 0
1467               || mpz_cmp (ctr[d], lower->value.integer) < 0
1468               || mpz_cmp (end[d], lower->value.integer) < 0)
1469             {
1470               gfc_error ("index in dimension %d is out of bounds "
1471                          "at %L", d + 1, &ref->u.ar.c_where[d]);
1472               t = false;
1473               goto cleanup;
1474             }
1475
1476           /* Calculate the number of elements and the shape.  */
1477           mpz_set (tmp_mpz, stride[d]);
1478           mpz_add (tmp_mpz, end[d], tmp_mpz);
1479           mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1480           mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1481           mpz_mul (nelts, nelts, tmp_mpz);
1482
1483           /* An element reference reduces the rank of the expression; don't
1484              add anything to the shape array.  */
1485           if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT)
1486             mpz_set (expr->shape[shape_i++], tmp_mpz);
1487         }
1488
1489       /* Calculate the 'stride' (=delta) for conversion of the
1490          counter values into the index along the constructor.  */
1491       mpz_set (delta[d], delta_mpz);
1492       mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1493       mpz_add_ui (tmp_mpz, tmp_mpz, one);
1494       mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1495     }
1496
1497   mpz_init (ptr);
1498   cons = gfc_constructor_first (base);
1499
1500   /* Now clock through the array reference, calculating the index in
1501      the source constructor and transferring the elements to the new
1502      constructor.  */
1503   for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
1504     {
1505       mpz_init_set_ui (ptr, 0);
1506
1507       incr_ctr = true;
1508       for (d = 0; d < rank; d++)
1509         {
1510           mpz_set (tmp_mpz, ctr[d]);
1511           mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
1512           mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1513           mpz_add (ptr, ptr, tmp_mpz);
1514
1515           if (!incr_ctr) continue;
1516
1517           if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript.  */
1518             {
1519               gcc_assert(vecsub[d]);
1520
1521               if (!gfc_constructor_next (vecsub[d]))
1522                 vecsub[d] = gfc_constructor_first (ref->u.ar.start[d]->value.constructor);
1523               else
1524                 {
1525                   vecsub[d] = gfc_constructor_next (vecsub[d]);
1526                   incr_ctr = false;
1527                 }
1528               mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1529             }
1530           else
1531             {
1532               mpz_add (ctr[d], ctr[d], stride[d]);
1533
1534               if (mpz_cmp_ui (stride[d], 0) > 0
1535                   ? mpz_cmp (ctr[d], end[d]) > 0
1536                   : mpz_cmp (ctr[d], end[d]) < 0)
1537                 mpz_set (ctr[d], start[d]);
1538               else
1539                 incr_ctr = false;
1540             }
1541         }
1542
1543       limit = mpz_get_ui (ptr);
1544       if (limit >= flag_max_array_constructor)
1545         {
1546           gfc_error ("The number of elements in the array constructor "
1547                      "at %L requires an increase of the allowed %d "
1548                      "upper limit.   See -fmax-array-constructor "
1549                      "option", &expr->where, flag_max_array_constructor);
1550           return false;
1551         }
1552
1553       cons = gfc_constructor_lookup (base, limit);
1554       gcc_assert (cons);
1555       gfc_constructor_append_expr (&expr->value.constructor,
1556                                    gfc_copy_expr (cons->expr), NULL);
1557     }
1558
1559   mpz_clear (ptr);
1560
1561 cleanup:
1562
1563   mpz_clear (delta_mpz);
1564   mpz_clear (tmp_mpz);
1565   mpz_clear (nelts);
1566   for (d = 0; d < rank; d++)
1567     {
1568       mpz_clear (delta[d]);
1569       mpz_clear (start[d]);
1570       mpz_clear (end[d]);
1571       mpz_clear (ctr[d]);
1572       mpz_clear (stride[d]);
1573     }
1574   gfc_constructor_free (base);
1575   return t;
1576 }
1577
1578 /* Pull a substring out of an expression.  */
1579
1580 static bool
1581 find_substring_ref (gfc_expr *p, gfc_expr **newp)
1582 {
1583   int end;
1584   int start;
1585   int length;
1586   gfc_char_t *chr;
1587
1588   if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1589       || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1590     return false;
1591
1592   *newp = gfc_copy_expr (p);
1593   free ((*newp)->value.character.string);
1594
1595   end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer);
1596   start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer);
1597   length = end - start + 1;
1598
1599   chr = (*newp)->value.character.string = gfc_get_wide_string (length + 1);
1600   (*newp)->value.character.length = length;
1601   memcpy (chr, &p->value.character.string[start - 1],
1602           length * sizeof (gfc_char_t));
1603   chr[length] = '\0';
1604   return true;
1605 }
1606
1607
1608
1609 /* Simplify a subobject reference of a constructor.  This occurs when
1610    parameter variable values are substituted.  */
1611
1612 static bool
1613 simplify_const_ref (gfc_expr *p)
1614 {
1615   gfc_constructor *cons, *c;
1616   gfc_expr *newp;
1617   gfc_ref *last_ref;
1618
1619   while (p->ref)
1620     {
1621       switch (p->ref->type)
1622         {
1623         case REF_ARRAY:
1624           switch (p->ref->u.ar.type)
1625             {
1626             case AR_ELEMENT:
1627               /* <type/kind spec>, parameter :: x(<int>) = scalar_expr
1628                  will generate this.  */
1629               if (p->expr_type != EXPR_ARRAY)
1630                 {
1631                   remove_subobject_ref (p, NULL);
1632                   break;
1633                 }
1634               if (!find_array_element (p->value.constructor, &p->ref->u.ar, &cons))
1635                 return false;
1636
1637               if (!cons)
1638                 return true;
1639
1640               remove_subobject_ref (p, cons);
1641               break;
1642
1643             case AR_SECTION:
1644               if (!find_array_section (p, p->ref))
1645                 return false;
1646               p->ref->u.ar.type = AR_FULL;
1647
1648             /* Fall through.  */
1649
1650             case AR_FULL:
1651               if (p->ref->next != NULL
1652                   && (p->ts.type == BT_CHARACTER || gfc_bt_struct (p->ts.type)))
1653                 {
1654                   for (c = gfc_constructor_first (p->value.constructor);
1655                        c; c = gfc_constructor_next (c))
1656                     {
1657                       c->expr->ref = gfc_copy_ref (p->ref->next);
1658                       if (!simplify_const_ref (c->expr))
1659                         return false;
1660                     }
1661
1662                   if (gfc_bt_struct (p->ts.type)
1663                         && p->ref->next
1664                         && (c = gfc_constructor_first (p->value.constructor)))
1665                     {
1666                       /* There may have been component references.  */
1667                       p->ts = c->expr->ts;
1668                     }
1669
1670                   last_ref = p->ref;
1671                   for (; last_ref->next; last_ref = last_ref->next) {};
1672
1673                   if (p->ts.type == BT_CHARACTER
1674                         && last_ref->type == REF_SUBSTRING)
1675                     {
1676                       /* If this is a CHARACTER array and we possibly took
1677                          a substring out of it, update the type-spec's
1678                          character length according to the first element
1679                          (as all should have the same length).  */
1680                       int string_len;
1681                       if ((c = gfc_constructor_first (p->value.constructor)))
1682                         {
1683                           const gfc_expr* first = c->expr;
1684                           gcc_assert (first->expr_type == EXPR_CONSTANT);
1685                           gcc_assert (first->ts.type == BT_CHARACTER);
1686                           string_len = first->value.character.length;
1687                         }
1688                       else
1689                         string_len = 0;
1690
1691                       if (!p->ts.u.cl)
1692                         p->ts.u.cl = gfc_new_charlen (p->symtree->n.sym->ns,
1693                                                       NULL);
1694                       else
1695                         gfc_free_expr (p->ts.u.cl->length);
1696
1697                       p->ts.u.cl->length
1698                         = gfc_get_int_expr (gfc_default_integer_kind,
1699                                             NULL, string_len);
1700                     }
1701                 }
1702               gfc_free_ref_list (p->ref);
1703               p->ref = NULL;
1704               break;
1705
1706             default:
1707               return true;
1708             }
1709
1710           break;
1711
1712         case REF_COMPONENT:
1713           cons = find_component_ref (p->value.constructor, p->ref);
1714           remove_subobject_ref (p, cons);
1715           break;
1716
1717         case REF_SUBSTRING:
1718           if (!find_substring_ref (p, &newp))
1719             return false;
1720
1721           gfc_replace_expr (p, newp);
1722           gfc_free_ref_list (p->ref);
1723           p->ref = NULL;
1724           break;
1725         }
1726     }
1727
1728   return true;
1729 }
1730
1731
1732 /* Simplify a chain of references.  */
1733
1734 static bool
1735 simplify_ref_chain (gfc_ref *ref, int type)
1736 {
1737   int n;
1738
1739   for (; ref; ref = ref->next)
1740     {
1741       switch (ref->type)
1742         {
1743         case REF_ARRAY:
1744           for (n = 0; n < ref->u.ar.dimen; n++)
1745             {
1746               if (!gfc_simplify_expr (ref->u.ar.start[n], type))
1747                 return false;
1748               if (!gfc_simplify_expr (ref->u.ar.end[n], type))
1749                 return false;
1750               if (!gfc_simplify_expr (ref->u.ar.stride[n], type))
1751                 return false;
1752             }
1753           break;
1754
1755         case REF_SUBSTRING:
1756           if (!gfc_simplify_expr (ref->u.ss.start, type))
1757             return false;
1758           if (!gfc_simplify_expr (ref->u.ss.end, type))
1759             return false;
1760           break;
1761
1762         default:
1763           break;
1764         }
1765     }
1766   return true;
1767 }
1768
1769
1770 /* Try to substitute the value of a parameter variable.  */
1771
1772 static bool
1773 simplify_parameter_variable (gfc_expr *p, int type)
1774 {
1775   gfc_expr *e;
1776   bool t;
1777
1778   e = gfc_copy_expr (p->symtree->n.sym->value);
1779   if (e == NULL)
1780     return false;
1781
1782   e->rank = p->rank;
1783
1784   /* Do not copy subobject refs for constant.  */
1785   if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1786     e->ref = gfc_copy_ref (p->ref);
1787   t = gfc_simplify_expr (e, type);
1788
1789   /* Only use the simplification if it eliminated all subobject references.  */
1790   if (t && !e->ref)
1791     gfc_replace_expr (p, e);
1792   else
1793     gfc_free_expr (e);
1794
1795   return t;
1796 }
1797
1798 /* Given an expression, simplify it by collapsing constant
1799    expressions.  Most simplification takes place when the expression
1800    tree is being constructed.  If an intrinsic function is simplified
1801    at some point, we get called again to collapse the result against
1802    other constants.
1803
1804    We work by recursively simplifying expression nodes, simplifying
1805    intrinsic functions where possible, which can lead to further
1806    constant collapsing.  If an operator has constant operand(s), we
1807    rip the expression apart, and rebuild it, hoping that it becomes
1808    something simpler.
1809
1810    The expression type is defined for:
1811      0   Basic expression parsing
1812      1   Simplifying array constructors -- will substitute
1813          iterator values.
1814    Returns false on error, true otherwise.
1815    NOTE: Will return true even if the expression can not be simplified.  */
1816
1817 bool
1818 gfc_simplify_expr (gfc_expr *p, int type)
1819 {
1820   gfc_actual_arglist *ap;
1821
1822   if (p == NULL)
1823     return true;
1824
1825   switch (p->expr_type)
1826     {
1827     case EXPR_CONSTANT:
1828     case EXPR_NULL:
1829       break;
1830
1831     case EXPR_FUNCTION:
1832       for (ap = p->value.function.actual; ap; ap = ap->next)
1833         if (!gfc_simplify_expr (ap->expr, type))
1834           return false;
1835
1836       if (p->value.function.isym != NULL
1837           && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1838         return false;
1839
1840       break;
1841
1842     case EXPR_SUBSTRING:
1843       if (!simplify_ref_chain (p->ref, type))
1844         return false;
1845
1846       if (gfc_is_constant_expr (p))
1847         {
1848           gfc_char_t *s;
1849           int start, end;
1850
1851           start = 0;
1852           if (p->ref && p->ref->u.ss.start)
1853             {
1854               gfc_extract_int (p->ref->u.ss.start, &start);
1855               start--;  /* Convert from one-based to zero-based.  */
1856             }
1857
1858           end = p->value.character.length;
1859           if (p->ref && p->ref->u.ss.end)
1860             gfc_extract_int (p->ref->u.ss.end, &end);
1861
1862           if (end < start)
1863             end = start;
1864
1865           s = gfc_get_wide_string (end - start + 2);
1866           memcpy (s, p->value.character.string + start,
1867                   (end - start) * sizeof (gfc_char_t));
1868           s[end - start + 1] = '\0';  /* TODO: C-style string.  */
1869           free (p->value.character.string);
1870           p->value.character.string = s;
1871           p->value.character.length = end - start;
1872           p->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1873           p->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
1874                                                  NULL,
1875                                                  p->value.character.length);
1876           gfc_free_ref_list (p->ref);
1877           p->ref = NULL;
1878           p->expr_type = EXPR_CONSTANT;
1879         }
1880       break;
1881
1882     case EXPR_OP:
1883       if (!simplify_intrinsic_op (p, type))
1884         return false;
1885       break;
1886
1887     case EXPR_VARIABLE:
1888       /* Only substitute array parameter variables if we are in an
1889          initialization expression, or we want a subsection.  */
1890       if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1891           && (gfc_init_expr_flag || p->ref
1892               || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1893         {
1894           if (!simplify_parameter_variable (p, type))
1895             return false;
1896           break;
1897         }
1898
1899       if (type == 1)
1900         {
1901           gfc_simplify_iterator_var (p);
1902         }
1903
1904       /* Simplify subcomponent references.  */
1905       if (!simplify_ref_chain (p->ref, type))
1906         return false;
1907
1908       break;
1909
1910     case EXPR_STRUCTURE:
1911     case EXPR_ARRAY:
1912       if (!simplify_ref_chain (p->ref, type))
1913         return false;
1914
1915       if (!simplify_constructor (p->value.constructor, type))
1916         return false;
1917
1918       if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1919           && p->ref->u.ar.type == AR_FULL)
1920           gfc_expand_constructor (p, false);
1921
1922       if (!simplify_const_ref (p))
1923         return false;
1924
1925       break;
1926
1927     case EXPR_COMPCALL:
1928     case EXPR_PPC:
1929       break;
1930     }
1931
1932   return true;
1933 }
1934
1935
1936 /* Returns the type of an expression with the exception that iterator
1937    variables are automatically integers no matter what else they may
1938    be declared as.  */
1939
1940 static bt
1941 et0 (gfc_expr *e)
1942 {
1943   if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e))
1944     return BT_INTEGER;
1945
1946   return e->ts.type;
1947 }
1948
1949
1950 /* Scalarize an expression for an elemental intrinsic call.  */
1951
1952 static bool
1953 scalarize_intrinsic_call (gfc_expr *e)
1954 {
1955   gfc_actual_arglist *a, *b;
1956   gfc_constructor_base ctor;
1957   gfc_constructor *args[5];
1958   gfc_constructor *ci, *new_ctor;
1959   gfc_expr *expr, *old;
1960   int n, i, rank[5], array_arg;
1961
1962   /* Find which, if any, arguments are arrays.  Assume that the old
1963      expression carries the type information and that the first arg
1964      that is an array expression carries all the shape information.*/
1965   n = array_arg = 0;
1966   a = e->value.function.actual;
1967   for (; a; a = a->next)
1968     {
1969       n++;
1970       if (!a->expr || a->expr->expr_type != EXPR_ARRAY)
1971         continue;
1972       array_arg = n;
1973       expr = gfc_copy_expr (a->expr);
1974       break;
1975     }
1976
1977   if (!array_arg)
1978     return false;
1979
1980   old = gfc_copy_expr (e);
1981
1982   gfc_constructor_free (expr->value.constructor);
1983   expr->value.constructor = NULL;
1984   expr->ts = old->ts;
1985   expr->where = old->where;
1986   expr->expr_type = EXPR_ARRAY;
1987
1988   /* Copy the array argument constructors into an array, with nulls
1989      for the scalars.  */
1990   n = 0;
1991   a = old->value.function.actual;
1992   for (; a; a = a->next)
1993     {
1994       /* Check that this is OK for an initialization expression.  */
1995       if (a->expr && !gfc_check_init_expr (a->expr))
1996         goto cleanup;
1997
1998       rank[n] = 0;
1999       if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
2000         {
2001           rank[n] = a->expr->rank;
2002           ctor = a->expr->symtree->n.sym->value->value.constructor;
2003           args[n] = gfc_constructor_first (ctor);
2004         }
2005       else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
2006         {
2007           if (a->expr->rank)
2008             rank[n] = a->expr->rank;
2009           else
2010             rank[n] = 1;
2011           ctor = gfc_constructor_copy (a->expr->value.constructor);
2012           args[n] = gfc_constructor_first (ctor);
2013         }
2014       else
2015         args[n] = NULL;
2016
2017       n++;
2018     }
2019
2020
2021   /* Using the array argument as the master, step through the array
2022      calling the function for each element and advancing the array
2023      constructors together.  */
2024   for (ci = args[array_arg - 1]; ci; ci = gfc_constructor_next (ci))
2025     {
2026       new_ctor = gfc_constructor_append_expr (&expr->value.constructor,
2027                                               gfc_copy_expr (old), NULL);
2028
2029       gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
2030       a = NULL;
2031       b = old->value.function.actual;
2032       for (i = 0; i < n; i++)
2033         {
2034           if (a == NULL)
2035             new_ctor->expr->value.function.actual
2036                         = a = gfc_get_actual_arglist ();
2037           else
2038             {
2039               a->next = gfc_get_actual_arglist ();
2040               a = a->next;
2041             }
2042
2043           if (args[i])
2044             a->expr = gfc_copy_expr (args[i]->expr);
2045           else
2046             a->expr = gfc_copy_expr (b->expr);
2047
2048           b = b->next;
2049         }
2050
2051       /* Simplify the function calls.  If the simplification fails, the
2052          error will be flagged up down-stream or the library will deal
2053          with it.  */
2054       gfc_simplify_expr (new_ctor->expr, 0);
2055
2056       for (i = 0; i < n; i++)
2057         if (args[i])
2058           args[i] = gfc_constructor_next (args[i]);
2059
2060       for (i = 1; i < n; i++)
2061         if (rank[i] && ((args[i] != NULL && args[array_arg - 1] == NULL)
2062                         || (args[i] == NULL && args[array_arg - 1] != NULL)))
2063           goto compliance;
2064     }
2065
2066   free_expr0 (e);
2067   *e = *expr;
2068   /* Free "expr" but not the pointers it contains.  */
2069   free (expr);
2070   gfc_free_expr (old);
2071   return true;
2072
2073 compliance:
2074   gfc_error_now ("elemental function arguments at %C are not compliant");
2075
2076 cleanup:
2077   gfc_free_expr (expr);
2078   gfc_free_expr (old);
2079   return false;
2080 }
2081
2082
2083 static bool
2084 check_intrinsic_op (gfc_expr *e, bool (*check_function) (gfc_expr *))
2085 {
2086   gfc_expr *op1 = e->value.op.op1;
2087   gfc_expr *op2 = e->value.op.op2;
2088
2089   if (!(*check_function)(op1))
2090     return false;
2091
2092   switch (e->value.op.op)
2093     {
2094     case INTRINSIC_UPLUS:
2095     case INTRINSIC_UMINUS:
2096       if (!numeric_type (et0 (op1)))
2097         goto not_numeric;
2098       break;
2099
2100     case INTRINSIC_EQ:
2101     case INTRINSIC_EQ_OS:
2102     case INTRINSIC_NE:
2103     case INTRINSIC_NE_OS:
2104     case INTRINSIC_GT:
2105     case INTRINSIC_GT_OS:
2106     case INTRINSIC_GE:
2107     case INTRINSIC_GE_OS:
2108     case INTRINSIC_LT:
2109     case INTRINSIC_LT_OS:
2110     case INTRINSIC_LE:
2111     case INTRINSIC_LE_OS:
2112       if (!(*check_function)(op2))
2113         return false;
2114
2115       if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
2116           && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
2117         {
2118           gfc_error ("Numeric or CHARACTER operands are required in "
2119                      "expression at %L", &e->where);
2120          return false;
2121         }
2122       break;
2123
2124     case INTRINSIC_PLUS:
2125     case INTRINSIC_MINUS:
2126     case INTRINSIC_TIMES:
2127     case INTRINSIC_DIVIDE:
2128     case INTRINSIC_POWER:
2129       if (!(*check_function)(op2))
2130         return false;
2131
2132       if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
2133         goto not_numeric;
2134
2135       break;
2136
2137     case INTRINSIC_CONCAT:
2138       if (!(*check_function)(op2))
2139         return false;
2140
2141       if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
2142         {
2143           gfc_error ("Concatenation operator in expression at %L "
2144                      "must have two CHARACTER operands", &op1->where);
2145           return false;
2146         }
2147
2148       if (op1->ts.kind != op2->ts.kind)
2149         {
2150           gfc_error ("Concat operator at %L must concatenate strings of the "
2151                      "same kind", &e->where);
2152           return false;
2153         }
2154
2155       break;
2156
2157     case INTRINSIC_NOT:
2158       if (et0 (op1) != BT_LOGICAL)
2159         {
2160           gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
2161                      "operand", &op1->where);
2162           return false;
2163         }
2164
2165       break;
2166
2167     case INTRINSIC_AND:
2168     case INTRINSIC_OR:
2169     case INTRINSIC_EQV:
2170     case INTRINSIC_NEQV:
2171       if (!(*check_function)(op2))
2172         return false;
2173
2174       if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
2175         {
2176           gfc_error ("LOGICAL operands are required in expression at %L",
2177                      &e->where);
2178           return false;
2179         }
2180
2181       break;
2182
2183     case INTRINSIC_PARENTHESES:
2184       break;
2185
2186     default:
2187       gfc_error ("Only intrinsic operators can be used in expression at %L",
2188                  &e->where);
2189       return false;
2190     }
2191
2192   return true;
2193
2194 not_numeric:
2195   gfc_error ("Numeric operands are required in expression at %L", &e->where);
2196
2197   return false;
2198 }
2199
2200 /* F2003, 7.1.7 (3): In init expression, allocatable components
2201    must not be data-initialized.  */
2202 static bool
2203 check_alloc_comp_init (gfc_expr *e)
2204 {
2205   gfc_component *comp;
2206   gfc_constructor *ctor;
2207
2208   gcc_assert (e->expr_type == EXPR_STRUCTURE);
2209   gcc_assert (e->ts.type == BT_DERIVED);
2210
2211   for (comp = e->ts.u.derived->components,
2212        ctor = gfc_constructor_first (e->value.constructor);
2213        comp; comp = comp->next, ctor = gfc_constructor_next (ctor))
2214     {
2215       if (comp->attr.allocatable && ctor->expr
2216           && ctor->expr->expr_type != EXPR_NULL)
2217         {
2218           gfc_error ("Invalid initialization expression for ALLOCATABLE "
2219                      "component %qs in structure constructor at %L",
2220                      comp->name, &ctor->expr->where);
2221           return false;
2222         }
2223     }
2224
2225   return true;
2226 }
2227
2228 static match
2229 check_init_expr_arguments (gfc_expr *e)
2230 {
2231   gfc_actual_arglist *ap;
2232
2233   for (ap = e->value.function.actual; ap; ap = ap->next)
2234     if (!gfc_check_init_expr (ap->expr))
2235       return MATCH_ERROR;
2236
2237   return MATCH_YES;
2238 }
2239
2240 static bool check_restricted (gfc_expr *);
2241
2242 /* F95, 7.1.6.1, Initialization expressions, (7)
2243    F2003, 7.1.7 Initialization expression, (8)  */
2244
2245 static match
2246 check_inquiry (gfc_expr *e, int not_restricted)
2247 {
2248   const char *name;
2249   const char *const *functions;
2250
2251   static const char *const inquiry_func_f95[] = {
2252     "lbound", "shape", "size", "ubound",
2253     "bit_size", "len", "kind",
2254     "digits", "epsilon", "huge", "maxexponent", "minexponent",
2255     "precision", "radix", "range", "tiny",
2256     NULL
2257   };
2258
2259   static const char *const inquiry_func_f2003[] = {
2260     "lbound", "shape", "size", "ubound",
2261     "bit_size", "len", "kind",
2262     "digits", "epsilon", "huge", "maxexponent", "minexponent",
2263     "precision", "radix", "range", "tiny",
2264     "new_line", NULL
2265   };
2266
2267   int i = 0;
2268   gfc_actual_arglist *ap;
2269
2270   if (!e->value.function.isym
2271       || !e->value.function.isym->inquiry)
2272     return MATCH_NO;
2273
2274   /* An undeclared parameter will get us here (PR25018).  */
2275   if (e->symtree == NULL)
2276     return MATCH_NO;
2277
2278   if (e->symtree->n.sym->from_intmod)
2279     {
2280       if (e->symtree->n.sym->from_intmod == INTMOD_ISO_FORTRAN_ENV
2281           && e->symtree->n.sym->intmod_sym_id != ISOFORTRAN_COMPILER_OPTIONS
2282           && e->symtree->n.sym->intmod_sym_id != ISOFORTRAN_COMPILER_VERSION)
2283         return MATCH_NO;
2284
2285       if (e->symtree->n.sym->from_intmod == INTMOD_ISO_C_BINDING
2286           && e->symtree->n.sym->intmod_sym_id != ISOCBINDING_C_SIZEOF)
2287         return MATCH_NO;
2288     }
2289   else
2290     {
2291       name = e->symtree->n.sym->name;
2292
2293       functions = (gfc_option.warn_std & GFC_STD_F2003)
2294                 ? inquiry_func_f2003 : inquiry_func_f95;
2295
2296       for (i = 0; functions[i]; i++)
2297         if (strcmp (functions[i], name) == 0)
2298           break;
2299
2300       if (functions[i] == NULL)
2301         return MATCH_ERROR;
2302     }
2303
2304   /* At this point we have an inquiry function with a variable argument.  The
2305      type of the variable might be undefined, but we need it now, because the
2306      arguments of these functions are not allowed to be undefined.  */
2307
2308   for (ap = e->value.function.actual; ap; ap = ap->next)
2309     {
2310       if (!ap->expr)
2311         continue;
2312
2313       if (ap->expr->ts.type == BT_UNKNOWN)
2314         {
2315           if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
2316               && !gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns))
2317             return MATCH_NO;
2318
2319           ap->expr->ts = ap->expr->symtree->n.sym->ts;
2320         }
2321
2322         /* Assumed character length will not reduce to a constant expression
2323            with LEN, as required by the standard.  */
2324         if (i == 5 && not_restricted
2325             && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
2326             && (ap->expr->symtree->n.sym->ts.u.cl->length == NULL
2327                 || ap->expr->symtree->n.sym->ts.deferred))
2328           {
2329             gfc_error ("Assumed or deferred character length variable %qs "
2330                         " in constant expression at %L",
2331                         ap->expr->symtree->n.sym->name,
2332                         &ap->expr->where);
2333               return MATCH_ERROR;
2334           }
2335         else if (not_restricted && !gfc_check_init_expr (ap->expr))
2336           return MATCH_ERROR;
2337
2338         if (not_restricted == 0
2339               && ap->expr->expr_type != EXPR_VARIABLE
2340               && !check_restricted (ap->expr))
2341           return MATCH_ERROR;
2342
2343         if (not_restricted == 0
2344             && ap->expr->expr_type == EXPR_VARIABLE
2345             && ap->expr->symtree->n.sym->attr.dummy
2346             && ap->expr->symtree->n.sym->attr.optional)
2347           return MATCH_NO;
2348     }
2349
2350   return MATCH_YES;
2351 }
2352
2353
2354 /* F95, 7.1.6.1, Initialization expressions, (5)
2355    F2003, 7.1.7 Initialization expression, (5)  */
2356
2357 static match
2358 check_transformational (gfc_expr *e)
2359 {
2360   static const char * const trans_func_f95[] = {
2361     "repeat", "reshape", "selected_int_kind",
2362     "selected_real_kind", "transfer", "trim", NULL
2363   };
2364
2365   static const char * const trans_func_f2003[] =  {
2366     "all", "any", "count", "dot_product", "matmul", "null", "pack",
2367     "product", "repeat", "reshape", "selected_char_kind", "selected_int_kind",
2368     "selected_real_kind", "spread", "sum", "transfer", "transpose",
2369     "trim", "unpack", NULL
2370   };
2371
2372   int i;
2373   const char *name;
2374   const char *const *functions;
2375
2376   if (!e->value.function.isym
2377       || !e->value.function.isym->transformational)
2378     return MATCH_NO;
2379
2380   name = e->symtree->n.sym->name;
2381
2382   functions = (gfc_option.allow_std & GFC_STD_F2003)
2383                 ? trans_func_f2003 : trans_func_f95;
2384
2385   /* NULL() is dealt with below.  */
2386   if (strcmp ("null", name) == 0)
2387     return MATCH_NO;
2388
2389   for (i = 0; functions[i]; i++)
2390     if (strcmp (functions[i], name) == 0)
2391        break;
2392
2393   if (functions[i] == NULL)
2394     {
2395       gfc_error ("transformational intrinsic %qs at %L is not permitted "
2396                  "in an initialization expression", name, &e->where);
2397       return MATCH_ERROR;
2398     }
2399
2400   return check_init_expr_arguments (e);
2401 }
2402
2403
2404 /* F95, 7.1.6.1, Initialization expressions, (6)
2405    F2003, 7.1.7 Initialization expression, (6)  */
2406
2407 static match
2408 check_null (gfc_expr *e)
2409 {
2410   if (strcmp ("null", e->symtree->n.sym->name) != 0)
2411     return MATCH_NO;
2412
2413   return check_init_expr_arguments (e);
2414 }
2415
2416
2417 static match
2418 check_elemental (gfc_expr *e)
2419 {
2420   if (!e->value.function.isym
2421       || !e->value.function.isym->elemental)
2422     return MATCH_NO;
2423
2424   if (e->ts.type != BT_INTEGER
2425       && e->ts.type != BT_CHARACTER
2426       && !gfc_notify_std (GFC_STD_F2003, "Evaluation of nonstandard "
2427                           "initialization expression at %L", &e->where))
2428     return MATCH_ERROR;
2429
2430   return check_init_expr_arguments (e);
2431 }
2432
2433
2434 static match
2435 check_conversion (gfc_expr *e)
2436 {
2437   if (!e->value.function.isym
2438       || !e->value.function.isym->conversion)
2439     return MATCH_NO;
2440
2441   return check_init_expr_arguments (e);
2442 }
2443
2444
2445 /* Verify that an expression is an initialization expression.  A side
2446    effect is that the expression tree is reduced to a single constant
2447    node if all goes well.  This would normally happen when the
2448    expression is constructed but function references are assumed to be
2449    intrinsics in the context of initialization expressions.  If
2450    false is returned an error message has been generated.  */
2451
2452 bool
2453 gfc_check_init_expr (gfc_expr *e)
2454 {
2455   match m;
2456   bool t;
2457
2458   if (e == NULL)
2459     return true;
2460
2461   switch (e->expr_type)
2462     {
2463     case EXPR_OP:
2464       t = check_intrinsic_op (e, gfc_check_init_expr);
2465       if (t)
2466         t = gfc_simplify_expr (e, 0);
2467
2468       break;
2469
2470     case EXPR_FUNCTION:
2471       t = false;
2472
2473       {
2474         bool conversion;
2475         gfc_intrinsic_sym* isym = NULL;
2476         gfc_symbol* sym = e->symtree->n.sym;
2477
2478         /* Simplify here the intrinsics from the IEEE_ARITHMETIC and
2479            IEEE_EXCEPTIONS modules.  */
2480         int mod = sym->from_intmod;
2481         if (mod == INTMOD_NONE && sym->generic)
2482           mod = sym->generic->sym->from_intmod;
2483         if (mod == INTMOD_IEEE_ARITHMETIC || mod == INTMOD_IEEE_EXCEPTIONS)
2484           {
2485             gfc_expr *new_expr = gfc_simplify_ieee_functions (e);
2486             if (new_expr)
2487               {
2488                 gfc_replace_expr (e, new_expr);
2489                 t = true;
2490                 break;
2491               }
2492           }
2493
2494         /* If a conversion function, e.g., __convert_i8_i4, was inserted
2495            into an array constructor, we need to skip the error check here.
2496            Conversion errors are  caught below in scalarize_intrinsic_call.  */
2497         conversion = e->value.function.isym
2498                    && (e->value.function.isym->conversion == 1);
2499
2500         if (!conversion && (!gfc_is_intrinsic (sym, 0, e->where)
2501             || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES))
2502           {
2503             gfc_error ("Function %qs in initialization expression at %L "
2504                        "must be an intrinsic function",
2505                        e->symtree->n.sym->name, &e->where);
2506             break;
2507           }
2508
2509         if ((m = check_conversion (e)) == MATCH_NO
2510             && (m = check_inquiry (e, 1)) == MATCH_NO
2511             && (m = check_null (e)) == MATCH_NO
2512             && (m = check_transformational (e)) == MATCH_NO
2513             && (m = check_elemental (e)) == MATCH_NO)
2514           {
2515             gfc_error ("Intrinsic function %qs at %L is not permitted "
2516                        "in an initialization expression",
2517                        e->symtree->n.sym->name, &e->where);
2518             m = MATCH_ERROR;
2519           }
2520
2521         if (m == MATCH_ERROR)
2522           return false;
2523
2524         /* Try to scalarize an elemental intrinsic function that has an
2525            array argument.  */
2526         isym = gfc_find_function (e->symtree->n.sym->name);
2527         if (isym && isym->elemental
2528             && (t = scalarize_intrinsic_call (e)))
2529           break;
2530       }
2531
2532       if (m == MATCH_YES)
2533         t = gfc_simplify_expr (e, 0);
2534
2535       break;
2536
2537     case EXPR_VARIABLE:
2538       t = true;
2539
2540       if (gfc_check_iter_variable (e))
2541         break;
2542
2543       if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2544         {
2545           /* A PARAMETER shall not be used to define itself, i.e.
2546                 REAL, PARAMETER :: x = transfer(0, x)
2547              is invalid.  */
2548           if (!e->symtree->n.sym->value)
2549             {
2550               gfc_error ("PARAMETER %qs is used at %L before its definition "
2551                          "is complete", e->symtree->n.sym->name, &e->where);
2552               t = false;
2553             }
2554           else
2555             t = simplify_parameter_variable (e, 0);
2556
2557           break;
2558         }
2559
2560       if (gfc_in_match_data ())
2561         break;
2562
2563       t = false;
2564
2565       if (e->symtree->n.sym->as)
2566         {
2567           switch (e->symtree->n.sym->as->type)
2568             {
2569               case AS_ASSUMED_SIZE:
2570                 gfc_error ("Assumed size array %qs at %L is not permitted "
2571                            "in an initialization expression",
2572                            e->symtree->n.sym->name, &e->where);
2573                 break;
2574
2575               case AS_ASSUMED_SHAPE:
2576                 gfc_error ("Assumed shape array %qs at %L is not permitted "
2577                            "in an initialization expression",
2578                            e->symtree->n.sym->name, &e->where);
2579                 break;
2580
2581               case AS_DEFERRED:
2582                 gfc_error ("Deferred array %qs at %L is not permitted "
2583                            "in an initialization expression",
2584                            e->symtree->n.sym->name, &e->where);
2585                 break;
2586
2587               case AS_EXPLICIT:
2588                 gfc_error ("Array %qs at %L is a variable, which does "
2589                            "not reduce to a constant expression",
2590                            e->symtree->n.sym->name, &e->where);
2591                 break;
2592
2593               default:
2594                 gcc_unreachable();
2595           }
2596         }
2597       else
2598         gfc_error ("Parameter %qs at %L has not been declared or is "
2599                    "a variable, which does not reduce to a constant "
2600                    "expression", e->symtree->n.sym->name, &e->where);
2601
2602       break;
2603
2604     case EXPR_CONSTANT:
2605     case EXPR_NULL:
2606       t = true;
2607       break;
2608
2609     case EXPR_SUBSTRING:
2610       if (e->ref)
2611         {
2612           t = gfc_check_init_expr (e->ref->u.ss.start);
2613           if (!t)
2614             break;
2615
2616           t = gfc_check_init_expr (e->ref->u.ss.end);
2617           if (t)
2618             t = gfc_simplify_expr (e, 0);
2619         }
2620       else
2621         t = false;
2622       break;
2623
2624     case EXPR_STRUCTURE:
2625       t = e->ts.is_iso_c ? true : false;
2626       if (t)
2627         break;
2628
2629       t = check_alloc_comp_init (e);
2630       if (!t)
2631         break;
2632
2633       t = gfc_check_constructor (e, gfc_check_init_expr);
2634       if (!t)
2635         break;
2636
2637       break;
2638
2639     case EXPR_ARRAY:
2640       t = gfc_check_constructor (e, gfc_check_init_expr);
2641       if (!t)
2642         break;
2643
2644       t = gfc_expand_constructor (e, true);
2645       if (!t)
2646         break;
2647
2648       t = gfc_check_constructor_type (e);
2649       break;
2650
2651     default:
2652       gfc_internal_error ("check_init_expr(): Unknown expression type");
2653     }
2654
2655   return t;
2656 }
2657
2658 /* Reduces a general expression to an initialization expression (a constant).
2659    This used to be part of gfc_match_init_expr.
2660    Note that this function doesn't free the given expression on false.  */
2661
2662 bool
2663 gfc_reduce_init_expr (gfc_expr *expr)
2664 {
2665   bool t;
2666
2667   gfc_init_expr_flag = true;
2668   t = gfc_resolve_expr (expr);
2669   if (t)
2670     t = gfc_check_init_expr (expr);
2671   gfc_init_expr_flag = false;
2672
2673   if (!t)
2674     return false;
2675
2676   if (expr->expr_type == EXPR_ARRAY)
2677     {
2678       if (!gfc_check_constructor_type (expr))
2679         return false;
2680       if (!gfc_expand_constructor (expr, true))
2681         return false;
2682     }
2683
2684   return true;
2685 }
2686
2687
2688 /* Match an initialization expression.  We work by first matching an
2689    expression, then reducing it to a constant.  */
2690
2691 match
2692 gfc_match_init_expr (gfc_expr **result)
2693 {
2694   gfc_expr *expr;
2695   match m;
2696   bool t;
2697
2698   expr = NULL;
2699
2700   gfc_init_expr_flag = true;
2701
2702   m = gfc_match_expr (&expr);
2703   if (m != MATCH_YES)
2704     {
2705       gfc_init_expr_flag = false;
2706       return m;
2707     }
2708
2709   t = gfc_reduce_init_expr (expr);
2710   if (!t)
2711     {
2712       gfc_free_expr (expr);
2713       gfc_init_expr_flag = false;
2714       return MATCH_ERROR;
2715     }
2716
2717   *result = expr;
2718   gfc_init_expr_flag = false;
2719
2720   return MATCH_YES;
2721 }
2722
2723
2724 /* Given an actual argument list, test to see that each argument is a
2725    restricted expression and optionally if the expression type is
2726    integer or character.  */
2727
2728 static bool
2729 restricted_args (gfc_actual_arglist *a)
2730 {
2731   for (; a; a = a->next)
2732     {
2733       if (!check_restricted (a->expr))
2734         return false;
2735     }
2736
2737   return true;
2738 }
2739
2740
2741 /************* Restricted/specification expressions *************/
2742
2743
2744 /* Make sure a non-intrinsic function is a specification function.  */
2745
2746 static bool
2747 external_spec_function (gfc_expr *e)
2748 {
2749   gfc_symbol *f;
2750
2751   f = e->value.function.esym;
2752
2753   /* IEEE functions allowed are "a reference to a transformational function
2754      from the intrinsic module IEEE_ARITHMETIC or IEEE_EXCEPTIONS", and
2755      "inquiry function from the intrinsic modules IEEE_ARITHMETIC and
2756      IEEE_EXCEPTIONS".  */
2757   if (f->from_intmod == INTMOD_IEEE_ARITHMETIC
2758       || f->from_intmod == INTMOD_IEEE_EXCEPTIONS)
2759     {
2760       if (!strcmp (f->name, "ieee_selected_real_kind")
2761           || !strcmp (f->name, "ieee_support_rounding")
2762           || !strcmp (f->name, "ieee_support_flag")
2763           || !strcmp (f->name, "ieee_support_halting")
2764           || !strcmp (f->name, "ieee_support_datatype")
2765           || !strcmp (f->name, "ieee_support_denormal")
2766           || !strcmp (f->name, "ieee_support_divide")
2767           || !strcmp (f->name, "ieee_support_inf")
2768           || !strcmp (f->name, "ieee_support_io")
2769           || !strcmp (f->name, "ieee_support_nan")
2770           || !strcmp (f->name, "ieee_support_sqrt")
2771           || !strcmp (f->name, "ieee_support_standard")
2772           || !strcmp (f->name, "ieee_support_underflow_control"))
2773         goto function_allowed;
2774     }
2775
2776   if (f->attr.proc == PROC_ST_FUNCTION)
2777     {
2778       gfc_error ("Specification function %qs at %L cannot be a statement "
2779                  "function", f->name, &e->where);
2780       return false;
2781     }
2782
2783   if (f->attr.proc == PROC_INTERNAL)
2784     {
2785       gfc_error ("Specification function %qs at %L cannot be an internal "
2786                  "function", f->name, &e->where);
2787       return false;
2788     }
2789
2790   if (!f->attr.pure && !f->attr.elemental)
2791     {
2792       gfc_error ("Specification function %qs at %L must be PURE", f->name,
2793                  &e->where);
2794       return false;
2795     }
2796
2797   if (f->attr.recursive)
2798     {
2799       gfc_error ("Specification function %qs at %L cannot be RECURSIVE",
2800                  f->name, &e->where);
2801       return false;
2802     }
2803
2804 function_allowed:
2805   return restricted_args (e->value.function.actual);
2806 }
2807
2808
2809 /* Check to see that a function reference to an intrinsic is a
2810    restricted expression.  */
2811
2812 static bool
2813 restricted_intrinsic (gfc_expr *e)
2814 {
2815   /* TODO: Check constraints on inquiry functions.  7.1.6.2 (7).  */
2816   if (check_inquiry (e, 0) == MATCH_YES)
2817     return true;
2818
2819   return restricted_args (e->value.function.actual);
2820 }
2821
2822
2823 /* Check the expressions of an actual arglist.  Used by check_restricted.  */
2824
2825 static bool
2826 check_arglist (gfc_actual_arglist* arg, bool (*checker) (gfc_expr*))
2827 {
2828   for (; arg; arg = arg->next)
2829     if (!checker (arg->expr))
2830       return false;
2831
2832   return true;
2833 }
2834
2835
2836 /* Check the subscription expressions of a reference chain with a checking
2837    function; used by check_restricted.  */
2838
2839 static bool
2840 check_references (gfc_ref* ref, bool (*checker) (gfc_expr*))
2841 {
2842   int dim;
2843
2844   if (!ref)
2845     return true;
2846
2847   switch (ref->type)
2848     {
2849     case REF_ARRAY:
2850       for (dim = 0; dim != ref->u.ar.dimen; ++dim)
2851         {
2852           if (!checker (ref->u.ar.start[dim]))
2853             return false;
2854           if (!checker (ref->u.ar.end[dim]))
2855             return false;
2856           if (!checker (ref->u.ar.stride[dim]))
2857             return false;
2858         }
2859       break;
2860
2861     case REF_COMPONENT:
2862       /* Nothing needed, just proceed to next reference.  */
2863       break;
2864
2865     case REF_SUBSTRING:
2866       if (!checker (ref->u.ss.start))
2867         return false;
2868       if (!checker (ref->u.ss.end))
2869         return false;
2870       break;
2871
2872     default:
2873       gcc_unreachable ();
2874       break;
2875     }
2876
2877   return check_references (ref->next, checker);
2878 }
2879
2880 /*  Return true if ns is a parent of the current ns.  */
2881
2882 static bool
2883 is_parent_of_current_ns (gfc_namespace *ns)
2884 {
2885   gfc_namespace *p;
2886   for (p = gfc_current_ns->parent; p; p = p->parent)
2887     if (ns == p)
2888       return true;
2889
2890   return false;
2891 }
2892
2893 /* Verify that an expression is a restricted expression.  Like its
2894    cousin check_init_expr(), an error message is generated if we
2895    return false.  */
2896
2897 static bool
2898 check_restricted (gfc_expr *e)
2899 {
2900   gfc_symbol* sym;
2901   bool t;
2902
2903   if (e == NULL)
2904     return true;
2905
2906   switch (e->expr_type)
2907     {
2908     case EXPR_OP:
2909       t = check_intrinsic_op (e, check_restricted);
2910       if (t)
2911         t = gfc_simplify_expr (e, 0);
2912
2913       break;
2914
2915     case EXPR_FUNCTION:
2916       if (e->value.function.esym)
2917         {
2918           t = check_arglist (e->value.function.actual, &check_restricted);
2919           if (t)
2920             t = external_spec_function (e);
2921         }
2922       else
2923         {
2924           if (e->value.function.isym && e->value.function.isym->inquiry)
2925             t = true;
2926           else
2927             t = check_arglist (e->value.function.actual, &check_restricted);
2928
2929           if (t)
2930             t = restricted_intrinsic (e);
2931         }
2932       break;
2933
2934     case EXPR_VARIABLE:
2935       sym = e->symtree->n.sym;
2936       t = false;
2937
2938       /* If a dummy argument appears in a context that is valid for a
2939          restricted expression in an elemental procedure, it will have
2940          already been simplified away once we get here.  Therefore we
2941          don't need to jump through hoops to distinguish valid from
2942          invalid cases.  */
2943       if (sym->attr.dummy && sym->ns == gfc_current_ns
2944           && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
2945         {
2946           gfc_error ("Dummy argument %qs not allowed in expression at %L",
2947                      sym->name, &e->where);
2948           break;
2949         }
2950
2951       if (sym->attr.optional)
2952         {
2953           gfc_error ("Dummy argument %qs at %L cannot be OPTIONAL",
2954                      sym->name, &e->where);
2955           break;
2956         }
2957
2958       if (sym->attr.intent == INTENT_OUT)
2959         {
2960           gfc_error ("Dummy argument %qs at %L cannot be INTENT(OUT)",
2961                      sym->name, &e->where);
2962           break;
2963         }
2964
2965       /* Check reference chain if any.  */
2966       if (!check_references (e->ref, &check_restricted))
2967         break;
2968
2969       /* gfc_is_formal_arg broadcasts that a formal argument list is being
2970          processed in resolve.c(resolve_formal_arglist).  This is done so
2971          that host associated dummy array indices are accepted (PR23446).
2972          This mechanism also does the same for the specification expressions
2973          of array-valued functions.  */
2974       if (e->error
2975             || sym->attr.in_common
2976             || sym->attr.use_assoc
2977             || sym->attr.dummy
2978             || sym->attr.implied_index
2979             || sym->attr.flavor == FL_PARAMETER
2980             || is_parent_of_current_ns (sym->ns)
2981             || (sym->ns->proc_name != NULL
2982                   && sym->ns->proc_name->attr.flavor == FL_MODULE)
2983             || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2984         {
2985           t = true;
2986           break;
2987         }
2988
2989       gfc_error ("Variable %qs cannot appear in the expression at %L",
2990                  sym->name, &e->where);
2991       /* Prevent a repetition of the error.  */
2992       e->error = 1;
2993       break;
2994
2995     case EXPR_NULL:
2996     case EXPR_CONSTANT:
2997       t = true;
2998       break;
2999
3000     case EXPR_SUBSTRING:
3001       t = gfc_specification_expr (e->ref->u.ss.start);
3002       if (!t)
3003         break;
3004
3005       t = gfc_specification_expr (e->ref->u.ss.end);
3006       if (t)
3007         t = gfc_simplify_expr (e, 0);
3008
3009       break;
3010
3011     case EXPR_STRUCTURE:
3012       t = gfc_check_constructor (e, check_restricted);
3013       break;
3014
3015     case EXPR_ARRAY:
3016       t = gfc_check_constructor (e, check_restricted);
3017       break;
3018
3019     default:
3020       gfc_internal_error ("check_restricted(): Unknown expression type");
3021     }
3022
3023   return t;
3024 }
3025
3026
3027 /* Check to see that an expression is a specification expression.  If
3028    we return false, an error has been generated.  */
3029
3030 bool
3031 gfc_specification_expr (gfc_expr *e)
3032 {
3033   gfc_component *comp;
3034
3035   if (e == NULL)
3036     return true;
3037
3038   if (e->ts.type != BT_INTEGER)
3039     {
3040       gfc_error ("Expression at %L must be of INTEGER type, found %s",
3041                  &e->where, gfc_basic_typename (e->ts.type));
3042       return false;
3043     }
3044
3045   comp = gfc_get_proc_ptr_comp (e);
3046   if (e->expr_type == EXPR_FUNCTION
3047       && !e->value.function.isym
3048       && !e->value.function.esym
3049       && !gfc_pure (e->symtree->n.sym)
3050       && (!comp || !comp->attr.pure))
3051     {
3052       gfc_error ("Function %qs at %L must be PURE",
3053                  e->symtree->n.sym->name, &e->where);
3054       /* Prevent repeat error messages.  */
3055       e->symtree->n.sym->attr.pure = 1;
3056       return false;
3057     }
3058
3059   if (e->rank != 0)
3060     {
3061       gfc_error ("Expression at %L must be scalar", &e->where);
3062       return false;
3063     }
3064
3065   if (!gfc_simplify_expr (e, 0))
3066     return false;
3067
3068   return check_restricted (e);
3069 }
3070
3071
3072 /************** Expression conformance checks.  *************/
3073
3074 /* Given two expressions, make sure that the arrays are conformable.  */
3075
3076 bool
3077 gfc_check_conformance (gfc_expr *op1, gfc_expr *op2, const char *optype_msgid, ...)
3078 {
3079   int op1_flag, op2_flag, d;
3080   mpz_t op1_size, op2_size;
3081   bool t;
3082
3083   va_list argp;
3084   char buffer[240];
3085
3086   if (op1->rank == 0 || op2->rank == 0)
3087     return true;
3088
3089   va_start (argp, optype_msgid);
3090   vsnprintf (buffer, 240, optype_msgid, argp);
3091   va_end (argp);
3092
3093   if (op1->rank != op2->rank)
3094     {
3095       gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(buffer),
3096                  op1->rank, op2->rank, &op1->where);
3097       return false;
3098     }
3099
3100   t = true;
3101
3102   for (d = 0; d < op1->rank; d++)
3103     {
3104       op1_flag = gfc_array_dimen_size(op1, d, &op1_size);
3105       op2_flag = gfc_array_dimen_size(op2, d, &op2_size);
3106
3107       if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
3108         {
3109           gfc_error ("Different shape for %s at %L on dimension %d "
3110                      "(%d and %d)", _(buffer), &op1->where, d + 1,
3111                      (int) mpz_get_si (op1_size),
3112                      (int) mpz_get_si (op2_size));
3113
3114           t = false;
3115         }
3116
3117       if (op1_flag)
3118         mpz_clear (op1_size);
3119       if (op2_flag)
3120         mpz_clear (op2_size);
3121
3122       if (!t)
3123         return false;
3124     }
3125
3126   return true;
3127 }
3128
3129
3130 /* Given an assignable expression and an arbitrary expression, make
3131    sure that the assignment can take place.  */
3132
3133 bool
3134 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
3135 {
3136   gfc_symbol *sym;
3137   gfc_ref *ref;
3138   int has_pointer;
3139
3140   sym = lvalue->symtree->n.sym;
3141
3142   /* See if this is the component or subcomponent of a pointer.  */
3143   has_pointer = sym->attr.pointer;
3144   for (ref = lvalue->ref; ref; ref = ref->next)
3145     if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
3146       {
3147         has_pointer = 1;
3148         break;
3149       }
3150
3151   /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
3152      variable local to a function subprogram.  Its existence begins when
3153      execution of the function is initiated and ends when execution of the
3154      function is terminated...
3155      Therefore, the left hand side is no longer a variable, when it is:  */
3156   if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
3157       && !sym->attr.external)
3158     {
3159       bool bad_proc;
3160       bad_proc = false;
3161
3162       /* (i) Use associated;  */
3163       if (sym->attr.use_assoc)
3164         bad_proc = true;
3165
3166       /* (ii) The assignment is in the main program; or  */
3167       if (gfc_current_ns->proc_name
3168           && gfc_current_ns->proc_name->attr.is_main_program)
3169         bad_proc = true;
3170
3171       /* (iii) A module or internal procedure...  */
3172       if (gfc_current_ns->proc_name
3173           && (gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
3174               || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
3175           && gfc_current_ns->parent
3176           && (!(gfc_current_ns->parent->proc_name->attr.function
3177                 || gfc_current_ns->parent->proc_name->attr.subroutine)
3178               || gfc_current_ns->parent->proc_name->attr.is_main_program))
3179         {
3180           /* ... that is not a function...  */
3181           if (gfc_current_ns->proc_name
3182               && !gfc_current_ns->proc_name->attr.function)
3183             bad_proc = true;
3184
3185           /* ... or is not an entry and has a different name.  */
3186           if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
3187             bad_proc = true;
3188         }
3189
3190       /* (iv) Host associated and not the function symbol or the
3191               parent result.  This picks up sibling references, which
3192               cannot be entries.  */
3193       if (!sym->attr.entry
3194             && sym->ns == gfc_current_ns->parent
3195             && sym != gfc_current_ns->proc_name
3196             && sym != gfc_current_ns->parent->proc_name->result)
3197         bad_proc = true;
3198
3199       if (bad_proc)
3200         {
3201           gfc_error ("%qs at %L is not a VALUE", sym->name, &lvalue->where);
3202           return false;
3203         }
3204     }
3205
3206   if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
3207     {
3208       gfc_error ("Incompatible ranks %d and %d in assignment at %L",
3209                  lvalue->rank, rvalue->rank, &lvalue->where);
3210       return false;
3211     }
3212
3213   if (lvalue->ts.type == BT_UNKNOWN)
3214     {
3215       gfc_error ("Variable type is UNKNOWN in assignment at %L",
3216                  &lvalue->where);
3217       return false;
3218     }
3219
3220   if (rvalue->expr_type == EXPR_NULL)
3221     {
3222       if (has_pointer && (ref == NULL || ref->next == NULL)
3223           && lvalue->symtree->n.sym->attr.data)
3224         return true;
3225       else
3226         {
3227           gfc_error ("NULL appears on right-hand side in assignment at %L",
3228                      &rvalue->where);
3229           return false;
3230         }
3231     }
3232
3233   /* This is possibly a typo: x = f() instead of x => f().  */
3234   if (warn_surprising
3235       && rvalue->expr_type == EXPR_FUNCTION && gfc_expr_attr (rvalue).pointer)
3236     gfc_warning (OPT_Wsurprising,
3237                  "POINTER-valued function appears on right-hand side of "
3238                  "assignment at %L", &rvalue->where);
3239
3240   /* Check size of array assignments.  */
3241   if (lvalue->rank != 0 && rvalue->rank != 0
3242       && !gfc_check_conformance (lvalue, rvalue, "array assignment"))
3243     return false;
3244
3245   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
3246       && lvalue->symtree->n.sym->attr.data
3247       && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L used to "
3248                           "initialize non-integer variable %qs", 
3249                           &rvalue->where, lvalue->symtree->n.sym->name))
3250     return false;
3251   else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
3252       && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L outside "
3253                           "a DATA statement and outside INT/REAL/DBLE/CMPLX",
3254                           &rvalue->where))
3255     return false;
3256
3257   /* Handle the case of a BOZ literal on the RHS.  */
3258   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
3259     {
3260       int rc;
3261       if (warn_surprising)
3262         gfc_warning (OPT_Wsurprising,
3263                      "BOZ literal at %L is bitwise transferred "
3264                      "non-integer symbol %qs", &rvalue->where,
3265                      lvalue->symtree->n.sym->name);
3266       if (!gfc_convert_boz (rvalue, &lvalue->ts))
3267         return false;
3268       if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
3269         {
3270           if (rc == ARITH_UNDERFLOW)
3271             gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
3272                        ". This check can be disabled with the option "
3273                        "%<-fno-range-check%>", &rvalue->where);
3274           else if (rc == ARITH_OVERFLOW)
3275             gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
3276                        ". This check can be disabled with the option "
3277                        "%<-fno-range-check%>", &rvalue->where);
3278           else if (rc == ARITH_NAN)
3279             gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
3280                        ". This check can be disabled with the option "
3281                        "%<-fno-range-check%>", &rvalue->where);
3282           return false;
3283         }
3284     }
3285
3286   if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
3287     return true;
3288
3289   /* Only DATA Statements come here.  */
3290   if (!conform)
3291     {
3292       /* Numeric can be converted to any other numeric. And Hollerith can be
3293          converted to any other type.  */
3294       if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
3295           || rvalue->ts.type == BT_HOLLERITH)
3296         return true;
3297
3298       if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
3299         return true;
3300
3301       gfc_error ("Incompatible types in DATA statement at %L; attempted "
3302                  "conversion of %s to %s", &lvalue->where,
3303                  gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3304
3305       return false;
3306     }
3307
3308   /* Assignment is the only case where character variables of different
3309      kind values can be converted into one another.  */
3310   if (lvalue->ts.type == BT_CHARACTER && rvalue->ts.type == BT_CHARACTER)
3311     {
3312       if (lvalue->ts.kind != rvalue->ts.kind)
3313         gfc_convert_chartype (rvalue, &lvalue->ts);
3314
3315       return true;
3316     }
3317
3318   return gfc_convert_type (rvalue, &lvalue->ts, 1);
3319 }
3320
3321
3322 /* Check that a pointer assignment is OK.  We first check lvalue, and
3323    we only check rvalue if it's not an assignment to NULL() or a
3324    NULLIFY statement.  */
3325
3326 bool
3327 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
3328 {
3329   symbol_attribute attr, lhs_attr;
3330   gfc_ref *ref;
3331   bool is_pure, is_implicit_pure, rank_remap;
3332   int proc_pointer;
3333
3334   lhs_attr = gfc_expr_attr (lvalue);
3335   if (lvalue->ts.type == BT_UNKNOWN && !lhs_attr.proc_pointer)
3336     {
3337       gfc_error ("Pointer assignment target is not a POINTER at %L",
3338                  &lvalue->where);
3339       return false;
3340     }
3341
3342   if (lhs_attr.flavor == FL_PROCEDURE && lhs_attr.use_assoc
3343       && !lhs_attr.proc_pointer)
3344     {
3345       gfc_error ("%qs in the pointer assignment at %L cannot be an "
3346                  "l-value since it is a procedure",
3347                  lvalue->symtree->n.sym->name, &lvalue->where);
3348       return false;
3349     }
3350
3351   proc_pointer = lvalue->symtree->n.sym->attr.proc_pointer;
3352
3353   rank_remap = false;
3354   for (ref = lvalue->ref; ref; ref = ref->next)
3355     {
3356       if (ref->type == REF_COMPONENT)
3357         proc_pointer = ref->u.c.component->attr.proc_pointer;
3358
3359       if (ref->type == REF_ARRAY && ref->next == NULL)
3360         {
3361           int dim;
3362
3363           if (ref->u.ar.type == AR_FULL)
3364             break;
3365
3366           if (ref->u.ar.type != AR_SECTION)
3367             {
3368               gfc_error ("Expected bounds specification for %qs at %L",
3369                          lvalue->symtree->n.sym->name, &lvalue->where);
3370               return false;
3371             }
3372
3373           if (!gfc_notify_std (GFC_STD_F2003, "Bounds specification "
3374                                "for %qs in pointer assignment at %L", 
3375                                lvalue->symtree->n.sym->name, &lvalue->where))
3376             return false;
3377
3378           /* When bounds are given, all lbounds are necessary and either all
3379              or none of the upper bounds; no strides are allowed.  If the
3380              upper bounds are present, we may do rank remapping.  */
3381           for (dim = 0; dim < ref->u.ar.dimen; ++dim)
3382             {
3383               if (!ref->u.ar.start[dim]
3384                   || ref->u.ar.dimen_type[dim] != DIMEN_RANGE)
3385                 {
3386                   gfc_error ("Lower bound has to be present at %L",
3387                              &lvalue->where);
3388                   return false;
3389                 }
3390               if (ref->u.ar.stride[dim])
3391                 {
3392                   gfc_error ("Stride must not be present at %L",
3393                              &lvalue->where);
3394                   return false;
3395                 }
3396
3397               if (dim == 0)
3398                 rank_remap = (ref->u.ar.end[dim] != NULL);
3399               else
3400                 {
3401                   if ((rank_remap && !ref->u.ar.end[dim])
3402                       || (!rank_remap && ref->u.ar.end[dim]))
3403                     {
3404                       gfc_error ("Either all or none of the upper bounds"
3405                                  " must be specified at %L", &lvalue->where);
3406                       return false;
3407                     }
3408                 }
3409             }
3410         }
3411     }
3412
3413   is_pure = gfc_pure (NULL);
3414   is_implicit_pure = gfc_implicit_pure (NULL);
3415
3416   /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
3417      kind, etc for lvalue and rvalue must match, and rvalue must be a
3418      pure variable if we're in a pure function.  */
3419   if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
3420     return true;
3421
3422   /* F2008, C723 (pointer) and C726 (proc-pointer); for PURE also C1283.  */
3423   if (lvalue->expr_type == EXPR_VARIABLE
3424       && gfc_is_coindexed (lvalue))
3425     {
3426       gfc_ref *ref;
3427       for (ref = lvalue->ref; ref; ref = ref->next)
3428         if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3429           {
3430             gfc_error ("Pointer object at %L shall not have a coindex",
3431                        &lvalue->where);
3432             return false;
3433           }
3434     }
3435
3436   /* Checks on rvalue for procedure pointer assignments.  */
3437   if (proc_pointer)
3438     {
3439       char err[200];
3440       gfc_symbol *s1,*s2;
3441       gfc_component *comp;
3442       const char *name;
3443
3444       attr = gfc_expr_attr (rvalue);
3445       if (!((rvalue->expr_type == EXPR_NULL)
3446             || (rvalue->expr_type == EXPR_FUNCTION && attr.proc_pointer)
3447             || (rvalue->expr_type == EXPR_VARIABLE && attr.proc_pointer)
3448             || (rvalue->expr_type == EXPR_VARIABLE
3449                 && attr.flavor == FL_PROCEDURE)))
3450         {
3451           gfc_error ("Invalid procedure pointer assignment at %L",
3452                      &rvalue->where);
3453           return false;
3454         }
3455       if (rvalue->expr_type == EXPR_VARIABLE && !attr.proc_pointer)
3456         {
3457           /* Check for intrinsics.  */
3458           gfc_symbol *sym = rvalue->symtree->n.sym;
3459           if (!sym->attr.intrinsic
3460               && (gfc_is_intrinsic (sym, 0, sym->declared_at)
3461                   || gfc_is_intrinsic (sym, 1, sym->declared_at)))
3462             {
3463               sym->attr.intrinsic = 1;
3464               gfc_resolve_intrinsic (sym, &rvalue->where);
3465               attr = gfc_expr_attr (rvalue);
3466             }
3467           /* Check for result of embracing function.  */
3468           if (sym->attr.function && sym->result == sym)
3469             {
3470               gfc_namespace *ns;
3471
3472               for (ns = gfc_current_ns; ns; ns = ns->parent)
3473                 if (sym == ns->proc_name)
3474                   {
3475                     gfc_error ("Function result %qs is invalid as proc-target "
3476                                "in procedure pointer assignment at %L",
3477                                sym->name, &rvalue->where);
3478                     return false;
3479                   }
3480             }
3481         }
3482       if (attr.abstract)
3483         {
3484           gfc_error ("Abstract interface %qs is invalid "
3485                      "in procedure pointer assignment at %L",
3486                      rvalue->symtree->name, &rvalue->where);
3487           return false;
3488         }
3489       /* Check for F08:C729.  */
3490       if (attr.flavor == FL_PROCEDURE)
3491         {
3492           if (attr.proc == PROC_ST_FUNCTION)
3493             {
3494               gfc_error ("Statement function %qs is invalid "
3495                          "in procedure pointer assignment at %L",
3496                          rvalue->symtree->name, &rvalue->where);
3497               return false;
3498             }
3499           if (attr.proc == PROC_INTERNAL &&
3500               !gfc_notify_std(GFC_STD_F2008, "Internal procedure %qs "
3501                               "is invalid in procedure pointer assignment "
3502                               "at %L", rvalue->symtree->name, &rvalue->where))
3503             return false;
3504           if (attr.intrinsic && gfc_intrinsic_actual_ok (rvalue->symtree->name,
3505                                                          attr.subroutine) == 0)
3506             {
3507               gfc_error ("Intrinsic %qs at %L is invalid in procedure pointer "
3508                          "assignment", rvalue->symtree->name, &rvalue->where);
3509               return false;
3510             }
3511         }
3512       /* Check for F08:C730.  */
3513       if (attr.elemental && !attr.intrinsic)
3514         {
3515           gfc_error ("Nonintrinsic elemental procedure %qs is invalid "
3516                      "in procedure pointer assignment at %L",
3517                      rvalue->symtree->name, &rvalue->where);
3518           return false;
3519         }
3520
3521       /* Ensure that the calling convention is the same. As other attributes
3522          such as DLLEXPORT may differ, one explicitly only tests for the
3523          calling conventions.  */
3524       if (rvalue->expr_type == EXPR_VARIABLE
3525           && lvalue->symtree->n.sym->attr.ext_attr
3526                != rvalue->symtree->n.sym->attr.ext_attr)
3527         {
3528           symbol_attribute calls;
3529
3530           calls.ext_attr = 0;
3531           gfc_add_ext_attribute (&calls, EXT_ATTR_CDECL, NULL);
3532           gfc_add_ext_attribute (&calls, EXT_ATTR_STDCALL, NULL);
3533           gfc_add_ext_attribute (&calls, EXT_ATTR_FASTCALL, NULL);
3534
3535           if ((calls.ext_attr & lvalue->symtree->n.sym->attr.ext_attr)
3536               != (calls.ext_attr & rvalue->symtree->n.sym->attr.ext_attr))
3537             {
3538               gfc_error ("Mismatch in the procedure pointer assignment "
3539                          "at %L: mismatch in the calling convention",
3540                          &rvalue->where);
3541           return false;
3542             }
3543         }
3544
3545       comp = gfc_get_proc_ptr_comp (lvalue);
3546       if (comp)
3547         s1 = comp->ts.interface;
3548       else
3549         {
3550           s1 = lvalue->symtree->n.sym;
3551           if (s1->ts.interface)
3552             s1 = s1->ts.interface;
3553         }
3554
3555       comp = gfc_get_proc_ptr_comp (rvalue);
3556       if (comp)
3557         {
3558           if (rvalue->expr_type == EXPR_FUNCTION)
3559             {
3560               s2 = comp->ts.interface->result;
3561               name = s2->name;
3562             }
3563           else
3564             {
3565               s2 = comp->ts.interface;
3566               name = comp->name;
3567             }
3568         }
3569       else if (rvalue->expr_type == EXPR_FUNCTION)
3570         {
3571           if (rvalue->value.function.esym)
3572             s2 = rvalue->value.function.esym->result;
3573           else
3574             s2 = rvalue->symtree->n.sym->result;
3575
3576           name = s2->name;
3577         }
3578       else
3579         {
3580           s2 = rvalue->symtree->n.sym;
3581           name = s2->name;
3582         }
3583
3584       if (s2 && s2->attr.proc_pointer && s2->ts.interface)
3585         s2 = s2->ts.interface;
3586
3587       if (s1 == s2 || !s1 || !s2)
3588         return true;
3589
3590       /* F08:7.2.2.4 (4)  */
3591       if (s1->attr.if_source == IFSRC_UNKNOWN
3592           && gfc_explicit_interface_required (s2, err, sizeof(err)))
3593         {
3594           gfc_error ("Explicit interface required for %qs at %L: %s",
3595                      s1->name, &lvalue->where, err);
3596           return false;
3597         }
3598       if (s2->attr.if_source == IFSRC_UNKNOWN
3599           && gfc_explicit_interface_required (s1, err, sizeof(err)))
3600         {
3601           gfc_error ("Explicit interface required for %qs at %L: %s",
3602                      s2->name, &rvalue->where, err);
3603           return false;
3604         }
3605
3606       if (!gfc_compare_interfaces (s1, s2, name, 0, 1,
3607                                    err, sizeof(err), NULL, NULL))
3608         {
3609           gfc_error ("Interface mismatch in procedure pointer assignment "
3610                      "at %L: %s", &rvalue->where, err);
3611           return false;
3612         }
3613
3614       /* Check F2008Cor2, C729.  */
3615       if (!s2->attr.intrinsic && s2->attr.if_source == IFSRC_UNKNOWN
3616           && !s2->attr.external && !s2->attr.subroutine && !s2->attr.function)
3617         {
3618           gfc_error ("Procedure pointer target %qs at %L must be either an "
3619                      "intrinsic, host or use associated, referenced or have "
3620                      "the EXTERNAL attribute", s2->name, &rvalue->where);
3621           return false;
3622         }
3623
3624       return true;
3625     }
3626
3627   if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
3628     {
3629       /* Check for F03:C717.  */
3630       if (UNLIMITED_POLY (rvalue)
3631           && !(UNLIMITED_POLY (lvalue)
3632                || (lvalue->ts.type == BT_DERIVED
3633                    && (lvalue->ts.u.derived->attr.is_bind_c
3634                        || lvalue->ts.u.derived->attr.sequence))))
3635         gfc_error ("Data-pointer-object at %L must be unlimited "
3636                    "polymorphic, or of a type with the BIND or SEQUENCE "
3637                    "attribute, to be compatible with an unlimited "
3638                    "polymorphic target", &lvalue->where);
3639       else
3640         gfc_error ("Different types in pointer assignment at %L; "
3641                    "attempted assignment of %s to %s", &lvalue->where,
3642                    gfc_typename (&rvalue->ts),
3643                    gfc_typename (&lvalue->ts));
3644       return false;
3645     }
3646
3647   if (lvalue->ts.type != BT_CLASS && lvalue->ts.kind != rvalue->ts.kind)
3648     {
3649       gfc_error ("Different kind type parameters in pointer "
3650                  "assignment at %L", &lvalue->where);
3651       return false;
3652     }
3653
3654   if (lvalue->rank != rvalue->rank && !rank_remap)
3655     {
3656       gfc_error ("Different ranks in pointer assignment at %L", &lvalue->where);
3657       return false;
3658     }
3659
3660   /* Make sure the vtab is present.  */
3661   if (lvalue->ts.type == BT_CLASS && !UNLIMITED_POLY (rvalue))
3662     gfc_find_vtab (&rvalue->ts);
3663
3664   /* Check rank remapping.  */
3665   if (rank_remap)
3666     {
3667       mpz_t lsize, rsize;
3668
3669       /* If this can be determined, check that the target must be at least as
3670          large as the pointer assigned to it is.  */
3671       if (gfc_array_size (lvalue, &lsize)
3672           && gfc_array_size (rvalue, &rsize)
3673           && mpz_cmp (rsize, lsize) < 0)
3674         {
3675           gfc_error ("Rank remapping target is smaller than size of the"
3676                      " pointer (%ld < %ld) at %L",
3677                      mpz_get_si (rsize), mpz_get_si (lsize),
3678                      &lvalue->where);
3679           return false;
3680         }
3681
3682       /* The target must be either rank one or it must be simply contiguous
3683          and F2008 must be allowed.  */
3684       if (rvalue->rank != 1)
3685         {
3686           if (!gfc_is_simply_contiguous (rvalue, true, false))
3687             {
3688               gfc_error ("Rank remapping target must be rank 1 or"
3689                          " simply contiguous at %L", &rvalue->where);
3690               return false;
3691             }
3692           if (!gfc_notify_std (GFC_STD_F2008, "Rank remapping target is not "
3693                                "rank 1 at %L", &rvalue->where))
3694             return false;
3695         }
3696     }
3697
3698   /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
3699   if (rvalue->expr_type == EXPR_NULL)
3700     return true;
3701
3702   if (lvalue->ts.type == BT_CHARACTER)
3703     {
3704       bool t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment");
3705       if (!t)
3706         return false;
3707     }
3708
3709   if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
3710     lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
3711
3712   attr = gfc_expr_attr (rvalue);
3713
3714   if (rvalue->expr_type == EXPR_FUNCTION && !attr.pointer)
3715     {
3716       gfc_error ("Target expression in pointer assignment "
3717                  "at %L must deliver a pointer result",
3718                  &rvalue->where);
3719       return false;
3720     }
3721
3722   if (!attr.target && !attr.pointer)
3723     {
3724       gfc_error ("Pointer assignment target is neither TARGET "
3725                  "nor POINTER at %L", &rvalue->where);
3726       return false;
3727     }
3728
3729   if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3730     {
3731       gfc_error ("Bad target in pointer assignment in PURE "
3732                  "procedure at %L", &rvalue->where);
3733     }
3734
3735   if (is_implicit_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3736     gfc_unset_implicit_pure (gfc_current_ns->proc_name);
3737
3738   if (gfc_has_vector_index (rvalue))
3739     {
3740       gfc_error ("Pointer assignment with vector subscript "
3741                  "on rhs at %L", &rvalue->where);
3742       return false;
3743     }
3744
3745   if (attr.is_protected && attr.use_assoc
3746       && !(attr.pointer || attr.proc_pointer))
3747     {
3748       gfc_error ("Pointer assignment target has PROTECTED "
3749                  "attribute at %L", &rvalue->where);
3750       return false;
3751     }
3752
3753   /* F2008, C725. For PURE also C1283.  */
3754   if (rvalue->expr_type == EXPR_VARIABLE
3755       && gfc_is_coindexed (rvalue))
3756     {
3757       gfc_ref *ref;
3758       for (ref = rvalue->ref; ref; ref = ref->next)
3759         if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3760           {
3761             gfc_error ("Data target at %L shall not have a coindex",
3762                        &rvalue->where);
3763             return false;
3764           }
3765     }
3766
3767   /* Warn if it is the LHS pointer may lives longer than the RHS target.  */
3768   if (warn_target_lifetime
3769       && rvalue->expr_type == EXPR_VARIABLE
3770       && !rvalue->symtree->n.sym->attr.save
3771       && !attr.pointer && !rvalue->symtree->n.sym->attr.host_assoc
3772       && !rvalue->symtree->n.sym->attr.in_common
3773       && !rvalue->symtree->n.sym->attr.use_assoc
3774       && !rvalue->symtree->n.sym->attr.dummy)
3775     {
3776       bool warn;
3777       gfc_namespace *ns;
3778
3779       warn = lvalue->symtree->n.sym->attr.dummy
3780              || lvalue->symtree->n.sym->attr.result
3781              || lvalue->symtree->n.sym->attr.function
3782              || (lvalue->symtree->n.sym->attr.host_assoc
3783                  && lvalue->symtree->n.sym->ns
3784                     != rvalue->symtree->n.sym->ns)
3785              || lvalue->symtree->n.sym->attr.use_assoc
3786              || lvalue->symtree->n.sym->attr.in_common;
3787
3788       if (rvalue->symtree->n.sym->ns->proc_name
3789           && rvalue->symtree->n.sym->ns->proc_name->attr.flavor != FL_PROCEDURE
3790           && rvalue->symtree->n.sym->ns->proc_name->attr.flavor != FL_PROGRAM)
3791        for (ns = rvalue->symtree->n.sym->ns;
3792             ns && ns->proc_name && ns->proc_name->attr.flavor != FL_PROCEDURE;
3793             ns = ns->parent)
3794         if (ns->parent == lvalue->symtree->n.sym->ns)
3795           {
3796             warn = true;
3797             break;
3798           }
3799
3800       if (warn)
3801         gfc_warning (OPT_Wtarget_lifetime,
3802                      "Pointer at %L in pointer assignment might outlive the "
3803                      "pointer target", &lvalue->where);
3804     }
3805
3806   return true;
3807 }
3808
3809
3810 /* Relative of gfc_check_assign() except that the lvalue is a single
3811    symbol.  Used for initialization assignments.  */
3812
3813 bool
3814 gfc_check_assign_symbol (gfc_symbol *sym, gfc_component *comp, gfc_expr *rvalue)
3815 {
3816   gfc_expr lvalue;
3817   bool r;
3818   bool pointer, proc_pointer;
3819
3820   memset (&lvalue, '\0', sizeof (gfc_expr));
3821
3822   lvalue.expr_type = EXPR_VARIABLE;
3823   lvalue.ts = sym->ts;
3824   if (sym->as)
3825     lvalue.rank = sym->as->rank;
3826   lvalue.symtree = XCNEW (gfc_symtree);
3827   lvalue.symtree->n.sym = sym;
3828   lvalue.where = sym->declared_at;
3829
3830   if (comp)
3831     {
3832       lvalue.ref = gfc_get_ref ();
3833       lvalue.ref->type = REF_COMPONENT;
3834       lvalue.ref->u.c.component = comp;
3835       lvalue.ref->u.c.sym = sym;
3836       lvalue.ts = comp->ts;
3837       lvalue.rank = comp->as ? comp->as->rank : 0;
3838       lvalue.where = comp->loc;
3839       pointer = comp->ts.type == BT_CLASS &&  CLASS_DATA (comp)
3840                 ? CLASS_DATA (comp)->attr.class_pointer : comp->attr.pointer;
3841       proc_pointer = comp->attr.proc_pointer;
3842     }
3843   else
3844     {
3845       pointer = sym->ts.type == BT_CLASS &&  CLASS_DATA (sym)
3846                 ? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer;
3847       proc_pointer = sym->attr.proc_pointer;
3848     }
3849
3850   if (pointer || proc_pointer)
3851     r = gfc_check_pointer_assign (&lvalue, rvalue);
3852   else
3853     {
3854       /* If a conversion function, e.g., __convert_i8_i4, was inserted
3855          into an array constructor, we should check if it can be reduced
3856          as an initialization expression.  */
3857       if (rvalue->expr_type == EXPR_FUNCTION
3858           && rvalue->value.function.isym
3859           && (rvalue->value.function.isym->conversion == 1))
3860         gfc_check_init_expr (rvalue);
3861
3862       r = gfc_check_assign (&lvalue, rvalue, 1);
3863     }
3864
3865   free (lvalue.symtree);
3866   free (lvalue.ref);
3867
3868   if (!r)
3869     return r;
3870
3871   if (pointer && rvalue->expr_type != EXPR_NULL)
3872     {
3873       /* F08:C461. Additional checks for pointer initialization.  */
3874       symbol_attribute attr;
3875       attr = gfc_expr_attr (rvalue);
3876       if (attr.allocatable)
3877         {
3878           gfc_error ("Pointer initialization target at %L "
3879                      "must not be ALLOCATABLE", &rvalue->where);
3880           return false;
3881         }
3882       if (!attr.target || attr.pointer)
3883         {
3884           gfc_error ("Pointer initialization target at %L "
3885                      "must have the TARGET attribute", &rvalue->where);
3886           return false;
3887         }
3888
3889       if (!attr.save && rvalue->expr_type == EXPR_VARIABLE
3890           && rvalue->symtree->n.sym->ns->proc_name
3891           && rvalue->symtree->n.sym->ns->proc_name->attr.is_main_program)
3892         {
3893           rvalue->symtree->n.sym->ns->proc_name->attr.save = SAVE_IMPLICIT;
3894           attr.save = SAVE_IMPLICIT;
3895         }
3896
3897       if (!attr.save)
3898         {
3899           gfc_error ("Pointer initialization target at %L "
3900                      "must have the SAVE attribute", &rvalue->where);
3901           return false;
3902         }
3903     }
3904
3905   if (proc_pointer && rvalue->expr_type != EXPR_NULL)
3906     {
3907       /* F08:C1220. Additional checks for procedure pointer initialization.  */
3908       symbol_attribute attr = gfc_expr_attr (rvalue);
3909       if (attr.proc_pointer)
3910         {
3911           gfc_error ("Procedure pointer initialization target at %L "
3912                      "may not be a procedure pointer", &rvalue->where);
3913           return false;
3914         }
3915     }
3916
3917   return true;
3918 }
3919
3920
3921 /* Check for default initializer; sym->value is not enough
3922    as it is also set for EXPR_NULL of allocatables.  */
3923
3924 bool
3925 gfc_has_default_initializer (gfc_symbol *der)
3926 {
3927   gfc_component *c;
3928
3929   gcc_assert (gfc_fl_struct (der->attr.flavor));
3930   for (c = der->components; c; c = c->next)
3931     if (gfc_bt_struct (c->ts.type))
3932       {
3933         if (!c->attr.pointer && !c->attr.proc_pointer
3934              && gfc_has_default_initializer (c->ts.u.derived))
3935           return true;
3936         if (c->attr.pointer && c->initializer)
3937           return true;
3938       }
3939     else
3940       {
3941         if (c->initializer)
3942           return true;
3943       }
3944
3945   return false;
3946 }
3947
3948
3949 /* Get an expression for a default initializer.  */
3950
3951 gfc_expr *
3952 gfc_default_initializer (gfc_typespec *ts)
3953 {
3954   gfc_expr *init;
3955   gfc_component *comp;
3956
3957   /* See if we have a default initializer in this, but not in nested
3958      types (otherwise we could use gfc_has_default_initializer()).  */
3959   for (comp = ts->u.derived->components; comp; comp = comp->next)
3960     if (comp->initializer || comp->attr.allocatable
3961         || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)
3962             && CLASS_DATA (comp)->attr.allocatable))
3963       break;
3964
3965   if (!comp)
3966     return NULL;
3967
3968   init = gfc_get_structure_constructor_expr (ts->type, ts->kind,
3969                                              &ts->u.derived->declared_at);
3970   init->ts = *ts;
3971
3972   for (comp = ts->u.derived->components; comp; comp = comp->next)
3973     {
3974       gfc_constructor *ctor = gfc_constructor_get();
3975
3976       if (comp->initializer)
3977         {
3978           /* Save the component ref for STRUCTUREs and UNIONs.  */
3979           if (ts->u.derived->attr.flavor == FL_STRUCT
3980               || ts->u.derived->attr.flavor == FL_UNION)
3981             ctor->n.component = comp;
3982           ctor->expr = gfc_copy_expr (comp->initializer);
3983           if ((comp->ts.type != comp->initializer->ts.type
3984                || comp->ts.kind != comp->initializer->ts.kind)
3985               && !comp->attr.pointer && !comp->attr.proc_pointer)
3986             gfc_convert_type_warn (ctor->expr, &comp->ts, 2, false);
3987         }
3988
3989       if (comp->attr.allocatable
3990           || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable))
3991         {
3992           ctor->expr = gfc_get_expr ();
3993           ctor->expr->expr_type = EXPR_NULL;
3994           ctor->expr->ts = comp->ts;
3995         }
3996
3997       gfc_constructor_append (&init->value.constructor, ctor);
3998     }
3999
4000   return init;
4001 }
4002
4003
4004 /* Given a symbol, create an expression node with that symbol as a
4005    variable. If the symbol is array valued, setup a reference of the
4006    whole array.  */
4007
4008 gfc_expr *
4009 gfc_get_variable_expr (gfc_symtree *var)
4010 {
4011   gfc_expr *e;
4012
4013   e = gfc_get_expr ();
4014   e->expr_type = EXPR_VARIABLE;
4015   e->symtree = var;
4016   e->ts = var->n.sym->ts;
4017
4018   if (var->n.sym->attr.flavor != FL_PROCEDURE
4019       && ((var->n.sym->as != NULL && var->n.sym->ts.type != BT_CLASS)
4020            || (var->n.sym->ts.type == BT_CLASS && CLASS_DATA (var->n.sym)
4021                && CLASS_DATA (var->n.sym)->as)))
4022     {
4023       e->rank = var->n.sym->ts.type == BT_CLASS
4024                 ? CLASS_DATA (var->n.sym)->as->rank : var->n.sym->as->rank;
4025       e->ref = gfc_get_ref ();
4026       e->ref->type = REF_ARRAY;
4027       e->ref->u.ar.type = AR_FULL;
4028       e->ref->u.ar.as = gfc_copy_array_spec (var->n.sym->ts.type == BT_CLASS
4029                                              ? CLASS_DATA (var->n.sym)->as
4030                                              : var->n.sym->as);
4031     }
4032
4033   return e;
4034 }
4035
4036
4037 /* Adds a full array reference to an expression, as needed.  */
4038
4039 void
4040 gfc_add_full_array_ref (gfc_expr *e, gfc_array_spec *as)
4041 {
4042   gfc_ref *ref;
4043   for (ref = e->ref; ref; ref = ref->next)
4044     if (!ref->next)
4045       break;
4046   if (ref)
4047     {
4048       ref->next = gfc_get_ref ();
4049       ref = ref->next;
4050     }
4051   else
4052     {
4053       e->ref = gfc_get_ref ();
4054       ref = e->ref;
4055     }
4056   ref->type = REF_ARRAY;
4057   ref->u.ar.type = AR_FULL;
4058   ref->u.ar.dimen = e->rank;
4059   ref->u.ar.where = e->where;
4060   ref->u.ar.as = as;
4061 }
4062
4063
4064 gfc_expr *
4065 gfc_lval_expr_from_sym (gfc_symbol *sym)
4066 {
4067   gfc_expr *lval;
4068   gfc_array_spec *as;
4069   lval = gfc_get_expr ();
4070   lval->expr_type = EXPR_VARIABLE;
4071   lval->where = sym->declared_at;
4072   lval->ts = sym->ts;
4073   lval->symtree = gfc_find_symtree (sym->ns->sym_root, sym->name);
4074
4075   /* It will always be a full array.  */
4076   as = IS_CLASS_ARRAY (sym) ? CLASS_DATA (sym)->as : sym->as;
4077   lval->rank = as ? as->rank : 0;
4078   if (lval->rank)
4079     gfc_add_full_array_ref (lval, as);
4080   return lval;
4081 }
4082
4083
4084 /* Returns the array_spec of a full array expression.  A NULL is
4085    returned otherwise.  */
4086 gfc_array_spec *
4087 gfc_get_full_arrayspec_from_expr (gfc_expr *expr)
4088 {
4089   gfc_array_spec *as;
4090   gfc_ref *ref;
4091
4092   if (expr->rank == 0)
4093     return NULL;
4094
4095   /* Follow any component references.  */
4096   if (expr->expr_type == EXPR_VARIABLE
4097       || expr->expr_type == EXPR_CONSTANT)
4098     {
4099       as = expr->symtree->n.sym->as;
4100       for (ref = expr->ref; ref; ref = ref->next)
4101         {
4102           switch (ref->type)
4103             {
4104             case REF_COMPONENT:
4105               as = ref->u.c.component->as;
4106               continue;
4107
4108             case REF_SUBSTRING:
4109               continue;
4110
4111             case REF_ARRAY:
4112               {
4113                 switch (ref->u.ar.type)
4114                   {
4115                   case AR_ELEMENT:
4116                   case AR_SECTION:
4117                   case AR_UNKNOWN:
4118                     as = NULL;
4119                     continue;
4120
4121                   case AR_FULL:
4122                     break;
4123                   }
4124                 break;
4125               }
4126             }
4127         }
4128     }
4129   else
4130     as = NULL;
4131
4132   return as;
4133 }
4134
4135
4136 /* General expression traversal function.  */
4137
4138 bool
4139 gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
4140                    bool (*func)(gfc_expr *, gfc_symbol *, int*),
4141                    int f)
4142 {
4143   gfc_array_ref ar;
4144   gfc_ref *ref;
4145   gfc_actual_arglist *args;
4146   gfc_constructor *c;
4147   int i;
4148
4149   if (!expr)
4150     return false;
4151
4152   if ((*func) (expr, sym, &f))
4153     return true;
4154
4155   if (expr->ts.type == BT_CHARACTER
4156         && expr->ts.u.cl
4157         && expr->ts.u.cl->length
4158         && expr->ts.u.cl->length->expr_type != EXPR_CONSTANT
4159         && gfc_traverse_expr (expr->ts.u.cl->length, sym, func, f))
4160     return true;
4161
4162   switch (expr->expr_type)
4163     {
4164     case EXPR_PPC:
4165     case EXPR_COMPCALL:
4166     case EXPR_FUNCTION:
4167       for (args = expr->value.function.actual; args; args = args->next)
4168         {
4169           if (gfc_traverse_expr (args->expr, sym, func, f))
4170             return true;
4171         }
4172       break;
4173
4174     case EXPR_VARIABLE:
4175     case EXPR_CONSTANT:
4176     case EXPR_NULL:
4177     case EXPR_SUBSTRING:
4178       break;
4179
4180     case EXPR_STRUCTURE:
4181     case EXPR_ARRAY:
4182       for (c = gfc_constructor_first (expr->value.constructor);
4183            c; c = gfc_constructor_next (c))
4184         {
4185           if (gfc_traverse_expr (c->expr, sym, func, f))
4186             return true;
4187           if (c->iterator)
4188             {
4189               if (gfc_traverse_expr (c->iterator->var, sym, func, f))
4190                 return true;
4191               if (gfc_traverse_expr (c->iterator->start, sym, func, f))
4192                 return true;
4193               if (gfc_traverse_expr (c->iterator->end, sym, func, f))
4194                 return true;
4195               if (gfc_traverse_expr (c->iterator->step, sym, func, f))
4196                 return true;
4197             }
4198         }
4199       break;
4200
4201     case EXPR_OP:
4202       if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
4203         return true;
4204       if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
4205         return true;
4206       break;
4207
4208     default:
4209       gcc_unreachable ();
4210       break;
4211     }
4212
4213   ref = expr->ref;
4214   while (ref != NULL)
4215     {
4216       switch (ref->type)
4217         {
4218         case  REF_ARRAY:
4219           ar = ref->u.ar;
4220           for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
4221             {
4222               if (gfc_traverse_expr (ar.start[i], sym, func, f))
4223                 return true;
4224               if (gfc_traverse_expr (ar.end[i], sym, func, f))
4225                 return true;
4226               if (gfc_traverse_expr (ar.stride[i], sym, func, f))
4227                 return true;
4228             }
4229           break;
4230
4231         case REF_SUBSTRING:
4232           if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
4233             return true;
4234           if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
4235             return true;
4236           break;
4237
4238         case REF_COMPONENT:
4239           if (ref->u.c.component->ts.type == BT_CHARACTER
4240                 && ref->u.c.component->ts.u.cl
4241                 && ref->u.c.component->ts.u.cl->length
4242                 && ref->u.c.component->ts.u.cl->length->expr_type
4243                      != EXPR_CONSTANT
4244                 && gfc_traverse_expr (ref->u.c.component->ts.u.cl->length,
4245                                       sym, func, f))
4246             return true;
4247
4248           if (ref->u.c.component->as)
4249             for (i = 0; i < ref->u.c.component->as->rank
4250                             + ref->u.c.component->as->corank; i++)
4251               {
4252                 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
4253                                        sym, func, f))
4254                   return true;
4255                 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
4256                                        sym, func, f))
4257                   return true;
4258               }
4259           break;
4260
4261         default:
4262           gcc_unreachable ();
4263         }
4264       ref = ref->next;
4265     }
4266   return false;
4267 }
4268
4269 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
4270
4271 static bool
4272 expr_set_symbols_referenced (gfc_expr *expr,
4273                              gfc_symbol *sym ATTRIBUTE_UNUSED,
4274                              int *f ATTRIBUTE_UNUSED)
4275 {
4276   if (expr->expr_type != EXPR_VARIABLE)
4277     return false;
4278   gfc_set_sym_referenced (expr->symtree->n.sym);
4279   return false;
4280 }
4281
4282 void
4283 gfc_expr_set_symbols_referenced (gfc_expr *expr)
4284 {
4285   gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
4286 }
4287
4288
4289 /* Determine if an expression is a procedure pointer component and return
4290    the component in that case.  Otherwise return NULL.  */
4291
4292 gfc_component *
4293 gfc_get_proc_ptr_comp (gfc_expr *expr)
4294 {
4295   gfc_ref *ref;
4296
4297   if (!expr || !expr->ref)
4298     return NULL;
4299
4300   ref = expr->ref;
4301   while (ref->next)
4302     ref = ref->next;
4303
4304   if (ref->type == REF_COMPONENT
4305       && ref->u.c.component->attr.proc_pointer)
4306     return ref->u.c.component;
4307
4308   return NULL;
4309 }
4310
4311
4312 /* Determine if an expression is a procedure pointer component.  */
4313
4314 bool
4315 gfc_is_proc_ptr_comp (gfc_expr *expr)
4316 {
4317   return (gfc_get_proc_ptr_comp (expr) != NULL);
4318 }
4319
4320
4321 /* Determine if an expression is a function with an allocatable class scalar
4322    result.  */
4323 bool
4324 gfc_is_alloc_class_scalar_function (gfc_expr *expr)
4325 {
4326   if (expr->expr_type == EXPR_FUNCTION
4327       && expr->value.function.esym
4328       && expr->value.function.esym->result
4329       && expr->value.function.esym->result->ts.type == BT_CLASS
4330       && !CLASS_DATA (expr->value.function.esym->result)->attr.dimension
4331       && CLASS_DATA (expr->value.function.esym->result)->attr.allocatable)
4332     return true;
4333
4334   return false;
4335 }
4336
4337
4338 /* Determine if an expression is a function with an allocatable class array
4339    result.  */
4340 bool
4341 gfc_is_alloc_class_array_function (gfc_expr *expr)
4342 {
4343   if (expr->expr_type == EXPR_FUNCTION
4344       && expr->value.function.esym
4345       && expr->value.function.esym->result
4346       && expr->value.function.esym->result->ts.type == BT_CLASS
4347       && CLASS_DATA (expr->value.function.esym->result)->attr.dimension
4348       && CLASS_DATA (expr->value.function.esym->result)->attr.allocatable)
4349     return true;
4350
4351   return false;
4352 }
4353
4354
4355 /* Walk an expression tree and check each variable encountered for being typed.
4356    If strict is not set, a top-level variable is tolerated untyped in -std=gnu
4357    mode as is a basic arithmetic expression using those; this is for things in
4358    legacy-code like:
4359
4360      INTEGER :: arr(n), n
4361      INTEGER :: arr(n + 1), n
4362
4363    The namespace is needed for IMPLICIT typing.  */
4364
4365 static gfc_namespace* check_typed_ns;
4366
4367 static bool
4368 expr_check_typed_help (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
4369                        int* f ATTRIBUTE_UNUSED)
4370 {
4371   bool t;
4372
4373   if (e->expr_type != EXPR_VARIABLE)
4374     return false;
4375
4376   gcc_assert (e->symtree);
4377   t = gfc_check_symbol_typed (e->symtree->n.sym, check_typed_ns,
4378                               true, e->where);
4379
4380   return (!t);
4381 }
4382
4383 bool
4384 gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
4385 {
4386   bool error_found;
4387
4388   /* If this is a top-level variable or EXPR_OP, do the check with strict given
4389      to us.  */
4390   if (!strict)
4391     {
4392       if (e->expr_type == EXPR_VARIABLE && !e->ref)
4393         return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
4394
4395       if (e->expr_type == EXPR_OP)
4396         {
4397           bool t = true;
4398
4399           gcc_assert (e->value.op.op1);
4400           t = gfc_expr_check_typed (e->value.op.op1, ns, strict);
4401
4402           if (t && e->value.op.op2)
4403             t = gfc_expr_check_typed (e->value.op.op2, ns, strict);
4404
4405           return t;
4406         }
4407     }
4408
4409   /* Otherwise, walk the expression and do it strictly.  */
4410   check_typed_ns = ns;
4411   error_found = gfc_traverse_expr (e, NULL, &expr_check_typed_help, 0);
4412
4413   return error_found ? false : true;
4414 }
4415
4416
4417 bool
4418 gfc_ref_this_image (gfc_ref *ref)
4419 {
4420   int n;
4421
4422   gcc_assert (ref->type == REF_ARRAY && ref->u.ar.codimen > 0);
4423
4424   for (n = ref->u.ar.dimen; n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
4425     if (ref->u.ar.dimen_type[n] != DIMEN_THIS_IMAGE)
4426       return false;
4427
4428   return true;
4429 }
4430
4431 gfc_expr *
4432 gfc_find_stat_co(gfc_expr *e)
4433 {
4434   gfc_ref *ref;
4435
4436   for (ref = e->ref; ref; ref = ref->next)
4437     if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4438       return ref->u.ar.stat;
4439
4440   if(e->value.function.actual->expr)
4441     for(ref = e->value.function.actual->expr->ref; ref;
4442         ref = ref->next)
4443       if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4444         return ref->u.ar.stat;
4445
4446   return NULL;
4447 }
4448
4449 bool
4450 gfc_is_coindexed (gfc_expr *e)
4451 {
4452   gfc_ref *ref;
4453
4454   for (ref = e->ref; ref; ref = ref->next)
4455     if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4456       return !gfc_ref_this_image (ref);
4457
4458   return false;
4459 }
4460
4461
4462 /* Coarrays are variables with a corank but not being coindexed. However, also
4463    the following is a coarray: A subobject of a coarray is a coarray if it does
4464    not have any cosubscripts, vector subscripts, allocatable component
4465    selection, or pointer component selection. (F2008, 2.4.7)  */
4466
4467 bool
4468 gfc_is_coarray (gfc_expr *e)
4469 {
4470   gfc_ref *ref;
4471   gfc_symbol *sym;
4472   gfc_component *comp;
4473   bool coindexed;
4474   bool coarray;
4475   int i;
4476
4477   if (e->expr_type != EXPR_VARIABLE)
4478     return false;
4479
4480   coindexed = false;
4481   sym = e->symtree->n.sym;
4482
4483   if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
4484     coarray = CLASS_DATA (sym)->attr.codimension;
4485   else
4486     coarray = sym->attr.codimension;
4487
4488   for (ref = e->ref; ref; ref = ref->next)
4489     switch (ref->type)
4490     {
4491       case REF_COMPONENT:
4492         comp = ref->u.c.component;
4493         if (comp->ts.type == BT_CLASS && comp->attr.class_ok
4494             && (CLASS_DATA (comp)->attr.class_pointer
4495                 || CLASS_DATA (comp)->attr.allocatable))
4496           {
4497             coindexed = false;
4498             coarray = CLASS_DATA (comp)->attr.codimension;
4499           }
4500         else if (comp->attr.pointer || comp->attr.allocatable)
4501           {
4502             coindexed = false;
4503             coarray = comp->attr.codimension;
4504           }
4505         break;
4506
4507      case REF_ARRAY:
4508         if (!coarray)
4509           break;
4510
4511         if (ref->u.ar.codimen > 0 && !gfc_ref_this_image (ref))
4512           {
4513             coindexed = true;
4514             break;
4515           }
4516
4517         for (i = 0; i < ref->u.ar.dimen; i++)
4518           if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
4519             {
4520               coarray = false;
4521               break;
4522             }
4523         break;
4524
4525      case REF_SUBSTRING:
4526         break;
4527     }
4528
4529   return coarray && !coindexed;
4530 }
4531
4532
4533 int
4534 gfc_get_corank (gfc_expr *e)
4535 {
4536   int corank;
4537   gfc_ref *ref;
4538
4539   if (!gfc_is_coarray (e))
4540     return 0;
4541
4542   if (e->ts.type == BT_CLASS && e->ts.u.derived->components)
4543     corank = e->ts.u.derived->components->as
4544              ? e->ts.u.derived->components->as->corank : 0;
4545   else
4546     corank = e->symtree->n.sym->as ? e->symtree->n.sym->as->corank : 0;
4547
4548   for (ref = e->ref; ref; ref = ref->next)
4549     {
4550       if (ref->type == REF_ARRAY)
4551         corank = ref->u.ar.as->corank;
4552       gcc_assert (ref->type != REF_SUBSTRING);
4553     }
4554
4555   return corank;
4556 }
4557
4558
4559 /* Check whether the expression has an ultimate allocatable component.
4560    Being itself allocatable does not count.  */
4561 bool
4562 gfc_has_ultimate_allocatable (gfc_expr *e)
4563 {
4564   gfc_ref *ref, *last = NULL;
4565
4566   if (e->expr_type != EXPR_VARIABLE)
4567     return false;
4568
4569   for (ref = e->ref; ref; ref = ref->next)
4570     if (ref->type == REF_COMPONENT)
4571       last = ref;
4572
4573   if (last && last->u.c.component->ts.type == BT_CLASS)
4574     return CLASS_DATA (last->u.c.component)->attr.alloc_comp;
4575   else if (last && last->u.c.component->ts.type == BT_DERIVED)
4576     return last->u.c.component->ts.u.derived->attr.alloc_comp;
4577   else if (last)
4578     return false;
4579
4580   if (e->ts.type == BT_CLASS)
4581     return CLASS_DATA (e)->attr.alloc_comp;
4582   else if (e->ts.type == BT_DERIVED)
4583     return e->ts.u.derived->attr.alloc_comp;
4584   else
4585     return false;
4586 }
4587
4588
4589 /* Check whether the expression has an pointer component.
4590    Being itself a pointer does not count.  */
4591 bool
4592 gfc_has_ultimate_pointer (gfc_expr *e)
4593 {
4594   gfc_ref *ref, *last = NULL;
4595
4596   if (e->expr_type != EXPR_VARIABLE)
4597     return false;
4598
4599   for (ref = e->ref; ref; ref = ref->next)
4600     if (ref->type == REF_COMPONENT)
4601       last = ref;
4602
4603   if (last && last->u.c.component->ts.type == BT_CLASS)
4604     return CLASS_DATA (last->u.c.component)->attr.pointer_comp;
4605   else if (last && last->u.c.component->ts.type == BT_DERIVED)
4606     return last->u.c.component->ts.u.derived->attr.pointer_comp;
4607   else if (last)
4608     return false;
4609
4610   if (e->ts.type == BT_CLASS)
4611     return CLASS_DATA (e)->attr.pointer_comp;
4612   else if (e->ts.type == BT_DERIVED)
4613     return e->ts.u.derived->attr.pointer_comp;
4614   else
4615     return false;
4616 }
4617
4618
4619 /* Check whether an expression is "simply contiguous", cf. F2008, 6.5.4.
4620    Note: A scalar is not regarded as "simply contiguous" by the standard.
4621    if bool is not strict, some further checks are done - for instance,
4622    a "(::1)" is accepted.  */
4623
4624 bool
4625 gfc_is_simply_contiguous (gfc_expr *expr, bool strict, bool permit_element)
4626 {
4627   bool colon;
4628   int i;
4629   gfc_array_ref *ar = NULL;
4630   gfc_ref *ref, *part_ref = NULL;
4631   gfc_symbol *sym;
4632
4633   if (expr->expr_type == EXPR_FUNCTION)
4634     return expr->value.function.esym
4635            ? expr->value.function.esym->result->attr.contiguous : false;
4636   else if (expr->expr_type != EXPR_VARIABLE)
4637     return false;
4638
4639   if (!permit_element && expr->rank == 0)
4640     return false;
4641
4642   for (ref = expr->ref; ref; ref = ref->next)
4643     {
4644       if (ar)
4645         return false; /* Array shall be last part-ref.  */
4646
4647       if (ref->type == REF_COMPONENT)
4648         part_ref  = ref;
4649       else if (ref->type == REF_SUBSTRING)
4650         return false;
4651       else if (ref->u.ar.type != AR_ELEMENT)
4652         ar = &ref->u.ar;
4653     }
4654
4655   sym = expr->symtree->n.sym;
4656   if (expr->ts.type != BT_CLASS
4657         && ((part_ref
4658                 && !part_ref->u.c.component->attr.contiguous
4659                 && part_ref->u.c.component->attr.pointer)
4660             || (!part_ref
4661                 && !sym->attr.contiguous
4662                 && (sym->attr.pointer
4663                     || sym->as->type == AS_ASSUMED_RANK
4664                     || sym->as->type == AS_ASSUMED_SHAPE))))
4665     return false;
4666
4667   if (!ar || ar->type == AR_FULL)
4668     return true;
4669
4670   gcc_assert (ar->type == AR_SECTION);
4671
4672   /* Check for simply contiguous array */
4673   colon = true;
4674   for (i = 0; i < ar->dimen; i++)
4675     {
4676       if (ar->dimen_type[i] == DIMEN_VECTOR)
4677         return false;
4678
4679       if (ar->dimen_type[i] == DIMEN_ELEMENT)
4680         {
4681           colon = false;
4682           continue;
4683         }
4684
4685       gcc_assert (ar->dimen_type[i] == DIMEN_RANGE);
4686
4687
4688       /* If the previous section was not contiguous, that's an error,
4689          unless we have effective only one element and checking is not
4690          strict.  */
4691       if (!colon && (strict || !ar->start[i] || !ar->end[i]
4692                      || ar->start[i]->expr_type != EXPR_CONSTANT
4693                      || ar->end[i]->expr_type != EXPR_CONSTANT
4694                      || mpz_cmp (ar->start[i]->value.integer,
4695                                  ar->end[i]->value.integer) != 0))
4696         return false;
4697
4698       /* Following the standard, "(::1)" or - if known at compile time -
4699          "(lbound:ubound)" are not simply contiguous; if strict
4700          is false, they are regarded as simply contiguous.  */
4701       if (ar->stride[i] && (strict || ar->stride[i]->expr_type != EXPR_CONSTANT
4702                             || ar->stride[i]->ts.type != BT_INTEGER
4703                             || mpz_cmp_si (ar->stride[i]->value.integer, 1) != 0))
4704         return false;
4705
4706       if (ar->start[i]
4707           && (strict || ar->start[i]->expr_type != EXPR_CONSTANT
4708               || !ar->as->lower[i]
4709               || ar->as->lower[i]->expr_type != EXPR_CONSTANT
4710               || mpz_cmp (ar->start[i]->value.integer,
4711                           ar->as->lower[i]->value.integer) != 0))
4712         colon = false;
4713
4714       if (ar->end[i]
4715           && (strict || ar->end[i]->expr_type != EXPR_CONSTANT
4716               || !ar->as->upper[i]
4717               || ar->as->upper[i]->expr_type != EXPR_CONSTANT
4718               || mpz_cmp (ar->end[i]->value.integer,
4719                           ar->as->upper[i]->value.integer) != 0))
4720         colon = false;
4721     }
4722
4723   return true;
4724 }
4725
4726
4727 /* Build call to an intrinsic procedure.  The number of arguments has to be
4728    passed (rather than ending the list with a NULL value) because we may
4729    want to add arguments but with a NULL-expression.  */
4730
4731 gfc_expr*
4732 gfc_build_intrinsic_call (gfc_namespace *ns, gfc_isym_id id, const char* name,
4733                           locus where, unsigned numarg, ...)
4734 {
4735   gfc_expr* result;
4736   gfc_actual_arglist* atail;
4737   gfc_intrinsic_sym* isym;
4738   va_list ap;
4739   unsigned i;
4740   const char *mangled_name = gfc_get_string (GFC_PREFIX ("%s"), name);
4741
4742   isym = gfc_intrinsic_function_by_id (id);
4743   gcc_assert (isym);
4744
4745   result = gfc_get_expr ();
4746   result->expr_type = EXPR_FUNCTION;
4747   result->ts = isym->ts;
4748   result->where = where;
4749   result->value.function.name = mangled_name;
4750   result->value.function.isym = isym;
4751
4752   gfc_get_sym_tree (mangled_name, ns, &result->symtree, false);
4753   gfc_commit_symbol (result->symtree->n.sym);
4754   gcc_assert (result->symtree
4755               && (result->symtree->n.sym->attr.flavor == FL_PROCEDURE
4756                   || result->symtree->n.sym->attr.flavor == FL_UNKNOWN));
4757   result->symtree->n.sym->intmod_sym_id = id;
4758   result->symtree->n.sym->attr.flavor = FL_PROCEDURE;
4759   result->symtree->n.sym->attr.intrinsic = 1;
4760   result->symtree->n.sym->attr.artificial = 1;
4761
4762   va_start (ap, numarg);
4763   atail = NULL;
4764   for (i = 0; i < numarg; ++i)
4765     {
4766       if (atail)
4767         {
4768           atail->next = gfc_get_actual_arglist ();
4769           atail = atail->next;
4770         }
4771       else
4772         atail = result->value.function.actual = gfc_get_actual_arglist ();
4773
4774       atail->expr = va_arg (ap, gfc_expr*);
4775     }
4776   va_end (ap);
4777
4778   return result;
4779 }
4780
4781
4782 /* Check if an expression may appear in a variable definition context
4783    (F2008, 16.6.7) or pointer association context (F2008, 16.6.8).
4784    This is called from the various places when resolving
4785    the pieces that make up such a context.
4786    If own_scope is true (applies to, e.g., ac-implied-do/data-implied-do
4787    variables), some checks are not performed.
4788
4789    Optionally, a possible error message can be suppressed if context is NULL
4790    and just the return status (true / false) be requested.  */
4791
4792 bool
4793 gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj,
4794                           bool own_scope, const char* context)
4795 {
4796   gfc_symbol* sym = NULL;
4797   bool is_pointer;
4798   bool check_intentin;
4799   bool ptr_component;
4800   symbol_attribute attr;
4801   gfc_ref* ref;
4802   int i;
4803
4804   if (e->expr_type == EXPR_VARIABLE)
4805     {
4806       gcc_assert (e->symtree);
4807       sym = e->symtree->n.sym;
4808     }
4809   else if (e->expr_type == EXPR_FUNCTION)
4810     {
4811       gcc_assert (e->symtree);
4812       sym = e->value.function.esym ? e->value.function.esym : e->symtree->n.sym;
4813     }
4814
4815   attr = gfc_expr_attr (e);
4816   if (!pointer && e->expr_type == EXPR_FUNCTION && attr.pointer)
4817     {
4818       if (!(gfc_option.allow_std & GFC_STD_F2008))
4819         {
4820           if (context)
4821             gfc_error ("Fortran 2008: Pointer functions in variable definition"
4822                        " context (%s) at %L", context, &e->where);
4823           return false;
4824         }
4825     }
4826   else if (e->expr_type != EXPR_VARIABLE)
4827     {
4828       if (context)
4829         gfc_error ("Non-variable expression in variable definition context (%s)"
4830                    " at %L", context, &e->where);
4831       return false;
4832     }
4833
4834   if (!pointer && sym->attr.flavor == FL_PARAMETER)
4835     {
4836       if (context)
4837         gfc_error ("Named constant %qs in variable definition context (%s)"
4838                    " at %L", sym->name, context, &e->where);
4839       return false;
4840     }
4841   if (!pointer && sym->attr.flavor != FL_VARIABLE
4842       && !(sym->attr.flavor == FL_PROCEDURE && sym == sym->result)
4843       && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer))
4844     {
4845       if (context)
4846         gfc_error ("%qs in variable definition context (%s) at %L is not"
4847                    " a variable", sym->name, context, &e->where);
4848       return false;
4849     }
4850
4851   /* Find out whether the expr is a pointer; this also means following
4852      component references to the last one.  */
4853   is_pointer = (attr.pointer || attr.proc_pointer);
4854   if (pointer && !is_pointer)
4855     {
4856       if (context)
4857         gfc_error ("Non-POINTER in pointer association context (%s)"
4858                    " at %L", context, &e->where);
4859       return false;
4860     }
4861
4862   if (e->ts.type == BT_DERIVED
4863       && e->ts.u.derived == NULL)
4864     {
4865       if (context)
4866         gfc_error ("Type inaccessible in variable definition context (%s) "
4867                    "at %L", context, &e->where);
4868       return false;
4869     }
4870
4871   /* F2008, C1303.  */
4872   if (!alloc_obj
4873       && (attr.lock_comp
4874           || (e->ts.type == BT_DERIVED
4875               && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
4876               && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)))
4877     {
4878       if (context)
4879         gfc_error ("LOCK_TYPE in variable definition context (%s) at %L",
4880                    context, &e->where);
4881       return false;
4882     }
4883
4884   /* TS18508, C702/C203.  */
4885   if (!alloc_obj
4886       && (attr.lock_comp
4887           || (e->ts.type == BT_DERIVED
4888               && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
4889               && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)))
4890     {
4891       if (context)
4892         gfc_error ("LOCK_EVENT in variable definition context (%s) at %L",
4893                    context, &e->where);
4894       return false;
4895     }
4896
4897   /* INTENT(IN) dummy argument.  Check this, unless the object itself is the
4898      component of sub-component of a pointer; we need to distinguish
4899      assignment to a pointer component from pointer-assignment to a pointer
4900      component.  Note that (normal) assignment to procedure pointers is not
4901      possible.  */
4902   check_intentin = !own_scope;
4903   ptr_component = (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
4904                   ? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer;
4905   for (ref = e->ref; ref && check_intentin; ref = ref->next)
4906     {
4907       if (ptr_component && ref->type == REF_COMPONENT)
4908         check_intentin = false;
4909       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
4910         {
4911           ptr_component = true;
4912           if (!pointer)
4913             check_intentin = false;
4914         }
4915     }
4916   if (check_intentin && sym->attr.intent == INTENT_IN)
4917     {
4918       if (pointer && is_pointer)
4919         {
4920           if (context)
4921             gfc_error ("Dummy argument %qs with INTENT(IN) in pointer"
4922                        " association context (%s) at %L",
4923                        sym->name, context, &e->where);
4924           return false;
4925         }
4926       if (!pointer && !is_pointer && !sym->attr.pointer)
4927         {
4928           if (context)
4929             gfc_error ("Dummy argument %qs with INTENT(IN) in variable"
4930                        " definition context (%s) at %L",
4931                        sym->name, context, &e->where);
4932           return false;
4933         }
4934     }
4935
4936   /* PROTECTED and use-associated.  */
4937   if (sym->attr.is_protected && sym->attr.use_assoc && check_intentin)
4938     {
4939       if (pointer && is_pointer)
4940         {
4941           if (context)
4942             gfc_error ("Variable %qs is PROTECTED and can not appear in a"
4943                        " pointer association context (%s) at %L",
4944                        sym->name, context, &e->where);
4945           return false;
4946         }
4947       if (!pointer && !is_pointer)
4948         {
4949           if (context)
4950             gfc_error ("Variable %qs is PROTECTED and can not appear in a"
4951                        " variable definition context (%s) at %L",
4952                        sym->name, context, &e->where);
4953           return false;
4954         }
4955     }
4956
4957   /* Variable not assignable from a PURE procedure but appears in
4958      variable definition context.  */
4959   if (!pointer && !own_scope && gfc_pure (NULL) && gfc_impure_variable (sym))
4960     {
4961       if (context)
4962         gfc_error ("Variable %qs can not appear in a variable definition"
4963                    " context (%s) at %L in PURE procedure",
4964                    sym->name, context, &e->where);
4965       return false;
4966     }
4967
4968   if (!pointer && context && gfc_implicit_pure (NULL)
4969       && gfc_impure_variable (sym))
4970     {
4971       gfc_namespace *ns;
4972       gfc_symbol *sym;
4973
4974       for (ns = gfc_current_ns; ns; ns = ns->parent)
4975         {
4976           sym = ns->proc_name;
4977           if (sym == NULL)
4978             break;
4979           if (sym->attr.flavor == FL_PROCEDURE)
4980             {
4981               sym->attr.implicit_pure = 0;
4982               break;
4983             }
4984         }
4985     }
4986   /* Check variable definition context for associate-names.  */
4987   if (!pointer && sym->assoc)
4988     {
4989       const char* name;
4990       gfc_association_list* assoc;
4991
4992       gcc_assert (sym->assoc->target);
4993
4994       /* If this is a SELECT TYPE temporary (the association is used internally
4995          for SELECT TYPE), silently go over to the target.  */
4996       if (sym->attr.select_type_temporary)
4997         {
4998           gfc_expr* t = sym->assoc->target;
4999
5000           gcc_assert (t->expr_type == EXPR_VARIABLE);
5001           name = t->symtree->name;
5002
5003           if (t->symtree->n.sym->assoc)
5004             assoc = t->symtree->n.sym->assoc;
5005           else
5006             assoc = sym->assoc;
5007         }
5008       else
5009         {
5010           name = sym->name;
5011           assoc = sym->assoc;
5012         }
5013       gcc_assert (name && assoc);
5014
5015       /* Is association to a valid variable?  */
5016       if (!assoc->variable)
5017         {
5018           if (context)
5019             {
5020               if (assoc->target->expr_type == EXPR_VARIABLE)
5021                 gfc_error ("%qs at %L associated to vector-indexed target can"
5022                            " not be used in a variable definition context (%s)",
5023                            name, &e->where, context);
5024               else
5025                 gfc_error ("%qs at %L associated to expression can"
5026                            " not be used in a variable definition context (%s)",
5027                            name, &e->where, context);
5028             }
5029           return false;
5030         }
5031
5032       /* Target must be allowed to appear in a variable definition context.  */
5033       if (!gfc_check_vardef_context (assoc->target, pointer, false, false, NULL))
5034         {
5035           if (context)
5036             gfc_error ("Associate-name %qs can not appear in a variable"
5037                        " definition context (%s) at %L because its target"
5038                        " at %L can not, either",
5039                        name, context, &e->where,
5040                        &assoc->target->where);
5041           return false;
5042         }
5043     }
5044
5045   /* Check for same value in vector expression subscript.  */
5046
5047   if (e->rank > 0)
5048     for (ref = e->ref; ref != NULL; ref = ref->next)
5049       if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
5050         for (i = 0; i < GFC_MAX_DIMENSIONS
5051                && ref->u.ar.dimen_type[i] != 0; i++)
5052           if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
5053             {
5054               gfc_expr *arr = ref->u.ar.start[i];
5055               if (arr->expr_type == EXPR_ARRAY)
5056                 {
5057                   gfc_constructor *c, *n;
5058                   gfc_expr *ec, *en;
5059                   
5060                   for (c = gfc_constructor_first (arr->value.constructor);
5061                        c != NULL; c = gfc_constructor_next (c))
5062                     {
5063                       if (c == NULL || c->iterator != NULL)
5064                         continue;
5065                       
5066                       ec = c->expr;
5067
5068                       for (n = gfc_constructor_next (c); n != NULL;
5069                            n = gfc_constructor_next (n))
5070                         {
5071                           if (n->iterator != NULL)
5072                             continue;
5073                           
5074                           en = n->expr;
5075                           if (gfc_dep_compare_expr (ec, en) == 0)
5076                             {
5077                               if (context)
5078                                 gfc_error_now ("Elements with the same value "
5079                                                "at %L and %L in vector "
5080                                                "subscript in a variable "
5081                                                "definition context (%s)",
5082                                                &(ec->where), &(en->where),
5083                                                context);
5084                               return false;
5085                             }
5086                         }
5087                     }
5088                 }
5089             }
5090   
5091   return true;
5092 }