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