re PR fortran/25049 (TRANSPOSE not allowed in initialisation expression)
[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 end[GFC_MAX_DIMENSIONS];
1018 mpz_t stride[GFC_MAX_DIMENSIONS];
1019 mpz_t delta[GFC_MAX_DIMENSIONS];
1020 mpz_t ctr[GFC_MAX_DIMENSIONS];
1021 mpz_t delta_mpz;
1022 mpz_t tmp_mpz;
1023 mpz_t nelts;
1024 mpz_t ptr;
1025 mpz_t stop;
1026 mpz_t index;
1027 gfc_constructor *cons;
1028 gfc_constructor *base;
1029 gfc_expr *begin;
1030 gfc_expr *finish;
1031 gfc_expr *step;
1032 gfc_expr *upper;
1033 gfc_expr *lower;
1034 try t;
1035
1036 t = SUCCESS;
1037
1038 base = expr->value.constructor;
1039 expr->value.constructor = NULL;
1040
1041 rank = ref->u.ar.as->rank;
1042
1043 if (expr->shape == NULL)
1044 expr->shape = gfc_get_shape (rank);
1045
1046 mpz_init_set_ui (delta_mpz, one);
1047 mpz_init_set_ui (nelts, one);
1048 mpz_init (tmp_mpz);
1049
1050 /* Do the initialization now, so that we can cleanup without
1051 keeping track of where we were. */
1052 for (d = 0; d < rank; d++)
1053 {
1054 mpz_init (delta[d]);
1055 mpz_init (end[d]);
1056 mpz_init (ctr[d]);
1057 mpz_init (stride[d]);
1058 }
1059
1060 /* Build the counters to clock through the array reference. */
1061 for (d = 0; d < rank; d++)
1062 {
1063 /* Make this stretch of code easier on the eye! */
1064 begin = ref->u.ar.start[d];
1065 finish = ref->u.ar.end[d];
1066 step = ref->u.ar.stride[d];
1067 lower = ref->u.ar.as->lower[d];
1068 upper = ref->u.ar.as->upper[d];
1069
1070 if ((begin && begin->expr_type != EXPR_CONSTANT)
1071 || (finish && finish->expr_type != EXPR_CONSTANT)
1072 || (step && step->expr_type != EXPR_CONSTANT))
1073 {
1074 t = FAILURE;
1075 goto cleanup;
1076 }
1077
1078 /* Obtain the stride. */
1079 if (step)
1080 mpz_set (stride[d], step->value.integer);
1081 else
1082 mpz_set_ui (stride[d], one);
1083
1084 if (mpz_cmp_ui (stride[d], 0) == 0)
1085 mpz_set_ui (stride[d], one);
1086
1087 /* Obtain the start value for the index. */
1088 if (begin->value.integer)
1089 mpz_set (ctr[d], begin->value.integer);
1090 else
1091 {
1092 if (mpz_cmp_si (stride[d], 0) < 0)
1093 mpz_set (ctr[d], upper->value.integer);
1094 else
1095 mpz_set (ctr[d], lower->value.integer);
1096 }
1097
1098 /* Obtain the end value for the index. */
1099 if (finish)
1100 mpz_set (end[d], finish->value.integer);
1101 else
1102 {
1103 if (mpz_cmp_si (stride[d], 0) < 0)
1104 mpz_set (end[d], lower->value.integer);
1105 else
1106 mpz_set (end[d], upper->value.integer);
1107 }
1108
1109 /* Separate 'if' because elements sometimes arrive with
1110 non-null end. */
1111 if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1112 mpz_set (end [d], begin->value.integer);
1113
1114 /* Check the bounds. */
1115 if (mpz_cmp (ctr[d], upper->value.integer) > 0
1116 || mpz_cmp (end[d], upper->value.integer) > 0
1117 || mpz_cmp (ctr[d], lower->value.integer) < 0
1118 || mpz_cmp (end[d], lower->value.integer) < 0)
1119 {
1120 gfc_error ("index in dimension %d is out of bounds "
1121 "at %L", d + 1, &ref->u.ar.c_where[d]);
1122 t = FAILURE;
1123 goto cleanup;
1124 }
1125
1126 /* Calculate the number of elements and the shape. */
1127 mpz_abs (tmp_mpz, stride[d]);
1128 mpz_div (tmp_mpz, stride[d], tmp_mpz);
1129 mpz_add (tmp_mpz, end[d], tmp_mpz);
1130 mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1131 mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1132 mpz_mul (nelts, nelts, tmp_mpz);
1133
1134 mpz_set (expr->shape[d], tmp_mpz);
1135
1136 /* Calculate the 'stride' (=delta) for conversion of the
1137 counter values into the index along the constructor. */
1138 mpz_set (delta[d], delta_mpz);
1139 mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1140 mpz_add_ui (tmp_mpz, tmp_mpz, one);
1141 mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1142 }
1143
1144 mpz_init (index);
1145 mpz_init (ptr);
1146 mpz_init (stop);
1147 cons = base;
1148
1149 /* Now clock through the array reference, calculating the index in
1150 the source constructor and transferring the elements to the new
1151 constructor. */
1152 for (idx = 0; idx < (int)mpz_get_si (nelts); idx++)
1153 {
1154 if (ref->u.ar.offset)
1155 mpz_set (ptr, ref->u.ar.offset->value.integer);
1156 else
1157 mpz_init_set_ui (ptr, 0);
1158
1159 mpz_set_ui (stop, one);
1160 for (d = 0; d < rank; d++)
1161 {
1162 mpz_set (tmp_mpz, ctr[d]);
1163 mpz_sub_ui (tmp_mpz, tmp_mpz, one);
1164 mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1165 mpz_add (ptr, ptr, tmp_mpz);
1166
1167 mpz_mul (tmp_mpz, stride[d], stop);
1168 mpz_add (ctr[d], ctr[d], tmp_mpz);
1169
1170 mpz_set (tmp_mpz, end[d]);
1171 if (mpz_cmp_ui (stride[d], 0) > 0 ?
1172 mpz_cmp (ctr[d], tmp_mpz) > 0 :
1173 mpz_cmp (ctr[d], tmp_mpz) < 0)
1174 mpz_set (ctr[d], ref->u.ar.start[d]->value.integer);
1175 else
1176 mpz_set_ui (stop, 0);
1177 }
1178
1179 /* There must be a better way of dealing with negative strides
1180 than resetting the index and the constructor pointer! */
1181 if (mpz_cmp (ptr, index) < 0)
1182 {
1183 mpz_set_ui (index, 0);
1184 cons = base;
1185 }
1186
1187 while (mpz_cmp (ptr, index) > 0)
1188 {
1189 mpz_add_ui (index, index, one);
1190 cons = cons->next;
1191 }
1192
1193 gfc_append_constructor (expr, gfc_copy_expr (cons->expr));
1194 }
1195
1196 mpz_clear (ptr);
1197 mpz_clear (index);
1198 mpz_clear (stop);
1199
1200 cleanup:
1201
1202 mpz_clear (delta_mpz);
1203 mpz_clear (tmp_mpz);
1204 mpz_clear (nelts);
1205 for (d = 0; d < rank; d++)
1206 {
1207 mpz_clear (delta[d]);
1208 mpz_clear (end[d]);
1209 mpz_clear (ctr[d]);
1210 mpz_clear (stride[d]);
1211 }
1212 gfc_free_constructor (base);
1213 return t;
1214 }
1215
1216 /* Pull a substring out of an expression. */
1217
1218 static try
1219 find_substring_ref (gfc_expr *p, gfc_expr **newp)
1220 {
1221 int end;
1222 int start;
1223 char *chr;
1224
1225 if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1226 || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1227 return FAILURE;
1228
1229 *newp = gfc_copy_expr (p);
1230 chr = p->value.character.string;
1231 end = (int)mpz_get_ui (p->ref->u.ss.end->value.integer);
1232 start = (int)mpz_get_ui (p->ref->u.ss.start->value.integer);
1233
1234 (*newp)->value.character.length = end - start + 1;
1235 strncpy ((*newp)->value.character.string, &chr[start - 1],
1236 (*newp)->value.character.length);
1237 return SUCCESS;
1238 }
1239
1240
1241
1242 /* Simplify a subobject reference of a constructor. This occurs when
1243 parameter variable values are substituted. */
1244
1245 static try
1246 simplify_const_ref (gfc_expr * p)
1247 {
1248 gfc_constructor *cons;
1249 gfc_expr *newp;
1250
1251 while (p->ref)
1252 {
1253 switch (p->ref->type)
1254 {
1255 case REF_ARRAY:
1256 switch (p->ref->u.ar.type)
1257 {
1258 case AR_ELEMENT:
1259 if (find_array_element (p->value.constructor,
1260 &p->ref->u.ar,
1261 &cons) == FAILURE)
1262 return FAILURE;
1263
1264 if (!cons)
1265 return SUCCESS;
1266
1267 remove_subobject_ref (p, cons);
1268 break;
1269
1270 case AR_SECTION:
1271 if (find_array_section (p, p->ref) == FAILURE)
1272 return FAILURE;
1273 p->ref->u.ar.type = AR_FULL;
1274
1275 /* FALLTHROUGH */
1276
1277 case AR_FULL:
1278 if (p->ref->next != NULL
1279 && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
1280 {
1281 cons = p->value.constructor;
1282 for (; cons; cons = cons->next)
1283 {
1284 cons->expr->ref = copy_ref (p->ref->next);
1285 simplify_const_ref (cons->expr);
1286 }
1287 }
1288 gfc_free_ref_list (p->ref);
1289 p->ref = NULL;
1290 break;
1291
1292 default:
1293 return SUCCESS;
1294 }
1295
1296 break;
1297
1298 case REF_COMPONENT:
1299 cons = find_component_ref (p->value.constructor, p->ref);
1300 remove_subobject_ref (p, cons);
1301 break;
1302
1303 case REF_SUBSTRING:
1304 if (find_substring_ref (p, &newp) == FAILURE)
1305 return FAILURE;
1306
1307 gfc_replace_expr (p, newp);
1308 gfc_free_ref_list (p->ref);
1309 p->ref = NULL;
1310 break;
1311 }
1312 }
1313
1314 return SUCCESS;
1315 }
1316
1317
1318 /* Simplify a chain of references. */
1319
1320 static try
1321 simplify_ref_chain (gfc_ref * ref, int type)
1322 {
1323 int n;
1324
1325 for (; ref; ref = ref->next)
1326 {
1327 switch (ref->type)
1328 {
1329 case REF_ARRAY:
1330 for (n = 0; n < ref->u.ar.dimen; n++)
1331 {
1332 if (gfc_simplify_expr (ref->u.ar.start[n], type)
1333 == FAILURE)
1334 return FAILURE;
1335 if (gfc_simplify_expr (ref->u.ar.end[n], type)
1336 == FAILURE)
1337 return FAILURE;
1338 if (gfc_simplify_expr (ref->u.ar.stride[n], type)
1339 == FAILURE)
1340 return FAILURE;
1341
1342 }
1343 break;
1344
1345 case REF_SUBSTRING:
1346 if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1347 return FAILURE;
1348 if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1349 return FAILURE;
1350 break;
1351
1352 default:
1353 break;
1354 }
1355 }
1356 return SUCCESS;
1357 }
1358
1359
1360 /* Try to substitute the value of a parameter variable. */
1361 static try
1362 simplify_parameter_variable (gfc_expr * p, int type)
1363 {
1364 gfc_expr *e;
1365 try t;
1366
1367 e = gfc_copy_expr (p->symtree->n.sym->value);
1368 if (e == NULL)
1369 return FAILURE;
1370
1371 /* Do not copy subobject refs for constant. */
1372 if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1373 e->ref = copy_ref (p->ref);
1374 t = gfc_simplify_expr (e, type);
1375
1376 /* Only use the simplification if it eliminated all subobject
1377 references. */
1378 if (t == SUCCESS && ! e->ref)
1379 gfc_replace_expr (p, e);
1380 else
1381 gfc_free_expr (e);
1382
1383 return t;
1384 }
1385
1386 /* Given an expression, simplify it by collapsing constant
1387 expressions. Most simplification takes place when the expression
1388 tree is being constructed. If an intrinsic function is simplified
1389 at some point, we get called again to collapse the result against
1390 other constants.
1391
1392 We work by recursively simplifying expression nodes, simplifying
1393 intrinsic functions where possible, which can lead to further
1394 constant collapsing. If an operator has constant operand(s), we
1395 rip the expression apart, and rebuild it, hoping that it becomes
1396 something simpler.
1397
1398 The expression type is defined for:
1399 0 Basic expression parsing
1400 1 Simplifying array constructors -- will substitute
1401 iterator values.
1402 Returns FAILURE on error, SUCCESS otherwise.
1403 NOTE: Will return SUCCESS even if the expression can not be simplified. */
1404
1405 try
1406 gfc_simplify_expr (gfc_expr * p, int type)
1407 {
1408 gfc_actual_arglist *ap;
1409
1410 if (p == NULL)
1411 return SUCCESS;
1412
1413 switch (p->expr_type)
1414 {
1415 case EXPR_CONSTANT:
1416 case EXPR_NULL:
1417 break;
1418
1419 case EXPR_FUNCTION:
1420 for (ap = p->value.function.actual; ap; ap = ap->next)
1421 if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1422 return FAILURE;
1423
1424 if (p->value.function.isym != NULL
1425 && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1426 return FAILURE;
1427
1428 break;
1429
1430 case EXPR_SUBSTRING:
1431 if (simplify_ref_chain (p->ref, type) == FAILURE)
1432 return FAILURE;
1433
1434 if (gfc_is_constant_expr (p))
1435 {
1436 char *s;
1437 int start, end;
1438
1439 gfc_extract_int (p->ref->u.ss.start, &start);
1440 start--; /* Convert from one-based to zero-based. */
1441 gfc_extract_int (p->ref->u.ss.end, &end);
1442 s = gfc_getmem (end - start + 1);
1443 memcpy (s, p->value.character.string + start, end - start);
1444 s[end] = '\0'; /* TODO: C-style string for debugging. */
1445 gfc_free (p->value.character.string);
1446 p->value.character.string = s;
1447 p->value.character.length = end - start;
1448 p->ts.cl = gfc_get_charlen ();
1449 p->ts.cl->next = gfc_current_ns->cl_list;
1450 gfc_current_ns->cl_list = p->ts.cl;
1451 p->ts.cl->length = gfc_int_expr (p->value.character.length);
1452 gfc_free_ref_list (p->ref);
1453 p->ref = NULL;
1454 p->expr_type = EXPR_CONSTANT;
1455 }
1456 break;
1457
1458 case EXPR_OP:
1459 if (simplify_intrinsic_op (p, type) == FAILURE)
1460 return FAILURE;
1461 break;
1462
1463 case EXPR_VARIABLE:
1464 /* Only substitute array parameter variables if we are in an
1465 initialization expression, or we want a subsection. */
1466 if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1467 && (gfc_init_expr || p->ref
1468 || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1469 {
1470 if (simplify_parameter_variable (p, type) == FAILURE)
1471 return FAILURE;
1472 break;
1473 }
1474
1475 if (type == 1)
1476 {
1477 gfc_simplify_iterator_var (p);
1478 }
1479
1480 /* Simplify subcomponent references. */
1481 if (simplify_ref_chain (p->ref, type) == FAILURE)
1482 return FAILURE;
1483
1484 break;
1485
1486 case EXPR_STRUCTURE:
1487 case EXPR_ARRAY:
1488 if (simplify_ref_chain (p->ref, type) == FAILURE)
1489 return FAILURE;
1490
1491 if (simplify_constructor (p->value.constructor, type) == FAILURE)
1492 return FAILURE;
1493
1494 if (p->expr_type == EXPR_ARRAY
1495 && p->ref && p->ref->type == REF_ARRAY
1496 && p->ref->u.ar.type == AR_FULL)
1497 gfc_expand_constructor (p);
1498
1499 if (simplify_const_ref (p) == FAILURE)
1500 return FAILURE;
1501
1502 break;
1503 }
1504
1505 return SUCCESS;
1506 }
1507
1508
1509 /* Returns the type of an expression with the exception that iterator
1510 variables are automatically integers no matter what else they may
1511 be declared as. */
1512
1513 static bt
1514 et0 (gfc_expr * e)
1515 {
1516
1517 if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1518 return BT_INTEGER;
1519
1520 return e->ts.type;
1521 }
1522
1523
1524 /* Check an intrinsic arithmetic operation to see if it is consistent
1525 with some type of expression. */
1526
1527 static try check_init_expr (gfc_expr *);
1528
1529 static try
1530 check_intrinsic_op (gfc_expr * e, try (*check_function) (gfc_expr *))
1531 {
1532 gfc_expr *op1 = e->value.op.op1;
1533 gfc_expr *op2 = e->value.op.op2;
1534
1535 if ((*check_function) (op1) == FAILURE)
1536 return FAILURE;
1537
1538 switch (e->value.op.operator)
1539 {
1540 case INTRINSIC_UPLUS:
1541 case INTRINSIC_UMINUS:
1542 if (!numeric_type (et0 (op1)))
1543 goto not_numeric;
1544 break;
1545
1546 case INTRINSIC_EQ:
1547 case INTRINSIC_NE:
1548 case INTRINSIC_GT:
1549 case INTRINSIC_GE:
1550 case INTRINSIC_LT:
1551 case INTRINSIC_LE:
1552 if ((*check_function) (op2) == FAILURE)
1553 return FAILURE;
1554
1555 if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1556 && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
1557 {
1558 gfc_error ("Numeric or CHARACTER operands are required in "
1559 "expression at %L", &e->where);
1560 return FAILURE;
1561 }
1562 break;
1563
1564 case INTRINSIC_PLUS:
1565 case INTRINSIC_MINUS:
1566 case INTRINSIC_TIMES:
1567 case INTRINSIC_DIVIDE:
1568 case INTRINSIC_POWER:
1569 if ((*check_function) (op2) == FAILURE)
1570 return FAILURE;
1571
1572 if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
1573 goto not_numeric;
1574
1575 if (e->value.op.operator == INTRINSIC_POWER
1576 && check_function == check_init_expr && et0 (op2) != BT_INTEGER)
1577 {
1578 gfc_error ("Exponent at %L must be INTEGER for an initialization "
1579 "expression", &op2->where);
1580 return FAILURE;
1581 }
1582
1583 break;
1584
1585 case INTRINSIC_CONCAT:
1586 if ((*check_function) (op2) == FAILURE)
1587 return FAILURE;
1588
1589 if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
1590 {
1591 gfc_error ("Concatenation operator in expression at %L "
1592 "must have two CHARACTER operands", &op1->where);
1593 return FAILURE;
1594 }
1595
1596 if (op1->ts.kind != op2->ts.kind)
1597 {
1598 gfc_error ("Concat operator at %L must concatenate strings of the "
1599 "same kind", &e->where);
1600 return FAILURE;
1601 }
1602
1603 break;
1604
1605 case INTRINSIC_NOT:
1606 if (et0 (op1) != BT_LOGICAL)
1607 {
1608 gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
1609 "operand", &op1->where);
1610 return FAILURE;
1611 }
1612
1613 break;
1614
1615 case INTRINSIC_AND:
1616 case INTRINSIC_OR:
1617 case INTRINSIC_EQV:
1618 case INTRINSIC_NEQV:
1619 if ((*check_function) (op2) == FAILURE)
1620 return FAILURE;
1621
1622 if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
1623 {
1624 gfc_error ("LOGICAL operands are required in expression at %L",
1625 &e->where);
1626 return FAILURE;
1627 }
1628
1629 break;
1630
1631 case INTRINSIC_PARENTHESES:
1632 break;
1633
1634 default:
1635 gfc_error ("Only intrinsic operators can be used in expression at %L",
1636 &e->where);
1637 return FAILURE;
1638 }
1639
1640 return SUCCESS;
1641
1642 not_numeric:
1643 gfc_error ("Numeric operands are required in expression at %L", &e->where);
1644
1645 return FAILURE;
1646 }
1647
1648
1649
1650 /* Certain inquiry functions are specifically allowed to have variable
1651 arguments, which is an exception to the normal requirement that an
1652 initialization function have initialization arguments. We head off
1653 this problem here. */
1654
1655 static try
1656 check_inquiry (gfc_expr * e, int not_restricted)
1657 {
1658 const char *name;
1659
1660 /* FIXME: This should be moved into the intrinsic definitions,
1661 to eliminate this ugly hack. */
1662 static const char * const inquiry_function[] = {
1663 "digits", "epsilon", "huge", "kind", "len", "maxexponent", "minexponent",
1664 "precision", "radix", "range", "tiny", "bit_size", "size", "shape",
1665 "lbound", "ubound", NULL
1666 };
1667
1668 int i;
1669
1670 /* An undeclared parameter will get us here (PR25018). */
1671 if (e->symtree == NULL)
1672 return FAILURE;
1673
1674 name = e->symtree->n.sym->name;
1675
1676 for (i = 0; inquiry_function[i]; i++)
1677 if (strcmp (inquiry_function[i], name) == 0)
1678 break;
1679
1680 if (inquiry_function[i] == NULL)
1681 return FAILURE;
1682
1683 e = e->value.function.actual->expr;
1684
1685 if (e == NULL || e->expr_type != EXPR_VARIABLE)
1686 return FAILURE;
1687
1688 /* At this point we have an inquiry function with a variable argument. The
1689 type of the variable might be undefined, but we need it now, because the
1690 arguments of these functions are allowed to be undefined. */
1691
1692 if (e->ts.type == BT_UNKNOWN)
1693 {
1694 if (e->symtree->n.sym->ts.type == BT_UNKNOWN
1695 && gfc_set_default_type (e->symtree->n.sym, 0, gfc_current_ns)
1696 == FAILURE)
1697 return FAILURE;
1698
1699 e->ts = e->symtree->n.sym->ts;
1700 }
1701
1702 /* Assumed character length will not reduce to a constant expression
1703 with LEN, as required by the standard. */
1704 if (i == 4 && not_restricted
1705 && e->symtree->n.sym->ts.type == BT_CHARACTER
1706 && e->symtree->n.sym->ts.cl->length == NULL)
1707 gfc_notify_std (GFC_STD_GNU, "assumed character length "
1708 "variable '%s' in constant expression at %L",
1709 e->symtree->n.sym->name, &e->where);
1710
1711 return SUCCESS;
1712 }
1713
1714
1715 /* Verify that an expression is an initialization expression. A side
1716 effect is that the expression tree is reduced to a single constant
1717 node if all goes well. This would normally happen when the
1718 expression is constructed but function references are assumed to be
1719 intrinsics in the context of initialization expressions. If
1720 FAILURE is returned an error message has been generated. */
1721
1722 static try
1723 check_init_expr (gfc_expr * e)
1724 {
1725 gfc_actual_arglist *ap;
1726 match m;
1727 try t;
1728
1729 if (e == NULL)
1730 return SUCCESS;
1731
1732 switch (e->expr_type)
1733 {
1734 case EXPR_OP:
1735 t = check_intrinsic_op (e, check_init_expr);
1736 if (t == SUCCESS)
1737 t = gfc_simplify_expr (e, 0);
1738
1739 break;
1740
1741 case EXPR_FUNCTION:
1742 t = SUCCESS;
1743
1744 if (check_inquiry (e, 1) != SUCCESS)
1745 {
1746 t = SUCCESS;
1747 for (ap = e->value.function.actual; ap; ap = ap->next)
1748 if (check_init_expr (ap->expr) == FAILURE)
1749 {
1750 t = FAILURE;
1751 break;
1752 }
1753 }
1754
1755 if (t == SUCCESS)
1756 {
1757 m = gfc_intrinsic_func_interface (e, 0);
1758
1759 if (m == MATCH_NO)
1760 gfc_error ("Function '%s' in initialization expression at %L "
1761 "must be an intrinsic function",
1762 e->symtree->n.sym->name, &e->where);
1763
1764 if (m != MATCH_YES)
1765 t = FAILURE;
1766 }
1767
1768 break;
1769
1770 case EXPR_VARIABLE:
1771 t = SUCCESS;
1772
1773 if (gfc_check_iter_variable (e) == SUCCESS)
1774 break;
1775
1776 if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
1777 {
1778 t = simplify_parameter_variable (e, 0);
1779 break;
1780 }
1781
1782 gfc_error ("Parameter '%s' at %L has not been declared or is "
1783 "a variable, which does not reduce to a constant "
1784 "expression", e->symtree->n.sym->name, &e->where);
1785 t = FAILURE;
1786 break;
1787
1788 case EXPR_CONSTANT:
1789 case EXPR_NULL:
1790 t = SUCCESS;
1791 break;
1792
1793 case EXPR_SUBSTRING:
1794 t = check_init_expr (e->ref->u.ss.start);
1795 if (t == FAILURE)
1796 break;
1797
1798 t = check_init_expr (e->ref->u.ss.end);
1799 if (t == SUCCESS)
1800 t = gfc_simplify_expr (e, 0);
1801
1802 break;
1803
1804 case EXPR_STRUCTURE:
1805 t = gfc_check_constructor (e, check_init_expr);
1806 break;
1807
1808 case EXPR_ARRAY:
1809 t = gfc_check_constructor (e, check_init_expr);
1810 if (t == FAILURE)
1811 break;
1812
1813 t = gfc_expand_constructor (e);
1814 if (t == FAILURE)
1815 break;
1816
1817 t = gfc_check_constructor_type (e);
1818 break;
1819
1820 default:
1821 gfc_internal_error ("check_init_expr(): Unknown expression type");
1822 }
1823
1824 return t;
1825 }
1826
1827
1828 /* Match an initialization expression. We work by first matching an
1829 expression, then reducing it to a constant. */
1830
1831 match
1832 gfc_match_init_expr (gfc_expr ** result)
1833 {
1834 gfc_expr *expr;
1835 match m;
1836 try t;
1837
1838 m = gfc_match_expr (&expr);
1839 if (m != MATCH_YES)
1840 return m;
1841
1842 gfc_init_expr = 1;
1843 t = gfc_resolve_expr (expr);
1844 if (t == SUCCESS)
1845 t = check_init_expr (expr);
1846 gfc_init_expr = 0;
1847
1848 if (t == FAILURE)
1849 {
1850 gfc_free_expr (expr);
1851 return MATCH_ERROR;
1852 }
1853
1854 if (expr->expr_type == EXPR_ARRAY
1855 && (gfc_check_constructor_type (expr) == FAILURE
1856 || gfc_expand_constructor (expr) == FAILURE))
1857 {
1858 gfc_free_expr (expr);
1859 return MATCH_ERROR;
1860 }
1861
1862 /* Not all inquiry functions are simplified to constant expressions
1863 so it is necessary to call check_inquiry again. */
1864 if (!gfc_is_constant_expr (expr)
1865 && check_inquiry (expr, 1) == FAILURE)
1866 {
1867 gfc_error ("Initialization expression didn't reduce %C");
1868 return MATCH_ERROR;
1869 }
1870
1871 *result = expr;
1872
1873 return MATCH_YES;
1874 }
1875
1876
1877
1878 static try check_restricted (gfc_expr *);
1879
1880 /* Given an actual argument list, test to see that each argument is a
1881 restricted expression and optionally if the expression type is
1882 integer or character. */
1883
1884 static try
1885 restricted_args (gfc_actual_arglist * a)
1886 {
1887 for (; a; a = a->next)
1888 {
1889 if (check_restricted (a->expr) == FAILURE)
1890 return FAILURE;
1891 }
1892
1893 return SUCCESS;
1894 }
1895
1896
1897 /************* Restricted/specification expressions *************/
1898
1899
1900 /* Make sure a non-intrinsic function is a specification function. */
1901
1902 static try
1903 external_spec_function (gfc_expr * e)
1904 {
1905 gfc_symbol *f;
1906
1907 f = e->value.function.esym;
1908
1909 if (f->attr.proc == PROC_ST_FUNCTION)
1910 {
1911 gfc_error ("Specification function '%s' at %L cannot be a statement "
1912 "function", f->name, &e->where);
1913 return FAILURE;
1914 }
1915
1916 if (f->attr.proc == PROC_INTERNAL)
1917 {
1918 gfc_error ("Specification function '%s' at %L cannot be an internal "
1919 "function", f->name, &e->where);
1920 return FAILURE;
1921 }
1922
1923 if (!f->attr.pure && !f->attr.elemental)
1924 {
1925 gfc_error ("Specification function '%s' at %L must be PURE", f->name,
1926 &e->where);
1927 return FAILURE;
1928 }
1929
1930 if (f->attr.recursive)
1931 {
1932 gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
1933 f->name, &e->where);
1934 return FAILURE;
1935 }
1936
1937 return restricted_args (e->value.function.actual);
1938 }
1939
1940
1941 /* Check to see that a function reference to an intrinsic is a
1942 restricted expression. */
1943
1944 static try
1945 restricted_intrinsic (gfc_expr * e)
1946 {
1947 /* TODO: Check constraints on inquiry functions. 7.1.6.2 (7). */
1948 if (check_inquiry (e, 0) == SUCCESS)
1949 return SUCCESS;
1950
1951 return restricted_args (e->value.function.actual);
1952 }
1953
1954
1955 /* Verify that an expression is a restricted expression. Like its
1956 cousin check_init_expr(), an error message is generated if we
1957 return FAILURE. */
1958
1959 static try
1960 check_restricted (gfc_expr * e)
1961 {
1962 gfc_symbol *sym;
1963 try t;
1964
1965 if (e == NULL)
1966 return SUCCESS;
1967
1968 switch (e->expr_type)
1969 {
1970 case EXPR_OP:
1971 t = check_intrinsic_op (e, check_restricted);
1972 if (t == SUCCESS)
1973 t = gfc_simplify_expr (e, 0);
1974
1975 break;
1976
1977 case EXPR_FUNCTION:
1978 t = e->value.function.esym ?
1979 external_spec_function (e) : restricted_intrinsic (e);
1980
1981 break;
1982
1983 case EXPR_VARIABLE:
1984 sym = e->symtree->n.sym;
1985 t = FAILURE;
1986
1987 if (sym->attr.optional)
1988 {
1989 gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
1990 sym->name, &e->where);
1991 break;
1992 }
1993
1994 if (sym->attr.intent == INTENT_OUT)
1995 {
1996 gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
1997 sym->name, &e->where);
1998 break;
1999 }
2000
2001 /* gfc_is_formal_arg broadcasts that a formal argument list is being processed
2002 in resolve.c(resolve_formal_arglist). This is done so that host associated
2003 dummy array indices are accepted (PR23446). */
2004 if (sym->attr.in_common
2005 || sym->attr.use_assoc
2006 || sym->attr.dummy
2007 || sym->ns != gfc_current_ns
2008 || (sym->ns->proc_name != NULL
2009 && sym->ns->proc_name->attr.flavor == FL_MODULE)
2010 || gfc_is_formal_arg ())
2011 {
2012 t = SUCCESS;
2013 break;
2014 }
2015
2016 gfc_error ("Variable '%s' cannot appear in the expression at %L",
2017 sym->name, &e->where);
2018
2019 break;
2020
2021 case EXPR_NULL:
2022 case EXPR_CONSTANT:
2023 t = SUCCESS;
2024 break;
2025
2026 case EXPR_SUBSTRING:
2027 t = gfc_specification_expr (e->ref->u.ss.start);
2028 if (t == FAILURE)
2029 break;
2030
2031 t = gfc_specification_expr (e->ref->u.ss.end);
2032 if (t == SUCCESS)
2033 t = gfc_simplify_expr (e, 0);
2034
2035 break;
2036
2037 case EXPR_STRUCTURE:
2038 t = gfc_check_constructor (e, check_restricted);
2039 break;
2040
2041 case EXPR_ARRAY:
2042 t = gfc_check_constructor (e, check_restricted);
2043 break;
2044
2045 default:
2046 gfc_internal_error ("check_restricted(): Unknown expression type");
2047 }
2048
2049 return t;
2050 }
2051
2052
2053 /* Check to see that an expression is a specification expression. If
2054 we return FAILURE, an error has been generated. */
2055
2056 try
2057 gfc_specification_expr (gfc_expr * e)
2058 {
2059 if (e == NULL)
2060 return SUCCESS;
2061
2062 if (e->ts.type != BT_INTEGER)
2063 {
2064 gfc_error ("Expression at %L must be of INTEGER type", &e->where);
2065 return FAILURE;
2066 }
2067
2068 if (e->rank != 0)
2069 {
2070 gfc_error ("Expression at %L must be scalar", &e->where);
2071 return FAILURE;
2072 }
2073
2074 if (gfc_simplify_expr (e, 0) == FAILURE)
2075 return FAILURE;
2076
2077 return check_restricted (e);
2078 }
2079
2080
2081 /************** Expression conformance checks. *************/
2082
2083 /* Given two expressions, make sure that the arrays are conformable. */
2084
2085 try
2086 gfc_check_conformance (const char *optype_msgid,
2087 gfc_expr * op1, gfc_expr * op2)
2088 {
2089 int op1_flag, op2_flag, d;
2090 mpz_t op1_size, op2_size;
2091 try t;
2092
2093 if (op1->rank == 0 || op2->rank == 0)
2094 return SUCCESS;
2095
2096 if (op1->rank != op2->rank)
2097 {
2098 gfc_error ("Incompatible ranks in %s at %L", _(optype_msgid),
2099 &op1->where);
2100 return FAILURE;
2101 }
2102
2103 t = SUCCESS;
2104
2105 for (d = 0; d < op1->rank; d++)
2106 {
2107 op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2108 op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2109
2110 if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2111 {
2112 gfc_error ("different shape for %s at %L on dimension %d (%d/%d)",
2113 _(optype_msgid), &op1->where, d + 1,
2114 (int) mpz_get_si (op1_size),
2115 (int) mpz_get_si (op2_size));
2116
2117 t = FAILURE;
2118 }
2119
2120 if (op1_flag)
2121 mpz_clear (op1_size);
2122 if (op2_flag)
2123 mpz_clear (op2_size);
2124
2125 if (t == FAILURE)
2126 return FAILURE;
2127 }
2128
2129 return SUCCESS;
2130 }
2131
2132
2133 /* Given an assignable expression and an arbitrary expression, make
2134 sure that the assignment can take place. */
2135
2136 try
2137 gfc_check_assign (gfc_expr * lvalue, gfc_expr * rvalue, int conform)
2138 {
2139 gfc_symbol *sym;
2140
2141 sym = lvalue->symtree->n.sym;
2142
2143 if (sym->attr.intent == INTENT_IN)
2144 {
2145 gfc_error ("Can't assign to INTENT(IN) variable '%s' at %L",
2146 sym->name, &lvalue->where);
2147 return FAILURE;
2148 }
2149
2150 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2151 variable local to a function subprogram. Its existence begins when
2152 execution of the function is initiated and ends when execution of the
2153 function is terminated.....
2154 Therefore, the left hand side is no longer a varaiable, when it is:*/
2155 if (sym->attr.flavor == FL_PROCEDURE
2156 && sym->attr.proc != PROC_ST_FUNCTION
2157 && !sym->attr.external)
2158 {
2159 bool bad_proc;
2160 bad_proc = false;
2161
2162 /* (i) Use associated; */
2163 if (sym->attr.use_assoc)
2164 bad_proc = true;
2165
2166 /* (ii) The assignment is in the main program; or */
2167 if (gfc_current_ns->proc_name->attr.is_main_program)
2168 bad_proc = true;
2169
2170 /* (iii) A module or internal procedure.... */
2171 if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2172 || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2173 && gfc_current_ns->parent
2174 && (!(gfc_current_ns->parent->proc_name->attr.function
2175 || gfc_current_ns->parent->proc_name->attr.subroutine)
2176 || gfc_current_ns->parent->proc_name->attr.is_main_program))
2177 {
2178 /* .... that is not a function.... */
2179 if (!gfc_current_ns->proc_name->attr.function)
2180 bad_proc = true;
2181
2182 /* .... or is not an entry and has a different name. */
2183 if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2184 bad_proc = true;
2185 }
2186
2187 if (bad_proc)
2188 {
2189 gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2190 return FAILURE;
2191 }
2192 }
2193
2194 if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2195 {
2196 gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2197 lvalue->rank, rvalue->rank, &lvalue->where);
2198 return FAILURE;
2199 }
2200
2201 if (lvalue->ts.type == BT_UNKNOWN)
2202 {
2203 gfc_error ("Variable type is UNKNOWN in assignment at %L",
2204 &lvalue->where);
2205 return FAILURE;
2206 }
2207
2208 if (rvalue->expr_type == EXPR_NULL)
2209 {
2210 gfc_error ("NULL appears on right-hand side in assignment at %L",
2211 &rvalue->where);
2212 return FAILURE;
2213 }
2214
2215 if (sym->attr.cray_pointee
2216 && lvalue->ref != NULL
2217 && lvalue->ref->u.ar.type == AR_FULL
2218 && lvalue->ref->u.ar.as->cp_was_assumed)
2219 {
2220 gfc_error ("Vector assignment to assumed-size Cray Pointee at %L"
2221 " is illegal.", &lvalue->where);
2222 return FAILURE;
2223 }
2224
2225 /* This is possibly a typo: x = f() instead of x => f() */
2226 if (gfc_option.warn_surprising
2227 && rvalue->expr_type == EXPR_FUNCTION
2228 && rvalue->symtree->n.sym->attr.pointer)
2229 gfc_warning ("POINTER valued function appears on right-hand side of "
2230 "assignment at %L", &rvalue->where);
2231
2232 /* Check size of array assignments. */
2233 if (lvalue->rank != 0 && rvalue->rank != 0
2234 && gfc_check_conformance ("Array assignment", lvalue, rvalue) != SUCCESS)
2235 return FAILURE;
2236
2237 if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2238 return SUCCESS;
2239
2240 if (!conform)
2241 {
2242 /* Numeric can be converted to any other numeric. And Hollerith can be
2243 converted to any other type. */
2244 if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2245 || rvalue->ts.type == BT_HOLLERITH)
2246 return SUCCESS;
2247
2248 if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2249 return SUCCESS;
2250
2251 gfc_error ("Incompatible types in assignment at %L, %s to %s",
2252 &rvalue->where, gfc_typename (&rvalue->ts),
2253 gfc_typename (&lvalue->ts));
2254
2255 return FAILURE;
2256 }
2257
2258 return gfc_convert_type (rvalue, &lvalue->ts, 1);
2259 }
2260
2261
2262 /* Check that a pointer assignment is OK. We first check lvalue, and
2263 we only check rvalue if it's not an assignment to NULL() or a
2264 NULLIFY statement. */
2265
2266 try
2267 gfc_check_pointer_assign (gfc_expr * lvalue, gfc_expr * rvalue)
2268 {
2269 symbol_attribute attr;
2270 int is_pure;
2271
2272 if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN)
2273 {
2274 gfc_error ("Pointer assignment target is not a POINTER at %L",
2275 &lvalue->where);
2276 return FAILURE;
2277 }
2278
2279 if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
2280 && lvalue->symtree->n.sym->attr.use_assoc)
2281 {
2282 gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2283 "l-value since it is a procedure",
2284 lvalue->symtree->n.sym->name, &lvalue->where);
2285 return FAILURE;
2286 }
2287
2288 attr = gfc_variable_attr (lvalue, NULL);
2289 if (!attr.pointer)
2290 {
2291 gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2292 return FAILURE;
2293 }
2294
2295 is_pure = gfc_pure (NULL);
2296
2297 if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym))
2298 {
2299 gfc_error ("Bad pointer object in PURE procedure at %L",
2300 &lvalue->where);
2301 return FAILURE;
2302 }
2303
2304 /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2305 kind, etc for lvalue and rvalue must match, and rvalue must be a
2306 pure variable if we're in a pure function. */
2307 if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
2308 return SUCCESS;
2309
2310 if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
2311 {
2312 gfc_error ("Different types in pointer assignment at %L",
2313 &lvalue->where);
2314 return FAILURE;
2315 }
2316
2317 if (lvalue->ts.kind != rvalue->ts.kind)
2318 {
2319 gfc_error ("Different kind type parameters in pointer "
2320 "assignment at %L", &lvalue->where);
2321 return FAILURE;
2322 }
2323
2324 if (lvalue->rank != rvalue->rank)
2325 {
2326 gfc_error ("Different ranks in pointer assignment at %L",
2327 &lvalue->where);
2328 return FAILURE;
2329 }
2330
2331 /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X). */
2332 if (rvalue->expr_type == EXPR_NULL)
2333 return SUCCESS;
2334
2335 if (lvalue->ts.type == BT_CHARACTER
2336 && lvalue->ts.cl->length && rvalue->ts.cl->length
2337 && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
2338 rvalue->ts.cl->length)) == 1)
2339 {
2340 gfc_error ("Different character lengths in pointer "
2341 "assignment at %L", &lvalue->where);
2342 return FAILURE;
2343 }
2344
2345 attr = gfc_expr_attr (rvalue);
2346 if (!attr.target && !attr.pointer)
2347 {
2348 gfc_error ("Pointer assignment target is neither TARGET "
2349 "nor POINTER at %L", &rvalue->where);
2350 return FAILURE;
2351 }
2352
2353 if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
2354 {
2355 gfc_error ("Bad target in pointer assignment in PURE "
2356 "procedure at %L", &rvalue->where);
2357 }
2358
2359 if (gfc_has_vector_index (rvalue))
2360 {
2361 gfc_error ("Pointer assignment with vector subscript "
2362 "on rhs at %L", &rvalue->where);
2363 return FAILURE;
2364 }
2365
2366 return SUCCESS;
2367 }
2368
2369
2370 /* Relative of gfc_check_assign() except that the lvalue is a single
2371 symbol. Used for initialization assignments. */
2372
2373 try
2374 gfc_check_assign_symbol (gfc_symbol * sym, gfc_expr * rvalue)
2375 {
2376 gfc_expr lvalue;
2377 try r;
2378
2379 memset (&lvalue, '\0', sizeof (gfc_expr));
2380
2381 lvalue.expr_type = EXPR_VARIABLE;
2382 lvalue.ts = sym->ts;
2383 if (sym->as)
2384 lvalue.rank = sym->as->rank;
2385 lvalue.symtree = (gfc_symtree *)gfc_getmem (sizeof (gfc_symtree));
2386 lvalue.symtree->n.sym = sym;
2387 lvalue.where = sym->declared_at;
2388
2389 if (sym->attr.pointer)
2390 r = gfc_check_pointer_assign (&lvalue, rvalue);
2391 else
2392 r = gfc_check_assign (&lvalue, rvalue, 1);
2393
2394 gfc_free (lvalue.symtree);
2395
2396 return r;
2397 }
2398
2399
2400 /* Get an expression for a default initializer. */
2401
2402 gfc_expr *
2403 gfc_default_initializer (gfc_typespec *ts)
2404 {
2405 gfc_constructor *tail;
2406 gfc_expr *init;
2407 gfc_component *c;
2408
2409 init = NULL;
2410
2411 /* See if we have a default initializer. */
2412 for (c = ts->derived->components; c; c = c->next)
2413 {
2414 if (c->initializer && init == NULL)
2415 init = gfc_get_expr ();
2416 }
2417
2418 if (init == NULL)
2419 return NULL;
2420
2421 /* Build the constructor. */
2422 init->expr_type = EXPR_STRUCTURE;
2423 init->ts = *ts;
2424 init->where = ts->derived->declared_at;
2425 tail = NULL;
2426 for (c = ts->derived->components; c; c = c->next)
2427 {
2428 if (tail == NULL)
2429 init->value.constructor = tail = gfc_get_constructor ();
2430 else
2431 {
2432 tail->next = gfc_get_constructor ();
2433 tail = tail->next;
2434 }
2435
2436 if (c->initializer)
2437 tail->expr = gfc_copy_expr (c->initializer);
2438 }
2439 return init;
2440 }
2441
2442
2443 /* Given a symbol, create an expression node with that symbol as a
2444 variable. If the symbol is array valued, setup a reference of the
2445 whole array. */
2446
2447 gfc_expr *
2448 gfc_get_variable_expr (gfc_symtree * var)
2449 {
2450 gfc_expr *e;
2451
2452 e = gfc_get_expr ();
2453 e->expr_type = EXPR_VARIABLE;
2454 e->symtree = var;
2455 e->ts = var->n.sym->ts;
2456
2457 if (var->n.sym->as != NULL)
2458 {
2459 e->rank = var->n.sym->as->rank;
2460 e->ref = gfc_get_ref ();
2461 e->ref->type = REF_ARRAY;
2462 e->ref->u.ar.type = AR_FULL;
2463 }
2464
2465 return e;
2466 }
2467
2468
2469 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
2470
2471 void
2472 gfc_expr_set_symbols_referenced (gfc_expr * expr)
2473 {
2474 gfc_actual_arglist *arg;
2475 gfc_constructor *c;
2476 gfc_ref *ref;
2477 int i;
2478
2479 if (!expr) return;
2480
2481 switch (expr->expr_type)
2482 {
2483 case EXPR_OP:
2484 gfc_expr_set_symbols_referenced (expr->value.op.op1);
2485 gfc_expr_set_symbols_referenced (expr->value.op.op2);
2486 break;
2487
2488 case EXPR_FUNCTION:
2489 for (arg = expr->value.function.actual; arg; arg = arg->next)
2490 gfc_expr_set_symbols_referenced (arg->expr);
2491 break;
2492
2493 case EXPR_VARIABLE:
2494 gfc_set_sym_referenced (expr->symtree->n.sym);
2495 break;
2496
2497 case EXPR_CONSTANT:
2498 case EXPR_NULL:
2499 case EXPR_SUBSTRING:
2500 break;
2501
2502 case EXPR_STRUCTURE:
2503 case EXPR_ARRAY:
2504 for (c = expr->value.constructor; c; c = c->next)
2505 gfc_expr_set_symbols_referenced (c->expr);
2506 break;
2507
2508 default:
2509 gcc_unreachable ();
2510 break;
2511 }
2512
2513 for (ref = expr->ref; ref; ref = ref->next)
2514 switch (ref->type)
2515 {
2516 case REF_ARRAY:
2517 for (i = 0; i < ref->u.ar.dimen; i++)
2518 {
2519 gfc_expr_set_symbols_referenced (ref->u.ar.start[i]);
2520 gfc_expr_set_symbols_referenced (ref->u.ar.end[i]);
2521 gfc_expr_set_symbols_referenced (ref->u.ar.stride[i]);
2522 }
2523 break;
2524
2525 case REF_COMPONENT:
2526 break;
2527
2528 case REF_SUBSTRING:
2529 gfc_expr_set_symbols_referenced (ref->u.ss.start);
2530 gfc_expr_set_symbols_referenced (ref->u.ss.end);
2531 break;
2532
2533 default:
2534 gcc_unreachable ();
2535 break;
2536 }
2537 }