re PR fortran/29067 (gfc_resolve_expr(): Bad expression type)
[gcc.git] / gcc / fortran / expr.c
1 /* Routines for manipulation of expression nodes.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
3 Foundation, Inc.
4 Contributed by Andy Vaught
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA. */
22
23 #include "config.h"
24 #include "system.h"
25 #include "gfortran.h"
26 #include "arith.h"
27 #include "match.h"
28
29 /* Get a new expr node. */
30
31 gfc_expr *
32 gfc_get_expr (void)
33 {
34 gfc_expr *e;
35
36 e = gfc_getmem (sizeof (gfc_expr));
37
38 gfc_clear_ts (&e->ts);
39 e->shape = NULL;
40 e->ref = NULL;
41 e->symtree = NULL;
42
43 return e;
44 }
45
46
47 /* Free an argument list and everything below it. */
48
49 void
50 gfc_free_actual_arglist (gfc_actual_arglist * a1)
51 {
52 gfc_actual_arglist *a2;
53
54 while (a1)
55 {
56 a2 = a1->next;
57 gfc_free_expr (a1->expr);
58 gfc_free (a1);
59 a1 = a2;
60 }
61 }
62
63
64 /* Copy an arglist structure and all of the arguments. */
65
66 gfc_actual_arglist *
67 gfc_copy_actual_arglist (gfc_actual_arglist * p)
68 {
69 gfc_actual_arglist *head, *tail, *new;
70
71 head = tail = NULL;
72
73 for (; p; p = p->next)
74 {
75 new = gfc_get_actual_arglist ();
76 *new = *p;
77
78 new->expr = gfc_copy_expr (p->expr);
79 new->next = NULL;
80
81 if (head == NULL)
82 head = new;
83 else
84 tail->next = new;
85
86 tail = new;
87 }
88
89 return head;
90 }
91
92
93 /* Free a list of reference structures. */
94
95 void
96 gfc_free_ref_list (gfc_ref * p)
97 {
98 gfc_ref *q;
99 int i;
100
101 for (; p; p = q)
102 {
103 q = p->next;
104
105 switch (p->type)
106 {
107 case REF_ARRAY:
108 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
109 {
110 gfc_free_expr (p->u.ar.start[i]);
111 gfc_free_expr (p->u.ar.end[i]);
112 gfc_free_expr (p->u.ar.stride[i]);
113 }
114
115 break;
116
117 case REF_SUBSTRING:
118 gfc_free_expr (p->u.ss.start);
119 gfc_free_expr (p->u.ss.end);
120 break;
121
122 case REF_COMPONENT:
123 break;
124 }
125
126 gfc_free (p);
127 }
128 }
129
130
131 /* Workhorse function for gfc_free_expr() that frees everything
132 beneath an expression node, but not the node itself. This is
133 useful when we want to simplify a node and replace it with
134 something else or the expression node belongs to another structure. */
135
136 static void
137 free_expr0 (gfc_expr * e)
138 {
139 int n;
140
141 switch (e->expr_type)
142 {
143 case EXPR_CONSTANT:
144 if (e->from_H)
145 {
146 gfc_free (e->value.character.string);
147 break;
148 }
149
150 switch (e->ts.type)
151 {
152 case BT_INTEGER:
153 mpz_clear (e->value.integer);
154 break;
155
156 case BT_REAL:
157 mpfr_clear (e->value.real);
158 break;
159
160 case BT_CHARACTER:
161 case BT_HOLLERITH:
162 gfc_free (e->value.character.string);
163 break;
164
165 case BT_COMPLEX:
166 mpfr_clear (e->value.complex.r);
167 mpfr_clear (e->value.complex.i);
168 break;
169
170 default:
171 break;
172 }
173
174 break;
175
176 case EXPR_OP:
177 if (e->value.op.op1 != NULL)
178 gfc_free_expr (e->value.op.op1);
179 if (e->value.op.op2 != NULL)
180 gfc_free_expr (e->value.op.op2);
181 break;
182
183 case EXPR_FUNCTION:
184 gfc_free_actual_arglist (e->value.function.actual);
185 break;
186
187 case EXPR_VARIABLE:
188 break;
189
190 case EXPR_ARRAY:
191 case EXPR_STRUCTURE:
192 gfc_free_constructor (e->value.constructor);
193 break;
194
195 case EXPR_SUBSTRING:
196 gfc_free (e->value.character.string);
197 break;
198
199 case EXPR_NULL:
200 break;
201
202 default:
203 gfc_internal_error ("free_expr0(): Bad expr type");
204 }
205
206 /* Free a shape array. */
207 if (e->shape != NULL)
208 {
209 for (n = 0; n < e->rank; n++)
210 mpz_clear (e->shape[n]);
211
212 gfc_free (e->shape);
213 }
214
215 gfc_free_ref_list (e->ref);
216
217 memset (e, '\0', sizeof (gfc_expr));
218 }
219
220
221 /* Free an expression node and everything beneath it. */
222
223 void
224 gfc_free_expr (gfc_expr * e)
225 {
226
227 if (e == NULL)
228 return;
229
230 free_expr0 (e);
231 gfc_free (e);
232 }
233
234
235 /* Graft the *src expression onto the *dest subexpression. */
236
237 void
238 gfc_replace_expr (gfc_expr * dest, gfc_expr * src)
239 {
240
241 free_expr0 (dest);
242 *dest = *src;
243
244 gfc_free (src);
245 }
246
247
248 /* Try to extract an integer constant from the passed expression node.
249 Returns an error message or NULL if the result is set. It is
250 tempting to generate an error and return SUCCESS or FAILURE, but
251 failure is OK for some callers. */
252
253 const char *
254 gfc_extract_int (gfc_expr * expr, int *result)
255 {
256
257 if (expr->expr_type != EXPR_CONSTANT)
258 return _("Constant expression required at %C");
259
260 if (expr->ts.type != BT_INTEGER)
261 return _("Integer expression required at %C");
262
263 if ((mpz_cmp_si (expr->value.integer, INT_MAX) > 0)
264 || (mpz_cmp_si (expr->value.integer, INT_MIN) < 0))
265 {
266 return _("Integer value too large in expression at %C");
267 }
268
269 *result = (int) mpz_get_si (expr->value.integer);
270
271 return NULL;
272 }
273
274
275 /* Recursively copy a list of reference structures. */
276
277 static gfc_ref *
278 copy_ref (gfc_ref * src)
279 {
280 gfc_array_ref *ar;
281 gfc_ref *dest;
282
283 if (src == NULL)
284 return NULL;
285
286 dest = gfc_get_ref ();
287 dest->type = src->type;
288
289 switch (src->type)
290 {
291 case REF_ARRAY:
292 ar = gfc_copy_array_ref (&src->u.ar);
293 dest->u.ar = *ar;
294 gfc_free (ar);
295 break;
296
297 case REF_COMPONENT:
298 dest->u.c = src->u.c;
299 break;
300
301 case REF_SUBSTRING:
302 dest->u.ss = src->u.ss;
303 dest->u.ss.start = gfc_copy_expr (src->u.ss.start);
304 dest->u.ss.end = gfc_copy_expr (src->u.ss.end);
305 break;
306 }
307
308 dest->next = copy_ref (src->next);
309
310 return dest;
311 }
312
313
314 /* Detect whether an expression has any vector index array
315 references. */
316
317 int
318 gfc_has_vector_index (gfc_expr *e)
319 {
320 gfc_ref * ref;
321 int i;
322 for (ref = e->ref; ref; ref = ref->next)
323 if (ref->type == REF_ARRAY)
324 for (i = 0; i < ref->u.ar.dimen; i++)
325 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
326 return 1;
327 return 0;
328 }
329
330
331 /* Copy a shape array. */
332
333 mpz_t *
334 gfc_copy_shape (mpz_t * shape, int rank)
335 {
336 mpz_t *new_shape;
337 int n;
338
339 if (shape == NULL)
340 return NULL;
341
342 new_shape = gfc_get_shape (rank);
343
344 for (n = 0; n < rank; n++)
345 mpz_init_set (new_shape[n], shape[n]);
346
347 return new_shape;
348 }
349
350
351 /* Copy a shape array excluding dimension N, where N is an integer
352 constant expression. Dimensions are numbered in fortran style --
353 starting with ONE.
354
355 So, if the original shape array contains R elements
356 { s1 ... sN-1 sN sN+1 ... sR-1 sR}
357 the result contains R-1 elements:
358 { s1 ... sN-1 sN+1 ... sR-1}
359
360 If anything goes wrong -- N is not a constant, its value is out
361 of range -- or anything else, just returns NULL.
362 */
363
364 mpz_t *
365 gfc_copy_shape_excluding (mpz_t * shape, int rank, gfc_expr * dim)
366 {
367 mpz_t *new_shape, *s;
368 int i, n;
369
370 if (shape == NULL
371 || rank <= 1
372 || dim == NULL
373 || dim->expr_type != EXPR_CONSTANT
374 || dim->ts.type != BT_INTEGER)
375 return NULL;
376
377 n = mpz_get_si (dim->value.integer);
378 n--; /* Convert to zero based index */
379 if (n < 0 || n >= rank)
380 return NULL;
381
382 s = new_shape = gfc_get_shape (rank-1);
383
384 for (i = 0; i < rank; i++)
385 {
386 if (i == n)
387 continue;
388 mpz_init_set (*s, shape[i]);
389 s++;
390 }
391
392 return new_shape;
393 }
394
395 /* Given an expression pointer, return a copy of the expression. This
396 subroutine is recursive. */
397
398 gfc_expr *
399 gfc_copy_expr (gfc_expr * p)
400 {
401 gfc_expr *q;
402 char *s;
403
404 if (p == NULL)
405 return NULL;
406
407 q = gfc_get_expr ();
408 *q = *p;
409
410 switch (q->expr_type)
411 {
412 case EXPR_SUBSTRING:
413 s = gfc_getmem (p->value.character.length + 1);
414 q->value.character.string = s;
415
416 memcpy (s, p->value.character.string, p->value.character.length + 1);
417 break;
418
419 case EXPR_CONSTANT:
420 if (p->from_H)
421 {
422 s = gfc_getmem (p->value.character.length + 1);
423 q->value.character.string = s;
424
425 memcpy (s, p->value.character.string,
426 p->value.character.length + 1);
427 break;
428 }
429 switch (q->ts.type)
430 {
431 case BT_INTEGER:
432 mpz_init_set (q->value.integer, p->value.integer);
433 break;
434
435 case BT_REAL:
436 gfc_set_model_kind (q->ts.kind);
437 mpfr_init (q->value.real);
438 mpfr_set (q->value.real, p->value.real, GFC_RND_MODE);
439 break;
440
441 case BT_COMPLEX:
442 gfc_set_model_kind (q->ts.kind);
443 mpfr_init (q->value.complex.r);
444 mpfr_init (q->value.complex.i);
445 mpfr_set (q->value.complex.r, p->value.complex.r, GFC_RND_MODE);
446 mpfr_set (q->value.complex.i, p->value.complex.i, GFC_RND_MODE);
447 break;
448
449 case BT_CHARACTER:
450 case BT_HOLLERITH:
451 s = gfc_getmem (p->value.character.length + 1);
452 q->value.character.string = s;
453
454 memcpy (s, p->value.character.string,
455 p->value.character.length + 1);
456 break;
457
458 case BT_LOGICAL:
459 case BT_DERIVED:
460 break; /* Already done */
461
462 case BT_PROCEDURE:
463 case BT_UNKNOWN:
464 gfc_internal_error ("gfc_copy_expr(): Bad expr node");
465 /* Not reached */
466 }
467
468 break;
469
470 case EXPR_OP:
471 switch (q->value.op.operator)
472 {
473 case INTRINSIC_NOT:
474 case INTRINSIC_UPLUS:
475 case INTRINSIC_UMINUS:
476 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
477 break;
478
479 default: /* Binary operators */
480 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
481 q->value.op.op2 = gfc_copy_expr (p->value.op.op2);
482 break;
483 }
484
485 break;
486
487 case EXPR_FUNCTION:
488 q->value.function.actual =
489 gfc_copy_actual_arglist (p->value.function.actual);
490 break;
491
492 case EXPR_STRUCTURE:
493 case EXPR_ARRAY:
494 q->value.constructor = gfc_copy_constructor (p->value.constructor);
495 break;
496
497 case EXPR_VARIABLE:
498 case EXPR_NULL:
499 break;
500 }
501
502 q->shape = gfc_copy_shape (p->shape, p->rank);
503
504 q->ref = copy_ref (p->ref);
505
506 return q;
507 }
508
509
510 /* Return the maximum kind of two expressions. In general, higher
511 kind numbers mean more precision for numeric types. */
512
513 int
514 gfc_kind_max (gfc_expr * e1, gfc_expr * e2)
515 {
516
517 return (e1->ts.kind > e2->ts.kind) ? e1->ts.kind : e2->ts.kind;
518 }
519
520
521 /* Returns nonzero if the type is numeric, zero otherwise. */
522
523 static int
524 numeric_type (bt type)
525 {
526
527 return type == BT_COMPLEX || type == BT_REAL || type == BT_INTEGER;
528 }
529
530
531 /* Returns nonzero if the typespec is a numeric type, zero otherwise. */
532
533 int
534 gfc_numeric_ts (gfc_typespec * ts)
535 {
536
537 return numeric_type (ts->type);
538 }
539
540
541 /* Returns an expression node that is an integer constant. */
542
543 gfc_expr *
544 gfc_int_expr (int i)
545 {
546 gfc_expr *p;
547
548 p = gfc_get_expr ();
549
550 p->expr_type = EXPR_CONSTANT;
551 p->ts.type = BT_INTEGER;
552 p->ts.kind = gfc_default_integer_kind;
553
554 p->where = gfc_current_locus;
555 mpz_init_set_si (p->value.integer, i);
556
557 return p;
558 }
559
560
561 /* Returns an expression node that is a logical constant. */
562
563 gfc_expr *
564 gfc_logical_expr (int i, locus * where)
565 {
566 gfc_expr *p;
567
568 p = gfc_get_expr ();
569
570 p->expr_type = EXPR_CONSTANT;
571 p->ts.type = BT_LOGICAL;
572 p->ts.kind = gfc_default_logical_kind;
573
574 if (where == NULL)
575 where = &gfc_current_locus;
576 p->where = *where;
577 p->value.logical = i;
578
579 return p;
580 }
581
582
583 /* Return an expression node with an optional argument list attached.
584 A variable number of gfc_expr pointers are strung together in an
585 argument list with a NULL pointer terminating the list. */
586
587 gfc_expr *
588 gfc_build_conversion (gfc_expr * e)
589 {
590 gfc_expr *p;
591
592 p = gfc_get_expr ();
593 p->expr_type = EXPR_FUNCTION;
594 p->symtree = NULL;
595 p->value.function.actual = NULL;
596
597 p->value.function.actual = gfc_get_actual_arglist ();
598 p->value.function.actual->expr = e;
599
600 return p;
601 }
602
603
604 /* Given an expression node with some sort of numeric binary
605 expression, insert type conversions required to make the operands
606 have the same type.
607
608 The exception is that the operands of an exponential don't have to
609 have the same type. If possible, the base is promoted to the type
610 of the exponent. For example, 1**2.3 becomes 1.0**2.3, but
611 1.0**2 stays as it is. */
612
613 void
614 gfc_type_convert_binary (gfc_expr * e)
615 {
616 gfc_expr *op1, *op2;
617
618 op1 = e->value.op.op1;
619 op2 = e->value.op.op2;
620
621 if (op1->ts.type == BT_UNKNOWN || op2->ts.type == BT_UNKNOWN)
622 {
623 gfc_clear_ts (&e->ts);
624 return;
625 }
626
627 /* Kind conversions of same type. */
628 if (op1->ts.type == op2->ts.type)
629 {
630
631 if (op1->ts.kind == op2->ts.kind)
632 {
633 /* No type conversions. */
634 e->ts = op1->ts;
635 goto done;
636 }
637
638 if (op1->ts.kind > op2->ts.kind)
639 gfc_convert_type (op2, &op1->ts, 2);
640 else
641 gfc_convert_type (op1, &op2->ts, 2);
642
643 e->ts = op1->ts;
644 goto done;
645 }
646
647 /* Integer combined with real or complex. */
648 if (op2->ts.type == BT_INTEGER)
649 {
650 e->ts = op1->ts;
651
652 /* Special case for ** operator. */
653 if (e->value.op.operator == INTRINSIC_POWER)
654 goto done;
655
656 gfc_convert_type (e->value.op.op2, &e->ts, 2);
657 goto done;
658 }
659
660 if (op1->ts.type == BT_INTEGER)
661 {
662 e->ts = op2->ts;
663 gfc_convert_type (e->value.op.op1, &e->ts, 2);
664 goto done;
665 }
666
667 /* Real combined with complex. */
668 e->ts.type = BT_COMPLEX;
669 if (op1->ts.kind > op2->ts.kind)
670 e->ts.kind = op1->ts.kind;
671 else
672 e->ts.kind = op2->ts.kind;
673 if (op1->ts.type != BT_COMPLEX || op1->ts.kind != e->ts.kind)
674 gfc_convert_type (e->value.op.op1, &e->ts, 2);
675 if (op2->ts.type != BT_COMPLEX || op2->ts.kind != e->ts.kind)
676 gfc_convert_type (e->value.op.op2, &e->ts, 2);
677
678 done:
679 return;
680 }
681
682
683 /* Function to determine if an expression is constant or not. This
684 function expects that the expression has already been simplified. */
685
686 int
687 gfc_is_constant_expr (gfc_expr * e)
688 {
689 gfc_constructor *c;
690 gfc_actual_arglist *arg;
691 int rv;
692
693 if (e == NULL)
694 return 1;
695
696 switch (e->expr_type)
697 {
698 case EXPR_OP:
699 rv = (gfc_is_constant_expr (e->value.op.op1)
700 && (e->value.op.op2 == NULL
701 || gfc_is_constant_expr (e->value.op.op2)));
702
703 break;
704
705 case EXPR_VARIABLE:
706 rv = 0;
707 break;
708
709 case EXPR_FUNCTION:
710 /* Call to intrinsic with at least one argument. */
711 rv = 0;
712 if (e->value.function.isym && e->value.function.actual)
713 {
714 for (arg = e->value.function.actual; arg; arg = arg->next)
715 {
716 if (!gfc_is_constant_expr (arg->expr))
717 break;
718 }
719 if (arg == NULL)
720 rv = 1;
721 }
722 break;
723
724 case EXPR_CONSTANT:
725 case EXPR_NULL:
726 rv = 1;
727 break;
728
729 case EXPR_SUBSTRING:
730 rv = (gfc_is_constant_expr (e->ref->u.ss.start)
731 && gfc_is_constant_expr (e->ref->u.ss.end));
732 break;
733
734 case EXPR_STRUCTURE:
735 rv = 0;
736 for (c = e->value.constructor; c; c = c->next)
737 if (!gfc_is_constant_expr (c->expr))
738 break;
739
740 if (c == NULL)
741 rv = 1;
742 break;
743
744 case EXPR_ARRAY:
745 rv = gfc_constant_ac (e);
746 break;
747
748 default:
749 gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
750 }
751
752 return rv;
753 }
754
755
756 /* Try to collapse intrinsic expressions. */
757
758 static try
759 simplify_intrinsic_op (gfc_expr * p, int type)
760 {
761 gfc_expr *op1, *op2, *result;
762
763 if (p->value.op.operator == INTRINSIC_USER)
764 return SUCCESS;
765
766 op1 = p->value.op.op1;
767 op2 = p->value.op.op2;
768
769 if (gfc_simplify_expr (op1, type) == FAILURE)
770 return FAILURE;
771 if (gfc_simplify_expr (op2, type) == FAILURE)
772 return FAILURE;
773
774 if (!gfc_is_constant_expr (op1)
775 || (op2 != NULL && !gfc_is_constant_expr (op2)))
776 return SUCCESS;
777
778 /* Rip p apart */
779 p->value.op.op1 = NULL;
780 p->value.op.op2 = NULL;
781
782 switch (p->value.op.operator)
783 {
784 case INTRINSIC_UPLUS:
785 case INTRINSIC_PARENTHESES:
786 result = gfc_uplus (op1);
787 break;
788
789 case INTRINSIC_UMINUS:
790 result = gfc_uminus (op1);
791 break;
792
793 case INTRINSIC_PLUS:
794 result = gfc_add (op1, op2);
795 break;
796
797 case INTRINSIC_MINUS:
798 result = gfc_subtract (op1, op2);
799 break;
800
801 case INTRINSIC_TIMES:
802 result = gfc_multiply (op1, op2);
803 break;
804
805 case INTRINSIC_DIVIDE:
806 result = gfc_divide (op1, op2);
807 break;
808
809 case INTRINSIC_POWER:
810 result = gfc_power (op1, op2);
811 break;
812
813 case INTRINSIC_CONCAT:
814 result = gfc_concat (op1, op2);
815 break;
816
817 case INTRINSIC_EQ:
818 result = gfc_eq (op1, op2);
819 break;
820
821 case INTRINSIC_NE:
822 result = gfc_ne (op1, op2);
823 break;
824
825 case INTRINSIC_GT:
826 result = gfc_gt (op1, op2);
827 break;
828
829 case INTRINSIC_GE:
830 result = gfc_ge (op1, op2);
831 break;
832
833 case INTRINSIC_LT:
834 result = gfc_lt (op1, op2);
835 break;
836
837 case INTRINSIC_LE:
838 result = gfc_le (op1, op2);
839 break;
840
841 case INTRINSIC_NOT:
842 result = gfc_not (op1);
843 break;
844
845 case INTRINSIC_AND:
846 result = gfc_and (op1, op2);
847 break;
848
849 case INTRINSIC_OR:
850 result = gfc_or (op1, op2);
851 break;
852
853 case INTRINSIC_EQV:
854 result = gfc_eqv (op1, op2);
855 break;
856
857 case INTRINSIC_NEQV:
858 result = gfc_neqv (op1, op2);
859 break;
860
861 default:
862 gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
863 }
864
865 if (result == NULL)
866 {
867 gfc_free_expr (op1);
868 gfc_free_expr (op2);
869 return FAILURE;
870 }
871
872 result->rank = p->rank;
873 result->where = p->where;
874 gfc_replace_expr (p, result);
875
876 return SUCCESS;
877 }
878
879
880 /* Subroutine to simplify constructor expressions. Mutually recursive
881 with gfc_simplify_expr(). */
882
883 static try
884 simplify_constructor (gfc_constructor * c, int type)
885 {
886
887 for (; c; c = c->next)
888 {
889 if (c->iterator
890 && (gfc_simplify_expr (c->iterator->start, type) == FAILURE
891 || gfc_simplify_expr (c->iterator->end, type) == FAILURE
892 || gfc_simplify_expr (c->iterator->step, type) == FAILURE))
893 return FAILURE;
894
895 if (c->expr && gfc_simplify_expr (c->expr, type) == FAILURE)
896 return FAILURE;
897 }
898
899 return SUCCESS;
900 }
901
902
903 /* Pull a single array element out of an array constructor. */
904
905 static try
906 find_array_element (gfc_constructor * cons, gfc_array_ref * ar,
907 gfc_constructor ** rval)
908 {
909 unsigned long nelemen;
910 int i;
911 mpz_t delta;
912 mpz_t offset;
913 gfc_expr *e;
914 try t;
915
916 t = SUCCESS;
917 e = NULL;
918
919 mpz_init_set_ui (offset, 0);
920 mpz_init (delta);
921 for (i = 0; i < ar->dimen; i++)
922 {
923 e = gfc_copy_expr (ar->start[i]);
924 if (e->expr_type != EXPR_CONSTANT)
925 {
926 cons = NULL;
927 goto depart;
928 }
929
930 /* Check the bounds. */
931 if (ar->as->upper[i]
932 && (mpz_cmp (e->value.integer,
933 ar->as->upper[i]->value.integer) > 0
934 || mpz_cmp (e->value.integer,
935 ar->as->lower[i]->value.integer) < 0))
936 {
937 gfc_error ("index in dimension %d is out of bounds "
938 "at %L", i + 1, &ar->c_where[i]);
939 cons = NULL;
940 t = FAILURE;
941 goto depart;
942 }
943
944 mpz_sub (delta, e->value.integer,
945 ar->as->lower[i]->value.integer);
946 mpz_add (offset, offset, delta);
947 }
948
949 if (cons)
950 {
951 for (nelemen = mpz_get_ui (offset); nelemen > 0; nelemen--)
952 {
953 if (cons->iterator)
954 {
955 cons = NULL;
956 goto depart;
957 }
958 cons = cons->next;
959 }
960 }
961
962 depart:
963 mpz_clear (delta);
964 mpz_clear (offset);
965 if (e)
966 gfc_free_expr (e);
967 *rval = cons;
968 return t;
969 }
970
971
972 /* Find a component of a structure constructor. */
973
974 static gfc_constructor *
975 find_component_ref (gfc_constructor * cons, gfc_ref * ref)
976 {
977 gfc_component *comp;
978 gfc_component *pick;
979
980 comp = ref->u.c.sym->components;
981 pick = ref->u.c.component;
982 while (comp != pick)
983 {
984 comp = comp->next;
985 cons = cons->next;
986 }
987
988 return cons;
989 }
990
991
992 /* Replace an expression with the contents of a constructor, removing
993 the subobject reference in the process. */
994
995 static void
996 remove_subobject_ref (gfc_expr * p, gfc_constructor * cons)
997 {
998 gfc_expr *e;
999
1000 e = cons->expr;
1001 cons->expr = NULL;
1002 e->ref = p->ref->next;
1003 p->ref->next = NULL;
1004 gfc_replace_expr (p, e);
1005 }
1006
1007
1008 /* Pull an array section out of an array constructor. */
1009
1010 static try
1011 find_array_section (gfc_expr *expr, gfc_ref *ref)
1012 {
1013 int idx;
1014 int rank;
1015 int d;
1016 long unsigned one = 1;
1017 mpz_t start[GFC_MAX_DIMENSIONS];
1018 mpz_t end[GFC_MAX_DIMENSIONS];
1019 mpz_t stride[GFC_MAX_DIMENSIONS];
1020 mpz_t delta[GFC_MAX_DIMENSIONS];
1021 mpz_t ctr[GFC_MAX_DIMENSIONS];
1022 mpz_t delta_mpz;
1023 mpz_t tmp_mpz;
1024 mpz_t nelts;
1025 mpz_t ptr;
1026 mpz_t stop;
1027 mpz_t index;
1028 gfc_constructor *cons;
1029 gfc_constructor *base;
1030 gfc_expr *begin;
1031 gfc_expr *finish;
1032 gfc_expr *step;
1033 gfc_expr *upper;
1034 gfc_expr *lower;
1035 try t;
1036
1037 t = SUCCESS;
1038
1039 base = expr->value.constructor;
1040 expr->value.constructor = NULL;
1041
1042 rank = ref->u.ar.as->rank;
1043
1044 if (expr->shape == NULL)
1045 expr->shape = gfc_get_shape (rank);
1046
1047 mpz_init_set_ui (delta_mpz, one);
1048 mpz_init_set_ui (nelts, one);
1049 mpz_init (tmp_mpz);
1050
1051 /* Do the initialization now, so that we can cleanup without
1052 keeping track of where we were. */
1053 for (d = 0; d < rank; d++)
1054 {
1055 mpz_init (delta[d]);
1056 mpz_init (start[d]);
1057 mpz_init (end[d]);
1058 mpz_init (ctr[d]);
1059 mpz_init (stride[d]);
1060 }
1061
1062 /* Build the counters to clock through the array reference. */
1063 for (d = 0; d < rank; d++)
1064 {
1065 /* Make this stretch of code easier on the eye! */
1066 begin = ref->u.ar.start[d];
1067 finish = ref->u.ar.end[d];
1068 step = ref->u.ar.stride[d];
1069 lower = ref->u.ar.as->lower[d];
1070 upper = ref->u.ar.as->upper[d];
1071
1072 if ((begin && begin->expr_type != EXPR_CONSTANT)
1073 || (finish && finish->expr_type != EXPR_CONSTANT)
1074 || (step && step->expr_type != EXPR_CONSTANT))
1075 {
1076 t = FAILURE;
1077 goto cleanup;
1078 }
1079
1080 /* Obtain the stride. */
1081 if (step)
1082 mpz_set (stride[d], step->value.integer);
1083 else
1084 mpz_set_ui (stride[d], one);
1085
1086 if (mpz_cmp_ui (stride[d], 0) == 0)
1087 mpz_set_ui (stride[d], one);
1088
1089 /* Obtain the start value for the index. */
1090 if (begin)
1091 mpz_set (start[d], begin->value.integer);
1092 else
1093 mpz_set (start[d], lower->value.integer);
1094
1095 mpz_set (ctr[d], start[d]);
1096
1097 /* Obtain the end value for the index. */
1098 if (finish)
1099 mpz_set (end[d], finish->value.integer);
1100 else
1101 mpz_set (end[d], upper->value.integer);
1102
1103 /* Separate 'if' because elements sometimes arrive with
1104 non-null end. */
1105 if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1106 mpz_set (end [d], begin->value.integer);
1107
1108 /* Check the bounds. */
1109 if (mpz_cmp (ctr[d], upper->value.integer) > 0
1110 || mpz_cmp (end[d], upper->value.integer) > 0
1111 || mpz_cmp (ctr[d], lower->value.integer) < 0
1112 || mpz_cmp (end[d], lower->value.integer) < 0)
1113 {
1114 gfc_error ("index in dimension %d is out of bounds "
1115 "at %L", d + 1, &ref->u.ar.c_where[d]);
1116 t = FAILURE;
1117 goto cleanup;
1118 }
1119
1120 /* Calculate the number of elements and the shape. */
1121 mpz_abs (tmp_mpz, stride[d]);
1122 mpz_div (tmp_mpz, stride[d], tmp_mpz);
1123 mpz_add (tmp_mpz, end[d], tmp_mpz);
1124 mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1125 mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1126 mpz_mul (nelts, nelts, tmp_mpz);
1127
1128 mpz_set (expr->shape[d], tmp_mpz);
1129
1130 /* Calculate the 'stride' (=delta) for conversion of the
1131 counter values into the index along the constructor. */
1132 mpz_set (delta[d], delta_mpz);
1133 mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1134 mpz_add_ui (tmp_mpz, tmp_mpz, one);
1135 mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1136 }
1137
1138 mpz_init (index);
1139 mpz_init (ptr);
1140 mpz_init (stop);
1141 cons = base;
1142
1143 /* Now clock through the array reference, calculating the index in
1144 the source constructor and transferring the elements to the new
1145 constructor. */
1146 for (idx = 0; idx < (int)mpz_get_si (nelts); idx++)
1147 {
1148 if (ref->u.ar.offset)
1149 mpz_set (ptr, ref->u.ar.offset->value.integer);
1150 else
1151 mpz_init_set_ui (ptr, 0);
1152
1153 mpz_set_ui (stop, one);
1154 for (d = 0; d < rank; d++)
1155 {
1156 mpz_set (tmp_mpz, ctr[d]);
1157 mpz_sub_ui (tmp_mpz, tmp_mpz, one);
1158 mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1159 mpz_add (ptr, ptr, tmp_mpz);
1160
1161 mpz_mul (tmp_mpz, stride[d], stop);
1162 mpz_add (ctr[d], ctr[d], tmp_mpz);
1163
1164 mpz_set (tmp_mpz, end[d]);
1165 if (mpz_cmp_ui (stride[d], 0) > 0 ?
1166 mpz_cmp (ctr[d], tmp_mpz) > 0 :
1167 mpz_cmp (ctr[d], tmp_mpz) < 0)
1168 mpz_set (ctr[d], start[d]);
1169 else
1170 mpz_set_ui (stop, 0);
1171 }
1172
1173 /* There must be a better way of dealing with negative strides
1174 than resetting the index and the constructor pointer! */
1175 if (mpz_cmp (ptr, index) < 0)
1176 {
1177 mpz_set_ui (index, 0);
1178 cons = base;
1179 }
1180
1181 while (mpz_cmp (ptr, index) > 0)
1182 {
1183 mpz_add_ui (index, index, one);
1184 cons = cons->next;
1185 }
1186
1187 gfc_append_constructor (expr, gfc_copy_expr (cons->expr));
1188 }
1189
1190 mpz_clear (ptr);
1191 mpz_clear (index);
1192 mpz_clear (stop);
1193
1194 cleanup:
1195
1196 mpz_clear (delta_mpz);
1197 mpz_clear (tmp_mpz);
1198 mpz_clear (nelts);
1199 for (d = 0; d < rank; d++)
1200 {
1201 mpz_clear (delta[d]);
1202 mpz_clear (start[d]);
1203 mpz_clear (end[d]);
1204 mpz_clear (ctr[d]);
1205 mpz_clear (stride[d]);
1206 }
1207 gfc_free_constructor (base);
1208 return t;
1209 }
1210
1211 /* Pull a substring out of an expression. */
1212
1213 static try
1214 find_substring_ref (gfc_expr *p, gfc_expr **newp)
1215 {
1216 int end;
1217 int start;
1218 char *chr;
1219
1220 if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1221 || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1222 return FAILURE;
1223
1224 *newp = gfc_copy_expr (p);
1225 chr = p->value.character.string;
1226 end = (int)mpz_get_ui (p->ref->u.ss.end->value.integer);
1227 start = (int)mpz_get_ui (p->ref->u.ss.start->value.integer);
1228
1229 (*newp)->value.character.length = end - start + 1;
1230 strncpy ((*newp)->value.character.string, &chr[start - 1],
1231 (*newp)->value.character.length);
1232 return SUCCESS;
1233 }
1234
1235
1236
1237 /* Simplify a subobject reference of a constructor. This occurs when
1238 parameter variable values are substituted. */
1239
1240 static try
1241 simplify_const_ref (gfc_expr * p)
1242 {
1243 gfc_constructor *cons;
1244 gfc_expr *newp;
1245
1246 while (p->ref)
1247 {
1248 switch (p->ref->type)
1249 {
1250 case REF_ARRAY:
1251 switch (p->ref->u.ar.type)
1252 {
1253 case AR_ELEMENT:
1254 if (find_array_element (p->value.constructor,
1255 &p->ref->u.ar,
1256 &cons) == FAILURE)
1257 return FAILURE;
1258
1259 if (!cons)
1260 return SUCCESS;
1261
1262 remove_subobject_ref (p, cons);
1263 break;
1264
1265 case AR_SECTION:
1266 if (find_array_section (p, p->ref) == FAILURE)
1267 return FAILURE;
1268 p->ref->u.ar.type = AR_FULL;
1269
1270 /* FALLTHROUGH */
1271
1272 case AR_FULL:
1273 if (p->ref->next != NULL
1274 && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
1275 {
1276 cons = p->value.constructor;
1277 for (; cons; cons = cons->next)
1278 {
1279 cons->expr->ref = copy_ref (p->ref->next);
1280 simplify_const_ref (cons->expr);
1281 }
1282 }
1283 gfc_free_ref_list (p->ref);
1284 p->ref = NULL;
1285 break;
1286
1287 default:
1288 return SUCCESS;
1289 }
1290
1291 break;
1292
1293 case REF_COMPONENT:
1294 cons = find_component_ref (p->value.constructor, p->ref);
1295 remove_subobject_ref (p, cons);
1296 break;
1297
1298 case REF_SUBSTRING:
1299 if (find_substring_ref (p, &newp) == FAILURE)
1300 return FAILURE;
1301
1302 gfc_replace_expr (p, newp);
1303 gfc_free_ref_list (p->ref);
1304 p->ref = NULL;
1305 break;
1306 }
1307 }
1308
1309 return SUCCESS;
1310 }
1311
1312
1313 /* Simplify a chain of references. */
1314
1315 static try
1316 simplify_ref_chain (gfc_ref * ref, int type)
1317 {
1318 int n;
1319
1320 for (; ref; ref = ref->next)
1321 {
1322 switch (ref->type)
1323 {
1324 case REF_ARRAY:
1325 for (n = 0; n < ref->u.ar.dimen; n++)
1326 {
1327 if (gfc_simplify_expr (ref->u.ar.start[n], type)
1328 == FAILURE)
1329 return FAILURE;
1330 if (gfc_simplify_expr (ref->u.ar.end[n], type)
1331 == FAILURE)
1332 return FAILURE;
1333 if (gfc_simplify_expr (ref->u.ar.stride[n], type)
1334 == FAILURE)
1335 return FAILURE;
1336
1337 }
1338 break;
1339
1340 case REF_SUBSTRING:
1341 if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1342 return FAILURE;
1343 if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1344 return FAILURE;
1345 break;
1346
1347 default:
1348 break;
1349 }
1350 }
1351 return SUCCESS;
1352 }
1353
1354
1355 /* Try to substitute the value of a parameter variable. */
1356 static try
1357 simplify_parameter_variable (gfc_expr * p, int type)
1358 {
1359 gfc_expr *e;
1360 try t;
1361
1362 e = gfc_copy_expr (p->symtree->n.sym->value);
1363 if (e == NULL)
1364 return FAILURE;
1365
1366 e->rank = p->rank;
1367
1368 /* Do not copy subobject refs for constant. */
1369 if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1370 e->ref = copy_ref (p->ref);
1371 t = gfc_simplify_expr (e, type);
1372
1373 /* Only use the simplification if it eliminated all subobject
1374 references. */
1375 if (t == SUCCESS && ! e->ref)
1376 gfc_replace_expr (p, e);
1377 else
1378 gfc_free_expr (e);
1379
1380 return t;
1381 }
1382
1383 /* Given an expression, simplify it by collapsing constant
1384 expressions. Most simplification takes place when the expression
1385 tree is being constructed. If an intrinsic function is simplified
1386 at some point, we get called again to collapse the result against
1387 other constants.
1388
1389 We work by recursively simplifying expression nodes, simplifying
1390 intrinsic functions where possible, which can lead to further
1391 constant collapsing. If an operator has constant operand(s), we
1392 rip the expression apart, and rebuild it, hoping that it becomes
1393 something simpler.
1394
1395 The expression type is defined for:
1396 0 Basic expression parsing
1397 1 Simplifying array constructors -- will substitute
1398 iterator values.
1399 Returns FAILURE on error, SUCCESS otherwise.
1400 NOTE: Will return SUCCESS even if the expression can not be simplified. */
1401
1402 try
1403 gfc_simplify_expr (gfc_expr * p, int type)
1404 {
1405 gfc_actual_arglist *ap;
1406
1407 if (p == NULL)
1408 return SUCCESS;
1409
1410 switch (p->expr_type)
1411 {
1412 case EXPR_CONSTANT:
1413 case EXPR_NULL:
1414 break;
1415
1416 case EXPR_FUNCTION:
1417 for (ap = p->value.function.actual; ap; ap = ap->next)
1418 if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1419 return FAILURE;
1420
1421 if (p->value.function.isym != NULL
1422 && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1423 return FAILURE;
1424
1425 break;
1426
1427 case EXPR_SUBSTRING:
1428 if (simplify_ref_chain (p->ref, type) == FAILURE)
1429 return FAILURE;
1430
1431 if (gfc_is_constant_expr (p))
1432 {
1433 char *s;
1434 int start, end;
1435
1436 gfc_extract_int (p->ref->u.ss.start, &start);
1437 start--; /* Convert from one-based to zero-based. */
1438 gfc_extract_int (p->ref->u.ss.end, &end);
1439 s = gfc_getmem (end - start + 1);
1440 memcpy (s, p->value.character.string + start, end - start);
1441 s[end-start+1] = '\0'; /* TODO: C-style string for debugging. */
1442 gfc_free (p->value.character.string);
1443 p->value.character.string = s;
1444 p->value.character.length = end - start;
1445 p->ts.cl = gfc_get_charlen ();
1446 p->ts.cl->next = gfc_current_ns->cl_list;
1447 gfc_current_ns->cl_list = p->ts.cl;
1448 p->ts.cl->length = gfc_int_expr (p->value.character.length);
1449 gfc_free_ref_list (p->ref);
1450 p->ref = NULL;
1451 p->expr_type = EXPR_CONSTANT;
1452 }
1453 break;
1454
1455 case EXPR_OP:
1456 if (simplify_intrinsic_op (p, type) == FAILURE)
1457 return FAILURE;
1458 break;
1459
1460 case EXPR_VARIABLE:
1461 /* Only substitute array parameter variables if we are in an
1462 initialization expression, or we want a subsection. */
1463 if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1464 && (gfc_init_expr || p->ref
1465 || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1466 {
1467 if (simplify_parameter_variable (p, type) == FAILURE)
1468 return FAILURE;
1469 break;
1470 }
1471
1472 if (type == 1)
1473 {
1474 gfc_simplify_iterator_var (p);
1475 }
1476
1477 /* Simplify subcomponent references. */
1478 if (simplify_ref_chain (p->ref, type) == FAILURE)
1479 return FAILURE;
1480
1481 break;
1482
1483 case EXPR_STRUCTURE:
1484 case EXPR_ARRAY:
1485 if (simplify_ref_chain (p->ref, type) == FAILURE)
1486 return FAILURE;
1487
1488 if (simplify_constructor (p->value.constructor, type) == FAILURE)
1489 return FAILURE;
1490
1491 if (p->expr_type == EXPR_ARRAY
1492 && p->ref && p->ref->type == REF_ARRAY
1493 && p->ref->u.ar.type == AR_FULL)
1494 gfc_expand_constructor (p);
1495
1496 if (simplify_const_ref (p) == FAILURE)
1497 return FAILURE;
1498
1499 break;
1500 }
1501
1502 return SUCCESS;
1503 }
1504
1505
1506 /* Returns the type of an expression with the exception that iterator
1507 variables are automatically integers no matter what else they may
1508 be declared as. */
1509
1510 static bt
1511 et0 (gfc_expr * e)
1512 {
1513
1514 if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1515 return BT_INTEGER;
1516
1517 return e->ts.type;
1518 }
1519
1520
1521 /* Check an intrinsic arithmetic operation to see if it is consistent
1522 with some type of expression. */
1523
1524 static try check_init_expr (gfc_expr *);
1525
1526 static try
1527 check_intrinsic_op (gfc_expr * e, try (*check_function) (gfc_expr *))
1528 {
1529 gfc_expr *op1 = e->value.op.op1;
1530 gfc_expr *op2 = e->value.op.op2;
1531
1532 if ((*check_function) (op1) == FAILURE)
1533 return FAILURE;
1534
1535 switch (e->value.op.operator)
1536 {
1537 case INTRINSIC_UPLUS:
1538 case INTRINSIC_UMINUS:
1539 if (!numeric_type (et0 (op1)))
1540 goto not_numeric;
1541 break;
1542
1543 case INTRINSIC_EQ:
1544 case INTRINSIC_NE:
1545 case INTRINSIC_GT:
1546 case INTRINSIC_GE:
1547 case INTRINSIC_LT:
1548 case INTRINSIC_LE:
1549 if ((*check_function) (op2) == FAILURE)
1550 return FAILURE;
1551
1552 if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1553 && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
1554 {
1555 gfc_error ("Numeric or CHARACTER operands are required in "
1556 "expression at %L", &e->where);
1557 return FAILURE;
1558 }
1559 break;
1560
1561 case INTRINSIC_PLUS:
1562 case INTRINSIC_MINUS:
1563 case INTRINSIC_TIMES:
1564 case INTRINSIC_DIVIDE:
1565 case INTRINSIC_POWER:
1566 if ((*check_function) (op2) == FAILURE)
1567 return FAILURE;
1568
1569 if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
1570 goto not_numeric;
1571
1572 if (e->value.op.operator == INTRINSIC_POWER
1573 && check_function == check_init_expr && et0 (op2) != BT_INTEGER)
1574 {
1575 gfc_error ("Exponent at %L must be INTEGER for an initialization "
1576 "expression", &op2->where);
1577 return FAILURE;
1578 }
1579
1580 break;
1581
1582 case INTRINSIC_CONCAT:
1583 if ((*check_function) (op2) == FAILURE)
1584 return FAILURE;
1585
1586 if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
1587 {
1588 gfc_error ("Concatenation operator in expression at %L "
1589 "must have two CHARACTER operands", &op1->where);
1590 return FAILURE;
1591 }
1592
1593 if (op1->ts.kind != op2->ts.kind)
1594 {
1595 gfc_error ("Concat operator at %L must concatenate strings of the "
1596 "same kind", &e->where);
1597 return FAILURE;
1598 }
1599
1600 break;
1601
1602 case INTRINSIC_NOT:
1603 if (et0 (op1) != BT_LOGICAL)
1604 {
1605 gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
1606 "operand", &op1->where);
1607 return FAILURE;
1608 }
1609
1610 break;
1611
1612 case INTRINSIC_AND:
1613 case INTRINSIC_OR:
1614 case INTRINSIC_EQV:
1615 case INTRINSIC_NEQV:
1616 if ((*check_function) (op2) == FAILURE)
1617 return FAILURE;
1618
1619 if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
1620 {
1621 gfc_error ("LOGICAL operands are required in expression at %L",
1622 &e->where);
1623 return FAILURE;
1624 }
1625
1626 break;
1627
1628 case INTRINSIC_PARENTHESES:
1629 break;
1630
1631 default:
1632 gfc_error ("Only intrinsic operators can be used in expression at %L",
1633 &e->where);
1634 return FAILURE;
1635 }
1636
1637 return SUCCESS;
1638
1639 not_numeric:
1640 gfc_error ("Numeric operands are required in expression at %L", &e->where);
1641
1642 return FAILURE;
1643 }
1644
1645
1646
1647 /* Certain inquiry functions are specifically allowed to have variable
1648 arguments, which is an exception to the normal requirement that an
1649 initialization function have initialization arguments. We head off
1650 this problem here. */
1651
1652 static try
1653 check_inquiry (gfc_expr * e, int not_restricted)
1654 {
1655 const char *name;
1656
1657 /* FIXME: This should be moved into the intrinsic definitions,
1658 to eliminate this ugly hack. */
1659 static const char * const inquiry_function[] = {
1660 "digits", "epsilon", "huge", "kind", "len", "maxexponent", "minexponent",
1661 "precision", "radix", "range", "tiny", "bit_size", "size", "shape",
1662 "lbound", "ubound", NULL
1663 };
1664
1665 int i;
1666
1667 /* An undeclared parameter will get us here (PR25018). */
1668 if (e->symtree == NULL)
1669 return FAILURE;
1670
1671 name = e->symtree->n.sym->name;
1672
1673 for (i = 0; inquiry_function[i]; i++)
1674 if (strcmp (inquiry_function[i], name) == 0)
1675 break;
1676
1677 if (inquiry_function[i] == NULL)
1678 return FAILURE;
1679
1680 e = e->value.function.actual->expr;
1681
1682 if (e == NULL || e->expr_type != EXPR_VARIABLE)
1683 return FAILURE;
1684
1685 /* At this point we have an inquiry function with a variable argument. The
1686 type of the variable might be undefined, but we need it now, because the
1687 arguments of these functions are allowed to be undefined. */
1688
1689 if (e->ts.type == BT_UNKNOWN)
1690 {
1691 if (e->symtree->n.sym->ts.type == BT_UNKNOWN
1692 && gfc_set_default_type (e->symtree->n.sym, 0, gfc_current_ns)
1693 == FAILURE)
1694 return FAILURE;
1695
1696 e->ts = e->symtree->n.sym->ts;
1697 }
1698
1699 /* Assumed character length will not reduce to a constant expression
1700 with LEN, as required by the standard. */
1701 if (i == 4 && not_restricted
1702 && e->symtree->n.sym->ts.type == BT_CHARACTER
1703 && e->symtree->n.sym->ts.cl->length == NULL)
1704 gfc_notify_std (GFC_STD_GNU, "assumed character length "
1705 "variable '%s' in constant expression at %L",
1706 e->symtree->n.sym->name, &e->where);
1707
1708 return SUCCESS;
1709 }
1710
1711
1712 /* Verify that an expression is an initialization expression. A side
1713 effect is that the expression tree is reduced to a single constant
1714 node if all goes well. This would normally happen when the
1715 expression is constructed but function references are assumed to be
1716 intrinsics in the context of initialization expressions. If
1717 FAILURE is returned an error message has been generated. */
1718
1719 static try
1720 check_init_expr (gfc_expr * e)
1721 {
1722 gfc_actual_arglist *ap;
1723 match m;
1724 try t;
1725
1726 if (e == NULL)
1727 return SUCCESS;
1728
1729 switch (e->expr_type)
1730 {
1731 case EXPR_OP:
1732 t = check_intrinsic_op (e, check_init_expr);
1733 if (t == SUCCESS)
1734 t = gfc_simplify_expr (e, 0);
1735
1736 break;
1737
1738 case EXPR_FUNCTION:
1739 t = SUCCESS;
1740
1741 if (check_inquiry (e, 1) != SUCCESS)
1742 {
1743 t = SUCCESS;
1744 for (ap = e->value.function.actual; ap; ap = ap->next)
1745 if (check_init_expr (ap->expr) == FAILURE)
1746 {
1747 t = FAILURE;
1748 break;
1749 }
1750 }
1751
1752 if (t == SUCCESS)
1753 {
1754 m = gfc_intrinsic_func_interface (e, 0);
1755
1756 if (m == MATCH_NO)
1757 gfc_error ("Function '%s' in initialization expression at %L "
1758 "must be an intrinsic function",
1759 e->symtree->n.sym->name, &e->where);
1760
1761 if (m != MATCH_YES)
1762 t = FAILURE;
1763 }
1764
1765 break;
1766
1767 case EXPR_VARIABLE:
1768 t = SUCCESS;
1769
1770 if (gfc_check_iter_variable (e) == SUCCESS)
1771 break;
1772
1773 if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
1774 {
1775 t = simplify_parameter_variable (e, 0);
1776 break;
1777 }
1778
1779 gfc_error ("Parameter '%s' at %L has not been declared or is "
1780 "a variable, which does not reduce to a constant "
1781 "expression", e->symtree->n.sym->name, &e->where);
1782 t = FAILURE;
1783 break;
1784
1785 case EXPR_CONSTANT:
1786 case EXPR_NULL:
1787 t = SUCCESS;
1788 break;
1789
1790 case EXPR_SUBSTRING:
1791 t = check_init_expr (e->ref->u.ss.start);
1792 if (t == FAILURE)
1793 break;
1794
1795 t = check_init_expr (e->ref->u.ss.end);
1796 if (t == SUCCESS)
1797 t = gfc_simplify_expr (e, 0);
1798
1799 break;
1800
1801 case EXPR_STRUCTURE:
1802 t = gfc_check_constructor (e, check_init_expr);
1803 break;
1804
1805 case EXPR_ARRAY:
1806 t = gfc_check_constructor (e, check_init_expr);
1807 if (t == FAILURE)
1808 break;
1809
1810 t = gfc_expand_constructor (e);
1811 if (t == FAILURE)
1812 break;
1813
1814 t = gfc_check_constructor_type (e);
1815 break;
1816
1817 default:
1818 gfc_internal_error ("check_init_expr(): Unknown expression type");
1819 }
1820
1821 return t;
1822 }
1823
1824
1825 /* Match an initialization expression. We work by first matching an
1826 expression, then reducing it to a constant. */
1827
1828 match
1829 gfc_match_init_expr (gfc_expr ** result)
1830 {
1831 gfc_expr *expr;
1832 match m;
1833 try t;
1834
1835 m = gfc_match_expr (&expr);
1836 if (m != MATCH_YES)
1837 return m;
1838
1839 gfc_init_expr = 1;
1840 t = gfc_resolve_expr (expr);
1841 if (t == SUCCESS)
1842 t = check_init_expr (expr);
1843 gfc_init_expr = 0;
1844
1845 if (t == FAILURE)
1846 {
1847 gfc_free_expr (expr);
1848 return MATCH_ERROR;
1849 }
1850
1851 if (expr->expr_type == EXPR_ARRAY
1852 && (gfc_check_constructor_type (expr) == FAILURE
1853 || gfc_expand_constructor (expr) == FAILURE))
1854 {
1855 gfc_free_expr (expr);
1856 return MATCH_ERROR;
1857 }
1858
1859 /* Not all inquiry functions are simplified to constant expressions
1860 so it is necessary to call check_inquiry again. */
1861 if (!gfc_is_constant_expr (expr)
1862 && check_inquiry (expr, 1) == FAILURE)
1863 {
1864 gfc_error ("Initialization expression didn't reduce %C");
1865 return MATCH_ERROR;
1866 }
1867
1868 *result = expr;
1869
1870 return MATCH_YES;
1871 }
1872
1873
1874
1875 static try check_restricted (gfc_expr *);
1876
1877 /* Given an actual argument list, test to see that each argument is a
1878 restricted expression and optionally if the expression type is
1879 integer or character. */
1880
1881 static try
1882 restricted_args (gfc_actual_arglist * a)
1883 {
1884 for (; a; a = a->next)
1885 {
1886 if (check_restricted (a->expr) == FAILURE)
1887 return FAILURE;
1888 }
1889
1890 return SUCCESS;
1891 }
1892
1893
1894 /************* Restricted/specification expressions *************/
1895
1896
1897 /* Make sure a non-intrinsic function is a specification function. */
1898
1899 static try
1900 external_spec_function (gfc_expr * e)
1901 {
1902 gfc_symbol *f;
1903
1904 f = e->value.function.esym;
1905
1906 if (f->attr.proc == PROC_ST_FUNCTION)
1907 {
1908 gfc_error ("Specification function '%s' at %L cannot be a statement "
1909 "function", f->name, &e->where);
1910 return FAILURE;
1911 }
1912
1913 if (f->attr.proc == PROC_INTERNAL)
1914 {
1915 gfc_error ("Specification function '%s' at %L cannot be an internal "
1916 "function", f->name, &e->where);
1917 return FAILURE;
1918 }
1919
1920 if (!f->attr.pure && !f->attr.elemental)
1921 {
1922 gfc_error ("Specification function '%s' at %L must be PURE", f->name,
1923 &e->where);
1924 return FAILURE;
1925 }
1926
1927 if (f->attr.recursive)
1928 {
1929 gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
1930 f->name, &e->where);
1931 return FAILURE;
1932 }
1933
1934 return restricted_args (e->value.function.actual);
1935 }
1936
1937
1938 /* Check to see that a function reference to an intrinsic is a
1939 restricted expression. */
1940
1941 static try
1942 restricted_intrinsic (gfc_expr * e)
1943 {
1944 /* TODO: Check constraints on inquiry functions. 7.1.6.2 (7). */
1945 if (check_inquiry (e, 0) == SUCCESS)
1946 return SUCCESS;
1947
1948 return restricted_args (e->value.function.actual);
1949 }
1950
1951
1952 /* Verify that an expression is a restricted expression. Like its
1953 cousin check_init_expr(), an error message is generated if we
1954 return FAILURE. */
1955
1956 static try
1957 check_restricted (gfc_expr * e)
1958 {
1959 gfc_symbol *sym;
1960 try t;
1961
1962 if (e == NULL)
1963 return SUCCESS;
1964
1965 switch (e->expr_type)
1966 {
1967 case EXPR_OP:
1968 t = check_intrinsic_op (e, check_restricted);
1969 if (t == SUCCESS)
1970 t = gfc_simplify_expr (e, 0);
1971
1972 break;
1973
1974 case EXPR_FUNCTION:
1975 t = e->value.function.esym ?
1976 external_spec_function (e) : restricted_intrinsic (e);
1977
1978 break;
1979
1980 case EXPR_VARIABLE:
1981 sym = e->symtree->n.sym;
1982 t = FAILURE;
1983
1984 if (sym->attr.optional)
1985 {
1986 gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
1987 sym->name, &e->where);
1988 break;
1989 }
1990
1991 if (sym->attr.intent == INTENT_OUT)
1992 {
1993 gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
1994 sym->name, &e->where);
1995 break;
1996 }
1997
1998 /* gfc_is_formal_arg broadcasts that a formal argument list is being processed
1999 in resolve.c(resolve_formal_arglist). This is done so that host associated
2000 dummy array indices are accepted (PR23446). */
2001 if (sym->attr.in_common
2002 || sym->attr.use_assoc
2003 || sym->attr.dummy
2004 || sym->ns != gfc_current_ns
2005 || (sym->ns->proc_name != NULL
2006 && sym->ns->proc_name->attr.flavor == FL_MODULE)
2007 || gfc_is_formal_arg ())
2008 {
2009 t = SUCCESS;
2010 break;
2011 }
2012
2013 gfc_error ("Variable '%s' cannot appear in the expression at %L",
2014 sym->name, &e->where);
2015
2016 break;
2017
2018 case EXPR_NULL:
2019 case EXPR_CONSTANT:
2020 t = SUCCESS;
2021 break;
2022
2023 case EXPR_SUBSTRING:
2024 t = gfc_specification_expr (e->ref->u.ss.start);
2025 if (t == FAILURE)
2026 break;
2027
2028 t = gfc_specification_expr (e->ref->u.ss.end);
2029 if (t == SUCCESS)
2030 t = gfc_simplify_expr (e, 0);
2031
2032 break;
2033
2034 case EXPR_STRUCTURE:
2035 t = gfc_check_constructor (e, check_restricted);
2036 break;
2037
2038 case EXPR_ARRAY:
2039 t = gfc_check_constructor (e, check_restricted);
2040 break;
2041
2042 default:
2043 gfc_internal_error ("check_restricted(): Unknown expression type");
2044 }
2045
2046 return t;
2047 }
2048
2049
2050 /* Check to see that an expression is a specification expression. If
2051 we return FAILURE, an error has been generated. */
2052
2053 try
2054 gfc_specification_expr (gfc_expr * e)
2055 {
2056 if (e == NULL)
2057 return SUCCESS;
2058
2059 if (e->ts.type != BT_INTEGER)
2060 {
2061 gfc_error ("Expression at %L must be of INTEGER type", &e->where);
2062 return FAILURE;
2063 }
2064
2065 if (e->rank != 0)
2066 {
2067 gfc_error ("Expression at %L must be scalar", &e->where);
2068 return FAILURE;
2069 }
2070
2071 if (gfc_simplify_expr (e, 0) == FAILURE)
2072 return FAILURE;
2073
2074 return check_restricted (e);
2075 }
2076
2077
2078 /************** Expression conformance checks. *************/
2079
2080 /* Given two expressions, make sure that the arrays are conformable. */
2081
2082 try
2083 gfc_check_conformance (const char *optype_msgid,
2084 gfc_expr * op1, gfc_expr * op2)
2085 {
2086 int op1_flag, op2_flag, d;
2087 mpz_t op1_size, op2_size;
2088 try t;
2089
2090 if (op1->rank == 0 || op2->rank == 0)
2091 return SUCCESS;
2092
2093 if (op1->rank != op2->rank)
2094 {
2095 gfc_error ("Incompatible ranks in %s at %L", _(optype_msgid),
2096 &op1->where);
2097 return FAILURE;
2098 }
2099
2100 t = SUCCESS;
2101
2102 for (d = 0; d < op1->rank; d++)
2103 {
2104 op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2105 op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2106
2107 if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2108 {
2109 gfc_error ("different shape for %s at %L on dimension %d (%d/%d)",
2110 _(optype_msgid), &op1->where, d + 1,
2111 (int) mpz_get_si (op1_size),
2112 (int) mpz_get_si (op2_size));
2113
2114 t = FAILURE;
2115 }
2116
2117 if (op1_flag)
2118 mpz_clear (op1_size);
2119 if (op2_flag)
2120 mpz_clear (op2_size);
2121
2122 if (t == FAILURE)
2123 return FAILURE;
2124 }
2125
2126 return SUCCESS;
2127 }
2128
2129
2130 /* Given an assignable expression and an arbitrary expression, make
2131 sure that the assignment can take place. */
2132
2133 try
2134 gfc_check_assign (gfc_expr * lvalue, gfc_expr * rvalue, int conform)
2135 {
2136 gfc_symbol *sym;
2137
2138 sym = lvalue->symtree->n.sym;
2139
2140 if (sym->attr.intent == INTENT_IN)
2141 {
2142 gfc_error ("Can't assign to INTENT(IN) variable '%s' at %L",
2143 sym->name, &lvalue->where);
2144 return FAILURE;
2145 }
2146
2147 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2148 variable local to a function subprogram. Its existence begins when
2149 execution of the function is initiated and ends when execution of the
2150 function is terminated.....
2151 Therefore, the left hand side is no longer a varaiable, when it is:*/
2152 if (sym->attr.flavor == FL_PROCEDURE
2153 && sym->attr.proc != PROC_ST_FUNCTION
2154 && !sym->attr.external)
2155 {
2156 bool bad_proc;
2157 bad_proc = false;
2158
2159 /* (i) Use associated; */
2160 if (sym->attr.use_assoc)
2161 bad_proc = true;
2162
2163 /* (ii) The assignment is in the main program; or */
2164 if (gfc_current_ns->proc_name->attr.is_main_program)
2165 bad_proc = true;
2166
2167 /* (iii) A module or internal procedure.... */
2168 if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2169 || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2170 && gfc_current_ns->parent
2171 && (!(gfc_current_ns->parent->proc_name->attr.function
2172 || gfc_current_ns->parent->proc_name->attr.subroutine)
2173 || gfc_current_ns->parent->proc_name->attr.is_main_program))
2174 {
2175 /* .... that is not a function.... */
2176 if (!gfc_current_ns->proc_name->attr.function)
2177 bad_proc = true;
2178
2179 /* .... or is not an entry and has a different name. */
2180 if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2181 bad_proc = true;
2182 }
2183
2184 if (bad_proc)
2185 {
2186 gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2187 return FAILURE;
2188 }
2189 }
2190
2191 if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2192 {
2193 gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2194 lvalue->rank, rvalue->rank, &lvalue->where);
2195 return FAILURE;
2196 }
2197
2198 if (lvalue->ts.type == BT_UNKNOWN)
2199 {
2200 gfc_error ("Variable type is UNKNOWN in assignment at %L",
2201 &lvalue->where);
2202 return FAILURE;
2203 }
2204
2205 if (rvalue->expr_type == EXPR_NULL)
2206 {
2207 gfc_error ("NULL appears on right-hand side in assignment at %L",
2208 &rvalue->where);
2209 return FAILURE;
2210 }
2211
2212 if (sym->attr.cray_pointee
2213 && lvalue->ref != NULL
2214 && lvalue->ref->u.ar.type == AR_FULL
2215 && lvalue->ref->u.ar.as->cp_was_assumed)
2216 {
2217 gfc_error ("Vector assignment to assumed-size Cray Pointee at %L"
2218 " is illegal.", &lvalue->where);
2219 return FAILURE;
2220 }
2221
2222 /* This is possibly a typo: x = f() instead of x => f() */
2223 if (gfc_option.warn_surprising
2224 && rvalue->expr_type == EXPR_FUNCTION
2225 && rvalue->symtree->n.sym->attr.pointer)
2226 gfc_warning ("POINTER valued function appears on right-hand side of "
2227 "assignment at %L", &rvalue->where);
2228
2229 /* Check size of array assignments. */
2230 if (lvalue->rank != 0 && rvalue->rank != 0
2231 && gfc_check_conformance ("Array assignment", lvalue, rvalue) != SUCCESS)
2232 return FAILURE;
2233
2234 if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2235 return SUCCESS;
2236
2237 if (!conform)
2238 {
2239 /* Numeric can be converted to any other numeric. And Hollerith can be
2240 converted to any other type. */
2241 if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2242 || rvalue->ts.type == BT_HOLLERITH)
2243 return SUCCESS;
2244
2245 if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2246 return SUCCESS;
2247
2248 gfc_error ("Incompatible types in assignment at %L, %s to %s",
2249 &rvalue->where, gfc_typename (&rvalue->ts),
2250 gfc_typename (&lvalue->ts));
2251
2252 return FAILURE;
2253 }
2254
2255 return gfc_convert_type (rvalue, &lvalue->ts, 1);
2256 }
2257
2258
2259 /* Check that a pointer assignment is OK. We first check lvalue, and
2260 we only check rvalue if it's not an assignment to NULL() or a
2261 NULLIFY statement. */
2262
2263 try
2264 gfc_check_pointer_assign (gfc_expr * lvalue, gfc_expr * rvalue)
2265 {
2266 symbol_attribute attr;
2267 int is_pure;
2268
2269 if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN)
2270 {
2271 gfc_error ("Pointer assignment target is not a POINTER at %L",
2272 &lvalue->where);
2273 return FAILURE;
2274 }
2275
2276 if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
2277 && lvalue->symtree->n.sym->attr.use_assoc)
2278 {
2279 gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2280 "l-value since it is a procedure",
2281 lvalue->symtree->n.sym->name, &lvalue->where);
2282 return FAILURE;
2283 }
2284
2285 attr = gfc_variable_attr (lvalue, NULL);
2286 if (!attr.pointer)
2287 {
2288 gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2289 return FAILURE;
2290 }
2291
2292 is_pure = gfc_pure (NULL);
2293
2294 if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym))
2295 {
2296 gfc_error ("Bad pointer object in PURE procedure at %L",
2297 &lvalue->where);
2298 return FAILURE;
2299 }
2300
2301 /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2302 kind, etc for lvalue and rvalue must match, and rvalue must be a
2303 pure variable if we're in a pure function. */
2304 if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
2305 return SUCCESS;
2306
2307 if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
2308 {
2309 gfc_error ("Different types in pointer assignment at %L",
2310 &lvalue->where);
2311 return FAILURE;
2312 }
2313
2314 if (lvalue->ts.kind != rvalue->ts.kind)
2315 {
2316 gfc_error ("Different kind type parameters in pointer "
2317 "assignment at %L", &lvalue->where);
2318 return FAILURE;
2319 }
2320
2321 if (lvalue->rank != rvalue->rank)
2322 {
2323 gfc_error ("Different ranks in pointer assignment at %L",
2324 &lvalue->where);
2325 return FAILURE;
2326 }
2327
2328 /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X). */
2329 if (rvalue->expr_type == EXPR_NULL)
2330 return SUCCESS;
2331
2332 if (lvalue->ts.type == BT_CHARACTER
2333 && lvalue->ts.cl->length && rvalue->ts.cl->length
2334 && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
2335 rvalue->ts.cl->length)) == 1)
2336 {
2337 gfc_error ("Different character lengths in pointer "
2338 "assignment at %L", &lvalue->where);
2339 return FAILURE;
2340 }
2341
2342 attr = gfc_expr_attr (rvalue);
2343 if (!attr.target && !attr.pointer)
2344 {
2345 gfc_error ("Pointer assignment target is neither TARGET "
2346 "nor POINTER at %L", &rvalue->where);
2347 return FAILURE;
2348 }
2349
2350 if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
2351 {
2352 gfc_error ("Bad target in pointer assignment in PURE "
2353 "procedure at %L", &rvalue->where);
2354 }
2355
2356 if (gfc_has_vector_index (rvalue))
2357 {
2358 gfc_error ("Pointer assignment with vector subscript "
2359 "on rhs at %L", &rvalue->where);
2360 return FAILURE;
2361 }
2362
2363 return SUCCESS;
2364 }
2365
2366
2367 /* Relative of gfc_check_assign() except that the lvalue is a single
2368 symbol. Used for initialization assignments. */
2369
2370 try
2371 gfc_check_assign_symbol (gfc_symbol * sym, gfc_expr * rvalue)
2372 {
2373 gfc_expr lvalue;
2374 try r;
2375
2376 memset (&lvalue, '\0', sizeof (gfc_expr));
2377
2378 lvalue.expr_type = EXPR_VARIABLE;
2379 lvalue.ts = sym->ts;
2380 if (sym->as)
2381 lvalue.rank = sym->as->rank;
2382 lvalue.symtree = (gfc_symtree *)gfc_getmem (sizeof (gfc_symtree));
2383 lvalue.symtree->n.sym = sym;
2384 lvalue.where = sym->declared_at;
2385
2386 if (sym->attr.pointer)
2387 r = gfc_check_pointer_assign (&lvalue, rvalue);
2388 else
2389 r = gfc_check_assign (&lvalue, rvalue, 1);
2390
2391 gfc_free (lvalue.symtree);
2392
2393 return r;
2394 }
2395
2396
2397 /* Get an expression for a default initializer. */
2398
2399 gfc_expr *
2400 gfc_default_initializer (gfc_typespec *ts)
2401 {
2402 gfc_constructor *tail;
2403 gfc_expr *init;
2404 gfc_component *c;
2405
2406 init = NULL;
2407
2408 /* See if we have a default initializer. */
2409 for (c = ts->derived->components; c; c = c->next)
2410 {
2411 if ((c->initializer || c->allocatable) && init == NULL)
2412 init = gfc_get_expr ();
2413 }
2414
2415 if (init == NULL)
2416 return NULL;
2417
2418 /* Build the constructor. */
2419 init->expr_type = EXPR_STRUCTURE;
2420 init->ts = *ts;
2421 init->where = ts->derived->declared_at;
2422 tail = NULL;
2423 for (c = ts->derived->components; c; c = c->next)
2424 {
2425 if (tail == NULL)
2426 init->value.constructor = tail = gfc_get_constructor ();
2427 else
2428 {
2429 tail->next = gfc_get_constructor ();
2430 tail = tail->next;
2431 }
2432
2433 if (c->initializer)
2434 tail->expr = gfc_copy_expr (c->initializer);
2435
2436 if (c->allocatable)
2437 {
2438 tail->expr = gfc_get_expr ();
2439 tail->expr->expr_type = EXPR_NULL;
2440 tail->expr->ts = c->ts;
2441 }
2442 }
2443 return init;
2444 }
2445
2446
2447 /* Given a symbol, create an expression node with that symbol as a
2448 variable. If the symbol is array valued, setup a reference of the
2449 whole array. */
2450
2451 gfc_expr *
2452 gfc_get_variable_expr (gfc_symtree * var)
2453 {
2454 gfc_expr *e;
2455
2456 e = gfc_get_expr ();
2457 e->expr_type = EXPR_VARIABLE;
2458 e->symtree = var;
2459 e->ts = var->n.sym->ts;
2460
2461 if (var->n.sym->as != NULL)
2462 {
2463 e->rank = var->n.sym->as->rank;
2464 e->ref = gfc_get_ref ();
2465 e->ref->type = REF_ARRAY;
2466 e->ref->u.ar.type = AR_FULL;
2467 }
2468
2469 return e;
2470 }
2471
2472
2473 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
2474
2475 void
2476 gfc_expr_set_symbols_referenced (gfc_expr * expr)
2477 {
2478 gfc_actual_arglist *arg;
2479 gfc_constructor *c;
2480 gfc_ref *ref;
2481 int i;
2482
2483 if (!expr) return;
2484
2485 switch (expr->expr_type)
2486 {
2487 case EXPR_OP:
2488 gfc_expr_set_symbols_referenced (expr->value.op.op1);
2489 gfc_expr_set_symbols_referenced (expr->value.op.op2);
2490 break;
2491
2492 case EXPR_FUNCTION:
2493 for (arg = expr->value.function.actual; arg; arg = arg->next)
2494 gfc_expr_set_symbols_referenced (arg->expr);
2495 break;
2496
2497 case EXPR_VARIABLE:
2498 gfc_set_sym_referenced (expr->symtree->n.sym);
2499 break;
2500
2501 case EXPR_CONSTANT:
2502 case EXPR_NULL:
2503 case EXPR_SUBSTRING:
2504 break;
2505
2506 case EXPR_STRUCTURE:
2507 case EXPR_ARRAY:
2508 for (c = expr->value.constructor; c; c = c->next)
2509 gfc_expr_set_symbols_referenced (c->expr);
2510 break;
2511
2512 default:
2513 gcc_unreachable ();
2514 break;
2515 }
2516
2517 for (ref = expr->ref; ref; ref = ref->next)
2518 switch (ref->type)
2519 {
2520 case REF_ARRAY:
2521 for (i = 0; i < ref->u.ar.dimen; i++)
2522 {
2523 gfc_expr_set_symbols_referenced (ref->u.ar.start[i]);
2524 gfc_expr_set_symbols_referenced (ref->u.ar.end[i]);
2525 gfc_expr_set_symbols_referenced (ref->u.ar.stride[i]);
2526 }
2527 break;
2528
2529 case REF_COMPONENT:
2530 break;
2531
2532 case REF_SUBSTRING:
2533 gfc_expr_set_symbols_referenced (ref->u.ss.start);
2534 gfc_expr_set_symbols_referenced (ref->u.ss.end);
2535 break;
2536
2537 default:
2538 gcc_unreachable ();
2539 break;
2540 }
2541 }