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