re PR fortran/45516 ([F08] allocatable compontents of recursive type)
[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.  Only add a call to the intrinsic
3132    conversion routines, when allow_convert is set.  When this assign is a
3133    coarray call, then the convert is done by the coarray routine implictly and
3134    adding the intrinsic conversion would do harm in most cases.  */
3135
3136 bool
3137 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform,
3138                   bool allow_convert)
3139 {
3140   gfc_symbol *sym;
3141   gfc_ref *ref;
3142   int has_pointer;
3143
3144   sym = lvalue->symtree->n.sym;
3145
3146   /* See if this is the component or subcomponent of a pointer.  */
3147   has_pointer = sym->attr.pointer;
3148   for (ref = lvalue->ref; ref; ref = ref->next)
3149     if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
3150       {
3151         has_pointer = 1;
3152         break;
3153       }
3154
3155   /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
3156      variable local to a function subprogram.  Its existence begins when
3157      execution of the function is initiated and ends when execution of the
3158      function is terminated...
3159      Therefore, the left hand side is no longer a variable, when it is:  */
3160   if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
3161       && !sym->attr.external)
3162     {
3163       bool bad_proc;
3164       bad_proc = false;
3165
3166       /* (i) Use associated;  */
3167       if (sym->attr.use_assoc)
3168         bad_proc = true;
3169
3170       /* (ii) The assignment is in the main program; or  */
3171       if (gfc_current_ns->proc_name
3172           && gfc_current_ns->proc_name->attr.is_main_program)
3173         bad_proc = true;
3174
3175       /* (iii) A module or internal procedure...  */
3176       if (gfc_current_ns->proc_name
3177           && (gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
3178               || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
3179           && gfc_current_ns->parent
3180           && (!(gfc_current_ns->parent->proc_name->attr.function
3181                 || gfc_current_ns->parent->proc_name->attr.subroutine)
3182               || gfc_current_ns->parent->proc_name->attr.is_main_program))
3183         {
3184           /* ... that is not a function...  */
3185           if (gfc_current_ns->proc_name
3186               && !gfc_current_ns->proc_name->attr.function)
3187             bad_proc = true;
3188
3189           /* ... or is not an entry and has a different name.  */
3190           if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
3191             bad_proc = true;
3192         }
3193
3194       /* (iv) Host associated and not the function symbol or the
3195               parent result.  This picks up sibling references, which
3196               cannot be entries.  */
3197       if (!sym->attr.entry
3198             && sym->ns == gfc_current_ns->parent
3199             && sym != gfc_current_ns->proc_name
3200             && sym != gfc_current_ns->parent->proc_name->result)
3201         bad_proc = true;
3202
3203       if (bad_proc)
3204         {
3205           gfc_error ("%qs at %L is not a VALUE", sym->name, &lvalue->where);
3206           return false;
3207         }
3208     }
3209
3210   if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
3211     {
3212       gfc_error ("Incompatible ranks %d and %d in assignment at %L",
3213                  lvalue->rank, rvalue->rank, &lvalue->where);
3214       return false;
3215     }
3216
3217   if (lvalue->ts.type == BT_UNKNOWN)
3218     {
3219       gfc_error ("Variable type is UNKNOWN in assignment at %L",
3220                  &lvalue->where);
3221       return false;
3222     }
3223
3224   if (rvalue->expr_type == EXPR_NULL)
3225     {
3226       if (has_pointer && (ref == NULL || ref->next == NULL)
3227           && lvalue->symtree->n.sym->attr.data)
3228         return true;
3229       else
3230         {
3231           gfc_error ("NULL appears on right-hand side in assignment at %L",
3232                      &rvalue->where);
3233           return false;
3234         }
3235     }
3236
3237   /* This is possibly a typo: x = f() instead of x => f().  */
3238   if (warn_surprising
3239       && rvalue->expr_type == EXPR_FUNCTION && gfc_expr_attr (rvalue).pointer)
3240     gfc_warning (OPT_Wsurprising,
3241                  "POINTER-valued function appears on right-hand side of "
3242                  "assignment at %L", &rvalue->where);
3243
3244   /* Check size of array assignments.  */
3245   if (lvalue->rank != 0 && rvalue->rank != 0
3246       && !gfc_check_conformance (lvalue, rvalue, "array assignment"))
3247     return false;
3248
3249   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
3250       && lvalue->symtree->n.sym->attr.data
3251       && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L used to "
3252                           "initialize non-integer variable %qs",
3253                           &rvalue->where, lvalue->symtree->n.sym->name))
3254     return false;
3255   else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
3256       && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L outside "
3257                           "a DATA statement and outside INT/REAL/DBLE/CMPLX",
3258                           &rvalue->where))
3259     return false;
3260
3261   /* Handle the case of a BOZ literal on the RHS.  */
3262   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
3263     {
3264       int rc;
3265       if (warn_surprising)
3266         gfc_warning (OPT_Wsurprising,
3267                      "BOZ literal at %L is bitwise transferred "
3268                      "non-integer symbol %qs", &rvalue->where,
3269                      lvalue->symtree->n.sym->name);
3270       if (!gfc_convert_boz (rvalue, &lvalue->ts))
3271         return false;
3272       if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
3273         {
3274           if (rc == ARITH_UNDERFLOW)
3275             gfc_error ("Arithmetic underflow 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_OVERFLOW)
3279             gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
3280                        ". This check can be disabled with the option "
3281                        "%<-fno-range-check%>", &rvalue->where);
3282           else if (rc == ARITH_NAN)
3283             gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
3284                        ". This check can be disabled with the option "
3285                        "%<-fno-range-check%>", &rvalue->where);
3286           return false;
3287         }
3288     }
3289
3290   if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
3291     return true;
3292
3293   /* Only DATA Statements come here.  */
3294   if (!conform)
3295     {
3296       /* Numeric can be converted to any other numeric. And Hollerith can be
3297          converted to any other type.  */
3298       if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
3299           || rvalue->ts.type == BT_HOLLERITH)
3300         return true;
3301
3302       if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
3303         return true;
3304
3305       gfc_error ("Incompatible types in DATA statement at %L; attempted "
3306                  "conversion of %s to %s", &lvalue->where,
3307                  gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3308
3309       return false;
3310     }
3311
3312   /* Assignment is the only case where character variables of different
3313      kind values can be converted into one another.  */
3314   if (lvalue->ts.type == BT_CHARACTER && rvalue->ts.type == BT_CHARACTER)
3315     {
3316       if (lvalue->ts.kind != rvalue->ts.kind && allow_convert)
3317         gfc_convert_chartype (rvalue, &lvalue->ts);
3318
3319       return true;
3320     }
3321
3322   if (!allow_convert)
3323     return true;
3324
3325   return gfc_convert_type (rvalue, &lvalue->ts, 1);
3326 }
3327
3328
3329 /* Check that a pointer assignment is OK.  We first check lvalue, and
3330    we only check rvalue if it's not an assignment to NULL() or a
3331    NULLIFY statement.  */
3332
3333 bool
3334 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
3335 {
3336   symbol_attribute attr, lhs_attr;
3337   gfc_ref *ref;
3338   bool is_pure, is_implicit_pure, rank_remap;
3339   int proc_pointer;
3340
3341   lhs_attr = gfc_expr_attr (lvalue);
3342   if (lvalue->ts.type == BT_UNKNOWN && !lhs_attr.proc_pointer)
3343     {
3344       gfc_error ("Pointer assignment target is not a POINTER at %L",
3345                  &lvalue->where);
3346       return false;
3347     }
3348
3349   if (lhs_attr.flavor == FL_PROCEDURE && lhs_attr.use_assoc
3350       && !lhs_attr.proc_pointer)
3351     {
3352       gfc_error ("%qs in the pointer assignment at %L cannot be an "
3353                  "l-value since it is a procedure",
3354                  lvalue->symtree->n.sym->name, &lvalue->where);
3355       return false;
3356     }
3357
3358   proc_pointer = lvalue->symtree->n.sym->attr.proc_pointer;
3359
3360   rank_remap = false;
3361   for (ref = lvalue->ref; ref; ref = ref->next)
3362     {
3363       if (ref->type == REF_COMPONENT)
3364         proc_pointer = ref->u.c.component->attr.proc_pointer;
3365
3366       if (ref->type == REF_ARRAY && ref->next == NULL)
3367         {
3368           int dim;
3369
3370           if (ref->u.ar.type == AR_FULL)
3371             break;
3372
3373           if (ref->u.ar.type != AR_SECTION)
3374             {
3375               gfc_error ("Expected bounds specification for %qs at %L",
3376                          lvalue->symtree->n.sym->name, &lvalue->where);
3377               return false;
3378             }
3379
3380           if (!gfc_notify_std (GFC_STD_F2003, "Bounds specification "
3381                                "for %qs in pointer assignment at %L",
3382                                lvalue->symtree->n.sym->name, &lvalue->where))
3383             return false;
3384
3385           /* When bounds are given, all lbounds are necessary and either all
3386              or none of the upper bounds; no strides are allowed.  If the
3387              upper bounds are present, we may do rank remapping.  */
3388           for (dim = 0; dim < ref->u.ar.dimen; ++dim)
3389             {
3390               if (!ref->u.ar.start[dim]
3391                   || ref->u.ar.dimen_type[dim] != DIMEN_RANGE)
3392                 {
3393                   gfc_error ("Lower bound has to be present at %L",
3394                              &lvalue->where);
3395                   return false;
3396                 }
3397               if (ref->u.ar.stride[dim])
3398                 {
3399                   gfc_error ("Stride must not be present at %L",
3400                              &lvalue->where);
3401                   return false;
3402                 }
3403
3404               if (dim == 0)
3405                 rank_remap = (ref->u.ar.end[dim] != NULL);
3406               else
3407                 {
3408                   if ((rank_remap && !ref->u.ar.end[dim])
3409                       || (!rank_remap && ref->u.ar.end[dim]))
3410                     {
3411                       gfc_error ("Either all or none of the upper bounds"
3412                                  " must be specified at %L", &lvalue->where);
3413                       return false;
3414                     }
3415                 }
3416             }
3417         }
3418     }
3419
3420   is_pure = gfc_pure (NULL);
3421   is_implicit_pure = gfc_implicit_pure (NULL);
3422
3423   /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
3424      kind, etc for lvalue and rvalue must match, and rvalue must be a
3425      pure variable if we're in a pure function.  */
3426   if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
3427     return true;
3428
3429   /* F2008, C723 (pointer) and C726 (proc-pointer); for PURE also C1283.  */
3430   if (lvalue->expr_type == EXPR_VARIABLE
3431       && gfc_is_coindexed (lvalue))
3432     {
3433       gfc_ref *ref;
3434       for (ref = lvalue->ref; ref; ref = ref->next)
3435         if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3436           {
3437             gfc_error ("Pointer object at %L shall not have a coindex",
3438                        &lvalue->where);
3439             return false;
3440           }
3441     }
3442
3443   /* Checks on rvalue for procedure pointer assignments.  */
3444   if (proc_pointer)
3445     {
3446       char err[200];
3447       gfc_symbol *s1,*s2;
3448       gfc_component *comp;
3449       const char *name;
3450
3451       attr = gfc_expr_attr (rvalue);
3452       if (!((rvalue->expr_type == EXPR_NULL)
3453             || (rvalue->expr_type == EXPR_FUNCTION && attr.proc_pointer)
3454             || (rvalue->expr_type == EXPR_VARIABLE && attr.proc_pointer)
3455             || (rvalue->expr_type == EXPR_VARIABLE
3456                 && attr.flavor == FL_PROCEDURE)))
3457         {
3458           gfc_error ("Invalid procedure pointer assignment at %L",
3459                      &rvalue->where);
3460           return false;
3461         }
3462       if (rvalue->expr_type == EXPR_VARIABLE && !attr.proc_pointer)
3463         {
3464           /* Check for intrinsics.  */
3465           gfc_symbol *sym = rvalue->symtree->n.sym;
3466           if (!sym->attr.intrinsic
3467               && (gfc_is_intrinsic (sym, 0, sym->declared_at)
3468                   || gfc_is_intrinsic (sym, 1, sym->declared_at)))
3469             {
3470               sym->attr.intrinsic = 1;
3471               gfc_resolve_intrinsic (sym, &rvalue->where);
3472               attr = gfc_expr_attr (rvalue);
3473             }
3474           /* Check for result of embracing function.  */
3475           if (sym->attr.function && sym->result == sym)
3476             {
3477               gfc_namespace *ns;
3478
3479               for (ns = gfc_current_ns; ns; ns = ns->parent)
3480                 if (sym == ns->proc_name)
3481                   {
3482                     gfc_error ("Function result %qs is invalid as proc-target "
3483                                "in procedure pointer assignment at %L",
3484                                sym->name, &rvalue->where);
3485                     return false;
3486                   }
3487             }
3488         }
3489       if (attr.abstract)
3490         {
3491           gfc_error ("Abstract interface %qs is invalid "
3492                      "in procedure pointer assignment at %L",
3493                      rvalue->symtree->name, &rvalue->where);
3494           return false;
3495         }
3496       /* Check for F08:C729.  */
3497       if (attr.flavor == FL_PROCEDURE)
3498         {
3499           if (attr.proc == PROC_ST_FUNCTION)
3500             {
3501               gfc_error ("Statement function %qs is invalid "
3502                          "in procedure pointer assignment at %L",
3503                          rvalue->symtree->name, &rvalue->where);
3504               return false;
3505             }
3506           if (attr.proc == PROC_INTERNAL &&
3507               !gfc_notify_std(GFC_STD_F2008, "Internal procedure %qs "
3508                               "is invalid in procedure pointer assignment "
3509                               "at %L", rvalue->symtree->name, &rvalue->where))
3510             return false;
3511           if (attr.intrinsic && gfc_intrinsic_actual_ok (rvalue->symtree->name,
3512                                                          attr.subroutine) == 0)
3513             {
3514               gfc_error ("Intrinsic %qs at %L is invalid in procedure pointer "
3515                          "assignment", rvalue->symtree->name, &rvalue->where);
3516               return false;
3517             }
3518         }
3519       /* Check for F08:C730.  */
3520       if (attr.elemental && !attr.intrinsic)
3521         {
3522           gfc_error ("Nonintrinsic elemental procedure %qs is invalid "
3523                      "in procedure pointer assignment at %L",
3524                      rvalue->symtree->name, &rvalue->where);
3525           return false;
3526         }
3527
3528       /* Ensure that the calling convention is the same. As other attributes
3529          such as DLLEXPORT may differ, one explicitly only tests for the
3530          calling conventions.  */
3531       if (rvalue->expr_type == EXPR_VARIABLE
3532           && lvalue->symtree->n.sym->attr.ext_attr
3533                != rvalue->symtree->n.sym->attr.ext_attr)
3534         {
3535           symbol_attribute calls;
3536
3537           calls.ext_attr = 0;
3538           gfc_add_ext_attribute (&calls, EXT_ATTR_CDECL, NULL);
3539           gfc_add_ext_attribute (&calls, EXT_ATTR_STDCALL, NULL);
3540           gfc_add_ext_attribute (&calls, EXT_ATTR_FASTCALL, NULL);
3541
3542           if ((calls.ext_attr & lvalue->symtree->n.sym->attr.ext_attr)
3543               != (calls.ext_attr & rvalue->symtree->n.sym->attr.ext_attr))
3544             {
3545               gfc_error ("Mismatch in the procedure pointer assignment "
3546                          "at %L: mismatch in the calling convention",
3547                          &rvalue->where);
3548           return false;
3549             }
3550         }
3551
3552       comp = gfc_get_proc_ptr_comp (lvalue);
3553       if (comp)
3554         s1 = comp->ts.interface;
3555       else
3556         {
3557           s1 = lvalue->symtree->n.sym;
3558           if (s1->ts.interface)
3559             s1 = s1->ts.interface;
3560         }
3561
3562       comp = gfc_get_proc_ptr_comp (rvalue);
3563       if (comp)
3564         {
3565           if (rvalue->expr_type == EXPR_FUNCTION)
3566             {
3567               s2 = comp->ts.interface->result;
3568               name = s2->name;
3569             }
3570           else
3571             {
3572               s2 = comp->ts.interface;
3573               name = comp->name;
3574             }
3575         }
3576       else if (rvalue->expr_type == EXPR_FUNCTION)
3577         {
3578           if (rvalue->value.function.esym)
3579             s2 = rvalue->value.function.esym->result;
3580           else
3581             s2 = rvalue->symtree->n.sym->result;
3582
3583           name = s2->name;
3584         }
3585       else
3586         {
3587           s2 = rvalue->symtree->n.sym;
3588           name = s2->name;
3589         }
3590
3591       if (s2 && s2->attr.proc_pointer && s2->ts.interface)
3592         s2 = s2->ts.interface;
3593
3594       if (s1 == s2 || !s1 || !s2)
3595         return true;
3596
3597       /* F08:7.2.2.4 (4)  */
3598       if (s1->attr.if_source == IFSRC_UNKNOWN
3599           && gfc_explicit_interface_required (s2, err, sizeof(err)))
3600         {
3601           gfc_error ("Explicit interface required for %qs at %L: %s",
3602                      s1->name, &lvalue->where, err);
3603           return false;
3604         }
3605       if (s2->attr.if_source == IFSRC_UNKNOWN
3606           && gfc_explicit_interface_required (s1, err, sizeof(err)))
3607         {
3608           gfc_error ("Explicit interface required for %qs at %L: %s",
3609                      s2->name, &rvalue->where, err);
3610           return false;
3611         }
3612
3613       if (!gfc_compare_interfaces (s1, s2, name, 0, 1,
3614                                    err, sizeof(err), NULL, NULL))
3615         {
3616           gfc_error ("Interface mismatch in procedure pointer assignment "
3617                      "at %L: %s", &rvalue->where, err);
3618           return false;
3619         }
3620
3621       /* Check F2008Cor2, C729.  */
3622       if (!s2->attr.intrinsic && s2->attr.if_source == IFSRC_UNKNOWN
3623           && !s2->attr.external && !s2->attr.subroutine && !s2->attr.function)
3624         {
3625           gfc_error ("Procedure pointer target %qs at %L must be either an "
3626                      "intrinsic, host or use associated, referenced or have "
3627                      "the EXTERNAL attribute", s2->name, &rvalue->where);
3628           return false;
3629         }
3630
3631       return true;
3632     }
3633
3634   if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
3635     {
3636       /* Check for F03:C717.  */
3637       if (UNLIMITED_POLY (rvalue)
3638           && !(UNLIMITED_POLY (lvalue)
3639                || (lvalue->ts.type == BT_DERIVED
3640                    && (lvalue->ts.u.derived->attr.is_bind_c
3641                        || lvalue->ts.u.derived->attr.sequence))))
3642         gfc_error ("Data-pointer-object at %L must be unlimited "
3643                    "polymorphic, or of a type with the BIND or SEQUENCE "
3644                    "attribute, to be compatible with an unlimited "
3645                    "polymorphic target", &lvalue->where);
3646       else
3647         gfc_error ("Different types in pointer assignment at %L; "
3648                    "attempted assignment of %s to %s", &lvalue->where,
3649                    gfc_typename (&rvalue->ts),
3650                    gfc_typename (&lvalue->ts));
3651       return false;
3652     }
3653
3654   if (lvalue->ts.type != BT_CLASS && lvalue->ts.kind != rvalue->ts.kind)
3655     {
3656       gfc_error ("Different kind type parameters in pointer "
3657                  "assignment at %L", &lvalue->where);
3658       return false;
3659     }
3660
3661   if (lvalue->rank != rvalue->rank && !rank_remap)
3662     {
3663       gfc_error ("Different ranks in pointer assignment at %L", &lvalue->where);
3664       return false;
3665     }
3666
3667   /* Make sure the vtab is present.  */
3668   if (lvalue->ts.type == BT_CLASS && !UNLIMITED_POLY (rvalue))
3669     gfc_find_vtab (&rvalue->ts);
3670
3671   /* Check rank remapping.  */
3672   if (rank_remap)
3673     {
3674       mpz_t lsize, rsize;
3675
3676       /* If this can be determined, check that the target must be at least as
3677          large as the pointer assigned to it is.  */
3678       if (gfc_array_size (lvalue, &lsize)
3679           && gfc_array_size (rvalue, &rsize)
3680           && mpz_cmp (rsize, lsize) < 0)
3681         {
3682           gfc_error ("Rank remapping target is smaller than size of the"
3683                      " pointer (%ld < %ld) at %L",
3684                      mpz_get_si (rsize), mpz_get_si (lsize),
3685                      &lvalue->where);
3686           return false;
3687         }
3688
3689       /* The target must be either rank one or it must be simply contiguous
3690          and F2008 must be allowed.  */
3691       if (rvalue->rank != 1)
3692         {
3693           if (!gfc_is_simply_contiguous (rvalue, true, false))
3694             {
3695               gfc_error ("Rank remapping target must be rank 1 or"
3696                          " simply contiguous at %L", &rvalue->where);
3697               return false;
3698             }
3699           if (!gfc_notify_std (GFC_STD_F2008, "Rank remapping target is not "
3700                                "rank 1 at %L", &rvalue->where))
3701             return false;
3702         }
3703     }
3704
3705   /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
3706   if (rvalue->expr_type == EXPR_NULL)
3707     return true;
3708
3709   if (lvalue->ts.type == BT_CHARACTER)
3710     {
3711       bool t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment");
3712       if (!t)
3713         return false;
3714     }
3715
3716   if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
3717     lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
3718
3719   attr = gfc_expr_attr (rvalue);
3720
3721   if (rvalue->expr_type == EXPR_FUNCTION && !attr.pointer)
3722     {
3723       gfc_error ("Target expression in pointer assignment "
3724                  "at %L must deliver a pointer result",
3725                  &rvalue->where);
3726       return false;
3727     }
3728
3729   if (!attr.target && !attr.pointer)
3730     {
3731       gfc_error ("Pointer assignment target is neither TARGET "
3732                  "nor POINTER at %L", &rvalue->where);
3733       return false;
3734     }
3735
3736   if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3737     {
3738       gfc_error ("Bad target in pointer assignment in PURE "
3739                  "procedure at %L", &rvalue->where);
3740     }
3741
3742   if (is_implicit_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3743     gfc_unset_implicit_pure (gfc_current_ns->proc_name);
3744
3745   if (gfc_has_vector_index (rvalue))
3746     {
3747       gfc_error ("Pointer assignment with vector subscript "
3748                  "on rhs at %L", &rvalue->where);
3749       return false;
3750     }
3751
3752   if (attr.is_protected && attr.use_assoc
3753       && !(attr.pointer || attr.proc_pointer))
3754     {
3755       gfc_error ("Pointer assignment target has PROTECTED "
3756                  "attribute at %L", &rvalue->where);
3757       return false;
3758     }
3759
3760   /* F2008, C725. For PURE also C1283.  */
3761   if (rvalue->expr_type == EXPR_VARIABLE
3762       && gfc_is_coindexed (rvalue))
3763     {
3764       gfc_ref *ref;
3765       for (ref = rvalue->ref; ref; ref = ref->next)
3766         if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3767           {
3768             gfc_error ("Data target at %L shall not have a coindex",
3769                        &rvalue->where);
3770             return false;
3771           }
3772     }
3773
3774   /* Warn if it is the LHS pointer may lives longer than the RHS target.  */
3775   if (warn_target_lifetime
3776       && rvalue->expr_type == EXPR_VARIABLE
3777       && !rvalue->symtree->n.sym->attr.save
3778       && !attr.pointer && !rvalue->symtree->n.sym->attr.host_assoc
3779       && !rvalue->symtree->n.sym->attr.in_common
3780       && !rvalue->symtree->n.sym->attr.use_assoc
3781       && !rvalue->symtree->n.sym->attr.dummy)
3782     {
3783       bool warn;
3784       gfc_namespace *ns;
3785
3786       warn = lvalue->symtree->n.sym->attr.dummy
3787              || lvalue->symtree->n.sym->attr.result
3788              || lvalue->symtree->n.sym->attr.function
3789              || (lvalue->symtree->n.sym->attr.host_assoc
3790                  && lvalue->symtree->n.sym->ns
3791                     != rvalue->symtree->n.sym->ns)
3792              || lvalue->symtree->n.sym->attr.use_assoc
3793              || lvalue->symtree->n.sym->attr.in_common;
3794
3795       if (rvalue->symtree->n.sym->ns->proc_name
3796           && rvalue->symtree->n.sym->ns->proc_name->attr.flavor != FL_PROCEDURE
3797           && rvalue->symtree->n.sym->ns->proc_name->attr.flavor != FL_PROGRAM)
3798        for (ns = rvalue->symtree->n.sym->ns;
3799             ns && ns->proc_name && ns->proc_name->attr.flavor != FL_PROCEDURE;
3800             ns = ns->parent)
3801         if (ns->parent == lvalue->symtree->n.sym->ns)
3802           {
3803             warn = true;
3804             break;
3805           }
3806
3807       if (warn)
3808         gfc_warning (OPT_Wtarget_lifetime,
3809                      "Pointer at %L in pointer assignment might outlive the "
3810                      "pointer target", &lvalue->where);
3811     }
3812
3813   return true;
3814 }
3815
3816
3817 /* Relative of gfc_check_assign() except that the lvalue is a single
3818    symbol.  Used for initialization assignments.  */
3819
3820 bool
3821 gfc_check_assign_symbol (gfc_symbol *sym, gfc_component *comp, gfc_expr *rvalue)
3822 {
3823   gfc_expr lvalue;
3824   bool r;
3825   bool pointer, proc_pointer;
3826
3827   memset (&lvalue, '\0', sizeof (gfc_expr));
3828
3829   lvalue.expr_type = EXPR_VARIABLE;
3830   lvalue.ts = sym->ts;
3831   if (sym->as)
3832     lvalue.rank = sym->as->rank;
3833   lvalue.symtree = XCNEW (gfc_symtree);
3834   lvalue.symtree->n.sym = sym;
3835   lvalue.where = sym->declared_at;
3836
3837   if (comp)
3838     {
3839       lvalue.ref = gfc_get_ref ();
3840       lvalue.ref->type = REF_COMPONENT;
3841       lvalue.ref->u.c.component = comp;
3842       lvalue.ref->u.c.sym = sym;
3843       lvalue.ts = comp->ts;
3844       lvalue.rank = comp->as ? comp->as->rank : 0;
3845       lvalue.where = comp->loc;
3846       pointer = comp->ts.type == BT_CLASS &&  CLASS_DATA (comp)
3847                 ? CLASS_DATA (comp)->attr.class_pointer : comp->attr.pointer;
3848       proc_pointer = comp->attr.proc_pointer;
3849     }
3850   else
3851     {
3852       pointer = sym->ts.type == BT_CLASS &&  CLASS_DATA (sym)
3853                 ? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer;
3854       proc_pointer = sym->attr.proc_pointer;
3855     }
3856
3857   if (pointer || proc_pointer)
3858     r = gfc_check_pointer_assign (&lvalue, rvalue);
3859   else
3860     {
3861       /* If a conversion function, e.g., __convert_i8_i4, was inserted
3862          into an array constructor, we should check if it can be reduced
3863          as an initialization expression.  */
3864       if (rvalue->expr_type == EXPR_FUNCTION
3865           && rvalue->value.function.isym
3866           && (rvalue->value.function.isym->conversion == 1))
3867         gfc_check_init_expr (rvalue);
3868
3869       r = gfc_check_assign (&lvalue, rvalue, 1);
3870     }
3871
3872   free (lvalue.symtree);
3873   free (lvalue.ref);
3874
3875   if (!r)
3876     return r;
3877
3878   if (pointer && rvalue->expr_type != EXPR_NULL)
3879     {
3880       /* F08:C461. Additional checks for pointer initialization.  */
3881       symbol_attribute attr;
3882       attr = gfc_expr_attr (rvalue);
3883       if (attr.allocatable)
3884         {
3885           gfc_error ("Pointer initialization target at %L "
3886                      "must not be ALLOCATABLE", &rvalue->where);
3887           return false;
3888         }
3889       if (!attr.target || attr.pointer)
3890         {
3891           gfc_error ("Pointer initialization target at %L "
3892                      "must have the TARGET attribute", &rvalue->where);
3893           return false;
3894         }
3895
3896       if (!attr.save && rvalue->expr_type == EXPR_VARIABLE
3897           && rvalue->symtree->n.sym->ns->proc_name
3898           && rvalue->symtree->n.sym->ns->proc_name->attr.is_main_program)
3899         {
3900           rvalue->symtree->n.sym->ns->proc_name->attr.save = SAVE_IMPLICIT;
3901           attr.save = SAVE_IMPLICIT;
3902         }
3903
3904       if (!attr.save)
3905         {
3906           gfc_error ("Pointer initialization target at %L "
3907                      "must have the SAVE attribute", &rvalue->where);
3908           return false;
3909         }
3910     }
3911
3912   if (proc_pointer && rvalue->expr_type != EXPR_NULL)
3913     {
3914       /* F08:C1220. Additional checks for procedure pointer initialization.  */
3915       symbol_attribute attr = gfc_expr_attr (rvalue);
3916       if (attr.proc_pointer)
3917         {
3918           gfc_error ("Procedure pointer initialization target at %L "
3919                      "may not be a procedure pointer", &rvalue->where);
3920           return false;
3921         }
3922     }
3923
3924   return true;
3925 }
3926
3927
3928 /* Build an initializer for a local integer, real, complex, logical, or
3929    character variable, based on the command line flags finit-local-zero,
3930    finit-integer=, finit-real=, finit-logical=, and finit-character=.  */
3931
3932 gfc_expr *
3933 gfc_build_default_init_expr (gfc_typespec *ts, locus *where)
3934 {
3935   int char_len;
3936   gfc_expr *init_expr;
3937   int i;
3938
3939   /* Try to build an initializer expression.  */
3940   init_expr = gfc_get_constant_expr (ts->type, ts->kind, where);
3941
3942   /* We will only initialize integers, reals, complex, logicals, and
3943      characters, and only if the corresponding command-line flags
3944      were set.  Otherwise, we free init_expr and return null.  */
3945   switch (ts->type)
3946     {
3947     case BT_INTEGER:
3948       if (gfc_option.flag_init_integer != GFC_INIT_INTEGER_OFF)
3949         mpz_set_si (init_expr->value.integer,
3950                          gfc_option.flag_init_integer_value);
3951       else
3952         {
3953           gfc_free_expr (init_expr);
3954           init_expr = NULL;
3955         }
3956       break;
3957
3958     case BT_REAL:
3959       switch (flag_init_real)
3960         {
3961         case GFC_INIT_REAL_SNAN:
3962           init_expr->is_snan = 1;
3963           /* Fall through.  */
3964         case GFC_INIT_REAL_NAN:
3965           mpfr_set_nan (init_expr->value.real);
3966           break;
3967
3968         case GFC_INIT_REAL_INF:
3969           mpfr_set_inf (init_expr->value.real, 1);
3970           break;
3971
3972         case GFC_INIT_REAL_NEG_INF:
3973           mpfr_set_inf (init_expr->value.real, -1);
3974           break;
3975
3976         case GFC_INIT_REAL_ZERO:
3977           mpfr_set_ui (init_expr->value.real, 0.0, GFC_RND_MODE);
3978           break;
3979
3980         default:
3981           gfc_free_expr (init_expr);
3982           init_expr = NULL;
3983           break;
3984         }
3985       break;
3986
3987     case BT_COMPLEX:
3988       switch (flag_init_real)
3989         {
3990         case GFC_INIT_REAL_SNAN:
3991           init_expr->is_snan = 1;
3992           /* Fall through.  */
3993         case GFC_INIT_REAL_NAN:
3994           mpfr_set_nan (mpc_realref (init_expr->value.complex));
3995           mpfr_set_nan (mpc_imagref (init_expr->value.complex));
3996           break;
3997
3998         case GFC_INIT_REAL_INF:
3999           mpfr_set_inf (mpc_realref (init_expr->value.complex), 1);
4000           mpfr_set_inf (mpc_imagref (init_expr->value.complex), 1);
4001           break;
4002
4003         case GFC_INIT_REAL_NEG_INF:
4004           mpfr_set_inf (mpc_realref (init_expr->value.complex), -1);
4005           mpfr_set_inf (mpc_imagref (init_expr->value.complex), -1);
4006           break;
4007
4008         case GFC_INIT_REAL_ZERO:
4009           mpc_set_ui (init_expr->value.complex, 0, GFC_MPC_RND_MODE);
4010           break;
4011
4012         default:
4013           gfc_free_expr (init_expr);
4014           init_expr = NULL;
4015           break;
4016         }
4017       break;
4018
4019     case BT_LOGICAL:
4020       if (gfc_option.flag_init_logical == GFC_INIT_LOGICAL_FALSE)
4021         init_expr->value.logical = 0;
4022       else if (gfc_option.flag_init_logical == GFC_INIT_LOGICAL_TRUE)
4023         init_expr->value.logical = 1;
4024       else
4025         {
4026           gfc_free_expr (init_expr);
4027           init_expr = NULL;
4028         }
4029       break;
4030
4031     case BT_CHARACTER:
4032       /* For characters, the length must be constant in order to
4033          create a default initializer.  */
4034       if (gfc_option.flag_init_character == GFC_INIT_CHARACTER_ON
4035           && ts->u.cl->length
4036           && ts->u.cl->length->expr_type == EXPR_CONSTANT)
4037         {
4038           char_len = mpz_get_si (ts->u.cl->length->value.integer);
4039           init_expr->value.character.length = char_len;
4040           init_expr->value.character.string = gfc_get_wide_string (char_len+1);
4041           for (i = 0; i < char_len; i++)
4042             init_expr->value.character.string[i]
4043               = (unsigned char) gfc_option.flag_init_character_value;
4044         }
4045       else
4046         {
4047           gfc_free_expr (init_expr);
4048           init_expr = NULL;
4049         }
4050       if (!init_expr && gfc_option.flag_init_character == GFC_INIT_CHARACTER_ON
4051           && ts->u.cl->length && flag_max_stack_var_size != 0)
4052         {
4053           gfc_actual_arglist *arg;
4054           init_expr = gfc_get_expr ();
4055           init_expr->where = *where;
4056           init_expr->ts = *ts;
4057           init_expr->expr_type = EXPR_FUNCTION;
4058           init_expr->value.function.isym =
4059                 gfc_intrinsic_function_by_id (GFC_ISYM_REPEAT);
4060           init_expr->value.function.name = "repeat";
4061           arg = gfc_get_actual_arglist ();
4062           arg->expr = gfc_get_character_expr (ts->kind, where, NULL, 1);
4063           arg->expr->value.character.string[0] =
4064             gfc_option.flag_init_character_value;
4065           arg->next = gfc_get_actual_arglist ();
4066           arg->next->expr = gfc_copy_expr (ts->u.cl->length);
4067           init_expr->value.function.actual = arg;
4068         }
4069       break;
4070
4071     default:
4072      gfc_free_expr (init_expr);
4073      init_expr = NULL;
4074     }
4075
4076   return init_expr;
4077 }
4078
4079 /* Apply an initialization expression to a typespec. Can be used for symbols or
4080    components. Similar to add_init_expr_to_sym in decl.c; could probably be
4081    combined with some effort.  */
4082
4083 void
4084 gfc_apply_init (gfc_typespec *ts, symbol_attribute *attr, gfc_expr *init)
4085 {
4086   if (ts->type == BT_CHARACTER && !attr->pointer && init
4087       && ts->u.cl
4088       && ts->u.cl->length && ts->u.cl->length->expr_type == EXPR_CONSTANT)
4089     {
4090       int len;
4091
4092       gcc_assert (ts->u.cl && ts->u.cl->length);
4093       gcc_assert (ts->u.cl->length->expr_type == EXPR_CONSTANT);
4094       gcc_assert (ts->u.cl->length->ts.type == BT_INTEGER);
4095
4096       len = mpz_get_si (ts->u.cl->length->value.integer);
4097
4098       if (init->expr_type == EXPR_CONSTANT)
4099         gfc_set_constant_character_len (len, init, -1);
4100       else if (init
4101                && init->ts.u.cl
4102                && mpz_cmp (ts->u.cl->length->value.integer,
4103                            init->ts.u.cl->length->value.integer))
4104         {
4105           gfc_constructor *ctor;
4106           ctor = gfc_constructor_first (init->value.constructor);
4107
4108           if (ctor)
4109             {
4110               int first_len;
4111               bool has_ts = (init->ts.u.cl
4112                              && init->ts.u.cl->length_from_typespec);
4113
4114               /* Remember the length of the first element for checking
4115                  that all elements *in the constructor* have the same
4116                  length.  This need not be the length of the LHS!  */
4117               gcc_assert (ctor->expr->expr_type == EXPR_CONSTANT);
4118               gcc_assert (ctor->expr->ts.type == BT_CHARACTER);
4119               first_len = ctor->expr->value.character.length;
4120
4121               for ( ; ctor; ctor = gfc_constructor_next (ctor))
4122                 if (ctor->expr->expr_type == EXPR_CONSTANT)
4123                 {
4124                   gfc_set_constant_character_len (len, ctor->expr,
4125                                                   has_ts ? -1 : first_len);
4126                   ctor->expr->ts.u.cl->length = gfc_copy_expr (ts->u.cl->length);
4127                 }
4128             }
4129         }
4130     }
4131 }
4132
4133
4134 /* Check for default initializer; sym->value is not enough
4135    as it is also set for EXPR_NULL of allocatables.  */
4136
4137 bool
4138 gfc_has_default_initializer (gfc_symbol *der)
4139 {
4140   gfc_component *c;
4141
4142   gcc_assert (gfc_fl_struct (der->attr.flavor));
4143   for (c = der->components; c; c = c->next)
4144     if (gfc_bt_struct (c->ts.type))
4145       {
4146         if (!c->attr.pointer && !c->attr.proc_pointer
4147              && !(c->attr.allocatable && der == c->ts.u.derived)
4148              && gfc_has_default_initializer (c->ts.u.derived))
4149           return true;
4150         if (c->attr.pointer && c->initializer)
4151           return true;
4152       }
4153     else
4154       {
4155         if (c->initializer)
4156           return true;
4157       }
4158
4159   return false;
4160 }
4161
4162
4163 /* Fetch or generate an initializer for the given component.
4164    Only generate an initializer if generate is true.  */
4165
4166 static gfc_expr *
4167 component_initializer (gfc_typespec *ts, gfc_component *c, bool generate)
4168 {
4169   gfc_expr *init = NULL;
4170
4171   /* See if we can find the initializer immediately.  */
4172   if (c->initializer || !generate
4173       || (ts->type == BT_CLASS && !c->attr.allocatable))
4174     return c->initializer;
4175
4176   /* Recursively handle derived type components.  */
4177   if (c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
4178     init = gfc_generate_initializer (&c->ts, true);
4179
4180   /* Treat simple components like locals.  */
4181   else
4182     {
4183       init = gfc_build_default_init_expr (&c->ts, &c->loc);
4184       gfc_apply_init (&c->ts, &c->attr, init);
4185     }
4186
4187   return init;
4188 }
4189
4190
4191 /* Get an expression for a default initializer of a derived type.  */
4192
4193 gfc_expr *
4194 gfc_default_initializer (gfc_typespec *ts)
4195 {
4196   return gfc_generate_initializer (ts, false);
4197 }
4198
4199
4200 /* Get or generate an expression for a default initializer of a derived type.
4201    If -finit-derived is specified, generate default initialization expressions
4202    for components that lack them when generate is set.  */
4203
4204 gfc_expr *
4205 gfc_generate_initializer (gfc_typespec *ts, bool generate)
4206 {
4207   gfc_expr *init, *tmp;
4208   gfc_component *comp;
4209   generate = flag_init_derived && generate;
4210
4211   /* See if we have a default initializer in this, but not in nested
4212      types (otherwise we could use gfc_has_default_initializer()).
4213      We don't need to check if we are going to generate them.  */
4214   comp = ts->u.derived->components;
4215   if (!generate)
4216     {
4217       for (; comp; comp = comp->next)
4218         if (comp->initializer || comp->attr.allocatable
4219             || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)
4220                 && CLASS_DATA (comp)->attr.allocatable))
4221           break;
4222     }
4223
4224   if (!comp)
4225     return NULL;
4226
4227   init = gfc_get_structure_constructor_expr (ts->type, ts->kind,
4228                                              &ts->u.derived->declared_at);
4229   init->ts = *ts;
4230
4231   for (comp = ts->u.derived->components; comp; comp = comp->next)
4232     {
4233       gfc_constructor *ctor = gfc_constructor_get();
4234
4235       /* Fetch or generate an initializer for the component.  */
4236       tmp = component_initializer (ts, comp, generate);
4237       if (tmp)
4238         {
4239           /* Save the component ref for STRUCTUREs and UNIONs.  */
4240           if (ts->u.derived->attr.flavor == FL_STRUCT
4241               || ts->u.derived->attr.flavor == FL_UNION)
4242             ctor->n.component = comp;
4243
4244           /* If the initializer was not generated, we need a copy.  */
4245           ctor->expr = comp->initializer ? gfc_copy_expr (tmp) : tmp;
4246           if ((comp->ts.type != tmp->ts.type
4247                || comp->ts.kind != tmp->ts.kind)
4248               && !comp->attr.pointer && !comp->attr.proc_pointer)
4249             gfc_convert_type_warn (ctor->expr, &comp->ts, 2, false);
4250         }
4251
4252       if (comp->attr.allocatable
4253           || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable))
4254         {
4255           ctor->expr = gfc_get_expr ();
4256           ctor->expr->expr_type = EXPR_NULL;
4257           ctor->expr->ts = comp->ts;
4258         }
4259
4260       gfc_constructor_append (&init->value.constructor, ctor);
4261     }
4262
4263   return init;
4264 }
4265
4266
4267 /* Given a symbol, create an expression node with that symbol as a
4268    variable. If the symbol is array valued, setup a reference of the
4269    whole array.  */
4270
4271 gfc_expr *
4272 gfc_get_variable_expr (gfc_symtree *var)
4273 {
4274   gfc_expr *e;
4275
4276   e = gfc_get_expr ();
4277   e->expr_type = EXPR_VARIABLE;
4278   e->symtree = var;
4279   e->ts = var->n.sym->ts;
4280
4281   if (var->n.sym->attr.flavor != FL_PROCEDURE
4282       && ((var->n.sym->as != NULL && var->n.sym->ts.type != BT_CLASS)
4283            || (var->n.sym->ts.type == BT_CLASS && CLASS_DATA (var->n.sym)
4284                && CLASS_DATA (var->n.sym)->as)))
4285     {
4286       e->rank = var->n.sym->ts.type == BT_CLASS
4287                 ? CLASS_DATA (var->n.sym)->as->rank : var->n.sym->as->rank;
4288       e->ref = gfc_get_ref ();
4289       e->ref->type = REF_ARRAY;
4290       e->ref->u.ar.type = AR_FULL;
4291       e->ref->u.ar.as = gfc_copy_array_spec (var->n.sym->ts.type == BT_CLASS
4292                                              ? CLASS_DATA (var->n.sym)->as
4293                                              : var->n.sym->as);
4294     }
4295
4296   return e;
4297 }
4298
4299
4300 /* Adds a full array reference to an expression, as needed.  */
4301
4302 void
4303 gfc_add_full_array_ref (gfc_expr *e, gfc_array_spec *as)
4304 {
4305   gfc_ref *ref;
4306   for (ref = e->ref; ref; ref = ref->next)
4307     if (!ref->next)
4308       break;
4309   if (ref)
4310     {
4311       ref->next = gfc_get_ref ();
4312       ref = ref->next;
4313     }
4314   else
4315     {
4316       e->ref = gfc_get_ref ();
4317       ref = e->ref;
4318     }
4319   ref->type = REF_ARRAY;
4320   ref->u.ar.type = AR_FULL;
4321   ref->u.ar.dimen = e->rank;
4322   ref->u.ar.where = e->where;
4323   ref->u.ar.as = as;
4324 }
4325
4326
4327 gfc_expr *
4328 gfc_lval_expr_from_sym (gfc_symbol *sym)
4329 {
4330   gfc_expr *lval;
4331   gfc_array_spec *as;
4332   lval = gfc_get_expr ();
4333   lval->expr_type = EXPR_VARIABLE;
4334   lval->where = sym->declared_at;
4335   lval->ts = sym->ts;
4336   lval->symtree = gfc_find_symtree (sym->ns->sym_root, sym->name);
4337
4338   /* It will always be a full array.  */
4339   as = IS_CLASS_ARRAY (sym) ? CLASS_DATA (sym)->as : sym->as;
4340   lval->rank = as ? as->rank : 0;
4341   if (lval->rank)
4342     gfc_add_full_array_ref (lval, as);
4343   return lval;
4344 }
4345
4346
4347 /* Returns the array_spec of a full array expression.  A NULL is
4348    returned otherwise.  */
4349 gfc_array_spec *
4350 gfc_get_full_arrayspec_from_expr (gfc_expr *expr)
4351 {
4352   gfc_array_spec *as;
4353   gfc_ref *ref;
4354
4355   if (expr->rank == 0)
4356     return NULL;
4357
4358   /* Follow any component references.  */
4359   if (expr->expr_type == EXPR_VARIABLE
4360       || expr->expr_type == EXPR_CONSTANT)
4361     {
4362       as = expr->symtree->n.sym->as;
4363       for (ref = expr->ref; ref; ref = ref->next)
4364         {
4365           switch (ref->type)
4366             {
4367             case REF_COMPONENT:
4368               as = ref->u.c.component->as;
4369               continue;
4370
4371             case REF_SUBSTRING:
4372               continue;
4373
4374             case REF_ARRAY:
4375               {
4376                 switch (ref->u.ar.type)
4377                   {
4378                   case AR_ELEMENT:
4379                   case AR_SECTION:
4380                   case AR_UNKNOWN:
4381                     as = NULL;
4382                     continue;
4383
4384                   case AR_FULL:
4385                     break;
4386                   }
4387                 break;
4388               }
4389             }
4390         }
4391     }
4392   else
4393     as = NULL;
4394
4395   return as;
4396 }
4397
4398
4399 /* General expression traversal function.  */
4400
4401 bool
4402 gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
4403                    bool (*func)(gfc_expr *, gfc_symbol *, int*),
4404                    int f)
4405 {
4406   gfc_array_ref ar;
4407   gfc_ref *ref;
4408   gfc_actual_arglist *args;
4409   gfc_constructor *c;
4410   int i;
4411
4412   if (!expr)
4413     return false;
4414
4415   if ((*func) (expr, sym, &f))
4416     return true;
4417
4418   if (expr->ts.type == BT_CHARACTER
4419         && expr->ts.u.cl
4420         && expr->ts.u.cl->length
4421         && expr->ts.u.cl->length->expr_type != EXPR_CONSTANT
4422         && gfc_traverse_expr (expr->ts.u.cl->length, sym, func, f))
4423     return true;
4424
4425   switch (expr->expr_type)
4426     {
4427     case EXPR_PPC:
4428     case EXPR_COMPCALL:
4429     case EXPR_FUNCTION:
4430       for (args = expr->value.function.actual; args; args = args->next)
4431         {
4432           if (gfc_traverse_expr (args->expr, sym, func, f))
4433             return true;
4434         }
4435       break;
4436
4437     case EXPR_VARIABLE:
4438     case EXPR_CONSTANT:
4439     case EXPR_NULL:
4440     case EXPR_SUBSTRING:
4441       break;
4442
4443     case EXPR_STRUCTURE:
4444     case EXPR_ARRAY:
4445       for (c = gfc_constructor_first (expr->value.constructor);
4446            c; c = gfc_constructor_next (c))
4447         {
4448           if (gfc_traverse_expr (c->expr, sym, func, f))
4449             return true;
4450           if (c->iterator)
4451             {
4452               if (gfc_traverse_expr (c->iterator->var, sym, func, f))
4453                 return true;
4454               if (gfc_traverse_expr (c->iterator->start, sym, func, f))
4455                 return true;
4456               if (gfc_traverse_expr (c->iterator->end, sym, func, f))
4457                 return true;
4458               if (gfc_traverse_expr (c->iterator->step, sym, func, f))
4459                 return true;
4460             }
4461         }
4462       break;
4463
4464     case EXPR_OP:
4465       if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
4466         return true;
4467       if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
4468         return true;
4469       break;
4470
4471     default:
4472       gcc_unreachable ();
4473       break;
4474     }
4475
4476   ref = expr->ref;
4477   while (ref != NULL)
4478     {
4479       switch (ref->type)
4480         {
4481         case  REF_ARRAY:
4482           ar = ref->u.ar;
4483           for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
4484             {
4485               if (gfc_traverse_expr (ar.start[i], sym, func, f))
4486                 return true;
4487               if (gfc_traverse_expr (ar.end[i], sym, func, f))
4488                 return true;
4489               if (gfc_traverse_expr (ar.stride[i], sym, func, f))
4490                 return true;
4491             }
4492           break;
4493
4494         case REF_SUBSTRING:
4495           if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
4496             return true;
4497           if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
4498             return true;
4499           break;
4500
4501         case REF_COMPONENT:
4502           if (ref->u.c.component->ts.type == BT_CHARACTER
4503                 && ref->u.c.component->ts.u.cl
4504                 && ref->u.c.component->ts.u.cl->length
4505                 && ref->u.c.component->ts.u.cl->length->expr_type
4506                      != EXPR_CONSTANT
4507                 && gfc_traverse_expr (ref->u.c.component->ts.u.cl->length,
4508                                       sym, func, f))
4509             return true;
4510
4511           if (ref->u.c.component->as)
4512             for (i = 0; i < ref->u.c.component->as->rank
4513                             + ref->u.c.component->as->corank; i++)
4514               {
4515                 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
4516                                        sym, func, f))
4517                   return true;
4518                 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
4519                                        sym, func, f))
4520                   return true;
4521               }
4522           break;
4523
4524         default:
4525           gcc_unreachable ();
4526         }
4527       ref = ref->next;
4528     }
4529   return false;
4530 }
4531
4532 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
4533
4534 static bool
4535 expr_set_symbols_referenced (gfc_expr *expr,
4536                              gfc_symbol *sym ATTRIBUTE_UNUSED,
4537                              int *f ATTRIBUTE_UNUSED)
4538 {
4539   if (expr->expr_type != EXPR_VARIABLE)
4540     return false;
4541   gfc_set_sym_referenced (expr->symtree->n.sym);
4542   return false;
4543 }
4544
4545 void
4546 gfc_expr_set_symbols_referenced (gfc_expr *expr)
4547 {
4548   gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
4549 }
4550
4551
4552 /* Determine if an expression is a procedure pointer component and return
4553    the component in that case.  Otherwise return NULL.  */
4554
4555 gfc_component *
4556 gfc_get_proc_ptr_comp (gfc_expr *expr)
4557 {
4558   gfc_ref *ref;
4559
4560   if (!expr || !expr->ref)
4561     return NULL;
4562
4563   ref = expr->ref;
4564   while (ref->next)
4565     ref = ref->next;
4566
4567   if (ref->type == REF_COMPONENT
4568       && ref->u.c.component->attr.proc_pointer)
4569     return ref->u.c.component;
4570
4571   return NULL;
4572 }
4573
4574
4575 /* Determine if an expression is a procedure pointer component.  */
4576
4577 bool
4578 gfc_is_proc_ptr_comp (gfc_expr *expr)
4579 {
4580   return (gfc_get_proc_ptr_comp (expr) != NULL);
4581 }
4582
4583
4584 /* Determine if an expression is a function with an allocatable class scalar
4585    result.  */
4586 bool
4587 gfc_is_alloc_class_scalar_function (gfc_expr *expr)
4588 {
4589   if (expr->expr_type == EXPR_FUNCTION
4590       && expr->value.function.esym
4591       && expr->value.function.esym->result
4592       && expr->value.function.esym->result->ts.type == BT_CLASS
4593       && !CLASS_DATA (expr->value.function.esym->result)->attr.dimension
4594       && CLASS_DATA (expr->value.function.esym->result)->attr.allocatable)
4595     return true;
4596
4597   return false;
4598 }
4599
4600
4601 /* Determine if an expression is a function with an allocatable class array
4602    result.  */
4603 bool
4604 gfc_is_alloc_class_array_function (gfc_expr *expr)
4605 {
4606   if (expr->expr_type == EXPR_FUNCTION
4607       && expr->value.function.esym
4608       && expr->value.function.esym->result
4609       && expr->value.function.esym->result->ts.type == BT_CLASS
4610       && CLASS_DATA (expr->value.function.esym->result)->attr.dimension
4611       && CLASS_DATA (expr->value.function.esym->result)->attr.allocatable)
4612     return true;
4613
4614   return false;
4615 }
4616
4617
4618 /* Walk an expression tree and check each variable encountered for being typed.
4619    If strict is not set, a top-level variable is tolerated untyped in -std=gnu
4620    mode as is a basic arithmetic expression using those; this is for things in
4621    legacy-code like:
4622
4623      INTEGER :: arr(n), n
4624      INTEGER :: arr(n + 1), n
4625
4626    The namespace is needed for IMPLICIT typing.  */
4627
4628 static gfc_namespace* check_typed_ns;
4629
4630 static bool
4631 expr_check_typed_help (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
4632                        int* f ATTRIBUTE_UNUSED)
4633 {
4634   bool t;
4635
4636   if (e->expr_type != EXPR_VARIABLE)
4637     return false;
4638
4639   gcc_assert (e->symtree);
4640   t = gfc_check_symbol_typed (e->symtree->n.sym, check_typed_ns,
4641                               true, e->where);
4642
4643   return (!t);
4644 }
4645
4646 bool
4647 gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
4648 {
4649   bool error_found;
4650
4651   /* If this is a top-level variable or EXPR_OP, do the check with strict given
4652      to us.  */
4653   if (!strict)
4654     {
4655       if (e->expr_type == EXPR_VARIABLE && !e->ref)
4656         return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
4657
4658       if (e->expr_type == EXPR_OP)
4659         {
4660           bool t = true;
4661
4662           gcc_assert (e->value.op.op1);
4663           t = gfc_expr_check_typed (e->value.op.op1, ns, strict);
4664
4665           if (t && e->value.op.op2)
4666             t = gfc_expr_check_typed (e->value.op.op2, ns, strict);
4667
4668           return t;
4669         }
4670     }
4671
4672   /* Otherwise, walk the expression and do it strictly.  */
4673   check_typed_ns = ns;
4674   error_found = gfc_traverse_expr (e, NULL, &expr_check_typed_help, 0);
4675
4676   return error_found ? false : true;
4677 }
4678
4679
4680 bool
4681 gfc_ref_this_image (gfc_ref *ref)
4682 {
4683   int n;
4684
4685   gcc_assert (ref->type == REF_ARRAY && ref->u.ar.codimen > 0);
4686
4687   for (n = ref->u.ar.dimen; n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
4688     if (ref->u.ar.dimen_type[n] != DIMEN_THIS_IMAGE)
4689       return false;
4690
4691   return true;
4692 }
4693
4694 gfc_expr *
4695 gfc_find_stat_co(gfc_expr *e)
4696 {
4697   gfc_ref *ref;
4698
4699   for (ref = e->ref; ref; ref = ref->next)
4700     if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4701       return ref->u.ar.stat;
4702
4703   if (e->value.function.actual->expr)
4704     for (ref = e->value.function.actual->expr->ref; ref;
4705          ref = ref->next)
4706       if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4707         return ref->u.ar.stat;
4708
4709   return NULL;
4710 }
4711
4712 bool
4713 gfc_is_coindexed (gfc_expr *e)
4714 {
4715   gfc_ref *ref;
4716
4717   for (ref = e->ref; ref; ref = ref->next)
4718     if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4719       return !gfc_ref_this_image (ref);
4720
4721   return false;
4722 }
4723
4724
4725 /* Coarrays are variables with a corank but not being coindexed. However, also
4726    the following is a coarray: A subobject of a coarray is a coarray if it does
4727    not have any cosubscripts, vector subscripts, allocatable component
4728    selection, or pointer component selection. (F2008, 2.4.7)  */
4729
4730 bool
4731 gfc_is_coarray (gfc_expr *e)
4732 {
4733   gfc_ref *ref;
4734   gfc_symbol *sym;
4735   gfc_component *comp;
4736   bool coindexed;
4737   bool coarray;
4738   int i;
4739
4740   if (e->expr_type != EXPR_VARIABLE)
4741     return false;
4742
4743   coindexed = false;
4744   sym = e->symtree->n.sym;
4745
4746   if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
4747     coarray = CLASS_DATA (sym)->attr.codimension;
4748   else
4749     coarray = sym->attr.codimension;
4750
4751   for (ref = e->ref; ref; ref = ref->next)
4752     switch (ref->type)
4753     {
4754       case REF_COMPONENT:
4755         comp = ref->u.c.component;
4756         if (comp->ts.type == BT_CLASS && comp->attr.class_ok
4757             && (CLASS_DATA (comp)->attr.class_pointer
4758                 || CLASS_DATA (comp)->attr.allocatable))
4759           {
4760             coindexed = false;
4761             coarray = CLASS_DATA (comp)->attr.codimension;
4762           }
4763         else if (comp->attr.pointer || comp->attr.allocatable)
4764           {
4765             coindexed = false;
4766             coarray = comp->attr.codimension;
4767           }
4768         break;
4769
4770      case REF_ARRAY:
4771         if (!coarray)
4772           break;
4773
4774         if (ref->u.ar.codimen > 0 && !gfc_ref_this_image (ref))
4775           {
4776             coindexed = true;
4777             break;
4778           }
4779
4780         for (i = 0; i < ref->u.ar.dimen; i++)
4781           if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
4782             {
4783               coarray = false;
4784               break;
4785             }
4786         break;
4787
4788      case REF_SUBSTRING:
4789         break;
4790     }
4791
4792   return coarray && !coindexed;
4793 }
4794
4795
4796 int
4797 gfc_get_corank (gfc_expr *e)
4798 {
4799   int corank;
4800   gfc_ref *ref;
4801
4802   if (!gfc_is_coarray (e))
4803     return 0;
4804
4805   if (e->ts.type == BT_CLASS && e->ts.u.derived->components)
4806     corank = e->ts.u.derived->components->as
4807              ? e->ts.u.derived->components->as->corank : 0;
4808   else
4809     corank = e->symtree->n.sym->as ? e->symtree->n.sym->as->corank : 0;
4810
4811   for (ref = e->ref; ref; ref = ref->next)
4812     {
4813       if (ref->type == REF_ARRAY)
4814         corank = ref->u.ar.as->corank;
4815       gcc_assert (ref->type != REF_SUBSTRING);
4816     }
4817
4818   return corank;
4819 }
4820
4821
4822 /* Check whether the expression has an ultimate allocatable component.
4823    Being itself allocatable does not count.  */
4824 bool
4825 gfc_has_ultimate_allocatable (gfc_expr *e)
4826 {
4827   gfc_ref *ref, *last = NULL;
4828
4829   if (e->expr_type != EXPR_VARIABLE)
4830     return false;
4831
4832   for (ref = e->ref; ref; ref = ref->next)
4833     if (ref->type == REF_COMPONENT)
4834       last = ref;
4835
4836   if (last && last->u.c.component->ts.type == BT_CLASS)
4837     return CLASS_DATA (last->u.c.component)->attr.alloc_comp;
4838   else if (last && last->u.c.component->ts.type == BT_DERIVED)
4839     return last->u.c.component->ts.u.derived->attr.alloc_comp;
4840   else if (last)
4841     return false;
4842
4843   if (e->ts.type == BT_CLASS)
4844     return CLASS_DATA (e)->attr.alloc_comp;
4845   else if (e->ts.type == BT_DERIVED)
4846     return e->ts.u.derived->attr.alloc_comp;
4847   else
4848     return false;
4849 }
4850
4851
4852 /* Check whether the expression has an pointer component.
4853    Being itself a pointer does not count.  */
4854 bool
4855 gfc_has_ultimate_pointer (gfc_expr *e)
4856 {
4857   gfc_ref *ref, *last = NULL;
4858
4859   if (e->expr_type != EXPR_VARIABLE)
4860     return false;
4861
4862   for (ref = e->ref; ref; ref = ref->next)
4863     if (ref->type == REF_COMPONENT)
4864       last = ref;
4865
4866   if (last && last->u.c.component->ts.type == BT_CLASS)
4867     return CLASS_DATA (last->u.c.component)->attr.pointer_comp;
4868   else if (last && last->u.c.component->ts.type == BT_DERIVED)
4869     return last->u.c.component->ts.u.derived->attr.pointer_comp;
4870   else if (last)
4871     return false;
4872
4873   if (e->ts.type == BT_CLASS)
4874     return CLASS_DATA (e)->attr.pointer_comp;
4875   else if (e->ts.type == BT_DERIVED)
4876     return e->ts.u.derived->attr.pointer_comp;
4877   else
4878     return false;
4879 }
4880
4881
4882 /* Check whether an expression is "simply contiguous", cf. F2008, 6.5.4.
4883    Note: A scalar is not regarded as "simply contiguous" by the standard.
4884    if bool is not strict, some further checks are done - for instance,
4885    a "(::1)" is accepted.  */
4886
4887 bool
4888 gfc_is_simply_contiguous (gfc_expr *expr, bool strict, bool permit_element)
4889 {
4890   bool colon;
4891   int i;
4892   gfc_array_ref *ar = NULL;
4893   gfc_ref *ref, *part_ref = NULL;
4894   gfc_symbol *sym;
4895
4896   if (expr->expr_type == EXPR_FUNCTION)
4897     return expr->value.function.esym
4898            ? expr->value.function.esym->result->attr.contiguous : false;
4899   else if (expr->expr_type != EXPR_VARIABLE)
4900     return false;
4901
4902   if (!permit_element && expr->rank == 0)
4903     return false;
4904
4905   for (ref = expr->ref; ref; ref = ref->next)
4906     {
4907       if (ar)
4908         return false; /* Array shall be last part-ref.  */
4909
4910       if (ref->type == REF_COMPONENT)
4911         part_ref  = ref;
4912       else if (ref->type == REF_SUBSTRING)
4913         return false;
4914       else if (ref->u.ar.type != AR_ELEMENT)
4915         ar = &ref->u.ar;
4916     }
4917
4918   sym = expr->symtree->n.sym;
4919   if (expr->ts.type != BT_CLASS
4920         && ((part_ref
4921                 && !part_ref->u.c.component->attr.contiguous
4922                 && part_ref->u.c.component->attr.pointer)
4923             || (!part_ref
4924                 && !sym->attr.contiguous
4925                 && (sym->attr.pointer
4926                     || sym->as->type == AS_ASSUMED_RANK
4927                     || sym->as->type == AS_ASSUMED_SHAPE))))
4928     return false;
4929
4930   if (!ar || ar->type == AR_FULL)
4931     return true;
4932
4933   gcc_assert (ar->type == AR_SECTION);
4934
4935   /* Check for simply contiguous array */
4936   colon = true;
4937   for (i = 0; i < ar->dimen; i++)
4938     {
4939       if (ar->dimen_type[i] == DIMEN_VECTOR)
4940         return false;
4941
4942       if (ar->dimen_type[i] == DIMEN_ELEMENT)
4943         {
4944           colon = false;
4945           continue;
4946         }
4947
4948       gcc_assert (ar->dimen_type[i] == DIMEN_RANGE);
4949
4950
4951       /* If the previous section was not contiguous, that's an error,
4952          unless we have effective only one element and checking is not
4953          strict.  */
4954       if (!colon && (strict || !ar->start[i] || !ar->end[i]
4955                      || ar->start[i]->expr_type != EXPR_CONSTANT
4956                      || ar->end[i]->expr_type != EXPR_CONSTANT
4957                      || mpz_cmp (ar->start[i]->value.integer,
4958                                  ar->end[i]->value.integer) != 0))
4959         return false;
4960
4961       /* Following the standard, "(::1)" or - if known at compile time -
4962          "(lbound:ubound)" are not simply contiguous; if strict
4963          is false, they are regarded as simply contiguous.  */
4964       if (ar->stride[i] && (strict || ar->stride[i]->expr_type != EXPR_CONSTANT
4965                             || ar->stride[i]->ts.type != BT_INTEGER
4966                             || mpz_cmp_si (ar->stride[i]->value.integer, 1) != 0))
4967         return false;
4968
4969       if (ar->start[i]
4970           && (strict || ar->start[i]->expr_type != EXPR_CONSTANT
4971               || !ar->as->lower[i]
4972               || ar->as->lower[i]->expr_type != EXPR_CONSTANT
4973               || mpz_cmp (ar->start[i]->value.integer,
4974                           ar->as->lower[i]->value.integer) != 0))
4975         colon = false;
4976
4977       if (ar->end[i]
4978           && (strict || ar->end[i]->expr_type != EXPR_CONSTANT
4979               || !ar->as->upper[i]
4980               || ar->as->upper[i]->expr_type != EXPR_CONSTANT
4981               || mpz_cmp (ar->end[i]->value.integer,
4982                           ar->as->upper[i]->value.integer) != 0))
4983         colon = false;
4984     }
4985
4986   return true;
4987 }
4988
4989
4990 /* Build call to an intrinsic procedure.  The number of arguments has to be
4991    passed (rather than ending the list with a NULL value) because we may
4992    want to add arguments but with a NULL-expression.  */
4993
4994 gfc_expr*
4995 gfc_build_intrinsic_call (gfc_namespace *ns, gfc_isym_id id, const char* name,
4996                           locus where, unsigned numarg, ...)
4997 {
4998   gfc_expr* result;
4999   gfc_actual_arglist* atail;
5000   gfc_intrinsic_sym* isym;
5001   va_list ap;
5002   unsigned i;
5003   const char *mangled_name = gfc_get_string (GFC_PREFIX ("%s"), name);
5004
5005   isym = gfc_intrinsic_function_by_id (id);
5006   gcc_assert (isym);
5007
5008   result = gfc_get_expr ();
5009   result->expr_type = EXPR_FUNCTION;
5010   result->ts = isym->ts;
5011   result->where = where;
5012   result->value.function.name = mangled_name;
5013   result->value.function.isym = isym;
5014
5015   gfc_get_sym_tree (mangled_name, ns, &result->symtree, false);
5016   gfc_commit_symbol (result->symtree->n.sym);
5017   gcc_assert (result->symtree
5018               && (result->symtree->n.sym->attr.flavor == FL_PROCEDURE
5019                   || result->symtree->n.sym->attr.flavor == FL_UNKNOWN));
5020   result->symtree->n.sym->intmod_sym_id = id;
5021   result->symtree->n.sym->attr.flavor = FL_PROCEDURE;
5022   result->symtree->n.sym->attr.intrinsic = 1;
5023   result->symtree->n.sym->attr.artificial = 1;
5024
5025   va_start (ap, numarg);
5026   atail = NULL;
5027   for (i = 0; i < numarg; ++i)
5028     {
5029       if (atail)
5030         {
5031           atail->next = gfc_get_actual_arglist ();
5032           atail = atail->next;
5033         }
5034       else
5035         atail = result->value.function.actual = gfc_get_actual_arglist ();
5036
5037       atail->expr = va_arg (ap, gfc_expr*);
5038     }
5039   va_end (ap);
5040
5041   return result;
5042 }
5043
5044
5045 /* Check if an expression may appear in a variable definition context
5046    (F2008, 16.6.7) or pointer association context (F2008, 16.6.8).
5047    This is called from the various places when resolving
5048    the pieces that make up such a context.
5049    If own_scope is true (applies to, e.g., ac-implied-do/data-implied-do
5050    variables), some checks are not performed.
5051
5052    Optionally, a possible error message can be suppressed if context is NULL
5053    and just the return status (true / false) be requested.  */
5054
5055 bool
5056 gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj,
5057                           bool own_scope, const char* context)
5058 {
5059   gfc_symbol* sym = NULL;
5060   bool is_pointer;
5061   bool check_intentin;
5062   bool ptr_component;
5063   symbol_attribute attr;
5064   gfc_ref* ref;
5065   int i;
5066
5067   if (e->expr_type == EXPR_VARIABLE)
5068     {
5069       gcc_assert (e->symtree);
5070       sym = e->symtree->n.sym;
5071     }
5072   else if (e->expr_type == EXPR_FUNCTION)
5073     {
5074       gcc_assert (e->symtree);
5075       sym = e->value.function.esym ? e->value.function.esym : e->symtree->n.sym;
5076     }
5077
5078   attr = gfc_expr_attr (e);
5079   if (!pointer && e->expr_type == EXPR_FUNCTION && attr.pointer)
5080     {
5081       if (!(gfc_option.allow_std & GFC_STD_F2008))
5082         {
5083           if (context)
5084             gfc_error ("Fortran 2008: Pointer functions in variable definition"
5085                        " context (%s) at %L", context, &e->where);
5086           return false;
5087         }
5088     }
5089   else if (e->expr_type != EXPR_VARIABLE)
5090     {
5091       if (context)
5092         gfc_error ("Non-variable expression in variable definition context (%s)"
5093                    " at %L", context, &e->where);
5094       return false;
5095     }
5096
5097   if (!pointer && sym->attr.flavor == FL_PARAMETER)
5098     {
5099       if (context)
5100         gfc_error ("Named constant %qs in variable definition context (%s)"
5101                    " at %L", sym->name, context, &e->where);
5102       return false;
5103     }
5104   if (!pointer && sym->attr.flavor != FL_VARIABLE
5105       && !(sym->attr.flavor == FL_PROCEDURE && sym == sym->result)
5106       && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer))
5107     {
5108       if (context)
5109         gfc_error ("%qs in variable definition context (%s) at %L is not"
5110                    " a variable", sym->name, context, &e->where);
5111       return false;
5112     }
5113
5114   /* Find out whether the expr is a pointer; this also means following
5115      component references to the last one.  */
5116   is_pointer = (attr.pointer || attr.proc_pointer);
5117   if (pointer && !is_pointer)
5118     {
5119       if (context)
5120         gfc_error ("Non-POINTER in pointer association context (%s)"
5121                    " at %L", context, &e->where);
5122       return false;
5123     }
5124
5125   if (e->ts.type == BT_DERIVED
5126       && e->ts.u.derived == NULL)
5127     {
5128       if (context)
5129         gfc_error ("Type inaccessible in variable definition context (%s) "
5130                    "at %L", context, &e->where);
5131       return false;
5132     }
5133
5134   /* F2008, C1303.  */
5135   if (!alloc_obj
5136       && (attr.lock_comp
5137           || (e->ts.type == BT_DERIVED
5138               && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
5139               && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)))
5140     {
5141       if (context)
5142         gfc_error ("LOCK_TYPE in variable definition context (%s) at %L",
5143                    context, &e->where);
5144       return false;
5145     }
5146
5147   /* TS18508, C702/C203.  */
5148   if (!alloc_obj
5149       && (attr.lock_comp
5150           || (e->ts.type == BT_DERIVED
5151               && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
5152               && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)))
5153     {
5154       if (context)
5155         gfc_error ("LOCK_EVENT in variable definition context (%s) at %L",
5156                    context, &e->where);
5157       return false;
5158     }
5159
5160   /* INTENT(IN) dummy argument.  Check this, unless the object itself is the
5161      component of sub-component of a pointer; we need to distinguish
5162      assignment to a pointer component from pointer-assignment to a pointer
5163      component.  Note that (normal) assignment to procedure pointers is not
5164      possible.  */
5165   check_intentin = !own_scope;
5166   ptr_component = (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
5167                   ? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer;
5168   for (ref = e->ref; ref && check_intentin; ref = ref->next)
5169     {
5170       if (ptr_component && ref->type == REF_COMPONENT)
5171         check_intentin = false;
5172       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
5173         {
5174           ptr_component = true;
5175           if (!pointer)
5176             check_intentin = false;
5177         }
5178     }
5179   if (check_intentin && sym->attr.intent == INTENT_IN)
5180     {
5181       if (pointer && is_pointer)
5182         {
5183           if (context)
5184             gfc_error ("Dummy argument %qs with INTENT(IN) in pointer"
5185                        " association context (%s) at %L",
5186                        sym->name, context, &e->where);
5187           return false;
5188         }
5189       if (!pointer && !is_pointer && !sym->attr.pointer)
5190         {
5191           if (context)
5192             gfc_error ("Dummy argument %qs with INTENT(IN) in variable"
5193                        " definition context (%s) at %L",
5194                        sym->name, context, &e->where);
5195           return false;
5196         }
5197     }
5198
5199   /* PROTECTED and use-associated.  */
5200   if (sym->attr.is_protected && sym->attr.use_assoc && check_intentin)
5201     {
5202       if (pointer && is_pointer)
5203         {
5204           if (context)
5205             gfc_error ("Variable %qs is PROTECTED and can not appear in a"
5206                        " pointer association context (%s) at %L",
5207                        sym->name, context, &e->where);
5208           return false;
5209         }
5210       if (!pointer && !is_pointer)
5211         {
5212           if (context)
5213             gfc_error ("Variable %qs is PROTECTED and can not appear in a"
5214                        " variable definition context (%s) at %L",
5215                        sym->name, context, &e->where);
5216           return false;
5217         }
5218     }
5219
5220   /* Variable not assignable from a PURE procedure but appears in
5221      variable definition context.  */
5222   if (!pointer && !own_scope && gfc_pure (NULL) && gfc_impure_variable (sym))
5223     {
5224       if (context)
5225         gfc_error ("Variable %qs can not appear in a variable definition"
5226                    " context (%s) at %L in PURE procedure",
5227                    sym->name, context, &e->where);
5228       return false;
5229     }
5230
5231   if (!pointer && context && gfc_implicit_pure (NULL)
5232       && gfc_impure_variable (sym))
5233     {
5234       gfc_namespace *ns;
5235       gfc_symbol *sym;
5236
5237       for (ns = gfc_current_ns; ns; ns = ns->parent)
5238         {
5239           sym = ns->proc_name;
5240           if (sym == NULL)
5241             break;
5242           if (sym->attr.flavor == FL_PROCEDURE)
5243             {
5244               sym->attr.implicit_pure = 0;
5245               break;
5246             }
5247         }
5248     }
5249   /* Check variable definition context for associate-names.  */
5250   if (!pointer && sym->assoc)
5251     {
5252       const char* name;
5253       gfc_association_list* assoc;
5254
5255       gcc_assert (sym->assoc->target);
5256
5257       /* If this is a SELECT TYPE temporary (the association is used internally
5258          for SELECT TYPE), silently go over to the target.  */
5259       if (sym->attr.select_type_temporary)
5260         {
5261           gfc_expr* t = sym->assoc->target;
5262
5263           gcc_assert (t->expr_type == EXPR_VARIABLE);
5264           name = t->symtree->name;
5265
5266           if (t->symtree->n.sym->assoc)
5267             assoc = t->symtree->n.sym->assoc;
5268           else
5269             assoc = sym->assoc;
5270         }
5271       else
5272         {
5273           name = sym->name;
5274           assoc = sym->assoc;
5275         }
5276       gcc_assert (name && assoc);
5277
5278       /* Is association to a valid variable?  */
5279       if (!assoc->variable)
5280         {
5281           if (context)
5282             {
5283               if (assoc->target->expr_type == EXPR_VARIABLE)
5284                 gfc_error ("%qs at %L associated to vector-indexed target can"
5285                            " not be used in a variable definition context (%s)",
5286                            name, &e->where, context);
5287               else
5288                 gfc_error ("%qs at %L associated to expression can"
5289                            " not be used in a variable definition context (%s)",
5290                            name, &e->where, context);
5291             }
5292           return false;
5293         }
5294
5295       /* Target must be allowed to appear in a variable definition context.  */
5296       if (!gfc_check_vardef_context (assoc->target, pointer, false, false, NULL))
5297         {
5298           if (context)
5299             gfc_error ("Associate-name %qs can not appear in a variable"
5300                        " definition context (%s) at %L because its target"
5301                        " at %L can not, either",
5302                        name, context, &e->where,
5303                        &assoc->target->where);
5304           return false;
5305         }
5306     }
5307
5308   /* Check for same value in vector expression subscript.  */
5309
5310   if (e->rank > 0)
5311     for (ref = e->ref; ref != NULL; ref = ref->next)
5312       if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
5313         for (i = 0; i < GFC_MAX_DIMENSIONS
5314                && ref->u.ar.dimen_type[i] != 0; i++)
5315           if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
5316             {
5317               gfc_expr *arr = ref->u.ar.start[i];
5318               if (arr->expr_type == EXPR_ARRAY)
5319                 {
5320                   gfc_constructor *c, *n;
5321                   gfc_expr *ec, *en;
5322
5323                   for (c = gfc_constructor_first (arr->value.constructor);
5324                        c != NULL; c = gfc_constructor_next (c))
5325                     {
5326                       if (c == NULL || c->iterator != NULL)
5327                         continue;
5328
5329                       ec = c->expr;
5330
5331                       for (n = gfc_constructor_next (c); n != NULL;
5332                            n = gfc_constructor_next (n))
5333                         {
5334                           if (n->iterator != NULL)
5335                             continue;
5336
5337                           en = n->expr;
5338                           if (gfc_dep_compare_expr (ec, en) == 0)
5339                             {
5340                               if (context)
5341                                 gfc_error_now ("Elements with the same value "
5342                                                "at %L and %L in vector "
5343                                                "subscript in a variable "
5344                                                "definition context (%s)",
5345                                                &(ec->where), &(en->where),
5346                                                context);
5347                               return false;
5348                             }
5349                         }
5350                     }
5351                 }
5352             }
5353
5354   return true;
5355 }