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