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