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