OSDN Git Service

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