re PR fortran/34476 (Parameters: Bogus out of bounds error in array constructor)
[gcc.git] / gcc / fortran / expr.c
1 /* Routines for manipulation of expression nodes.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
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 if (cons)
1055 {
1056 for (nelemen = mpz_get_ui (offset); nelemen > 0; nelemen--)
1057 {
1058 if (cons->iterator)
1059 {
1060 cons = NULL;
1061 goto depart;
1062 }
1063 cons = cons->next;
1064 }
1065 }
1066
1067 depart:
1068 mpz_clear (delta);
1069 mpz_clear (offset);
1070 mpz_clear (span);
1071 mpz_clear (tmp);
1072 if (e)
1073 gfc_free_expr (e);
1074 *rval = cons;
1075 return t;
1076 }
1077
1078
1079 /* Find a component of a structure constructor. */
1080
1081 static gfc_constructor *
1082 find_component_ref (gfc_constructor *cons, gfc_ref *ref)
1083 {
1084 gfc_component *comp;
1085 gfc_component *pick;
1086
1087 comp = ref->u.c.sym->components;
1088 pick = ref->u.c.component;
1089 while (comp != pick)
1090 {
1091 comp = comp->next;
1092 cons = cons->next;
1093 }
1094
1095 return cons;
1096 }
1097
1098
1099 /* Replace an expression with the contents of a constructor, removing
1100 the subobject reference in the process. */
1101
1102 static void
1103 remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
1104 {
1105 gfc_expr *e;
1106
1107 e = cons->expr;
1108 cons->expr = NULL;
1109 e->ref = p->ref->next;
1110 p->ref->next = NULL;
1111 gfc_replace_expr (p, e);
1112 }
1113
1114
1115 /* Pull an array section out of an array constructor. */
1116
1117 static try
1118 find_array_section (gfc_expr *expr, gfc_ref *ref)
1119 {
1120 int idx;
1121 int rank;
1122 int d;
1123 int shape_i;
1124 long unsigned one = 1;
1125 bool incr_ctr;
1126 mpz_t start[GFC_MAX_DIMENSIONS];
1127 mpz_t end[GFC_MAX_DIMENSIONS];
1128 mpz_t stride[GFC_MAX_DIMENSIONS];
1129 mpz_t delta[GFC_MAX_DIMENSIONS];
1130 mpz_t ctr[GFC_MAX_DIMENSIONS];
1131 mpz_t delta_mpz;
1132 mpz_t tmp_mpz;
1133 mpz_t nelts;
1134 mpz_t ptr;
1135 mpz_t index;
1136 gfc_constructor *cons;
1137 gfc_constructor *base;
1138 gfc_expr *begin;
1139 gfc_expr *finish;
1140 gfc_expr *step;
1141 gfc_expr *upper;
1142 gfc_expr *lower;
1143 gfc_constructor *vecsub[GFC_MAX_DIMENSIONS], *c;
1144 try t;
1145
1146 t = SUCCESS;
1147
1148 base = expr->value.constructor;
1149 expr->value.constructor = NULL;
1150
1151 rank = ref->u.ar.as->rank;
1152
1153 if (expr->shape == NULL)
1154 expr->shape = gfc_get_shape (rank);
1155
1156 mpz_init_set_ui (delta_mpz, one);
1157 mpz_init_set_ui (nelts, one);
1158 mpz_init (tmp_mpz);
1159
1160 /* Do the initialization now, so that we can cleanup without
1161 keeping track of where we were. */
1162 for (d = 0; d < rank; d++)
1163 {
1164 mpz_init (delta[d]);
1165 mpz_init (start[d]);
1166 mpz_init (end[d]);
1167 mpz_init (ctr[d]);
1168 mpz_init (stride[d]);
1169 vecsub[d] = NULL;
1170 }
1171
1172 /* Build the counters to clock through the array reference. */
1173 shape_i = 0;
1174 for (d = 0; d < rank; d++)
1175 {
1176 /* Make this stretch of code easier on the eye! */
1177 begin = ref->u.ar.start[d];
1178 finish = ref->u.ar.end[d];
1179 step = ref->u.ar.stride[d];
1180 lower = ref->u.ar.as->lower[d];
1181 upper = ref->u.ar.as->upper[d];
1182
1183 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
1184 {
1185 gcc_assert (begin);
1186
1187 if (begin->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (begin))
1188 {
1189 t = FAILURE;
1190 goto cleanup;
1191 }
1192
1193 gcc_assert (begin->rank == 1);
1194 gcc_assert (begin->shape);
1195
1196 vecsub[d] = begin->value.constructor;
1197 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1198 mpz_mul (nelts, nelts, begin->shape[0]);
1199 mpz_set (expr->shape[shape_i++], begin->shape[0]);
1200
1201 /* Check bounds. */
1202 for (c = vecsub[d]; c; c = c->next)
1203 {
1204 if (mpz_cmp (c->expr->value.integer, upper->value.integer) > 0
1205 || mpz_cmp (c->expr->value.integer,
1206 lower->value.integer) < 0)
1207 {
1208 gfc_error ("index in dimension %d is out of bounds "
1209 "at %L", d + 1, &ref->u.ar.c_where[d]);
1210 t = FAILURE;
1211 goto cleanup;
1212 }
1213 }
1214 }
1215 else
1216 {
1217 if ((begin && begin->expr_type != EXPR_CONSTANT)
1218 || (finish && finish->expr_type != EXPR_CONSTANT)
1219 || (step && step->expr_type != EXPR_CONSTANT))
1220 {
1221 t = FAILURE;
1222 goto cleanup;
1223 }
1224
1225 /* Obtain the stride. */
1226 if (step)
1227 mpz_set (stride[d], step->value.integer);
1228 else
1229 mpz_set_ui (stride[d], one);
1230
1231 if (mpz_cmp_ui (stride[d], 0) == 0)
1232 mpz_set_ui (stride[d], one);
1233
1234 /* Obtain the start value for the index. */
1235 if (begin)
1236 mpz_set (start[d], begin->value.integer);
1237 else
1238 mpz_set (start[d], lower->value.integer);
1239
1240 mpz_set (ctr[d], start[d]);
1241
1242 /* Obtain the end value for the index. */
1243 if (finish)
1244 mpz_set (end[d], finish->value.integer);
1245 else
1246 mpz_set (end[d], upper->value.integer);
1247
1248 /* Separate 'if' because elements sometimes arrive with
1249 non-null end. */
1250 if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1251 mpz_set (end [d], begin->value.integer);
1252
1253 /* Check the bounds. */
1254 if (mpz_cmp (ctr[d], upper->value.integer) > 0
1255 || mpz_cmp (end[d], upper->value.integer) > 0
1256 || mpz_cmp (ctr[d], lower->value.integer) < 0
1257 || mpz_cmp (end[d], lower->value.integer) < 0)
1258 {
1259 gfc_error ("index in dimension %d is out of bounds "
1260 "at %L", d + 1, &ref->u.ar.c_where[d]);
1261 t = FAILURE;
1262 goto cleanup;
1263 }
1264
1265 /* Calculate the number of elements and the shape. */
1266 mpz_set (tmp_mpz, stride[d]);
1267 mpz_add (tmp_mpz, end[d], tmp_mpz);
1268 mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1269 mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1270 mpz_mul (nelts, nelts, tmp_mpz);
1271
1272 /* An element reference reduces the rank of the expression; don't
1273 add anything to the shape array. */
1274 if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT)
1275 mpz_set (expr->shape[shape_i++], tmp_mpz);
1276 }
1277
1278 /* Calculate the 'stride' (=delta) for conversion of the
1279 counter values into the index along the constructor. */
1280 mpz_set (delta[d], delta_mpz);
1281 mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1282 mpz_add_ui (tmp_mpz, tmp_mpz, one);
1283 mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1284 }
1285
1286 mpz_init (index);
1287 mpz_init (ptr);
1288 cons = base;
1289
1290 /* Now clock through the array reference, calculating the index in
1291 the source constructor and transferring the elements to the new
1292 constructor. */
1293 for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
1294 {
1295 if (ref->u.ar.offset)
1296 mpz_set (ptr, ref->u.ar.offset->value.integer);
1297 else
1298 mpz_init_set_ui (ptr, 0);
1299
1300 incr_ctr = true;
1301 for (d = 0; d < rank; d++)
1302 {
1303 mpz_set (tmp_mpz, ctr[d]);
1304 mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
1305 mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1306 mpz_add (ptr, ptr, tmp_mpz);
1307
1308 if (!incr_ctr) continue;
1309
1310 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
1311 {
1312 gcc_assert(vecsub[d]);
1313
1314 if (!vecsub[d]->next)
1315 vecsub[d] = ref->u.ar.start[d]->value.constructor;
1316 else
1317 {
1318 vecsub[d] = vecsub[d]->next;
1319 incr_ctr = false;
1320 }
1321 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1322 }
1323 else
1324 {
1325 mpz_add (ctr[d], ctr[d], stride[d]);
1326
1327 if (mpz_cmp_ui (stride[d], 0) > 0
1328 ? mpz_cmp (ctr[d], end[d]) > 0
1329 : mpz_cmp (ctr[d], end[d]) < 0)
1330 mpz_set (ctr[d], start[d]);
1331 else
1332 incr_ctr = false;
1333 }
1334 }
1335
1336 /* There must be a better way of dealing with negative strides
1337 than resetting the index and the constructor pointer! */
1338 if (mpz_cmp (ptr, index) < 0)
1339 {
1340 mpz_set_ui (index, 0);
1341 cons = base;
1342 }
1343
1344 while (mpz_cmp (ptr, index) > 0)
1345 {
1346 mpz_add_ui (index, index, one);
1347 cons = cons->next;
1348 }
1349
1350 gfc_append_constructor (expr, gfc_copy_expr (cons->expr));
1351 }
1352
1353 mpz_clear (ptr);
1354 mpz_clear (index);
1355
1356 cleanup:
1357
1358 mpz_clear (delta_mpz);
1359 mpz_clear (tmp_mpz);
1360 mpz_clear (nelts);
1361 for (d = 0; d < rank; d++)
1362 {
1363 mpz_clear (delta[d]);
1364 mpz_clear (start[d]);
1365 mpz_clear (end[d]);
1366 mpz_clear (ctr[d]);
1367 mpz_clear (stride[d]);
1368 }
1369 gfc_free_constructor (base);
1370 return t;
1371 }
1372
1373 /* Pull a substring out of an expression. */
1374
1375 static try
1376 find_substring_ref (gfc_expr *p, gfc_expr **newp)
1377 {
1378 int end;
1379 int start;
1380 int length;
1381 char *chr;
1382
1383 if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1384 || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1385 return FAILURE;
1386
1387 *newp = gfc_copy_expr (p);
1388 gfc_free ((*newp)->value.character.string);
1389
1390 end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer);
1391 start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer);
1392 length = end - start + 1;
1393
1394 chr = (*newp)->value.character.string = gfc_getmem (length + 1);
1395 (*newp)->value.character.length = length;
1396 memcpy (chr, &p->value.character.string[start - 1], length);
1397 chr[length] = '\0';
1398 return SUCCESS;
1399 }
1400
1401
1402
1403 /* Simplify a subobject reference of a constructor. This occurs when
1404 parameter variable values are substituted. */
1405
1406 static try
1407 simplify_const_ref (gfc_expr *p)
1408 {
1409 gfc_constructor *cons;
1410 gfc_expr *newp;
1411
1412 while (p->ref)
1413 {
1414 switch (p->ref->type)
1415 {
1416 case REF_ARRAY:
1417 switch (p->ref->u.ar.type)
1418 {
1419 case AR_ELEMENT:
1420 if (find_array_element (p->value.constructor, &p->ref->u.ar,
1421 &cons) == FAILURE)
1422 return FAILURE;
1423
1424 if (!cons)
1425 return SUCCESS;
1426
1427 remove_subobject_ref (p, cons);
1428 break;
1429
1430 case AR_SECTION:
1431 if (find_array_section (p, p->ref) == FAILURE)
1432 return FAILURE;
1433 p->ref->u.ar.type = AR_FULL;
1434
1435 /* Fall through. */
1436
1437 case AR_FULL:
1438 if (p->ref->next != NULL
1439 && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
1440 {
1441 cons = p->value.constructor;
1442 for (; cons; cons = cons->next)
1443 {
1444 cons->expr->ref = copy_ref (p->ref->next);
1445 simplify_const_ref (cons->expr);
1446 }
1447 }
1448 gfc_free_ref_list (p->ref);
1449 p->ref = NULL;
1450 break;
1451
1452 default:
1453 return SUCCESS;
1454 }
1455
1456 break;
1457
1458 case REF_COMPONENT:
1459 cons = find_component_ref (p->value.constructor, p->ref);
1460 remove_subobject_ref (p, cons);
1461 break;
1462
1463 case REF_SUBSTRING:
1464 if (find_substring_ref (p, &newp) == FAILURE)
1465 return FAILURE;
1466
1467 gfc_replace_expr (p, newp);
1468 gfc_free_ref_list (p->ref);
1469 p->ref = NULL;
1470 break;
1471 }
1472 }
1473
1474 return SUCCESS;
1475 }
1476
1477
1478 /* Simplify a chain of references. */
1479
1480 static try
1481 simplify_ref_chain (gfc_ref *ref, int type)
1482 {
1483 int n;
1484
1485 for (; ref; ref = ref->next)
1486 {
1487 switch (ref->type)
1488 {
1489 case REF_ARRAY:
1490 for (n = 0; n < ref->u.ar.dimen; n++)
1491 {
1492 if (gfc_simplify_expr (ref->u.ar.start[n], type) == FAILURE)
1493 return FAILURE;
1494 if (gfc_simplify_expr (ref->u.ar.end[n], type) == FAILURE)
1495 return FAILURE;
1496 if (gfc_simplify_expr (ref->u.ar.stride[n], type) == FAILURE)
1497 return FAILURE;
1498 }
1499 break;
1500
1501 case REF_SUBSTRING:
1502 if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1503 return FAILURE;
1504 if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1505 return FAILURE;
1506 break;
1507
1508 default:
1509 break;
1510 }
1511 }
1512 return SUCCESS;
1513 }
1514
1515
1516 /* Try to substitute the value of a parameter variable. */
1517
1518 static try
1519 simplify_parameter_variable (gfc_expr *p, int type)
1520 {
1521 gfc_expr *e;
1522 try t;
1523
1524 e = gfc_copy_expr (p->symtree->n.sym->value);
1525 if (e == NULL)
1526 return FAILURE;
1527
1528 e->rank = p->rank;
1529
1530 /* Do not copy subobject refs for constant. */
1531 if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1532 e->ref = copy_ref (p->ref);
1533 t = gfc_simplify_expr (e, type);
1534
1535 /* Only use the simplification if it eliminated all subobject references. */
1536 if (t == SUCCESS && !e->ref)
1537 gfc_replace_expr (p, e);
1538 else
1539 gfc_free_expr (e);
1540
1541 return t;
1542 }
1543
1544 /* Given an expression, simplify it by collapsing constant
1545 expressions. Most simplification takes place when the expression
1546 tree is being constructed. If an intrinsic function is simplified
1547 at some point, we get called again to collapse the result against
1548 other constants.
1549
1550 We work by recursively simplifying expression nodes, simplifying
1551 intrinsic functions where possible, which can lead to further
1552 constant collapsing. If an operator has constant operand(s), we
1553 rip the expression apart, and rebuild it, hoping that it becomes
1554 something simpler.
1555
1556 The expression type is defined for:
1557 0 Basic expression parsing
1558 1 Simplifying array constructors -- will substitute
1559 iterator values.
1560 Returns FAILURE on error, SUCCESS otherwise.
1561 NOTE: Will return SUCCESS even if the expression can not be simplified. */
1562
1563 try
1564 gfc_simplify_expr (gfc_expr *p, int type)
1565 {
1566 gfc_actual_arglist *ap;
1567
1568 if (p == NULL)
1569 return SUCCESS;
1570
1571 switch (p->expr_type)
1572 {
1573 case EXPR_CONSTANT:
1574 case EXPR_NULL:
1575 break;
1576
1577 case EXPR_FUNCTION:
1578 for (ap = p->value.function.actual; ap; ap = ap->next)
1579 if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1580 return FAILURE;
1581
1582 if (p->value.function.isym != NULL
1583 && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1584 return FAILURE;
1585
1586 break;
1587
1588 case EXPR_SUBSTRING:
1589 if (simplify_ref_chain (p->ref, type) == FAILURE)
1590 return FAILURE;
1591
1592 if (gfc_is_constant_expr (p))
1593 {
1594 char *s;
1595 int start, end;
1596
1597 if (p->ref && p->ref->u.ss.start)
1598 {
1599 gfc_extract_int (p->ref->u.ss.start, &start);
1600 start--; /* Convert from one-based to zero-based. */
1601 }
1602 else
1603 start = 0;
1604
1605 if (p->ref && p->ref->u.ss.end)
1606 gfc_extract_int (p->ref->u.ss.end, &end);
1607 else
1608 end = p->value.character.length;
1609
1610 s = gfc_getmem (end - start + 2);
1611 memcpy (s, p->value.character.string + start, end - start);
1612 s[end - start + 1] = '\0'; /* TODO: C-style string. */
1613 gfc_free (p->value.character.string);
1614 p->value.character.string = s;
1615 p->value.character.length = end - start;
1616 p->ts.cl = gfc_get_charlen ();
1617 p->ts.cl->next = gfc_current_ns->cl_list;
1618 gfc_current_ns->cl_list = p->ts.cl;
1619 p->ts.cl->length = gfc_int_expr (p->value.character.length);
1620 gfc_free_ref_list (p->ref);
1621 p->ref = NULL;
1622 p->expr_type = EXPR_CONSTANT;
1623 }
1624 break;
1625
1626 case EXPR_OP:
1627 if (simplify_intrinsic_op (p, type) == FAILURE)
1628 return FAILURE;
1629 break;
1630
1631 case EXPR_VARIABLE:
1632 /* Only substitute array parameter variables if we are in an
1633 initialization expression, or we want a subsection. */
1634 if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1635 && (gfc_init_expr || p->ref
1636 || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1637 {
1638 if (simplify_parameter_variable (p, type) == FAILURE)
1639 return FAILURE;
1640 break;
1641 }
1642
1643 if (type == 1)
1644 {
1645 gfc_simplify_iterator_var (p);
1646 }
1647
1648 /* Simplify subcomponent references. */
1649 if (simplify_ref_chain (p->ref, type) == FAILURE)
1650 return FAILURE;
1651
1652 break;
1653
1654 case EXPR_STRUCTURE:
1655 case EXPR_ARRAY:
1656 if (simplify_ref_chain (p->ref, type) == FAILURE)
1657 return FAILURE;
1658
1659 if (simplify_constructor (p->value.constructor, type) == FAILURE)
1660 return FAILURE;
1661
1662 if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1663 && p->ref->u.ar.type == AR_FULL)
1664 gfc_expand_constructor (p);
1665
1666 if (simplify_const_ref (p) == FAILURE)
1667 return FAILURE;
1668
1669 break;
1670 }
1671
1672 return SUCCESS;
1673 }
1674
1675
1676 /* Returns the type of an expression with the exception that iterator
1677 variables are automatically integers no matter what else they may
1678 be declared as. */
1679
1680 static bt
1681 et0 (gfc_expr *e)
1682 {
1683 if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1684 return BT_INTEGER;
1685
1686 return e->ts.type;
1687 }
1688
1689
1690 /* Check an intrinsic arithmetic operation to see if it is consistent
1691 with some type of expression. */
1692
1693 static try check_init_expr (gfc_expr *);
1694
1695
1696 /* Scalarize an expression for an elemental intrinsic call. */
1697
1698 static try
1699 scalarize_intrinsic_call (gfc_expr *e)
1700 {
1701 gfc_actual_arglist *a, *b;
1702 gfc_constructor *args[5], *ctor, *new_ctor;
1703 gfc_expr *expr, *old;
1704 int n, i, rank[5];
1705
1706 old = gfc_copy_expr (e);
1707
1708 /* Assume that the old expression carries the type information and
1709 that the first arg carries all the shape information. */
1710 expr = gfc_copy_expr (old->value.function.actual->expr);
1711 gfc_free_constructor (expr->value.constructor);
1712 expr->value.constructor = NULL;
1713
1714 expr->ts = old->ts;
1715 expr->expr_type = EXPR_ARRAY;
1716
1717 /* Copy the array argument constructors into an array, with nulls
1718 for the scalars. */
1719 n = 0;
1720 a = old->value.function.actual;
1721 for (; a; a = a->next)
1722 {
1723 /* Check that this is OK for an initialization expression. */
1724 if (a->expr && check_init_expr (a->expr) == FAILURE)
1725 goto cleanup;
1726
1727 rank[n] = 0;
1728 if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
1729 {
1730 rank[n] = a->expr->rank;
1731 ctor = a->expr->symtree->n.sym->value->value.constructor;
1732 args[n] = gfc_copy_constructor (ctor);
1733 }
1734 else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
1735 {
1736 if (a->expr->rank)
1737 rank[n] = a->expr->rank;
1738 else
1739 rank[n] = 1;
1740 args[n] = gfc_copy_constructor (a->expr->value.constructor);
1741 }
1742 else
1743 args[n] = NULL;
1744 n++;
1745 }
1746
1747 for (i = 1; i < n; i++)
1748 if (rank[i] && rank[i] != rank[0])
1749 goto compliance;
1750
1751 /* Using the first argument as the master, step through the array
1752 calling the function for each element and advancing the array
1753 constructors together. */
1754 ctor = args[0];
1755 new_ctor = NULL;
1756 for (; ctor; ctor = ctor->next)
1757 {
1758 if (expr->value.constructor == NULL)
1759 expr->value.constructor
1760 = new_ctor = gfc_get_constructor ();
1761 else
1762 {
1763 new_ctor->next = gfc_get_constructor ();
1764 new_ctor = new_ctor->next;
1765 }
1766 new_ctor->expr = gfc_copy_expr (old);
1767 gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
1768 a = NULL;
1769 b = old->value.function.actual;
1770 for (i = 0; i < n; i++)
1771 {
1772 if (a == NULL)
1773 new_ctor->expr->value.function.actual
1774 = a = gfc_get_actual_arglist ();
1775 else
1776 {
1777 a->next = gfc_get_actual_arglist ();
1778 a = a->next;
1779 }
1780 if (args[i])
1781 a->expr = gfc_copy_expr (args[i]->expr);
1782 else
1783 a->expr = gfc_copy_expr (b->expr);
1784
1785 b = b->next;
1786 }
1787
1788 /* Simplify the function calls. */
1789 if (gfc_simplify_expr (new_ctor->expr, 0) == FAILURE)
1790 goto cleanup;
1791
1792 for (i = 0; i < n; i++)
1793 if (args[i])
1794 args[i] = args[i]->next;
1795
1796 for (i = 1; i < n; i++)
1797 if (rank[i] && ((args[i] != NULL && args[0] == NULL)
1798 || (args[i] == NULL && args[0] != NULL)))
1799 goto compliance;
1800 }
1801
1802 free_expr0 (e);
1803 *e = *expr;
1804 gfc_free_expr (old);
1805 return SUCCESS;
1806
1807 compliance:
1808 gfc_error_now ("elemental function arguments at %C are not compliant");
1809
1810 cleanup:
1811 gfc_free_expr (expr);
1812 gfc_free_expr (old);
1813 return FAILURE;
1814 }
1815
1816
1817 static try
1818 check_intrinsic_op (gfc_expr *e, try (*check_function) (gfc_expr *))
1819 {
1820 gfc_expr *op1 = e->value.op.op1;
1821 gfc_expr *op2 = e->value.op.op2;
1822
1823 if ((*check_function) (op1) == FAILURE)
1824 return FAILURE;
1825
1826 switch (e->value.op.operator)
1827 {
1828 case INTRINSIC_UPLUS:
1829 case INTRINSIC_UMINUS:
1830 if (!numeric_type (et0 (op1)))
1831 goto not_numeric;
1832 break;
1833
1834 case INTRINSIC_EQ:
1835 case INTRINSIC_EQ_OS:
1836 case INTRINSIC_NE:
1837 case INTRINSIC_NE_OS:
1838 case INTRINSIC_GT:
1839 case INTRINSIC_GT_OS:
1840 case INTRINSIC_GE:
1841 case INTRINSIC_GE_OS:
1842 case INTRINSIC_LT:
1843 case INTRINSIC_LT_OS:
1844 case INTRINSIC_LE:
1845 case INTRINSIC_LE_OS:
1846 if ((*check_function) (op2) == FAILURE)
1847 return FAILURE;
1848
1849 if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1850 && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
1851 {
1852 gfc_error ("Numeric or CHARACTER operands are required in "
1853 "expression at %L", &e->where);
1854 return FAILURE;
1855 }
1856 break;
1857
1858 case INTRINSIC_PLUS:
1859 case INTRINSIC_MINUS:
1860 case INTRINSIC_TIMES:
1861 case INTRINSIC_DIVIDE:
1862 case INTRINSIC_POWER:
1863 if ((*check_function) (op2) == FAILURE)
1864 return FAILURE;
1865
1866 if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
1867 goto not_numeric;
1868
1869 if (e->value.op.operator == INTRINSIC_POWER
1870 && check_function == check_init_expr && et0 (op2) != BT_INTEGER)
1871 {
1872 if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Noninteger "
1873 "exponent in an initialization "
1874 "expression at %L", &op2->where)
1875 == FAILURE)
1876 return FAILURE;
1877 }
1878
1879 break;
1880
1881 case INTRINSIC_CONCAT:
1882 if ((*check_function) (op2) == FAILURE)
1883 return FAILURE;
1884
1885 if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
1886 {
1887 gfc_error ("Concatenation operator in expression at %L "
1888 "must have two CHARACTER operands", &op1->where);
1889 return FAILURE;
1890 }
1891
1892 if (op1->ts.kind != op2->ts.kind)
1893 {
1894 gfc_error ("Concat operator at %L must concatenate strings of the "
1895 "same kind", &e->where);
1896 return FAILURE;
1897 }
1898
1899 break;
1900
1901 case INTRINSIC_NOT:
1902 if (et0 (op1) != BT_LOGICAL)
1903 {
1904 gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
1905 "operand", &op1->where);
1906 return FAILURE;
1907 }
1908
1909 break;
1910
1911 case INTRINSIC_AND:
1912 case INTRINSIC_OR:
1913 case INTRINSIC_EQV:
1914 case INTRINSIC_NEQV:
1915 if ((*check_function) (op2) == FAILURE)
1916 return FAILURE;
1917
1918 if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
1919 {
1920 gfc_error ("LOGICAL operands are required in expression at %L",
1921 &e->where);
1922 return FAILURE;
1923 }
1924
1925 break;
1926
1927 case INTRINSIC_PARENTHESES:
1928 break;
1929
1930 default:
1931 gfc_error ("Only intrinsic operators can be used in expression at %L",
1932 &e->where);
1933 return FAILURE;
1934 }
1935
1936 return SUCCESS;
1937
1938 not_numeric:
1939 gfc_error ("Numeric operands are required in expression at %L", &e->where);
1940
1941 return FAILURE;
1942 }
1943
1944
1945 static match
1946 check_init_expr_arguments (gfc_expr *e)
1947 {
1948 gfc_actual_arglist *ap;
1949
1950 for (ap = e->value.function.actual; ap; ap = ap->next)
1951 if (check_init_expr (ap->expr) == FAILURE)
1952 return MATCH_ERROR;
1953
1954 return MATCH_YES;
1955 }
1956
1957 /* F95, 7.1.6.1, Initialization expressions, (7)
1958 F2003, 7.1.7 Initialization expression, (8) */
1959
1960 static match
1961 check_inquiry (gfc_expr *e, int not_restricted)
1962 {
1963 const char *name;
1964 const char *const *functions;
1965
1966 static const char *const inquiry_func_f95[] = {
1967 "lbound", "shape", "size", "ubound",
1968 "bit_size", "len", "kind",
1969 "digits", "epsilon", "huge", "maxexponent", "minexponent",
1970 "precision", "radix", "range", "tiny",
1971 NULL
1972 };
1973
1974 static const char *const inquiry_func_f2003[] = {
1975 "lbound", "shape", "size", "ubound",
1976 "bit_size", "len", "kind",
1977 "digits", "epsilon", "huge", "maxexponent", "minexponent",
1978 "precision", "radix", "range", "tiny",
1979 "new_line", NULL
1980 };
1981
1982 int i;
1983 gfc_actual_arglist *ap;
1984
1985 if (!e->value.function.isym
1986 || !e->value.function.isym->inquiry)
1987 return MATCH_NO;
1988
1989 /* An undeclared parameter will get us here (PR25018). */
1990 if (e->symtree == NULL)
1991 return MATCH_NO;
1992
1993 name = e->symtree->n.sym->name;
1994
1995 functions = (gfc_option.warn_std & GFC_STD_F2003)
1996 ? inquiry_func_f2003 : inquiry_func_f95;
1997
1998 for (i = 0; functions[i]; i++)
1999 if (strcmp (functions[i], name) == 0)
2000 break;
2001
2002 if (functions[i] == NULL)
2003 return MATCH_ERROR;
2004
2005 /* At this point we have an inquiry function with a variable argument. The
2006 type of the variable might be undefined, but we need it now, because the
2007 arguments of these functions are not allowed to be undefined. */
2008
2009 for (ap = e->value.function.actual; ap; ap = ap->next)
2010 {
2011 if (!ap->expr)
2012 continue;
2013
2014 if (ap->expr->ts.type == BT_UNKNOWN)
2015 {
2016 if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
2017 && gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns)
2018 == FAILURE)
2019 return MATCH_NO;
2020
2021 ap->expr->ts = ap->expr->symtree->n.sym->ts;
2022 }
2023
2024 /* Assumed character length will not reduce to a constant expression
2025 with LEN, as required by the standard. */
2026 if (i == 5 && not_restricted
2027 && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
2028 && ap->expr->symtree->n.sym->ts.cl->length == NULL)
2029 {
2030 gfc_error ("Assumed character length variable '%s' in constant "
2031 "expression at %L", e->symtree->n.sym->name, &e->where);
2032 return MATCH_ERROR;
2033 }
2034 else if (not_restricted && check_init_expr (ap->expr) == FAILURE)
2035 return MATCH_ERROR;
2036 }
2037
2038 return MATCH_YES;
2039 }
2040
2041
2042 /* F95, 7.1.6.1, Initialization expressions, (5)
2043 F2003, 7.1.7 Initialization expression, (5) */
2044
2045 static match
2046 check_transformational (gfc_expr *e)
2047 {
2048 static const char * const trans_func_f95[] = {
2049 "repeat", "reshape", "selected_int_kind",
2050 "selected_real_kind", "transfer", "trim", NULL
2051 };
2052
2053 int i;
2054 const char *name;
2055
2056 if (!e->value.function.isym
2057 || !e->value.function.isym->transformational)
2058 return MATCH_NO;
2059
2060 name = e->symtree->n.sym->name;
2061
2062 /* NULL() is dealt with below. */
2063 if (strcmp ("null", name) == 0)
2064 return MATCH_NO;
2065
2066 for (i = 0; trans_func_f95[i]; i++)
2067 if (strcmp (trans_func_f95[i], name) == 0)
2068 break;
2069
2070 /* FIXME, F2003: implement translation of initialization
2071 expressions before enabling this check. For F95, error
2072 out if the transformational function is not in the list. */
2073 #if 0
2074 if (trans_func_f95[i] == NULL
2075 && gfc_notify_std (GFC_STD_F2003,
2076 "transformational intrinsic '%s' at %L is not permitted "
2077 "in an initialization expression", name, &e->where) == FAILURE)
2078 return MATCH_ERROR;
2079 #else
2080 if (trans_func_f95[i] == NULL)
2081 {
2082 gfc_error("transformational intrinsic '%s' at %L is not permitted "
2083 "in an initialization expression", name, &e->where);
2084 return MATCH_ERROR;
2085 }
2086 #endif
2087
2088 return check_init_expr_arguments (e);
2089 }
2090
2091
2092 /* F95, 7.1.6.1, Initialization expressions, (6)
2093 F2003, 7.1.7 Initialization expression, (6) */
2094
2095 static match
2096 check_null (gfc_expr *e)
2097 {
2098 if (strcmp ("null", e->symtree->n.sym->name) != 0)
2099 return MATCH_NO;
2100
2101 return check_init_expr_arguments (e);
2102 }
2103
2104
2105 static match
2106 check_elemental (gfc_expr *e)
2107 {
2108 if (!e->value.function.isym
2109 || !e->value.function.isym->elemental)
2110 return MATCH_NO;
2111
2112 if ((e->ts.type != BT_INTEGER || e->ts.type != BT_CHARACTER)
2113 && gfc_notify_std (GFC_STD_F2003, "Extension: Evaluation of "
2114 "nonstandard initialization expression at %L",
2115 &e->where) == FAILURE)
2116 return MATCH_ERROR;
2117
2118 return check_init_expr_arguments (e);
2119 }
2120
2121
2122 static match
2123 check_conversion (gfc_expr *e)
2124 {
2125 if (!e->value.function.isym
2126 || !e->value.function.isym->conversion)
2127 return MATCH_NO;
2128
2129 return check_init_expr_arguments (e);
2130 }
2131
2132
2133 /* Verify that an expression is an initialization expression. A side
2134 effect is that the expression tree is reduced to a single constant
2135 node if all goes well. This would normally happen when the
2136 expression is constructed but function references are assumed to be
2137 intrinsics in the context of initialization expressions. If
2138 FAILURE is returned an error message has been generated. */
2139
2140 static try
2141 check_init_expr (gfc_expr *e)
2142 {
2143 match m;
2144 try t;
2145 gfc_intrinsic_sym *isym;
2146
2147 if (e == NULL)
2148 return SUCCESS;
2149
2150 switch (e->expr_type)
2151 {
2152 case EXPR_OP:
2153 t = check_intrinsic_op (e, check_init_expr);
2154 if (t == SUCCESS)
2155 t = gfc_simplify_expr (e, 0);
2156
2157 break;
2158
2159 case EXPR_FUNCTION:
2160 t = FAILURE;
2161
2162 if ((m = check_specification_function (e)) != MATCH_YES)
2163 {
2164 if ((m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES)
2165 {
2166 gfc_error ("Function '%s' in initialization expression at %L "
2167 "must be an intrinsic or a specification function",
2168 e->symtree->n.sym->name, &e->where);
2169 break;
2170 }
2171
2172 if ((m = check_conversion (e)) == MATCH_NO
2173 && (m = check_inquiry (e, 1)) == MATCH_NO
2174 && (m = check_null (e)) == MATCH_NO
2175 && (m = check_transformational (e)) == MATCH_NO
2176 && (m = check_elemental (e)) == MATCH_NO)
2177 {
2178 gfc_error ("Intrinsic function '%s' at %L is not permitted "
2179 "in an initialization expression",
2180 e->symtree->n.sym->name, &e->where);
2181 m = MATCH_ERROR;
2182 }
2183
2184 /* Try to scalarize an elemental intrinsic function that has an
2185 array argument. */
2186 isym = gfc_find_function (e->symtree->n.sym->name);
2187 if (isym && isym->elemental
2188 && e->value.function.actual->expr->expr_type == EXPR_ARRAY)
2189 {
2190 if ((t = scalarize_intrinsic_call (e)) == SUCCESS)
2191 break;
2192 }
2193 }
2194
2195 if (m == MATCH_YES)
2196 t = gfc_simplify_expr (e, 0);
2197
2198 break;
2199
2200 case EXPR_VARIABLE:
2201 t = SUCCESS;
2202
2203 if (gfc_check_iter_variable (e) == SUCCESS)
2204 break;
2205
2206 if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2207 {
2208 /* A PARAMETER shall not be used to define itself, i.e.
2209 REAL, PARAMETER :: x = transfer(0, x)
2210 is invalid. */
2211 if (!e->symtree->n.sym->value)
2212 {
2213 gfc_error("PARAMETER '%s' is used at %L before its definition "
2214 "is complete", e->symtree->n.sym->name, &e->where);
2215 t = FAILURE;
2216 }
2217 else
2218 t = simplify_parameter_variable (e, 0);
2219
2220 break;
2221 }
2222
2223 if (gfc_in_match_data ())
2224 break;
2225
2226 t = FAILURE;
2227
2228 if (e->symtree->n.sym->as)
2229 {
2230 switch (e->symtree->n.sym->as->type)
2231 {
2232 case AS_ASSUMED_SIZE:
2233 gfc_error ("Assumed size array '%s' at %L is not permitted "
2234 "in an initialization expression",
2235 e->symtree->n.sym->name, &e->where);
2236 break;
2237
2238 case AS_ASSUMED_SHAPE:
2239 gfc_error ("Assumed shape array '%s' at %L is not permitted "
2240 "in an initialization expression",
2241 e->symtree->n.sym->name, &e->where);
2242 break;
2243
2244 case AS_DEFERRED:
2245 gfc_error ("Deferred array '%s' at %L is not permitted "
2246 "in an initialization expression",
2247 e->symtree->n.sym->name, &e->where);
2248 break;
2249
2250 case AS_EXPLICIT:
2251 gfc_error ("Array '%s' at %L is a variable, which does "
2252 "not reduce to a constant expression",
2253 e->symtree->n.sym->name, &e->where);
2254 break;
2255
2256 default:
2257 gcc_unreachable();
2258 }
2259 }
2260 else
2261 gfc_error ("Parameter '%s' at %L has not been declared or is "
2262 "a variable, which does not reduce to a constant "
2263 "expression", e->symtree->n.sym->name, &e->where);
2264
2265 break;
2266
2267 case EXPR_CONSTANT:
2268 case EXPR_NULL:
2269 t = SUCCESS;
2270 break;
2271
2272 case EXPR_SUBSTRING:
2273 t = check_init_expr (e->ref->u.ss.start);
2274 if (t == FAILURE)
2275 break;
2276
2277 t = check_init_expr (e->ref->u.ss.end);
2278 if (t == SUCCESS)
2279 t = gfc_simplify_expr (e, 0);
2280
2281 break;
2282
2283 case EXPR_STRUCTURE:
2284 if (e->ts.is_iso_c)
2285 t = SUCCESS;
2286 else
2287 t = gfc_check_constructor (e, check_init_expr);
2288 break;
2289
2290 case EXPR_ARRAY:
2291 t = gfc_check_constructor (e, check_init_expr);
2292 if (t == FAILURE)
2293 break;
2294
2295 t = gfc_expand_constructor (e);
2296 if (t == FAILURE)
2297 break;
2298
2299 t = gfc_check_constructor_type (e);
2300 break;
2301
2302 default:
2303 gfc_internal_error ("check_init_expr(): Unknown expression type");
2304 }
2305
2306 return t;
2307 }
2308
2309
2310 /* Match an initialization expression. We work by first matching an
2311 expression, then reducing it to a constant. */
2312
2313 match
2314 gfc_match_init_expr (gfc_expr **result)
2315 {
2316 gfc_expr *expr;
2317 match m;
2318 try t;
2319
2320 m = gfc_match_expr (&expr);
2321 if (m != MATCH_YES)
2322 return m;
2323
2324 gfc_init_expr = 1;
2325 t = gfc_resolve_expr (expr);
2326 if (t == SUCCESS)
2327 t = check_init_expr (expr);
2328 gfc_init_expr = 0;
2329
2330 if (t == FAILURE)
2331 {
2332 gfc_free_expr (expr);
2333 return MATCH_ERROR;
2334 }
2335
2336 if (expr->expr_type == EXPR_ARRAY
2337 && (gfc_check_constructor_type (expr) == FAILURE
2338 || gfc_expand_constructor (expr) == FAILURE))
2339 {
2340 gfc_free_expr (expr);
2341 return MATCH_ERROR;
2342 }
2343
2344 /* Not all inquiry functions are simplified to constant expressions
2345 so it is necessary to call check_inquiry again. */
2346 if (!gfc_is_constant_expr (expr) && check_inquiry (expr, 1) != MATCH_YES
2347 && !gfc_in_match_data ())
2348 {
2349 gfc_error ("Initialization expression didn't reduce %C");
2350 return MATCH_ERROR;
2351 }
2352
2353 *result = expr;
2354
2355 return MATCH_YES;
2356 }
2357
2358
2359 static try check_restricted (gfc_expr *);
2360
2361 /* Given an actual argument list, test to see that each argument is a
2362 restricted expression and optionally if the expression type is
2363 integer or character. */
2364
2365 static try
2366 restricted_args (gfc_actual_arglist *a)
2367 {
2368 for (; a; a = a->next)
2369 {
2370 if (check_restricted (a->expr) == FAILURE)
2371 return FAILURE;
2372 }
2373
2374 return SUCCESS;
2375 }
2376
2377
2378 /************* Restricted/specification expressions *************/
2379
2380
2381 /* Make sure a non-intrinsic function is a specification function. */
2382
2383 static try
2384 external_spec_function (gfc_expr *e)
2385 {
2386 gfc_symbol *f;
2387
2388 f = e->value.function.esym;
2389
2390 if (f->attr.proc == PROC_ST_FUNCTION)
2391 {
2392 gfc_error ("Specification function '%s' at %L cannot be a statement "
2393 "function", f->name, &e->where);
2394 return FAILURE;
2395 }
2396
2397 if (f->attr.proc == PROC_INTERNAL)
2398 {
2399 gfc_error ("Specification function '%s' at %L cannot be an internal "
2400 "function", f->name, &e->where);
2401 return FAILURE;
2402 }
2403
2404 if (!f->attr.pure && !f->attr.elemental)
2405 {
2406 gfc_error ("Specification function '%s' at %L must be PURE", f->name,
2407 &e->where);
2408 return FAILURE;
2409 }
2410
2411 if (f->attr.recursive)
2412 {
2413 gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
2414 f->name, &e->where);
2415 return FAILURE;
2416 }
2417
2418 return restricted_args (e->value.function.actual);
2419 }
2420
2421
2422 /* Check to see that a function reference to an intrinsic is a
2423 restricted expression. */
2424
2425 static try
2426 restricted_intrinsic (gfc_expr *e)
2427 {
2428 /* TODO: Check constraints on inquiry functions. 7.1.6.2 (7). */
2429 if (check_inquiry (e, 0) == MATCH_YES)
2430 return SUCCESS;
2431
2432 return restricted_args (e->value.function.actual);
2433 }
2434
2435
2436 /* Verify that an expression is a restricted expression. Like its
2437 cousin check_init_expr(), an error message is generated if we
2438 return FAILURE. */
2439
2440 static try
2441 check_restricted (gfc_expr *e)
2442 {
2443 gfc_symbol *sym;
2444 try t;
2445
2446 if (e == NULL)
2447 return SUCCESS;
2448
2449 switch (e->expr_type)
2450 {
2451 case EXPR_OP:
2452 t = check_intrinsic_op (e, check_restricted);
2453 if (t == SUCCESS)
2454 t = gfc_simplify_expr (e, 0);
2455
2456 break;
2457
2458 case EXPR_FUNCTION:
2459 t = e->value.function.esym ? external_spec_function (e)
2460 : restricted_intrinsic (e);
2461 break;
2462
2463 case EXPR_VARIABLE:
2464 sym = e->symtree->n.sym;
2465 t = FAILURE;
2466
2467 /* If a dummy argument appears in a context that is valid for a
2468 restricted expression in an elemental procedure, it will have
2469 already been simplified away once we get here. Therefore we
2470 don't need to jump through hoops to distinguish valid from
2471 invalid cases. */
2472 if (sym->attr.dummy && sym->ns == gfc_current_ns
2473 && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
2474 {
2475 gfc_error ("Dummy argument '%s' not allowed in expression at %L",
2476 sym->name, &e->where);
2477 break;
2478 }
2479
2480 if (sym->attr.optional)
2481 {
2482 gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2483 sym->name, &e->where);
2484 break;
2485 }
2486
2487 if (sym->attr.intent == INTENT_OUT)
2488 {
2489 gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2490 sym->name, &e->where);
2491 break;
2492 }
2493
2494 /* gfc_is_formal_arg broadcasts that a formal argument list is being
2495 processed in resolve.c(resolve_formal_arglist). This is done so
2496 that host associated dummy array indices are accepted (PR23446).
2497 This mechanism also does the same for the specification expressions
2498 of array-valued functions. */
2499 if (sym->attr.in_common
2500 || sym->attr.use_assoc
2501 || sym->attr.dummy
2502 || sym->attr.implied_index
2503 || sym->ns != gfc_current_ns
2504 || (sym->ns->proc_name != NULL
2505 && sym->ns->proc_name->attr.flavor == FL_MODULE)
2506 || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2507 {
2508 t = SUCCESS;
2509 break;
2510 }
2511
2512 gfc_error ("Variable '%s' cannot appear in the expression at %L",
2513 sym->name, &e->where);
2514
2515 break;
2516
2517 case EXPR_NULL:
2518 case EXPR_CONSTANT:
2519 t = SUCCESS;
2520 break;
2521
2522 case EXPR_SUBSTRING:
2523 t = gfc_specification_expr (e->ref->u.ss.start);
2524 if (t == FAILURE)
2525 break;
2526
2527 t = gfc_specification_expr (e->ref->u.ss.end);
2528 if (t == SUCCESS)
2529 t = gfc_simplify_expr (e, 0);
2530
2531 break;
2532
2533 case EXPR_STRUCTURE:
2534 t = gfc_check_constructor (e, check_restricted);
2535 break;
2536
2537 case EXPR_ARRAY:
2538 t = gfc_check_constructor (e, check_restricted);
2539 break;
2540
2541 default:
2542 gfc_internal_error ("check_restricted(): Unknown expression type");
2543 }
2544
2545 return t;
2546 }
2547
2548
2549 /* Check to see that an expression is a specification expression. If
2550 we return FAILURE, an error has been generated. */
2551
2552 try
2553 gfc_specification_expr (gfc_expr *e)
2554 {
2555
2556 if (e == NULL)
2557 return SUCCESS;
2558
2559 if (e->ts.type != BT_INTEGER)
2560 {
2561 gfc_error ("Expression at %L must be of INTEGER type", &e->where);
2562 return FAILURE;
2563 }
2564
2565 if (e->expr_type == EXPR_FUNCTION
2566 && !e->value.function.isym
2567 && !e->value.function.esym
2568 && !gfc_pure (e->symtree->n.sym))
2569 {
2570 gfc_error ("Function '%s' at %L must be PURE",
2571 e->symtree->n.sym->name, &e->where);
2572 /* Prevent repeat error messages. */
2573 e->symtree->n.sym->attr.pure = 1;
2574 return FAILURE;
2575 }
2576
2577 if (e->rank != 0)
2578 {
2579 gfc_error ("Expression at %L must be scalar", &e->where);
2580 return FAILURE;
2581 }
2582
2583 if (gfc_simplify_expr (e, 0) == FAILURE)
2584 return FAILURE;
2585
2586 return check_restricted (e);
2587 }
2588
2589
2590 /************** Expression conformance checks. *************/
2591
2592 /* Given two expressions, make sure that the arrays are conformable. */
2593
2594 try
2595 gfc_check_conformance (const char *optype_msgid, gfc_expr *op1, gfc_expr *op2)
2596 {
2597 int op1_flag, op2_flag, d;
2598 mpz_t op1_size, op2_size;
2599 try t;
2600
2601 if (op1->rank == 0 || op2->rank == 0)
2602 return SUCCESS;
2603
2604 if (op1->rank != op2->rank)
2605 {
2606 gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(optype_msgid),
2607 op1->rank, op2->rank, &op1->where);
2608 return FAILURE;
2609 }
2610
2611 t = SUCCESS;
2612
2613 for (d = 0; d < op1->rank; d++)
2614 {
2615 op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2616 op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2617
2618 if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2619 {
2620 gfc_error ("Different shape for %s at %L on dimension %d "
2621 "(%d and %d)", _(optype_msgid), &op1->where, d + 1,
2622 (int) mpz_get_si (op1_size),
2623 (int) mpz_get_si (op2_size));
2624
2625 t = FAILURE;
2626 }
2627
2628 if (op1_flag)
2629 mpz_clear (op1_size);
2630 if (op2_flag)
2631 mpz_clear (op2_size);
2632
2633 if (t == FAILURE)
2634 return FAILURE;
2635 }
2636
2637 return SUCCESS;
2638 }
2639
2640
2641 /* Given an assignable expression and an arbitrary expression, make
2642 sure that the assignment can take place. */
2643
2644 try
2645 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
2646 {
2647 gfc_symbol *sym;
2648 gfc_ref *ref;
2649 int has_pointer;
2650
2651 sym = lvalue->symtree->n.sym;
2652
2653 /* Check INTENT(IN), unless the object itself is the component or
2654 sub-component of a pointer. */
2655 has_pointer = sym->attr.pointer;
2656
2657 for (ref = lvalue->ref; ref; ref = ref->next)
2658 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2659 {
2660 has_pointer = 1;
2661 break;
2662 }
2663
2664 if (!has_pointer && sym->attr.intent == INTENT_IN)
2665 {
2666 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2667 sym->name, &lvalue->where);
2668 return FAILURE;
2669 }
2670
2671 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2672 variable local to a function subprogram. Its existence begins when
2673 execution of the function is initiated and ends when execution of the
2674 function is terminated...
2675 Therefore, the left hand side is no longer a variable, when it is: */
2676 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
2677 && !sym->attr.external)
2678 {
2679 bool bad_proc;
2680 bad_proc = false;
2681
2682 /* (i) Use associated; */
2683 if (sym->attr.use_assoc)
2684 bad_proc = true;
2685
2686 /* (ii) The assignment is in the main program; or */
2687 if (gfc_current_ns->proc_name->attr.is_main_program)
2688 bad_proc = true;
2689
2690 /* (iii) A module or internal procedure... */
2691 if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2692 || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2693 && gfc_current_ns->parent
2694 && (!(gfc_current_ns->parent->proc_name->attr.function
2695 || gfc_current_ns->parent->proc_name->attr.subroutine)
2696 || gfc_current_ns->parent->proc_name->attr.is_main_program))
2697 {
2698 /* ... that is not a function... */
2699 if (!gfc_current_ns->proc_name->attr.function)
2700 bad_proc = true;
2701
2702 /* ... or is not an entry and has a different name. */
2703 if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2704 bad_proc = true;
2705 }
2706
2707 if (bad_proc)
2708 {
2709 gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2710 return FAILURE;
2711 }
2712 }
2713
2714 if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2715 {
2716 gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2717 lvalue->rank, rvalue->rank, &lvalue->where);
2718 return FAILURE;
2719 }
2720
2721 if (lvalue->ts.type == BT_UNKNOWN)
2722 {
2723 gfc_error ("Variable type is UNKNOWN in assignment at %L",
2724 &lvalue->where);
2725 return FAILURE;
2726 }
2727
2728 if (rvalue->expr_type == EXPR_NULL)
2729 {
2730 if (lvalue->symtree->n.sym->attr.pointer
2731 && lvalue->symtree->n.sym->attr.data)
2732 return SUCCESS;
2733 else
2734 {
2735 gfc_error ("NULL appears on right-hand side in assignment at %L",
2736 &rvalue->where);
2737 return FAILURE;
2738 }
2739 }
2740
2741 if (sym->attr.cray_pointee
2742 && lvalue->ref != NULL
2743 && lvalue->ref->u.ar.type == AR_FULL
2744 && lvalue->ref->u.ar.as->cp_was_assumed)
2745 {
2746 gfc_error ("Vector assignment to assumed-size Cray Pointee at %L "
2747 "is illegal", &lvalue->where);
2748 return FAILURE;
2749 }
2750
2751 /* This is possibly a typo: x = f() instead of x => f(). */
2752 if (gfc_option.warn_surprising
2753 && rvalue->expr_type == EXPR_FUNCTION
2754 && rvalue->symtree->n.sym->attr.pointer)
2755 gfc_warning ("POINTER valued function appears on right-hand side of "
2756 "assignment at %L", &rvalue->where);
2757
2758 /* Check size of array assignments. */
2759 if (lvalue->rank != 0 && rvalue->rank != 0
2760 && gfc_check_conformance ("array assignment", lvalue, rvalue) != SUCCESS)
2761 return FAILURE;
2762
2763 if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
2764 && lvalue->symtree->n.sym->attr.data
2765 && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L used to "
2766 "initialize non-integer variable '%s'",
2767 &rvalue->where, lvalue->symtree->n.sym->name)
2768 == FAILURE)
2769 return FAILURE;
2770 else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
2771 && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L outside "
2772 "a DATA statement and outside INT/REAL/DBLE/CMPLX",
2773 &rvalue->where) == FAILURE)
2774 return FAILURE;
2775
2776 /* Handle the case of a BOZ literal on the RHS. */
2777 if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
2778 {
2779 int rc;
2780 if (gfc_option.warn_surprising)
2781 gfc_warning ("BOZ literal at %L is bitwise transferred "
2782 "non-integer symbol '%s'", &rvalue->where,
2783 lvalue->symtree->n.sym->name);
2784 if (!gfc_convert_boz (rvalue, &lvalue->ts))
2785 return FAILURE;
2786 if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
2787 {
2788 if (rc == ARITH_UNDERFLOW)
2789 gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
2790 ". This check can be disabled with the option "
2791 "-fno-range-check", &rvalue->where);
2792 else if (rc == ARITH_OVERFLOW)
2793 gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
2794 ". This check can be disabled with the option "
2795 "-fno-range-check", &rvalue->where);
2796 else if (rc == ARITH_NAN)
2797 gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
2798 ". This check can be disabled with the option "
2799 "-fno-range-check", &rvalue->where);
2800 return FAILURE;
2801 }
2802 }
2803
2804 if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2805 return SUCCESS;
2806
2807 if (!conform)
2808 {
2809 /* Numeric can be converted to any other numeric. And Hollerith can be
2810 converted to any other type. */
2811 if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2812 || rvalue->ts.type == BT_HOLLERITH)
2813 return SUCCESS;
2814
2815 if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2816 return SUCCESS;
2817
2818 gfc_error ("Incompatible types in assignment at %L, %s to %s",
2819 &rvalue->where, gfc_typename (&rvalue->ts),
2820 gfc_typename (&lvalue->ts));
2821
2822 return FAILURE;
2823 }
2824
2825 return gfc_convert_type (rvalue, &lvalue->ts, 1);
2826 }
2827
2828
2829 /* Check that a pointer assignment is OK. We first check lvalue, and
2830 we only check rvalue if it's not an assignment to NULL() or a
2831 NULLIFY statement. */
2832
2833 try
2834 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
2835 {
2836 symbol_attribute attr;
2837 gfc_ref *ref;
2838 int is_pure;
2839 int pointer, check_intent_in;
2840
2841 if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN)
2842 {
2843 gfc_error ("Pointer assignment target is not a POINTER at %L",
2844 &lvalue->where);
2845 return FAILURE;
2846 }
2847
2848 if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
2849 && lvalue->symtree->n.sym->attr.use_assoc)
2850 {
2851 gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2852 "l-value since it is a procedure",
2853 lvalue->symtree->n.sym->name, &lvalue->where);
2854 return FAILURE;
2855 }
2856
2857
2858 /* Check INTENT(IN), unless the object itself is the component or
2859 sub-component of a pointer. */
2860 check_intent_in = 1;
2861 pointer = lvalue->symtree->n.sym->attr.pointer;
2862
2863 for (ref = lvalue->ref; ref; ref = ref->next)
2864 {
2865 if (pointer)
2866 check_intent_in = 0;
2867
2868 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2869 pointer = 1;
2870 }
2871
2872 if (check_intent_in && lvalue->symtree->n.sym->attr.intent == INTENT_IN)
2873 {
2874 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2875 lvalue->symtree->n.sym->name, &lvalue->where);
2876 return FAILURE;
2877 }
2878
2879 if (!pointer)
2880 {
2881 gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2882 return FAILURE;
2883 }
2884
2885 is_pure = gfc_pure (NULL);
2886
2887 if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym)
2888 && lvalue->symtree->n.sym->value != rvalue)
2889 {
2890 gfc_error ("Bad pointer object in PURE procedure at %L", &lvalue->where);
2891 return FAILURE;
2892 }
2893
2894 /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2895 kind, etc for lvalue and rvalue must match, and rvalue must be a
2896 pure variable if we're in a pure function. */
2897 if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
2898 return SUCCESS;
2899
2900 if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
2901 {
2902 gfc_error ("Different types in pointer assignment at %L",
2903 &lvalue->where);
2904 return FAILURE;
2905 }
2906
2907 if (lvalue->ts.kind != rvalue->ts.kind)
2908 {
2909 gfc_error ("Different kind type parameters in pointer "
2910 "assignment at %L", &lvalue->where);
2911 return FAILURE;
2912 }
2913
2914 if (lvalue->rank != rvalue->rank)
2915 {
2916 gfc_error ("Different ranks in pointer assignment at %L",
2917 &lvalue->where);
2918 return FAILURE;
2919 }
2920
2921 /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X). */
2922 if (rvalue->expr_type == EXPR_NULL)
2923 return SUCCESS;
2924
2925 if (lvalue->ts.type == BT_CHARACTER
2926 && lvalue->ts.cl && rvalue->ts.cl
2927 && lvalue->ts.cl->length && rvalue->ts.cl->length
2928 && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
2929 rvalue->ts.cl->length)) == 1)
2930 {
2931 gfc_error ("Different character lengths in pointer "
2932 "assignment at %L", &lvalue->where);
2933 return FAILURE;
2934 }
2935
2936 if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
2937 lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
2938
2939 attr = gfc_expr_attr (rvalue);
2940 if (!attr.target && !attr.pointer)
2941 {
2942 gfc_error ("Pointer assignment target is neither TARGET "
2943 "nor POINTER at %L", &rvalue->where);
2944 return FAILURE;
2945 }
2946
2947 if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
2948 {
2949 gfc_error ("Bad target in pointer assignment in PURE "
2950 "procedure at %L", &rvalue->where);
2951 }
2952
2953 if (gfc_has_vector_index (rvalue))
2954 {
2955 gfc_error ("Pointer assignment with vector subscript "
2956 "on rhs at %L", &rvalue->where);
2957 return FAILURE;
2958 }
2959
2960 if (attr.protected && attr.use_assoc)
2961 {
2962 gfc_error ("Pointer assigment target has PROTECTED "
2963 "attribute at %L", &rvalue->where);
2964 return FAILURE;
2965 }
2966
2967 return SUCCESS;
2968 }
2969
2970
2971 /* Relative of gfc_check_assign() except that the lvalue is a single
2972 symbol. Used for initialization assignments. */
2973
2974 try
2975 gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
2976 {
2977 gfc_expr lvalue;
2978 try r;
2979
2980 memset (&lvalue, '\0', sizeof (gfc_expr));
2981
2982 lvalue.expr_type = EXPR_VARIABLE;
2983 lvalue.ts = sym->ts;
2984 if (sym->as)
2985 lvalue.rank = sym->as->rank;
2986 lvalue.symtree = (gfc_symtree *) gfc_getmem (sizeof (gfc_symtree));
2987 lvalue.symtree->n.sym = sym;
2988 lvalue.where = sym->declared_at;
2989
2990 if (sym->attr.pointer)
2991 r = gfc_check_pointer_assign (&lvalue, rvalue);
2992 else
2993 r = gfc_check_assign (&lvalue, rvalue, 1);
2994
2995 gfc_free (lvalue.symtree);
2996
2997 return r;
2998 }
2999
3000
3001 /* Get an expression for a default initializer. */
3002
3003 gfc_expr *
3004 gfc_default_initializer (gfc_typespec *ts)
3005 {
3006 gfc_constructor *tail;
3007 gfc_expr *init;
3008 gfc_component *c;
3009
3010 /* See if we have a default initializer. */
3011 for (c = ts->derived->components; c; c = c->next)
3012 if (c->initializer || c->allocatable)
3013 break;
3014
3015 if (!c)
3016 return NULL;
3017
3018 /* Build the constructor. */
3019 init = gfc_get_expr ();
3020 init->expr_type = EXPR_STRUCTURE;
3021 init->ts = *ts;
3022 init->where = ts->derived->declared_at;
3023
3024 tail = NULL;
3025 for (c = ts->derived->components; c; c = c->next)
3026 {
3027 if (tail == NULL)
3028 init->value.constructor = tail = gfc_get_constructor ();
3029 else
3030 {
3031 tail->next = gfc_get_constructor ();
3032 tail = tail->next;
3033 }
3034
3035 if (c->initializer)
3036 tail->expr = gfc_copy_expr (c->initializer);
3037
3038 if (c->allocatable)
3039 {
3040 tail->expr = gfc_get_expr ();
3041 tail->expr->expr_type = EXPR_NULL;
3042 tail->expr->ts = c->ts;
3043 }
3044 }
3045 return init;
3046 }
3047
3048
3049 /* Given a symbol, create an expression node with that symbol as a
3050 variable. If the symbol is array valued, setup a reference of the
3051 whole array. */
3052
3053 gfc_expr *
3054 gfc_get_variable_expr (gfc_symtree *var)
3055 {
3056 gfc_expr *e;
3057
3058 e = gfc_get_expr ();
3059 e->expr_type = EXPR_VARIABLE;
3060 e->symtree = var;
3061 e->ts = var->n.sym->ts;
3062
3063 if (var->n.sym->as != NULL)
3064 {
3065 e->rank = var->n.sym->as->rank;
3066 e->ref = gfc_get_ref ();
3067 e->ref->type = REF_ARRAY;
3068 e->ref->u.ar.type = AR_FULL;
3069 }
3070
3071 return e;
3072 }
3073
3074
3075 /* General expression traversal function. */
3076
3077 bool
3078 gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
3079 bool (*func)(gfc_expr *, gfc_symbol *, int*),
3080 int f)
3081 {
3082 gfc_array_ref ar;
3083 gfc_ref *ref;
3084 gfc_actual_arglist *args;
3085 gfc_constructor *c;
3086 int i;
3087
3088 if (!expr)
3089 return false;
3090
3091 if ((*func) (expr, sym, &f))
3092 return true;
3093
3094 if (expr->ts.type == BT_CHARACTER
3095 && expr->ts.cl
3096 && expr->ts.cl->length
3097 && expr->ts.cl->length->expr_type != EXPR_CONSTANT
3098 && gfc_traverse_expr (expr->ts.cl->length, sym, func, f))
3099 return true;
3100
3101 switch (expr->expr_type)
3102 {
3103 case EXPR_FUNCTION:
3104 for (args = expr->value.function.actual; args; args = args->next)
3105 {
3106 if (gfc_traverse_expr (args->expr, sym, func, f))
3107 return true;
3108 }
3109 break;
3110
3111 case EXPR_VARIABLE:
3112 case EXPR_CONSTANT:
3113 case EXPR_NULL:
3114 case EXPR_SUBSTRING:
3115 break;
3116
3117 case EXPR_STRUCTURE:
3118 case EXPR_ARRAY:
3119 for (c = expr->value.constructor; c; c = c->next)
3120 {
3121 if (gfc_traverse_expr (c->expr, sym, func, f))
3122 return true;
3123 if (c->iterator)
3124 {
3125 if (gfc_traverse_expr (c->iterator->var, sym, func, f))
3126 return true;
3127 if (gfc_traverse_expr (c->iterator->start, sym, func, f))
3128 return true;
3129 if (gfc_traverse_expr (c->iterator->end, sym, func, f))
3130 return true;
3131 if (gfc_traverse_expr (c->iterator->step, sym, func, f))
3132 return true;
3133 }
3134 }
3135 break;
3136
3137 case EXPR_OP:
3138 if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
3139 return true;
3140 if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
3141 return true;
3142 break;
3143
3144 default:
3145 gcc_unreachable ();
3146 break;
3147 }
3148
3149 ref = expr->ref;
3150 while (ref != NULL)
3151 {
3152 switch (ref->type)
3153 {
3154 case REF_ARRAY:
3155 ar = ref->u.ar;
3156 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
3157 {
3158 if (gfc_traverse_expr (ar.start[i], sym, func, f))
3159 return true;
3160 if (gfc_traverse_expr (ar.end[i], sym, func, f))
3161 return true;
3162 if (gfc_traverse_expr (ar.stride[i], sym, func, f))
3163 return true;
3164 }
3165 break;
3166
3167 case REF_SUBSTRING:
3168 if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
3169 return true;
3170 if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
3171 return true;
3172 break;
3173
3174 case REF_COMPONENT:
3175 if (ref->u.c.component->ts.type == BT_CHARACTER
3176 && ref->u.c.component->ts.cl
3177 && ref->u.c.component->ts.cl->length
3178 && ref->u.c.component->ts.cl->length->expr_type
3179 != EXPR_CONSTANT
3180 && gfc_traverse_expr (ref->u.c.component->ts.cl->length,
3181 sym, func, f))
3182 return true;
3183
3184 if (ref->u.c.component->as)
3185 for (i = 0; i < ref->u.c.component->as->rank; i++)
3186 {
3187 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
3188 sym, func, f))
3189 return true;
3190 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
3191 sym, func, f))
3192 return true;
3193 }
3194 break;
3195
3196 default:
3197 gcc_unreachable ();
3198 }
3199 ref = ref->next;
3200 }
3201 return false;
3202 }
3203
3204 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
3205
3206 static bool
3207 expr_set_symbols_referenced (gfc_expr *expr,
3208 gfc_symbol *sym ATTRIBUTE_UNUSED,
3209 int *f ATTRIBUTE_UNUSED)
3210 {
3211 if (expr->expr_type != EXPR_VARIABLE)
3212 return false;
3213 gfc_set_sym_referenced (expr->symtree->n.sym);
3214 return false;
3215 }
3216
3217 void
3218 gfc_expr_set_symbols_referenced (gfc_expr *expr)
3219 {
3220 gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
3221 }