OSDN Git Service

2011-07-17 Tobias Burnus <burnus@net-b.de>
[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           s = gfc_get_wide_string (end - start + 2);
1843           memcpy (s, p->value.character.string + start,
1844                   (end - start) * sizeof (gfc_char_t));
1845           s[end - start + 1] = '\0';  /* TODO: C-style string.  */
1846           free (p->value.character.string);
1847           p->value.character.string = s;
1848           p->value.character.length = end - start;
1849           p->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1850           p->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
1851                                                  NULL,
1852                                                  p->value.character.length);
1853           gfc_free_ref_list (p->ref);
1854           p->ref = NULL;
1855           p->expr_type = EXPR_CONSTANT;
1856         }
1857       break;
1858
1859     case EXPR_OP:
1860       if (simplify_intrinsic_op (p, type) == FAILURE)
1861         return FAILURE;
1862       break;
1863
1864     case EXPR_VARIABLE:
1865       /* Only substitute array parameter variables if we are in an
1866          initialization expression, or we want a subsection.  */
1867       if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1868           && (gfc_init_expr_flag || p->ref
1869               || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1870         {
1871           if (simplify_parameter_variable (p, type) == FAILURE)
1872             return FAILURE;
1873           break;
1874         }
1875
1876       if (type == 1)
1877         {
1878           gfc_simplify_iterator_var (p);
1879         }
1880
1881       /* Simplify subcomponent references.  */
1882       if (simplify_ref_chain (p->ref, type) == FAILURE)
1883         return FAILURE;
1884
1885       break;
1886
1887     case EXPR_STRUCTURE:
1888     case EXPR_ARRAY:
1889       if (simplify_ref_chain (p->ref, type) == FAILURE)
1890         return FAILURE;
1891
1892       if (simplify_constructor (p->value.constructor, type) == FAILURE)
1893         return FAILURE;
1894
1895       if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1896           && p->ref->u.ar.type == AR_FULL)
1897           gfc_expand_constructor (p, false);
1898
1899       if (simplify_const_ref (p) == FAILURE)
1900         return FAILURE;
1901
1902       break;
1903
1904     case EXPR_COMPCALL:
1905     case EXPR_PPC:
1906       gcc_unreachable ();
1907       break;
1908     }
1909
1910   return SUCCESS;
1911 }
1912
1913
1914 /* Returns the type of an expression with the exception that iterator
1915    variables are automatically integers no matter what else they may
1916    be declared as.  */
1917
1918 static bt
1919 et0 (gfc_expr *e)
1920 {
1921   if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1922     return BT_INTEGER;
1923
1924   return e->ts.type;
1925 }
1926
1927
1928 /* Check an intrinsic arithmetic operation to see if it is consistent
1929    with some type of expression.  */
1930
1931 static gfc_try check_init_expr (gfc_expr *);
1932
1933
1934 /* Scalarize an expression for an elemental intrinsic call.  */
1935
1936 static gfc_try
1937 scalarize_intrinsic_call (gfc_expr *e)
1938 {
1939   gfc_actual_arglist *a, *b;
1940   gfc_constructor_base ctor;
1941   gfc_constructor *args[5];
1942   gfc_constructor *ci, *new_ctor;
1943   gfc_expr *expr, *old;
1944   int n, i, rank[5], array_arg;
1945   
1946   /* Find which, if any, arguments are arrays.  Assume that the old
1947      expression carries the type information and that the first arg
1948      that is an array expression carries all the shape information.*/
1949   n = array_arg = 0;
1950   a = e->value.function.actual;
1951   for (; a; a = a->next)
1952     {
1953       n++;
1954       if (a->expr->expr_type != EXPR_ARRAY)
1955         continue;
1956       array_arg = n;
1957       expr = gfc_copy_expr (a->expr);
1958       break;
1959     }
1960
1961   if (!array_arg)
1962     return FAILURE;
1963
1964   old = gfc_copy_expr (e);
1965
1966   gfc_constructor_free (expr->value.constructor);
1967   expr->value.constructor = NULL;
1968   expr->ts = old->ts;
1969   expr->where = old->where;
1970   expr->expr_type = EXPR_ARRAY;
1971
1972   /* Copy the array argument constructors into an array, with nulls
1973      for the scalars.  */
1974   n = 0;
1975   a = old->value.function.actual;
1976   for (; a; a = a->next)
1977     {
1978       /* Check that this is OK for an initialization expression.  */
1979       if (a->expr && check_init_expr (a->expr) == FAILURE)
1980         goto cleanup;
1981
1982       rank[n] = 0;
1983       if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
1984         {
1985           rank[n] = a->expr->rank;
1986           ctor = a->expr->symtree->n.sym->value->value.constructor;
1987           args[n] = gfc_constructor_first (ctor);
1988         }
1989       else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
1990         {
1991           if (a->expr->rank)
1992             rank[n] = a->expr->rank;
1993           else
1994             rank[n] = 1;
1995           ctor = gfc_constructor_copy (a->expr->value.constructor);
1996           args[n] = gfc_constructor_first (ctor);
1997         }
1998       else
1999         args[n] = NULL;
2000
2001       n++;
2002     }
2003
2004
2005   /* Using the array argument as the master, step through the array
2006      calling the function for each element and advancing the array
2007      constructors together.  */
2008   for (ci = args[array_arg - 1]; ci; ci = gfc_constructor_next (ci))
2009     {
2010       new_ctor = gfc_constructor_append_expr (&expr->value.constructor,
2011                                               gfc_copy_expr (old), NULL);
2012
2013       gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
2014       a = NULL;
2015       b = old->value.function.actual;
2016       for (i = 0; i < n; i++)
2017         {
2018           if (a == NULL)
2019             new_ctor->expr->value.function.actual
2020                         = a = gfc_get_actual_arglist ();
2021           else
2022             {
2023               a->next = gfc_get_actual_arglist ();
2024               a = a->next;
2025             }
2026
2027           if (args[i])
2028             a->expr = gfc_copy_expr (args[i]->expr);
2029           else
2030             a->expr = gfc_copy_expr (b->expr);
2031
2032           b = b->next;
2033         }
2034
2035       /* Simplify the function calls.  If the simplification fails, the
2036          error will be flagged up down-stream or the library will deal
2037          with it.  */
2038       gfc_simplify_expr (new_ctor->expr, 0);
2039
2040       for (i = 0; i < n; i++)
2041         if (args[i])
2042           args[i] = gfc_constructor_next (args[i]);
2043
2044       for (i = 1; i < n; i++)
2045         if (rank[i] && ((args[i] != NULL && args[array_arg - 1] == NULL)
2046                         || (args[i] == NULL && args[array_arg - 1] != NULL)))
2047           goto compliance;
2048     }
2049
2050   free_expr0 (e);
2051   *e = *expr;
2052   gfc_free_expr (old);
2053   return SUCCESS;
2054
2055 compliance:
2056   gfc_error_now ("elemental function arguments at %C are not compliant");
2057
2058 cleanup:
2059   gfc_free_expr (expr);
2060   gfc_free_expr (old);
2061   return FAILURE;
2062 }
2063
2064
2065 static gfc_try
2066 check_intrinsic_op (gfc_expr *e, gfc_try (*check_function) (gfc_expr *))
2067 {
2068   gfc_expr *op1 = e->value.op.op1;
2069   gfc_expr *op2 = e->value.op.op2;
2070
2071   if ((*check_function) (op1) == FAILURE)
2072     return FAILURE;
2073
2074   switch (e->value.op.op)
2075     {
2076     case INTRINSIC_UPLUS:
2077     case INTRINSIC_UMINUS:
2078       if (!numeric_type (et0 (op1)))
2079         goto not_numeric;
2080       break;
2081
2082     case INTRINSIC_EQ:
2083     case INTRINSIC_EQ_OS:
2084     case INTRINSIC_NE:
2085     case INTRINSIC_NE_OS:
2086     case INTRINSIC_GT:
2087     case INTRINSIC_GT_OS:
2088     case INTRINSIC_GE:
2089     case INTRINSIC_GE_OS:
2090     case INTRINSIC_LT:
2091     case INTRINSIC_LT_OS:
2092     case INTRINSIC_LE:
2093     case INTRINSIC_LE_OS:
2094       if ((*check_function) (op2) == FAILURE)
2095         return FAILURE;
2096       
2097       if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
2098           && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
2099         {
2100           gfc_error ("Numeric or CHARACTER operands are required in "
2101                      "expression at %L", &e->where);
2102          return FAILURE;
2103         }
2104       break;
2105
2106     case INTRINSIC_PLUS:
2107     case INTRINSIC_MINUS:
2108     case INTRINSIC_TIMES:
2109     case INTRINSIC_DIVIDE:
2110     case INTRINSIC_POWER:
2111       if ((*check_function) (op2) == FAILURE)
2112         return FAILURE;
2113
2114       if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
2115         goto not_numeric;
2116
2117       break;
2118
2119     case INTRINSIC_CONCAT:
2120       if ((*check_function) (op2) == FAILURE)
2121         return FAILURE;
2122
2123       if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
2124         {
2125           gfc_error ("Concatenation operator in expression at %L "
2126                      "must have two CHARACTER operands", &op1->where);
2127           return FAILURE;
2128         }
2129
2130       if (op1->ts.kind != op2->ts.kind)
2131         {
2132           gfc_error ("Concat operator at %L must concatenate strings of the "
2133                      "same kind", &e->where);
2134           return FAILURE;
2135         }
2136
2137       break;
2138
2139     case INTRINSIC_NOT:
2140       if (et0 (op1) != BT_LOGICAL)
2141         {
2142           gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
2143                      "operand", &op1->where);
2144           return FAILURE;
2145         }
2146
2147       break;
2148
2149     case INTRINSIC_AND:
2150     case INTRINSIC_OR:
2151     case INTRINSIC_EQV:
2152     case INTRINSIC_NEQV:
2153       if ((*check_function) (op2) == FAILURE)
2154         return FAILURE;
2155
2156       if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
2157         {
2158           gfc_error ("LOGICAL operands are required in expression at %L",
2159                      &e->where);
2160           return FAILURE;
2161         }
2162
2163       break;
2164
2165     case INTRINSIC_PARENTHESES:
2166       break;
2167
2168     default:
2169       gfc_error ("Only intrinsic operators can be used in expression at %L",
2170                  &e->where);
2171       return FAILURE;
2172     }
2173
2174   return SUCCESS;
2175
2176 not_numeric:
2177   gfc_error ("Numeric operands are required in expression at %L", &e->where);
2178
2179   return FAILURE;
2180 }
2181
2182 /* F2003, 7.1.7 (3): In init expression, allocatable components
2183    must not be data-initialized.  */
2184 static gfc_try
2185 check_alloc_comp_init (gfc_expr *e)
2186 {
2187   gfc_component *comp;
2188   gfc_constructor *ctor;
2189
2190   gcc_assert (e->expr_type == EXPR_STRUCTURE);
2191   gcc_assert (e->ts.type == BT_DERIVED);
2192
2193   for (comp = e->ts.u.derived->components,
2194        ctor = gfc_constructor_first (e->value.constructor);
2195        comp; comp = comp->next, ctor = gfc_constructor_next (ctor))
2196     {
2197       if (comp->attr.allocatable
2198           && ctor->expr->expr_type != EXPR_NULL)
2199         {
2200           gfc_error("Invalid initialization expression for ALLOCATABLE "
2201                     "component '%s' in structure constructor at %L",
2202                     comp->name, &ctor->expr->where);
2203           return FAILURE;
2204         }
2205     }
2206
2207   return SUCCESS;
2208 }
2209
2210 static match
2211 check_init_expr_arguments (gfc_expr *e)
2212 {
2213   gfc_actual_arglist *ap;
2214
2215   for (ap = e->value.function.actual; ap; ap = ap->next)
2216     if (check_init_expr (ap->expr) == FAILURE)
2217       return MATCH_ERROR;
2218
2219   return MATCH_YES;
2220 }
2221
2222 static gfc_try check_restricted (gfc_expr *);
2223
2224 /* F95, 7.1.6.1, Initialization expressions, (7)
2225    F2003, 7.1.7 Initialization expression, (8)  */
2226
2227 static match
2228 check_inquiry (gfc_expr *e, int not_restricted)
2229 {
2230   const char *name;
2231   const char *const *functions;
2232
2233   static const char *const inquiry_func_f95[] = {
2234     "lbound", "shape", "size", "ubound",
2235     "bit_size", "len", "kind",
2236     "digits", "epsilon", "huge", "maxexponent", "minexponent",
2237     "precision", "radix", "range", "tiny",
2238     NULL
2239   };
2240
2241   static const char *const inquiry_func_f2003[] = {
2242     "lbound", "shape", "size", "ubound",
2243     "bit_size", "len", "kind",
2244     "digits", "epsilon", "huge", "maxexponent", "minexponent",
2245     "precision", "radix", "range", "tiny",
2246     "new_line", NULL
2247   };
2248
2249   int i;
2250   gfc_actual_arglist *ap;
2251
2252   if (!e->value.function.isym
2253       || !e->value.function.isym->inquiry)
2254     return MATCH_NO;
2255
2256   /* An undeclared parameter will get us here (PR25018).  */
2257   if (e->symtree == NULL)
2258     return MATCH_NO;
2259
2260   name = e->symtree->n.sym->name;
2261
2262   functions = (gfc_option.warn_std & GFC_STD_F2003) 
2263                 ? inquiry_func_f2003 : inquiry_func_f95;
2264
2265   for (i = 0; functions[i]; i++)
2266     if (strcmp (functions[i], name) == 0)
2267       break;
2268
2269   if (functions[i] == NULL)
2270     return MATCH_ERROR;
2271
2272   /* At this point we have an inquiry function with a variable argument.  The
2273      type of the variable might be undefined, but we need it now, because the
2274      arguments of these functions are not allowed to be undefined.  */
2275
2276   for (ap = e->value.function.actual; ap; ap = ap->next)
2277     {
2278       if (!ap->expr)
2279         continue;
2280
2281       if (ap->expr->ts.type == BT_UNKNOWN)
2282         {
2283           if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
2284               && gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns)
2285               == FAILURE)
2286             return MATCH_NO;
2287
2288           ap->expr->ts = ap->expr->symtree->n.sym->ts;
2289         }
2290
2291         /* Assumed character length will not reduce to a constant expression
2292            with LEN, as required by the standard.  */
2293         if (i == 5 && not_restricted
2294             && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
2295             && (ap->expr->symtree->n.sym->ts.u.cl->length == NULL
2296                 || ap->expr->symtree->n.sym->ts.deferred))
2297           {
2298             gfc_error ("Assumed or deferred character length variable '%s' "
2299                         " in constant expression at %L",
2300                         ap->expr->symtree->n.sym->name,
2301                         &ap->expr->where);
2302               return MATCH_ERROR;
2303           }
2304         else if (not_restricted && check_init_expr (ap->expr) == FAILURE)
2305           return MATCH_ERROR;
2306
2307         if (not_restricted == 0
2308               && ap->expr->expr_type != EXPR_VARIABLE
2309               && check_restricted (ap->expr) == FAILURE)
2310           return MATCH_ERROR;
2311
2312         if (not_restricted == 0
2313             && ap->expr->expr_type == EXPR_VARIABLE
2314             && ap->expr->symtree->n.sym->attr.dummy
2315             && ap->expr->symtree->n.sym->attr.optional)
2316           return MATCH_NO;
2317     }
2318
2319   return MATCH_YES;
2320 }
2321
2322
2323 /* F95, 7.1.6.1, Initialization expressions, (5)
2324    F2003, 7.1.7 Initialization expression, (5)  */
2325
2326 static match
2327 check_transformational (gfc_expr *e)
2328 {
2329   static const char * const trans_func_f95[] = {
2330     "repeat", "reshape", "selected_int_kind",
2331     "selected_real_kind", "transfer", "trim", NULL
2332   };
2333
2334   static const char * const trans_func_f2003[] =  {
2335     "all", "any", "count", "dot_product", "matmul", "null", "pack",
2336     "product", "repeat", "reshape", "selected_char_kind", "selected_int_kind",
2337     "selected_real_kind", "spread", "sum", "transfer", "transpose",
2338     "trim", "unpack", NULL
2339   };
2340
2341   int i;
2342   const char *name;
2343   const char *const *functions;
2344
2345   if (!e->value.function.isym
2346       || !e->value.function.isym->transformational)
2347     return MATCH_NO;
2348
2349   name = e->symtree->n.sym->name;
2350
2351   functions = (gfc_option.allow_std & GFC_STD_F2003) 
2352                 ? trans_func_f2003 : trans_func_f95;
2353
2354   /* NULL() is dealt with below.  */
2355   if (strcmp ("null", name) == 0)
2356     return MATCH_NO;
2357
2358   for (i = 0; functions[i]; i++)
2359     if (strcmp (functions[i], name) == 0)
2360        break;
2361
2362   if (functions[i] == NULL)
2363     {
2364       gfc_error("transformational intrinsic '%s' at %L is not permitted "
2365                 "in an initialization expression", name, &e->where);
2366       return MATCH_ERROR;
2367     }
2368
2369   return check_init_expr_arguments (e);
2370 }
2371
2372
2373 /* F95, 7.1.6.1, Initialization expressions, (6)
2374    F2003, 7.1.7 Initialization expression, (6)  */
2375
2376 static match
2377 check_null (gfc_expr *e)
2378 {
2379   if (strcmp ("null", e->symtree->n.sym->name) != 0)
2380     return MATCH_NO;
2381
2382   return check_init_expr_arguments (e);
2383 }
2384
2385
2386 static match
2387 check_elemental (gfc_expr *e)
2388 {
2389   if (!e->value.function.isym
2390       || !e->value.function.isym->elemental)
2391     return MATCH_NO;
2392
2393   if (e->ts.type != BT_INTEGER
2394       && e->ts.type != BT_CHARACTER
2395       && gfc_notify_std (GFC_STD_F2003, "Extension: Evaluation of "
2396                         "nonstandard initialization expression at %L",
2397                         &e->where) == FAILURE)
2398     return MATCH_ERROR;
2399
2400   return check_init_expr_arguments (e);
2401 }
2402
2403
2404 static match
2405 check_conversion (gfc_expr *e)
2406 {
2407   if (!e->value.function.isym
2408       || !e->value.function.isym->conversion)
2409     return MATCH_NO;
2410
2411   return check_init_expr_arguments (e);
2412 }
2413
2414
2415 /* Verify that an expression is an initialization expression.  A side
2416    effect is that the expression tree is reduced to a single constant
2417    node if all goes well.  This would normally happen when the
2418    expression is constructed but function references are assumed to be
2419    intrinsics in the context of initialization expressions.  If
2420    FAILURE is returned an error message has been generated.  */
2421
2422 static gfc_try
2423 check_init_expr (gfc_expr *e)
2424 {
2425   match m;
2426   gfc_try t;
2427
2428   if (e == NULL)
2429     return SUCCESS;
2430
2431   switch (e->expr_type)
2432     {
2433     case EXPR_OP:
2434       t = check_intrinsic_op (e, check_init_expr);
2435       if (t == SUCCESS)
2436         t = gfc_simplify_expr (e, 0);
2437
2438       break;
2439
2440     case EXPR_FUNCTION:
2441       t = FAILURE;
2442
2443       {
2444         gfc_intrinsic_sym* isym;
2445         gfc_symbol* sym;
2446
2447         sym = e->symtree->n.sym;
2448         if (!gfc_is_intrinsic (sym, 0, e->where)
2449             || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES)
2450           {
2451             gfc_error ("Function '%s' in initialization expression at %L "
2452                        "must be an intrinsic function",
2453                        e->symtree->n.sym->name, &e->where);
2454             break;
2455           }
2456
2457         if ((m = check_conversion (e)) == MATCH_NO
2458             && (m = check_inquiry (e, 1)) == MATCH_NO
2459             && (m = check_null (e)) == MATCH_NO
2460             && (m = check_transformational (e)) == MATCH_NO
2461             && (m = check_elemental (e)) == MATCH_NO)
2462           {
2463             gfc_error ("Intrinsic function '%s' at %L is not permitted "
2464                        "in an initialization expression",
2465                        e->symtree->n.sym->name, &e->where);
2466             m = MATCH_ERROR;
2467           }
2468
2469         /* Try to scalarize an elemental intrinsic function that has an
2470            array argument.  */
2471         isym = gfc_find_function (e->symtree->n.sym->name);
2472         if (isym && isym->elemental
2473             && (t = scalarize_intrinsic_call (e)) == SUCCESS)
2474           break;
2475       }
2476
2477       if (m == MATCH_YES)
2478         t = gfc_simplify_expr (e, 0);
2479
2480       break;
2481
2482     case EXPR_VARIABLE:
2483       t = SUCCESS;
2484
2485       if (gfc_check_iter_variable (e) == SUCCESS)
2486         break;
2487
2488       if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2489         {
2490           /* A PARAMETER shall not be used to define itself, i.e.
2491                 REAL, PARAMETER :: x = transfer(0, x)
2492              is invalid.  */
2493           if (!e->symtree->n.sym->value)
2494             {
2495               gfc_error("PARAMETER '%s' is used at %L before its definition "
2496                         "is complete", e->symtree->n.sym->name, &e->where);
2497               t = FAILURE;
2498             }
2499           else
2500             t = simplify_parameter_variable (e, 0);
2501
2502           break;
2503         }
2504
2505       if (gfc_in_match_data ())
2506         break;
2507
2508       t = FAILURE;
2509
2510       if (e->symtree->n.sym->as)
2511         {
2512           switch (e->symtree->n.sym->as->type)
2513             {
2514               case AS_ASSUMED_SIZE:
2515                 gfc_error ("Assumed size array '%s' at %L is not permitted "
2516                            "in an initialization expression",
2517                            e->symtree->n.sym->name, &e->where);
2518                 break;
2519
2520               case AS_ASSUMED_SHAPE:
2521                 gfc_error ("Assumed shape array '%s' at %L is not permitted "
2522                            "in an initialization expression",
2523                            e->symtree->n.sym->name, &e->where);
2524                 break;
2525
2526               case AS_DEFERRED:
2527                 gfc_error ("Deferred array '%s' at %L is not permitted "
2528                            "in an initialization expression",
2529                            e->symtree->n.sym->name, &e->where);
2530                 break;
2531
2532               case AS_EXPLICIT:
2533                 gfc_error ("Array '%s' at %L is a variable, which does "
2534                            "not reduce to a constant expression",
2535                            e->symtree->n.sym->name, &e->where);
2536                 break;
2537
2538               default:
2539                 gcc_unreachable();
2540           }
2541         }
2542       else
2543         gfc_error ("Parameter '%s' at %L has not been declared or is "
2544                    "a variable, which does not reduce to a constant "
2545                    "expression", e->symtree->n.sym->name, &e->where);
2546
2547       break;
2548
2549     case EXPR_CONSTANT:
2550     case EXPR_NULL:
2551       t = SUCCESS;
2552       break;
2553
2554     case EXPR_SUBSTRING:
2555       t = check_init_expr (e->ref->u.ss.start);
2556       if (t == FAILURE)
2557         break;
2558
2559       t = check_init_expr (e->ref->u.ss.end);
2560       if (t == SUCCESS)
2561         t = gfc_simplify_expr (e, 0);
2562
2563       break;
2564
2565     case EXPR_STRUCTURE:
2566       t = e->ts.is_iso_c ? SUCCESS : FAILURE;
2567       if (t == SUCCESS)
2568         break;
2569
2570       t = check_alloc_comp_init (e);
2571       if (t == FAILURE)
2572         break;
2573
2574       t = gfc_check_constructor (e, check_init_expr);
2575       if (t == FAILURE)
2576         break;
2577
2578       break;
2579
2580     case EXPR_ARRAY:
2581       t = gfc_check_constructor (e, check_init_expr);
2582       if (t == FAILURE)
2583         break;
2584
2585       t = gfc_expand_constructor (e, true);
2586       if (t == FAILURE)
2587         break;
2588
2589       t = gfc_check_constructor_type (e);
2590       break;
2591
2592     default:
2593       gfc_internal_error ("check_init_expr(): Unknown expression type");
2594     }
2595
2596   return t;
2597 }
2598
2599 /* Reduces a general expression to an initialization expression (a constant).
2600    This used to be part of gfc_match_init_expr.
2601    Note that this function doesn't free the given expression on FAILURE.  */
2602
2603 gfc_try
2604 gfc_reduce_init_expr (gfc_expr *expr)
2605 {
2606   gfc_try t;
2607
2608   gfc_init_expr_flag = true;
2609   t = gfc_resolve_expr (expr);
2610   if (t == SUCCESS)
2611     t = check_init_expr (expr);
2612   gfc_init_expr_flag = false;
2613
2614   if (t == FAILURE)
2615     return FAILURE;
2616
2617   if (expr->expr_type == EXPR_ARRAY)
2618     {
2619       if (gfc_check_constructor_type (expr) == FAILURE)
2620         return FAILURE;
2621       if (gfc_expand_constructor (expr, true) == FAILURE)
2622         return FAILURE;
2623     }
2624
2625   return SUCCESS;
2626 }
2627
2628
2629 /* Match an initialization expression.  We work by first matching an
2630    expression, then reducing it to a constant.  */
2631
2632 match
2633 gfc_match_init_expr (gfc_expr **result)
2634 {
2635   gfc_expr *expr;
2636   match m;
2637   gfc_try t;
2638
2639   expr = NULL;
2640
2641   gfc_init_expr_flag = true;
2642
2643   m = gfc_match_expr (&expr);
2644   if (m != MATCH_YES)
2645     {
2646       gfc_init_expr_flag = false;
2647       return m;
2648     }
2649
2650   t = gfc_reduce_init_expr (expr);
2651   if (t != SUCCESS)
2652     {
2653       gfc_free_expr (expr);
2654       gfc_init_expr_flag = false;
2655       return MATCH_ERROR;
2656     }
2657
2658   *result = expr;
2659   gfc_init_expr_flag = false;
2660
2661   return MATCH_YES;
2662 }
2663
2664
2665 /* Given an actual argument list, test to see that each argument is a
2666    restricted expression and optionally if the expression type is
2667    integer or character.  */
2668
2669 static gfc_try
2670 restricted_args (gfc_actual_arglist *a)
2671 {
2672   for (; a; a = a->next)
2673     {
2674       if (check_restricted (a->expr) == FAILURE)
2675         return FAILURE;
2676     }
2677
2678   return SUCCESS;
2679 }
2680
2681
2682 /************* Restricted/specification expressions *************/
2683
2684
2685 /* Make sure a non-intrinsic function is a specification function.  */
2686
2687 static gfc_try
2688 external_spec_function (gfc_expr *e)
2689 {
2690   gfc_symbol *f;
2691
2692   f = e->value.function.esym;
2693
2694   if (f->attr.proc == PROC_ST_FUNCTION)
2695     {
2696       gfc_error ("Specification function '%s' at %L cannot be a statement "
2697                  "function", f->name, &e->where);
2698       return FAILURE;
2699     }
2700
2701   if (f->attr.proc == PROC_INTERNAL)
2702     {
2703       gfc_error ("Specification function '%s' at %L cannot be an internal "
2704                  "function", f->name, &e->where);
2705       return FAILURE;
2706     }
2707
2708   if (!f->attr.pure && !f->attr.elemental)
2709     {
2710       gfc_error ("Specification function '%s' at %L must be PURE", f->name,
2711                  &e->where);
2712       return FAILURE;
2713     }
2714
2715   if (f->attr.recursive)
2716     {
2717       gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
2718                  f->name, &e->where);
2719       return FAILURE;
2720     }
2721
2722   return restricted_args (e->value.function.actual);
2723 }
2724
2725
2726 /* Check to see that a function reference to an intrinsic is a
2727    restricted expression.  */
2728
2729 static gfc_try
2730 restricted_intrinsic (gfc_expr *e)
2731 {
2732   /* TODO: Check constraints on inquiry functions.  7.1.6.2 (7).  */
2733   if (check_inquiry (e, 0) == MATCH_YES)
2734     return SUCCESS;
2735
2736   return restricted_args (e->value.function.actual);
2737 }
2738
2739
2740 /* Check the expressions of an actual arglist.  Used by check_restricted.  */
2741
2742 static gfc_try
2743 check_arglist (gfc_actual_arglist* arg, gfc_try (*checker) (gfc_expr*))
2744 {
2745   for (; arg; arg = arg->next)
2746     if (checker (arg->expr) == FAILURE)
2747       return FAILURE;
2748
2749   return SUCCESS;
2750 }
2751
2752
2753 /* Check the subscription expressions of a reference chain with a checking
2754    function; used by check_restricted.  */
2755
2756 static gfc_try
2757 check_references (gfc_ref* ref, gfc_try (*checker) (gfc_expr*))
2758 {
2759   int dim;
2760
2761   if (!ref)
2762     return SUCCESS;
2763
2764   switch (ref->type)
2765     {
2766     case REF_ARRAY:
2767       for (dim = 0; dim != ref->u.ar.dimen; ++dim)
2768         {
2769           if (checker (ref->u.ar.start[dim]) == FAILURE)
2770             return FAILURE;
2771           if (checker (ref->u.ar.end[dim]) == FAILURE)
2772             return FAILURE;
2773           if (checker (ref->u.ar.stride[dim]) == FAILURE)
2774             return FAILURE;
2775         }
2776       break;
2777
2778     case REF_COMPONENT:
2779       /* Nothing needed, just proceed to next reference.  */
2780       break;
2781
2782     case REF_SUBSTRING:
2783       if (checker (ref->u.ss.start) == FAILURE)
2784         return FAILURE;
2785       if (checker (ref->u.ss.end) == FAILURE)
2786         return FAILURE;
2787       break;
2788
2789     default:
2790       gcc_unreachable ();
2791       break;
2792     }
2793
2794   return check_references (ref->next, checker);
2795 }
2796
2797
2798 /* Verify that an expression is a restricted expression.  Like its
2799    cousin check_init_expr(), an error message is generated if we
2800    return FAILURE.  */
2801
2802 static gfc_try
2803 check_restricted (gfc_expr *e)
2804 {
2805   gfc_symbol* sym;
2806   gfc_try t;
2807
2808   if (e == NULL)
2809     return SUCCESS;
2810
2811   switch (e->expr_type)
2812     {
2813     case EXPR_OP:
2814       t = check_intrinsic_op (e, check_restricted);
2815       if (t == SUCCESS)
2816         t = gfc_simplify_expr (e, 0);
2817
2818       break;
2819
2820     case EXPR_FUNCTION:
2821       if (e->value.function.esym)
2822         {
2823           t = check_arglist (e->value.function.actual, &check_restricted);
2824           if (t == SUCCESS)
2825             t = external_spec_function (e);
2826         }
2827       else
2828         {
2829           if (e->value.function.isym && e->value.function.isym->inquiry)
2830             t = SUCCESS;
2831           else
2832             t = check_arglist (e->value.function.actual, &check_restricted);
2833
2834           if (t == SUCCESS)
2835             t = restricted_intrinsic (e);
2836         }
2837       break;
2838
2839     case EXPR_VARIABLE:
2840       sym = e->symtree->n.sym;
2841       t = FAILURE;
2842
2843       /* If a dummy argument appears in a context that is valid for a
2844          restricted expression in an elemental procedure, it will have
2845          already been simplified away once we get here.  Therefore we
2846          don't need to jump through hoops to distinguish valid from
2847          invalid cases.  */
2848       if (sym->attr.dummy && sym->ns == gfc_current_ns
2849           && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
2850         {
2851           gfc_error ("Dummy argument '%s' not allowed in expression at %L",
2852                      sym->name, &e->where);
2853           break;
2854         }
2855
2856       if (sym->attr.optional)
2857         {
2858           gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2859                      sym->name, &e->where);
2860           break;
2861         }
2862
2863       if (sym->attr.intent == INTENT_OUT)
2864         {
2865           gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2866                      sym->name, &e->where);
2867           break;
2868         }
2869
2870       /* Check reference chain if any.  */
2871       if (check_references (e->ref, &check_restricted) == FAILURE)
2872         break;
2873
2874       /* gfc_is_formal_arg broadcasts that a formal argument list is being
2875          processed in resolve.c(resolve_formal_arglist).  This is done so
2876          that host associated dummy array indices are accepted (PR23446).
2877          This mechanism also does the same for the specification expressions
2878          of array-valued functions.  */
2879       if (e->error
2880             || sym->attr.in_common
2881             || sym->attr.use_assoc
2882             || sym->attr.dummy
2883             || sym->attr.implied_index
2884             || sym->attr.flavor == FL_PARAMETER
2885             || (sym->ns && sym->ns == gfc_current_ns->parent)
2886             || (sym->ns && gfc_current_ns->parent
2887                   && sym->ns == gfc_current_ns->parent->parent)
2888             || (sym->ns->proc_name != NULL
2889                   && sym->ns->proc_name->attr.flavor == FL_MODULE)
2890             || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2891         {
2892           t = SUCCESS;
2893           break;
2894         }
2895
2896       gfc_error ("Variable '%s' cannot appear in the expression at %L",
2897                  sym->name, &e->where);
2898       /* Prevent a repetition of the error.  */
2899       e->error = 1;
2900       break;
2901
2902     case EXPR_NULL:
2903     case EXPR_CONSTANT:
2904       t = SUCCESS;
2905       break;
2906
2907     case EXPR_SUBSTRING:
2908       t = gfc_specification_expr (e->ref->u.ss.start);
2909       if (t == FAILURE)
2910         break;
2911
2912       t = gfc_specification_expr (e->ref->u.ss.end);
2913       if (t == SUCCESS)
2914         t = gfc_simplify_expr (e, 0);
2915
2916       break;
2917
2918     case EXPR_STRUCTURE:
2919       t = gfc_check_constructor (e, check_restricted);
2920       break;
2921
2922     case EXPR_ARRAY:
2923       t = gfc_check_constructor (e, check_restricted);
2924       break;
2925
2926     default:
2927       gfc_internal_error ("check_restricted(): Unknown expression type");
2928     }
2929
2930   return t;
2931 }
2932
2933
2934 /* Check to see that an expression is a specification expression.  If
2935    we return FAILURE, an error has been generated.  */
2936
2937 gfc_try
2938 gfc_specification_expr (gfc_expr *e)
2939 {
2940   gfc_component *comp;
2941
2942   if (e == NULL)
2943     return SUCCESS;
2944
2945   if (e->ts.type != BT_INTEGER)
2946     {
2947       gfc_error ("Expression at %L must be of INTEGER type, found %s",
2948                  &e->where, gfc_basic_typename (e->ts.type));
2949       return FAILURE;
2950     }
2951
2952   if (e->expr_type == EXPR_FUNCTION
2953           && !e->value.function.isym
2954           && !e->value.function.esym
2955           && !gfc_pure (e->symtree->n.sym)
2956           && (!gfc_is_proc_ptr_comp (e, &comp)
2957               || !comp->attr.pure))
2958     {
2959       gfc_error ("Function '%s' at %L must be PURE",
2960                  e->symtree->n.sym->name, &e->where);
2961       /* Prevent repeat error messages.  */
2962       e->symtree->n.sym->attr.pure = 1;
2963       return FAILURE;
2964     }
2965
2966   if (e->rank != 0)
2967     {
2968       gfc_error ("Expression at %L must be scalar", &e->where);
2969       return FAILURE;
2970     }
2971
2972   if (gfc_simplify_expr (e, 0) == FAILURE)
2973     return FAILURE;
2974
2975   return check_restricted (e);
2976 }
2977
2978
2979 /************** Expression conformance checks.  *************/
2980
2981 /* Given two expressions, make sure that the arrays are conformable.  */
2982
2983 gfc_try
2984 gfc_check_conformance (gfc_expr *op1, gfc_expr *op2, const char *optype_msgid, ...)
2985 {
2986   int op1_flag, op2_flag, d;
2987   mpz_t op1_size, op2_size;
2988   gfc_try t;
2989
2990   va_list argp;
2991   char buffer[240];
2992
2993   if (op1->rank == 0 || op2->rank == 0)
2994     return SUCCESS;
2995
2996   va_start (argp, optype_msgid);
2997   vsnprintf (buffer, 240, optype_msgid, argp);
2998   va_end (argp);
2999
3000   if (op1->rank != op2->rank)
3001     {
3002       gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(buffer),
3003                  op1->rank, op2->rank, &op1->where);
3004       return FAILURE;
3005     }
3006
3007   t = SUCCESS;
3008
3009   for (d = 0; d < op1->rank; d++)
3010     {
3011       op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
3012       op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
3013
3014       if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
3015         {
3016           gfc_error ("Different shape for %s at %L on dimension %d "
3017                      "(%d and %d)", _(buffer), &op1->where, d + 1,
3018                      (int) mpz_get_si (op1_size),
3019                      (int) mpz_get_si (op2_size));
3020
3021           t = FAILURE;
3022         }
3023
3024       if (op1_flag)
3025         mpz_clear (op1_size);
3026       if (op2_flag)
3027         mpz_clear (op2_size);
3028
3029       if (t == FAILURE)
3030         return FAILURE;
3031     }
3032
3033   return SUCCESS;
3034 }
3035
3036
3037 /* Given an assignable expression and an arbitrary expression, make
3038    sure that the assignment can take place.  */
3039
3040 gfc_try
3041 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
3042 {
3043   gfc_symbol *sym;
3044   gfc_ref *ref;
3045   int has_pointer;
3046
3047   sym = lvalue->symtree->n.sym;
3048
3049   /* See if this is the component or subcomponent of a pointer.  */
3050   has_pointer = sym->attr.pointer;
3051   for (ref = lvalue->ref; ref; ref = ref->next)
3052     if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
3053       {
3054         has_pointer = 1;
3055         break;
3056       }
3057
3058   /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
3059      variable local to a function subprogram.  Its existence begins when
3060      execution of the function is initiated and ends when execution of the
3061      function is terminated...
3062      Therefore, the left hand side is no longer a variable, when it is:  */
3063   if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
3064       && !sym->attr.external)
3065     {
3066       bool bad_proc;
3067       bad_proc = false;
3068
3069       /* (i) Use associated;  */
3070       if (sym->attr.use_assoc)
3071         bad_proc = true;
3072
3073       /* (ii) The assignment is in the main program; or  */
3074       if (gfc_current_ns->proc_name->attr.is_main_program)
3075         bad_proc = true;
3076
3077       /* (iii) A module or internal procedure...  */
3078       if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
3079            || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
3080           && gfc_current_ns->parent
3081           && (!(gfc_current_ns->parent->proc_name->attr.function
3082                 || gfc_current_ns->parent->proc_name->attr.subroutine)
3083               || gfc_current_ns->parent->proc_name->attr.is_main_program))
3084         {
3085           /* ... that is not a function...  */ 
3086           if (!gfc_current_ns->proc_name->attr.function)
3087             bad_proc = true;
3088
3089           /* ... or is not an entry and has a different name.  */
3090           if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
3091             bad_proc = true;
3092         }
3093
3094       /* (iv) Host associated and not the function symbol or the
3095               parent result.  This picks up sibling references, which
3096               cannot be entries.  */
3097       if (!sym->attr.entry
3098             && sym->ns == gfc_current_ns->parent
3099             && sym != gfc_current_ns->proc_name
3100             && sym != gfc_current_ns->parent->proc_name->result)
3101         bad_proc = true;
3102
3103       if (bad_proc)
3104         {
3105           gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
3106           return FAILURE;
3107         }
3108     }
3109
3110   if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
3111     {
3112       gfc_error ("Incompatible ranks %d and %d in assignment at %L",
3113                  lvalue->rank, rvalue->rank, &lvalue->where);
3114       return FAILURE;
3115     }
3116
3117   if (lvalue->ts.type == BT_UNKNOWN)
3118     {
3119       gfc_error ("Variable type is UNKNOWN in assignment at %L",
3120                  &lvalue->where);
3121       return FAILURE;
3122     }
3123
3124   if (rvalue->expr_type == EXPR_NULL)
3125     {  
3126       if (has_pointer && (ref == NULL || ref->next == NULL)
3127           && lvalue->symtree->n.sym->attr.data)
3128         return SUCCESS;
3129       else
3130         {
3131           gfc_error ("NULL appears on right-hand side in assignment at %L",
3132                      &rvalue->where);
3133           return FAILURE;
3134         }
3135     }
3136
3137   /* This is possibly a typo: x = f() instead of x => f().  */
3138   if (gfc_option.warn_surprising 
3139       && rvalue->expr_type == EXPR_FUNCTION
3140       && rvalue->symtree->n.sym->attr.pointer)
3141     gfc_warning ("POINTER valued function appears on right-hand side of "
3142                  "assignment at %L", &rvalue->where);
3143
3144   /* Check size of array assignments.  */
3145   if (lvalue->rank != 0 && rvalue->rank != 0
3146       && gfc_check_conformance (lvalue, rvalue, "array assignment") != SUCCESS)
3147     return FAILURE;
3148
3149   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
3150       && lvalue->symtree->n.sym->attr.data
3151       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L used to "
3152                          "initialize non-integer variable '%s'",
3153                          &rvalue->where, lvalue->symtree->n.sym->name)
3154          == FAILURE)
3155     return FAILURE;
3156   else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
3157       && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L outside "
3158                          "a DATA statement and outside INT/REAL/DBLE/CMPLX",
3159                          &rvalue->where) == FAILURE)
3160     return FAILURE;
3161
3162   /* Handle the case of a BOZ literal on the RHS.  */
3163   if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
3164     {
3165       int rc;
3166       if (gfc_option.warn_surprising)
3167         gfc_warning ("BOZ literal at %L is bitwise transferred "
3168                      "non-integer symbol '%s'", &rvalue->where,
3169                      lvalue->symtree->n.sym->name);
3170       if (!gfc_convert_boz (rvalue, &lvalue->ts))
3171         return FAILURE;
3172       if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
3173         {
3174           if (rc == ARITH_UNDERFLOW)
3175             gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
3176                        ". This check can be disabled with the option "
3177                        "-fno-range-check", &rvalue->where);
3178           else if (rc == ARITH_OVERFLOW)
3179             gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
3180                        ". This check can be disabled with the option "
3181                        "-fno-range-check", &rvalue->where);
3182           else if (rc == ARITH_NAN)
3183             gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
3184                        ". This check can be disabled with the option "
3185                        "-fno-range-check", &rvalue->where);
3186           return FAILURE;
3187         }
3188     }
3189
3190   if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
3191     return SUCCESS;
3192
3193   /* Only DATA Statements come here.  */
3194   if (!conform)
3195     {
3196       /* Numeric can be converted to any other numeric. And Hollerith can be
3197          converted to any other type.  */
3198       if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
3199           || rvalue->ts.type == BT_HOLLERITH)
3200         return SUCCESS;
3201
3202       if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
3203         return SUCCESS;
3204
3205       gfc_error ("Incompatible types in DATA statement at %L; attempted "
3206                  "conversion of %s to %s", &lvalue->where,
3207                  gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3208
3209       return FAILURE;
3210     }
3211
3212   /* Assignment is the only case where character variables of different
3213      kind values can be converted into one another.  */
3214   if (lvalue->ts.type == BT_CHARACTER && rvalue->ts.type == BT_CHARACTER)
3215     {
3216       if (lvalue->ts.kind != rvalue->ts.kind)
3217         gfc_convert_chartype (rvalue, &lvalue->ts);
3218
3219       return SUCCESS;
3220     }
3221
3222   return gfc_convert_type (rvalue, &lvalue->ts, 1);
3223 }
3224
3225
3226 /* Check that a pointer assignment is OK.  We first check lvalue, and
3227    we only check rvalue if it's not an assignment to NULL() or a
3228    NULLIFY statement.  */
3229
3230 gfc_try
3231 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
3232 {
3233   symbol_attribute attr;
3234   gfc_ref *ref;
3235   bool is_pure, is_implicit_pure, rank_remap;
3236   int proc_pointer;
3237
3238   if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN
3239       && !lvalue->symtree->n.sym->attr.proc_pointer)
3240     {
3241       gfc_error ("Pointer assignment target is not a POINTER at %L",
3242                  &lvalue->where);
3243       return FAILURE;
3244     }
3245
3246   if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
3247       && lvalue->symtree->n.sym->attr.use_assoc
3248       && !lvalue->symtree->n.sym->attr.proc_pointer)
3249     {
3250       gfc_error ("'%s' in the pointer assignment at %L cannot be an "
3251                  "l-value since it is a procedure",
3252                  lvalue->symtree->n.sym->name, &lvalue->where);
3253       return FAILURE;
3254     }
3255
3256   proc_pointer = lvalue->symtree->n.sym->attr.proc_pointer;
3257
3258   rank_remap = false;
3259   for (ref = lvalue->ref; ref; ref = ref->next)
3260     {
3261       if (ref->type == REF_COMPONENT)
3262         proc_pointer = ref->u.c.component->attr.proc_pointer;
3263
3264       if (ref->type == REF_ARRAY && ref->next == NULL)
3265         {
3266           int dim;
3267
3268           if (ref->u.ar.type == AR_FULL)
3269             break;
3270
3271           if (ref->u.ar.type != AR_SECTION)
3272             {
3273               gfc_error ("Expected bounds specification for '%s' at %L",
3274                          lvalue->symtree->n.sym->name, &lvalue->where);
3275               return FAILURE;
3276             }
3277
3278           if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Bounds "
3279                               "specification for '%s' in pointer assignment "
3280                               "at %L", lvalue->symtree->n.sym->name,
3281                               &lvalue->where) == FAILURE)
3282             return FAILURE;
3283
3284           /* When bounds are given, all lbounds are necessary and either all
3285              or none of the upper bounds; no strides are allowed.  If the
3286              upper bounds are present, we may do rank remapping.  */
3287           for (dim = 0; dim < ref->u.ar.dimen; ++dim)
3288             {
3289               if (!ref->u.ar.start[dim]
3290                   || ref->u.ar.dimen_type[dim] != DIMEN_RANGE)
3291                 {
3292                   gfc_error ("Lower bound has to be present at %L",
3293                              &lvalue->where);
3294                   return FAILURE;
3295                 }
3296               if (ref->u.ar.stride[dim])
3297                 {
3298                   gfc_error ("Stride must not be present at %L",
3299                              &lvalue->where);
3300                   return FAILURE;
3301                 }
3302
3303               if (dim == 0)
3304                 rank_remap = (ref->u.ar.end[dim] != NULL);
3305               else
3306                 {
3307                   if ((rank_remap && !ref->u.ar.end[dim])
3308                       || (!rank_remap && ref->u.ar.end[dim]))
3309                     {
3310                       gfc_error ("Either all or none of the upper bounds"
3311                                  " must be specified at %L", &lvalue->where);
3312                       return FAILURE;
3313                     }
3314                 }
3315             }
3316         }
3317     }
3318
3319   is_pure = gfc_pure (NULL);
3320   is_implicit_pure = gfc_implicit_pure (NULL);
3321
3322   /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
3323      kind, etc for lvalue and rvalue must match, and rvalue must be a
3324      pure variable if we're in a pure function.  */
3325   if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
3326     return SUCCESS;
3327
3328   /* F2008, C723 (pointer) and C726 (proc-pointer); for PURE also C1283.  */
3329   if (lvalue->expr_type == EXPR_VARIABLE
3330       && gfc_is_coindexed (lvalue))
3331     {
3332       gfc_ref *ref;
3333       for (ref = lvalue->ref; ref; ref = ref->next)
3334         if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3335           {
3336             gfc_error ("Pointer object at %L shall not have a coindex",
3337                        &lvalue->where);
3338             return FAILURE;
3339           }
3340     }
3341
3342   /* Checks on rvalue for procedure pointer assignments.  */
3343   if (proc_pointer)
3344     {
3345       char err[200];
3346       gfc_symbol *s1,*s2;
3347       gfc_component *comp;
3348       const char *name;
3349
3350       attr = gfc_expr_attr (rvalue);
3351       if (!((rvalue->expr_type == EXPR_NULL)
3352             || (rvalue->expr_type == EXPR_FUNCTION && attr.proc_pointer)
3353             || (rvalue->expr_type == EXPR_VARIABLE && attr.proc_pointer)
3354             || (rvalue->expr_type == EXPR_VARIABLE
3355                 && attr.flavor == FL_PROCEDURE)))
3356         {
3357           gfc_error ("Invalid procedure pointer assignment at %L",
3358                      &rvalue->where);
3359           return FAILURE;
3360         }
3361       if (attr.abstract)
3362         {
3363           gfc_error ("Abstract interface '%s' is invalid "
3364                      "in procedure pointer assignment at %L",
3365                      rvalue->symtree->name, &rvalue->where);
3366           return FAILURE;
3367         }
3368       /* Check for C727.  */
3369       if (attr.flavor == FL_PROCEDURE)
3370         {
3371           if (attr.proc == PROC_ST_FUNCTION)
3372             {
3373               gfc_error ("Statement function '%s' is invalid "
3374                          "in procedure pointer assignment at %L",
3375                          rvalue->symtree->name, &rvalue->where);
3376               return FAILURE;
3377             }
3378           if (attr.proc == PROC_INTERNAL &&
3379               gfc_notify_std (GFC_STD_F2008, "Internal procedure '%s' is "
3380                               "invalid in procedure pointer assignment at %L",
3381                               rvalue->symtree->name, &rvalue->where) == FAILURE)
3382             return FAILURE;
3383         }
3384
3385       /* Ensure that the calling convention is the same. As other attributes
3386          such as DLLEXPORT may differ, one explicitly only tests for the
3387          calling conventions.  */
3388       if (rvalue->expr_type == EXPR_VARIABLE
3389           && lvalue->symtree->n.sym->attr.ext_attr
3390                != rvalue->symtree->n.sym->attr.ext_attr)
3391         {
3392           symbol_attribute calls;
3393
3394           calls.ext_attr = 0;
3395           gfc_add_ext_attribute (&calls, EXT_ATTR_CDECL, NULL);
3396           gfc_add_ext_attribute (&calls, EXT_ATTR_STDCALL, NULL);
3397           gfc_add_ext_attribute (&calls, EXT_ATTR_FASTCALL, NULL);
3398
3399           if ((calls.ext_attr & lvalue->symtree->n.sym->attr.ext_attr)
3400               != (calls.ext_attr & rvalue->symtree->n.sym->attr.ext_attr))
3401             {
3402               gfc_error ("Mismatch in the procedure pointer assignment "
3403                          "at %L: mismatch in the calling convention",
3404                          &rvalue->where);
3405           return FAILURE;
3406             }
3407         }
3408
3409       if (gfc_is_proc_ptr_comp (lvalue, &comp))
3410         s1 = comp->ts.interface;
3411       else
3412         s1 = lvalue->symtree->n.sym;
3413
3414       if (gfc_is_proc_ptr_comp (rvalue, &comp))
3415         {
3416           s2 = comp->ts.interface;
3417           name = comp->name;
3418         }
3419       else if (rvalue->expr_type == EXPR_FUNCTION)
3420         {
3421           s2 = rvalue->symtree->n.sym->result;
3422           name = rvalue->symtree->n.sym->result->name;
3423         }
3424       else
3425         {
3426           s2 = rvalue->symtree->n.sym;
3427           name = rvalue->symtree->n.sym->name;
3428         }
3429
3430       if (s1 && s2 && !gfc_compare_interfaces (s1, s2, name, 0, 1,
3431                                                err, sizeof(err)))
3432         {
3433           gfc_error ("Interface mismatch in procedure pointer assignment "
3434                      "at %L: %s", &rvalue->where, err);
3435           return FAILURE;
3436         }
3437
3438       return SUCCESS;
3439     }
3440
3441   if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
3442     {
3443       gfc_error ("Different types in pointer assignment at %L; attempted "
3444                  "assignment of %s to %s", &lvalue->where, 
3445                  gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3446       return FAILURE;
3447     }
3448
3449   if (lvalue->ts.type != BT_CLASS && lvalue->ts.kind != rvalue->ts.kind)
3450     {
3451       gfc_error ("Different kind type parameters in pointer "
3452                  "assignment at %L", &lvalue->where);
3453       return FAILURE;
3454     }
3455
3456   if (lvalue->rank != rvalue->rank && !rank_remap)
3457     {
3458       gfc_error ("Different ranks in pointer assignment at %L", &lvalue->where);
3459       return FAILURE;
3460     }
3461
3462   if (lvalue->ts.type == BT_CLASS && rvalue->ts.type == BT_DERIVED)
3463     /* Make sure the vtab is present.  */
3464     gfc_find_derived_vtab (rvalue->ts.u.derived);
3465
3466   /* Check rank remapping.  */
3467   if (rank_remap)
3468     {
3469       mpz_t lsize, rsize;
3470
3471       /* If this can be determined, check that the target must be at least as
3472          large as the pointer assigned to it is.  */
3473       if (gfc_array_size (lvalue, &lsize) == SUCCESS
3474           && gfc_array_size (rvalue, &rsize) == SUCCESS
3475           && mpz_cmp (rsize, lsize) < 0)
3476         {
3477           gfc_error ("Rank remapping target is smaller than size of the"
3478                      " pointer (%ld < %ld) at %L",
3479                      mpz_get_si (rsize), mpz_get_si (lsize),
3480                      &lvalue->where);
3481           return FAILURE;
3482         }
3483
3484       /* The target must be either rank one or it must be simply contiguous
3485          and F2008 must be allowed.  */
3486       if (rvalue->rank != 1)
3487         {
3488           if (!gfc_is_simply_contiguous (rvalue, true))
3489             {
3490               gfc_error ("Rank remapping target must be rank 1 or"
3491                          " simply contiguous at %L", &rvalue->where);
3492               return FAILURE;
3493             }
3494           if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: Rank remapping"
3495                               " target is not rank 1 at %L", &rvalue->where)
3496                 == FAILURE)
3497             return FAILURE;
3498         }
3499     }
3500
3501   /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
3502   if (rvalue->expr_type == EXPR_NULL)
3503     return SUCCESS;
3504
3505   if (lvalue->ts.type == BT_CHARACTER)
3506     {
3507       gfc_try t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment");
3508       if (t == FAILURE)
3509         return FAILURE;
3510     }
3511
3512   if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
3513     lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
3514
3515   attr = gfc_expr_attr (rvalue);
3516
3517   if (rvalue->expr_type == EXPR_FUNCTION && !attr.pointer)
3518     {
3519       gfc_error ("Target expression in pointer assignment "
3520                  "at %L must deliver a pointer result",
3521                  &rvalue->where);
3522       return FAILURE;
3523     }
3524
3525   if (!attr.target && !attr.pointer)
3526     {
3527       gfc_error ("Pointer assignment target is neither TARGET "
3528                  "nor POINTER at %L", &rvalue->where);
3529       return FAILURE;
3530     }
3531
3532   if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3533     {
3534       gfc_error ("Bad target in pointer assignment in PURE "
3535                  "procedure at %L", &rvalue->where);
3536     }
3537
3538   if (is_implicit_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3539     gfc_current_ns->proc_name->attr.implicit_pure = 0;
3540     
3541
3542   if (gfc_has_vector_index (rvalue))
3543     {
3544       gfc_error ("Pointer assignment with vector subscript "
3545                  "on rhs at %L", &rvalue->where);
3546       return FAILURE;
3547     }
3548
3549   if (attr.is_protected && attr.use_assoc
3550       && !(attr.pointer || attr.proc_pointer))
3551     {
3552       gfc_error ("Pointer assignment target has PROTECTED "
3553                  "attribute at %L", &rvalue->where);
3554       return FAILURE;
3555     }
3556
3557   /* F2008, C725. For PURE also C1283.  */
3558   if (rvalue->expr_type == EXPR_VARIABLE
3559       && gfc_is_coindexed (rvalue))
3560     {
3561       gfc_ref *ref;
3562       for (ref = rvalue->ref; ref; ref = ref->next)
3563         if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3564           {
3565             gfc_error ("Data target at %L shall not have a coindex",
3566                        &rvalue->where);
3567             return FAILURE;
3568           }
3569     }
3570
3571   return SUCCESS;
3572 }
3573
3574
3575 /* Relative of gfc_check_assign() except that the lvalue is a single
3576    symbol.  Used for initialization assignments.  */
3577
3578 gfc_try
3579 gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
3580 {
3581   gfc_expr lvalue;
3582   gfc_try r;
3583
3584   memset (&lvalue, '\0', sizeof (gfc_expr));
3585
3586   lvalue.expr_type = EXPR_VARIABLE;
3587   lvalue.ts = sym->ts;
3588   if (sym->as)
3589     lvalue.rank = sym->as->rank;
3590   lvalue.symtree = XCNEW (gfc_symtree);
3591   lvalue.symtree->n.sym = sym;
3592   lvalue.where = sym->declared_at;
3593
3594   if (sym->attr.pointer || sym->attr.proc_pointer
3595       || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->attr.class_pointer
3596           && rvalue->expr_type == EXPR_NULL))
3597     r = gfc_check_pointer_assign (&lvalue, rvalue);
3598   else
3599     r = gfc_check_assign (&lvalue, rvalue, 1);
3600
3601   free (lvalue.symtree);
3602
3603   if (r == FAILURE)
3604     return r;
3605   
3606   if (sym->attr.pointer && rvalue->expr_type != EXPR_NULL)
3607     {
3608       /* F08:C461. Additional checks for pointer initialization.  */
3609       symbol_attribute attr;
3610       attr = gfc_expr_attr (rvalue);
3611       if (attr.allocatable)
3612         {
3613           gfc_error ("Pointer initialization target at %C "
3614                      "must not be ALLOCATABLE ");
3615           return FAILURE;
3616         }
3617       if (!attr.target || attr.pointer)
3618         {
3619           gfc_error ("Pointer initialization target at %C "
3620                      "must have the TARGET attribute");
3621           return FAILURE;
3622         }
3623       if (!attr.save)
3624         {
3625           gfc_error ("Pointer initialization target at %C "
3626                      "must have the SAVE attribute");
3627           return FAILURE;
3628         }
3629     }
3630     
3631   if (sym->attr.proc_pointer && rvalue->expr_type != EXPR_NULL)
3632     {
3633       /* F08:C1220. Additional checks for procedure pointer initialization.  */
3634       symbol_attribute attr = gfc_expr_attr (rvalue);
3635       if (attr.proc_pointer)
3636         {
3637           gfc_error ("Procedure pointer initialization target at %L "
3638                      "may not be a procedure pointer", &rvalue->where);
3639           return FAILURE;
3640         }
3641     }
3642
3643   return SUCCESS;
3644 }
3645
3646
3647 /* Check for default initializer; sym->value is not enough
3648    as it is also set for EXPR_NULL of allocatables.  */
3649
3650 bool
3651 gfc_has_default_initializer (gfc_symbol *der)
3652 {
3653   gfc_component *c;
3654
3655   gcc_assert (der->attr.flavor == FL_DERIVED);
3656   for (c = der->components; c; c = c->next)
3657     if (c->ts.type == BT_DERIVED)
3658       {
3659         if (!c->attr.pointer
3660              && gfc_has_default_initializer (c->ts.u.derived))
3661           return true;
3662       }
3663     else
3664       {
3665         if (c->initializer)
3666           return true;
3667       }
3668
3669   return false;
3670 }
3671
3672 /* Get an expression for a default initializer.  */
3673
3674 gfc_expr *
3675 gfc_default_initializer (gfc_typespec *ts)
3676 {
3677   gfc_expr *init;
3678   gfc_component *comp;
3679
3680   /* See if we have a default initializer in this, but not in nested
3681      types (otherwise we could use gfc_has_default_initializer()).  */
3682   for (comp = ts->u.derived->components; comp; comp = comp->next)
3683     if (comp->initializer || comp->attr.allocatable
3684         || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable))
3685       break;
3686
3687   if (!comp)
3688     return NULL;
3689
3690   init = gfc_get_structure_constructor_expr (ts->type, ts->kind,
3691                                              &ts->u.derived->declared_at);
3692   init->ts = *ts;
3693
3694   for (comp = ts->u.derived->components; comp; comp = comp->next)
3695     {
3696       gfc_constructor *ctor = gfc_constructor_get();
3697
3698       if (comp->initializer)
3699         ctor->expr = gfc_copy_expr (comp->initializer);
3700
3701       if (comp->attr.allocatable
3702           || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable))
3703         {
3704           ctor->expr = gfc_get_expr ();
3705           ctor->expr->expr_type = EXPR_NULL;
3706           ctor->expr->ts = comp->ts;
3707         }
3708
3709       gfc_constructor_append (&init->value.constructor, ctor);
3710     }
3711
3712   return init;
3713 }
3714
3715
3716 /* Given a symbol, create an expression node with that symbol as a
3717    variable. If the symbol is array valued, setup a reference of the
3718    whole array.  */
3719
3720 gfc_expr *
3721 gfc_get_variable_expr (gfc_symtree *var)
3722 {
3723   gfc_expr *e;
3724
3725   e = gfc_get_expr ();
3726   e->expr_type = EXPR_VARIABLE;
3727   e->symtree = var;
3728   e->ts = var->n.sym->ts;
3729
3730   if (var->n.sym->as != NULL)
3731     {
3732       e->rank = var->n.sym->as->rank;
3733       e->ref = gfc_get_ref ();
3734       e->ref->type = REF_ARRAY;
3735       e->ref->u.ar.type = AR_FULL;
3736     }
3737
3738   return e;
3739 }
3740
3741
3742 gfc_expr *
3743 gfc_lval_expr_from_sym (gfc_symbol *sym)
3744 {
3745   gfc_expr *lval;
3746   lval = gfc_get_expr ();
3747   lval->expr_type = EXPR_VARIABLE;
3748   lval->where = sym->declared_at;
3749   lval->ts = sym->ts;
3750   lval->symtree = gfc_find_symtree (sym->ns->sym_root, sym->name);
3751
3752   /* It will always be a full array.  */
3753   lval->rank = sym->as ? sym->as->rank : 0;
3754   if (lval->rank)
3755     {
3756       lval->ref = gfc_get_ref ();
3757       lval->ref->type = REF_ARRAY;
3758       lval->ref->u.ar.type = AR_FULL;
3759       lval->ref->u.ar.dimen = lval->rank;
3760       lval->ref->u.ar.where = sym->declared_at;
3761       lval->ref->u.ar.as = sym->as;
3762     }
3763
3764   return lval;
3765 }
3766
3767
3768 /* Returns the array_spec of a full array expression.  A NULL is
3769    returned otherwise.  */
3770 gfc_array_spec *
3771 gfc_get_full_arrayspec_from_expr (gfc_expr *expr)
3772 {
3773   gfc_array_spec *as;
3774   gfc_ref *ref;
3775
3776   if (expr->rank == 0)
3777     return NULL;
3778
3779   /* Follow any component references.  */
3780   if (expr->expr_type == EXPR_VARIABLE
3781       || expr->expr_type == EXPR_CONSTANT)
3782     {
3783       as = expr->symtree->n.sym->as;
3784       for (ref = expr->ref; ref; ref = ref->next)
3785         {
3786           switch (ref->type)
3787             {
3788             case REF_COMPONENT:
3789               as = ref->u.c.component->as;
3790               continue;
3791
3792             case REF_SUBSTRING:
3793               continue;
3794
3795             case REF_ARRAY:
3796               {
3797                 switch (ref->u.ar.type)
3798                   {
3799                   case AR_ELEMENT:
3800                   case AR_SECTION:
3801                   case AR_UNKNOWN:
3802                     as = NULL;
3803                     continue;
3804
3805                   case AR_FULL:
3806                     break;
3807                   }
3808                 break;
3809               }
3810             }
3811         }
3812     }
3813   else
3814     as = NULL;
3815
3816   return as;
3817 }
3818
3819
3820 /* General expression traversal function.  */
3821
3822 bool
3823 gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
3824                    bool (*func)(gfc_expr *, gfc_symbol *, int*),
3825                    int f)
3826 {
3827   gfc_array_ref ar;
3828   gfc_ref *ref;
3829   gfc_actual_arglist *args;
3830   gfc_constructor *c;
3831   int i;
3832
3833   if (!expr)
3834     return false;
3835
3836   if ((*func) (expr, sym, &f))
3837     return true;
3838
3839   if (expr->ts.type == BT_CHARACTER
3840         && expr->ts.u.cl
3841         && expr->ts.u.cl->length
3842         && expr->ts.u.cl->length->expr_type != EXPR_CONSTANT
3843         && gfc_traverse_expr (expr->ts.u.cl->length, sym, func, f))
3844     return true;
3845
3846   switch (expr->expr_type)
3847     {
3848     case EXPR_PPC:
3849     case EXPR_COMPCALL:
3850     case EXPR_FUNCTION:
3851       for (args = expr->value.function.actual; args; args = args->next)
3852         {
3853           if (gfc_traverse_expr (args->expr, sym, func, f))
3854             return true;
3855         }
3856       break;
3857
3858     case EXPR_VARIABLE:
3859     case EXPR_CONSTANT:
3860     case EXPR_NULL:
3861     case EXPR_SUBSTRING:
3862       break;
3863
3864     case EXPR_STRUCTURE:
3865     case EXPR_ARRAY:
3866       for (c = gfc_constructor_first (expr->value.constructor);
3867            c; c = gfc_constructor_next (c))
3868         {
3869           if (gfc_traverse_expr (c->expr, sym, func, f))
3870             return true;
3871           if (c->iterator)
3872             {
3873               if (gfc_traverse_expr (c->iterator->var, sym, func, f))
3874                 return true;
3875               if (gfc_traverse_expr (c->iterator->start, sym, func, f))
3876                 return true;
3877               if (gfc_traverse_expr (c->iterator->end, sym, func, f))
3878                 return true;
3879               if (gfc_traverse_expr (c->iterator->step, sym, func, f))
3880                 return true;
3881             }
3882         }
3883       break;
3884
3885     case EXPR_OP:
3886       if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
3887         return true;
3888       if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
3889         return true;
3890       break;
3891
3892     default:
3893       gcc_unreachable ();
3894       break;
3895     }
3896
3897   ref = expr->ref;
3898   while (ref != NULL)
3899     {
3900       switch (ref->type)
3901         {
3902         case  REF_ARRAY:
3903           ar = ref->u.ar;
3904           for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
3905             {
3906               if (gfc_traverse_expr (ar.start[i], sym, func, f))
3907                 return true;
3908               if (gfc_traverse_expr (ar.end[i], sym, func, f))
3909                 return true;
3910               if (gfc_traverse_expr (ar.stride[i], sym, func, f))
3911                 return true;
3912             }
3913           break;
3914
3915         case REF_SUBSTRING:
3916           if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
3917             return true;
3918           if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
3919             return true;
3920           break;
3921
3922         case REF_COMPONENT:
3923           if (ref->u.c.component->ts.type == BT_CHARACTER
3924                 && ref->u.c.component->ts.u.cl
3925                 && ref->u.c.component->ts.u.cl->length
3926                 && ref->u.c.component->ts.u.cl->length->expr_type
3927                      != EXPR_CONSTANT
3928                 && gfc_traverse_expr (ref->u.c.component->ts.u.cl->length,
3929                                       sym, func, f))
3930             return true;
3931
3932           if (ref->u.c.component->as)
3933             for (i = 0; i < ref->u.c.component->as->rank
3934                             + ref->u.c.component->as->corank; i++)
3935               {
3936                 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
3937                                        sym, func, f))
3938                   return true;
3939                 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
3940                                        sym, func, f))
3941                   return true;
3942               }
3943           break;
3944
3945         default:
3946           gcc_unreachable ();
3947         }
3948       ref = ref->next;
3949     }
3950   return false;
3951 }
3952
3953 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
3954
3955 static bool
3956 expr_set_symbols_referenced (gfc_expr *expr,
3957                              gfc_symbol *sym ATTRIBUTE_UNUSED,
3958                              int *f ATTRIBUTE_UNUSED)
3959 {
3960   if (expr->expr_type != EXPR_VARIABLE)
3961     return false;
3962   gfc_set_sym_referenced (expr->symtree->n.sym);
3963   return false;
3964 }
3965
3966 void
3967 gfc_expr_set_symbols_referenced (gfc_expr *expr)
3968 {
3969   gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
3970 }
3971
3972
3973 /* Determine if an expression is a procedure pointer component. If yes, the
3974    argument 'comp' will point to the component (provided that 'comp' was
3975    provided).  */
3976
3977 bool
3978 gfc_is_proc_ptr_comp (gfc_expr *expr, gfc_component **comp)
3979 {
3980   gfc_ref *ref;
3981   bool ppc = false;
3982
3983   if (!expr || !expr->ref)
3984     return false;
3985
3986   ref = expr->ref;
3987   while (ref->next)
3988     ref = ref->next;
3989
3990   if (ref->type == REF_COMPONENT)
3991     {
3992       ppc = ref->u.c.component->attr.proc_pointer;
3993       if (ppc && comp)
3994         *comp = ref->u.c.component;
3995     }
3996
3997   return ppc;
3998 }
3999
4000
4001 /* Walk an expression tree and check each variable encountered for being typed.
4002    If strict is not set, a top-level variable is tolerated untyped in -std=gnu
4003    mode as is a basic arithmetic expression using those; this is for things in
4004    legacy-code like:
4005
4006      INTEGER :: arr(n), n
4007      INTEGER :: arr(n + 1), n
4008
4009    The namespace is needed for IMPLICIT typing.  */
4010
4011 static gfc_namespace* check_typed_ns;
4012
4013 static bool
4014 expr_check_typed_help (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
4015                        int* f ATTRIBUTE_UNUSED)
4016 {
4017   gfc_try t;
4018
4019   if (e->expr_type != EXPR_VARIABLE)
4020     return false;
4021
4022   gcc_assert (e->symtree);
4023   t = gfc_check_symbol_typed (e->symtree->n.sym, check_typed_ns,
4024                               true, e->where);
4025
4026   return (t == FAILURE);
4027 }
4028
4029 gfc_try
4030 gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
4031 {
4032   bool error_found;
4033
4034   /* If this is a top-level variable or EXPR_OP, do the check with strict given
4035      to us.  */
4036   if (!strict)
4037     {
4038       if (e->expr_type == EXPR_VARIABLE && !e->ref)
4039         return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
4040
4041       if (e->expr_type == EXPR_OP)
4042         {
4043           gfc_try t = SUCCESS;
4044
4045           gcc_assert (e->value.op.op1);
4046           t = gfc_expr_check_typed (e->value.op.op1, ns, strict);
4047
4048           if (t == SUCCESS && e->value.op.op2)
4049             t = gfc_expr_check_typed (e->value.op.op2, ns, strict);
4050
4051           return t;
4052         }
4053     }
4054
4055   /* Otherwise, walk the expression and do it strictly.  */
4056   check_typed_ns = ns;
4057   error_found = gfc_traverse_expr (e, NULL, &expr_check_typed_help, 0);
4058
4059   return error_found ? FAILURE : SUCCESS;
4060 }
4061
4062 /* Walk an expression tree and replace all symbols with a corresponding symbol
4063    in the formal_ns of "sym". Needed for copying interfaces in PROCEDURE
4064    statements. The boolean return value is required by gfc_traverse_expr.  */
4065
4066 static bool
4067 replace_symbol (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
4068 {
4069   if ((expr->expr_type == EXPR_VARIABLE 
4070        || (expr->expr_type == EXPR_FUNCTION
4071            && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
4072       && expr->symtree->n.sym->ns == sym->ts.interface->formal_ns)
4073     {
4074       gfc_symtree *stree;
4075       gfc_namespace *ns = sym->formal_ns;
4076       /* Don't use gfc_get_symtree as we prefer to fail badly if we don't find
4077          the symtree rather than create a new one (and probably fail later).  */
4078       stree = gfc_find_symtree (ns ? ns->sym_root : gfc_current_ns->sym_root,
4079                                 expr->symtree->n.sym->name);
4080       gcc_assert (stree);
4081       stree->n.sym->attr = expr->symtree->n.sym->attr;
4082       expr->symtree = stree;
4083     }
4084   return false;
4085 }
4086
4087 void
4088 gfc_expr_replace_symbols (gfc_expr *expr, gfc_symbol *dest)
4089 {
4090   gfc_traverse_expr (expr, dest, &replace_symbol, 0);
4091 }
4092
4093 /* The following is analogous to 'replace_symbol', and needed for copying
4094    interfaces for procedure pointer components. The argument 'sym' must formally
4095    be a gfc_symbol, so that the function can be passed to gfc_traverse_expr.
4096    However, it gets actually passed a gfc_component (i.e. the procedure pointer
4097    component in whose formal_ns the arguments have to be).  */
4098
4099 static bool
4100 replace_comp (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
4101 {
4102   gfc_component *comp;
4103   comp = (gfc_component *)sym;
4104   if ((expr->expr_type == EXPR_VARIABLE 
4105        || (expr->expr_type == EXPR_FUNCTION
4106            && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
4107       && expr->symtree->n.sym->ns == comp->ts.interface->formal_ns)
4108     {
4109       gfc_symtree *stree;
4110       gfc_namespace *ns = comp->formal_ns;
4111       /* Don't use gfc_get_symtree as we prefer to fail badly if we don't find
4112          the symtree rather than create a new one (and probably fail later).  */
4113       stree = gfc_find_symtree (ns ? ns->sym_root : gfc_current_ns->sym_root,
4114                                 expr->symtree->n.sym->name);
4115       gcc_assert (stree);
4116       stree->n.sym->attr = expr->symtree->n.sym->attr;
4117       expr->symtree = stree;
4118     }
4119   return false;
4120 }
4121
4122 void
4123 gfc_expr_replace_comp (gfc_expr *expr, gfc_component *dest)
4124 {
4125   gfc_traverse_expr (expr, (gfc_symbol *)dest, &replace_comp, 0);
4126 }
4127
4128
4129 bool
4130 gfc_ref_this_image (gfc_ref *ref)
4131 {
4132   int n;
4133
4134   gcc_assert (ref->type == REF_ARRAY && ref->u.ar.codimen > 0);
4135
4136   for (n = ref->u.ar.dimen; n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
4137     if (ref->u.ar.dimen_type[n] != DIMEN_THIS_IMAGE)
4138       return false;
4139
4140   return true;
4141 }
4142
4143
4144 bool
4145 gfc_is_coindexed (gfc_expr *e)
4146 {
4147   gfc_ref *ref;
4148
4149   for (ref = e->ref; ref; ref = ref->next)
4150     if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4151       return !gfc_ref_this_image (ref);
4152
4153   return false;
4154 }
4155
4156
4157 int
4158 gfc_get_corank (gfc_expr *e)
4159 {
4160   int corank;
4161   gfc_ref *ref;
4162   corank = e->symtree->n.sym->as ? e->symtree->n.sym->as->corank : 0;
4163   for (ref = e->ref; ref; ref = ref->next)
4164     {
4165       if (ref->type == REF_ARRAY)
4166         corank = ref->u.ar.as->corank;
4167       gcc_assert (ref->type != REF_SUBSTRING);
4168     }
4169   return corank;
4170 }
4171
4172
4173 /* Check whether the expression has an ultimate allocatable component.
4174    Being itself allocatable does not count.  */
4175 bool
4176 gfc_has_ultimate_allocatable (gfc_expr *e)
4177 {
4178   gfc_ref *ref, *last = NULL;
4179
4180   if (e->expr_type != EXPR_VARIABLE)
4181     return false;
4182
4183   for (ref = e->ref; ref; ref = ref->next)
4184     if (ref->type == REF_COMPONENT)
4185       last = ref;
4186
4187   if (last && last->u.c.component->ts.type == BT_CLASS)
4188     return CLASS_DATA (last->u.c.component)->attr.alloc_comp;
4189   else if (last && last->u.c.component->ts.type == BT_DERIVED)
4190     return last->u.c.component->ts.u.derived->attr.alloc_comp;
4191   else if (last)
4192     return false;
4193
4194   if (e->ts.type == BT_CLASS)
4195     return CLASS_DATA (e)->attr.alloc_comp;
4196   else if (e->ts.type == BT_DERIVED)
4197     return e->ts.u.derived->attr.alloc_comp;
4198   else
4199     return false;
4200 }
4201
4202
4203 /* Check whether the expression has an pointer component.
4204    Being itself a pointer does not count.  */
4205 bool
4206 gfc_has_ultimate_pointer (gfc_expr *e)
4207 {
4208   gfc_ref *ref, *last = NULL;
4209
4210   if (e->expr_type != EXPR_VARIABLE)
4211     return false;
4212
4213   for (ref = e->ref; ref; ref = ref->next)
4214     if (ref->type == REF_COMPONENT)
4215       last = ref;
4216  
4217   if (last && last->u.c.component->ts.type == BT_CLASS)
4218     return CLASS_DATA (last->u.c.component)->attr.pointer_comp;
4219   else if (last && last->u.c.component->ts.type == BT_DERIVED)
4220     return last->u.c.component->ts.u.derived->attr.pointer_comp;
4221   else if (last)
4222     return false;
4223
4224   if (e->ts.type == BT_CLASS)
4225     return CLASS_DATA (e)->attr.pointer_comp;
4226   else if (e->ts.type == BT_DERIVED)
4227     return e->ts.u.derived->attr.pointer_comp;
4228   else
4229     return false;
4230 }
4231
4232
4233 /* Check whether an expression is "simply contiguous", cf. F2008, 6.5.4.
4234    Note: A scalar is not regarded as "simply contiguous" by the standard.
4235    if bool is not strict, some futher checks are done - for instance,
4236    a "(::1)" is accepted.  */
4237
4238 bool
4239 gfc_is_simply_contiguous (gfc_expr *expr, bool strict)
4240 {
4241   bool colon;
4242   int i;
4243   gfc_array_ref *ar = NULL;
4244   gfc_ref *ref, *part_ref = NULL;
4245
4246   if (expr->expr_type == EXPR_FUNCTION)
4247     return expr->value.function.esym
4248            ? expr->value.function.esym->result->attr.contiguous : false;
4249   else if (expr->expr_type != EXPR_VARIABLE)
4250     return false;
4251
4252   if (expr->rank == 0)
4253     return false;
4254
4255   for (ref = expr->ref; ref; ref = ref->next)
4256     {
4257       if (ar)
4258         return false; /* Array shall be last part-ref. */
4259
4260       if (ref->type == REF_COMPONENT)
4261         part_ref  = ref;
4262       else if (ref->type == REF_SUBSTRING)
4263         return false;
4264       else if (ref->u.ar.type != AR_ELEMENT)
4265         ar = &ref->u.ar;
4266     }
4267
4268   if ((part_ref && !part_ref->u.c.component->attr.contiguous
4269        && part_ref->u.c.component->attr.pointer)
4270       || (!part_ref && !expr->symtree->n.sym->attr.contiguous
4271           && (expr->symtree->n.sym->attr.pointer
4272               || expr->symtree->n.sym->as->type == AS_ASSUMED_SHAPE)))
4273     return false;
4274
4275   if (!ar || ar->type == AR_FULL)
4276     return true;
4277
4278   gcc_assert (ar->type == AR_SECTION);
4279
4280   /* Check for simply contiguous array */
4281   colon = true;
4282   for (i = 0; i < ar->dimen; i++)
4283     {
4284       if (ar->dimen_type[i] == DIMEN_VECTOR)
4285         return false;
4286
4287       if (ar->dimen_type[i] == DIMEN_ELEMENT)
4288         {
4289           colon = false;
4290           continue;
4291         }
4292
4293       gcc_assert (ar->dimen_type[i] == DIMEN_RANGE);
4294
4295
4296       /* If the previous section was not contiguous, that's an error,
4297          unless we have effective only one element and checking is not
4298          strict.  */
4299       if (!colon && (strict || !ar->start[i] || !ar->end[i]
4300                      || ar->start[i]->expr_type != EXPR_CONSTANT
4301                      || ar->end[i]->expr_type != EXPR_CONSTANT
4302                      || mpz_cmp (ar->start[i]->value.integer,
4303                                  ar->end[i]->value.integer) != 0))
4304         return false;
4305
4306       /* Following the standard, "(::1)" or - if known at compile time -
4307          "(lbound:ubound)" are not simply contigous; if strict
4308          is false, they are regarded as simply contiguous.  */
4309       if (ar->stride[i] && (strict || ar->stride[i]->expr_type != EXPR_CONSTANT
4310                             || ar->stride[i]->ts.type != BT_INTEGER
4311                             || mpz_cmp_si (ar->stride[i]->value.integer, 1) != 0))
4312         return false;
4313
4314       if (ar->start[i]
4315           && (strict || ar->start[i]->expr_type != EXPR_CONSTANT
4316               || !ar->as->lower[i]
4317               || ar->as->lower[i]->expr_type != EXPR_CONSTANT
4318               || mpz_cmp (ar->start[i]->value.integer,
4319                           ar->as->lower[i]->value.integer) != 0))
4320         colon = false;
4321
4322       if (ar->end[i]
4323           && (strict || ar->end[i]->expr_type != EXPR_CONSTANT
4324               || !ar->as->upper[i]
4325               || ar->as->upper[i]->expr_type != EXPR_CONSTANT
4326               || mpz_cmp (ar->end[i]->value.integer,
4327                           ar->as->upper[i]->value.integer) != 0))
4328         colon = false;
4329     }
4330   
4331   return true;
4332 }
4333
4334
4335 /* Build call to an intrinsic procedure.  The number of arguments has to be
4336    passed (rather than ending the list with a NULL value) because we may
4337    want to add arguments but with a NULL-expression.  */
4338
4339 gfc_expr*
4340 gfc_build_intrinsic_call (const char* name, locus where, unsigned numarg, ...)
4341 {
4342   gfc_expr* result;
4343   gfc_actual_arglist* atail;
4344   gfc_intrinsic_sym* isym;
4345   va_list ap;
4346   unsigned i;
4347
4348   isym = gfc_find_function (name);
4349   gcc_assert (isym);
4350   
4351   result = gfc_get_expr ();
4352   result->expr_type = EXPR_FUNCTION;
4353   result->ts = isym->ts;
4354   result->where = where;
4355   result->value.function.name = name;
4356   result->value.function.isym = isym;
4357
4358   va_start (ap, numarg);
4359   atail = NULL;
4360   for (i = 0; i < numarg; ++i)
4361     {
4362       if (atail)
4363         {
4364           atail->next = gfc_get_actual_arglist ();
4365           atail = atail->next;
4366         }
4367       else
4368         atail = result->value.function.actual = gfc_get_actual_arglist ();
4369
4370       atail->expr = va_arg (ap, gfc_expr*);
4371     }
4372   va_end (ap);
4373
4374   return result;
4375 }
4376
4377
4378 /* Check if an expression may appear in a variable definition context
4379    (F2008, 16.6.7) or pointer association context (F2008, 16.6.8).
4380    This is called from the various places when resolving
4381    the pieces that make up such a context.
4382
4383    Optionally, a possible error message can be suppressed if context is NULL
4384    and just the return status (SUCCESS / FAILURE) be requested.  */
4385
4386 gfc_try
4387 gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj,
4388                           const char* context)
4389 {
4390   gfc_symbol* sym = NULL;
4391   bool is_pointer;
4392   bool check_intentin;
4393   bool ptr_component;
4394   symbol_attribute attr;
4395   gfc_ref* ref;
4396
4397   if (e->expr_type == EXPR_VARIABLE)
4398     {
4399       gcc_assert (e->symtree);
4400       sym = e->symtree->n.sym;
4401     }
4402   else if (e->expr_type == EXPR_FUNCTION)
4403     {
4404       gcc_assert (e->symtree);
4405       sym = e->value.function.esym ? e->value.function.esym : e->symtree->n.sym;
4406     }
4407
4408   attr = gfc_expr_attr (e);
4409   if (!pointer && e->expr_type == EXPR_FUNCTION && attr.pointer)
4410     {
4411       if (!(gfc_option.allow_std & GFC_STD_F2008))
4412         {
4413           if (context)
4414             gfc_error ("Fortran 2008: Pointer functions in variable definition"
4415                        " context (%s) at %L", context, &e->where);
4416           return FAILURE;
4417         }
4418     }
4419   else if (e->expr_type != EXPR_VARIABLE)
4420     {
4421       if (context)
4422         gfc_error ("Non-variable expression in variable definition context (%s)"
4423                    " at %L", context, &e->where);
4424       return FAILURE;
4425     }
4426
4427   if (!pointer && sym->attr.flavor == FL_PARAMETER)
4428     {
4429       if (context)
4430         gfc_error ("Named constant '%s' in variable definition context (%s)"
4431                    " at %L", sym->name, context, &e->where);
4432       return FAILURE;
4433     }
4434   if (!pointer && sym->attr.flavor != FL_VARIABLE
4435       && !(sym->attr.flavor == FL_PROCEDURE && sym == sym->result)
4436       && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer))
4437     {
4438       if (context)
4439         gfc_error ("'%s' in variable definition context (%s) at %L is not"
4440                    " a variable", sym->name, context, &e->where);
4441       return FAILURE;
4442     }
4443
4444   /* Find out whether the expr is a pointer; this also means following
4445      component references to the last one.  */
4446   is_pointer = (attr.pointer || attr.proc_pointer);
4447   if (pointer && !is_pointer)
4448     {
4449       if (context)
4450         gfc_error ("Non-POINTER in pointer association context (%s)"
4451                    " at %L", context, &e->where);
4452       return FAILURE;
4453     }
4454
4455   /* F2008, C1303.  */
4456   if (!alloc_obj
4457       && (attr.lock_comp
4458           || (e->ts.type == BT_DERIVED
4459               && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
4460               && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)))
4461     {
4462       if (context)
4463         gfc_error ("LOCK_TYPE in variable definition context (%s) at %L",
4464                    context, &e->where);
4465       return FAILURE;
4466     }
4467
4468   /* INTENT(IN) dummy argument.  Check this, unless the object itself is
4469      the component of sub-component of a pointer.  Obviously,
4470      procedure pointers are of no interest here.  */
4471   check_intentin = true;
4472   ptr_component = sym->attr.pointer;
4473   for (ref = e->ref; ref && check_intentin; ref = ref->next)
4474     {
4475       if (ptr_component && ref->type == REF_COMPONENT)
4476         check_intentin = false;
4477       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
4478         ptr_component = true;
4479     }
4480   if (check_intentin && sym->attr.intent == INTENT_IN)
4481     {
4482       if (pointer && is_pointer)
4483         {
4484           if (context)
4485             gfc_error ("Dummy argument '%s' with INTENT(IN) in pointer"
4486                        " association context (%s) at %L",
4487                        sym->name, context, &e->where);
4488           return FAILURE;
4489         }
4490       if (!pointer && !is_pointer)
4491         {
4492           if (context)
4493             gfc_error ("Dummy argument '%s' with INTENT(IN) in variable"
4494                        " definition context (%s) at %L",
4495                        sym->name, context, &e->where);
4496           return FAILURE;
4497         }
4498     }
4499
4500   /* PROTECTED and use-associated.  */
4501   if (sym->attr.is_protected && sym->attr.use_assoc  && check_intentin)
4502     {
4503       if (pointer && is_pointer)
4504         {
4505           if (context)
4506             gfc_error ("Variable '%s' is PROTECTED and can not appear in a"
4507                        " pointer association context (%s) at %L",
4508                        sym->name, context, &e->where);
4509           return FAILURE;
4510         }
4511       if (!pointer && !is_pointer)
4512         {
4513           if (context)
4514             gfc_error ("Variable '%s' is PROTECTED and can not appear in a"
4515                        " variable definition context (%s) at %L",
4516                        sym->name, context, &e->where);
4517           return FAILURE;
4518         }
4519     }
4520
4521   /* Variable not assignable from a PURE procedure but appears in
4522      variable definition context.  */
4523   if (!pointer && gfc_pure (NULL) && gfc_impure_variable (sym))
4524     {
4525       if (context)
4526         gfc_error ("Variable '%s' can not appear in a variable definition"
4527                    " context (%s) at %L in PURE procedure",
4528                    sym->name, context, &e->where);
4529       return FAILURE;
4530     }
4531
4532   if (!pointer && gfc_implicit_pure (NULL) && gfc_impure_variable (sym))
4533     gfc_current_ns->proc_name->attr.implicit_pure = 0;
4534
4535   /* Check variable definition context for associate-names.  */
4536   if (!pointer && sym->assoc)
4537     {
4538       const char* name;
4539       gfc_association_list* assoc;
4540
4541       gcc_assert (sym->assoc->target);
4542
4543       /* If this is a SELECT TYPE temporary (the association is used internally
4544          for SELECT TYPE), silently go over to the target.  */
4545       if (sym->attr.select_type_temporary)
4546         {
4547           gfc_expr* t = sym->assoc->target;
4548
4549           gcc_assert (t->expr_type == EXPR_VARIABLE);
4550           name = t->symtree->name;
4551
4552           if (t->symtree->n.sym->assoc)
4553             assoc = t->symtree->n.sym->assoc;
4554           else
4555             assoc = sym->assoc;
4556         }
4557       else
4558         {
4559           name = sym->name;
4560           assoc = sym->assoc;
4561         }
4562       gcc_assert (name && assoc);
4563
4564       /* Is association to a valid variable?  */
4565       if (!assoc->variable)
4566         {
4567           if (context)
4568             {
4569               if (assoc->target->expr_type == EXPR_VARIABLE)
4570                 gfc_error ("'%s' at %L associated to vector-indexed target can"
4571                            " not be used in a variable definition context (%s)",
4572                            name, &e->where, context);
4573               else
4574                 gfc_error ("'%s' at %L associated to expression can"
4575                            " not be used in a variable definition context (%s)",
4576                            name, &e->where, context);
4577             }
4578           return FAILURE;
4579         }
4580
4581       /* Target must be allowed to appear in a variable definition context.  */
4582       if (gfc_check_vardef_context (assoc->target, pointer, false, NULL)
4583           == FAILURE)
4584         {
4585           if (context)
4586             gfc_error ("Associate-name '%s' can not appear in a variable"
4587                        " definition context (%s) at %L because its target"
4588                        " at %L can not, either",
4589                        name, context, &e->where,
4590                        &assoc->target->where);
4591           return FAILURE;
4592         }
4593     }
4594
4595   return SUCCESS;
4596 }