re PR fortran/35059 (Seg fault when max constructor limit reached)
[gcc.git] / gcc / fortran / expr.c
1 /* Routines for manipulation of expression nodes.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software 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 3, 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 COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 #include "config.h"
23 #include "system.h"
24 #include "gfortran.h"
25 #include "arith.h"
26 #include "match.h"
27 #include "target-memory.h" /* for gfc_convert_boz */
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 gfc_clear_ts (&e->ts);
38 e->shape = NULL;
39 e->ref = NULL;
40 e->symtree = NULL;
41 e->con_by_offset = NULL;
42 return e;
43 }
44
45
46 /* Free an argument list and everything below it. */
47
48 void
49 gfc_free_actual_arglist (gfc_actual_arglist *a1)
50 {
51 gfc_actual_arglist *a2;
52
53 while (a1)
54 {
55 a2 = a1->next;
56 gfc_free_expr (a1->expr);
57 gfc_free (a1);
58 a1 = a2;
59 }
60 }
61
62
63 /* Copy an arglist structure and all of the arguments. */
64
65 gfc_actual_arglist *
66 gfc_copy_actual_arglist (gfc_actual_arglist *p)
67 {
68 gfc_actual_arglist *head, *tail, *new;
69
70 head = tail = NULL;
71
72 for (; p; p = p->next)
73 {
74 new = gfc_get_actual_arglist ();
75 *new = *p;
76
77 new->expr = gfc_copy_expr (p->expr);
78 new->next = NULL;
79
80 if (head == NULL)
81 head = new;
82 else
83 tail->next = new;
84
85 tail = new;
86 }
87
88 return head;
89 }
90
91
92 /* Free a list of reference structures. */
93
94 void
95 gfc_free_ref_list (gfc_ref *p)
96 {
97 gfc_ref *q;
98 int i;
99
100 for (; p; p = q)
101 {
102 q = p->next;
103
104 switch (p->type)
105 {
106 case REF_ARRAY:
107 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
108 {
109 gfc_free_expr (p->u.ar.start[i]);
110 gfc_free_expr (p->u.ar.end[i]);
111 gfc_free_expr (p->u.ar.stride[i]);
112 }
113
114 break;
115
116 case REF_SUBSTRING:
117 gfc_free_expr (p->u.ss.start);
118 gfc_free_expr (p->u.ss.end);
119 break;
120
121 case REF_COMPONENT:
122 break;
123 }
124
125 gfc_free (p);
126 }
127 }
128
129
130 /* Workhorse function for gfc_free_expr() that frees everything
131 beneath an expression node, but not the node itself. This is
132 useful when we want to simplify a node and replace it with
133 something else or the expression node belongs to another structure. */
134
135 static void
136 free_expr0 (gfc_expr *e)
137 {
138 int n;
139
140 switch (e->expr_type)
141 {
142 case EXPR_CONSTANT:
143 /* Free any parts of the value that need freeing. */
144 switch (e->ts.type)
145 {
146 case BT_INTEGER:
147 mpz_clear (e->value.integer);
148 break;
149
150 case BT_REAL:
151 mpfr_clear (e->value.real);
152 break;
153
154 case BT_CHARACTER:
155 gfc_free (e->value.character.string);
156 break;
157
158 case BT_COMPLEX:
159 mpfr_clear (e->value.complex.r);
160 mpfr_clear (e->value.complex.i);
161 break;
162
163 default:
164 break;
165 }
166
167 /* Free the representation, except in character constants where it
168 is the same as value.character.string and thus already freed. */
169 if (e->representation.string && e->ts.type != BT_CHARACTER)
170 gfc_free (e->representation.string);
171
172 break;
173
174 case EXPR_OP:
175 if (e->value.op.op1 != NULL)
176 gfc_free_expr (e->value.op.op1);
177 if (e->value.op.op2 != NULL)
178 gfc_free_expr (e->value.op.op2);
179 break;
180
181 case EXPR_FUNCTION:
182 gfc_free_actual_arglist (e->value.function.actual);
183 break;
184
185 case EXPR_VARIABLE:
186 break;
187
188 case EXPR_ARRAY:
189 case EXPR_STRUCTURE:
190 gfc_free_constructor (e->value.constructor);
191 break;
192
193 case EXPR_SUBSTRING:
194 gfc_free (e->value.character.string);
195 break;
196
197 case EXPR_NULL:
198 break;
199
200 default:
201 gfc_internal_error ("free_expr0(): Bad expr type");
202 }
203
204 /* Free a shape array. */
205 if (e->shape != NULL)
206 {
207 for (n = 0; n < e->rank; n++)
208 mpz_clear (e->shape[n]);
209
210 gfc_free (e->shape);
211 }
212
213 gfc_free_ref_list (e->ref);
214
215 memset (e, '\0', sizeof (gfc_expr));
216 }
217
218
219 /* Free an expression node and everything beneath it. */
220
221 void
222 gfc_free_expr (gfc_expr *e)
223 {
224 if (e == NULL)
225 return;
226 if (e->con_by_offset)
227 splay_tree_delete (e->con_by_offset);
228 free_expr0 (e);
229 gfc_free (e);
230 }
231
232
233 /* Graft the *src expression onto the *dest subexpression. */
234
235 void
236 gfc_replace_expr (gfc_expr *dest, gfc_expr *src)
237 {
238 free_expr0 (dest);
239 *dest = *src;
240 gfc_free (src);
241 }
242
243
244 /* Try to extract an integer constant from the passed expression node.
245 Returns an error message or NULL if the result is set. It is
246 tempting to generate an error and return SUCCESS or FAILURE, but
247 failure is OK for some callers. */
248
249 const char *
250 gfc_extract_int (gfc_expr *expr, int *result)
251 {
252 if (expr->expr_type != EXPR_CONSTANT)
253 return _("Constant expression required at %C");
254
255 if (expr->ts.type != BT_INTEGER)
256 return _("Integer expression required at %C");
257
258 if ((mpz_cmp_si (expr->value.integer, INT_MAX) > 0)
259 || (mpz_cmp_si (expr->value.integer, INT_MIN) < 0))
260 {
261 return _("Integer value too large in expression at %C");
262 }
263
264 *result = (int) mpz_get_si (expr->value.integer);
265
266 return NULL;
267 }
268
269
270 /* Recursively copy a list of reference structures. */
271
272 static gfc_ref *
273 copy_ref (gfc_ref *src)
274 {
275 gfc_array_ref *ar;
276 gfc_ref *dest;
277
278 if (src == NULL)
279 return NULL;
280
281 dest = gfc_get_ref ();
282 dest->type = src->type;
283
284 switch (src->type)
285 {
286 case REF_ARRAY:
287 ar = gfc_copy_array_ref (&src->u.ar);
288 dest->u.ar = *ar;
289 gfc_free (ar);
290 break;
291
292 case REF_COMPONENT:
293 dest->u.c = src->u.c;
294 break;
295
296 case REF_SUBSTRING:
297 dest->u.ss = src->u.ss;
298 dest->u.ss.start = gfc_copy_expr (src->u.ss.start);
299 dest->u.ss.end = gfc_copy_expr (src->u.ss.end);
300 break;
301 }
302
303 dest->next = copy_ref (src->next);
304
305 return dest;
306 }
307
308
309 /* Detect whether an expression has any vector index array references. */
310
311 int
312 gfc_has_vector_index (gfc_expr *e)
313 {
314 gfc_ref *ref;
315 int i;
316 for (ref = e->ref; ref; ref = ref->next)
317 if (ref->type == REF_ARRAY)
318 for (i = 0; i < ref->u.ar.dimen; i++)
319 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
320 return 1;
321 return 0;
322 }
323
324
325 /* Copy a shape array. */
326
327 mpz_t *
328 gfc_copy_shape (mpz_t *shape, int rank)
329 {
330 mpz_t *new_shape;
331 int n;
332
333 if (shape == NULL)
334 return NULL;
335
336 new_shape = gfc_get_shape (rank);
337
338 for (n = 0; n < rank; n++)
339 mpz_init_set (new_shape[n], shape[n]);
340
341 return new_shape;
342 }
343
344
345 /* Copy a shape array excluding dimension N, where N is an integer
346 constant expression. Dimensions are numbered in fortran style --
347 starting with ONE.
348
349 So, if the original shape array contains R elements
350 { s1 ... sN-1 sN sN+1 ... sR-1 sR}
351 the result contains R-1 elements:
352 { s1 ... sN-1 sN+1 ... sR-1}
353
354 If anything goes wrong -- N is not a constant, its value is out
355 of range -- or anything else, just returns NULL. */
356
357 mpz_t *
358 gfc_copy_shape_excluding (mpz_t *shape, int rank, gfc_expr *dim)
359 {
360 mpz_t *new_shape, *s;
361 int i, n;
362
363 if (shape == NULL
364 || rank <= 1
365 || dim == NULL
366 || dim->expr_type != EXPR_CONSTANT
367 || dim->ts.type != BT_INTEGER)
368 return NULL;
369
370 n = mpz_get_si (dim->value.integer);
371 n--; /* Convert to zero based index. */
372 if (n < 0 || n >= rank)
373 return NULL;
374
375 s = new_shape = gfc_get_shape (rank - 1);
376
377 for (i = 0; i < rank; i++)
378 {
379 if (i == n)
380 continue;
381 mpz_init_set (*s, shape[i]);
382 s++;
383 }
384
385 return new_shape;
386 }
387
388
389 /* Given an expression pointer, return a copy of the expression. This
390 subroutine is recursive. */
391
392 gfc_expr *
393 gfc_copy_expr (gfc_expr *p)
394 {
395 gfc_expr *q;
396 char *s;
397
398 if (p == NULL)
399 return NULL;
400
401 q = gfc_get_expr ();
402 *q = *p;
403
404 switch (q->expr_type)
405 {
406 case EXPR_SUBSTRING:
407 s = gfc_getmem (p->value.character.length + 1);
408 q->value.character.string = s;
409
410 memcpy (s, p->value.character.string, p->value.character.length + 1);
411 break;
412
413 case EXPR_CONSTANT:
414 /* Copy target representation, if it exists. */
415 if (p->representation.string)
416 {
417 s = gfc_getmem (p->representation.length + 1);
418 q->representation.string = s;
419
420 memcpy (s, p->representation.string, p->representation.length + 1);
421 }
422
423 /* Copy the values of any pointer components of p->value. */
424 switch (q->ts.type)
425 {
426 case BT_INTEGER:
427 mpz_init_set (q->value.integer, p->value.integer);
428 break;
429
430 case BT_REAL:
431 gfc_set_model_kind (q->ts.kind);
432 mpfr_init (q->value.real);
433 mpfr_set (q->value.real, p->value.real, GFC_RND_MODE);
434 break;
435
436 case BT_COMPLEX:
437 gfc_set_model_kind (q->ts.kind);
438 mpfr_init (q->value.complex.r);
439 mpfr_init (q->value.complex.i);
440 mpfr_set (q->value.complex.r, p->value.complex.r, GFC_RND_MODE);
441 mpfr_set (q->value.complex.i, p->value.complex.i, GFC_RND_MODE);
442 break;
443
444 case BT_CHARACTER:
445 if (p->representation.string)
446 q->value.character.string = q->representation.string;
447 else
448 {
449 s = gfc_getmem (p->value.character.length + 1);
450 q->value.character.string = s;
451
452 /* This is the case for the C_NULL_CHAR named constant. */
453 if (p->value.character.length == 0
454 && (p->ts.is_c_interop || p->ts.is_iso_c))
455 {
456 *s = '\0';
457 /* Need to set the length to 1 to make sure the NUL
458 terminator is copied. */
459 q->value.character.length = 1;
460 }
461 else
462 memcpy (s, p->value.character.string,
463 p->value.character.length + 1);
464 }
465 break;
466
467 case BT_HOLLERITH:
468 case BT_LOGICAL:
469 case BT_DERIVED:
470 break; /* Already done. */
471
472 case BT_PROCEDURE:
473 case BT_VOID:
474 /* Should never be reached. */
475 case BT_UNKNOWN:
476 gfc_internal_error ("gfc_copy_expr(): Bad expr node");
477 /* Not reached. */
478 }
479
480 break;
481
482 case EXPR_OP:
483 switch (q->value.op.operator)
484 {
485 case INTRINSIC_NOT:
486 case INTRINSIC_PARENTHESES:
487 case INTRINSIC_UPLUS:
488 case INTRINSIC_UMINUS:
489 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
490 break;
491
492 default: /* Binary operators. */
493 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
494 q->value.op.op2 = gfc_copy_expr (p->value.op.op2);
495 break;
496 }
497
498 break;
499
500 case EXPR_FUNCTION:
501 q->value.function.actual =
502 gfc_copy_actual_arglist (p->value.function.actual);
503 break;
504
505 case EXPR_STRUCTURE:
506 case EXPR_ARRAY:
507 q->value.constructor = gfc_copy_constructor (p->value.constructor);
508 break;
509
510 case EXPR_VARIABLE:
511 case EXPR_NULL:
512 break;
513 }
514
515 q->shape = gfc_copy_shape (p->shape, p->rank);
516
517 q->ref = copy_ref (p->ref);
518
519 return q;
520 }
521
522
523 /* Return the maximum kind of two expressions. In general, higher
524 kind numbers mean more precision for numeric types. */
525
526 int
527 gfc_kind_max (gfc_expr *e1, gfc_expr *e2)
528 {
529 return (e1->ts.kind > e2->ts.kind) ? e1->ts.kind : e2->ts.kind;
530 }
531
532
533 /* Returns nonzero if the type is numeric, zero otherwise. */
534
535 static int
536 numeric_type (bt type)
537 {
538 return type == BT_COMPLEX || type == BT_REAL || type == BT_INTEGER;
539 }
540
541
542 /* Returns nonzero if the typespec is a numeric type, zero otherwise. */
543
544 int
545 gfc_numeric_ts (gfc_typespec *ts)
546 {
547 return numeric_type (ts->type);
548 }
549
550
551 /* Returns an expression node that is an integer constant. */
552
553 gfc_expr *
554 gfc_int_expr (int i)
555 {
556 gfc_expr *p;
557
558 p = gfc_get_expr ();
559
560 p->expr_type = EXPR_CONSTANT;
561 p->ts.type = BT_INTEGER;
562 p->ts.kind = gfc_default_integer_kind;
563
564 p->where = gfc_current_locus;
565 mpz_init_set_si (p->value.integer, i);
566
567 return p;
568 }
569
570
571 /* Returns an expression node that is a logical constant. */
572
573 gfc_expr *
574 gfc_logical_expr (int i, locus *where)
575 {
576 gfc_expr *p;
577
578 p = gfc_get_expr ();
579
580 p->expr_type = EXPR_CONSTANT;
581 p->ts.type = BT_LOGICAL;
582 p->ts.kind = gfc_default_logical_kind;
583
584 if (where == NULL)
585 where = &gfc_current_locus;
586 p->where = *where;
587 p->value.logical = i;
588
589 return p;
590 }
591
592
593 /* Return an expression node with an optional argument list attached.
594 A variable number of gfc_expr pointers are strung together in an
595 argument list with a NULL pointer terminating the list. */
596
597 gfc_expr *
598 gfc_build_conversion (gfc_expr *e)
599 {
600 gfc_expr *p;
601
602 p = gfc_get_expr ();
603 p->expr_type = EXPR_FUNCTION;
604 p->symtree = NULL;
605 p->value.function.actual = NULL;
606
607 p->value.function.actual = gfc_get_actual_arglist ();
608 p->value.function.actual->expr = e;
609
610 return p;
611 }
612
613
614 /* Given an expression node with some sort of numeric binary
615 expression, insert type conversions required to make the operands
616 have the same type.
617
618 The exception is that the operands of an exponential don't have to
619 have the same type. If possible, the base is promoted to the type
620 of the exponent. For example, 1**2.3 becomes 1.0**2.3, but
621 1.0**2 stays as it is. */
622
623 void
624 gfc_type_convert_binary (gfc_expr *e)
625 {
626 gfc_expr *op1, *op2;
627
628 op1 = e->value.op.op1;
629 op2 = e->value.op.op2;
630
631 if (op1->ts.type == BT_UNKNOWN || op2->ts.type == BT_UNKNOWN)
632 {
633 gfc_clear_ts (&e->ts);
634 return;
635 }
636
637 /* Kind conversions of same type. */
638 if (op1->ts.type == op2->ts.type)
639 {
640 if (op1->ts.kind == op2->ts.kind)
641 {
642 /* No type conversions. */
643 e->ts = op1->ts;
644 goto done;
645 }
646
647 if (op1->ts.kind > op2->ts.kind)
648 gfc_convert_type (op2, &op1->ts, 2);
649 else
650 gfc_convert_type (op1, &op2->ts, 2);
651
652 e->ts = op1->ts;
653 goto done;
654 }
655
656 /* Integer combined with real or complex. */
657 if (op2->ts.type == BT_INTEGER)
658 {
659 e->ts = op1->ts;
660
661 /* Special case for ** operator. */
662 if (e->value.op.operator == INTRINSIC_POWER)
663 goto done;
664
665 gfc_convert_type (e->value.op.op2, &e->ts, 2);
666 goto done;
667 }
668
669 if (op1->ts.type == BT_INTEGER)
670 {
671 e->ts = op2->ts;
672 gfc_convert_type (e->value.op.op1, &e->ts, 2);
673 goto done;
674 }
675
676 /* Real combined with complex. */
677 e->ts.type = BT_COMPLEX;
678 if (op1->ts.kind > op2->ts.kind)
679 e->ts.kind = op1->ts.kind;
680 else
681 e->ts.kind = op2->ts.kind;
682 if (op1->ts.type != BT_COMPLEX || op1->ts.kind != e->ts.kind)
683 gfc_convert_type (e->value.op.op1, &e->ts, 2);
684 if (op2->ts.type != BT_COMPLEX || op2->ts.kind != e->ts.kind)
685 gfc_convert_type (e->value.op.op2, &e->ts, 2);
686
687 done:
688 return;
689 }
690
691
692 static match
693 check_specification_function (gfc_expr *e)
694 {
695 gfc_symbol *sym;
696
697 if (!e->symtree)
698 return MATCH_NO;
699
700 sym = e->symtree->n.sym;
701
702 /* F95, 7.1.6.2; F2003, 7.1.7 */
703 if (sym
704 && sym->attr.function
705 && sym->attr.pure
706 && !sym->attr.intrinsic
707 && !sym->attr.recursive
708 && sym->attr.proc != PROC_INTERNAL
709 && sym->attr.proc != PROC_ST_FUNCTION
710 && sym->attr.proc != PROC_UNKNOWN
711 && sym->formal == NULL)
712 return MATCH_YES;
713
714 return MATCH_NO;
715 }
716
717 /* Function to determine if an expression is constant or not. This
718 function expects that the expression has already been simplified. */
719
720 int
721 gfc_is_constant_expr (gfc_expr *e)
722 {
723 gfc_constructor *c;
724 gfc_actual_arglist *arg;
725 int rv;
726
727 if (e == NULL)
728 return 1;
729
730 switch (e->expr_type)
731 {
732 case EXPR_OP:
733 rv = (gfc_is_constant_expr (e->value.op.op1)
734 && (e->value.op.op2 == NULL
735 || gfc_is_constant_expr (e->value.op.op2)));
736 break;
737
738 case EXPR_VARIABLE:
739 rv = 0;
740 break;
741
742 case EXPR_FUNCTION:
743 /* Specification functions are constant. */
744 if (check_specification_function (e) == MATCH_YES)
745 {
746 rv = 1;
747 break;
748 }
749
750 /* Call to intrinsic with at least one argument. */
751 rv = 0;
752 if (e->value.function.isym && e->value.function.actual)
753 {
754 for (arg = e->value.function.actual; arg; arg = arg->next)
755 {
756 if (!gfc_is_constant_expr (arg->expr))
757 break;
758 }
759 if (arg == NULL)
760 rv = 1;
761 }
762 break;
763
764 case EXPR_CONSTANT:
765 case EXPR_NULL:
766 rv = 1;
767 break;
768
769 case EXPR_SUBSTRING:
770 rv = e->ref == NULL || (gfc_is_constant_expr (e->ref->u.ss.start)
771 && gfc_is_constant_expr (e->ref->u.ss.end));
772 break;
773
774 case EXPR_STRUCTURE:
775 rv = 0;
776 for (c = e->value.constructor; c; c = c->next)
777 if (!gfc_is_constant_expr (c->expr))
778 break;
779
780 if (c == NULL)
781 rv = 1;
782 break;
783
784 case EXPR_ARRAY:
785 rv = gfc_constant_ac (e);
786 break;
787
788 default:
789 gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
790 }
791
792 return rv;
793 }
794
795
796 /* Is true if an array reference is followed by a component or substring
797 reference. */
798 bool
799 is_subref_array (gfc_expr * e)
800 {
801 gfc_ref * ref;
802 bool seen_array;
803
804 if (e->expr_type != EXPR_VARIABLE)
805 return false;
806
807 if (e->symtree->n.sym->attr.subref_array_pointer)
808 return true;
809
810 seen_array = false;
811 for (ref = e->ref; ref; ref = ref->next)
812 {
813 if (ref->type == REF_ARRAY
814 && ref->u.ar.type != AR_ELEMENT)
815 seen_array = true;
816
817 if (seen_array
818 && ref->type != REF_ARRAY)
819 return seen_array;
820 }
821 return false;
822 }
823
824
825 /* Try to collapse intrinsic expressions. */
826
827 static try
828 simplify_intrinsic_op (gfc_expr *p, int type)
829 {
830 gfc_intrinsic_op op;
831 gfc_expr *op1, *op2, *result;
832
833 if (p->value.op.operator == INTRINSIC_USER)
834 return SUCCESS;
835
836 op1 = p->value.op.op1;
837 op2 = p->value.op.op2;
838 op = p->value.op.operator;
839
840 if (gfc_simplify_expr (op1, type) == FAILURE)
841 return FAILURE;
842 if (gfc_simplify_expr (op2, type) == FAILURE)
843 return FAILURE;
844
845 if (!gfc_is_constant_expr (op1)
846 || (op2 != NULL && !gfc_is_constant_expr (op2)))
847 return SUCCESS;
848
849 /* Rip p apart. */
850 p->value.op.op1 = NULL;
851 p->value.op.op2 = NULL;
852
853 switch (op)
854 {
855 case INTRINSIC_PARENTHESES:
856 result = gfc_parentheses (op1);
857 break;
858
859 case INTRINSIC_UPLUS:
860 result = gfc_uplus (op1);
861 break;
862
863 case INTRINSIC_UMINUS:
864 result = gfc_uminus (op1);
865 break;
866
867 case INTRINSIC_PLUS:
868 result = gfc_add (op1, op2);
869 break;
870
871 case INTRINSIC_MINUS:
872 result = gfc_subtract (op1, op2);
873 break;
874
875 case INTRINSIC_TIMES:
876 result = gfc_multiply (op1, op2);
877 break;
878
879 case INTRINSIC_DIVIDE:
880 result = gfc_divide (op1, op2);
881 break;
882
883 case INTRINSIC_POWER:
884 result = gfc_power (op1, op2);
885 break;
886
887 case INTRINSIC_CONCAT:
888 result = gfc_concat (op1, op2);
889 break;
890
891 case INTRINSIC_EQ:
892 case INTRINSIC_EQ_OS:
893 result = gfc_eq (op1, op2, op);
894 break;
895
896 case INTRINSIC_NE:
897 case INTRINSIC_NE_OS:
898 result = gfc_ne (op1, op2, op);
899 break;
900
901 case INTRINSIC_GT:
902 case INTRINSIC_GT_OS:
903 result = gfc_gt (op1, op2, op);
904 break;
905
906 case INTRINSIC_GE:
907 case INTRINSIC_GE_OS:
908 result = gfc_ge (op1, op2, op);
909 break;
910
911 case INTRINSIC_LT:
912 case INTRINSIC_LT_OS:
913 result = gfc_lt (op1, op2, op);
914 break;
915
916 case INTRINSIC_LE:
917 case INTRINSIC_LE_OS:
918 result = gfc_le (op1, op2, op);
919 break;
920
921 case INTRINSIC_NOT:
922 result = gfc_not (op1);
923 break;
924
925 case INTRINSIC_AND:
926 result = gfc_and (op1, op2);
927 break;
928
929 case INTRINSIC_OR:
930 result = gfc_or (op1, op2);
931 break;
932
933 case INTRINSIC_EQV:
934 result = gfc_eqv (op1, op2);
935 break;
936
937 case INTRINSIC_NEQV:
938 result = gfc_neqv (op1, op2);
939 break;
940
941 default:
942 gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
943 }
944
945 if (result == NULL)
946 {
947 gfc_free_expr (op1);
948 gfc_free_expr (op2);
949 return FAILURE;
950 }
951
952 result->rank = p->rank;
953 result->where = p->where;
954 gfc_replace_expr (p, result);
955
956 return SUCCESS;
957 }
958
959
960 /* Subroutine to simplify constructor expressions. Mutually recursive
961 with gfc_simplify_expr(). */
962
963 static try
964 simplify_constructor (gfc_constructor *c, int type)
965 {
966 gfc_expr *p;
967
968 for (; c; c = c->next)
969 {
970 if (c->iterator
971 && (gfc_simplify_expr (c->iterator->start, type) == FAILURE
972 || gfc_simplify_expr (c->iterator->end, type) == FAILURE
973 || gfc_simplify_expr (c->iterator->step, type) == FAILURE))
974 return FAILURE;
975
976 if (c->expr)
977 {
978 /* Try and simplify a copy. Replace the original if successful
979 but keep going through the constructor at all costs. Not
980 doing so can make a dog's dinner of complicated things. */
981 p = gfc_copy_expr (c->expr);
982
983 if (gfc_simplify_expr (p, type) == FAILURE)
984 {
985 gfc_free_expr (p);
986 continue;
987 }
988
989 gfc_replace_expr (c->expr, p);
990 }
991 }
992
993 return SUCCESS;
994 }
995
996
997 /* Pull a single array element out of an array constructor. */
998
999 static try
1000 find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
1001 gfc_constructor **rval)
1002 {
1003 unsigned long nelemen;
1004 int i;
1005 mpz_t delta;
1006 mpz_t offset;
1007 mpz_t span;
1008 mpz_t tmp;
1009 gfc_expr *e;
1010 try t;
1011
1012 t = SUCCESS;
1013 e = NULL;
1014
1015 mpz_init_set_ui (offset, 0);
1016 mpz_init (delta);
1017 mpz_init (tmp);
1018 mpz_init_set_ui (span, 1);
1019 for (i = 0; i < ar->dimen; i++)
1020 {
1021 e = gfc_copy_expr (ar->start[i]);
1022 if (e->expr_type != EXPR_CONSTANT)
1023 {
1024 cons = NULL;
1025 goto depart;
1026 }
1027 /* Check the bounds. */
1028 if ((ar->as->upper[i]
1029 && ar->as->upper[i]->expr_type == EXPR_CONSTANT
1030 && mpz_cmp (e->value.integer,
1031 ar->as->upper[i]->value.integer) > 0)
1032 ||
1033 (ar->as->lower[i]->expr_type == EXPR_CONSTANT
1034 && mpz_cmp (e->value.integer,
1035 ar->as->lower[i]->value.integer) < 0))
1036 {
1037 gfc_error ("Index in dimension %d is out of bounds "
1038 "at %L", i + 1, &ar->c_where[i]);
1039 cons = NULL;
1040 t = FAILURE;
1041 goto depart;
1042 }
1043
1044 mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer);
1045 mpz_mul (delta, delta, span);
1046 mpz_add (offset, offset, delta);
1047
1048 mpz_set_ui (tmp, 1);
1049 mpz_add (tmp, tmp, ar->as->upper[i]->value.integer);
1050 mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
1051 mpz_mul (span, span, tmp);
1052 }
1053
1054 for (nelemen = mpz_get_ui (offset); nelemen > 0; nelemen--)
1055 {
1056 if (cons)
1057 {
1058 if (cons->iterator)
1059 {
1060 cons = NULL;
1061
1062 goto depart;
1063 }
1064 cons = cons->next;
1065 }
1066 }
1067
1068 depart:
1069 mpz_clear (delta);
1070 mpz_clear (offset);
1071 mpz_clear (span);
1072 mpz_clear (tmp);
1073 if (e)
1074 gfc_free_expr (e);
1075 *rval = cons;
1076 return t;
1077 }
1078
1079
1080 /* Find a component of a structure constructor. */
1081
1082 static gfc_constructor *
1083 find_component_ref (gfc_constructor *cons, gfc_ref *ref)
1084 {
1085 gfc_component *comp;
1086 gfc_component *pick;
1087
1088 comp = ref->u.c.sym->components;
1089 pick = ref->u.c.component;
1090 while (comp != pick)
1091 {
1092 comp = comp->next;
1093 cons = cons->next;
1094 }
1095
1096 return cons;
1097 }
1098
1099
1100 /* Replace an expression with the contents of a constructor, removing
1101 the subobject reference in the process. */
1102
1103 static void
1104 remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
1105 {
1106 gfc_expr *e;
1107
1108 e = cons->expr;
1109 cons->expr = NULL;
1110 e->ref = p->ref->next;
1111 p->ref->next = NULL;
1112 gfc_replace_expr (p, e);
1113 }
1114
1115
1116 /* Pull an array section out of an array constructor. */
1117
1118 static try
1119 find_array_section (gfc_expr *expr, gfc_ref *ref)
1120 {
1121 int idx;
1122 int rank;
1123 int d;
1124 int shape_i;
1125 long unsigned one = 1;
1126 bool incr_ctr;
1127 mpz_t start[GFC_MAX_DIMENSIONS];
1128 mpz_t end[GFC_MAX_DIMENSIONS];
1129 mpz_t stride[GFC_MAX_DIMENSIONS];
1130 mpz_t delta[GFC_MAX_DIMENSIONS];
1131 mpz_t ctr[GFC_MAX_DIMENSIONS];
1132 mpz_t delta_mpz;
1133 mpz_t tmp_mpz;
1134 mpz_t nelts;
1135 mpz_t ptr;
1136 mpz_t index;
1137 gfc_constructor *cons;
1138 gfc_constructor *base;
1139 gfc_expr *begin;
1140 gfc_expr *finish;
1141 gfc_expr *step;
1142 gfc_expr *upper;
1143 gfc_expr *lower;
1144 gfc_constructor *vecsub[GFC_MAX_DIMENSIONS], *c;
1145 try t;
1146
1147 t = SUCCESS;
1148
1149 base = expr->value.constructor;
1150 expr->value.constructor = NULL;
1151
1152 rank = ref->u.ar.as->rank;
1153
1154 if (expr->shape == NULL)
1155 expr->shape = gfc_get_shape (rank);
1156
1157 mpz_init_set_ui (delta_mpz, one);
1158 mpz_init_set_ui (nelts, one);
1159 mpz_init (tmp_mpz);
1160
1161 /* Do the initialization now, so that we can cleanup without
1162 keeping track of where we were. */
1163 for (d = 0; d < rank; d++)
1164 {
1165 mpz_init (delta[d]);
1166 mpz_init (start[d]);
1167 mpz_init (end[d]);
1168 mpz_init (ctr[d]);
1169 mpz_init (stride[d]);
1170 vecsub[d] = NULL;
1171 }
1172
1173 /* Build the counters to clock through the array reference. */
1174 shape_i = 0;
1175 for (d = 0; d < rank; d++)
1176 {
1177 /* Make this stretch of code easier on the eye! */
1178 begin = ref->u.ar.start[d];
1179 finish = ref->u.ar.end[d];
1180 step = ref->u.ar.stride[d];
1181 lower = ref->u.ar.as->lower[d];
1182 upper = ref->u.ar.as->upper[d];
1183
1184 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
1185 {
1186 gcc_assert (begin);
1187
1188 if (begin->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (begin))
1189 {
1190 t = FAILURE;
1191 goto cleanup;
1192 }
1193
1194 gcc_assert (begin->rank == 1);
1195 gcc_assert (begin->shape);
1196
1197 vecsub[d] = begin->value.constructor;
1198 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1199 mpz_mul (nelts, nelts, begin->shape[0]);
1200 mpz_set (expr->shape[shape_i++], begin->shape[0]);
1201
1202 /* Check bounds. */
1203 for (c = vecsub[d]; c; c = c->next)
1204 {
1205 if (mpz_cmp (c->expr->value.integer, upper->value.integer) > 0
1206 || mpz_cmp (c->expr->value.integer,
1207 lower->value.integer) < 0)
1208 {
1209 gfc_error ("index in dimension %d is out of bounds "
1210 "at %L", d + 1, &ref->u.ar.c_where[d]);
1211 t = FAILURE;
1212 goto cleanup;
1213 }
1214 }
1215 }
1216 else
1217 {
1218 if ((begin && begin->expr_type != EXPR_CONSTANT)
1219 || (finish && finish->expr_type != EXPR_CONSTANT)
1220 || (step && step->expr_type != EXPR_CONSTANT))
1221 {
1222 t = FAILURE;
1223 goto cleanup;
1224 }
1225
1226 /* Obtain the stride. */
1227 if (step)
1228 mpz_set (stride[d], step->value.integer);
1229 else
1230 mpz_set_ui (stride[d], one);
1231
1232 if (mpz_cmp_ui (stride[d], 0) == 0)
1233 mpz_set_ui (stride[d], one);
1234
1235 /* Obtain the start value for the index. */
1236 if (begin)
1237 mpz_set (start[d], begin->value.integer);
1238 else
1239 mpz_set (start[d], lower->value.integer);
1240
1241 mpz_set (ctr[d], start[d]);
1242
1243 /* Obtain the end value for the index. */
1244 if (finish)
1245 mpz_set (end[d], finish->value.integer);
1246 else
1247 mpz_set (end[d], upper->value.integer);
1248
1249 /* Separate 'if' because elements sometimes arrive with
1250 non-null end. */
1251 if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1252 mpz_set (end [d], begin->value.integer);
1253
1254 /* Check the bounds. */
1255 if (mpz_cmp (ctr[d], upper->value.integer) > 0
1256 || mpz_cmp (end[d], upper->value.integer) > 0
1257 || mpz_cmp (ctr[d], lower->value.integer) < 0
1258 || mpz_cmp (end[d], lower->value.integer) < 0)
1259 {
1260 gfc_error ("index in dimension %d is out of bounds "
1261 "at %L", d + 1, &ref->u.ar.c_where[d]);
1262 t = FAILURE;
1263 goto cleanup;
1264 }
1265
1266 /* Calculate the number of elements and the shape. */
1267 mpz_set (tmp_mpz, stride[d]);
1268 mpz_add (tmp_mpz, end[d], tmp_mpz);
1269 mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1270 mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1271 mpz_mul (nelts, nelts, tmp_mpz);
1272
1273 /* An element reference reduces the rank of the expression; don't
1274 add anything to the shape array. */
1275 if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT)
1276 mpz_set (expr->shape[shape_i++], tmp_mpz);
1277 }
1278
1279 /* Calculate the 'stride' (=delta) for conversion of the
1280 counter values into the index along the constructor. */
1281 mpz_set (delta[d], delta_mpz);
1282 mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1283 mpz_add_ui (tmp_mpz, tmp_mpz, one);
1284 mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1285 }
1286
1287 mpz_init (index);
1288 mpz_init (ptr);
1289 cons = base;
1290
1291 /* Now clock through the array reference, calculating the index in
1292 the source constructor and transferring the elements to the new
1293 constructor. */
1294 for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
1295 {
1296 if (ref->u.ar.offset)
1297 mpz_set (ptr, ref->u.ar.offset->value.integer);
1298 else
1299 mpz_init_set_ui (ptr, 0);
1300
1301 incr_ctr = true;
1302 for (d = 0; d < rank; d++)
1303 {
1304 mpz_set (tmp_mpz, ctr[d]);
1305 mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
1306 mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1307 mpz_add (ptr, ptr, tmp_mpz);
1308
1309 if (!incr_ctr) continue;
1310
1311 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
1312 {
1313 gcc_assert(vecsub[d]);
1314
1315 if (!vecsub[d]->next)
1316 vecsub[d] = ref->u.ar.start[d]->value.constructor;
1317 else
1318 {
1319 vecsub[d] = vecsub[d]->next;
1320 incr_ctr = false;
1321 }
1322 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1323 }
1324 else
1325 {
1326 mpz_add (ctr[d], ctr[d], stride[d]);
1327
1328 if (mpz_cmp_ui (stride[d], 0) > 0
1329 ? mpz_cmp (ctr[d], end[d]) > 0
1330 : mpz_cmp (ctr[d], end[d]) < 0)
1331 mpz_set (ctr[d], start[d]);
1332 else
1333 incr_ctr = false;
1334 }
1335 }
1336
1337 /* There must be a better way of dealing with negative strides
1338 than resetting the index and the constructor pointer! */
1339 if (mpz_cmp (ptr, index) < 0)
1340 {
1341 mpz_set_ui (index, 0);
1342 cons = base;
1343 }
1344
1345 while (cons && cons->next && mpz_cmp (ptr, index) > 0)
1346 {
1347 mpz_add_ui (index, index, one);
1348 cons = cons->next;
1349 }
1350
1351 gfc_append_constructor (expr, gfc_copy_expr (cons->expr));
1352 }
1353
1354 mpz_clear (ptr);
1355 mpz_clear (index);
1356
1357 cleanup:
1358
1359 mpz_clear (delta_mpz);
1360 mpz_clear (tmp_mpz);
1361 mpz_clear (nelts);
1362 for (d = 0; d < rank; d++)
1363 {
1364 mpz_clear (delta[d]);
1365 mpz_clear (start[d]);
1366 mpz_clear (end[d]);
1367 mpz_clear (ctr[d]);
1368 mpz_clear (stride[d]);
1369 }
1370 gfc_free_constructor (base);
1371 return t;
1372 }
1373
1374 /* Pull a substring out of an expression. */
1375
1376 static try
1377 find_substring_ref (gfc_expr *p, gfc_expr **newp)
1378 {
1379 int end;
1380 int start;
1381 int length;
1382 char *chr;
1383
1384 if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1385 || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1386 return FAILURE;
1387
1388 *newp = gfc_copy_expr (p);
1389 gfc_free ((*newp)->value.character.string);
1390
1391 end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer);
1392 start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer);
1393 length = end - start + 1;
1394
1395 chr = (*newp)->value.character.string = gfc_getmem (length + 1);
1396 (*newp)->value.character.length = length;
1397 memcpy (chr, &p->value.character.string[start - 1], length);
1398 chr[length] = '\0';
1399 return SUCCESS;
1400 }
1401
1402
1403
1404 /* Simplify a subobject reference of a constructor. This occurs when
1405 parameter variable values are substituted. */
1406
1407 static try
1408 simplify_const_ref (gfc_expr *p)
1409 {
1410 gfc_constructor *cons;
1411 gfc_expr *newp;
1412
1413 while (p->ref)
1414 {
1415 switch (p->ref->type)
1416 {
1417 case REF_ARRAY:
1418 switch (p->ref->u.ar.type)
1419 {
1420 case AR_ELEMENT:
1421 if (find_array_element (p->value.constructor, &p->ref->u.ar,
1422 &cons) == FAILURE)
1423 return FAILURE;
1424
1425 if (!cons)
1426 return SUCCESS;
1427
1428 remove_subobject_ref (p, cons);
1429 break;
1430
1431 case AR_SECTION:
1432 if (find_array_section (p, p->ref) == FAILURE)
1433 return FAILURE;
1434 p->ref->u.ar.type = AR_FULL;
1435
1436 /* Fall through. */
1437
1438 case AR_FULL:
1439 if (p->ref->next != NULL
1440 && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
1441 {
1442 cons = p->value.constructor;
1443 for (; cons; cons = cons->next)
1444 {
1445 cons->expr->ref = copy_ref (p->ref->next);
1446 simplify_const_ref (cons->expr);
1447 }
1448 }
1449 gfc_free_ref_list (p->ref);
1450 p->ref = NULL;
1451 break;
1452
1453 default:
1454 return SUCCESS;
1455 }
1456
1457 break;
1458
1459 case REF_COMPONENT:
1460 cons = find_component_ref (p->value.constructor, p->ref);
1461 remove_subobject_ref (p, cons);
1462 break;
1463
1464 case REF_SUBSTRING:
1465 if (find_substring_ref (p, &newp) == FAILURE)
1466 return FAILURE;
1467
1468 gfc_replace_expr (p, newp);
1469 gfc_free_ref_list (p->ref);
1470 p->ref = NULL;
1471 break;
1472 }
1473 }
1474
1475 return SUCCESS;
1476 }
1477
1478
1479 /* Simplify a chain of references. */
1480
1481 static try
1482 simplify_ref_chain (gfc_ref *ref, int type)
1483 {
1484 int n;
1485
1486 for (; ref; ref = ref->next)
1487 {
1488 switch (ref->type)
1489 {
1490 case REF_ARRAY:
1491 for (n = 0; n < ref->u.ar.dimen; n++)
1492 {
1493 if (gfc_simplify_expr (ref->u.ar.start[n], type) == FAILURE)
1494 return FAILURE;
1495 if (gfc_simplify_expr (ref->u.ar.end[n], type) == FAILURE)
1496 return FAILURE;
1497 if (gfc_simplify_expr (ref->u.ar.stride[n], type) == FAILURE)
1498 return FAILURE;
1499 }
1500 break;
1501
1502 case REF_SUBSTRING:
1503 if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1504 return FAILURE;
1505 if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1506 return FAILURE;
1507 break;
1508
1509 default:
1510 break;
1511 }
1512 }
1513 return SUCCESS;
1514 }
1515
1516
1517 /* Try to substitute the value of a parameter variable. */
1518
1519 static try
1520 simplify_parameter_variable (gfc_expr *p, int type)
1521 {
1522 gfc_expr *e;
1523 try t;
1524
1525 e = gfc_copy_expr (p->symtree->n.sym->value);
1526 if (e == NULL)
1527 return FAILURE;
1528
1529 e->rank = p->rank;
1530
1531 /* Do not copy subobject refs for constant. */
1532 if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1533 e->ref = copy_ref (p->ref);
1534 t = gfc_simplify_expr (e, type);
1535
1536 /* Only use the simplification if it eliminated all subobject references. */
1537 if (t == SUCCESS && !e->ref)
1538 gfc_replace_expr (p, e);
1539 else
1540 gfc_free_expr (e);
1541
1542 return t;
1543 }
1544
1545 /* Given an expression, simplify it by collapsing constant
1546 expressions. Most simplification takes place when the expression
1547 tree is being constructed. If an intrinsic function is simplified
1548 at some point, we get called again to collapse the result against
1549 other constants.
1550
1551 We work by recursively simplifying expression nodes, simplifying
1552 intrinsic functions where possible, which can lead to further
1553 constant collapsing. If an operator has constant operand(s), we
1554 rip the expression apart, and rebuild it, hoping that it becomes
1555 something simpler.
1556
1557 The expression type is defined for:
1558 0 Basic expression parsing
1559 1 Simplifying array constructors -- will substitute
1560 iterator values.
1561 Returns FAILURE on error, SUCCESS otherwise.
1562 NOTE: Will return SUCCESS even if the expression can not be simplified. */
1563
1564 try
1565 gfc_simplify_expr (gfc_expr *p, int type)
1566 {
1567 gfc_actual_arglist *ap;
1568
1569 if (p == NULL)
1570 return SUCCESS;
1571
1572 switch (p->expr_type)
1573 {
1574 case EXPR_CONSTANT:
1575 case EXPR_NULL:
1576 break;
1577
1578 case EXPR_FUNCTION:
1579 for (ap = p->value.function.actual; ap; ap = ap->next)
1580 if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1581 return FAILURE;
1582
1583 if (p->value.function.isym != NULL
1584 && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1585 return FAILURE;
1586
1587 break;
1588
1589 case EXPR_SUBSTRING:
1590 if (simplify_ref_chain (p->ref, type) == FAILURE)
1591 return FAILURE;
1592
1593 if (gfc_is_constant_expr (p))
1594 {
1595 char *s;
1596 int start, end;
1597
1598 if (p->ref && p->ref->u.ss.start)
1599 {
1600 gfc_extract_int (p->ref->u.ss.start, &start);
1601 start--; /* Convert from one-based to zero-based. */
1602 }
1603 else
1604 start = 0;
1605
1606 if (p->ref && p->ref->u.ss.end)
1607 gfc_extract_int (p->ref->u.ss.end, &end);
1608 else
1609 end = p->value.character.length;
1610
1611 s = gfc_getmem (end - start + 2);
1612 memcpy (s, p->value.character.string + start, end - start);
1613 s[end - start + 1] = '\0'; /* TODO: C-style string. */
1614 gfc_free (p->value.character.string);
1615 p->value.character.string = s;
1616 p->value.character.length = end - start;
1617 p->ts.cl = gfc_get_charlen ();
1618 p->ts.cl->next = gfc_current_ns->cl_list;
1619 gfc_current_ns->cl_list = p->ts.cl;
1620 p->ts.cl->length = gfc_int_expr (p->value.character.length);
1621 gfc_free_ref_list (p->ref);
1622 p->ref = NULL;
1623 p->expr_type = EXPR_CONSTANT;
1624 }
1625 break;
1626
1627 case EXPR_OP:
1628 if (simplify_intrinsic_op (p, type) == FAILURE)
1629 return FAILURE;
1630 break;
1631
1632 case EXPR_VARIABLE:
1633 /* Only substitute array parameter variables if we are in an
1634 initialization expression, or we want a subsection. */
1635 if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1636 && (gfc_init_expr || p->ref
1637 || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1638 {
1639 if (simplify_parameter_variable (p, type) == FAILURE)
1640 return FAILURE;
1641 break;
1642 }
1643
1644 if (type == 1)
1645 {
1646 gfc_simplify_iterator_var (p);
1647 }
1648
1649 /* Simplify subcomponent references. */
1650 if (simplify_ref_chain (p->ref, type) == FAILURE)
1651 return FAILURE;
1652
1653 break;
1654
1655 case EXPR_STRUCTURE:
1656 case EXPR_ARRAY:
1657 if (simplify_ref_chain (p->ref, type) == FAILURE)
1658 return FAILURE;
1659
1660 if (simplify_constructor (p->value.constructor, type) == FAILURE)
1661 return FAILURE;
1662
1663 if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1664 && p->ref->u.ar.type == AR_FULL)
1665 gfc_expand_constructor (p);
1666
1667 if (simplify_const_ref (p) == FAILURE)
1668 return FAILURE;
1669
1670 break;
1671 }
1672
1673 return SUCCESS;
1674 }
1675
1676
1677 /* Returns the type of an expression with the exception that iterator
1678 variables are automatically integers no matter what else they may
1679 be declared as. */
1680
1681 static bt
1682 et0 (gfc_expr *e)
1683 {
1684 if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1685 return BT_INTEGER;
1686
1687 return e->ts.type;
1688 }
1689
1690
1691 /* Check an intrinsic arithmetic operation to see if it is consistent
1692 with some type of expression. */
1693
1694 static try check_init_expr (gfc_expr *);
1695
1696
1697 /* Scalarize an expression for an elemental intrinsic call. */
1698
1699 static try
1700 scalarize_intrinsic_call (gfc_expr *e)
1701 {
1702 gfc_actual_arglist *a, *b;
1703 gfc_constructor *args[5], *ctor, *new_ctor;
1704 gfc_expr *expr, *old;
1705 int n, i, rank[5];
1706
1707 old = gfc_copy_expr (e);
1708
1709 /* Assume that the old expression carries the type information and
1710 that the first arg carries all the shape information. */
1711 expr = gfc_copy_expr (old->value.function.actual->expr);
1712 gfc_free_constructor (expr->value.constructor);
1713 expr->value.constructor = NULL;
1714
1715 expr->ts = old->ts;
1716 expr->expr_type = EXPR_ARRAY;
1717
1718 /* Copy the array argument constructors into an array, with nulls
1719 for the scalars. */
1720 n = 0;
1721 a = old->value.function.actual;
1722 for (; a; a = a->next)
1723 {
1724 /* Check that this is OK for an initialization expression. */
1725 if (a->expr && check_init_expr (a->expr) == FAILURE)
1726 goto cleanup;
1727
1728 rank[n] = 0;
1729 if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
1730 {
1731 rank[n] = a->expr->rank;
1732 ctor = a->expr->symtree->n.sym->value->value.constructor;
1733 args[n] = gfc_copy_constructor (ctor);
1734 }
1735 else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
1736 {
1737 if (a->expr->rank)
1738 rank[n] = a->expr->rank;
1739 else
1740 rank[n] = 1;
1741 args[n] = gfc_copy_constructor (a->expr->value.constructor);
1742 }
1743 else
1744 args[n] = NULL;
1745 n++;
1746 }
1747
1748 for (i = 1; i < n; i++)
1749 if (rank[i] && rank[i] != rank[0])
1750 goto compliance;
1751
1752 /* Using the first argument as the master, step through the array
1753 calling the function for each element and advancing the array
1754 constructors together. */
1755 ctor = args[0];
1756 new_ctor = NULL;
1757 for (; ctor; ctor = ctor->next)
1758 {
1759 if (expr->value.constructor == NULL)
1760 expr->value.constructor
1761 = new_ctor = gfc_get_constructor ();
1762 else
1763 {
1764 new_ctor->next = gfc_get_constructor ();
1765 new_ctor = new_ctor->next;
1766 }
1767 new_ctor->expr = gfc_copy_expr (old);
1768 gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
1769 a = NULL;
1770 b = old->value.function.actual;
1771 for (i = 0; i < n; i++)
1772 {
1773 if (a == NULL)
1774 new_ctor->expr->value.function.actual
1775 = a = gfc_get_actual_arglist ();
1776 else
1777 {
1778 a->next = gfc_get_actual_arglist ();
1779 a = a->next;
1780 }
1781 if (args[i])
1782 a->expr = gfc_copy_expr (args[i]->expr);
1783 else
1784 a->expr = gfc_copy_expr (b->expr);
1785
1786 b = b->next;
1787 }
1788
1789 /* Simplify the function calls. */
1790 if (gfc_simplify_expr (new_ctor->expr, 0) == FAILURE)
1791 goto cleanup;
1792
1793 for (i = 0; i < n; i++)
1794 if (args[i])
1795 args[i] = args[i]->next;
1796
1797 for (i = 1; i < n; i++)
1798 if (rank[i] && ((args[i] != NULL && args[0] == NULL)
1799 || (args[i] == NULL && args[0] != NULL)))
1800 goto compliance;
1801 }
1802
1803 free_expr0 (e);
1804 *e = *expr;
1805 gfc_free_expr (old);
1806 return SUCCESS;
1807
1808 compliance:
1809 gfc_error_now ("elemental function arguments at %C are not compliant");
1810
1811 cleanup:
1812 gfc_free_expr (expr);
1813 gfc_free_expr (old);
1814 return FAILURE;
1815 }
1816
1817
1818 static try
1819 check_intrinsic_op (gfc_expr *e, try (*check_function) (gfc_expr *))
1820 {
1821 gfc_expr *op1 = e->value.op.op1;
1822 gfc_expr *op2 = e->value.op.op2;
1823
1824 if ((*check_function) (op1) == FAILURE)
1825 return FAILURE;
1826
1827 switch (e->value.op.operator)
1828 {
1829 case INTRINSIC_UPLUS:
1830 case INTRINSIC_UMINUS:
1831 if (!numeric_type (et0 (op1)))
1832 goto not_numeric;
1833 break;
1834
1835 case INTRINSIC_EQ:
1836 case INTRINSIC_EQ_OS:
1837 case INTRINSIC_NE:
1838 case INTRINSIC_NE_OS:
1839 case INTRINSIC_GT:
1840 case INTRINSIC_GT_OS:
1841 case INTRINSIC_GE:
1842 case INTRINSIC_GE_OS:
1843 case INTRINSIC_LT:
1844 case INTRINSIC_LT_OS:
1845 case INTRINSIC_LE:
1846 case INTRINSIC_LE_OS:
1847 if ((*check_function) (op2) == FAILURE)
1848 return FAILURE;
1849
1850 if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1851 && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
1852 {
1853 gfc_error ("Numeric or CHARACTER operands are required in "
1854 "expression at %L", &e->where);
1855 return FAILURE;
1856 }
1857 break;
1858
1859 case INTRINSIC_PLUS:
1860 case INTRINSIC_MINUS:
1861 case INTRINSIC_TIMES:
1862 case INTRINSIC_DIVIDE:
1863 case INTRINSIC_POWER:
1864 if ((*check_function) (op2) == FAILURE)
1865 return FAILURE;
1866
1867 if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
1868 goto not_numeric;
1869
1870 if (e->value.op.operator == INTRINSIC_POWER
1871 && check_function == check_init_expr && et0 (op2) != BT_INTEGER)
1872 {
1873 if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Noninteger "
1874 "exponent in an initialization "
1875 "expression at %L", &op2->where)
1876 == FAILURE)
1877 return FAILURE;
1878 }
1879
1880 break;
1881
1882 case INTRINSIC_CONCAT:
1883 if ((*check_function) (op2) == FAILURE)
1884 return FAILURE;
1885
1886 if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
1887 {
1888 gfc_error ("Concatenation operator in expression at %L "
1889 "must have two CHARACTER operands", &op1->where);
1890 return FAILURE;
1891 }
1892
1893 if (op1->ts.kind != op2->ts.kind)
1894 {
1895 gfc_error ("Concat operator at %L must concatenate strings of the "
1896 "same kind", &e->where);
1897 return FAILURE;
1898 }
1899
1900 break;
1901
1902 case INTRINSIC_NOT:
1903 if (et0 (op1) != BT_LOGICAL)
1904 {
1905 gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
1906 "operand", &op1->where);
1907 return FAILURE;
1908 }
1909
1910 break;
1911
1912 case INTRINSIC_AND:
1913 case INTRINSIC_OR:
1914 case INTRINSIC_EQV:
1915 case INTRINSIC_NEQV:
1916 if ((*check_function) (op2) == FAILURE)
1917 return FAILURE;
1918
1919 if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
1920 {
1921 gfc_error ("LOGICAL operands are required in expression at %L",
1922 &e->where);
1923 return FAILURE;
1924 }
1925
1926 break;
1927
1928 case INTRINSIC_PARENTHESES:
1929 break;
1930
1931 default:
1932 gfc_error ("Only intrinsic operators can be used in expression at %L",
1933 &e->where);
1934 return FAILURE;
1935 }
1936
1937 return SUCCESS;
1938
1939 not_numeric:
1940 gfc_error ("Numeric operands are required in expression at %L", &e->where);
1941
1942 return FAILURE;
1943 }
1944
1945
1946 static match
1947 check_init_expr_arguments (gfc_expr *e)
1948 {
1949 gfc_actual_arglist *ap;
1950
1951 for (ap = e->value.function.actual; ap; ap = ap->next)
1952 if (check_init_expr (ap->expr) == FAILURE)
1953 return MATCH_ERROR;
1954
1955 return MATCH_YES;
1956 }
1957
1958 /* F95, 7.1.6.1, Initialization expressions, (7)
1959 F2003, 7.1.7 Initialization expression, (8) */
1960
1961 static match
1962 check_inquiry (gfc_expr *e, int not_restricted)
1963 {
1964 const char *name;
1965 const char *const *functions;
1966
1967 static const char *const inquiry_func_f95[] = {
1968 "lbound", "shape", "size", "ubound",
1969 "bit_size", "len", "kind",
1970 "digits", "epsilon", "huge", "maxexponent", "minexponent",
1971 "precision", "radix", "range", "tiny",
1972 NULL
1973 };
1974
1975 static const char *const inquiry_func_f2003[] = {
1976 "lbound", "shape", "size", "ubound",
1977 "bit_size", "len", "kind",
1978 "digits", "epsilon", "huge", "maxexponent", "minexponent",
1979 "precision", "radix", "range", "tiny",
1980 "new_line", NULL
1981 };
1982
1983 int i;
1984 gfc_actual_arglist *ap;
1985
1986 if (!e->value.function.isym
1987 || !e->value.function.isym->inquiry)
1988 return MATCH_NO;
1989
1990 /* An undeclared parameter will get us here (PR25018). */
1991 if (e->symtree == NULL)
1992 return MATCH_NO;
1993
1994 name = e->symtree->n.sym->name;
1995
1996 functions = (gfc_option.warn_std & GFC_STD_F2003)
1997 ? inquiry_func_f2003 : inquiry_func_f95;
1998
1999 for (i = 0; functions[i]; i++)
2000 if (strcmp (functions[i], name) == 0)
2001 break;
2002
2003 if (functions[i] == NULL)
2004 return MATCH_ERROR;
2005
2006 /* At this point we have an inquiry function with a variable argument. The
2007 type of the variable might be undefined, but we need it now, because the
2008 arguments of these functions are not allowed to be undefined. */
2009
2010 for (ap = e->value.function.actual; ap; ap = ap->next)
2011 {
2012 if (!ap->expr)
2013 continue;
2014
2015 if (ap->expr->ts.type == BT_UNKNOWN)
2016 {
2017 if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
2018 && gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns)
2019 == FAILURE)
2020 return MATCH_NO;
2021
2022 ap->expr->ts = ap->expr->symtree->n.sym->ts;
2023 }
2024
2025 /* Assumed character length will not reduce to a constant expression
2026 with LEN, as required by the standard. */
2027 if (i == 5 && not_restricted
2028 && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
2029 && ap->expr->symtree->n.sym->ts.cl->length == NULL)
2030 {
2031 gfc_error ("Assumed character length variable '%s' in constant "
2032 "expression at %L", e->symtree->n.sym->name, &e->where);
2033 return MATCH_ERROR;
2034 }
2035 else if (not_restricted && check_init_expr (ap->expr) == FAILURE)
2036 return MATCH_ERROR;
2037 }
2038
2039 return MATCH_YES;
2040 }
2041
2042
2043 /* F95, 7.1.6.1, Initialization expressions, (5)
2044 F2003, 7.1.7 Initialization expression, (5) */
2045
2046 static match
2047 check_transformational (gfc_expr *e)
2048 {
2049 static const char * const trans_func_f95[] = {
2050 "repeat", "reshape", "selected_int_kind",
2051 "selected_real_kind", "transfer", "trim", NULL
2052 };
2053
2054 int i;
2055 const char *name;
2056
2057 if (!e->value.function.isym
2058 || !e->value.function.isym->transformational)
2059 return MATCH_NO;
2060
2061 name = e->symtree->n.sym->name;
2062
2063 /* NULL() is dealt with below. */
2064 if (strcmp ("null", name) == 0)
2065 return MATCH_NO;
2066
2067 for (i = 0; trans_func_f95[i]; i++)
2068 if (strcmp (trans_func_f95[i], name) == 0)
2069 break;
2070
2071 /* FIXME, F2003: implement translation of initialization
2072 expressions before enabling this check. For F95, error
2073 out if the transformational function is not in the list. */
2074 #if 0
2075 if (trans_func_f95[i] == NULL
2076 && gfc_notify_std (GFC_STD_F2003,
2077 "transformational intrinsic '%s' at %L is not permitted "
2078 "in an initialization expression", name, &e->where) == FAILURE)
2079 return MATCH_ERROR;
2080 #else
2081 if (trans_func_f95[i] == NULL)
2082 {
2083 gfc_error("transformational intrinsic '%s' at %L is not permitted "
2084 "in an initialization expression", name, &e->where);
2085 return MATCH_ERROR;
2086 }
2087 #endif
2088
2089 return check_init_expr_arguments (e);
2090 }
2091
2092
2093 /* F95, 7.1.6.1, Initialization expressions, (6)
2094 F2003, 7.1.7 Initialization expression, (6) */
2095
2096 static match
2097 check_null (gfc_expr *e)
2098 {
2099 if (strcmp ("null", e->symtree->n.sym->name) != 0)
2100 return MATCH_NO;
2101
2102 return check_init_expr_arguments (e);
2103 }
2104
2105
2106 static match
2107 check_elemental (gfc_expr *e)
2108 {
2109 if (!e->value.function.isym
2110 || !e->value.function.isym->elemental)
2111 return MATCH_NO;
2112
2113 if (e->ts.type != BT_INTEGER
2114 && e->ts.type != BT_CHARACTER
2115 && gfc_notify_std (GFC_STD_F2003, "Extension: Evaluation of "
2116 "nonstandard initialization expression at %L",
2117 &e->where) == FAILURE)
2118 return MATCH_ERROR;
2119
2120 return check_init_expr_arguments (e);
2121 }
2122
2123
2124 static match
2125 check_conversion (gfc_expr *e)
2126 {
2127 if (!e->value.function.isym
2128 || !e->value.function.isym->conversion)
2129 return MATCH_NO;
2130
2131 return check_init_expr_arguments (e);
2132 }
2133
2134
2135 /* Verify that an expression is an initialization expression. A side
2136 effect is that the expression tree is reduced to a single constant
2137 node if all goes well. This would normally happen when the
2138 expression is constructed but function references are assumed to be
2139 intrinsics in the context of initialization expressions. If
2140 FAILURE is returned an error message has been generated. */
2141
2142 static try
2143 check_init_expr (gfc_expr *e)
2144 {
2145 match m;
2146 try t;
2147 gfc_intrinsic_sym *isym;
2148
2149 if (e == NULL)
2150 return SUCCESS;
2151
2152 switch (e->expr_type)
2153 {
2154 case EXPR_OP:
2155 t = check_intrinsic_op (e, check_init_expr);
2156 if (t == SUCCESS)
2157 t = gfc_simplify_expr (e, 0);
2158
2159 break;
2160
2161 case EXPR_FUNCTION:
2162 t = FAILURE;
2163
2164 if ((m = check_specification_function (e)) != MATCH_YES)
2165 {
2166 if ((m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES)
2167 {
2168 gfc_error ("Function '%s' in initialization expression at %L "
2169 "must be an intrinsic or a specification function",
2170 e->symtree->n.sym->name, &e->where);
2171 break;
2172 }
2173
2174 if ((m = check_conversion (e)) == MATCH_NO
2175 && (m = check_inquiry (e, 1)) == MATCH_NO
2176 && (m = check_null (e)) == MATCH_NO
2177 && (m = check_transformational (e)) == MATCH_NO
2178 && (m = check_elemental (e)) == MATCH_NO)
2179 {
2180 gfc_error ("Intrinsic function '%s' at %L is not permitted "
2181 "in an initialization expression",
2182 e->symtree->n.sym->name, &e->where);
2183 m = MATCH_ERROR;
2184 }
2185
2186 /* Try to scalarize an elemental intrinsic function that has an
2187 array argument. */
2188 isym = gfc_find_function (e->symtree->n.sym->name);
2189 if (isym && isym->elemental
2190 && e->value.function.actual->expr->expr_type == EXPR_ARRAY)
2191 {
2192 if ((t = scalarize_intrinsic_call (e)) == SUCCESS)
2193 break;
2194 }
2195 }
2196
2197 if (m == MATCH_YES)
2198 t = gfc_simplify_expr (e, 0);
2199
2200 break;
2201
2202 case EXPR_VARIABLE:
2203 t = SUCCESS;
2204
2205 if (gfc_check_iter_variable (e) == SUCCESS)
2206 break;
2207
2208 if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2209 {
2210 /* A PARAMETER shall not be used to define itself, i.e.
2211 REAL, PARAMETER :: x = transfer(0, x)
2212 is invalid. */
2213 if (!e->symtree->n.sym->value)
2214 {
2215 gfc_error("PARAMETER '%s' is used at %L before its definition "
2216 "is complete", e->symtree->n.sym->name, &e->where);
2217 t = FAILURE;
2218 }
2219 else
2220 t = simplify_parameter_variable (e, 0);
2221
2222 break;
2223 }
2224
2225 if (gfc_in_match_data ())
2226 break;
2227
2228 t = FAILURE;
2229
2230 if (e->symtree->n.sym->as)
2231 {
2232 switch (e->symtree->n.sym->as->type)
2233 {
2234 case AS_ASSUMED_SIZE:
2235 gfc_error ("Assumed size array '%s' at %L is not permitted "
2236 "in an initialization expression",
2237 e->symtree->n.sym->name, &e->where);
2238 break;
2239
2240 case AS_ASSUMED_SHAPE:
2241 gfc_error ("Assumed shape array '%s' at %L is not permitted "
2242 "in an initialization expression",
2243 e->symtree->n.sym->name, &e->where);
2244 break;
2245
2246 case AS_DEFERRED:
2247 gfc_error ("Deferred array '%s' at %L is not permitted "
2248 "in an initialization expression",
2249 e->symtree->n.sym->name, &e->where);
2250 break;
2251
2252 case AS_EXPLICIT:
2253 gfc_error ("Array '%s' at %L is a variable, which does "
2254 "not reduce to a constant expression",
2255 e->symtree->n.sym->name, &e->where);
2256 break;
2257
2258 default:
2259 gcc_unreachable();
2260 }
2261 }
2262 else
2263 gfc_error ("Parameter '%s' at %L has not been declared or is "
2264 "a variable, which does not reduce to a constant "
2265 "expression", e->symtree->n.sym->name, &e->where);
2266
2267 break;
2268
2269 case EXPR_CONSTANT:
2270 case EXPR_NULL:
2271 t = SUCCESS;
2272 break;
2273
2274 case EXPR_SUBSTRING:
2275 t = check_init_expr (e->ref->u.ss.start);
2276 if (t == FAILURE)
2277 break;
2278
2279 t = check_init_expr (e->ref->u.ss.end);
2280 if (t == SUCCESS)
2281 t = gfc_simplify_expr (e, 0);
2282
2283 break;
2284
2285 case EXPR_STRUCTURE:
2286 if (e->ts.is_iso_c)
2287 t = SUCCESS;
2288 else
2289 t = gfc_check_constructor (e, check_init_expr);
2290 break;
2291
2292 case EXPR_ARRAY:
2293 t = gfc_check_constructor (e, check_init_expr);
2294 if (t == FAILURE)
2295 break;
2296
2297 t = gfc_expand_constructor (e);
2298 if (t == FAILURE)
2299 break;
2300
2301 t = gfc_check_constructor_type (e);
2302 break;
2303
2304 default:
2305 gfc_internal_error ("check_init_expr(): Unknown expression type");
2306 }
2307
2308 return t;
2309 }
2310
2311
2312 /* Match an initialization expression. We work by first matching an
2313 expression, then reducing it to a constant. */
2314
2315 match
2316 gfc_match_init_expr (gfc_expr **result)
2317 {
2318 gfc_expr *expr;
2319 match m;
2320 try t;
2321
2322 m = gfc_match_expr (&expr);
2323 if (m != MATCH_YES)
2324 return m;
2325
2326 gfc_init_expr = 1;
2327 t = gfc_resolve_expr (expr);
2328 if (t == SUCCESS)
2329 t = check_init_expr (expr);
2330 gfc_init_expr = 0;
2331
2332 if (t == FAILURE)
2333 {
2334 gfc_free_expr (expr);
2335 return MATCH_ERROR;
2336 }
2337
2338 if (expr->expr_type == EXPR_ARRAY
2339 && (gfc_check_constructor_type (expr) == FAILURE
2340 || gfc_expand_constructor (expr) == FAILURE))
2341 {
2342 gfc_free_expr (expr);
2343 return MATCH_ERROR;
2344 }
2345
2346 /* Not all inquiry functions are simplified to constant expressions
2347 so it is necessary to call check_inquiry again. */
2348 if (!gfc_is_constant_expr (expr) && check_inquiry (expr, 1) != MATCH_YES
2349 && !gfc_in_match_data ())
2350 {
2351 gfc_error ("Initialization expression didn't reduce %C");
2352 return MATCH_ERROR;
2353 }
2354
2355 *result = expr;
2356
2357 return MATCH_YES;
2358 }
2359
2360
2361 static try check_restricted (gfc_expr *);
2362
2363 /* Given an actual argument list, test to see that each argument is a
2364 restricted expression and optionally if the expression type is
2365 integer or character. */
2366
2367 static try
2368 restricted_args (gfc_actual_arglist *a)
2369 {
2370 for (; a; a = a->next)
2371 {
2372 if (check_restricted (a->expr) == FAILURE)
2373 return FAILURE;
2374 }
2375
2376 return SUCCESS;
2377 }
2378
2379
2380 /************* Restricted/specification expressions *************/
2381
2382
2383 /* Make sure a non-intrinsic function is a specification function. */
2384
2385 static try
2386 external_spec_function (gfc_expr *e)
2387 {
2388 gfc_symbol *f;
2389
2390 f = e->value.function.esym;
2391
2392 if (f->attr.proc == PROC_ST_FUNCTION)
2393 {
2394 gfc_error ("Specification function '%s' at %L cannot be a statement "
2395 "function", f->name, &e->where);
2396 return FAILURE;
2397 }
2398
2399 if (f->attr.proc == PROC_INTERNAL)
2400 {
2401 gfc_error ("Specification function '%s' at %L cannot be an internal "
2402 "function", f->name, &e->where);
2403 return FAILURE;
2404 }
2405
2406 if (!f->attr.pure && !f->attr.elemental)
2407 {
2408 gfc_error ("Specification function '%s' at %L must be PURE", f->name,
2409 &e->where);
2410 return FAILURE;
2411 }
2412
2413 if (f->attr.recursive)
2414 {
2415 gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
2416 f->name, &e->where);
2417 return FAILURE;
2418 }
2419
2420 return restricted_args (e->value.function.actual);
2421 }
2422
2423
2424 /* Check to see that a function reference to an intrinsic is a
2425 restricted expression. */
2426
2427 static try
2428 restricted_intrinsic (gfc_expr *e)
2429 {
2430 /* TODO: Check constraints on inquiry functions. 7.1.6.2 (7). */
2431 if (check_inquiry (e, 0) == MATCH_YES)
2432 return SUCCESS;
2433
2434 return restricted_args (e->value.function.actual);
2435 }
2436
2437
2438 /* Verify that an expression is a restricted expression. Like its
2439 cousin check_init_expr(), an error message is generated if we
2440 return FAILURE. */
2441
2442 static try
2443 check_restricted (gfc_expr *e)
2444 {
2445 gfc_symbol *sym;
2446 try t;
2447
2448 if (e == NULL)
2449 return SUCCESS;
2450
2451 switch (e->expr_type)
2452 {
2453 case EXPR_OP:
2454 t = check_intrinsic_op (e, check_restricted);
2455 if (t == SUCCESS)
2456 t = gfc_simplify_expr (e, 0);
2457
2458 break;
2459
2460 case EXPR_FUNCTION:
2461 t = e->value.function.esym ? external_spec_function (e)
2462 : restricted_intrinsic (e);
2463 break;
2464
2465 case EXPR_VARIABLE:
2466 sym = e->symtree->n.sym;
2467 t = FAILURE;
2468
2469 /* If a dummy argument appears in a context that is valid for a
2470 restricted expression in an elemental procedure, it will have
2471 already been simplified away once we get here. Therefore we
2472 don't need to jump through hoops to distinguish valid from
2473 invalid cases. */
2474 if (sym->attr.dummy && sym->ns == gfc_current_ns
2475 && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
2476 {
2477 gfc_error ("Dummy argument '%s' not allowed in expression at %L",
2478 sym->name, &e->where);
2479 break;
2480 }
2481
2482 if (sym->attr.optional)
2483 {
2484 gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2485 sym->name, &e->where);
2486 break;
2487 }
2488
2489 if (sym->attr.intent == INTENT_OUT)
2490 {
2491 gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2492 sym->name, &e->where);
2493 break;
2494 }
2495
2496 /* gfc_is_formal_arg broadcasts that a formal argument list is being
2497 processed in resolve.c(resolve_formal_arglist). This is done so
2498 that host associated dummy array indices are accepted (PR23446).
2499 This mechanism also does the same for the specification expressions
2500 of array-valued functions. */
2501 if (sym->attr.in_common
2502 || sym->attr.use_assoc
2503 || sym->attr.dummy
2504 || sym->attr.implied_index
2505 || sym->ns != gfc_current_ns
2506 || (sym->ns->proc_name != NULL
2507 && sym->ns->proc_name->attr.flavor == FL_MODULE)
2508 || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2509 {
2510 t = SUCCESS;
2511 break;
2512 }
2513
2514 gfc_error ("Variable '%s' cannot appear in the expression at %L",
2515 sym->name, &e->where);
2516
2517 break;
2518
2519 case EXPR_NULL:
2520 case EXPR_CONSTANT:
2521 t = SUCCESS;
2522 break;
2523
2524 case EXPR_SUBSTRING:
2525 t = gfc_specification_expr (e->ref->u.ss.start);
2526 if (t == FAILURE)
2527 break;
2528
2529 t = gfc_specification_expr (e->ref->u.ss.end);
2530 if (t == SUCCESS)
2531 t = gfc_simplify_expr (e, 0);
2532
2533 break;
2534
2535 case EXPR_STRUCTURE:
2536 t = gfc_check_constructor (e, check_restricted);
2537 break;
2538
2539 case EXPR_ARRAY:
2540 t = gfc_check_constructor (e, check_restricted);
2541 break;
2542
2543 default:
2544 gfc_internal_error ("check_restricted(): Unknown expression type");
2545 }
2546
2547 return t;
2548 }
2549
2550
2551 /* Check to see that an expression is a specification expression. If
2552 we return FAILURE, an error has been generated. */
2553
2554 try
2555 gfc_specification_expr (gfc_expr *e)
2556 {
2557
2558 if (e == NULL)
2559 return SUCCESS;
2560
2561 if (e->ts.type != BT_INTEGER)
2562 {
2563 gfc_error ("Expression at %L must be of INTEGER type", &e->where);
2564 return FAILURE;
2565 }
2566
2567 if (e->expr_type == EXPR_FUNCTION
2568 && !e->value.function.isym
2569 && !e->value.function.esym
2570 && !gfc_pure (e->symtree->n.sym))
2571 {
2572 gfc_error ("Function '%s' at %L must be PURE",
2573 e->symtree->n.sym->name, &e->where);
2574 /* Prevent repeat error messages. */
2575 e->symtree->n.sym->attr.pure = 1;
2576 return FAILURE;
2577 }
2578
2579 if (e->rank != 0)
2580 {
2581 gfc_error ("Expression at %L must be scalar", &e->where);
2582 return FAILURE;
2583 }
2584
2585 if (gfc_simplify_expr (e, 0) == FAILURE)
2586 return FAILURE;
2587
2588 return check_restricted (e);
2589 }
2590
2591
2592 /************** Expression conformance checks. *************/
2593
2594 /* Given two expressions, make sure that the arrays are conformable. */
2595
2596 try
2597 gfc_check_conformance (const char *optype_msgid, gfc_expr *op1, gfc_expr *op2)
2598 {
2599 int op1_flag, op2_flag, d;
2600 mpz_t op1_size, op2_size;
2601 try t;
2602
2603 if (op1->rank == 0 || op2->rank == 0)
2604 return SUCCESS;
2605
2606 if (op1->rank != op2->rank)
2607 {
2608 gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(optype_msgid),
2609 op1->rank, op2->rank, &op1->where);
2610 return FAILURE;
2611 }
2612
2613 t = SUCCESS;
2614
2615 for (d = 0; d < op1->rank; d++)
2616 {
2617 op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2618 op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2619
2620 if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2621 {
2622 gfc_error ("Different shape for %s at %L on dimension %d "
2623 "(%d and %d)", _(optype_msgid), &op1->where, d + 1,
2624 (int) mpz_get_si (op1_size),
2625 (int) mpz_get_si (op2_size));
2626
2627 t = FAILURE;
2628 }
2629
2630 if (op1_flag)
2631 mpz_clear (op1_size);
2632 if (op2_flag)
2633 mpz_clear (op2_size);
2634
2635 if (t == FAILURE)
2636 return FAILURE;
2637 }
2638
2639 return SUCCESS;
2640 }
2641
2642
2643 /* Given an assignable expression and an arbitrary expression, make
2644 sure that the assignment can take place. */
2645
2646 try
2647 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
2648 {
2649 gfc_symbol *sym;
2650 gfc_ref *ref;
2651 int has_pointer;
2652
2653 sym = lvalue->symtree->n.sym;
2654
2655 /* Check INTENT(IN), unless the object itself is the component or
2656 sub-component of a pointer. */
2657 has_pointer = sym->attr.pointer;
2658
2659 for (ref = lvalue->ref; ref; ref = ref->next)
2660 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2661 {
2662 has_pointer = 1;
2663 break;
2664 }
2665
2666 if (!has_pointer && sym->attr.intent == INTENT_IN)
2667 {
2668 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2669 sym->name, &lvalue->where);
2670 return FAILURE;
2671 }
2672
2673 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2674 variable local to a function subprogram. Its existence begins when
2675 execution of the function is initiated and ends when execution of the
2676 function is terminated...
2677 Therefore, the left hand side is no longer a variable, when it is: */
2678 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
2679 && !sym->attr.external)
2680 {
2681 bool bad_proc;
2682 bad_proc = false;
2683
2684 /* (i) Use associated; */
2685 if (sym->attr.use_assoc)
2686 bad_proc = true;
2687
2688 /* (ii) The assignment is in the main program; or */
2689 if (gfc_current_ns->proc_name->attr.is_main_program)
2690 bad_proc = true;
2691
2692 /* (iii) A module or internal procedure... */
2693 if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2694 || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2695 && gfc_current_ns->parent
2696 && (!(gfc_current_ns->parent->proc_name->attr.function
2697 || gfc_current_ns->parent->proc_name->attr.subroutine)
2698 || gfc_current_ns->parent->proc_name->attr.is_main_program))
2699 {
2700 /* ... that is not a function... */
2701 if (!gfc_current_ns->proc_name->attr.function)
2702 bad_proc = true;
2703
2704 /* ... or is not an entry and has a different name. */
2705 if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2706 bad_proc = true;
2707 }
2708
2709 /* (iv) Host associated and not the function symbol or the
2710 parent result. This picks up sibling references, which
2711 cannot be entries. */
2712 if (!sym->attr.entry
2713 && sym->ns == gfc_current_ns->parent
2714 && sym != gfc_current_ns->proc_name
2715 && sym != gfc_current_ns->parent->proc_name->result)
2716 bad_proc = true;
2717
2718 if (bad_proc)
2719 {
2720 gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2721 return FAILURE;
2722 }
2723 }
2724
2725 if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2726 {
2727 gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2728 lvalue->rank, rvalue->rank, &lvalue->where);
2729 return FAILURE;
2730 }
2731
2732 if (lvalue->ts.type == BT_UNKNOWN)
2733 {
2734 gfc_error ("Variable type is UNKNOWN in assignment at %L",
2735 &lvalue->where);
2736 return FAILURE;
2737 }
2738
2739 if (rvalue->expr_type == EXPR_NULL)
2740 {
2741 if (lvalue->symtree->n.sym->attr.pointer
2742 && lvalue->symtree->n.sym->attr.data)
2743 return SUCCESS;
2744 else
2745 {
2746 gfc_error ("NULL appears on right-hand side in assignment at %L",
2747 &rvalue->where);
2748 return FAILURE;
2749 }
2750 }
2751
2752 if (sym->attr.cray_pointee
2753 && lvalue->ref != NULL
2754 && lvalue->ref->u.ar.type == AR_FULL
2755 && lvalue->ref->u.ar.as->cp_was_assumed)
2756 {
2757 gfc_error ("Vector assignment to assumed-size Cray Pointee at %L "
2758 "is illegal", &lvalue->where);
2759 return FAILURE;
2760 }
2761
2762 /* This is possibly a typo: x = f() instead of x => f(). */
2763 if (gfc_option.warn_surprising
2764 && rvalue->expr_type == EXPR_FUNCTION
2765 && rvalue->symtree->n.sym->attr.pointer)
2766 gfc_warning ("POINTER valued function appears on right-hand side of "
2767 "assignment at %L", &rvalue->where);
2768
2769 /* Check size of array assignments. */
2770 if (lvalue->rank != 0 && rvalue->rank != 0
2771 && gfc_check_conformance ("array assignment", lvalue, rvalue) != SUCCESS)
2772 return FAILURE;
2773
2774 if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
2775 && lvalue->symtree->n.sym->attr.data
2776 && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L used to "
2777 "initialize non-integer variable '%s'",
2778 &rvalue->where, lvalue->symtree->n.sym->name)
2779 == FAILURE)
2780 return FAILURE;
2781 else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
2782 && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L outside "
2783 "a DATA statement and outside INT/REAL/DBLE/CMPLX",
2784 &rvalue->where) == FAILURE)
2785 return FAILURE;
2786
2787 /* Handle the case of a BOZ literal on the RHS. */
2788 if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
2789 {
2790 int rc;
2791 if (gfc_option.warn_surprising)
2792 gfc_warning ("BOZ literal at %L is bitwise transferred "
2793 "non-integer symbol '%s'", &rvalue->where,
2794 lvalue->symtree->n.sym->name);
2795 if (!gfc_convert_boz (rvalue, &lvalue->ts))
2796 return FAILURE;
2797 if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
2798 {
2799 if (rc == ARITH_UNDERFLOW)
2800 gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
2801 ". This check can be disabled with the option "
2802 "-fno-range-check", &rvalue->where);
2803 else if (rc == ARITH_OVERFLOW)
2804 gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
2805 ". This check can be disabled with the option "
2806 "-fno-range-check", &rvalue->where);
2807 else if (rc == ARITH_NAN)
2808 gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
2809 ". This check can be disabled with the option "
2810 "-fno-range-check", &rvalue->where);
2811 return FAILURE;
2812 }
2813 }
2814
2815 if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2816 return SUCCESS;
2817
2818 if (!conform)
2819 {
2820 /* Numeric can be converted to any other numeric. And Hollerith can be
2821 converted to any other type. */
2822 if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2823 || rvalue->ts.type == BT_HOLLERITH)
2824 return SUCCESS;
2825
2826 if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2827 return SUCCESS;
2828
2829 gfc_error ("Incompatible types in assignment at %L; attempted assignment "
2830 "of %s to %s", &rvalue->where, gfc_typename (&rvalue->ts),
2831 gfc_typename (&lvalue->ts));
2832
2833 return FAILURE;
2834 }
2835
2836 return gfc_convert_type (rvalue, &lvalue->ts, 1);
2837 }
2838
2839
2840 /* Check that a pointer assignment is OK. We first check lvalue, and
2841 we only check rvalue if it's not an assignment to NULL() or a
2842 NULLIFY statement. */
2843
2844 try
2845 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
2846 {
2847 symbol_attribute attr;
2848 gfc_ref *ref;
2849 int is_pure;
2850 int pointer, check_intent_in;
2851
2852 if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN)
2853 {
2854 gfc_error ("Pointer assignment target is not a POINTER at %L",
2855 &lvalue->where);
2856 return FAILURE;
2857 }
2858
2859 if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
2860 && lvalue->symtree->n.sym->attr.use_assoc)
2861 {
2862 gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2863 "l-value since it is a procedure",
2864 lvalue->symtree->n.sym->name, &lvalue->where);
2865 return FAILURE;
2866 }
2867
2868
2869 /* Check INTENT(IN), unless the object itself is the component or
2870 sub-component of a pointer. */
2871 check_intent_in = 1;
2872 pointer = lvalue->symtree->n.sym->attr.pointer;
2873
2874 for (ref = lvalue->ref; ref; ref = ref->next)
2875 {
2876 if (pointer)
2877 check_intent_in = 0;
2878
2879 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2880 pointer = 1;
2881 }
2882
2883 if (check_intent_in && lvalue->symtree->n.sym->attr.intent == INTENT_IN)
2884 {
2885 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2886 lvalue->symtree->n.sym->name, &lvalue->where);
2887 return FAILURE;
2888 }
2889
2890 if (!pointer)
2891 {
2892 gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2893 return FAILURE;
2894 }
2895
2896 is_pure = gfc_pure (NULL);
2897
2898 if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym)
2899 && lvalue->symtree->n.sym->value != rvalue)
2900 {
2901 gfc_error ("Bad pointer object in PURE procedure at %L", &lvalue->where);
2902 return FAILURE;
2903 }
2904
2905 /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2906 kind, etc for lvalue and rvalue must match, and rvalue must be a
2907 pure variable if we're in a pure function. */
2908 if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
2909 return SUCCESS;
2910
2911 if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
2912 {
2913 gfc_error ("Different types in pointer assignment at %L; attempted "
2914 "assignment of %s to %s", &lvalue->where,
2915 gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
2916 return FAILURE;
2917 }
2918
2919 if (lvalue->ts.kind != rvalue->ts.kind)
2920 {
2921 gfc_error ("Different kind type parameters in pointer "
2922 "assignment at %L", &lvalue->where);
2923 return FAILURE;
2924 }
2925
2926 if (lvalue->rank != rvalue->rank)
2927 {
2928 gfc_error ("Different ranks in pointer assignment at %L",
2929 &lvalue->where);
2930 return FAILURE;
2931 }
2932
2933 /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X). */
2934 if (rvalue->expr_type == EXPR_NULL)
2935 return SUCCESS;
2936
2937 if (lvalue->ts.type == BT_CHARACTER
2938 && lvalue->ts.cl && rvalue->ts.cl
2939 && lvalue->ts.cl->length && rvalue->ts.cl->length
2940 && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
2941 rvalue->ts.cl->length)) == 1)
2942 {
2943 gfc_error ("Different character lengths in pointer "
2944 "assignment at %L", &lvalue->where);
2945 return FAILURE;
2946 }
2947
2948 if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
2949 lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
2950
2951 attr = gfc_expr_attr (rvalue);
2952 if (!attr.target && !attr.pointer)
2953 {
2954 gfc_error ("Pointer assignment target is neither TARGET "
2955 "nor POINTER at %L", &rvalue->where);
2956 return FAILURE;
2957 }
2958
2959 if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
2960 {
2961 gfc_error ("Bad target in pointer assignment in PURE "
2962 "procedure at %L", &rvalue->where);
2963 }
2964
2965 if (gfc_has_vector_index (rvalue))
2966 {
2967 gfc_error ("Pointer assignment with vector subscript "
2968 "on rhs at %L", &rvalue->where);
2969 return FAILURE;
2970 }
2971
2972 if (attr.protected && attr.use_assoc)
2973 {
2974 gfc_error ("Pointer assigment target has PROTECTED "
2975 "attribute at %L", &rvalue->where);
2976 return FAILURE;
2977 }
2978
2979 return SUCCESS;
2980 }
2981
2982
2983 /* Relative of gfc_check_assign() except that the lvalue is a single
2984 symbol. Used for initialization assignments. */
2985
2986 try
2987 gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
2988 {
2989 gfc_expr lvalue;
2990 try r;
2991
2992 memset (&lvalue, '\0', sizeof (gfc_expr));
2993
2994 lvalue.expr_type = EXPR_VARIABLE;
2995 lvalue.ts = sym->ts;
2996 if (sym->as)
2997 lvalue.rank = sym->as->rank;
2998 lvalue.symtree = (gfc_symtree *) gfc_getmem (sizeof (gfc_symtree));
2999 lvalue.symtree->n.sym = sym;
3000 lvalue.where = sym->declared_at;
3001
3002 if (sym->attr.pointer)
3003 r = gfc_check_pointer_assign (&lvalue, rvalue);
3004 else
3005 r = gfc_check_assign (&lvalue, rvalue, 1);
3006
3007 gfc_free (lvalue.symtree);
3008
3009 return r;
3010 }
3011
3012
3013 /* Get an expression for a default initializer. */
3014
3015 gfc_expr *
3016 gfc_default_initializer (gfc_typespec *ts)
3017 {
3018 gfc_constructor *tail;
3019 gfc_expr *init;
3020 gfc_component *c;
3021
3022 /* See if we have a default initializer. */
3023 for (c = ts->derived->components; c; c = c->next)
3024 if (c->initializer || c->allocatable)
3025 break;
3026
3027 if (!c)
3028 return NULL;
3029
3030 /* Build the constructor. */
3031 init = gfc_get_expr ();
3032 init->expr_type = EXPR_STRUCTURE;
3033 init->ts = *ts;
3034 init->where = ts->derived->declared_at;
3035
3036 tail = NULL;
3037 for (c = ts->derived->components; c; c = c->next)
3038 {
3039 if (tail == NULL)
3040 init->value.constructor = tail = gfc_get_constructor ();
3041 else
3042 {
3043 tail->next = gfc_get_constructor ();
3044 tail = tail->next;
3045 }
3046
3047 if (c->initializer)
3048 tail->expr = gfc_copy_expr (c->initializer);
3049
3050 if (c->allocatable)
3051 {
3052 tail->expr = gfc_get_expr ();
3053 tail->expr->expr_type = EXPR_NULL;
3054 tail->expr->ts = c->ts;
3055 }
3056 }
3057 return init;
3058 }
3059
3060
3061 /* Given a symbol, create an expression node with that symbol as a
3062 variable. If the symbol is array valued, setup a reference of the
3063 whole array. */
3064
3065 gfc_expr *
3066 gfc_get_variable_expr (gfc_symtree *var)
3067 {
3068 gfc_expr *e;
3069
3070 e = gfc_get_expr ();
3071 e->expr_type = EXPR_VARIABLE;
3072 e->symtree = var;
3073 e->ts = var->n.sym->ts;
3074
3075 if (var->n.sym->as != NULL)
3076 {
3077 e->rank = var->n.sym->as->rank;
3078 e->ref = gfc_get_ref ();
3079 e->ref->type = REF_ARRAY;
3080 e->ref->u.ar.type = AR_FULL;
3081 }
3082
3083 return e;
3084 }
3085
3086
3087 /* General expression traversal function. */
3088
3089 bool
3090 gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
3091 bool (*func)(gfc_expr *, gfc_symbol *, int*),
3092 int f)
3093 {
3094 gfc_array_ref ar;
3095 gfc_ref *ref;
3096 gfc_actual_arglist *args;
3097 gfc_constructor *c;
3098 int i;
3099
3100 if (!expr)
3101 return false;
3102
3103 if ((*func) (expr, sym, &f))
3104 return true;
3105
3106 if (expr->ts.type == BT_CHARACTER
3107 && expr->ts.cl
3108 && expr->ts.cl->length
3109 && expr->ts.cl->length->expr_type != EXPR_CONSTANT
3110 && gfc_traverse_expr (expr->ts.cl->length, sym, func, f))
3111 return true;
3112
3113 switch (expr->expr_type)
3114 {
3115 case EXPR_FUNCTION:
3116 for (args = expr->value.function.actual; args; args = args->next)
3117 {
3118 if (gfc_traverse_expr (args->expr, sym, func, f))
3119 return true;
3120 }
3121 break;
3122
3123 case EXPR_VARIABLE:
3124 case EXPR_CONSTANT:
3125 case EXPR_NULL:
3126 case EXPR_SUBSTRING:
3127 break;
3128
3129 case EXPR_STRUCTURE:
3130 case EXPR_ARRAY:
3131 for (c = expr->value.constructor; c; c = c->next)
3132 {
3133 if (gfc_traverse_expr (c->expr, sym, func, f))
3134 return true;
3135 if (c->iterator)
3136 {
3137 if (gfc_traverse_expr (c->iterator->var, sym, func, f))
3138 return true;
3139 if (gfc_traverse_expr (c->iterator->start, sym, func, f))
3140 return true;
3141 if (gfc_traverse_expr (c->iterator->end, sym, func, f))
3142 return true;
3143 if (gfc_traverse_expr (c->iterator->step, sym, func, f))
3144 return true;
3145 }
3146 }
3147 break;
3148
3149 case EXPR_OP:
3150 if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
3151 return true;
3152 if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
3153 return true;
3154 break;
3155
3156 default:
3157 gcc_unreachable ();
3158 break;
3159 }
3160
3161 ref = expr->ref;
3162 while (ref != NULL)
3163 {
3164 switch (ref->type)
3165 {
3166 case REF_ARRAY:
3167 ar = ref->u.ar;
3168 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
3169 {
3170 if (gfc_traverse_expr (ar.start[i], sym, func, f))
3171 return true;
3172 if (gfc_traverse_expr (ar.end[i], sym, func, f))
3173 return true;
3174 if (gfc_traverse_expr (ar.stride[i], sym, func, f))
3175 return true;
3176 }
3177 break;
3178
3179 case REF_SUBSTRING:
3180 if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
3181 return true;
3182 if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
3183 return true;
3184 break;
3185
3186 case REF_COMPONENT:
3187 if (ref->u.c.component->ts.type == BT_CHARACTER
3188 && ref->u.c.component->ts.cl
3189 && ref->u.c.component->ts.cl->length
3190 && ref->u.c.component->ts.cl->length->expr_type
3191 != EXPR_CONSTANT
3192 && gfc_traverse_expr (ref->u.c.component->ts.cl->length,
3193 sym, func, f))
3194 return true;
3195
3196 if (ref->u.c.component->as)
3197 for (i = 0; i < ref->u.c.component->as->rank; i++)
3198 {
3199 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
3200 sym, func, f))
3201 return true;
3202 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
3203 sym, func, f))
3204 return true;
3205 }
3206 break;
3207
3208 default:
3209 gcc_unreachable ();
3210 }
3211 ref = ref->next;
3212 }
3213 return false;
3214 }
3215
3216 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
3217
3218 static bool
3219 expr_set_symbols_referenced (gfc_expr *expr,
3220 gfc_symbol *sym ATTRIBUTE_UNUSED,
3221 int *f ATTRIBUTE_UNUSED)
3222 {
3223 if (expr->expr_type != EXPR_VARIABLE)
3224 return false;
3225 gfc_set_sym_referenced (expr->symtree->n.sym);
3226 return false;
3227 }
3228
3229 void
3230 gfc_expr_set_symbols_referenced (gfc_expr *expr)
3231 {
3232 gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
3233 }