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