]> gcc.gnu.org Git - gcc.git/blame - gcc/fortran/expr.c
re PR middle-end/32950 (ICE with __complex__ double)
[gcc.git] / gcc / fortran / expr.c
CommitLineData
6de9cd9a 1/* Routines for manipulation of expression nodes.
66647d44 2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
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
8e1f752a 184 case EXPR_COMPCALL:
713485cc 185 case EXPR_PPC:
8e1f752a
DK
186 gfc_free_actual_arglist (e->value.compcall.actual);
187 break;
188
6de9cd9a
DN
189 case EXPR_VARIABLE:
190 break;
191
192 case EXPR_ARRAY:
193 case EXPR_STRUCTURE:
194 gfc_free_constructor (e->value.constructor);
195 break;
196
197 case EXPR_SUBSTRING:
198 gfc_free (e->value.character.string);
199 break;
200
201 case EXPR_NULL:
202 break;
203
204 default:
205 gfc_internal_error ("free_expr0(): Bad expr type");
206 }
207
208 /* Free a shape array. */
209 if (e->shape != NULL)
210 {
211 for (n = 0; n < e->rank; n++)
212 mpz_clear (e->shape[n]);
213
214 gfc_free (e->shape);
215 }
216
217 gfc_free_ref_list (e->ref);
218
219 memset (e, '\0', sizeof (gfc_expr));
220}
221
222
223/* Free an expression node and everything beneath it. */
224
225void
636dff67 226gfc_free_expr (gfc_expr *e)
6de9cd9a 227{
6de9cd9a
DN
228 if (e == NULL)
229 return;
5868cbf9
BD
230 if (e->con_by_offset)
231 splay_tree_delete (e->con_by_offset);
6de9cd9a
DN
232 free_expr0 (e);
233 gfc_free (e);
234}
235
236
237/* Graft the *src expression onto the *dest subexpression. */
238
239void
636dff67 240gfc_replace_expr (gfc_expr *dest, gfc_expr *src)
6de9cd9a 241{
6de9cd9a
DN
242 free_expr0 (dest);
243 *dest = *src;
6de9cd9a
DN
244 gfc_free (src);
245}
246
247
248/* Try to extract an integer constant from the passed expression node.
249 Returns an error message or NULL if the result is set. It is
250 tempting to generate an error and return SUCCESS or FAILURE, but
251 failure is OK for some callers. */
252
253const char *
636dff67 254gfc_extract_int (gfc_expr *expr, int *result)
6de9cd9a 255{
6de9cd9a 256 if (expr->expr_type != EXPR_CONSTANT)
31043f6c 257 return _("Constant expression required at %C");
6de9cd9a
DN
258
259 if (expr->ts.type != BT_INTEGER)
31043f6c 260 return _("Integer expression required at %C");
6de9cd9a
DN
261
262 if ((mpz_cmp_si (expr->value.integer, INT_MAX) > 0)
263 || (mpz_cmp_si (expr->value.integer, INT_MIN) < 0))
264 {
31043f6c 265 return _("Integer value too large in expression at %C");
6de9cd9a
DN
266 }
267
268 *result = (int) mpz_get_si (expr->value.integer);
269
270 return NULL;
271}
272
273
274/* Recursively copy a list of reference structures. */
275
8e1f752a
DK
276gfc_ref *
277gfc_copy_ref (gfc_ref *src)
6de9cd9a
DN
278{
279 gfc_array_ref *ar;
280 gfc_ref *dest;
281
282 if (src == NULL)
283 return NULL;
284
285 dest = gfc_get_ref ();
286 dest->type = src->type;
287
288 switch (src->type)
289 {
290 case REF_ARRAY:
291 ar = gfc_copy_array_ref (&src->u.ar);
292 dest->u.ar = *ar;
293 gfc_free (ar);
294 break;
295
296 case REF_COMPONENT:
297 dest->u.c = src->u.c;
298 break;
299
300 case REF_SUBSTRING:
301 dest->u.ss = src->u.ss;
302 dest->u.ss.start = gfc_copy_expr (src->u.ss.start);
303 dest->u.ss.end = gfc_copy_expr (src->u.ss.end);
304 break;
305 }
306
8e1f752a 307 dest->next = gfc_copy_ref (src->next);
6de9cd9a
DN
308
309 return dest;
310}
311
312
636dff67 313/* Detect whether an expression has any vector index array references. */
4075a94e
PT
314
315int
316gfc_has_vector_index (gfc_expr *e)
317{
636dff67 318 gfc_ref *ref;
4075a94e
PT
319 int i;
320 for (ref = e->ref; ref; ref = ref->next)
321 if (ref->type == REF_ARRAY)
322 for (i = 0; i < ref->u.ar.dimen; i++)
323 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
324 return 1;
325 return 0;
326}
327
328
6de9cd9a
DN
329/* Copy a shape array. */
330
331mpz_t *
636dff67 332gfc_copy_shape (mpz_t *shape, int rank)
6de9cd9a
DN
333{
334 mpz_t *new_shape;
335 int n;
336
337 if (shape == NULL)
338 return NULL;
339
340 new_shape = gfc_get_shape (rank);
341
342 for (n = 0; n < rank; n++)
343 mpz_init_set (new_shape[n], shape[n]);
344
345 return new_shape;
346}
347
348
94538bd1
VL
349/* Copy a shape array excluding dimension N, where N is an integer
350 constant expression. Dimensions are numbered in fortran style --
351 starting with ONE.
352
353 So, if the original shape array contains R elements
354 { s1 ... sN-1 sN sN+1 ... sR-1 sR}
355 the result contains R-1 elements:
356 { s1 ... sN-1 sN+1 ... sR-1}
357
358 If anything goes wrong -- N is not a constant, its value is out
66e4ab31 359 of range -- or anything else, just returns NULL. */
94538bd1
VL
360
361mpz_t *
636dff67 362gfc_copy_shape_excluding (mpz_t *shape, int rank, gfc_expr *dim)
94538bd1
VL
363{
364 mpz_t *new_shape, *s;
365 int i, n;
366
367 if (shape == NULL
368 || rank <= 1
369 || dim == NULL
370 || dim->expr_type != EXPR_CONSTANT
371 || dim->ts.type != BT_INTEGER)
372 return NULL;
373
374 n = mpz_get_si (dim->value.integer);
66e4ab31 375 n--; /* Convert to zero based index. */
37e860a2 376 if (n < 0 || n >= rank)
94538bd1
VL
377 return NULL;
378
636dff67 379 s = new_shape = gfc_get_shape (rank - 1);
94538bd1
VL
380
381 for (i = 0; i < rank; i++)
382 {
383 if (i == n)
636dff67 384 continue;
94538bd1
VL
385 mpz_init_set (*s, shape[i]);
386 s++;
387 }
388
389 return new_shape;
390}
391
636dff67 392
6de9cd9a
DN
393/* Given an expression pointer, return a copy of the expression. This
394 subroutine is recursive. */
395
396gfc_expr *
636dff67 397gfc_copy_expr (gfc_expr *p)
6de9cd9a
DN
398{
399 gfc_expr *q;
00660189
FXC
400 gfc_char_t *s;
401 char *c;
6de9cd9a
DN
402
403 if (p == NULL)
404 return NULL;
405
406 q = gfc_get_expr ();
407 *q = *p;
408
409 switch (q->expr_type)
410 {
411 case EXPR_SUBSTRING:
00660189 412 s = gfc_get_wide_string (p->value.character.length + 1);
6de9cd9a 413 q->value.character.string = s;
00660189
FXC
414 memcpy (s, p->value.character.string,
415 (p->value.character.length + 1) * sizeof (gfc_char_t));
6de9cd9a
DN
416 break;
417
418 case EXPR_CONSTANT:
20585ad6
BM
419 /* Copy target representation, if it exists. */
420 if (p->representation.string)
d3642f89 421 {
ece3f663 422 c = XCNEWVEC (char, p->representation.length + 1);
00660189
FXC
423 q->representation.string = c;
424 memcpy (c, p->representation.string, (p->representation.length + 1));
d3642f89 425 }
20585ad6
BM
426
427 /* Copy the values of any pointer components of p->value. */
6de9cd9a
DN
428 switch (q->ts.type)
429 {
430 case BT_INTEGER:
431 mpz_init_set (q->value.integer, p->value.integer);
432 break;
433
434 case BT_REAL:
636dff67
SK
435 gfc_set_model_kind (q->ts.kind);
436 mpfr_init (q->value.real);
f8e566e5 437 mpfr_set (q->value.real, p->value.real, GFC_RND_MODE);
6de9cd9a
DN
438 break;
439
440 case BT_COMPLEX:
636dff67
SK
441 gfc_set_model_kind (q->ts.kind);
442 mpfr_init (q->value.complex.r);
443 mpfr_init (q->value.complex.i);
f8e566e5
SK
444 mpfr_set (q->value.complex.r, p->value.complex.r, GFC_RND_MODE);
445 mpfr_set (q->value.complex.i, p->value.complex.i, GFC_RND_MODE);
6de9cd9a
DN
446 break;
447
448 case BT_CHARACTER:
20585ad6 449 if (p->representation.string)
00660189
FXC
450 q->value.character.string
451 = gfc_char_to_widechar (q->representation.string);
20585ad6
BM
452 else
453 {
00660189 454 s = gfc_get_wide_string (p->value.character.length + 1);
20585ad6 455 q->value.character.string = s;
6de9cd9a 456
a8b3b0b6
CR
457 /* This is the case for the C_NULL_CHAR named constant. */
458 if (p->value.character.length == 0
459 && (p->ts.is_c_interop || p->ts.is_iso_c))
460 {
461 *s = '\0';
462 /* Need to set the length to 1 to make sure the NUL
463 terminator is copied. */
464 q->value.character.length = 1;
465 }
466 else
467 memcpy (s, p->value.character.string,
00660189 468 (p->value.character.length + 1) * sizeof (gfc_char_t));
20585ad6 469 }
6de9cd9a
DN
470 break;
471
20585ad6 472 case BT_HOLLERITH:
6de9cd9a
DN
473 case BT_LOGICAL:
474 case BT_DERIVED:
a8b3b0b6 475 break; /* Already done. */
6de9cd9a
DN
476
477 case BT_PROCEDURE:
a8b3b0b6
CR
478 case BT_VOID:
479 /* Should never be reached. */
6de9cd9a
DN
480 case BT_UNKNOWN:
481 gfc_internal_error ("gfc_copy_expr(): Bad expr node");
a8b3b0b6 482 /* Not reached. */
6de9cd9a
DN
483 }
484
485 break;
486
487 case EXPR_OP:
a1ee985f 488 switch (q->value.op.op)
6de9cd9a
DN
489 {
490 case INTRINSIC_NOT:
2f118814 491 case INTRINSIC_PARENTHESES:
6de9cd9a
DN
492 case INTRINSIC_UPLUS:
493 case INTRINSIC_UMINUS:
58b03ab2 494 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
6de9cd9a
DN
495 break;
496
66e4ab31 497 default: /* Binary operators. */
58b03ab2
TS
498 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
499 q->value.op.op2 = gfc_copy_expr (p->value.op.op2);
6de9cd9a
DN
500 break;
501 }
502
503 break;
504
505 case EXPR_FUNCTION:
506 q->value.function.actual =
507 gfc_copy_actual_arglist (p->value.function.actual);
508 break;
509
8e1f752a 510 case EXPR_COMPCALL:
713485cc 511 case EXPR_PPC:
8e1f752a
DK
512 q->value.compcall.actual =
513 gfc_copy_actual_arglist (p->value.compcall.actual);
514 q->value.compcall.tbp = p->value.compcall.tbp;
515 break;
516
6de9cd9a
DN
517 case EXPR_STRUCTURE:
518 case EXPR_ARRAY:
519 q->value.constructor = gfc_copy_constructor (p->value.constructor);
520 break;
521
522 case EXPR_VARIABLE:
523 case EXPR_NULL:
524 break;
525 }
526
527 q->shape = gfc_copy_shape (p->shape, p->rank);
528
8e1f752a 529 q->ref = gfc_copy_ref (p->ref);
6de9cd9a
DN
530
531 return q;
532}
533
534
535/* Return the maximum kind of two expressions. In general, higher
536 kind numbers mean more precision for numeric types. */
537
538int
636dff67 539gfc_kind_max (gfc_expr *e1, gfc_expr *e2)
6de9cd9a 540{
6de9cd9a
DN
541 return (e1->ts.kind > e2->ts.kind) ? e1->ts.kind : e2->ts.kind;
542}
543
544
545/* Returns nonzero if the type is numeric, zero otherwise. */
546
547static int
548numeric_type (bt type)
549{
6de9cd9a
DN
550 return type == BT_COMPLEX || type == BT_REAL || type == BT_INTEGER;
551}
552
553
554/* Returns nonzero if the typespec is a numeric type, zero otherwise. */
555
556int
636dff67 557gfc_numeric_ts (gfc_typespec *ts)
6de9cd9a 558{
6de9cd9a
DN
559 return numeric_type (ts->type);
560}
561
562
563/* Returns an expression node that is an integer constant. */
564
565gfc_expr *
566gfc_int_expr (int i)
567{
568 gfc_expr *p;
569
570 p = gfc_get_expr ();
571
572 p->expr_type = EXPR_CONSTANT;
573 p->ts.type = BT_INTEGER;
9d64df18 574 p->ts.kind = gfc_default_integer_kind;
6de9cd9a 575
63645982 576 p->where = gfc_current_locus;
6de9cd9a
DN
577 mpz_init_set_si (p->value.integer, i);
578
579 return p;
580}
581
582
583/* Returns an expression node that is a logical constant. */
584
585gfc_expr *
636dff67 586gfc_logical_expr (int i, locus *where)
6de9cd9a
DN
587{
588 gfc_expr *p;
589
590 p = gfc_get_expr ();
591
592 p->expr_type = EXPR_CONSTANT;
593 p->ts.type = BT_LOGICAL;
9d64df18 594 p->ts.kind = gfc_default_logical_kind;
6de9cd9a
DN
595
596 if (where == NULL)
63645982 597 where = &gfc_current_locus;
6de9cd9a
DN
598 p->where = *where;
599 p->value.logical = i;
600
601 return p;
602}
603
604
605/* Return an expression node with an optional argument list attached.
606 A variable number of gfc_expr pointers are strung together in an
607 argument list with a NULL pointer terminating the list. */
608
609gfc_expr *
636dff67 610gfc_build_conversion (gfc_expr *e)
6de9cd9a
DN
611{
612 gfc_expr *p;
613
614 p = gfc_get_expr ();
615 p->expr_type = EXPR_FUNCTION;
616 p->symtree = NULL;
617 p->value.function.actual = NULL;
618
619 p->value.function.actual = gfc_get_actual_arglist ();
620 p->value.function.actual->expr = e;
621
622 return p;
623}
624
625
626/* Given an expression node with some sort of numeric binary
627 expression, insert type conversions required to make the operands
628 have the same type.
629
630 The exception is that the operands of an exponential don't have to
631 have the same type. If possible, the base is promoted to the type
632 of the exponent. For example, 1**2.3 becomes 1.0**2.3, but
f7b529fa 633 1.0**2 stays as it is. */
6de9cd9a
DN
634
635void
636dff67 636gfc_type_convert_binary (gfc_expr *e)
6de9cd9a
DN
637{
638 gfc_expr *op1, *op2;
639
58b03ab2
TS
640 op1 = e->value.op.op1;
641 op2 = e->value.op.op2;
6de9cd9a
DN
642
643 if (op1->ts.type == BT_UNKNOWN || op2->ts.type == BT_UNKNOWN)
644 {
645 gfc_clear_ts (&e->ts);
646 return;
647 }
648
649 /* Kind conversions of same type. */
650 if (op1->ts.type == op2->ts.type)
651 {
6de9cd9a
DN
652 if (op1->ts.kind == op2->ts.kind)
653 {
636dff67 654 /* No type conversions. */
6de9cd9a
DN
655 e->ts = op1->ts;
656 goto done;
657 }
658
659 if (op1->ts.kind > op2->ts.kind)
660 gfc_convert_type (op2, &op1->ts, 2);
661 else
662 gfc_convert_type (op1, &op2->ts, 2);
663
664 e->ts = op1->ts;
665 goto done;
666 }
667
668 /* Integer combined with real or complex. */
669 if (op2->ts.type == BT_INTEGER)
670 {
671 e->ts = op1->ts;
672
687fcae7 673 /* Special case for ** operator. */
a1ee985f 674 if (e->value.op.op == INTRINSIC_POWER)
6de9cd9a
DN
675 goto done;
676
58b03ab2 677 gfc_convert_type (e->value.op.op2, &e->ts, 2);
6de9cd9a
DN
678 goto done;
679 }
680
681 if (op1->ts.type == BT_INTEGER)
682 {
683 e->ts = op2->ts;
58b03ab2 684 gfc_convert_type (e->value.op.op1, &e->ts, 2);
6de9cd9a
DN
685 goto done;
686 }
687
688 /* Real combined with complex. */
689 e->ts.type = BT_COMPLEX;
690 if (op1->ts.kind > op2->ts.kind)
691 e->ts.kind = op1->ts.kind;
692 else
693 e->ts.kind = op2->ts.kind;
694 if (op1->ts.type != BT_COMPLEX || op1->ts.kind != e->ts.kind)
58b03ab2 695 gfc_convert_type (e->value.op.op1, &e->ts, 2);
6de9cd9a 696 if (op2->ts.type != BT_COMPLEX || op2->ts.kind != e->ts.kind)
58b03ab2 697 gfc_convert_type (e->value.op.op2, &e->ts, 2);
6de9cd9a
DN
698
699done:
700 return;
701}
702
703
e1633d82
DF
704static match
705check_specification_function (gfc_expr *e)
706{
707 gfc_symbol *sym;
d05360a6
DF
708
709 if (!e->symtree)
710 return MATCH_NO;
711
e1633d82
DF
712 sym = e->symtree->n.sym;
713
714 /* F95, 7.1.6.2; F2003, 7.1.7 */
715 if (sym
716 && sym->attr.function
717 && sym->attr.pure
718 && !sym->attr.intrinsic
719 && !sym->attr.recursive
720 && sym->attr.proc != PROC_INTERNAL
721 && sym->attr.proc != PROC_ST_FUNCTION
722 && sym->attr.proc != PROC_UNKNOWN
723 && sym->formal == NULL)
724 return MATCH_YES;
725
726 return MATCH_NO;
727}
728
6de9cd9a
DN
729/* Function to determine if an expression is constant or not. This
730 function expects that the expression has already been simplified. */
731
732int
636dff67 733gfc_is_constant_expr (gfc_expr *e)
6de9cd9a
DN
734{
735 gfc_constructor *c;
736 gfc_actual_arglist *arg;
737 int rv;
738
739 if (e == NULL)
740 return 1;
741
742 switch (e->expr_type)
743 {
744 case EXPR_OP:
58b03ab2
TS
745 rv = (gfc_is_constant_expr (e->value.op.op1)
746 && (e->value.op.op2 == NULL
747 || gfc_is_constant_expr (e->value.op.op2)));
6de9cd9a
DN
748 break;
749
750 case EXPR_VARIABLE:
751 rv = 0;
752 break;
753
754 case EXPR_FUNCTION:
e1633d82
DF
755 /* Specification functions are constant. */
756 if (check_specification_function (e) == MATCH_YES)
757 {
758 rv = 1;
759 break;
760 }
761
6de9cd9a
DN
762 /* Call to intrinsic with at least one argument. */
763 rv = 0;
764 if (e->value.function.isym && e->value.function.actual)
765 {
766 for (arg = e->value.function.actual; arg; arg = arg->next)
767 {
768 if (!gfc_is_constant_expr (arg->expr))
769 break;
770 }
771 if (arg == NULL)
772 rv = 1;
773 }
774 break;
775
776 case EXPR_CONSTANT:
777 case EXPR_NULL:
778 rv = 1;
779 break;
780
781 case EXPR_SUBSTRING:
9a251aa1
FXC
782 rv = e->ref == NULL || (gfc_is_constant_expr (e->ref->u.ss.start)
783 && gfc_is_constant_expr (e->ref->u.ss.end));
6de9cd9a
DN
784 break;
785
786 case EXPR_STRUCTURE:
787 rv = 0;
788 for (c = e->value.constructor; c; c = c->next)
789 if (!gfc_is_constant_expr (c->expr))
790 break;
791
792 if (c == NULL)
793 rv = 1;
794 break;
795
796 case EXPR_ARRAY:
797 rv = gfc_constant_ac (e);
798 break;
799
800 default:
801 gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
802 }
803
804 return rv;
805}
806
807
1d6b7f39
PT
808/* Is true if an array reference is followed by a component or substring
809 reference. */
810bool
811is_subref_array (gfc_expr * e)
812{
813 gfc_ref * ref;
814 bool seen_array;
815
816 if (e->expr_type != EXPR_VARIABLE)
817 return false;
818
819 if (e->symtree->n.sym->attr.subref_array_pointer)
820 return true;
821
822 seen_array = false;
823 for (ref = e->ref; ref; ref = ref->next)
824 {
825 if (ref->type == REF_ARRAY
826 && ref->u.ar.type != AR_ELEMENT)
827 seen_array = true;
828
829 if (seen_array
830 && ref->type != REF_ARRAY)
831 return seen_array;
832 }
833 return false;
834}
835
836
6de9cd9a
DN
837/* Try to collapse intrinsic expressions. */
838
17b1d2a0 839static gfc_try
636dff67 840simplify_intrinsic_op (gfc_expr *p, int type)
6de9cd9a 841{
3bed9dd0 842 gfc_intrinsic_op op;
6de9cd9a
DN
843 gfc_expr *op1, *op2, *result;
844
a1ee985f 845 if (p->value.op.op == INTRINSIC_USER)
6de9cd9a
DN
846 return SUCCESS;
847
58b03ab2
TS
848 op1 = p->value.op.op1;
849 op2 = p->value.op.op2;
a1ee985f 850 op = p->value.op.op;
6de9cd9a
DN
851
852 if (gfc_simplify_expr (op1, type) == FAILURE)
853 return FAILURE;
854 if (gfc_simplify_expr (op2, type) == FAILURE)
855 return FAILURE;
856
857 if (!gfc_is_constant_expr (op1)
858 || (op2 != NULL && !gfc_is_constant_expr (op2)))
859 return SUCCESS;
860
66e4ab31 861 /* Rip p apart. */
58b03ab2
TS
862 p->value.op.op1 = NULL;
863 p->value.op.op2 = NULL;
6de9cd9a 864
3bed9dd0 865 switch (op)
6de9cd9a 866 {
2414e1d6 867 case INTRINSIC_PARENTHESES:
2f118814
TS
868 result = gfc_parentheses (op1);
869 break;
870
871 case INTRINSIC_UPLUS:
6de9cd9a
DN
872 result = gfc_uplus (op1);
873 break;
874
875 case INTRINSIC_UMINUS:
876 result = gfc_uminus (op1);
877 break;
878
879 case INTRINSIC_PLUS:
880 result = gfc_add (op1, op2);
881 break;
882
883 case INTRINSIC_MINUS:
884 result = gfc_subtract (op1, op2);
885 break;
886
887 case INTRINSIC_TIMES:
888 result = gfc_multiply (op1, op2);
889 break;
890
891 case INTRINSIC_DIVIDE:
892 result = gfc_divide (op1, op2);
893 break;
894
895 case INTRINSIC_POWER:
896 result = gfc_power (op1, op2);
897 break;
898
899 case INTRINSIC_CONCAT:
900 result = gfc_concat (op1, op2);
901 break;
902
903 case INTRINSIC_EQ:
3bed9dd0
DF
904 case INTRINSIC_EQ_OS:
905 result = gfc_eq (op1, op2, op);
6de9cd9a
DN
906 break;
907
908 case INTRINSIC_NE:
3bed9dd0
DF
909 case INTRINSIC_NE_OS:
910 result = gfc_ne (op1, op2, op);
6de9cd9a
DN
911 break;
912
913 case INTRINSIC_GT:
3bed9dd0
DF
914 case INTRINSIC_GT_OS:
915 result = gfc_gt (op1, op2, op);
6de9cd9a
DN
916 break;
917
918 case INTRINSIC_GE:
3bed9dd0
DF
919 case INTRINSIC_GE_OS:
920 result = gfc_ge (op1, op2, op);
6de9cd9a
DN
921 break;
922
923 case INTRINSIC_LT:
3bed9dd0
DF
924 case INTRINSIC_LT_OS:
925 result = gfc_lt (op1, op2, op);
6de9cd9a
DN
926 break;
927
928 case INTRINSIC_LE:
3bed9dd0
DF
929 case INTRINSIC_LE_OS:
930 result = gfc_le (op1, op2, op);
6de9cd9a
DN
931 break;
932
933 case INTRINSIC_NOT:
934 result = gfc_not (op1);
935 break;
936
937 case INTRINSIC_AND:
938 result = gfc_and (op1, op2);
939 break;
940
941 case INTRINSIC_OR:
942 result = gfc_or (op1, op2);
943 break;
944
945 case INTRINSIC_EQV:
946 result = gfc_eqv (op1, op2);
947 break;
948
949 case INTRINSIC_NEQV:
950 result = gfc_neqv (op1, op2);
951 break;
952
953 default:
954 gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
955 }
956
957 if (result == NULL)
958 {
959 gfc_free_expr (op1);
960 gfc_free_expr (op2);
961 return FAILURE;
962 }
963
0e9a445b
PT
964 result->rank = p->rank;
965 result->where = p->where;
6de9cd9a
DN
966 gfc_replace_expr (p, result);
967
968 return SUCCESS;
969}
970
971
972/* Subroutine to simplify constructor expressions. Mutually recursive
973 with gfc_simplify_expr(). */
974
17b1d2a0 975static gfc_try
636dff67 976simplify_constructor (gfc_constructor *c, int type)
6de9cd9a 977{
28d08315
PT
978 gfc_expr *p;
979
6de9cd9a
DN
980 for (; c; c = c->next)
981 {
982 if (c->iterator
983 && (gfc_simplify_expr (c->iterator->start, type) == FAILURE
984 || gfc_simplify_expr (c->iterator->end, type) == FAILURE
985 || gfc_simplify_expr (c->iterator->step, type) == FAILURE))
986 return FAILURE;
987
28d08315
PT
988 if (c->expr)
989 {
990 /* Try and simplify a copy. Replace the original if successful
991 but keep going through the constructor at all costs. Not
992 doing so can make a dog's dinner of complicated things. */
993 p = gfc_copy_expr (c->expr);
994
995 if (gfc_simplify_expr (p, type) == FAILURE)
996 {
997 gfc_free_expr (p);
998 continue;
999 }
1000
1001 gfc_replace_expr (c->expr, p);
1002 }
6de9cd9a
DN
1003 }
1004
1005 return SUCCESS;
1006}
1007
1008
1009/* Pull a single array element out of an array constructor. */
1010
17b1d2a0 1011static gfc_try
636dff67
SK
1012find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
1013 gfc_constructor **rval)
6de9cd9a
DN
1014{
1015 unsigned long nelemen;
1016 int i;
1017 mpz_t delta;
1018 mpz_t offset;
4c6b3ec7
PT
1019 mpz_t span;
1020 mpz_t tmp;
a4a11197 1021 gfc_expr *e;
17b1d2a0 1022 gfc_try t;
a4a11197
PT
1023
1024 t = SUCCESS;
1025 e = NULL;
6de9cd9a
DN
1026
1027 mpz_init_set_ui (offset, 0);
1028 mpz_init (delta);
4c6b3ec7
PT
1029 mpz_init (tmp);
1030 mpz_init_set_ui (span, 1);
6de9cd9a
DN
1031 for (i = 0; i < ar->dimen; i++)
1032 {
138b3340
MM
1033 if (gfc_reduce_init_expr (ar->as->lower[i]) == FAILURE
1034 || gfc_reduce_init_expr (ar->as->upper[i]) == FAILURE)
1035 {
1036 t = FAILURE;
1037 cons = NULL;
1038 goto depart;
1039 }
1040
a4a11197
PT
1041 e = gfc_copy_expr (ar->start[i]);
1042 if (e->expr_type != EXPR_CONSTANT)
6de9cd9a
DN
1043 {
1044 cons = NULL;
a4a11197 1045 goto depart;
6de9cd9a 1046 }
5bcb0cc3 1047
138b3340
MM
1048 gcc_assert (ar->as->upper[i]->expr_type == EXPR_CONSTANT
1049 && ar->as->lower[i]->expr_type == EXPR_CONSTANT);
1050
5bcb0cc3 1051 /* Check the bounds. */
0c6ce8b0 1052 if ((ar->as->upper[i]
3b35a6f8
L
1053 && mpz_cmp (e->value.integer,
1054 ar->as->upper[i]->value.integer) > 0)
138b3340
MM
1055 || (mpz_cmp (e->value.integer,
1056 ar->as->lower[i]->value.integer) < 0))
a4a11197 1057 {
0c6ce8b0 1058 gfc_error ("Index in dimension %d is out of bounds "
a4a11197
PT
1059 "at %L", i + 1, &ar->c_where[i]);
1060 cons = NULL;
1061 t = FAILURE;
1062 goto depart;
1063 }
1064
636dff67 1065 mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer);
4c6b3ec7 1066 mpz_mul (delta, delta, span);
6de9cd9a 1067 mpz_add (offset, offset, delta);
4c6b3ec7
PT
1068
1069 mpz_set_ui (tmp, 1);
1070 mpz_add (tmp, tmp, ar->as->upper[i]->value.integer);
1071 mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
1072 mpz_mul (span, span, tmp);
6de9cd9a
DN
1073 }
1074
3b35a6f8
L
1075 for (nelemen = mpz_get_ui (offset); nelemen > 0; nelemen--)
1076 {
1077 if (cons)
1078 {
1079 if (cons->iterator)
1080 {
1081 cons = NULL;
1082 goto depart;
1083 }
1084 cons = cons->next;
1085 }
1086 }
6de9cd9a 1087
a4a11197 1088depart:
6de9cd9a
DN
1089 mpz_clear (delta);
1090 mpz_clear (offset);
4c6b3ec7
PT
1091 mpz_clear (span);
1092 mpz_clear (tmp);
a4a11197
PT
1093 if (e)
1094 gfc_free_expr (e);
1095 *rval = cons;
1096 return t;
6de9cd9a
DN
1097}
1098
1099
1100/* Find a component of a structure constructor. */
1101
1102static gfc_constructor *
636dff67 1103find_component_ref (gfc_constructor *cons, gfc_ref *ref)
6de9cd9a
DN
1104{
1105 gfc_component *comp;
1106 gfc_component *pick;
1107
1108 comp = ref->u.c.sym->components;
1109 pick = ref->u.c.component;
1110 while (comp != pick)
1111 {
1112 comp = comp->next;
1113 cons = cons->next;
1114 }
1115
1116 return cons;
1117}
1118
1119
1120/* Replace an expression with the contents of a constructor, removing
1121 the subobject reference in the process. */
1122
1123static void
636dff67 1124remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
6de9cd9a
DN
1125{
1126 gfc_expr *e;
1127
1128 e = cons->expr;
1129 cons->expr = NULL;
1130 e->ref = p->ref->next;
1131 p->ref->next = NULL;
1132 gfc_replace_expr (p, e);
1133}
1134
1135
a4a11197
PT
1136/* Pull an array section out of an array constructor. */
1137
17b1d2a0 1138static gfc_try
a4a11197
PT
1139find_array_section (gfc_expr *expr, gfc_ref *ref)
1140{
1141 int idx;
1142 int rank;
1143 int d;
abe601c7 1144 int shape_i;
a4a11197 1145 long unsigned one = 1;
abe601c7 1146 bool incr_ctr;
3e978d30 1147 mpz_t start[GFC_MAX_DIMENSIONS];
a4a11197
PT
1148 mpz_t end[GFC_MAX_DIMENSIONS];
1149 mpz_t stride[GFC_MAX_DIMENSIONS];
1150 mpz_t delta[GFC_MAX_DIMENSIONS];
1151 mpz_t ctr[GFC_MAX_DIMENSIONS];
1152 mpz_t delta_mpz;
1153 mpz_t tmp_mpz;
1154 mpz_t nelts;
1155 mpz_t ptr;
a4a11197
PT
1156 mpz_t index;
1157 gfc_constructor *cons;
1158 gfc_constructor *base;
1159 gfc_expr *begin;
1160 gfc_expr *finish;
1161 gfc_expr *step;
1162 gfc_expr *upper;
1163 gfc_expr *lower;
abe601c7 1164 gfc_constructor *vecsub[GFC_MAX_DIMENSIONS], *c;
17b1d2a0 1165 gfc_try t;
a4a11197
PT
1166
1167 t = SUCCESS;
1168
1169 base = expr->value.constructor;
1170 expr->value.constructor = NULL;
1171
1172 rank = ref->u.ar.as->rank;
1173
1174 if (expr->shape == NULL)
1175 expr->shape = gfc_get_shape (rank);
1176
1177 mpz_init_set_ui (delta_mpz, one);
1178 mpz_init_set_ui (nelts, one);
1179 mpz_init (tmp_mpz);
1180
1181 /* Do the initialization now, so that we can cleanup without
1182 keeping track of where we were. */
1183 for (d = 0; d < rank; d++)
1184 {
1185 mpz_init (delta[d]);
3e978d30 1186 mpz_init (start[d]);
a4a11197
PT
1187 mpz_init (end[d]);
1188 mpz_init (ctr[d]);
1189 mpz_init (stride[d]);
abe601c7 1190 vecsub[d] = NULL;
a4a11197
PT
1191 }
1192
1193 /* Build the counters to clock through the array reference. */
abe601c7 1194 shape_i = 0;
a4a11197
PT
1195 for (d = 0; d < rank; d++)
1196 {
1197 /* Make this stretch of code easier on the eye! */
1198 begin = ref->u.ar.start[d];
1199 finish = ref->u.ar.end[d];
1200 step = ref->u.ar.stride[d];
1201 lower = ref->u.ar.as->lower[d];
1202 upper = ref->u.ar.as->upper[d];
1203
abe601c7 1204 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
636dff67
SK
1205 {
1206 gcc_assert (begin);
945a98a4 1207
28ec36ea 1208 if (begin->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (begin))
945a98a4
TB
1209 {
1210 t = FAILURE;
1211 goto cleanup;
1212 }
1213
636dff67 1214 gcc_assert (begin->rank == 1);
045ac367
DF
1215 /* Zero-sized arrays have no shape and no elements, stop early. */
1216 if (!begin->shape)
1217 {
1218 mpz_init_set_ui (nelts, 0);
1219 break;
1220 }
a4a11197 1221
abe601c7
EE
1222 vecsub[d] = begin->value.constructor;
1223 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1224 mpz_mul (nelts, nelts, begin->shape[0]);
1225 mpz_set (expr->shape[shape_i++], begin->shape[0]);
a4a11197 1226
abe601c7
EE
1227 /* Check bounds. */
1228 for (c = vecsub[d]; c; c = c->next)
1229 {
1230 if (mpz_cmp (c->expr->value.integer, upper->value.integer) > 0
636dff67
SK
1231 || mpz_cmp (c->expr->value.integer,
1232 lower->value.integer) < 0)
abe601c7
EE
1233 {
1234 gfc_error ("index in dimension %d is out of bounds "
1235 "at %L", d + 1, &ref->u.ar.c_where[d]);
1236 t = FAILURE;
1237 goto cleanup;
1238 }
1239 }
636dff67 1240 }
a4a11197 1241 else
636dff67 1242 {
abe601c7 1243 if ((begin && begin->expr_type != EXPR_CONSTANT)
636dff67
SK
1244 || (finish && finish->expr_type != EXPR_CONSTANT)
1245 || (step && step->expr_type != EXPR_CONSTANT))
abe601c7
EE
1246 {
1247 t = FAILURE;
1248 goto cleanup;
1249 }
c71d6a56 1250
abe601c7
EE
1251 /* Obtain the stride. */
1252 if (step)
1253 mpz_set (stride[d], step->value.integer);
1254 else
1255 mpz_set_ui (stride[d], one);
a4a11197 1256
abe601c7
EE
1257 if (mpz_cmp_ui (stride[d], 0) == 0)
1258 mpz_set_ui (stride[d], one);
a4a11197 1259
abe601c7
EE
1260 /* Obtain the start value for the index. */
1261 if (begin)
1262 mpz_set (start[d], begin->value.integer);
1263 else
1264 mpz_set (start[d], lower->value.integer);
a4a11197 1265
abe601c7 1266 mpz_set (ctr[d], start[d]);
a4a11197 1267
abe601c7
EE
1268 /* Obtain the end value for the index. */
1269 if (finish)
1270 mpz_set (end[d], finish->value.integer);
1271 else
1272 mpz_set (end[d], upper->value.integer);
1273
1274 /* Separate 'if' because elements sometimes arrive with
1275 non-null end. */
1276 if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1277 mpz_set (end [d], begin->value.integer);
1278
1279 /* Check the bounds. */
1280 if (mpz_cmp (ctr[d], upper->value.integer) > 0
1281 || mpz_cmp (end[d], upper->value.integer) > 0
1282 || mpz_cmp (ctr[d], lower->value.integer) < 0
1283 || mpz_cmp (end[d], lower->value.integer) < 0)
1284 {
1285 gfc_error ("index in dimension %d is out of bounds "
1286 "at %L", d + 1, &ref->u.ar.c_where[d]);
1287 t = FAILURE;
1288 goto cleanup;
1289 }
a4a11197 1290
abe601c7 1291 /* Calculate the number of elements and the shape. */
e1e24dc1 1292 mpz_set (tmp_mpz, stride[d]);
abe601c7
EE
1293 mpz_add (tmp_mpz, end[d], tmp_mpz);
1294 mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1295 mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1296 mpz_mul (nelts, nelts, tmp_mpz);
1297
636dff67
SK
1298 /* An element reference reduces the rank of the expression; don't
1299 add anything to the shape array. */
abe601c7
EE
1300 if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT)
1301 mpz_set (expr->shape[shape_i++], tmp_mpz);
1302 }
a4a11197
PT
1303
1304 /* Calculate the 'stride' (=delta) for conversion of the
1305 counter values into the index along the constructor. */
1306 mpz_set (delta[d], delta_mpz);
1307 mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1308 mpz_add_ui (tmp_mpz, tmp_mpz, one);
1309 mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1310 }
1311
1312 mpz_init (index);
1313 mpz_init (ptr);
a4a11197
PT
1314 cons = base;
1315
1316 /* Now clock through the array reference, calculating the index in
1317 the source constructor and transferring the elements to the new
1318 constructor. */
636dff67 1319 for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
a4a11197
PT
1320 {
1321 if (ref->u.ar.offset)
1322 mpz_set (ptr, ref->u.ar.offset->value.integer);
1323 else
1324 mpz_init_set_ui (ptr, 0);
1325
abe601c7 1326 incr_ctr = true;
a4a11197
PT
1327 for (d = 0; d < rank; d++)
1328 {
1329 mpz_set (tmp_mpz, ctr[d]);
636dff67 1330 mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
a4a11197
PT
1331 mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1332 mpz_add (ptr, ptr, tmp_mpz);
1333
abe601c7 1334 if (!incr_ctr) continue;
a4a11197 1335
636dff67 1336 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
abe601c7
EE
1337 {
1338 gcc_assert(vecsub[d]);
1339
1340 if (!vecsub[d]->next)
1341 vecsub[d] = ref->u.ar.start[d]->value.constructor;
1342 else
1343 {
1344 vecsub[d] = vecsub[d]->next;
1345 incr_ctr = false;
1346 }
1347 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1348 }
a4a11197 1349 else
abe601c7
EE
1350 {
1351 mpz_add (ctr[d], ctr[d], stride[d]);
1352
636dff67
SK
1353 if (mpz_cmp_ui (stride[d], 0) > 0
1354 ? mpz_cmp (ctr[d], end[d]) > 0
1355 : mpz_cmp (ctr[d], end[d]) < 0)
abe601c7
EE
1356 mpz_set (ctr[d], start[d]);
1357 else
1358 incr_ctr = false;
1359 }
a4a11197
PT
1360 }
1361
1362 /* There must be a better way of dealing with negative strides
1363 than resetting the index and the constructor pointer! */
1364 if (mpz_cmp (ptr, index) < 0)
1365 {
1366 mpz_set_ui (index, 0);
1367 cons = base;
1368 }
1369
44000dbb 1370 while (cons && cons->next && mpz_cmp (ptr, index) > 0)
a4a11197
PT
1371 {
1372 mpz_add_ui (index, index, one);
1373 cons = cons->next;
1374 }
1375
1376 gfc_append_constructor (expr, gfc_copy_expr (cons->expr));
1377 }
1378
1379 mpz_clear (ptr);
1380 mpz_clear (index);
a4a11197
PT
1381
1382cleanup:
1383
1384 mpz_clear (delta_mpz);
1385 mpz_clear (tmp_mpz);
1386 mpz_clear (nelts);
1387 for (d = 0; d < rank; d++)
1388 {
1389 mpz_clear (delta[d]);
3e978d30 1390 mpz_clear (start[d]);
a4a11197
PT
1391 mpz_clear (end[d]);
1392 mpz_clear (ctr[d]);
1393 mpz_clear (stride[d]);
1394 }
1395 gfc_free_constructor (base);
1396 return t;
1397}
1398
1399/* Pull a substring out of an expression. */
1400
17b1d2a0 1401static gfc_try
a4a11197
PT
1402find_substring_ref (gfc_expr *p, gfc_expr **newp)
1403{
1404 int end;
1405 int start;
b35c5f01 1406 int length;
00660189 1407 gfc_char_t *chr;
a4a11197
PT
1408
1409 if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
636dff67 1410 || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
a4a11197
PT
1411 return FAILURE;
1412
1413 *newp = gfc_copy_expr (p);
b35c5f01
TS
1414 gfc_free ((*newp)->value.character.string);
1415
636dff67
SK
1416 end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer);
1417 start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer);
b35c5f01 1418 length = end - start + 1;
a4a11197 1419
00660189 1420 chr = (*newp)->value.character.string = gfc_get_wide_string (length + 1);
b35c5f01 1421 (*newp)->value.character.length = length;
00660189
FXC
1422 memcpy (chr, &p->value.character.string[start - 1],
1423 length * sizeof (gfc_char_t));
b35c5f01 1424 chr[length] = '\0';
a4a11197
PT
1425 return SUCCESS;
1426}
1427
1428
1429
6de9cd9a
DN
1430/* Simplify a subobject reference of a constructor. This occurs when
1431 parameter variable values are substituted. */
1432
17b1d2a0 1433static gfc_try
636dff67 1434simplify_const_ref (gfc_expr *p)
6de9cd9a
DN
1435{
1436 gfc_constructor *cons;
a4a11197 1437 gfc_expr *newp;
6de9cd9a
DN
1438
1439 while (p->ref)
1440 {
1441 switch (p->ref->type)
1442 {
1443 case REF_ARRAY:
1444 switch (p->ref->u.ar.type)
1445 {
1446 case AR_ELEMENT:
636dff67 1447 if (find_array_element (p->value.constructor, &p->ref->u.ar,
a4a11197
PT
1448 &cons) == FAILURE)
1449 return FAILURE;
1450
6de9cd9a
DN
1451 if (!cons)
1452 return SUCCESS;
a4a11197 1453
6de9cd9a
DN
1454 remove_subobject_ref (p, cons);
1455 break;
1456
a4a11197
PT
1457 case AR_SECTION:
1458 if (find_array_section (p, p->ref) == FAILURE)
1459 return FAILURE;
1460 p->ref->u.ar.type = AR_FULL;
1461
66e4ab31 1462 /* Fall through. */
a4a11197 1463
6de9cd9a 1464 case AR_FULL:
a4a11197 1465 if (p->ref->next != NULL
636dff67 1466 && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
6de9cd9a 1467 {
a4a11197
PT
1468 cons = p->value.constructor;
1469 for (; cons; cons = cons->next)
1470 {
8e1f752a 1471 cons->expr->ref = gfc_copy_ref (p->ref->next);
d5551618
DK
1472 if (simplify_const_ref (cons->expr) == FAILURE)
1473 return FAILURE;
1474 }
1475
1476 /* If this is a CHARACTER array and we possibly took a
1477 substring out of it, update the type-spec's character
1478 length according to the first element (as all should have
1479 the same length). */
1480 if (p->ts.type == BT_CHARACTER)
1481 {
1482 int string_len;
1483
1484 gcc_assert (p->ref->next);
1485 gcc_assert (!p->ref->next->next);
1486 gcc_assert (p->ref->next->type == REF_SUBSTRING);
1487
1488 if (p->value.constructor)
1489 {
1490 const gfc_expr* first = p->value.constructor->expr;
1491 gcc_assert (first->expr_type == EXPR_CONSTANT);
1492 gcc_assert (first->ts.type == BT_CHARACTER);
1493 string_len = first->value.character.length;
1494 }
1495 else
1496 string_len = 0;
1497
1498 if (!p->ts.cl)
1499 {
1500 p->ts.cl = gfc_get_charlen ();
1501 p->ts.cl->next = NULL;
1502 p->ts.cl->length = NULL;
1503 }
1504 gfc_free_expr (p->ts.cl->length);
1505 p->ts.cl->length = gfc_int_expr (string_len);
a4a11197 1506 }
6de9cd9a 1507 }
a4a11197
PT
1508 gfc_free_ref_list (p->ref);
1509 p->ref = NULL;
6de9cd9a
DN
1510 break;
1511
1512 default:
6de9cd9a
DN
1513 return SUCCESS;
1514 }
1515
1516 break;
1517
1518 case REF_COMPONENT:
1519 cons = find_component_ref (p->value.constructor, p->ref);
1520 remove_subobject_ref (p, cons);
1521 break;
1522
1523 case REF_SUBSTRING:
a4a11197
PT
1524 if (find_substring_ref (p, &newp) == FAILURE)
1525 return FAILURE;
1526
1527 gfc_replace_expr (p, newp);
1528 gfc_free_ref_list (p->ref);
1529 p->ref = NULL;
1530 break;
6de9cd9a
DN
1531 }
1532 }
1533
1534 return SUCCESS;
1535}
1536
1537
1538/* Simplify a chain of references. */
1539
17b1d2a0 1540static gfc_try
636dff67 1541simplify_ref_chain (gfc_ref *ref, int type)
6de9cd9a
DN
1542{
1543 int n;
1544
1545 for (; ref; ref = ref->next)
1546 {
1547 switch (ref->type)
1548 {
1549 case REF_ARRAY:
1550 for (n = 0; n < ref->u.ar.dimen; n++)
1551 {
636dff67 1552 if (gfc_simplify_expr (ref->u.ar.start[n], type) == FAILURE)
6de9cd9a 1553 return FAILURE;
636dff67 1554 if (gfc_simplify_expr (ref->u.ar.end[n], type) == FAILURE)
6de9cd9a 1555 return FAILURE;
636dff67 1556 if (gfc_simplify_expr (ref->u.ar.stride[n], type) == FAILURE)
6de9cd9a
DN
1557 return FAILURE;
1558 }
1559 break;
1560
1561 case REF_SUBSTRING:
1562 if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1563 return FAILURE;
1564 if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1565 return FAILURE;
1566 break;
1567
1568 default:
1569 break;
1570 }
1571 }
1572 return SUCCESS;
1573}
1574
1575
1576/* Try to substitute the value of a parameter variable. */
66e4ab31 1577
17b1d2a0 1578static gfc_try
636dff67 1579simplify_parameter_variable (gfc_expr *p, int type)
6de9cd9a
DN
1580{
1581 gfc_expr *e;
17b1d2a0 1582 gfc_try t;
6de9cd9a
DN
1583
1584 e = gfc_copy_expr (p->symtree->n.sym->value);
a4a11197
PT
1585 if (e == NULL)
1586 return FAILURE;
1587
b9703d98
EE
1588 e->rank = p->rank;
1589
c2fee3de
DE
1590 /* Do not copy subobject refs for constant. */
1591 if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
8e1f752a 1592 e->ref = gfc_copy_ref (p->ref);
6de9cd9a
DN
1593 t = gfc_simplify_expr (e, type);
1594
66e4ab31 1595 /* Only use the simplification if it eliminated all subobject references. */
636dff67 1596 if (t == SUCCESS && !e->ref)
6de9cd9a
DN
1597 gfc_replace_expr (p, e);
1598 else
1599 gfc_free_expr (e);
1600
1601 return t;
1602}
1603
1604/* Given an expression, simplify it by collapsing constant
1605 expressions. Most simplification takes place when the expression
1606 tree is being constructed. If an intrinsic function is simplified
1607 at some point, we get called again to collapse the result against
1608 other constants.
1609
1610 We work by recursively simplifying expression nodes, simplifying
1611 intrinsic functions where possible, which can lead to further
1612 constant collapsing. If an operator has constant operand(s), we
1613 rip the expression apart, and rebuild it, hoping that it becomes
1614 something simpler.
1615
1616 The expression type is defined for:
1617 0 Basic expression parsing
1618 1 Simplifying array constructors -- will substitute
636dff67 1619 iterator values.
6de9cd9a
DN
1620 Returns FAILURE on error, SUCCESS otherwise.
1621 NOTE: Will return SUCCESS even if the expression can not be simplified. */
1622
17b1d2a0 1623gfc_try
636dff67 1624gfc_simplify_expr (gfc_expr *p, int type)
6de9cd9a
DN
1625{
1626 gfc_actual_arglist *ap;
1627
1628 if (p == NULL)
1629 return SUCCESS;
1630
1631 switch (p->expr_type)
1632 {
1633 case EXPR_CONSTANT:
1634 case EXPR_NULL:
1635 break;
1636
1637 case EXPR_FUNCTION:
1638 for (ap = p->value.function.actual; ap; ap = ap->next)
1639 if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1640 return FAILURE;
1641
1642 if (p->value.function.isym != NULL
1643 && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1644 return FAILURE;
1645
1646 break;
1647
1648 case EXPR_SUBSTRING:
eac33acc 1649 if (simplify_ref_chain (p->ref, type) == FAILURE)
6de9cd9a
DN
1650 return FAILURE;
1651
c2fee3de
DE
1652 if (gfc_is_constant_expr (p))
1653 {
00660189 1654 gfc_char_t *s;
c2fee3de
DE
1655 int start, end;
1656
9a251aa1
FXC
1657 if (p->ref && p->ref->u.ss.start)
1658 {
1659 gfc_extract_int (p->ref->u.ss.start, &start);
1660 start--; /* Convert from one-based to zero-based. */
1661 }
1662 else
1663 start = 0;
1664
1665 if (p->ref && p->ref->u.ss.end)
1666 gfc_extract_int (p->ref->u.ss.end, &end);
1667 else
1668 end = p->value.character.length;
1669
00660189
FXC
1670 s = gfc_get_wide_string (end - start + 2);
1671 memcpy (s, p->value.character.string + start,
1672 (end - start) * sizeof (gfc_char_t));
636dff67 1673 s[end - start + 1] = '\0'; /* TODO: C-style string. */
c2fee3de
DE
1674 gfc_free (p->value.character.string);
1675 p->value.character.string = s;
1676 p->value.character.length = end - start;
1677 p->ts.cl = gfc_get_charlen ();
1678 p->ts.cl->next = gfc_current_ns->cl_list;
1679 gfc_current_ns->cl_list = p->ts.cl;
1680 p->ts.cl->length = gfc_int_expr (p->value.character.length);
1681 gfc_free_ref_list (p->ref);
1682 p->ref = NULL;
1683 p->expr_type = EXPR_CONSTANT;
1684 }
6de9cd9a
DN
1685 break;
1686
1687 case EXPR_OP:
1688 if (simplify_intrinsic_op (p, type) == FAILURE)
1689 return FAILURE;
1690 break;
1691
1692 case EXPR_VARIABLE:
1693 /* Only substitute array parameter variables if we are in an
636dff67 1694 initialization expression, or we want a subsection. */
6de9cd9a
DN
1695 if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1696 && (gfc_init_expr || p->ref
1697 || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1698 {
1699 if (simplify_parameter_variable (p, type) == FAILURE)
1700 return FAILURE;
1701 break;
1702 }
1703
1704 if (type == 1)
1705 {
1706 gfc_simplify_iterator_var (p);
1707 }
1708
1709 /* Simplify subcomponent references. */
1710 if (simplify_ref_chain (p->ref, type) == FAILURE)
1711 return FAILURE;
1712
1713 break;
1714
1715 case EXPR_STRUCTURE:
1716 case EXPR_ARRAY:
1717 if (simplify_ref_chain (p->ref, type) == FAILURE)
1718 return FAILURE;
1719
1720 if (simplify_constructor (p->value.constructor, type) == FAILURE)
1721 return FAILURE;
1722
636dff67
SK
1723 if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1724 && p->ref->u.ar.type == AR_FULL)
6de9cd9a
DN
1725 gfc_expand_constructor (p);
1726
1727 if (simplify_const_ref (p) == FAILURE)
1728 return FAILURE;
1729
1730 break;
8e1f752a
DK
1731
1732 case EXPR_COMPCALL:
713485cc 1733 case EXPR_PPC:
8e1f752a
DK
1734 gcc_unreachable ();
1735 break;
6de9cd9a
DN
1736 }
1737
1738 return SUCCESS;
1739}
1740
1741
1742/* Returns the type of an expression with the exception that iterator
1743 variables are automatically integers no matter what else they may
1744 be declared as. */
1745
1746static bt
636dff67 1747et0 (gfc_expr *e)
6de9cd9a 1748{
6de9cd9a
DN
1749 if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1750 return BT_INTEGER;
1751
1752 return e->ts.type;
1753}
1754
1755
1756/* Check an intrinsic arithmetic operation to see if it is consistent
1757 with some type of expression. */
1758
17b1d2a0 1759static gfc_try check_init_expr (gfc_expr *);
6de9cd9a 1760
396b2c19
PT
1761
1762/* Scalarize an expression for an elemental intrinsic call. */
1763
17b1d2a0 1764static gfc_try
396b2c19
PT
1765scalarize_intrinsic_call (gfc_expr *e)
1766{
1767 gfc_actual_arglist *a, *b;
1768 gfc_constructor *args[5], *ctor, *new_ctor;
1769 gfc_expr *expr, *old;
679d9637 1770 int n, i, rank[5], array_arg;
396b2c19 1771
679d9637
PT
1772 /* Find which, if any, arguments are arrays. Assume that the old
1773 expression carries the type information and that the first arg
1774 that is an array expression carries all the shape information.*/
1775 n = array_arg = 0;
05e6ff80 1776 a = e->value.function.actual;
679d9637
PT
1777 for (; a; a = a->next)
1778 {
1779 n++;
1780 if (a->expr->expr_type != EXPR_ARRAY)
1781 continue;
1782 array_arg = n;
1783 expr = gfc_copy_expr (a->expr);
1784 break;
1785 }
1786
1787 if (!array_arg)
05e6ff80
PT
1788 return FAILURE;
1789
1790 old = gfc_copy_expr (e);
679d9637 1791
396b2c19
PT
1792 gfc_free_constructor (expr->value.constructor);
1793 expr->value.constructor = NULL;
1794
1795 expr->ts = old->ts;
679d9637 1796 expr->where = old->where;
396b2c19
PT
1797 expr->expr_type = EXPR_ARRAY;
1798
1799 /* Copy the array argument constructors into an array, with nulls
1800 for the scalars. */
1801 n = 0;
1802 a = old->value.function.actual;
1803 for (; a; a = a->next)
1804 {
1805 /* Check that this is OK for an initialization expression. */
1806 if (a->expr && check_init_expr (a->expr) == FAILURE)
1807 goto cleanup;
1808
1809 rank[n] = 0;
1810 if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
1811 {
1812 rank[n] = a->expr->rank;
1813 ctor = a->expr->symtree->n.sym->value->value.constructor;
1814 args[n] = gfc_copy_constructor (ctor);
1815 }
1816 else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
1817 {
1818 if (a->expr->rank)
1819 rank[n] = a->expr->rank;
1820 else
1821 rank[n] = 1;
1822 args[n] = gfc_copy_constructor (a->expr->value.constructor);
1823 }
1824 else
1825 args[n] = NULL;
1826 n++;
1827 }
1828
396b2c19 1829
05e6ff80 1830 /* Using the array argument as the master, step through the array
396b2c19
PT
1831 calling the function for each element and advancing the array
1832 constructors together. */
679d9637 1833 ctor = args[array_arg - 1];
396b2c19
PT
1834 new_ctor = NULL;
1835 for (; ctor; ctor = ctor->next)
1836 {
1837 if (expr->value.constructor == NULL)
1838 expr->value.constructor
1839 = new_ctor = gfc_get_constructor ();
1840 else
1841 {
1842 new_ctor->next = gfc_get_constructor ();
1843 new_ctor = new_ctor->next;
1844 }
1845 new_ctor->expr = gfc_copy_expr (old);
1846 gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
1847 a = NULL;
1848 b = old->value.function.actual;
1849 for (i = 0; i < n; i++)
1850 {
1851 if (a == NULL)
1852 new_ctor->expr->value.function.actual
1853 = a = gfc_get_actual_arglist ();
1854 else
1855 {
1856 a->next = gfc_get_actual_arglist ();
1857 a = a->next;
1858 }
1859 if (args[i])
1860 a->expr = gfc_copy_expr (args[i]->expr);
1861 else
1862 a->expr = gfc_copy_expr (b->expr);
1863
1864 b = b->next;
1865 }
1866
679d9637
PT
1867 /* Simplify the function calls. If the simplification fails, the
1868 error will be flagged up down-stream or the library will deal
1869 with it. */
1870 gfc_simplify_expr (new_ctor->expr, 0);
396b2c19
PT
1871
1872 for (i = 0; i < n; i++)
1873 if (args[i])
1874 args[i] = args[i]->next;
1875
1876 for (i = 1; i < n; i++)
679d9637
PT
1877 if (rank[i] && ((args[i] != NULL && args[array_arg - 1] == NULL)
1878 || (args[i] == NULL && args[array_arg - 1] != NULL)))
396b2c19
PT
1879 goto compliance;
1880 }
1881
1882 free_expr0 (e);
1883 *e = *expr;
1884 gfc_free_expr (old);
1885 return SUCCESS;
1886
1887compliance:
1888 gfc_error_now ("elemental function arguments at %C are not compliant");
1889
1890cleanup:
1891 gfc_free_expr (expr);
1892 gfc_free_expr (old);
1893 return FAILURE;
1894}
1895
1896
17b1d2a0
KG
1897static gfc_try
1898check_intrinsic_op (gfc_expr *e, gfc_try (*check_function) (gfc_expr *))
6de9cd9a 1899{
58b03ab2
TS
1900 gfc_expr *op1 = e->value.op.op1;
1901 gfc_expr *op2 = e->value.op.op2;
6de9cd9a 1902
58b03ab2 1903 if ((*check_function) (op1) == FAILURE)
6de9cd9a
DN
1904 return FAILURE;
1905
a1ee985f 1906 switch (e->value.op.op)
6de9cd9a
DN
1907 {
1908 case INTRINSIC_UPLUS:
1909 case INTRINSIC_UMINUS:
58b03ab2 1910 if (!numeric_type (et0 (op1)))
6de9cd9a
DN
1911 goto not_numeric;
1912 break;
1913
1914 case INTRINSIC_EQ:
3bed9dd0 1915 case INTRINSIC_EQ_OS:
6de9cd9a 1916 case INTRINSIC_NE:
3bed9dd0 1917 case INTRINSIC_NE_OS:
6de9cd9a 1918 case INTRINSIC_GT:
3bed9dd0 1919 case INTRINSIC_GT_OS:
6de9cd9a 1920 case INTRINSIC_GE:
3bed9dd0 1921 case INTRINSIC_GE_OS:
6de9cd9a 1922 case INTRINSIC_LT:
3bed9dd0 1923 case INTRINSIC_LT_OS:
6de9cd9a 1924 case INTRINSIC_LE:
3bed9dd0 1925 case INTRINSIC_LE_OS:
58b03ab2 1926 if ((*check_function) (op2) == FAILURE)
e063a048
TS
1927 return FAILURE;
1928
58b03ab2
TS
1929 if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1930 && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
e063a048
TS
1931 {
1932 gfc_error ("Numeric or CHARACTER operands are required in "
1933 "expression at %L", &e->where);
636dff67 1934 return FAILURE;
e063a048
TS
1935 }
1936 break;
6de9cd9a
DN
1937
1938 case INTRINSIC_PLUS:
1939 case INTRINSIC_MINUS:
1940 case INTRINSIC_TIMES:
1941 case INTRINSIC_DIVIDE:
1942 case INTRINSIC_POWER:
58b03ab2 1943 if ((*check_function) (op2) == FAILURE)
6de9cd9a
DN
1944 return FAILURE;
1945
58b03ab2 1946 if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
6de9cd9a
DN
1947 goto not_numeric;
1948
6de9cd9a
DN
1949 break;
1950
1951 case INTRINSIC_CONCAT:
58b03ab2 1952 if ((*check_function) (op2) == FAILURE)
6de9cd9a
DN
1953 return FAILURE;
1954
58b03ab2 1955 if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
6de9cd9a
DN
1956 {
1957 gfc_error ("Concatenation operator in expression at %L "
58b03ab2 1958 "must have two CHARACTER operands", &op1->where);
6de9cd9a
DN
1959 return FAILURE;
1960 }
1961
58b03ab2 1962 if (op1->ts.kind != op2->ts.kind)
6de9cd9a
DN
1963 {
1964 gfc_error ("Concat operator at %L must concatenate strings of the "
1965 "same kind", &e->where);
1966 return FAILURE;
1967 }
1968
1969 break;
1970
1971 case INTRINSIC_NOT:
58b03ab2 1972 if (et0 (op1) != BT_LOGICAL)
6de9cd9a
DN
1973 {
1974 gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
58b03ab2 1975 "operand", &op1->where);
6de9cd9a
DN
1976 return FAILURE;
1977 }
1978
1979 break;
1980
1981 case INTRINSIC_AND:
1982 case INTRINSIC_OR:
1983 case INTRINSIC_EQV:
1984 case INTRINSIC_NEQV:
58b03ab2 1985 if ((*check_function) (op2) == FAILURE)
6de9cd9a
DN
1986 return FAILURE;
1987
58b03ab2 1988 if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
6de9cd9a
DN
1989 {
1990 gfc_error ("LOGICAL operands are required in expression at %L",
1991 &e->where);
1992 return FAILURE;
1993 }
1994
1995 break;
1996
083cc293
TS
1997 case INTRINSIC_PARENTHESES:
1998 break;
1999
6de9cd9a
DN
2000 default:
2001 gfc_error ("Only intrinsic operators can be used in expression at %L",
2002 &e->where);
2003 return FAILURE;
2004 }
2005
2006 return SUCCESS;
2007
2008not_numeric:
2009 gfc_error ("Numeric operands are required in expression at %L", &e->where);
2010
2011 return FAILURE;
2012}
2013
2014
e1633d82
DF
2015static match
2016check_init_expr_arguments (gfc_expr *e)
2017{
2018 gfc_actual_arglist *ap;
6de9cd9a 2019
e1633d82
DF
2020 for (ap = e->value.function.actual; ap; ap = ap->next)
2021 if (check_init_expr (ap->expr) == FAILURE)
2022 return MATCH_ERROR;
6de9cd9a 2023
e1633d82
DF
2024 return MATCH_YES;
2025}
2026
ebb479cd
PT
2027static gfc_try check_restricted (gfc_expr *);
2028
e1633d82
DF
2029/* F95, 7.1.6.1, Initialization expressions, (7)
2030 F2003, 7.1.7 Initialization expression, (8) */
2031
2032static match
636dff67 2033check_inquiry (gfc_expr *e, int not_restricted)
6de9cd9a
DN
2034{
2035 const char *name;
e1633d82
DF
2036 const char *const *functions;
2037
2038 static const char *const inquiry_func_f95[] = {
2039 "lbound", "shape", "size", "ubound",
2040 "bit_size", "len", "kind",
2041 "digits", "epsilon", "huge", "maxexponent", "minexponent",
2042 "precision", "radix", "range", "tiny",
2043 NULL
2044 };
6de9cd9a 2045
e1633d82
DF
2046 static const char *const inquiry_func_f2003[] = {
2047 "lbound", "shape", "size", "ubound",
2048 "bit_size", "len", "kind",
2049 "digits", "epsilon", "huge", "maxexponent", "minexponent",
2050 "precision", "radix", "range", "tiny",
2051 "new_line", NULL
6de9cd9a
DN
2052 };
2053
2054 int i;
e1633d82
DF
2055 gfc_actual_arglist *ap;
2056
2057 if (!e->value.function.isym
2058 || !e->value.function.isym->inquiry)
2059 return MATCH_NO;
6de9cd9a 2060
e7f79e12
PT
2061 /* An undeclared parameter will get us here (PR25018). */
2062 if (e->symtree == NULL)
e1633d82 2063 return MATCH_NO;
e7f79e12 2064
6de9cd9a
DN
2065 name = e->symtree->n.sym->name;
2066
e1633d82
DF
2067 functions = (gfc_option.warn_std & GFC_STD_F2003)
2068 ? inquiry_func_f2003 : inquiry_func_f95;
6de9cd9a 2069
e1633d82
DF
2070 for (i = 0; functions[i]; i++)
2071 if (strcmp (functions[i], name) == 0)
2072 break;
6de9cd9a 2073
e1633d82 2074 if (functions[i] == NULL)
f5fd0cf1 2075 return MATCH_ERROR;
6de9cd9a 2076
c2b27658
EE
2077 /* At this point we have an inquiry function with a variable argument. The
2078 type of the variable might be undefined, but we need it now, because the
e1633d82 2079 arguments of these functions are not allowed to be undefined. */
6de9cd9a 2080
e1633d82 2081 for (ap = e->value.function.actual; ap; ap = ap->next)
6de9cd9a 2082 {
e1633d82
DF
2083 if (!ap->expr)
2084 continue;
2085
2086 if (ap->expr->ts.type == BT_UNKNOWN)
2087 {
2088 if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
2089 && gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns)
2090 == FAILURE)
2091 return MATCH_NO;
6de9cd9a 2092
e1633d82
DF
2093 ap->expr->ts = ap->expr->symtree->n.sym->ts;
2094 }
2095
2096 /* Assumed character length will not reduce to a constant expression
2097 with LEN, as required by the standard. */
2098 if (i == 5 && not_restricted
2099 && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
2100 && ap->expr->symtree->n.sym->ts.cl->length == NULL)
2101 {
c4d4556f 2102 gfc_error ("Assumed character length variable '%s' in constant "
5ab0eadf 2103 "expression at %L", e->symtree->n.sym->name, &e->where);
e1633d82
DF
2104 return MATCH_ERROR;
2105 }
2106 else if (not_restricted && check_init_expr (ap->expr) == FAILURE)
2107 return MATCH_ERROR;
ebb479cd
PT
2108
2109 if (not_restricted == 0
2110 && ap->expr->expr_type != EXPR_VARIABLE
2111 && check_restricted (ap->expr) == FAILURE)
2112 return MATCH_ERROR;
6de9cd9a
DN
2113 }
2114
e1633d82
DF
2115 return MATCH_YES;
2116}
2117
e7f79e12 2118
e1633d82
DF
2119/* F95, 7.1.6.1, Initialization expressions, (5)
2120 F2003, 7.1.7 Initialization expression, (5) */
2121
2122static match
2123check_transformational (gfc_expr *e)
2124{
2125 static const char * const trans_func_f95[] = {
2126 "repeat", "reshape", "selected_int_kind",
2127 "selected_real_kind", "transfer", "trim", NULL
2128 };
2129
8ec259c1
DF
2130 static const char * const trans_func_f2003[] = {
2131 "dot_product", "matmul", "null", "pack", "repeat",
2132 "reshape", "selected_char_kind", "selected_int_kind",
2133 "selected_real_kind", "transfer", "transpose", "trim", NULL
2134 };
2135
e1633d82
DF
2136 int i;
2137 const char *name;
8ec259c1 2138 const char *const *functions;
e1633d82
DF
2139
2140 if (!e->value.function.isym
2141 || !e->value.function.isym->transformational)
2142 return MATCH_NO;
2143
2144 name = e->symtree->n.sym->name;
2145
8ec259c1
DF
2146 functions = (gfc_option.allow_std & GFC_STD_F2003)
2147 ? trans_func_f2003 : trans_func_f95;
2148
e1633d82
DF
2149 /* NULL() is dealt with below. */
2150 if (strcmp ("null", name) == 0)
2151 return MATCH_NO;
2152
8ec259c1
DF
2153 for (i = 0; functions[i]; i++)
2154 if (strcmp (functions[i], name) == 0)
2155 break;
e1633d82 2156
8ec259c1 2157 if (functions[i] == NULL)
5ab0eadf
DF
2158 {
2159 gfc_error("transformational intrinsic '%s' at %L is not permitted "
2160 "in an initialization expression", name, &e->where);
2161 return MATCH_ERROR;
2162 }
e1633d82
DF
2163
2164 return check_init_expr_arguments (e);
2165}
2166
2167
2168/* F95, 7.1.6.1, Initialization expressions, (6)
2169 F2003, 7.1.7 Initialization expression, (6) */
2170
2171static match
2172check_null (gfc_expr *e)
2173{
2174 if (strcmp ("null", e->symtree->n.sym->name) != 0)
2175 return MATCH_NO;
2176
2177 return check_init_expr_arguments (e);
2178}
2179
2180
2181static match
2182check_elemental (gfc_expr *e)
2183{
2184 if (!e->value.function.isym
2185 || !e->value.function.isym->elemental)
2186 return MATCH_NO;
2187
c2916401
DF
2188 if (e->ts.type != BT_INTEGER
2189 && e->ts.type != BT_CHARACTER
e1633d82
DF
2190 && gfc_notify_std (GFC_STD_F2003, "Extension: Evaluation of "
2191 "nonstandard initialization expression at %L",
2192 &e->where) == FAILURE)
2193 return MATCH_ERROR;
2194
2195 return check_init_expr_arguments (e);
2196}
2197
2198
2199static match
2200check_conversion (gfc_expr *e)
2201{
2202 if (!e->value.function.isym
2203 || !e->value.function.isym->conversion)
2204 return MATCH_NO;
2205
2206 return check_init_expr_arguments (e);
6de9cd9a
DN
2207}
2208
2209
2210/* Verify that an expression is an initialization expression. A side
2211 effect is that the expression tree is reduced to a single constant
2212 node if all goes well. This would normally happen when the
2213 expression is constructed but function references are assumed to be
2214 intrinsics in the context of initialization expressions. If
2215 FAILURE is returned an error message has been generated. */
2216
17b1d2a0 2217static gfc_try
636dff67 2218check_init_expr (gfc_expr *e)
6de9cd9a 2219{
6de9cd9a 2220 match m;
17b1d2a0 2221 gfc_try t;
6de9cd9a
DN
2222
2223 if (e == NULL)
2224 return SUCCESS;
2225
2226 switch (e->expr_type)
2227 {
2228 case EXPR_OP:
2229 t = check_intrinsic_op (e, check_init_expr);
2230 if (t == SUCCESS)
2231 t = gfc_simplify_expr (e, 0);
2232
2233 break;
2234
2235 case EXPR_FUNCTION:
e1633d82 2236 t = FAILURE;
396b2c19 2237
e1633d82 2238 if ((m = check_specification_function (e)) != MATCH_YES)
6de9cd9a 2239 {
c3005b0f
DK
2240 gfc_intrinsic_sym* isym;
2241 gfc_symbol* sym;
2242
2243 sym = e->symtree->n.sym;
2244 if (!gfc_is_intrinsic (sym, 0, e->where)
2245 || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES)
e1633d82
DF
2246 {
2247 gfc_error ("Function '%s' in initialization expression at %L "
2248 "must be an intrinsic or a specification function",
2249 e->symtree->n.sym->name, &e->where);
2250 break;
2251 }
6de9cd9a 2252
e1633d82
DF
2253 if ((m = check_conversion (e)) == MATCH_NO
2254 && (m = check_inquiry (e, 1)) == MATCH_NO
2255 && (m = check_null (e)) == MATCH_NO
2256 && (m = check_transformational (e)) == MATCH_NO
2257 && (m = check_elemental (e)) == MATCH_NO)
2258 {
2259 gfc_error ("Intrinsic function '%s' at %L is not permitted "
2260 "in an initialization expression",
2261 e->symtree->n.sym->name, &e->where);
2262 m = MATCH_ERROR;
2263 }
6de9cd9a 2264
e1633d82
DF
2265 /* Try to scalarize an elemental intrinsic function that has an
2266 array argument. */
c3005b0f 2267 isym = gfc_find_function (e->symtree->n.sym->name);
e1633d82 2268 if (isym && isym->elemental
679d9637
PT
2269 && (t = scalarize_intrinsic_call (e)) == SUCCESS)
2270 break;
6de9cd9a
DN
2271 }
2272
e1633d82 2273 if (m == MATCH_YES)
fd8e2796 2274 t = gfc_simplify_expr (e, 0);
e1633d82 2275
6de9cd9a
DN
2276 break;
2277
2278 case EXPR_VARIABLE:
2279 t = SUCCESS;
2280
2281 if (gfc_check_iter_variable (e) == SUCCESS)
2282 break;
2283
2284 if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2285 {
106dbde4
DF
2286 /* A PARAMETER shall not be used to define itself, i.e.
2287 REAL, PARAMETER :: x = transfer(0, x)
2288 is invalid. */
2289 if (!e->symtree->n.sym->value)
2290 {
2291 gfc_error("PARAMETER '%s' is used at %L before its definition "
2292 "is complete", e->symtree->n.sym->name, &e->where);
2293 t = FAILURE;
2294 }
2295 else
2296 t = simplify_parameter_variable (e, 0);
2297
6de9cd9a
DN
2298 break;
2299 }
2300
2220652d
PT
2301 if (gfc_in_match_data ())
2302 break;
2303
6de9cd9a 2304 t = FAILURE;
e1633d82
DF
2305
2306 if (e->symtree->n.sym->as)
2307 {
2308 switch (e->symtree->n.sym->as->type)
2309 {
2310 case AS_ASSUMED_SIZE:
c4d4556f 2311 gfc_error ("Assumed size array '%s' at %L is not permitted "
e1633d82
DF
2312 "in an initialization expression",
2313 e->symtree->n.sym->name, &e->where);
5ab0eadf 2314 break;
e1633d82
DF
2315
2316 case AS_ASSUMED_SHAPE:
c4d4556f 2317 gfc_error ("Assumed shape array '%s' at %L is not permitted "
e1633d82
DF
2318 "in an initialization expression",
2319 e->symtree->n.sym->name, &e->where);
5ab0eadf 2320 break;
e1633d82
DF
2321
2322 case AS_DEFERRED:
c4d4556f 2323 gfc_error ("Deferred array '%s' at %L is not permitted "
e1633d82
DF
2324 "in an initialization expression",
2325 e->symtree->n.sym->name, &e->where);
5ab0eadf 2326 break;
e1633d82 2327
106dbde4
DF
2328 case AS_EXPLICIT:
2329 gfc_error ("Array '%s' at %L is a variable, which does "
2330 "not reduce to a constant expression",
2331 e->symtree->n.sym->name, &e->where);
2332 break;
2333
e1633d82
DF
2334 default:
2335 gcc_unreachable();
2336 }
2337 }
2338 else
2339 gfc_error ("Parameter '%s' at %L has not been declared or is "
2340 "a variable, which does not reduce to a constant "
2341 "expression", e->symtree->n.sym->name, &e->where);
2342
6de9cd9a
DN
2343 break;
2344
2345 case EXPR_CONSTANT:
2346 case EXPR_NULL:
2347 t = SUCCESS;
2348 break;
2349
2350 case EXPR_SUBSTRING:
eac33acc 2351 t = check_init_expr (e->ref->u.ss.start);
6de9cd9a
DN
2352 if (t == FAILURE)
2353 break;
2354
eac33acc 2355 t = check_init_expr (e->ref->u.ss.end);
6de9cd9a
DN
2356 if (t == SUCCESS)
2357 t = gfc_simplify_expr (e, 0);
2358
2359 break;
2360
2361 case EXPR_STRUCTURE:
36dcec91
CR
2362 if (e->ts.is_iso_c)
2363 t = SUCCESS;
2364 else
2365 t = gfc_check_constructor (e, check_init_expr);
6de9cd9a
DN
2366 break;
2367
2368 case EXPR_ARRAY:
2369 t = gfc_check_constructor (e, check_init_expr);
2370 if (t == FAILURE)
2371 break;
2372
2373 t = gfc_expand_constructor (e);
2374 if (t == FAILURE)
2375 break;
2376
2377 t = gfc_check_constructor_type (e);
2378 break;
2379
2380 default:
2381 gfc_internal_error ("check_init_expr(): Unknown expression type");
2382 }
2383
2384 return t;
2385}
2386
d3d0b9e0
MM
2387/* Reduces a general expression to an initialization expression (a constant).
2388 This used to be part of gfc_match_init_expr.
2389 Note that this function doesn't free the given expression on FAILURE. */
6de9cd9a 2390
d3d0b9e0
MM
2391gfc_try
2392gfc_reduce_init_expr (gfc_expr *expr)
6de9cd9a 2393{
17b1d2a0 2394 gfc_try t;
6de9cd9a 2395
6de9cd9a
DN
2396 gfc_init_expr = 1;
2397 t = gfc_resolve_expr (expr);
2398 if (t == SUCCESS)
2399 t = check_init_expr (expr);
2400 gfc_init_expr = 0;
2401
2402 if (t == FAILURE)
d3d0b9e0 2403 return FAILURE;
6de9cd9a
DN
2404
2405 if (expr->expr_type == EXPR_ARRAY
2406 && (gfc_check_constructor_type (expr) == FAILURE
d3d0b9e0
MM
2407 || gfc_expand_constructor (expr) == FAILURE))
2408 return FAILURE;
6de9cd9a 2409
e7f79e12
PT
2410 /* Not all inquiry functions are simplified to constant expressions
2411 so it is necessary to call check_inquiry again. */
e1633d82 2412 if (!gfc_is_constant_expr (expr) && check_inquiry (expr, 1) != MATCH_YES
636dff67 2413 && !gfc_in_match_data ())
e7f79e12
PT
2414 {
2415 gfc_error ("Initialization expression didn't reduce %C");
d3d0b9e0
MM
2416 return FAILURE;
2417 }
2418
2419 return SUCCESS;
2420}
2421
2422
2423/* Match an initialization expression. We work by first matching an
6bb62671
SK
2424 expression, then reducing it to a constant. The reducing it to
2425 constant part requires a global variable to flag the prohibition
2426 of a non-integer exponent in -std=f95 mode. */
2427
2428bool init_flag = false;
d3d0b9e0
MM
2429
2430match
2431gfc_match_init_expr (gfc_expr **result)
2432{
2433 gfc_expr *expr;
2434 match m;
2435 gfc_try t;
2436
2437 expr = NULL;
2438
6bb62671
SK
2439 init_flag = true;
2440
d3d0b9e0
MM
2441 m = gfc_match_expr (&expr);
2442 if (m != MATCH_YES)
6bb62671
SK
2443 {
2444 init_flag = false;
2445 return m;
2446 }
d3d0b9e0
MM
2447
2448 t = gfc_reduce_init_expr (expr);
2449 if (t != SUCCESS)
2450 {
2451 gfc_free_expr (expr);
6bb62671 2452 init_flag = false;
e7f79e12
PT
2453 return MATCH_ERROR;
2454 }
6de9cd9a
DN
2455
2456 *result = expr;
6bb62671 2457 init_flag = false;
6de9cd9a
DN
2458
2459 return MATCH_YES;
2460}
2461
2462
6de9cd9a
DN
2463/* Given an actual argument list, test to see that each argument is a
2464 restricted expression and optionally if the expression type is
2465 integer or character. */
2466
17b1d2a0 2467static gfc_try
636dff67 2468restricted_args (gfc_actual_arglist *a)
6de9cd9a 2469{
6de9cd9a
DN
2470 for (; a; a = a->next)
2471 {
2472 if (check_restricted (a->expr) == FAILURE)
2473 return FAILURE;
6de9cd9a
DN
2474 }
2475
2476 return SUCCESS;
2477}
2478
2479
2480/************* Restricted/specification expressions *************/
2481
2482
2483/* Make sure a non-intrinsic function is a specification function. */
2484
17b1d2a0 2485static gfc_try
636dff67 2486external_spec_function (gfc_expr *e)
6de9cd9a
DN
2487{
2488 gfc_symbol *f;
2489
2490 f = e->value.function.esym;
2491
2492 if (f->attr.proc == PROC_ST_FUNCTION)
2493 {
2494 gfc_error ("Specification function '%s' at %L cannot be a statement "
2495 "function", f->name, &e->where);
2496 return FAILURE;
2497 }
2498
2499 if (f->attr.proc == PROC_INTERNAL)
2500 {
2501 gfc_error ("Specification function '%s' at %L cannot be an internal "
2502 "function", f->name, &e->where);
2503 return FAILURE;
2504 }
2505
98cb5a54 2506 if (!f->attr.pure && !f->attr.elemental)
6de9cd9a
DN
2507 {
2508 gfc_error ("Specification function '%s' at %L must be PURE", f->name,
2509 &e->where);
2510 return FAILURE;
2511 }
2512
2513 if (f->attr.recursive)
2514 {
2515 gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
2516 f->name, &e->where);
2517 return FAILURE;
2518 }
2519
40e929f3 2520 return restricted_args (e->value.function.actual);
6de9cd9a
DN
2521}
2522
2523
2524/* Check to see that a function reference to an intrinsic is a
40e929f3 2525 restricted expression. */
6de9cd9a 2526
17b1d2a0 2527static gfc_try
636dff67 2528restricted_intrinsic (gfc_expr *e)
6de9cd9a 2529{
40e929f3 2530 /* TODO: Check constraints on inquiry functions. 7.1.6.2 (7). */
e1633d82 2531 if (check_inquiry (e, 0) == MATCH_YES)
40e929f3 2532 return SUCCESS;
6de9cd9a 2533
40e929f3 2534 return restricted_args (e->value.function.actual);
6de9cd9a
DN
2535}
2536
2537
a3d3c0f5
DK
2538/* Check the expressions of an actual arglist. Used by check_restricted. */
2539
2540static gfc_try
2541check_arglist (gfc_actual_arglist* arg, gfc_try (*checker) (gfc_expr*))
2542{
2543 for (; arg; arg = arg->next)
2544 if (checker (arg->expr) == FAILURE)
2545 return FAILURE;
2546
2547 return SUCCESS;
2548}
2549
2550
2551/* Check the subscription expressions of a reference chain with a checking
2552 function; used by check_restricted. */
2553
2554static gfc_try
2555check_references (gfc_ref* ref, gfc_try (*checker) (gfc_expr*))
2556{
2557 int dim;
2558
2559 if (!ref)
2560 return SUCCESS;
2561
2562 switch (ref->type)
2563 {
2564 case REF_ARRAY:
2565 for (dim = 0; dim != ref->u.ar.dimen; ++dim)
2566 {
2567 if (checker (ref->u.ar.start[dim]) == FAILURE)
2568 return FAILURE;
2569 if (checker (ref->u.ar.end[dim]) == FAILURE)
2570 return FAILURE;
2571 if (checker (ref->u.ar.stride[dim]) == FAILURE)
2572 return FAILURE;
2573 }
2574 break;
2575
2576 case REF_COMPONENT:
2577 /* Nothing needed, just proceed to next reference. */
2578 break;
2579
2580 case REF_SUBSTRING:
2581 if (checker (ref->u.ss.start) == FAILURE)
2582 return FAILURE;
2583 if (checker (ref->u.ss.end) == FAILURE)
2584 return FAILURE;
2585 break;
2586
2587 default:
2588 gcc_unreachable ();
2589 break;
2590 }
2591
2592 return check_references (ref->next, checker);
2593}
2594
2595
6de9cd9a
DN
2596/* Verify that an expression is a restricted expression. Like its
2597 cousin check_init_expr(), an error message is generated if we
2598 return FAILURE. */
2599
17b1d2a0 2600static gfc_try
636dff67 2601check_restricted (gfc_expr *e)
6de9cd9a 2602{
a3d3c0f5 2603 gfc_symbol* sym;
17b1d2a0 2604 gfc_try t;
6de9cd9a
DN
2605
2606 if (e == NULL)
2607 return SUCCESS;
2608
2609 switch (e->expr_type)
2610 {
2611 case EXPR_OP:
2612 t = check_intrinsic_op (e, check_restricted);
2613 if (t == SUCCESS)
2614 t = gfc_simplify_expr (e, 0);
2615
2616 break;
2617
2618 case EXPR_FUNCTION:
a3d3c0f5
DK
2619 if (e->value.function.esym)
2620 {
2621 t = check_arglist (e->value.function.actual, &check_restricted);
2622 if (t == SUCCESS)
2623 t = external_spec_function (e);
2624 }
2625 else
2626 {
2627 if (e->value.function.isym && e->value.function.isym->inquiry)
2628 t = SUCCESS;
2629 else
2630 t = check_arglist (e->value.function.actual, &check_restricted);
2631
2632 if (t == SUCCESS)
2633 t = restricted_intrinsic (e);
2634 }
6de9cd9a
DN
2635 break;
2636
2637 case EXPR_VARIABLE:
2638 sym = e->symtree->n.sym;
2639 t = FAILURE;
2640
c4d4556f
TS
2641 /* If a dummy argument appears in a context that is valid for a
2642 restricted expression in an elemental procedure, it will have
2643 already been simplified away once we get here. Therefore we
2644 don't need to jump through hoops to distinguish valid from
2645 invalid cases. */
2646 if (sym->attr.dummy && sym->ns == gfc_current_ns
2647 && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
2648 {
2649 gfc_error ("Dummy argument '%s' not allowed in expression at %L",
2650 sym->name, &e->where);
2651 break;
2652 }
2653
6de9cd9a
DN
2654 if (sym->attr.optional)
2655 {
2656 gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2657 sym->name, &e->where);
2658 break;
2659 }
2660
2661 if (sym->attr.intent == INTENT_OUT)
2662 {
2663 gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2664 sym->name, &e->where);
2665 break;
2666 }
2667
a3d3c0f5
DK
2668 /* Check reference chain if any. */
2669 if (check_references (e->ref, &check_restricted) == FAILURE)
2670 break;
2671
636dff67
SK
2672 /* gfc_is_formal_arg broadcasts that a formal argument list is being
2673 processed in resolve.c(resolve_formal_arglist). This is done so
2674 that host associated dummy array indices are accepted (PR23446).
2675 This mechanism also does the same for the specification expressions
2676 of array-valued functions. */
ebb479cd
PT
2677 if (e->error
2678 || sym->attr.in_common
2679 || sym->attr.use_assoc
2680 || sym->attr.dummy
2681 || sym->attr.implied_index
a3d3c0f5 2682 || sym->attr.flavor == FL_PARAMETER
ebb479cd
PT
2683 || (sym->ns && sym->ns == gfc_current_ns->parent)
2684 || (sym->ns && gfc_current_ns->parent
2685 && sym->ns == gfc_current_ns->parent->parent)
2686 || (sym->ns->proc_name != NULL
2687 && sym->ns->proc_name->attr.flavor == FL_MODULE)
2688 || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
6de9cd9a
DN
2689 {
2690 t = SUCCESS;
2691 break;
2692 }
2693
2694 gfc_error ("Variable '%s' cannot appear in the expression at %L",
2695 sym->name, &e->where);
ebb479cd
PT
2696 /* Prevent a repetition of the error. */
2697 e->error = 1;
6de9cd9a
DN
2698 break;
2699
2700 case EXPR_NULL:
2701 case EXPR_CONSTANT:
2702 t = SUCCESS;
2703 break;
2704
2705 case EXPR_SUBSTRING:
eac33acc 2706 t = gfc_specification_expr (e->ref->u.ss.start);
6de9cd9a
DN
2707 if (t == FAILURE)
2708 break;
2709
eac33acc 2710 t = gfc_specification_expr (e->ref->u.ss.end);
6de9cd9a
DN
2711 if (t == SUCCESS)
2712 t = gfc_simplify_expr (e, 0);
2713
2714 break;
2715
2716 case EXPR_STRUCTURE:
2717 t = gfc_check_constructor (e, check_restricted);
2718 break;
2719
2720 case EXPR_ARRAY:
2721 t = gfc_check_constructor (e, check_restricted);
2722 break;
2723
2724 default:
2725 gfc_internal_error ("check_restricted(): Unknown expression type");
2726 }
2727
2728 return t;
2729}
2730
2731
2732/* Check to see that an expression is a specification expression. If
2733 we return FAILURE, an error has been generated. */
2734
17b1d2a0 2735gfc_try
636dff67 2736gfc_specification_expr (gfc_expr *e)
6de9cd9a 2737{
66e4ab31 2738
110eec24
TS
2739 if (e == NULL)
2740 return SUCCESS;
6de9cd9a
DN
2741
2742 if (e->ts.type != BT_INTEGER)
2743 {
acb388a0
JD
2744 gfc_error ("Expression at %L must be of INTEGER type, found %s",
2745 &e->where, gfc_basic_typename (e->ts.type));
6de9cd9a
DN
2746 return FAILURE;
2747 }
2748
98a36c7c
PT
2749 if (e->expr_type == EXPR_FUNCTION
2750 && !e->value.function.isym
2751 && !e->value.function.esym
2752 && !gfc_pure (e->symtree->n.sym))
2753 {
2754 gfc_error ("Function '%s' at %L must be PURE",
2755 e->symtree->n.sym->name, &e->where);
2756 /* Prevent repeat error messages. */
2757 e->symtree->n.sym->attr.pure = 1;
2758 return FAILURE;
2759 }
2760
6de9cd9a
DN
2761 if (e->rank != 0)
2762 {
2763 gfc_error ("Expression at %L must be scalar", &e->where);
2764 return FAILURE;
2765 }
2766
2767 if (gfc_simplify_expr (e, 0) == FAILURE)
2768 return FAILURE;
2769
2770 return check_restricted (e);
2771}
2772
2773
2774/************** Expression conformance checks. *************/
2775
2776/* Given two expressions, make sure that the arrays are conformable. */
2777
17b1d2a0 2778gfc_try
636dff67 2779gfc_check_conformance (const char *optype_msgid, gfc_expr *op1, gfc_expr *op2)
6de9cd9a
DN
2780{
2781 int op1_flag, op2_flag, d;
2782 mpz_t op1_size, op2_size;
17b1d2a0 2783 gfc_try t;
6de9cd9a
DN
2784
2785 if (op1->rank == 0 || op2->rank == 0)
2786 return SUCCESS;
2787
2788 if (op1->rank != op2->rank)
2789 {
3c7b91d3
TB
2790 gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(optype_msgid),
2791 op1->rank, op2->rank, &op1->where);
6de9cd9a
DN
2792 return FAILURE;
2793 }
2794
2795 t = SUCCESS;
2796
2797 for (d = 0; d < op1->rank; d++)
2798 {
2799 op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2800 op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2801
2802 if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2803 {
7e49f965
TS
2804 gfc_error ("Different shape for %s at %L on dimension %d "
2805 "(%d and %d)", _(optype_msgid), &op1->where, d + 1,
31043f6c 2806 (int) mpz_get_si (op1_size),
6de9cd9a
DN
2807 (int) mpz_get_si (op2_size));
2808
2809 t = FAILURE;
2810 }
2811
2812 if (op1_flag)
2813 mpz_clear (op1_size);
2814 if (op2_flag)
2815 mpz_clear (op2_size);
2816
2817 if (t == FAILURE)
2818 return FAILURE;
2819 }
2820
2821 return SUCCESS;
2822}
2823
2824
2825/* Given an assignable expression and an arbitrary expression, make
2826 sure that the assignment can take place. */
2827
17b1d2a0 2828gfc_try
636dff67 2829gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
6de9cd9a
DN
2830{
2831 gfc_symbol *sym;
f17facac
TB
2832 gfc_ref *ref;
2833 int has_pointer;
6de9cd9a
DN
2834
2835 sym = lvalue->symtree->n.sym;
2836
f17facac
TB
2837 /* Check INTENT(IN), unless the object itself is the component or
2838 sub-component of a pointer. */
2839 has_pointer = sym->attr.pointer;
2840
2841 for (ref = lvalue->ref; ref; ref = ref->next)
d4b7d0f0 2842 if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
f17facac
TB
2843 {
2844 has_pointer = 1;
2845 break;
2846 }
2847
2848 if (!has_pointer && sym->attr.intent == INTENT_IN)
6de9cd9a 2849 {
f17facac 2850 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
6de9cd9a
DN
2851 sym->name, &lvalue->where);
2852 return FAILURE;
2853 }
2854
66e4ab31
SK
2855 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2856 variable local to a function subprogram. Its existence begins when
2857 execution of the function is initiated and ends when execution of the
2858 function is terminated...
2859 Therefore, the left hand side is no longer a variable, when it is: */
636dff67
SK
2860 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
2861 && !sym->attr.external)
2990f854 2862 {
f5f701ad
PT
2863 bool bad_proc;
2864 bad_proc = false;
2865
66e4ab31 2866 /* (i) Use associated; */
f5f701ad
PT
2867 if (sym->attr.use_assoc)
2868 bad_proc = true;
2869
e2ae1407 2870 /* (ii) The assignment is in the main program; or */
f5f701ad
PT
2871 if (gfc_current_ns->proc_name->attr.is_main_program)
2872 bad_proc = true;
2873
66e4ab31 2874 /* (iii) A module or internal procedure... */
f5f701ad 2875 if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
636dff67 2876 || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
f5f701ad
PT
2877 && gfc_current_ns->parent
2878 && (!(gfc_current_ns->parent->proc_name->attr.function
636dff67 2879 || gfc_current_ns->parent->proc_name->attr.subroutine)
f5f701ad
PT
2880 || gfc_current_ns->parent->proc_name->attr.is_main_program))
2881 {
66e4ab31 2882 /* ... that is not a function... */
f5f701ad
PT
2883 if (!gfc_current_ns->proc_name->attr.function)
2884 bad_proc = true;
2885
66e4ab31 2886 /* ... or is not an entry and has a different name. */
f5f701ad
PT
2887 if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2888 bad_proc = true;
2889 }
2990f854 2890
db39d0c2
PT
2891 /* (iv) Host associated and not the function symbol or the
2892 parent result. This picks up sibling references, which
2893 cannot be entries. */
2894 if (!sym->attr.entry
2895 && sym->ns == gfc_current_ns->parent
2896 && sym != gfc_current_ns->proc_name
2897 && sym != gfc_current_ns->parent->proc_name->result)
2898 bad_proc = true;
2899
f5f701ad
PT
2900 if (bad_proc)
2901 {
2902 gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2903 return FAILURE;
2904 }
2905 }
2990f854 2906
6de9cd9a
DN
2907 if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2908 {
7dea5a95
TS
2909 gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2910 lvalue->rank, rvalue->rank, &lvalue->where);
6de9cd9a
DN
2911 return FAILURE;
2912 }
2913
2914 if (lvalue->ts.type == BT_UNKNOWN)
2915 {
2916 gfc_error ("Variable type is UNKNOWN in assignment at %L",
2917 &lvalue->where);
2918 return FAILURE;
2919 }
2920
37775e79
JD
2921 if (rvalue->expr_type == EXPR_NULL)
2922 {
e49be8f7 2923 if (has_pointer && (ref == NULL || ref->next == NULL)
37775e79
JD
2924 && lvalue->symtree->n.sym->attr.data)
2925 return SUCCESS;
2926 else
2927 {
2928 gfc_error ("NULL appears on right-hand side in assignment at %L",
2929 &rvalue->where);
2930 return FAILURE;
2931 }
2932 }
7dea5a95 2933
83d890b9
AL
2934 if (sym->attr.cray_pointee
2935 && lvalue->ref != NULL
f0d0757e 2936 && lvalue->ref->u.ar.type == AR_FULL
83d890b9
AL
2937 && lvalue->ref->u.ar.as->cp_was_assumed)
2938 {
636dff67
SK
2939 gfc_error ("Vector assignment to assumed-size Cray Pointee at %L "
2940 "is illegal", &lvalue->where);
83d890b9
AL
2941 return FAILURE;
2942 }
2943
66e4ab31 2944 /* This is possibly a typo: x = f() instead of x => f(). */
6d1c50cc
TS
2945 if (gfc_option.warn_surprising
2946 && rvalue->expr_type == EXPR_FUNCTION
2947 && rvalue->symtree->n.sym->attr.pointer)
2948 gfc_warning ("POINTER valued function appears on right-hand side of "
2949 "assignment at %L", &rvalue->where);
2950
6de9cd9a
DN
2951 /* Check size of array assignments. */
2952 if (lvalue->rank != 0 && rvalue->rank != 0
7e49f965 2953 && gfc_check_conformance ("array assignment", lvalue, rvalue) != SUCCESS)
6de9cd9a
DN
2954 return FAILURE;
2955
00a4618b
TB
2956 if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
2957 && lvalue->symtree->n.sym->attr.data
2958 && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L used to "
2959 "initialize non-integer variable '%s'",
2960 &rvalue->where, lvalue->symtree->n.sym->name)
2961 == FAILURE)
2962 return FAILURE;
2963 else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
2964 && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L outside "
2965 "a DATA statement and outside INT/REAL/DBLE/CMPLX",
2966 &rvalue->where) == FAILURE)
2967 return FAILURE;
2968
2969 /* Handle the case of a BOZ literal on the RHS. */
2970 if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
2971 {
4956b1f1 2972 int rc;
00a4618b
TB
2973 if (gfc_option.warn_surprising)
2974 gfc_warning ("BOZ literal at %L is bitwise transferred "
2975 "non-integer symbol '%s'", &rvalue->where,
2976 lvalue->symtree->n.sym->name);
c7abc45c
TB
2977 if (!gfc_convert_boz (rvalue, &lvalue->ts))
2978 return FAILURE;
4956b1f1
TB
2979 if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
2980 {
2981 if (rc == ARITH_UNDERFLOW)
2982 gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
2983 ". This check can be disabled with the option "
2984 "-fno-range-check", &rvalue->where);
2985 else if (rc == ARITH_OVERFLOW)
2986 gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
2987 ". This check can be disabled with the option "
2988 "-fno-range-check", &rvalue->where);
2989 else if (rc == ARITH_NAN)
2990 gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
2991 ". This check can be disabled with the option "
2992 "-fno-range-check", &rvalue->where);
2993 return FAILURE;
2994 }
00a4618b
TB
2995 }
2996
6de9cd9a
DN
2997 if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2998 return SUCCESS;
2999
c4e3543d 3000 /* Only DATA Statements come here. */
6de9cd9a
DN
3001 if (!conform)
3002 {
d3642f89
FW
3003 /* Numeric can be converted to any other numeric. And Hollerith can be
3004 converted to any other type. */
3005 if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
3006 || rvalue->ts.type == BT_HOLLERITH)
6de9cd9a
DN
3007 return SUCCESS;
3008
f240b896
SK
3009 if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
3010 return SUCCESS;
3011
c4e3543d
PT
3012 gfc_error ("Incompatible types in DATA statement at %L; attempted "
3013 "conversion of %s to %s", &lvalue->where,
3014 gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
6de9cd9a
DN
3015
3016 return FAILURE;
3017 }
3018
d393bbd7
FXC
3019 /* Assignment is the only case where character variables of different
3020 kind values can be converted into one another. */
3021 if (lvalue->ts.type == BT_CHARACTER && rvalue->ts.type == BT_CHARACTER)
3022 {
3023 if (lvalue->ts.kind != rvalue->ts.kind)
3024 gfc_convert_chartype (rvalue, &lvalue->ts);
3025
3026 return SUCCESS;
3027 }
3028
6de9cd9a
DN
3029 return gfc_convert_type (rvalue, &lvalue->ts, 1);
3030}
3031
3032
3033/* Check that a pointer assignment is OK. We first check lvalue, and
3034 we only check rvalue if it's not an assignment to NULL() or a
3035 NULLIFY statement. */
3036
17b1d2a0 3037gfc_try
636dff67 3038gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
6de9cd9a
DN
3039{
3040 symbol_attribute attr;
f17facac 3041 gfc_ref *ref;
6de9cd9a 3042 int is_pure;
713485cc 3043 int pointer, check_intent_in, proc_pointer;
6de9cd9a 3044
8fb74da4
JW
3045 if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN
3046 && !lvalue->symtree->n.sym->attr.proc_pointer)
6de9cd9a
DN
3047 {
3048 gfc_error ("Pointer assignment target is not a POINTER at %L",
3049 &lvalue->where);
3050 return FAILURE;
3051 }
3052
2990f854 3053 if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
6e0d2de7
JW
3054 && lvalue->symtree->n.sym->attr.use_assoc
3055 && !lvalue->symtree->n.sym->attr.proc_pointer)
2990f854
PT
3056 {
3057 gfc_error ("'%s' in the pointer assignment at %L cannot be an "
3058 "l-value since it is a procedure",
3059 lvalue->symtree->n.sym->name, &lvalue->where);
3060 return FAILURE;
3061 }
3062
f17facac
TB
3063
3064 /* Check INTENT(IN), unless the object itself is the component or
3065 sub-component of a pointer. */
3066 check_intent_in = 1;
713485cc
JW
3067 pointer = lvalue->symtree->n.sym->attr.pointer;
3068 proc_pointer = lvalue->symtree->n.sym->attr.proc_pointer;
f17facac
TB
3069
3070 for (ref = lvalue->ref; ref; ref = ref->next)
3071 {
3072 if (pointer)
636dff67 3073 check_intent_in = 0;
f17facac 3074
6596e2fe 3075 if (ref->type == REF_COMPONENT)
713485cc
JW
3076 {
3077 pointer = ref->u.c.component->attr.pointer;
3078 proc_pointer = ref->u.c.component->attr.proc_pointer;
3079 }
54799fcd
TB
3080
3081 if (ref->type == REF_ARRAY && ref->next == NULL)
3082 {
3083 if (ref->u.ar.type == AR_FULL)
3084 break;
3085
3086 if (ref->u.ar.type != AR_SECTION)
3087 {
3088 gfc_error ("Expected bounds specification for '%s' at %L",
3089 lvalue->symtree->n.sym->name, &lvalue->where);
3090 return FAILURE;
3091 }
3092
3093 if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Bounds "
3094 "specification for '%s' in pointer assignment "
3095 "at %L", lvalue->symtree->n.sym->name,
3096 &lvalue->where) == FAILURE)
3097 return FAILURE;
3098
3099 gfc_error ("Pointer bounds remapping at %L is not yet implemented "
3100 "in gfortran", &lvalue->where);
3101 /* TODO: See PR 29785. Add checks that all lbounds are specified and
3102 either never or always the upper-bound; strides shall not be
3103 present. */
3104 return FAILURE;
3105 }
f17facac
TB
3106 }
3107
3108 if (check_intent_in && lvalue->symtree->n.sym->attr.intent == INTENT_IN)
3109 {
3110 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
636dff67 3111 lvalue->symtree->n.sym->name, &lvalue->where);
f17facac
TB
3112 return FAILURE;
3113 }
3114
713485cc 3115 if (!pointer && !proc_pointer)
6de9cd9a
DN
3116 {
3117 gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
3118 return FAILURE;
3119 }
3120
3121 is_pure = gfc_pure (NULL);
3122
a595913e
PT
3123 if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym)
3124 && lvalue->symtree->n.sym->value != rvalue)
6de9cd9a 3125 {
636dff67 3126 gfc_error ("Bad pointer object in PURE procedure at %L", &lvalue->where);
6de9cd9a
DN
3127 return FAILURE;
3128 }
3129
3130 /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
3131 kind, etc for lvalue and rvalue must match, and rvalue must be a
3132 pure variable if we're in a pure function. */
def66134 3133 if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
7d76d73a
TS
3134 return SUCCESS;
3135
726d8566 3136 /* Checks on rvalue for procedure pointer assignments. */
713485cc 3137 if (proc_pointer)
726d8566
JW
3138 {
3139 attr = gfc_expr_attr (rvalue);
3140 if (!((rvalue->expr_type == EXPR_NULL)
3141 || (rvalue->expr_type == EXPR_FUNCTION && attr.proc_pointer)
713485cc 3142 || (rvalue->expr_type == EXPR_VARIABLE && attr.proc_pointer)
726d8566
JW
3143 || (rvalue->expr_type == EXPR_VARIABLE
3144 && attr.flavor == FL_PROCEDURE)))
3145 {
3146 gfc_error ("Invalid procedure pointer assignment at %L",
3147 &rvalue->where);
3148 return FAILURE;
3149 }
fb7ca5a7
JW
3150 if (attr.abstract)
3151 {
3152 gfc_error ("Abstract interface '%s' is invalid "
3153 "in procedure pointer assignment at %L",
3154 rvalue->symtree->name, &rvalue->where);
c73b6478 3155 return FAILURE;
fb7ca5a7 3156 }
210aee68
JW
3157 /* Check for C727. */
3158 if (attr.flavor == FL_PROCEDURE)
3159 {
3160 if (attr.proc == PROC_ST_FUNCTION)
3161 {
3162 gfc_error ("Statement function '%s' is invalid "
3163 "in procedure pointer assignment at %L",
3164 rvalue->symtree->name, &rvalue->where);
3165 return FAILURE;
3166 }
3167 if (attr.proc == PROC_INTERNAL &&
3168 gfc_notify_std (GFC_STD_F2008, "Internal procedure '%s' is "
3169 "invalid in procedure pointer assignment at %L",
3170 rvalue->symtree->name, &rvalue->where) == FAILURE)
3171 return FAILURE;
3172 }
713485cc
JW
3173 /* TODO: Enable interface check for PPCs. */
3174 if (is_proc_ptr_comp (rvalue, NULL))
3175 return SUCCESS;
726d8566 3176 if (rvalue->expr_type == EXPR_VARIABLE
726d8566 3177 && !gfc_compare_interfaces (lvalue->symtree->n.sym,
23e38561 3178 rvalue->symtree->n.sym, 0, 1))
726d8566
JW
3179 {
3180 gfc_error ("Interfaces don't match "
3181 "in procedure pointer assignment at %L", &rvalue->where);
3182 return FAILURE;
3afadac3 3183 }
726d8566
JW
3184 return SUCCESS;
3185 }
8fb74da4 3186
7d76d73a 3187 if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
6de9cd9a 3188 {
606c2c03
DF
3189 gfc_error ("Different types in pointer assignment at %L; attempted "
3190 "assignment of %s to %s", &lvalue->where,
3191 gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
7d76d73a
TS
3192 return FAILURE;
3193 }
6de9cd9a 3194
7d76d73a
TS
3195 if (lvalue->ts.kind != rvalue->ts.kind)
3196 {
31043f6c 3197 gfc_error ("Different kind type parameters in pointer "
7d76d73a
TS
3198 "assignment at %L", &lvalue->where);
3199 return FAILURE;
3200 }
6de9cd9a 3201
def66134
SK
3202 if (lvalue->rank != rvalue->rank)
3203 {
3204 gfc_error ("Different ranks in pointer assignment at %L",
636dff67 3205 &lvalue->where);
def66134
SK
3206 return FAILURE;
3207 }
3208
3209 /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X). */
3210 if (rvalue->expr_type == EXPR_NULL)
3211 return SUCCESS;
3212
fb5bc08b 3213 if (lvalue->ts.type == BT_CHARACTER)
2990f854 3214 {
fb5bc08b
DK
3215 gfc_try t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment");
3216 if (t == FAILURE)
3217 return FAILURE;
2990f854
PT
3218 }
3219
1d6b7f39
PT
3220 if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
3221 lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
3222
7d76d73a
TS
3223 attr = gfc_expr_attr (rvalue);
3224 if (!attr.target && !attr.pointer)
3225 {
31043f6c 3226 gfc_error ("Pointer assignment target is neither TARGET "
7d76d73a
TS
3227 "nor POINTER at %L", &rvalue->where);
3228 return FAILURE;
3229 }
6de9cd9a 3230
7d76d73a
TS
3231 if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3232 {
31043f6c 3233 gfc_error ("Bad target in pointer assignment in PURE "
7d76d73a
TS
3234 "procedure at %L", &rvalue->where);
3235 }
6de9cd9a 3236
4075a94e
PT
3237 if (gfc_has_vector_index (rvalue))
3238 {
3239 gfc_error ("Pointer assignment with vector subscript "
3240 "on rhs at %L", &rvalue->where);
3241 return FAILURE;
3242 }
3243
3dcc3ef2
TB
3244 if (attr.is_protected && attr.use_assoc
3245 && !(attr.pointer || attr.proc_pointer))
ee7e677f 3246 {
df2fba9e 3247 gfc_error ("Pointer assignment target has PROTECTED "
636dff67 3248 "attribute at %L", &rvalue->where);
ee7e677f
TB
3249 return FAILURE;
3250 }
3251
6de9cd9a
DN
3252 return SUCCESS;
3253}
3254
3255
3256/* Relative of gfc_check_assign() except that the lvalue is a single
597073ac 3257 symbol. Used for initialization assignments. */
6de9cd9a 3258
17b1d2a0 3259gfc_try
636dff67 3260gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
6de9cd9a
DN
3261{
3262 gfc_expr lvalue;
17b1d2a0 3263 gfc_try r;
6de9cd9a
DN
3264
3265 memset (&lvalue, '\0', sizeof (gfc_expr));
3266
3267 lvalue.expr_type = EXPR_VARIABLE;
3268 lvalue.ts = sym->ts;
3269 if (sym->as)
3270 lvalue.rank = sym->as->rank;
636dff67 3271 lvalue.symtree = (gfc_symtree *) gfc_getmem (sizeof (gfc_symtree));
6de9cd9a
DN
3272 lvalue.symtree->n.sym = sym;
3273 lvalue.where = sym->declared_at;
3274
8fb74da4 3275 if (sym->attr.pointer || sym->attr.proc_pointer)
597073ac
PB
3276 r = gfc_check_pointer_assign (&lvalue, rvalue);
3277 else
3278 r = gfc_check_assign (&lvalue, rvalue, 1);
6de9cd9a
DN
3279
3280 gfc_free (lvalue.symtree);
3281
3282 return r;
3283}
54b4ba60
PB
3284
3285
3286/* Get an expression for a default initializer. */
3287
3288gfc_expr *
3289gfc_default_initializer (gfc_typespec *ts)
3290{
3291 gfc_constructor *tail;
3292 gfc_expr *init;
3293 gfc_component *c;
3294
54b4ba60
PB
3295 /* See if we have a default initializer. */
3296 for (c = ts->derived->components; c; c = c->next)
d4b7d0f0 3297 if (c->initializer || c->attr.allocatable)
7e49f965 3298 break;
54b4ba60 3299
7e49f965 3300 if (!c)
54b4ba60
PB
3301 return NULL;
3302
3303 /* Build the constructor. */
7e49f965 3304 init = gfc_get_expr ();
54b4ba60
PB
3305 init->expr_type = EXPR_STRUCTURE;
3306 init->ts = *ts;
3307 init->where = ts->derived->declared_at;
7e49f965 3308
54b4ba60
PB
3309 tail = NULL;
3310 for (c = ts->derived->components; c; c = c->next)
3311 {
3312 if (tail == NULL)
636dff67 3313 init->value.constructor = tail = gfc_get_constructor ();
54b4ba60 3314 else
636dff67
SK
3315 {
3316 tail->next = gfc_get_constructor ();
3317 tail = tail->next;
3318 }
54b4ba60
PB
3319
3320 if (c->initializer)
636dff67 3321 tail->expr = gfc_copy_expr (c->initializer);
5046aff5 3322
d4b7d0f0 3323 if (c->attr.allocatable)
5046aff5
PT
3324 {
3325 tail->expr = gfc_get_expr ();
3326 tail->expr->expr_type = EXPR_NULL;
3327 tail->expr->ts = c->ts;
3328 }
54b4ba60
PB
3329 }
3330 return init;
3331}
294fbfc8
TS
3332
3333
3334/* Given a symbol, create an expression node with that symbol as a
3335 variable. If the symbol is array valued, setup a reference of the
3336 whole array. */
3337
3338gfc_expr *
636dff67 3339gfc_get_variable_expr (gfc_symtree *var)
294fbfc8
TS
3340{
3341 gfc_expr *e;
3342
3343 e = gfc_get_expr ();
3344 e->expr_type = EXPR_VARIABLE;
3345 e->symtree = var;
3346 e->ts = var->n.sym->ts;
3347
3348 if (var->n.sym->as != NULL)
3349 {
3350 e->rank = var->n.sym->as->rank;
3351 e->ref = gfc_get_ref ();
3352 e->ref->type = REF_ARRAY;
3353 e->ref->u.ar.type = AR_FULL;
3354 }
3355
3356 return e;
3357}
3358
47992a4a 3359
640670c7 3360/* General expression traversal function. */
47992a4a 3361
640670c7
PT
3362bool
3363gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
3364 bool (*func)(gfc_expr *, gfc_symbol *, int*),
3365 int f)
47992a4a 3366{
640670c7 3367 gfc_array_ref ar;
47992a4a 3368 gfc_ref *ref;
640670c7
PT
3369 gfc_actual_arglist *args;
3370 gfc_constructor *c;
47992a4a
EE
3371 int i;
3372
640670c7
PT
3373 if (!expr)
3374 return false;
47992a4a 3375
908a2235
PT
3376 if ((*func) (expr, sym, &f))
3377 return true;
47992a4a 3378
908a2235
PT
3379 if (expr->ts.type == BT_CHARACTER
3380 && expr->ts.cl
3381 && expr->ts.cl->length
3382 && expr->ts.cl->length->expr_type != EXPR_CONSTANT
3383 && gfc_traverse_expr (expr->ts.cl->length, sym, func, f))
3384 return true;
47992a4a 3385
908a2235
PT
3386 switch (expr->expr_type)
3387 {
640670c7
PT
3388 case EXPR_FUNCTION:
3389 for (args = expr->value.function.actual; args; args = args->next)
3390 {
3391 if (gfc_traverse_expr (args->expr, sym, func, f))
3392 return true;
3393 }
47992a4a
EE
3394 break;
3395
908a2235 3396 case EXPR_VARIABLE:
47992a4a
EE
3397 case EXPR_CONSTANT:
3398 case EXPR_NULL:
3399 case EXPR_SUBSTRING:
3400 break;
3401
3402 case EXPR_STRUCTURE:
3403 case EXPR_ARRAY:
3404 for (c = expr->value.constructor; c; c = c->next)
908a2235
PT
3405 {
3406 if (gfc_traverse_expr (c->expr, sym, func, f))
3407 return true;
3408 if (c->iterator)
3409 {
3410 if (gfc_traverse_expr (c->iterator->var, sym, func, f))
3411 return true;
3412 if (gfc_traverse_expr (c->iterator->start, sym, func, f))
3413 return true;
3414 if (gfc_traverse_expr (c->iterator->end, sym, func, f))
3415 return true;
3416 if (gfc_traverse_expr (c->iterator->step, sym, func, f))
3417 return true;
3418 }
3419 }
47992a4a
EE
3420 break;
3421
640670c7
PT
3422 case EXPR_OP:
3423 if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
3424 return true;
3425 if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
3426 return true;
3427 break;
3428
47992a4a
EE
3429 default:
3430 gcc_unreachable ();
3431 break;
3432 }
3433
640670c7
PT
3434 ref = expr->ref;
3435 while (ref != NULL)
3436 {
47992a4a 3437 switch (ref->type)
636dff67 3438 {
640670c7
PT
3439 case REF_ARRAY:
3440 ar = ref->u.ar;
3441 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
636dff67 3442 {
640670c7
PT
3443 if (gfc_traverse_expr (ar.start[i], sym, func, f))
3444 return true;
3445 if (gfc_traverse_expr (ar.end[i], sym, func, f))
3446 return true;
3447 if (gfc_traverse_expr (ar.stride[i], sym, func, f))
3448 return true;
636dff67
SK
3449 }
3450 break;
640670c7 3451
636dff67 3452 case REF_SUBSTRING:
640670c7
PT
3453 if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
3454 return true;
3455 if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
3456 return true;
636dff67 3457 break;
640670c7 3458
908a2235
PT
3459 case REF_COMPONENT:
3460 if (ref->u.c.component->ts.type == BT_CHARACTER
3461 && ref->u.c.component->ts.cl
3462 && ref->u.c.component->ts.cl->length
3463 && ref->u.c.component->ts.cl->length->expr_type
3464 != EXPR_CONSTANT
3465 && gfc_traverse_expr (ref->u.c.component->ts.cl->length,
3466 sym, func, f))
3467 return true;
3468
3469 if (ref->u.c.component->as)
3470 for (i = 0; i < ref->u.c.component->as->rank; i++)
3471 {
3472 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
3473 sym, func, f))
3474 return true;
3475 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
3476 sym, func, f))
3477 return true;
3478 }
3479 break;
640670c7 3480
636dff67
SK
3481 default:
3482 gcc_unreachable ();
636dff67 3483 }
640670c7
PT
3484 ref = ref->next;
3485 }
3486 return false;
3487}
3488
3489/* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
3490
3491static bool
3492expr_set_symbols_referenced (gfc_expr *expr,
3493 gfc_symbol *sym ATTRIBUTE_UNUSED,
3494 int *f ATTRIBUTE_UNUSED)
3495{
908a2235
PT
3496 if (expr->expr_type != EXPR_VARIABLE)
3497 return false;
640670c7
PT
3498 gfc_set_sym_referenced (expr->symtree->n.sym);
3499 return false;
3500}
3501
3502void
3503gfc_expr_set_symbols_referenced (gfc_expr *expr)
3504{
3505 gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
47992a4a 3506}
f37e928c
DK
3507
3508
713485cc
JW
3509/* Determine if an expression is a procedure pointer component. If yes, the
3510 argument 'comp' will point to the component (provided that 'comp' was
3511 provided). */
3512
3513bool
3514is_proc_ptr_comp (gfc_expr *expr, gfc_component **comp)
3515{
3516 gfc_ref *ref;
3517 bool ppc = false;
3518
3519 if (!expr || !expr->ref)
3520 return false;
3521
3522 ref = expr->ref;
3523 while (ref->next)
3524 ref = ref->next;
3525
3526 if (ref->type == REF_COMPONENT)
3527 {
3528 ppc = ref->u.c.component->attr.proc_pointer;
3529 if (ppc && comp)
3530 *comp = ref->u.c.component;
3531 }
3532
3533 return ppc;
3534}
3535
3536
f37e928c
DK
3537/* Walk an expression tree and check each variable encountered for being typed.
3538 If strict is not set, a top-level variable is tolerated untyped in -std=gnu
ed42adef
DK
3539 mode as is a basic arithmetic expression using those; this is for things in
3540 legacy-code like:
f37e928c
DK
3541
3542 INTEGER :: arr(n), n
ed42adef 3543 INTEGER :: arr(n + 1), n
f37e928c
DK
3544
3545 The namespace is needed for IMPLICIT typing. */
3546
3df684e2
DK
3547static gfc_namespace* check_typed_ns;
3548
3549static bool
3550expr_check_typed_help (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
3551 int* f ATTRIBUTE_UNUSED)
f37e928c
DK
3552{
3553 gfc_try t;
f37e928c 3554
3df684e2
DK
3555 if (e->expr_type != EXPR_VARIABLE)
3556 return false;
f37e928c 3557
3df684e2
DK
3558 gcc_assert (e->symtree);
3559 t = gfc_check_symbol_typed (e->symtree->n.sym, check_typed_ns,
3560 true, e->where);
f37e928c 3561
3df684e2
DK
3562 return (t == FAILURE);
3563}
f37e928c 3564
3df684e2
DK
3565gfc_try
3566gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
3567{
3568 bool error_found;
f37e928c 3569
ed42adef
DK
3570 /* If this is a top-level variable or EXPR_OP, do the check with strict given
3571 to us. */
3572 if (!strict)
3573 {
3574 if (e->expr_type == EXPR_VARIABLE && !e->ref)
3575 return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
3576
3577 if (e->expr_type == EXPR_OP)
3578 {
3579 gfc_try t = SUCCESS;
3580
3581 gcc_assert (e->value.op.op1);
3582 t = gfc_expr_check_typed (e->value.op.op1, ns, strict);
3583
3584 if (t == SUCCESS && e->value.op.op2)
3585 t = gfc_expr_check_typed (e->value.op.op2, ns, strict);
3586
3587 return t;
3588 }
3589 }
f37e928c 3590
3df684e2
DK
3591 /* Otherwise, walk the expression and do it strictly. */
3592 check_typed_ns = ns;
3593 error_found = gfc_traverse_expr (e, NULL, &expr_check_typed_help, 0);
f37e928c 3594
3df684e2 3595 return error_found ? FAILURE : SUCCESS;
f37e928c 3596}
c6acea9d
JW
3597
3598/* Walk an expression tree and replace all symbols with a corresponding symbol
3599 in the formal_ns of "sym". Needed for copying interfaces in PROCEDURE
3600 statements. The boolean return value is required by gfc_traverse_expr. */
3601
3602static bool
3603replace_symbol (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
3604{
bc0f8bd4
MM
3605 if ((expr->expr_type == EXPR_VARIABLE
3606 || (expr->expr_type == EXPR_FUNCTION
3607 && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
6f6e26a8 3608 && expr->symtree->n.sym->ns == sym->ts.interface->formal_ns)
c6acea9d
JW
3609 {
3610 gfc_symtree *stree;
bc0f8bd4
MM
3611 gfc_namespace *ns = sym->formal_ns;
3612 /* Don't use gfc_get_symtree as we prefer to fail badly if we don't find
3613 the symtree rather than create a new one (and probably fail later). */
3614 stree = gfc_find_symtree (ns ? ns->sym_root : gfc_current_ns->sym_root,
3615 expr->symtree->n.sym->name);
3616 gcc_assert (stree);
6f6e26a8 3617 stree->n.sym->attr = expr->symtree->n.sym->attr;
c6acea9d
JW
3618 expr->symtree = stree;
3619 }
3620 return false;
3621}
3622
3623void
3624gfc_expr_replace_symbols (gfc_expr *expr, gfc_symbol *dest)
3625{
3626 gfc_traverse_expr (expr, dest, &replace_symbol, 0);
3627}
This page took 1.967645 seconds and 5 git commands to generate.