]> gcc.gnu.org Git - gcc.git/blame - gcc/fortran/expr.c
re PR c++/30818 (templates and typedefs cause function prototype not to match)
[gcc.git] / gcc / fortran / expr.c
CommitLineData
6de9cd9a 1/* Routines for manipulation of expression nodes.
636dff67
SK
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
3 Free Software Foundation, Inc.
6de9cd9a
DN
4 Contributed by Andy Vaught
5
9fc4d79b 6This file is part of GCC.
6de9cd9a 7
9fc4d79b
TS
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 2, or (at your option) any later
11version.
6de9cd9a 12
9fc4d79b
TS
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
6de9cd9a
DN
17
18You should have received a copy of the GNU General Public License
9fc4d79b 19along with GCC; see the file COPYING. If not, write to the Free
ab57747b
KC
20Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2102110-1301, USA. */
6de9cd9a
DN
22
23#include "config.h"
d22e4895 24#include "system.h"
6de9cd9a
DN
25#include "gfortran.h"
26#include "arith.h"
27#include "match.h"
28
29/* Get a new expr node. */
30
31gfc_expr *
32gfc_get_expr (void)
33{
34 gfc_expr *e;
35
36 e = gfc_getmem (sizeof (gfc_expr));
6de9cd9a 37 gfc_clear_ts (&e->ts);
6de9cd9a
DN
38 e->shape = NULL;
39 e->ref = NULL;
40 e->symtree = NULL;
5868cbf9 41 e->con_by_offset = NULL;
6de9cd9a
DN
42 return e;
43}
44
45
46/* Free an argument list and everything below it. */
47
48void
636dff67 49gfc_free_actual_arglist (gfc_actual_arglist *a1)
6de9cd9a
DN
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
65gfc_actual_arglist *
636dff67 66gfc_copy_actual_arglist (gfc_actual_arglist *p)
6de9cd9a
DN
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
94void
636dff67 95gfc_free_ref_list (gfc_ref *p)
6de9cd9a
DN
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
135static void
636dff67 136free_expr0 (gfc_expr *e)
6de9cd9a
DN
137{
138 int n;
139
140 switch (e->expr_type)
141 {
142 case EXPR_CONSTANT:
20585ad6 143 /* Free any parts of the value that need freeing. */
6de9cd9a
DN
144 switch (e->ts.type)
145 {
146 case BT_INTEGER:
147 mpz_clear (e->value.integer);
148 break;
149
150 case BT_REAL:
f8e566e5 151 mpfr_clear (e->value.real);
6de9cd9a
DN
152 break;
153
154 case BT_CHARACTER:
155 gfc_free (e->value.character.string);
156 break;
157
158 case BT_COMPLEX:
f8e566e5
SK
159 mpfr_clear (e->value.complex.r);
160 mpfr_clear (e->value.complex.i);
6de9cd9a
DN
161 break;
162
163 default:
164 break;
165 }
166
20585ad6
BM
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
6de9cd9a
DN
172 break;
173
174 case EXPR_OP:
58b03ab2
TS
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);
6de9cd9a
DN
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
221void
636dff67 222gfc_free_expr (gfc_expr *e)
6de9cd9a 223{
6de9cd9a
DN
224 if (e == NULL)
225 return;
5868cbf9
BD
226 if (e->con_by_offset)
227 splay_tree_delete (e->con_by_offset);
6de9cd9a
DN
228 free_expr0 (e);
229 gfc_free (e);
230}
231
232
233/* Graft the *src expression onto the *dest subexpression. */
234
235void
636dff67 236gfc_replace_expr (gfc_expr *dest, gfc_expr *src)
6de9cd9a 237{
6de9cd9a
DN
238 free_expr0 (dest);
239 *dest = *src;
6de9cd9a
DN
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
249const char *
636dff67 250gfc_extract_int (gfc_expr *expr, int *result)
6de9cd9a 251{
6de9cd9a 252 if (expr->expr_type != EXPR_CONSTANT)
31043f6c 253 return _("Constant expression required at %C");
6de9cd9a
DN
254
255 if (expr->ts.type != BT_INTEGER)
31043f6c 256 return _("Integer expression required at %C");
6de9cd9a
DN
257
258 if ((mpz_cmp_si (expr->value.integer, INT_MAX) > 0)
259 || (mpz_cmp_si (expr->value.integer, INT_MIN) < 0))
260 {
31043f6c 261 return _("Integer value too large in expression at %C");
6de9cd9a
DN
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
272static gfc_ref *
636dff67 273copy_ref (gfc_ref *src)
6de9cd9a
DN
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
636dff67 309/* Detect whether an expression has any vector index array references. */
4075a94e
PT
310
311int
312gfc_has_vector_index (gfc_expr *e)
313{
636dff67 314 gfc_ref *ref;
4075a94e
PT
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
6de9cd9a
DN
325/* Copy a shape array. */
326
327mpz_t *
636dff67 328gfc_copy_shape (mpz_t *shape, int rank)
6de9cd9a
DN
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
94538bd1
VL
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
66e4ab31 355 of range -- or anything else, just returns NULL. */
94538bd1
VL
356
357mpz_t *
636dff67 358gfc_copy_shape_excluding (mpz_t *shape, int rank, gfc_expr *dim)
94538bd1
VL
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);
66e4ab31 371 n--; /* Convert to zero based index. */
37e860a2 372 if (n < 0 || n >= rank)
94538bd1
VL
373 return NULL;
374
636dff67 375 s = new_shape = gfc_get_shape (rank - 1);
94538bd1
VL
376
377 for (i = 0; i < rank; i++)
378 {
379 if (i == n)
636dff67 380 continue;
94538bd1
VL
381 mpz_init_set (*s, shape[i]);
382 s++;
383 }
384
385 return new_shape;
386}
387
636dff67 388
6de9cd9a
DN
389/* Given an expression pointer, return a copy of the expression. This
390 subroutine is recursive. */
391
392gfc_expr *
636dff67 393gfc_copy_expr (gfc_expr *p)
6de9cd9a
DN
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);
6de9cd9a
DN
411 break;
412
413 case EXPR_CONSTANT:
20585ad6
BM
414 /* Copy target representation, if it exists. */
415 if (p->representation.string)
d3642f89 416 {
20585ad6
BM
417 s = gfc_getmem (p->representation.length + 1);
418 q->representation.string = s;
d3642f89 419
20585ad6 420 memcpy (s, p->representation.string, p->representation.length + 1);
d3642f89 421 }
20585ad6
BM
422
423 /* Copy the values of any pointer components of p->value. */
6de9cd9a
DN
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:
636dff67
SK
431 gfc_set_model_kind (q->ts.kind);
432 mpfr_init (q->value.real);
f8e566e5 433 mpfr_set (q->value.real, p->value.real, GFC_RND_MODE);
6de9cd9a
DN
434 break;
435
436 case BT_COMPLEX:
636dff67
SK
437 gfc_set_model_kind (q->ts.kind);
438 mpfr_init (q->value.complex.r);
439 mpfr_init (q->value.complex.i);
f8e566e5
SK
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);
6de9cd9a
DN
442 break;
443
444 case BT_CHARACTER:
20585ad6
BM
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;
6de9cd9a 451
a8b3b0b6
CR
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);
20585ad6 464 }
6de9cd9a
DN
465 break;
466
20585ad6 467 case BT_HOLLERITH:
6de9cd9a
DN
468 case BT_LOGICAL:
469 case BT_DERIVED:
a8b3b0b6 470 break; /* Already done. */
6de9cd9a
DN
471
472 case BT_PROCEDURE:
a8b3b0b6
CR
473 case BT_VOID:
474 /* Should never be reached. */
6de9cd9a
DN
475 case BT_UNKNOWN:
476 gfc_internal_error ("gfc_copy_expr(): Bad expr node");
a8b3b0b6 477 /* Not reached. */
6de9cd9a
DN
478 }
479
480 break;
481
482 case EXPR_OP:
58b03ab2 483 switch (q->value.op.operator)
6de9cd9a
DN
484 {
485 case INTRINSIC_NOT:
2f118814 486 case INTRINSIC_PARENTHESES:
6de9cd9a
DN
487 case INTRINSIC_UPLUS:
488 case INTRINSIC_UMINUS:
58b03ab2 489 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
6de9cd9a
DN
490 break;
491
66e4ab31 492 default: /* Binary operators. */
58b03ab2
TS
493 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
494 q->value.op.op2 = gfc_copy_expr (p->value.op.op2);
6de9cd9a
DN
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
526int
636dff67 527gfc_kind_max (gfc_expr *e1, gfc_expr *e2)
6de9cd9a 528{
6de9cd9a
DN
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
535static int
536numeric_type (bt type)
537{
6de9cd9a
DN
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
544int
636dff67 545gfc_numeric_ts (gfc_typespec *ts)
6de9cd9a 546{
6de9cd9a
DN
547 return numeric_type (ts->type);
548}
549
550
551/* Returns an expression node that is an integer constant. */
552
553gfc_expr *
554gfc_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;
9d64df18 562 p->ts.kind = gfc_default_integer_kind;
6de9cd9a 563
63645982 564 p->where = gfc_current_locus;
6de9cd9a
DN
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
573gfc_expr *
636dff67 574gfc_logical_expr (int i, locus *where)
6de9cd9a
DN
575{
576 gfc_expr *p;
577
578 p = gfc_get_expr ();
579
580 p->expr_type = EXPR_CONSTANT;
581 p->ts.type = BT_LOGICAL;
9d64df18 582 p->ts.kind = gfc_default_logical_kind;
6de9cd9a
DN
583
584 if (where == NULL)
63645982 585 where = &gfc_current_locus;
6de9cd9a
DN
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
597gfc_expr *
636dff67 598gfc_build_conversion (gfc_expr *e)
6de9cd9a
DN
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
f7b529fa 621 1.0**2 stays as it is. */
6de9cd9a
DN
622
623void
636dff67 624gfc_type_convert_binary (gfc_expr *e)
6de9cd9a
DN
625{
626 gfc_expr *op1, *op2;
627
58b03ab2
TS
628 op1 = e->value.op.op1;
629 op2 = e->value.op.op2;
6de9cd9a
DN
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 {
6de9cd9a
DN
640 if (op1->ts.kind == op2->ts.kind)
641 {
636dff67 642 /* No type conversions. */
6de9cd9a
DN
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
687fcae7 661 /* Special case for ** operator. */
58b03ab2 662 if (e->value.op.operator == INTRINSIC_POWER)
6de9cd9a
DN
663 goto done;
664
58b03ab2 665 gfc_convert_type (e->value.op.op2, &e->ts, 2);
6de9cd9a
DN
666 goto done;
667 }
668
669 if (op1->ts.type == BT_INTEGER)
670 {
671 e->ts = op2->ts;
58b03ab2 672 gfc_convert_type (e->value.op.op1, &e->ts, 2);
6de9cd9a
DN
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)
58b03ab2 683 gfc_convert_type (e->value.op.op1, &e->ts, 2);
6de9cd9a 684 if (op2->ts.type != BT_COMPLEX || op2->ts.kind != e->ts.kind)
58b03ab2 685 gfc_convert_type (e->value.op.op2, &e->ts, 2);
6de9cd9a
DN
686
687done:
688 return;
689}
690
691
692/* Function to determine if an expression is constant or not. This
693 function expects that the expression has already been simplified. */
694
695int
636dff67 696gfc_is_constant_expr (gfc_expr *e)
6de9cd9a
DN
697{
698 gfc_constructor *c;
699 gfc_actual_arglist *arg;
700 int rv;
701
702 if (e == NULL)
703 return 1;
704
705 switch (e->expr_type)
706 {
707 case EXPR_OP:
58b03ab2
TS
708 rv = (gfc_is_constant_expr (e->value.op.op1)
709 && (e->value.op.op2 == NULL
710 || gfc_is_constant_expr (e->value.op.op2)));
6de9cd9a
DN
711 break;
712
713 case EXPR_VARIABLE:
714 rv = 0;
715 break;
716
717 case EXPR_FUNCTION:
718 /* Call to intrinsic with at least one argument. */
719 rv = 0;
720 if (e->value.function.isym && e->value.function.actual)
721 {
722 for (arg = e->value.function.actual; arg; arg = arg->next)
723 {
724 if (!gfc_is_constant_expr (arg->expr))
725 break;
726 }
727 if (arg == NULL)
728 rv = 1;
729 }
730 break;
731
732 case EXPR_CONSTANT:
733 case EXPR_NULL:
734 rv = 1;
735 break;
736
737 case EXPR_SUBSTRING:
eac33acc
TS
738 rv = (gfc_is_constant_expr (e->ref->u.ss.start)
739 && gfc_is_constant_expr (e->ref->u.ss.end));
6de9cd9a
DN
740 break;
741
742 case EXPR_STRUCTURE:
743 rv = 0;
744 for (c = e->value.constructor; c; c = c->next)
745 if (!gfc_is_constant_expr (c->expr))
746 break;
747
748 if (c == NULL)
749 rv = 1;
750 break;
751
752 case EXPR_ARRAY:
753 rv = gfc_constant_ac (e);
754 break;
755
756 default:
757 gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
758 }
759
760 return rv;
761}
762
763
764/* Try to collapse intrinsic expressions. */
765
766static try
636dff67 767simplify_intrinsic_op (gfc_expr *p, int type)
6de9cd9a 768{
3bed9dd0 769 gfc_intrinsic_op op;
6de9cd9a
DN
770 gfc_expr *op1, *op2, *result;
771
58b03ab2 772 if (p->value.op.operator == INTRINSIC_USER)
6de9cd9a
DN
773 return SUCCESS;
774
58b03ab2
TS
775 op1 = p->value.op.op1;
776 op2 = p->value.op.op2;
3bed9dd0 777 op = p->value.op.operator;
6de9cd9a
DN
778
779 if (gfc_simplify_expr (op1, type) == FAILURE)
780 return FAILURE;
781 if (gfc_simplify_expr (op2, type) == FAILURE)
782 return FAILURE;
783
784 if (!gfc_is_constant_expr (op1)
785 || (op2 != NULL && !gfc_is_constant_expr (op2)))
786 return SUCCESS;
787
66e4ab31 788 /* Rip p apart. */
58b03ab2
TS
789 p->value.op.op1 = NULL;
790 p->value.op.op2 = NULL;
6de9cd9a 791
3bed9dd0 792 switch (op)
6de9cd9a 793 {
2414e1d6 794 case INTRINSIC_PARENTHESES:
2f118814
TS
795 result = gfc_parentheses (op1);
796 break;
797
798 case INTRINSIC_UPLUS:
6de9cd9a
DN
799 result = gfc_uplus (op1);
800 break;
801
802 case INTRINSIC_UMINUS:
803 result = gfc_uminus (op1);
804 break;
805
806 case INTRINSIC_PLUS:
807 result = gfc_add (op1, op2);
808 break;
809
810 case INTRINSIC_MINUS:
811 result = gfc_subtract (op1, op2);
812 break;
813
814 case INTRINSIC_TIMES:
815 result = gfc_multiply (op1, op2);
816 break;
817
818 case INTRINSIC_DIVIDE:
819 result = gfc_divide (op1, op2);
820 break;
821
822 case INTRINSIC_POWER:
823 result = gfc_power (op1, op2);
824 break;
825
826 case INTRINSIC_CONCAT:
827 result = gfc_concat (op1, op2);
828 break;
829
830 case INTRINSIC_EQ:
3bed9dd0
DF
831 case INTRINSIC_EQ_OS:
832 result = gfc_eq (op1, op2, op);
6de9cd9a
DN
833 break;
834
835 case INTRINSIC_NE:
3bed9dd0
DF
836 case INTRINSIC_NE_OS:
837 result = gfc_ne (op1, op2, op);
6de9cd9a
DN
838 break;
839
840 case INTRINSIC_GT:
3bed9dd0
DF
841 case INTRINSIC_GT_OS:
842 result = gfc_gt (op1, op2, op);
6de9cd9a
DN
843 break;
844
845 case INTRINSIC_GE:
3bed9dd0
DF
846 case INTRINSIC_GE_OS:
847 result = gfc_ge (op1, op2, op);
6de9cd9a
DN
848 break;
849
850 case INTRINSIC_LT:
3bed9dd0
DF
851 case INTRINSIC_LT_OS:
852 result = gfc_lt (op1, op2, op);
6de9cd9a
DN
853 break;
854
855 case INTRINSIC_LE:
3bed9dd0
DF
856 case INTRINSIC_LE_OS:
857 result = gfc_le (op1, op2, op);
6de9cd9a
DN
858 break;
859
860 case INTRINSIC_NOT:
861 result = gfc_not (op1);
862 break;
863
864 case INTRINSIC_AND:
865 result = gfc_and (op1, op2);
866 break;
867
868 case INTRINSIC_OR:
869 result = gfc_or (op1, op2);
870 break;
871
872 case INTRINSIC_EQV:
873 result = gfc_eqv (op1, op2);
874 break;
875
876 case INTRINSIC_NEQV:
877 result = gfc_neqv (op1, op2);
878 break;
879
880 default:
881 gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
882 }
883
884 if (result == NULL)
885 {
886 gfc_free_expr (op1);
887 gfc_free_expr (op2);
888 return FAILURE;
889 }
890
0e9a445b
PT
891 result->rank = p->rank;
892 result->where = p->where;
6de9cd9a
DN
893 gfc_replace_expr (p, result);
894
895 return SUCCESS;
896}
897
898
899/* Subroutine to simplify constructor expressions. Mutually recursive
900 with gfc_simplify_expr(). */
901
902static try
636dff67 903simplify_constructor (gfc_constructor *c, int type)
6de9cd9a 904{
6de9cd9a
DN
905 for (; c; c = c->next)
906 {
907 if (c->iterator
908 && (gfc_simplify_expr (c->iterator->start, type) == FAILURE
909 || gfc_simplify_expr (c->iterator->end, type) == FAILURE
910 || gfc_simplify_expr (c->iterator->step, type) == FAILURE))
911 return FAILURE;
912
913 if (c->expr && gfc_simplify_expr (c->expr, type) == FAILURE)
914 return FAILURE;
915 }
916
917 return SUCCESS;
918}
919
920
921/* Pull a single array element out of an array constructor. */
922
a4a11197 923static try
636dff67
SK
924find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
925 gfc_constructor **rval)
6de9cd9a
DN
926{
927 unsigned long nelemen;
928 int i;
929 mpz_t delta;
930 mpz_t offset;
4c6b3ec7
PT
931 mpz_t span;
932 mpz_t tmp;
a4a11197
PT
933 gfc_expr *e;
934 try t;
935
936 t = SUCCESS;
937 e = NULL;
6de9cd9a
DN
938
939 mpz_init_set_ui (offset, 0);
940 mpz_init (delta);
4c6b3ec7
PT
941 mpz_init (tmp);
942 mpz_init_set_ui (span, 1);
6de9cd9a
DN
943 for (i = 0; i < ar->dimen; i++)
944 {
a4a11197
PT
945 e = gfc_copy_expr (ar->start[i]);
946 if (e->expr_type != EXPR_CONSTANT)
6de9cd9a
DN
947 {
948 cons = NULL;
a4a11197 949 goto depart;
6de9cd9a 950 }
a4a11197
PT
951
952 /* Check the bounds. */
953 if (ar->as->upper[i]
636dff67
SK
954 && (mpz_cmp (e->value.integer, ar->as->upper[i]->value.integer) > 0
955 || mpz_cmp (e->value.integer,
956 ar->as->lower[i]->value.integer) < 0))
a4a11197
PT
957 {
958 gfc_error ("index in dimension %d is out of bounds "
959 "at %L", i + 1, &ar->c_where[i]);
960 cons = NULL;
961 t = FAILURE;
962 goto depart;
963 }
964
636dff67 965 mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer);
4c6b3ec7 966 mpz_mul (delta, delta, span);
6de9cd9a 967 mpz_add (offset, offset, delta);
4c6b3ec7
PT
968
969 mpz_set_ui (tmp, 1);
970 mpz_add (tmp, tmp, ar->as->upper[i]->value.integer);
971 mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
972 mpz_mul (span, span, tmp);
6de9cd9a
DN
973 }
974
975 if (cons)
976 {
a4a11197 977 for (nelemen = mpz_get_ui (offset); nelemen > 0; nelemen--)
6de9cd9a 978 {
a4a11197 979 if (cons->iterator)
6de9cd9a 980 {
a4a11197
PT
981 cons = NULL;
982 goto depart;
6de9cd9a 983 }
a4a11197 984 cons = cons->next;
6de9cd9a 985 }
6de9cd9a
DN
986 }
987
a4a11197 988depart:
6de9cd9a
DN
989 mpz_clear (delta);
990 mpz_clear (offset);
4c6b3ec7
PT
991 mpz_clear (span);
992 mpz_clear (tmp);
a4a11197
PT
993 if (e)
994 gfc_free_expr (e);
995 *rval = cons;
996 return t;
6de9cd9a
DN
997}
998
999
1000/* Find a component of a structure constructor. */
1001
1002static gfc_constructor *
636dff67 1003find_component_ref (gfc_constructor *cons, gfc_ref *ref)
6de9cd9a
DN
1004{
1005 gfc_component *comp;
1006 gfc_component *pick;
1007
1008 comp = ref->u.c.sym->components;
1009 pick = ref->u.c.component;
1010 while (comp != pick)
1011 {
1012 comp = comp->next;
1013 cons = cons->next;
1014 }
1015
1016 return cons;
1017}
1018
1019
1020/* Replace an expression with the contents of a constructor, removing
1021 the subobject reference in the process. */
1022
1023static void
636dff67 1024remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
6de9cd9a
DN
1025{
1026 gfc_expr *e;
1027
1028 e = cons->expr;
1029 cons->expr = NULL;
1030 e->ref = p->ref->next;
1031 p->ref->next = NULL;
1032 gfc_replace_expr (p, e);
1033}
1034
1035
a4a11197
PT
1036/* Pull an array section out of an array constructor. */
1037
1038static try
1039find_array_section (gfc_expr *expr, gfc_ref *ref)
1040{
1041 int idx;
1042 int rank;
1043 int d;
abe601c7 1044 int shape_i;
a4a11197 1045 long unsigned one = 1;
abe601c7 1046 bool incr_ctr;
3e978d30 1047 mpz_t start[GFC_MAX_DIMENSIONS];
a4a11197
PT
1048 mpz_t end[GFC_MAX_DIMENSIONS];
1049 mpz_t stride[GFC_MAX_DIMENSIONS];
1050 mpz_t delta[GFC_MAX_DIMENSIONS];
1051 mpz_t ctr[GFC_MAX_DIMENSIONS];
1052 mpz_t delta_mpz;
1053 mpz_t tmp_mpz;
1054 mpz_t nelts;
1055 mpz_t ptr;
a4a11197
PT
1056 mpz_t index;
1057 gfc_constructor *cons;
1058 gfc_constructor *base;
1059 gfc_expr *begin;
1060 gfc_expr *finish;
1061 gfc_expr *step;
1062 gfc_expr *upper;
1063 gfc_expr *lower;
abe601c7 1064 gfc_constructor *vecsub[GFC_MAX_DIMENSIONS], *c;
a4a11197
PT
1065 try t;
1066
1067 t = SUCCESS;
1068
1069 base = expr->value.constructor;
1070 expr->value.constructor = NULL;
1071
1072 rank = ref->u.ar.as->rank;
1073
1074 if (expr->shape == NULL)
1075 expr->shape = gfc_get_shape (rank);
1076
1077 mpz_init_set_ui (delta_mpz, one);
1078 mpz_init_set_ui (nelts, one);
1079 mpz_init (tmp_mpz);
1080
1081 /* Do the initialization now, so that we can cleanup without
1082 keeping track of where we were. */
1083 for (d = 0; d < rank; d++)
1084 {
1085 mpz_init (delta[d]);
3e978d30 1086 mpz_init (start[d]);
a4a11197
PT
1087 mpz_init (end[d]);
1088 mpz_init (ctr[d]);
1089 mpz_init (stride[d]);
abe601c7 1090 vecsub[d] = NULL;
a4a11197
PT
1091 }
1092
1093 /* Build the counters to clock through the array reference. */
abe601c7 1094 shape_i = 0;
a4a11197
PT
1095 for (d = 0; d < rank; d++)
1096 {
1097 /* Make this stretch of code easier on the eye! */
1098 begin = ref->u.ar.start[d];
1099 finish = ref->u.ar.end[d];
1100 step = ref->u.ar.stride[d];
1101 lower = ref->u.ar.as->lower[d];
1102 upper = ref->u.ar.as->upper[d];
1103
abe601c7 1104 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
636dff67
SK
1105 {
1106 gcc_assert (begin);
945a98a4
TB
1107
1108 if (begin->expr_type != EXPR_ARRAY)
1109 {
1110 t = FAILURE;
1111 goto cleanup;
1112 }
1113
636dff67
SK
1114 gcc_assert (begin->rank == 1);
1115 gcc_assert (begin->shape);
a4a11197 1116
abe601c7
EE
1117 vecsub[d] = begin->value.constructor;
1118 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1119 mpz_mul (nelts, nelts, begin->shape[0]);
1120 mpz_set (expr->shape[shape_i++], begin->shape[0]);
a4a11197 1121
abe601c7
EE
1122 /* Check bounds. */
1123 for (c = vecsub[d]; c; c = c->next)
1124 {
1125 if (mpz_cmp (c->expr->value.integer, upper->value.integer) > 0
636dff67
SK
1126 || mpz_cmp (c->expr->value.integer,
1127 lower->value.integer) < 0)
abe601c7
EE
1128 {
1129 gfc_error ("index in dimension %d is out of bounds "
1130 "at %L", d + 1, &ref->u.ar.c_where[d]);
1131 t = FAILURE;
1132 goto cleanup;
1133 }
1134 }
636dff67 1135 }
a4a11197 1136 else
636dff67 1137 {
abe601c7 1138 if ((begin && begin->expr_type != EXPR_CONSTANT)
636dff67
SK
1139 || (finish && finish->expr_type != EXPR_CONSTANT)
1140 || (step && step->expr_type != EXPR_CONSTANT))
abe601c7
EE
1141 {
1142 t = FAILURE;
1143 goto cleanup;
1144 }
c71d6a56 1145
abe601c7
EE
1146 /* Obtain the stride. */
1147 if (step)
1148 mpz_set (stride[d], step->value.integer);
1149 else
1150 mpz_set_ui (stride[d], one);
a4a11197 1151
abe601c7
EE
1152 if (mpz_cmp_ui (stride[d], 0) == 0)
1153 mpz_set_ui (stride[d], one);
a4a11197 1154
abe601c7
EE
1155 /* Obtain the start value for the index. */
1156 if (begin)
1157 mpz_set (start[d], begin->value.integer);
1158 else
1159 mpz_set (start[d], lower->value.integer);
a4a11197 1160
abe601c7 1161 mpz_set (ctr[d], start[d]);
a4a11197 1162
abe601c7
EE
1163 /* Obtain the end value for the index. */
1164 if (finish)
1165 mpz_set (end[d], finish->value.integer);
1166 else
1167 mpz_set (end[d], upper->value.integer);
1168
1169 /* Separate 'if' because elements sometimes arrive with
1170 non-null end. */
1171 if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1172 mpz_set (end [d], begin->value.integer);
1173
1174 /* Check the bounds. */
1175 if (mpz_cmp (ctr[d], upper->value.integer) > 0
1176 || mpz_cmp (end[d], upper->value.integer) > 0
1177 || mpz_cmp (ctr[d], lower->value.integer) < 0
1178 || mpz_cmp (end[d], lower->value.integer) < 0)
1179 {
1180 gfc_error ("index in dimension %d is out of bounds "
1181 "at %L", d + 1, &ref->u.ar.c_where[d]);
1182 t = FAILURE;
1183 goto cleanup;
1184 }
a4a11197 1185
abe601c7 1186 /* Calculate the number of elements and the shape. */
e1e24dc1 1187 mpz_set (tmp_mpz, stride[d]);
abe601c7
EE
1188 mpz_add (tmp_mpz, end[d], tmp_mpz);
1189 mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1190 mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1191 mpz_mul (nelts, nelts, tmp_mpz);
1192
636dff67
SK
1193 /* An element reference reduces the rank of the expression; don't
1194 add anything to the shape array. */
abe601c7
EE
1195 if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT)
1196 mpz_set (expr->shape[shape_i++], tmp_mpz);
1197 }
a4a11197
PT
1198
1199 /* Calculate the 'stride' (=delta) for conversion of the
1200 counter values into the index along the constructor. */
1201 mpz_set (delta[d], delta_mpz);
1202 mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1203 mpz_add_ui (tmp_mpz, tmp_mpz, one);
1204 mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1205 }
1206
1207 mpz_init (index);
1208 mpz_init (ptr);
a4a11197
PT
1209 cons = base;
1210
1211 /* Now clock through the array reference, calculating the index in
1212 the source constructor and transferring the elements to the new
1213 constructor. */
636dff67 1214 for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
a4a11197
PT
1215 {
1216 if (ref->u.ar.offset)
1217 mpz_set (ptr, ref->u.ar.offset->value.integer);
1218 else
1219 mpz_init_set_ui (ptr, 0);
1220
abe601c7 1221 incr_ctr = true;
a4a11197
PT
1222 for (d = 0; d < rank; d++)
1223 {
1224 mpz_set (tmp_mpz, ctr[d]);
636dff67 1225 mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
a4a11197
PT
1226 mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1227 mpz_add (ptr, ptr, tmp_mpz);
1228
abe601c7 1229 if (!incr_ctr) continue;
a4a11197 1230
636dff67 1231 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
abe601c7
EE
1232 {
1233 gcc_assert(vecsub[d]);
1234
1235 if (!vecsub[d]->next)
1236 vecsub[d] = ref->u.ar.start[d]->value.constructor;
1237 else
1238 {
1239 vecsub[d] = vecsub[d]->next;
1240 incr_ctr = false;
1241 }
1242 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1243 }
a4a11197 1244 else
abe601c7
EE
1245 {
1246 mpz_add (ctr[d], ctr[d], stride[d]);
1247
636dff67
SK
1248 if (mpz_cmp_ui (stride[d], 0) > 0
1249 ? mpz_cmp (ctr[d], end[d]) > 0
1250 : mpz_cmp (ctr[d], end[d]) < 0)
abe601c7
EE
1251 mpz_set (ctr[d], start[d]);
1252 else
1253 incr_ctr = false;
1254 }
a4a11197
PT
1255 }
1256
1257 /* There must be a better way of dealing with negative strides
1258 than resetting the index and the constructor pointer! */
1259 if (mpz_cmp (ptr, index) < 0)
1260 {
1261 mpz_set_ui (index, 0);
1262 cons = base;
1263 }
1264
1265 while (mpz_cmp (ptr, index) > 0)
1266 {
1267 mpz_add_ui (index, index, one);
1268 cons = cons->next;
1269 }
1270
1271 gfc_append_constructor (expr, gfc_copy_expr (cons->expr));
1272 }
1273
1274 mpz_clear (ptr);
1275 mpz_clear (index);
a4a11197
PT
1276
1277cleanup:
1278
1279 mpz_clear (delta_mpz);
1280 mpz_clear (tmp_mpz);
1281 mpz_clear (nelts);
1282 for (d = 0; d < rank; d++)
1283 {
1284 mpz_clear (delta[d]);
3e978d30 1285 mpz_clear (start[d]);
a4a11197
PT
1286 mpz_clear (end[d]);
1287 mpz_clear (ctr[d]);
1288 mpz_clear (stride[d]);
1289 }
1290 gfc_free_constructor (base);
1291 return t;
1292}
1293
1294/* Pull a substring out of an expression. */
1295
1296static try
1297find_substring_ref (gfc_expr *p, gfc_expr **newp)
1298{
1299 int end;
1300 int start;
1301 char *chr;
1302
1303 if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
636dff67 1304 || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
a4a11197
PT
1305 return FAILURE;
1306
1307 *newp = gfc_copy_expr (p);
1308 chr = p->value.character.string;
636dff67
SK
1309 end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer);
1310 start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer);
a4a11197
PT
1311
1312 (*newp)->value.character.length = end - start + 1;
1313 strncpy ((*newp)->value.character.string, &chr[start - 1],
1314 (*newp)->value.character.length);
1315 return SUCCESS;
1316}
1317
1318
1319
6de9cd9a
DN
1320/* Simplify a subobject reference of a constructor. This occurs when
1321 parameter variable values are substituted. */
1322
1323static try
636dff67 1324simplify_const_ref (gfc_expr *p)
6de9cd9a
DN
1325{
1326 gfc_constructor *cons;
a4a11197 1327 gfc_expr *newp;
6de9cd9a
DN
1328
1329 while (p->ref)
1330 {
1331 switch (p->ref->type)
1332 {
1333 case REF_ARRAY:
1334 switch (p->ref->u.ar.type)
1335 {
1336 case AR_ELEMENT:
636dff67 1337 if (find_array_element (p->value.constructor, &p->ref->u.ar,
a4a11197
PT
1338 &cons) == FAILURE)
1339 return FAILURE;
1340
6de9cd9a
DN
1341 if (!cons)
1342 return SUCCESS;
a4a11197 1343
6de9cd9a
DN
1344 remove_subobject_ref (p, cons);
1345 break;
1346
a4a11197
PT
1347 case AR_SECTION:
1348 if (find_array_section (p, p->ref) == FAILURE)
1349 return FAILURE;
1350 p->ref->u.ar.type = AR_FULL;
1351
66e4ab31 1352 /* Fall through. */
a4a11197 1353
6de9cd9a 1354 case AR_FULL:
a4a11197 1355 if (p->ref->next != NULL
636dff67 1356 && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
6de9cd9a 1357 {
a4a11197
PT
1358 cons = p->value.constructor;
1359 for (; cons; cons = cons->next)
1360 {
1361 cons->expr->ref = copy_ref (p->ref->next);
1362 simplify_const_ref (cons->expr);
1363 }
6de9cd9a 1364 }
a4a11197
PT
1365 gfc_free_ref_list (p->ref);
1366 p->ref = NULL;
6de9cd9a
DN
1367 break;
1368
1369 default:
6de9cd9a
DN
1370 return SUCCESS;
1371 }
1372
1373 break;
1374
1375 case REF_COMPONENT:
1376 cons = find_component_ref (p->value.constructor, p->ref);
1377 remove_subobject_ref (p, cons);
1378 break;
1379
1380 case REF_SUBSTRING:
a4a11197
PT
1381 if (find_substring_ref (p, &newp) == FAILURE)
1382 return FAILURE;
1383
1384 gfc_replace_expr (p, newp);
1385 gfc_free_ref_list (p->ref);
1386 p->ref = NULL;
1387 break;
6de9cd9a
DN
1388 }
1389 }
1390
1391 return SUCCESS;
1392}
1393
1394
1395/* Simplify a chain of references. */
1396
1397static try
636dff67 1398simplify_ref_chain (gfc_ref *ref, int type)
6de9cd9a
DN
1399{
1400 int n;
1401
1402 for (; ref; ref = ref->next)
1403 {
1404 switch (ref->type)
1405 {
1406 case REF_ARRAY:
1407 for (n = 0; n < ref->u.ar.dimen; n++)
1408 {
636dff67 1409 if (gfc_simplify_expr (ref->u.ar.start[n], type) == FAILURE)
6de9cd9a 1410 return FAILURE;
636dff67 1411 if (gfc_simplify_expr (ref->u.ar.end[n], type) == FAILURE)
6de9cd9a 1412 return FAILURE;
636dff67 1413 if (gfc_simplify_expr (ref->u.ar.stride[n], type) == FAILURE)
6de9cd9a
DN
1414 return FAILURE;
1415 }
1416 break;
1417
1418 case REF_SUBSTRING:
1419 if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1420 return FAILURE;
1421 if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1422 return FAILURE;
1423 break;
1424
1425 default:
1426 break;
1427 }
1428 }
1429 return SUCCESS;
1430}
1431
1432
1433/* Try to substitute the value of a parameter variable. */
66e4ab31 1434
6de9cd9a 1435static try
636dff67 1436simplify_parameter_variable (gfc_expr *p, int type)
6de9cd9a
DN
1437{
1438 gfc_expr *e;
1439 try t;
1440
1441 e = gfc_copy_expr (p->symtree->n.sym->value);
a4a11197
PT
1442 if (e == NULL)
1443 return FAILURE;
1444
b9703d98
EE
1445 e->rank = p->rank;
1446
c2fee3de
DE
1447 /* Do not copy subobject refs for constant. */
1448 if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
6de9cd9a
DN
1449 e->ref = copy_ref (p->ref);
1450 t = gfc_simplify_expr (e, type);
1451
66e4ab31 1452 /* Only use the simplification if it eliminated all subobject references. */
636dff67 1453 if (t == SUCCESS && !e->ref)
6de9cd9a
DN
1454 gfc_replace_expr (p, e);
1455 else
1456 gfc_free_expr (e);
1457
1458 return t;
1459}
1460
1461/* Given an expression, simplify it by collapsing constant
1462 expressions. Most simplification takes place when the expression
1463 tree is being constructed. If an intrinsic function is simplified
1464 at some point, we get called again to collapse the result against
1465 other constants.
1466
1467 We work by recursively simplifying expression nodes, simplifying
1468 intrinsic functions where possible, which can lead to further
1469 constant collapsing. If an operator has constant operand(s), we
1470 rip the expression apart, and rebuild it, hoping that it becomes
1471 something simpler.
1472
1473 The expression type is defined for:
1474 0 Basic expression parsing
1475 1 Simplifying array constructors -- will substitute
636dff67 1476 iterator values.
6de9cd9a
DN
1477 Returns FAILURE on error, SUCCESS otherwise.
1478 NOTE: Will return SUCCESS even if the expression can not be simplified. */
1479
1480try
636dff67 1481gfc_simplify_expr (gfc_expr *p, int type)
6de9cd9a
DN
1482{
1483 gfc_actual_arglist *ap;
1484
1485 if (p == NULL)
1486 return SUCCESS;
1487
1488 switch (p->expr_type)
1489 {
1490 case EXPR_CONSTANT:
1491 case EXPR_NULL:
1492 break;
1493
1494 case EXPR_FUNCTION:
1495 for (ap = p->value.function.actual; ap; ap = ap->next)
1496 if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1497 return FAILURE;
1498
1499 if (p->value.function.isym != NULL
1500 && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1501 return FAILURE;
1502
1503 break;
1504
1505 case EXPR_SUBSTRING:
eac33acc 1506 if (simplify_ref_chain (p->ref, type) == FAILURE)
6de9cd9a
DN
1507 return FAILURE;
1508
c2fee3de
DE
1509 if (gfc_is_constant_expr (p))
1510 {
1511 char *s;
1512 int start, end;
1513
1514 gfc_extract_int (p->ref->u.ss.start, &start);
1515 start--; /* Convert from one-based to zero-based. */
1516 gfc_extract_int (p->ref->u.ss.end, &end);
d6910bb5 1517 s = gfc_getmem (end - start + 2);
c2fee3de 1518 memcpy (s, p->value.character.string + start, end - start);
636dff67 1519 s[end - start + 1] = '\0'; /* TODO: C-style string. */
c2fee3de
DE
1520 gfc_free (p->value.character.string);
1521 p->value.character.string = s;
1522 p->value.character.length = end - start;
1523 p->ts.cl = gfc_get_charlen ();
1524 p->ts.cl->next = gfc_current_ns->cl_list;
1525 gfc_current_ns->cl_list = p->ts.cl;
1526 p->ts.cl->length = gfc_int_expr (p->value.character.length);
1527 gfc_free_ref_list (p->ref);
1528 p->ref = NULL;
1529 p->expr_type = EXPR_CONSTANT;
1530 }
6de9cd9a
DN
1531 break;
1532
1533 case EXPR_OP:
1534 if (simplify_intrinsic_op (p, type) == FAILURE)
1535 return FAILURE;
1536 break;
1537
1538 case EXPR_VARIABLE:
1539 /* Only substitute array parameter variables if we are in an
636dff67 1540 initialization expression, or we want a subsection. */
6de9cd9a
DN
1541 if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1542 && (gfc_init_expr || p->ref
1543 || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1544 {
1545 if (simplify_parameter_variable (p, type) == FAILURE)
1546 return FAILURE;
1547 break;
1548 }
1549
1550 if (type == 1)
1551 {
1552 gfc_simplify_iterator_var (p);
1553 }
1554
1555 /* Simplify subcomponent references. */
1556 if (simplify_ref_chain (p->ref, type) == FAILURE)
1557 return FAILURE;
1558
1559 break;
1560
1561 case EXPR_STRUCTURE:
1562 case EXPR_ARRAY:
1563 if (simplify_ref_chain (p->ref, type) == FAILURE)
1564 return FAILURE;
1565
1566 if (simplify_constructor (p->value.constructor, type) == FAILURE)
1567 return FAILURE;
1568
636dff67
SK
1569 if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1570 && p->ref->u.ar.type == AR_FULL)
6de9cd9a
DN
1571 gfc_expand_constructor (p);
1572
1573 if (simplify_const_ref (p) == FAILURE)
1574 return FAILURE;
1575
1576 break;
1577 }
1578
1579 return SUCCESS;
1580}
1581
1582
1583/* Returns the type of an expression with the exception that iterator
1584 variables are automatically integers no matter what else they may
1585 be declared as. */
1586
1587static bt
636dff67 1588et0 (gfc_expr *e)
6de9cd9a 1589{
6de9cd9a
DN
1590 if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1591 return BT_INTEGER;
1592
1593 return e->ts.type;
1594}
1595
1596
1597/* Check an intrinsic arithmetic operation to see if it is consistent
1598 with some type of expression. */
1599
1600static try check_init_expr (gfc_expr *);
1601
396b2c19
PT
1602
1603/* Scalarize an expression for an elemental intrinsic call. */
1604
1605static try
1606scalarize_intrinsic_call (gfc_expr *e)
1607{
1608 gfc_actual_arglist *a, *b;
1609 gfc_constructor *args[5], *ctor, *new_ctor;
1610 gfc_expr *expr, *old;
1611 int n, i, rank[5];
1612
1613 old = gfc_copy_expr (e);
1614
1615/* Assume that the old expression carries the type information and
1616 that the first arg carries all the shape information. */
1617 expr = gfc_copy_expr (old->value.function.actual->expr);
1618 gfc_free_constructor (expr->value.constructor);
1619 expr->value.constructor = NULL;
1620
1621 expr->ts = old->ts;
1622 expr->expr_type = EXPR_ARRAY;
1623
1624 /* Copy the array argument constructors into an array, with nulls
1625 for the scalars. */
1626 n = 0;
1627 a = old->value.function.actual;
1628 for (; a; a = a->next)
1629 {
1630 /* Check that this is OK for an initialization expression. */
1631 if (a->expr && check_init_expr (a->expr) == FAILURE)
1632 goto cleanup;
1633
1634 rank[n] = 0;
1635 if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
1636 {
1637 rank[n] = a->expr->rank;
1638 ctor = a->expr->symtree->n.sym->value->value.constructor;
1639 args[n] = gfc_copy_constructor (ctor);
1640 }
1641 else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
1642 {
1643 if (a->expr->rank)
1644 rank[n] = a->expr->rank;
1645 else
1646 rank[n] = 1;
1647 args[n] = gfc_copy_constructor (a->expr->value.constructor);
1648 }
1649 else
1650 args[n] = NULL;
1651 n++;
1652 }
1653
1654 for (i = 1; i < n; i++)
1655 if (rank[i] && rank[i] != rank[0])
1656 goto compliance;
1657
1658 /* Using the first argument as the master, step through the array
1659 calling the function for each element and advancing the array
1660 constructors together. */
1661 ctor = args[0];
1662 new_ctor = NULL;
1663 for (; ctor; ctor = ctor->next)
1664 {
1665 if (expr->value.constructor == NULL)
1666 expr->value.constructor
1667 = new_ctor = gfc_get_constructor ();
1668 else
1669 {
1670 new_ctor->next = gfc_get_constructor ();
1671 new_ctor = new_ctor->next;
1672 }
1673 new_ctor->expr = gfc_copy_expr (old);
1674 gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
1675 a = NULL;
1676 b = old->value.function.actual;
1677 for (i = 0; i < n; i++)
1678 {
1679 if (a == NULL)
1680 new_ctor->expr->value.function.actual
1681 = a = gfc_get_actual_arglist ();
1682 else
1683 {
1684 a->next = gfc_get_actual_arglist ();
1685 a = a->next;
1686 }
1687 if (args[i])
1688 a->expr = gfc_copy_expr (args[i]->expr);
1689 else
1690 a->expr = gfc_copy_expr (b->expr);
1691
1692 b = b->next;
1693 }
1694
1695 /* Simplify the function calls. */
1696 if (gfc_simplify_expr (new_ctor->expr, 0) == FAILURE)
1697 goto cleanup;
1698
1699 for (i = 0; i < n; i++)
1700 if (args[i])
1701 args[i] = args[i]->next;
1702
1703 for (i = 1; i < n; i++)
1704 if (rank[i] && ((args[i] != NULL && args[0] == NULL)
1705 || (args[i] == NULL && args[0] != NULL)))
1706 goto compliance;
1707 }
1708
1709 free_expr0 (e);
1710 *e = *expr;
1711 gfc_free_expr (old);
1712 return SUCCESS;
1713
1714compliance:
1715 gfc_error_now ("elemental function arguments at %C are not compliant");
1716
1717cleanup:
1718 gfc_free_expr (expr);
1719 gfc_free_expr (old);
1720 return FAILURE;
1721}
1722
1723
6de9cd9a 1724static try
636dff67 1725check_intrinsic_op (gfc_expr *e, try (*check_function) (gfc_expr *))
6de9cd9a 1726{
58b03ab2
TS
1727 gfc_expr *op1 = e->value.op.op1;
1728 gfc_expr *op2 = e->value.op.op2;
6de9cd9a 1729
58b03ab2 1730 if ((*check_function) (op1) == FAILURE)
6de9cd9a
DN
1731 return FAILURE;
1732
58b03ab2 1733 switch (e->value.op.operator)
6de9cd9a
DN
1734 {
1735 case INTRINSIC_UPLUS:
1736 case INTRINSIC_UMINUS:
58b03ab2 1737 if (!numeric_type (et0 (op1)))
6de9cd9a
DN
1738 goto not_numeric;
1739 break;
1740
1741 case INTRINSIC_EQ:
3bed9dd0 1742 case INTRINSIC_EQ_OS:
6de9cd9a 1743 case INTRINSIC_NE:
3bed9dd0 1744 case INTRINSIC_NE_OS:
6de9cd9a 1745 case INTRINSIC_GT:
3bed9dd0 1746 case INTRINSIC_GT_OS:
6de9cd9a 1747 case INTRINSIC_GE:
3bed9dd0 1748 case INTRINSIC_GE_OS:
6de9cd9a 1749 case INTRINSIC_LT:
3bed9dd0 1750 case INTRINSIC_LT_OS:
6de9cd9a 1751 case INTRINSIC_LE:
3bed9dd0 1752 case INTRINSIC_LE_OS:
58b03ab2 1753 if ((*check_function) (op2) == FAILURE)
e063a048
TS
1754 return FAILURE;
1755
58b03ab2
TS
1756 if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1757 && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
e063a048
TS
1758 {
1759 gfc_error ("Numeric or CHARACTER operands are required in "
1760 "expression at %L", &e->where);
636dff67 1761 return FAILURE;
e063a048
TS
1762 }
1763 break;
6de9cd9a
DN
1764
1765 case INTRINSIC_PLUS:
1766 case INTRINSIC_MINUS:
1767 case INTRINSIC_TIMES:
1768 case INTRINSIC_DIVIDE:
1769 case INTRINSIC_POWER:
58b03ab2 1770 if ((*check_function) (op2) == FAILURE)
6de9cd9a
DN
1771 return FAILURE;
1772
58b03ab2 1773 if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
6de9cd9a
DN
1774 goto not_numeric;
1775
58b03ab2
TS
1776 if (e->value.op.operator == INTRINSIC_POWER
1777 && check_function == check_init_expr && et0 (op2) != BT_INTEGER)
6de9cd9a 1778 {
a74897c1
TB
1779 if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Noninteger "
1780 "exponent in an initialization "
1781 "expression at %L", &op2->where)
1782 == FAILURE)
1783 return FAILURE;
6de9cd9a
DN
1784 }
1785
1786 break;
1787
1788 case INTRINSIC_CONCAT:
58b03ab2 1789 if ((*check_function) (op2) == FAILURE)
6de9cd9a
DN
1790 return FAILURE;
1791
58b03ab2 1792 if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
6de9cd9a
DN
1793 {
1794 gfc_error ("Concatenation operator in expression at %L "
58b03ab2 1795 "must have two CHARACTER operands", &op1->where);
6de9cd9a
DN
1796 return FAILURE;
1797 }
1798
58b03ab2 1799 if (op1->ts.kind != op2->ts.kind)
6de9cd9a
DN
1800 {
1801 gfc_error ("Concat operator at %L must concatenate strings of the "
1802 "same kind", &e->where);
1803 return FAILURE;
1804 }
1805
1806 break;
1807
1808 case INTRINSIC_NOT:
58b03ab2 1809 if (et0 (op1) != BT_LOGICAL)
6de9cd9a
DN
1810 {
1811 gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
58b03ab2 1812 "operand", &op1->where);
6de9cd9a
DN
1813 return FAILURE;
1814 }
1815
1816 break;
1817
1818 case INTRINSIC_AND:
1819 case INTRINSIC_OR:
1820 case INTRINSIC_EQV:
1821 case INTRINSIC_NEQV:
58b03ab2 1822 if ((*check_function) (op2) == FAILURE)
6de9cd9a
DN
1823 return FAILURE;
1824
58b03ab2 1825 if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
6de9cd9a
DN
1826 {
1827 gfc_error ("LOGICAL operands are required in expression at %L",
1828 &e->where);
1829 return FAILURE;
1830 }
1831
1832 break;
1833
083cc293
TS
1834 case INTRINSIC_PARENTHESES:
1835 break;
1836
6de9cd9a
DN
1837 default:
1838 gfc_error ("Only intrinsic operators can be used in expression at %L",
1839 &e->where);
1840 return FAILURE;
1841 }
1842
1843 return SUCCESS;
1844
1845not_numeric:
1846 gfc_error ("Numeric operands are required in expression at %L", &e->where);
1847
1848 return FAILURE;
1849}
1850
1851
1852
1853/* Certain inquiry functions are specifically allowed to have variable
1854 arguments, which is an exception to the normal requirement that an
1855 initialization function have initialization arguments. We head off
1856 this problem here. */
1857
1858static try
636dff67 1859check_inquiry (gfc_expr *e, int not_restricted)
6de9cd9a
DN
1860{
1861 const char *name;
1862
1863 /* FIXME: This should be moved into the intrinsic definitions,
1864 to eliminate this ugly hack. */
1865 static const char * const inquiry_function[] = {
c2b27658 1866 "digits", "epsilon", "huge", "kind", "len", "maxexponent", "minexponent",
6de9cd9a
DN
1867 "precision", "radix", "range", "tiny", "bit_size", "size", "shape",
1868 "lbound", "ubound", NULL
1869 };
1870
1871 int i;
1872
e7f79e12
PT
1873 /* An undeclared parameter will get us here (PR25018). */
1874 if (e->symtree == NULL)
1875 return FAILURE;
1876
6de9cd9a
DN
1877 name = e->symtree->n.sym->name;
1878
1879 for (i = 0; inquiry_function[i]; i++)
1880 if (strcmp (inquiry_function[i], name) == 0)
1881 break;
1882
1883 if (inquiry_function[i] == NULL)
1884 return FAILURE;
1885
1886 e = e->value.function.actual->expr;
1887
1888 if (e == NULL || e->expr_type != EXPR_VARIABLE)
1889 return FAILURE;
1890
c2b27658
EE
1891 /* At this point we have an inquiry function with a variable argument. The
1892 type of the variable might be undefined, but we need it now, because the
1893 arguments of these functions are allowed to be undefined. */
6de9cd9a
DN
1894
1895 if (e->ts.type == BT_UNKNOWN)
1896 {
1897 if (e->symtree->n.sym->ts.type == BT_UNKNOWN
1898 && gfc_set_default_type (e->symtree->n.sym, 0, gfc_current_ns)
636dff67 1899 == FAILURE)
6de9cd9a
DN
1900 return FAILURE;
1901
1902 e->ts = e->symtree->n.sym->ts;
1903 }
1904
e7f79e12
PT
1905 /* Assumed character length will not reduce to a constant expression
1906 with LEN, as required by the standard. */
1907 if (i == 4 && not_restricted
636dff67
SK
1908 && e->symtree->n.sym->ts.type == BT_CHARACTER
1909 && e->symtree->n.sym->ts.cl->length == NULL)
e7f79e12
PT
1910 gfc_notify_std (GFC_STD_GNU, "assumed character length "
1911 "variable '%s' in constant expression at %L",
1912 e->symtree->n.sym->name, &e->where);
1913
6de9cd9a
DN
1914 return SUCCESS;
1915}
1916
1917
1918/* Verify that an expression is an initialization expression. A side
1919 effect is that the expression tree is reduced to a single constant
1920 node if all goes well. This would normally happen when the
1921 expression is constructed but function references are assumed to be
1922 intrinsics in the context of initialization expressions. If
1923 FAILURE is returned an error message has been generated. */
1924
1925static try
636dff67 1926check_init_expr (gfc_expr *e)
6de9cd9a
DN
1927{
1928 gfc_actual_arglist *ap;
1929 match m;
1930 try t;
396b2c19 1931 gfc_intrinsic_sym *isym;
6de9cd9a
DN
1932
1933 if (e == NULL)
1934 return SUCCESS;
1935
1936 switch (e->expr_type)
1937 {
1938 case EXPR_OP:
1939 t = check_intrinsic_op (e, check_init_expr);
1940 if (t == SUCCESS)
1941 t = gfc_simplify_expr (e, 0);
1942
1943 break;
1944
1945 case EXPR_FUNCTION:
1946 t = SUCCESS;
1947
e7f79e12 1948 if (check_inquiry (e, 1) != SUCCESS)
6de9cd9a
DN
1949 {
1950 t = SUCCESS;
1951 for (ap = e->value.function.actual; ap; ap = ap->next)
1952 if (check_init_expr (ap->expr) == FAILURE)
1953 {
1954 t = FAILURE;
1955 break;
1956 }
1957 }
1958
396b2c19
PT
1959 /* Try to scalarize an elemental intrinsic function that has an
1960 array argument. */
1961 isym = gfc_find_function (e->symtree->n.sym->name);
1962 if (isym && isym->elemental
1963 && e->value.function.actual->expr->expr_type == EXPR_ARRAY)
1964 {
1965 if (scalarize_intrinsic_call (e) == SUCCESS)
1966 break;
1967 }
1968
6de9cd9a
DN
1969 if (t == SUCCESS)
1970 {
1971 m = gfc_intrinsic_func_interface (e, 0);
1972
1973 if (m == MATCH_NO)
1974 gfc_error ("Function '%s' in initialization expression at %L "
1975 "must be an intrinsic function",
636dff67 1976 e->symtree->n.sym->name, &e->where);
6de9cd9a
DN
1977
1978 if (m != MATCH_YES)
1979 t = FAILURE;
1980 }
1981
1982 break;
1983
1984 case EXPR_VARIABLE:
1985 t = SUCCESS;
1986
1987 if (gfc_check_iter_variable (e) == SUCCESS)
1988 break;
1989
1990 if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
1991 {
1992 t = simplify_parameter_variable (e, 0);
1993 break;
1994 }
1995
2220652d
PT
1996 if (gfc_in_match_data ())
1997 break;
1998
e7f79e12
PT
1999 gfc_error ("Parameter '%s' at %L has not been declared or is "
2000 "a variable, which does not reduce to a constant "
6de9cd9a
DN
2001 "expression", e->symtree->n.sym->name, &e->where);
2002 t = FAILURE;
2003 break;
2004
2005 case EXPR_CONSTANT:
2006 case EXPR_NULL:
2007 t = SUCCESS;
2008 break;
2009
2010 case EXPR_SUBSTRING:
eac33acc 2011 t = check_init_expr (e->ref->u.ss.start);
6de9cd9a
DN
2012 if (t == FAILURE)
2013 break;
2014
eac33acc 2015 t = check_init_expr (e->ref->u.ss.end);
6de9cd9a
DN
2016 if (t == SUCCESS)
2017 t = gfc_simplify_expr (e, 0);
2018
2019 break;
2020
2021 case EXPR_STRUCTURE:
2022 t = gfc_check_constructor (e, check_init_expr);
2023 break;
2024
2025 case EXPR_ARRAY:
2026 t = gfc_check_constructor (e, check_init_expr);
2027 if (t == FAILURE)
2028 break;
2029
2030 t = gfc_expand_constructor (e);
2031 if (t == FAILURE)
2032 break;
2033
2034 t = gfc_check_constructor_type (e);
2035 break;
2036
2037 default:
2038 gfc_internal_error ("check_init_expr(): Unknown expression type");
2039 }
2040
2041 return t;
2042}
2043
2044
2045/* Match an initialization expression. We work by first matching an
2046 expression, then reducing it to a constant. */
2047
2048match
636dff67 2049gfc_match_init_expr (gfc_expr **result)
6de9cd9a
DN
2050{
2051 gfc_expr *expr;
2052 match m;
2053 try t;
2054
2055 m = gfc_match_expr (&expr);
2056 if (m != MATCH_YES)
2057 return m;
2058
2059 gfc_init_expr = 1;
2060 t = gfc_resolve_expr (expr);
2061 if (t == SUCCESS)
2062 t = check_init_expr (expr);
2063 gfc_init_expr = 0;
2064
2065 if (t == FAILURE)
2066 {
2067 gfc_free_expr (expr);
2068 return MATCH_ERROR;
2069 }
2070
2071 if (expr->expr_type == EXPR_ARRAY
2072 && (gfc_check_constructor_type (expr) == FAILURE
2073 || gfc_expand_constructor (expr) == FAILURE))
2074 {
2075 gfc_free_expr (expr);
2076 return MATCH_ERROR;
2077 }
2078
e7f79e12
PT
2079 /* Not all inquiry functions are simplified to constant expressions
2080 so it is necessary to call check_inquiry again. */
636dff67
SK
2081 if (!gfc_is_constant_expr (expr) && check_inquiry (expr, 1) == FAILURE
2082 && !gfc_in_match_data ())
e7f79e12
PT
2083 {
2084 gfc_error ("Initialization expression didn't reduce %C");
2085 return MATCH_ERROR;
2086 }
6de9cd9a
DN
2087
2088 *result = expr;
2089
2090 return MATCH_YES;
2091}
2092
2093
6de9cd9a
DN
2094static try check_restricted (gfc_expr *);
2095
2096/* Given an actual argument list, test to see that each argument is a
2097 restricted expression and optionally if the expression type is
2098 integer or character. */
2099
2100static try
636dff67 2101restricted_args (gfc_actual_arglist *a)
6de9cd9a 2102{
6de9cd9a
DN
2103 for (; a; a = a->next)
2104 {
2105 if (check_restricted (a->expr) == FAILURE)
2106 return FAILURE;
6de9cd9a
DN
2107 }
2108
2109 return SUCCESS;
2110}
2111
2112
2113/************* Restricted/specification expressions *************/
2114
2115
2116/* Make sure a non-intrinsic function is a specification function. */
2117
2118static try
636dff67 2119external_spec_function (gfc_expr *e)
6de9cd9a
DN
2120{
2121 gfc_symbol *f;
2122
2123 f = e->value.function.esym;
2124
2125 if (f->attr.proc == PROC_ST_FUNCTION)
2126 {
2127 gfc_error ("Specification function '%s' at %L cannot be a statement "
2128 "function", f->name, &e->where);
2129 return FAILURE;
2130 }
2131
2132 if (f->attr.proc == PROC_INTERNAL)
2133 {
2134 gfc_error ("Specification function '%s' at %L cannot be an internal "
2135 "function", f->name, &e->where);
2136 return FAILURE;
2137 }
2138
98cb5a54 2139 if (!f->attr.pure && !f->attr.elemental)
6de9cd9a
DN
2140 {
2141 gfc_error ("Specification function '%s' at %L must be PURE", f->name,
2142 &e->where);
2143 return FAILURE;
2144 }
2145
2146 if (f->attr.recursive)
2147 {
2148 gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
2149 f->name, &e->where);
2150 return FAILURE;
2151 }
2152
40e929f3 2153 return restricted_args (e->value.function.actual);
6de9cd9a
DN
2154}
2155
2156
2157/* Check to see that a function reference to an intrinsic is a
40e929f3 2158 restricted expression. */
6de9cd9a
DN
2159
2160static try
636dff67 2161restricted_intrinsic (gfc_expr *e)
6de9cd9a 2162{
40e929f3 2163 /* TODO: Check constraints on inquiry functions. 7.1.6.2 (7). */
e7f79e12 2164 if (check_inquiry (e, 0) == SUCCESS)
40e929f3 2165 return SUCCESS;
6de9cd9a 2166
40e929f3 2167 return restricted_args (e->value.function.actual);
6de9cd9a
DN
2168}
2169
2170
2171/* Verify that an expression is a restricted expression. Like its
2172 cousin check_init_expr(), an error message is generated if we
2173 return FAILURE. */
2174
2175static try
636dff67 2176check_restricted (gfc_expr *e)
6de9cd9a
DN
2177{
2178 gfc_symbol *sym;
2179 try t;
2180
2181 if (e == NULL)
2182 return SUCCESS;
2183
2184 switch (e->expr_type)
2185 {
2186 case EXPR_OP:
2187 t = check_intrinsic_op (e, check_restricted);
2188 if (t == SUCCESS)
2189 t = gfc_simplify_expr (e, 0);
2190
2191 break;
2192
2193 case EXPR_FUNCTION:
636dff67
SK
2194 t = e->value.function.esym ? external_spec_function (e)
2195 : restricted_intrinsic (e);
6de9cd9a
DN
2196 break;
2197
2198 case EXPR_VARIABLE:
2199 sym = e->symtree->n.sym;
2200 t = FAILURE;
2201
2202 if (sym->attr.optional)
2203 {
2204 gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2205 sym->name, &e->where);
2206 break;
2207 }
2208
2209 if (sym->attr.intent == INTENT_OUT)
2210 {
2211 gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2212 sym->name, &e->where);
2213 break;
2214 }
2215
636dff67
SK
2216 /* gfc_is_formal_arg broadcasts that a formal argument list is being
2217 processed in resolve.c(resolve_formal_arglist). This is done so
2218 that host associated dummy array indices are accepted (PR23446).
2219 This mechanism also does the same for the specification expressions
2220 of array-valued functions. */
6de9cd9a
DN
2221 if (sym->attr.in_common
2222 || sym->attr.use_assoc
2223 || sym->attr.dummy
2224 || sym->ns != gfc_current_ns
2225 || (sym->ns->proc_name != NULL
4213f93b 2226 && sym->ns->proc_name->attr.flavor == FL_MODULE)
98bbe5ee 2227 || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
6de9cd9a
DN
2228 {
2229 t = SUCCESS;
2230 break;
2231 }
2232
2233 gfc_error ("Variable '%s' cannot appear in the expression at %L",
2234 sym->name, &e->where);
2235
2236 break;
2237
2238 case EXPR_NULL:
2239 case EXPR_CONSTANT:
2240 t = SUCCESS;
2241 break;
2242
2243 case EXPR_SUBSTRING:
eac33acc 2244 t = gfc_specification_expr (e->ref->u.ss.start);
6de9cd9a
DN
2245 if (t == FAILURE)
2246 break;
2247
eac33acc 2248 t = gfc_specification_expr (e->ref->u.ss.end);
6de9cd9a
DN
2249 if (t == SUCCESS)
2250 t = gfc_simplify_expr (e, 0);
2251
2252 break;
2253
2254 case EXPR_STRUCTURE:
2255 t = gfc_check_constructor (e, check_restricted);
2256 break;
2257
2258 case EXPR_ARRAY:
2259 t = gfc_check_constructor (e, check_restricted);
2260 break;
2261
2262 default:
2263 gfc_internal_error ("check_restricted(): Unknown expression type");
2264 }
2265
2266 return t;
2267}
2268
2269
2270/* Check to see that an expression is a specification expression. If
2271 we return FAILURE, an error has been generated. */
2272
2273try
636dff67 2274gfc_specification_expr (gfc_expr *e)
6de9cd9a 2275{
66e4ab31 2276
110eec24
TS
2277 if (e == NULL)
2278 return SUCCESS;
6de9cd9a
DN
2279
2280 if (e->ts.type != BT_INTEGER)
2281 {
2282 gfc_error ("Expression at %L must be of INTEGER type", &e->where);
2283 return FAILURE;
2284 }
2285
2286 if (e->rank != 0)
2287 {
2288 gfc_error ("Expression at %L must be scalar", &e->where);
2289 return FAILURE;
2290 }
2291
2292 if (gfc_simplify_expr (e, 0) == FAILURE)
2293 return FAILURE;
2294
2295 return check_restricted (e);
2296}
2297
2298
2299/************** Expression conformance checks. *************/
2300
2301/* Given two expressions, make sure that the arrays are conformable. */
2302
2303try
636dff67 2304gfc_check_conformance (const char *optype_msgid, gfc_expr *op1, gfc_expr *op2)
6de9cd9a
DN
2305{
2306 int op1_flag, op2_flag, d;
2307 mpz_t op1_size, op2_size;
2308 try t;
2309
2310 if (op1->rank == 0 || op2->rank == 0)
2311 return SUCCESS;
2312
2313 if (op1->rank != op2->rank)
2314 {
31043f6c
FXC
2315 gfc_error ("Incompatible ranks in %s at %L", _(optype_msgid),
2316 &op1->where);
6de9cd9a
DN
2317 return FAILURE;
2318 }
2319
2320 t = SUCCESS;
2321
2322 for (d = 0; d < op1->rank; d++)
2323 {
2324 op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2325 op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2326
2327 if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2328 {
17d761bb 2329 gfc_error ("different shape for %s at %L on dimension %d (%d/%d)",
31043f6c
FXC
2330 _(optype_msgid), &op1->where, d + 1,
2331 (int) mpz_get_si (op1_size),
6de9cd9a
DN
2332 (int) mpz_get_si (op2_size));
2333
2334 t = FAILURE;
2335 }
2336
2337 if (op1_flag)
2338 mpz_clear (op1_size);
2339 if (op2_flag)
2340 mpz_clear (op2_size);
2341
2342 if (t == FAILURE)
2343 return FAILURE;
2344 }
2345
2346 return SUCCESS;
2347}
2348
2349
2350/* Given an assignable expression and an arbitrary expression, make
2351 sure that the assignment can take place. */
2352
2353try
636dff67 2354gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
6de9cd9a
DN
2355{
2356 gfc_symbol *sym;
f17facac
TB
2357 gfc_ref *ref;
2358 int has_pointer;
6de9cd9a
DN
2359
2360 sym = lvalue->symtree->n.sym;
2361
f17facac
TB
2362 /* Check INTENT(IN), unless the object itself is the component or
2363 sub-component of a pointer. */
2364 has_pointer = sym->attr.pointer;
2365
2366 for (ref = lvalue->ref; ref; ref = ref->next)
2367 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2368 {
2369 has_pointer = 1;
2370 break;
2371 }
2372
2373 if (!has_pointer && sym->attr.intent == INTENT_IN)
6de9cd9a 2374 {
f17facac 2375 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
6de9cd9a
DN
2376 sym->name, &lvalue->where);
2377 return FAILURE;
2378 }
2379
66e4ab31
SK
2380 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2381 variable local to a function subprogram. Its existence begins when
2382 execution of the function is initiated and ends when execution of the
2383 function is terminated...
2384 Therefore, the left hand side is no longer a variable, when it is: */
636dff67
SK
2385 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
2386 && !sym->attr.external)
2990f854 2387 {
f5f701ad
PT
2388 bool bad_proc;
2389 bad_proc = false;
2390
66e4ab31 2391 /* (i) Use associated; */
f5f701ad
PT
2392 if (sym->attr.use_assoc)
2393 bad_proc = true;
2394
e2ae1407 2395 /* (ii) The assignment is in the main program; or */
f5f701ad
PT
2396 if (gfc_current_ns->proc_name->attr.is_main_program)
2397 bad_proc = true;
2398
66e4ab31 2399 /* (iii) A module or internal procedure... */
f5f701ad 2400 if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
636dff67 2401 || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
f5f701ad
PT
2402 && gfc_current_ns->parent
2403 && (!(gfc_current_ns->parent->proc_name->attr.function
636dff67 2404 || gfc_current_ns->parent->proc_name->attr.subroutine)
f5f701ad
PT
2405 || gfc_current_ns->parent->proc_name->attr.is_main_program))
2406 {
66e4ab31 2407 /* ... that is not a function... */
f5f701ad
PT
2408 if (!gfc_current_ns->proc_name->attr.function)
2409 bad_proc = true;
2410
66e4ab31 2411 /* ... or is not an entry and has a different name. */
f5f701ad
PT
2412 if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2413 bad_proc = true;
2414 }
2990f854 2415
f5f701ad
PT
2416 if (bad_proc)
2417 {
2418 gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2419 return FAILURE;
2420 }
2421 }
2990f854 2422
6de9cd9a
DN
2423 if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2424 {
7dea5a95
TS
2425 gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2426 lvalue->rank, rvalue->rank, &lvalue->where);
6de9cd9a
DN
2427 return FAILURE;
2428 }
2429
2430 if (lvalue->ts.type == BT_UNKNOWN)
2431 {
2432 gfc_error ("Variable type is UNKNOWN in assignment at %L",
2433 &lvalue->where);
2434 return FAILURE;
2435 }
2436
37775e79
JD
2437 if (rvalue->expr_type == EXPR_NULL)
2438 {
2439 if (lvalue->symtree->n.sym->attr.pointer
2440 && lvalue->symtree->n.sym->attr.data)
2441 return SUCCESS;
2442 else
2443 {
2444 gfc_error ("NULL appears on right-hand side in assignment at %L",
2445 &rvalue->where);
2446 return FAILURE;
2447 }
2448 }
7dea5a95 2449
83d890b9
AL
2450 if (sym->attr.cray_pointee
2451 && lvalue->ref != NULL
f0d0757e 2452 && lvalue->ref->u.ar.type == AR_FULL
83d890b9
AL
2453 && lvalue->ref->u.ar.as->cp_was_assumed)
2454 {
636dff67
SK
2455 gfc_error ("Vector assignment to assumed-size Cray Pointee at %L "
2456 "is illegal", &lvalue->where);
83d890b9
AL
2457 return FAILURE;
2458 }
2459
66e4ab31 2460 /* This is possibly a typo: x = f() instead of x => f(). */
6d1c50cc
TS
2461 if (gfc_option.warn_surprising
2462 && rvalue->expr_type == EXPR_FUNCTION
2463 && rvalue->symtree->n.sym->attr.pointer)
2464 gfc_warning ("POINTER valued function appears on right-hand side of "
2465 "assignment at %L", &rvalue->where);
2466
6de9cd9a
DN
2467 /* Check size of array assignments. */
2468 if (lvalue->rank != 0 && rvalue->rank != 0
2469 && gfc_check_conformance ("Array assignment", lvalue, rvalue) != SUCCESS)
2470 return FAILURE;
2471
2472 if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2473 return SUCCESS;
2474
2475 if (!conform)
2476 {
d3642f89
FW
2477 /* Numeric can be converted to any other numeric. And Hollerith can be
2478 converted to any other type. */
2479 if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2480 || rvalue->ts.type == BT_HOLLERITH)
6de9cd9a
DN
2481 return SUCCESS;
2482
f240b896
SK
2483 if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2484 return SUCCESS;
2485
6de9cd9a
DN
2486 gfc_error ("Incompatible types in assignment at %L, %s to %s",
2487 &rvalue->where, gfc_typename (&rvalue->ts),
2488 gfc_typename (&lvalue->ts));
2489
2490 return FAILURE;
2491 }
2492
2493 return gfc_convert_type (rvalue, &lvalue->ts, 1);
2494}
2495
2496
2497/* Check that a pointer assignment is OK. We first check lvalue, and
2498 we only check rvalue if it's not an assignment to NULL() or a
2499 NULLIFY statement. */
2500
2501try
636dff67 2502gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
6de9cd9a
DN
2503{
2504 symbol_attribute attr;
f17facac 2505 gfc_ref *ref;
6de9cd9a 2506 int is_pure;
f17facac 2507 int pointer, check_intent_in;
6de9cd9a
DN
2508
2509 if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN)
2510 {
2511 gfc_error ("Pointer assignment target is not a POINTER at %L",
2512 &lvalue->where);
2513 return FAILURE;
2514 }
2515
2990f854 2516 if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
636dff67 2517 && lvalue->symtree->n.sym->attr.use_assoc)
2990f854
PT
2518 {
2519 gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2520 "l-value since it is a procedure",
2521 lvalue->symtree->n.sym->name, &lvalue->where);
2522 return FAILURE;
2523 }
2524
f17facac
TB
2525
2526 /* Check INTENT(IN), unless the object itself is the component or
2527 sub-component of a pointer. */
2528 check_intent_in = 1;
2529 pointer = lvalue->symtree->n.sym->attr.pointer;
2530
2531 for (ref = lvalue->ref; ref; ref = ref->next)
2532 {
2533 if (pointer)
636dff67 2534 check_intent_in = 0;
f17facac
TB
2535
2536 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
636dff67 2537 pointer = 1;
f17facac
TB
2538 }
2539
2540 if (check_intent_in && lvalue->symtree->n.sym->attr.intent == INTENT_IN)
2541 {
2542 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
636dff67 2543 lvalue->symtree->n.sym->name, &lvalue->where);
f17facac
TB
2544 return FAILURE;
2545 }
2546
2547 if (!pointer)
6de9cd9a
DN
2548 {
2549 gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2550 return FAILURE;
2551 }
2552
2553 is_pure = gfc_pure (NULL);
2554
2555 if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym))
2556 {
636dff67 2557 gfc_error ("Bad pointer object in PURE procedure at %L", &lvalue->where);
6de9cd9a
DN
2558 return FAILURE;
2559 }
2560
2561 /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2562 kind, etc for lvalue and rvalue must match, and rvalue must be a
2563 pure variable if we're in a pure function. */
def66134 2564 if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
7d76d73a
TS
2565 return SUCCESS;
2566
2567 if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
6de9cd9a 2568 {
7d76d73a
TS
2569 gfc_error ("Different types in pointer assignment at %L",
2570 &lvalue->where);
2571 return FAILURE;
2572 }
6de9cd9a 2573
7d76d73a
TS
2574 if (lvalue->ts.kind != rvalue->ts.kind)
2575 {
31043f6c 2576 gfc_error ("Different kind type parameters in pointer "
7d76d73a
TS
2577 "assignment at %L", &lvalue->where);
2578 return FAILURE;
2579 }
6de9cd9a 2580
def66134
SK
2581 if (lvalue->rank != rvalue->rank)
2582 {
2583 gfc_error ("Different ranks in pointer assignment at %L",
636dff67 2584 &lvalue->where);
def66134
SK
2585 return FAILURE;
2586 }
2587
2588 /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X). */
2589 if (rvalue->expr_type == EXPR_NULL)
2590 return SUCCESS;
2591
2990f854 2592 if (lvalue->ts.type == BT_CHARACTER
b2890f04 2593 && lvalue->ts.cl && rvalue->ts.cl
636dff67
SK
2594 && lvalue->ts.cl->length && rvalue->ts.cl->length
2595 && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
2596 rvalue->ts.cl->length)) == 1)
2990f854
PT
2597 {
2598 gfc_error ("Different character lengths in pointer "
2599 "assignment at %L", &lvalue->where);
2600 return FAILURE;
2601 }
2602
7d76d73a
TS
2603 attr = gfc_expr_attr (rvalue);
2604 if (!attr.target && !attr.pointer)
2605 {
31043f6c 2606 gfc_error ("Pointer assignment target is neither TARGET "
7d76d73a
TS
2607 "nor POINTER at %L", &rvalue->where);
2608 return FAILURE;
2609 }
6de9cd9a 2610
7d76d73a
TS
2611 if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
2612 {
31043f6c 2613 gfc_error ("Bad target in pointer assignment in PURE "
7d76d73a
TS
2614 "procedure at %L", &rvalue->where);
2615 }
6de9cd9a 2616
4075a94e
PT
2617 if (gfc_has_vector_index (rvalue))
2618 {
2619 gfc_error ("Pointer assignment with vector subscript "
2620 "on rhs at %L", &rvalue->where);
2621 return FAILURE;
2622 }
2623
ee7e677f
TB
2624 if (attr.protected && attr.use_assoc)
2625 {
2626 gfc_error ("Pointer assigment target has PROTECTED "
636dff67 2627 "attribute at %L", &rvalue->where);
ee7e677f
TB
2628 return FAILURE;
2629 }
2630
6de9cd9a
DN
2631 return SUCCESS;
2632}
2633
2634
2635/* Relative of gfc_check_assign() except that the lvalue is a single
597073ac 2636 symbol. Used for initialization assignments. */
6de9cd9a
DN
2637
2638try
636dff67 2639gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
6de9cd9a
DN
2640{
2641 gfc_expr lvalue;
2642 try r;
2643
2644 memset (&lvalue, '\0', sizeof (gfc_expr));
2645
2646 lvalue.expr_type = EXPR_VARIABLE;
2647 lvalue.ts = sym->ts;
2648 if (sym->as)
2649 lvalue.rank = sym->as->rank;
636dff67 2650 lvalue.symtree = (gfc_symtree *) gfc_getmem (sizeof (gfc_symtree));
6de9cd9a
DN
2651 lvalue.symtree->n.sym = sym;
2652 lvalue.where = sym->declared_at;
2653
597073ac
PB
2654 if (sym->attr.pointer)
2655 r = gfc_check_pointer_assign (&lvalue, rvalue);
2656 else
2657 r = gfc_check_assign (&lvalue, rvalue, 1);
6de9cd9a
DN
2658
2659 gfc_free (lvalue.symtree);
2660
2661 return r;
2662}
54b4ba60
PB
2663
2664
2665/* Get an expression for a default initializer. */
2666
2667gfc_expr *
2668gfc_default_initializer (gfc_typespec *ts)
2669{
2670 gfc_constructor *tail;
2671 gfc_expr *init;
2672 gfc_component *c;
2673
2674 init = NULL;
2675
2676 /* See if we have a default initializer. */
2677 for (c = ts->derived->components; c; c = c->next)
2678 {
5046aff5 2679 if ((c->initializer || c->allocatable) && init == NULL)
636dff67 2680 init = gfc_get_expr ();
54b4ba60
PB
2681 }
2682
2683 if (init == NULL)
2684 return NULL;
2685
2686 /* Build the constructor. */
2687 init->expr_type = EXPR_STRUCTURE;
2688 init->ts = *ts;
2689 init->where = ts->derived->declared_at;
2690 tail = NULL;
2691 for (c = ts->derived->components; c; c = c->next)
2692 {
2693 if (tail == NULL)
636dff67 2694 init->value.constructor = tail = gfc_get_constructor ();
54b4ba60 2695 else
636dff67
SK
2696 {
2697 tail->next = gfc_get_constructor ();
2698 tail = tail->next;
2699 }
54b4ba60
PB
2700
2701 if (c->initializer)
636dff67 2702 tail->expr = gfc_copy_expr (c->initializer);
5046aff5
PT
2703
2704 if (c->allocatable)
2705 {
2706 tail->expr = gfc_get_expr ();
2707 tail->expr->expr_type = EXPR_NULL;
2708 tail->expr->ts = c->ts;
2709 }
54b4ba60
PB
2710 }
2711 return init;
2712}
294fbfc8
TS
2713
2714
2715/* Given a symbol, create an expression node with that symbol as a
2716 variable. If the symbol is array valued, setup a reference of the
2717 whole array. */
2718
2719gfc_expr *
636dff67 2720gfc_get_variable_expr (gfc_symtree *var)
294fbfc8
TS
2721{
2722 gfc_expr *e;
2723
2724 e = gfc_get_expr ();
2725 e->expr_type = EXPR_VARIABLE;
2726 e->symtree = var;
2727 e->ts = var->n.sym->ts;
2728
2729 if (var->n.sym->as != NULL)
2730 {
2731 e->rank = var->n.sym->as->rank;
2732 e->ref = gfc_get_ref ();
2733 e->ref->type = REF_ARRAY;
2734 e->ref->u.ar.type = AR_FULL;
2735 }
2736
2737 return e;
2738}
2739
47992a4a
EE
2740
2741/* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
2742
2743void
636dff67 2744gfc_expr_set_symbols_referenced (gfc_expr *expr)
47992a4a
EE
2745{
2746 gfc_actual_arglist *arg;
2747 gfc_constructor *c;
2748 gfc_ref *ref;
2749 int i;
2750
2751 if (!expr) return;
2752
2753 switch (expr->expr_type)
2754 {
2755 case EXPR_OP:
2756 gfc_expr_set_symbols_referenced (expr->value.op.op1);
2757 gfc_expr_set_symbols_referenced (expr->value.op.op2);
2758 break;
2759
2760 case EXPR_FUNCTION:
2761 for (arg = expr->value.function.actual; arg; arg = arg->next)
636dff67 2762 gfc_expr_set_symbols_referenced (arg->expr);
47992a4a
EE
2763 break;
2764
2765 case EXPR_VARIABLE:
2766 gfc_set_sym_referenced (expr->symtree->n.sym);
2767 break;
2768
2769 case EXPR_CONSTANT:
2770 case EXPR_NULL:
2771 case EXPR_SUBSTRING:
2772 break;
2773
2774 case EXPR_STRUCTURE:
2775 case EXPR_ARRAY:
2776 for (c = expr->value.constructor; c; c = c->next)
636dff67 2777 gfc_expr_set_symbols_referenced (c->expr);
47992a4a
EE
2778 break;
2779
2780 default:
2781 gcc_unreachable ();
2782 break;
2783 }
2784
2785 for (ref = expr->ref; ref; ref = ref->next)
2786 switch (ref->type)
636dff67
SK
2787 {
2788 case REF_ARRAY:
2789 for (i = 0; i < ref->u.ar.dimen; i++)
2790 {
2791 gfc_expr_set_symbols_referenced (ref->u.ar.start[i]);
2792 gfc_expr_set_symbols_referenced (ref->u.ar.end[i]);
2793 gfc_expr_set_symbols_referenced (ref->u.ar.stride[i]);
2794 }
2795 break;
2796
2797 case REF_COMPONENT:
2798 break;
2799
2800 case REF_SUBSTRING:
2801 gfc_expr_set_symbols_referenced (ref->u.ss.start);
2802 gfc_expr_set_symbols_referenced (ref->u.ss.end);
2803 break;
2804
2805 default:
2806 gcc_unreachable ();
2807 break;
2808 }
47992a4a 2809}
This page took 1.333724 seconds and 5 git commands to generate.