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